1 void InitHistograms(AliDielectron *die, Int_t cutDefinition);
3 void SetupTrackCuts(Bool_t isESD, AliDielectron *die, Int_t cutDefinition);
4 void SetupPairCuts(AliDielectron *die, Int_t cutDefinition);
6 void AddMCSignals(AliDielectron *die);
7 void SetEtaCorrection();
9 TString names=("TOFTRDany");
12 TObjArray *arrNames=names.Tokenize(";");
13 const Int_t nDie=arrNames->GetEntries();
17 AliDielectron* ConfigBJpsi_ff_PbPbFilter(Int_t cutDefinition, Bool_t isMC=kFALSE)
20 // Setup the instance of AliDielectron
26 //(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
29 Bool_t isESD=(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliESDInputHandler::Class());
32 // create the actual framework object
33 TString name=Form("%02d",cutDefinition);
34 if (cutDefinition<arrNames->GetEntriesFast()){
35 name=arrNames->At(cutDefinition)->GetName();
37 AliDielectron *die = new AliDielectron(Form("%s",name.Data()),
38 Form("Track cuts: %s",name.Data()));
40 // Monte Carlo Signals and TRD efficiency tables
45 TString pidTab="$TRAIN_ROOT/util/dielectron/dielectron/TRDpidEff_eleProb07_TRDntr4_6.root";
46 TString trainRoot=gSystem->Getenv("TRAIN_ROOT");
47 if (trainRoot.IsNull()) pidTab="$ALICE_ROOT/PWGDQ/dielectron/files/TRDpidEff_eleProb07_TRDntr4_6.root";
49 if (gSystem->AccessPathName(gSystem->ExpandPathName(pidTab.Data())))
50 Error("ConfigPbPb","PID table not found: %s",pidTab.Data());
52 die->SetTRDcorrectionFilename(pidTab.Data());
56 SetupTrackCuts(isESD,die,cutDefinition);
57 SetupPairCuts(die,cutDefinition);
60 if(cutDefinition == kTOFTRD)
61 InitHistograms(die,cutDefinition);
63 // setup eta correction
69 //______________________________________________________________________________________
70 void SetupTrackCuts(Bool_t isESD, AliDielectron *die, Int_t cutDefinition)
73 // Setup the track cuts
77 AliDielectronCutGroup* cuts = new AliDielectronCutGroup("cuts","cuts",AliDielectronCutGroup::kCompAND);
78 die->GetTrackFilter().AddCuts(cuts);
80 //Pt cut, should make execution a bit faster
81 AliDielectronVarCuts *pt = new AliDielectronVarCuts("Pt>.85","Pt>.85");
82 pt->AddCut(AliDielectronVarManager::kPt,0.85,1e30);
85 // track cuts ESD and AOD
86 AliDielectronVarCuts *varCuts = new AliDielectronVarCuts("VarCuts","VarCuts");
87 varCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
88 varCuts->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
89 varCuts->AddCut(AliDielectronVarManager::kEta, -0.9, 0.9);
90 varCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
91 varCuts->AddCut(AliDielectronVarManager::kNclsTPC, 70.0, 160.0);
92 varCuts->AddCut(AliDielectronVarManager::kKinkIndex0, 0.0);
94 AliDielectronTrackCuts *trkCuts = new AliDielectronTrackCuts("TrkCuts","TrkCuts");
95 varCuts->AddCut(AliDielectronVarManager::kITSLayerFirstCls,-0.01,1.5); //ITS(0-1) = SPDany
97 cuts->AddCut(varCuts);
99 trkCuts->SetRequireITSRefit(kTRUE);
100 trkCuts->SetRequireTPCRefit(kTRUE);
101 cuts->AddCut(trkCuts);
103 //Do we have an MC handler?
104 // Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
106 /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PID CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
107 AliDielectronPID *pid = new AliDielectronPID("PID","PID");
109 ////////////////////////////////// DATA
112 pid->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3.0,3.0,0.,0.,kTRUE);
113 pid->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-3.0,3.0,0.,0.,kTRUE);
116 ////////////////////////////////// MC
120 Double_t nSigmaPi = 3.5; Double_t nSigmaP = 3.5;
121 Double_t resolution=0.0549;
122 Double_t BBpro[5] = {0};
123 Double_t BBpio[5] = {0};
125 for(Int_t icent=0; icent<8; icent++) {
129 BBpro[0] = 0.031555; BBpro[1] = 26.0595; BBpro[2] = 3.02422e-11; BBpro[3] = 2.05594; BBpro[4] = 5.99848;
130 BBpio[0] = 0.0252122; BBpio[1] = 38.8991; BBpio[2] = 4.0901e-11; BBpio[3] = 5.27988; BBpio[4] = 4.3108;
133 BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11; BBpro[3] = 2.05802; BBpro[4] = 5.99999;
134 BBpio[0] = 0.0252127; BBpio[1] = 33.8617; BBpio[2] = 3.56866e-11; BBpio[3] = 5.24831; BBpio[4] = 4.31093;
137 BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11; BBpro[3] = 2.05802; BBpro[4] = 5.99999;
138 BBpio[0] = 0.0263205; BBpio[1] = 37.9307; BBpio[2] = 4.29724e-11; BBpio[3] = 5.74458; BBpio[4] = 4.32459;
141 BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11; BBpro[3] = 2.05802; BBpro[4] = 5.99999;
142 BBpio[0] = 0.026294; BBpio[1] = 39.0346; BBpio[2] = 4.12261e-11; BBpio[3] = 5.28808; BBpio[4] = 4.31301;
145 BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11; BBpro[3] = 2.05802; BBpro[4] = 5.99999;
146 BBpio[0] = 0.0263134; BBpio[1] = 38.2084; BBpio[2] = 3.75159e-11; BBpio[3] = 5.78125; BBpio[4] = 4.31363;
149 BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11; BBpro[3] = 2.05802; BBpro[4] = 5.99999;
150 BBpio[0] = 0.0263134; BBpio[1] = 38.2084; BBpio[2] = 3.75159e-11; BBpio[3] = 5.78125; BBpio[4] = 4.31363;
153 BBpro[0] = 0.031555; BBpro[1] = 26.0595; BBpro[2] = 3.02422e-11; BBpro[3] = 2.05594; BBpro[4] = 5.99848;
154 BBpio[0] = 0.026302; BBpio[1] = 38.6888; BBpio[2] = 3.56792e-11; BBpio[3] = 5.2465; BBpio[4] = 4.31094;
157 BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11; BBpro[3] = 2.05802; BBpro[4] = 5.99999;
158 BBpio[0] = 0.0263134; BBpio[1] = 38.2084; BBpio[2] = 3.75159e-11; BBpio[3] = 5.78125; BBpio[4] = 4.31363;
161 BBpro[0] = 0.0313438; BBpro[1] = 25.8666; BBpro[2] = 4.5457e-11; BBpro[3] = 2.07912; BBpro[4] = 5.99986;
162 BBpio[0] = 0.0252127; BBpio[1] = 33.8617; BBpio[2] = 3.56866e-11; BBpio[3] = 5.24831; BBpio[4] = 4.31093;
165 BBpro[0] = 0.0319126; BBpro[1] = 36.8784; BBpro[2] = 3.4274e-11; BBpro[3] = 3.2431; BBpro[4] = 5.93388;
166 BBpio[0] = 0.027079; BBpio[1] = 67.5936; BBpio[2] = 9.72548e-11; BBpio[3] = 9.61382; BBpio[4] = 5.99372;
171 TF1 *ffPro=new TF1(Form("fBethe%d_c%d",AliPID::kProton,icent), Form("(%f*%f+(AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])-AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])))/%f", nSigmaP,resolution, AliPID::ParticleMass(AliPID::kProton), AliPID::ParticleMass(AliPID::kElectron), resolution), 0.05,200.);
173 TF1 *ffPio=new TF1(Form("fBethe%d_c%d",AliPID::kPion,icent), Form("(%f*%f+(AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])-AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])))/%f", nSigmaPi,resolution, AliPID::ParticleMass(AliPID::kPion), AliPID::ParticleMass(AliPID::kElectron), resolution), 0.05,200.);
175 TString list=gSystem->Getenv("LIST");
178 if (list.Contains("LHC11a10b") || list.IsNull()) {
179 printf("LHC11a10b parameters\n");
180 ffPro->SetParameters(BBpro[0],BBpro[1],BBpro[2],BBpro[3],BBpro[4]);
181 ffPio->SetParameters(BBpio[0],BBpio[1],BBpio[2],BBpio[3],BBpio[4]);
184 pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,ffPro,10,((double)icent)*10.,((double)icent+1)*10,
185 kFALSE,AliDielectronPID::kRequire,AliDielectronVarManager::kCentrality);
187 pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,ffPio,10,((double)icent)*10.,((double)icent+1)*10,
188 kFALSE,AliDielectronPID::kRequire,AliDielectronVarManager::kCentrality);
192 // shifts for the nSigma electrons
193 TGraph* nSigmaCorrection = new TGraph();
195 if (list.Contains("LHC11a10b") || list.IsNull()) {
196 nSigmaCorrection->SetPoint(0, 137161., -0.50-(0.28));
197 nSigmaCorrection->SetPoint(1, 139510., -0.50-(0.28));
198 pid->SetCorrGraph(nSigmaCorrection);
203 ////////////////////////////////// DATA + MC
204 // pid cuts TPC + TOF
205 pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-4.,4.);
206 pid->AddCut(AliDielectronPID::kTOF,AliPID::kElectron,-3,3.,0.,0.,kFALSE,AliDielectronPID::kIfAvailable);
209 /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PID CUTS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
212 // exclude conversion electrons selected by the tender
213 AliDielectronTrackCuts *noconv=new AliDielectronTrackCuts("noConv","noConv");
214 noconv->SetV0DaughterCut(AliPID::kElectron,kTRUE);
215 cuts->AddCut(noconv);
219 //______________________________________________________________________________________
220 void SetupPairCuts(AliDielectron *die, Int_t cutDefinition)
223 // Setup the pair cuts
226 // conversion rejection
227 Double_t gCut = 0.05; // default
229 AliDielectronVarCuts *gammaCut=new AliDielectronVarCuts("gammaCut","gammaCut");
230 gammaCut->AddCut(AliDielectronVarManager::kM,0.,gCut);
231 die->GetPairPreFilter().AddCuts(gammaCut);
236 //______________________________________________________________________________________
237 void InitHistograms(AliDielectron *die, Int_t cutDefinition)
240 // Initialise the histograms
242 // Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
244 //Setup histogram Manager
245 AliDielectronHistos *histos=new AliDielectronHistos(die->GetName(),die->GetTitle());
248 //add histograms to event class
249 histos->AddClass("Event");
250 histos->AddClass("Event_noCuts");
251 histos->UserHistogram("Event","VtxZ","Vertex Z;z (cm)",
252 300,-15.,15.,AliDielectronVarManager::kZvPrim);
253 histos->UserHistogram("Event_noCuts","VtxZ","Vertex Z;z (cm)",
254 300,-15.,15.,AliDielectronVarManager::kZvPrim);
256 histos->UserHistogram("Event","Centrality","Centrality;centrality (%)",
257 20,0.,100.,AliDielectronVarManager::kCentrality);
259 histos->UserHistogram("Event","Multiplicity","Multiplicity V0;Multiplicity V0",
260 500,0.,25000., AliDielectronVarManager::kMultV0);
261 histos->UserHistogram("Event","Multiplicity_nTracks","Multiplicity V0 vs #tracks; #tracks; Multiplicity V0;",
262 500,0.,25000.,500,0.,25000.,AliDielectronVarManager::kNTrk, AliDielectronVarManager::kMultV0);
264 histos->UserHistogram("Event","Cent_Mult","Centrality vs. Multiplicity;centrality (%);Multiplicity V0",
265 10,0.,100., 500,0.,500.,AliDielectronVarManager::kCentrality,AliDielectronVarManager::kMultV0);
266 histos->UserProfile("Event","Cent_Nacc",
267 "accepted tracks;centrality (%)",
268 AliDielectronVarManager::kNacc,
269 "0.,5.,10.,20.,40.,50.,60.,80.,100.",
270 AliDielectronVarManager::kCentrality);
271 histos->UserProfile("Event","Cent_NVtxContrib",
272 "number of vertex contributors;centrality (%)",
273 AliDielectronVarManager::kNVtxContrib,
274 "0.,5.,10.,20.,40.,50.,60.,80.,100.",
275 AliDielectronVarManager::kCentrality);
281 //Initialise histogram classes
282 histos->SetReservedWords("Track;Pair");
286 // to fill also mixed event histograms loop until 10
287 for (Int_t i=0; i<3; ++i){
288 histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(i)));
291 if(cutDefinition <= kTOFTRD) {
294 for (Int_t i=0; i<3; ++i){
295 histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(i)));
299 //to fill also track info from 2nd event loop until 2
300 for (Int_t i=0; i<2; ++i){
301 histos->AddClass(Form("Track_%s",AliDielectron::TrackClassName(i)));
304 //add histograms to Track classes
305 //histos->UserHistogram("Track","TOFbit","TOFbit;bit;#tracks",19,-9.5,9.5,AliDielectronVarManager::kTOFPIDBit);
306 histos->UserHistogram("Track","Pt","Pt;Pt [GeV];#tracks",
308 AliDielectronVarManager::kPt);
310 histos->UserHistogram("Track","TPCnCls","Number of Clusters TPC;TPC number clusteres;#tracks",
312 AliDielectronVarManager::kNclsTPC);
313 histos->UserHistogram("Track","TPCsignalN","Number of Clusters TPC;TPC number clusteres;#tracks",
315 AliDielectronVarManager::kTPCsignalN);
317 histos->UserHistogram("Track","dXY","dXY;dXY [cm];#tracks",
319 AliDielectronVarManager::kImpactParXY);
320 histos->UserHistogram("Track","dZ","dZ;dZ [cm];#tracks",
322 AliDielectronVarManager::kImpactParZ);
324 histos->UserHistogram("Track","Centrality_Eta_Nsigma","Cent_Eta_nSigma; Centrality; #eta; TPCnSigma_Electron",20,0.,100.,200,-1.,1.,200,-10.,10.,AliDielectronVarManager::kCentrality,AliDielectronVarManager::kEta,AliDielectronVarManager::kTPCnSigmaEle);
326 histos->UserHistogram("Track","Eta_Phi","Eta Phi Map; Eta; Phi;#tracks",
327 200,-1,1,200,0,6.285,
328 AliDielectronVarManager::kEta,AliDielectronVarManager::kPhi);
330 histos->UserHistogram("Track","dEdx_P","dEdx;P [GeV];TPC signal (arb units);#tracks",
331 400,0.2,20.,200,0.,200.,
332 AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCsignal,kTRUE);
334 histos->UserHistogram("Track","TPCnSigmaEle_P","TPC number of sigmas Electrons;P [GeV];TPC number of sigmas Electrons;#tracks",400,0.2,20.,200,-10.,10., AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
336 histos->UserHistogram("Track","nSigmaTOF_P","TOF sigmas Electrons;P [GeV];TOF number of sigmas Electrons;#tracks", 400,0.2,20.,200,-10.,10., AliDielectronVarManager::kPIn,AliDielectronVarManager::kTOFnSigmaEle,kTRUE);
338 histos->UserHistogram("Track","Ncl",";Number clusters TPC;Number clusters TPC",
340 AliDielectronVarManager::kNclsTPC);
341 histos->UserHistogram("Track","NclFr",";Number of findable clusters (robust);Number findable clusters TPC",
343 AliDielectronVarManager::kNFclsTPCr);
344 histos->UserHistogram("Track","Ncl_NclFr","Number of (findable) clusters TPC;found clusters;findable clusters",
345 160,-0.5,159.5,160,-0.5,159.5,
346 AliDielectronVarManager::kNclsTPC,AliDielectronVarManager::kNFclsTPCr);
347 histos->UserHistogram("Track","NtrklTRD",";Number tracklets TRD for pid;Number tracklets TRD",
349 AliDielectronVarManager::kTRDpidQuality);
351 //add histograms to Pair classes
352 histos->UserHistogram("Pair","InvMass","Inv.Mass;Inv. Mass [GeV];#pairs",
354 AliDielectronVarManager::kM); // 40MeV bins, 12GeV/c2
355 histos->UserHistogram("Pair","Rapidity","Rapidity;Rapidity;#pairs",
357 AliDielectronVarManager::kY);
358 histos->UserHistogram("Pair","OpeningAngle","Opening angle;angle",
360 AliDielectronVarManager::kOpeningAngle);
361 histos->UserHistogram("Pair","Chi2NDF","#chi^{2}/NDF;#chi^{2}/NDF",
363 AliDielectronVarManager::kChi2NDF);
365 histos->UserHistogram("Pair","PseudoProperTime","Pseudoproper decay length; pseudoproper-decay-length[#mum];Entries/40#mum",
366 150,-0.3.,0.3,AliDielectronVarManager::kPseudoProperTime);
371 die->SetHistogramManager(histos);
375 void AddMCSignals(AliDielectron *die){
376 //Do we have an MC handler?
377 //Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
380 AliDielectronSignalMC* inclusiveJpsi = new AliDielectronSignalMC("inclusiveJpsi","Inclusive J/psi");
381 inclusiveJpsi->SetLegPDGs(11,-11);
382 inclusiveJpsi->SetMotherPDGs(443,443);
383 inclusiveJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
384 inclusiveJpsi->SetFillPureMCStep(kTRUE);
385 inclusiveJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
386 inclusiveJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
387 die->AddSignalMC(inclusiveJpsi);
389 AliDielectronSignalMC* promptJpsi = new AliDielectronSignalMC("promptJpsi","Prompt J/psi"); // prompt J/psi (not from beauty decays)
390 promptJpsi->SetLegPDGs(11,-11);
391 promptJpsi->SetMotherPDGs(443,443);
392 promptJpsi->SetGrandMotherPDGs(503,503,kTRUE,kTRUE); // not from beauty hadrons
393 promptJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
394 promptJpsi->SetFillPureMCStep(kTRUE);
395 promptJpsi->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
396 promptJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
397 promptJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
398 promptJpsi->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
399 die->AddSignalMC(promptJpsi);
401 AliDielectronSignalMC* beautyJpsi = new AliDielectronSignalMC("beautyJpsi","Beauty J/psi");
402 beautyJpsi->SetLegPDGs(11,-11);
403 beautyJpsi->SetMotherPDGs(443,443);
404 beautyJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
405 beautyJpsi->SetGrandMotherPDGs(500,500);
406 beautyJpsi->SetFillPureMCStep(kTRUE);
407 beautyJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
408 beautyJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
409 beautyJpsi->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
410 die->AddSignalMC(beautyJpsi);
412 AliDielectronSignalMC* directJpsi = new AliDielectronSignalMC("directJpsi","Direct J/psi"); // embedded J/psi
413 directJpsi->SetLegPDGs(11,-11);
414 directJpsi->SetMotherPDGs(443,443);
415 directJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
416 directJpsi->SetFillPureMCStep(kTRUE);
417 directJpsi->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
418 directJpsi->SetMotherSources(AliDielectronSignalMC::kDirect, AliDielectronSignalMC::kDirect);
419 directJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
420 directJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
421 die->AddSignalMC(directJpsi);
424 void SetEtaCorrection()
427 if (AliDielectronPID::GetEtaCorrFunction()) return;
429 //TString list=gSystem->Getenv("LIST");
430 TString list="LHC11h.pass2";
432 //TString etaMap="$TRAIN_ROOT/jpsi_JPSI/EtaCorrMaps.root";
433 //TString trainRoot=gSystem->Getenv("TRAIN_ROOT");
434 //if (trainRoot.IsNull())
435 TString etaMap="$ALICE_ROOT/PWGDQ/dielectron/files/EtaCorrMaps.root";
436 if (gSystem->AccessPathName(gSystem->ExpandPathName(etaMap.Data()))){
437 Error("ConfigPbPb","Eta map not found: %s",etaMap.Data());
441 TFile f(etaMap.Data());
442 if (!f.IsOpen()) return;
443 TList *keys=f.GetListOfKeys();
446 for (Int_t i=0; i<keys->GetEntries(); ++i){
447 TString kName=keys->At(i)->GetName();
449 if (reg.MatchB(list)){
450 printf("Using Eta Correction Function: %s\n",kName.Data());
451 AliDielectronPID::SetEtaCorrFunction((TF1*)f.Get(kName.Data()));