]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ANALYSIS/macros/AddTaskESDFilter.C
including new Salvatore's patch
[u/mrichter/AliRoot.git] / ANALYSIS / macros / AddTaskESDFilter.C
CommitLineData
65e273c4 1
2Bool_t AddTrackCutsLHC10h(AliAnalysisTaskESDfilter* esdFilter);
3Bool_t AddTrackCutsLHC11h(AliAnalysisTaskESDfilter* esdFilter);
4Bool_t enableTPCOnlyAODTracksLocalFlag=kFALSE;
5
6
79bd4a7a 7AliAnalysisTaskESDfilter *AddTaskESDFilter(Bool_t useKineFilter=kTRUE,
8 Bool_t writeMuonAOD=kFALSE,
daf100e1 9 Bool_t writeDimuonAOD=kFALSE,
4354b266 10 Bool_t usePhysicsSelection=kFALSE,
bd625b5b 11 Bool_t useCentralityTask=kFALSE, /*obsolete*/
4354b266 12 Int_t tofTimeZeroType=AliESDpid::kTOF_T0,
13 Bool_t enableTPCOnlyAODTracks=kFALSE,
14 Bool_t disableCascades=kFALSE,
969b748a 15 Bool_t disableKinks=kFALSE, Int_t runFlag = 1100,
16 Int_t muonMCMode = 2)
3ef9ce84 17{
65e273c4 18 // Creates a filter task and adds it to the analysis manager.
3ef9ce84 19 // Get the pointer to the existing analysis manager via the static access method.
20 //==============================================================================
21 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
22 if (!mgr) {
c85963a0 23 ::Error("AddTaskESDFilter", "No analysis manager to connect to.");
3ef9ce84 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")) {
c85963a0 32 ::Error("AddTaskESDFilter", "ESD filtering task needs the manager to have an ESD input handler.");
3ef9ce84 33 return NULL;
34 }
35 // Check if AOD output handler exist.
36 AliAODHandler *aod_h = (AliAODHandler*)mgr->GetOutputEventHandler();
37 if (!aod_h) {
c85963a0 38 ::Error("AddTaskESDFilter", "ESD filtering task needs the manager to have an AOD output handler.");
3ef9ce84 39 return NULL;
099d8f33 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;
3ef9ce84 46 }
47
48 // Create the task, add it to the manager and configure it.
099d8f33 49 //===========================================================================
50 // Barrel tracks filter
3ef9ce84 51 AliAnalysisTaskESDfilter *esdfilter = new AliAnalysisTaskESDfilter("ESD Filter");
26917b0b 52 esdfilter->SetTimeZeroType(tofTimeZeroType);
4354b266 53 if (disableCascades) esdfilter->DisableCascades();
54 if (disableKinks) esdfilter->DisableKinks();
c7ef1c47 55
56 mgr->AddTask(esdfilter);
57
099d8f33 58 // Muons
14d6fad5 59 Bool_t onlyMuon=kTRUE;
60 Bool_t keepAllEvents=kTRUE;
969b748a 61 Int_t mcMode= useKineFilter ? muonMCMode : 0; // use 1 instead of 2 to get all MC information instead of just ancestors of mu tracks
14d6fad5 62 AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter",onlyMuon,keepAllEvents,mcMode);
099d8f33 63 mgr->AddTask(esdmuonfilter);
daf100e1 64 if(usePhysicsSelection){
0c6c629b 65 esdfilter->SelectCollisionCandidates(AliVEvent::kAny);
66 esdmuonfilter->SelectCollisionCandidates(AliVEvent::kAny);
daf100e1 67 }
3827f93a 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
65e273c4 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
127Bool_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.);
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
d8831c42 262 esdfilter->SetWriteHybridGlobalConstrainedOnly(kTRUE); // write only the complement
65e273c4 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
272Bool_t AddTrackCutsLHC11h(AliAnalysisTaskESDfilter* esdfilter){
273
274
275 Printf("%s%d: Creating Track Cuts LHC11h",(char*)__FILE__,__LINE__);
276
277 // Cuts on primary tracks
31a3bbb0 278 AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
a550fcbd 279
099d8f33 280 // ITS stand-alone tracks
04f2cd11 281 AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("ITS stand-alone Track Cuts", "ESD Track Cuts");
31a3bbb0 282 esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
099d8f33 283
a550fcbd 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
103431ad 293 // standard cuts with very loose DCA
0914b519 294 AliESDtrackCuts* esdTrackCutsH = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
cfd26fc5 295 esdTrackCutsH->SetMaxDCAToVertexXY(2.4);
296 esdTrackCutsH->SetMaxDCAToVertexZ(3.2);
297 esdTrackCutsH->SetDCAToVertex2D(kTRUE);
cfd26fc5 298
103431ad 299 // standard cuts with tight DCA cut
0914b519 300 AliESDtrackCuts* esdTrackCutsH2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
103431ad 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
0914b519 304 AliESDtrackCuts* esdTrackCutsH3 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
103431ad 305 esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
306 esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSDD, AliESDtrackCuts::kFirst);
cfd26fc5 307
4dae02e3 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();
b7cce158 311 // The following line is needed for 2010 PbPb reprocessing and pp, but not for 2011 PbPb
312 //esdTrackCutsTPCOnly->SetMinNClustersTPC(70);
a550fcbd 313
0914b519 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);
50a15d74 328 esdTrackCutsHTGC->SetRequireITSRefit(kFALSE);
0914b519 329
ba206921 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
a550fcbd 333 // Compose the filter
3ef9ce84 334 AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
0914b519 335 // 1, 1<<0
3ef9ce84 336 trackFilter->AddCuts(esdTrackCutsL);
0914b519 337 // 2, 1<<1
099d8f33 338 trackFilter->AddCuts(esdTrackCutsITSsa);
0914b519 339 // 4, 1<<2
a550fcbd 340 trackFilter->AddCuts(itsStrong);
341 itsStrong->SetFilterMask(1); // AND with Standard track cuts
0914b519 342 // 8, 1<<3
a550fcbd 343 trackFilter->AddCuts(electronID);
344 electronID->SetFilterMask(4); // AND with Pixel Cuts
0914b519 345 // 16, 1<<4
cfd26fc5 346 trackFilter->AddCuts(esdTrackCutsH);
0914b519 347 // 32, 1<<5
103431ad 348 trackFilter->AddCuts(esdTrackCutsH2);
0914b519 349 // 64, 1<<6
103431ad 350 trackFilter->AddCuts(esdTrackCutsH3);
4dae02e3 351 // 128 , 1 << 7
352 trackFilter->AddCuts(esdTrackCutsTPCOnly);
65e273c4 353 if(enableTPCOnlyAODTracksLocalFlag)esdfilter->SetTPCOnlyFilterMask(128);
0914b519 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
8b47ec90 361 // 1024, 1<< 10 // tight DCA cuts
ba206921 362 trackFilter->AddCuts(esdTrackCutsH2Cluster);
3ef9ce84 363 esdfilter->SetTrackFilter(trackFilter);
3ef9ce84 364
65e273c4 365 return kTRUE;
366
367}