]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/macrosJPSI/ConfigJpsiQA_jb_PbPb.C
83220d02df2a18f034b5da5476cdc1cbb390f77d
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / macrosJPSI / ConfigJpsiQA_jb_PbPb.C
1 void InitHistograms(AliDielectron *die, Int_t cutDefinition);
2 void InitCF(AliDielectron* die, Int_t cutDefinition);
3
4 void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition);
5 void SetupElectronCuts(AliDielectron *die, Int_t cutDefinition);
6
7 TVectorD *GetRunNumbers();
8 TVectorD *BinsToVector(Int_t nbins, Double_t min, Double_t max);
9
10 TString names=("CutStats;noPID;TPC;TOF;TRD;TOFTRD;TRDeff;e_mcPid;jpsi_mcPid;conv_mcPid");
11 enum {kCutStats=0, knoPID, kTPC, kTOF, kTRD, kTOFTRD, kTRDeff, kEleMC, kEleJPsiMC, kEleConvMC};
12 TObjArray *arrNames=names.Tokenize(";");
13
14 const Int_t nDie=arrNames->GetEntries();
15
16 Bool_t  isESD = kTRUE;
17 Bool_t  hasMC = kFALSE;
18 TString list  = gSystem->Getenv("LIST");
19
20 AliDielectron* ConfigJpsiQA_jb_PbPb(Int_t cutDefinition, TString prod="")
21 {
22   //
23   // Setup the instance of AliDielectron
24   //
25
26   // find mc or not?
27   if( list.IsNull()) list=prod;
28   if( list.Contains("LHC10h")   || list.Contains("LHC11h")   ) hasMC=kFALSE;
29   if( list.Contains("LHC11a10") || list.Contains("LHC12a17") ) hasMC=kTRUE;
30
31   //ESD handler?
32   isESD=(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliESDInputHandler::Class());
33
34   // switch off some configurations
35   if(hasMC) { // MONTE CARLO
36     switch(cutDefinition) {
37     case kCutStats:  return 0x0;
38     case knoPID:     return 0x0;
39     case kTPC:       return 0x0;
40     case kTOF:       return 0x0;
41     case kTRD:       return 0x0;
42     case kTOFTRD:    return 0x0;
43     case kTRDeff:    return 0x0;
44     case kEleMC:     return 0x0;
45     case kEleJPsiMC: return 0x0;
46     case kEleConvMC: return 0x0;
47     }
48   } else { // COLLISION DATA
49     switch(cutDefinition) {
50       //     case kCutStats:  return 0x0;
51       //     case knoPID:     return 0x0;
52       //     case kTPC:       return 0x0;
53       //     case kTOF:       return 0x0;
54       //     case kTRD:       return 0x0;
55     case kTOFTRD:    return 0x0;
56     case kTRDeff:    return 0x0;
57     case kEleMC:     return 0x0;
58     case kEleJPsiMC: return 0x0;
59     case kEleConvMC: return 0x0;
60     }
61   }
62
63   // create the actual framework object
64   TString name=Form("%02d",cutDefinition);
65   if (cutDefinition<arrNames->GetEntriesFast()){
66     name=arrNames->At(cutDefinition)->GetName();
67   }
68   AliDielectron *die = new AliDielectron(Form("%s",name.Data()),Form("Track cuts: %s",name.Data()));
69   die->SetHasMC(hasMC);
70
71   printf(" Add %s %s config %s for %s \n",(isESD?"ESD":"AOD"),(hasMC?"MC":""),name.Data(),list.Data());
72
73   //only track QA, no Pairing
74   if(cutDefinition<kTRDeff) {
75     die->SetNoPairing();
76     printf(" Set no pairing \n");
77   }
78   
79   // cut setup
80   if(cutDefinition!=kTRDeff) SetupTrackCuts(die,cutDefinition);
81   if(cutDefinition==kTRDeff) SetupElectronCuts(die,cutDefinition);
82   
83   // histogram setup
84   InitHistograms(die,cutDefinition);
85   printf(" Add %d types and %03d histos to the manager \n",die->GetHistogramList()->GetEntries(),
86          0/*die->GetHistoManager()->GetList()->GetEntries()*/);
87
88   // CF container setup
89   if(cutDefinition == kTRDeff ) {
90     InitCF(die,cutDefinition);
91     printf(" Add %d pair, %d leg vars, %p steps and %p bins to the container \n",
92            die->GetCFManagerPair()->GetNvarsPair(),die->GetCFManagerPair()->GetNvarsLeg(),
93            die->GetCFManagerPair()->GetContainer(), die->GetCFManagerPair()->GetContainer() );
94   }
95
96   
97   return die;
98 }
99 //______________________________________________________________________________________
100 void SetupElectronCuts(AliDielectron *die, Int_t cutDefinition)
101 {
102   // Quality cuts
103   AliDielectronCutGroup* cuts = new AliDielectronCutGroup("cuts","cuts",AliDielectronCutGroup::kCompAND);
104   die->GetTrackFilter().AddCuts(cuts);
105   
106   // track cuts ESD and AOD
107   AliDielectronVarCuts *varCuts = new AliDielectronVarCuts("VarCuts","VarCuts");
108   varCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
109   varCuts->AddCut(AliDielectronVarManager::kP,             .75,  1e30);
110   varCuts->AddCut(AliDielectronVarManager::kTRDpidQuality,1.0,   6.0);
111   if(!isESD) varCuts->AddCut(AliDielectronVarManager::kV0Index0,     1.0);
112   //  varCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl,    0.0,   4.0);
113   //  varCuts->AddCut(AliDielectronVarManager::kNclsTPC,     60.0, 160.0);
114   //  varCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
115   //  varCuts->AddCut(AliDielectronVarManager::kPt,           0.8,  1e30);
116   cuts->AddCut(varCuts);
117   
118   AliDielectronTrackCuts *trkCuts = new AliDielectronTrackCuts("TrkCuts","TrkCuts");
119   trkCuts->SetRequireTPCRefit(kTRUE);
120   cuts->AddCut(trkCuts);
121   
122   // PID
123   AliDielectronPID *pid = new AliDielectronPID("PID","PID cut");
124   pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-5.0, 3.5, 0.0, 0.0,  kFALSE, AliDielectronPID::kRequire); 
125   cuts->AddCut(pid);
126   
127   // Pair inclusion
128   AliDielectronVarCuts *gammaCuts = new AliDielectronVarCuts("GammaCuts","GammaCuts");
129   gammaCuts->AddCut(AliDielectronVarManager::kOpeningAngle, 0.0,   0.035); // 0.1
130   //  gammaCuts->AddCut(AliDielectronVarManager::kCosPointingAngle, TMath::Cos(0.02),   1.0);
131   //  gammaCuts->AddCut(AliDielectronVarManager::kLegDist,      0.0,   0.25);
132   //  gammaCuts->AddCut(AliDielectronVarManager::kR,            3.0,   90.0);
133   //  gammaCuts->AddCut(AliDielectronVarManager::kPsiPair,      0.0,   0.05);
134   //  gammaCuts->AddCut(AliDielectronVarManager::kChi2NDF,      0.0,   10.0);
135   gammaCuts->AddCut(AliDielectronVarManager::kM,            0.0,   0.05);
136   die->GetPairFilter().AddCuts(gammaCuts);
137
138   // Pair exclusion
139   //  AliDielectronVarCuts *lambdaCuts = new AliDielectronVarCuts("LambdaCuts","LambdaCuts");
140   //  lambdaCuts->AddCut(AliDielectronVarManager::kOpeningAngle, 0.0,   0.035, kTRUE); // 0.035
141   //  lambdaCuts->AddCut(AliDielectronVarManager::kR,            3.0,   40.0, kTRUE);
142   //  lambdaCuts->AddCut(AliDielectronVarManager::kChi2NDF,      0.0,   0.5,  kTRUE);
143   //  lambdaCuts->AddCut(AliDielectronVarManager::kM,            1.01,  1.03, kTRUE);
144   //  lambdaCuts->AddCut(AliDielectronVarManager::kY,            -0.9,  0.9,  kTRUE);
145   //  die->GetPairFilter().AddCuts(lambdaCuts);
146   //
147   //  AliDielectronVarCuts *k0sCuts = new AliDielectronVarCuts("K0sCuts","K0sCuts");
148   //  k0sCuts->AddCut(AliDielectronVarManager::kR,            3.0,   40.0,  kTRUE);
149   //  k0sCuts->AddCut(AliDielectronVarManager::kChi2NDF,      0.0,   0.5,   kTRUE);
150   //  k0sCuts->AddCut(AliDielectronVarManager::kM,            4.90,  0.504, kTRUE);
151   //  k0sCuts->AddCut(AliDielectronVarManager::kY,            -0.9,  0.9,   kTRUE);
152   //  die->GetPairFilter().AddCuts(k0sCuts);
153   
154   
155 }
156 //______________________________________________________________________________________
157 void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition)
158 {
159   //
160   // Setup the track cuts
161   //
162
163   // Quality cuts
164   AliDielectronCutGroup* cuts = new AliDielectronCutGroup("cuts","cuts",AliDielectronCutGroup::kCompAND);
165   die->GetTrackFilter().AddCuts(cuts);
166   
167   //Pt cut, should make execution a bit faster
168   AliDielectronVarCuts *pt = new AliDielectronVarCuts("Pt>.8","Pt>.8");
169   if(cutDefinition<kEleMC) 
170     pt->AddCut(AliDielectronVarManager::kPt,0.8,1e30);
171   else   
172     pt->AddCut(AliDielectronVarManager::kPt,0.8,1e30);
173   if(cutDefinition!=kCutStats && cutDefinition!=knoPID) cuts->AddCut(pt);
174   
175   // track cuts ESD and AOD
176   AliDielectronVarCuts *varCuts = new AliDielectronVarCuts("VarCuts","VarCuts");
177   varCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0,   1.0);
178   varCuts->AddCut(AliDielectronVarManager::kImpactParZ,  -3.0,   3.0);
179   varCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
180   varCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl,    0.0,   4.0);
181   varCuts->AddCut(AliDielectronVarManager::kNclsTPC,     70.0, 160.0);
182   varCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
183   if(!isESD) varCuts->AddCut(AliDielectronVarManager::kV0Index0,   0.0);
184   if(cutDefinition!=kCutStats) cuts->AddCut(varCuts);
185   
186   AliDielectronTrackCuts *trkCuts = new AliDielectronTrackCuts("TrkCuts","TrkCuts");
187   //  trkCuts->SetClusterRequirementITS(AliDielectronTrackCuts::kSPD,AliDielectronTrackCuts::kAny);
188   trkCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 15); // ITS-4 = 1+2+4+8
189   trkCuts->SetRequireITSRefit(kTRUE);
190   trkCuts->SetRequireTPCRefit(kTRUE);
191   if(cutDefinition!=kCutStats) cuts->AddCut(trkCuts);
192   
193   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PID CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
194   AliDielectronPID *pid = new AliDielectronPID("PID","PID");
195   
196   ////////////////////////////////// DATA
197   if(!hasMC && cutDefinition==kTPC) {
198     pid->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-100.,3.5,0.,0.,kTRUE);
199     pid->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,3.5,0.,0.,kTRUE);
200   }
201   
202   ////////////////////////////////// MC
203   if(hasMC) {
204     if (cutDefinition>=kEleMC) {
205       AliDielectronVarCuts *pdgCuts=new AliDielectronVarCuts("pdgCuts","pdgCuts");
206       pdgCuts->SetCutType(AliDielectronVarCuts::kAny);
207       pdgCuts->AddCut(AliDielectronVarManager::kPdgCode,11.);
208       pdgCuts->AddCut(AliDielectronVarManager::kPdgCode,-11.);
209       cuts->AddCut(pdgCuts);
210       
211       AliDielectronVarCuts *pdgMotherCutsT=new AliDielectronVarCuts("pdgMotherCutsT","pdgMotherCutsT");
212       AliDielectronVarCuts *pdgMotherCutsP=new AliDielectronVarCuts("pdgMotherCutsP","pdgMotherCutsP");
213       if (cutDefinition==kEleJPsiMC){
214         //        pdgMotherCutsT->AddCut(AliDielectronVarManager::kPdgCodeMother,443.);
215         //        cuts->AddCut(pdgMotherCutsT);        
216         pdgMotherCutsP->AddCut(AliDielectronVarManager::kPdgCode,443.);
217         pdgMotherCutsP->AddCut(AliDielectronVarManager::kHaveSameMother,1.);
218         die->GetPairFilter().AddCuts(pdgMotherCutsP);
219       }
220       if (cutDefinition==kEleConvMC){
221         pdgMotherCutsT->AddCut(AliDielectronVarManager::kPdgCodeMother,22.);
222         cuts->AddCut(pdgMotherCutsT);        
223         
224         pdgMotherCutsP->AddCut(AliDielectronVarManager::kHaveSameMother,1.);
225         die->GetPairFilter().AddCuts(pdgMotherCutsP);
226       }
227       
228     }
229   }
230         ////////////////////////////////// DATA + MC
231   // pid cuts TPC + TOF & TRD
232   pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-4.,4.);
233   if(cutDefinition==kTOF || cutDefinition==kTOFTRD) 
234     pid->AddCut(AliDielectronPID::kTOF,AliPID::kElectron,-3,3.,0.,0.,kFALSE,AliDielectronPID::kIfAvailable);
235   if(cutDefinition==kTRD || cutDefinition==kTOFTRD) 
236     pid->AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,3.5.,6.,kFALSE,
237                 AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDpidQuality);
238
239   if(cutDefinition!=knoPID && cutDefinition!=kCutStats && cutDefinition!=kTRDeff && !hasMC ) cuts->AddCut(pid);
240   /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PID CUTS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
241
242   // exclude conversion electrons selected by the tender
243   //AliDielectronTrackCuts *noconv=new AliDielectronTrackCuts("noConv","noConv");
244   //noconv->SetV0DaughterCut(AliPID::kElectron,kTRUE);
245   //cuts->AddCut(noconv);
246   
247 }
248
249 //______________________________________________________________________________________
250 void InitHistograms(AliDielectron *die, Int_t cutDefinition)
251 {
252   //
253   // Initialise the histograms
254   //
255   
256   //Setup histogram Manager
257   AliDielectronHistos *histos=new AliDielectronHistos(die->GetName(), die->GetTitle());
258   
259   //Initialise histogram classes
260   histos->SetReservedWords("Track;Pair");
261
262   // booleans for histo selection
263   Bool_t bHistEvts = kFALSE, bHistPair = kFALSE, bHistCuts = kFALSE, bHistPID = kFALSE, bHistEff=kFALSE, bHistRunQA=kFALSE;
264   switch (cutDefinition) {
265   case kCutStats:  bHistCuts=kTRUE; break;
266   case knoPID:     bHistEvts=kTRUE; bHistPID=kTRUE; bHistRunQA=kTRUE; break;
267   case kTPC:       
268   case kTOF:       
269   case kTRD:       
270   case kTOFTRD: 
271     bHistPID=kTRUE; break;
272   case kTRDeff:    bHistEff=kTRUE; break;
273   case kEleMC:
274   case kEleJPsiMC: 
275   case kEleConvMC: 
276     bHistPair=kTRUE; break;
277   }
278   
279   
280   //Track classes
281   //to fill also track info from 2nd event loop until 2
282   for (Int_t i=0; i<2; ++i){
283     histos->AddClass(Form("Track_%s",AliDielectron::TrackClassName(i)));
284   }
285   
286   //add histograms to event class
287   if (bHistEvts) {
288     histos->AddClass("Event");
289     histos->UserHistogram("Event","RunNumber",";run;#events",GetRunNumbers(),AliDielectronVarManager::kRunNumber);
290     histos->UserHistogram("Event","VtxZ",";z_{vtx} (cm)",300,-15.,15.,AliDielectronVarManager::kZvPrim);
291     if(hasMC) {
292       histos->AddClass("MCEvent");
293       histos->UserHistogram("MCEvent","NumberOfJPsis",";N_{J/#psi};#events",20,0.,20.,AliDielectronVarManager::kNumberOfJPsis);
294     }
295   }
296   
297   if (bHistRunQA) {
298     if(!hasMC) {
299     // Flow QA
300     histos->UserHistogram("Event","TPCrpH2uc_RunNumber",";run;#Psi^{TPC} (rad.)",
301                           GetRunNumbers(), BinsToVector(100,-2.,2.) ,
302                           AliDielectronVarManager::kRunNumber, AliDielectronVarManager::kTPCrpH2uc);
303     histos->UserHistogram("Event","vOArpH2_RunNumber",";run;#Psi_{2}^{V0A} (rad.)",
304                           GetRunNumbers(), BinsToVector(100,-2.,2.) ,
305                           AliDielectronVarManager::kRunNumber, AliDielectronVarManager::kv0ArpH2);
306     histos->UserHistogram("Event","vOCrpH2_RunNumber",";run;#Psi_{2}^{V0C} (rad.)",
307                           GetRunNumbers(), BinsToVector(100,-2.,2.) ,
308                           AliDielectronVarManager::kRunNumber, AliDielectronVarManager::kv0CrpH2);
309     
310     histos->UserHistogram("Event","TPCrpH2uc_Cent_RunNumber",";centrality (%);#Psi^{TPC} (rad.);run",
311                           BinsToVector(10,0.,100.), BinsToVector(100,-2.,2.), GetRunNumbers(),
312                           AliDielectronVarManager::kCentrality,
313                           AliDielectronVarManager::kTPCrpH2uc,
314                           AliDielectronVarManager::kRunNumber );
315     histos->UserHistogram("Event","vOArpH2_Cent_RunNumber",";centrality (%);#Psi_{2}^{V0A} (rad.);run",
316                           BinsToVector(10,0.,100.), BinsToVector(100,-2.,2.), GetRunNumbers(),
317                           AliDielectronVarManager::kCentrality,
318                           AliDielectronVarManager::kv0ArpH2,
319                           AliDielectronVarManager::kRunNumber );
320     histos->UserHistogram("Event","vOCrpH2_Cent_RunNumber",";centrality (%);#Psi_{2}^{V0C} (rad.);run",
321                           BinsToVector(10,0.,100.), BinsToVector(100,-2.,2.), GetRunNumbers(),
322                           AliDielectronVarManager::kCentrality,
323                           AliDielectronVarManager::kv0CrpH2,
324                           AliDielectronVarManager::kRunNumber );
325     }
326     
327     // PID QA
328     histos->UserHistogram("Track","TPCnSigmaPio_Nacc_RunNumber",";N_{acc};run;n#sigma_{pio}^{TPC}",
329                           BinsToVector(60,0.,3000.), GetRunNumbers(), BinsToVector(40,-5.,5.),
330                           AliDielectronVarManager::kNacc,
331                           AliDielectronVarManager::kRunNumber,
332                           AliDielectronVarManager::kTPCnSigmaPio);
333     histos->UserHistogram("Track","TPCnSigmaPio_Nacc",";N_{acc};n#sigma_{pio}^{TPC}",
334                           BinsToVector(60,0.,3000.), BinsToVector(40,-5.,5.),
335                           AliDielectronVarManager::kNacc,
336                           AliDielectronVarManager::kTPCnSigmaPio);
337     
338     histos->UserProfile("Track","TPCnSigmaPio-Nacc-RunNumber",";N_{acc};run;n#sigma_{pio}^{TPC}",
339                         AliDielectronVarManager::kTPCnSigmaPio,
340                         BinsToVector(60,0.,3000.),      GetRunNumbers(),
341                         AliDielectronVarManager::kNacc, AliDielectronVarManager::kRunNumber, "s;-5;5" );
342     histos->UserProfile("Track","TPCnSigmaPio-RunNumber",";run;n#sigma_{pio}^{TPC}",
343                         AliDielectronVarManager::kTPCnSigmaPio,
344                         GetRunNumbers(), AliDielectronVarManager::kRunNumber, "s;-5;5");
345     histos->UserProfile("Track","TPCnSigmaPio-Nacc",";N_{acc};n#sigma_{pio}^{TPC}",
346                         AliDielectronVarManager::kTPCnSigmaPio,
347                         BinsToVector(60,0.,3000.), AliDielectronVarManager::kNacc , "s;-5;5");
348     
349   } // end PID+Flow QA
350   
351   if (bHistPID) {       
352     
353     //    if(cutDefinition==kTPC) {     // centrality dependence
354       histos->UserHistogram("Track","dEdx_P_Cent",";p (GeV/c);TPC signal (arb units);centrality (%)",
355                             400,0.2,20., 200,0.,200., 10,0.,100.,
356                             AliDielectronVarManager::kPIn,
357                             AliDielectronVarManager::kTPCsignal,
358                             AliDielectronVarManager::kCentrality, 
359                             kTRUE);
360       
361       histos->UserHistogram("Track","TPCnSigmaEle_P_Cent",";p (GeV/c);n#sigma_{ele}^{TPC};centrality (%)",
362                             100,0.2,20., 100,-10.,10., 10,0.,100.,
363                             AliDielectronVarManager::kPIn,
364                             AliDielectronVarManager::kTPCnSigmaEle,
365                             AliDielectronVarManager::kCentrality, 
366                             kTRUE);
367       
368       histos->UserHistogram("Track","TPCnSigmaPio_P_Cent",";p (GeV/c);n#sigma_{pio}^{TPC};centrality (%)",
369                             100,0.2,20., 100,-10.,10., 10,0.,100.,
370                             AliDielectronVarManager::kPIn,
371                             AliDielectronVarManager::kTPCnSigmaPio,
372                             AliDielectronVarManager::kCentrality, 
373                             kTRUE);
374       
375       histos->UserHistogram("Track","TPCnSigmaPro_P_Cent",";p (GeV/c);n#sigma_{pro}^{TPC};centrality (%)",
376                             100,0.2,20., 100,-10.,10., 10,0.,100.,
377                             AliDielectronVarManager::kPIn,
378                             AliDielectronVarManager::kTPCnSigmaPro,
379                             AliDielectronVarManager::kCentrality, 
380                             kTRUE);
381       
382       histos->UserHistogram("Track","TOFbeta_P_Cent",";p (GeV/c);#beta;centrality (%);#tracks",
383                             250,0.0,5., 300,0.,1.2, 10,0.,100.,
384                             AliDielectronVarManager::kPIn,
385                             AliDielectronVarManager::kTOFbeta,
386                             AliDielectronVarManager::kCentrality);
387
388       histos->UserHistogram("Track","TOFnSigmaEle_P_Cent","dEdxTOF;p (GeV/c);n#sigma_{ele}^{TOF};centrality (%);#tracks",
389                             250,0.0,5., 100,-10.,10., 10,0.,100.,
390                             AliDielectronVarManager::kPIn,
391                             AliDielectronVarManager::kTOFnSigmaEle,
392                             AliDielectronVarManager::kCentrality);
393       //} 
394
395     // main pid spectra
396     histos->UserHistogram("Track","dEdx_P",";p (GeV/c);TPC signal (arb units);#tracks",
397                           400,0.2,20.,200,0.,200.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCsignal,kTRUE);
398     histos->UserHistogram("Track","TPCnSigmaEle_P",";p (GeV/c);n#sigma_{ele}^{TPC}",
399                           100,0.2,20.,100,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
400     histos->UserHistogram("Track","TPCnSigmaPio_P",";p (GeV/c);n#sigma_{pio}^{TPC}",
401                           100,0.2,20.,100,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaPio,kTRUE);
402     histos->UserHistogram("Track","TPCnSigmaPro_P",";p (GeV/c);n#sigma_{pro}^{TPC}",
403                           100,0.2,20.,100,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaPro,kTRUE);
404     histos->UserHistogram("Track","dEdx_NclsTPC",";N_{cls}^{TPC};TPC signal (arb units);#tracks",
405                           160,0.,160.,200,0.,200.,AliDielectronVarManager::kNclsTPC,AliDielectronVarManager::kTPCsignal);
406
407     histos->UserHistogram("Track","TOFbeta_P",";p (GeV/c);#beta;#tracks",
408                           250,0.0,5.0,300,0.,1.2,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTOFbeta);
409     histos->UserHistogram("Track","TOFnSigmaEle_P",";p (GeV/c);n#sigma_{ele}^{TOF}",
410                           100,0.2,20.,50,-10.,10.,AliDielectronVarManager::kP,AliDielectronVarManager::kTOFnSigmaEle,kTRUE);
411
412     if(cutDefinition==knoPID || cutDefinition==kTPC) {
413       histos->UserHistogram("Track","dEdx_RunNumber",";run;TPC signal (arb units)",
414                             GetRunNumbers(), BinsToVector(200,0.,200.),
415                             AliDielectronVarManager::kRunNumber,
416                             AliDielectronVarManager::kTPCsignal);
417       histos->UserHistogram("Track","TPCnSigmaEle_RunNumber",";run;TPC signal (arb units)",
418                             GetRunNumbers(), BinsToVector(100,-5.,5.),
419                             AliDielectronVarManager::kRunNumber,
420                             AliDielectronVarManager::kTPCnSigmaEle);
421       histos->UserHistogram("Track","dEdx_Eta",";#eta;TPC signal (arb units)",
422                             100,-1.,1.,200,0.,200.,AliDielectronVarManager::kEta,AliDielectronVarManager::kTPCsignal,kTRUE);
423       histos->UserHistogram("Track","dEdx_Phi",";#phi;TPC signal (arb units)",
424                             180,0.,6.285,200,0.,200.,AliDielectronVarManager::kPhi,AliDielectronVarManager::kTPCsignal,kTRUE);
425     }
426
427   } // end PID hists
428   
429   if (bHistPair) {
430     //Pair classes
431     for (Int_t i=1; i<=1; ++i){ // only +- pairs
432       histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(i)));
433     }
434     //add histograms to Pair classes
435     histos->UserHistogram("Pair","InvMass",";m_{ee} (GeV/c^{2});#pairs",
436                           100,.0,100*0.005, AliDielectronVarManager::kM); // 5MeV bins, 0.5GeV/c2
437     histos->UserHistogram("Pair","OpeningAngle",";angle (rad.)",
438                           100,0.,3.15, AliDielectronVarManager::kOpeningAngle);
439     histos->UserHistogram("Pair","CosPointingAngle",";|cos(#theta)|",
440                           110,0.0,1.1, AliDielectronVarManager::kCosPointingAngle);
441     histos->UserHistogram("Pair","Chi2NDF",";#chi^{2}/NDF",
442                           100,0.,20, AliDielectronVarManager::kChi2NDF);
443     histos->UserHistogram("Pair","PsiPair","PsiPair;#psi",
444                           100,0.,3.15, AliDielectronVarManager::kPsiPair);
445     histos->UserHistogram("Pair","R","Radius;r (cm)",
446                           200,0.,100., AliDielectronVarManager::kR);
447     histos->UserHistogram("Pair","LegDist",";dca (cm)",
448                           100,0.,1., AliDielectronVarManager::kLegDist);
449     histos->UserHistogram("Pair","LegDistXY",";dca_{xy} (cm)",
450                           100,0.,1., AliDielectronVarManager::kLegDistXY);
451     histos->UserHistogram("Pair","PdgCode",";mother PDG code;#tracks",
452                           10000,-5000.5,4999.5,AliDielectronVarManager::kPdgCode);
453     
454     // ITS tracks
455     histos->UserHistogram("Track","NclsITS",";N_{cls}^{ITS};#tracks", 
456                           "0,1,2,3,4,5,6,7",  AliDielectronVarManager::kNclsITS);
457     histos->UserHistogram("Track","ITSLayerFirstCls",";ITS layer first cls;#tracks", 
458                           "-1,0,1,2,3,4,5,6", AliDielectronVarManager::kITSLayerFirstCls);
459   } // end pair hists
460
461   // TRD efficiency
462   if(bHistEff) {
463     for (Int_t i=1; i<=1; ++i){ // only +- pairs
464       //      histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(i)));
465       //legs from pair
466       histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(i)));
467     }
468         
469     // purity
470     histos->UserHistogram("Track","TPCnSigmaEle",";n#sigma_{ele}^{TPC};#tracks",
471                           100,-10.,10.,AliDielectronVarManager::kTPCnSigmaEle);
472     // TRD
473     histos->UserHistogram("Track","TRDpidQuality",";N_{trkl}^{TRD};#tracks", 
474                           "0,1,2,3,4,5,6,7",    AliDielectronVarManager::kTRDpidQuality);
475     histos->UserHistogram("Track","TRDchi2",";#chi^{2}_{TRD};#tracks", 
476                           11,-1.,10.,    AliDielectronVarManager::kTRDchi2);
477     histos->UserHistogram("Track","TRDprobEle",";P_{ele}^{TRD};#tracks", 
478                           100,0.,1.,            AliDielectronVarManager::kTRDprobEle);
479     histos->UserHistogram("Track","TRDprobPio",";P_{pio}^{TRD};#tracks", 
480                           100,0.,1.,            AliDielectronVarManager::kTRDprobPio);
481
482     histos->UserHistogram("Track","TRDprobEle_TRDpidQuality",";N_{trkl}^{TRD};P_{ele}^{TRD}", 
483                           7,0.,7., 20,0.,1.,
484                           AliDielectronVarManager::kTRDpidQuality, AliDielectronVarManager::kTRDprobEle);
485     histos->UserHistogram("Track","TRDprobPio_TRDpidQuality",";N_{trkl}^{TRD};P_{pio}^{TRD}", 
486                           7,0.,7., 20,0.,1.,
487                           AliDielectronVarManager::kTRDpidQuality, AliDielectronVarManager::kTRDprobPio);
488     
489     histos->UserProfile("Track","TRDprobEle-TRDpidQuality",";N_{trkl}^{TRD};P_{ele}^{TRD}", 
490                         AliDielectronVarManager::kTRDprobEle,
491                         "0,1,2,3,4,5,6,7",    AliDielectronVarManager::kTRDpidQuality);
492     histos->UserProfile("Track","TRDprobPio-TRDpidQuality",";N_{trkl}^{TRD};P_{pio}^{TRD}", 
493                         AliDielectronVarManager::kTRDprobPio,
494                         "0,1,2,3,4,5,6,7",    AliDielectronVarManager::kTRDpidQuality);
495     // TPC track quality
496     histos->UserHistogram("Track","NclsTPC",";N_{cls}^{TPC};#tracks", 
497                           160,0.,160.,   AliDielectronVarManager::kNclsTPC);
498
499   } // end TRD eff
500   
501   if(1) {    
502     //histos->UserHistogram("Track","Pt",";p_{T} (GeV/c);#tracks",200,0,20.,AliDielectronVarManager::kPt);
503     //histos->UserHistogram("Track","Eta",";#eta;#tracks",100,-2.,2.,AliDielectronVarManager::kEta);
504     //histos->UserHistogram("Track","Phi",";#phi;#tracks",360,0.,6.285,AliDielectronVarManager::kPhi);  
505     if(isESD) {
506     histos->UserHistogram("Track","TRDchi2",";#chi^{2}_{TRD};#tracks",11,-1.,10.,    AliDielectronVarManager::kTRDchi2);
507     histos->UserHistogram("Track","TRDchi2_TRDpidQuality",";#chi^{2}_{TRD};N_{trkl}^{TRD};#tracks",
508                           11,-1.,10., 7,0.,7.,    AliDielectronVarManager::kTRDchi2, AliDielectronVarManager::kTRDpidQuality);
509     }
510     histos->UserHistogram("Track","V0Index0",";V0;#tracks",2,-0.5,1.5,AliDielectronVarManager::kV0Index0);
511     if(hasMC) {
512       histos->UserHistogram("Track","PdgCodeMother",";mother PDG code;#tracks",10000,-5000.5,4999.5,AliDielectronVarManager::kPdgCodeMother);
513       //    histos->UserHistogram("Track","PdgCode",";tracks PDG code;#tracks",10000,-5000.5,4999.5,AliDielectronVarManager::kPdgCode);
514     }
515   }
516   
517   //add histograms to get cut statistics
518   if (bHistCuts) {      
519     histos->UserHistogram("Track","Eta",";Eta;#tracks",
520                           "-5.,-0.9,-0.8,0.8,0.9,5.",          AliDielectronVarManager::kEta);
521     histos->UserHistogram("Track","Pt",";p_{T} (GeV/c);#tracks", 
522                           "0.0,0.8, 1.0, 1.2, 1.5, 100.0",    AliDielectronVarManager::kPt);
523     histos->UserHistogram("Track","ImpactParXY",";dXY (cm);#tracks",  
524                           500,-1.,1.,               AliDielectronVarManager::kImpactParXY);
525     histos->UserHistogram("Track","ImpactParZ",";dZ (cm);#tracks",        
526                           600,-3.,3.,               AliDielectronVarManager::kImpactParZ);
527     // ITS
528     histos->UserHistogram("Track","NclsITS",";N_{cls}^{ITS};#tracks", 
529                           "0,1,2,3,4,5,6,7",          AliDielectronVarManager::kNclsITS);
530     histos->UserHistogram("Track","ITSLayerFirstCls",";ITS layer first cls;#tracks", 
531                           "-1,0,1,2,3,4,5,6",          AliDielectronVarManager::kITSLayerFirstCls);
532     histos->UserHistogram("Track","NclsITS_ITSLayerFirstCls",";N_{cls}^{ITS};ITS layer first cls;#tracks", 
533                           7, 0., 7., 7, -1., 6.,
534                           AliDielectronVarManager::kNclsITS, AliDielectronVarManager::kITSLayerFirstCls);
535     // TPC
536     histos->UserHistogram("Track","NclsTPC",";N_{cls}^{TPC};#tracks", 
537                           "70, 90, 100, 120, 160",   AliDielectronVarManager::kNclsTPC);
538     histos->UserHistogram("Track","TPCchi2PerCluster",";#chi^{2}/N_{cls}^{TPC};#tracks", 
539                           10,0,10,AliDielectronVarManager::kTPCchi2Cl);
540     histos->UserHistogram("Track","TPC_nSigma_Electrons",";n#sigma_{ele}^{TPC};#tracks", 
541                           "-100,-4,-3,-2,-1.5,-1,1,1.5,2,3,4,100",AliDielectronVarManager::kTPCnSigmaEle);
542     histos->UserHistogram("Track","TPC_nSigma_Pions",";n#sigma_{pio}^{TPC};#tracks", 
543                           "-100,3.5,4.0,4.5,5.0,5.5,100",AliDielectronVarManager::kTPCnSigmaPio);
544     histos->UserHistogram("Track","TPC_nSigma_Protons",";n#sigma_{pro}^{TPC};#tracks", 
545                           "-100,3.5,4.0,4.5,5.0,5.5,100",AliDielectronVarManager::kTPCnSigmaPro);
546
547     histos->UserProfile("Track","NclsTPC-Eta-Phi",";#eta;#phi;N_{cls}^{TPC}",
548                         AliDielectronVarManager::kNclsTPC,
549                         BinsToVector(100,-2.,2.),      BinsToVector(360,0.,6.285),
550                         AliDielectronVarManager::kEta, AliDielectronVarManager::kPhi, "i;1;160");
551     // TRD
552     histos->UserHistogram("Track","TRDpidQuality",";N_{trkl}^{TRD};#tracks", 
553                           "0,1,2,3,4,5,6,7",            AliDielectronVarManager::kTRDpidQuality);
554     histos->UserHistogram("Track","TRDprobEle",";P_{ele}^{TRD};#tracks", 
555                           100,0.,1.,            AliDielectronVarManager::kTRDprobEle);
556     //    histos->UserHistogram("Track","TRD_PIDbit",";TRD pid bit;#tracks",
557     //                          "-.5,.5,1.5",              AliDielectronVarManager::kTRDPIDBit);
558     
559     // TOF
560     histos->UserHistogram("Track","TOF_PIDbit",";TOF pid bit;#tracks",
561                           "-.5,.5,1.5",              AliDielectronVarManager::kTOFPIDBit);
562     histos->UserHistogram("Track","TOF_nSigma_Electrons",";n#sigma_{ele}^{TOF};#tracks", 
563                           "-100,-3,-2,2,3,100",AliDielectronVarManager::kTOFnSigmaEle);
564   } // end cut hists
565   
566   
567   // track histos
568   //  histos->UserHistogram("Track","Pt",";p_{T} (GeV/c);#tracks",200,0,20.,AliDielectronVarManager::kPt);
569   //  histos->UserHistogram("Track","Eta",";#eta;#tracks",100,-2.,2.,AliDielectronVarManager::kEta);
570   //  histos->UserHistogram("Track","Phi",";#phi;#tracks",360,0.,6.285,AliDielectronVarManager::kPhi);  
571   //  histos->UserHistogram("Track","Eta_Phi",";#eta; #phi;#tracks",
572   //                        100,-2,2,144,0,6.285,AliDielectronVarManager::kEta,AliDielectronVarManager::kPhi);
573   //  
574   //  histos->UserHistogram("Track","Ncl",";Number clusters TPC;Number clusters TPC",
575   //                        160,-0.5,159.5,AliDielectronVarManager::kNclsTPC);
576   //  histos->UserHistogram("Track","NclFrFrac",";found/findable clusters (robust);#tracks",
577   //                        160,0,1.1,AliDielectronVarManager::kNFclsTPCrFrac);
578   //  histos->UserHistogram("Track","TPCsignalN","Number of Clusters TPC PID;#clusteres TPC PID;#tracks",
579   //                        160,-0.5,159.5,AliDielectronVarManager::kTPCsignalN);
580   //
581   //  histos->UserHistogram("Track","Ncl_NclPid","Number clusters TPC vs. number of clusters PID;#clusters TPC; #clusters TPC PID",
582   //                        160,-0.5,159.5,160,-0.5,159.5,AliDielectronVarManager::kNclsTPC,AliDielectronVarManager::kTPCsignalN);
583   //  histos->UserHistogram("Track","TPCchi2Cl","TPC #chi^{2}/cluster;TPC #chi^{2}/cluster;#tracks",
584   //                        100,0.,10.,AliDielectronVarManager::kTPCchi2Cl);
585   
586   die->SetHistogramManager(histos);
587 }
588
589 void InitCF(AliDielectron* die, Int_t cutDefinition)
590 {
591   //
592   // Setup the CF Manager if needed
593   //
594   
595   AliDielectronCF *cf=new AliDielectronCF(die->GetName(),die->GetTitle());
596   
597   // leg variables
598   cf->AddVariable(AliDielectronVarManager::kP, "1.0,1.5,2.0,3.0,5.0,10.0",kTRUE);
599   cf->AddVariable(AliDielectronVarManager::kTRDphi,       45, -3.15, +3.15, kTRUE);
600   cf->AddVariable(AliDielectronVarManager::kEta,          20, -1.0,   1.0,  kTRUE);
601   cf->AddVariable(AliDielectronVarManager::kTRDntracklets, 7, -0.5,   6.5,  kTRUE);
602   cf->AddVariable(AliDielectronVarManager::kTRDprobEle,   20,  0.0,   1.0,  kTRUE);
603   cf->AddVariable(AliDielectronVarManager::kTPCnSigmaEle, 10.,-3.5,  +3.5,  kTRUE);
604  
605   die->SetCFManagerPair(cf);
606 }
607
608 TVectorD *GetRunNumbers() {
609   
610   Double_t runLHC10h[] = { // all good runs based on RCT 29.Mai
611     139510, 139507, 139505, 139503, 139465, 139438, 139437, 139360, 139329, 139328, 139314, 139310, 139309, 139173, 139107, 139105, 139038, 139037, 139036, 139029, 139028, 138872, 138871, 138870, 138837, 138732, 138730, 138666, 138662, 138653, 138652, 138638, 138624, 138621, 138583, 138582, 138579, 138578, 138534, 138469, 138442, 138439, 138438, 138396, 138364, 138275, 138225, 138201, 138197, 138192, 138190, 137848, 137844, 137752, 137751, 137724, 137722, 137718, 137704, 137693, 137692, 137691, 137686, 137685, 137639, 137638, 137608, 137595, 137549, 137546, 137544, 137541, 137539, 137531, 137530, 137443, 137441, 137440, 137439, 137434, 137432, 137431, 137430, 137366, 137243, 137236, 137235, 137232, 137231, 137230, 137162, 137161, 137135
612   };
613   
614   Double_t runLHC11h[] = { // all good runs based on RCT 29.Mai
615     170593, 170572, 170388, 170387, 170315, 170313, 170312, 170311, 170309, 170308, 170306, 170270, 170269, 170268, 170230, 170228, 170207, 170204, 170203, 170193, 170163, 170159, 170155, 170091, 170089, 170088, 170085, 170084, 170083, 170081, 170040, 170027, 169965, 169923, 169859, 169858, 169855, 169846, 169838, 169837, 169835, 169591, 169590, 169588, 169587, 169586, 169557, 169555, 169554, 169553, 169550, 169515, 169512, 169506, 169504, 169498, 169475, 169420, 169419, 169418, 169417, 169415, 169411, 169238, 169167, 169160, 169156, 169148, 169145, 169144, 169138, 169099, 169094, 169091, 169045, 169044, 169040, 169035, 168992, 168988, 168826, 168777, 168514, 168512, 168511, 168467, 168464, 168460, 168458, 168362, 168361, 168342, 168341, 168325, 168322, 168311, 168310, 168115, 168108, 168107, 168105, 168076, 168069, 167988, 167987, 167985, 167920, 167915
616   };
617   
618   // selection via environement variable (works only for gsi trains)
619
620   
621   if(list.Contains("LHC10h") || list.Contains("LHC11a10")) {
622     Int_t size = (int) (sizeof(runLHC10h)/sizeof(Double_t));
623     TVectorD *vec = new TVectorD(size+1);
624     
625     (*vec)[size] = runLHC10h[0] + 1;
626     for (int i = 0; i < size; i++) {
627       (*vec)[i] = runLHC10h[size-1-i];
628     }
629     //    vec->Print("");
630     return vec;
631   }
632
633   if( list.Contains("LHC11h") || list.Contains("LHC12a17") ) {
634     
635     Int_t size = (int) (sizeof(runLHC11h)/sizeof(Double_t));
636     TVectorD *vec = new TVectorD(size+1);
637     
638     (*vec)[size] = runLHC11h[0] + 1;
639     for (int i = 0; i < size; i++) {
640       (*vec)[i] = runLHC11h[size-1-i];
641     }
642     //   vec->Print("");
643     return vec;
644   }
645
646   TVectorD *vec = new TVectorD(2);
647   (*vec)[0] = 0;
648   (*vec)[0] = 1;
649   return vec;
650   
651 }
652
653 TVectorD *BinsToVector(Int_t nbins, Double_t min, Double_t max) {
654   return AliDielectronHelper::MakeLinBinning(nbins,min,max);
655   //  TVectorD *vec = new TVectorD(nbins+1);
656   //
657   //  Double_t binwdth = (max-min)/nbins;
658   //  for (int i = 0; i < nbins+1; i++) (*vec)[i] = min + i*binwdth;
659   //  
660   //  return vec;
661 }
662
663