]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/macros/AddTaskESDFilter.C
new version (M.Vala)
[u/mrichter/AliRoot.git] / ANALYSIS / macros / AddTaskESDFilter.C
index f303a4b26fe20493aae95315efb97fa04e6d0512..c185a7c1b8e112a8c62d10b16b48de7cb506923d 100644 (file)
@@ -1,4 +1,10 @@
-AliAnalysisTaskESDfilter *AddTaskESDFilter()
+AliAnalysisTaskESDfilter *AddTaskESDFilter(Bool_t useKineFilter=kTRUE, 
+                                           Bool_t writeMuonAOD=kFALSE,
+                                           Bool_t writeDimuonAOD=kFALSE,
+                                          Bool_t usePhysicsSelection=kFALSE,
+                                          Bool_t useCentralityTask=kFALSE, 
+                                           Int_t tofTimeZeroType=AliESDpid::kTOF_T0,
+                                          Bool_t enableTPCOnlyAODTracks=kFALSE)
 {
 // Creates a filter task and adds it to the analysis manager.
 
@@ -23,35 +29,149 @@ AliAnalysisTaskESDfilter *AddTaskESDFilter()
    if (!aod_h) {
       ::Error("AddTaskESDFilter", "ESD filtering task needs the manager to have an AOD output handler.");
       return NULL;
+   }
+   // Check if MC handler is connected in case kine filter requested
+   AliMCEventHandler *mcH = (AliMCEventHandler*)mgr->GetMCtruthEventHandler();
+   if (!mcH && useKineFilter) {
+      ::Error("AddTaskESDFilter", "No MC handler connected while kine filtering requested");
+      return NULL;
    }   
    
    // Create the task, add it to the manager and configure it.
-   //===========================================================================
-   
-   // Set of cuts plugged into the ESD filter
+   //===========================================================================   
+   // Barrel tracks filter
    AliAnalysisTaskESDfilter *esdfilter = new AliAnalysisTaskESDfilter("ESD Filter");
+   esdfilter->SetTimeZeroType(tofTimeZeroType);
+   esdfilter->DisableCascades();
+   esdfilter->DisableKinks();
+  
    mgr->AddTask(esdfilter);
-   AliESDtrackCuts* esdTrackCutsL = new AliESDtrackCuts("AliESDtrackCuts", "Loose");
-   esdTrackCutsL->SetMinNClustersTPC(50);   
-   esdTrackCutsL->SetMaxChi2PerClusterTPC(3.5);
-   esdTrackCutsL->SetMaxCovDiagonalElements(2,2,0.5,0.5,2);
-   esdTrackCutsL->SetRequireTPCRefit(kTRUE);
-   esdTrackCutsL->SetMinNsigmaToVertex(3);
-   esdTrackCutsL->SetRequireSigmaToVertex(kTRUE);
-   esdTrackCutsL->SetAcceptKingDaughters(kFALSE);
-   //
+  
+   // Muons
+   Bool_t onlyMuon=kTRUE;
+   Bool_t keepAllEvents=kTRUE;
+   Int_t mcMode=(useKineFilter ? 2 : 0); // use 1 instead of 2 to get all MC information instead of just ancestors of mu tracks
+   AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter",onlyMuon,keepAllEvents,mcMode);
+   mgr->AddTask(esdmuonfilter);
+   if(usePhysicsSelection){
+     esdfilter->SelectCollisionCandidates(AliVEvent::kAny);
+     esdmuonfilter->SelectCollisionCandidates(AliVEvent::kAny);
+   }  
+
+   // Filtering of MC particles (decays conversions etc)
+   // this task has to go AFTER all other filter tasks
+   // since it fills the AODMC array with all
+   // selected MC Particles, only this way we have the 
+   // AODMCparticle information available for following tasks
+   AliAnalysisTaskMCParticleFilter *kinefilter = 0;
+   if (useKineFilter) {
+      kinefilter = new AliAnalysisTaskMCParticleFilter("Particle Kine Filter");
+      mgr->AddTask(kinefilter);
+   }   
+
+   AliAnalysisTaskAODCentralityMaker* ctask = 0;
+   
+   if (useCentralityTask) {
+       ctask = new AliAnalysisTaskAODCentralityMaker("AODCentralityMaker");
+       ctask->SetDeltaAODFileName("AliAODCentrality.root");
+       mgr->AddTask(ctask);
+   }
+
+   // Cuts on primary tracks
+   AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
+
+   // ITS stand-alone tracks
+   AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("ITS stand-alone Track Cuts", "ESD Track Cuts");
+   esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
+
+   // Pixel OR necessary for the electrons
+   AliESDtrackCuts *itsStrong = new AliESDtrackCuts("ITSorSPD", "pixel requirement for ITS");
+   itsStrong->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
+
+
+   // PID for the electrons
+   AliESDpidCuts *electronID = new AliESDpidCuts("Electrons", "Electron PID cuts");
+   electronID->SetTPCnSigmaCut(AliPID::kElectron, 3.);
+
+   // standard cuts with very loose DCA
+   AliESDtrackCuts* esdTrackCutsH = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kFALSE); 
+   esdTrackCutsH->SetMaxDCAToVertexXY(2.4);
+   esdTrackCutsH->SetMaxDCAToVertexZ(3.2);
+   esdTrackCutsH->SetDCAToVertex2D(kTRUE);
+
+   // standard cuts with tight DCA cut
+   AliESDtrackCuts* esdTrackCutsH2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010();
+
+   // standard cuts with tight DCA but with requiring the first SDD cluster instead of an SPD cluster
+   // tracks selected by this cut are exclusive to those selected by the previous cut
+   AliESDtrackCuts* esdTrackCutsH3 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(); 
+   esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
+   esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSDD, AliESDtrackCuts::kFirst);
+   // TPC only tracks: Optionally enable the writing of TPConly information
+   // constrained to SPD vertex in the filter below
+   AliESDtrackCuts* esdTrackCutsTPCOnly = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
+   esdTrackCutsTPCOnly->SetMinNClustersTPC(70);
+
+   // Compose the filter
    AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
+   // 1
    trackFilter->AddCuts(esdTrackCutsL);
-   //
-   esdfilter->SetTrackFilter(trackFilter);
-   esdfilter->SetDebugLevel(10);
+   // 2
+   trackFilter->AddCuts(esdTrackCutsITSsa);
+   // 4
+   trackFilter->AddCuts(itsStrong);
+   itsStrong->SetFilterMask(1);        // AND with Standard track cuts 
+   // 8
+   trackFilter->AddCuts(electronID);
+   electronID->SetFilterMask(4);       // AND with Pixel Cuts
+   // 16
+   trackFilter->AddCuts(esdTrackCutsH);
+   // 32
+   trackFilter->AddCuts(esdTrackCutsH2);
+   // 64
+   trackFilter->AddCuts(esdTrackCutsH3);
+   // 128 , 1 << 7
+   trackFilter->AddCuts(esdTrackCutsTPCOnly);
+   if(enableTPCOnlyAODTracks)esdfilter->SetTPCOnlyFilterMask(128);
 
+   // Filter with cuts on V0s
+   AliESDv0Cuts*   esdV0Cuts = new AliESDv0Cuts("Standard V0 Cuts pp", "ESD V0 Cuts");
+   esdV0Cuts->SetMinRadius(0.2);
+   esdV0Cuts->SetMaxRadius(200);
+   esdV0Cuts->SetMinDcaPosToVertex(0.05);
+   esdV0Cuts->SetMinDcaNegToVertex(0.05);
+   esdV0Cuts->SetMaxDcaV0Daughters(1.5);
+   esdV0Cuts->SetMinCosinePointingAngle(0.99);
+   AliAnalysisFilter* v0Filter = new AliAnalysisFilter("v0Filter");
+   v0Filter->AddCuts(esdV0Cuts);
 
+   esdfilter->SetTrackFilter(trackFilter);
+   esdfilter->SetV0Filter(v0Filter);
+
+   // Enable writing of Muon AODs
+   esdmuonfilter->SetWriteMuonAOD(writeMuonAOD);
+   
+   // Enable writing of Dimuon AODs
+   esdmuonfilter->SetWriteDimuonAOD(writeDimuonAOD);
    // Create ONLY the output containers for the data produced by the task.
    // Get and connect other common input/output containers via the manager as below
    //==============================================================================
    mgr->ConnectInput  (esdfilter,  0, mgr->GetCommonInputContainer());
    mgr->ConnectOutput (esdfilter,  0, mgr->GetCommonOutputContainer());
+   mgr->ConnectInput  (esdmuonfilter, 0, mgr->GetCommonInputContainer());
+   if (useKineFilter) {
+      mgr->ConnectInput  (kinefilter,  0, mgr->GetCommonInputContainer());
+      mgr->ConnectOutput (kinefilter,  0, mgr->GetCommonOutputContainer());
+      AliAnalysisDataContainer *coutputEx = mgr->CreateContainer("cFilterList", TList::Class(),
+                                                                  AliAnalysisManager::kOutputContainer,"pyxsec_hists.root");
+      mgr->ConnectOutput (kinefilter,  1,coutputEx);
+   }   
+   if (useCentralityTask) {
+       mgr->ConnectInput (ctask, 0, mgr->GetCommonInputContainer());
+       mgr->ConnectOutput(ctask, 0, mgr->GetCommonOutputContainer());
+   }
    return esdfilter;
-}   
-   
+ }