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