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