]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGPP/AliAnalysisTaskFilteredTree.cxx
coverity fix
[u/mrichter/AliRoot.git] / PWGPP / AliAnalysisTaskFilteredTree.cxx
index 0455647398a4bab0ac719eba6b785b6fcbdf470c..69ac7d1f58314343d6e7e96081d6530976898ccd 100644 (file)
@@ -22,6 +22,7 @@
 #include "TTreeStream.h"\r
 #include "TTree.h"\r
 #include "TH1F.h"\r
+#include "TH3.h"\r
 #include "TCanvas.h"\r
 #include "TList.h"\r
 #include "TObjArray.h"\r
@@ -44,6 +45,7 @@
 #include "AliESDInputHandler.h"\r
 #include "AliESDVertex.h"\r
 #include "AliTracker.h"\r
+#include "AliVTrack.h"\r
 #include "AliGeomManager.h"\r
 \r
 #include "AliCentrality.h"\r
@@ -73,6 +75,8 @@ AliAnalysisTaskFilteredTree::AliAnalysisTaskFilteredTree(const char *name)
   , fPitList(0)\r
   , fUseMCInfo(kFALSE)\r
   , fUseESDfriends(kFALSE)\r
+  , fReducePileUp(kTRUE)\r
+  , fFillTree(kTRUE)\r
   , fFilteredTreeEventCuts(0)\r
   , fFilteredTreeAcceptanceCuts(0)\r
   , fFilteredTreeRecAcceptanceCuts(0)\r
@@ -91,6 +95,15 @@ AliAnalysisTaskFilteredTree::AliAnalysisTaskFilteredTree(const char *name)
   , fLaserTree(0)\r
   , fMCEffTree(0)\r
   , fCosmicPairsTree(0)\r
+  , fPtResPhiPtTPC(0)\r
+  , fPtResPhiPtTPCc(0)\r
+  , fPtResPhiPtTPCITS(0)\r
+  , fPtResEtaPtTPC(0)\r
+  , fPtResEtaPtTPCc(0)\r
+  , fPtResEtaPtTPCITS(0)\r
+  , fPtResCentPtTPC(0)\r
+  , fPtResCentPtTPCc(0)\r
+  , fPtResCentPtTPCITS(0)\r
 {\r
   // Constructor\r
 \r
@@ -101,18 +114,26 @@ AliAnalysisTaskFilteredTree::AliAnalysisTaskFilteredTree(const char *name)
   DefineOutput(4, TTree::Class());\r
   DefineOutput(5, TTree::Class());\r
   DefineOutput(6, TTree::Class());\r
+  DefineOutput(7, TList::Class());\r
 }\r
 \r
 //_____________________________________________________________________________\r
 AliAnalysisTaskFilteredTree::~AliAnalysisTaskFilteredTree()\r
 {\r
-  if(fOutput) delete fOutput;  fOutput =0; \r
-  if(fTreeSRedirector) delete fTreeSRedirector;  fTreeSRedirector =0; \r
-\r
-  if(fFilteredTreeEventCuts) delete fFilteredTreeEventCuts; fFilteredTreeEventCuts=NULL; \r
-  if(fFilteredTreeAcceptanceCuts) delete fFilteredTreeAcceptanceCuts; fFilteredTreeAcceptanceCuts=NULL;\r
-  if(fFilteredTreeRecAcceptanceCuts) delete fFilteredTreeRecAcceptanceCuts; fFilteredTreeRecAcceptanceCuts=NULL;  \r
-  if(fEsdTrackCuts) delete fEsdTrackCuts; fEsdTrackCuts=NULL;\r
+  //the output trees not to be deleted in case of proof analysis\r
+  //Bool_t deleteTrees=kTRUE;\r
+  //if ((AliAnalysisManager::GetAnalysisManager()))\r
+  //{\r
+  //  if (AliAnalysisManager::GetAnalysisManager()->GetAnalysisType() == \r
+  //           AliAnalysisManager::kProofAnalysis)\r
+  //    deleteTrees=kFALSE;\r
+  //}\r
+  //if (deleteTrees) delete fTreeSRedirector;\r
+\r
+  delete fFilteredTreeEventCuts;\r
+  delete fFilteredTreeAcceptanceCuts;\r
+  delete fFilteredTreeRecAcceptanceCuts;\r
+  delete fEsdTrackCuts;\r
 }\r
 \r
 //____________________________________________________________________________\r
@@ -134,38 +155,112 @@ void AliAnalysisTaskFilteredTree::UserCreateOutputObjects()
 {\r
   // Create histograms\r
   // Called once\r
-  fOutput = new TList;\r
-  fOutput->SetOwner();\r
 \r
   //\r
-  // create temporary file for output tree\r
-  fTreeSRedirector = new TTreeSRedirector("jotwinow_Temp_Trees.root");\r
+  //get the output file to make sure the trees will be associated to it\r
+  OpenFile(1);\r
+  fTreeSRedirector = new TTreeSRedirector();\r
  \r
-\r
-\r
   //\r
   // Create trees\r
-  fHighPtTree = new TTree;\r
-  fV0Tree = new TTree;\r
-  fdEdxTree = new TTree;\r
-  fLaserTree = new TTree;\r
-  fMCEffTree = new TTree;\r
-  fCosmicPairsTree = new TTree;\r
-\r
-  fOutput->Add(fHighPtTree);\r
-  fOutput->Add(fV0Tree);\r
-  fOutput->Add(fdEdxTree);\r
-  fOutput->Add(fLaserTree);\r
-  fOutput->Add(fMCEffTree);\r
-  fOutput->Add(fCosmicPairsTree);\r
-\r
-  PostData(1,fHighPtTree);\r
-  PostData(2,fV0Tree);\r
+  fV0Tree = ((*fTreeSRedirector)<<"V0s").GetTree();\r
+  fHighPtTree = ((*fTreeSRedirector)<<"highPt").GetTree();\r
+  fdEdxTree = ((*fTreeSRedirector)<<"dEdx").GetTree();\r
+  fLaserTree = ((*fTreeSRedirector)<<"Laser").GetTree();\r
+  fMCEffTree = ((*fTreeSRedirector)<<"MCEffTree").GetTree();\r
+  fCosmicPairsTree = ((*fTreeSRedirector)<<"CosmicPairs").GetTree();\r
+\r
+\r
+\r
+\r
+  // histogram booking\r
+\r
+  Double_t minPt = 0.1; \r
+  Double_t maxPt = 100.; \r
+  Int_t nbinsPt = 30; \r
+\r
+  Double_t logminPt = TMath::Log10(minPt);\r
+  Double_t logmaxPt = TMath::Log10(maxPt);\r
+  Double_t binwidth = (logmaxPt-logminPt)/nbinsPt;\r
+  Double_t *binsPt =  new Double_t[nbinsPt+1];\r
+  binsPt[0] = minPt;\r
+  for (Int_t i=1;i<=nbinsPt;i++) {\r
+    binsPt[i] = minPt + TMath::Power(10,logminPt+i*binwidth);\r
+  }\r
+\r
+  // 1pT resol cov matrix bins\r
+  Double_t min1PtRes = 0.; \r
+  Double_t max1PtRes = 0.3; \r
+  Int_t nbins1PtRes = 300; \r
+  Double_t bins1PtRes[301];\r
+  for (Int_t i=0;i<=nbins1PtRes;i++) {\r
+    bins1PtRes[i] = min1PtRes + i*(max1PtRes-min1PtRes)/nbins1PtRes;\r
+  }\r
+\r
+  // phi bins\r
+  Double_t minPhi = 0.; \r
+  Double_t maxPhi = 6.5; \r
+  Int_t nbinsPhi = 100; \r
+  Double_t binsPhi[101];\r
+    for (Int_t i=0;i<=nbinsPhi;i++) {\r
+    binsPhi[i] = minPhi + i*(maxPhi-minPhi)/nbinsPhi;\r
+  }\r
+\r
+  // eta bins\r
+  Double_t minEta = -1.;\r
+  Double_t maxEta = 1.;\r
+  Int_t nbinsEta = 20;\r
+  Double_t binsEta[21];\r
+  for (Int_t i=0;i<=nbinsEta;i++) {\r
+    binsEta[i] = minEta + i*(maxEta-minEta)/nbinsEta;\r
+  }\r
+\r
+  // mult bins\r
+  Double_t minCent = 0.;\r
+  Double_t maxCent = 100;\r
+  Int_t nbinsCent = 20;\r
+  Double_t binsCent[101];\r
+  for (Int_t i=0;i<=nbinsCent;i++) {\r
+    binsCent[i] = minCent + i*(maxCent-minCent)/nbinsCent;\r
+  }\r
+  \r
+  fPtResPhiPtTPC = new TH3D("fPtResPhiPtTPC","pt rel. resolution from cov. matrix TPC tracks",nbinsPt,binsPt,nbinsPhi,binsPhi,nbins1PtRes,bins1PtRes);\r
+  fPtResPhiPtTPCc = new TH3D("fPtResPhiPtTPCc","pt rel. resolution from cov. matrix TPC constrained tracks",nbinsPt,binsPt,nbinsPhi,binsPhi,nbins1PtRes,bins1PtRes);\r
+  fPtResPhiPtTPCITS = new TH3D("fPtResPhiPtTPCITS","pt rel. resolution from cov. matrix TPC+ITS tracks",nbinsPt,binsPt,nbinsPhi,binsPhi,nbins1PtRes,bins1PtRes);\r
+  \r
+fPtResEtaPtTPC = new TH3D("fPtResEtaPtTPC","pt rel. resolution from cov. matrix TPC tracks",nbinsPt,binsPt,nbinsEta,binsEta,nbins1PtRes,bins1PtRes);\r
+  fPtResEtaPtTPCc = new TH3D("fPtResEtaPtTPCc","pt rel. resolution from cov. matrix TPC constrained tracks",nbinsPt,binsPt,nbinsEta,binsEta,nbins1PtRes,bins1PtRes);\r
+  fPtResEtaPtTPCITS = new TH3D("fPtResEtaPtTPCITS","pt rel. resolution from cov. matrix TPC+ITS tracks",nbinsPt,binsPt,nbinsEta,binsEta,nbins1PtRes,bins1PtRes);\r
\r
+fPtResCentPtTPC = new TH3D("fPtResCentPtTPC","pt rel. resolution from cov. matrix TPC tracks",nbinsPt,binsPt,nbinsCent,binsCent,nbins1PtRes,bins1PtRes);\r
+  fPtResCentPtTPCc = new TH3D("fPtResCentPtTPCc","pt rel. resolution from cov. matrix TPC constrained tracks",nbinsPt,binsPt,nbinsCent,binsCent,nbins1PtRes,bins1PtRes);\r
+  fPtResCentPtTPCITS = new TH3D("fPtResCentPtTPCITS","pt rel. resolution from cov. matrix TPC+ITS tracks",nbinsPt,binsPt,nbinsCent,binsCent,nbins1PtRes,bins1PtRes);\r
+\r
+  \r
+  fOutput = new TList; \r
+  if(!fOutput) return;\r
+  fOutput->SetOwner();\r
+\r
+  fOutput->Add(fPtResPhiPtTPC);\r
+  fOutput->Add(fPtResPhiPtTPCc);\r
+  fOutput->Add(fPtResPhiPtTPCITS);\r
+  fOutput->Add(fPtResEtaPtTPC);\r
+  fOutput->Add(fPtResEtaPtTPCc);\r
+  fOutput->Add(fPtResEtaPtTPCITS);\r
+  fOutput->Add(fPtResCentPtTPC);\r
+  fOutput->Add(fPtResCentPtTPCc);\r
+  fOutput->Add(fPtResCentPtTPCITS);\r
+\r
+  // post data to outputs\r
+\r
+  PostData(1,fV0Tree);\r
+  PostData(2,fHighPtTree);\r
   PostData(3,fdEdxTree);\r
   PostData(4,fLaserTree);\r
   PostData(5,fMCEffTree);\r
   PostData(6,fCosmicPairsTree);\r
\r
+\r
+  PostData(7,fOutput);\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -182,14 +277,17 @@ void AliAnalysisTaskFilteredTree::UserExec(Option_t *)
     return;\r
   }\r
 \r
-  // MC event\r
-  if(fUseMCInfo) {\r
-    fMC = MCEvent();\r
-    if (!fMC) {\r
-      Printf("ERROR: MC event not available");\r
-      return;\r
-    }\r
-  }\r
+  //// MC event\r
+  //if(fUseMCInfo) {\r
+  //  fMC = MCEvent();\r
+  //  if (!fMC) {\r
+  //    Printf("ERROR: MC event not available");\r
+  //    return;\r
+  //  }\r
+  //}\r
+  \r
+  //if MC info available - use it.\r
+  fMC = MCEvent();\r
 \r
   if(fUseESDfriends) {\r
     fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
@@ -212,7 +310,7 @@ void AliAnalysisTaskFilteredTree::UserExec(Option_t *)
   ProcessdEdx(fESD,fMC,fESDfriend);\r
 \r
   if (fProcessCosmics) { ProcessCosmics(fESD); }\r
-  if(IsUseMCInfo()) { ProcessMCEff(fESD,fMC,fESDfriend); }\r
+  if(fMC) { ProcessMCEff(fESD,fMC,fESDfriend);}\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -334,6 +432,24 @@ void AliAnalysisTaskFilteredTree::ProcessCosmics(AliESDEvent *const event)
       // vertex\r
       // TPC-ITS tracks\r
       //\r
+\r
+      //fCosmicPairsTree->Branch("fileName",&fileName,32000,0);\r
+      //fCosmicPairsTree->Branch("runNumber",&runNumber,"runNumber/I");\r
+      //fCosmicPairsTree->Branch("timeStamp",&timeStamp,"timeStamp/I");\r
+      //fCosmicPairsTree->Branch("eventNumber",&eventNumber,"eventNumber/I");\r
+      //fCosmicPairsTree->Branch("triggerMask",&triggerMask,32000,0);\r
+      //fCosmicPairsTree->Branch("triggerClass",&triggerClass,32000,0);\r
+      //fCosmicPairsTree->Branch("magField",&magField,"magField/F");\r
+      //fCosmicPairsTree->Branch("ntracksSPD",&ntracksSPD,"ntracksSPD/I");\r
+      //fCosmicPairsTree->Branch("ntracksTPC",&ntracksTPC,"ntracksTPC/I");\r
+      //fCosmicPairsTree->Branch("vertexSPD",vertexSPD,32000,0);\r
+      //fCosmicPairsTree->Branch("vertexTPC",vertexTPC,32000,0);\r
+      //fCosmicPairsTree->Branch("track0",track0,32000,0);\r
+      //fCosmicPairsTree->Branch("track1",track1,32000,0);\r
+      //\r
+      //fCosmicPairsTree->Fill();\r
+\r
+      if(!fFillTree) return;\r
       if(!fTreeSRedirector) return;\r
          (*fTreeSRedirector)<<"CosmicPairs"<<\r
            "fileName.="<<&fileName<<         // file name\r
@@ -428,13 +544,8 @@ void AliAnalysisTaskFilteredTree::Process(AliESDEvent *const esdEvent, AliMCEven
   TArrayF vtxMC(3);\r
 \r
   Int_t multMCTrueTracks = 0;\r
-  if(IsUseMCInfo())\r
+  if(mcEvent)\r
   {\r
-    //\r
-    if(!mcEvent) {\r
-      AliDebug(AliLog::kError, "mcEvent not available");\r
-      return;\r
-    }\r
     // get MC event header\r
     header = mcEvent->Header();\r
     if (!header) {\r
@@ -459,7 +570,6 @@ void AliAnalysisTaskFilteredTree::Process(AliESDEvent *const esdEvent, AliMCEven
     // multipliticy of all MC primary tracks\r
     // in Zv, pt and eta ranges)\r
     multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
-\r
   } // end bUseMC\r
 \r
   // get reconstructed vertex  \r
@@ -480,7 +590,7 @@ void AliAnalysisTaskFilteredTree::Process(AliESDEvent *const esdEvent, AliMCEven
   Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
   //printf("isEventOK %d, isEventTriggered %d, status %d, vz %f \n",isEventOK, isEventTriggered, vtxESD->GetStatus(), vtxESD->GetZv());\r
   //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
-\r
+  Int_t ntracks = esdEvent->GetNumberOfTracks();\r
 \r
   // check event cuts\r
   if(isEventOK && isEventTriggered)\r
@@ -505,9 +615,9 @@ void AliAnalysisTaskFilteredTree::Process(AliESDEvent *const esdEvent, AliMCEven
     vert[1] = vtxESD->GetYv();\r
     vert[2] = vtxESD->GetZv();\r
     Int_t mult = vtxESD->GetNContributors();\r
-    Double_t bz = esdEvent->GetMagneticField();\r
-    Double_t runNumber = esdEvent->GetRunNumber();\r
-    Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+    Float_t bz = esdEvent->GetMagneticField();\r
+    Int_t runNumber = esdEvent->GetRunNumber();\r
+    Int_t evtTimeStamp = esdEvent->GetTimeStamp();\r
     Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
 \r
     // high pT tracks\r
@@ -539,20 +649,44 @@ void AliAnalysisTaskFilteredTree::Process(AliESDEvent *const esdEvent, AliMCEven
       // TPC-ITS tracks\r
       //\r
       TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
+\r
+      //fHighPtTree->Branch("fileName",&fileName,32000,0);\r
+      //fHighPtTree->Branch("runNumber",&runNumber,"runNumber/I");\r
+      //fHighPtTree->Branch("evtTimeStamp",&evtTimeStamp,"evtTimeStamp/I");\r
+      //fHighPtTree->Branch("evtNumberInFile",&evtNumberInFile,"evtNumberInFile/I");\r
+      //fHighPtTree->Branch("triggerClass",&triggerClass,32000,0);\r
+      //fHighPtTree->Branch("Bz",&bz,"Bz/F");\r
+      //fHighPtTree->Branch("vtxESD",vtxESD,32000,0);\r
+      //fHighPtTree->Branch("IRtot",&ir1,"IRtot/I");\r
+      //fHighPtTree->Branch("IRint2",&ir2,"IRint2/I");\r
+      //fHighPtTree->Branch("mult",&mult,"mult/I");\r
+      //fHighPtTree->Branch("esdTrack",track,32000,0);\r
+      //fHighPtTree->Branch("centralityF",&centralityF,"centralityF/F");\r
+\r
+      //fHighPtTree->Fill();\r
+\r
+      //Double_t vtxX=vtxESD->GetX();\r
+      //Double_t vtxY=vtxESD->GetY();\r
+      //Double_t vtxZ=vtxESD->GetZ();\r
+      if(!fFillTree) return;\r
       if(!fTreeSRedirector) return;\r
       (*fTreeSRedirector)<<"highPt"<<\r
-        "fileName.="<<&fileName<<\r
+        "fileName.="<<&fileName<<            \r
         "runNumber="<<runNumber<<\r
         "evtTimeStamp="<<evtTimeStamp<<\r
         "evtNumberInFile="<<evtNumberInFile<<\r
        "triggerClass="<<&triggerClass<<      //  trigger\r
-        "Bz="<<bz<<\r
+        "Bz="<<bz<<                           //  magnetic field\r
         "vtxESD.="<<vtxESD<<\r
-       "IRtot="<<ir1<<\r
+       "ntracksESD="<<ntracks<<              // number of tracks in the ESD\r
+      //  "vtxESDx="<<vtxX<<\r
+      //  "vtxESDy="<<vtxY<<\r
+      //  "vtxESDz="<<vtxZ<<\r
+       "IRtot="<<ir1<<                      // interaction record history info\r
        "IRint2="<<ir2<<\r
-        "mult="<<mult<<\r
+        "mult="<<mult<<                      // multiplicity of tracks pointing to the primary vertex\r
         "esdTrack.="<<track<<\r
-        "centralityF="<<centralityF<<\r
+        "centralityF="<<centralityF<<       \r
         "\n";\r
     }\r
   }\r
@@ -594,12 +728,23 @@ void AliAnalysisTaskFilteredTree::ProcessLaser(AliESDEvent *const esdEvent, AliM
        \r
     if(countLaserTracks > 100) \r
     {      \r
-      Double_t runNumber = esdEvent->GetRunNumber();\r
-      Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+      Int_t runNumber = esdEvent->GetRunNumber();\r
+      Int_t evtTimeStamp = esdEvent->GetTimeStamp();\r
       Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
-      Double_t bz = esdEvent->GetMagneticField();\r
+      Float_t bz = esdEvent->GetMagneticField();\r
       TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
 \r
+      //fLaserTree->Branch("fileName",&fileName,32000,0);\r
+      //fLaserTree->Branch("runNumber",&runNumber,"runNumber/I");\r
+      //fLaserTree->Branch("evtTimeStamp",&evtTimeStamp,"evtTimeStamp/I");\r
+      //fLaserTree->Branch("evtNumberInFile",&evtNumberInFile,"evtNumberInFile/I");\r
+      //fLaserTree->Branch("triggerClass",&triggerClass,32000,0);\r
+      //fLaserTree->Branch("Bz",&bz,"Bz/F");\r
+      //fLaserTree->Branch("multTPCtracks",&countLaserTracks,"multTPCtracks/I");\r
+\r
+      //fLaserTree->Fill();\r
+\r
+      if(!fFillTree) return;\r
       if(!fTreeSRedirector) return;\r
       (*fTreeSRedirector)<<"Laser"<<\r
         "fileName.="<<&fileName<<\r
@@ -675,13 +820,13 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
     isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
 \r
     physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
-    if(!physicsSelection) return;\r
+    if(!physicsSelection) {AliInfo("no physics selection"); return;}\r
     //SetPhysicsTriggerSelection(physicsSelection);\r
 \r
     if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
       // set trigger (V0AND)\r
       triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
-      if(!triggerAnalysis) return;\r
+      if(!triggerAnalysis) {AliInfo("no trigger analysis");return;}\r
       isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
     }\r
   }\r
@@ -698,13 +843,8 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
   TArrayF vtxMC(3);\r
 \r
   Int_t multMCTrueTracks = 0;\r
-  if(IsUseMCInfo())\r
+  if(mcEvent)\r
   {\r
-    //\r
-    if(!mcEvent) {\r
-      AliDebug(AliLog::kError, "mcEvent not available");\r
-      return;\r
-    }\r
     // get MC event header\r
     header = mcEvent->Header();\r
     if (!header) {\r
@@ -742,6 +882,7 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
      vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
   }\r
   else {\r
+    AliInfo("no ESD vertex");\r
        return;\r
   }\r
 \r
@@ -760,7 +901,7 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
     //\r
     AliESDHeader *esdHeader = 0;\r
     esdHeader = esdEvent->GetHeader();\r
-    if(!esdHeader) return;\r
+    if(!esdHeader) {AliInfo("no esdHeader");return;}\r
     //Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s\r
     //Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval\r
     //\r
@@ -773,9 +914,9 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
     vert[1] = vtxESD->GetYv();\r
     vert[2] = vtxESD->GetZv();\r
     Int_t mult = vtxESD->GetNContributors();\r
-    Double_t bz = esdEvent->GetMagneticField();\r
-    Double_t runNumber = esdEvent->GetRunNumber();\r
-    Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+    Float_t bz = esdEvent->GetMagneticField();\r
+    Int_t runNumber = esdEvent->GetRunNumber();\r
+    Int_t evtTimeStamp = esdEvent->GetTimeStamp();\r
     Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
 \r
     // high pT tracks\r
@@ -966,12 +1107,18 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
       Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;\r
 \r
       AliTrackReference *refTPCIn = NULL;\r
+      AliTrackReference *refTPCOut = NULL;\r
       AliTrackReference *refITS = NULL;\r
+      AliTrackReference *refTRD = NULL;\r
+      AliTrackReference *refTOF = NULL;\r
+      AliTrackReference *refEMCAL = NULL;\r
+      AliTrackReference *refPHOS = NULL;\r
+      Int_t nrefTPC=0, nrefTRD=0, nrefTOF=0, nrefITS=0, nrefEMCAL=0, nrefPHOS=0;\r
 \r
       Bool_t isOKtrackInnerC3 = kFALSE;\r
       AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
 \r
-      if(IsUseMCInfo()\r
+      if(mcEvent\r
       {\r
         if(!stack) return;\r
 \r
@@ -1011,7 +1158,7 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
        //\r
         TParticle *part=0;\r
         TClonesArray *trefs=0;\r
-        Int_t status = mcEvent->GetParticleAndTR(track->GetTPCLabel(), part, trefs);\r
+        Int_t status = mcEvent->GetParticleAndTR(TMath::Abs(track->GetTPCLabel()), part, trefs);\r
 \r
        if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.) \r
        {\r
@@ -1024,8 +1171,9 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
             AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);\r
 \r
              // Ref. in the middle ITS \r
-            if(ref && ref->DetectorId()==AliTrackReference::kITS)\r
+            if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kITS)\r
             {\r
+             nrefITS++;\r
              if(!refITS && countITS==2) {\r
                refITS = ref;\r
                //printf("refITS %p \n",refITS);\r
@@ -1034,14 +1182,48 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
             }\r
 \r
             // TPC\r
-            if(ref && ref->DetectorId()==AliTrackReference::kTPC)\r
+            if(ref && ref->Label()==label  && ref->DetectorId()==AliTrackReference::kTPC)\r
             {\r
+             nrefTPC++;\r
+             refTPCOut=ref;\r
              if(!refTPCIn) {\r
                refTPCIn = ref;\r
                //printf("refTPCIn %p \n",refTPCIn);\r
                //break;\r
              }\r
             }\r
+            // TRD\r
+            if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTRD)\r
+            {\r
+             nrefTRD++;\r
+             if(!refTRD) {\r
+               refTRD = ref;\r
+             }\r
+            }\r
+            // TOF\r
+            if(ref && ref->Label()==label  && ref->DetectorId()==AliTrackReference::kTOF)\r
+            {\r
+             nrefTOF++;\r
+             if(!refTOF) {\r
+               refTOF = ref;\r
+             }\r
+            }\r
+            // EMCAL\r
+            if(ref && ref->Label()==label  && ref->DetectorId()==AliTrackReference::kEMCAL)\r
+            {\r
+             nrefEMCAL++;\r
+             if(!refEMCAL) {\r
+               refEMCAL = ref;\r
+             }\r
+            }\r
+            // PHOS\r
+ //            if(ref && ref->Label()==label  && ref->DetectorId()==AliTrackReference::kPHOS)\r
+//             {\r
+//           nrefPHOS++;\r
+//           if(!refPHOS) {\r
+//             refPHOS = ref;\r
+//           }\r
+//             }\r
          }\r
 \r
           // transform inner params to TrackRef\r
@@ -1075,67 +1257,202 @@ void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCE
       \r
       if(isOKtpcInnerC  && isOKtrackInnerC) dumpToTree = kTRUE;\r
       if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;\r
-      if(fUseMCInfo     && isOKtrackInnerC3) dumpToTree = kTRUE;\r
+      if(mcEvent && isOKtrackInnerC3) dumpToTree = kTRUE;\r
       TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
-\r
+      if (fReducePileUp){  \r
+       //\r
+       // 18.03 - Reduce pile-up chunks, done outside of the ESDTrackCuts for 2012/2013 data pile-up about 95 % of tracks\r
+       // Done only in case no MC info \r
+       //\r
+       Float_t dcaTPC[2];\r
+       track->GetImpactParametersTPC(dcaTPC[0],dcaTPC[1]);\r
+       Bool_t isRoughPrimary = TMath::Abs(dcaTPC[1])<10;\r
+       Bool_t hasOuter=(track->IsOn(AliVTrack::kITSin))||(track->IsOn(AliVTrack::kTOFout))||(track->IsOn(AliVTrack::kTRDin));\r
+       Bool_t keepPileUp=gRandom->Rndm()<0.05;\r
+       if ( (!hasOuter) && (!isRoughPrimary) && (!keepPileUp)){\r
+         dumpToTree=kFALSE;\r
+       }\r
+      }\r
+      /////////////////\r
+      //book keeping of created dummy objects (to avoid NULL in trees)\r
+      Bool_t newvtxESD=kFALSE;\r
+      Bool_t newtrack=kFALSE;\r
+      Bool_t newtpcInnerC=kFALSE;\r
+      Bool_t newtrackInnerC=kFALSE;\r
+      Bool_t newtrackInnerC2=kFALSE;\r
+      Bool_t newouterITSc=kFALSE;\r
+      Bool_t newtrackInnerC3=kFALSE;\r
+      Bool_t newrefTPCIn=kFALSE;\r
+      Bool_t newrefITS=kFALSE;\r
+      Bool_t newparticle=kFALSE;\r
+      Bool_t newparticleMother=kFALSE;\r
+      Bool_t newparticleTPC=kFALSE;\r
+      Bool_t newparticleMotherTPC=kFALSE;\r
+      Bool_t newparticleITS=kFALSE;\r
+      Bool_t newparticleMotherITS=kFALSE;\r
+      \r
+      //check that the vertex is there and that it is OK, \r
+      //i.e. no null member arrays, otherwise a problem with merging\r
+      //later on.\r
+      //this is a very ugly hack!\r
+      if (!vtxESD)\r
+      {\r
+        AliInfo("fixing the ESD vertex for streaming");\r
+        vtxESD=new AliESDVertex(); \r
+        //vtxESD->SetNContributors(1);\r
+        //UShort_t pindices[1]; pindices[0]=0;\r
+        //vtxESD->SetIndices(1,pindices);\r
+        //vtxESD->SetNContributors(0);\r
+        newvtxESD=kTRUE;\r
+      }\r
       //\r
-      if(fTreeSRedirector && dumpToTree) \r
+      if (!track) {track=new AliESDtrack();newtrack=kTRUE;}\r
+      if (!tpcInnerC) {tpcInnerC=new AliExternalTrackParam();newtpcInnerC=kTRUE;}\r
+      if (!trackInnerC) {trackInnerC=new AliExternalTrackParam();newtrackInnerC=kTRUE;}\r
+      if (!trackInnerC2) {trackInnerC2=new AliExternalTrackParam();newtrackInnerC2=kTRUE;}\r
+      if (!outerITSc) {outerITSc=new AliExternalTrackParam();newouterITSc=kTRUE;}\r
+      if (!trackInnerC3) {trackInnerC3=new AliExternalTrackParam();newtrackInnerC3=kTRUE;}\r
+      if (mcEvent)\r
+      {\r
+        if (!refTPCIn) {refTPCIn=new AliTrackReference(); newrefTPCIn=kTRUE;}\r
+        if (!refITS) {refITS=new AliTrackReference();newrefITS=kTRUE;}\r
+        if (!particle) {particle=new TParticle(); newparticle=kTRUE;}\r
+        if (!particleMother) {particleMother=new TParticle();newparticleMother=kTRUE;}\r
+        if (!particleTPC) {particleTPC=new TParticle();newparticleTPC=kTRUE;}\r
+        if (!particleMotherTPC) {particleMotherTPC=new TParticle();newparticleMotherTPC=kTRUE;}\r
+        if (!particleITS) {particleITS=new TParticle();newparticleITS=kTRUE;}\r
+        if (!particleMotherITS) {particleMotherITS=new TParticle();newparticleMotherITS=kTRUE;}\r
+      }\r
+      /////////////////////////\r
+\r
+      //Double_t vtxX=vtxESD->GetX();\r
+      //Double_t vtxY=vtxESD->GetY();\r
+      //Double_t vtxZ=vtxESD->GetZ();\r
+\r
+      AliESDVertex* pvtxESD = (AliESDVertex*)vtxESD->Clone();\r
+      AliESDtrack* ptrack=(AliESDtrack*)track->Clone();\r
+      AliExternalTrackParam* ptpcInnerC = (AliExternalTrackParam*)tpcInnerC->Clone();\r
+      AliExternalTrackParam* ptrackInnerC = (AliExternalTrackParam*)trackInnerC->Clone();\r
+      AliExternalTrackParam* ptrackInnerC2 = (AliExternalTrackParam*)trackInnerC2->Clone();\r
+      AliExternalTrackParam* pouterITSc = (AliExternalTrackParam*)outerITSc->Clone();\r
+      AliExternalTrackParam* ptrackInnerC3 = (AliExternalTrackParam*)trackInnerC3->Clone();\r
+      Int_t ntracks = esdEvent->GetNumberOfTracks();\r
+      \r
+      // fill histograms\r
+      FillHistograms(ptrack, ptpcInnerC, mult, (Double_t)chi2(0,0));\r
+\r
+      if(fTreeSRedirector && dumpToTree && fFillTree) \r
       {\r
+\r
         (*fTreeSRedirector)<<"highPt"<<\r
-          "fileName.="<<&fileName<<\r
-          "runNumber="<<runNumber<<\r
-          "evtTimeStamp="<<evtTimeStamp<<\r
-          "evtNumberInFile="<<evtNumberInFile<<\r
-         "triggerClass="<<&triggerClass<<      //  trigger\r
-          "Bz="<<bz<<\r
-          "vtxESD.="<<vtxESD<<\r
-         "IRtot="<<ir1<<\r
-         "IRint2="<<ir2<<\r
-          "mult="<<mult<<\r
-          "esdTrack.="<<track<<\r
-          "extTPCInnerC.="<<tpcInnerC<<\r
-          "extInnerParamC.="<<trackInnerC<<\r
-          "extInnerParam.="<<trackInnerC2<<\r
-          "extOuterITS.="<<outerITSc<<\r
-          "extInnerParamRef.="<<trackInnerC3<<\r
-          "refTPCIn.="<<refTPCIn<<\r
-          "refITS.="<<refITS<<\r
-          "chi2TPCInnerC="<<chi2(0,0)<<\r
-          "chi2InnerC="<<chi2trackC(0,0)<<\r
-          "chi2OuterITS="<<chi2OuterITS(0,0)<<\r
-          "centralityF="<<centralityF<<\r
-          "particle.="<<particle<<\r
-                 "particleMother.="<<particleMother<<\r
-          "mech="<<mech<<\r
-          "isPrim="<<isPrim<<\r
-         "isFromStrangess="<<isFromStrangess<<\r
-         "isFromConversion="<<isFromConversion<<\r
-          "isFromMaterial="<<isFromMaterial<<\r
-          "particleTPC.="<<particleTPC<<\r
-                 "particleMotherTPC.="<<particleMotherTPC<<\r
-          "mechTPC="<<mechTPC<<\r
-          "isPrimTPC="<<isPrimTPC<<\r
-         "isFromStrangessTPC="<<isFromStrangessTPC<<\r
-         "isFromConversionTPC="<<isFromConversionTPC<<\r
-          "isFromMaterialTPC="<<isFromMaterialTPC<<\r
-          "particleITS.="<<particleITS<<\r
-                 "particleMotherITS.="<<particleMotherITS<<\r
-          "mechITS="<<mechITS<<\r
-          "isPrimITS="<<isPrimITS<<\r
-         "isFromStrangessITS="<<isFromStrangessITS<<\r
-         "isFromConversionITS="<<isFromConversionITS<<\r
-          "isFromMaterialITS="<<isFromMaterialITS<<\r
-          "\n";\r
+         "fileName.="<<&fileName<<                // name of the chunk file (hopefully full)\r
+         "runNumber="<<runNumber<<                // runNumber\r
+         "evtTimeStamp="<<evtTimeStamp<<          // time stamp of event (in seconds)\r
+         "evtNumberInFile="<<evtNumberInFile<<    // event number\r
+         "triggerClass="<<&triggerClass<<         // trigger class as a string\r
+         "Bz="<<bz<<                              // solenoid magnetic field in the z direction (in kGaus)\r
+         "vtxESD.="<<pvtxESD<<                    // vertexer ESD tracks (can be biased by TPC pileup tracks)\r
+         //"vtxESDx="<<vtxX<<\r
+         //"vtxESDy="<<vtxY<<\r
+         //"vtxESDz="<<vtxZ<<\r
+         "IRtot="<<ir1<<                         // interaction record (trigger) counters - coutner 1\r
+         "IRint2="<<ir2<<                        // interaction record (trigger) coutners - counter 2\r
+         "mult="<<mult<<                         // multiplicity of tracks pointing to the primary vertex\r
+         "ntracks="<<ntracks<<                   // number of the esd tracks (to take into account the pileup in the TPC)\r
+         "esdTrack.="<<ptrack<<                  // esdTrack as used in the physical analysis\r
+         "extTPCInnerC.="<<ptpcInnerC<<          // ??? \r
+         "extInnerParamC.="<<ptrackInnerC<<      // ???\r
+         "extInnerParam.="<<ptrackInnerC2<<      // ???\r
+         "extOuterITS.="<<pouterITSc<<           // ???\r
+         "extInnerParamRef.="<<ptrackInnerC3<<   // ???\r
+         "chi2TPCInnerC="<<chi2(0,0)<<           // chi2   of tracks ???\r
+         "chi2InnerC="<<chi2trackC(0,0)<<        // chi2s  of tracks TPCinner to the combined\r
+         "chi2OuterITS="<<chi2OuterITS(0,0)<<    // chi2s  of tracks TPC at inner wall to the ITSout\r
+         "centralityF="<<centralityF;\r
+        if (mcEvent)\r
+        {\r
+         AliTrackReference refDummy;\r
+         if (!refITS) refITS = &refDummy;\r
+         if (!refTRD) refTRD = &refDummy;\r
+         if (!refTOF) refTOF = &refDummy;\r
+         if (!refEMCAL) refEMCAL = &refDummy;\r
+         if (!refPHOS) refPHOS = &refDummy;\r
+          (*fTreeSRedirector)<<"highPt"<<      \r
+           "nrefITS="<<nrefITS<<              // number of track references in the ITS\r
+           "nrefTPC="<<nrefTPC<<              // number of track references in the TPC\r
+           "nrefTRD="<<nrefTRD<<              // number of track references in the TRD\r
+           "nrefTOF="<<nrefTOF<<              // number of track references in the TOF\r
+           "nrefEMCAL="<<nrefEMCAL<<              // number of track references in the TOF\r
+           "nrefPHOS="<<nrefPHOS<<              // number of track references in the TOF\r
+           "refTPCIn.="<<refTPCIn<<\r
+           "refTPCOut.="<<refTPCOut<<\r
+           "refITS.="<<refITS<<            \r
+           "refTRD.="<<refTRD<<            \r
+           "refTOF.="<<refTOF<<            \r
+           "refEMCAL.="<<refEMCAL<<        \r
+           "refPHOS.="<<refPHOS<<          \r
+           "particle.="<<particle<<\r
+           "particleMother.="<<particleMother<<\r
+           "mech="<<mech<<\r
+           "isPrim="<<isPrim<<\r
+           "isFromStrangess="<<isFromStrangess<<\r
+           "isFromConversion="<<isFromConversion<<\r
+           "isFromMaterial="<<isFromMaterial<<\r
+           "particleTPC.="<<particleTPC<<\r
+           "particleMotherTPC.="<<particleMotherTPC<<\r
+           "mechTPC="<<mechTPC<<\r
+           "isPrimTPC="<<isPrimTPC<<\r
+           "isFromStrangessTPC="<<isFromStrangessTPC<<\r
+           "isFromConversionTPC="<<isFromConversionTPC<<\r
+           "isFromMaterialTPC="<<isFromMaterialTPC<<\r
+           "particleITS.="<<particleITS<<\r
+           "particleMotherITS.="<<particleMotherITS<<\r
+           "mechITS="<<mechITS<<\r
+           "isPrimITS="<<isPrimITS<<\r
+           "isFromStrangessITS="<<isFromStrangessITS<<\r
+           "isFromConversionITS="<<isFromConversionITS<<\r
+           "isFromMaterialITS="<<isFromMaterialITS;\r
         }\r
-      \r
-       if(tpcInnerC) delete tpcInnerC;\r
-       if(trackInnerC) delete trackInnerC;\r
-       if(trackInnerC2) delete trackInnerC2;\r
-       if(outerITSc) delete outerITSc;\r
-       if(trackInnerC3) delete trackInnerC3;\r
+        //finish writing the entry\r
+        AliInfo("writing tree highPt");\r
+        (*fTreeSRedirector)<<"highPt"<<"\n";\r
+      }\r
+\r
+      delete pvtxESD;\r
+      delete ptrack;\r
+      delete ptpcInnerC;\r
+      delete ptrackInnerC;\r
+      delete ptrackInnerC2;\r
+      delete pouterITSc;\r
+      delete ptrackInnerC3;\r
+\r
+      ////////////////////\r
+      //delete the dummy objects we might have created.\r
+      if (newvtxESD) {delete vtxESD; vtxESD=NULL;}\r
+      if (newtrack) {delete track; track=NULL;}\r
+      if (newtpcInnerC) {delete tpcInnerC; tpcInnerC=NULL;}\r
+      if (newtrackInnerC) {delete trackInnerC; trackInnerC=NULL;}\r
+      if (newtrackInnerC2) {delete trackInnerC2; trackInnerC2=NULL;}\r
+      if (newouterITSc) {delete outerITSc; outerITSc=NULL;}\r
+      if (newtrackInnerC3) {delete trackInnerC3; trackInnerC3=NULL;}\r
+      if (newrefTPCIn) {delete refTPCIn; refTPCIn=NULL;}\r
+      if (newrefITS) {delete refITS; refITS=NULL;}\r
+      if (newparticle) {delete particle; particle=NULL;}\r
+      if (newparticleMother) {delete particleMother; particleMother=NULL;}\r
+      if (newparticleTPC) {delete particleTPC; particleTPC=NULL;}\r
+      if (newparticleMotherTPC) {delete particleMotherTPC; particleMotherTPC=NULL;}\r
+      if (newparticleITS) {delete particleITS; particleITS=NULL;}\r
+      if (newparticleMotherITS) {delete particleMotherITS; particleMotherITS=NULL;}\r
+      ///////////////\r
+\r
+      delete tpcInnerC;\r
+      delete trackInnerC;\r
+      delete trackInnerC2;\r
+      delete outerITSc;\r
+      delete trackInnerC3;\r
     }\r
   }\r
-  \r
+\r
 }\r
 \r
 \r
@@ -1144,13 +1461,14 @@ void AliAnalysisTaskFilteredTree::ProcessMCEff(AliESDEvent *const esdEvent, AliM
 {\r
   //\r
   // Fill tree for efficiency studies MC only\r
+  AliInfo("we start!");\r
 \r
   if(!esdEvent) {\r
     AliDebug(AliLog::kError, "esdEvent not available");\r
     return;\r
   }\r
 \r
-   if(!mcEvent) {\r
+  if(!mcEvent) {\r
     AliDebug(AliLog::kError, "mcEvent not available");\r
     return;\r
   }\r
@@ -1177,7 +1495,7 @@ void AliAnalysisTaskFilteredTree::ProcessMCEff(AliESDEvent *const esdEvent, AliM
     Printf("ERROR: Could not receive input handler");\r
     return;\r
   }\r
-   \r
+\r
   // get file name\r
   TTree *chain = (TChain*)GetInputData(0);\r
   if(!chain) { \r
@@ -1215,51 +1533,48 @@ void AliAnalysisTaskFilteredTree::ProcessMCEff(AliESDEvent *const esdEvent, AliM
   TArrayF vtxMC(3);\r
 \r
   Int_t multMCTrueTracks = 0;\r
-  if(IsUseMCInfo())\r
-  {\r
-    //\r
-    if(!mcEvent) {\r
-      AliDebug(AliLog::kError, "mcEvent not available");\r
-      return;\r
-    }\r
-    // get MC event header\r
-    header = mcEvent->Header();\r
-    if (!header) {\r
-      AliDebug(AliLog::kError, "Header not available");\r
-      return;\r
-    }\r
-    // MC particle stack\r
-    stack = mcEvent->Stack();\r
-    if (!stack) {\r
-      AliDebug(AliLog::kError, "Stack not available");\r
-      return;\r
-    }\r
+  //\r
+  if(!mcEvent) {\r
+    AliDebug(AliLog::kError, "mcEvent not available");\r
+    return;\r
+  }\r
+  // get MC event header\r
+  header = mcEvent->Header();\r
+  if (!header) {\r
+    AliDebug(AliLog::kError, "Header not available");\r
+    return;\r
+  }\r
+  // MC particle stack\r
+  stack = mcEvent->Stack();\r
+  if (!stack) {\r
+    AliDebug(AliLog::kError, "Stack not available");\r
+    return;\r
+  }\r
 \r
-    // get MC vertex\r
-    genHeader = header->GenEventHeader();\r
-    if (!genHeader) {\r
-      AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");\r
-      return;\r
-    }\r
-    genHeader->PrimaryVertex(vtxMC);\r
+  // get MC vertex\r
+  genHeader = header->GenEventHeader();\r
+  if (!genHeader) {\r
+    AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");\r
+    return;\r
+  }\r
+  genHeader->PrimaryVertex(vtxMC);\r
 \r
-    // multipliticy of all MC primary tracks\r
-    // in Zv, pt and eta ranges)\r
-    multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
+  // multipliticy of all MC primary tracks\r
+  // in Zv, pt and eta ranges)\r
+  multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
 \r
-  } // end bUseMC\r
 \r
   // get reconstructed vertex  \r
   //const AliESDVertex* vtxESD = 0; \r
   AliESDVertex* vtxESD = 0; \r
   if(GetAnalysisMode() == kTPCAnalysisMode) {\r
-        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();\r
+    vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();\r
   }\r
   else if(GetAnalysisMode() == kTPCITSAnalysisMode) {\r
-     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
+    vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
   }\r
   else {\r
-       return;\r
+    return;\r
   }\r
 \r
   if(!vtxESD) return;\r
@@ -1273,119 +1588,116 @@ void AliAnalysisTaskFilteredTree::ProcessMCEff(AliESDEvent *const esdEvent, AliM
   // check event cuts\r
   if(isEventOK && isEventTriggered)\r
   {\r
-    if(IsUseMCInfo()) \r
+    //if(!stack) return;\r
+\r
+    //\r
+    // MC info\r
+    //\r
+    TParticle *particle=NULL;\r
+    TParticle *particleMother=NULL;\r
+    Int_t mech=-1;\r
+\r
+    // reco event info\r
+    Double_t vert[3] = {0}; \r
+    vert[0] = vtxESD->GetXv();\r
+    vert[1] = vtxESD->GetYv();\r
+    vert[2] = vtxESD->GetZv();\r
+    Int_t mult = vtxESD->GetNContributors();\r
+    Double_t bz = esdEvent->GetMagneticField();\r
+    Double_t runNumber = esdEvent->GetRunNumber();\r
+    Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+    Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+\r
+    // loop over MC stack\r
+    for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc) \r
     {\r
-      if(!stack) return;\r
+      particle = stack->Particle(iMc);\r
+      if (!particle)\r
+        continue;\r
+\r
+      // only charged particles\r
+      if(!particle->GetPDG()) continue;\r
+      Double_t charge = particle->GetPDG()->Charge()/3.;\r
+      if (TMath::Abs(charge) < 0.001)\r
+        continue;\r
+\r
+      // only primary particles\r
+      Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
+      if(!prim) continue;\r
+\r
+      // downscale low-pT particles\r
+      Double_t scalempt= TMath::Min(particle->Pt(),10.);\r
+      Double_t downscaleF = gRandom->Rndm();\r
+      downscaleF *= fLowPtTrackDownscaligF;\r
+      if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
 \r
-      //\r
-      // MC info\r
-      //\r
-      TParticle *particle=NULL;\r
-      TParticle *particleMother=NULL;\r
-      Int_t mech=-1;\r
-\r
-      // reco event info\r
-      Double_t vert[3] = {0}; \r
-      vert[0] = vtxESD->GetXv();\r
-      vert[1] = vtxESD->GetYv();\r
-      vert[2] = vtxESD->GetZv();\r
-      Int_t mult = vtxESD->GetNContributors();\r
-      Double_t bz = esdEvent->GetMagneticField();\r
-      Double_t runNumber = esdEvent->GetRunNumber();\r
-      Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
-      Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+      // is particle in acceptance\r
+      if(!accCuts->AcceptTrack(particle)) continue;\r
 \r
-      // loop over MC stack\r
-      for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc) \r
+      // check if particle reconstructed\r
+      Bool_t isRec = kFALSE;\r
+      Int_t  trackIndex = -1;\r
+      for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
       {\r
-         particle = stack->Particle(iMc);\r
-         if (!particle)\r
-         continue;\r
-\r
-         // only charged particles\r
-         if(!particle->GetPDG()) continue;\r
-         Double_t charge = particle->GetPDG()->Charge()/3.;\r
-         if (TMath::Abs(charge) < 0.001)\r
-         continue;\r
-\r
-         // only primary particles\r
-         Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
-         if(!prim) continue;\r
-\r
-         // downscale low-pT particles\r
-         Double_t scalempt= TMath::Min(particle->Pt(),10.);\r
-         Double_t downscaleF = gRandom->Rndm();\r
-         downscaleF *= fLowPtTrackDownscaligF;\r
-         if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
-\r
-         // is particle in acceptance\r
-         if(!accCuts->AcceptTrack(particle)) continue;\r
-       \r
-         // check if particle reconstructed\r
-         Bool_t isRec = kFALSE;\r
-         Int_t  trackIndex = -1;\r
-         for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
-         {\r
-           \r
-           AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
-           if(!track) continue;\r
-           if(track->Charge()==0) continue;\r
-           if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) \r
-           {\r
-             Int_t label =  TMath::Abs(track->GetLabel());\r
-             if(label == iMc) {\r
-               isRec = kTRUE;\r
-               trackIndex = iTrack;\r
-               break;\r
-             }\r
-           } \r
-         }\r
-\r
-         // Store information in the output tree\r
-         AliESDtrack *recTrack = NULL; \r
-         if(trackIndex>-1)  { \r
-           recTrack = esdEvent->GetTrack(trackIndex); \r
-         } else {\r
-           recTrack = new AliESDtrack(); \r
-         } \r
-\r
-        particleMother = GetMother(particle,stack);\r
-         mech = particle->GetUniqueID();\r
-\r
-         //MC particle track length\r
-         Double_t tpcTrackLength = 0.;\r
-         AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iMc);\r
-         if(mcParticle) {\r
-           Int_t counter;\r
-           tpcTrackLength = mcParticle->GetTPCTrackLength(bz,0.05,counter,3.0);\r
-         } \r
-\r
-\r
-         //\r
-         if(fTreeSRedirector) {\r
-           (*fTreeSRedirector)<<"MCEffTree"<<\r
-           "fileName.="<<&fileName<<\r
-           "triggerClass.="<<&triggerClass<<\r
-           "runNumber="<<runNumber<<\r
-           "evtTimeStamp="<<evtTimeStamp<<\r
-           "evtNumberInFile="<<evtNumberInFile<<\r
-           "Bz="<<bz<<\r
-           "vtxESD.="<<vtxESD<<\r
-           "mult="<<mult<<\r
-           "esdTrack.="<<recTrack<<\r
-           "isRec="<<isRec<<\r
-           "tpcTrackLength="<<tpcTrackLength<<\r
-           "particle.="<<particle<<\r
-                  "particleMother.="<<particleMother<<\r
-           "mech="<<mech<<\r
-           "\n";\r
-         }\r
-\r
-         if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;\r
+\r
+        AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+        if(!track) continue;\r
+        if(track->Charge()==0) continue;\r
+        if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) \r
+        {\r
+          Int_t label =  TMath::Abs(track->GetLabel());\r
+          if(label == iMc) {\r
+            isRec = kTRUE;\r
+            trackIndex = iTrack;\r
+            break;\r
+          }\r
+        } \r
       }\r
+\r
+      // Store information in the output tree\r
+      AliESDtrack *recTrack = NULL; \r
+      if(trackIndex>-1)  { \r
+        recTrack = esdEvent->GetTrack(trackIndex); \r
+      } else {\r
+        recTrack = new AliESDtrack(); \r
+      } \r
+\r
+      particleMother = GetMother(particle,stack);\r
+      mech = particle->GetUniqueID();\r
+\r
+      //MC particle track length\r
+      Double_t tpcTrackLength = 0.;\r
+      AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iMc);\r
+      if(mcParticle) {\r
+        Int_t counter;\r
+        tpcTrackLength = mcParticle->GetTPCTrackLength(bz,0.05,counter,3.0);\r
+      } \r
+\r
+\r
+      //\r
+      if(fTreeSRedirector && fFillTree) {\r
+        (*fTreeSRedirector)<<"MCEffTree"<<\r
+          "fileName.="<<&fileName<<\r
+          "triggerClass.="<<&triggerClass<<\r
+          "runNumber="<<runNumber<<\r
+          "evtTimeStamp="<<evtTimeStamp<<\r
+          "evtNumberInFile="<<evtNumberInFile<<\r
+          "Bz="<<bz<<\r
+          "vtxESD.="<<vtxESD<<\r
+          "mult="<<mult<<\r
+          "esdTrack.="<<recTrack<<\r
+          "isRec="<<isRec<<\r
+          "tpcTrackLength="<<tpcTrackLength<<\r
+          "particle.="<<particle<<\r
+          "particleMother.="<<particleMother<<\r
+          "mech="<<mech<<\r
+          "\n";\r
+      }\r
+\r
+      if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;\r
     }\r
   }\r
-  \r
+\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -1411,7 +1723,7 @@ Bool_t AliAnalysisTaskFilteredTree::IsHighDeDxParticle(AliESDtrack * track) {
 void AliAnalysisTaskFilteredTree::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
 {\r
   //\r
-  // Select real events with V0 (K0s and Lambda) high-pT candidates\r
+  // Select real events with V0 (K0s and Lambda and Gamma) high-pT candidates\r
   //\r
   if(!esdEvent) {\r
     AliDebug(AliLog::kError, "esdEvent not available");\r
@@ -1524,6 +1836,7 @@ void AliAnalysisTaskFilteredTree::ProcessV0(AliESDEvent *const esdEvent, AliMCEv
     if (type==0) continue;   \r
     TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
 \r
+    if(!fFillTree) return;\r
     if(!fTreeSRedirector) return;\r
     (*fTreeSRedirector)<<"V0s"<<\r
       "isDownscaled="<<isDownscaled<<\r
@@ -1646,6 +1959,7 @@ void AliAnalysisTaskFilteredTree::ProcessdEdx(AliESDEvent *const esdEvent, AliMC
       if(!IsHighDeDxParticle(track)) continue;\r
       TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
 \r
+      if(!fFillTree) return;\r
       if(!fTreeSRedirector) return;\r
       (*fTreeSRedirector)<<"dEdx"<<\r
       "fileName.="<<&fileName<<\r
@@ -1798,7 +2112,13 @@ Bool_t AliAnalysisTaskFilteredTree::IsV0Downscaled(AliESDv0 *const v0)
   Double_t scalempt= TMath::Min(maxPt,10.);\r
   Double_t downscaleF = gRandom->Rndm();\r
   downscaleF *= fLowPtV0DownscaligF;\r
-  \r
+  //\r
+  // Special treatment of the gamma conversion pt spectra is softer - \r
+  Double_t mass00=  v0->GetEffMass(0,0);\r
+  const Double_t cutMass=0.2;\r
+  if (TMath::Abs(mass00-0)<cutMass){\r
+    downscaleF/=10.;  // 10 times smaller downscaling for the gamma concersion candidate\r
+  }\r
   //printf("V0 TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);\r
   if (TMath::Exp(2*scalempt)<downscaleF) return kTRUE;\r
   return kFALSE;\r
@@ -1985,76 +2305,85 @@ void AliAnalysisTaskFilteredTree::FinishTaskOutput()
   // locally on working node\r
   //\r
 \r
-  // must be deleted to store trees\r
-  if(fTreeSRedirector)  delete fTreeSRedirector; fTreeSRedirector=0;\r
-\r
-  // open temporary file and copy trees to the ouptut container\r
-\r
-  TChain* chain = 0;\r
-  //\r
-  chain = new TChain("highPt");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    fHighPtTree = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(fHighPtTree) fHighPtTree->Print();\r
-\r
-  //\r
-  chain = new TChain("V0s");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    fV0Tree = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(fV0Tree) fV0Tree->Print();\r
-\r
-  //\r
-  chain = new TChain("dEdx");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    fdEdxTree = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(fdEdxTree) fdEdxTree->Print();\r
-\r
-  //\r
-  chain = new TChain("Laser");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    fLaserTree = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(fLaserTree) fLaserTree->Print();\r
-\r
-  //\r
-  chain = new TChain("MCEffTree");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    fMCEffTree = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(fMCEffTree) fMCEffTree->Print();\r
-\r
-  //\r
-  chain = new TChain("CosmicPairs");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    fCosmicPairsTree = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
+  //// must be deleted to store trees\r
+  //if(fTreeSRedirector)  delete fTreeSRedirector; fTreeSRedirector=0;\r
+\r
+  //// open temporary file and copy trees to the ouptut container\r
+\r
+  //TChain* chain = 0;\r
+  ////\r
+  //chain = new TChain("highPt");\r
+  //if(chain) { \r
+  //  chain->Add("jotwinow_Temp_Trees.root");\r
+  //  fHighPtTree = chain->CopyTree("1");\r
+  //  delete chain; chain=0; \r
+  //}\r
+  //if(fHighPtTree) fHighPtTree->Print();\r
+\r
+  ////\r
+  //chain = new TChain("V0s");\r
+  //if(chain) { \r
+  //  chain->Add("jotwinow_Temp_Trees.root");\r
+  //  fV0Tree = chain->CopyTree("1");\r
+  //  delete chain; chain=0; \r
+  //}\r
+  //if(fV0Tree) fV0Tree->Print();\r
+\r
+  ////\r
+  //chain = new TChain("dEdx");\r
+  //if(chain) { \r
+  //  chain->Add("jotwinow_Temp_Trees.root");\r
+  //  fdEdxTree = chain->CopyTree("1");\r
+  //  delete chain; chain=0; \r
+  //}\r
+  //if(fdEdxTree) fdEdxTree->Print();\r
+\r
+  ////\r
+  //chain = new TChain("Laser");\r
+  //if(chain) { \r
+  //  chain->Add("jotwinow_Temp_Trees.root");\r
+  //  fLaserTree = chain->CopyTree("1");\r
+  //  delete chain; chain=0; \r
+  //}\r
+  //if(fLaserTree) fLaserTree->Print();\r
+\r
+  ////\r
+  //chain = new TChain("MCEffTree");\r
+  //if(chain) { \r
+  //  chain->Add("jotwinow_Temp_Trees.root");\r
+  //  fMCEffTree = chain->CopyTree("1");\r
+  //  delete chain; chain=0; \r
+  //}\r
+  //if(fMCEffTree) fMCEffTree->Print();\r
+\r
+  ////\r
+  //chain = new TChain("CosmicPairs");\r
+  //if(chain) { \r
+  //  chain->Add("jotwinow_Temp_Trees.root");\r
+  //  fCosmicPairsTree = chain->CopyTree("1");\r
+  //  delete chain; chain=0; \r
+  //}\r
+  //if(fCosmicPairsTree) fCosmicPairsTree->Print();  \r
+\r
+  Bool_t deleteTrees=kTRUE;\r
+  if ((AliAnalysisManager::GetAnalysisManager()))\r
+  {\r
+    if (AliAnalysisManager::GetAnalysisManager()->GetAnalysisType() == \r
+             AliAnalysisManager::kProofAnalysis)\r
+      deleteTrees=kFALSE;\r
   }\r
-  if(fCosmicPairsTree) fCosmicPairsTree->Print();  \r
+  if (deleteTrees) delete fTreeSRedirector;\r
+  fTreeSRedirector=NULL;\r
 \r
-\r
-  OpenFile(1);\r
+  //OpenFile(1);\r
 \r
   // Post output data.\r
-  PostData(1, fHighPtTree);\r
-  PostData(2, fV0Tree);\r
-  PostData(3, fdEdxTree);\r
-  PostData(4, fLaserTree);\r
-  PostData(5, fMCEffTree);\r
-  PostData(6, fCosmicPairsTree);\r
+  //PostData(1, fHighPtTree);\r
+  //PostData(2, fV0Tree);\r
+  //PostData(3, fdEdxTree);\r
+  //PostData(4, fLaserTree);\r
+  //PostData(5, fMCEffTree);\r
+  //PostData(6, fCosmicPairsTree);\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -2078,6 +2407,7 @@ void AliAnalysisTaskFilteredTree::Terminate(Option_t *)
     return;\r
   }\r
   */\r
+  \r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -2130,4 +2460,73 @@ Int_t AliAnalysisTaskFilteredTree::GetMCTrueTrackMult(AliMCEvent *const mcEvent,
 return mult;  \r
 }\r
 \r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::FillHistograms(AliESDtrack* const ptrack, AliExternalTrackParam* const ptpcInnerC, const Double_t centralityF, const Double_t chi2TPCInnerC) \r
+{\r
+//\r
+// Fill pT relative resolution histograms for \r
+// TPC only, TPC only constrained to vertex and TPC+ITS tracking\r
+//\r
+   if(!ptrack) return;    \r
+   if(!ptpcInnerC) return;    \r
+\r
+   const AliExternalTrackParam * innerParam = (AliExternalTrackParam *) ptrack->GetInnerParam();\r
+   if(!innerParam) return;\r
+\r
+   Float_t dxy, dz;\r
+   ptrack->GetImpactParameters(dxy,dz);\r
+\r
+// TPC+ITS primary tracks \r
+if( abs(ptrack->Eta())<0.8 && \r
+    ptrack->GetTPCClusterInfo(3,1)>130 && \r
+    ptrack->IsOn(0x40) && \r
+    ptrack->GetTPCclusters(0)>0.0 &&  \r
+    ptrack->GetTPCnclsS()/ptrack->GetTPCclusters(0)<0.2 && \r
+    abs(innerParam->GetX())>0.0 && \r
+    abs(innerParam->GetY()/innerParam->GetX())<0.14 && \r
+    abs(innerParam->GetTgl())<0.85 && \r
+    ptrack->IsOn(0x0004) && \r
+    ptrack->GetNcls(0)>0 &&\r
+    ptrack->GetITSchi2()>0 && \r
+    sqrt(ptrack->GetITSchi2()/ptrack->GetNcls(0))<6 &&\r
+    sqrt(chi2TPCInnerC)<6 &&\r
+    abs(dz)<2.0 && \r
+    abs(dxy)<(0.018+0.035*abs(ptrack->GetSigned1Pt())) )\r
+    {\r
+      fPtResPhiPtTPCITS->Fill(ptrack->Pt(),ptrack->Phi(),1./abs(ptrack->GetSigned1Pt())*TMath::Sqrt(ptrack->GetSigma1Pt2()));\r
+      fPtResEtaPtTPCITS->Fill(ptrack->Pt(),ptrack->Eta(),1./abs(ptrack->GetSigned1Pt())*TMath::Sqrt(ptrack->GetSigma1Pt2()));\r
+      fPtResCentPtTPCITS->Fill(ptrack->Pt(),centralityF,1./abs(ptrack->GetSigned1Pt())*TMath::Sqrt(ptrack->GetSigma1Pt2()));\r
+    }\r
+\r
+// TPC primary tracks \r
+// and TPC constrained primary tracks \r
+\r
+    AliExternalTrackParam *ptpcInner  = (AliExternalTrackParam *) ptrack->GetTPCInnerParam(); \r
+    if(!ptpcInner) return;\r
+\r
+\r
+   Float_t dxyTPC, dzTPC;\r
+   ptrack->GetImpactParametersTPC(dxyTPC,dzTPC);\r
 \r
+if( abs(ptrack->Eta())<0.8 && \r
+    ptrack->GetTPCClusterInfo(3,1)>130 && \r
+    ptrack->IsOn(0x40)&& \r
+    ptrack->GetTPCclusters(0)>0.0 &&  \r
+    ptrack->GetTPCnclsS()/ptrack->GetTPCclusters(0)<0.2 && \r
+    abs(innerParam->GetX())>0.0 && \r
+    abs(innerParam->GetY()/innerParam->GetX())<0.14 && \r
+    abs(innerParam->GetTgl())<0.85 && \r
+    abs(dzTPC)<3.2 && \r
+    abs(dxyTPC)<2.4 )\r
+    {\r
+      // TPC only\r
+      fPtResPhiPtTPC->Fill(ptpcInner->Pt(),ptpcInner->Phi(),1./abs(ptpcInner->GetSigned1Pt())*TMath::Sqrt(ptpcInner->GetSigma1Pt2()));\r
+      fPtResEtaPtTPC->Fill(ptpcInner->Pt(),ptpcInner->Eta(),1./abs(ptpcInner->GetSigned1Pt())*TMath::Sqrt(ptpcInner->GetSigma1Pt2()));\r
+      fPtResCentPtTPC->Fill(ptpcInner->Pt(),centralityF,1./abs(ptpcInner->GetSigned1Pt())*TMath::Sqrt(ptpcInner->GetSigma1Pt2()));\r
+\r
+      // TPC constrained to vertex \r
+      fPtResPhiPtTPCc->Fill(ptpcInnerC->Pt(),ptpcInnerC->Phi(),1./abs(ptpcInnerC->GetSigned1Pt())*TMath::Sqrt(ptpcInnerC->GetSigma1Pt2()));\r
+      fPtResEtaPtTPCc->Fill(ptpcInnerC->Pt(),ptpcInnerC->Eta(),1./abs(ptpcInnerC->GetSigned1Pt())*TMath::Sqrt(ptpcInnerC->GetSigma1Pt2()));\r
+      fPtResCentPtTPCc->Fill(ptpcInnerC->Pt(),centralityF,1./abs(ptpcInnerC->GetSigned1Pt())*TMath::Sqrt(ptpcInnerC->GetSigma1Pt2()));\r
+    }\r
+}\r