]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/macros/AddTaskESDFilter.C
a5b78f33f3cea2b65d8cbe7373adc953934ebfd6
[u/mrichter/AliRoot.git] / ANALYSIS / macros / AddTaskESDFilter.C
1
2 Bool_t AddTrackCutsLHC10h(AliAnalysisTaskESDfilter* esdFilter);
3 Bool_t AddTrackCutsLHC11h(AliAnalysisTaskESDfilter* esdFilter);
4 Bool_t enableTPCOnlyAODTracksLocalFlag=kFALSE;
5
6
7 AliAnalysisTaskESDfilter *AddTaskESDFilter(Bool_t useKineFilter=kTRUE, 
8                                            Bool_t writeMuonAOD=kFALSE,
9                                            Bool_t writeDimuonAOD=kFALSE,
10                                            Bool_t usePhysicsSelection=kFALSE,
11                                            Bool_t useCentralityTask=kFALSE, /*obsolete*/
12                                            Int_t  tofTimeZeroType=AliESDpid::kTOF_T0,
13                                            Bool_t enableTPCOnlyAODTracks=kFALSE,
14                                            Bool_t disableCascades=kFALSE,
15                                            Bool_t disableKinks=kFALSE, Int_t runFlag = 1100,
16                                            Int_t  muonMCMode = 2)
17 {
18   // Creates a filter task and adds it to the analysis manager.
19    // Get the pointer to the existing analysis manager via the static access method.
20    //==============================================================================
21    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
22    if (!mgr) {
23       ::Error("AddTaskESDFilter", "No analysis manager to connect to.");
24       return NULL;
25    }   
26    
27    // This task requires an ESD input handler and an AOD output handler.
28    // Check this using the analysis manager.
29    //===============================================================================
30    TString type = mgr->GetInputEventHandler()->GetDataType();
31    if (!type.Contains("ESD")) {
32       ::Error("AddTaskESDFilter", "ESD filtering task needs the manager to have an ESD input handler.");
33       return NULL;
34    }   
35    // Check if AOD output handler exist.
36    AliAODHandler *aod_h = (AliAODHandler*)mgr->GetOutputEventHandler();
37    if (!aod_h) {
38       ::Error("AddTaskESDFilter", "ESD filtering task needs the manager to have an AOD output handler.");
39       return NULL;
40    }
41    // Check if MC handler is connected in case kine filter requested
42    AliMCEventHandler *mcH = (AliMCEventHandler*)mgr->GetMCtruthEventHandler();
43    if (!mcH && useKineFilter) {
44       ::Error("AddTaskESDFilter", "No MC handler connected while kine filtering requested");
45       return NULL;
46    }   
47    
48    // Create the task, add it to the manager and configure it.
49    //===========================================================================   
50    // Barrel tracks filter
51    AliAnalysisTaskESDfilter *esdfilter = new AliAnalysisTaskESDfilter("ESD Filter");
52    esdfilter->SetTimeZeroType(tofTimeZeroType);
53    if (disableCascades) esdfilter->DisableCascades();
54    if  (disableKinks) esdfilter->DisableKinks();
55   
56    mgr->AddTask(esdfilter);
57   
58    // Muons
59    Bool_t onlyMuon=kTRUE;
60    Bool_t keepAllEvents=kTRUE;
61    Int_t mcMode= useKineFilter ? muonMCMode : 0; // use 1 instead of 2 to get all MC information instead of just ancestors of mu tracks
62    AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter",onlyMuon,keepAllEvents,mcMode);
63    mgr->AddTask(esdmuonfilter);
64    if(usePhysicsSelection){
65      esdfilter->SelectCollisionCandidates(AliVEvent::kAny);
66      esdmuonfilter->SelectCollisionCandidates(AliVEvent::kAny);
67    }  
68
69    // Filtering of MC particles (decays conversions etc)
70    // this task has to go AFTER all other filter tasks
71    // since it fills the AODMC array with all
72    // selected MC Particles, only this way we have the 
73    // AODMCparticle information available for following tasks
74    AliAnalysisTaskMCParticleFilter *kinefilter = 0;
75    if (useKineFilter) {
76       kinefilter = new AliAnalysisTaskMCParticleFilter("Particle Kine Filter");
77       mgr->AddTask(kinefilter);
78    }   
79
80    enableTPCOnlyAODTracksLocalFlag = enableTPCOnlyAODTracks;
81    if((runFlag/100)==10){
82      AddTrackCutsLHC10h(esdfilter);
83    }
84    else {
85      // default 11h
86      AddTrackCutsLHC11h(esdfilter);
87    }
88
89    // Filter with cuts on V0s
90    AliESDv0Cuts*   esdV0Cuts = new AliESDv0Cuts("Standard V0 Cuts pp", "ESD V0 Cuts");
91    esdV0Cuts->SetMinRadius(0.2);
92    esdV0Cuts->SetMaxRadius(200);
93    esdV0Cuts->SetMinDcaPosToVertex(0.05);
94    esdV0Cuts->SetMinDcaNegToVertex(0.05);
95    esdV0Cuts->SetMaxDcaV0Daughters(1.5);
96    esdV0Cuts->SetMinCosinePointingAngle(0.99);
97    AliAnalysisFilter* v0Filter = new AliAnalysisFilter("v0Filter");
98    v0Filter->AddCuts(esdV0Cuts);
99
100    esdfilter->SetV0Filter(v0Filter);
101
102    // Enable writing of Muon AODs
103    esdmuonfilter->SetWriteMuonAOD(writeMuonAOD);
104    
105    // Enable writing of Dimuon AODs
106    esdmuonfilter->SetWriteDimuonAOD(writeDimuonAOD);
107  
108    // Create ONLY the output containers for the data produced by the task.
109    // Get and connect other common input/output containers via the manager as below
110    //==============================================================================
111    mgr->ConnectInput  (esdfilter,  0, mgr->GetCommonInputContainer());
112    mgr->ConnectOutput (esdfilter,  0, mgr->GetCommonOutputContainer());
113    mgr->ConnectInput  (esdmuonfilter, 0, mgr->GetCommonInputContainer());
114    if (useKineFilter) {
115       mgr->ConnectInput  (kinefilter,  0, mgr->GetCommonInputContainer());
116       mgr->ConnectOutput (kinefilter,  0, mgr->GetCommonOutputContainer());
117       AliAnalysisDataContainer *coutputEx = mgr->CreateContainer("cFilterList", TList::Class(),
118                                                                    AliAnalysisManager::kOutputContainer,"pyxsec_hists.root");
119       mgr->ConnectOutput (kinefilter,  1,coutputEx);
120    }   
121    return esdfilter;
122 }
123  
124
125
126
127 Bool_t AddTrackCutsLHC10h(AliAnalysisTaskESDfilter* esdfilter){
128
129   Printf("%s%d: Creating Track Cuts for LH10h",(char*)__FILE__,__LINE__);
130
131   // Cuts on primary tracks
132   AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
133   
134   // ITS stand-alone tracks
135   AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("ITS stand-alone Track Cuts", "ESD Track Cuts");
136   esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
137   
138   // Pixel OR necessary for the electrons
139   AliESDtrackCuts *itsStrong = new AliESDtrackCuts("ITSorSPD", "pixel requirement for ITS");
140   itsStrong->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
141   
142   
143   // PID for the electrons
144   AliESDpidCuts *electronID = new AliESDpidCuts("Electrons", "Electron PID cuts");
145   electronID->SetTPCnSigmaCut(AliPID::kElectron, 3.5);
146   
147   // tighter cuts on primary particles for high pT tracks
148   // take the standard cuts, which include already 
149   // ITSrefit and use only primaries...
150   
151   // ITS cuts for new jet analysis 
152   //  gROOT->LoadMacro("$ALICE_ROOT/PWGJE/macros/CreateTrackCutsPWGJE.C");
153   //  AliESDtrackCuts* esdTrackCutsHG0 = CreateTrackCutsPWGJE(10001006);
154
155   AliESDtrackCuts *jetCuts1006 = new AliESDtrackCuts("AliESDtrackCuts"); 
156
157   TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
158   jetCuts1006->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep,20.);
159   jetCuts1006->SetMinNClustersTPC(70);
160   jetCuts1006->SetMaxChi2PerClusterTPC(4);
161   jetCuts1006->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
162   jetCuts1006->SetAcceptKinkDaughters(kFALSE);
163   jetCuts1006->SetRequireTPCRefit(kTRUE);
164   jetCuts1006->SetMaxFractionSharedTPCClusters(0.4);
165   // ITS
166   jetCuts1006->SetRequireITSRefit(kTRUE);
167   //accept secondaries
168   jetCuts1006->SetMaxDCAToVertexXY(2.4);
169   jetCuts1006->SetMaxDCAToVertexZ(3.2);
170   jetCuts1006->SetDCAToVertex2D(kTRUE);
171   //reject fakes
172   jetCuts1006->SetMaxChi2PerClusterITS(36);
173   jetCuts1006->SetMaxChi2TPCConstrainedGlobal(36);
174
175   jetCuts1006->SetRequireSigmaToVertex(kFALSE);
176
177   jetCuts1006->SetEtaRange(-0.9,0.9);
178   jetCuts1006->SetPtRange(0.15, 1E+15.);
179
180   AliESDtrackCuts* esdTrackCutsHG0 = jetCuts1006->Clone("JetCuts10001006");
181   esdTrackCutsHG0->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
182
183
184   // throw out tracks with too low number of clusters in
185   // the first pass (be consistent with TPC only tracks)
186   // N.B. the number off crossed rows still acts on the tracks after
187   // all iterations if we require tpc standalone, number of clusters
188   // and chi2 TPC cuts act on track after the first iteration
189   //   esdTrackCutsH0->SetRequireTPCStandAlone(kTRUE);
190   //   esdTrackCutsH0->SetMinNClustersTPC(80); // <--- first pass
191   
192   
193   // the complement to the one with SPD requirement
194   //  AliESDtrackCuts* esdTrackCutsHG1 = CreateTrackCutsPWGJE(10011006);
195   AliESDtrackCuts* esdTrackCutsHG1 = jetCuts1006->Clone("JetCuts10011006");
196   esdTrackCutsHG1->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
197
198   // the tracks that must not be taken pass this cut and
199   // non HGC1 and HG
200   //  AliESDtrackCuts* esdTrackCutsHG2 = CreateTrackCutsPWGJE(10021006);
201   AliESDtrackCuts* esdTrackCutsHG2 = jetCuts1006->Clone("JetCuts10021006");
202   esdTrackCutsHG2->SetMaxChi2PerClusterITS(1E10);
203
204
205   // standard cuts also used in R_AA analysis
206   //   "Global track RAA analysis QM2011 + Chi2ITS<36";
207   //  AliESDtrackCuts* esdTrackCutsH2 = CreateTrackCutsPWGJE(1000);
208   AliESDtrackCuts* esdTrackCutsH2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE,1);
209   esdTrackCutsH2->SetMinNCrossedRowsTPC(120);
210   esdTrackCutsH2->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
211   esdTrackCutsH2->SetMaxChi2PerClusterITS(36);
212   esdTrackCutsH2->SetMaxFractionSharedTPCClusters(0.4);
213   esdTrackCutsH2->SetMaxChi2TPCConstrainedGlobal(36);
214
215   esdTrackCutsH2->SetEtaRange(-0.9,0.9);
216   esdTrackCutsH2->SetPtRange(0.15, 1e10);
217
218
219   //  AliESDtrackCuts* esdTrackCutsGCOnly = CreateTrackCutsPWGJE(10041006);
220   AliESDtrackCuts* esdTrackCutsGCOnly = jetCuts1006->Clone("JetCuts10041006");
221   esdTrackCutsGCOnly->SetRequireITSRefit(kFALSE);
222
223
224
225   // TPC only tracks
226   AliESDtrackCuts* esdTrackCutsTPCCOnly = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
227   esdTrackCutsTPCCOnly->SetMinNClustersTPC(70);
228   
229   // Compose the filter
230   AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
231   // 1, 1<<0
232   trackFilter->AddCuts(esdTrackCutsL);
233   // 2 1<<1
234   trackFilter->AddCuts(esdTrackCutsITSsa);
235   // 4 1<<2
236   trackFilter->AddCuts(itsStrong);
237   itsStrong->SetFilterMask(1);        // AND with Standard track cuts 
238   // 8 1<<3
239   trackFilter->AddCuts(electronID);
240   electronID->SetFilterMask(4);       // AND with Pixel Cuts
241   // 16 1<<4
242   trackFilter->AddCuts(esdTrackCutsHG0);
243   // 32 1<<5
244   trackFilter->AddCuts(esdTrackCutsHG1);
245   // 64 1<<6
246   trackFilter->AddCuts(esdTrackCutsHG2);
247   // 128 1<<7
248   trackFilter->AddCuts(esdTrackCutsTPCCOnly); // add QM TPC only track cuts
249   if(enableTPCOnlyAODTracksLocalFlag)esdfilter->SetTPCOnlyFilterMask(128);
250   // 256 1<<8
251   trackFilter->AddCuts(esdTrackCutsGCOnly);
252   // 512 1<<9                         
253   AliESDtrackCuts* esdTrackCutsHG1_tmp = new AliESDtrackCuts(*esdTrackCutsHG1); // avoid double delete
254   trackFilter->AddCuts(esdTrackCutsHG1_tmp); // add once more for tpc only tracks
255   // 1024 1<<10                        
256   trackFilter->AddCuts(esdTrackCutsH2); // add r_aa cuts
257
258   
259   
260   esdfilter->SetGlobalConstrainedFilterMask(1<<8|1<<9); // these tracks are written out as global constrained tracks
261   esdfilter->SetHybridFilterMaskGlobalConstrainedGlobal((1<<4)); // these normal global tracks will be marked as hybrid
262   esdfilter->SetWriteHybridGlobalConstrainedOnly(kTRUE); // write only the complement
263   //     esdfilter->SetTPCConstrainedFilterMask(1<<11); // these tracks are written out as tpc constrained tracks
264
265   esdfilter->SetTrackFilter(trackFilter);
266   return kTRUE;
267   
268 }
269
270
271
272 Bool_t AddTrackCutsLHC11h(AliAnalysisTaskESDfilter* esdfilter){
273
274
275   Printf("%s%d: Creating Track Cuts LHC11h",(char*)__FILE__,__LINE__);
276
277   // Cuts on primary tracks
278    AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
279
280    // ITS stand-alone tracks
281    AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("ITS stand-alone Track Cuts", "ESD Track Cuts");
282    esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
283
284    // Pixel OR necessary for the electrons
285    AliESDtrackCuts *itsStrong = new AliESDtrackCuts("ITSorSPD", "pixel requirement for ITS");
286    itsStrong->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
287
288
289    // PID for the electrons
290    AliESDpidCuts *electronID = new AliESDpidCuts("Electrons", "Electron PID cuts");
291    electronID->SetTPCnSigmaCut(AliPID::kElectron, 3.);
292
293    // standard cuts with very loose DCA
294    AliESDtrackCuts* esdTrackCutsH = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE); 
295    esdTrackCutsH->SetMaxDCAToVertexXY(2.4);
296    esdTrackCutsH->SetMaxDCAToVertexZ(3.2);
297    esdTrackCutsH->SetDCAToVertex2D(kTRUE);
298
299    // standard cuts with tight DCA cut
300    AliESDtrackCuts* esdTrackCutsH2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
301
302    // standard cuts with tight DCA but with requiring the first SDD cluster instead of an SPD cluster
303    // tracks selected by this cut are exclusive to those selected by the previous cut
304    AliESDtrackCuts* esdTrackCutsH3 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(); 
305    esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
306    esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSDD, AliESDtrackCuts::kFirst);
307  
308    // TPC only tracks: Optionally enable the writing of TPConly information
309    // constrained to SPD vertex in the filter below
310    AliESDtrackCuts* esdTrackCutsTPCOnly = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
311    // The following line is needed for 2010 PbPb reprocessing and pp, but not for 2011 PbPb
312    //esdTrackCutsTPCOnly->SetMinNClustersTPC(70);
313
314    // Extra cuts for hybrids
315    // first the global tracks we want to take
316    AliESDtrackCuts* esdTrackCutsHTG = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE); 
317    esdTrackCutsHTG->SetName("Global Hybrid tracks, loose DCA");
318    esdTrackCutsHTG->SetMaxDCAToVertexXY(2.4);
319    esdTrackCutsHTG->SetMaxDCAToVertexZ(3.2);
320    esdTrackCutsHTG->SetDCAToVertex2D(kTRUE);
321    esdTrackCutsHTG->SetMaxChi2TPCConstrainedGlobal(36);
322    
323    // Than the complementary tracks which will be stored as global
324    // constraint, complement is done in the ESDFilter task
325    AliESDtrackCuts* esdTrackCutsHTGC = new AliESDtrackCuts(*esdTrackCutsHTG);
326    esdTrackCutsHTGC->SetName("Global Constraint Hybrid tracks, loose DCA no it requirement");
327    esdTrackCutsHTGC->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kOff);
328    esdTrackCutsHTGC->SetRequireITSRefit(kFALSE);
329
330    // standard cuts with tight DCA cut, using cluster cut instead of crossed rows (a la 2010 default)
331    AliESDtrackCuts* esdTrackCutsH2Cluster = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE, 0);
332
333    // Compose the filter
334    AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
335    // 1, 1<<0
336    trackFilter->AddCuts(esdTrackCutsL);
337    // 2, 1<<1
338    trackFilter->AddCuts(esdTrackCutsITSsa);
339    // 4, 1<<2
340    trackFilter->AddCuts(itsStrong);
341    itsStrong->SetFilterMask(1);        // AND with Standard track cuts 
342    // 8, 1<<3
343    trackFilter->AddCuts(electronID);
344    electronID->SetFilterMask(4);       // AND with Pixel Cuts
345    // 16, 1<<4
346    trackFilter->AddCuts(esdTrackCutsH);
347    // 32, 1<<5
348    trackFilter->AddCuts(esdTrackCutsH2);
349    // 64, 1<<6
350    trackFilter->AddCuts(esdTrackCutsH3);
351    // 128 , 1 << 7
352    trackFilter->AddCuts(esdTrackCutsTPCOnly);
353    if(enableTPCOnlyAODTracksLocalFlag)esdfilter->SetTPCOnlyFilterMask(128);
354    // 256, 1 << 8 Global Hybrids
355    trackFilter->AddCuts(esdTrackCutsHTG);
356    esdfilter->SetHybridFilterMaskGlobalConstrainedGlobal((1<<8)); // these normal global tracks will be marked as hybrid    
357    // 512, 1<< 9 GlobalConstraint Hybrids
358    trackFilter->AddCuts(esdTrackCutsHTGC);
359    esdfilter->SetGlobalConstrainedFilterMask(1<<9); // these tracks are written out as global constrained tracks 
360    esdfilter->SetWriteHybridGlobalConstrainedOnly(kTRUE); // write only the complement
361    // 1024, 1<< 10 // tight DCA cuts
362    trackFilter->AddCuts(esdTrackCutsH2Cluster);
363    esdfilter->SetTrackFilter(trackFilter);
364
365    return kTRUE;
366
367 }