]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/macrosJPSI/ConfigJpsi_jb_PbPb.C
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / macrosJPSI / ConfigJpsi_jb_PbPb.C
1 void InitHistograms(AliDielectron *die, Int_t cutDefinition);
2 void AddQAHistsPID(AliDielectron *die);
3 void AddQAHistsEP(AliDielectron *die);
4 void AddHistsEleEff(AliDielectron *die);
5
6 void InitCF(AliDielectron* die, Int_t cutDefinition);
7 void InitHF(AliDielectron* die, Int_t cutDefinition);
8
9 void SetupEventCuts(AliDielectron *die, ULong64_t triggers, Int_t cutDefinition);
10 void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition);
11 void SetupV0Cuts( AliDielectron *die,  Int_t cutDefinition);
12 void SetupPairCuts( AliDielectron *die,  Int_t cutDefinition);
13
14 void ConfigEvtPlane(AliDielectron *die,  Int_t cutDefinition);
15 void ConfigBgrd(    AliDielectron *die,  Int_t cutDefinition);
16
17 void AddMCSignals(AliDielectron *die,  Int_t cutDefinition);
18 void SetEtaCorrection(AliDielectron *die);
19 TVectorD *GetRunNumbers2011();
20 TVectorD *GetPDGcodes();
21 TVectorD *GetDeltaPhiBins();
22
23 TString names=("Event;PIDqa;Flow;avgPt;Rec;TPC;TOF;TRD;Ionut;TPC-TOF-TRD;NOPID;LegEff;SysPt;SysEta;SysEle;SysPro;SysSPD;SysMC;SysMCele");
24 enum { kEvent, kPIDqa, kFlow, kAvgPt, kRec, kTPC, kTOF, kTRD, kIonut, kTPCTOFTRD, kNoPID, kLegEff, kSysPt, kSysEta, kSysEle, kSysPro, kSysSPD, kSysMC,kSysMCele, kPIDQA };
25
26 TObjArray *arrNames=names.Tokenize(";");
27 const Int_t nDie=arrNames->GetEntries();
28
29 Bool_t  isESD = kTRUE;
30 TString list  = gSystem->Getenv("LIST");
31
32 AliDielectron* ConfigJpsi_jb_PbPb(Int_t cutDefinition, Bool_t hasMC=kFALSE, ULong64_t triggers=AliVEvent::kCentral | AliVEvent::kSemiCentral | AliVEvent::kMB)
33 {
34   //
35   // Setup the instance of AliDielectron
36   //
37
38   // gsi train?
39   TString trainRoot = gSystem->Getenv("TRAIN_ROOT");
40   Bool_t isGSItrain = (trainRoot.IsNull()?kFALSE:kTRUE); 
41   if(isGSItrain) {
42     // find mc or not?
43     if( list.IsNull()) list=prod;
44     if( list.Contains("LHC10h")   || list.Contains("LHC11h")   ) hasMC=kFALSE;
45     if( list.Contains("LHC11a10") || list.Contains("LHC12a17") ||  list.Contains("LHC13c7")) hasMC=kTRUE;
46   }
47
48   //ESD handler?
49   isESD=(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliESDInputHandler::Class());
50
51   // switch configurations ON and OFF
52   if(hasMC) { // MONTE CARLO
53     switch(cutDefinition) {
54     case kEvent:   /* */ break;          // event quantities (mult, ep, trigger, ...)
55       //    case kPIDqa:   /* */ break;          // post calibration and validation of TPC PID
56       //    case kRec:     /* */ break;          // to calculate partial efficiencies, in particular the geom. acceptance
57       //    case kLegEff:  /* */ break;          // single electron efficiency calculation
58     case kAvgPt:   /* */ break;          // mean pt analysis
59       //    case kTPC:   /* */ break;
60       //    case kTOF:   /* */ break;
61       //    case kTRD:   /* */ break;
62       //    case kIonut: /* */ break;
63       //    case kSysMC: /* */ break;
64       //    case kSysMCele: /* */ break;
65       //    case kNoPID: /* */ break;
66     default:         return 0x0;
67     }
68   } else { // COLLISION DATA
69     switch(cutDefinition) {
70     case kEvent:   /* */ break;          // event quantities (mult, ep, trigger, ...)
71       //case kPIDqa:   /* */ break;          // for post calibration and validation of TPC PID 
72       //    case kFlow:    /* */ break;          // flow calculation
73       //    case kNoPID: /* */ break;
74       //    case kTPC:   /* */ break;
75       //    case kTOF:   /* */ break;
76       //    case kTRD:   /* */ break;
77       //    case kIonut:       /* */ break;
78       //    case kTPCTOFTRD:   /* */ break;
79     case kAvgPt:       /* */ break;
80       //    case kSysPt:       /* */ break;
81       // case kSysEta:       /* */ break;
82       // case kSysEle:       /* */ break;
83       // case kSysPro:       /* */ break;
84       //    case kSysSPD:       /* */ break;
85     default:         return 0x0;
86     }
87   }
88
89   // task name
90   TString name=Form("%02d",cutDefinition);
91   if (cutDefinition<arrNames->GetEntriesFast())  name=arrNames->At(cutDefinition)->GetName();
92   printf(" Adding %s%s config %s for %s \n",(isESD?"ESD":"AOD"),(hasMC?" MC":""),name.Data(),list.Data());
93
94   // init AliDielectron
95   AliDielectron *die = new AliDielectron(Form("%s",name.Data()), Form("%s",name.Data()));
96   die->SetHasMC(hasMC);
97
98   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
99   SetupEventCuts(die,triggers,cutDefinition);
100   SetupTrackCuts(die,cutDefinition);
101   SetupV0Cuts(die,cutDefinition);
102   SetupPairCuts(die,cutDefinition);
103
104   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv MISC vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
105   // Monte Carlo Signals
106   if(hasMC)  AddMCSignals(die, cutDefinition);
107   // PID post calibartion
108   if(cutDefinition!=kEvent) SetEtaCorrection(die); ///////////////////ATTENTION
109   // bgrd estimators
110   ////  if(!hasMC) 
111   ConfigBgrd(die,cutDefinition);
112   // tpc event plane configuration
113   //  if(!hasMC) 
114   ConfigEvtPlane(die,cutDefinition);
115   // prefilter settings
116   if(cutDefinition==kEvent || cutDefinition==kNoPID || cutDefinition==kPIDqa || cutDefinition==kLegEff)
117     die->SetNoPairing();
118   else
119     die->SetPreFilterAllSigns();
120   //die->SetPreFilterUnlikeOnly();
121   // load single electron effieciency map ATTENTION
122   if(!hasMC && 0) AliDielectronVarManager::InitEffMap("/home/aliceexp/jbook/gsi-train-trunk/jbook_jpsi/effMap.root");
123   if(cutDefinition==kAvgPt) AliDielectronVarManager::InitEffMap("/sw/alice/gsi-svn/testtrain/effMap.root");
124
125   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv OUTPUT vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
126   // histogram setup
127   InitHistograms(die,cutDefinition);
128   // histogram grid setup
129   InitHF(die,cutDefinition);
130   // CF container setup
131   InitCF(die,cutDefinition);
132
133   // cut QA
134   die->SetCutQA();
135
136   return die;
137 }
138
139 //______________________________________________________________________________________
140 void SetupEventCuts(AliDielectron *die, ULong64_t triggers, Int_t cutDefinition)
141 {
142   //
143   // Setup the event cuts
144   //
145
146   // trigger specific centrality cuts (reject trigger inefficiencies)
147   Double_t minCent=0.0, maxCent=100.;
148   if(!die->GetHasMC()) {
149     switch(triggers) {
150     // case AliVEvent::kCentral:     minCent= 0.; maxCent=10.; break; //0-9
151     // case AliVEvent::kSemiCentral: minCent=10.; maxCent=50.; break; //12-53
152     // case AliVEvent::kMB:          minCent=10.; maxCent=90.; break;
153     default:                      minCent= 0.; maxCent=90.; break;
154     }
155   }
156   //  if(cutDefinition >= kEtaGap01) {minCent=20.; maxCent=50.;} // v2 analysis
157   if(cutDefinition == kSysMC) {minCent=0.; maxCent=50.;}
158   if(cutDefinition == kSysMCele) {minCent=0.; maxCent=50.;}
159
160   // VZERO multiplicity vs. number ob global tracks cut
161   TF1 *fMean  = new TF1("fMean", "pol1",               0,25e+3);
162   fMean->SetParameters(691.633, 1.4892);
163   TF1 *fSigma = new TF1("fSigma","[0]+sqrt([1]*x+[2])",0,25e+3);
164   fSigma->SetParameters(-83.6599, 36.7677, 69530.7);
165
166   AliDielectronEventCuts *eventCuts=new AliDielectronEventCuts("vertex","vertex");
167   if(!isESD) eventCuts->SetVertexType(AliDielectronEventCuts::kVtxAny);
168   eventCuts->SetRequireVertex();
169   eventCuts->SetMinVtxContributors(1);
170   eventCuts->SetVertexZ(-10.,+10.);
171   eventCuts->SetCentralityRange(minCent,maxCent);
172   //  eventCuts->SetCutOnV0MultipicityNTrks(fMean, fSigma, 4.0);
173   //  eventCuts->SetRunRejection(AliDielectronHelper::MakeArbitraryBinning("170592,170593,170594"));
174   eventCuts->Print();
175   die->GetEventFilter().AddCuts(eventCuts);
176
177 }
178
179 //______________________________________________________________________________________
180 void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition)
181 {
182   //
183   // Setup the track cuts
184   //
185   Bool_t hasMC=die->GetHasMC();
186
187   // Quality cuts
188   //  die->GetTrackFilter().AddCuts(cuts);
189
190   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv FILTER CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
191   // AOD track filter (needs to be first cut to speed up)
192   AliDielectronTrackCuts *trkFilter = new AliDielectronTrackCuts("TrkFilter","TrkFilter");
193   trkFilter->SetAODFilterBit(AliDielectronTrackCuts::kTPCqual);
194   //  trkFilter->SetMinNCrossedRowsOverFindable(0.6);
195
196   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv TRACK CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
197   AliDielectronVarCuts *varAccCuts   = new AliDielectronVarCuts("acc","acc");
198   AliDielectronCutGroup  *grpRecCuts = new AliDielectronCutGroup("rec","rec",AliDielectronCutGroup::kCompAND);
199   AliDielectronVarCuts   *varRecCuts = new AliDielectronVarCuts("VarRecCuts","VarRecCuts");
200   AliDielectronTrackCuts *trkRecCuts = new AliDielectronTrackCuts("TrkRecCuts","TrkRecCuts");
201
202   // config specific cuts
203   switch(cutDefinition) {
204   case kPIDqa:
205     varAccCuts->AddCut(AliDielectronVarManager::kPt,           0.85, 1e30);
206     varRecCuts->AddCut(AliDielectronVarManager::kTPCclsSegments,7.,   8.0);
207     break;
208   case kEvent:
209   case kFlow:
210   case kRec:
211   case kIonut:
212   case kTRD:
213   case kTPCTOFTRD:
214   case kAvgPt:
215   case kNoPID:
216   case kSysMCele:
217     varAccCuts->AddCut(AliDielectronVarManager::kPt,           0.85, 1e30); ///ATTENTION
218     varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.8,   0.8); ////ATTENTION
219   case kLegEff:
220     varRecCuts->AddCut(AliDielectronVarManager::kTPCclsSegments,7.,   8.0);
221     trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 3); // SPD any
222     //if(hasMC)  varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
223     //else
224     ///       
225     break;
226   case kTOF:
227   case kTPC:
228     varAccCuts->AddCut(AliDielectronVarManager::kPt,           0.95, 1e30);    //0.8
229     varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
230     varRecCuts->AddCut(AliDielectronVarManager::kNclsTPC,     70.0, 160.0);
231     trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 7); // ITS-3 = 1+2+4
232     break;
233     ///////////////////////////////////////////////////////////////////////////////////////////// systematics
234   case kSysPt:
235     varAccCuts->AddCut(AliDielectronVarManager::kPt,           1.1, 20./*1e30*/); ///ATTENTION
236     varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.8,   0.8); ////ATTENTION
237     varRecCuts->AddCut(AliDielectronVarManager::kTPCclsSegments,7.,   8.0);
238     trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 3); // SPD any
239     break;
240   case kSysEta:
241     varAccCuts->AddCut(AliDielectronVarManager::kPt,           0.85, 20./*1e30*/); ///ATTENTION
242     varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9); ////ATTENTION
243     varRecCuts->AddCut(AliDielectronVarManager::kTPCclsSegments,7.,   8.0);
244     trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 3); // SPD any
245     break;
246   case kSysEle:
247   case kSysPro:
248     varAccCuts->AddCut(AliDielectronVarManager::kPt,           0.85, 20./*1e30*/); ///ATTENTION
249     varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.8,   0.8); ////ATTENTION
250     varRecCuts->AddCut(AliDielectronVarManager::kTPCclsSegments,7.,   8.0);
251     trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 3); // SPD any
252     break;
253   case kSysSPD:
254     varAccCuts->AddCut(AliDielectronVarManager::kPt,           0.85, 20./*1e30*/); ///ATTENTION
255     varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.8,   0.8); ////ATTENTION
256     varRecCuts->AddCut(AliDielectronVarManager::kTPCclsSegments,7.,   8.0);
257     trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 1); // SPD any
258     break;
259   case kSysMC:
260     varAccCuts->AddCut(AliDielectronVarManager::kPt,           0.85, 20./*1e30*/); ///ATTENTION
261     varAccCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9); ////ATTENTION
262     varRecCuts->AddCut(AliDielectronVarManager::kTPCclsSegments,7.,   8.0);
263     trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 3); // SPD any
264     break;
265   }
266
267   // standrad reconstruction cuts
268   varRecCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0,   1.0);
269   varRecCuts->AddCut(AliDielectronVarManager::kImpactParZ,  -3.0,   3.0);
270   varRecCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl,    0.0,   4.0);
271   varRecCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
272   //  varRecCuts->AddCut(AliDielectronVarManager::kV0Index0,     0.0);
273   trkRecCuts->SetRequireITSRefit(kTRUE);
274   trkRecCuts->SetRequireTPCRefit(kTRUE);
275
276   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PID CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
277   AliDielectronCutGroup *grpPIDCuts = new AliDielectronCutGroup("PID","PID",AliDielectronCutGroup::kCompAND);
278   AliDielectronVarCuts  *pidSelCuts = new AliDielectronVarCuts("selPIDCuts","selPIDCuts");
279   pidSelCuts->AddCut(AliDielectronVarManager::kTRDpidQuality,      4.0,   6.0);
280   pidSelCuts->AddCut(AliDielectronVarManager::kTRDchi2,            0.0,   2.0);
281   AliDielectronVarCuts *pidVarCuts = new AliDielectronVarCuts("varPIDCuts","varPIDCuts");
282   AliDielectronVarCuts *pidMCCuts  = new AliDielectronVarCuts("mcPIDCuts","mcPIDCuts");
283   AliDielectronPID *pidCuts        = new AliDielectronPID("PIDCuts","PIDCuts");
284
285   switch(cutDefinition) {
286   case kPIDqa:
287     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-10.,10.);
288     break;
289   case kTOF:
290     pidVarCuts->AddCut(AliDielectronVarManager::kTOFbeta,      0.2,   0.9, kTRUE);
291     pidCuts->AddCut(AliDielectronPID::kTOF,AliPID::kElectron,-3,3.,0.,0.,kFALSE,
292                     AliDielectronPID::kIfAvailable);
293   case kTPC:
294     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3.,4.);
295     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-100.,4.0,0.,0.,kTRUE);
296     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,3.5,0.,0.,kTRUE);
297     break;
298   case kTRD:
299     pidCuts->AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.95,1.,pidSelCuts,
300                     kFALSE, AliDielectronPID::kIfAvailable);
301   case kEvent:
302   case kFlow:
303   case kIonut:
304   case kLegEff:
305   case kAvgPt:
306     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.5.,3.);
307     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.9,3.0,-0.5,+0.5,kFALSE,
308                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
309     // pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.65,3.0,-0.3,+0.3,kFALSE,
310     //          AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
311     // pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.4,3.0,-0.1,+0.1,kFALSE,
312     //          AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
313     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,4.0,0.,0.,kTRUE);
314     // tof heavy particle exclusion
315     //    pidVarCuts->AddCut(AliDielectronVarManager::kTOFbeta,      0.3,   0.7, kTRUE);
316     //pidCuts->AddCut(AliDielectronPID::kTOF,AliPID::kElectron,-3,3.,0.,0.,kFALSE,
317      //             AliDielectronPID::kIfAvailable);
318     break;
319   case kTPCTOFTRD:
320     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.3.,3.);
321     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.9,3.0,-0.5,+0.5,kFALSE,
322                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
323     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.65,3.0,-0.3,+0.3,kFALSE,
324                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
325     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.4,3.0,-0.1,+0.1,kFALSE,
326                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
327     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,4.0,0.,0.,kTRUE);
328     pidVarCuts->AddCut(AliDielectronVarManager::kTOFbeta,      0.2,   0.9, kTRUE);
329     pidCuts->AddCut(AliDielectronPID::kTOF,AliPID::kElectron,-3,3.,0.,0.,kFALSE,
330                     AliDielectronPID::kIfAvailable);
331     pidCuts->AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.95,1.,pidSelCuts,
332                     kFALSE, AliDielectronPID::kIfAvailable);
333     break;
334     ///////////////////////////////////////////////////////////////////////////////////////////// systematics
335   case kSysPt:
336   case kSysEta:
337   case kSysSPD:
338     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.5.,3.);
339     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.9,3.0,-0.5,+0.5,kFALSE,
340                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
341     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,4.0,0.,0.,kTRUE);
342     break;
343   case kSysEle:
344     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,+0.7.,3.);
345     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,4.0,0.,0.,kTRUE);
346     break;
347   case kSysPro:
348     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.5.,3.);
349     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.9,3.0,-0.5,+0.5,kFALSE,
350                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
351     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,3.5,0.,0.,kTRUE);
352     break;
353   case kSysMC:
354     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.5.,3.);
355     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.9,3.0,-0.5,+0.5,kFALSE,
356                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
357     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,3.5,0.,0.,kTRUE);
358     break;
359   case kSysMCele:
360     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.5.,3.);
361     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-0.9,3.0,-0.5,+0.5,kFALSE,
362                     AliDielectronPID::kRequire,AliDielectronVarManager::kEta);
363     pidCuts->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,4.0,0.,0.,kTRUE);
364     break;
365   }
366
367   // mc identification
368   if(cutDefinition==kLegEff && 0) {
369     pidMCCuts->SetCutType(AliDielectronVarCuts::kAny);//only apply any of the two cuts
370     pidMCCuts->AddCut(AliDielectronVarManager::kPdgCode,-11.5,-10.5 );
371     pidMCCuts->AddCut(AliDielectronVarManager::kPdgCode,10.5,11.5 );
372   }
373
374
375   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv TENDER CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
376   // exclude conversion electrons selected by the tender
377   AliDielectronTrackCuts *noconv=new AliDielectronTrackCuts("noConv","noConv");
378   noconv->SetV0DaughterCut(AliPID::kElectron,kTRUE);
379
380   // activate the cut sets (order might be CPU timewise important)
381   switch(cutDefinition) {
382   case kNoPID:
383   case kPIDqa:
384     die->GetTrackFilter().AddCuts(varAccCuts);
385     grpRecCuts->AddCut(trkRecCuts);
386     grpRecCuts->AddCut(varRecCuts);
387     die->GetTrackFilter().AddCuts(grpRecCuts);
388     /// NOTE should be changed to get ride of itsfirst but what about the pt cut?????????
389     //    die->GetTrackFilter().AddCuts(varRecCuts); 
390     break;
391   case kRec:
392     die->GetTrackFilter().AddCuts(varAccCuts);
393     grpRecCuts->AddCut(trkRecCuts);
394     grpRecCuts->AddCut(varRecCuts);
395     die->GetTrackFilter().AddCuts(grpRecCuts);
396     break;
397   case kEvent:
398   case kFlow:
399   case kIonut:
400   case kLegEff:
401   case kTRD:
402   case kTPCTOFTRD:
403   case kAvgPt:
404   case kTOF:
405   case kTPC:
406   case kSysPt:
407   case kSysEta:
408   case kSysEle:
409   case kSysPro:
410   case kSysSPD:
411   case kSysMC:
412   case kSysMCele:
413     die->GetTrackFilter().AddCuts(varAccCuts);
414     grpRecCuts->AddCut(trkRecCuts);
415     grpRecCuts->AddCut(varRecCuts);
416     die->GetTrackFilter().AddCuts(grpRecCuts);
417     grpPIDCuts->AddCut(pidCuts);
418     grpPIDCuts->AddCut(pidVarCuts);
419     grpPIDCuts->AddCut(pidMCCuts);
420     die->GetTrackFilter().AddCuts(grpPIDCuts);
421     //  if(!isESD) cuts->AddCut(trkFilter);
422     //cuts->AddCut(noconv);
423   }
424   //  cuts->Print();
425
426 }
427
428 //______________________________________________________________________________________
429 void SetupV0Cuts(AliDielectron *die, Int_t cutDefinition)
430 {
431   //
432   // Setup the V0 cuts
433   //
434
435   switch(cutDefinition) {
436   case kEvent:  return;
437   case kLegEff: return;
438   }
439
440   Bool_t bRej  = kTRUE;
441   Int_t defPID = 16;
442   if(cutDefinition==kPIDqa) {
443     bRej   = kFALSE;
444     defPID = 13;
445   }
446
447   AliDielectronV0Cuts *gammaV0Cuts = new AliDielectronV0Cuts("V0","V0");
448   gammaV0Cuts->SetV0finder(AliDielectronV0Cuts::kOnTheFly);
449   gammaV0Cuts->SetPdgCodes(22,11,11);
450   gammaV0Cuts->SetDefaultPID(defPID);
451   gammaV0Cuts->AddCut(AliDielectronVarManager::kCosPointingAngle, TMath::Cos(0.05),   1.0,  kFALSE); //0.02 -- 0.05
452   gammaV0Cuts->AddCut(AliDielectronVarManager::kArmPt,                         0.0,   0.05, kFALSE);
453   gammaV0Cuts->AddCut(AliDielectronVarManager::kArmAlpha,                     -0.35,  0.35, kFALSE);
454   gammaV0Cuts->AddCut(AliDielectronVarManager::kM,                             0.0,   0.1,  kFALSE); //0.05 -- 0.1
455   gammaV0Cuts->AddCut(AliDielectronVarManager::kChi2NDF,                       0.0,  10.0,  kFALSE);
456   gammaV0Cuts->AddCut(AliDielectronVarManager::kLegDist,                       0.0,   0.25, kFALSE);
457   gammaV0Cuts->AddCut(AliDielectronVarManager::kR,                             3.0,  90.0,  kFALSE);
458   gammaV0Cuts->AddCut(AliDielectronVarManager::kPsiPair,                       0.0,   0.2,  kFALSE); //0.05 -- 0.2
459   //  gammaV0Cuts->AddCut(AliDielectronVarManager::kOpeningAngle,              0.0,   0.1,  kFALSE);
460   gammaV0Cuts->SetExcludeTracks(bRej);
461   gammaV0Cuts->Print();
462
463  //  const Double_t |cutAlphaG| < 0.35; &&  const Double_t cutQTG < 0.05;
464  //  const Double_t |cutAlphaG2|[2] = {0.6, 0.8}; &&  const Double_t cutQTG2 < 0.04;
465
466   // if(cuts)
467   //   ((AliDielectronCutGroup*)cuts)->AddCut(gammaV0Cuts);
468   // else
469   die->GetTrackFilter().AddCuts(gammaV0Cuts);
470 }
471
472 //______________________________________________________________________________________
473 void SetupPairCuts(AliDielectron *die, Int_t cutDefinition)
474 {
475   //
476   // Setup the pair cuts
477   //
478   Bool_t hasMC=die->GetHasMC();
479
480   // rap and mass rejection
481   Double_t gCut=0.05, yCut=0.9, eCut=0.01;
482   switch(cutDefinition) {
483   case kEvent:      yCut=0.0;  break;
484   case kPIDqa:      return;
485   case kFlow:       yCut=0.8;  break;
486   case kRec:        yCut=0.9;  break;
487   case kNoPID:      return;
488   case kTPC:        yCut=0.9;  break;
489   case kTOF:        yCut=0.9;  break;
490   case kTRD:        yCut=0.8;  break;
491   case kIonut:      yCut=0.8;  break;
492   case kLegEff:     return;
493   case kTPCTOFTRD:  yCut=0.8;  break;
494   case kAvgPt:      yCut=0.8;  break;
495   case kSysMC:      yCut=0.9;  break;
496   case kSysMCele:   yCut=0.8;  break;
497   case kSysEta:     yCut=0.9;  break;
498   case kSysPt:
499   case kSysEle:
500   case kSysPro:
501   case kSysSPD:
502     yCut=0.8;                  break;
503     //  default: gCut=0.05;       // default
504   }
505
506   // MC
507   //if(hasMC) yCut=0.9;
508
509   // rapidity selection
510   AliDielectronVarCuts *rapCut=new AliDielectronVarCuts(Form("|Y|<%.1f",yCut),Form("|Y|<%.1f",yCut));
511   rapCut->AddCut(AliDielectronVarManager::kY,-1.*yCut,yCut);
512   die->GetPairFilter().AddCuts(rapCut);
513
514   // gamma rejection
515   AliDielectronVarCuts *gammaCuts = new AliDielectronVarCuts("GammaCuts","GammaCuts");
516   gammaCuts->AddCut(AliDielectronVarManager::kM,            0.0,   gCut);
517   die->GetPairPreFilter().AddCuts(gammaCuts);
518
519   // pair efficiency cut
520   if(cutDefinition==kAvgPt && !hasMC) {
521     AliDielectronVarCuts *effCut=new AliDielectronVarCuts(Form("(Axe)>%.2f",eCut),Form("(Axe)>%.2f",eCut));
522     effCut->AddCut(AliDielectronVarManager::kPairEff,0.0,eCut,kTRUE);
523     die->GetPairFilter().AddCuts(effCut);
524   }
525
526   // random signal rejection
527   AliDielectronCutGroup *grpRNDMCuts = new AliDielectronCutGroup("RNDM","RNDM",AliDielectronCutGroup::kCompOR);
528   AliDielectronVarCuts *exclCutCEN=new AliDielectronVarCuts("exclCEN","exclCEN");
529   exclCutCEN->SetCutType(AliDielectronVarCuts::kAll); // all criteria need to be fullfilled
530   exclCutCEN->AddCut(AliDielectronVarManager::kRndmPair,0.0,1./40);
531   exclCutCEN->AddCut(AliDielectronVarManager::kPdgCode,443);
532   exclCutCEN->AddCut(AliDielectronVarManager::kCentrality,0.,10.);
533   AliDielectronVarCuts *exclCutSEMI=new AliDielectronVarCuts("exclSEMI","exclSEMI");
534   exclCutSEMI->SetCutType(AliDielectronVarCuts::kAll); // all criteria need to be fullfilled
535   exclCutSEMI->AddCut(AliDielectronVarManager::kRndmPair,0.0,1./20);
536   exclCutSEMI->AddCut(AliDielectronVarManager::kPdgCode,443);
537   exclCutSEMI->AddCut(AliDielectronVarManager::kCentrality,10.,90.);
538   AliDielectronVarCuts *inclCut=new AliDielectronVarCuts("incl","incl");
539   inclCut->AddCut(AliDielectronVarManager::kPdgCode,443,443,kTRUE);
540   grpRNDMCuts->AddCut(exclCutCEN);
541   grpRNDMCuts->AddCut(exclCutSEMI);
542   grpRNDMCuts->AddCut(inclCut);
543   if(hasMC && cutDefinition==kIonut && 0) die->GetPairFilter().AddCuts(grpRNDMCuts); //ATTENTION
544
545 }
546
547 //______________________________________________________________________________________
548 void ConfigBgrd(AliDielectron *die, Int_t cutDefinition)
549 {
550   //
551   // Configurate the background estimators
552   //
553
554   // skip event QA
555   switch(cutDefinition) {
556   case kEvent:
557   case kNoPID:
558   case kPIDqa:
559   case kRec:
560   case kLegEff:
561     return;
562   }
563
564   // add track rotations
565   AliDielectronTrackRotator *rot=new AliDielectronTrackRotator;
566   rot->SetIterations(10);
567   rot->SetConeAnglePhi(TMath::Pi());
568   rot->SetStartAnglePhi(TMath::Pi());
569   //      die->SetTrackRotator(rot);
570
571   // add mixed events
572   AliDielectronMixingHandler *mix=new AliDielectronMixingHandler;
573   switch(cutDefinition) {
574   // case kIonut:
575   //   mix->AddVariable(AliDielectronVarManager::kZvPrim,      20, -10., 10.);
576   //   mix->AddVariable(AliDielectronVarManager::kCentrality,  36,   0., 90.);
577   //   mix->AddVariable(AliDielectronVarManager::kv0ACrpH2,    10,   0., TMath::Pi());
578   //   break;
579   default: 
580     mix->AddVariable(AliDielectronVarManager::kZvPrim,      "-10.,-5.,-4.,-3.,-2.,-1.,0.,1.,2.,3.,4.,5.,10.");
581     mix->AddVariable(AliDielectronVarManager::kCentrality,  9,  0.,90.);
582     mix->AddVariable(AliDielectronVarManager::kTPCrpH2,     10, TMath::Pi()/-2, TMath::Pi()/2); // max res: 10%->10bins // 8bins
583     //    mix->AddVariable(AliDielectronVarManager::kTPCmagH2,    "0.,20.,50.,80.,110.,150.,500.");
584     break;
585   }
586   mix->SetSkipFirstEvent(kTRUE); // needed for flow analysis
587   mix->SetMixType(AliDielectronMixingHandler::kAll);
588   mix->SetDepth(150);
589   die->SetMixingHandler(mix);
590
591 }
592
593 //______________________________________________________________________________________
594 void ConfigEvtPlane(AliDielectron *die, Int_t cutDefinition)
595 {
596   //
597   // Configurate the TPC event plane 
598   //
599
600   switch(cutDefinition) {
601     //  case kEvent:
602   case kNoPID:
603   case kPIDqa:
604     //  case kRec:   // TOTHINK: might be needed when checking efficiencies versus dPhi
605   case kLegEff:
606     return;
607   }
608
609   //   Double_t gGap;
610   //   switch(cutDefinition) {
611   //   case kEtaGap01:   gGap=0.1;   break;
612   //   case kEtaGap02:   gGap=0.2;   break;
613   //   case kEtaGap03:   gGap=0.3;   break;
614   //   case kEtaGap04:   gGap=0.4;   break;
615   //   case kEtaGap05:   gGap=0.5;   break;
616   //   default: gGap=0.0;
617   //   }
618   // eta gap in tpc event plane
619   //   AliDielectronVarCuts *etaGap = new AliDielectronVarCuts(AliDielectronVarManager::GetValueName(AliDielectronVarManager::kEta),"etaGap");
620   //   etaGap->AddCut(AliDielectronVarManager::kEta,-1*gGap,gGap,kTRUE);
621   //   die->GetEventPlanePreFilter().AddCuts(etaGap);
622
623   AliDielectronVarCuts *poi = new AliDielectronVarCuts("PoI","PoI");
624   poi->AddCut(AliDielectronVarManager::kM,2.92,3.20);     // particles of interest, jpsi mass window
625   die->GetEventPlanePOIPreFilter().AddCuts(poi);
626
627   // die->SetLikeSignSubEvents();
628   die->SetPreFilterEventPlane();
629 }
630
631 //______________________________________________________________________________________
632 void InitHistograms(AliDielectron *die, Int_t cutDefinition)
633 {
634   //
635   // Initialise the histograms
636   //
637   Bool_t hasMC=die->GetHasMC();
638
639   // booleans for histo selection
640   Bool_t bHistTrackQA=kFALSE, bHistEvts=kFALSE, bHistPair=kFALSE, bHistTrk=kFALSE, bHistPairME=kFALSE, bHistFlow=kFALSE, bHistFlowQA=kFALSE, bHistPID=kFALSE;
641   switch (cutDefinition) {
642   case kEvent: bHistEvts=kTRUE; break;
643   case kPIDqa: bHistTrk=kTRUE; break;
644   case kNoPID: bHistTrk=kTRUE; break;
645   case kRec:   /* */ break;
646   case kTPC:
647   case kTOF:   //bHistEvts=kTRUE; //bHistFlow=kTRUE;
648   case kTRD:   ///bHistEvts=kTRUE; //bHistFlow=kTRUE;
649   case kAvgPt: 
650   case kIonut: ///*bHistEvts=kTRUE;*/ bHistPair=kTRUE; break; //bHistPairME=kTRUE;
651   case kTPCTOFTRD: bHistPair=kTRUE; bHistTrk=kTRUE; bHistPID=kTRUE; break; //bHistPairME=kTRUE;
652   case kSysMCele: bHistPair=kTRUE; bHistPID=kFALSE; break; //bHistPairME=kTRUE;
653   }
654   if(hasMC) {
655     bHistPID=kFALSE;
656   }
657
658   //Setup histogram Manager
659   AliDielectronHistos *histos=new AliDielectronHistos(die->GetName(),die->GetTitle());
660   die->SetHistogramManager(histos);
661
662   //Initialise histogram classes
663   histos->SetReservedWords("Track;Pair");
664
665   //add histograms to event class
666   histos->AddClass("Event");
667   Int_t maxMixBins = (die->GetMixingHandler() ? die->GetMixingHandler()->GetNumberOfBins() : 0);
668   histos->UserHistogram("Event","","", 100, 0.0, 100.0,   AliDielectronVarManager::kCentrality);
669   if(die->GetMixingHandler() )
670     histos->UserHistogram("Event","","", maxMixBins, 0, maxMixBins, AliDielectronVarManager::kMixingBin);
671   // candidates monitoring
672   histos->UserProfile("Event","","", AliDielectronVarManager::kTracks, GetRunNumbers2011(), AliDielectronVarManager::kRunNumber);
673   histos->UserProfile("Event","","", AliDielectronVarManager::kPairs, GetRunNumbers2011(), AliDielectronVarManager::kRunNumber);
674
675
676   //event plane histograms
677   if(cutDefinition==kFlow) {
678     if(!hasMC) AddQAHistsEP(die);
679     histos->UserHistogram("Pair","","", 100,-1*TMath::Pi(),+1*TMath::Pi(), AliDielectronVarManager::kDeltaPhiv0ArpH2);
680     histos->UserHistogram("Pair","","", 100,-1*TMath::Pi(),+1*TMath::Pi(), AliDielectronVarManager::kDeltaPhiv0CrpH2);
681     histos->UserHistogram("Pair","","", 100,-1*TMath::Pi(),+1*TMath::Pi(), AliDielectronVarManager::kDeltaPhiTPCrpH2);
682   }
683
684   ////// EVENT HISTOS /////
685   if(bHistEvts) {
686     histos->UserHistogram("Event","","", GetRunNumbers2011(), AliDielectronVarManager::kRunNumber);
687     histos->UserHistogram("Event","","", 300,-15.,15.,    AliDielectronVarManager::kZvPrim);
688     //    histos->UserHistogram("Event","","", 300,0.,15000.,     AliDielectronVarManager::kRefMult);
689     histos->UserHistogram("Event","","", 300,0.,3000.,    AliDielectronVarManager::kRefMultTPConly);
690
691     //    histos->UserHistogram("Event","","", 100,0.,100.,       AliDielectronVarManager::kRefMultTPConly);
692     histos->UserHistogram("Event","","", GetRunNumbers2011(), AliDielectronHelper::MakeLinBinning(3000, 0., 3000.),
693                           AliDielectronVarManager::kRunNumber, AliDielectronVarManager::kRefMultTPConly);
694     histos->UserHistogram("Event","","", AliDielectronHelper::MakeLinBinning(90, 0., 90.), AliDielectronHelper::MakeLinBinning(3000, 0., 3000.),
695                           AliDielectronVarManager::kCentrality, AliDielectronVarManager::kRefMultTPConly);
696     histos->UserProfile(  "Event","","", AliDielectronVarManager::kRefMultTPConly,        90, 0., 90.,  AliDielectronVarManager::kCentrality);
697     histos->UserProfile(  "Event","","", AliDielectronVarManager::kNVtxContrib, 90, 0., 90.,  AliDielectronVarManager::kCentrality);
698
699     // event plane histograms
700     if(!hasMC) AddQAHistsEP(die);
701     // trigger histograms
702     if(!hasMC) {
703       histos->UserHistogram("Event","","", 29,0.,29.,     AliDielectronVarManager::kTriggerInclONL);
704       histos->UserHistogram("Event","","", 29,0.,29.,     AliDielectronVarManager::kTriggerInclOFF);
705       histos->UserHistogram("Event","","", 29,0.,29.,     AliDielectronVarManager::kTriggerExclOFF);
706       histos->UserHistogram("Event","","", 100,0.,100.,29,0.,29., 
707                             AliDielectronVarManager::kCentrality,AliDielectronVarManager::kTriggerInclONL);
708       histos->UserHistogram("Event","","", 100,0.,100.,29,0.,29., 
709                             AliDielectronVarManager::kCentrality,AliDielectronVarManager::kTriggerExclOFF);
710       histos->UserHistogram("Event","","", 300,0.,3000.,29,0.,29., 
711                             AliDielectronVarManager::kRefMultTPConly,AliDielectronVarManager::kTriggerExclOFF);
712       histos->UserHistogram("Event","","", 300,0.,3000.,29,0.,29., 
713                             AliDielectronVarManager::kRefMultTPConly,AliDielectronVarManager::kTriggerInclOFF);
714     }
715
716   } //hist: event
717
718   ///// PAIR HISTOS /////
719   if(bHistPair) {
720
721     //Pair classes
722     // to fill also mixed event histograms loop until 7 or 10
723     for (Int_t i=0; i<(bHistPairME ? 8 : 3); ++i){
724       histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(i)));
725     }
726     //add MC signal histograms to pair class
727     if(die->GetMCSignals()) {
728       for (Int_t i=0; i<die->GetMCSignals()->GetEntriesFast(); ++i) {
729         histos->AddClass(Form("Pair_%s",die->GetMCSignals()->At(i)->GetName()));
730         //      histos->AddClass(Form("Pair_%s_MCtruth",die->GetMCSignals()->At(i)->GetName()));
731       }
732     }
733
734     ///// Pair classes /////
735     histos->UserHistogram("Pair","","",  125,.0,125*0.04, AliDielectronVarManager::kM); // 40MeV bins, 12GeV/c2
736     histos->UserHistogram("Pair","","",  100,-1.,1.,      AliDielectronVarManager::kY);
737     histos->UserHistogram("Pair","","",  400,0,20.,       AliDielectronVarManager::kPt);
738     histos->UserHistogram("Pair","","",  100,0.,3.15,     AliDielectronVarManager::kOpeningAngle);
739     histos->UserHistogram("Pair","","",  100,0.,20,       AliDielectronVarManager::kChi2NDF);
740     histos->UserHistogram("Pair","","",  100,0.,3.15,     AliDielectronVarManager::kPsiPair);
741     histos->UserHistogram("Pair","","",  200,0.,100.,     AliDielectronVarManager::kR);
742     histos->UserHistogram("Pair","","",   50,0.,5.,       AliDielectronVarManager::kLegDist);
743     histos->UserHistogram("Pair","","",   50,0.,5.,       AliDielectronVarManager::kLegDistXY);
744     histos->UserHistogram("Pair","","", 210,-1.05,1.05, 100,0.,2.5, 
745                           AliDielectronVarManager::kArmAlpha,AliDielectronVarManager::kArmPt);
746     ;
747     if(!hasMC && die->GetMixingHandler() )
748       histos->UserHistogram("Pair","","", maxMixBins, 0, maxMixBins, AliDielectronVarManager::kMixingBin);
749
750     histos->UserHistogram("Pair","","",  100,.0,1., AliDielectronVarManager::kRndmPair);
751     // histos->UserHistogram("Pair","","",  GetPDGcodes(), AliDielectronVarManager::kPdgCode);
752     // histos->UserHistogram("Pair","","",  GetPDGcodes(), AliDielectronVarManager::kPdgCodeMother);
753     // histos->UserHistogram("Pair","","",  GetPDGcodes(), AliDielectronVarManager::kPdgCodeGrandMother);
754
755   } //hist: pairs
756
757
758   ///// TRACK HISTOS /////
759   if(bHistTrk) {
760     //Track classes
761     //legs from pair (fill SE)
762     for (Int_t i=1; i<2; ++i){
763       if(bHistPair) histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(i)));
764     }
765     //to fill also track info from 2nd event loop until 2
766     //    for (Int_t i=0; i<2; ++i) histos->AddClass(Form("Track_%s",AliDielectron::TrackClassName(i)));
767     histos->AddClass(Form("Track_%s",     AliDielectron::PairClassName(AliDielectron::kEv1PM)));
768
769     // PID post calibration
770     if(cutDefinition==kPIDqa) AddQAHistsPID(die);
771
772     // Vertex
773     // histos->UserHistogram("Track","","", 500,-1.,1., AliDielectronVarManager::kImpactParXY);
774     // histos->UserHistogram("Track","","", 600,-3.,3., AliDielectronVarManager::kImpactParZ);
775     // Kinematics
776     histos->UserHistogram("Track","","", 400,0,20.,  AliDielectronVarManager::kPt);
777     histos->UserHistogram("Track","","", 200,-1,1, 200,0,6.285, AliDielectronVarManager::kEta,AliDielectronVarManager::kPhi);
778     // TPC
779     // histos->UserHistogram("Track","","", 160,-0.5,159.5, AliDielectronVarManager::kNclsTPC);
780     // histos->UserHistogram("Track","","", 160,-0.5,159.5, AliDielectronVarManager::kTPCsignalN);
781     // histos->UserHistogram("Track","","", 160,-0.5,159.5, AliDielectronVarManager::kNFclsTPCr);
782     // histos->UserHistogram("Track","","", 160,-0.5,159.5, 160,-0.5,159.5, AliDielectronVarManager::kNclsTPC,AliDielectronVarManager::kNFclsTPCr);
783     // TRD
784     histos->UserHistogram("Track","","",   8,-0.5,  7.5, AliDielectronVarManager::kTRDpidQuality);
785     // PID
786     histos->UserHistogram("Track","","", 400,0.2,20.,200,0.,200., AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCsignal,kTRUE);
787     histos->UserHistogram("Track","","", 400,0.2,20.,200,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
788     histos->UserHistogram("Track","","", 250,0.0,5.0,300,0.,1.2,  AliDielectronVarManager::kPIn,AliDielectronVarManager::kTOFbeta,kTRUE);
789     histos->UserHistogram("Track","","", 100,-1.,+1.,200,-10.,10.,AliDielectronVarManager::kEta,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
790
791     histos->UserHistogram("Track","","", 100,0.2,10.,100,0.,200.,
792                           AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCsignal,kTRUE);
793     histos->UserHistogram("Track","","", 100,0.2,10.,100,-5.,+5.,
794                           AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
795     histos->UserHistogram("Track","","", 100,0.,4000.,100,0.,200.,
796                           AliDielectronVarManager::kRefMultTPConly,AliDielectronVarManager::kTPCsignal);
797     histos->UserHistogram("Track","","", 100,0.,4000.,100,-5.,+5.,
798                           AliDielectronVarManager::kRefMultTPConly,AliDielectronVarManager::kTPCnSigmaEle);
799     histos->UserHistogram("Track","","", 100,0.,100.,100,0.,200.,
800                           AliDielectronVarManager::kCentrality,AliDielectronVarManager::kTPCsignal);
801     histos->UserHistogram("Track","","", 100,0.,100.,100,-5.,+5.,
802                           AliDielectronVarManager::kCentrality,AliDielectronVarManager::kTPCnSigmaEle);
803     histos->UserHistogram("Track","","", 100,-1.,+1.,100,0.,200.,
804                           AliDielectronVarManager::kEta,AliDielectronVarManager::kTPCsignal);
805     histos->UserHistogram("Track","","", 100,-1.,+1.,100,-5.,+5.,
806                           AliDielectronVarManager::kEta,AliDielectronVarManager::kTPCnSigmaEle);
807     histos->UserHistogram("Track","","", 100,-1.,+1.,100,-5.,+5.,
808                           AliDielectronVarManager::kEta,AliDielectronVarManager::kTPCnSigmaEleRaw);
809   } //hist: tracks
810
811
812   if(!hasMC && cutDefinition==kAvgPt) {
813     // add single electron efficiency histograms
814     AddHistsEleEff(die);
815   }
816
817   ////// MONTE CARLO //////
818   if(cutDefinition==kLegEff) {
819
820     //add MC signal histograms to track class
821     if(die->GetMCSignals()) {
822
823       TString className="";
824       for (Int_t i=0; i<die->GetMCSignals()->GetEntriesFast(); ++i) {
825         TString sigMCname = die->GetMCSignals()->At(i)->GetName();
826
827         // mc truth
828         //      histos->AddClass(Form("Pair_%s_MCtruth",      sigMCname.Data()));
829         // histos->AddClass(Form("Track_Legs_%s_MCtruth",sigMCname.Data()));
830         // mc reconstructed
831         // histos->AddClass(Form("Pair_%s",              sigMCname.Data()));
832         // histos->AddClass(Form("Track_Legs_%s",        sigMCname.Data()));
833         // tracks
834         histos->AddClass(Form("Track_%s_%s",AliDielectron::PairClassName(AliDielectron::kEv1PM),sigMCname.Data()));
835         histos->AddClass(Form("Track_%s_%s_MCtruth",AliDielectron::PairClassName(AliDielectron::kEv1PM),sigMCname.Data()));
836       } //end: loop signals
837     } //end: has signals
838
839     // add single electron histograms
840     AddHistsEleEff(die);
841     // pdg codes
842     //    histos->UserHistogram("Track","","",  GetPDGcodes(), AliDielectronVarManager::kPdgCode);
843     //    histos->UserHistogram("Track","","",  GetPDGcodes(), AliDielectronVarManager::kPdgCodeMother);
844     //    histos->UserHistogram("Track","","",  GetPDGcodes(), AliDielectronVarManager::kPdgCodeGrandMother);
845     //    histos->UserHistogram("Track","","",  GetPDGcodes(), GetPDGcodes(),
846     //                    AliDielectronVarManager::kPdgCodeMother, AliDielectronVarManager::kPdgCodeGrandMother);
847   }
848
849
850
851   die->SetHistogramManager(histos);
852
853
854   ////// LOG //////
855   TIter nextClass(histos->GetHistogramList());
856   THashList *l=0;
857   while ( (l=static_cast<THashList*>(nextClass())) ) {
858     //printf(" [D] HistogramManger: Class %s: Histograms: %04d \n", l->GetName(), l->GetEntries());
859   }
860
861 } //end: init histograms
862
863 void AddQAHistsPID(AliDielectron *die) {
864   //
865   // add histograms for PID validation, comparison, post calibration aso.
866   //
867
868   Bool_t hasMC=die->GetHasMC();
869   AliDielectronHistos *histos = die->GetHistoManager();
870
871   // add MC signal tracks
872   if(hasMC && die->GetMCSignals()) {
873     TString sigMCname = die->GetMCSignals()->Last()->GetName();
874     histos->AddClass(Form("Track_%s_%s",AliDielectron::PairClassName(AliDielectron::kEv1PM),sigMCname.Data()));
875   }
876
877
878   // for TPC post calibration
879
880   // arbitrary binning for variables
881   TVectorD *vcen = AliDielectronHelper::MakeLinBinning( 11,  0.,    55.);
882   (*vcen)[21] = 90.;
883
884   // array of bin limits
885   TObjArray *limits  = new TObjArray();
886   limits->Add(AliDielectronHelper::MakeLinBinning( 75,-10.,     5.));
887   limits->Add(AliDielectronHelper::MakeLinBinning( 75,-10.,     5.));
888   //  limits->Add(AliDielectronHelper::MakeLinBinning(100,  0.,   200.));
889   //  limits->Add(AliDielectronHelper::MakeLinBinning(60,   0.,    1.2));
890   limits->Add(AliDielectronHelper::MakeLinBinning( 50,  0.,  4000.));
891   limits->Add(AliDielectronHelper::MakeLinBinning( 50,  0.,    10.));
892   //  limits->Add(vcen);
893   //    limits->Add(AliDielectronHelper::MakeLinBinning( 36,  0.,    90.));
894   limits->Add(AliDielectronHelper::MakeLinBinning( 20, -1.,     1.));
895   limits->Add(GetRunNumbers2011());
896   UInt_t var[]={AliDielectronVarManager::kTPCnSigmaEleRaw,  // NOTE: raw nsigma w/o corr
897                 AliDielectronVarManager::kTPCnSigmaEle,
898                 //              AliDielectronVarManager::kTOFbeta,
899                 // AliDielectronVarManager::kTPCsignal,
900                 AliDielectronVarManager::kRefMultTPConly,
901                 AliDielectronVarManager::kPIn,
902                 // AliDielectronVarManager::kCentrality,
903                 AliDielectronVarManager::kEta,
904                 AliDielectronVarManager::kRunNumber
905   };
906   // add merged track histogram
907   histos->UserSparse("Track", limits->GetEntriesFast(), limits, var);
908
909   // run dependence of nisgma electron
910   histos->UserHistogram("Track","","", GetRunNumbers2011(),AliDielectronHelper::MakeLinBinning(100,-5.,+5.),
911                         AliDielectronVarManager::kRunNumber,AliDielectronVarManager::kTPCnSigmaEleRaw);
912   histos->UserHistogram("Track","","", GetRunNumbers2011(),AliDielectronHelper::MakeLinBinning(100,-5.,+5.),
913                         AliDielectronVarManager::kRunNumber,AliDielectronVarManager::kTPCnSigmaEle);
914
915   // post calibration check
916   histos->UserHistogram("Track","","", 100,0.2,10.,100,-5.,+5.,
917                         AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEleRaw,kTRUE);
918   histos->UserHistogram("Track","","", 100,0.2,10.,100,-5.,+5.,
919                         AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
920
921   // TPC number of points used for nsigma calculation
922   histos->UserHistogram("Track","","", 160,-0.5,159.5, AliDielectronVarManager::kTPCsignalN);
923 }
924
925 void AddQAHistsEP(AliDielectron *die) {
926   //
927   // add histograms for event plane flattening aso.
928   //
929
930   Bool_t hasMC=die->GetHasMC();
931   AliDielectronHistos *histos = die->GetHistoManager();
932
933   // event plane resolutions
934   TObjArray *limits  = new TObjArray();
935   limits->Add(AliDielectronHelper::MakeLinBinning( 18,  0.,    90.));
936   //    limits->Add(GetRunNumbers2011());
937   limits->Add(AliDielectronHelper::MakeLinBinning(100,  -1.,    1.));
938   limits->Add(AliDielectronHelper::MakeLinBinning(100,  -1.,    1.));
939   limits->Add(AliDielectronHelper::MakeLinBinning(100,  -1.,    1.));
940
941   UInt_t var[]={AliDielectronVarManager::kCentrality,
942                 //                 AliDielectronVarManager::kRunNumber,
943                 AliDielectronVarManager::kv0ATPCDiffH2,
944                 AliDielectronVarManager::kv0CTPCDiffH2,
945                 AliDielectronVarManager::kv0Av0CDiffH2 };
946   //  histos->UserSparse("Event", 4, limits, var);
947
948   // event plane angles
949   TObjArray *limits2  = new TObjArray();
950   limits2->Add(AliDielectronHelper::MakeLinBinning( 18,   0.,    90.));
951   //  limits2->Add(GetRunNumbers2011());
952   limits2->Add(AliDielectronHelper::MakeLinBinning(100,  -1.6,   1.6));
953   limits2->Add(AliDielectronHelper::MakeLinBinning(100,  -1.6,   1.6));
954   limits2->Add(AliDielectronHelper::MakeLinBinning(100,  -1.6.,  1.6));
955
956   UInt_t var2[]={AliDielectronVarManager::kCentrality,
957                  //              AliDielectronVarManager::kRunNumber,
958                  AliDielectronVarManager::kv0ArpH2,
959                  AliDielectronVarManager::kv0CrpH2,
960                  AliDielectronVarManager::kTPCrpH2 };
961   histos->UserSparse("Event", limits2->GetEntriesFast(), limits2, var2);
962
963   // VZERO event plane angles (sub rings)
964   histos->UserHistogram("Event","","", 100,-2.,2., AliDielectronVarManager::kv0A0rpH2);
965   histos->UserHistogram("Event","","", 100,-2.,2., AliDielectronVarManager::kv0C0rpH2);
966   histos->UserHistogram("Event","","", 100,-2.,2., AliDielectronVarManager::kv0A3rpH2);
967   histos->UserHistogram("Event","","", 100,-2.,2., AliDielectronVarManager::kv0C3rpH2);
968   histos->UserHistogram("Event","","", 100,-2.,2., AliDielectronVarManager::kv0ACrpH2); // combined A+C
969
970   // run dependence of the angles
971   histos->UserHistogram("Event","","", GetRunNumbers2011(), AliDielectronHelper::MakeLinBinning(100,-1.6,1.6),
972                         AliDielectronVarManager::kRunNumber, AliDielectronVarManager::kv0ArpH2);
973   histos->UserHistogram("Event","","", GetRunNumbers2011(), AliDielectronHelper::MakeLinBinning(100,-1.6,1.6),
974                         AliDielectronVarManager::kRunNumber, AliDielectronVarManager::kv0CrpH2);
975   histos->UserHistogram("Event","","", GetRunNumbers2011(), AliDielectronHelper::MakeLinBinning(100,-1.6,1.6),
976                         AliDielectronVarManager::kRunNumber, AliDielectronVarManager::kTPCrpH2);
977
978
979   // TPC q vector components
980   histos->UserHistogram("Event","","", 100,-1500.,1500., AliDielectronVarManager::kTPCxH2);
981   histos->UserHistogram("Event","","", 100,-1500.,1500., AliDielectronVarManager::kTPCyH2);
982   // histos->UserHistogram("Event","","", 100,   -2.,   2., AliDielectronVarManager::kTPCsub1rpH2);
983   // histos->UserHistogram("Event","","", 100,   -2.,   2., AliDielectronVarManager::kTPCsub2rpH2);
984   // histos->UserHistogram("Event","","", 100,   -1.,   1., AliDielectronVarManager::kTPCsub12DiffH2);
985
986   // further event plane resolutions (used in 3 sub event method)
987   histos->UserProfile("Event","","", AliDielectronVarManager::kv0ATPCDiffH2,   18, 0.,90., AliDielectronVarManager::kCentrality);
988   histos->UserProfile("Event","","", AliDielectronVarManager::kv0CTPCDiffH2,   18, 0.,90., AliDielectronVarManager::kCentrality);
989   histos->UserProfile("Event","","", AliDielectronVarManager::kv0Av0CDiffH2,   18, 0.,90., AliDielectronVarManager::kCentrality);
990   histos->UserProfile("Event","","", AliDielectronVarManager::kTPCsub12DiffH2, 18, 0.,90., AliDielectronVarManager::kCentrality);
991   histos->UserProfile("Event","","", AliDielectronVarManager::kv0Av0C0DiffH2,  18, 0.,90., AliDielectronVarManager::kCentrality);
992   histos->UserProfile("Event","","", AliDielectronVarManager::kv0Av0C3DiffH2,  18, 0.,90., AliDielectronVarManager::kCentrality);
993   histos->UserProfile("Event","","", AliDielectronVarManager::kv0Cv0A0DiffH2,  18, 0.,90., AliDielectronVarManager::kCentrality);
994   histos->UserProfile("Event","","", AliDielectronVarManager::kv0Cv0A3DiffH2,  18, 0.,90., AliDielectronVarManager::kCentrality);
995   histos->UserProfile("Event","","", AliDielectronVarManager::kv0A0v0A3DiffH2, 18, 0.,90., AliDielectronVarManager::kCentrality);
996   histos->UserProfile("Event","","", AliDielectronVarManager::kv0C0v0C3DiffH2, 18, 0.,90., AliDielectronVarManager::kCentrality);
997
998   // EP angle correlation (range of phi angle)
999   // histos->UserHistogram("Event","","", 320,-3.2.,3.2, 320,-3.2.,3.2,
1000   //                    AliDielectronVarManager::kTPCrpH2,AliDielectronVarManager::kv0ACrpH2);
1001
1002   // EP Qvector magnitudes
1003   histos->UserHistogram("Event","","", 200,0.,200., AliDielectronVarManager::kTPCmagH2);
1004   histos->UserHistogram("Event","","", 200,0.,800., AliDielectronVarManager::kv0ACmagH2);
1005   histos->UserHistogram("Event","","", 200,0.,800., AliDielectronVarManager::kv0AmagH2);
1006   histos->UserHistogram("Event","","", 200,0.,800., AliDielectronVarManager::kv0CmagH2);
1007
1008   // detector effects checks
1009   histos->UserHistogram("Event","","", 10,0.,100., 300,-1.0,1.0,
1010                         AliDielectronVarManager::kCentrality, AliDielectronVarManager::kTPCsub12DiffH2Sin);
1011
1012   // TPC recentering
1013   // histos->UserProfile("Event","","", AliDielectronVarManager::kTPCxH2,
1014   //                  AliDielectronHelper::MakeLinBinning(9, 0.,90.), GetRunNumbers2011(),
1015   //                  AliDielectronVarManager::kCentrality, AliDielectronVarManager::kRunNumber);
1016   // histos->UserProfile("Event","","", AliDielectronVarManager::kTPCyH2,
1017   //                  AliDielectronHelper::MakeLinBinning(9, 0.,90.), GetRunNumbers2011(),
1018   //                  AliDielectronVarManager::kCentrality, AliDielectronVarManager::kRunNumber);
1019
1020 }
1021
1022 void AddHistsEleEff(AliDielectron *die) {
1023   //
1024   // adding histograms for single electron efficiencies
1025   //
1026
1027   Bool_t hasMC=die->GetHasMC();
1028   AliDielectronHistos *histos = die->GetHistoManager();
1029
1030   // applied efficiencies in collision data
1031   if(!hasMC) {
1032     histos->UserHistogram("Track","","", 101,-0.01,1.0, AliDielectronVarManager::kLegEff);
1033     histos->UserProfile("Track","","", AliDielectronVarManager::kLegEff, 18,0.0,90.0,  AliDielectronVarManager::kCentrality);
1034     histos->UserProfile("Track","","", AliDielectronVarManager::kLegEff, 100,0.0,20.0, AliDielectronVarManager::kPt);
1035     histos->UserProfile("Track","","", AliDielectronVarManager::kLegEff, 20,0.0,TMath::TwoPi(), AliDielectronVarManager::kPhi);
1036     histos->UserProfile("Track","","", AliDielectronVarManager::kLegEff, 20,-1.,+1.,   AliDielectronVarManager::kEta);
1037
1038     histos->UserHistogram("Pair","","", 101,-0.01,1.0, AliDielectronVarManager::kPairEff);
1039     histos->UserProfile("Pair","","", AliDielectronVarManager::kPairEff, 125,.0,125*0.04, AliDielectronVarManager::kM);
1040     histos->UserProfile("Pair","","", AliDielectronVarManager::kPairEff, 100,.0,10.0,     AliDielectronVarManager::kPt);
1041     histos->UserProfile("Pair","","", AliDielectronVarManager::kPairEff, 18,0.0,90.0,     AliDielectronVarManager::kCentrality);
1042
1043     histos->UserHistogram("Pair","","", 125,.0,125*0.04, 101,-0.01,1.0, 
1044                           AliDielectronVarManager::kM, AliDielectronVarManager::kPairEff);
1045
1046     histos->UserProfile("Pair","","", AliDielectronVarManager::kPt,125,.0,125*0.04, AliDielectronVarManager::kM);
1047     //weighted
1048     histos->UserHistogram("Pair","","", AliDielectronHelper::MakeLinBinning(125,.0,125*0.04),
1049                           AliDielectronVarManager::kM, AliDielectronVarManager::kOneOverPairEff);
1050     histos->UserProfile("Pair", "","", AliDielectronVarManager::kPt,AliDielectronHelper::MakeLinBinning(125,.0,125*0.04),
1051                         AliDielectronVarManager::kM, "", AliDielectronVarManager::kOneOverPairEff);
1052   }
1053
1054   // single electron efficiecy
1055
1056   // arbitrary binning for variables
1057   // TVectorD *vpt = AliDielectronHelper::MakeLinBinning( 41,  0.0,    10.25);
1058   // (*vpt)[41] = 20.;
1059   TVectorD *vpt1 = AliDielectronHelper::MakeLinBinning( (int)(( 3. - 0.)/0.10),    0.,     3.); //steps of 100MeV
1060   TVectorD *vpt2 = AliDielectronHelper::MakeLinBinning( (int)(( 10.- 3.25)/0.25),  3.25,  10.); //steps of 250MeV
1061   TVectorD *vpt3 = AliDielectronHelper::MakeLinBinning( (int)((100.-20.)/10.0),   20.,   100.); //steps of 10GeV
1062   TVectorD *vpt  = new TVectorD(vpt1->GetNrows()+vpt2->GetNrows()+vpt3->GetNrows());
1063   for(Int_t i=0; i<vpt1->GetNrows(); i++) (*vpt)[i]                                   = (*vpt1)[i];
1064   for(Int_t i=0; i<vpt2->GetNrows(); i++) (*vpt)[vpt1->GetNrows()+i]                  = (*vpt2)[i];
1065   for(Int_t i=0; i<vpt3->GetNrows(); i++) (*vpt)[vpt1->GetNrows()+vpt2->GetNrows()+i] = (*vpt3)[i];
1066   //vpt->Print();
1067
1068   // array of bin limits
1069   TObjArray *limEpm  = new TObjArray();
1070   //    limEpm->Add(AliDielectronHelper::MakeLinBinning( 75,-10.,     5.));
1071   limEpm->Add(AliDielectronHelper::MakeLinBinning( 18,  0.,    90.));
1072   limEpm->Add(vpt);
1073   //  limEpm->Add(AliDielectronHelper::MakeLinBinning( 20,  0.,   TMath::TwoPi()));
1074   limEpm->Add(AliDielectronHelper::MakeLinBinning( 20, -1.,    +1.));
1075   limEpm->Add(AliDielectronHelper::MakeLinBinning(  1, -1.,    +1.));
1076   limEpm->Add(AliDielectronHelper::MakeLinBinning(  1, -1.,    +1.));
1077   limEpm->Add(GetRunNumbers2011());
1078   limEpm->Add(GetPDGcodes());
1079   //  limEpm->Add(GetPDGcodes());
1080   UInt_t varEpm[]={//AliDielectronVarManager::kTPCnSigmaEle,
1081     AliDielectronVarManager::kCentrality
1082     ,AliDielectronVarManager::kPt
1083     //    ,AliDielectronVarManager::kPhi
1084     ,AliDielectronVarManager::kEta
1085     ,AliDielectronVarManager::kImpactParXY
1086     ,AliDielectronVarManager::kImpactParZ
1087     ,AliDielectronVarManager::kRunNumber
1088     ,AliDielectronVarManager::kPdgCodeMother
1089     //    ,AliDielectronVarManager::kPdgCodeGrandMother
1090   };
1091   // adding histogram
1092   if(hasMC) histos->UserSparse("Track", limEpm->GetEntriesFast(), limEpm, varEpm);
1093
1094   histos->UserHistogram("Track","","", 500,-1.,1., AliDielectronVarManager::kImpactParXY);
1095   histos->UserHistogram("Track","","", 600,-3.,3., AliDielectronVarManager::kImpactParZ);
1096
1097   // polarisation //
1098   // array of bin limits
1099   TVectorD *vpt = AliDielectronHelper::MakeLinBinning( 21,  0.0,    10.5);
1100   (*vpt)[21] = 100.;
1101   TObjArray *limPair  = new TObjArray();
1102   limPair->Add(AliDielectronHelper::MakeLinBinning( 18,  0.,    90.));
1103   limPair->Add(AliDielectronHelper::MakeLinBinning( 20, -1.,    +1.));
1104   limPair->Add(vpt);
1105   //  limPair->Add(GetPDGcodes());
1106   UInt_t varPair[]={
1107     AliDielectronVarManager::kCentrality
1108     ,AliDielectronVarManager::kThetaCS
1109     ,AliDielectronVarManager::kPt
1110     //    ,AliDielectronVarManager::kPdgCodeMother
1111   };
1112   //  if(hasMC) histos->UserSparse("Pair", limPair->GetEntriesFast(), limPair, varPair); // TAKES 4ever
1113
1114 }
1115
1116 void InitHF(AliDielectron* die, Int_t cutDefinition)
1117 {
1118   //
1119   // Setup the HF arrays
1120   //
1121   // do not fill
1122   switch(cutDefinition) {
1123   case kEvent:
1124   case kPIDqa:
1125   case kLegEff:
1126   case kNoPID:
1127   case kRec:
1128     return;
1129   }
1130
1131   // has mc
1132   Bool_t hasMC=die->GetHasMC();
1133   // booleans for histo selection
1134   Bool_t bHistEff = kFALSE; //ATTENTION
1135   // mixing
1136   AliDielectronMixingHandler *mixH=die->GetMixingHandler();
1137   Int_t maxMixBins = (mixH ? mixH->GetNumberOfBins() : 0);
1138
1139   // container
1140   AliDielectronHF *hf=new AliDielectronHF(die->GetName(),die->GetTitle());
1141   // define pair types and sources
1142   if(hasMC) hf->SetStepForMCGenerated();
1143   hf->SetPairTypes(AliDielectronHF::kOSandMIX);
1144   //  hf->SetPairTypes(AliDielectronHF::kMConly); // only mc truth
1145   //  hf->SetPairTypes(AliDielectronHF::kAll);    // all pair types
1146
1147   //// define the grid size and granularity /////
1148   hf->AddCutVariable(AliDielectronVarManager::kCentrality,               9, 0., 90.);
1149   TVectorD *vpt = AliDielectronHelper::MakeLinBinning( 21,  0.0,    10.5);
1150   (*vpt)[21] = 100.;
1151   hf->AddCutVariable(AliDielectronVarManager::kPt, vpt);
1152   hf->AddCutVariable(AliDielectronVarManager::kY,  1, -0.8,  0.8);
1153
1154   // defaults
1155   hf->UserHistogram("Pair", AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1156   // for mixed event weighting
1157   // if(mixH) hf->UserHistogram("Pair", AliDielectronHelper::MakeLinBinning(maxMixBins,0,maxMixBins), AliDielectronVarManager::kMixingBin);
1158
1159   // mean pt analysis
1160   if(cutDefinition==kAvgPt) {
1161     hf->AddCutVariable(AliDielectronVarManager::kPairEff,  AliDielectronHelper::MakeArbitraryBinning(".0,.01,.02,.03,.05,.1,1."));
1162     hf->UserProfile("Pair", AliDielectronVarManager::kPt,
1163                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1164     hf->UserProfile("Pair", AliDielectronVarManager::kPtSq,
1165                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1166   }
1167
1168   // flow analysis
1169   if(cutDefinition==kFlow && !hasMC) {
1170     // flow versus minv
1171     hf->UserProfile("Pair", AliDielectronVarManager::kv0ArpH2FlowV2,
1172                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1173     hf->UserProfile("Pair", AliDielectronVarManager::kv0CrpH2FlowV2,
1174                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1175     hf->UserProfile("Pair", AliDielectronVarManager::kTPCrpH2FlowV2,
1176                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1177     // detector effects
1178     hf->UserProfile("Pair", AliDielectronVarManager::kCosTPCrpH2,
1179                     AliDielectronHelper::MakeLinBinning(1,.0,125*0.04), AliDielectronVarManager::kM);
1180     hf->UserProfile("Pair", AliDielectronVarManager::kSinTPCrpH2,
1181                     AliDielectronHelper::MakeLinBinning(1,.0,125*0.04), AliDielectronVarManager::kM);
1182     hf->UserProfile("Pair", AliDielectronVarManager::kCosPhiH2,
1183                     AliDielectronHelper::MakeLinBinning(1,.0,125*0.04), AliDielectronVarManager::kM);
1184     hf->UserProfile("Pair", AliDielectronVarManager::kSinPhiH2,
1185                     AliDielectronHelper::MakeLinBinning(1,.0,125*0.04), AliDielectronVarManager::kM);
1186     hf->UserProfile("Pair", AliDielectronVarManager::kTPCrpH2FlowV2Sin,
1187                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1188
1189     // variables
1190     hf->AddCutVariable(AliDielectronVarManager::kDeltaPhiv0ArpH2, GetDeltaPhiBins());
1191     hf->AddCutVariable(AliDielectronVarManager::kDeltaPhiv0CrpH2, GetDeltaPhiBins());
1192     hf->AddCutVariable(AliDielectronVarManager::kDeltaPhiTPCrpH2, GetDeltaPhiBins());
1193   }
1194
1195   // on the fly efficienies
1196   if(cutDefinition==kAvgPt && (!hasMC || 0)) {
1197     hf->UserProfile("Pair", AliDielectronVarManager::kPairEff, 
1198                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM);
1199     hf->UserHistogram("Pair", AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM,
1200                       AliDielectronVarManager::kOneOverPairEff);
1201     //weighted
1202     hf->UserProfile("Pair", AliDielectronVarManager::kPt,
1203                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM, 
1204                     "", AliDielectronVarManager::kOneOverPairEff);
1205     hf->UserProfile("Pair", AliDielectronVarManager::kPtSq,
1206                     AliDielectronHelper::MakeLinBinning(125,.0,125*0.04), AliDielectronVarManager::kM, 
1207                     "", AliDielectronVarManager::kOneOverPairEff);
1208   }
1209
1210
1211   /*
1212 //// define the grid size and granularity /////
1213 // event variables //
1214 //  hf->AddCutVariable(AliDielectronVarManager::kCentrality, AliDielectronHelper::MakeArbitraryBinning("0,10,50,90")); // flow only
1215 if(hasMC) hf->AddCutVariable(AliDielectronVarManager::kCentrality,               18, 0., 90.);
1216 else      hf->AddCutVariable(AliDielectronVarManager::kCentrality,               9, 0., 90.);
1217 //  if(hasMC)  hf->AddCutVariable(AliDielectronVarManager::kRunNumber, GetRunNumbers2011() );
1218 //  if(hasMC)  hf->AddCutVariable(AliDielectronVarManager::kNacc,        3000,0.,3000.);
1219 //  if(hasMC)  hf->AddCutVariable(AliDielectronVarManager::kNVtxContrib,   20,0.,4000.);
1220
1221   // pair variables //ATTENTION
1222   if(hasMC && 0) hf->AddCutVariable(AliDielectronVarManager::kY,  18, -0.9,  0.9);
1223   //  hf->AddCutVariable(AliDielectronVarManager::kPt, 10,  0.0, 10.0);
1224   if(!hasMC)
1225      hf->AddCutVariable(AliDielectronVarManager::kPt, AliDielectronHelper::MakeArbitraryBinning("0,1,2,3,4,5,6,7,8,9,10,100"));
1226   //  hf->AddCutVariable(AliDielectronVarManager::kPt, 20,  0.0, 10.0);
1227   else
1228     hf->AddCutVariable(AliDielectronVarManager::kPt, 50,  0.0, 10.0);
1229
1230   //    if(hasMC) hf->AddCutVariable(AliDielectronVarManager::kTRDpidEffPair,101,0.0,1.01);
1231   //    if(hasMC) hf->AddCutVariable(AliDielectronVarManager::kThetaCS,15,-1.,1.);
1232
1233   // flow variables //
1234   //  if(!hasMC) hf->AddCutVariable(AliDielectronVarManager::kDeltaPhiv0ArpH2, GetDeltaPhiBins());
1235   //  if(!hasMC) hf->AddCutVariable(AliDielectronVarManager::kDeltaPhiv0CrpH2, GetDeltaPhiBins());
1236   if(!hasMC && bHistFlow) hf->AddCutVariable(AliDielectronVarManager::kDeltaPhiTPCrpH2, GetDeltaPhiBins());
1237
1238   // leg variables // NOTE: switched off in HF??
1239   //  if(hasMC) hf->AddCutVariable(AliDielectronVarManager::kPt, "0.85, 0.95, 1.1, 100.0", kTRUE, AliDielectronHF::kBinToMax);
1240   // if(hasMC) hf->AddCutVariable(AliDielectronVarManager::kEta,"-0.9,-0.8,0.8,0.9",      kTRUE, AliDielectronHF::kSymBin);
1241   //  hf->AddCutVariable(AliDielectronVarManager::kY,           1, -0.9, 0.9                     );
1242   //  hf->AddCutVariable(AliDielectronVarManager::kPt,          "0.8, 1.0, 1.1, 1.2, 1.5, 100.0", kTRUE, AliDielectronHF::kBinToMax);
1243   //  hf->AddCutVariable(AliDielectronVarManager::kNclsTPC,     "70,90,100,120,160",              kTRUE, AliDielectronHF::kBinToMax);
1244   //  hf->AddCutVariable(AliDielectronVarManager::kTPCnSigmaEle,"-4,-3,-2.5,-2,2,2.5,3,4",        kTRUE, AliDielectronHF::kSymBin);
1245   //hf->AddCutVariable(AliDielectronVarManager::kTPCnSigmaPio,"3.,3.5,4.,100.",                 kTRUE, AliDielectronHF::kBinToMax);
1246   //hf->AddCutVariable(AliDielectronVarManager::kITSLayerFirstCls,4,0.,4.,              kFALSE, kTRUE, AliDielectronHF::kBinFromMin);
1247   //hf->AddCutVariable(AliDielectronVarManager::kNclsITS,         5,2.,7.,              kFALSE, kTRUE, AliDielectronHF::kBinToMax);
1248   //hf->AddCutVariable(AliDielectronVarManager::kRunNumber,  GetRunNumbers2011());
1249
1250   die->SetHistogramArray(hf);
1251 }
1252
1253 void InitCF(AliDielectron* die, Int_t cutDefinition)
1254 {
1255   //
1256   // Setup the CF Manager if needed
1257   //
1258   // do not fill
1259   switch(cutDefinition) {
1260   case kEvent:
1261   case kPIDqa:
1262   case kLegEff:
1263   case kNoPID:
1264     return;
1265   }
1266
1267   // has mc
1268   Bool_t hasMC=die->GetHasMC();
1269
1270   // mixing
1271   AliDielectronMixingHandler *mixH=die->GetMixingHandler();
1272   Int_t maxMixBins = (mixH ? mixH->GetNumberOfBins() : 0);
1273
1274   // container
1275   AliDielectronCF *cf=new AliDielectronCF(die->GetName(),die->GetTitle());
1276
1277   //event variables
1278   //cf->AddVariable(AliDielectronVarManager::kCentrality,"0.,5.0,10.0,15.0,20.0,25.0,30.0,35.0,40.0,50.0");
1279   cf->AddVariable(AliDielectronVarManager::kCentrality,"0.,5.0,10.0,15.0,20.0,25.0,30.0,35.0,40.0,50.0,60.0,70.0,80.,90.");
1280   //  cf->AddVariable(AliDielectronVarManager::kRunNumber, GetRunNumbers2011() );
1281   if(mixH)  cf->AddVariable(AliDielectronVarManager::kMixingBin, AliDielectronHelper::MakeLinBinning(maxMixBins,0,maxMixBins));
1282
1283   //pair variables
1284   TVectorD *vpt = AliDielectronHelper::MakeLinBinning( 21,  0.0,    10.5);
1285   (*vpt)[21] = 100.;
1286   cf->AddVariable(AliDielectronVarManager::kPt, vpt);
1287   // TVectorD *vpt = AliDielectronHelper::MakeLinBinning( 41,  0.0,    10.25);
1288   // (*vpt)[41] = 100.;
1289   //  cf->AddVariable(AliDielectronVarManager::kPt,vpt);
1290   //  cf->AddVariable(AliDielectronVarManager::kPt,80,0.0,100*0.25);
1291
1292   //  cf->AddVariable(AliDielectronVarManager::kY,"-5,-1,-0.9,-0.8,-0.5,0.5,0.8,0.9,1.0,5");
1293   cf->AddVariable(AliDielectronVarManager::kY,"-0.9,-0.8,-0.7,+0.7,+0.8,+0.9");
1294   //  cf->AddVariable(AliDielectronVarManager::kY,18,-0.9,+0.9);
1295   cf->AddVariable(AliDielectronVarManager::kM,125,0.,125*.04); //40Mev Steps
1296   //  cf->AddVariable(AliDielectronVarManager::kPairType,1,1,1);
1297   cf->AddVariable(AliDielectronVarManager::kPairType,11,0,11);
1298   //  cf->AddVariable(AliDielectronVarManager::kThetaCS,20,-1.,+1.);
1299   //  cf->AddVariable(AliDielectronVarManager::kThetaHE,20,-1.,+1.);
1300   //  cf->AddVariable(AliDielectronVarManager::kPhiCS,20,-3.2,+3.2);
1301   //  cf->AddVariable(AliDielectronVarManager::kPhiHE,20,-3.2,+3.2);
1302   cf->AddVariable(AliDielectronVarManager::kDeltaPhiTPCrpH2,GetDeltaPhiBins());
1303   //leg variables
1304   if(cutDefinition!=kSysMCele && 0) { //ATTENTION
1305     cf->AddVariable(AliDielectronVarManager::kPt,"0.85, 1.1, 100.0",kTRUE);
1306     //  cf->AddVariable(AliDielectronVarManager::kNclsTPC,"0, 70, 80, 90, 100, 120, 160",kTRUE);
1307     cf->AddVariable(AliDielectronVarManager::kEta,"-0.9,-0.85,-0.8,-0.75,-0.70,0.70,0.75,0.8,0.85,0.9",kTRUE);
1308     cf->AddVariable(AliDielectronVarManager::kITSLayerFirstCls,3,-1.5,1.5,kTRUE);
1309     cf->AddVariable(AliDielectronVarManager::kTPCnSigmaPro,"3.5,4.0,4.5,100",kTRUE);
1310     cf->AddVariable(AliDielectronVarManager::kTPCnSigmaEle,"-1.5,-1.0,-0.6,3.0",kTRUE);
1311   }
1312   else if(0){
1313     cf->AddVariable(AliDielectronVarManager::kTPCnSigmaEle,"-3.0,-1.5,-1.0,-0.6,3.0",kTRUE);
1314   }
1315   /*
1316   // event variables
1317   cf->AddVariable(AliDielectronVarManager::kCentrality,               18,0.,  90.);
1318   if(hasMC)  cf->AddVariable(AliDielectronVarManager::kRunNumber, GetRunNumbers2011() );
1319   //  if(hasMC)  cf->AddVariable(AliDielectronVarManager::kNacc,        3000,0.,3000.);
1320   //  if(hasMC)  cf->AddVariable(AliDielectronVarManager::kNVtxContrib,   20,0.,4000.);
1321
1322   // pair variables
1323   if(hasMC)  cf->AddVariable(AliDielectronVarManager::kPairType,1,1,1);
1324   else       cf->AddVariable(AliDielectronVarManager::kPairType,11,0,11);
1325   cf->AddVariable(AliDielectronVarManager::kM, 125,  0.0,  5.0); //40Mev Steps
1326   if(hasMC)  cf->AddVariable(AliDielectronVarManager::kY,  18, -0.9,  0.9);
1327   if(hasMC)  cf->AddVariable(AliDielectronVarManager::kPt, 100,  0.0, 20.0);
1328   else       cf->AddVariable(AliDielectronVarManager::kPt, AliDielectronHelper::MakeArbitraryBinning("0,1,2,3,4,5,6,7,8,9,10,20"));
1329   //    if(hasMC) cf->AddVariable(AliDielectronVarManager::kTRDpidEffPair,101,0.0,1.01);
1330   //    if(hasMC) cf->AddVariable(AliDielectronVarManager::kThetaCS,15,-1.,1.);
1331
1332   // flow variables
1333   //if(!hasMC) cf->AddVariable(AliDielectronVarManager::kDeltaPhiv0ArpH2, GetDeltaPhiBins());
1334   //if(!hasMC) cf->AddVariable(AliDielectronVarManager::kDeltaPhiv0CrpH2, GetDeltaPhiBins());
1335
1336   // leg variables
1337   if(hasMC) cf->AddVariable(AliDielectronVarManager::kPt,"0.0, 0.85, 0.95, 1.0, 1.1, 100.0",kTRUE);
1338   if(hasMC) cf->AddVariable(AliDielectronVarManager::kEta,"-0.9,-0.8,-0.7, 0.7, 0.8, 0.9",  kTRUE);
1339   //    cf->AddVariable(AliDielectronVarManager::kITSLayerFirstCls,7,-1.5,5.5,kTRUE);
1340   //    cf->AddVariable(AliDielectronVarManager::kNclsITS,"1,2,3,4,5,6",kTRUE);
1341   //    cf->AddVariable(AliDielectronVarManager::kTPCnSigmaEle,"-3,-2.5,-2,2,2.5,3",kTRUE);
1342   //    cf->AddVariable(AliDielectronVarManager::kTPCnSigmaPio,"2.5,3.0,3.5,4.0,4.5,100",kTRUE);
1343   //    cf->AddVariable(AliDielectronVarManager::kNclsTPC,"70, 90, 100, 120, 160",kTRUE);
1344   //    cf->AddVariable(AliDielectronVarManager::kTPCnSigmaPro,"3.5,4.0,4.5,5.0,100",kTRUE);
1345   //    cf->AddVariable(AliDielectronVarManager::kTOFnSigmaEle,"-3,-2,2,3",kTRUE); break;
1346   //    cf->AddVariable(AliDielectronVarManager::kTRDpidQuality,"3.5, 4.5, 5.5, 6.5",kTRUE);
1347   //    if(!hasMC && isESD) cf->AddVariable(AliDielectronVarManager::kTRDchi2,"-1.,0.,2.,4.",kTRUE);
1348   */
1349   // mc steps
1350   if(hasMC) {
1351     cf->SetStepForMCtruth();
1352     //    cf->SetStepForNoCutsMCmotherPid();
1353     //    cf->SetStepForAfterAllCuts();
1354     //    cf->SetStepsForEachCut();
1355     //    cf->SetStepsForSignal();
1356     //    cf->SetStepsForBackground();
1357     //cf->SetStepsForMCtruthOnly();
1358   }
1359   else
1360     cf->SetStepsForSignal();
1361
1362   die->SetCFManagerPair(cf);
1363 }
1364
1365 void AddMCSignals(AliDielectron *die, Int_t cutDefinition){
1366   //Do we have an MC handler?
1367   if (!die->GetHasMC()) return;
1368
1369   AliDielectronSignalMC* inclusiveJpsi = new AliDielectronSignalMC("inclusiveJpsi","Inclusive");
1370   inclusiveJpsi->SetLegPDGs(11,-11);
1371   inclusiveJpsi->SetMotherPDGs(443,443);
1372   inclusiveJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
1373   inclusiveJpsi->SetFillPureMCStep(kTRUE);
1374   inclusiveJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
1375   inclusiveJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
1376
1377   AliDielectronSignalMC* beautyJpsi = new AliDielectronSignalMC("beautyJpsi","Beauty");
1378   beautyJpsi->SetLegPDGs(11,-11);
1379   beautyJpsi->SetMotherPDGs(443,443);
1380   beautyJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
1381   beautyJpsi->SetGrandMotherPDGs(500,500);
1382   beautyJpsi->SetFillPureMCStep(kTRUE);
1383   beautyJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
1384   beautyJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
1385   beautyJpsi->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
1386
1387   AliDielectronSignalMC* promptJpsi = new AliDielectronSignalMC("promptJpsi","Prompt");   // prompt J/psi (not from beauty decays)
1388   promptJpsi->SetLegPDGs(11,-11);
1389   promptJpsi->SetMotherPDGs(443,443);
1390   promptJpsi->SetGrandMotherPDGs(503,503,kTRUE,kTRUE);   // not from beauty hadrons
1391   promptJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
1392   promptJpsi->SetFillPureMCStep(kTRUE);
1393   promptJpsi->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1394   promptJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
1395   promptJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
1396   promptJpsi->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
1397
1398   // prompt J/psi radiative channel
1399   AliDielectronSignalMC* promptJpsiRad = new AliDielectronSignalMC("promptJpsiRad","PromptRadiative");   // prompt J/psi (not from beauty decays)
1400   promptJpsiRad->SetLegPDGs(11,-11);
1401   promptJpsiRad->SetMotherPDGs(443,443);
1402   promptJpsiRad->SetGrandMotherPDGs(503,503,kTRUE,kTRUE);   // not from beauty hadrons
1403   promptJpsiRad->SetMothersRelation(AliDielectronSignalMC::kSame);
1404   promptJpsiRad->SetFillPureMCStep(kTRUE);
1405   promptJpsiRad->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1406   promptJpsiRad->SetCheckBothChargesLegs(kTRUE,kTRUE);
1407   promptJpsiRad->SetCheckBothChargesMothers(kTRUE,kTRUE);
1408   promptJpsiRad->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
1409   promptJpsiRad->SetJpsiRadiative(AliDielectronSignalMC::kIsRadiative);
1410
1411   // prompt J/psi Non radiative channel
1412   AliDielectronSignalMC* promptJpsiNonRad = new AliDielectronSignalMC("promptJpsiNonRad","PromptNonRadiative");   // prompt J/psi (not from beauty decays)
1413   promptJpsiNonRad->SetLegPDGs(11,-11);
1414   promptJpsiNonRad->SetMotherPDGs(443,443);
1415   promptJpsiNonRad->SetGrandMotherPDGs(503,503,kTRUE,kTRUE);   // not from beauty hadrons
1416   promptJpsiNonRad->SetMothersRelation(AliDielectronSignalMC::kSame);
1417   promptJpsiNonRad->SetFillPureMCStep(kTRUE);
1418   promptJpsiNonRad->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1419   promptJpsiNonRad->SetCheckBothChargesLegs(kTRUE,kTRUE);
1420   promptJpsiNonRad->SetCheckBothChargesMothers(kTRUE,kTRUE);
1421   promptJpsiNonRad->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
1422   promptJpsiNonRad->SetJpsiRadiative(AliDielectronSignalMC::kIsNotRadiative);
1423
1424   AliDielectronSignalMC* directJpsi = new AliDielectronSignalMC("directJpsi","Direct");   // embedded J/psi
1425   directJpsi->SetLegPDGs(11,-11);
1426   directJpsi->SetMotherPDGs(443,443);
1427   directJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
1428   directJpsi->SetFillPureMCStep(kTRUE);
1429   directJpsi->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1430   directJpsi->SetMotherSources(AliDielectronSignalMC::kDirect, AliDielectronSignalMC::kDirect);
1431   directJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
1432   directJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
1433
1434   AliDielectronSignalMC* gammaConversion = new AliDielectronSignalMC("gammaConversion","gamma conversions");
1435   gammaConversion->SetLegPDGs(11,-11);
1436   gammaConversion->SetCheckBothChargesLegs(kTRUE,kTRUE);
1437   gammaConversion->SetLegSources(AliDielectronSignalMC::kSecondary, AliDielectronSignalMC::kSecondary);
1438   gammaConversion->SetMotherPDGs(22,22);
1439   gammaConversion->SetMothersRelation(AliDielectronSignalMC::kSame);
1440
1441
1442   AliDielectronSignalMC* electrons = new AliDielectronSignalMC("electrons","electrons");
1443   electrons->SetLegPDGs(11,1);  //dummy second leg (never MCtrue)
1444   electrons->SetCheckBothChargesLegs(kTRUE,kTRUE);
1445   electrons->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1446   //  electrons->SetGrandMotherPDGs(500,500,kTRUE,kTRUE); // exclude non-prompt jpsi eletrons
1447   electrons->SetFillPureMCStep(kTRUE);
1448   //  electrons->SetMothersRelation(AliDielectronSignalMC::kSame);
1449
1450   AliDielectronSignalMC* directElec = new AliDielectronSignalMC("directElec","directElec");
1451   directElec->SetLegPDGs(11,11);  //dummy second leg (never MCtrue)
1452   directElec->SetCheckBothChargesLegs(kTRUE,kTRUE);
1453   directElec->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1454   //  directElec->SetGrandMotherPDGs(-1103,-1103);
1455   directElec->SetFillPureMCStep(kTRUE);
1456   directElec->SetMothersRelation(AliDielectronSignalMC::kSame);
1457   directElec->SetMotherSources(AliDielectronSignalMC::kDirect, AliDielectronSignalMC::kDirect);
1458
1459
1460   AliDielectronSignalMC* elecPrim = new AliDielectronSignalMC("elecPrim","elecPrim");
1461   elecPrim->SetLegPDGs(11,1);  //dummy second leg (never MCtrue)
1462   elecPrim->SetCheckBothChargesLegs(kTRUE,kTRUE);
1463   elecPrim->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1464   elecPrim->SetCheckBothChargesMothers(kTRUE,kTRUE);
1465   elecPrim->SetMotherPDGs(902,902,kTRUE,kTRUE); // exclude non-prompt jpsi eletrons
1466   elecPrim->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
1467   elecPrim->SetGrandMotherPDGs(902,902,kTRUE,kTRUE); // exclude non-prompt jpsi eletrons
1468   elecPrim->SetFillPureMCStep(kTRUE);
1469
1470   // add direct di lepton resonances
1471   /*
1472   AliDielectronSignalMC* directP[7];
1473   TParticlePDG *ap;
1474   Int_t pdg[] = {111, 113, 221, 223, 331, 333, 443};
1475   for(Int_t i=0; i<7; i++) {
1476     ap = TDatabasePDG::Instance()->GetParticle(pdg[i]);
1477     directP[i] = new AliDielectronSignalMC(Form("direct%s",ap->GetName()),Form("direct%s",ap->GetName()));
1478     directP[i]->SetLegPDGs(11,-11);
1479     directP[i]->SetMotherPDGs(pdg[i],pdg[i]);
1480     directP[i]->SetMothersRelation(AliDielectronSignalMC::kSame);
1481     directP[i]->SetFillPureMCStep(kTRUE);
1482     directP[i]->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1483     directP[i]->SetMotherSources(AliDielectronSignalMC::kDirect, AliDielectronSignalMC::kDirect);
1484     // directP[i]->SetCheckBothChargesLegs(kTRUE,kTRUE);
1485     // directP[i]->SetCheckBothChargesMothers(kTRUE,kTRUE);
1486   }
1487   */
1488
1489   /*
1490   AliDielectronSignalMC* eleHijing = new AliDielectronSignalMC("eleHijing","eleHijing");
1491   eleHijing->SetLegPDGs(11,1);  //dummy second leg (never MCtrue)
1492   eleHijing->SetCheckBothChargesLegs(kTRUE,kTRUE);
1493   eleHijing->SetLegSources(AliDielectronSignalMC::kNoCocktail, AliDielectronSignalMC::kNoCocktail);
1494   eleHijing->SetFillPureMCStep(kTRUE);
1495   */
1496   /*
1497   AliDielectronSignalMC* electrons = new AliDielectronSignalMC("electrons","electrons");
1498   electrons->SetLegPDGs(11,-11);  //dummy second leg (never MCtrue)
1499   electrons->SetCheckBothChargesLegs(kTRUE,kTRUE);
1500   electrons->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
1501   //  electrons->SetMotherPDGs(111,111,kTRUE,kTRUE);   // not from pi0
1502   //  electrons->SetMothersRelation(AliDielectronSignalMC::kSame);
1503   electrons->SetFillPureMCStep(kTRUE);
1504   */
1505
1506   // selection
1507   switch(cutDefinition) {
1508   case kPIDqa:
1509     die->AddSignalMC(directElec);
1510     break;
1511   case kRec:
1512     die->AddSignalMC(inclusiveJpsi);
1513     die->AddSignalMC(directJpsi);
1514     break;
1515   case kIonut:
1516     die->AddSignalMC(inclusiveJpsi);
1517     //  die->AddSignalMC(beautyJpsi);
1518     //die->AddSignalMC(promptJpsi);
1519     //die->AddSignalMC(promptJpsiRad);
1520     //die->AddSignalMC(promptJpsiNonRad);
1521     die->AddSignalMC(directJpsi);
1522     //  die->AddSignalMC(gammaConversion);
1523     break;
1524   case kLegEff:
1525     // die->AddSignalMC(directJpsi);
1526     // die->AddSignalMC(inclusiveJpsi);
1527     // die->AddSignalMC(electrons);
1528     // die->AddSignalMC(elecPrim);
1529     die->AddSignalMC(directElec);
1530     //for(Int_t i=0; i<7; i++) die->AddSignalMC(directP[i]);
1531     break;
1532   default:
1533     die->AddSignalMC(directJpsi);
1534     break;
1535   }
1536
1537
1538 }
1539
1540 void SetEtaCorrection(AliDielectron *die) {
1541
1542   if (AliDielectronPID::GetCentroidCorrFunction()) return;
1543
1544   TF2 *fCntrdCorr=0x0;
1545   TF1 *fWdthCorr=0x0;
1546   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DATA vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
1547   // either data or MC with tune on data option
1548   if( !die->GetHasMC() || ((AliPIDResponse*)AliAnalysisManager::GetAnalysisManager()->GetTasks()->At(0))->IsTunedOnData()) {
1549     // 2-dimensional eta correction for the centroid of electron sigmas
1550     fCntrdCorr = new TF2("fCntrdCorr", "[0] + [1]*y + [2]*y*y + [3]*TMath::Power(y,3) + [4]*TMath::Power(y,4) + [5]*TMath::Power(y,5) + [6]*TMath::Power(y,6) + [7]*x",
1551                          //                           0.0, 3000.0, -0.9, +0.9);
1552                          0.0, 90.0, -0.9, +0.9);
1553     //    fCntrdCorr->SetParameters(0.723106, 0.23958, -6.31221, -0.687976, 15.912, 0.579609, -11.6901, -0.000354381); //Nacc dep.
1554     fCntrdCorr->SetParameters(+0.149002, +0.214644 , -6.034930, -0.529588, +14.97902, +0.402640, -10.890027, +0.011248); //Cent dep.
1555     
1556     // 1-dimensional eta correction for the width of electron sigmas
1557     fWdthCorr = new TF1("fWdthCorr", "pol2", 0.0, 90.0);
1558     //    fWdthCorr->SetParameters(1.06108, 0.000217804,-5.80291e-08); //Nacc dep.
1559     fWdthCorr->SetParameters(+1.290755, -0.005261, +0.000021); //Cent dep.
1560
1561     // apply corrections
1562     // AliDielectronPID::SetCentroidCorrFunction(fCntrdCorr,AliDielectronVarManager::kNacc,AliDielectronVarManager::kEta);
1563     // AliDielectronPID::SetWidthCorrFunction(fWdthCorr,AliDielectronVarManager::kNacc);
1564     AliDielectronPID::SetCentroidCorrFunction(fCntrdCorr,AliDielectronVarManager::kCentrality,AliDielectronVarManager::kEta);
1565     AliDielectronPID::SetWidthCorrFunction(fWdthCorr,AliDielectronVarManager::kCentrality);
1566     printf(" DATA PID correction loaded!!!\n");
1567   }
1568   else  {
1569     /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv MONTE CARLO vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
1570     // 2-dimensional eta correction for the centroid of electron sigmas
1571     fCntrdCorr = new TF2("fCntrdCorr", "[0] + [1]*y + [2]*y*y + [3]*TMath::Power(y,3) + [4]*TMath::Power(y,4) + [5]*TMath::Power(y,5) + [6]*TMath::Power(y,6) + [7]*x",
1572                               0.0, 3000.0, -0.9, +0.9);
1573     fCntrdCorr->SetParameters(+0.378611, -0.070831, -3.076778, +0.121977, +8.576097, +0.113009, -5.001368, -0.000181);
1574     // 1-dimensional eta correction for the width of electron sigmas
1575     fWdthCorr = new TF1("fWdthCorr", "pol1", 0.0, 3000.0);
1576     fWdthCorr->SetParameters(+0.881894, +0.000053);
1577
1578     // apply corrections
1579     AliDielectronPID::SetCentroidCorrFunction(fCntrdCorr,AliDielectronVarManager::kNacc,AliDielectronVarManager::kEta);
1580     AliDielectronPID::SetWidthCorrFunction(fWdthCorr,AliDielectronVarManager::kNacc);
1581     // AliDielectronPID::SetCentroidCorrFunction(fCntrdCorr,AliDielectronVarManager::kCentrality,AliDielectronVarManager::kEta);
1582     // AliDielectronPID::SetWidthCorrFunction(fWdthCorr,AliDielectronVarManager::kCentrality);
1583   }
1584
1585
1586 }
1587
1588 TVectorD *GetRunNumbers2011() {
1589   
1590   Double_t runLHC10h[] = { // all good runs based on RCT 29.Mai
1591     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
1592   };
1593   Double_t runLHC11h[] = { // all good runs based on RCT 29.Mai
1594     167915, 167920, 167985, 167987, 167988, 168069, 168076, 168105, 168107, 168108, 168115, 168310, 168311, 168322, 168325, 168341, 168342, 168361, 168362, 168458, 168460, 168464, 168467, 168511, 168512, 168514, 168777, 168826, 168988, 168992, 169035, 169040, 169044, 169045, 169091, 169094, 169099, 169138, 169144, 169145, 169148, 169156, 169160, 169167, 169238, 169411, 169415, 169417, 169418, 169419, 169420, 169475, 169498, 169504, 169506, 169512, 169515, 169550, 169553, 169554, 169555, 169557, 169586, 169587, 169588, 169590, 169591, 169835, 169837, 169838, 169846, 169855, 169858, 169859, 169923, 169965, 170027, 170040, 170081, 170083, 170084, 170085, 170088, 170089, 170091, 170155, 170159, 170163, 170193, 170203, 170204, 170207, 170228, 170230, 170268, 170269, 170270, 170306, 170308, 170309, 170311, 170312, 170313, 170315, 170387, 170388, 170572, 170593, 
1595     170593+1
1596   };
1597   /*
1598   if(list.Contains("LHC10h") || list.Contains("LHC11a10")) {
1599   if( list.Contains("LHC11h") || list.Contains("LHC12a17") ) {
1600   */  
1601   Int_t size = (int) (sizeof(runLHC11h)/sizeof(Double_t));
1602   TVectorD *vec = new TVectorD(size,runLHC11h);
1603   //vec->Print("");
1604   return vec;
1605 }
1606
1607 TVectorD *GetPDGcodes() {
1608   //
1609   // array of pdgcodes stored in TDatabasePDG
1610   //
1611   TDatabasePDG *pdg = new TDatabasePDG();
1612   pdg->ReadPDGTable();
1613   TGraph *gr = new TGraph();
1614   TIter next(pdg->ParticleList());
1615   TParticlePDG *p;
1616   Int_t i=0;
1617   while ((p = (TParticlePDG *)next())) {
1618     if(TMath::Abs(p->PdgCode()) < 1e+6) {
1619       //      printf("%s -> %d \n",p->GetName(),p->PdgCode());
1620       gr->SetPoint(i++, p->PdgCode(),1.);
1621     }
1622   }
1623   gr->Sort();
1624   TVectorD *vec = new TVectorD(gr->GetN(), gr->GetX());
1625   //  vec->Print();
1626   delete pdg;
1627   delete gr;
1628   return vec;
1629
1630 }
1631
1632 TVectorD *GetDeltaPhiBins() {
1633   //
1634   // for in and out of event plane bins
1635   //
1636   Double_t pi = TMath::Pi();
1637   TVectorD *deltaPhi = new TVectorD(6);
1638   (*deltaPhi)[0] = -1.    *pi;
1639   (*deltaPhi)[1] = -3./4. *pi;
1640   (*deltaPhi)[2] = -1./4. *pi;
1641   (*deltaPhi)[3] = +1./4. *pi;
1642   (*deltaPhi)[4] = +3./4. *pi;
1643   (*deltaPhi)[5] = +1.    *pi;
1644   return deltaPhi;
1645 }