ROOT logo
/*
  Fast toy MC for different purposes. primary goal prepare the motivation figures for the TPC TDR and
  expalantion internal note.
  
  testExtrapolationError() - to show track extrapolation errror
  testdEdxGEM();  -to show the dEdx respolution detoriation as function of the electron trasnparency
 

  .x $HOME/NimStyle.C
  .L $ALICE_ROOT/TPC/Upgrade/macros/fastToyMCMI.C+
 
*/
#include "TStyle.h"
#include "TCut.h"
#include "TCanvas.h"
#include "TMath.h"
#include "TVectorD.h"
#include "TLinearFitter.h"
#include "TGeoGlobalMagField.h"
#include "TRandom.h"
#include "TGraphErrors.h"
#include "TStatToolkit.h"

#include "TTreeStream.h"
#include "AliExternalTrackParam.h"
#include "AliCDBManager.h"
#include "AliMagF.h"
#include "AliTrackerBase.h"
#include "TAxis.h"
#include "TLegend.h"
#include "AliGeomManager.h"
#include "TCut.h"
#include "TCanvas.h"
#include "TH2.h"
#include "TF1.h"
#include "TStyle.h"



void testdEdxGEM(const Int_t ntracks=10000, Double_t clNoise=2, Double_t corrNoiseAdd=0.15, Double_t sigmaLandau=0.26);
void testExtrapolationError(Int_t ntracks, Int_t useGeo=kFALSE, Int_t seed=0);


void fastToyMCMI(Int_t action=1, Float_t arg0=200, Float_t arg1=0, Float_t arg2=0){
  //
  //
  //
  if (action==1)  testExtrapolationError(arg0,arg1,arg2); 
}


void testdEdxGEM(const Int_t ntracks, Double_t clNoise, Double_t corrNoiseAdd, Double_t sigmaLandau){
  //
  // test dEdx performance as function of the electron transparency.
  //
  // For simulation standard gRandom->Landau() generator with mean 15 is used
  // Charge between pad-rows are corelated via diffusion - qm = (0.15*q-1+0.7*q0+0.15*q1)
  // Electrons are randomly absorbed dependending on the transparency parameter
  // 
  // Parameters:
  //   clNoise       - noise integrated by cluster (snoise~1 x 4 bins ~ 2)
  //   corrNoiseAdd  - additional correlated noise to be added
  //   sigmaLandau   - relative sigma of Landau distirbution
  // Setup emulation
  //   pp   setup testdEdxGEM(20000,2,0.15,0.26)
  //   PbPb setup testdEdxGEM(20000,4,0.5,0.26)
  //   PbPb setup testdEdxGEM(20000,4,0.6,0.26)
  //   PbPb setup testdEdxGEM(20000,4,0.7,0.26)
  // 
 
  TTreeSRedirector *pcstream = new TTreeSRedirector("testdEdxResolution.root","update");
  TH2F * phisdEdx = (TH2F*)pcstream->GetFile()->Get("hisdEdx");
  if (!phisdEdx){

    TVectorD qVector(160);
    TVectorD qVectorCorr(160);
    TVectorD qVectorAcc(160);
    TVectorD qVectorSorted(160);
    Int_t indexes[160];
    Int_t ntrans=20;
    TVectorD vecdEdx(ntrans);
    TVectorD vecT(ntrans);
    //
    
    for (Int_t itrack=0; itrack<ntracks; itrack++){
      Double_t meanEl=15*(1.+1*gRandom->Rndm());
      Double_t sigmaEl=sigmaLandau*meanEl*TMath::Power(15./meanEl,0.25);
      for (Int_t irow=0; irow<160; irow++){
	qVector[irow]=gRandom->Landau(meanEl, sigmaEl);      
      }
      qVectorCorr[0]=qVector[0];
      qVectorCorr[158]=qVector[158];
      for (Int_t irow=1; irow<159; irow++){  //corralte measurement via diffusion
	qVectorCorr[irow]= 0.15*(qVector[irow-1]+ qVector[irow+1])+0.7*qVector[irow];
      }
      
      for (Int_t itrans=0; itrans<ntrans; itrans++){
	Double_t transparency=(itrans+1.)/ntrans;
	vecT[itrans]=transparency;
	for (Int_t irow=0; irow<160; irow++) {
	  qVectorAcc[irow]=0;
	  for (Int_t iel=0; iel<TMath::Nint(qVectorCorr[irow]); iel++) {
	    if (gRandom->Rndm()<transparency) 	qVectorAcc[irow]+=1./transparency;	
	  }
	}      
	for (Int_t irow=0; irow<160; irow++) {
	  qVectorAcc[irow]+=gRandom->Gaus(0, clNoise);
	  if (qVectorAcc[irow]<0) qVectorAcc[irow]=0;
	}
	TMath::Sort(160,qVectorAcc.GetMatrixArray(), indexes, kFALSE);
	for (Int_t irow=0; irow<160; irow++) {
	  qVectorSorted[irow]=qVectorAcc[indexes[irow]];
	}
	vecdEdx[itrans]=TMath::Mean(0.6*160.,	qVectorSorted.GetMatrixArray());    
	vecdEdx[itrans]+=gRandom->Gaus(0, corrNoiseAdd);
      }
      (*pcstream)<<"dEdx"<<
	"itrack="<<itrack<<              // itrack 
	"meanEl="<<meanEl<<              // 
	"sigmaEl="<<sigmaEl<<            //
	"vecT.="<<&vecT<<                //
	"vecdEdx.="<<&vecdEdx<<
	"qVector.="<<&qVector<<
	"\n";
    }
    TTree * tree = (TTree*)(pcstream->GetFile()->Get("dEdx"));
    tree->Draw("vecdEdx.fElements/(meanEl):vecT.fElements>>hisdEdx(16,0.199,1,100,0.70,1.50)","meanEl<100","colz");    
    phisdEdx= (TH2F*)tree->GetHistogram()->Clone();    
    gStyle->SetOptFit(1);
    gStyle->SetOptStat(0);
    phisdEdx->Write("hisdEdx");
  }
  delete pcstream;
  gStyle->SetOptStat(0);
  gStyle->SetOptFit(1);
  pcstream = new TTreeSRedirector("testdEdxResolution.root","update"); 
  phisdEdx = (TH2F*)pcstream->GetFile()->Get("hisdEdx");
  TObjArray *arrFit = new TObjArray(3);
  phisdEdx->FitSlicesY(0,0,-1,0,"QNR",arrFit);
  TH1D * hisRes = (TH1D*)arrFit->At(2);
  hisRes->Divide((TH1D*)arrFit->At(1)); 
  hisRes->Scale(100);
  hisRes->SetTitle("dEdx resolution");
  hisRes->SetMarkerStyle(21);
  hisRes->GetXaxis()->SetTitle("Eff. electron  transparency");
  hisRes->GetYaxis()->SetTitle("#sigma_{dEdx}/dEdx (%)");
  hisRes->SetMinimum(4);
  hisRes->SetMaximum(8);
  //
  TF1 * ftrans = new TF1("ftrans","[0]*x**(-(abs([1])+0.000001))");
  ftrans->SetParName(0,"#sigma_{T1}");
  ftrans->SetParName(1,"#sigma slope");
  ftrans->SetParameters(0.05,1,0.05);
  hisRes->SetMarkerStyle(21);
  hisRes->SetMarkerSize(0.9);
  TCanvas * canvasTrans = new TCanvas("canvasTrans", "canvasTrans",600,500);
  canvasTrans->SetTicks(1,1);
  hisRes->Fit(ftrans,"","",0.2,1);
  canvasTrans->SaveAs("canvasElTrans.pdf");
  //TH
  
  
}

void testExtrapolationError(Int_t ntracks, Int_t useGeo, Int_t seed){
  //
  // check the extrapolation error
  // 2 scenarios 
  //     - ITS extrapolation
  //     - ITS + TRD interpolation
  //
  //
  gRandom->SetSeed(seed);
  const char *  ocdbpath = "local://$ALICE_ROOT/OCDB/";  
  AliCDBManager * man = AliCDBManager::Instance();
  man->SetDefaultStorage(ocdbpath);
  man->SetRun(0);
  TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., AliMagF::k5kG,       AliMagF::kBeamTypepp, 2.76/2.));
  Double_t   bz=AliTrackerBase::GetBz(); 
  if ( useGeo)   AliGeomManager::LoadGeometry("geometry.root");
  if (!useGeo)   AliGeomManager::LoadGeometry();
  //
  //  Double_t rpoints[13]={2.2,   2.8,   3.6,   20,    22,    41,     43,       300,315,330,345,360,375};
  Double_t spoints[13]={0.0004,0.0004,0.0004,0.0004,0.0004,0.0004, 0.0004,   0.02,0.02,0.02,0.02,0.02,0.02}; // ITS layers R poition (http://arxiv.org/pdf/1304.1306v3.pdf - pixel scenario) 
  //
  Double_t rpoints[13]={2.32,   3.13,   3.91,   19.41,    24.71,    35.33,     40.53,       300,315,330,345,360,375};

  //
  // 
  //
  const Int_t nbins=40;  
  TFile * f = TFile::Open("testExtrapolationErr.root","update");
  if (f->Get("extrapol")==0){
    delete f;
    f=0;
    Double_t cv[21]={0}; 
    Double_t covarSeed[15]={0};
    for (Int_t i=0; i<15; i++) covarSeed[i]=0;
    covarSeed[0]=0.1;
    covarSeed[2]=0.1;
    covarSeed[5]=0.001;
    covarSeed[9]=0.001;
    covarSeed[14]=0.03;
    //
    Double_t vertex[3]={0,0,0};
    TTreeSRedirector *pcstream = new TTreeSRedirector("testExtrapolationErr.root","update");
    //
    TVectorD vecR(nbins);
    TVectorD vecITSErr0(nbins);
    TVectorD vecITSTRDErr0(nbins);
    //
    for (Int_t itrack=0; itrack<ntracks; itrack++){
      //
      //Double_t phi = gRandom->Uniform(0.0, 2*TMath::Pi());
      if (itrack%20==0) printf("processing\t%d\n", itrack);
      Double_t phi = (gRandom->Rndm()-1)*TMath::Pi()/18;
      Double_t eta = gRandom->Uniform(-1, 1);
      Double_t pt = 1./(gRandom->Rndm()+0.00001);   
      Double_t theta = 2*TMath::ATan(TMath::Exp(-eta))-TMath::Pi()/2.;
      Double_t pxyz[3];
      pxyz[0]=pt*TMath::Cos(phi);
      pxyz[1]=pt*TMath::Sin(phi);
      pxyz[2]=pt*TMath::Tan(theta);
      Short_t psign=(gRandom->Rndm()>0.5)? -1.:1.;
      AliExternalTrackParam *track= new AliExternalTrackParam(vertex, pxyz, cv, psign);   
      Double_t alpha=TMath::ATan2(pxyz[1],pxyz[0]);
      track->Rotate(alpha);
      //
      // 0.) Estimate the error using the ITS extrapolation and ITS+TRD interpolation - neglecting the MS -inf. momanta tracks
      // 
      for (Int_t irbin=0; irbin<nbins; irbin++){
	Double_t x0 =85+Double_t(irbin)*(245.-85.)/Double_t(nbins);
	Double_t x;
	//
	// parabolic fit
	//
	TLinearFitter fitterITS(3,"pol2");
	TLinearFitter fitterITSTRD(3,"pol2");
	vecR[irbin]=x0;
	for (Int_t i=0; i<13; i++) { 
	  Double_t y = 0;
	  if (track->GetYAt(rpoints[irbin],bz,y)){
	    x=rpoints[i]-x0; 
	    if (i<7) fitterITS.AddPoint(&x,y,spoints[i]);
	    fitterITSTRD.AddPoint(&x,y,spoints[i]);      
	  }
	}
	fitterITS.Eval();
	fitterITSTRD.Eval();
	vecITSErr0[irbin]=fitterITS.GetParError(0);
	vecITSTRDErr0[irbin]=fitterITSTRD.GetParError(0);
      }
      //
      //  1.) estimate q/pt resolution for the ITS+TPC, ITS+TPC+TRD and ITS+TRD scenario
      //
      AliExternalTrackParam * param = new AliExternalTrackParam(*track);
      Double_t *covar = (Double_t*)  param->GetCovariance();
      for (Int_t i=0; i<15; i++) covar[i]=covarSeed[i];
      AliTrackerBase::PropagateTrackToBxByBz(param, 370,0.13,1,kFALSE);
      
      AliExternalTrackParam *trackITSTPC= new AliExternalTrackParam(*param);   
      AliExternalTrackParam *trackITSTPCTRD= new AliExternalTrackParam(*param);   
      AliExternalTrackParam *trackITSTRD= new AliExternalTrackParam(*param);   
      AliExternalTrackParam *trackTPCTRD= new AliExternalTrackParam(*param); 
      //
      Bool_t tStatus=kTRUE;
      for (Int_t idet=2;idet>=0; idet--){
	Int_t nlayers=7;
	if (idet==1) nlayers=159;
	if (idet==2) nlayers=6;
	for (Int_t ilayer=nlayers; ilayer>=0; ilayer--){
	  Double_t rlayer=245.-ilayer;
	  Double_t slayer=0.1;
	  if (idet==0) {rlayer=rpoints[ilayer];  slayer=spoints[ilayer];}
	  if (idet==2) {rlayer=rpoints[ilayer+7]; slayer=spoints[ilayer+7];}
	  param->PropagateTo(rlayer,bz);
	  tStatus&=!AliTrackerBase::PropagateTrackToBxByBz(param, rlayer,0.13,1,kFALSE);
	  tStatus&=!AliTrackerBase::PropagateTrackToBxByBz(trackITSTPC, rlayer,0.13,1,kFALSE);
	  tStatus&=!AliTrackerBase::PropagateTrackToBxByBz(trackITSTPCTRD, rlayer,0.13,1,kFALSE);
	  tStatus&=!AliTrackerBase::PropagateTrackToBxByBz(trackITSTRD, rlayer,0.13,1,kFALSE);
	  tStatus&=!AliTrackerBase::PropagateTrackToBxByBz(trackTPCTRD, rlayer,0.13,1,kFALSE);
	  //if (tStatus==kFALSE) break;
	  Double_t pointPos[2]={param->GetY(),param->GetZ()};
	  Double_t pointCov[3]= { slayer*slayer,0,slayer*slayer};
	  tStatus&=!trackITSTPCTRD->Update(pointPos,pointCov);
	  if (idet!=2) {
	    trackITSTPC->Update(pointPos,pointCov);
	  }
	  if (idet!=1) {
	    trackITSTRD->Update(pointPos,pointCov);
	  }
	  if (idet!=0) {
	    trackTPCTRD->Update(pointPos,pointCov);
	  }
	}
      }
      //
      // 2.) Estimate propagation error at given radius
      //
      //  2.a) Fit ITS and TRD track (gauss smeared point error 0 not MS used)
      AliExternalTrackParam *trackITS= new AliExternalTrackParam(*track);
      AliExternalTrackParam *trackITS0= new AliExternalTrackParam(*track);
      covar = (Double_t*)  trackITS->GetCovariance();
      for (Int_t i=0; i<15; i++) covar[i]=covarSeed[i];
      AliExternalTrackParam *trackTRD= new AliExternalTrackParam(*param);      
      AliExternalTrackParam *trackTRD0= new AliExternalTrackParam(*param);      
      {for (Int_t ilayer=0; ilayer<7; ilayer++){ 
	  AliTrackerBase::PropagateTrackToBxByBz(trackITS, rpoints[ilayer],0.13,1,kFALSE);
	  AliTrackerBase::PropagateTrackToBxByBz(trackITS0, rpoints[ilayer],0.13,1,kFALSE);
	  Double_t pointPos[2]={trackITS0->GetY()+gRandom->Gaus(0,spoints[ilayer]),trackITS0->GetZ()+gRandom->Gaus(0,spoints[ilayer])};
	  Double_t pointCov[3]= {spoints[ilayer]*spoints[ilayer],0,spoints[ilayer]*spoints[ilayer]};
	  trackITS->Update(pointPos,pointCov);
	}}
      {for (Int_t ilayer=5; ilayer>=0; ilayer--){ 
	  AliTrackerBase::PropagateTrackToBxByBz(trackTRD, rpoints[ilayer+7],0.13,1,kFALSE);
	  AliTrackerBase::PropagateTrackToBxByBz(trackTRD0, rpoints[ilayer+7],0.13,1,kFALSE);
	  Double_t pointPos[2]={trackTRD0->GetY()+gRandom->Gaus(0,spoints[ilayer+7]),trackTRD0->GetZ()+gRandom->Gaus(0,spoints[ilayer+7])};
	  Double_t pointCov[3]= {spoints[ilayer+7]*spoints[ilayer+7],0,spoints[ilayer+7]*spoints[ilayer+7]};
	  trackTRD->Update(pointPos,pointCov);
	}}
      //
      // 2.b) get ITS extrapolation and TRD interpolation errors at random radisues positions
      //
      const Int_t npoints=20;
      TVectorD vecRKalman(npoints);
      TVectorD vecITSDeltaY(npoints),    vecITSTRDDeltaY(npoints);
      TVectorD vecITSErrY(npoints),      vecITSTRDErrY(npoints);
      for (Int_t ipoint=0; ipoint<npoints; ipoint++){
	Double_t rLayer= 85.+gRandom->Rndm()*(245.-85.);
	AliExternalTrackParam *trackITSP= new AliExternalTrackParam(*trackITS);
	AliExternalTrackParam *trackITSP0= new AliExternalTrackParam(*trackITS0);
	AliExternalTrackParam *trackTRDP= new AliExternalTrackParam(*trackTRD);
	AliTrackerBase::PropagateTrackToBxByBz(trackITSP, rLayer,0.13,1,kFALSE);
	AliTrackerBase::PropagateTrackToBxByBz(trackITSP0, rLayer,0.13,1,kFALSE);
	AliTrackerBase::PropagateTrackToBxByBz(trackTRDP, rLayer,0.13,1,kFALSE); 
	vecRKalman[ipoint]=rLayer;
	trackTRDP->Rotate(trackITSP->GetAlpha());
	vecITSDeltaY[ipoint]=trackITSP->GetY()-trackITSP0->GetY();
	vecITSErrY[ipoint]=TMath::Sqrt(trackITSP->GetSigmaY2());
	AliTrackerBase::UpdateTrack(*trackITSP, *trackTRDP);
	vecITSTRDDeltaY[ipoint]=trackITSP->GetY()-trackITSP0->GetY();
	vecITSTRDErrY[ipoint]=TMath::Sqrt(trackITSP->GetSigmaY2());
      }
      //

      //vecITSErr0.Print();
      (*pcstream)<<"extrapol"<<
	"itrack="<<itrack<<
	"track.="<<track<<
	"vecR.="<<&vecR<<
	//
	"vecITSErr0.="<<&vecITSErr0<<
	"vecITSTRDErr0.="<<&vecITSTRDErr0<<
	"tStatus="<<tStatus<<
	"trackITSTPC.="<<trackITSTPC<<
	"trackITSTPCTRD.="<<trackITSTPCTRD<<
	"trackITSTRD.="<<trackITSTRD<<
	"trackTPCTRD.="<<trackTPCTRD<<
	//
	// kalman extapoltation einterplotaltion studies 
	// extrapolation and ITSTRDitnerpolation at different radiuses 
	"verRKalman.="<<&vecRKalman<<            
	"vecITSDeltaY.="<<&vecITSDeltaY<<
	"vecITSErrY.="<<&vecITSErrY<<
	"vecITSTRDDeltaY.="<<&vecITSTRDDeltaY<<
	"vecITSTRDErrY.="<<&vecITSTRDErrY<<
	"\n";
    }
    delete pcstream;
  }
  delete f;

  gStyle->SetOptTitle(0);
  f = TFile::Open("testExtrapolationErr.root","update");
  TTree * tree = (TTree*)f->Get("extrapol");
  tree->SetMarkerStyle(25);
  tree->SetMarkerSize(0.3);

  //
  TGraphErrors * grITS0    = TStatToolkit::MakeGraphErrors(tree,"10*vecITSErr0.fElements:vecR.fElements","",25,4,0);
  TGraphErrors * grITSTRD0 = TStatToolkit::MakeGraphErrors(tree,"10*vecITSTRDErr0.fElements:vecR.fElements","",21,2,0);
  //
  grITS0->GetXaxis()->SetTitle("radius (cm)");
  grITS0->GetYaxis()->SetTitle("#sigma_{r#varphi} (mm)");
  grITS0->Draw("ap");
  grITSTRD0->Draw("p");
  TLegend * legend  = new TLegend(0.11,0.65,0.55,0.89,"Track residuals at TPC (q/p_{t}=0)");
  legend->AddEntry(grITS0,"ITS extrapolation","p");
  legend->AddEntry(grITSTRD0,"ITS-TRD interpolation","p");
  legend->SetFillColor(10);
  legend->Draw();
  //
  //
  //
  TCut cut="abs(track.fP[4])<0.25";
  TGraphErrors * grITSTPCqPt    = TStatToolkit::MakeGraphErrors(tree,"sqrt(trackITSTPC.fC[14]):abs(track.fP[4])",cut,20,1,0.8);
  TGraphErrors * grITSTRDqPt    = TStatToolkit::MakeGraphErrors(tree,"sqrt(trackITSTRD.fC[14]):abs(track.fP[4])",cut,21,4,0.8);
  TGraphErrors * grITSTPCTRDqPt = TStatToolkit::MakeGraphErrors(tree,"sqrt(trackITSTPCTRD.fC[14]):abs(track.fP[4])",cut,24,2,0.8);
  TGraphErrors * grTPCTRDqPt    = TStatToolkit::MakeGraphErrors(tree,"sqrt(trackTPCTRD.fC[14]):abs(track.fP[4])",cut,25,3,0.8);
  grITSTPCqPt->GetXaxis()->SetTitle("q/p_{t} (c/GeV)");
  grITSTPCqPt->GetYaxis()->SetTitle("#sigma_{q/p_{t}} (c/GeV)");
  grITSTPCqPt->SetMaximum(0.003);
  TCanvas * canvasResol = new TCanvas("canvasResol","canvasResol",800,600);
  canvasResol->cd();
  canvasResol->SetLeftMargin(0.15);
  grITSTPCqPt->GetYaxis()->SetTitleOffset(1.3);

  {
    grITSTPCqPt->Draw("ap");
    grITSTRDqPt->Draw("p");
    grITSTPCTRDqPt->Draw("p");
    grTPCTRDqPt->Draw("p");
    TLegend * legendQpt  = new TLegend(0.41,0.11,0.89,0.4,"q/p_{t} resolution (from covariance matrix) ");
    legendQpt->AddEntry(grITSTPCqPt,"ITS+TPC","p");
    legendQpt->AddEntry(grITSTRDqPt,"ITS+TRD","p");
    legendQpt->AddEntry(grITSTPCTRDqPt,"ITS+TPC+TRD","p");
    legendQpt->AddEntry(grTPCTRDqPt,"TPC+TRD","p");
    legendQpt->Draw();
  }
  //
  //
  TCanvas *canvasResolution = new TCanvas("canvasResolution","canvasResolution",600,600);
  canvasResolution->Divide(1,3);
  //
  canvasResolution->cd(1);
  tree->Draw("vecITSErrY.fElements:verRKalman.fElements:abs(track.fP[4])","","colz");
  canvasResolution->cd(2);
  tree->Draw("vecITSTRDErrY.fElements:verRKalman.fElements:abs(track.fP[4])","","colz");
  canvasResolution->cd(3);
  tree->Draw("vecITSTRDErrY.fElements/vecITSErrY.fElements:verRKalman.fElements:abs(track.fP[4])","","colz");
  canvasResolution->SaveAs("canvasResolution.pdf");
  canvasResolution->SaveAs("canvasResolution.png");
  //
  //
  //
  TStatToolkit toolkit;
  Double_t chi2=0;
  Int_t    npoints=0;
  TVectorD param;
  TMatrixD covar;  
  //
  TCut cut="";
  TString  fstringITS="";
  fstringITS+="abs(track.fP[4])*(verRKalman.fElements-40)^2++";   
  fstringITS+="(verRKalman.fElements-40)^2++";   
  TString * fitErrITS = TStatToolkit::FitPlane(tree,"vecITSErrY.fElements:(0.1+track.fP[4]**2)", fstringITS.Data(),"verRKalman.fElements>0", chi2,npoints,param,covar,-1,0,180000 , kFALSE);
  tree->SetAlias("fitErrITS",fitErrITS->Data());
  fitErrITS->Tokenize("++")->Print();
  tree->Draw("vecITSErrY.fElements/fitErrITS:verRKalman.fElements:abs(track.fP[4])","","colz");
  //
  //
  TString  fstringITSTRD="";
  fstringITSTRD+="abs(track.fP[4])++";   
  fstringITSTRD+="abs(track.fP[4]*verRKalman.fElements)++";   
  fstringITSTRD+="abs(track.fP[4]*verRKalman.fElements**2)++";   
  for (Int_t iter=0; iter<3; iter++){
    TCut cutOut="1";
    if (iter>0) cutOut="abs(vecITSTRDErrY.fElements/fitErrITSTRD-1)<0.8";
    TString * fitErrITSTRD = TStatToolkit::FitPlane(tree,"vecITSTRDErrY.fElements:(0.1+track.fP[4]**2)", fstringITSTRD.Data(),"verRKalman.fElements>0"+cutOut, chi2,npoints,param,covar,-1,0,180000 , kFALSE);
    tree->SetAlias("fitErrITSTRD",fitErrITSTRD->Data());
    fitErrITSTRD->Tokenize("++")->Print();
  }
  tree->Draw("vecITSTRDErrY.fElements/fitErrITSTRD:verRKalman.fElements:abs(track.fP[4])","","colz");

  
  TCanvas *canvasResolutionFit = new TCanvas("canvasResolutionFit","canvasResolutionFit",700,700);
  canvasResolutionFit->Divide(1,3);
  canvasResolutionFit->cd(1);
  tree->Draw("fitErrITS:verRKalman.fElements:abs(track.fP[4])>>hITS","","colz"); 
  htemp = (TH2F*)gPad->GetPrimitive("hITS")->Clone();
  htemp->GetXaxis()->SetTitle("#it{r} (cm)");
  htemp->GetYaxis()->SetTitle("#sigma_{r#phi} (cm) ITS");
  htemp->GetZaxis()->SetTitle("q/#it{p_{t}} (#it{c}/GeV)");
  htemp->Draw("colz");
  canvasResolutionFit->cd(2);
  tree->Draw("fitErrITSTRD:verRKalman.fElements:abs(track.fP[4])>>hITSTRD","","colz");
  htemp = (TH2F*)gPad->GetPrimitive("hITSTRD")->Clone();
  htemp->GetXaxis()->SetTitle("#it{r} (cm)");
  htemp->GetYaxis()->SetTitle("#sigma_{r#phi} (cm) ITS+TRD");
  htemp->GetZaxis()->SetTitle("q/#it{p_{t}} (#it{c}/GeV)");
  htemp->Draw("colz");
  canvasResolutionFit->cd(3);
  tree->Draw("fitErrITSTRD:verRKalman.fElements:abs(track.fP[4])>>hITSTRD","","colz");
  htemp = (TH2F*)gPad->GetPrimitive("hITSTRD")->Clone();
  htemp->GetXaxis()->SetTitle("#it{r} (cm)");
  htemp->GetYaxis()->SetTitle("#sigma_{r#phi} (cm) ITS+TRD");
  htemp->GetZaxis()->SetTitle("q/#it{p_{t}} (#it{c}/GeV)");
  htemp->Draw("colz");
  canvasResolutionFit->SaveAs("canvasResolutionFit.pdf");
  canvasResolutionFit->SaveAs("canvasResolutionFit.png");

}


void DrawInerpolationResolution(){

  // resRphi = 0.004390 + oneOverPt*(-0.136403) + oneOverPt*radius*(0.002266) + oneOverPt*radius*radius*(-0.000006);

  //TF1 f1("f1","[0]+[1]*(
}

void MakeRobustFitTest(){
  //
  //
  //
  // 
  TH2F *   his2D   = new TH2F("his2D", "his2D",50,0,1., 100,-2.,2.);
  TH2F *   his2DW   = new TH2F("his2DW", "his2DW",50,0,1., 100,-2.,2.);
  Double_t probRND = 0.1;
  Int_t    ntracks = 20*50000;
  Int_t    nclusters = 16;
  Double_t sigmaCluster=0.1;
  //
  for (Int_t itrack=0; itrack<ntracks; itrack++){
    Double_t x     = gRandom->Rndm();
    Double_t widthTrack = 0.1/(0.5+gRandom->Exp(0.5));
    Double_t y     = 0;
    y= gRandom->Gaus(0.0,widthTrack);
    Bool_t isRandom=gRandom->Rndm()<probRND;
    //if (gRandom->Rndm()<probRND) y= -2+4*gRandom->Rndm();  
    //
    Double_t sigmaTrack= TMath::Sqrt(sigmaCluster*sigmaCluster/nclusters+widthTrack*widthTrack);
    for (Int_t icl=0; icl<nclusters; icl++){
      his2D->Fill(x,y+gRandom->Gaus(0,sigmaCluster));
      his2DW->Fill(x,y+gRandom->Gaus(0,sigmaCluster),1/sigmaTrack);
    }
  }
  {
    his2D->Draw("colz");
    his2DW->Draw("colz");
    his2D->FitSlicesY();
    his2DW->FitSlicesY();    
    his2D_1->Draw();
    his2DW_1->Draw("same");
  }
  TMath::RMS(50, &(his2D_1->GetArray()[1]));

  TH1D * phis1D = his2D->ProjectionY("aaa",5,5);
  Int_t nbinsY= phis1D->GetXaxis()->GetNbins();
  TVectorD vector(nbinsY, &(phis1D->GetArray()[1]));

  TStatToolkit::MakeStat1D((TH2*)his2D, 1,0.8,0,25,1)->Draw("alp");
  TStatToolkit::MakeStat1D((TH2*)his2D, 1,0.8,2,20,2)->Draw("lp");
  TStatToolkit::MakeStat1D((TH2*)his2D, 1,0.8,4,21,4)->Draw("lp");

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