ROOT logo
/*
   Macro to make the MC based dEdx fits, and study the influence of thre track selection to the PID.

   Motivation:
   In the ALICE Geant3 MC the input Bethe-Bloch parameterization of the primary ionization can be 
   parameterized by user defined formula.

   In detector Input dEdx(BG)_in} (more exact dNprim/dx) is transformed to the output reconstructed dEdx_{rec}. 
   While original input function is just function of particle \beta\gama, random variable, reconstructed 
   dEdx estimate, is influenced by detection processes and is sensitive to other aspects namily 
   diffusion, track inclination angle (\phi,\theta), gain ...

   In the following we will calibrate transform function:
    dEdx_{BB}= f_{tr}(dEdx_{rec}, #phi,#eta)
    //
    // Example code for author:
    //
    .x $HOME/rootlogon.C
    .x $HOME/NimStyle.C
    .L $ALICE_ROOT/TPC/macros/data2011/makeBBFit.C+
    Init();
    MakeESDCutsPID();
    makeBBfit(10000000);

*/

#include "TCut.h"
#include "TFile.h"
#include "TTree.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TF1.h"
#include "TCanvas.h"
#include "TDatabasePDG.h"
#include "TStatToolkit.h"
#include "TGraphErrors.h"
#include "TStopwatch.h"
#include "TLegend.h"
#include "TLatex.h"
//
#include "TTreeStream.h"
#include "AliTPCParam.h"
#include "AliTPCcalibBase.h"

//
// Global variables
//

TCut cutGeom, cutNcr, cutNcl;
TCut cutFiducial;
Int_t pdgs[4]={11,211,321,2212};
Double_t massPDG[4]={0};
const char *partName[4]={"Electron","Pion","Kaon","Proton"};
const Int_t colors[5]={kGreen,kBlack,kRed,kBlue,5};
const Int_t markers[5]={24,20,21,25,25};
const Float_t markerSize[5]={1.2,1.2,1.0,1.2,1};
TTree * treeFit=0;

void Init();            // init (ALICE) BB parameterization

//
void FitTransferFunctionTheta(Bool_t isMax, Int_t dType, Int_t tgl, Bool_t skipKaon, Double_t maxP, TTreeSRedirector *pcstream, Bool_t doDraw);
void FitTransferFunctionAll(Bool_t isMax, Int_t dType, Bool_t skipKaon, Double_t maxP, TTreeSRedirector *pcstream, Bool_t doDraw);

void Init(){
   //
  // 1.) Register default ALICE parametrization
  //
  AliTPCParam param;
  param.RegisterBBParam(param.GetBetheBlochParamAlice(),1);
  for (Int_t ihis=0; ihis<4; ihis++)     massPDG [ihis]= TDatabasePDG::Instance()->GetParticle(pdgs[ihis])->Mass();
}


void MakeESDCutsPID(Double_t fgeom=1, Double_t fcr=0.85, Double_t fcl=0.7 ){
  //
  // Cuts to be used in the sequenece
  // 1.)  cutGeom - stronger cut on geometry  - perfect agreement data-MC        
  //              - Default length factor 1
  // 2.)  cutNcr  - relativally stong cut on the number of crossed rows to gaurantee tracking performance 
  //                relativally good agrement in the MC except of the week decay propability
  //              - Default length factor 0.85
  // 3.)  cutNcl  - very week cut on the numebr of clusters
  //              - Default length factor 0.7
  //  
  // Combined cuts should be combination:
  // cutGeom+cutNcr+cutNcl 
  //  Default  factors 1, 0.85 and 0.7 should be suited for most of analysis
  //  Modification can be expected for the Jet analysis and further tuning of the parameters for the 
  //     relativistic PID analysis
  //  
  cutGeom=TString::Format("esdTrack.GetLengthInActiveZone(0,3,236, -5 ,0,0)> %f*(130-5*abs(esdTrack.fP[4]))",fgeom); 
  //  Geomtrical cut in fiducial volume - proper description  in the MC
  //  GetLengthInActiveZone(Int_t mode, Double_t deltaY, Double_t deltaZ, Double_t bz, Double_t exbPhi = 0, TTreeSRedirector* pcstream = 0) const
  //  mode   ==0     - inner param used
  //  deltaY ==3     - cut on edges of sector 
  //                   a.) to avoid dead zone - bias for tracking
  //                   b.) zone with lower Q qualit
  //                   c.) non homogenous Q sample - preferable IROC is skipped -bais in the dEdx
  //  deltaZ ==236   - 
  //  bz = 5 KG      - proper sign should be used ohterwise wrong calculation
  cutNcr=TString::Format("esdTrack.GetTPCClusterInfo(3,1,0,159,1)>%f*(130-5*abs(esdTrack.fP[4]))",fcr);
  //
  // Cut on the number of crossed raws
  // GetTPCClusterInfo(Int_t nNeighbours = 3, Int_t type = 0, Int_t row0 = 0, Int_t row1 = 159, Int_t bitType = 0) 
  // pad row is decalared as crossed if some clusters was found in small neighborhood +- nNeighbours
  //    nNeighbours =3  - +-3 padrows used to define the crossed rows
  //    type = 0        - return number of rows (type==1 returns fraction of clusters)
  //    row0-row1       - upper and lower part of integration
  //  
  cutNcl=TString::Format("esdTrack.fTPCncls>%f*(130-5*abs(esdTrack.fP[4]))",fcl);
  //
  // cut un the number of clusters
  //
  cutFiducial="abs(esdTrack.fP[3])<1&&abs(esdTrack.fD)<1";
}

void makeBBfit(Int_t ntracks=100000){
  //
  // Make dEdx  fits of indiviadual particle species in bins:
  //  a.)  momenta
  //  b.)  tan(theta) -tgl
  //  c.)  per detector segmen
  //  d.)  Qmax/Qtot
  TFile * ff = TFile::Open("Filtered.root");
  TTreeSRedirector *pcstream = new TTreeSRedirector("dedxFit.root","update");
  TTree * treeMC = (TTree*)ff->Get("highPt");
  //  treeMC->SetCacheSize(6000000000);
  //
  // 1.) Register default ALICE parametrization
  //
  AliTPCParam param;
  param.RegisterBBParam(param.GetBetheBlochParamAlice(),1);
  TH3D * hisdEdx3D[4]={0};
  //
  for (Int_t ihis=0; ihis<4; ihis++) {
    massPDG [ihis]= TDatabasePDG::Instance()->GetParticle(pdgs[ihis])->Mass();
    treeMC->SetAlias(TString::Format("cut%s",partName[ihis]), TString::Format("abs(particle.fPdgCode)==%d",pdgs[ihis]));
    treeMC->SetAlias(TString::Format("dEdxp%s",partName[ihis]), TString::Format("AliTPCParam::BetheBlochAleph(esdTrack.fIp.P()/%f,1)",massPDG[ihis]));
  }
  //
  // 2.) Fill dEdx histograms if not done before
  //

  if (pcstream->GetFile()->Get("RatioP_QMax0Pion3D")==0){    
    //
    TStopwatch timer;
    for (Int_t iDetType=0; iDetType<9; iDetType++){
      for (Int_t ihis=0; ihis<4; ihis++){
	printf("%d\t%d\n",iDetType,ihis);
	timer.Print();
	TString detType="All";
	TString dedx   ="esdTrack.fTPCsignal";
	if (iDetType>0){
	  detType=TString::Format("Q%s%d",(iDetType-1)/4>0?"Max":"Tot",(iDetType-1)%4);
	  if (iDetType<5) dedx=TString::Format("esdTrack.fTPCdEdxInfo.GetSignalTot(%d)",(iDetType-1)%4);
	  if (iDetType>5) dedx=TString::Format("esdTrack.fTPCdEdxInfo.GetSignalMax(%d)",(iDetType-1)%4);
	}  

	TCut cutPDG=TString::Format("abs(particle.fPdgCode)==%d",pdgs[ihis]).Data();
	TString hname= TString::Format("RatioP_%s%s3D",detType.Data(),partName[ihis]);	
	TString query= TString::Format("%s/AliTPCParam::BetheBlochAleph(esdTrack.fIp.P()/%f,1):abs(esdTrack.fP[3]):esdTrack.fIp.P()>>%s",dedx.Data(), massPDG[ihis],hname.Data());
	hisdEdx3D[ihis]  = new TH3D(hname.Data(),hname.Data(), 50, 0.2,25, 10,0,1, 100,20,80);
	AliTPCcalibBase::BinLogX(hisdEdx3D[ihis]->GetXaxis());
	treeMC->Draw(query,cutFiducial+cutGeom+cutNcr+cutNcl+cutPDG,"goff",ntracks);
	
	hisdEdx3D[ihis]->GetXaxis()->SetTitle("p (GeV/c)");
	hisdEdx3D[ihis]->GetYaxis()->SetTitle("dEdx/dEdx_{BB} (a.u.)");
	pcstream->GetFile()->cd();
	hisdEdx3D[ihis]->Write(hname.Data());
      }
    }
  }
  delete pcstream;
  //
  // Fit histograms
  //
  pcstream = new TTreeSRedirector("dedxFit.root","update");
  TF1 fg("fg","gaus");
  //
  for (Int_t iDetType=0; iDetType<9; iDetType++){
    TString detType="All";
    if (iDetType>0){
      detType=TString::Format("Q%s%d",(iDetType-1)/4>0?"Max":"Tot",(iDetType-1)%4);
    }    
    for (Int_t ihis=0; ihis<4; ihis++){ 
      TString hname= TString::Format("RatioP_%s%s3D",detType.Data(),partName[ihis]);	
      hisdEdx3D[ihis] = (TH3D*)pcstream->GetFile()->Get(hname.Data()); 
      Int_t nbinsP =  hisdEdx3D[0]->GetXaxis()->GetNbins();
      Int_t nbinsTgl =  hisdEdx3D[0]->GetYaxis()->GetNbins();
      //
      for (Int_t ibinP=2; ibinP<nbinsP; ibinP++){
	for (Int_t ibinTgl=2; ibinTgl<nbinsTgl; ibinTgl++){
	  //
	  Double_t pCenter =  hisdEdx3D[0]->GetXaxis()->GetBinCenter(ibinP);
	  Double_t tglCenter =  hisdEdx3D[0]->GetYaxis()->GetBinCenter(ibinTgl);
	  TH1D * hisProj =hisdEdx3D[ihis]->ProjectionZ("xxx", ibinP-1,ibinP+1, ibinTgl-1,ibinTgl+1);
	  Double_t entries = hisProj->GetEntries();
	  if (entries<10) continue;
	  Double_t mean = hisProj->GetMean();
	  Double_t rms = hisProj->GetRMS();
	  hisProj->Fit(&fg,"","");
	  TVectorD vecFit(3, fg.GetParameters());
	  TVectorD vecFitErr(3, fg.GetParErrors());
	  Double_t chi2=fg.GetChisquare();
	  Double_t mass    = massPDG[ihis];
	  Double_t dEdxExp =  AliTPCParam::BetheBlochAleph(pCenter/mass,1);
	  Bool_t isAll=(iDetType==0);
	  Bool_t isMax=(iDetType-1)/4>0;
	  Bool_t isTot=(iDetType-1)/4==0;
	  Int_t dType=(iDetType-1)%4;
	  Double_t dEdx = mean*dEdxExp;
	  //if (
	  (*pcstream)<<"fitdEdxG"<<
	    // dEdx type
	    "iDet="<<iDetType<<      // detector internal number
	    "isAll="<<isAll<<        // full TPC used?
	    "isMax="<<isMax<<        // Qmax charge used ?
	    "isTot="<<isTot<<        // Qtot charge used?
	    "dType="<<dType<<        // Detector region 0-IROC, 1- OROCmedium, 2- OROClong, 3- OROCboth
	    "pType="<<ihis<<         // particle type
	    //
	    "entries="<<entries<<      // entries in histogram
	    "ibinTgl="<<ibinTgl<<      //
	    "ibinP="<<ibinP<<          // 
	    "pCenter="<<pCenter<<      // momentum of center bin
	    "tglCenter="<<tglCenter<<  // tangent lambda
	    //
	    "mass="<<mass<<             // particle mass
	    "dEdxExp="<<dEdxExp<<       // mean expected dEdx in bin 
	    "dEdx="<<dEdx<<             // mean measured dEdx in bin
	    "mean="<<mean<<             // mean measured/expected
	    "rms="<<rms<<               // 
	    "chi2="<<chi2<<             // chi2 of the gausian fit
	    "vecFit.="<<&vecFit<<       // gaus fit param
	    "vecFitErr.="<<&vecFitErr<< // gaus fit error
	    "\n";
	}
      }
    }
  }
  delete pcstream;
  //
  //
  //
}


void FitTransferFunctionScanAll(){
  //
  // Make fit of transfer functions - parabolic in theta
  //
  TTreeSRedirector * pcstream = new TTreeSRedirector("dedxFit.root","update");
  treeFit=(TTree*)pcstream->GetFile()->Get("fitdEdxG"); 
  treeFit = (TTree*)pcstream->GetFile()->Get("fitdEdxG");
  treeFit->SetMarkerStyle(25);
  treeFit->SetCacheSize(200000000);
  for (Int_t isMax=0; isMax<=1; isMax++){
    for (Int_t dType=0; dType<4; dType++){      
      for (Int_t skipKaon=0; skipKaon<=1; skipKaon++){
	for (Float_t maxP=3; maxP<21; maxP+=3){
	  printf("%d\t%d\t%d\t%f\n",isMax,dType,skipKaon,maxP);
	  FitTransferFunctionAll(isMax,dType,skipKaon,maxP,pcstream,1);
	}
      }
    }
  }
  delete pcstream;
}


void FitTransferFunctionScanTheta(){
  //
  // Make fit of transfer functions - bin by bin in Theta
  //
  TTreeSRedirector * pcstream = new TTreeSRedirector("dedxFit.root","update");
  treeFit=(TTree*)pcstream->GetFile()->Get("fitdEdxG"); 
  treeFit = (TTree*)pcstream->GetFile()->Get("fitdEdxG");
  treeFit->SetMarkerStyle(25);
  treeFit->SetCacheSize(200000000);
  for (Int_t isMax=0; isMax<=1; isMax++){
    for (Int_t dType=0; dType<4; dType++){
      
      for (Int_t tgl=2; tgl<10; tgl++){
	for (Int_t skipKaon=0; skipKaon<=1; skipKaon++){
	  for (Float_t maxP=3; maxP<21; maxP+=3){
	    printf("%d\t%d\t%d\t%d\t%f\n",isMax,dType,tgl,skipKaon,maxP);
	    FitTransferFunctionTheta(isMax,dType,tgl,skipKaon,maxP,pcstream,1);
	  }
	}
      }
    }
  }
  delete pcstream;
}


void FitTransferFunctionTheta(Bool_t isMax, Int_t dType, Int_t tgl, Bool_t skipKaon, Double_t maxP, TTreeSRedirector *pcstream, Bool_t doDraw){
  //
  // 
  // dEdx_{BB}= f_{tr}(dEdx_{rec}, #phi,#eta)
  //
  // Fit the parematers of transfer function
  // 4 models of transfer function used:
  // 
  //
  // Example usage:
  //    FitTransferFunctionTheta(1,3,8,1,5,0) 
  //    isMax=1; dType=1; tgl=5; skipKaon=0; Double_t maxP=10
  //
  if (!pcstream)  pcstream = new TTreeSRedirector("dedxFit.root","update");
  //
  if (!treeFit){
    treeFit = (TTree*)pcstream->GetFile()->Get("fitdEdxG");
    treeFit->SetMarkerStyle(25);
    treeFit->SetCacheSize(100000000);
  }
  const char *chfitType[4] = { "dEdx_{BB}=k(#theta)dEdx_{rec}", 
			       "dEdx_{BB}=k(#theta)dEdx_{rec}+#Delta(#theta)", 
			       "dEdx_{BB}=k(#theta,#phi)dEdx_{rec}+#Delta(#theta,#phi)",
			       "dEdx_{BB}=k(#theta,#phi,1/Q)dEdx_{rec}+#Delta(#theta,#phi,1/Q)",
  };
  //
  treeFit->SetAlias("isOK","entries>100&&chi2<80");
  treeFit->SetAlias("dEdxM","(vecFit.fElements[1]*dEdxExp)/50.");
  treeFit->SetAlias("dEdxMErr","(vecFitErr.fElements[1]*dEdxExp)/50.");
  //
  //
  Int_t  npointsMax=30000000;
  TStatToolkit toolkit;
  Double_t chi20=0,chi21=0,chi22=0,chi23=0;
  Int_t    npoints=0;
  TVectorD param0,param1,param2,param3;
  TMatrixD covar0,covar1,covar2,covar3;
  TString fstringFast0="";
  fstringFast0+="dEdxM++";
  //
  TString fstringFast="";
  fstringFast+="dEdxM++";                  // 1
  fstringFast+="(1/pCenter)++";            // 2
  fstringFast+="(1/pCenter)^2++";          // 3
  fstringFast+="(1/pCenter)*dEdxM++";      // 4
  fstringFast+="((1/pCenter)^2)*dEdxM++";  // 5
  //
  //
  TCut cutUse=TString::Format("isOK&&isMax==%d&&dType==%d&&ibinTgl==%d",isMax,dType,tgl).Data();
  TCut cutFit=cutUse+TString::Format("pCenter<%f",maxP).Data();
  if (skipKaon) cutFit+="pType!=3";
  TCut cutDraw =  "(ibinP%2)==0";
  TString *strDeltaFit0 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast0.Data(),cutFit, chi20,npoints,param0,covar0,-1,0, npointsMax, 1);
  TString *strDeltaFit1 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast0.Data(),cutFit, chi21,npoints,param1,covar1,-1,0, npointsMax, 0);
  TString *strDeltaFit2 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast.Data(),cutFit, chi22,npoints,param2,covar2,-1,0, npointsMax, 0);
  //
  fstringFast+="(1/pCenter)/dEdxM++";       //6
  fstringFast+="((1/pCenter)^2)/dEdxM++";   //7
  TString *strDeltaFit3 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast.Data(),cutFit, chi23,npoints,param3,covar3,-1,0, npointsMax, 0);

  treeFit->SetAlias("fitdEdx0",strDeltaFit0->Data());
  treeFit->SetAlias("fitdEdx1",strDeltaFit1->Data());
  treeFit->SetAlias("fitdEdx2",strDeltaFit2->Data());
  treeFit->SetAlias("fitdEdx3",strDeltaFit3->Data());
  
  strDeltaFit0->Tokenize("++")->Print();
  strDeltaFit1->Tokenize("++")->Print();
  strDeltaFit2->Tokenize("++")->Print();
  strDeltaFit3->Tokenize("++")->Print();
  //
  (*pcstream)<<"fitTheta"<<
    "isMax="<<isMax<<          // switch is Qmax/Qtot used
    "dType="<<dType<<          // detector Type
    "tgl="<<tgl<<              // tgl number 
    "skipKaon="<<skipKaon<<    // Was kaon dEdx used in the calibration?
    "maxP="<<maxP<<            // Maximal p used in the fit 
    "npoints="<<npoints<<      // number of points for fit
    // model 0
    "chi20="<<chi20<<          // chi2
    "param0.="<<&param0<<      // parameters
    "covar0.="<<&covar0<<      // covariance
    // model 1
    "chi21="<<chi21<<          // chi2
    "param1.="<<&param1<<      // parameters
    "covar1.="<<&covar1<<      // covariance
    // model 2
    "chi22="<<chi22<<          // chi2
    "param2.="<<&param2<<      // parameters
    "covar2.="<<&covar2<<      // covariance
    // model 3
    "chi23="<<chi23<<          // chi2
    "param3.="<<&param3<<      // parameters
    "covar3.="<<&covar3<<      // covariance
    "\n";
  //
  if (!doDraw) return;
  TGraphErrors * graphs[4] ={0};
  //  TCanvas *canvasdEdxFit = new TCanvas(TString::Format("canvasdEdxFit%d",fitType),"canvasdEdxFit",800,800);
  TCanvas *canvasdEdxFit = new TCanvas("canvasdEdxFit","canvasdEdxFit",800,800);
  canvasdEdxFit->SetLeftMargin(0.15);
  canvasdEdxFit->SetRightMargin(0.1);
  canvasdEdxFit->SetBottomMargin(0.15);
  canvasdEdxFit->Divide(2,2,0,0);
 
  for (Int_t fitType=0; fitType<4; fitType++){
    canvasdEdxFit->cd(fitType+1);
    TLegend * legendPart = new TLegend(0.16+0.1*(fitType%2==0),0.16-0.14*(fitType<2),0.89,0.4,TString::Format("%s",chfitType[fitType]));
    legendPart->SetTextSize(0.05);
    legendPart->SetBorderSize(0);
    for (Int_t ihis=3; ihis>=0;ihis--){
      gPad->SetLogx(1);
      TString expr= TString::Format("100*(dEdxExp-fitdEdx%d)/dEdxExp:pCenter:100*dEdxMErr",fitType);
      graphs[ihis]= TStatToolkit::MakeGraphErrors(treeFit,expr,cutUse+cutDraw+TString::Format("pType==%d",ihis).Data(), markers[ihis],colors[ihis],markerSize[ihis]);
      graphs[ihis]->SetMinimum(-5);
      graphs[ihis]->SetMaximum(5);
      graphs[ihis]->GetXaxis()->SetTitle("#it{p} (GeV/c)");
      graphs[ihis]->GetXaxis()->SetTitleSize(0.06);
      graphs[ihis]->GetYaxis()->SetTitleSize(0.06);      
      graphs[ihis]->GetYaxis()->SetTitle("#Delta(d#it{E}dx)/d#it{E}dx_{BB}(#beta#gamma) (%)");
      if (ihis==3) graphs[ihis]->Draw("alp");
      graphs[ihis]->Draw("lp");
      legendPart->AddEntry(graphs[ihis],partName[ihis],"p");
    }
    legendPart->Draw();
  }
  TLatex  latexDraw;
  latexDraw.SetTextSize(0.045);

  const char *chDType[4]={"IROC","OROC medium","OROC long","OROC"};
  {
    if (isMax) latexDraw.DrawLatex(1,4,"Q_{Max}");
    if (!isMax) latexDraw.DrawLatex(1,4,"Q_{tot}");
    latexDraw.DrawLatex(1,3.5,chDType[dType%4]);
    latexDraw.DrawLatex(1,3,TString::Format("#Theta=%1.1f",tgl/10.));
    latexDraw.DrawLatex(1,2.5,TString::Format("Fit: p_{t}<%1.1f (GeV/c)",maxP));
    latexDraw.DrawLatex(1,2.,TString::Format("Fit: Skip Kaon=%d",skipKaon));
  }
  //
  //
  canvasdEdxFit->SaveAs(TString::Format("fitTransfer_Max%d_Det_%dTheta%d_SkipKaon%d_MaxP%1.0f.pdf",isMax,dType,tgl, skipKaon,maxP));
  canvasdEdxFit->SaveAs(TString::Format("fitTransfer_Max%d_Det_%dTheta%d_SkipKaon%d_MaxP%1.0f.png",isMax,dType,tgl, skipKaon,maxP));

}
//
//
//
void FitTransferFunctionAll(Bool_t isMax, Int_t dType, Bool_t skipKaon, Double_t maxP, TTreeSRedirector *pcstream, Bool_t doDraw){
  //
  // 
  // dEdx_{BB}= f_{tr}(dEdx_{rec}, #phi,#eta)
  //
  // Example usage:
  //    FitTransferFunctionAll(1,1,1,15,0,1) 
  //    isMax=1; dType=1; skipKaon=0; Double_t maxP=10
  //
  if (!pcstream)  pcstream = new TTreeSRedirector("dedxFit.root","update");
  //
  if (!treeFit){
    treeFit = (TTree*)pcstream->GetFile()->Get("fitdEdxG");
    treeFit->SetMarkerStyle(25);
    treeFit->SetCacheSize(100000000);
  }
  const char *chfitType[4] = { "dEdx_{BB}=k(#theta)dEdx_{rec}", 
			       "dEdx_{BB}=k(#theta)dEdx_{rec}+#Delta(#theta)", 
			       "dEdx_{BB}=k(#theta,#phi)dEdx_{rec}+#Delta(#theta,#phi)",
			       "dEdx_{BB}=k(#theta,#phi,1/Q)dEdx_{rec}+#Delta(#theta,#phi,1/Q)",
  };
  //
  treeFit->SetAlias("isOK","entries>100&&chi2<80");
  treeFit->SetAlias("dEdxM","(vecFit.fElements[1]*dEdxExp)/50.");
  treeFit->SetAlias("dEdxMErr","(vecFitErr.fElements[1]*dEdxExp)/50.");
  //
  //
  Int_t  npointsMax=30000000;
  TStatToolkit toolkit;
  Double_t chi20=0,chi21=0,chi22=0,chi23=0;
  Int_t    npoints=0;
  TVectorD param0,param1,param2,param3;
  TMatrixD covar0,covar1,covar2,covar3;
  //
  //
  //
  TString fstringFast0="";
  fstringFast0+="dEdxM++";
  fstringFast0+="(tglCenter-0.5)++";
  fstringFast0+="(tglCenter-0.5)*dEdxM++";
  //
  TString fstringFast1="";
  fstringFast1+="dEdxM++";
  fstringFast1+="(tglCenter-0.5)++";
  fstringFast1+="(tglCenter-0.5)*dEdxM++";
  fstringFast1+="(tglCenter-0.5)^2++";
  fstringFast1+="((tglCenter-0.5)^2)*dEdxM++";
  //
  TString fstringFast2="";
  fstringFast2+="dEdxM++";                  // 1
  fstringFast2+="(1/pCenter)++";            // 2
  fstringFast2+="(1/pCenter)^2++";          // 3
  fstringFast2+="(1/pCenter)*dEdxM++";      // 4
  fstringFast2+="((1/pCenter)^2)*dEdxM++";  // 5
  //
  fstringFast2+="(tglCenter-0.5)*dEdxM++";                  // 8
  fstringFast2+="(tglCenter-0.5)*(1/pCenter)++";            // 9
  fstringFast2+="(tglCenter-0.5)*(1/pCenter)^2++";          // 10
  fstringFast2+="(tglCenter-0.5)*(1/pCenter)*dEdxM++";      // 11
  fstringFast2+="(tglCenter-0.5)*((1/pCenter)^2)*dEdxM++";  // 12
  //
  //
  fstringFast2+="((tglCenter-0.5)^2)*dEdxM++";                  // 15
  fstringFast2+="((tglCenter-0.5)^2)*(1/pCenter)++";            // 16
  fstringFast2+="((tglCenter-0.5)^2)*(1/pCenter)^2++";          // 17
  fstringFast2+="((tglCenter-0.5)^2)*(1/pCenter)*dEdxM++";      // 18
  fstringFast2+="((tglCenter-0.5)^2)*((1/pCenter)^2)*dEdxM++";  // 19
  TString fstringFast3=fstringFast2;
  //
  fstringFast3+="(1/pCenter)/dEdxM++";       // 6
  fstringFast3+="((1/pCenter)^2)/dEdxM++";   // 7
  fstringFast3+="(tglCenter-0.5)*(1/pCenter)/dEdxM++";       // 13
  fstringFast3+="(tglCenter-0.5)*((1/pCenter)^2)/dEdxM++";   // 14
  fstringFast3+="((tglCenter-0.5)^2)*(1/pCenter)/dEdxM++";       // 20
  fstringFast3+="((tglCenter-0.5)^2)*((1/pCenter)^2)/dEdxM++";   // 21
  //
  //
  //
  TCut cutUse=TString::Format("isOK&&isMax==%d&&dType==%d",isMax,dType).Data();
  TCut cutFit=cutUse+TString::Format("pCenter<%f",maxP).Data();
  if (skipKaon) cutFit+="pType!=3";
  TCut cutDraw =  "(ibinP%2)==0";
  TString *strDeltaFit0 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast0.Data(),cutFit, chi20,npoints,param0,covar0,-1,0, npointsMax, 1);
  TString *strDeltaFit1 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast1.Data(),cutFit, chi21,npoints,param1,covar1,-1,0, npointsMax, 0);
  TString *strDeltaFit2 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast2.Data(),cutFit, chi22,npoints,param2,covar2,-1,0, npointsMax, 0);
  //
  TString *strDeltaFit3 = TStatToolkit::FitPlane(treeFit,"dEdxExp:dEdxMErr", fstringFast3.Data(),cutFit, chi23,npoints,param3,covar3,-1,0, npointsMax, 0);

  treeFit->SetAlias("fitdEdx0",strDeltaFit0->Data());
  treeFit->SetAlias("fitdEdx1",strDeltaFit1->Data());
  treeFit->SetAlias("fitdEdx2",strDeltaFit2->Data());
  treeFit->SetAlias("fitdEdx3",strDeltaFit3->Data());
  
  strDeltaFit0->Tokenize("++")->Print();
  strDeltaFit1->Tokenize("++")->Print();
  strDeltaFit2->Tokenize("++")->Print();
  strDeltaFit3->Tokenize("++")->Print();
  //
  (*pcstream)<<"fitAll"<<
    "isMax="<<isMax<<          // switch is Qmax/Qtot used
    "dType="<<dType<<          // detector Type
    "skipKaon="<<skipKaon<<    // Was kaon dEdx used in the calibration?
    "maxP="<<maxP<<            // Maximal p used in the fit 
    "npoints="<<npoints<<      // number of points for fit
    // model 0
    "chi20="<<chi20<<          // chi2
    "param0.="<<&param0<<      // parameters
    "covar0.="<<&covar0<<      // covariance
    // model 1
    "chi21="<<chi21<<          // chi2
    "param1.="<<&param1<<      // parameters
    "covar1.="<<&covar1<<      // covariance
    // model 2
    "chi22="<<chi22<<          // chi2
    "param2.="<<&param2<<      // parameters
    "covar2.="<<&covar2<<      // covariance
    // model 3
    "chi23="<<chi23<<          // chi2
    "param3.="<<&param3<<      // parameters
    "covar3.="<<&covar3<<      // covariance
    "\n";
  //
  if (!doDraw) return;
  TGraphErrors * graphs[4] ={0};
  //  TCanvas *canvasdEdxFit = new TCanvas(TString::Format("canvasdEdxFit%d",fitType),"canvasdEdxFit",800,800);
  TCanvas *canvasdEdxFit = new TCanvas("canvasdEdxFit","canvasdEdxFit",800,800);
  canvasdEdxFit->SetLeftMargin(0.15);
  canvasdEdxFit->SetRightMargin(0.1);
  canvasdEdxFit->SetBottomMargin(0.15);
  canvasdEdxFit->Divide(2,2,0,0);
 
  for (Int_t fitType=0; fitType<4; fitType++){
    canvasdEdxFit->cd(fitType+1);
    TLegend * legendPart = new TLegend(0.16+0.1*(fitType%2==0),0.16-0.14*(fitType<2),0.89,0.4,TString::Format("%s",chfitType[fitType]));
    legendPart->SetTextSize(0.05);
    legendPart->SetBorderSize(0);
    for (Int_t ihis=3; ihis>=0;ihis--){
      gPad->SetLogx(1);
      TString expr= TString::Format("100*(dEdxExp-fitdEdx%d)/dEdxExp:pCenter:100*dEdxMErr",fitType);
      graphs[ihis]= TStatToolkit::MakeGraphErrors(treeFit,expr,cutUse+cutDraw+TString::Format("pType==%d",ihis).Data(), markers[ihis],colors[ihis],markerSize[ihis]);
      graphs[ihis]->SetMinimum(-5);
      graphs[ihis]->SetMaximum(5);
      graphs[ihis]->GetXaxis()->SetTitle("#it{p} (GeV/c)");
      graphs[ihis]->GetXaxis()->SetTitleSize(0.06);
      graphs[ihis]->GetYaxis()->SetTitleSize(0.06);      
      graphs[ihis]->GetYaxis()->SetTitle("#Delta(d#it{E}dx)/d#it{E}dx_{BB}(#beta#gamma) (%)");
      if (ihis==3) graphs[ihis]->Draw("alp");
      graphs[ihis]->Draw("lp");
      legendPart->AddEntry(graphs[ihis],partName[ihis],"p");
    }
    legendPart->Draw();
  }
  TLatex  latexDraw;
  latexDraw.SetTextSize(0.045);

  const char *chDType[4]={"IROC","OROC medium","OROC long","OROC"};
  {
    if (isMax) latexDraw.DrawLatex(1,4,"Q_{Max}");
    if (!isMax) latexDraw.DrawLatex(1,4,"Q_{tot}");
    latexDraw.DrawLatex(1,3.5,chDType[dType%4]);
    latexDraw.DrawLatex(1,2.5,TString::Format("Fit: p_{t}<%1.1f (GeV/c)",maxP));
    latexDraw.DrawLatex(1,2.,TString::Format("Fit: Skip Kaon=%d",skipKaon));
  }
  //
  //
  canvasdEdxFit->SaveAs(TString::Format("fitTransfer_Max%d_Det_%dSkipKaon%d_MaxP%1.0f.pdf",isMax,dType, skipKaon,maxP));
  canvasdEdxFit->SaveAs(TString::Format("fitTransfer_Max%d_Det_%dSkipKaon%d_MaxP%1.0f.png",isMax,dType, skipKaon,maxP));

}


void DrawFit(){
  //
  //
  //
  TTreeSRedirector * pcstream = new TTreeSRedirector("dedxFit.root","update");
  TTree * treeTheta=(TTree*)pcstream->GetFile()->Get("fitTheta"); 
  treeTheta->SetMarkerStyle(25);
  TTree * treeAll=(TTree*)pcstream->GetFile()->Get("fitAll"); 
  treeAll->SetMarkerStyle(25);
  //
  //
  //
  //treeFit->Draw("vecFit.fElements[2]/vecFit.fElements[1]*pow(dEdxExp*sqrt(1+tglCenter**2),0.25):dEdxExp:tglCenter","isTot&&dType==1&&entries>500","colz",1000000);

}
 makeBBFit.C:1
 makeBBFit.C:2
 makeBBFit.C:3
 makeBBFit.C:4
 makeBBFit.C:5
 makeBBFit.C:6
 makeBBFit.C:7
 makeBBFit.C:8
 makeBBFit.C:9
 makeBBFit.C:10
 makeBBFit.C:11
 makeBBFit.C:12
 makeBBFit.C:13
 makeBBFit.C:14
 makeBBFit.C:15
 makeBBFit.C:16
 makeBBFit.C:17
 makeBBFit.C:18
 makeBBFit.C:19
 makeBBFit.C:20
 makeBBFit.C:21
 makeBBFit.C:22
 makeBBFit.C:23
 makeBBFit.C:24
 makeBBFit.C:25
 makeBBFit.C:26
 makeBBFit.C:27
 makeBBFit.C:28
 makeBBFit.C:29
 makeBBFit.C:30
 makeBBFit.C:31
 makeBBFit.C:32
 makeBBFit.C:33
 makeBBFit.C:34
 makeBBFit.C:35
 makeBBFit.C:36
 makeBBFit.C:37
 makeBBFit.C:38
 makeBBFit.C:39
 makeBBFit.C:40
 makeBBFit.C:41
 makeBBFit.C:42
 makeBBFit.C:43
 makeBBFit.C:44
 makeBBFit.C:45
 makeBBFit.C:46
 makeBBFit.C:47
 makeBBFit.C:48
 makeBBFit.C:49
 makeBBFit.C:50
 makeBBFit.C:51
 makeBBFit.C:52
 makeBBFit.C:53
 makeBBFit.C:54
 makeBBFit.C:55
 makeBBFit.C:56
 makeBBFit.C:57
 makeBBFit.C:58
 makeBBFit.C:59
 makeBBFit.C:60
 makeBBFit.C:61
 makeBBFit.C:62
 makeBBFit.C:63
 makeBBFit.C:64
 makeBBFit.C:65
 makeBBFit.C:66
 makeBBFit.C:67
 makeBBFit.C:68
 makeBBFit.C:69
 makeBBFit.C:70
 makeBBFit.C:71
 makeBBFit.C:72
 makeBBFit.C:73
 makeBBFit.C:74
 makeBBFit.C:75
 makeBBFit.C:76
 makeBBFit.C:77
 makeBBFit.C:78
 makeBBFit.C:79
 makeBBFit.C:80
 makeBBFit.C:81
 makeBBFit.C:82
 makeBBFit.C:83
 makeBBFit.C:84
 makeBBFit.C:85
 makeBBFit.C:86
 makeBBFit.C:87
 makeBBFit.C:88
 makeBBFit.C:89
 makeBBFit.C:90
 makeBBFit.C:91
 makeBBFit.C:92
 makeBBFit.C:93
 makeBBFit.C:94
 makeBBFit.C:95
 makeBBFit.C:96
 makeBBFit.C:97
 makeBBFit.C:98
 makeBBFit.C:99
 makeBBFit.C:100
 makeBBFit.C:101
 makeBBFit.C:102
 makeBBFit.C:103
 makeBBFit.C:104
 makeBBFit.C:105
 makeBBFit.C:106
 makeBBFit.C:107
 makeBBFit.C:108
 makeBBFit.C:109
 makeBBFit.C:110
 makeBBFit.C:111
 makeBBFit.C:112
 makeBBFit.C:113
 makeBBFit.C:114
 makeBBFit.C:115
 makeBBFit.C:116
 makeBBFit.C:117
 makeBBFit.C:118
 makeBBFit.C:119
 makeBBFit.C:120
 makeBBFit.C:121
 makeBBFit.C:122
 makeBBFit.C:123
 makeBBFit.C:124
 makeBBFit.C:125
 makeBBFit.C:126
 makeBBFit.C:127
 makeBBFit.C:128
 makeBBFit.C:129
 makeBBFit.C:130
 makeBBFit.C:131
 makeBBFit.C:132
 makeBBFit.C:133
 makeBBFit.C:134
 makeBBFit.C:135
 makeBBFit.C:136
 makeBBFit.C:137
 makeBBFit.C:138
 makeBBFit.C:139
 makeBBFit.C:140
 makeBBFit.C:141
 makeBBFit.C:142
 makeBBFit.C:143
 makeBBFit.C:144
 makeBBFit.C:145
 makeBBFit.C:146
 makeBBFit.C:147
 makeBBFit.C:148
 makeBBFit.C:149
 makeBBFit.C:150
 makeBBFit.C:151
 makeBBFit.C:152
 makeBBFit.C:153
 makeBBFit.C:154
 makeBBFit.C:155
 makeBBFit.C:156
 makeBBFit.C:157
 makeBBFit.C:158
 makeBBFit.C:159
 makeBBFit.C:160
 makeBBFit.C:161
 makeBBFit.C:162
 makeBBFit.C:163
 makeBBFit.C:164
 makeBBFit.C:165
 makeBBFit.C:166
 makeBBFit.C:167
 makeBBFit.C:168
 makeBBFit.C:169
 makeBBFit.C:170
 makeBBFit.C:171
 makeBBFit.C:172
 makeBBFit.C:173
 makeBBFit.C:174
 makeBBFit.C:175
 makeBBFit.C:176
 makeBBFit.C:177
 makeBBFit.C:178
 makeBBFit.C:179
 makeBBFit.C:180
 makeBBFit.C:181
 makeBBFit.C:182
 makeBBFit.C:183
 makeBBFit.C:184
 makeBBFit.C:185
 makeBBFit.C:186
 makeBBFit.C:187
 makeBBFit.C:188
 makeBBFit.C:189
 makeBBFit.C:190
 makeBBFit.C:191
 makeBBFit.C:192
 makeBBFit.C:193
 makeBBFit.C:194
 makeBBFit.C:195
 makeBBFit.C:196
 makeBBFit.C:197
 makeBBFit.C:198
 makeBBFit.C:199
 makeBBFit.C:200
 makeBBFit.C:201
 makeBBFit.C:202
 makeBBFit.C:203
 makeBBFit.C:204
 makeBBFit.C:205
 makeBBFit.C:206
 makeBBFit.C:207
 makeBBFit.C:208
 makeBBFit.C:209
 makeBBFit.C:210
 makeBBFit.C:211
 makeBBFit.C:212
 makeBBFit.C:213
 makeBBFit.C:214
 makeBBFit.C:215
 makeBBFit.C:216
 makeBBFit.C:217
 makeBBFit.C:218
 makeBBFit.C:219
 makeBBFit.C:220
 makeBBFit.C:221
 makeBBFit.C:222
 makeBBFit.C:223
 makeBBFit.C:224
 makeBBFit.C:225
 makeBBFit.C:226
 makeBBFit.C:227
 makeBBFit.C:228
 makeBBFit.C:229
 makeBBFit.C:230
 makeBBFit.C:231
 makeBBFit.C:232
 makeBBFit.C:233
 makeBBFit.C:234
 makeBBFit.C:235
 makeBBFit.C:236
 makeBBFit.C:237
 makeBBFit.C:238
 makeBBFit.C:239
 makeBBFit.C:240
 makeBBFit.C:241
 makeBBFit.C:242
 makeBBFit.C:243
 makeBBFit.C:244
 makeBBFit.C:245
 makeBBFit.C:246
 makeBBFit.C:247
 makeBBFit.C:248
 makeBBFit.C:249
 makeBBFit.C:250
 makeBBFit.C:251
 makeBBFit.C:252
 makeBBFit.C:253
 makeBBFit.C:254
 makeBBFit.C:255
 makeBBFit.C:256
 makeBBFit.C:257
 makeBBFit.C:258
 makeBBFit.C:259
 makeBBFit.C:260
 makeBBFit.C:261
 makeBBFit.C:262
 makeBBFit.C:263
 makeBBFit.C:264
 makeBBFit.C:265
 makeBBFit.C:266
 makeBBFit.C:267
 makeBBFit.C:268
 makeBBFit.C:269
 makeBBFit.C:270
 makeBBFit.C:271
 makeBBFit.C:272
 makeBBFit.C:273
 makeBBFit.C:274
 makeBBFit.C:275
 makeBBFit.C:276
 makeBBFit.C:277
 makeBBFit.C:278
 makeBBFit.C:279
 makeBBFit.C:280
 makeBBFit.C:281
 makeBBFit.C:282
 makeBBFit.C:283
 makeBBFit.C:284
 makeBBFit.C:285
 makeBBFit.C:286
 makeBBFit.C:287
 makeBBFit.C:288
 makeBBFit.C:289
 makeBBFit.C:290
 makeBBFit.C:291
 makeBBFit.C:292
 makeBBFit.C:293
 makeBBFit.C:294
 makeBBFit.C:295
 makeBBFit.C:296
 makeBBFit.C:297
 makeBBFit.C:298
 makeBBFit.C:299
 makeBBFit.C:300
 makeBBFit.C:301
 makeBBFit.C:302
 makeBBFit.C:303
 makeBBFit.C:304
 makeBBFit.C:305
 makeBBFit.C:306
 makeBBFit.C:307
 makeBBFit.C:308
 makeBBFit.C:309
 makeBBFit.C:310
 makeBBFit.C:311
 makeBBFit.C:312
 makeBBFit.C:313
 makeBBFit.C:314
 makeBBFit.C:315
 makeBBFit.C:316
 makeBBFit.C:317
 makeBBFit.C:318
 makeBBFit.C:319
 makeBBFit.C:320
 makeBBFit.C:321
 makeBBFit.C:322
 makeBBFit.C:323
 makeBBFit.C:324
 makeBBFit.C:325
 makeBBFit.C:326
 makeBBFit.C:327
 makeBBFit.C:328
 makeBBFit.C:329
 makeBBFit.C:330
 makeBBFit.C:331
 makeBBFit.C:332
 makeBBFit.C:333
 makeBBFit.C:334
 makeBBFit.C:335
 makeBBFit.C:336
 makeBBFit.C:337
 makeBBFit.C:338
 makeBBFit.C:339
 makeBBFit.C:340
 makeBBFit.C:341
 makeBBFit.C:342
 makeBBFit.C:343
 makeBBFit.C:344
 makeBBFit.C:345
 makeBBFit.C:346
 makeBBFit.C:347
 makeBBFit.C:348
 makeBBFit.C:349
 makeBBFit.C:350
 makeBBFit.C:351
 makeBBFit.C:352
 makeBBFit.C:353
 makeBBFit.C:354
 makeBBFit.C:355
 makeBBFit.C:356
 makeBBFit.C:357
 makeBBFit.C:358
 makeBBFit.C:359
 makeBBFit.C:360
 makeBBFit.C:361
 makeBBFit.C:362
 makeBBFit.C:363
 makeBBFit.C:364
 makeBBFit.C:365
 makeBBFit.C:366
 makeBBFit.C:367
 makeBBFit.C:368
 makeBBFit.C:369
 makeBBFit.C:370
 makeBBFit.C:371
 makeBBFit.C:372
 makeBBFit.C:373
 makeBBFit.C:374
 makeBBFit.C:375
 makeBBFit.C:376
 makeBBFit.C:377
 makeBBFit.C:378
 makeBBFit.C:379
 makeBBFit.C:380
 makeBBFit.C:381
 makeBBFit.C:382
 makeBBFit.C:383
 makeBBFit.C:384
 makeBBFit.C:385
 makeBBFit.C:386
 makeBBFit.C:387
 makeBBFit.C:388
 makeBBFit.C:389
 makeBBFit.C:390
 makeBBFit.C:391
 makeBBFit.C:392
 makeBBFit.C:393
 makeBBFit.C:394
 makeBBFit.C:395
 makeBBFit.C:396
 makeBBFit.C:397
 makeBBFit.C:398
 makeBBFit.C:399
 makeBBFit.C:400
 makeBBFit.C:401
 makeBBFit.C:402
 makeBBFit.C:403
 makeBBFit.C:404
 makeBBFit.C:405
 makeBBFit.C:406
 makeBBFit.C:407
 makeBBFit.C:408
 makeBBFit.C:409
 makeBBFit.C:410
 makeBBFit.C:411
 makeBBFit.C:412
 makeBBFit.C:413
 makeBBFit.C:414
 makeBBFit.C:415
 makeBBFit.C:416
 makeBBFit.C:417
 makeBBFit.C:418
 makeBBFit.C:419
 makeBBFit.C:420
 makeBBFit.C:421
 makeBBFit.C:422
 makeBBFit.C:423
 makeBBFit.C:424
 makeBBFit.C:425
 makeBBFit.C:426
 makeBBFit.C:427
 makeBBFit.C:428
 makeBBFit.C:429
 makeBBFit.C:430
 makeBBFit.C:431
 makeBBFit.C:432
 makeBBFit.C:433
 makeBBFit.C:434
 makeBBFit.C:435
 makeBBFit.C:436
 makeBBFit.C:437
 makeBBFit.C:438
 makeBBFit.C:439
 makeBBFit.C:440
 makeBBFit.C:441
 makeBBFit.C:442
 makeBBFit.C:443
 makeBBFit.C:444
 makeBBFit.C:445
 makeBBFit.C:446
 makeBBFit.C:447
 makeBBFit.C:448
 makeBBFit.C:449
 makeBBFit.C:450
 makeBBFit.C:451
 makeBBFit.C:452
 makeBBFit.C:453
 makeBBFit.C:454
 makeBBFit.C:455
 makeBBFit.C:456
 makeBBFit.C:457
 makeBBFit.C:458
 makeBBFit.C:459
 makeBBFit.C:460
 makeBBFit.C:461
 makeBBFit.C:462
 makeBBFit.C:463
 makeBBFit.C:464
 makeBBFit.C:465
 makeBBFit.C:466
 makeBBFit.C:467
 makeBBFit.C:468
 makeBBFit.C:469
 makeBBFit.C:470
 makeBBFit.C:471
 makeBBFit.C:472
 makeBBFit.C:473
 makeBBFit.C:474
 makeBBFit.C:475
 makeBBFit.C:476
 makeBBFit.C:477
 makeBBFit.C:478
 makeBBFit.C:479
 makeBBFit.C:480
 makeBBFit.C:481
 makeBBFit.C:482
 makeBBFit.C:483
 makeBBFit.C:484
 makeBBFit.C:485
 makeBBFit.C:486
 makeBBFit.C:487
 makeBBFit.C:488
 makeBBFit.C:489
 makeBBFit.C:490
 makeBBFit.C:491
 makeBBFit.C:492
 makeBBFit.C:493
 makeBBFit.C:494
 makeBBFit.C:495
 makeBBFit.C:496
 makeBBFit.C:497
 makeBBFit.C:498
 makeBBFit.C:499
 makeBBFit.C:500
 makeBBFit.C:501
 makeBBFit.C:502
 makeBBFit.C:503
 makeBBFit.C:504
 makeBBFit.C:505
 makeBBFit.C:506
 makeBBFit.C:507
 makeBBFit.C:508
 makeBBFit.C:509
 makeBBFit.C:510
 makeBBFit.C:511
 makeBBFit.C:512
 makeBBFit.C:513
 makeBBFit.C:514
 makeBBFit.C:515
 makeBBFit.C:516
 makeBBFit.C:517
 makeBBFit.C:518
 makeBBFit.C:519
 makeBBFit.C:520
 makeBBFit.C:521
 makeBBFit.C:522
 makeBBFit.C:523
 makeBBFit.C:524
 makeBBFit.C:525
 makeBBFit.C:526
 makeBBFit.C:527
 makeBBFit.C:528
 makeBBFit.C:529
 makeBBFit.C:530
 makeBBFit.C:531
 makeBBFit.C:532
 makeBBFit.C:533
 makeBBFit.C:534
 makeBBFit.C:535
 makeBBFit.C:536
 makeBBFit.C:537
 makeBBFit.C:538
 makeBBFit.C:539
 makeBBFit.C:540
 makeBBFit.C:541
 makeBBFit.C:542
 makeBBFit.C:543
 makeBBFit.C:544
 makeBBFit.C:545
 makeBBFit.C:546
 makeBBFit.C:547
 makeBBFit.C:548
 makeBBFit.C:549
 makeBBFit.C:550
 makeBBFit.C:551
 makeBBFit.C:552
 makeBBFit.C:553
 makeBBFit.C:554
 makeBBFit.C:555
 makeBBFit.C:556
 makeBBFit.C:557
 makeBBFit.C:558
 makeBBFit.C:559
 makeBBFit.C:560
 makeBBFit.C:561
 makeBBFit.C:562
 makeBBFit.C:563
 makeBBFit.C:564
 makeBBFit.C:565
 makeBBFit.C:566
 makeBBFit.C:567
 makeBBFit.C:568
 makeBBFit.C:569
 makeBBFit.C:570
 makeBBFit.C:571
 makeBBFit.C:572
 makeBBFit.C:573
 makeBBFit.C:574
 makeBBFit.C:575
 makeBBFit.C:576
 makeBBFit.C:577
 makeBBFit.C:578
 makeBBFit.C:579
 makeBBFit.C:580
 makeBBFit.C:581
 makeBBFit.C:582
 makeBBFit.C:583
 makeBBFit.C:584
 makeBBFit.C:585
 makeBBFit.C:586
 makeBBFit.C:587
 makeBBFit.C:588
 makeBBFit.C:589
 makeBBFit.C:590
 makeBBFit.C:591
 makeBBFit.C:592
 makeBBFit.C:593
 makeBBFit.C:594
 makeBBFit.C:595
 makeBBFit.C:596
 makeBBFit.C:597
 makeBBFit.C:598
 makeBBFit.C:599
 makeBBFit.C:600
 makeBBFit.C:601
 makeBBFit.C:602
 makeBBFit.C:603
 makeBBFit.C:604
 makeBBFit.C:605
 makeBBFit.C:606
 makeBBFit.C:607
 makeBBFit.C:608
 makeBBFit.C:609
 makeBBFit.C:610
 makeBBFit.C:611
 makeBBFit.C:612
 makeBBFit.C:613
 makeBBFit.C:614
 makeBBFit.C:615
 makeBBFit.C:616
 makeBBFit.C:617
 makeBBFit.C:618
 makeBBFit.C:619
 makeBBFit.C:620
 makeBBFit.C:621
 makeBBFit.C:622
 makeBBFit.C:623
 makeBBFit.C:624
 makeBBFit.C:625
 makeBBFit.C:626
 makeBBFit.C:627
 makeBBFit.C:628
 makeBBFit.C:629
 makeBBFit.C:630
 makeBBFit.C:631