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