ROOT logo
#include "TPeakFit.h"
#include "TStopwatch.h"
ClassImp(TPeakFit)

int   _NF_ = 0;
int   _FIRST_ = 0;
TH1*  _HIST_=0;
TF1*  _F_[MAXFUNC1];
float _Y_[MAXFUNC1];
int   _I0_;
int   _I1_;
bool  _SAMEWIDTH_;
float _CHI2_;
float _NP_;


///////////////////////////////////////////////////
void _CHI_(Int_t& npar, Double_t* gin, Double_t &f, Double_t *par, Int_t iflag)
{
  int i,n,s,ss = 0;
  Double_t chi = 0;
  float X,Y,EY,EX,F,N=0;
  float W = 0;
    
  for(i=0;i<_NF_;i++)
  {
    if(_F_[i]) n = _F_[i]->GetNpar(); else n = 0;
    for(s=0;s<n;s++)
    {
      if(_SAMEWIDTH_)
      {
        if(s==2) // width
        {
          if(i==_FIRST_) W = par[ss+s];
          par[ss+s] = W;
        }
      }
      if(_F_[i]) _F_[i]->SetParameter(s,par[ss+s]);
    }
    ss+=n;
  }
  for(i = 0;i<(_I1_-_I0_);i++)
  {
    X  = _HIST_->GetBinCenter(_I0_+i);
    Y  = _HIST_->GetBinContent(_I0_+i);
    EY = _HIST_->GetBinError(_I0_+i);
    EX = _HIST_->GetBinWidth(_I0_+i)/2.0;
    if(EY<=0) EY=1;
    F  = 0;
    for(n=0;n<_NF_;n++) if(_F_[n]) F+=_F_[n]->Eval(X); 
    chi += (Y-F)*(Y-F)/(EY*EY+EX*EX);  
    N++;
  }
  f = chi;
  _NP_ = N;
  _CHI2_ = f;
  return;
}

TPeakFit::TPeakFit():TObject()
{
  mFunctions = new TContainer();
  mFunctions->empty();
  mHist = NULL;
  mBack = NULL;
  mNP = 0;
  mMaxBackDegree = 1000;
  setPeakVar(7);
  setWidthVar(7);
  setMinArea(0.1);
  setMaxArea(10);
  setMinAssym(0.1);
  setMaxAssym(2.0);
  setSameWidth(false);
  setAssymOnOff(false);
  setIndependentBack(false);
  setBackVar(0.2);
  mSum = NULL;
	fCov = 0;
	fCovSqrt = 0;
}
TPeakFit::~TPeakFit()
{
  delete mFunctions;
	mFunctions = NULL;
  if(mSum) {delete mSum; mSum=NULL;}
	if(fCov) delete [] fCov;
	if(fCovSqrt) delete []fCovSqrt;
}
void TPeakFit::setBackground(int N,float* x,float* y)
{
  if(mBack) delete mBack; 
  mBack = NULL;
  if(N<=0) return;
  mBack = new TGraph(N,x,y);
  mMaxBackDegree = N;
}
void TPeakFit::addPeak(float amp, float avg, float sig, float ass)
{
  mNP++;
  char name[30];
  sprintf(name,"Peak%03d",mNP);
  //TF1* f = new TF1(name,
  //                 "[0]*exp(-0.5*(x-[1])*(x-[1])/([2]*[2]*([3]*[3]*(x<=[1])+1*(x>[1]))))"
  //                 ,mFitMin,mFitMax);
  TF1* f = new TF1(name,
                   "[0]*(exp(-0.5*((x-[1])/([2]*[3]))*((x-[1])/([2]*[3])))*(x<=[1])+exp(-0.5*((x-[1])/[2])*((x-[1])/[2]))*(x>[1]))"
                   ,mFitMin,mFitMax);
  f->SetParameters(amp,avg,sig,ass);
  mFunctions->remove(name);
  mFunctions->add(f);
  return;
}
TF1* TPeakFit::getPeak(int p)
{
  char name[30];
  sprintf(name,"Peak%03d",p);
  return (TF1*)mFunctions->get(name);
}
void TPeakFit::fitBack()
{
  int i;
  int N;
  float x[2],y[2];
  if(!mHist) return;
  if(mBackDegree<0) 
  {
    TF1 *f = new TF1("back","0",mFitMin,mFitMax);
    mFunctions->remove("back");
    mFunctions->add(f);
    return;
  }
  
  if(mBackDegree>=mMaxBackDegree) mBackDegree=mMaxBackDegree-1;
    
  if(!mBack &&  mBackDegree>=0) // no background defined by the user
  {
    if(mBackDegree>1) mBackDegree = 1; 
    N = 2;
    x[0] = mFitMin;
    x[1] = mFitMax;
    y[0] = mHist->GetBinContent(mHist->FindBin(x[0]));
    y[1] = mHist->GetBinContent(mHist->FindBin(x[1]));
    //cout <<x[0]<<"  "<<x[1]<<"  "<<y[0]<<"  "<<y[1]<<endl;
    setBackground(N,x,y);
  }
  char name[15];
  sprintf(name,"pol%d",mBackDegree);
  TF1 *f = new TF1("back",name,mFitMin,mFitMax);
  if(mBack) mBack->Fit(f,"RQN");
  mFunctions->remove("back");
  mFunctions->add(f);
  return;
}
void TPeakFit::fit()
{
  int i,j,npar,s,n,ierr;
  float p,pmin,pmax;
  int B = -1;
  Double_t arg[100];
	bool FIXED[100];
  Double_t P,E;
  if(!mHist) return;  
	
  if(fCov) { delete [] fCov; fCov =0;}
	if(fCovSqrt) { delete []fCovSqrt; fCovSqrt = 0;}

  
  fitBack(); 
  
  _NF_ = 0;
  npar = 0;
  for(i=0;i<MAXFUNC1;i++) _F_[i] = NULL;
  if(getBack()) {_F_[_NF_] = getBack(); npar+=_F_[_NF_]->GetNpar(); B = _NF_; _NF_++; } 
  bool firstPeak = false;
  for(i = 0;i<mNP;i++) if(getPeak(i+1)) 
  {
    _F_[_NF_] = getPeak(i+1); 
    npar+=_F_[_NF_]->GetNpar();
    if(!firstPeak) {_FIRST_ = _NF_; firstPeak = true;}
    _NF_++;
  }
  mNP = _NF_;
  _SAMEWIDTH_ = mSameWid;
  
  _I0_ = mHist->FindBin(mFitMin);
  _I1_ = mHist->FindBin(mFitMax);
  _HIST_ = mHist;
  
  TMinuit *m = new TMinuit(npar);
  arg[0] = -1;
  m->mnexcm("SET PRI",arg,1,ierr);
  m->mnexcm("SET NOWARNINGS",arg,1,ierr);
  m->mnexcm("SET ERR",arg,1,ierr);
  m->SetFCN(_CHI_);
  s = 0;
	
  for(i=0;i<_NF_;i++)
  {
    if(_F_[i]) n = _F_[i]->GetNpar(); else n = 0;
    for(j=0;j<n;j++)
    {
			FIXED[s+j] = false;
      if(_F_[i]) p = _F_[i]->GetParameter(j); else p = 0;
      if (j==0 && i!=B) {pmin = mMinArea*p; pmax = mMaxArea*p;} // area
      if (j==1 && i!=B) {pmin = p-mPeakVar; pmax = p+mPeakVar;} // peak position
      if (j==2 && i!=B) {pmin = p-mWidVar;  pmax = p+mWidVar;}  // sigma
      if (j==3 && i!=B) {pmin = mMinAssym;  pmax = mMaxAssym;}  // assymetry
      if (j==3 && !mAssym && i!=B) { p = 1; pmin = 1;  pmax = 1; FIXED[s+j] = true;}; // turn off assymetry
      if (i==B && p>0) { pmin = (1-mBackVar)*p; pmax = (1+mBackVar)*p; }
      if (i==B && p<0) { pmin = (1+mBackVar)*p; pmax = (1-mBackVar)*p; }
      if (i==B && p==0){ pmin = -mBackVar; pmax = mBackVar; }
      if (i==B && mBackMode) //fixed background
      {
        pmin = p;
        pmax = p;
				FIXED[s+j] = true;
      }
      m->mnparm(s+j,"",p,(pmax-pmin)/5,pmin,pmax,ierr);
    }
    s+=n;
  }
  arg[0] = 500;
  arg[1] = 1;
  m->mnexcm("MIG",arg,2,ierr);
	
	fCov = new double[npar*npar];
	fCovSqrt = new double[npar*npar];
	m->mnemat(fCov, npar);
	for(i=0;i<npar;i++)
	{
	  if(FIXED[i]) for(int j = 0;j<n;j++)
    {
      fCov[(i*npar)+j] = 0;
      fCov[(j*npar)+i] = 0;
    }		
	}
	CalcCOVSqrt(npar);
	mNPAR = npar;
  
  // moving parameters back to function
  s = 0;
  for(i=0;i<_NF_;i++)
  {
    if(_F_[i]) n = _F_[i]->GetNpar(); else n = 0;
    for(j=0;j<n;j++)
    {
      m->GetParameter(s+j,P,E);
      //cout <<"par "<<s+j<<"  P = "<<P<<"  E = "<<E<<endl;
      if(_F_[i]) 
      {
        _F_[i]->SetParameter(j,P);
        _F_[i]->SetParError(j,E);
        if(mSameWid && _F_[i]!=getBack() && j==2)
        {
          _F_[i]->SetParameter(j,_F_[_FIRST_]->GetParameter(j));
          _F_[i]->SetParError(j,_F_[_FIRST_]->GetParError(j));
        }
      }
    }
    s+=n;
  }
  
  mChi = _CHI2_;
  mNDF = _NP_ - m->GetNumFreePars();
  //cout <<"Chi = "<<mChi<<"  NDF = "<<mNDF<<"  Chi/NDF = "<<mChi/mNDF<<endl;
  print();
}
void TPeakFit::CalcCOVSqrt(int NP)
{
  double *C = fCovSqrt;
  double *V = fCov;
  // calculate sqrt(V) as lower diagonal matrix
  for( int i = 0; i < NP; ++i ) 
  {
    for( int j = 0; j < NP; ++j ) 
    {
      C[i*NP+j] = 0;
    }
  }

  for( int j = 0; j < NP; ++j ) 
  {
    // diagonal terms first
    double Ck = 0;
    for( int k = 0; k < j; ++k ) 
    {
      Ck += C[j*NP+k] * C[j*NP+k];
    } // k
    C[j*NP+j] = sqrt( fabs( V[j*NP+j] - Ck ) );

    // off-diagonal terms
    for( int i = j+1; i < NP; ++i ) 
    {
      Ck = 0;
      for( int k = 0; k < j; ++k ) 
      {
        Ck += C[i*NP+k] * C[j*NP+k];
      } //k
      if(C[j*NP+j]!=0 ) C[i*NP+j] = ( V[i*NP+j] - Ck ) / C[j*NP+j];
      else C[i*NP+j] = 0;
    }// i
  } // j 
	return;
}
void TPeakFit::draw(TVirtualPad* pad)
{
  if(!mHist) return;
  if(pad) pad->cd();
  int i,j,npar,s,n,ierr;
  float p,pmin,pmax;
  int i0,i1,nb;
  if(mSum) { delete mSum; mSum = NULL;}
  i0 = mHist->FindBin(mFitMin);
  i1 = mHist->FindBin(mFitMax);
  nb = (i1-i0)*5;
  mSum = new TH1F("totalFit","",nb,mFitMin,mFitMax);
  gROOT->RecursiveRemove(mSum);
     
  if(getBack()) 
  {
    getBack()->SetLineWidth(2); 
    getBack()->SetLineColor(3); 
    getBack()->Draw("same"); 
    mSum->Add(getBack(),1);
  }  
  for(i = 0;i<mNP;i++) if(getPeak(i+1)) 
  { 
    getPeak(i+1)->SetLineWidth(2); 
    getPeak(i+1)->SetLineColor(4); 
    getPeak(i+1)->Draw("same");
    mSum->Add(getPeak(i+1),1);
  }
  
  mSum->SetLineColor(2);
  mSum->SetLineWidth(2);
  mSum->Draw("sameL");
  if(pad) pad->Update();
}
void TPeakFit::print()
{
  int n,i,j;
  TString l,g;
  Double_t p[100],e[100],p1[100],p2[100];
  float a,a1,a2,b;
	int NP = mNPAR;
  char line[100];
  log(10,"\n--------------------------------------------------------------");
  log(10,"Results from last fit");
  log(10,"");
  log(10,"Number of peaks = %d  Background type = %d",mNP,mBackDegree);
  log(10,"Fit Min = %f  Fit Max = %f",mFitMin,mFitMax);
  log(10,"Chi = %f  NDF = %f  Chi/NDF = %f",mChi,mNDF,mChi/mNDF);
  log(10,"");
	
	if(fCov)
	{
	  log(10,"Covariance matrix for this fit");
	  log(10,"------------------------------");
	
	  for(i = 0; i<NP; i++)
	  {
	    g="    ";
	    for(j = 0; j<NP; j++) g += Form("+%7.4e  ",fCov[i*NP+j]);
	  	log(10,g.Data());
	  }
    log(10,"");
	}
	
  if(getBack()) 
  {
    TF1 *f = getBack();
    log(10,"Background parameters");
    n = f->GetNpar();
    for(i=0;i<n;i++) 
      log(10,"P%02d      = %7.4e +- %7.4e",i,f->GetParameter(i),f->GetParError(i));
  }
  log(10,"");
  log(10,"Peak parameters");
  for(j=0;j<mNP;j++) if(getPeak(j+1))
  {
    log(10,"-------- Peak number %d",j);
    TF1 *f = getPeak(j+1);
    n = f->GetNpar();
    for(i=0;i<n;i++) 
    {
      if(i==0) l = "AMPLITUDE";
      if(i==1) l = "PEAK POS ";
      if(i==2) l = "WIDTH    ";
      if(i==3) l = "ASYMMETRY";
      p[i] = f->GetParameter(i);
      e[i] = f->GetParError(i);
      p1[i] = p[i]+e[i];
      p2[i] = p[i]-e[i];
      log(10,"%s = %7.4e +- %7.4e",l.Data(),p[i],e[i]);
    }
    l = "Integral ";
    a2 = f->Integral(mFitMin,mFitMax,p2);
    a1 = f->Integral(mFitMin,mFitMax,p1);
    a  = f->Integral(mFitMin,mFitMax,p);
    log(10,"%s = %7.4e +- %7.4e",l.Data(),a,fabs(a2-a1)/2.);
    if(mHist)
    {
      b = mHist->GetBinWidth(mHist->FindBin(p[1]));
      l = "Counts   ";
      log(10,"%s = %7.4e +- %7.4e (histogram bin width = %5.2e)",l.Data(),a/b,fabs(a2-a1)/(2.*b),b);
    }
  }  
}
 TPeakFit.cxx:1
 TPeakFit.cxx:2
 TPeakFit.cxx:3
 TPeakFit.cxx:4
 TPeakFit.cxx:5
 TPeakFit.cxx:6
 TPeakFit.cxx:7
 TPeakFit.cxx:8
 TPeakFit.cxx:9
 TPeakFit.cxx:10
 TPeakFit.cxx:11
 TPeakFit.cxx:12
 TPeakFit.cxx:13
 TPeakFit.cxx:14
 TPeakFit.cxx:15
 TPeakFit.cxx:16
 TPeakFit.cxx:17
 TPeakFit.cxx:18
 TPeakFit.cxx:19
 TPeakFit.cxx:20
 TPeakFit.cxx:21
 TPeakFit.cxx:22
 TPeakFit.cxx:23
 TPeakFit.cxx:24
 TPeakFit.cxx:25
 TPeakFit.cxx:26
 TPeakFit.cxx:27
 TPeakFit.cxx:28
 TPeakFit.cxx:29
 TPeakFit.cxx:30
 TPeakFit.cxx:31
 TPeakFit.cxx:32
 TPeakFit.cxx:33
 TPeakFit.cxx:34
 TPeakFit.cxx:35
 TPeakFit.cxx:36
 TPeakFit.cxx:37
 TPeakFit.cxx:38
 TPeakFit.cxx:39
 TPeakFit.cxx:40
 TPeakFit.cxx:41
 TPeakFit.cxx:42
 TPeakFit.cxx:43
 TPeakFit.cxx:44
 TPeakFit.cxx:45
 TPeakFit.cxx:46
 TPeakFit.cxx:47
 TPeakFit.cxx:48
 TPeakFit.cxx:49
 TPeakFit.cxx:50
 TPeakFit.cxx:51
 TPeakFit.cxx:52
 TPeakFit.cxx:53
 TPeakFit.cxx:54
 TPeakFit.cxx:55
 TPeakFit.cxx:56
 TPeakFit.cxx:57
 TPeakFit.cxx:58
 TPeakFit.cxx:59
 TPeakFit.cxx:60
 TPeakFit.cxx:61
 TPeakFit.cxx:62
 TPeakFit.cxx:63
 TPeakFit.cxx:64
 TPeakFit.cxx:65
 TPeakFit.cxx:66
 TPeakFit.cxx:67
 TPeakFit.cxx:68
 TPeakFit.cxx:69
 TPeakFit.cxx:70
 TPeakFit.cxx:71
 TPeakFit.cxx:72
 TPeakFit.cxx:73
 TPeakFit.cxx:74
 TPeakFit.cxx:75
 TPeakFit.cxx:76
 TPeakFit.cxx:77
 TPeakFit.cxx:78
 TPeakFit.cxx:79
 TPeakFit.cxx:80
 TPeakFit.cxx:81
 TPeakFit.cxx:82
 TPeakFit.cxx:83
 TPeakFit.cxx:84
 TPeakFit.cxx:85
 TPeakFit.cxx:86
 TPeakFit.cxx:87
 TPeakFit.cxx:88
 TPeakFit.cxx:89
 TPeakFit.cxx:90
 TPeakFit.cxx:91
 TPeakFit.cxx:92
 TPeakFit.cxx:93
 TPeakFit.cxx:94
 TPeakFit.cxx:95
 TPeakFit.cxx:96
 TPeakFit.cxx:97
 TPeakFit.cxx:98
 TPeakFit.cxx:99
 TPeakFit.cxx:100
 TPeakFit.cxx:101
 TPeakFit.cxx:102
 TPeakFit.cxx:103
 TPeakFit.cxx:104
 TPeakFit.cxx:105
 TPeakFit.cxx:106
 TPeakFit.cxx:107
 TPeakFit.cxx:108
 TPeakFit.cxx:109
 TPeakFit.cxx:110
 TPeakFit.cxx:111
 TPeakFit.cxx:112
 TPeakFit.cxx:113
 TPeakFit.cxx:114
 TPeakFit.cxx:115
 TPeakFit.cxx:116
 TPeakFit.cxx:117
 TPeakFit.cxx:118
 TPeakFit.cxx:119
 TPeakFit.cxx:120
 TPeakFit.cxx:121
 TPeakFit.cxx:122
 TPeakFit.cxx:123
 TPeakFit.cxx:124
 TPeakFit.cxx:125
 TPeakFit.cxx:126
 TPeakFit.cxx:127
 TPeakFit.cxx:128
 TPeakFit.cxx:129
 TPeakFit.cxx:130
 TPeakFit.cxx:131
 TPeakFit.cxx:132
 TPeakFit.cxx:133
 TPeakFit.cxx:134
 TPeakFit.cxx:135
 TPeakFit.cxx:136
 TPeakFit.cxx:137
 TPeakFit.cxx:138
 TPeakFit.cxx:139
 TPeakFit.cxx:140
 TPeakFit.cxx:141
 TPeakFit.cxx:142
 TPeakFit.cxx:143
 TPeakFit.cxx:144
 TPeakFit.cxx:145
 TPeakFit.cxx:146
 TPeakFit.cxx:147
 TPeakFit.cxx:148
 TPeakFit.cxx:149
 TPeakFit.cxx:150
 TPeakFit.cxx:151
 TPeakFit.cxx:152
 TPeakFit.cxx:153
 TPeakFit.cxx:154
 TPeakFit.cxx:155
 TPeakFit.cxx:156
 TPeakFit.cxx:157
 TPeakFit.cxx:158
 TPeakFit.cxx:159
 TPeakFit.cxx:160
 TPeakFit.cxx:161
 TPeakFit.cxx:162
 TPeakFit.cxx:163
 TPeakFit.cxx:164
 TPeakFit.cxx:165
 TPeakFit.cxx:166
 TPeakFit.cxx:167
 TPeakFit.cxx:168
 TPeakFit.cxx:169
 TPeakFit.cxx:170
 TPeakFit.cxx:171
 TPeakFit.cxx:172
 TPeakFit.cxx:173
 TPeakFit.cxx:174
 TPeakFit.cxx:175
 TPeakFit.cxx:176
 TPeakFit.cxx:177
 TPeakFit.cxx:178
 TPeakFit.cxx:179
 TPeakFit.cxx:180
 TPeakFit.cxx:181
 TPeakFit.cxx:182
 TPeakFit.cxx:183
 TPeakFit.cxx:184
 TPeakFit.cxx:185
 TPeakFit.cxx:186
 TPeakFit.cxx:187
 TPeakFit.cxx:188
 TPeakFit.cxx:189
 TPeakFit.cxx:190
 TPeakFit.cxx:191
 TPeakFit.cxx:192
 TPeakFit.cxx:193
 TPeakFit.cxx:194
 TPeakFit.cxx:195
 TPeakFit.cxx:196
 TPeakFit.cxx:197
 TPeakFit.cxx:198
 TPeakFit.cxx:199
 TPeakFit.cxx:200
 TPeakFit.cxx:201
 TPeakFit.cxx:202
 TPeakFit.cxx:203
 TPeakFit.cxx:204
 TPeakFit.cxx:205
 TPeakFit.cxx:206
 TPeakFit.cxx:207
 TPeakFit.cxx:208
 TPeakFit.cxx:209
 TPeakFit.cxx:210
 TPeakFit.cxx:211
 TPeakFit.cxx:212
 TPeakFit.cxx:213
 TPeakFit.cxx:214
 TPeakFit.cxx:215
 TPeakFit.cxx:216
 TPeakFit.cxx:217
 TPeakFit.cxx:218
 TPeakFit.cxx:219
 TPeakFit.cxx:220
 TPeakFit.cxx:221
 TPeakFit.cxx:222
 TPeakFit.cxx:223
 TPeakFit.cxx:224
 TPeakFit.cxx:225
 TPeakFit.cxx:226
 TPeakFit.cxx:227
 TPeakFit.cxx:228
 TPeakFit.cxx:229
 TPeakFit.cxx:230
 TPeakFit.cxx:231
 TPeakFit.cxx:232
 TPeakFit.cxx:233
 TPeakFit.cxx:234
 TPeakFit.cxx:235
 TPeakFit.cxx:236
 TPeakFit.cxx:237
 TPeakFit.cxx:238
 TPeakFit.cxx:239
 TPeakFit.cxx:240
 TPeakFit.cxx:241
 TPeakFit.cxx:242
 TPeakFit.cxx:243
 TPeakFit.cxx:244
 TPeakFit.cxx:245
 TPeakFit.cxx:246
 TPeakFit.cxx:247
 TPeakFit.cxx:248
 TPeakFit.cxx:249
 TPeakFit.cxx:250
 TPeakFit.cxx:251
 TPeakFit.cxx:252
 TPeakFit.cxx:253
 TPeakFit.cxx:254
 TPeakFit.cxx:255
 TPeakFit.cxx:256
 TPeakFit.cxx:257
 TPeakFit.cxx:258
 TPeakFit.cxx:259
 TPeakFit.cxx:260
 TPeakFit.cxx:261
 TPeakFit.cxx:262
 TPeakFit.cxx:263
 TPeakFit.cxx:264
 TPeakFit.cxx:265
 TPeakFit.cxx:266
 TPeakFit.cxx:267
 TPeakFit.cxx:268
 TPeakFit.cxx:269
 TPeakFit.cxx:270
 TPeakFit.cxx:271
 TPeakFit.cxx:272
 TPeakFit.cxx:273
 TPeakFit.cxx:274
 TPeakFit.cxx:275
 TPeakFit.cxx:276
 TPeakFit.cxx:277
 TPeakFit.cxx:278
 TPeakFit.cxx:279
 TPeakFit.cxx:280
 TPeakFit.cxx:281
 TPeakFit.cxx:282
 TPeakFit.cxx:283
 TPeakFit.cxx:284
 TPeakFit.cxx:285
 TPeakFit.cxx:286
 TPeakFit.cxx:287
 TPeakFit.cxx:288
 TPeakFit.cxx:289
 TPeakFit.cxx:290
 TPeakFit.cxx:291
 TPeakFit.cxx:292
 TPeakFit.cxx:293
 TPeakFit.cxx:294
 TPeakFit.cxx:295
 TPeakFit.cxx:296
 TPeakFit.cxx:297
 TPeakFit.cxx:298
 TPeakFit.cxx:299
 TPeakFit.cxx:300
 TPeakFit.cxx:301
 TPeakFit.cxx:302
 TPeakFit.cxx:303
 TPeakFit.cxx:304
 TPeakFit.cxx:305
 TPeakFit.cxx:306
 TPeakFit.cxx:307
 TPeakFit.cxx:308
 TPeakFit.cxx:309
 TPeakFit.cxx:310
 TPeakFit.cxx:311
 TPeakFit.cxx:312
 TPeakFit.cxx:313
 TPeakFit.cxx:314
 TPeakFit.cxx:315
 TPeakFit.cxx:316
 TPeakFit.cxx:317
 TPeakFit.cxx:318
 TPeakFit.cxx:319
 TPeakFit.cxx:320
 TPeakFit.cxx:321
 TPeakFit.cxx:322
 TPeakFit.cxx:323
 TPeakFit.cxx:324
 TPeakFit.cxx:325
 TPeakFit.cxx:326
 TPeakFit.cxx:327
 TPeakFit.cxx:328
 TPeakFit.cxx:329
 TPeakFit.cxx:330
 TPeakFit.cxx:331
 TPeakFit.cxx:332
 TPeakFit.cxx:333
 TPeakFit.cxx:334
 TPeakFit.cxx:335
 TPeakFit.cxx:336
 TPeakFit.cxx:337
 TPeakFit.cxx:338
 TPeakFit.cxx:339
 TPeakFit.cxx:340
 TPeakFit.cxx:341
 TPeakFit.cxx:342
 TPeakFit.cxx:343
 TPeakFit.cxx:344
 TPeakFit.cxx:345
 TPeakFit.cxx:346
 TPeakFit.cxx:347
 TPeakFit.cxx:348
 TPeakFit.cxx:349
 TPeakFit.cxx:350
 TPeakFit.cxx:351
 TPeakFit.cxx:352
 TPeakFit.cxx:353
 TPeakFit.cxx:354
 TPeakFit.cxx:355
 TPeakFit.cxx:356
 TPeakFit.cxx:357
 TPeakFit.cxx:358
 TPeakFit.cxx:359
 TPeakFit.cxx:360
 TPeakFit.cxx:361
 TPeakFit.cxx:362
 TPeakFit.cxx:363
 TPeakFit.cxx:364
 TPeakFit.cxx:365
 TPeakFit.cxx:366
 TPeakFit.cxx:367
 TPeakFit.cxx:368
 TPeakFit.cxx:369
 TPeakFit.cxx:370
 TPeakFit.cxx:371
 TPeakFit.cxx:372
 TPeakFit.cxx:373
 TPeakFit.cxx:374
 TPeakFit.cxx:375
 TPeakFit.cxx:376
 TPeakFit.cxx:377
 TPeakFit.cxx:378
 TPeakFit.cxx:379
 TPeakFit.cxx:380
 TPeakFit.cxx:381
 TPeakFit.cxx:382
 TPeakFit.cxx:383
 TPeakFit.cxx:384
 TPeakFit.cxx:385
 TPeakFit.cxx:386
 TPeakFit.cxx:387
 TPeakFit.cxx:388
 TPeakFit.cxx:389
 TPeakFit.cxx:390
 TPeakFit.cxx:391
 TPeakFit.cxx:392
 TPeakFit.cxx:393
 TPeakFit.cxx:394
 TPeakFit.cxx:395
 TPeakFit.cxx:396
 TPeakFit.cxx:397
 TPeakFit.cxx:398
 TPeakFit.cxx:399
 TPeakFit.cxx:400
 TPeakFit.cxx:401
 TPeakFit.cxx:402
 TPeakFit.cxx:403
 TPeakFit.cxx:404
 TPeakFit.cxx:405
 TPeakFit.cxx:406
 TPeakFit.cxx:407
 TPeakFit.cxx:408
 TPeakFit.cxx:409