]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG1/AliComparisonDEdx.cxx
Update macros for prompt offline (Mikolaj)
[u/mrichter/AliRoot.git] / PWG1 / AliComparisonDEdx.cxx
index a60aae7a20416e8aa74964f152ea0151ff6c71d1..e0bd632f96882c57d2f24ce37d0fe0b134c1a016 100644 (file)
-//------------------------------------------------------------------------------\r
-// Implementation of AliComparisonDEdx class. It keeps information from \r
-// comparison of reconstructed and MC particle tracks. In addtion, \r
-// it keeps selection cuts used during comparison. The comparison \r
-// information is stored in the ROOT histograms. Analysis of these \r
-// histograms can be done by using Analyse() class function. The result of \r
-// the analysis (histograms) are stored in the output picture_dedx.root file.\r
-//  \r
-// Author: J.Otwinowski 04/02/2008 \r
-//------------------------------------------------------------------------------\r
-\r
-\r
-/*\r
-  //after running analysis, read the file, and get component\r
-  gSystem->Load("libPWG1.so");\r
-  TFile f("Output.root");\r
-  AliComparisonDEdx * comp = (AliComparisonDEdx*)f.Get("AliComparisonDEdx");\r
-\r
-  // analyse comparison data (output stored in pictures_dedx.root)\r
-  comp->Analyse();\r
-\r
-  // TPC track length parameterisation\r
-  TF1 fl("fl","((min(250./(abs(x+0.000001)),250)-90))",0,2);  // length function\r
-  TF1 fl2("fl2","[0]/((min(250./(abs(x+0.000001)),250)-90))^[1]",0,2);\r
-  fl2.SetParameter(1,1);\r
-  fl2.SetParameter(0,1);\r
-*/\r
-\r
-#include <iostream>\r
-\r
-#include "TFile.h"\r
-#include "TCint.h"\r
-#include "TH3F.h"\r
-#include "TH2F.h"\r
-#include "TF1.h"\r
-#include "TProfile.h"\r
-#include "TProfile2D.h"\r
-#include "TGraph2D.h"\r
-#include "TCanvas.h"\r
-#include "TGraph.h"\r
-//\r
-#include "AliESDEvent.h"\r
-#include "AliESD.h"\r
-#include "AliESDfriend.h"\r
-#include "AliESDfriendTrack.h"\r
-#include "AliRecInfoCuts.h" \r
-#include "AliMCInfoCuts.h" \r
-#include "AliLog.h" \r
-//\r
-#include "AliMathBase.h"\r
-#include "AliTreeDraw.h"\r
-//#include "TStatToolkit.h"\r
-\r
-#include "AliMCInfo.h" \r
-#include "AliESDRecInfo.h" \r
-#include "AliComparisonDEdx.h" \r
-\r
-using namespace std;\r
-\r
-ClassImp(AliComparisonDEdx)\r
-\r
-//_____________________________________________________________________________\r
-AliComparisonDEdx::AliComparisonDEdx():\r
-  TNamed("AliComparisonDEdx","AliComparisonDEdx"),\r
-\r
-  // dEdx \r
-  fTPCSignalNormTan(0), \r
-  fTPCSignalNormSPhi(0),\r
-  fTPCSignalNormTPhi(0), \r
-  //\r
-  fTPCSignalNormTanSPhi(0),\r
-  fTPCSignalNormTanTPhi(0),\r
-  fTPCSignalNormTanSPt(0), \r
-  \r
-  // Cuts \r
-  fCutsRC(0), \r
-  fCutsMC(0),\r
-  fMCPtMin(0),\r
-  fMCAbsTanThetaMax(0),\r
-  fMCPdgCode(0)\r
-{\r
-  InitHisto();\r
-  InitCuts();\r
-}\r
-\r
-//_____________________________________________________________________________\r
-AliComparisonDEdx::~AliComparisonDEdx(){\r
-   \r
-  if(fTPCSignalNormTan)  delete fTPCSignalNormTan; fTPCSignalNormTan=0; \r
-  if(fTPCSignalNormSPhi) delete fTPCSignalNormSPhi; fTPCSignalNormSPhi=0;\r
-  if(fTPCSignalNormTPhi) delete fTPCSignalNormTPhi; fTPCSignalNormTPhi=0;\r
-  //\r
-  if(fTPCSignalNormTanSPhi) delete fTPCSignalNormTanSPhi; fTPCSignalNormTanSPhi=0;\r
-  if(fTPCSignalNormTanTPhi) delete fTPCSignalNormTanTPhi; fTPCSignalNormTanTPhi=0;\r
-  if(fTPCSignalNormTanSPt)  delete fTPCSignalNormTanSPt; fTPCSignalNormTanSPt=0;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AliComparisonDEdx::InitHisto()\r
-{\r
-  // Init histograms\r
-  \r
-  // TPC dEdx\r
-  fTPCSignalNormTan = new TH2F("CdEdxTan","CdEdxTan",50, -2,2,  40,30,70); \r
-  fTPCSignalNormTan->SetXTitle("tan(#theta)");\r
-  fTPCSignalNormTan->SetYTitle("rec. dE/dx / calc. dE/dx");\r
-\r
-  fTPCSignalNormSPhi   = new TH2F("CdEdxSPhi","CdEdxSPhi",10,0.0,1,40,30,70);\r
-  fTPCSignalNormSPhi->SetXTitle("sin(#phi)");\r
-  fTPCSignalNormSPhi->SetYTitle("rec. dE/dx / calc. dE/dx");\r
-\r
-  fTPCSignalNormTPhi   = new TH2F("CdEdxTPhi","CdEdxTPhi",10,0.0,2,40,30,70); \r
-  fTPCSignalNormTPhi->SetXTitle("tan(#phi)");\r
-  fTPCSignalNormTPhi->SetYTitle("rec. dE/dx / calc. dE/dx");\r
-\r
-  fTPCSignalNormTanSPhi= new TH3F("CdEdxTanSPhi","CdEdxTanSPhi",20, -2,2, 10,0.0 ,1,  40,30,70);\r
-  fTPCSignalNormTanSPhi->SetXTitle("tan(#theta)");\r
-  fTPCSignalNormTanSPhi->SetYTitle("sin(#phi)");\r
-  fTPCSignalNormTanSPhi->SetZTitle("rec. dE/dx / calc. dE/dx");\r
-\r
-  fTPCSignalNormTanTPhi= new TH3F("CdEdxTanTPhi","CdEdxTanTPhi",20, -2,2, 10,0.0 ,1,  40,30,70);\r
-  fTPCSignalNormTanTPhi->SetXTitle("tan(#theta)");\r
-  fTPCSignalNormTanTPhi->SetYTitle("tan(#phi)");\r
-  fTPCSignalNormTanTPhi->SetZTitle("rec. dE/dx / calc. dE/dx");\r
-\r
-  fTPCSignalNormTanSPt= new TH3F("CdEdxTanSPt","CdEdxTanSPt",20, -2,2, 10,0.3 ,3, 40,30,70); \r
-  fTPCSignalNormTanSPt->SetXTitle("tan(#theta)");\r
-  fTPCSignalNormTanSPt->SetYTitle("#sqrt{p_{t}}");\r
-  fTPCSignalNormTanSPt->SetZTitle("rec. dE/dx / calc. dE/dx");\r
-}\r
-\r
-void AliComparisonDEdx::InitCuts()\r
-{\r
-  // Init cuts\r
-  if(!fCutsMC) \r
-    AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");\r
-  if(!fCutsRC) \r
-    AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AliComparisonDEdx::Process(AliMCInfo* infoMC, AliESDRecInfo *infoRC){\r
-\r
-  // Fill dE/dx  comparison information\r
-  \r
-  Float_t mcpt = infoMC->GetParticle().Pt();\r
-  Float_t tantheta = TMath::Tan(infoMC->GetParticle().Theta()-TMath::Pi()*0.5);\r
-  Float_t mprim = infoMC->GetPrim();\r
-\r
-  // distance to Prim. vertex \r
-  const Double_t* dv = infoMC->GetVDist(); \r
-\r
-  Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r
-  \r
-  // Check selection cuts \r
-  if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r
-  if (!isPrim) return;\r
-  if (infoRC->GetStatus(1)!=3) return;\r
-  if (!infoRC->GetESDtrack()) return;  \r
-  if (infoRC->GetESDtrack()->GetTPCNcls()<fCutsRC->GetMinNClustersTPC()) return;\r
-  if (!infoRC->GetESDtrack()->GetConstrainedParam()) return;\r
-  //if (mprim>1.4) return;\r
-  //if (mprim<0.5) return;\r
-  if (mprim > fCutsMC->GetMaxTPCSignal()) return;\r
-  if (mprim < fCutsMC->GetMinTPCSignal()) return;\r
-  if (infoRC->GetESDtrack()->GetTPCsignalN()<fCutsRC->GetMinTPCsignalN()) return;\r
-  //\r
-  Float_t ratio = infoRC->GetESDtrack()->GetTPCsignal()/infoMC->GetPrim();\r
-  Float_t sphi =  infoRC->GetESDtrack()->GetInnerParam()->GetSnp();\r
-  Float_t tphi =  sphi/TMath::Sqrt(1-sphi*sphi);\r
-\r
-  if (TMath::Abs(infoMC->GetParticle().GetPdgCode()) != GetMCPdgCode()) return;\r
-  //if (mcpt>0.5) {\r
-  if (mcpt > GetMCPtMin()) {\r
-    fTPCSignalNormTan->Fill(tantheta,ratio);    // only subset\r
-  }\r
-\r
-  //if (TMath::Abs(tantheta)<0.5){\r
-  if (TMath::Abs(tantheta) < GetMCAbsTanThetaMax()){\r
-    fTPCSignalNormSPhi->Fill(sphi,ratio);       // only subset\r
-    fTPCSignalNormTPhi->Fill(tphi,ratio);       // only subset\r
-  }\r
-  fTPCSignalNormTanSPhi->Fill(tantheta,sphi,ratio);    \r
-  fTPCSignalNormTanTPhi->Fill(tantheta,tphi,ratio);    \r
-  fTPCSignalNormTanSPt->Fill(tantheta,TMath::Sqrt(mcpt),ratio);\r
-}\r
-\r
-//_____________________________________________________________________________\r
-Long64_t AliComparisonDEdx::Merge(TCollection* list) \r
-{\r
-  // Merge list of objects (needed by PROOF)\r
-\r
-  if (!list)\r
-  return 0;\r
-\r
-  if (list->IsEmpty())\r
-  return 1;\r
-\r
-  TIterator* iter = list->MakeIterator();\r
-  TObject* obj = 0;\r
-\r
-  // collection of generated histograms\r
-  Int_t count=0;\r
-  while((obj = iter->Next()) != 0) \r
-  {\r
-    AliComparisonDEdx* entry = dynamic_cast<AliComparisonDEdx*>(obj);\r
-    if (entry == 0) { \r
-      Error("Add","Attempt to add object of class: %s to a %s",\r
-         obj->ClassName(),this->ClassName());\r
-      return -1;\r
-  }\r
-\r
-  fTPCSignalNormTan->Add(entry->fTPCSignalNormTan);\r
-  fTPCSignalNormSPhi->Add(entry->fTPCSignalNormSPhi);\r
-  fTPCSignalNormTPhi->Add(entry->fTPCSignalNormTPhi);\r
-  //\r
-  fTPCSignalNormTanSPhi->Add(entry->fTPCSignalNormTanSPhi);\r
-  fTPCSignalNormTanTPhi->Add(entry->fTPCSignalNormTanTPhi);\r
-  fTPCSignalNormTanSPt->Add(entry->fTPCSignalNormTanSPt);\r
-\r
-  count++;\r
-  }\r
-\r
-return count;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AliComparisonDEdx::Exec(AliMCInfo* infoMC, AliESDRecInfo *infoRC)\r
-{\r
-  // Process comparison information\r
-  Process(infoMC,infoRC);\r
-}\r
-\r
-//_____________________________________________________________________________\r
-TH1F* AliComparisonDEdx::MakeResol(TH2F * his, Int_t integ, Bool_t type)\r
-{\r
-  // Make resolution histograms\r
-  TH1F *hisr, *hism;\r
-  if (!gPad) new TCanvas;\r
-  hisr = AliTreeDraw::CreateResHistoI(his,&hism,integ);\r
-  if (type) return hism;\r
-  else \r
-    return hisr;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AliComparisonDEdx::Analyse()\r
-{\r
-  // Analyse output histograms\r
-  \r
-  AliComparisonDEdx * comp=this;\r
-  TH1F *hiss=0;\r
-  TGraph2D * gr=0;\r
-\r
-  TFile *fp = new TFile("pictures_dedx.root","recreate");\r
-  fp->cd();\r
-\r
-  TCanvas * c = new TCanvas("TPCdedx","TPC dedx");\r
-  c->cd();\r
-\r
-  hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,0);\r
-  hiss->SetXTitle("Tan(#theta)");\r
-  hiss->SetYTitle("#sigma_{dEdx}");\r
-  hiss->Draw();\r
-  hiss->Write("TPCdEdxResolTan");\r
-  //\r
-  hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,1); \r
-  hiss->SetXTitle("Tan(#theta)");\r
-  hiss->SetYTitle("<dEdx>");\r
-  hiss->Draw(); \r
-  hiss->Write("TPCdEdxMeanTan");\r
-  //\r
-  gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,4);\r
-  gr->GetXaxis()->SetTitle("Tan(#theta)");\r
-  gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");\r
-  gr->GetZaxis()->SetTitle("<dEdx>");\r
-  gr->Draw("colz"); \r
-  gr->GetHistogram()->Write("TPCdEdxMeanTanPt_1");\r
-  //\r
-  gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,5);\r
-  gr->GetXaxis()->SetTitle("Tan(#theta)");\r
-  gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");\r
-  gr->GetZaxis()->SetTitle("#sigma_{dEdx}");\r
-  gr->Draw("colz"); \r
-  gr->GetHistogram()->Write("TPCdEdxMeanTanPt_2");\r
-\r
-  fp->Close();\r
-}\r
+//------------------------------------------------------------------------------
+// Implementation of AliComparisonDEdx class. It keeps information from 
+// comparison of reconstructed and MC particle tracks. In addtion, 
+// it keeps selection cuts used during comparison. The comparison 
+// information is stored in the ROOT histograms. Analysis of these 
+// histograms can be done by using Analyse() class function. The result of 
+// the analysis (histograms/graphs) are stored in the folder which is 
+// a data of AliComparisonDEdx.
+//  
+// Author: J.Otwinowski 04/02/2008 
+//------------------------------------------------------------------------------
+
+/*
+  // after running comparison task, read the file, and get component
+  gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
+  LoadMyLibs();
+  TFile f("Output.root");
+  AliComparisonDEdx * compObj = (AliComparisonDEdx*)f.Get("AliComparisonDEdx");
+
+  // Analyse comparison data
+  compObj->Analyse();
+
+  // the output histograms/graphs will be stored in the folder "folderDEdx" 
+  compObj->GetAnalysisFolder()->ls("*");
+
+  // user can save whole comparison object (or only folder with anlysed histograms) 
+  // in the seperate output file (e.g.)
+  TFile fout("Analysed_DEdx.root"."recreate");
+  compObj->Write(); // compObj->GetAnalysisFolder()->Write();
+  fout.Close();
+
+*/
+
+#include <iostream>
+
+#include "TFile.h"
+#include "TCint.h"
+#include "TH3F.h"
+#include "TH2F.h"
+#include "TF1.h"
+#include "TProfile.h"
+#include "TProfile2D.h"
+#include "TGraph2D.h"
+#include "TCanvas.h"
+#include "TGraph.h"
+//
+#include "AliESDEvent.h"
+#include "AliESD.h"
+#include "AliESDfriend.h"
+#include "AliESDfriendTrack.h"
+#include "AliRecInfoCuts.h" 
+#include "AliMCInfoCuts.h" 
+#include "AliLog.h" 
+//
+#include "AliMathBase.h"
+#include "AliTreeDraw.h"
+//#include "TStatToolkit.h"
+
+#include "AliMCInfo.h" 
+#include "AliESDRecInfo.h" 
+#include "AliComparisonDEdx.h" 
+
+using namespace std;
+
+ClassImp(AliComparisonDEdx)
+
+//_____________________________________________________________________________
+AliComparisonDEdx::AliComparisonDEdx():
+//  TNamed("AliComparisonDEdx","AliComparisonDEdx"),
+  AliComparisonObject("AliComparisonDEdx"),
+
+  // dEdx 
+  fTPCSignalNormTan(0), 
+  fTPCSignalNormSPhi(0),
+  fTPCSignalNormTPhi(0), 
+  //
+  fTPCSignalNormTanSPhi(0),
+  fTPCSignalNormTanTPhi(0),
+  fTPCSignalNormTanSPt(0), 
+  
+  // Cuts 
+  fCutsRC(0), 
+  fCutsMC(0),
+  fMCPtMin(0),
+  fMCAbsTanThetaMax(0),
+  fMCPdgCode(0),
+
+  // histogram folder 
+  fAnalysisFolder(0)
+{
+  Init();
+}
+
+//_____________________________________________________________________________
+AliComparisonDEdx::~AliComparisonDEdx(){
+   
+  if(fTPCSignalNormTan)  delete fTPCSignalNormTan; fTPCSignalNormTan=0; 
+  if(fTPCSignalNormSPhi) delete fTPCSignalNormSPhi; fTPCSignalNormSPhi=0;
+  if(fTPCSignalNormTPhi) delete fTPCSignalNormTPhi; fTPCSignalNormTPhi=0;
+  //
+  if(fTPCSignalNormTanSPhi) delete fTPCSignalNormTanSPhi; fTPCSignalNormTanSPhi=0;
+  if(fTPCSignalNormTanTPhi) delete fTPCSignalNormTanTPhi; fTPCSignalNormTanTPhi=0;
+  if(fTPCSignalNormTanSPt)  delete fTPCSignalNormTanSPt; fTPCSignalNormTanSPt=0;
+
+  if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
+}
+
+//_____________________________________________________________________________
+void AliComparisonDEdx::Init()
+{
+  // Init histograms
+  
+  // TPC dEdx
+  fTPCSignalNormTan = new TH2F("CdEdxTan","CdEdxTan",50, -2,2,  40,30,70); 
+  fTPCSignalNormTan->SetXTitle("tan(#theta)");
+  fTPCSignalNormTan->SetYTitle("rec. dE/dx / calc. dE/dx");
+
+  fTPCSignalNormSPhi   = new TH2F("CdEdxSPhi","CdEdxSPhi",10,0.0,1,40,30,70);
+  fTPCSignalNormSPhi->SetXTitle("sin(#phi)");
+  fTPCSignalNormSPhi->SetYTitle("rec. dE/dx / calc. dE/dx");
+
+  fTPCSignalNormTPhi   = new TH2F("CdEdxTPhi","CdEdxTPhi",10,0.0,2,40,30,70); 
+  fTPCSignalNormTPhi->SetXTitle("tan(#phi)");
+  fTPCSignalNormTPhi->SetYTitle("rec. dE/dx / calc. dE/dx");
+
+  fTPCSignalNormTanSPhi= new TH3F("CdEdxTanSPhi","CdEdxTanSPhi",20, -2,2, 10,0.0 ,1,  40,30,70);
+  fTPCSignalNormTanSPhi->SetXTitle("tan(#theta)");
+  fTPCSignalNormTanSPhi->SetYTitle("sin(#phi)");
+  fTPCSignalNormTanSPhi->SetZTitle("rec. dE/dx / calc. dE/dx");
+
+  fTPCSignalNormTanTPhi= new TH3F("CdEdxTanTPhi","CdEdxTanTPhi",20, -2,2, 10,0.0 ,1,  40,30,70);
+  fTPCSignalNormTanTPhi->SetXTitle("tan(#theta)");
+  fTPCSignalNormTanTPhi->SetYTitle("tan(#phi)");
+  fTPCSignalNormTanTPhi->SetZTitle("rec. dE/dx / calc. dE/dx");
+
+  fTPCSignalNormTanSPt= new TH3F("CdEdxTanSPt","CdEdxTanSPt",20, -2,2, 10,0.3 ,3, 40,30,70); 
+  fTPCSignalNormTanSPt->SetXTitle("tan(#theta)");
+  fTPCSignalNormTanSPt->SetYTitle("#sqrt{p_{t}}");
+  fTPCSignalNormTanSPt->SetZTitle("rec. dE/dx / calc. dE/dx");
+
+  // Init cuts
+  if(!fCutsMC) 
+    AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
+  if(!fCutsRC) 
+    AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
+
+    // init folder
+    fAnalysisFolder = CreateFolder("folderDEdx","Analysis de/dx Folder");
+}
+
+//_____________________________________________________________________________
+void AliComparisonDEdx::Process(AliMCInfo* infoMC, AliESDRecInfo *infoRC){
+
+  // Fill dE/dx  comparison information
+  
+  Float_t mcpt = infoMC->GetParticle().Pt();
+  Float_t tantheta = TMath::Tan(infoMC->GetParticle().Theta()-TMath::Pi()*0.5);
+  Float_t mprim = infoMC->GetPrim();
+
+  // distance to Prim. vertex 
+  const Double_t* dv = infoMC->GetVDist(); 
+
+  Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();
+  
+  // Check selection cuts 
+  if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; 
+  if (!isPrim) return;
+  if (infoRC->GetStatus(1)!=3) return;
+  if (!infoRC->GetESDtrack()) return;  
+  if (infoRC->GetESDtrack()->GetTPCNcls()<fCutsRC->GetMinNClustersTPC()) return;
+  if (!infoRC->GetESDtrack()->GetConstrainedParam()) return;
+  //if (mprim>1.4) return;
+  //if (mprim<0.5) return;
+  if (mprim > fCutsMC->GetMaxTPCSignal()) return;
+  if (mprim < fCutsMC->GetMinTPCSignal()) return;
+  if (infoRC->GetESDtrack()->GetTPCsignalN()<fCutsRC->GetMinTPCsignalN()) return;
+  //
+  Float_t ratio = infoRC->GetESDtrack()->GetTPCsignal()/infoMC->GetPrim();
+  Float_t sphi =  infoRC->GetESDtrack()->GetInnerParam()->GetSnp();
+  Float_t tphi =  sphi/TMath::Sqrt(1-sphi*sphi);
+
+  if (TMath::Abs(infoMC->GetParticle().GetPdgCode()) != GetMCPdgCode()) return;
+  //if (mcpt>0.5) {
+  if (mcpt > GetMCPtMin()) {
+    fTPCSignalNormTan->Fill(tantheta,ratio);    // only subset
+  }
+
+  //if (TMath::Abs(tantheta)<0.5){
+  if (TMath::Abs(tantheta) < GetMCAbsTanThetaMax()){
+    fTPCSignalNormSPhi->Fill(sphi,ratio);       // only subset
+    fTPCSignalNormTPhi->Fill(tphi,ratio);       // only subset
+  }
+  fTPCSignalNormTanSPhi->Fill(tantheta,sphi,ratio);    
+  fTPCSignalNormTanTPhi->Fill(tantheta,tphi,ratio);    
+  fTPCSignalNormTanSPt->Fill(tantheta,TMath::Sqrt(mcpt),ratio);
+}
+
+//_____________________________________________________________________________
+Long64_t AliComparisonDEdx::Merge(TCollection* list) 
+{
+  // Merge list of objects (needed by PROOF)
+
+  if (!list)
+  return 0;
+
+  if (list->IsEmpty())
+  return 1;
+
+  TIterator* iter = list->MakeIterator();
+  TObject* obj = 0;
+
+  // collection of generated histograms
+  Int_t count=0;
+  while((obj = iter->Next()) != 0) 
+  {
+    AliComparisonDEdx* entry = dynamic_cast<AliComparisonDEdx*>(obj);
+    if (entry == 0) continue;
+
+    fTPCSignalNormTan->Add(entry->fTPCSignalNormTan);
+    fTPCSignalNormSPhi->Add(entry->fTPCSignalNormSPhi);
+    fTPCSignalNormTPhi->Add(entry->fTPCSignalNormTPhi);
+    //
+    fTPCSignalNormTanSPhi->Add(entry->fTPCSignalNormTanSPhi);
+    fTPCSignalNormTanTPhi->Add(entry->fTPCSignalNormTanTPhi);
+    fTPCSignalNormTanSPt->Add(entry->fTPCSignalNormTanSPt);
+
+    count++;
+  }
+
+return count;
+}
+
+//_____________________________________________________________________________
+void AliComparisonDEdx::Exec(AliMCInfo* infoMC, AliESDRecInfo *infoRC)
+{
+  // Process comparison information
+  Process(infoMC,infoRC);
+}
+
+//_____________________________________________________________________________
+TH1F* AliComparisonDEdx::MakeResol(TH2F * his, Int_t integ, Bool_t type)
+{
+  // Make resolution histograms
+  TH1F *hisr, *hism;
+  if (!gPad) new TCanvas;
+  hisr = AliTreeDraw::CreateResHistoI(his,&hism,integ);
+  if (type) return hism;
+  else 
+    return hisr;
+}
+
+//_____________________________________________________________________________
+void AliComparisonDEdx::Analyse()
+{
+  // Analyze comparison information and store output histograms
+  // in the folder "folderDEdx"
+  //
+
+  TH1::AddDirectory(kFALSE);
+  
+  AliComparisonDEdx * comp=this;
+  TObjArray *aFolderObj = new TObjArray;
+
+  TH1F *hiss=0;
+  TGraph2D * gr=0;
+
+  // write results in the folder 
+  TCanvas * c = new TCanvas("can","TPC dedx");
+  c->cd();
+
+  hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,0);
+  hiss->SetXTitle("Tan(#theta)");
+  hiss->SetYTitle("#sigma_{dEdx}");
+  hiss->Draw();
+  hiss->SetName("TPCdEdxResolTan");
+
+  aFolderObj->Add(hiss);
+  //
+  hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,1); 
+  hiss->SetXTitle("Tan(#theta)");
+  hiss->SetYTitle("<dEdx>");
+  hiss->Draw(); 
+  hiss->SetName("TPCdEdxMeanTan");
+
+  aFolderObj->Add(hiss);
+  //
+  gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,4);
+  gr->GetXaxis()->SetTitle("Tan(#theta)");
+  gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");
+  gr->GetZaxis()->SetTitle("<dEdx>");
+  gr->SetName("TPCdEdxMeanTanPt_1");
+  gr->GetHistogram()->Draw("colz"); 
+
+  gr->GetHistogram()->SetName("TPCdEdxMeanTanPt_1");
+  aFolderObj->Add(gr->GetHistogram());
+  //
+  gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,5);
+  gr->GetXaxis()->SetTitle("Tan(#theta)");
+  gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");
+  gr->GetZaxis()->SetTitle("#sigma_{dEdx}");
+  gr->SetName("TPCdEdxMeanTanPt_2");
+  gr->GetHistogram()->Draw("colz"); 
+
+  gr->GetHistogram()->SetName("TPCdEdxMeanTanPt_2");
+  aFolderObj->Add(gr->GetHistogram());
+
+  // export objects to analysis folder
+  fAnalysisFolder = ExportToFolder(aFolderObj);
+
+  // delete only TObjrArray
+  if(aFolderObj) delete aFolderObj;
+}
+
+//_____________________________________________________________________________
+TFolder* AliComparisonDEdx::ExportToFolder(TObjArray * array) 
+{
+  // recreate folder avery time and export objects to new one
+  //
+  AliComparisonDEdx * comp=this;
+  TFolder *folder = comp->GetAnalysisFolder();
+
+  TString name, title;
+  TFolder *newFolder = 0;
+  Int_t i = 0;
+  Int_t size = array->GetSize();
+
+  if(folder) { 
+     // get name and title from old folder
+     name = folder->GetName();  
+     title = folder->GetTitle();  
+
+        // delete old one
+     delete folder;
+
+        // create new one
+     newFolder = CreateFolder(name.Data(),title.Data());
+     newFolder->SetOwner();
+
+        // add objects to folder
+     while(i < size) {
+          newFolder->Add(array->At(i));
+          i++;
+        }
+  }
+
+return newFolder;
+}
+
+
+//_____________________________________________________________________________
+TFolder* AliComparisonDEdx::CreateFolder(TString name,TString title) { 
+// create folder for analysed histograms
+TFolder *folder = 0;
+  folder = new TFolder(name.Data(),title.Data());
+
+  return folder;
+}
+