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