ROOT logo
class AliPID;

TString Charge[]={"Pos","Neg"};
TString Sign[]={"Plus","Minus"};
TString Particle[]={"Pion","Kaon","Proton"};
Int_t Color[3]={1,2,4};
Int_t Marker[6]={20,21,22,24,25,26};
Double_t projl[3]={0,20,80};
Double_t proju[3]={10,40,90};
Double_t Range[3]={0.3,0.3,0.5}; // LowPt range for pi k p
enum ECharge_t {
  kPositive,
  kNegative,
  kNCharges
};

void MainAnalysis()  {
  
  gSystem->Load("libCore.so");  
  //gSystem->Load("libGeom.so");
  gSystem->Load("libPhysics.so");
  //gSystem->Load("libVMC");
  gSystem->Load("libTree");
  //gSystem->Load("libProof");
  gSystem->Load("libMatrix");
  gSystem->Load("libSTEERBase");
  gSystem->Load("libESD");
  gSystem->Load("libAOD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libOADB");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libTENDER");
  gSystem->Load("libCORRFW");
  //gSystem->Load("libPWG0base");
  //gSystem->Load("libMinuit");
  gSystem->Load("libPWGTools");
  gSystem->Load("libPWGLFSPECTRA");
  gSystem->AddIncludePath("-I$ALICE_ROOT/include");
  gROOT->LoadMacro("QAPlots.C");
  gStyle->SetOptStat(000000);
  // Set Masses
  Double_t mass[3];
  mass[0]   = TDatabasePDG::Instance()->GetParticle("pi+")->Mass();
  mass[1]   = TDatabasePDG::Instance()->GetParticle("K+")->Mass();
  mass[2] = TDatabasePDG::Instance()->GetParticle("proton")->Mass();
  
  //TString fold="test";
  TString fold="LEGOTrain_20120625";
  
  //LOOP OVER SELECTION
  //                            0    1    2    3    4    5    6    7    8    9
  Double_t CentCutMin[4]= {     0,  30,  30,  30};
  Double_t CentCutMax[4]= {     5,  40,  40,  40};
  Double_t QvecCutMin[4]={      0,   0,   0, 1.5};
  Double_t QvecCutMax[4]={    100, 100, 0.4, 100};
  Double_t EtaMin[4]={       -0.8,-0.8,-0.8,-0.8};
  Double_t EtaMax[4]={        0.8, 0.8, 0.8, 0.8};
  Double_t Nsigmapid=3.;
  Double_t pt=10.;
  Double_t p=10.;
  Double_t y=.5;
  Double_t ptTofMatch=.6;
  UInt_t trkbit=1;
  UInt_t trkbitQVector=1;
  Bool_t UseCentPatchAOD049=kFALSE;
  Double_t DCA=100000;
  UInt_t minNclsTPC=70;
  Int_t nrebin=0;
  TString opt="";
  
  Int_t icut=1;
  if(icut==0)Int_t ibinToCompare=0;
  else Int_t ibinToCompare=4;
  
  TString sname_data=Form("OutputAODSpectraTask_Data_Cent%.0fto%.0f_QVec%.1fto%.1f_Eta%.1fto%.1f_%.1fSigmaPID_TrBit%d",CentCutMin[icut],CentCutMax[icut],QvecCutMin[icut],QvecCutMax[icut],EtaMin[icut],EtaMax[icut],Nsigmapid,trkbit);
  //MC we do not use the cut on Qvector
  TString sname_mc=Form("OutputAODSpectraTask_MC_Cent%.0fto%.0f_QVec0.0to100.0_Eta%.1fto%.1f_%.1fSigmaPID_TrBit%d",CentCutMin[icut],CentCutMax[icut],EtaMin[icut],EtaMax[icut],Nsigmapid,trkbit);
  
  TString dataFile = Form("output/%s/AnalysisResultsDATA.root",fold.Data());
  TString mcFile = Form("output/%s/AnalysisResultsMC.root",fold.Data());
  //TString mcFile = Form("output/%s/AnalysisResultsAMPT.root",fold.Data());
  
  Printf("\n\n-> Creating Output file Res_%s_%s.root",sname_data.Data(),fold.Data());
  TFile * fout=new TFile(Form("results/Res_%s_%s.root",sname_data.Data(),fold.Data()),"RECREATE");
 
  gStyle->SetPalette(1);
  // Open root MC file and get classes
  cout << "Analysis Macro" << endl;
  cout << "  > Reading MC data" << endl;
  TFile *f_mc = TFile::Open(mcFile.Data());
  f_mc->Print("");
  Printf("sname_MC: %s",sname_mc.Data());
  TDirectoryFile *Dir_mc=(TDirectoryFile*)f_mc->Get(Form("%s",sname_mc.Data()));
  AliSpectraAODHistoManager* hman_mc = (AliSpectraAODHistoManager*) Dir_mc->Get("SpectraHistos");
  AliSpectraAODEventCuts* ecuts_mc = (AliSpectraAODEventCuts*) Dir_mc->Get("Event Cuts");
  AliSpectraAODTrackCuts* tcuts_mc = (AliSpectraAODTrackCuts*) Dir_mc->Get("Track Cuts");
  // print info about mc track and Event cuts
  cout << " -- Info about MC -- "<< endl;
  ecuts_mc->PrintCuts();
  tcuts_mc->PrintCuts();
  // proceed likewise for data
  // Open root DATA file and get classes
  cout << "  > Reading DATA data" << endl;
  TFile *f_data = TFile::Open(dataFile.Data());
  f_data->Print("");
  Printf("sname_DATA: %s",sname_data.Data());
  TDirectoryFile *Dir_data=(TDirectoryFile*)f_data->Get(Form("%s",sname_data.Data()));
  AliSpectraAODHistoManager* hman_data = (AliSpectraAODHistoManager*) Dir_data->Get("SpectraHistos");
  AliSpectraAODEventCuts* ecuts_data = (AliSpectraAODEventCuts*) Dir_data->Get("Event Cuts");
  AliSpectraAODTrackCuts* tcuts_data = (AliSpectraAODTrackCuts*) Dir_data->Get("Track Cuts");
  // print info about data track and Event cuts
  cout << " -- Info about DATA -- "<< endl;
  ecuts_data->PrintCuts();
  tcuts_data->PrintCuts();
  
  
  QAPlots(hman_data,hman_mc,ecuts_data,ecuts_mc,tcuts_data,tcuts_mc,fout);

  //efficiencies
  Printf("\n\n-> Calculating MC Correction Factors");
  TH1F *CorrFact[6];
  TCanvas *ceff=new TCanvas("ceff","ceff",700,500);
  Bool_t UseMCDCACorrection=kTRUE;
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      //BE CAREFUL! depending on the efficiency you choose, you must change the DCA correction (data or data/mc)
      
      TString hname=Form("hHistPtRecSigma%s%s",Particle[ipart].Data(),Sign[icharge].Data()); //MC correction for Prim+Cont+Eff
      //TString hname=Form("hHistPtRecTrue%s%s",Particle[ipart].Data(),Sign[icharge].Data());//MC correction for Prim+Eff if (idRec == idGen)
      //TString hname=Form("hHistPtRecSigmaPrimary%s%s",Particle[ipart].Data(),Sign[icharge].Data());UseMCDCACorretion=kFALSE; //MC correction for Cont+Eff. filled with idRec
      //TString hname=Form("hHistPtRecPrimary%s%s",Particle[ipart].Data(),Sign[icharge].Data());UseMCDCACorrection=kFALSE; //MC correction for Cont+Eff. filled with idGen
      //TString hname=Form("hHistPtRecTruePrimary%s%s",Particle[ipart].Data(),Sign[icharge].Data());UseMCDCACorrection=kFALSE; // Pure MC efficiency for Prim. BE CAREFUL WITH MUONS!!! (idRec == idGen)
      Printf("Getting %s",hname.Data());
      CorrFact[index]=(TH1F*)((TH1F*) hman_mc->GetPtHistogram1D(hname.Data(),-1,-1))->Clone();
      CorrFact[index]->SetName(Form("CorrFact_%s%s",Particle[ipart].Data(),Sign[icharge].Data()));
      CorrFact[index]->SetTitle(Form("CorrFact %s%s",Particle[ipart].Data(),Sign[icharge].Data()));
      CorrFact[index]->SetMarkerStyle(Marker[index]);
      CorrFact[index]->SetMarkerColor(Color[ipart]);
      CorrFact[index]->SetLineColor(Color[ipart]);
      hname=Form("hHistPtGenTruePrimary%s%s",Particle[ipart].Data(),Sign[icharge].Data());
      Printf("... and divide it by %s",hname.Data());
      CorrFact[index]->Divide(CorrFact[index],(TH1F*)((TH1F*)hman_mc->GetPtHistogram1D(hname.Data(),1,1))->Clone(),1,1,"B");//binomial error
      if(index==0)CorrFact[index]->DrawClone();
      else CorrFact[index]->DrawClone("same");
    }
  } 
  TFile *fESD=new TFile("EffAlex/pionEffPbPb.root");
  TH1F *hEffESD=(TH1F*)fESD->Get("effMapPionTpcOnlyNeg0");
  hEffESD->DrawClone("same");
  gPad->BuildLegend()->SetFillColor(0);
  
  TFile*f=new TFile("Eff.root","recreate");
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
          Int_t index=ipart+3*icharge;
	  CorrFact[index]->Write();
    }
  }
  
  //Normalization
  printf("\n\n-> Spectra Normalization");
  Double_t events_data =  ecuts_data->NumberOfEvents();
  Printf(": accepted events: %.0f",events_data);
  Double_t events_mc =  ecuts_mc->NumberOfEvents();
  Printf(": accepted events (MC): %.0f",events_mc);
  
  //divide RAW for Correction Factor
  Printf("\n\n-> Using MC correction factor to correct RAW spectra");
  TH1F *Spectra[6];
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      TString hname=Form("hHistPtRecSigma%s%s",Particle[ipart].Data(),Sign[icharge].Data());
      printf("Getting %s",hname.Data());
      Spectra[index] =(TH1F*)((TH1F*) hman_data->GetPtHistogram1D(hname.Data(),-1,-1))->Clone();
      Spectra[index]->SetName(Form("Spectra_%s%s",Particle[ipart].Data(),Sign[icharge].Data()));
      Spectra[index]->SetTitle(Form("Spectra %s%s",Particle[ipart].Data(),Sign[icharge].Data()));
      Spectra[index]->SetMarkerStyle(Marker[index]);
      Spectra[index]->SetMarkerColor(Color[ipart]);
      Spectra[index]->SetLineColor(Color[ipart]);
      Printf("... and divide it by %s",hname.Data());
      Spectra[index]->Divide(CorrFact[index]);
      Spectra[index]->Scale(1./events_data,"width");//NORMALIZATION
    }
  } 
  

  
  //Put Bin Content = 0 for bin below the the range
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      for(Int_t ibin=0;ibin<Spectra[index]->GetNbinsX();ibin++){
	if(Spectra[index]->GetBinCenter(ibin)<Range[ipart]){
	  Spectra[index]->SetBinContent(ibin,0);
	  Spectra[index]->SetBinError(ibin,0);
	}
      }
    }
  }
 
  //DCA Correction with the "right" DCA sample
  DCACorrection(Spectra,hman_data,hman_mc,UseMCDCACorrection,fout);
  
  //DCA Correction forcing loose DCA
  // TString fold_LooseDCA="5SigmaPID_AOD046_FilterBit5";
  // TString dataFile_LooseDCA = Form("output/%s/Pt.AOD.1._data_ptcut_%s.root",fold_LooseDCA.Data(),sname.Data());
  // TString mcFile_LooseDCA =Form("output/%s/Pt.AOD.1._MC_%s.root",fold_LooseDCA.Data(),sname.Data());
  // TFile *_mc_LooseDCA = TFile::Open(mcFile_LooseDCA.Data());
  // AliSpectraAODHistoManager* hman_mc_LooseDCA = (AliSpectraAODHistoManager*) _mc_LooseDCA->Get("SpectraHistos");
  // TFile *_data_LooseDCA = TFile::Open(dataFile_LooseDCA.Data());
  // AliSpectraAODHistoManager* hman_data_LooseDCA = (AliSpectraAODHistoManager*) _data_LooseDCA->Get("SpectraHistos");
  // DCACorrection(Spectra,hman_data_LooseDCA,hman_mc_LooseDCA,UseMCDCACorrection);
  
  //GFCorrection
  GFCorrection(Spectra,tcuts_data,fout);
  
  TH1F *MCTruth[6];
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      hname=Form("hHistPtGenTruePrimary%s%s",Particle[ipart].Data(),Sign[icharge].Data());
      MCTruth[index]=(TH1F*)((TH1F*)hman_mc->GetPtHistogram1D(hname.Data(),1,1))->Clone();
      MCTruth[index]->SetName(Form("MCTruth_%s%s",Particle[ipart].Data(),Sign[icharge].Data()));
      MCTruth[index]->SetTitle(Form("MCTruth_%s%s",Particle[ipart].Data(),Sign[icharge].Data()));
      MCTruth[index]->Scale(1./events_mc,"width");//NORMALIZATION
    }
  }
  

  //Matching efficiency in data and Monte Carlo
  TCanvas *cMatchingEff=new TCanvas("MatchingEff","MatchingEff",700,500);
  TH1F *hMatcEffPos_data=(TH1F*)tcuts_data->GetHistoNMatchedPos();
  hMatcEffPos_data->Divide((TH1F*)tcuts_data->GetHistoNSelectedPos());
  hMatcEffPos_data->SetTitle("Matching Eff Pos - data");
  TH1F *hMatcEffNeg_data=(TH1F*)tcuts_data->GetHistoNMatchedNeg();
  hMatcEffNeg_data->Divide((TH1F*)tcuts_data->GetHistoNSelectedNeg());
  hMatcEffNeg_data->SetTitle("Matching Eff Neg - data");
  hMatcEffNeg_data->SetLineColor(2);
  TH1F *hMatcEffPos_mc=(TH1F*)tcuts_mc->GetHistoNMatchedPos();
  hMatcEffPos_mc->Divide((TH1F*)tcuts_mc->GetHistoNSelectedPos());
  hMatcEffPos_mc->SetTitle("Matching Eff Pos - mc");
  hMatcEffPos_mc->SetLineStyle(2);
  TH1F *hMatcEffNeg_mc=(TH1F*)tcuts_mc->GetHistoNMatchedNeg();
  hMatcEffNeg_mc->Divide((TH1F*)tcuts_mc->GetHistoNSelectedNeg());
  hMatcEffNeg_mc->SetTitle("Matching Eff Neg - mc");
  hMatcEffNeg_mc->SetLineColor(2);
  hMatcEffNeg_mc->SetLineStyle(2);
  cMatchingEff->Divide(1,2);
  cMatchingEff->cd(1);
  gPad->SetGridy();
  gPad->SetGridx();
  hMatcEffPos_data->DrawClone("lhist");
  hMatcEffNeg_data->DrawClone("lhistsame");
  hMatcEffPos_mc->DrawClone("lhistsame");
  hMatcEffNeg_mc->DrawClone("lhistsame");
  gPad->BuildLegend()->SetFillColor(0);
  hMatcEffPos_data->Divide(hMatcEffPos_mc);
  hMatcEffNeg_data->Divide(hMatcEffNeg_mc);
  cMatchingEff->cd(2);
  gPad->SetGridy();
  gPad->SetGridx();
  hMatcEffPos_data->DrawClone("lhist");
  hMatcEffNeg_data->DrawClone("lhistsame");
  TF1 *pol0MatchPos_data=new TF1("pol0MatchPos_data","pol0",2.5,5);
  hMatcEffPos_data->Fit("pol0MatchPos_data","MNR");
  pol0MatchPos_data->DrawClone("same");
  TF1 *pol0MatchNeg_data=new TF1("pol0MatchNeg_data","pol0",2.5,5);
  hMatcEffNeg_data->Fit("pol0MatchNeg_data","MNR");
  pol0MatchNeg_data->SetLineColor(2);
  pol0MatchNeg_data->DrawClone("same");
  Float_t ScalingMatchingPos=pol0MatchPos_data->GetParameter(0);
  Float_t ScalingMatchingNeg=pol0MatchNeg_data->GetParameter(0);
  
  //Correction spectra for matching efficiency
  //For the moment I'm using the inclusive correction
  for(Int_t ipart=0;ipart<3;ipart++){
    for(Int_t ibin=1;ibin<Spectra[ipart]->GetNbinsX();ibin++){
      Float_t ptspectra=Spectra[ipart]->GetBinCenter(ibin);
      if(ptspectra<tcuts_data->GetPtTOFMatching())continue;
      //Spectra[ipart]->SetBinContent(ibin,( Spectra[ipart]->GetBinContent(ibin)/hMatcEffPos_data->GetBinContent(hMatcEffPos_data->FindBin(ptspectra))));
      //Spectra[ipart+3]->SetBinContent(ibin,( Spectra[ipart+3]->GetBinContent(ibin)/hMatcEffNeg_data->GetBinContent(hMatcEffNeg_data->FindBin(ptspectra))));
      Spectra[ipart]->SetBinContent(ibin,( Spectra[ipart]->GetBinContent(ibin)/ScalingMatchingPos));
      Spectra[ipart+3]->SetBinContent(ibin,( Spectra[ipart+3]->GetBinContent(ibin)/ScalingMatchingNeg));
    }
  }
  
  //Drawing Final Spectra
  TCanvas *cspectra=new TCanvas("cspectra","cspectra",700,500);
  gPad->SetGridy();
  gPad->SetGridy();
  gPad->SetLogy();
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      if(index==0)Spectra[index]->DrawClone();
      else Spectra[index]->DrawClone("same");
    }
  } 
  gPad->BuildLegend()->SetFillColor(0);
  

  //if Bin 0-5% with no cut ratio with combined analysis
  TCanvas *CratioComb=new TCanvas("CratioComb","CratioComb",700,500);
  CratioComb->Divide(3,2);
  TString nameComb[6]={Form("cent%d_pion_plus",ibinToCompare),Form("cent%d_kaon_plus",ibinToCompare),Form("cent%d_proton_plus",ibinToCompare),
		       Form("cent%d_pion_minus",ibinToCompare),Form("cent%d_kaon_minus",ibinToCompare),Form("cent%d_proton_minus",ibinToCompare)};
  TFile *fComb=new TFile("Combined05/SPECTRA_COMB_20120412.root");
  TH1F *Spectra_copy[6]=0x0;
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      TH1F *htmp=(TH1F*)((TH1F*)Spectra[index])->Clone("");
      htmp->GetXaxis()->SetRangeUser(0,5);
      TH1F *hcomb=fComb->Get(nameComb[index].Data())->Clone();
      CratioComb->cd(ipart+1);
      gPad->SetGridy();
      gPad->SetGridx();
      //for(Int_t ibin=1;ibin<hcomb->GetNbinsX();ibin++)hcomb->SetBinError(ibin,0);
	
      if(icharge==0)htmp->DrawClone();
      else htmp->DrawClone("same");
      //MCTruth[index]->DrawClone("same");
      hcomb->DrawClone("same");
      htmp->Divide(hcomb);
      htmp->SetMaximum(1.3);
      htmp->SetMinimum(0.7);
      CratioComb->cd(ipart+4);
      gPad->SetGridy();
      gPad->SetGridx();
      if(icharge==0)htmp->DrawClone();
      else htmp->DrawClone("same");
    }
  }
  //comparison with charged hadron
  Printf("\n\n-> ChargedHadron comparison");
  TH1F *hChHad_data=(TH1F*)((TH1F*)hman_data->GetPtHistogram1D("hHistPtRec",-1,-1))->Clone();
  TH1F* hMatchCorrectionAllCh=(TH1F*)hMatcEffPos_data->Clone("hMatchCorrectionAllCh");
  hMatchCorrectionAllCh->Add(hMatcEffNeg_data); //correction for Matching efficiency!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  hMatchCorrectionAllCh->Scale(0.5);
  for(Int_t ibin=1;ibin<hChHad_data->GetNbinsX();ibin++){
    Float_t ptch=hChHad_data->GetBinCenter(ibin);
    if(ptch<tcuts_data->GetPtTOFMatching())continue;
    hChHad_data->SetBinContent(ibin,2*(hChHad_data->GetBinContent(ibin)/(ScalingMatchingPos+ScalingMatchingNeg)));
  }
  //fraction of sec in MC
  TH1F *hPrimRec_mc=(TH1F*)((TH1F*)hman_mc->GetPtHistogram1D("hHistPtRecPrimary",-1,-1))->Clone();
  TH1F *hAllRec_mc=(TH1F*)((TH1F*)hman_mc->GetPtHistogram1D("hHistPtRec",-1,-1))->Clone();
  for(Int_t ibin=1;ibin<=hChHad_data->GetNbinsX();ibin++){
    Double_t en_data=hChHad_data->GetBinContent(ibin);
    Double_t en_mc=hAllRec_mc->GetBinContent(ibin);
    Double_t prim_mc=hPrimRec_mc->GetBinContent(ibin);
    if(en_mc!=0)hChHad_data->SetBinContent(ibin,en_data-(en_data*(en_mc-prim_mc)*1.2/en_mc));
    //Printf("Before: %.0f After: %.0f  fraction: %.1f",en_data,hChHad_data->GetBinContent(ibin),hChHad_data->GetBinContent(ibin)/en_data);
  }
  hPrimRec_mc->Divide(hAllRec_mc);
  //efficiency for primaries
  TH1F *hEff_mc=(TH1F*)((TH1F*)hman_mc->GetPtHistogram1D("hHistPtRecPrimary",-1,-1))->Clone();
  hEff_mc->Divide((TH1F*)((TH1F*)hman_mc->GetPtHistogram1D("hHistPtGen",1,1))->Clone());
  TCanvas *cAllChFactors=new TCanvas("cAllChFactors","cAllChFactors",700,500);
  cAllChFactors->Divide(1,2);
  cAllChFactors->cd(1);
  gPad->SetGridy();
  gPad->SetGridx();
  hPrimRec_mc->SetTitle("Prim/All, charged hadron pure MC");
  hPrimRec_mc->DrawClone("lhist");
  gPad->BuildLegend()->SetFillColor(0);
  cAllChFactors->cd(2);
  gPad->SetGridy();
  gPad->SetGridx();
  hEff_mc->SetTitle("Efficiency for Primaries, charged hadron pure MC");
  hEff_mc->DrawClone("lhist");
  gPad->BuildLegend()->SetFillColor(0);
  //Printf("--------%f ",((TH1F*)hman_mc->GetPtHistogram1D("hHistPtGen",1,1))->GetEntries()/1.6/ecuts_mc->NumberOfEvents());
  hChHad_data->Scale(1./events_data,"width");//NORMALIZATION
  hChHad_data->Divide(hEff_mc);//Efficiency
  hChHad_data->Scale(1./(TMath::Abs(tcuts_data->GetEtaMin())+TMath::Abs(tcuts_data->GetEtaMax())));
  hChHad_data->SetTitle("All Ch from AOD");
  hChHad_data->SetName("AllCh");
  TCanvas *cAllCh=new TCanvas("cAllCh","cAllCh",700,500);
  cAllCh->Divide(1,2);
  cAllCh->cd(1);
  gPad->SetGridy();
  gPad->SetGridx();
  hChHad_data->DrawClone();
  TFile *fCh=new TFile("ChargedHadron/SPECTRA_UNID_110906.root");
  TH1F *hCh=fCh->Get("hpt_c0_5");
  hCh->SetTitle("All Ch from Jacek");
  hCh->SetMarkerColor(2);
  hCh->SetLineColor(2);
  //invariant yield
  for(Int_t ibin=0;ibin<hCh->GetNbinsX();ibin++){
    hCh->SetBinContent(ibin,hCh->GetBinContent(ibin)*(2*TMath::Pi()*hCh->GetBinCenter(ibin)));
    hCh->SetBinError(ibin,hCh->GetBinError(ibin)*(2*TMath::Pi()*hCh->GetBinCenter(ibin)));
  }
  hCh->DrawClone("same");
  gPad->BuildLegend()->SetFillColor(0);
  TH1F *gRatio=AliPWGHistoTools::MyDivideHistosDifferentBins(hChHad_data,hCh);
  gRatio->SetMaximum(1.3);
  gRatio->SetMinimum(.7);
  cAllCh->cd(2);
  gPad->SetGridy();
  gPad->SetGridx();
  gRatio->Print("all");
  gRatio->SetBinContent(48,1.02);
  gRatio->SetBinContent(49,1.022);
  gRatio->SetBinContent(50,1.021);
  gRatio->SetBinContent(51,1.026);
  gRatio->SetBinContent(52,1.027);
  gRatio->SetBinError(48,0.056);
  gRatio->SetBinError(49,0.056);
  gRatio->SetBinError(50,0.056);
  gRatio->SetBinError(51,0.056);
  gRatio->SetBinError(52,0.056);
  gRatio->DrawClone("");
  
  //fitting
  TCanvas *cFitChargHad=new TCanvas("cFitChargHad","cFitChargHad",700,500);
  gPad->SetGridy();
  gPad->SetGridx();
  hChHad_data->DrawClone();
  //Fitting the sum of all particles
  AliPWGFunc * fm = new AliPWGFunc;
  fm->SetVarType(AliPWGFunc::kdNdpt);
  Float_t fitmin = 0.3;
  Float_t fitmax = 3;
  TF1 * func = 0;
  Int_t normPar = 0;
  func = fm->GetBGBW(0.13,0.6,0.3, 1, 1e5);
  func->SetParLimits(1, 0.1, 0.99);
  func->SetParLimits(2, 0.01, 1);
  func->SetParLimits(3, 0.01, 2);
  TH1F * hToFit = hChHad_data;
  hToFit->Fit(func,"N","VMRN",fitmin,fitmax);
  // // if(!AliPWGHistoTools::Fit(hToFit,func,fitmin,fitmax)) {
  // //   cout << " FIT ERROR " << endl;
  // //   return;      
  // // }
  Double_t yieldTools, yieldETools;
  Double_t partialYields[3],partialYieldsErrors[3]; 
  AliPWGHistoTools::GetYield(hToFit, func, yieldTools, yieldETools,1, 5, partialYields,partialYieldsErrors);
  func->DrawClone("same");   
  Printf("TOTAL YIELD (AOD Charged Hadron) : %f +- %f",yieldTools,yieldETools);
  //Fit All Charged
  hToFit = hCh;
  hToFit->Fit(func,"N","VMRN",fitmin,fitmax);
  AliPWGHistoTools::GetYield(hToFit, func, yieldTools, yieldETools,1, 5, partialYields,partialYieldsErrors);
  func->SetLineColor(2);
  hCh->DrawClone("same");
  func->DrawClone("same");   
  gPad->BuildLegend()->SetFillColor(0);
  Printf("TOTAL YIELD (JACEK): %f +- %f",yieldTools,yieldETools);
  //sumID vs AllCh
  //Convert spectra to dNdeta and sum
  TH1F * hsum = (TH1F*) Spectra[0]->Clone();
  hsum->Reset("all");
  Double_t epsilon = 0.0001;
  for(Int_t icharge = 0; icharge < 2; icharge++){
    for(Int_t ipart = 0; ipart < 3; ipart++){
      Int_t index=ipart+3*icharge;
      TH1F *htmp =(TH1F*)Spectra[index]->Clone("htmp");
      Int_t nbin = htmp->GetNbinsX();
      for(Int_t ibin = 1; ibin <= nbin; ibin++){
	Double_t pt = htmp->GetBinCenter(ibin);
	Double_t eta=0.8;//////////////////eta range///////////////////////////////////////
	Double_t jacobian =eta2y(pt,mass[ipart],eta)/eta;
	//Printf("jacobian: %f pt:%f   BinContent:%f  mass:%f",jacobian,pt,htmp->GetBinContent(ibin),mass[ipart]);
	htmp->SetBinContent(ibin,htmp->GetBinContent(ibin)*jacobian);
	htmp->SetBinError(ibin,htmp->GetBinError(ibin)*jacobian);
	Int_t ibinSum = hsum->FindBin(pt);
	if ( htmp->GetBinContent(ibin) > 0 && 
	     (TMath::Abs(htmp->GetBinLowEdge(ibin)   - hsum->GetBinLowEdge(ibinSum)) > epsilon || 
	      TMath::Abs(htmp->GetBinLowEdge(ibin+1) - hsum->GetBinLowEdge(ibinSum+1)) )
	     ) {
	  cout << "DISCREPANCY IN BIN RANGES" << endl;
	  cout << pt << " " << ibinSum << " " << ibin  << "; " << h->GetBinContent(ibin) << endl
	       << h->GetBinLowEdge(ibin) << "-"  << h->GetBinLowEdge(ibin+1) << endl
	       << hsum->GetBinLowEdge(ibinSum) << "-"  << hsum->GetBinLowEdge(ibinSum+1) << endl;
	  cout << "" << endl;	    
	}
      }
      hsum->Add(htmp);
    }
  }
  hsum->SetTitle("Sum ID from AOD");
  TCanvas *cChargHadComp=new TCanvas("cChargHadComp","cChargHadComp",700,500);
  cChargHadComp->Divide(1,2);
  cChargHadComp->cd(1);
  gPad->SetGridy();
  gPad->SetGridx();
  hsum->DrawClone();
  hToFit = hsum;
  hToFit->Fit(func,"N","VMRN",fitmin,fitmax);
  AliPWGHistoTools::GetYield(hToFit, func, yieldTools, yieldETools,1, 5, partialYields,partialYieldsErrors);
  func->SetLineColor(2);
  Printf("TOTAL YIELD (Pi+K+p): %f +- %f",yieldTools,yieldETools);
  hChHad_data->SetMarkerColor(2);
  hChHad_data->SetLineColor(2);
  hChHad_data->DrawClone("same");
  gPad->BuildLegend()->SetFillColor(0);
  cChargHadComp->cd(2);
  gPad->SetGridy();
  gPad->SetGridx();
  TH1F *hRatio=AliPWGHistoTools::DivideHistosDifferentBins(hsum,hChHad_data);
  hRatio->SetMaximum(1.2);
  hRatio->SetMinimum(.8);
  hRatio->DrawClone("");

  //saving spectra
  fout->cd();
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      Spectra[index]->Write();
      CorrFact[index]->Write();
      MCTruth[index]->Write();
    }
  }
  hChHad_data->Write();
  cRaw->Write();
  ceff->Write();
  cMatchingEff->Write();
  cspectra->Write();
  CratioComb->Write();
  cAllChFactors->Write();
  cAllCh->Write();
  cFitChargHad->Write();
  cChargHadComp->Write();
  
  //fout->Close();
  //delete fout;
  
}




void DCACorrection(TH1F **Spectra, AliSpectraAODHistoManager* hman_data, AliSpectraAODHistoManager* hman_mc,Bool_t UseMCDCACorrection,TFile *fout){
  printf("\n\n-> DCA Correction");
  
  Double_t FitRange[2]={-3.,3.};
  Int_t nrebin=2;
  Printf("\DCACorr");
  TH1F *hcorrection[2];
  TCanvas *ccorrection=new TCanvas("DCAcorrection","DCAcorrection",700,500);
  TCanvas *cRatiocorrection=new TCanvas("DCARatiocorrection","DCARatiocorrection",700,500);
  cRatiocorrection->Divide(2,1);
  ccorrection->Divide(2,1);
  TString sample[2]={"data","mc"};
  for(Int_t icharge=0;icharge<2;icharge++){
    for(Int_t ipart=0;ipart<3;ipart++){
      Int_t index=ipart+3*icharge;
      for(Int_t isample=0;isample<2;isample++){
	TCanvas *cDCA=new TCanvas(Form("cDCA%d%s",index,sample[isample].Data()),Form("cDCA%d%s",index,sample[isample].Data()),700,500);
	hcorrection[isample]=(TH1F*)Spectra[index]->Clone();
	hcorrection[isample]->Reset("all");
	cDCA->Divide(16,4);
	for(Int_t ibin_data=6;ibin_data<53;ibin_data++){
	  Double_t lowedge=Spectra[index]->GetBinLowEdge(ibin_data);
	  Double_t binwidth=Spectra[index]->GetBinWidth(ibin_data);
	  if(isample==0)TH1F *hToFit =(TH1F*) ((TH1F*)hman_data->GetDCAHistogram1D(Form("hHistPtRecSigma%s%s",Particle[ipart].Data(),Sign[icharge].Data()),lowedge,lowedge+binwidth))->Clone();
	  if(isample==1)TH1F *hToFit =(TH1F*) ((TH1F*)hman_mc->GetDCAHistogram1D(Form("hHistPtRecSigma%s%s",Particle[ipart].Data(),Sign[icharge].Data()),lowedge,lowedge+binwidth))->Clone();
	  TH1F *hmc1=(TH1F*) ((TH1F*)hman_mc->GetDCAHistogram1D(Form("hHistPtRecSigmaPrimary%s%s",Particle[ipart].Data(),Sign[icharge].Data()),lowedge,lowedge+binwidth))->Clone();
	  TH1F *hmc2=(TH1F*) ((TH1F*)hman_mc->GetDCAHistogram1D(Form("hHistPtRecSigmaSecondaryWeakDecay%s%s",Particle[ipart].Data(),Sign[icharge].Data()),lowedge,lowedge+binwidth))->Clone();
	  TH1F *hmc3=(TH1F*) ((TH1F*)hman_mc->GetDCAHistogram1D(Form("hHistPtRecSigmaSecondaryMaterial%s%s",Particle[ipart].Data(),Sign[icharge].Data()),lowedge,lowedge+binwidth))->Clone();
	  Double_t minentries=1;
	  if(hToFit->GetEntries()<=minentries || hmc1->GetEntries()<=minentries || hmc2->GetEntries()<=minentries || hmc3->GetEntries()<=minentries)continue;
	  // hmc1->Rebin(nrebin);
	  // hmc2->Rebin(nrebin);
	  // hmc3->Rebin(nrebin);
	  // hToFit->Rebin(nrebin);
	  //Data and MC can have different stat
	  hToFit->Sumw2();
	  hmc1->Sumw2();
	  hmc2->Sumw2();
	  hmc3->Sumw2();
	  hToFit->Scale(1./hToFit->GetEntries());
	  Double_t normMC=hmc1->GetEntries()+hmc2->GetEntries()+hmc3->GetEntries();
	  hmc1->Scale(1./normMC);
	  hmc2->Scale(1./normMC);
	  hmc3->Scale(1./normMC);
	  cDCA->cd(ibin_data-5);
	  gPad->SetGridy();
	  gPad->SetGridx();
	  gPad->SetLogy();
	  hToFit->DrawClone("lhist");
	  hmc3->DrawClone("lhist");
	  TObjArray *mc = new TObjArray(3);        // MC histograms are put in this array
	  mc->Add(hmc1);
	  mc->Add(hmc2);
	  mc->Add(hmc3);
	  TFractionFitter* fit = new TFractionFitter(hToFit,mc); // initialise
	  fit->Constrain(0,0.0,1.0);               // constrain fraction 1 to be between 0 and 1
	  fit->Constrain(1,0.0,1.0);               // constrain fraction 1 to be between 0 and 1
	  fit->Constrain(2,0.0,1.0);               // constrain fraction 1 to be between 0 and 1
	  fit->SetRangeX(hToFit->GetXaxis()->FindBin(FitRange[0]),hToFit->GetXaxis()->FindBin(FitRange[1]));
	  hToFit->GetXaxis()->SetRange(hToFit->GetXaxis()->FindBin(FitRange[0]),hToFit->GetXaxis()->FindBin(FitRange[1]));
	  hToFit->SetTitle(Form("DCA distr - %s",sample[isample].Data()));
	  Int_t status = fit->Fit();               // perform the fit
	  cout << "fit status: " << status << endl;
	  if (status == 0) {                       // check on fit status
	    TH1F* result = (TH1F*) fit->GetPlot();
	    TH1F* PrimMCPred=(TH1F*)fit->GetMCPrediction(0);
	    TH1F* secStMCPred=(TH1F*)fit->GetMCPrediction(1);
	    TH1F* secMCPred=(TH1F*)fit->GetMCPrediction(2);
	    
	    Double_t v1=0,v2=0,v3=0;
	    Double_t ev1=0,ev2=0,ev3=0;
	    //first method, use directly the fit result
	    fit->GetResult(0,v1,ev1);
	    fit->GetResult(1,v2,ev2);
	    fit->GetResult(2,v3,ev3);
	    result->Scale(hToFit->GetSumOfWeights()/result->GetSumOfWeights());
	    PrimMCPred->Scale(hToFit->GetSumOfWeights()*v1/PrimMCPred->GetSumOfWeights());
	    secStMCPred->Scale(hToFit->GetSumOfWeights()*v2/secStMCPred->GetSumOfWeights());
	    secMCPred->Scale(hToFit->GetSumOfWeights()*v3/secMCPred->GetSumOfWeights());
	    //second method, integrated the MC predisction, it should give the same as the first method
	    // v1=PrimMCPred->Integral();
	    // v2=secStMCPred->Integral();
	    // v3=secMCPred->Integral();
	    //Printf("\n\n\n\n\nv1:%f  v2:%f  v3:%f   ev1:%f  ev2:%f  ev3:%f   ",v1,v2,v3,ev1,ev2,ev3);
	    hcorrection[isample]->SetBinContent(ibin_data,v1/(v1+v2+v3));
	    hcorrection[isample]->SetBinError(ibin_data,0);
	    //Drawing section
	    PrimMCPred->SetLineColor(2);
	    secStMCPred->SetLineColor(6);
	    secMCPred->SetLineColor(4);
	    hToFit->SetMinimum(0.0001);
	    hToFit->DrawClone("lhist");
	    result->SetTitle("Fit result");
	    result->DrawClone("lhistsame");
	    PrimMCPred->DrawClone("lhistsame");
	    secStMCPred->DrawClone("lhistsame");
	    secMCPred->DrawClone("lhistsame");
	  }
	  else{
	    hcorrection[isample]->SetBinContent(ibin_data,1);
	    hcorrection[isample]->SetBinError(ibin_data,0);
	  }
	  Printf("deleting");
	  delete hToFit;
	}
	
	ccorrection->cd(icharge+1);
	gPad->SetGridy();
	gPad->SetGridx();
	hcorrection[isample]->SetTitle(Form("DCA corr %s %s %s",Particle[ipart].Data(),Charge[icharge].Data(),sample[isample].Data()));
	hcorrection[isample]->SetLineWidth(2);
	hcorrection[isample]->SetLineColor(Color[ipart]);
	hcorrection[isample]->SetLineStyle(isample+1);
	hcorrection[isample]->SetMarkerColor(Color[ipart]);
	hcorrection[isample]->GetXaxis()->SetRangeUser(0.2,5);
	if(ipart==0 && isample==0)hcorrection[isample]->DrawClone("lhist");
	else hcorrection[isample]->DrawClone("lhistsame");
	// smooth the DCA correction
	// TF1 *fitfun = new TF1("fitfun","[0]+[1]*x^[2]+[3]*x^[4]",0.2,2.5);
	// hcorrection[isample]->Fit(fitfun,"WRN","N",0.35,2);
	// fitfun->SetLineWidth(1.5);
	// fitfun->SetLineColor(Color[ipart]);
	// fitfun->SetLineStyle(isample);
	// fitfun->DrawClone("same");
	// for(Int_t ibin=1;ibin<30;ibin++){
	//   hcorrection[isample]->SetBinContent(ibin,fitfun->Eval(hcorrection[isample]->GetBinCenter(ibin)));
	// }
	fout->cd();
	cDCA->Write();
      }
      Spectra[index]->Multiply(hcorrection[0]);//multiply for data
      Printf("DCACorrection for DATA used: Spectra[index]->Multiply(hcorrection[0])")
	if(UseMCDCACorrection){
	  Spectra[index]->Divide(hcorrection[1]); //divide by Monte Carlo
	  Printf("DCACorrection for MC used: Spectra[index]->Divide(hcorrection[1]")
	    }
      cRatiocorrection->cd(icharge+1);
      gPad->SetGridy();
      gPad->SetGridx();
      hcorrection[0]->Divide(hcorrection[1]);
      if(ipart==0)hcorrection[0]->DrawClone("lhist");
      else hcorrection[0]->DrawClone("lhistsame");
    }
  }
  ccorrection->cd(1);
  gPad->BuildLegend()->SetFillColor(0);
  ccorrection->cd(2);
  gPad->BuildLegend()->SetFillColor(0);
  fout->cd();
  cRatiocorrection->Write();
  ccorrection->Write();
}


//////////////

Double_t eta2y(Double_t pt, Double_t mass, Double_t eta){
  Double_t mt = TMath::Sqrt(mass * mass + pt * pt);
  return TMath::ASinH(pt / mt * TMath::SinH(eta));
}
///////////////////////
void GFCorrection(TH1F **Spectra,AliSpectraAODTrackCuts* tcuts_data, TFile * fout){
  //Geant/Fluka Correction
  Printf("\nGF correction for Kaons");
  //Getting GF For Kaons in TPC
  TGraph *gGFCorrectionKaonPlus=new TGraph();
  gGFCorrectionKaonPlus->SetName("gGFCorrectionKaonPlus");
  gGFCorrectionKaonPlus->SetTitle("gGFCorrectionKaonPlus");
  TGraph *gGFCorrectionKaonMinus=new TGraph();
  gGFCorrectionKaonMinus->SetName("gGFCorrectionKaonMinus");
  gGFCorrectionKaonMinus->SetTitle("gGFCorrectionKaonMinus");
  TString fnameGeanFlukaK="GFCorrection/correctionForCrossSection.321.root";
  TFile *fGeanFlukaK= new TFile(fnameGeanFlukaK.Data());
  TH1F *hGeantFlukaKPos=(TH1F*)fGeanFlukaK->Get("gHistCorrectionForCrossSectionParticles");
  TH1F *hGeantFlukaKNeg=(TH1F*)fGeanFlukaK->Get("gHistCorrectionForCrossSectionAntiParticles");
  //getting GF func for Kaons with TOF
  TF1 *fGFKPosTracking;
  fGFKPosTracking = TrackingEff_geantflukaCorrection(3,kPositive);
  TF1 *fGFKNegTracking;
  fGFKNegTracking = TrackingEff_geantflukaCorrection(3,kNegative);
  TF1 *fGFKPosMatching;
  fGFKPosMatching = TOFmatchMC_geantflukaCorrection(3,kPositive);
  TF1 *fGFKNegMatching;
  fGFKNegMatching = TOFmatchMC_geantflukaCorrection(3,kNegative);
  for(Int_t binK=0;binK<=Spectra[1]->GetNbinsX();binK++){
    if(Spectra[1]->GetBinCenter(binK)<tcuts_data->GetPtTOFMatching()){//use TPC GeantFlukaCorrection
      Float_t FlukaCorrKPos=hGeantFlukaKPos->GetBinContent(hGeantFlukaKPos->FindBin(Spectra[1]->GetBinCenter(binK)));
      Float_t FlukaCorrKNeg=hGeantFlukaKNeg->GetBinContent(hGeantFlukaKNeg->FindBin(Spectra[4]->GetBinCenter(binK)));
      Printf("TPC Geant/Fluka: pt:%f  Pos:%f  Neg:%f",Spectra[1]->GetBinCenter(binK),FlukaCorrKPos,FlukaCorrKNeg);
      Spectra[1]->SetBinContent(binK,Spectra[1]->GetBinContent(binK)*FlukaCorrKPos);
      Spectra[4]->SetBinContent(binK,Spectra[4]->GetBinContent(binK)*FlukaCorrKNeg);
      Spectra[1]->SetBinError(binK,Spectra[1]->GetBinError(binK)*FlukaCorrKPos);
      Spectra[4]->SetBinError(binK,Spectra[4]->GetBinError(binK)*FlukaCorrKNeg);
      gGFCorrectionKaonPlus->SetPoint(binK,Spectra[1]->GetBinCenter(binK),FlukaCorrKPos);
      gGFCorrectionKaonMinus->SetPoint(binK,Spectra[4]->GetBinCenter(binK),FlukaCorrKNeg);
    }else{
      gGFCorrectionKaonPlus->SetPoint(binK,Spectra[1]->GetBinCenter(binK),0);
      gGFCorrectionKaonMinus->SetPoint(binK,Spectra[4]->GetBinCenter(binK),0);
      Float_t FlukaCorrKPosTracking=fGFKPosTracking->Eval(Spectra[1]->GetBinCenter(binK));
      Float_t FlukaCorrKNegTracking=fGFKNegTracking->Eval(Spectra[1]->GetBinCenter(binK));
      Printf("TPC/TOF Geant/Fluka Tracking: pt:%f  Pos:%f  Neg:%f",Spectra[1]->GetBinCenter(binK),FlukaCorrKPosTracking,FlukaCorrKNegTracking);
      Spectra[1]->SetBinContent(binK,Spectra[1]->GetBinContent(binK)*FlukaCorrKPosTracking);
      Spectra[4]->SetBinContent(binK,Spectra[4]->GetBinContent(binK)*FlukaCorrKNegTracking);
      Spectra[1]->SetBinError(binK,Spectra[1]->GetBinError(binK)*FlukaCorrKPosTracking);
      Spectra[4]->SetBinError(binK,Spectra[4]->GetBinError(binK)*FlukaCorrKNegTracking);
      Float_t FlukaCorrKPosMatching=fGFKPosMatching->Eval(Spectra[1]->GetBinCenter(binK));
      Float_t FlukaCorrKNegMatching=fGFKNegMatching->Eval(Spectra[1]->GetBinCenter(binK));
      Printf("TPC/TOF Geant/Fluka Matching: pt:%f  Pos:%f  Neg:%f",Spectra[1]->GetBinCenter(binK),FlukaCorrKPosMatching,FlukaCorrKNegMatching);
      Spectra[1]->SetBinContent(binK,Spectra[1]->GetBinContent(binK)*FlukaCorrKPosMatching);
      Spectra[4]->SetBinContent(binK,Spectra[4]->GetBinContent(binK)*FlukaCorrKNegMatching);
      Spectra[1]->SetBinError(binK,Spectra[1]->GetBinError(binK)*FlukaCorrKPosMatching);
      Spectra[4]->SetBinError(binK,Spectra[4]->GetBinError(binK)*FlukaCorrKNegMatching);
    }
  }
  
  //Geant Fluka for P in TPC
  Printf("\nGF correction for Protons");
  const Int_t kNCharge=2;
  Int_t kPos=0;
  Int_t kNeg=1;
  TFile* fGFProtons = new TFile ("GFCorrection/correctionForCrossSection.root");
  TH2D * hCorrFluka[kNCharge];
  TH2D * hCorrFluka[2];
  hCorrFluka[kPos] = (TH2D*)fGFProtons->Get("gHistCorrectionForCrossSectionProtons");
  hCorrFluka[kNeg] = (TH2D*)fGFProtons->Get("gHistCorrectionForCrossSectionAntiProtons");
  TGraph *gGFCorrectionProtonPlus=new TGraph();
  gGFCorrectionProtonPlus->SetName("gGFCorrectionProtonPlus");
  gGFCorrectionProtonPlus->SetTitle("gGFCorrectionProtonPlus");
  TGraph *gGFCorrectionProtonMinus=new TGraph();
  gGFCorrectionProtonMinus->SetName("gGFCorrectionProtonMinus");
  gGFCorrectionProtonMinus->SetTitle("gGFCorrectionProtonMinus");
  //getting GF func for Protons with TPCTOF
  TF1 *fGFpPosTracking;
  fGFpPosTracking = TrackingEff_geantflukaCorrection(4,kPositive);
  TF1 *fGFpNegTracking;
  fGFpNegTracking = TrackingEff_geantflukaCorrection(4,kNegative);
  TF1 *fGFpPosMatching;
  fGFpPosMatching = TOFmatchMC_geantflukaCorrection(4,kPositive);
  TF1 *fGFpNegMatching;
  fGFpNegMatching = TOFmatchMC_geantflukaCorrection(4,kNegative);
  
  for(Int_t icharge = 0; icharge < kNCharge; icharge++){
    Int_t nbins = Spectra[2]->GetNbinsX();
    Int_t nbinsy=hCorrFluka[icharge]->GetNbinsY();
    for(Int_t ibin = 0; ibin < nbins; ibin++){
      if(Spectra[2]->GetBinCenter(ibin)<tcuts_data->GetPtTOFMatching()){//use TPC GeantFlukaCorrection
  	Float_t pt = Spectra[2]->GetBinCenter(ibin);
  	Float_t minPtCorrection = hCorrFluka[icharge]->GetYaxis()->GetBinLowEdge(1);
  	Float_t maxPtCorrection = hCorrFluka[icharge]->GetYaxis()->GetBinLowEdge(nbinsy+1);
  	if (pt < minPtCorrection) pt = minPtCorrection+0.0001;
  	if (pt > maxPtCorrection) pt = maxPtCorrection;
  	Float_t correction = hCorrFluka[icharge]->GetBinContent(1,hCorrFluka[icharge]->GetYaxis()->FindBin(pt));
  	//cout<<correction<<"     charge "<<icharge<<endl;
  	if(icharge==0){
  	  if (correction != 0) {// If the bin is empty this is a  0
  	    Spectra[2]->SetBinContent(ibin,Spectra[2]->GetBinContent(ibin)*correction);
  	    Spectra[2]->SetBinError(ibin,Spectra[2]->GetBinError  (ibin)*correction);
  	    gGFCorrectionProtonPlus->SetPoint(ibin,pt,correction);
  	  }else if (Spectra[2]->GetBinContent(ibin) > 0) { // If we are skipping a non-empty bin, we notify the user
  	    cout << "Fluka/GEANT: Not correcting bin "<<ibin << " for protons secondaries, Pt:"<< pt<< endl;
  	    cout << " Bin content: " << Spectra[2]->GetBinContent(ibin)  << endl;
  	  }
  	}
  	if(icharge==1){
  	  if (correction != 0) {// If the bin is empty this is a  0
  	    Spectra[5]->SetBinContent(ibin,Spectra[5]->GetBinContent(ibin)*correction);
  	    Spectra[5]->SetBinError(ibin,Spectra[5]->GetBinError  (ibin)*correction);
  	    gGFCorrectionProtonMinus->SetPoint(ibin,pt,correction);
  	  }else if (Spectra[5]->GetBinContent(ibin) > 0) { // If we are skipping a non-empty bin, we notify the user
  	    cout << "Fluka/GEANT: Not correcting bin "<<ibin << " for Antiprotons secondaries, Pt:"<< pt<< endl;
  	    cout << " Bin content: " << Spectra[5]->GetBinContent(ibin)  << endl;
  	  }
  	}
      }else{
  	gGFCorrectionProtonPlus->SetPoint(ibin,Spectra[2]->GetBinCenter(ibin),0);
  	gGFCorrectionProtonMinus->SetPoint(ibin,Spectra[5]->GetBinCenter(ibin),0);
  	Float_t FlukaCorrpPosTracking=fGFpPosTracking->Eval(Spectra[2]->GetBinCenter(ibin));
  	Float_t FlukaCorrpNegTracking=fGFpNegTracking->Eval(Spectra[2]->GetBinCenter(ibin));
  	Printf("TPC/TOF Geant/Fluka Tracking: pt:%f  Pos:%f  Neg:%f",Spectra[2]->GetBinCenter(ibin),FlukaCorrpPosTracking,FlukaCorrpNegTracking);
  	if(icharge==0){
	  Spectra[2]->SetBinContent(ibin,Spectra[2]->GetBinContent(ibin)*FlukaCorrpPosTracking);
	  Spectra[2]->SetBinError(ibin,Spectra[2]->GetBinError(ibin)*FlukaCorrpPosTracking);
  	}else{
	  Spectra[5]->SetBinContent(ibin,Spectra[5]->GetBinContent(ibin)*FlukaCorrpNegTracking);
	  Spectra[5]->SetBinError(ibin,Spectra[5]->GetBinError(ibin)*FlukaCorrpNegTracking);
  	}
	Float_t FlukaCorrpPosMatching=fGFpPosMatching->Eval(Spectra[2]->GetBinCenter(ibin));
  	Float_t FlukaCorrpNegMatching=fGFpNegMatching->Eval(Spectra[2]->GetBinCenter(ibin));
  	Printf("TPC/TOF Geant/Fluka Matching: pt:%f  Pos:%f  Neg:%f",Spectra[2]->GetBinCenter(ibin),FlukaCorrpPosMatching,FlukaCorrpNegMatching);
	if(icharge==0){
	  Spectra[2]->SetBinContent(ibin,Spectra[2]->GetBinContent(ibin)*FlukaCorrpPosMatching);
	  Spectra[2]->SetBinError(ibin,Spectra[2]->GetBinError(ibin)*FlukaCorrpPosMatching);
	}else{
	  Spectra[5]->SetBinContent(ibin,Spectra[5]->GetBinContent(ibin)*FlukaCorrpNegMatching);
	  Spectra[5]->SetBinError(ibin,Spectra[5]->GetBinError(ibin)*FlukaCorrpNegMatching);
	}
      }
    }//end loop on bins	
  }
  gGFCorrectionKaonPlus->SetLineColor(kRed);
  gGFCorrectionKaonMinus->SetLineColor(kRed+2);
  gGFCorrectionProtonPlus->SetLineColor(kGreen);
  gGFCorrectionProtonMinus->SetLineColor(kGreen+2);
  fGFKPosTracking->SetLineColor(kRed);
  fGFKNegTracking->SetLineColor(kRed+2);
  fGFKPosMatching->SetLineColor(kRed);
  fGFKNegMatching->SetLineColor(kRed+2);
  fGFpPosTracking->SetLineColor(kGreen);
  fGFpNegTracking->SetLineColor(kGreen+2);
  fGFpPosMatching->SetLineColor(kGreen);
  fGFpNegMatching->SetLineColor(kGreen+2);
  fGFKPosTracking->SetLineStyle(2);
  fGFKNegTracking->SetLineStyle(2);
  fGFKPosMatching->SetLineStyle(3);
  fGFKNegMatching->SetLineStyle(3);
  fGFpPosTracking->SetLineStyle(2);
  fGFpNegTracking->SetLineStyle(2);
  fGFpPosMatching->SetLineStyle(3);
  fGFpNegMatching->SetLineStyle(3);
  fGFKPosTracking->SetRange(.6,5);
  fGFKNegTracking->SetRange(.6,5);
  fGFKPosMatching->SetRange(.6,5);
  fGFKNegMatching->SetRange(.6,5);
  fGFpPosTracking->SetRange(.6,5);
  fGFpNegTracking->SetRange(.6,5);
  fGFpPosMatching->SetRange(.6,5);
  fGFpNegMatching->SetRange(.6,5);
 
  TCanvas * cGFCorrection = new TCanvas ("GFCorrection","GFCorrection",700,500);
  gPad->SetGridx();
  gPad->SetGridy();
  gGFCorrectionKaonPlus->DrawClone("al");
  gGFCorrectionKaonMinus->DrawClone("lsame");
  gGFCorrectionProtonPlus->DrawClone("lsame");
  gGFCorrectionProtonMinus->DrawClone("lsame");
  fGFKPosTracking->DrawClone("lsame");
  fGFKNegTracking->DrawClone("lsame");
  fGFKPosMatching->DrawClone("lsame");
  fGFKNegMatching->DrawClone("lsame");
  fGFpPosTracking->DrawClone("lsame");
  fGFpNegTracking->DrawClone("lsame");
  fGFpPosMatching->DrawClone("lsame");
  fGFpNegMatching->DrawClone("lsame");
  gPad->BuildLegend()->SetFillColor(0);
  fout->cd();
  cGFCorrection->Write();
}



///////////
TF1 *
TrackingEff_geantflukaCorrection(Int_t ipart, Int_t icharge)
{

  if (ipart == 3 && icharge == kNegative) {
    TF1 *f = new TF1(Form("fGeantFluka_%s_%s", AliPID::ParticleName(ipart), Sign[icharge]), "TrackingPtGeantFlukaCorrectionKaMinus(x)", 0., 5.);
    return f;
  }
  else if (ipart == 4 && icharge == kNegative) {
    TF1 *f = new TF1(Form("fGeantFluka_%s_%s", AliPID::ParticleName(ipart), Sign[icharge]), "TrackingPtGeantFlukaCorrectionPrMinus(x)", 0., 5.);
  }
  else
    TF1 *f = new TF1(Form("fGeantFluka_%s_%s", AliPID::ParticleName(ipart), Sign[icharge]), "TrackingPtGeantFlukaCorrectionNull(x)", 0., 5.);

  return f;
}

Double_t
TrackingPtGeantFlukaCorrectionNull(Double_t pTmc)
{
  return 1.;
}

Double_t
TrackingPtGeantFlukaCorrectionPrMinus(Double_t pTmc)
{
  return (1 - 0.129758 *TMath::Exp(-pTmc*0.679612));
}

Double_t
TrackingPtGeantFlukaCorrectionKaMinus(Double_t pTmc)
{
  return TMath::Min((0.972865 + 0.0117093*pTmc), 1.);
}
///////////////////////////////////////////
TF1 *
TOFmatchMC_geantflukaCorrection(Int_t ipart, Int_t icharge)
{

  if (ipart == 3 && icharge == kNegative) {
    TF1 *f = new TF1(Form("fGeantFluka_%s_%s", AliPID::ParticleName(ipart), Sign[icharge]), "MatchingPtGeantFlukaCorrectionKaMinus(x)", 0., 5.);
    return f;
  }
  else if (ipart == 4 && icharge == kNegative) {
    TF1 *f = new TF1(Form("fGeantFluka_%s_%s", AliPID::ParticleName(ipart), Sign[icharge]), "MatchingPtGeantFlukaCorrectionPrMinus(x)", 0., 5.);
  }
  else
    TF1 *f = new TF1(Form("fGeantFluka_%s_%s", AliPID::ParticleName(ipart), Sign[icharge]), "MatchingPtGeantFlukaCorrectionNull(x)", 0., 5.);

  return f;
}


Double_t
MatchingPtGeantFlukaCorrectionNull(Double_t pTmc)
{
  return 1.;
}

Double_t 
MatchingPtGeantFlukaCorrectionPrMinus(Double_t pTmc)
{
  Float_t ptTPCoutP =pTmc*(1-6.81059e-01*TMath::Exp(-pTmc*4.20094));
  return (TMath::Power(1 - 0.129758*TMath::Exp(-ptTPCoutP*0.679612),0.07162/0.03471));
}

Double_t
MatchingPtGeantFlukaCorrectionKaMinus(Double_t pTmc)
{
  Float_t ptTPCoutK=pTmc*(1- 3.37297e-03/pTmc/pTmc - 3.26544e-03/pTmc);
  return TMath::Min((TMath::Power(0.972865 + 0.0117093*ptTPCoutK,0.07162/0.03471)), 1.);
}
 MainAnalysis.C:1
 MainAnalysis.C:2
 MainAnalysis.C:3
 MainAnalysis.C:4
 MainAnalysis.C:5
 MainAnalysis.C:6
 MainAnalysis.C:7
 MainAnalysis.C:8
 MainAnalysis.C:9
 MainAnalysis.C:10
 MainAnalysis.C:11
 MainAnalysis.C:12
 MainAnalysis.C:13
 MainAnalysis.C:14
 MainAnalysis.C:15
 MainAnalysis.C:16
 MainAnalysis.C:17
 MainAnalysis.C:18
 MainAnalysis.C:19
 MainAnalysis.C:20
 MainAnalysis.C:21
 MainAnalysis.C:22
 MainAnalysis.C:23
 MainAnalysis.C:24
 MainAnalysis.C:25
 MainAnalysis.C:26
 MainAnalysis.C:27
 MainAnalysis.C:28
 MainAnalysis.C:29
 MainAnalysis.C:30
 MainAnalysis.C:31
 MainAnalysis.C:32
 MainAnalysis.C:33
 MainAnalysis.C:34
 MainAnalysis.C:35
 MainAnalysis.C:36
 MainAnalysis.C:37
 MainAnalysis.C:38
 MainAnalysis.C:39
 MainAnalysis.C:40
 MainAnalysis.C:41
 MainAnalysis.C:42
 MainAnalysis.C:43
 MainAnalysis.C:44
 MainAnalysis.C:45
 MainAnalysis.C:46
 MainAnalysis.C:47
 MainAnalysis.C:48
 MainAnalysis.C:49
 MainAnalysis.C:50
 MainAnalysis.C:51
 MainAnalysis.C:52
 MainAnalysis.C:53
 MainAnalysis.C:54
 MainAnalysis.C:55
 MainAnalysis.C:56
 MainAnalysis.C:57
 MainAnalysis.C:58
 MainAnalysis.C:59
 MainAnalysis.C:60
 MainAnalysis.C:61
 MainAnalysis.C:62
 MainAnalysis.C:63
 MainAnalysis.C:64
 MainAnalysis.C:65
 MainAnalysis.C:66
 MainAnalysis.C:67
 MainAnalysis.C:68
 MainAnalysis.C:69
 MainAnalysis.C:70
 MainAnalysis.C:71
 MainAnalysis.C:72
 MainAnalysis.C:73
 MainAnalysis.C:74
 MainAnalysis.C:75
 MainAnalysis.C:76
 MainAnalysis.C:77
 MainAnalysis.C:78
 MainAnalysis.C:79
 MainAnalysis.C:80
 MainAnalysis.C:81
 MainAnalysis.C:82
 MainAnalysis.C:83
 MainAnalysis.C:84
 MainAnalysis.C:85
 MainAnalysis.C:86
 MainAnalysis.C:87
 MainAnalysis.C:88
 MainAnalysis.C:89
 MainAnalysis.C:90
 MainAnalysis.C:91
 MainAnalysis.C:92
 MainAnalysis.C:93
 MainAnalysis.C:94
 MainAnalysis.C:95
 MainAnalysis.C:96
 MainAnalysis.C:97
 MainAnalysis.C:98
 MainAnalysis.C:99
 MainAnalysis.C:100
 MainAnalysis.C:101
 MainAnalysis.C:102
 MainAnalysis.C:103
 MainAnalysis.C:104
 MainAnalysis.C:105
 MainAnalysis.C:106
 MainAnalysis.C:107
 MainAnalysis.C:108
 MainAnalysis.C:109
 MainAnalysis.C:110
 MainAnalysis.C:111
 MainAnalysis.C:112
 MainAnalysis.C:113
 MainAnalysis.C:114
 MainAnalysis.C:115
 MainAnalysis.C:116
 MainAnalysis.C:117
 MainAnalysis.C:118
 MainAnalysis.C:119
 MainAnalysis.C:120
 MainAnalysis.C:121
 MainAnalysis.C:122
 MainAnalysis.C:123
 MainAnalysis.C:124
 MainAnalysis.C:125
 MainAnalysis.C:126
 MainAnalysis.C:127
 MainAnalysis.C:128
 MainAnalysis.C:129
 MainAnalysis.C:130
 MainAnalysis.C:131
 MainAnalysis.C:132
 MainAnalysis.C:133
 MainAnalysis.C:134
 MainAnalysis.C:135
 MainAnalysis.C:136
 MainAnalysis.C:137
 MainAnalysis.C:138
 MainAnalysis.C:139
 MainAnalysis.C:140
 MainAnalysis.C:141
 MainAnalysis.C:142
 MainAnalysis.C:143
 MainAnalysis.C:144
 MainAnalysis.C:145
 MainAnalysis.C:146
 MainAnalysis.C:147
 MainAnalysis.C:148
 MainAnalysis.C:149
 MainAnalysis.C:150
 MainAnalysis.C:151
 MainAnalysis.C:152
 MainAnalysis.C:153
 MainAnalysis.C:154
 MainAnalysis.C:155
 MainAnalysis.C:156
 MainAnalysis.C:157
 MainAnalysis.C:158
 MainAnalysis.C:159
 MainAnalysis.C:160
 MainAnalysis.C:161
 MainAnalysis.C:162
 MainAnalysis.C:163
 MainAnalysis.C:164
 MainAnalysis.C:165
 MainAnalysis.C:166
 MainAnalysis.C:167
 MainAnalysis.C:168
 MainAnalysis.C:169
 MainAnalysis.C:170
 MainAnalysis.C:171
 MainAnalysis.C:172
 MainAnalysis.C:173
 MainAnalysis.C:174
 MainAnalysis.C:175
 MainAnalysis.C:176
 MainAnalysis.C:177
 MainAnalysis.C:178
 MainAnalysis.C:179
 MainAnalysis.C:180
 MainAnalysis.C:181
 MainAnalysis.C:182
 MainAnalysis.C:183
 MainAnalysis.C:184
 MainAnalysis.C:185
 MainAnalysis.C:186
 MainAnalysis.C:187
 MainAnalysis.C:188
 MainAnalysis.C:189
 MainAnalysis.C:190
 MainAnalysis.C:191
 MainAnalysis.C:192
 MainAnalysis.C:193
 MainAnalysis.C:194
 MainAnalysis.C:195
 MainAnalysis.C:196
 MainAnalysis.C:197
 MainAnalysis.C:198
 MainAnalysis.C:199
 MainAnalysis.C:200
 MainAnalysis.C:201
 MainAnalysis.C:202
 MainAnalysis.C:203
 MainAnalysis.C:204
 MainAnalysis.C:205
 MainAnalysis.C:206
 MainAnalysis.C:207
 MainAnalysis.C:208
 MainAnalysis.C:209
 MainAnalysis.C:210
 MainAnalysis.C:211
 MainAnalysis.C:212
 MainAnalysis.C:213
 MainAnalysis.C:214
 MainAnalysis.C:215
 MainAnalysis.C:216
 MainAnalysis.C:217
 MainAnalysis.C:218
 MainAnalysis.C:219
 MainAnalysis.C:220
 MainAnalysis.C:221
 MainAnalysis.C:222
 MainAnalysis.C:223
 MainAnalysis.C:224
 MainAnalysis.C:225
 MainAnalysis.C:226
 MainAnalysis.C:227
 MainAnalysis.C:228
 MainAnalysis.C:229
 MainAnalysis.C:230
 MainAnalysis.C:231
 MainAnalysis.C:232
 MainAnalysis.C:233
 MainAnalysis.C:234
 MainAnalysis.C:235
 MainAnalysis.C:236
 MainAnalysis.C:237
 MainAnalysis.C:238
 MainAnalysis.C:239
 MainAnalysis.C:240
 MainAnalysis.C:241
 MainAnalysis.C:242
 MainAnalysis.C:243
 MainAnalysis.C:244
 MainAnalysis.C:245
 MainAnalysis.C:246
 MainAnalysis.C:247
 MainAnalysis.C:248
 MainAnalysis.C:249
 MainAnalysis.C:250
 MainAnalysis.C:251
 MainAnalysis.C:252
 MainAnalysis.C:253
 MainAnalysis.C:254
 MainAnalysis.C:255
 MainAnalysis.C:256
 MainAnalysis.C:257
 MainAnalysis.C:258
 MainAnalysis.C:259
 MainAnalysis.C:260
 MainAnalysis.C:261
 MainAnalysis.C:262
 MainAnalysis.C:263
 MainAnalysis.C:264
 MainAnalysis.C:265
 MainAnalysis.C:266
 MainAnalysis.C:267
 MainAnalysis.C:268
 MainAnalysis.C:269
 MainAnalysis.C:270
 MainAnalysis.C:271
 MainAnalysis.C:272
 MainAnalysis.C:273
 MainAnalysis.C:274
 MainAnalysis.C:275
 MainAnalysis.C:276
 MainAnalysis.C:277
 MainAnalysis.C:278
 MainAnalysis.C:279
 MainAnalysis.C:280
 MainAnalysis.C:281
 MainAnalysis.C:282
 MainAnalysis.C:283
 MainAnalysis.C:284
 MainAnalysis.C:285
 MainAnalysis.C:286
 MainAnalysis.C:287
 MainAnalysis.C:288
 MainAnalysis.C:289
 MainAnalysis.C:290
 MainAnalysis.C:291
 MainAnalysis.C:292
 MainAnalysis.C:293
 MainAnalysis.C:294
 MainAnalysis.C:295
 MainAnalysis.C:296
 MainAnalysis.C:297
 MainAnalysis.C:298
 MainAnalysis.C:299
 MainAnalysis.C:300
 MainAnalysis.C:301
 MainAnalysis.C:302
 MainAnalysis.C:303
 MainAnalysis.C:304
 MainAnalysis.C:305
 MainAnalysis.C:306
 MainAnalysis.C:307
 MainAnalysis.C:308
 MainAnalysis.C:309
 MainAnalysis.C:310
 MainAnalysis.C:311
 MainAnalysis.C:312
 MainAnalysis.C:313
 MainAnalysis.C:314
 MainAnalysis.C:315
 MainAnalysis.C:316
 MainAnalysis.C:317
 MainAnalysis.C:318
 MainAnalysis.C:319
 MainAnalysis.C:320
 MainAnalysis.C:321
 MainAnalysis.C:322
 MainAnalysis.C:323
 MainAnalysis.C:324
 MainAnalysis.C:325
 MainAnalysis.C:326
 MainAnalysis.C:327
 MainAnalysis.C:328
 MainAnalysis.C:329
 MainAnalysis.C:330
 MainAnalysis.C:331
 MainAnalysis.C:332
 MainAnalysis.C:333
 MainAnalysis.C:334
 MainAnalysis.C:335
 MainAnalysis.C:336
 MainAnalysis.C:337
 MainAnalysis.C:338
 MainAnalysis.C:339
 MainAnalysis.C:340
 MainAnalysis.C:341
 MainAnalysis.C:342
 MainAnalysis.C:343
 MainAnalysis.C:344
 MainAnalysis.C:345
 MainAnalysis.C:346
 MainAnalysis.C:347
 MainAnalysis.C:348
 MainAnalysis.C:349
 MainAnalysis.C:350
 MainAnalysis.C:351
 MainAnalysis.C:352
 MainAnalysis.C:353
 MainAnalysis.C:354
 MainAnalysis.C:355
 MainAnalysis.C:356
 MainAnalysis.C:357
 MainAnalysis.C:358
 MainAnalysis.C:359
 MainAnalysis.C:360
 MainAnalysis.C:361
 MainAnalysis.C:362
 MainAnalysis.C:363
 MainAnalysis.C:364
 MainAnalysis.C:365
 MainAnalysis.C:366
 MainAnalysis.C:367
 MainAnalysis.C:368
 MainAnalysis.C:369
 MainAnalysis.C:370
 MainAnalysis.C:371
 MainAnalysis.C:372
 MainAnalysis.C:373
 MainAnalysis.C:374
 MainAnalysis.C:375
 MainAnalysis.C:376
 MainAnalysis.C:377
 MainAnalysis.C:378
 MainAnalysis.C:379
 MainAnalysis.C:380
 MainAnalysis.C:381
 MainAnalysis.C:382
 MainAnalysis.C:383
 MainAnalysis.C:384
 MainAnalysis.C:385
 MainAnalysis.C:386
 MainAnalysis.C:387
 MainAnalysis.C:388
 MainAnalysis.C:389
 MainAnalysis.C:390
 MainAnalysis.C:391
 MainAnalysis.C:392
 MainAnalysis.C:393
 MainAnalysis.C:394
 MainAnalysis.C:395
 MainAnalysis.C:396
 MainAnalysis.C:397
 MainAnalysis.C:398
 MainAnalysis.C:399
 MainAnalysis.C:400
 MainAnalysis.C:401
 MainAnalysis.C:402
 MainAnalysis.C:403
 MainAnalysis.C:404
 MainAnalysis.C:405
 MainAnalysis.C:406
 MainAnalysis.C:407
 MainAnalysis.C:408
 MainAnalysis.C:409
 MainAnalysis.C:410
 MainAnalysis.C:411
 MainAnalysis.C:412
 MainAnalysis.C:413
 MainAnalysis.C:414
 MainAnalysis.C:415
 MainAnalysis.C:416
 MainAnalysis.C:417
 MainAnalysis.C:418
 MainAnalysis.C:419
 MainAnalysis.C:420
 MainAnalysis.C:421
 MainAnalysis.C:422
 MainAnalysis.C:423
 MainAnalysis.C:424
 MainAnalysis.C:425
 MainAnalysis.C:426
 MainAnalysis.C:427
 MainAnalysis.C:428
 MainAnalysis.C:429
 MainAnalysis.C:430
 MainAnalysis.C:431
 MainAnalysis.C:432
 MainAnalysis.C:433
 MainAnalysis.C:434
 MainAnalysis.C:435
 MainAnalysis.C:436
 MainAnalysis.C:437
 MainAnalysis.C:438
 MainAnalysis.C:439
 MainAnalysis.C:440
 MainAnalysis.C:441
 MainAnalysis.C:442
 MainAnalysis.C:443
 MainAnalysis.C:444
 MainAnalysis.C:445
 MainAnalysis.C:446
 MainAnalysis.C:447
 MainAnalysis.C:448
 MainAnalysis.C:449
 MainAnalysis.C:450
 MainAnalysis.C:451
 MainAnalysis.C:452
 MainAnalysis.C:453
 MainAnalysis.C:454
 MainAnalysis.C:455
 MainAnalysis.C:456
 MainAnalysis.C:457
 MainAnalysis.C:458
 MainAnalysis.C:459
 MainAnalysis.C:460
 MainAnalysis.C:461
 MainAnalysis.C:462
 MainAnalysis.C:463
 MainAnalysis.C:464
 MainAnalysis.C:465
 MainAnalysis.C:466
 MainAnalysis.C:467
 MainAnalysis.C:468
 MainAnalysis.C:469
 MainAnalysis.C:470
 MainAnalysis.C:471
 MainAnalysis.C:472
 MainAnalysis.C:473
 MainAnalysis.C:474
 MainAnalysis.C:475
 MainAnalysis.C:476
 MainAnalysis.C:477
 MainAnalysis.C:478
 MainAnalysis.C:479
 MainAnalysis.C:480
 MainAnalysis.C:481
 MainAnalysis.C:482
 MainAnalysis.C:483
 MainAnalysis.C:484
 MainAnalysis.C:485
 MainAnalysis.C:486
 MainAnalysis.C:487
 MainAnalysis.C:488
 MainAnalysis.C:489
 MainAnalysis.C:490
 MainAnalysis.C:491
 MainAnalysis.C:492
 MainAnalysis.C:493
 MainAnalysis.C:494
 MainAnalysis.C:495
 MainAnalysis.C:496
 MainAnalysis.C:497
 MainAnalysis.C:498
 MainAnalysis.C:499
 MainAnalysis.C:500
 MainAnalysis.C:501
 MainAnalysis.C:502
 MainAnalysis.C:503
 MainAnalysis.C:504
 MainAnalysis.C:505
 MainAnalysis.C:506
 MainAnalysis.C:507
 MainAnalysis.C:508
 MainAnalysis.C:509
 MainAnalysis.C:510
 MainAnalysis.C:511
 MainAnalysis.C:512
 MainAnalysis.C:513
 MainAnalysis.C:514
 MainAnalysis.C:515
 MainAnalysis.C:516
 MainAnalysis.C:517
 MainAnalysis.C:518
 MainAnalysis.C:519
 MainAnalysis.C:520
 MainAnalysis.C:521
 MainAnalysis.C:522
 MainAnalysis.C:523
 MainAnalysis.C:524
 MainAnalysis.C:525
 MainAnalysis.C:526
 MainAnalysis.C:527
 MainAnalysis.C:528
 MainAnalysis.C:529
 MainAnalysis.C:530
 MainAnalysis.C:531
 MainAnalysis.C:532
 MainAnalysis.C:533
 MainAnalysis.C:534
 MainAnalysis.C:535
 MainAnalysis.C:536
 MainAnalysis.C:537
 MainAnalysis.C:538
 MainAnalysis.C:539
 MainAnalysis.C:540
 MainAnalysis.C:541
 MainAnalysis.C:542
 MainAnalysis.C:543
 MainAnalysis.C:544
 MainAnalysis.C:545
 MainAnalysis.C:546
 MainAnalysis.C:547
 MainAnalysis.C:548
 MainAnalysis.C:549
 MainAnalysis.C:550
 MainAnalysis.C:551
 MainAnalysis.C:552
 MainAnalysis.C:553
 MainAnalysis.C:554
 MainAnalysis.C:555
 MainAnalysis.C:556
 MainAnalysis.C:557
 MainAnalysis.C:558
 MainAnalysis.C:559
 MainAnalysis.C:560
 MainAnalysis.C:561
 MainAnalysis.C:562
 MainAnalysis.C:563
 MainAnalysis.C:564
 MainAnalysis.C:565
 MainAnalysis.C:566
 MainAnalysis.C:567
 MainAnalysis.C:568
 MainAnalysis.C:569
 MainAnalysis.C:570
 MainAnalysis.C:571
 MainAnalysis.C:572
 MainAnalysis.C:573
 MainAnalysis.C:574
 MainAnalysis.C:575
 MainAnalysis.C:576
 MainAnalysis.C:577
 MainAnalysis.C:578
 MainAnalysis.C:579
 MainAnalysis.C:580
 MainAnalysis.C:581
 MainAnalysis.C:582
 MainAnalysis.C:583
 MainAnalysis.C:584
 MainAnalysis.C:585
 MainAnalysis.C:586
 MainAnalysis.C:587
 MainAnalysis.C:588
 MainAnalysis.C:589
 MainAnalysis.C:590
 MainAnalysis.C:591
 MainAnalysis.C:592
 MainAnalysis.C:593
 MainAnalysis.C:594
 MainAnalysis.C:595
 MainAnalysis.C:596
 MainAnalysis.C:597
 MainAnalysis.C:598
 MainAnalysis.C:599
 MainAnalysis.C:600
 MainAnalysis.C:601
 MainAnalysis.C:602
 MainAnalysis.C:603
 MainAnalysis.C:604
 MainAnalysis.C:605
 MainAnalysis.C:606
 MainAnalysis.C:607
 MainAnalysis.C:608
 MainAnalysis.C:609
 MainAnalysis.C:610
 MainAnalysis.C:611
 MainAnalysis.C:612
 MainAnalysis.C:613
 MainAnalysis.C:614
 MainAnalysis.C:615
 MainAnalysis.C:616
 MainAnalysis.C:617
 MainAnalysis.C:618
 MainAnalysis.C:619
 MainAnalysis.C:620
 MainAnalysis.C:621
 MainAnalysis.C:622
 MainAnalysis.C:623
 MainAnalysis.C:624
 MainAnalysis.C:625
 MainAnalysis.C:626
 MainAnalysis.C:627
 MainAnalysis.C:628
 MainAnalysis.C:629
 MainAnalysis.C:630
 MainAnalysis.C:631
 MainAnalysis.C:632
 MainAnalysis.C:633
 MainAnalysis.C:634
 MainAnalysis.C:635
 MainAnalysis.C:636
 MainAnalysis.C:637
 MainAnalysis.C:638
 MainAnalysis.C:639
 MainAnalysis.C:640
 MainAnalysis.C:641
 MainAnalysis.C:642
 MainAnalysis.C:643
 MainAnalysis.C:644
 MainAnalysis.C:645
 MainAnalysis.C:646
 MainAnalysis.C:647
 MainAnalysis.C:648
 MainAnalysis.C:649
 MainAnalysis.C:650
 MainAnalysis.C:651
 MainAnalysis.C:652
 MainAnalysis.C:653
 MainAnalysis.C:654
 MainAnalysis.C:655
 MainAnalysis.C:656
 MainAnalysis.C:657
 MainAnalysis.C:658
 MainAnalysis.C:659
 MainAnalysis.C:660
 MainAnalysis.C:661
 MainAnalysis.C:662
 MainAnalysis.C:663
 MainAnalysis.C:664
 MainAnalysis.C:665
 MainAnalysis.C:666
 MainAnalysis.C:667
 MainAnalysis.C:668
 MainAnalysis.C:669
 MainAnalysis.C:670
 MainAnalysis.C:671
 MainAnalysis.C:672
 MainAnalysis.C:673
 MainAnalysis.C:674
 MainAnalysis.C:675
 MainAnalysis.C:676
 MainAnalysis.C:677
 MainAnalysis.C:678
 MainAnalysis.C:679
 MainAnalysis.C:680
 MainAnalysis.C:681
 MainAnalysis.C:682
 MainAnalysis.C:683
 MainAnalysis.C:684
 MainAnalysis.C:685
 MainAnalysis.C:686
 MainAnalysis.C:687
 MainAnalysis.C:688
 MainAnalysis.C:689
 MainAnalysis.C:690
 MainAnalysis.C:691
 MainAnalysis.C:692
 MainAnalysis.C:693
 MainAnalysis.C:694
 MainAnalysis.C:695
 MainAnalysis.C:696
 MainAnalysis.C:697
 MainAnalysis.C:698
 MainAnalysis.C:699
 MainAnalysis.C:700
 MainAnalysis.C:701
 MainAnalysis.C:702
 MainAnalysis.C:703
 MainAnalysis.C:704
 MainAnalysis.C:705
 MainAnalysis.C:706
 MainAnalysis.C:707
 MainAnalysis.C:708
 MainAnalysis.C:709
 MainAnalysis.C:710
 MainAnalysis.C:711
 MainAnalysis.C:712
 MainAnalysis.C:713
 MainAnalysis.C:714
 MainAnalysis.C:715
 MainAnalysis.C:716
 MainAnalysis.C:717
 MainAnalysis.C:718
 MainAnalysis.C:719
 MainAnalysis.C:720
 MainAnalysis.C:721
 MainAnalysis.C:722
 MainAnalysis.C:723
 MainAnalysis.C:724
 MainAnalysis.C:725
 MainAnalysis.C:726
 MainAnalysis.C:727
 MainAnalysis.C:728
 MainAnalysis.C:729
 MainAnalysis.C:730
 MainAnalysis.C:731
 MainAnalysis.C:732
 MainAnalysis.C:733
 MainAnalysis.C:734
 MainAnalysis.C:735
 MainAnalysis.C:736
 MainAnalysis.C:737
 MainAnalysis.C:738
 MainAnalysis.C:739
 MainAnalysis.C:740
 MainAnalysis.C:741
 MainAnalysis.C:742
 MainAnalysis.C:743
 MainAnalysis.C:744
 MainAnalysis.C:745
 MainAnalysis.C:746
 MainAnalysis.C:747
 MainAnalysis.C:748
 MainAnalysis.C:749
 MainAnalysis.C:750
 MainAnalysis.C:751
 MainAnalysis.C:752
 MainAnalysis.C:753
 MainAnalysis.C:754
 MainAnalysis.C:755
 MainAnalysis.C:756
 MainAnalysis.C:757
 MainAnalysis.C:758
 MainAnalysis.C:759
 MainAnalysis.C:760
 MainAnalysis.C:761
 MainAnalysis.C:762
 MainAnalysis.C:763
 MainAnalysis.C:764
 MainAnalysis.C:765
 MainAnalysis.C:766
 MainAnalysis.C:767
 MainAnalysis.C:768
 MainAnalysis.C:769
 MainAnalysis.C:770
 MainAnalysis.C:771
 MainAnalysis.C:772
 MainAnalysis.C:773
 MainAnalysis.C:774
 MainAnalysis.C:775
 MainAnalysis.C:776
 MainAnalysis.C:777
 MainAnalysis.C:778
 MainAnalysis.C:779
 MainAnalysis.C:780
 MainAnalysis.C:781
 MainAnalysis.C:782
 MainAnalysis.C:783
 MainAnalysis.C:784
 MainAnalysis.C:785
 MainAnalysis.C:786
 MainAnalysis.C:787
 MainAnalysis.C:788
 MainAnalysis.C:789
 MainAnalysis.C:790
 MainAnalysis.C:791
 MainAnalysis.C:792
 MainAnalysis.C:793
 MainAnalysis.C:794
 MainAnalysis.C:795
 MainAnalysis.C:796
 MainAnalysis.C:797
 MainAnalysis.C:798
 MainAnalysis.C:799
 MainAnalysis.C:800
 MainAnalysis.C:801
 MainAnalysis.C:802
 MainAnalysis.C:803
 MainAnalysis.C:804
 MainAnalysis.C:805
 MainAnalysis.C:806
 MainAnalysis.C:807
 MainAnalysis.C:808
 MainAnalysis.C:809
 MainAnalysis.C:810
 MainAnalysis.C:811
 MainAnalysis.C:812
 MainAnalysis.C:813
 MainAnalysis.C:814
 MainAnalysis.C:815
 MainAnalysis.C:816
 MainAnalysis.C:817
 MainAnalysis.C:818
 MainAnalysis.C:819
 MainAnalysis.C:820
 MainAnalysis.C:821
 MainAnalysis.C:822
 MainAnalysis.C:823
 MainAnalysis.C:824
 MainAnalysis.C:825
 MainAnalysis.C:826
 MainAnalysis.C:827
 MainAnalysis.C:828
 MainAnalysis.C:829
 MainAnalysis.C:830
 MainAnalysis.C:831
 MainAnalysis.C:832
 MainAnalysis.C:833
 MainAnalysis.C:834
 MainAnalysis.C:835
 MainAnalysis.C:836
 MainAnalysis.C:837
 MainAnalysis.C:838
 MainAnalysis.C:839
 MainAnalysis.C:840
 MainAnalysis.C:841
 MainAnalysis.C:842
 MainAnalysis.C:843
 MainAnalysis.C:844
 MainAnalysis.C:845
 MainAnalysis.C:846
 MainAnalysis.C:847
 MainAnalysis.C:848
 MainAnalysis.C:849
 MainAnalysis.C:850
 MainAnalysis.C:851
 MainAnalysis.C:852
 MainAnalysis.C:853
 MainAnalysis.C:854
 MainAnalysis.C:855
 MainAnalysis.C:856
 MainAnalysis.C:857
 MainAnalysis.C:858
 MainAnalysis.C:859
 MainAnalysis.C:860
 MainAnalysis.C:861
 MainAnalysis.C:862
 MainAnalysis.C:863
 MainAnalysis.C:864
 MainAnalysis.C:865
 MainAnalysis.C:866
 MainAnalysis.C:867
 MainAnalysis.C:868
 MainAnalysis.C:869
 MainAnalysis.C:870
 MainAnalysis.C:871
 MainAnalysis.C:872
 MainAnalysis.C:873
 MainAnalysis.C:874
 MainAnalysis.C:875
 MainAnalysis.C:876
 MainAnalysis.C:877
 MainAnalysis.C:878
 MainAnalysis.C:879
 MainAnalysis.C:880
 MainAnalysis.C:881
 MainAnalysis.C:882
 MainAnalysis.C:883
 MainAnalysis.C:884
 MainAnalysis.C:885
 MainAnalysis.C:886
 MainAnalysis.C:887
 MainAnalysis.C:888
 MainAnalysis.C:889
 MainAnalysis.C:890
 MainAnalysis.C:891
 MainAnalysis.C:892
 MainAnalysis.C:893
 MainAnalysis.C:894
 MainAnalysis.C:895
 MainAnalysis.C:896
 MainAnalysis.C:897
 MainAnalysis.C:898
 MainAnalysis.C:899
 MainAnalysis.C:900
 MainAnalysis.C:901
 MainAnalysis.C:902
 MainAnalysis.C:903
 MainAnalysis.C:904
 MainAnalysis.C:905
 MainAnalysis.C:906
 MainAnalysis.C:907
 MainAnalysis.C:908
 MainAnalysis.C:909
 MainAnalysis.C:910
 MainAnalysis.C:911
 MainAnalysis.C:912
 MainAnalysis.C:913
 MainAnalysis.C:914
 MainAnalysis.C:915
 MainAnalysis.C:916
 MainAnalysis.C:917
 MainAnalysis.C:918
 MainAnalysis.C:919
 MainAnalysis.C:920
 MainAnalysis.C:921
 MainAnalysis.C:922
 MainAnalysis.C:923
 MainAnalysis.C:924
 MainAnalysis.C:925
 MainAnalysis.C:926
 MainAnalysis.C:927
 MainAnalysis.C:928
 MainAnalysis.C:929
 MainAnalysis.C:930
 MainAnalysis.C:931
 MainAnalysis.C:932
 MainAnalysis.C:933
 MainAnalysis.C:934
 MainAnalysis.C:935
 MainAnalysis.C:936
 MainAnalysis.C:937
 MainAnalysis.C:938
 MainAnalysis.C:939
 MainAnalysis.C:940
 MainAnalysis.C:941
 MainAnalysis.C:942
 MainAnalysis.C:943
 MainAnalysis.C:944
 MainAnalysis.C:945
 MainAnalysis.C:946
 MainAnalysis.C:947
 MainAnalysis.C:948
 MainAnalysis.C:949
 MainAnalysis.C:950
 MainAnalysis.C:951
 MainAnalysis.C:952
 MainAnalysis.C:953
 MainAnalysis.C:954
 MainAnalysis.C:955
 MainAnalysis.C:956
 MainAnalysis.C:957
 MainAnalysis.C:958
 MainAnalysis.C:959
 MainAnalysis.C:960
 MainAnalysis.C:961
 MainAnalysis.C:962