]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Class to fill high pT trees (M. Krzewicki)
authorjotwinow <jotwinow@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 19 Oct 2012 15:41:12 +0000 (15:41 +0000)
committerjotwinow <jotwinow@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 19 Oct 2012 15:41:12 +0000 (15:41 +0000)
PWGPP/AliAnalysisTaskFilteredTree.cxx [new file with mode: 0644]
PWGPP/AliAnalysisTaskFilteredTree.h [new file with mode: 0644]
PWGPP/AliFilteredTreeAcceptanceCuts.cxx [new file with mode: 0644]
PWGPP/AliFilteredTreeAcceptanceCuts.h [new file with mode: 0644]
PWGPP/AliFilteredTreeEventCuts.cxx [new file with mode: 0644]
PWGPP/AliFilteredTreeEventCuts.h [new file with mode: 0644]
PWGPP/PWGPPLinkDef.h
PWGPP/macros/AddTaskFilteredTree.C [new file with mode: 0644]

diff --git a/PWGPP/AliAnalysisTaskFilteredTree.cxx b/PWGPP/AliAnalysisTaskFilteredTree.cxx
new file mode 100644 (file)
index 0000000..2f3f263
--- /dev/null
@@ -0,0 +1,2120 @@
+/**************************************************************************\r
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
+*                                                                        *\r
+* Author: The ALICE Off-line Project.                                    *\r
+* Contributors are mentioned in the code where appropriate.              *\r
+*                                                                        *\r
+* Permission to use, copy, modify and distribute this software and its   *\r
+* documentation strictly for non-commercial purposes is hereby granted   *\r
+* without fee, provided that the above copyright notice appears in all   *\r
+* copies and that both the copyright notice and this permission notice   *\r
+* appear in the supporting documentation. The authors make no claims     *\r
+* about the suitability of this software for any purpose. It is          *\r
+* provided "as is" without express or implied warranty.                  *\r
+**************************************************************************/\r
+\r
+#include "iostream"\r
+\r
+#include <TPDGCode.h>\r
+#include <TDatabasePDG.h>\r
+\r
+#include "TChain.h"\r
+#include "TTreeStream.h"\r
+#include "TTree.h"\r
+#include "TH1F.h"\r
+#include "TCanvas.h"\r
+#include "TList.h"\r
+#include "TObjArray.h"\r
+#include "TFile.h"\r
+#include "TMatrixD.h"\r
+#include "TRandom3.h"\r
+\r
+#include "AliHeader.h"  \r
+#include "AliGenEventHeader.h"  \r
+#include "AliInputEventHandler.h"  \r
+#include "AliStack.h"  \r
+#include "AliTrackReference.h"  \r
+\r
+#include "AliPhysicsSelection.h"\r
+#include "AliAnalysisTask.h"\r
+#include "AliAnalysisManager.h"\r
+#include "AliESDEvent.h"\r
+#include "AliESDfriend.h"\r
+#include "AliMCEvent.h"\r
+#include "AliESDInputHandler.h"\r
+#include "AliESDVertex.h"\r
+#include "AliTracker.h"\r
+#include "AliGeomManager.h"\r
+\r
+#include "AliCentrality.h"\r
+#include "AliESDVZERO.h"\r
+#include "AliMultiplicity.h"\r
+\r
+#include "AliESDtrackCuts.h"\r
+#include "AliMCEventHandler.h"\r
+#include "AliFilteredTreeEventCuts.h"\r
+#include "AliFilteredTreeAcceptanceCuts.h"\r
+\r
+#include "AliAnalysisTaskFilteredTree.h"\r
+#include "AliKFParticle.h"\r
+#include "AliESDv0.h"\r
+\r
+using namespace std;\r
+\r
+ClassImp(AliAnalysisTaskFilteredTree)\r
+\r
+//_____________________________________________________________________________\r
+AliAnalysisTaskFilteredTree::AliAnalysisTaskFilteredTree(const char *name) \r
+  : AliAnalysisTaskSE(name)\r
+  , fESD(0)\r
+  , fMC(0)\r
+  , fESDfriend(0)\r
+  , fOutput(0)\r
+  , fPitList(0)\r
+  , fUseMCInfo(kFALSE)\r
+  , fUseESDfriends(kFALSE)\r
+  , fFilteredTreeEventCuts(0)\r
+  , fFilteredTreeAcceptanceCuts(0)\r
+  , fFilteredTreeRecAcceptanceCuts(0)\r
+  , fEsdTrackCuts(0)\r
+  , fTrigger(AliTriggerAnalysis::kMB1) \r
+  , fAnalysisMode(kTPCAnalysisMode) \r
+  , fTreeSRedirector(0)\r
+  , fCentralityEstimator(0)\r
+  , fLowPtTrackDownscaligF(0)\r
+  , fLowPtV0DownscaligF(0)\r
+  , fProcessAll(kFALSE)\r
+  , fProcessCosmics(kFALSE)\r
+  , fHighPtTree(0)\r
+  , fV0Tree(0)\r
+  , fdEdxTree(0)\r
+  , fLaserTree(0)\r
+  , fMCEffTree(0)\r
+  , fCosmicPairsTree(0)\r
+{\r
+  // Constructor\r
+\r
+  // Define input and output slots here\r
+  DefineOutput(1, TTree::Class());\r
+  DefineOutput(2, TTree::Class());\r
+  DefineOutput(3, TTree::Class());\r
+  DefineOutput(4, TTree::Class());\r
+  DefineOutput(5, TTree::Class());\r
+  DefineOutput(6, TTree::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
+}\r
+\r
+//____________________________________________________________________________\r
+Bool_t AliAnalysisTaskFilteredTree::Notify()\r
+{\r
+  static Int_t count = 0;\r
+  count++;\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(chain)\r
+  {\r
+    Printf("Processing %d. file: %s", count, chain->GetCurrentFile()->GetName());\r
+  }\r
+\r
+return kTRUE;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::UserCreateOutputObjects()\r
+{\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
\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
+  PostData(3,fdEdxTree);\r
+  PostData(4,fLaserTree);\r
+  PostData(5,fMCEffTree);\r
+  PostData(6,fCosmicPairsTree);\r
\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::UserExec(Option_t *) \r
+{\r
+  //\r
+  // Called for each event\r
+  //\r
+\r
+  // ESD event\r
+  fESD = (AliESDEvent*) (InputEvent());\r
+  if (!fESD) {\r
+    Printf("ERROR: ESD 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(fUseESDfriends) {\r
+    fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
+      if(!fESDfriend) {\r
+        Printf("ERROR: ESD friends not available");\r
+    }\r
+  }\r
+\r
+  //\r
+  if(fProcessAll) { \r
+    ProcessAll(fESD,fMC,fESDfriend); // all track stages and MC\r
+  }\r
+  else {\r
+    Process(fESD,fMC,fESDfriend);    // only global and TPC tracks\r
+  }\r
+\r
+  //\r
+  ProcessV0(fESD,fMC,fESDfriend);\r
+  ProcessLaser(fESD,fMC,fESDfriend);\r
+  ProcessdEdx(fESD,fMC,fESDfriend);\r
+\r
+  if (fProcessCosmics) { ProcessCosmics(fESD); }\r
+  if(IsUseMCInfo()) { ProcessMCEff(fESD,fMC,fESDfriend); }\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::ProcessCosmics(AliESDEvent *const event)\r
+{\r
+  //\r
+  // Select real events with high-pT tracks \r
+  //\r
+  if(!event) {\r
+    AliDebug(AliLog::kError, "event not available");\r
+    return;\r
+  }\r
+\r
+  // \r
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+  if (!inputHandler)\r
+  {\r
+    Printf("ERROR: Could not receive input handler");\r
+    return;\r
+  }\r
+   \r
+  // get file name\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(!chain) { \r
+    Printf("ERROR: Could not receive input chain");\r
+    return;\r
+  }\r
+  TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+\r
+    // check for cosmic pairs\r
+    //\r
+    // find cosmic pairs trigger by random trigger\r
+    //\r
+    //\r
+    AliESDVertex *vertexSPD =  (AliESDVertex *)event->GetPrimaryVertexSPD();\r
+    AliESDVertex *vertexTPC =  (AliESDVertex *)event->GetPrimaryVertexTPC(); \r
+    const Double_t kMinPt=0.8;\r
+    const Double_t kMinPtMax=0.8;\r
+    const Double_t kMinNcl=50;\r
+    const Double_t kMaxDelta[5]={2,600,0.02,0.02,0.1};\r
+    Int_t ntracks=event->GetNumberOfTracks(); \r
+    //  Float_t dcaTPC[2]={0,0};\r
+    // Float_t covTPC[3]={0,0,0};\r
+\r
+    UInt_t specie = event->GetEventSpecie();  // skip laser events\r
+    if (specie==AliRecoParam::kCalib) return;\r
+  \r
+\r
+\r
+    for (Int_t itrack0=0;itrack0<ntracks;itrack0++) {\r
+      AliESDtrack *track0 = event->GetTrack(itrack0);\r
+      if (!track0) continue;\r
+      if (!track0->IsOn(AliESDtrack::kTPCrefit)) continue;\r
+\r
+      if (TMath::Abs(AliTracker::GetBz())>1 && track0->Pt() < kMinPt) continue;\r
+      if (track0->Pt() < kMinPt) continue;\r
+      if (track0->GetTPCncls() < kMinNcl) continue;\r
+      if (TMath::Abs(track0->GetY())<kMaxDelta[0]) continue; \r
+      if (track0->GetKinkIndex(0)>0) continue;\r
+      const Double_t * par0=track0->GetParameter(); //track param at rhe DCA\r
+      //rm primaries\r
+      //\r
+      //track0->GetImpactParametersTPC(dcaTPC,covTPC);\r
+      //if (TMath::Abs(dcaTPC[0])<kMaxDelta[0]) continue;\r
+      //if (TMath::Abs(dcaTPC[1])<kMaxDelta[0]*2) continue;\r
+      //    const AliExternalTrackParam * trackIn0 = track0->GetInnerParam();\r
+      for (Int_t itrack1=itrack0+1;itrack1<ntracks;itrack1++) {\r
+        AliESDtrack *track1 = event->GetTrack(itrack1);\r
+        if (!track1) continue;  \r
+        if (!track1->IsOn(AliESDtrack::kTPCrefit)) continue;\r
+        if (track1->GetKinkIndex(0)>0) continue;\r
+        if ((TMath::Abs(AliTracker::GetBz())>1) && (track1->Pt() < kMinPt)) continue;\r
+        if (track1->Pt() < kMinPt) continue;\r
+        if (track1->GetTPCncls()<kMinNcl) continue;\r
+        if (TMath::Abs(AliTracker::GetBz())>1 && TMath::Max(track1->Pt(), track0->Pt())<kMinPtMax) continue;\r
+        if (TMath::Abs(track1->GetY())<kMaxDelta[0]) continue;\r
+        //track1->GetImpactParametersTPC(dcaTPC,covTPC);\r
+        //      if (TMath::Abs(dcaTPC[0])<kMaxDelta[0]) continue;\r
+        //if (TMath::Abs(dcaTPC[1])<kMaxDelta[0]*2) continue;\r
+        //\r
+        const Double_t* par1=track1->GetParameter(); //track param at rhe DCA\r
+        //\r
+        Bool_t isPair=kTRUE;\r
+        for (Int_t ipar=0; ipar<5; ipar++){\r
+          if (ipar==4&&TMath::Abs(AliTracker::GetBz())<1) continue; // 1/pt not defined for B field off\r
+          if (TMath::Abs(TMath::Abs(par0[ipar])-TMath::Abs(par1[ipar]))>kMaxDelta[ipar]) isPair=kFALSE;\r
+        }\r
+        if (!isPair) continue;\r
+        if (TMath::Abs(TMath::Abs(track0->GetAlpha()-track1->GetAlpha())-TMath::Pi())>kMaxDelta[2]) isPair=kFALSE;\r
+        //delta with correct sign\r
+        /*\r
+        TCut cut0="abs(t1.fP[0]+t0.fP[0])<2"\r
+        TCut cut3="abs(t1.fP[3]+t0.fP[3])<0.02"\r
+        TCut cut4="abs(t1.fP[4]+t0.fP[4])<0.2"\r
+        */\r
+        if  (TMath::Abs(par0[0]+par1[0])>kMaxDelta[0]) isPair=kFALSE; //delta y   opposite sign\r
+        if  (TMath::Abs(par0[3]+par1[3])>kMaxDelta[3]) isPair=kFALSE; //delta tgl opposite sign\r
+        if  (TMath::Abs(AliTracker::GetBz())>1 && TMath::Abs(par0[4]+par1[4])>kMaxDelta[4]) isPair=kFALSE; //delta 1/pt opposite sign\r
+        if (!isPair) continue;\r
+        TString filename(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());\r
+        Int_t eventNumber = event->GetEventNumberInFile(); \r
+        //Bool_t hasFriend = kFALSE;\r
+        //Bool_t hasITS=(track0->GetNcls(0)+track1->GetNcls(0)>4);\r
+        //printf("DUMPHPTCosmic:%s|%f|%d|%d|%d\n",filename.Data(),(TMath::Min(track0->Pt(),track1->Pt())), eventNumber,hasFriend,hasITS);\r
+        //      const AliExternalTrackParam * trackIn1 = track1->GetInnerParam();      \r
+        //\r
+        //               \r
+        Int_t ntracksSPD = vertexSPD->GetNContributors();\r
+        Int_t ntracksTPC = vertexTPC->GetNContributors();        \r
+        Int_t runNumber     = event->GetRunNumber();        \r
+        Int_t timeStamp    = event->GetTimeStamp();\r
+        ULong64_t triggerMask = event->GetTriggerMask();\r
+        Float_t magField    = event->GetMagneticField();\r
+        TObjString triggerClass = event->GetFiredTriggerClasses().Data();\r
+        \r
+       //\r
+      // Dump to the tree \r
+      // vertex\r
+      // TPC-ITS tracks\r
+      //\r
+      if(!fTreeSRedirector) return;\r
+         (*fTreeSRedirector)<<"CosmicPairs"<<\r
+           "fileName.="<<&fileName<<         // file name\r
+           "runNumber="<<runNumber<<              //  run number           \r
+           "evtTimeStamp="<<timeStamp<<            //  time stamp of event\r
+            "evtNumberInFile="<<eventNumber<<          //  event number            \r
+           "trigger="<<triggerMask<<      //  trigger\r
+           "triggerClass="<<&triggerClass<<      //  trigger\r
+           "Bz="<<magField<<             //  magnetic field\r
+           //\r
+           "multSPD="<<ntracksSPD<<\r
+           "multTPC="<<ntracksTPC<<\r
+           "vertSPD.="<<vertexSPD<<         //primary vertex -SPD\r
+           "vertTPC.="<<vertexTPC<<         //primary vertex -TPC\r
+           "t0.="<<track0<<              //track0\r
+           "t1.="<<track1<<              //track1\r
+           "\n";      \r
+        }\r
+      }\r
+}\r
+\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
+{\r
+  //\r
+  // Select real events with high-pT tracks \r
+  //\r
+  if(!esdEvent) {\r
+    AliDebug(AliLog::kError, "esdEvent not available");\r
+    return;\r
+  }\r
+\r
+  // get selection cuts\r
+  AliFilteredTreeEventCuts *evtCuts = GetEventCuts(); \r
+  AliFilteredTreeAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
+\r
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {\r
+    Printf("ERROR cuts not available");\r
+    return;\r
+  }\r
+\r
+  // trigger selection\r
+  Bool_t isEventTriggered = kTRUE;\r
+  AliPhysicsSelection *physicsSelection = NULL;\r
+  AliTriggerAnalysis* triggerAnalysis = NULL;\r
+\r
+  // \r
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+  if (!inputHandler)\r
+  {\r
+    Printf("ERROR: Could not receive input handler");\r
+    return;\r
+  }\r
+   \r
+  // get file name\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(!chain) { \r
+    Printf("ERROR: Could not receive input chain");\r
+    return;\r
+  }\r
+  TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+  // trigger\r
+  if(evtCuts->IsTriggerRequired())  \r
+  {\r
+    // always MB\r
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
+\r
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
+    if(!physicsSelection) return;\r
+    //SetPhysicsTriggerSelection(physicsSelection);\r
+\r
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
+      // set trigger (V0AND)\r
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
+      if(!triggerAnalysis) return;\r
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+    }\r
+  }\r
+\r
+  // centrality determination\r
+  Float_t centralityF = -1;\r
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();\r
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());\r
+\r
+  // use MC information\r
+  AliHeader* header = 0;\r
+  AliGenEventHeader* genHeader = 0;\r
+  AliStack* stack = 0;\r
+  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
+    // 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
+\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
+  }\r
+  else if(GetAnalysisMode() == kTPCITSAnalysisMode) {\r
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
+  }\r
+  else {\r
+       return;\r
+  }\r
+\r
+  if(!vtxESD) return;\r
+\r
+  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
+\r
+  // check event cuts\r
+  if(isEventOK && isEventTriggered)\r
+  {\r
+\r
+    //\r
+    // get IR information\r
+    //\r
+    AliESDHeader *esdHeader = 0;\r
+    esdHeader = esdEvent->GetHeader();\r
+    if(!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
+    // Use when Peter commit the changes in the header\r
+    Int_t ir1 = 0;\r
+    Int_t ir2 = 0;\r
+\r
+    //\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
+    // high pT tracks\r
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
+    {\r
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+      if(!track) continue;\r
+      if(track->Charge()==0) continue;\r
+      if(!esdTrackCuts->AcceptTrack(track)) continue;\r
+      if(!accCuts->AcceptTrack(track)) continue;\r
+      \r
+      // downscale low-pT tracks\r
+      Double_t scalempt= TMath::Min(track->Pt(),10.);\r
+      Double_t downscaleF = gRandom->Rndm();\r
+      downscaleF *= fLowPtTrackDownscaligF;\r
+      if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
+      //printf("TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);\r
+\r
+      AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());\r
+      if (!tpcInner) continue;\r
+      // transform to the track reference frame \r
+      Bool_t isOK = kFALSE;\r
+      isOK = tpcInner->Rotate(track->GetAlpha());\r
+      isOK = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
+      if(!isOK) continue;\r
+\r
+      // Dump to the tree \r
+      // vertex\r
+      // TPC-ITS tracks\r
+      //\r
+      if(!fTreeSRedirector) return;\r
+      (*fTreeSRedirector)<<"highPt"<<\r
+        "fileName.="<<&fileName<<\r
+        "runNumber="<<runNumber<<\r
+        "evtTimeStamp="<<evtTimeStamp<<\r
+        "evtNumberInFile="<<evtNumberInFile<<\r
+        "Bz="<<bz<<\r
+        "vtxESD.="<<vtxESD<<\r
+       "IRtot="<<ir1<<\r
+       "IRint2="<<ir2<<\r
+        "mult="<<mult<<\r
+        "esdTrack.="<<track<<\r
+        "centralityF="<<centralityF<<\r
+        "\n";\r
+    }\r
+  }\r
+  \r
+}\r
+\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::ProcessLaser(AliESDEvent *const esdEvent, AliMCEvent * const /*mcEvent*/, AliESDfriend *const /*esdFriend*/)\r
+{\r
+  //\r
+  // Process laser events\r
+  //\r
+  if(!esdEvent) {\r
+    AliDebug(AliLog::kError, "esdEvent not available");\r
+    return;\r
+  }\r
+\r
+  // get file name\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(!chain) { \r
+    Printf("ERROR: Could not receive input chain");\r
+    return;\r
+  }\r
+  TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+  // laser events \r
+  const AliESDHeader* esdHeader = esdEvent->GetHeader();\r
+  if(esdHeader && esdHeader->GetEventSpecie()==AliRecoParam::kCalib) \r
+  {\r
+    Int_t countLaserTracks = 0;\r
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
+    {\r
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+      if(!track) continue;\r
+\r
+      if(track->GetTPCInnerParam()) countLaserTracks++;\r
+    }\r
+       \r
+    if(countLaserTracks > 100) \r
+    {      \r
+      Double_t runNumber = esdEvent->GetRunNumber();\r
+      Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+      Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+      Double_t bz = esdEvent->GetMagneticField();\r
+\r
+      if(!fTreeSRedirector) return;\r
+      (*fTreeSRedirector)<<"Laser"<<\r
+        "fileName.="<<&fileName<<\r
+        "runNumber="<<runNumber<<\r
+        "evtTimeStamp="<<evtTimeStamp<<\r
+        "evtNumberInFile="<<evtNumberInFile<<\r
+        "Bz="<<bz<<\r
+        "multTPCtracks="<<countLaserTracks<<\r
+        "\n";\r
+    }\r
+  }\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const esdFriend)\r
+{\r
+  //\r
+  // Select real events with high-pT tracks\r
+  // Calculate and stor in the output tree:\r
+  //  TPC constrained tracks\r
+  //  InnerParams constrained tracks\r
+  //  TPC-ITS tracks\r
+  //  ITSout-InnerParams tracks\r
+  //  chi2 distance between TPC constrained and TPC-ITS tracks\r
+  //  chi2 distance between TPC refitted constrained and TPC-ITS tracks\r
+  //  chi2 distance between ITSout and InnerParams tracks\r
+  //  MC information: \r
+  //   track references at ITSin, TPCin; InnerParam at first TPC track reference, \r
+  //   particle ID, mother ID, production mechanism ...\r
+  // \r
+\r
+  if(!esdEvent) {\r
+    AliDebug(AliLog::kError, "esdEvent not available");\r
+    return;\r
+  }\r
+\r
+  // get selection cuts\r
+  AliFilteredTreeEventCuts *evtCuts = GetEventCuts(); \r
+  AliFilteredTreeAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
+\r
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {\r
+    AliDebug(AliLog::kError, "cuts not available");\r
+    return;\r
+  }\r
+\r
+  // trigger selection\r
+  Bool_t isEventTriggered = kTRUE;\r
+  AliPhysicsSelection *physicsSelection = NULL;\r
+  AliTriggerAnalysis* triggerAnalysis = NULL;\r
+\r
+  // \r
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+  if (!inputHandler)\r
+  {\r
+    Printf("ERROR: Could not receive input handler");\r
+    return;\r
+  }\r
+   \r
+  // get file name\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(!chain) { \r
+    Printf("ERROR: Could not receive input chain");\r
+    return;\r
+  }\r
+  TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+  // trigger\r
+  if(evtCuts->IsTriggerRequired())  \r
+  {\r
+    // always MB\r
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
+\r
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
+    if(!physicsSelection) return;\r
+    //SetPhysicsTriggerSelection(physicsSelection);\r
+\r
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
+      // set trigger (V0AND)\r
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
+      if(!triggerAnalysis) return;\r
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+    }\r
+  }\r
+\r
+  // centrality determination\r
+  Float_t centralityF = -1;\r
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();\r
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());\r
+\r
+  // use MC information\r
+  AliHeader* header = 0;\r
+  AliGenEventHeader* genHeader = 0;\r
+  AliStack* stack = 0;\r
+  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
+    // 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
+\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
+  }\r
+  else if(GetAnalysisMode() == kTPCITSAnalysisMode) {\r
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
+  }\r
+  else {\r
+       return;\r
+  }\r
+\r
+  if(!vtxESD) return;\r
+\r
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
+\r
+\r
+  // check event cuts\r
+  if(isEventOK && isEventTriggered)\r
+  {\r
+    //\r
+    // get IR information\r
+    //\r
+    AliESDHeader *esdHeader = 0;\r
+    esdHeader = esdEvent->GetHeader();\r
+    if(!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
+    Int_t ir1 = 0;\r
+    Int_t ir2 = 0;\r
+\r
+    //\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
+    // high pT tracks\r
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
+    {\r
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+      if(!track) continue;\r
+      if(track->Charge()==0) continue;\r
+      if(!esdTrackCuts->AcceptTrack(track)) continue;\r
+      if(!accCuts->AcceptTrack(track)) continue;\r
+      \r
+      // downscale low-pT tracks\r
+      Double_t scalempt= TMath::Min(track->Pt(),10.);\r
+      Double_t downscaleF = gRandom->Rndm();\r
+      downscaleF *= fLowPtTrackDownscaligF;\r
+      if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
+      //printf("TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);\r
+\r
+      // Dump to the tree \r
+      // vertex\r
+      // TPC constrained tracks\r
+      // InnerParams constrained tracks\r
+      // TPC-ITS tracks\r
+      // ITSout-InnerParams tracks\r
+      // chi2 distance between TPC constrained and TPC-ITS tracks\r
+      // chi2 distance between TPC refitted constrained and TPC-ITS tracks\r
+      // chi2 distance between ITSout and InnerParams tracks\r
+      // MC information\r
+      \r
+      Double_t x[3]; track->GetXYZ(x);\r
+      Double_t b[3]; AliTracker::GetBxByBz(x,b);\r
+\r
+      //\r
+      // Transform TPC inner params to track reference frame\r
+      //\r
+      Bool_t isOKtpcInner = kFALSE;\r
+      AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());\r
+      if (tpcInner) {\r
+        // transform to the track reference frame \r
+        isOKtpcInner = tpcInner->Rotate(track->GetAlpha());\r
+        isOKtpcInner = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
+      }\r
+\r
+      //\r
+      // Constrain TPC inner to vertex\r
+      // clone TPCinner has to be deleted\r
+      //\r
+      Bool_t isOKtpcInnerC = kFALSE;\r
+      AliExternalTrackParam * tpcInnerC = new AliExternalTrackParam(*(track->GetTPCInnerParam()));\r
+      if (tpcInnerC) {\r
+        isOKtpcInnerC = ConstrainTPCInner(tpcInnerC,vtxESD,b);\r
+        isOKtpcInnerC = tpcInnerC->Rotate(track->GetAlpha());\r
+        isOKtpcInnerC = tpcInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
+      }\r
+\r
+      //\r
+      // Constrain TPC refitted tracks at inner TPC wall (InnerParams) to vertex  \r
+      // Clone track InnerParams has to be deleted\r
+      //\r
+      Bool_t isOKtrackInnerC = kFALSE;\r
+      AliExternalTrackParam * trackInnerC =  new AliExternalTrackParam(*(track->GetInnerParam()));\r
+      if (trackInnerC) {\r
+        isOKtrackInnerC = ConstrainTrackInner(trackInnerC,vtxESD,track->GetMass(),b);\r
+        isOKtrackInnerC = trackInnerC->Rotate(track->GetAlpha());\r
+        isOKtrackInnerC = trackInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
+      } \r
+      \r
+      //\r
+      // calculate chi2 between vi and vj vectors\r
+      // with covi and covj covariance matrices\r
+      // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)\r
+      //\r
+      TMatrixD deltaT(5,1), deltaTtrackC(5,1);\r
+      TMatrixD delta(1,5),  deltatrackC(1,5);\r
+      TMatrixD covarM(5,5), covarMtrackC(5,5);\r
+      TMatrixD chi2(1,1);\r
+      TMatrixD chi2trackC(1,1);\r
+\r
+      if(isOKtpcInnerC && isOKtrackInnerC) \r
+      {\r
+        for (Int_t ipar=0; ipar<5; ipar++) {\r
+          deltaT(ipar,0)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+         delta(0,ipar)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+\r
+          deltaTtrackC(ipar,0)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+         deltatrackC(0,ipar)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+\r
+          for (Int_t jpar=0; jpar<5; jpar++) {\r
+           Int_t index=track->GetIndex(ipar,jpar);\r
+           covarM(ipar,jpar)=track->GetCovariance()[index]+tpcInnerC->GetCovariance()[index];\r
+           covarMtrackC(ipar,jpar)=track->GetCovariance()[index]+trackInnerC->GetCovariance()[index];\r
+          }\r
+        }\r
+\r
+        // chi2 distance TPC constrained and TPC+ITS\r
+        TMatrixD covarMInv = covarM.Invert();\r
+        TMatrixD mat2 = covarMInv*deltaT;\r
+        chi2 = delta*mat2; \r
+        //chi2.Print();\r
+\r
+        // chi2 distance TPC refitted constrained and TPC+ITS\r
+        TMatrixD covarMInvtrackC = covarMtrackC.Invert();\r
+        TMatrixD mat2trackC = covarMInvtrackC*deltaTtrackC;\r
+        chi2trackC = deltatrackC*mat2trackC; \r
+        //chi2trackC.Print();\r
+      }\r
+\r
+\r
+      //\r
+      // Propagate ITSout to TPC inner wall \r
+      // and calculate chi2 distance to track (InnerParams)\r
+      //\r
+      const Double_t kTPCRadius=85; \r
+      const Double_t kStep=3; \r
+\r
+      // clone track InnerParams has to be deleted\r
+      Bool_t isOKtrackInnerC2 = kFALSE;\r
+      AliExternalTrackParam *trackInnerC2 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
+      if (trackInnerC2) {\r
+        isOKtrackInnerC2 = AliTracker::PropagateTrackToBxByBz(trackInnerC2,kTPCRadius,track->GetMass(),kStep,kFALSE);\r
+      }\r
+\r
+      Bool_t isOKouterITSc = kFALSE;\r
+      AliExternalTrackParam *outerITSc = NULL;\r
+      TMatrixD chi2OuterITS(1,1);\r
+\r
+      if(esdFriend && esdFriend->TestSkipBit()==kFALSE) \r
+      {\r
+        // propagate ITSout to TPC inner wall\r
+        AliESDfriendTrack *friendTrack = esdFriend->GetTrack(iTrack);\r
+\r
+        if(friendTrack) \r
+       {\r
+          outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut());\r
+          if(outerITSc) \r
+         {\r
+            isOKouterITSc = AliTracker::PropagateTrackToBxByBz(outerITSc,kTPCRadius,track->GetMass(),kStep,kFALSE);\r
+            isOKouterITSc = outerITSc->Rotate(trackInnerC2->GetAlpha());\r
+            isOKouterITSc = outerITSc->PropagateTo(trackInnerC2->GetX(),esdEvent->GetMagneticField());\r
+\r
+           //\r
+            // calculate chi2 between outerITS and innerParams\r
+           // cov without z-coordinate at the moment\r
+           //\r
+            TMatrixD deltaTouterITS(4,1);\r
+            TMatrixD deltaouterITS(1,4);\r
+            TMatrixD covarMouterITS(4,4);\r
+\r
+            if(isOKtrackInnerC2 && isOKouterITSc) {\r
+             Int_t kipar = 0;\r
+             Int_t kjpar = 0;\r
+              for (Int_t ipar=0; ipar<5; ipar++) {\r
+               if(ipar!=1) {\r
+                  deltaTouterITS(kipar,0)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];\r
+                 deltaouterITS(0,kipar)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];\r
+               }\r
+\r
+                kjpar=0;\r
+                for (Int_t jpar=0; jpar<5; jpar++) {\r
+                 Int_t index=outerITSc->GetIndex(ipar,jpar);\r
+                 if(ipar !=1 || jpar!=1) {\r
+                   covarMouterITS(kipar,kjpar)=outerITSc->GetCovariance()[index]+trackInnerC2->GetCovariance()[index];\r
+                 }\r
+                  if(jpar!=1)  kjpar++;\r
+               }\r
+               if(ipar!=1) kipar++;\r
+             }\r
+\r
+              // chi2 distance ITSout and InnerParams\r
+              TMatrixD covarMInvouterITS = covarMouterITS.Invert();\r
+              TMatrixD mat2outerITS = covarMInvouterITS*deltaTouterITS;\r
+              chi2OuterITS = deltaouterITS*mat2outerITS; \r
+              //chi2OuterITS.Print();\r
+           } \r
+          }\r
+        }\r
+      }\r
+\r
+      //\r
+      // MC info\r
+      //\r
+      TParticle *particle=NULL, *particleTPC=NULL, *particleITS=NULL;\r
+      TParticle *particleMother=NULL, *particleMotherTPC=NULL, *particleMotherITS=NULL;\r
+      Int_t mech=-1, mechTPC=-1, mechITS=-1;\r
+      Bool_t isPrim=kFALSE, isPrimTPC=kFALSE, isPrimITS=kFALSE;\r
+      Bool_t isFromStrangess=kFALSE, isFromStrangessTPC=kFALSE, isFromStrangessITS=kFALSE;\r
+      Bool_t isFromConversion=kFALSE, isFromConversionTPC=kFALSE, isFromConversionITS=kFALSE;\r
+      Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;\r
+\r
+      AliTrackReference *refTPCIn = NULL;\r
+      AliTrackReference *refITS = NULL;\r
+\r
+      Bool_t isOKtrackInnerC3 = kFALSE;\r
+      AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
+\r
+      if(IsUseMCInfo()) \r
+      {\r
+        if(!stack) return;\r
+\r
+        //\r
+        // global track\r
+       //\r
+        Int_t label = TMath::Abs(track->GetLabel()); \r
+        particle = stack->Particle(label);\r
+        if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0.)\r
+       {\r
+         particleMother = GetMother(particle,stack);\r
+          mech = particle->GetUniqueID();\r
+          isPrim = stack->IsPhysicalPrimary(label);\r
+         isFromStrangess  = IsFromStrangeness(label,stack);\r
+         isFromConversion = IsFromConversion(label,stack);\r
+          isFromMaterial   = IsFromMaterial(label,stack);\r
+       }\r
+\r
+        //\r
+       // TPC track\r
+       //\r
+       Int_t labelTPC = TMath::Abs(track->GetTPCLabel()); \r
+        particleTPC = stack->Particle(labelTPC);\r
+        if(particleTPC && particleTPC->GetPDG() && particleTPC->GetPDG()->Charge()!=0.)\r
+       {\r
+         particleMotherTPC = GetMother(particleTPC,stack);\r
+          mechTPC = particleTPC->GetUniqueID();\r
+          isPrimTPC = stack->IsPhysicalPrimary(labelTPC);\r
+         isFromStrangessTPC  = IsFromStrangeness(labelTPC,stack);\r
+         isFromConversionTPC = IsFromConversion(labelTPC,stack);\r
+          isFromMaterialTPC   = IsFromMaterial(labelTPC,stack);\r
+       }\r
+\r
+        //\r
+        // store first track reference\r
+       // for TPC track\r
+       //\r
+        TParticle *part=0;\r
+        TClonesArray *trefs=0;\r
+        Int_t status = mcEvent->GetParticleAndTR(track->GetTPCLabel(), part, trefs);\r
+\r
+       if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.) \r
+       {\r
+         Int_t nTrackRef = trefs->GetEntries();\r
+         //printf("nTrackRef %d \n",nTrackRef);\r
+\r
+          Int_t countITS = 0;\r
+         for (Int_t iref = 0; iref < nTrackRef; iref++) \r
+          {\r
+            AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);\r
+\r
+             // Ref. in the middle ITS \r
+            if(ref && ref->DetectorId()==AliTrackReference::kITS)\r
+            {\r
+             if(!refITS && countITS==2) {\r
+               refITS = ref;\r
+               //printf("refITS %p \n",refITS);\r
+             }\r
+             countITS++;\r
+            }\r
+\r
+            // TPC\r
+            if(ref && ref->DetectorId()==AliTrackReference::kTPC)\r
+            {\r
+             if(!refTPCIn) {\r
+               refTPCIn = ref;\r
+               //printf("refTPCIn %p \n",refTPCIn);\r
+               //break;\r
+             }\r
+            }\r
+         }\r
+\r
+          // transform inner params to TrackRef\r
+         // reference frame\r
+          if(refTPCIn && trackInnerC3) \r
+         {\r
+           Double_t kRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());\r
+            isOKtrackInnerC3 = trackInnerC3->Rotate(kRefPhi);\r
+            isOKtrackInnerC3 = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);\r
+         }\r
+        }\r
+\r
+        //\r
+       // ITS track\r
+       //\r
+       Int_t labelITS = TMath::Abs(track->GetITSLabel()); \r
+        particleITS = stack->Particle(labelITS);\r
+        if(particleITS && particleITS->GetPDG() && particleITS->GetPDG()->Charge()!=0.)\r
+       {\r
+         particleMotherITS = GetMother(particleITS,stack);\r
+          mechITS = particleITS->GetUniqueID();\r
+          isPrimITS = stack->IsPhysicalPrimary(labelITS);\r
+         isFromStrangessITS  = IsFromStrangeness(labelITS,stack);\r
+         isFromConversionITS = IsFromConversion(labelITS,stack);\r
+          isFromMaterialITS   = IsFromMaterial(labelITS,stack);\r
+        }\r
+      }\r
+\r
+      //\r
+      Bool_t dumpToTree=kFALSE;\r
+      \r
+      if(isOKtpcInnerC  && isOKtrackInnerC) dumpToTree = kTRUE;\r
+      if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;\r
+      if(fUseMCInfo     && isOKtrackInnerC3) dumpToTree = kTRUE;\r
+\r
+      //\r
+      if(fTreeSRedirector && dumpToTree) \r
+      {\r
+        (*fTreeSRedirector)<<"highPt"<<\r
+          "fileName.="<<&fileName<<\r
+          "runNumber="<<runNumber<<\r
+          "evtTimeStamp="<<evtTimeStamp<<\r
+          "evtNumberInFile="<<evtNumberInFile<<\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
+        }\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
+    }\r
+  }\r
+  \r
+}\r
+\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::ProcessMCEff(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
+{\r
+  //\r
+  // Fill tree for efficiency studies MC only\r
+\r
+  if(!esdEvent) {\r
+    AliDebug(AliLog::kError, "esdEvent not available");\r
+    return;\r
+  }\r
+\r
+   if(!mcEvent) {\r
+    AliDebug(AliLog::kError, "mcEvent not available");\r
+    return;\r
+  }\r
+\r
+  // get selection cuts\r
+  AliFilteredTreeEventCuts *evtCuts = GetEventCuts(); \r
+  AliFilteredTreeAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
+\r
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {\r
+    AliDebug(AliLog::kError, "cuts not available");\r
+    return;\r
+  }\r
+\r
+  // trigger selection\r
+  Bool_t isEventTriggered = kTRUE;\r
+  AliPhysicsSelection *physicsSelection = NULL;\r
+  AliTriggerAnalysis* triggerAnalysis = NULL;\r
+\r
+  // \r
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+  if (!inputHandler)\r
+  {\r
+    Printf("ERROR: Could not receive input handler");\r
+    return;\r
+  }\r
+   \r
+  // get file name\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(!chain) { \r
+    Printf("ERROR: Could not receive input chain");\r
+    return;\r
+  }\r
+  TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+  // trigger\r
+  if(evtCuts->IsTriggerRequired())  \r
+  {\r
+    // always MB\r
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
+\r
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
+    if(!physicsSelection) return;\r
+\r
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
+      // set trigger (V0AND)\r
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
+      if(!triggerAnalysis) return;\r
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+    }\r
+  }\r
+\r
+  // centrality determination\r
+  Float_t centralityF = -1;\r
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();\r
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());\r
+\r
+  // use MC information\r
+  AliHeader* header = 0;\r
+  AliGenEventHeader* genHeader = 0;\r
+  AliStack* stack = 0;\r
+  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
+    // 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
+\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
+  }\r
+  else if(GetAnalysisMode() == kTPCITSAnalysisMode) {\r
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
+  }\r
+  else {\r
+       return;\r
+  }\r
+\r
+  if(!vtxESD) return;\r
+\r
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
+\r
+  // check event cuts\r
+  if(isEventOK && isEventTriggered)\r
+  {\r
+    if(IsUseMCInfo()) \r
+    {\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
+         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
+           "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
+Bool_t AliAnalysisTaskFilteredTree::IsHighDeDxParticle(AliESDtrack * track) {\r
+  //\r
+  // check if particle is Z > 1 \r
+  //\r
+  if (track->GetTPCNcls() < 60) return kFALSE;\r
+  Double_t mom = track->GetInnerParam()->GetP();\r
+  if (mom < 0.2) return kFALSE; // protection against unexpected behavior of Aleph parameterization\r
+  Float_t dca[2], bCov[3];\r
+  track->GetImpactParameters(dca,bCov);\r
+  //\r
+\r
+  Double_t triggerDeDx = 4*AliExternalTrackParam::BetheBlochAleph((mom*2)/(0.938*3),1.0288,31.9806,5.04114e-11,2.13096,2.38541);\r
+\r
+  if (track->GetTPCsignal() > triggerDeDx && track->GetTPCsignal()<1000 && TMath::Abs(dca[0])<3.) return kTRUE;\r
+\r
+  return kFALSE;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+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
+  //\r
+  if(!esdEvent) {\r
+    AliDebug(AliLog::kError, "esdEvent not available");\r
+    return;\r
+  }\r
+\r
+  // get selection cuts\r
+  AliFilteredTreeEventCuts *evtCuts = GetEventCuts(); \r
+  AliFilteredTreeAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
+\r
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {\r
+    AliDebug(AliLog::kError, "cuts not available");\r
+    return;\r
+  }\r
+\r
+  // trigger selection\r
+  Bool_t isEventTriggered = kTRUE;\r
+  AliPhysicsSelection *physicsSelection = NULL;\r
+  AliTriggerAnalysis* triggerAnalysis = NULL;\r
+\r
+  // \r
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+  if (!inputHandler)\r
+  {\r
+    Printf("ERROR: Could not receive input handler");\r
+    return;\r
+  }\r
+   \r
+  // get file name\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(!chain) { \r
+    Printf("ERROR: Could not receive input chain");\r
+    return;\r
+  }\r
+  TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+  // trigger\r
+  if(evtCuts->IsTriggerRequired())  \r
+  {\r
+    // always MB\r
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
+\r
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
+    if(!physicsSelection) return;\r
+    //SetPhysicsTriggerSelection(physicsSelection);\r
+\r
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
+      // set trigger (V0AND)\r
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
+      if(!triggerAnalysis) return;\r
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+    }\r
+  }\r
+\r
+  // centrality determination\r
+  Float_t centralityF = -1;\r
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();\r
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());\r
+\r
+\r
+  // get reconstructed vertex  \r
+  //const AliESDVertex* vtxESD = 0; \r
+  AliESDVertex* vtxESD = 0; \r
+  if(GetAnalysisMode() == kTPCAnalysisMode) {\r
+        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();\r
+  }\r
+  else if(GetAnalysisMode() == kTPCITSAnalysisMode) {\r
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
+  }\r
+  else {\r
+       return;\r
+  }\r
+\r
+  if(!vtxESD) return;\r
+\r
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
+\r
+  // check event cuts\r
+  if(isEventOK && isEventTriggered) {\r
+  //\r
+  // Dump the pt downscaled V0 into the tree\r
+  // \r
+  Int_t ntracks = esdEvent->GetNumberOfTracks();\r
+  Int_t nV0s = esdEvent->GetNumberOfV0s();\r
+  Int_t run = esdEvent->GetRunNumber();\r
+  Int_t time= esdEvent->GetTimeStamp();\r
+  Int_t evNr=esdEvent->GetEventNumberInFile();\r
+  Double_t bz = esdEvent->GetMagneticField();\r
+\r
+\r
+  for (Int_t iv0=0; iv0<nV0s; iv0++){\r
+    AliESDv0 * v0 = esdEvent->GetV0(iv0);\r
+    if (!v0) continue;\r
+    AliESDtrack * track0 = esdEvent->GetTrack(v0->GetIndex(0));\r
+    AliESDtrack * track1 = esdEvent->GetTrack(v0->GetIndex(1));\r
+    if (!track0) continue;\r
+    if (!track1) continue;\r
+    if (track0->GetSign()<0) {\r
+      track1 = esdEvent->GetTrack(v0->GetIndex(0));\r
+      track0 = esdEvent->GetTrack(v0->GetIndex(1));\r
+    }\r
+    //\r
+    Bool_t isDownscaled = IsV0Downscaled(v0);\r
+    if (isDownscaled) continue;\r
+    AliKFParticle kfparticle; //\r
+    Int_t type=GetKFParticle(v0,esdEvent,kfparticle);\r
+    if (type==0) continue;   \r
+\r
+    if(!fTreeSRedirector) return;\r
+    (*fTreeSRedirector)<<"V0s"<<\r
+      "isDownscaled="<<isDownscaled<<\r
+      "Bz="<<bz<<\r
+      "fileName.="<<&fileName<<\r
+      "runNumber="<<run<<\r
+      "evtTimeStamp="<<time<<\r
+      "evtNumberInFile="<<evNr<<\r
+      "type="<<type<<\r
+      "ntracks="<<ntracks<<\r
+      "v0.="<<v0<<\r
+      "kf.="<<&kfparticle<<\r
+      "track0.="<<track0<<\r
+      "track1.="<<track1<<\r
+      "centralityF="<<centralityF<<\r
+      "\n";\r
+  }\r
+  }\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::ProcessdEdx(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
+{\r
+  //\r
+  // Select real events with large TPC dEdx signal\r
+  //\r
+  if(!esdEvent) {\r
+    AliDebug(AliLog::kError, "esdEvent not available");\r
+    return;\r
+  }\r
+\r
+  // get selection cuts\r
+  AliFilteredTreeEventCuts *evtCuts = GetEventCuts(); \r
+  AliFilteredTreeAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
+\r
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {\r
+    AliDebug(AliLog::kError, "cuts not available");\r
+    return;\r
+  }\r
+\r
+  // get file name\r
+  TTree *chain = (TChain*)GetInputData(0);\r
+  if(!chain) { \r
+    Printf("ERROR: Could not receive input chain");\r
+    return;\r
+  }\r
+  TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+  // trigger\r
+  Bool_t isEventTriggered = kTRUE;\r
+  AliPhysicsSelection *physicsSelection = NULL;\r
+  AliTriggerAnalysis* triggerAnalysis = NULL;\r
+\r
+  // \r
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+  if (!inputHandler)\r
+  {\r
+    Printf("ERROR: Could not receive input handler");\r
+    return;\r
+  }\r
+\r
+  if(evtCuts->IsTriggerRequired())  \r
+  {\r
+    // always MB\r
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
+\r
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
+    if(!physicsSelection) return;\r
+\r
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
+      // set trigger (V0AND)\r
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
+      if(!triggerAnalysis) return;\r
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+    }\r
+  }\r
+\r
+  // get reconstructed vertex  \r
+  AliESDVertex* vtxESD = 0; \r
+  if(GetAnalysisMode() == kTPCAnalysisMode) {\r
+        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();\r
+  }\r
+  else if(GetAnalysisMode() == kTPCITSAnalysisMode) {\r
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
+  }\r
+  else {\r
+       return;\r
+  }\r
+  if(!vtxESD) return;\r
+\r
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
+\r
+\r
+  // check event cuts\r
+  if(isEventOK && isEventTriggered)\r
+  {\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
+    // large dEdx\r
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
+    {\r
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+      if(!track) continue;\r
+      if(track->Charge()==0) continue;\r
+      if(!esdTrackCuts->AcceptTrack(track)) continue;\r
+      if(!accCuts->AcceptTrack(track)) continue;\r
+\r
+      if(!IsHighDeDxParticle(track)) continue;\r
+      \r
+      if(!fTreeSRedirector) return;\r
+      (*fTreeSRedirector)<<"dEdx"<<\r
+      "fileName.="<<&fileName<<\r
+      "runNumber="<<runNumber<<\r
+      "evtTimeStamp="<<evtTimeStamp<<\r
+      "evtNumberInFile="<<evtNumberInFile<<\r
+      "Bz="<<bz<<\r
+      "vtxESD.="<<vtxESD<<\r
+      "mult="<<mult<<\r
+      "esdTrack.="<<track<<\r
+      "\n";\r
+    }\r
+  }\r
+}\r
+\r
+//_____________________________________________________________________________\r
+Int_t   AliAnalysisTaskFilteredTree::GetKFParticle(AliESDv0 *const v0, AliESDEvent * const event, AliKFParticle & kfparticle)\r
+{\r
+  //\r
+  // Create KF particle in case the V0 fullfill selection criteria\r
+  //\r
+  // Selection criteria\r
+  //  0. algorithm cut\r
+  //  1. track cut\r
+  //  3. chi2 cut\r
+  //  4. rough mass cut\r
+  //  5. Normalized pointing angle cut\r
+  //\r
+  const Double_t cutMass=0.2;\r
+  const Double_t kSigmaDCACut=3;\r
+  //\r
+  // 0.) algo cut - accept only on the fly\r
+  //\r
+  if (v0->GetOnFlyStatus() ==kFALSE) return 0;     \r
+  //\r
+  // 1.) track cut\r
+  // \r
+  AliESDtrack * track0 = event->GetTrack(v0->GetIndex(0));\r
+  AliESDtrack * track1 = event->GetTrack(v0->GetIndex(1));\r
+  /*\r
+    TCut cutD="abs(track0.fD/sqrt(track0.fCdd))>2&&abs(track1.fD/sqrt(track1.fCdd))>2";\r
+    TCut cutTheta="abs(track0.fP[3])<1&&abs(track1.fP[3])<1";\r
+    TCut cutNcl="track0.GetTPCClusterInfo(2,1)>100&&track1.GetTPCClusterInfo(2,1)>100";\r
+  */  \r
+  if (TMath::Abs(track0->GetTgl())>1) return 0;\r
+  if (TMath::Abs(track1->GetTgl())>1) return 0;\r
+  if ((track0->GetTPCClusterInfo(2,1))<100) return 0;\r
+  if ((track1->GetTPCClusterInfo(2,1))<100) return 0;\r
+  //if ((track0->GetITSclusters(0))<2) return 0;\r
+  //if ((track1->GetITSclusters(0))<2) return 0; \r
+  Float_t pos0[2]={0}, cov0[3]={0};\r
+  Float_t pos1[2]={0}, cov1[3]={0};\r
+  track0->GetImpactParameters(pos0,cov0);\r
+  track0->GetImpactParameters(pos1,cov1);\r
+  //\r
+  if (TMath::Abs(pos0[0])<kSigmaDCACut*TMath::Sqrt(cov0[0])) return 0;\r
+  if (TMath::Abs(pos1[0])<kSigmaDCACut*TMath::Sqrt(cov1[0])) return 0;\r
+  // \r
+  //\r
+  // 3.) Chi2 cut\r
+  //\r
+  Double_t chi2KF = v0->GetKFInfo(2,2,2);\r
+  if (chi2KF>25) return 0;\r
+  //\r
+  // 4.) Rough mass cut - 0.200 GeV\r
+  //\r
+  static Double_t masses[2]={-1};\r
+  if (masses[0]<0){\r
+    masses[0] = TDatabasePDG::Instance()->GetParticle("K_S0")->Mass();\r
+    masses[1] = TDatabasePDG::Instance()->GetParticle("Lambda0")->Mass();\r
+  }\r
+  Double_t mass00=  v0->GetEffMass(0,0);\r
+  Double_t mass22=  v0->GetEffMass(2,2);\r
+  Double_t mass42=  v0->GetEffMass(4,2);\r
+  Double_t mass24=  v0->GetEffMass(2,4);\r
+  Bool_t massOK=kFALSE;\r
+  Int_t type=0;\r
+  Int_t ptype=0;\r
+  Double_t dmass=1;\r
+  Int_t p1=0, p2=0;\r
+  if (TMath::Abs(mass00-0)<cutMass) {\r
+    massOK=kTRUE; type+=1; \r
+    if (TMath::Abs(mass00-0)<dmass) {\r
+      ptype=1;\r
+      dmass=TMath::Abs(mass00-0);      \r
+      p1=0; p2=0;\r
+    } \r
+  }\r
+  if (TMath::Abs(mass24-masses[1])<cutMass) {\r
+    massOK=kTRUE; type+=2; \r
+    if (TMath::Abs(mass24-masses[1])<dmass){\r
+      dmass = TMath::Abs(mass24-masses[1]);\r
+      ptype=2;\r
+      p1=2; p2=4;\r
+    }\r
+  }\r
+  if (TMath::Abs(mass42-masses[1])<cutMass) {\r
+    massOK=kTRUE; type+=4;\r
+    if (TMath::Abs(mass42-masses[1])<dmass){\r
+      dmass = TMath::Abs(mass42-masses[1]);\r
+      ptype=4;\r
+      p1=4; p2=2;\r
+    }\r
+  }\r
+  if (TMath::Abs(mass22-masses[0])<cutMass) {\r
+    massOK=kTRUE; type+=8;\r
+    if (TMath::Abs(mass22-masses[0])<dmass){\r
+      dmass = TMath::Abs(mass22-masses[0]);\r
+      ptype=8;\r
+      p1=2; p2=2;\r
+    }\r
+  }\r
+  if (type==0) return 0;\r
+  //\r
+  const Int_t spdg[5]={kPositron,kMuonPlus,kPiPlus, kKPlus, kProton};\r
+  const AliExternalTrackParam *paramP = v0->GetParamP();\r
+  const AliExternalTrackParam *paramN = v0->GetParamN();\r
+  if (paramP->GetSign()<0){\r
+    paramP=v0->GetParamP();\r
+    paramN=v0->GetParamN();\r
+  }\r
+  //Double_t *pparam1 = (Double_t*)paramP->GetParameter();\r
+  //Double_t *pparam2 = (Double_t*)paramN->GetParameter();\r
+  //\r
+  AliKFParticle kfp1( *paramP, spdg[p1]  );\r
+  AliKFParticle kfp2( *paramN, -1 *spdg[p2]  );\r
+  AliKFParticle V0KF;\r
+  (V0KF)+=kfp1;\r
+  (V0KF)+=kfp2;\r
+  kfparticle=V0KF;\r
+  //\r
+  // Pointing angle\r
+  //\r
+  Double_t  errPhi    = V0KF.GetErrPhi();\r
+  Double_t  pointAngle= TMath::ACos(v0->GetV0CosineOfPointingAngle());\r
+  if (pointAngle/errPhi>10) return 0;  \r
+  //\r
+  return ptype;  \r
+}\r
+\r
+//_____________________________________________________________________________\r
+Bool_t AliAnalysisTaskFilteredTree::IsV0Downscaled(AliESDv0 *const v0)\r
+{\r
+  //\r
+  // Downscale randomly low pt V0\r
+  //\r
+  //return kFALSE;\r
+  Double_t maxPt= TMath::Max(v0->GetParamP()->Pt(), v0->GetParamN()->Pt());\r
+  Double_t scalempt= TMath::Min(maxPt,10.);\r
+  Double_t downscaleF = gRandom->Rndm();\r
+  downscaleF *= fLowPtV0DownscaligF;\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
+\r
+  /*\r
+    TH1F his1("his1","his1",100,0,10);\r
+    TH1F his2("his2","his2",100,0,10);\r
+    {for (Int_t i=0; i<10000; i++){\r
+       Double_t rnd=gRandom->Exp(1);\r
+       Bool_t isDownscaled =TMath::Exp(rnd)<100*gRandom->Rndm();\r
+       his1->Fill(rnd); \r
+       if (!isDownscaled) his2->Fill(rnd); \r
+    }}\r
+\r
+   */\r
+\r
+}\r
+\r
+\r
+\r
+//_____________________________________________________________________________\r
+Bool_t AliAnalysisTaskFilteredTree::ConstrainTPCInner(AliExternalTrackParam *const tpcInnerC, const AliESDVertex* vtx, Double_t b[3])\r
+{\r
+ // Constrain TPC inner params constrained\r
+ //\r
+      if(!tpcInnerC) return kFALSE; \r
+      if(!vtx) return kFALSE;\r
+\r
+      Double_t dz[2],cov[3];\r
+      //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();\r
+      //if(!tpcInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE; \r
+      //if(!tpcInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE; \r
+      if(!tpcInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE; \r
+\r
+\r
+      Double_t covar[6]; vtx->GetCovMatrix(covar);\r
+      Double_t p[2]={tpcInnerC->GetParameter()[0]-dz[0],tpcInnerC->GetParameter()[1]-dz[1]};\r
+      Double_t c[3]={covar[2],0.,covar[5]};\r
+      Double_t chi2C=tpcInnerC->GetPredictedChi2(p,c);\r
+      if (chi2C>kVeryBig) return kFALSE; \r
+\r
+      if(!tpcInnerC->Update(p,c)) return kFALSE;\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+Bool_t AliAnalysisTaskFilteredTree::ConstrainTrackInner(AliExternalTrackParam *const trackInnerC, const AliESDVertex* vtx, Double_t mass, Double_t b[3])\r
+{\r
+ // Constrain TPC inner params constrained\r
+ //\r
+      if(!trackInnerC) return kFALSE; \r
+      if(!vtx) return kFALSE;\r
+\r
+      const Double_t kRadius  = 2.8; \r
+      const Double_t kMaxStep = 1.0; \r
+\r
+      Double_t dz[2],cov[3];\r
+\r
+      //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();\r
+      //if(!trackInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE; \r
+      //if(!trackInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE; \r
+\r
+      if(!AliTracker::PropagateTrackToBxByBz(trackInnerC,kRadius,mass,kMaxStep,kFALSE)) return kFALSE;\r
+      if(!trackInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE; \r
+\r
+      //\r
+      Double_t covar[6]; vtx->GetCovMatrix(covar);\r
+      Double_t p[2]={trackInnerC->GetParameter()[0]-dz[0],trackInnerC->GetParameter()[1]-dz[1]};\r
+      Double_t c[3]={covar[2],0.,covar[5]};\r
+      Double_t chi2C=trackInnerC->GetPredictedChi2(p,c);\r
+      if (chi2C>kVeryBig) return kFALSE; \r
+\r
+      if(!trackInnerC->Update(p,c)) return kFALSE;\r
+\r
+  return kTRUE;\r
+}\r
+\r
+\r
+//_____________________________________________________________________________\r
+TParticle *AliAnalysisTaskFilteredTree::GetMother(TParticle *const particle, AliStack *const stack) \r
+{\r
+  if(!particle) return NULL;\r
+  if(!stack) return NULL;\r
+\r
+  Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
+  TParticle* mother = NULL; \r
+  mother = stack->Particle(motherLabel); \r
+\r
+return mother;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+Bool_t AliAnalysisTaskFilteredTree::IsFromConversion(const Int_t label, AliStack *const stack) \r
+{\r
+  Bool_t isFromConversion = kFALSE;\r
+\r
+  if(stack) {\r
+    TParticle* particle = stack->Particle(label);\r
+\r
+    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) \r
+    {\r
+       Int_t mech = particle->GetUniqueID(); // production mechanism \r
+       Bool_t isPrim = stack->IsPhysicalPrimary(label);\r
+\r
+       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
+       TParticle* mother = stack->Particle(motherLabel); \r
+       if(mother) {\r
+          Int_t motherPdg = mother->GetPdgCode();\r
+\r
+          if(!isPrim && mech==5 && motherPdg==kGamma) { \r
+            isFromConversion=kTRUE; \r
+          }\r
+       }\r
+    } \r
+  } \r
+\r
+  return isFromConversion;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+Bool_t AliAnalysisTaskFilteredTree::IsFromMaterial(const Int_t label, AliStack *const stack) \r
+{\r
+  Bool_t isFromMaterial = kFALSE;\r
+\r
+  if(stack) {\r
+    TParticle* particle = stack->Particle(label);\r
+\r
+    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) \r
+    {\r
+       Int_t mech = particle->GetUniqueID(); // production mechanism \r
+       Bool_t isPrim = stack->IsPhysicalPrimary(label);\r
+\r
+       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
+       TParticle* mother = stack->Particle(motherLabel); \r
+       if(mother) {\r
+          if(!isPrim && mech==13) { \r
+            isFromMaterial=kTRUE; \r
+          }\r
+       }\r
+     } \r
+  } \r
+\r
+  return isFromMaterial;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+Bool_t AliAnalysisTaskFilteredTree::IsFromStrangeness(const Int_t label, AliStack *const stack) \r
+{\r
+  Bool_t isFromStrangeness = kFALSE;\r
+\r
+  if(stack) {\r
+    TParticle* particle = stack->Particle(label);\r
+\r
+    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) \r
+    {\r
+       Int_t mech = particle->GetUniqueID(); // production mechanism \r
+       Bool_t isPrim = stack->IsPhysicalPrimary(label);\r
+\r
+       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
+       TParticle* mother = stack->Particle(motherLabel); \r
+       if(mother) {\r
+          Int_t motherPdg = mother->GetPdgCode();\r
+\r
+          // K+-, lambda, antilambda, K0s decays\r
+          if(!isPrim && mech==4 && \r
+             (TMath::Abs(motherPdg)==kKPlus || TMath::Abs(motherPdg)==kLambda0 || motherPdg==kK0Short))\r
+          {\r
+            isFromStrangeness = kTRUE;\r
+          } \r
+       }\r
+    } \r
+  } \r
+\r
+  return isFromStrangeness;\r
+}\r
+\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::FinishTaskOutput() \r
+{\r
+  //\r
+  // Called one at the end \r
+  // 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
+  }\r
+  if(fCosmicPairsTree) fCosmicPairsTree->Print();  \r
+\r
+\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
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::Terminate(Option_t *) \r
+{\r
+  // Called one at the end \r
+  /*\r
+  fOutputSummary = dynamic_cast<TTree*> (GetOutputData(1));\r
+  if(fOutputSummary) delete fOutputSummary; fOutputSummary=0;\r
+  TChain* chain = new TChain("highPt");\r
+  if(!chain) return;\r
+  chain->Add("jotwinow_HighPt_TrackAndV0_Trees.root");\r
+  TTree *tree = chain->CopyTree("1");\r
+  if (chain) { delete chain; chain=0; }\r
+  if(!tree) return;\r
+  tree->Print();\r
+  fOutputSummary = tree;\r
+\r
+  if (!fOutputSummary) {\r
+    Printf("ERROR: AliAnalysisTaskFilteredTree::Terminate(): Output data not avaiable %p \n", GetOutputData(1));\r
+    return;\r
+  }\r
+  */\r
+}\r
+\r
+//_____________________________________________________________________________\r
+Int_t AliAnalysisTaskFilteredTree::GetMCTrueTrackMult(AliMCEvent *const mcEvent, AliFilteredTreeEventCuts *const evtCuts, AliFilteredTreeAcceptanceCuts *const accCuts)\r
+{\r
+  //\r
+  // calculate mc event true track multiplicity\r
+  //\r
+  if(!mcEvent) return 0;\r
+\r
+  AliStack* stack = 0;\r
+  Int_t mult = 0;\r
+\r
+  // MC particle stack\r
+  stack = mcEvent->Stack();\r
+  if (!stack) return 0;\r
+\r
+  //\r
+  //printf("minZv %f, maxZv %f \n", evtCuts->GetMinZv(), evtCuts->GetMaxZv());\r
+  //\r
+\r
+  Bool_t isEventOK = evtCuts->AcceptMCEvent(mcEvent);\r
+  if(!isEventOK) return 0; \r
+\r
+  Int_t nPart  = stack->GetNtrack();\r
+  for (Int_t iMc = 0; iMc < nPart; ++iMc) \r
+  {\r
+     TParticle* 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
+     // physical primary\r
+     Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
+     if(!prim) continue;\r
+\r
+     // checked accepted without pt cut\r
+     //if(accCuts->AcceptTrack(particle)) \r
+     if( particle->Eta() > accCuts->GetMinEta() && particle->Eta() < accCuts->GetMaxEta() ) \r
+     {\r
+       mult++;\r
+     }\r
+  }\r
+\r
+return mult;  \r
+}\r
+\r
+\r
diff --git a/PWGPP/AliAnalysisTaskFilteredTree.h b/PWGPP/AliAnalysisTaskFilteredTree.h
new file mode 100644 (file)
index 0000000..bd6c5b1
--- /dev/null
@@ -0,0 +1,139 @@
+#ifndef ALIDNDPTTRACKDUMPTASK_H
+#define ALIDNDPTTRACKDUMPTASK_H
+
+//------------------------------------------------------------------------------
+// Task to dump track information 
+// TPC constrained and TPC+ITS combined 
+// for outliers analysis.
+// 
+// Author: J.Otwinowski 19/06/2011 
+//------------------------------------------------------------------------------
+
+class AliESDEvent;
+class AliMCEvent;
+class AliFilteredTreeEventCuts;
+class AliFilteredTreeAcceptanceCuts;
+class AliESDtrackCuts;
+class AliMagFMaps;
+class AliESDEvent; 
+class AliMCEvent; 
+class AliKFParticle; 
+class AliESDv0; 
+class TList;
+class TObjArray;
+class TTree;
+class TTreeSRedirector;
+
+#include "AliTriggerAnalysis.h"
+#include "AliAnalysisTaskSE.h"
+
+class AliAnalysisTaskFilteredTree : public AliAnalysisTaskSE {
+ public:
+
+  enum EAnalysisMode { kInvalidAnalysisMode=-1,
+                      kTPCITSAnalysisMode=0,
+                      kTPCAnalysisMode=1 };
+
+  AliAnalysisTaskFilteredTree(const char *name = "AliAnalysisTaskFilteredTree");
+  virtual ~AliAnalysisTaskFilteredTree();
+  
+  virtual void   UserCreateOutputObjects();
+  virtual void   UserExec(Option_t *option);
+  virtual void   Terminate(Option_t *);
+  virtual Bool_t Notify();
+  virtual void   FinishTaskOutput();
+  void SetUseMCInfo(Bool_t info)           { fUseMCInfo = info; }
+  Bool_t IsUseMCInfo() const               { return fUseMCInfo; }
+  void SetUseESDfriends(Bool_t friends)    { fUseESDfriends = friends; }
+  Bool_t IsUseESDfriends() const              { return fUseESDfriends; }
+  
+  // Process events
+  void ProcessAll(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void Process(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessV0(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessdEdx(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessLaser(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessMCEff(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessCosmics(AliESDEvent *const esdEvent=0); 
+
+  void SetEventCuts(AliFilteredTreeEventCuts* const cuts)              { fFilteredTreeEventCuts = cuts; }
+  void SetAcceptanceCuts(AliFilteredTreeAcceptanceCuts* const cuts)    { fFilteredTreeAcceptanceCuts = cuts; }
+  void SetRecAcceptanceCuts(AliFilteredTreeAcceptanceCuts* const cuts) { fFilteredTreeRecAcceptanceCuts = cuts; }
+  void SetTrackCuts(AliESDtrackCuts* const cuts)                { fEsdTrackCuts = cuts; }
+  void SetTrigger(const AliTriggerAnalysis::Trigger trigger)    { fTrigger = trigger; }
+  void SetAnalysisMode(const EAnalysisMode mode) { fAnalysisMode = mode; }
+
+  AliFilteredTreeEventCuts* GetEventCuts() const                       { return fFilteredTreeEventCuts; }
+  AliFilteredTreeAcceptanceCuts* GetAcceptanceCuts() const             { return fFilteredTreeAcceptanceCuts; }
+  AliFilteredTreeAcceptanceCuts* GetRecAcceptanceCuts() const          { return fFilteredTreeRecAcceptanceCuts; }  
+  AliESDtrackCuts* GetTrackCuts() const                         { return fEsdTrackCuts; }
+  AliTriggerAnalysis::Trigger GetTrigger() const                { return fTrigger; }
+  EAnalysisMode GetAnalysisMode() const          { return fAnalysisMode; }
+
+  TString GetCentralityEstimator() const {return fCentralityEstimator; }
+  void SetCentralityEstimator(TString centEst="V0M") { fCentralityEstimator = centEst; }
+
+  Bool_t IsFromConversion(const Int_t label, AliStack *const stack);
+  Bool_t IsFromMaterial(const Int_t label, AliStack *const stack);
+  Bool_t IsFromStrangeness(const Int_t label, AliStack *const stack);
+  TParticle *GetMother(TParticle *const particle, AliStack *const stack);
+
+  Bool_t ConstrainTPCInner(AliExternalTrackParam *const tpcInnerC, const AliESDVertex* vtx, Double_t b[3]);
+  Bool_t ConstrainTrackInner(AliExternalTrackParam *const trackInnerC, const AliESDVertex* vtx, Double_t mass, Double_t b[3]);
+
+  // v0s selection
+  Int_t  GetKFParticle(AliESDv0 *const v0, AliESDEvent * const event, AliKFParticle & kfparticle);
+  Bool_t IsV0Downscaled(AliESDv0 *const v0);
+  Bool_t IsHighDeDxParticle(AliESDtrack * const track);
+
+  void SetLowPtTrackDownscaligF(Double_t fact) { fLowPtTrackDownscaligF = fact; }
+  void SetLowPtV0DownscaligF(Double_t fact)    { fLowPtV0DownscaligF = fact; }
+  
+  void   SetProcessCosmics(Bool_t flag) { fProcessCosmics = flag; }
+  Bool_t GetProcessCosmics() { return fProcessCosmics; }
+
+  void SetProcessAll(Bool_t proc) { fProcessAll = proc; }
+  static Int_t GetMCTrueTrackMult(AliMCEvent *const mcEvent, AliFilteredTreeEventCuts *const evtCuts, AliFilteredTreeAcceptanceCuts *const accCuts);
+
+ private:
+
+  AliESDEvent *fESD;    //! ESD event
+  AliMCEvent *fMC;      //! MC event
+  AliESDfriend *fESDfriend; //! ESDfriend event
+  TList* fOutput;       //! list send on output slot 0
+  TIterator *fPitList;  //! iterator over the output objetcs  
+
+  Bool_t fUseMCInfo;        // use MC information
+  Bool_t fUseESDfriends;        // use esd friends
+
+  AliFilteredTreeEventCuts      *fFilteredTreeEventCuts;      // event cuts
+  AliFilteredTreeAcceptanceCuts *fFilteredTreeAcceptanceCuts; // acceptance cuts  
+  AliFilteredTreeAcceptanceCuts *fFilteredTreeRecAcceptanceCuts; // additional recontruction acceptance cuts (not used for MC truth)
+  AliESDtrackCuts *fEsdTrackCuts;          // esd track cuts
+  AliTriggerAnalysis::Trigger fTrigger;    // trigger settings
+  EAnalysisMode fAnalysisMode;   // analysis mode TPC only, TPC + ITS
+
+  TTreeSRedirector* fTreeSRedirector;      //! temp tree to dump output
+
+  TString fCentralityEstimator;     // use centrality can be "VOM" (default), "FMD", "TRK", "TKL", "CL0", "CL1", "V0MvsFMD", "TKLvsV0M", "ZEMvsZDC"
+
+  Double_t fLowPtTrackDownscaligF; // low pT track downscaling factor
+  Double_t fLowPtV0DownscaligF; // low pT V0 downscaling factor
+  Double_t fProcessAll; // Calculate all track properties including MC
+  
+  Bool_t fProcessCosmics; // look for cosmic pairs from random trigger
+  
+  TTree* fHighPtTree;       //! list send on output slot 0
+  TTree* fV0Tree;           //! list send on output slot 0
+  TTree* fdEdxTree;         //! list send on output slot 0
+  TTree* fLaserTree;        //! list send on output slot 0
+  TTree* fMCEffTree;        //! list send on output slot 0
+  TTree* fCosmicPairsTree;  //! list send on output slot 0
+
+  AliAnalysisTaskFilteredTree(const AliAnalysisTaskFilteredTree&); // not implemented
+  AliAnalysisTaskFilteredTree& operator=(const AliAnalysisTaskFilteredTree&); // not implemented
+  
+  ClassDef(AliAnalysisTaskFilteredTree, 1); // example of analysis
+};
+
+#endif
diff --git a/PWGPP/AliFilteredTreeAcceptanceCuts.cxx b/PWGPP/AliFilteredTreeAcceptanceCuts.cxx
new file mode 100644 (file)
index 0000000..b4f70bf
--- /dev/null
@@ -0,0 +1,177 @@
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+// last change: 2011-04-04 by M.Knichel
+
+#include <iostream>
+#include <TList.h>
+
+#include "AliLog.h"
+#include "AliESDtrack.h"
+#include "AliExternalTrackParam.h"
+#include "TParticle.h"
+
+#include "AliFilteredTreeAcceptanceCuts.h"
+
+using namespace std;
+
+ClassImp(AliFilteredTreeAcceptanceCuts)
+
+//_____________________________________________________________________________
+AliFilteredTreeAcceptanceCuts::AliFilteredTreeAcceptanceCuts(const Char_t* name,const Char_t *title) : 
+AliAnalysisCuts(name, title)
+, fMinEta(0)
+, fMaxEta(0)
+, fMinPhi(0)
+, fMaxPhi(0)
+, fMinPt(0)
+, fMaxPt(0)
+, fExcludeMinEta(0)
+, fExcludeMaxEta(0)
+, fExcludeMinPhi(0)
+, fExcludeMaxPhi(0)
+, fExcludeMinEta2(0)
+, fExcludeMaxEta2(0)
+, fExcludeMinPhi2(0)
+, fExcludeMaxPhi2(0)
+, fCheckRange(kFALSE)
+, fMaxDCAr(0)
+, fMaxDCAz(0)
+{
+  // default constructor 
+  
+  // init data members with defaults
+  Init();
+}
+
+//_____________________________________________________________________________
+AliFilteredTreeAcceptanceCuts::~AliFilteredTreeAcceptanceCuts()  
+{
+  // destructor
+}
+
+//_____________________________________________________________________________
+void AliFilteredTreeAcceptanceCuts::Init()  
+{
+  // set default values
+  SetEtaRange();
+  SetPhiRange();
+  SetPtRange();
+  SetMaxDCAr();
+  SetMaxDCAz();
+}
+
+//_____________________________________________________________________________
+Bool_t AliFilteredTreeAcceptanceCuts::AcceptTrack(AliESDtrack *track)
+{
+  // check acceptance cuts for AliESDtrack
+  if(!track) return kFALSE;
+
+  Float_t eta = track->Eta();
+  Float_t phi = track->Phi();
+  Float_t pt = track->Pt();
+
+  if(eta < fMinEta) return kFALSE;
+  if(eta > fMaxEta) return kFALSE;
+  if(phi < fMinPhi) return kFALSE;
+  if(phi > fMaxPhi) return kFALSE;
+  if(pt < fMinPt) return kFALSE;
+  if(pt > fMaxPt) return kFALSE;
+  
+return kTRUE;
+}
+
+Bool_t AliFilteredTreeAcceptanceCuts::AcceptTrackLocalTPC(AliESDtrack *track)
+{
+  // check acceptance cuts for AliESDtrack
+  if(!track) return kFALSE;
+  const AliExternalTrackParam *innerParam =  track->GetInnerParam();
+  if(!innerParam) return kFALSE;
+
+  Float_t eta = track->Eta();
+  Float_t phi = TMath::ATan2(innerParam->Py(),innerParam->Px());
+
+  if (fCheckRange) {
+      if ((eta > fExcludeMinEta) && (eta < fExcludeMaxEta) && (phi > fExcludeMinPhi) && (phi < fExcludeMaxPhi)) { return kFALSE; }
+      if ((eta > fExcludeMinEta2) && (eta < fExcludeMaxEta2) && (phi > fExcludeMinPhi2) && (phi < fExcludeMaxPhi2)) { return kFALSE; }
+  }
+
+return kTRUE;
+}
+
+//_____________________________________________________________________________
+Bool_t AliFilteredTreeAcceptanceCuts::AcceptTrack(AliExternalTrackParam *track)
+{
+  // check acceptance cuts for AliESDtrack
+  if(!track) return kFALSE;
+
+  Float_t eta = track->Eta();
+  Float_t phi = track->Phi();
+  Float_t pt = track->Pt();
+
+  if(eta < fMinEta) return kFALSE;
+  if(eta > fMaxEta) return kFALSE;
+  if(phi < fMinPhi) return kFALSE;
+  if(phi > fMaxPhi) return kFALSE;
+  if(pt < fMinPt) return kFALSE;
+  if(pt > fMaxPt) return kFALSE;
+
+return kTRUE;
+}
+
+//_____________________________________________________________________________
+Bool_t AliFilteredTreeAcceptanceCuts::AcceptTrack(TParticle *particle)
+{
+  // check acceptance cuts for TParticle
+  if(!particle) return kFALSE;
+
+  Float_t eta = particle->Eta();
+  Float_t phi = particle->Phi();
+  Float_t pt = particle->Pt();
+
+  if(eta < fMinEta) return kFALSE;
+  if(eta > fMaxEta) return kFALSE;
+  if(phi < fMinPhi) return kFALSE;
+  if(phi > fMaxPhi) return kFALSE;
+  if(pt < fMinPt) return kFALSE;
+  if(pt > fMaxPt) return kFALSE;
+
+return kTRUE;
+}
+
+//_____________________________________________________________________________
+Long64_t AliFilteredTreeAcceptanceCuts::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;
+
+  Int_t count=0;
+  while((obj = iter->Next()) != 0) 
+  {
+    AliFilteredTreeAcceptanceCuts* entry = dynamic_cast<AliFilteredTreeAcceptanceCuts*>(obj);
+    if (entry == 0)  
+      continue; 
+
+  count++;
+  }
+
+return count;
+}
diff --git a/PWGPP/AliFilteredTreeAcceptanceCuts.h b/PWGPP/AliFilteredTreeAcceptanceCuts.h
new file mode 100644 (file)
index 0000000..87c2730
--- /dev/null
@@ -0,0 +1,97 @@
+#ifndef ALIFILTEREDTREEACCEPTANCECUTS_H\r
+#define ALIFILTEREDTREEACCEPTANCECUTS_H\r
+\r
+//------------------------------------------------------------------------------\r
+// Class to keep selection cuts for MC tracks. \r
+// \r
+// Author: J.Otwinowski 03/11/2008 \r
+// last change: 2011-04-04 by M.Knichel\r
+//------------------------------------------------------------------------------\r
+\r
+class TParticle;\r
+class AliESDtrack;\r
+class AliExternalTrackParam;\r
+\r
+#include "AliAnalysisCuts.h"\r
+\r
+class AliFilteredTreeAcceptanceCuts : public AliAnalysisCuts\r
+{\r
+public:\r
+  AliFilteredTreeAcceptanceCuts(const Char_t* name ="AliFilteredTreeAcceptanceCuts", const Char_t *title ="");\r
+  virtual ~AliFilteredTreeAcceptanceCuts(); \r
\r
+  // setters \r
+  void SetEtaRange(const Float_t min=-1e99, const Float_t max=1e99)  { fMinEta=min; fMaxEta=max; }\r
+  void SetPhiRange(const Float_t min=-1e99, const Float_t max=1e99)  { fMinPhi=min; fMaxPhi=max;}\r
+  void SetPtRange(const Float_t min=-1e99, const Float_t max=1e99)   { fMinPt=min;  fMaxPt=max;}\r
+  void SetExcludeEtaPhiRange(const Float_t etaMin, const Float_t etaMax, const Float_t phiMin, const Float_t phiMax)\r
+       { fExcludeMinEta = etaMin; fExcludeMaxEta = etaMax; fExcludeMinPhi = phiMin; fExcludeMaxPhi = phiMax; fCheckRange=kTRUE; }\r
+  void SetExcludeEtaPhiRange2(const Float_t etaMin, const Float_t etaMax, const Float_t phiMin, const Float_t phiMax)\r
+       { fExcludeMinEta2 = etaMin; fExcludeMaxEta2 = etaMax; fExcludeMinPhi2 = phiMin; fExcludeMaxPhi2 = phiMax; fCheckRange=kTRUE; }          \r
+\r
+  void SetMaxDCAr(const Float_t max=1e99) { fMaxDCAr=max;}\r
+  void SetMaxDCAz(const Float_t max=1e99) { fMaxDCAz=max;}\r
+\r
+  // getters \r
+  Float_t GetMinEta() const {return fMinEta;}\r
+  Float_t GetMaxEta() const {return fMaxEta;}\r
+  Float_t GetMinPhi() const {return fMinPhi;}\r
+  Float_t GetMaxPhi() const {return fMaxPhi;}\r
+  Float_t GetMinPt() const {return fMinPt;}\r
+  Float_t GetMaxPt() const {return fMaxPt;}\r
+  \r
+  Bool_t  GetCheckRange() const { return fCheckRange; }\r
+  Float_t GetExcludeMinEta() const { return fExcludeMinEta; }\r
+  Float_t GetExcludeMaxEta() const { return fExcludeMaxEta; }\r
+  Float_t GetExcludeMinPhi() const { return fExcludeMinPhi; }\r
+  Float_t GetExcludeMaxPhi() const { return fExcludeMaxPhi; }  \r
+\r
+  Float_t GetMaxDCAr() const {return fMaxDCAr;}\r
+  Float_t GetMaxDCAz() const {return fMaxDCAz;}\r
+\r
+  // cuts init function\r
+  void Init();\r
+\r
+  // check MC tracks\r
+  virtual Bool_t IsSelected(TObject *) {return kTRUE;}\r
+  virtual Bool_t IsSelected(TList *) {return kTRUE;}\r
+\r
+  //\r
+  Bool_t AcceptTrack(AliESDtrack *track);\r
+  Bool_t AcceptTrackLocalTPC(AliESDtrack *track);\r
+  Bool_t AcceptTrack(AliExternalTrackParam *track);\r
+  Bool_t AcceptTrack(TParticle *particle);\r
+  \r
+  // Merge output objects (needed by PROOF) \r
+  virtual Long64_t Merge(TCollection* list);\r
+\r
+private:\r
+  Float_t fMinEta; // min pseudorapidity \r
+  Float_t fMaxEta; // max pseudorapidity\r
+  Float_t fMinPhi; // min azimuthal angle (rad)\r
+  Float_t fMaxPhi; // max azimuthal angle (rad)\r
+  Float_t fMinPt;  // min pt\r
+  Float_t fMaxPt;  // max pt\r
+  \r
+  Float_t fExcludeMinEta;\r
+  Float_t fExcludeMaxEta;\r
+  Float_t fExcludeMinPhi;\r
+  Float_t fExcludeMaxPhi;\r
+  Float_t fExcludeMinEta2;\r
+  Float_t fExcludeMaxEta2;\r
+  Float_t fExcludeMinPhi2;\r
+  Float_t fExcludeMaxPhi2;  \r
+  Bool_t  fCheckRange;\r
+\r
+  // max DCAr and DCAz with respect\r
+  // to nominal vertex position\r
+  Float_t fMaxDCAr; // min DCAr\r
+  Float_t fMaxDCAz; // max DCAz\r
\r
+  AliFilteredTreeAcceptanceCuts(const AliFilteredTreeAcceptanceCuts&); // not implemented\r
+  AliFilteredTreeAcceptanceCuts& operator=(const AliFilteredTreeAcceptanceCuts&); // not implemented\r
+\r
+  ClassDef(AliFilteredTreeAcceptanceCuts, 1)\r
+};\r
+\r
+#endif // \r
diff --git a/PWGPP/AliFilteredTreeEventCuts.cxx b/PWGPP/AliFilteredTreeEventCuts.cxx
new file mode 100644 (file)
index 0000000..04c8caf
--- /dev/null
@@ -0,0 +1,475 @@
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+
+#include <iostream>
+#include <TList.h>
+
+#include "AliLog.h"
+#include "AliESDEvent.h"
+#include "AliESDVertex.h"
+#include "AliMCEvent.h"
+#include "AliHeader.h"
+#include "AliGenEventHeader.h"
+#include "AliGenPythiaEventHeader.h"
+#include "AliGenCocktailEventHeader.h"
+#include "AliGenDPMjetEventHeader.h"
+#include "AliStack.h"
+
+
+#include "AliFilteredTreeEventCuts.h"
+
+using namespace std;
+
+ClassImp(AliFilteredTreeEventCuts)
+
+Int_t AliFilteredTreeEventCuts::fgLastProcessType = -1;
+
+//_____________________________________________________________________________
+AliFilteredTreeEventCuts::AliFilteredTreeEventCuts(const Char_t* name,const Char_t *title) : 
+AliAnalysisCuts(name, title)
+, fTriggerRequired(kTRUE)
+, fRecVertexRequired(kTRUE)
+, fEventProcessType(kInvalidProcess)
+, fMinNContributors(0)
+, fMaxNContributors(0)
+, fMaxR(0)
+, fMinZv(0)
+, fMaxZv(0)
+, fMeanXv(0)
+, fMeanYv(0)
+, fMeanZv(0)
+, fSigmaMeanXv(0)
+, fSigmaMeanYv(0)
+, fSigmaMeanZv(0)
+, fRedoTPCVertex(kTRUE)
+, fUseBeamSpotConstraint(kTRUE)
+, fEventSelectedRequired(kFALSE)
+{
+  // default constructor 
+  
+  // init data members with defaults
+  Init();
+}
+
+//_____________________________________________________________________________
+AliFilteredTreeEventCuts::~AliFilteredTreeEventCuts()  
+{
+  // destructor
+}
+
+//_____________________________________________________________________________
+void AliFilteredTreeEventCuts::Init()  
+{
+  // set default values
+  SetTriggerRequired();
+  SetRecVertexRequired();
+  SetEventProcessType();
+  SetNContributorsRange();
+  SetMaxR();
+  SetZvRange();
+  SetMeanXYZv();
+  SetSigmaMeanXYZv();
+  SetRedoTPCVertex();
+  SetUseBeamSpotConstraint();
+}
+
+//_____________________________________________________________________________
+Bool_t AliFilteredTreeEventCuts::AcceptEvent(AliESDEvent *esdEvent,AliMCEvent *mcEvent, const AliESDVertex *vtx)
+{
+  // Check event selection cuts
+  Bool_t retValue=kTRUE;
+
+  if(!esdEvent) return kFALSE;
+  if(!IsRecVertexRequired()) return kTRUE;
+  if(!vtx) return kFALSE;
+  if(!vtx->GetStatus()) return kFALSE;
+
+  if(mcEvent) {
+   // check MC event conditions
+   AliHeader* header = mcEvent->Header();
+   if(!header) return kFALSE;
+  
+    // select event type (ND-non diffractive, SD-single diffractive, DD-double diffractive)
+    if(fEventProcessType == kInvalidProcess) { 
+      retValue=kTRUE;
+    } 
+    else if(fEventProcessType == kSD || fEventProcessType == kDD) {
+      MCProcessType processType = GetEventProcessType(header);
+      if(processType == kND) retValue=kFALSE;
+      else retValue=kTRUE;
+    }
+    else if(fEventProcessType == GetEventProcessType(header)) { 
+      retValue=kTRUE;
+    }
+    else 
+      retValue=kFALSE;
+  }
+
+  if(vtx->GetZv() < fMinZv) return kFALSE; 
+  if(vtx->GetZv() > fMaxZv) return kFALSE; 
+
+return retValue;  
+}
+
+//_____________________________________________________________________________
+Bool_t AliFilteredTreeEventCuts::AcceptMCEvent(AliMCEvent *mcEvent)
+{
+  // Check event selection cuts
+  if(!mcEvent) return kFALSE;
+
+  Bool_t retValue=kTRUE;
+
+  // check MC event conditions
+  AliHeader* header = mcEvent->Header();
+  if(!header) return kFALSE;
+
+  AliGenEventHeader* genHeader = header->GenEventHeader();
+  if (!genHeader) {
+    AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
+    return kFALSE;
+  }
+  TArrayF vtxMC(3);
+  genHeader->PrimaryVertex(vtxMC);
+  
+  // select event type (ND-non diffractive, SD-single diffractive, DD-double diffractive)
+  if(fEventProcessType == kInvalidProcess) { 
+     retValue=kTRUE;
+  } else {
+     if(fEventProcessType == GetEventProcessType(header)) retValue=kTRUE;
+     else retValue=kFALSE;
+  }
+
+  /*
+  Float_t R = TMath::Sqrt(vtxMC[0]*vtxMC[0]+vtxMC[1]*vtxMC[1]);
+  if(R > fMaxR) return kFALSE; 
+  */
+
+  if(vtxMC[2] < fMinZv) return kFALSE; 
+  if(vtxMC[2] > fMaxZv) return kFALSE; 
+
+return retValue;  
+}
+
+//_____________________________________________________________________________
+Long64_t AliFilteredTreeEventCuts::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;
+
+  Int_t count=0;
+  while((obj = iter->Next()) != 0) 
+  {
+    AliFilteredTreeEventCuts* entry = dynamic_cast<AliFilteredTreeEventCuts*>(obj);
+    if (entry == 0)  
+      continue; 
+
+  count++;
+  }
+
+return count;
+}
+
+//_____________________________________________________________________________
+AliFilteredTreeEventCuts::MCProcessType AliFilteredTreeEventCuts::GetEventProcessType(AliHeader* aHeader, Bool_t adebug) {
+  //
+  // get the process type of the event.
+  //
+
+
+  // Check for simple headers first
+
+  AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(aHeader->GenEventHeader());
+  if (pythiaGenHeader) {
+    return GetPythiaEventProcessType(pythiaGenHeader,adebug);
+  }
+
+  AliGenDPMjetEventHeader* dpmJetGenHeader = dynamic_cast<AliGenDPMjetEventHeader*>(aHeader->GenEventHeader());
+  if (dpmJetGenHeader) {
+    return GetDPMjetEventProcessType(dpmJetGenHeader,adebug);
+  }
+  
+
+  // check for cocktail
+
+  AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(aHeader->GenEventHeader());
+  if (!genCocktailHeader) {
+    printf("AliFilteredTreeEventCuts::GetProcessType : Unknown header type (not Pythia or Cocktail). \n");
+    return kInvalidProcess;
+  }
+
+  TList* headerList = genCocktailHeader->GetHeaders();
+  if (!headerList) {
+    return kInvalidProcess;
+  }
+
+  for (Int_t i=0; i<headerList->GetEntries(); i++) {
+
+    pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
+    if (pythiaGenHeader) {
+      return GetPythiaEventProcessType(pythiaGenHeader,adebug);
+    }
+
+    dpmJetGenHeader = dynamic_cast<AliGenDPMjetEventHeader*>(headerList->At(i));
+    if (dpmJetGenHeader) {
+      return GetDPMjetEventProcessType(dpmJetGenHeader,adebug);
+    }
+  }
+  return kInvalidProcess;
+}
+
+//____________________________________________________________________
+AliFilteredTreeEventCuts::MCProcessType AliFilteredTreeEventCuts::GetEventProcessType(AliESDEvent* esd, AliHeader* header, AliStack* stack, DiffTreatment diffTreatment)
+{
+  // 
+  // get process type
+  //
+  // diffTreatment:
+  //   kMCFlags: use MC flags
+  //   kUA5Cuts: SD events are those that have the MC SD flag and fulfill M^2/s < 0.05; DD from MC flag; Remainder is ND
+  //   kE710Cuts: SD events are those that have the MC SD flag and fulfill 2 < M^2 < 0.05s; DD from MC flag; Remainder is ND
+  //   kALICEHadronLevel: SD events are those that fulfill M^2/s < 0.05; DD from MC flag; Remainder is ND
+  //
+
+  MCProcessType mcProcessType = GetEventProcessType(header);
+  
+  if (diffTreatment == kMCFlags)
+    return mcProcessType;
+    
+  if (!esd)
+  {
+    Printf("ERROR: AliFilteredTreeEventCuts::GetEventProcessType: diffTreatment != kMCFlags and esd == 0");
+    return kInvalidProcess;
+  }
+    
+  Float_t cms = esd->GetESDRun()->GetBeamEnergy();
+  if (esd->GetESDRun()->IsBeamEnergyIsSqrtSHalfGeV())
+    cms *= 2;
+  //Printf("cms = %f", cms);
+
+  if (diffTreatment == kUA5Cuts && mcProcessType == kSD)
+  {
+    if (IsHadronLevelSingleDiffractive(stack, cms, 0, 0.05))
+      return kSD;
+  }
+  else if (diffTreatment == kE710Cuts && mcProcessType == kSD)
+  {
+    if (IsHadronLevelSingleDiffractive(stack, cms, 2. / cms / cms, 0.05))
+      return kSD;
+  }
+  else if (diffTreatment == kALICEHadronLevel)
+  {
+    if (IsHadronLevelSingleDiffractive(stack, cms, 0, 0.05))
+      return kSD;
+  }
+  
+  if (mcProcessType == kSD)
+    return kND;
+    
+  return mcProcessType;
+}
+
+
+AliFilteredTreeEventCuts::MCProcessType AliFilteredTreeEventCuts::GetPythiaEventProcessType(AliGenEventHeader* aHeader, Bool_t adebug) {
+
+  AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(aHeader);
+
+  if (!pythiaGenHeader) {
+    printf("AliFilteredTreeEventCuts::GetProcessType : Unknown gen Header type). \n");
+    return kInvalidProcess;
+  }
+
+
+  Int_t pythiaType = pythiaGenHeader->ProcessType();
+  fgLastProcessType = pythiaType;
+  MCProcessType globalType = kInvalidProcess;  
+
+
+  if (adebug) {
+    printf("AliFilteredTreeEventCuts::GetProcessType : Pythia process type found: %d \n",pythiaType);
+  }
+
+
+  if(pythiaType==92||pythiaType==93){
+    globalType = kSD;
+  }
+  else if(pythiaType==94){
+    globalType = kDD;
+  }
+  //else if(pythiaType != 91){ // also exclude elastic to be sure... CKB??}
+  else {
+    globalType = kND;
+  }
+  return globalType;
+}
+
+
+AliFilteredTreeEventCuts::MCProcessType AliFilteredTreeEventCuts::GetDPMjetEventProcessType(AliGenEventHeader* aHeader, Bool_t adebug) {
+  //
+  // get the process type of the event.
+  //
+
+  // can only read pythia headers, either directly or from cocktalil header
+  AliGenDPMjetEventHeader* dpmJetGenHeader = dynamic_cast<AliGenDPMjetEventHeader*>(aHeader);
+
+  if (!dpmJetGenHeader) {
+    printf("AliFilteredTreeEventCuts::GetDPMjetProcessType : Unknown header type (not DPMjet or). \n");
+    return kInvalidProcess;
+  }
+
+  Int_t dpmJetType = dpmJetGenHeader->ProcessType();
+  fgLastProcessType = dpmJetType;
+  MCProcessType globalType = kInvalidProcess;  
+
+
+  if (adebug) {
+    printf("AliFilteredTreeEventCuts::GetDPMJetProcessType : DPMJet process type found: %d \n",dpmJetType);
+  }
+
+
+  if (dpmJetType == 1 || dpmJetType == 4) { // explicitly inelastic plus central diffraction
+    globalType = kND;
+  }  
+  else if (dpmJetType==5 || dpmJetType==6) {
+    globalType = kSD;
+  }
+  else if (dpmJetType==7) {
+    globalType = kDD;
+  }
+  return globalType;
+}
+
+//____________________________________________________________________
+Bool_t AliFilteredTreeEventCuts::IsHadronLevelSingleDiffractive(AliStack* stack, Float_t cms, Float_t xiMin, Float_t xiMax)
+{
+  //
+  // return if process is single diffractive on hadron level
+  // 
+  // xiMax and xiMin cut on M^2/s
+  //
+  // Based on code from Martin Poghoysan
+  //
+  
+  TParticle* part1 = 0;
+  TParticle* part2 = 0;
+  
+  Double_t smallestY = 1e10;
+  Double_t largestY  = -1e10;
+  
+  for (Int_t iParticle = 0; iParticle < stack->GetNprimary(); iParticle++)
+  {
+    TParticle* part = stack->Particle(iParticle);
+    if (!part)
+      continue;
+
+    Int_t pdg = TMath::Abs(part->GetPdgCode());
+
+    Int_t child1 = part->GetFirstDaughter();
+    Int_t ist    = part->GetStatusCode();
+
+    Int_t mfl  = Int_t (pdg / TMath::Power(10, Int_t(TMath::Log10(pdg))));
+    if (child1 > -1 || ist != 1)
+      mfl = 0; // select final state charm and beauty
+    if (!(stack->IsPhysicalPrimary(iParticle) || pdg == 111 || pdg == 3212 || pdg==3124 || mfl >= 4)) 
+      continue;
+    Int_t imother = part->GetFirstMother();
+    if (imother>0)
+    {
+      TParticle *partM = stack->Particle(imother);
+      Int_t pdgM=TMath::Abs(partM->GetPdgCode());
+      if (pdgM==111 || pdgM==3124 || pdgM==3212) 
+        continue;
+    }
+    
+    Double_t y = 0;
+
+    // fix for problem with getting mass of particle 3124
+    if (pdg != 3124)
+      y = Rapidity(part->Pt(), part->Pz(), part->GetMass());
+    else 
+      y = Rapidity(part->Pt(), part->Pz(), 1.5195);
+      
+    if (y < smallestY)
+    {
+      smallestY = y;
+      part1 = part;
+    }
+    
+    if (y > largestY)
+    {
+      largestY = y;
+      part2 = part;
+    }
+  }
+  
+  if (part1 == 0 || part2 == 0)
+    return kFALSE;
+
+  Int_t pdg1 = part1->GetPdgCode();
+  Int_t pdg2 = part2->GetPdgCode();
+
+  Double_t pt1 = part1->Pt();
+  Double_t pt2 = part2->Pt();
+  Double_t pz1 = part1->Pz();
+  Double_t pz2 = part2->Pz();
+  
+  Double_t y1 = TMath::Abs(Rapidity(pt1, pz1, 0.938));
+  Double_t y2 = TMath::Abs(Rapidity(pt2, pz2, 0.938));
+  
+  Int_t arm = -99999;
+  if (pdg1 == 2212 && pdg2 == 2212)
+  {
+    if (y1 > y2) 
+      arm = 0;
+    else
+      arm = 1;
+  }
+  else if (pdg1 == 2212) 
+    arm = 0;
+  else if (pdg2 == 2212) 
+    arm = 1;
+
+  Double_t M02s = 1. - 2 * part1->Energy() / cms;
+  Double_t M12s = 1. - 2 * part2->Energy() / cms;
+
+  if (arm == 0 && M02s > xiMin && M02s < xiMax)
+    return kTRUE;
+  else if (arm == 1 && M12s > xiMin && M12s < xiMax)
+    return kTRUE;
+
+  return kFALSE;
+}
+
+//____________________________________________________________________
+Double_t AliFilteredTreeEventCuts::Rapidity(Double_t pt, Double_t pz, Double_t m)
+{
+  //
+  // calculates rapidity keeping the sign in case E == pz
+  //
+
+  Double_t energy = TMath::Sqrt(pt*pt+pz*pz+m*m);
+  if (energy != TMath::Abs(pz))
+    return 0.5*TMath::Log((energy+pz)/(energy-pz));
+
+  Printf("W- mt=0");
+  return TMath::Sign(1.e30,pz);
+}
+
diff --git a/PWGPP/AliFilteredTreeEventCuts.h b/PWGPP/AliFilteredTreeEventCuts.h
new file mode 100644 (file)
index 0000000..a5a97a4
--- /dev/null
@@ -0,0 +1,130 @@
+#ifndef ALIFILTEREDTREEEVENTCUTS_H\r
+#define ALIFILTEREDTREEEVENTCUTS_H\r
+\r
+//------------------------------------------------------------------------------\r
+// Class to keep event selection cuts for dNdPt analysis. \r
+// \r
+// Author: J.Otwinowski 01/11/2008 \r
+//------------------------------------------------------------------------------\r
+\r
+#include "AliAnalysisCuts.h"\r
+\r
+class AliESDEvent;\r
+class AliESDVertex;\r
+class AliMCEvent;\r
+class AliHeader;\r
+class AliGenEventHeader;\r
+class AliStack;\r
+\r
+class AliFilteredTreeEventCuts : public AliAnalysisCuts\r
+{\r
+public:\r
+  AliFilteredTreeEventCuts(const Char_t* name ="AliFilteredTreeEventCuts", const Char_t *title ="");\r
+  virtual ~AliFilteredTreeEventCuts(); \r
+\r
+  //TODO: copied from AliPWG0Helper, find a more central place for these\r
+  enum AnalysisMode { kInvalid = -1, kSPD = 0x1, kTPC = 0x2, kTPCITS = 0x4, kFieldOn = 0x8, kSPDOnlyL0 = 0x10, kTPCSPD = 0x20};\r
+  enum MCProcessType { kInvalidProcess = -1, kND = 0x1, kDD = 0x2, kSD = 0x4, kOnePart = 0x8 };\r
+  enum DiffTreatment { kMCFlags = 0, kUA5Cuts = 1, kE710Cuts, kALICEHadronLevel };\r
+  \r
+  // setters \r
+  void SetTriggerRequired(const Bool_t bFlag=kTRUE)  {fTriggerRequired=bFlag;}\r
+  void SetRecVertexRequired(const Bool_t bFlag=kTRUE)  {fRecVertexRequired=bFlag;}\r
+  void SetEventProcessType(MCProcessType type=kInvalidProcess)  {fEventProcessType=type;}\r
+  void SetNContributorsRange(const Float_t min=0.,const Float_t max=1e99) {fMinNContributors=min; fMaxNContributors=max;}\r
+  void SetMaxR(const Float_t max=1e99) {fMaxR=max;}\r
+  void SetZvRange(const Float_t min=-1e99, const Float_t max=1e99) {fMinZv=min; fMaxZv=max;}\r
+\r
+  void SetMeanXYZv(const Float_t xv=0.0, const Float_t yv=0.0, const Float_t zv=0.0) {\r
+    fMeanXv = xv; fMeanYv = yv; fMeanZv = zv;\r
+  }\r
+\r
+  void SetSigmaMeanXYZv(const Float_t sxv=1.0, const Float_t syv=1.0, const Float_t szv=10.0) {\r
+    fSigmaMeanXv = sxv; fSigmaMeanYv = syv; fSigmaMeanZv = szv;\r
+  }\r
+\r
+\r
+  void SetRedoTPCVertex(const Bool_t redo = kTRUE) {fRedoTPCVertex = redo;}\r
+  void SetUseBeamSpotConstraint(const Bool_t useConstr = kTRUE) {fUseBeamSpotConstraint = useConstr;}\r
+  void SetEventSelectedRequired(const Bool_t evtSel = kTRUE) {fEventSelectedRequired = evtSel;} \r
+\r
+\r
+  // getters \r
+  Bool_t  IsEventSelectedRequired() const {return fEventSelectedRequired;}\r
+  Bool_t  IsTriggerRequired() const {return fTriggerRequired;}\r
+  Bool_t  IsRecVertexRequired() const {return fRecVertexRequired;}\r
+  Int_t   GetEventProcessType() const {return fEventProcessType;}  \r
+  Float_t GetMinNContributors() const {return fMinNContributors;}\r
+  Float_t GetMaxNContributors() const {return fMaxNContributors;}\r
+  Float_t GetMaxR() const {return fMaxR;}\r
+  Float_t GetMinZv() const {return fMinZv;}\r
+  Float_t GetMaxZv() const {return fMaxZv;}\r
+\r
+  Float_t GetMeanXv() const {return fMeanXv;}\r
+  Float_t GetMeanYv() const {return fMeanYv;}\r
+  Float_t GetMeanZv() const {return fMeanZv;}\r
+\r
+  Float_t GetSigmaMeanXv() const {return fSigmaMeanXv;}\r
+  Float_t GetSigmaMeanYv() const {return fSigmaMeanYv;}\r
+  Float_t GetSigmaMeanZv() const {return fSigmaMeanZv;}\r
\r
+  Bool_t IsRedoTPCVertex() const {return fRedoTPCVertex;}\r
+  Bool_t IsUseBeamSpotConstraint() const {return fUseBeamSpotConstraint;}\r
+\r
+\r
+  // cuts init function\r
+  void Init();\r
+\r
+  // check MC tracks\r
+  Bool_t IsSelected(TObject *) {return kTRUE;}\r
+  Bool_t IsSelected(TList *) {return kTRUE;}\r
+\r
+  // accept event\r
+  Bool_t AcceptEvent(AliESDEvent *event=0, AliMCEvent *mcEvent=0, const AliESDVertex *vtx=0);\r
+  Bool_t AcceptMCEvent(AliMCEvent *mcEvent=0);\r
+\r
+  // Merge output objects (needed by PROOF) \r
+  virtual Long64_t Merge(TCollection* list);\r
+\r
+  //statics copied from AliPWG0Helper\r
+  static MCProcessType GetEventProcessType(AliESDEvent* esd, AliHeader* header, AliStack* stack, DiffTreatment diffTreatment);\r
+  static MCProcessType GetEventProcessType(AliHeader* aHeader, Bool_t adebug = kFALSE);\r
+  static MCProcessType GetPythiaEventProcessType(AliGenEventHeader* aHeader, Bool_t adebug = kFALSE);\r
+  static MCProcessType GetDPMjetEventProcessType(AliGenEventHeader* aHeader, Bool_t adebug = kFALSE);\r
+  static Bool_t IsHadronLevelSingleDiffractive(AliStack* stack, Float_t cms, Float_t xiMin, Float_t xiMax);\r
+  static Double_t Rapidity(Double_t pt, Double_t pz, Double_t m);\r
+protected:\r
+  static Int_t fgLastProcessType;    // stores the raw value of the last process type extracted\r
+  //\r
\r
+private:\r
+  Bool_t fTriggerRequired; // trigger required  \r
+  Bool_t fRecVertexRequired; // reconstructed event vertex required  \r
+  Int_t fEventProcessType;   // select MC event process type (ND, SD, DD)\r
+  Float_t fMinNContributors; // min. number of contributing vertex tracks\r
+  Float_t fMaxNContributors; // max. number of contributing vertex tracks\r
+  Float_t fMaxR;             // max. vertex radii (R = sqrt(Xv^2+Yv^2) \r
+  Float_t fMinZv;            // min. Zv vertex\r
+  Float_t fMaxZv;            // max. Zv vertex\r
+\r
+  // interaction spot constraint\r
+  Float_t fMeanXv; // mean Xv position\r
+  Float_t fMeanYv; // mean Yv position\r
+  Float_t fMeanZv; // mean Zv position\r
+\r
+  Float_t fSigmaMeanXv; // sigma mean Xv position \r
+  Float_t fSigmaMeanYv; // sigma mean Yv position\r
+  Float_t fSigmaMeanZv; // sigma mean Zv position\r
\r
+  Bool_t fRedoTPCVertex;         // redo vertex\r
+  Bool_t fUseBeamSpotConstraint; // use beam spot contraints  \r
+\r
+  Bool_t fEventSelectedRequired; // event with at least one track (pT>0.5 GeV, |eta|<0.8) required\r
+\r
+  AliFilteredTreeEventCuts(const AliFilteredTreeEventCuts&); // not implemented\r
+  AliFilteredTreeEventCuts& operator=(const AliFilteredTreeEventCuts&); // not implemented\r
+\r
+  ClassDef(AliFilteredTreeEventCuts, 1)\r
+};\r
+\r
+#endif // ALIFILTEREDTREEEVENTCUTS_H\r
index a574d4b622a336d7329817865ab0455bbd3d861c..aecf2d24800d107ca69a332af4b2fc77a22df75b 100644 (file)
 #pragma link C++ class AliAnaVZEROQA+;
 #pragma link C++ class AliAnaVZEROPbPb+;
 
+#pragma link C++ class AliAnalysisTaskFilteredTree+;
+#pragma link C++ class AliFilteredTreeEventCuts+;
+#pragma link C++ class AliFilteredTreeAcceptanceCuts+;
+
 
 // TRD performance classes
 #pragma link C++ class  AliTenderSupplyTRD+;
diff --git a/PWGPP/macros/AddTaskFilteredTree.C b/PWGPP/macros/AddTaskFilteredTree.C
new file mode 100644 (file)
index 0000000..fc314ee
--- /dev/null
@@ -0,0 +1,161 @@
+void AddTaskFilteredTree()
+{
+  gSystem->Load("libANALYSIS");
+  gSystem->Load("libANALYSISalice");
+  gSystem->Load("libTENDER");
+  gSystem->Load("libCORRFW");
+  gSystem->Load("libPWGUDbase");
+  gSystem->Load("libTPCcalib");
+  gSystem->Load("libPWGPP");
+  gSystem->Load("libPWGLFspectra");
+
+
+  gRandom->SetSeed(0);
+
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+
+  if (!mgr) {
+    Error("AddTaskFilteredTree", "No analysis manager found.");
+    return 0;
+  }
+
+  // Switch off all AliInfo (too much output!!!)
+  AliLog::SetGlobalLogLevel(AliLog::kError);
+  mgr->SetDebugLevel(0);
+
+  
+
+  //
+  // Create physics trigger selection class
+  //
+  //AliPhysicsSelection *physTrigSel =  new AliPhysicsSelection();
+
+  //
+  // Create event cuts
+  //
+  Float_t zvWindow = 30. ;
+
+  AliFilteredTreeEventCuts *evtCuts = new AliFilteredTreeEventCuts("AliFilteredTreeEventCuts","Event cuts");
+  evtCuts->SetZvRange(-zvWindow,zvWindow);
+  evtCuts->SetMeanXYZv(0.0,0.0,0.0);
+  evtCuts->SetSigmaMeanXYZv(1.0,1.0,10.0);
+  evtCuts->SetTriggerRequired(kFALSE);
+  //evtCuts->SetTriggerRequired(kTRUE);
+
+  //
+  // Create geom. acceptance cuts
+  //
+  Float_t etaWindow = 1.0 ;
+  Float_t ptMin = 0.15 ;
+
+  AliFilteredTreeAcceptanceCuts *accCuts = new AliFilteredTreeAcceptanceCuts("AliFilteredTreeAcceptanceCuts","Geom. acceptance cuts");
+  accCuts->SetEtaRange(-etaWindow,etaWindow);
+  accCuts->SetPtRange(ptMin,1.e10);
+  accCuts->SetMaxDCAr(3.0);
+  accCuts->SetMaxDCAz(30.0);
+
+  //
+  // Create standard esd track cuts
+  //
+
+  AliESDtrackCuts* esdTrackCuts = CreateCuts();
+  if (!esdTrackCuts) {
+    printf("ERROR: esdTrackCuts could not be created\n");
+    return;
+  } else {
+    esdTrackCuts->SetHistogramsOn(kTRUE);
+  }
+
+  Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
+
+  //
+  // Create task
+  //
+  AliAnalysisTaskFilteredTree *task = new AliAnalysisTaskFilteredTree("AliAnalysisTaskFilteredTree");
+  task->SetUseMCInfo(hasMC);
+  //task->SetLowPtTrackDownscaligF(1.e4);
+  //task->SetLowPtV0DownscaligF(1.e2);
+  task->SetLowPtTrackDownscaligF(1.e7);
+  task->SetLowPtV0DownscaligF(1.e4);
+  task->SetProcessAll(kTRUE);
+  task->SetProcessCosmics(kTRUE);
+  //task->SetProcessAll(kFALSE);
+
+  // trigger
+  //task->SelectCollisionCandidates(AliVEvent::kMB); 
+
+  //
+  // set analysis options from the Helper here !!!
+  //
+  // AlidNdPtHelper::OutputObject outputObject = AlidNdPtHelper::kCutAnalysisPbPb;
+  // AlidNdPtHelper::ParticleMode particleMode = AlidNdPtHelper::kAllPart ;
+  //AlidNdPtHelper::AnalysisMode analysisMode = AlidNdPtHelper::kTPCITS;
+
+  task->SetUseMCInfo(hasMC);
+  task->SetEventCuts(evtCuts);
+  task->SetAcceptanceCuts(accCuts);
+  task->SetTrackCuts(esdTrackCuts);
+  task->SetAnalysisMode(AliAnalysisTaskFilteredTree::kTPCITSAnalysisMode); 
+  task->SetCentralityEstimator("V0M");
+    
+  // Add task
+  mgr->AddTask(task);
+
+  // Create containers for input
+  AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer();
+  mgr->ConnectInput(task, 0, cinput);
+
+  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("filtered1", TTree::Class(), AliAnalysisManager::kOutputContainer, "FilterEvents_Trees.root");
+  mgr->ConnectOutput(task, 1, coutput1);
+  AliAnalysisDataContainer *coutput2 = mgr->CreateContainer("filtered2", TTree::Class(), AliAnalysisManager::kOutputContainer, "FilterEvents_Trees.root");
+  mgr->ConnectOutput(task, 2, coutput2);
+  AliAnalysisDataContainer *coutput3 = mgr->CreateContainer("filtered3", TTree::Class(), AliAnalysisManager::kOutputContainer, "FilterEvents_Trees.root");
+  mgr->ConnectOutput(task, 3, coutput3);
+  AliAnalysisDataContainer *coutput4 = mgr->CreateContainer("filtered4", TTree::Class(), AliAnalysisManager::kOutputContainer, "FilterEvents_Trees.root");
+  mgr->ConnectOutput(task, 4, coutput4);
+  AliAnalysisDataContainer *coutput5 = mgr->CreateContainer("filtered5", TTree::Class(), AliAnalysisManager::kOutputContainer, "FilterEvents_Trees.root");
+  mgr->ConnectOutput(task, 5, coutput5);
+  AliAnalysisDataContainer *coutput6 = mgr->CreateContainer("filtered6", TTree::Class(), AliAnalysisManager::kOutputContainer, "FilterEvents_Trees.root");
+  mgr->ConnectOutput(task, 6, coutput6);
+}
+
+AliESDtrackCuts* CreateCuts(Bool_t fieldOn = kTRUE, Bool_t hists = kTRUE)
+{
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
+  if(!esdTrackCuts) return 0;
+
+  if (hists)
+    esdTrackCuts->DefineHistograms(1);
+
+  Double_t cov1, cov2, cov3, cov4, cov5;
+  Double_t nSigma;
+  Double_t maxDCAtoVertex, maxDCAtoVertexXY, maxDCAtoVertexZ;
+  Double_t minNClustersTPC;
+  Double_t maxChi2PerClusterTPC;
+  Double_t minPt, maxPt;
+
+  //
+  // TPC
+  //
+  esdTrackCuts->SetRequireTPCRefit(kTRUE);
+  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+  //
+  // ITS
+  //
+  //esdTrackCuts->SetRequireITSRefit(kTRUE);
+  //esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+  //
+
+  TString tag = "TPC+ITS refit and KinkRejection required - for cut studies";
+
+  // cuts for data without field
+  if (!fieldOn)
+  {
+    cov5 = 1e10;
+    tag += " without field";
+  }
+
+  Printf("Created track cuts for: %s", tag.Data());
+
+  return esdTrackCuts;
+}