]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/macrosLMEE/ESDonlyTasks/LMEECutLib.C
replace old ESD tasks with more flexible ones
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / macrosLMEE / ESDonlyTasks / LMEECutLib.C
1 class LMEECutLib {
2
3   public:
4         static  enum LMMECutSet {
5                 kPbPb2011TPCandTOF,  //TOF required
6                 kPbPb2011TPCandTOFwide, //TOF required, more relaxed cut on TPC
7                 kPbPb2011TPCorTOF,
8                 kpp2010TPCandTOF,
9                 kpp2010TPCorTOF,
10                 kCUTSETMAX
11         };
12
13         static  enum LMMECentSel {
14           kPbPb2011Central,
15                 kPbPb2011SemiCentral,
16                 kPbPb2011Peripheral,
17                 kCENTSELMAX
18         };
19
20         //char* LMEECutNames[kCUTSETMAX] = { "PbPb2011TPCandTOF","PbPb2011TPCorTOF"};
21         
22         Bool_t useMC;
23
24
25         LMEECutLib() {useMC=kFALSE;}
26
27         AliDielectronEventCuts*     GetEventCuts(Int_t cutSet);
28         AliAnalysisCuts*            GetCentralityCuts(Int_t centSel);
29         AliDielectronTrackRotator*  GetTrackRotator(Int_t cutSet);
30         AliDielectronMixingHandler* GetMixingHandler(Int_t cutSet);
31
32         AliAnalysisCuts* GetPIDCutsAna(Int_t cutSet);  
33         AliAnalysisCuts* GetPIDCutsPre(Int_t cutSet);  
34
35         AliAnalysisCuts* GetPairCuts2(Int_t cutSet,Bool_t tooglePC=kFALSE);  
36         AliAnalysisCuts* GetPairCuts(Int_t cutSet);  
37
38         AliAnalysisCuts* GetTrackCutsAna(Int_t cutSet);  
39         AliAnalysisCuts* GetTrackCutsPre(Int_t cutSet);  
40
41         void SetMCFlag( Bool_t isMC=kTRUE) {useMC=isMC;}
42
43         AliDielectronEventCuts* GetEventCuts(Int_t cutSet) {
44           AliDielectronEventCuts* eventCuts = 0x0;
45           switch (cutSet) {
46                 case kPbPb2011TPCandTOF :
47                 case kPbPb2011TPCandTOFwide :
48                 case kPbPb2011TPCorTOF  :
49                 case kpp2010TPCandTOF :
50                 case kpp2010TPCorTOF  :
51                   eventCuts=new AliDielectronEventCuts("eventCuts","Vertex Track && |vtxZ|<10 && ncontrib>0");
52                   eventCuts->SetRequireVertex();
53                   eventCuts->SetMinVtxContributors(1);
54                   eventCuts->SetVertexZ(-10.,10.);
55                   break;
56                 default: cout << "No Event Cut defined" << endl;
57           }
58           return eventCuts;
59         }
60
61         AliAnalysisCuts* GetCentralityCuts(Int_t centSel) {
62           AliDielectronVarCuts* centCuts = 0x0;
63           switch (centSel) {
64                 case kPbPb2011Central:
65                   centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011Central");
66                   centCuts->AddCut(AliDielectronVarManager::kCentrality,0.,10.);
67                   break;
68                 case kPbPb2011SemiCentral:
69                   centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011SemiCentral");
70                   //Restrict to 50%, Trigger selction
71                   centCuts->AddCut(AliDielectronVarManager::kCentrality,20.,50.);
72                   break;
73                 case kPbPb2011Peripheral:
74                   centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011Peripheral");
75                   centCuts->AddCut(AliDielectronVarManager::kCentrality,50.,90.);
76                   break;
77                         default: cout << "No Centrality selected" << endl;
78           }
79           return centCuts;
80         }
81
82
83         AliDielectronTrackRotator* GetTrackRotator(Int_t cutSet) {
84           AliDielectronTrackRotator* trackRotator = 0x0;
85           switch (cutSet) {
86                 case kPbPb2011TPCandTOF :
87                 case kPbPb2011TPCandTOFwide :
88                 case kPbPb2011TPCorTOF  :
89                 case kpp2010TPCandTOF :
90                 case kpp2010TPCorTOF  :
91                   trackRotator = new AliDielectronTrackRotator();
92                   trackRotator->SetIterations(20);
93                   trackRotator->SetConeAnglePhi(TMath::Pi()/180*165);
94                   trackRotator->SetStartAnglePhi(TMath::Pi());
95                   break;
96                 default: cout << "No Rotator defined" << endl;
97           }
98           return trackRotator;
99         }
100
101
102         AliDielectronMixingHandler* GetMixingHandler(Int_t cutSet) {
103           AliDielectronMixingHandler* mixingHandler = 0x0;
104           switch (cutSet) {
105                 case kPbPb2011TPCandTOF :
106                 case kPbPb2011TPCandTOFwide :
107                 case kPbPb2011TPCorTOF  :
108                   mixingHandler = new AliDielectronMixingHandler;
109                   mixingHandler->AddVariable(AliDielectronVarManager::kZvPrim,"-10,-5,0,5,10");
110                   mixingHandler->AddVariable(AliDielectronVarManager::kCentrality,"0,5,10,20,40,80,100");
111                   mixingHandler->AddVariable(AliDielectronVarManager::kv0ACrpH2,"-6*(TMath::Pi()/6),-5*(TMath::Pi()/6),-4*(TMath::Pi()/6),-3*(TMath::Pi()/6),-2*(TMath::Pi()/6),-1*(TMath::Pi()/6),0,1*(TMath::Pi()/6),2*(TMath::Pi()/6),3*(TMath::Pi()/6),4*(TMath::Pi()/6),5*(TMath::Pi()/6),6*(TMath::Pi()/6)");
112                   //mixingHandler->SetDepth(50);
113                   mixingHandler->SetDepth(15);
114                   mixingHandler->SetMixType(AliDielectronMixingHandler::kAll);
115                   break;
116                 case kpp2010TPCandTOF :
117                 case kpp2010TPCorTOF  :
118                   mixingHandler = new AliDielectronMixingHandler;
119                   mixingHandler->AddVariable(AliDielectronVarManager::kZvPrim,"-10,-5,0,5,10");
120                   mixingHandler->AddVariable(AliDielectronVarManager::kNacc,"0,10000");
121                   //might want to add multiplicity?
122                   mixingHandler->SetDepth(25);
123                   mixingHandler->SetMixType(AliDielectronMixingHandler::kAll);
124                   break;
125                 default: cout << "No Mixing Handler defined" << endl;
126           }
127           return mixingHandler;
128         }
129
130
131         AliAnalysisCuts* GetPIDCutsAna(Int_t cutSet) {
132           AliAnalysisCuts* anaCuts=0x0;
133
134           // + [2] added for Dec2010 Cut! 
135           TF1 *lowerCut = new TF1("lowerCut", "[0] * TMath::Exp([1]*x) + [2]", 0, 20);
136           /* until Nov2010
137                  lowerCut->SetParameter(0, -2.7);
138                  lowerCut->SetParameter(1, -0.4357);
139            */
140           /* 18.01.2011 ALiHFEpid.cxx */
141           lowerCut->SetParameter(0,-3.7);
142           lowerCut->SetParameter(1,-0.8);
143           lowerCut->SetParameter(2,-0.35);
144
145           if (useMC) { //overwrite parameters
146                 lowerCut->SetParameter(0,-2.5);
147                 lowerCut->SetParameter(2,-2.2);
148           }
149
150           //---------------------------------------------
151           AliDielectronPID *pidTPCTOFeOnly = new AliDielectronPID("TPC-TOF","TPC-TOF");
152           pidTPCTOFeOnly->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3. ,3.,0.0,100.,kFALSE);
153           pidTPCTOFeOnly->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.0 , 100., kFALSE );
154
155           AliDielectronPID *pidTPCandTOF = new AliDielectronPID("TPC-TOF-HFE","TPC-TOF-HFE");
156           pidTPCandTOF->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3.,3.,0.0,100.,kFALSE);
157           pidTPCandTOF->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3.,3.,0.,100.,kTRUE);
158           pidTPCandTOF->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.0 , 100., kFALSE );
159
160           AliDielectronPID *pidTPChardTOF = new AliDielectronPID("TPC-TOF-HFE","TPC-TOF-HFE");
161           pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,lowerCut,3.,0.0,100.,kFALSE);
162           pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3.,3.,0.,100.,kTRUE);
163           pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-3.,3.,0.,100.,kTRUE);
164           pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kKaon,-3.,3.,0.,100.,kTRUE);
165           pidTPChardTOF->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.0 , 100., kFALSE );
166           //___________________________________________
167           AliDielectronPID *pidTT = new AliDielectronPID("TPC-TOF","TPC-TOF");
168           pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.5,3.,0.2,0.4,kFALSE);
169           pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3,3.,0.4,100.,kFALSE);
170           pidTT->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.2 , 100., kFALSE );
171
172           pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3,3.,0.,100.,kTRUE);
173           pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-3.,3.,0.,100.,kTRUE);
174           pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kKaon,-3.,3.,0.,100.,kTRUE);
175           //___________________________________________
176           AliDielectronVarCuts *pidTPCsignal = new AliDielectronVarCuts("pidTPCsignal","cut on the TPC signal");
177           if (useMC) {
178                   pidTPCsignal->AddCut(AliDielectronVarManager::kTPCsignal,65.,85.); 
179           }
180           else {
181                   pidTPCsignal->AddCut(AliDielectronVarManager::kTPCsignal,75.,90.); 
182           }
183           //___________________________________________
184           AliDielectronVarCuts *pidTPCsignalWide = new AliDielectronVarCuts("pidTPCsignalWide","cut on the TPC signal");
185           pidTPCsignalWide->AddCut(AliDielectronVarManager::kTPCsignal,70.,90.); 
186           //___________________________________________
187
188           AliDielectronVarCuts *pTPC = new AliDielectronVarCuts("P>.4","P>.4");
189           pTPC->AddCut(AliDielectronVarManager::kPt,.4,5.);
190           
191           AliDielectronVarCuts *pMin = new AliDielectronVarCuts("P>.2","P>.2");
192           pMin->AddCut(AliDielectronVarManager::kPt,.2,5.);
193
194           switch (cutSet) {
195                 case kPbPb2011TPCandTOF :
196                   AliDielectronCutGroup* cgSecondTrackFilterPIDTPC1 = new AliDielectronCutGroup("cgPIDTPC1","cgPIDTPC1",AliDielectronCutGroup::kCompAND);
197                   cgSecondTrackFilterPIDTPC1->AddCut(pTPC);
198                   cgSecondTrackFilterPIDTPC1->AddCut(pidTPCandTOF);
199                   cgSecondTrackFilterPIDTPC1->AddCut(pidTPCsignal);
200                   cgSecondTrackFilterPIDTPC1->AddCut(GetTrackCutsAna(cutSet));
201                   anaCuts = cgSecondTrackFilterPIDTPC1;
202                   break;
203                 case kPbPb2011TPCandTOFwide :
204                   AliDielectronCutGroup* cgSecondTrackFilterPIDTPC1 = new AliDielectronCutGroup("cgPIDTPC1","cgPIDTPC1",AliDielectronCutGroup::kCompAND);
205                   cgSecondTrackFilterPIDTPC1->AddCut(pTPC);
206                   cgSecondTrackFilterPIDTPC1->AddCut(pidTPCandTOF);
207                   cgSecondTrackFilterPIDTPC1->AddCut(pidTPCsignalWide);
208                   cgSecondTrackFilterPIDTPC1->AddCut(GetTrackCutsAna(cutSet));
209                   anaCuts = cgSecondTrackFilterPIDTPC1;
210                   break;
211                 case kPbPb2011TPCorTOF  :
212                   AliDielectronCutGroup* cgSecondTrackFilterPIDTPC2 = new AliDielectronCutGroup("cgPIDTPC2","cgPIDTPC2",AliDielectronCutGroup::kCompAND);
213                   cgSecondTrackFilterPIDTPC2->AddCut(pMin);
214                   cgSecondTrackFilterPIDTPC2->AddCut(pidTT);
215                   cgSecondTrackFilterPIDTPC2->AddCut(pidTPCsignal);
216                   cgSecondTrackFilterPIDTPC2->AddCut(GetTrackCutsAna(cutSet));
217                   anaCuts = cgSecondTrackFilterPIDTPC2;
218                   break;
219                 case kpp2010TPCandTOF :
220                   AliDielectronCutGroup* cgSecondTrackFilterPIDTPC = new AliDielectronCutGroup("cgPIDTPC","cgPIDTPC",AliDielectronCutGroup::kCompAND);
221                   cgSecondTrackFilterPIDTPC->AddCut(pTPC);
222                   //cgSecondTrackFilterPIDTPC->AddCut(pidTPChardTOF);
223                   cgSecondTrackFilterPIDTPC->AddCut(pidTPCandTOF);
224                   cgSecondTrackFilterPIDTPC->AddCut(pidTPCTOFeOnly);
225                   cgSecondTrackFilterPIDTPC->AddCut(GetTrackCutsAna(cutSet));
226                   anaCuts = cgSecondTrackFilterPIDTPC;
227                   break;
228                 case kpp2010TPCorTOF  :
229                   AliDielectronCutGroup* cgSecondTrackFilterPIDTPC = new AliDielectronCutGroup("cgPIDTPC","cgPIDTPC",AliDielectronCutGroup::kCompAND);
230                   cgSecondTrackFilterPIDTPC->AddCut(pMin);
231                   cgSecondTrackFilterPIDTPC->AddCut(pidTT);
232                   cgSecondTrackFilterPIDTPC->AddCut(GetTrackCutsAna(cutSet));
233                   anaCuts = cgSecondTrackFilterPIDTPC;
234                   break;
235                 default: cout << "No Analysis PID Cut defined " << endl;
236           }
237           return anaCuts;
238         }
239
240         AliAnalysisCuts* GetPIDCutsPre(Int_t cutSet) {
241           AliAnalysisCuts* anaCuts=0x0;
242           switch (cutSet) {
243                 case kPbPb2011TPCandTOF :
244                 case kPbPb2011TPCandTOFwide :
245                 case kPbPb2011TPCorTOF  :
246                 case kpp2010TPCandTOF :
247                 case kpp2010TPCorTOF  :
248                   AliDielectronCutGroup* cgSecondTrackFilterPIDTPC = new AliDielectronCutGroup("cgPIDTPC","cgPIDTPC",AliDielectronCutGroup::kCompAND);
249                   AliDielectronCutGroup* cgITSTPC = new AliDielectronCutGroup("cgITSTPC","cgITSTPC",AliDielectronCutGroup::kCompAND);
250                   AliDielectronPID *pidITSTPC = new AliDielectronPID("TPCpre","TPCpre");
251                   pidITSTPC->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3.,3.);
252                   cgITSTPC->AddCut(pidITSTPC);
253                   cgITSTPC->AddCut(GetTrackCutsAna(cutSet));
254
255                   AliDielectronCutGroup* cgITSSA = new AliDielectronCutGroup("cgITSSA","cgITSSA",AliDielectronCutGroup::kCompAND);
256                   AliDielectronPID *pidITSSA = new  AliDielectronPID("pidITSSA","pidITSSA");
257                   pidITSSA->AddCut(AliDielectronPID::kITS,AliPID::kElectron,-3.,3.);
258                   cgITSSA->AddCut(pidITSSA);
259                   cgITSSA->AddCut(GetTrackCutsPre(cutSet));
260
261                   AliDielectronCutGroup* cgInitialTrackFilter = new AliDielectronCutGroup("cgInitialTrackFilter","cgInitialTrackFilter",AliDielectronCutGroup::kCompOR);
262                   cgInitialTrackFilter->AddCut(cgITSTPC);
263                   cgInitialTrackFilter->AddCut(cgITSSA);
264                   anaCuts = cgInitialTrackFilter;
265                   break;
266                 default: cout << "No Pre-PID Cut defined " << endl;
267           }
268           return anaCuts;
269         }
270
271
272         AliAnalysisCuts* GetPairCuts2(Int_t cutSet, Bool_t togglePC /*=kFALSE*/)  {  
273           AliAnalysisCuts* pairCuts=0x0;
274           switch (cutSet) {
275                 case kPbPb2011TPCorTOF  :
276                 case kpp2010TPCandTOF :
277                   AliDielectronVarCuts* pairCutsV= new AliDielectronVarCuts("InvMass","InvMass > 150 MeV");
278                   pairCutsV->AddCut(AliDielectronVarManager::kM,0.15,100.,kTRUE);
279                   pairCuts = pairCutsV;
280                   break;
281                 case kPbPb2011TPCandTOF :
282                 case kPbPb2011TPCandTOFwide :
283                 case kpp2010TPCorTOF  :
284                   if (!togglePC) {
285                   
286                   AliDielectronCutGroup* pairCutsCG2 =new AliDielectronCutGroup("pairCutsCG2","pairCutsCG2",AliDielectronCutGroup::kCompOR);
287                   AliDielectronCutGroup* pairCutsCG =new AliDielectronCutGroup("pairCutsCG","pairCutsCG",AliDielectronCutGroup::kCompAND);
288                   pairCutsPhiv =new AliDielectronVarCuts("Phiv Cuts","Phiv<2.0rad");
289                   pairCutsPhiv->AddCut(AliDielectronVarManager::kPhivPair, 0.0, 2.0); 
290                   pairCutsInvM =new AliDielectronVarCuts("InvM Cuts","InvM<0.3");
291                   pairCutsInvM->AddCut(AliDielectronVarManager::kM, 0.0, 0.3); 
292                   pairCutsInvMgood =new AliDielectronVarCuts("InvM Cuts good","InvM>0.3");
293                   pairCutsInvMgood->AddCut(AliDielectronVarManager::kM, 0.3, 99999.); 
294                   pairCutsCG->AddCut(pairCutsPhiv);
295                   pairCutsCG->AddCut(pairCutsInvM);
296                   pairCutsCG2->AddCut(pairCutsInvMgood);
297                   pairCutsCG2->AddCut(pairCutsCG);
298                   pairCuts = pairCutsCG2;
299                   }
300                   else {
301                         AliDielectronVarCuts* pairCutsV =new AliDielectronVarCuts("OpeningAngle","Opening angle > .035rad");
302                         pairCutsV->AddCut(AliDielectronVarManager::kOpeningAngle, 0. , 0.035,kTRUE); 
303                         pairCuts = pairCutsV;
304                   }
305                   break;
306                 default: cout << "No Pair Cuts defined " << endl;
307           } 
308           return pairCuts;
309         }
310
311         AliAnalysisCuts* GetPairCuts(Int_t cutSet)  {  
312           AliDielectronVarCuts* pairCuts=0x0;
313           switch (cutSet) {
314                 case kPbPb2011TPCorTOF  :
315                 case kpp2010TPCandTOF :
316                   pairCuts = new AliDielectronVarCuts("InvMass","InvMass > 150 MeV");
317                   pairCuts->AddCut(AliDielectronVarManager::kM,0.15,100.,kTRUE);
318                   break;
319                 case kPbPb2011TPCandTOF :
320                 case kPbPb2011TPCandTOFwide :
321                 case kpp2010TPCorTOF  :
322                 pairCuts =new AliDielectronVarCuts("OpeningAngle","Opening angle > .035rad");
323                 pairCuts->AddCut(AliDielectronVarManager::kOpeningAngle, 0. , 0.035);
324                 break;
325                 default: cout << "No Pair Cuts defined " << endl;
326           } 
327           return pairCuts;
328         }
329
330         AliAnalysisCuts* GetTrackCutsAna(Int_t cutSet) {
331           AliESDtrackCuts* trackCuts=0x0;
332           switch (cutSet) {
333                 case kPbPb2011TPCandTOF :
334                 case kPbPb2011TPCandTOFwide :
335                 case kPbPb2011TPCorTOF  :
336                 case kpp2010TPCandTOF :
337                 case kpp2010TPCorTOF  :
338                   trackCuts = new AliESDtrackCuts();
339                   trackCuts->SetDCAToVertex2D(kTRUE);
340                   trackCuts->SetMaxDCAToVertexZ(3.0);
341                   trackCuts->SetMaxDCAToVertexXY(1.0);
342                   //trackCuts->SetMaxNsigmaToVertex(3.0); 
343                   trackCuts->SetPtRange(  0.05 , 200.0);
344                   trackCuts->SetEtaRange( -0.84 , 0.84 );
345                   trackCuts->SetAcceptKinkDaughters(kFALSE);
346                   trackCuts->SetRequireITSRefit(kTRUE);
347                   trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
348                   trackCuts->SetMinNClustersITS(3);
349                   trackCuts->SetRequireTPCRefit(kTRUE);
350                   //trackCuts->SetMinNClustersTPC(60);
351                   trackCuts->SetMinNCrossedRowsTPC(110);
352                   trackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.7);
353                   trackCuts->SetMaxChi2PerClusterTPC(3.5);
354                   //trackCuts->SetMaxChi2PerClusterITS(6);
355                   break;
356                 default: cout << "No Analysis Track Cut defined " << endl;
357           }
358           return trackCuts;
359         } 
360
361         AliAnalysisCuts* GetTrackCutsPre(Int_t cutSet) {
362           AliESDtrackCuts* trackCuts=0x0;
363           switch (cutSet) {
364                 case kPbPb2011TPCandTOF :
365                 case kPbPb2011TPCandTOFwide :
366                 case kPbPb2011TPCorTOF  :
367                 case kpp2010TPCandTOF :
368                 case kpp2010TPCorTOF  :
369                   trackCuts = new AliESDtrackCuts();
370                   trackCuts->SetDCAToVertex2D(kTRUE);
371                   trackCuts->SetMaxDCAToVertexZ(3.0);
372                   trackCuts->SetMaxDCAToVertexXY(1.0);
373                   trackCuts->SetEtaRange( -0.84 , 0.84 );
374                   trackCuts->SetPtRange(  0.05 , 0.5);
375                   trackCuts->SetAcceptKinkDaughters(kFALSE);
376                   trackCuts->SetRequireITSRefit(kTRUE);
377                   trackCuts->SetRequireITSStandAlone(kTRUE);
378                   trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
379                   trackCuts->SetMinNClustersITS(3); //PhotonGroup-Dalitz: 2?!
380                   break;
381                 default: cout << "No Pre-Track Cut defined " << endl;
382           }
383           return trackCuts;
384         }
385
386 };