2 Bool_t AddTrackCutsLHC10h(AliAnalysisTaskESDfilter* esdFilter);
3 Bool_t AddTrackCutsLHC11h(AliAnalysisTaskESDfilter* esdFilter);
4 Bool_t enableTPCOnlyAODTracksLocalFlag=kFALSE;
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)
17 // Creates a filter task and adds it to the analysis manager.
18 // Get the pointer to the existing analysis manager via the static access method.
19 //==============================================================================
20 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
22 ::Error("AddTaskESDFilter", "No analysis manager to connect to.");
26 // This task requires an ESD input handler and an AOD output handler.
27 // Check this using the analysis manager.
28 //===============================================================================
29 TString type = mgr->GetInputEventHandler()->GetDataType();
30 if (!type.Contains("ESD")) {
31 ::Error("AddTaskESDFilter", "ESD filtering task needs the manager to have an ESD input handler.");
34 // Check if AOD output handler exist.
35 AliAODHandler *aod_h = (AliAODHandler*)mgr->GetOutputEventHandler();
37 ::Error("AddTaskESDFilter", "ESD filtering task needs the manager to have an AOD output handler.");
40 // Check if MC handler is connected in case kine filter requested
41 AliMCEventHandler *mcH = (AliMCEventHandler*)mgr->GetMCtruthEventHandler();
42 if (!mcH && useKineFilter) {
43 ::Error("AddTaskESDFilter", "No MC handler connected while kine filtering requested");
47 // Create the task, add it to the manager and configure it.
48 //===========================================================================
49 // Barrel tracks filter
50 AliAnalysisTaskESDfilter *esdfilter = new AliAnalysisTaskESDfilter("ESD Filter");
51 esdfilter->SetTimeZeroType(tofTimeZeroType);
52 if (disableCascades) esdfilter->DisableCascades();
53 if (disableKinks) esdfilter->DisableKinks();
55 mgr->AddTask(esdfilter);
58 Bool_t onlyMuon=kTRUE;
59 Bool_t keepAllEvents=kTRUE;
60 Int_t mcMode=(useKineFilter ? 2 : 0); // use 1 instead of 2 to get all MC information instead of just ancestors of mu tracks
61 AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter",onlyMuon,keepAllEvents,mcMode);
62 mgr->AddTask(esdmuonfilter);
63 if(usePhysicsSelection){
64 esdfilter->SelectCollisionCandidates(AliVEvent::kAny);
65 esdmuonfilter->SelectCollisionCandidates(AliVEvent::kAny);
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;
75 kinefilter = new AliAnalysisTaskMCParticleFilter("Particle Kine Filter");
76 mgr->AddTask(kinefilter);
79 enableTPCOnlyAODTracksLocalFlag = enableTPCOnlyAODTracks;
80 if((runFlag/100)==10){
81 AddTrackCutsLHC10h(esdfilter);
85 AddTrackCutsLHC11h(esdfilter);
88 // Filter with cuts on V0s
89 AliESDv0Cuts* esdV0Cuts = new AliESDv0Cuts("Standard V0 Cuts pp", "ESD V0 Cuts");
90 esdV0Cuts->SetMinRadius(0.2);
91 esdV0Cuts->SetMaxRadius(200);
92 esdV0Cuts->SetMinDcaPosToVertex(0.05);
93 esdV0Cuts->SetMinDcaNegToVertex(0.05);
94 esdV0Cuts->SetMaxDcaV0Daughters(1.5);
95 esdV0Cuts->SetMinCosinePointingAngle(0.99);
96 AliAnalysisFilter* v0Filter = new AliAnalysisFilter("v0Filter");
97 v0Filter->AddCuts(esdV0Cuts);
99 esdfilter->SetV0Filter(v0Filter);
101 // Enable writing of Muon AODs
102 esdmuonfilter->SetWriteMuonAOD(writeMuonAOD);
104 // Enable writing of Dimuon AODs
105 esdmuonfilter->SetWriteDimuonAOD(writeDimuonAOD);
107 // Create ONLY the output containers for the data produced by the task.
108 // Get and connect other common input/output containers via the manager as below
109 //==============================================================================
110 mgr->ConnectInput (esdfilter, 0, mgr->GetCommonInputContainer());
111 mgr->ConnectOutput (esdfilter, 0, mgr->GetCommonOutputContainer());
112 mgr->ConnectInput (esdmuonfilter, 0, mgr->GetCommonInputContainer());
114 mgr->ConnectInput (kinefilter, 0, mgr->GetCommonInputContainer());
115 mgr->ConnectOutput (kinefilter, 0, mgr->GetCommonOutputContainer());
116 AliAnalysisDataContainer *coutputEx = mgr->CreateContainer("cFilterList", TList::Class(),
117 AliAnalysisManager::kOutputContainer,"pyxsec_hists.root");
118 mgr->ConnectOutput (kinefilter, 1,coutputEx);
126 Bool_t AddTrackCutsLHC10h(AliAnalysisTaskESDfilter* esdfilter){
128 Printf("%s%d: Creating Track Cuts for LH10h",(char*)__FILE__,__LINE__);
130 // Cuts on primary tracks
131 AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
133 // ITS stand-alone tracks
134 AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("ITS stand-alone Track Cuts", "ESD Track Cuts");
135 esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
137 // Pixel OR necessary for the electrons
138 AliESDtrackCuts *itsStrong = new AliESDtrackCuts("ITSorSPD", "pixel requirement for ITS");
139 itsStrong->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
142 // PID for the electrons
143 AliESDpidCuts *electronID = new AliESDpidCuts("Electrons", "Electron PID cuts");
144 electronID->SetTPCnSigmaCut(AliPID::kElectron, 3.);
146 // tighter cuts on primary particles for high pT tracks
147 // take the standard cuts, which include already
148 // ITSrefit and use only primaries...
150 // ITS cuts for new jet analysis
151 // gROOT->LoadMacro("$ALICE_ROOT/PWGJE/macros/CreateTrackCutsPWGJE.C");
152 // AliESDtrackCuts* esdTrackCutsHG0 = CreateTrackCutsPWGJE(10001006);
154 AliESDtrackCuts *jetCuts1006 = new AliESDtrackCuts("AliESDtrackCuts");
156 TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
157 jetCuts1006->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep,20.);
158 jetCuts1006->SetMinNClustersTPC(70);
159 jetCuts1006->SetMaxChi2PerClusterTPC(4);
160 jetCuts1006->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
161 jetCuts1006->SetAcceptKinkDaughters(kFALSE);
162 jetCuts1006->SetRequireTPCRefit(kTRUE);
163 jetCuts1006->SetMaxFractionSharedTPCClusters(0.4);
165 jetCuts1006->SetRequireITSRefit(kTRUE);
167 jetCuts1006->SetMaxDCAToVertexXY(2.4);
168 jetCuts1006->SetMaxDCAToVertexZ(3.2);
169 jetCuts1006->SetDCAToVertex2D(kTRUE);
171 jetCuts1006->SetMaxChi2PerClusterITS(36);
172 jetCuts1006->SetMaxChi2TPCConstrainedGlobal(36);
174 jetCuts1006->SetRequireSigmaToVertex(kFALSE);
176 jetCuts1006->SetEtaRange(-0.9,0.9);
177 jetCuts1006->SetPtRange(0.15, 1E+15.);
179 AliESDtrackCuts* esdTrackCutsHG0 = jetCuts1006->Clone("JetCuts10001006");
180 esdTrackCutsHG0->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
183 // throw out tracks with too low number of clusters in
184 // the first pass (be consistent with TPC only tracks)
185 // N.B. the number off crossed rows still acts on the tracks after
186 // all iterations if we require tpc standalone, number of clusters
187 // and chi2 TPC cuts act on track after the first iteration
188 // esdTrackCutsH0->SetRequireTPCStandAlone(kTRUE);
189 // esdTrackCutsH0->SetMinNClustersTPC(80); // <--- first pass
192 // the complement to the one with SPD requirement
193 // AliESDtrackCuts* esdTrackCutsHG1 = CreateTrackCutsPWGJE(10011006);
194 AliESDtrackCuts* esdTrackCutsHG1 = jetCuts1006->Clone("JetCuts10011006");
195 esdTrackCutsHG1->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
197 // the tracks that must not be taken pass this cut and
199 // AliESDtrackCuts* esdTrackCutsHG2 = CreateTrackCutsPWGJE(10021006);
200 AliESDtrackCuts* esdTrackCutsHG2 = jetCuts1006->Clone("JetCuts10021006");
201 esdTrackCutsHG2->SetMaxChi2PerClusterITS(1E10);
204 // standard cuts also used in R_AA analysis
205 // "Global track RAA analysis QM2011 + Chi2ITS<36";
206 // AliESDtrackCuts* esdTrackCutsH2 = CreateTrackCutsPWGJE(1000);
207 AliESDtrackCuts* esdTrackCutsH2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE,1);
208 esdTrackCutsH2->SetMinNCrossedRowsTPC(120);
209 esdTrackCutsH2->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
210 esdTrackCutsH2->SetMaxChi2PerClusterITS(36);
211 esdTrackCutsH2->SetMaxFractionSharedTPCClusters(0.4);
212 esdTrackCutsH2->SetMaxChi2TPCConstrainedGlobal(36);
214 esdTrackCutsH2->SetEtaRange(-0.9,0.9);
215 esdTrackCutsH2->SetPtRange(0.15, 1e10);
218 // AliESDtrackCuts* esdTrackCutsGCOnly = CreateTrackCutsPWGJE(10041006);
219 AliESDtrackCuts* esdTrackCutsGCOnly = jetCuts1006->Clone("JetCuts10041006");
220 esdTrackCutsGCOnly->SetRequireITSRefit(kFALSE);
225 AliESDtrackCuts* esdTrackCutsTPCCOnly = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
226 esdTrackCutsTPCCOnly->SetMinNClustersTPC(70);
228 // Compose the filter
229 AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
231 trackFilter->AddCuts(esdTrackCutsL);
233 trackFilter->AddCuts(esdTrackCutsITSsa);
235 trackFilter->AddCuts(itsStrong);
236 itsStrong->SetFilterMask(1); // AND with Standard track cuts
238 trackFilter->AddCuts(electronID);
239 electronID->SetFilterMask(4); // AND with Pixel Cuts
241 trackFilter->AddCuts(esdTrackCutsHG0);
243 trackFilter->AddCuts(esdTrackCutsHG1);
245 trackFilter->AddCuts(esdTrackCutsHG2);
247 trackFilter->AddCuts(esdTrackCutsTPCCOnly); // add QM TPC only track cuts
248 if(enableTPCOnlyAODTracksLocalFlag)esdfilter->SetTPCOnlyFilterMask(128);
250 trackFilter->AddCuts(esdTrackCutsGCOnly);
252 AliESDtrackCuts* esdTrackCutsHG1_tmp = new AliESDtrackCuts(*esdTrackCutsHG1); // avoid double delete
253 trackFilter->AddCuts(esdTrackCutsHG1_tmp); // add once more for tpc only tracks
255 trackFilter->AddCuts(esdTrackCutsH2); // add r_aa cuts
259 esdfilter->SetGlobalConstrainedFilterMask(1<<8|1<<9); // these tracks are written out as global constrained tracks
260 esdfilter->SetHybridFilterMaskGlobalConstrainedGlobal((1<<4)); // these normal global tracks will be marked as hybrid
261 esdfilter->SetWriteHybridGlobalConstrainedOnly(kTRUE); // write only the complement
262 // esdfilter->SetTPCConstrainedFilterMask(1<<11); // these tracks are written out as tpc constrained tracks
264 esdfilter->SetTrackFilter(trackFilter);
271 Bool_t AddTrackCutsLHC11h(AliAnalysisTaskESDfilter* esdfilter){
274 Printf("%s%d: Creating Track Cuts LHC11h",(char*)__FILE__,__LINE__);
276 // Cuts on primary tracks
277 AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
279 // ITS stand-alone tracks
280 AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("ITS stand-alone Track Cuts", "ESD Track Cuts");
281 esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
283 // Pixel OR necessary for the electrons
284 AliESDtrackCuts *itsStrong = new AliESDtrackCuts("ITSorSPD", "pixel requirement for ITS");
285 itsStrong->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
288 // PID for the electrons
289 AliESDpidCuts *electronID = new AliESDpidCuts("Electrons", "Electron PID cuts");
290 electronID->SetTPCnSigmaCut(AliPID::kElectron, 3.);
292 // standard cuts with very loose DCA
293 AliESDtrackCuts* esdTrackCutsH = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
294 esdTrackCutsH->SetMaxDCAToVertexXY(2.4);
295 esdTrackCutsH->SetMaxDCAToVertexZ(3.2);
296 esdTrackCutsH->SetDCAToVertex2D(kTRUE);
298 // standard cuts with tight DCA cut
299 AliESDtrackCuts* esdTrackCutsH2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
301 // standard cuts with tight DCA but with requiring the first SDD cluster instead of an SPD cluster
302 // tracks selected by this cut are exclusive to those selected by the previous cut
303 AliESDtrackCuts* esdTrackCutsH3 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
304 esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
305 esdTrackCutsH3->SetClusterRequirementITS(AliESDtrackCuts::kSDD, AliESDtrackCuts::kFirst);
307 // TPC only tracks: Optionally enable the writing of TPConly information
308 // constrained to SPD vertex in the filter below
309 AliESDtrackCuts* esdTrackCutsTPCOnly = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
310 // The following line is needed for 2010 PbPb reprocessing and pp, but not for 2011 PbPb
311 //esdTrackCutsTPCOnly->SetMinNClustersTPC(70);
313 // Extra cuts for hybrids
314 // first the global tracks we want to take
315 AliESDtrackCuts* esdTrackCutsHTG = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
316 esdTrackCutsHTG->SetName("Global Hybrid tracks, loose DCA");
317 esdTrackCutsHTG->SetMaxDCAToVertexXY(2.4);
318 esdTrackCutsHTG->SetMaxDCAToVertexZ(3.2);
319 esdTrackCutsHTG->SetDCAToVertex2D(kTRUE);
320 esdTrackCutsHTG->SetMaxChi2TPCConstrainedGlobal(36);
322 // Than the complementary tracks which will be stored as global
323 // constraint, complement is done in the ESDFilter task
324 AliESDtrackCuts* esdTrackCutsHTGC = new AliESDtrackCuts(*esdTrackCutsHTG);
325 esdTrackCutsHTGC->SetName("Global Constraint Hybrid tracks, loose DCA no it requirement");
326 esdTrackCutsHTGC->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kOff);
327 esdTrackCutsHTGC->SetRequireITSRefit(kFALSE);
329 // standard cuts with tight DCA cut, using cluster cut instead of crossed rows (a la 2010 default)
330 AliESDtrackCuts* esdTrackCutsH2Cluster = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE, 0);
332 // Compose the filter
333 AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
335 trackFilter->AddCuts(esdTrackCutsL);
337 trackFilter->AddCuts(esdTrackCutsITSsa);
339 trackFilter->AddCuts(itsStrong);
340 itsStrong->SetFilterMask(1); // AND with Standard track cuts
342 trackFilter->AddCuts(electronID);
343 electronID->SetFilterMask(4); // AND with Pixel Cuts
345 trackFilter->AddCuts(esdTrackCutsH);
347 trackFilter->AddCuts(esdTrackCutsH2);
349 trackFilter->AddCuts(esdTrackCutsH3);
351 trackFilter->AddCuts(esdTrackCutsTPCOnly);
352 if(enableTPCOnlyAODTracksLocalFlag)esdfilter->SetTPCOnlyFilterMask(128);
353 // 256, 1 << 8 Global Hybrids
354 trackFilter->AddCuts(esdTrackCutsHTG);
355 esdfilter->SetHybridFilterMaskGlobalConstrainedGlobal((1<<8)); // these normal global tracks will be marked as hybrid
356 // 512, 1<< 9 GlobalConstraint Hybrids
357 trackFilter->AddCuts(esdTrackCutsHTGC);
358 esdfilter->SetGlobalConstrainedFilterMask(1<<9); // these tracks are written out as global constrained tracks
359 esdfilter->SetWriteHybridGlobalConstrainedOnly(kTRUE); // write only the complement
360 // 1024, 1<< 10 // tight DCA cuts
361 trackFilter->AddCuts(esdTrackCutsH2Cluster);
362 esdfilter->SetTrackFilter(trackFilter);