42 #include <TGeoGlobalMagField.h>
45 #include "AliKFParticle.h"
48 #include "AliAODEvent.h"
49 #include "AliESDEvent.h"
51 #include "AliMCEvent.h"
52 #include "AliMCEventHandler.h"
53 #include "AliESDpid.h"
54 #include "AliESDtrackCuts.h"
56 #include "AliGenCocktailEventHeader.h"
62 #include "AliKFVertex.h"
63 #include "AliAODTrack.h"
64 #include "AliESDtrack.h"
65 #include "AliAnalysisManager.h"
66 #include "AliInputEventHandler.h"
67 #include "AliAODHandler.h"
68 #include "AliPIDResponse.h"
72 #include "TObjArray.h"
82 kAddv0sInESDFilter(kFALSE),
84 fConversionCuts(NULL),
86 fConversionGammas(NULL),
87 fUseImprovedVertex(kTRUE),
88 fUseOwnXYZCalculation(kTRUE),
89 fUseConstructGamma(kFALSE),
90 kUseAODConversionPhoton(kTRUE),
92 fDeltaAODBranchName("GammaConv"),
93 fDeltaAODFilename("AliAODGammaConversion.root"),
95 fPreviousV0ReaderPerformsAODRelabeling(0),
96 fEventIsSelected(kFALSE),
97 fNumberOfPrimaryTracks(0),
98 fNumberOfTPCoutTracks(0),
101 fUseMassToZero(kTRUE),
102 fProduceV0findingEffi(kFALSE),
103 fProduceImpactParamHistograms(kFALSE),
104 fCurrentInvMassPair(0),
107 fImpactParamHistograms(NULL),
108 fHistoMCGammaPtvsR(NULL),
109 fHistoMCGammaPtvsPhi(NULL),
110 fHistoMCGammaPtvsEta(NULL),
111 fHistoMCGammaRvsPhi(NULL),
112 fHistoMCGammaRvsEta(NULL),
113 fHistoMCGammaPhivsEta(NULL),
114 fHistoRecMCGammaPtvsR(NULL),
115 fHistoRecMCGammaPtvsPhi(NULL),
116 fHistoRecMCGammaPtvsEta(NULL),
117 fHistoRecMCGammaRvsPhi(NULL),
118 fHistoRecMCGammaRvsEta(NULL),
119 fHistoRecMCGammaPhivsEta(NULL),
120 fHistoRecMCGammaMultiPt(NULL),
121 fHistoRecMCGammaMultiPtvsEta(NULL),
122 fHistoRecMCGammaMultiR(NULL),
123 fHistoRecMCGammaMultiPhi(NULL),
124 fHistoPosTrackImpactParamZ(NULL),
125 fHistoPosTrackImpactParamY(NULL),
126 fHistoPosTrackImpactParamX(NULL),
127 fHistoPosTrackImpactParamZvsPt(NULL),
128 fHistoPosTrackImpactParamYvsPt(NULL),
129 fHistoPosTrackImpactParamXvsPt(NULL),
130 fHistoNegTrackImpactParamZ(NULL),
131 fHistoNegTrackImpactParamY(NULL),
132 fHistoNegTrackImpactParamX(NULL),
133 fHistoNegTrackImpactParamZvsPt(NULL),
134 fHistoNegTrackImpactParamYvsPt(NULL),
135 fHistoNegTrackImpactParamXvsPt(NULL),
136 fHistoImpactParamZvsR(NULL),
137 fHistoImpactParamZvsR2(NULL),
140 fHistoDCAzPhoton(NULL),
141 fHistoDCAzPhoton2(NULL),
144 fHistoRviaAlpha(NULL),
145 fHistoRviaAlphaRecalc(NULL),
147 fHistoImpactParameterStudy(NULL),
148 fImpactParamTree(NULL),
149 fVectorFoundGammas(0),
150 fCurrentFileName(""),
151 fMCFileChecked(kFALSE)
155 DefineInput(0, TChain::Class());
156 DefineOutput(1,TBits::Class());
164 if(fConversionGammas){
165 fConversionGammas->Delete();
166 delete fConversionGammas;
167 fConversionGammas=0x0;
180 if(fConversionGammas && (index < fConversionGammas->GetEntriesFast())) {
181 TObject *tmp = fConversionGammas->At(index);
182 if(tmp->IsA() == AliAODConversionPhoton::Class()){
238 if(fConversionCuts==NULL){
239 if(fConversionCuts==NULL)AliError(
"No Conversion Cut Selection initialized");
241 if(fEventCuts==NULL){
242 if(fEventCuts==NULL)AliError(
"No Event Cut Selection initialized");
245 if(fCreateAOD){kUseAODConversionPhoton=kTRUE;}
247 if(fConversionGammas != NULL){
248 delete fConversionGammas;
249 fConversionGammas=NULL;
252 if(fConversionGammas == NULL){
253 if(kUseAODConversionPhoton){
254 fConversionGammas =
new TClonesArray(
"AliAODConversionPhoton",100);}
256 fConversionGammas =
new TClonesArray(
"AliKFConversionPhoton",100);}
258 fConversionGammas->Delete();
267 fPCMv0BitField =
new TBits();
270 fDeltaAODBranchName.Append(
"_");
271 fDeltaAODBranchName.Append(fEventCuts->GetCutNumber());
274 fDeltaAODBranchName.Append(
"_");
275 fDeltaAODBranchName.Append(fConversionCuts->GetCutNumber());
276 fDeltaAODBranchName.Append(
"_gamma");
278 fConversionGammas->SetName(fDeltaAODBranchName.Data());
280 AddAODBranch(
"TClonesArray", &fConversionGammas, fDeltaAODFilename.Data());
281 AliAnalysisManager::GetAnalysisManager()->RegisterExtraFile(fDeltaAODFilename.Data());
284 if(fProduceImpactParamHistograms){
285 if(fImpactParamHistograms != NULL){
286 delete fImpactParamHistograms;
287 fImpactParamHistograms = NULL;
289 if(fImpactParamHistograms==NULL){
290 fImpactParamHistograms =
new TList();
291 fImpactParamHistograms->SetOwner(kTRUE);
292 fImpactParamHistograms->SetName(Form(
"ImpactParamHistograms_%s_%s",fEventCuts->GetCutNumber().Data(),fConversionCuts->GetCutNumber().Data()));
294 fHistoPosTrackImpactParamZ =
new TH1F(
"fHistoPosTrackImpactParamZ",
"",480,-80,80);
295 fHistoPosTrackImpactParamZ->SetXTitle(
"Z (cm)");
296 fImpactParamHistograms->Add(fHistoPosTrackImpactParamZ);
298 fHistoPosTrackImpactParamY =
new TH1F(
"fHistoPosTrackImpactParamY",
"",720,-120,120);
299 fHistoPosTrackImpactParamY->SetXTitle(
"Y (cm)");
300 fImpactParamHistograms->Add(fHistoPosTrackImpactParamY);
302 fHistoPosTrackImpactParamX =
new TH1F(
"fHistoPosTrackImpactParamX",
"",30,-3,3);
303 fHistoPosTrackImpactParamX->SetXTitle(
"X (cm)");
304 fImpactParamHistograms->Add(fHistoPosTrackImpactParamX);
306 fHistoNegTrackImpactParamZ =
new TH1F(
"fHistoNegTrackImpactParamZ",
"",480,-80,80);
307 fHistoNegTrackImpactParamZ->SetXTitle(
"Z (cm)");
308 fImpactParamHistograms->Add(fHistoNegTrackImpactParamZ);
310 fHistoNegTrackImpactParamY =
new TH1F(
"fHistoNegTrackImpactParamY",
"",720,-120,120);
311 fHistoNegTrackImpactParamY->SetXTitle(
"Y (cm)");
312 fImpactParamHistograms->Add(fHistoNegTrackImpactParamY);
314 fHistoNegTrackImpactParamX =
new TH1F(
"fHistoNegTrackImpactParamX",
"",30,-3,3);
315 fHistoNegTrackImpactParamX->SetXTitle(
"X (cm)");
316 fImpactParamHistograms->Add(fHistoNegTrackImpactParamX);
318 fHistoPosTrackImpactParamZvsPt =
new TH2F(
"fHistoPosTrackImpactParamZvsPt",
"",100,0,10,480,-80,80);
319 fHistoPosTrackImpactParamZvsPt->SetYTitle(
"Z (cm)");
320 fHistoPosTrackImpactParamZvsPt->SetXTitle(
"Pt (GeV)");
321 fImpactParamHistograms->Add(fHistoPosTrackImpactParamZvsPt);
323 fHistoPosTrackImpactParamYvsPt =
new TH2F(
"fHistoPosTrackImpactParamYvsPt",
"",100,0,10,720,-120,120);
324 fHistoPosTrackImpactParamYvsPt->SetYTitle(
"Y (cm)");
325 fHistoPosTrackImpactParamYvsPt->SetXTitle(
"Pt (GeV)");
326 fImpactParamHistograms->Add(fHistoPosTrackImpactParamYvsPt);
328 fHistoPosTrackImpactParamXvsPt =
new TH2F(
"fHistoPosTrackImpactParamXvsPt",
"",100,0,10,30,-3,5);
329 fHistoPosTrackImpactParamXvsPt->SetYTitle(
"X (cm)");
330 fHistoPosTrackImpactParamXvsPt->SetXTitle(
"Pt (GeV)");
331 fImpactParamHistograms->Add(fHistoPosTrackImpactParamXvsPt);
333 fHistoNegTrackImpactParamZvsPt =
new TH2F(
"fHistoNegTrackImpactParamZvsPt",
"",100,0,10,480,-80,80);
334 fHistoNegTrackImpactParamZvsPt->SetYTitle(
"Z (cm)");
335 fHistoNegTrackImpactParamZvsPt->SetXTitle(
"Pt (GeV)");
336 fImpactParamHistograms->Add(fHistoNegTrackImpactParamZvsPt);
338 fHistoNegTrackImpactParamYvsPt =
new TH2F(
"fHistoNegTrackImpactParamYvsPt",
"",100,0,10,720,-120,120);
339 fHistoNegTrackImpactParamYvsPt->SetYTitle(
"Y (cm)");
340 fHistoNegTrackImpactParamYvsPt->SetXTitle(
"Pt (GeV)");
341 fImpactParamHistograms->Add(fHistoNegTrackImpactParamYvsPt);
343 fHistoNegTrackImpactParamXvsPt =
new TH2F(
"fHistoNegTrackImpactParamXvsPt",
"",100,0,10,30,-3,3);
344 fHistoNegTrackImpactParamXvsPt->SetYTitle(
"X (cm)");
345 fHistoNegTrackImpactParamXvsPt->SetXTitle(
"Pt (GeV)");
346 fImpactParamHistograms->Add(fHistoNegTrackImpactParamXvsPt);
348 fHistoImpactParamZvsR =
new TH2F(
"fHistoImpactParamZvsR",
"Before cuts",300,-150,150,200,0,200);
349 fHistoImpactParamZvsR->SetXTitle(
"Z (cm)");
350 fHistoImpactParamZvsR->SetYTitle(
"R (cm)");
351 fImpactParamHistograms->Add(fHistoImpactParamZvsR);
353 fHistoImpactParamZvsR2 =
new TH2F(
"fHistoImpactParamZvsR2",
"After cuts",300,-150,150,200,0,200);
354 fHistoImpactParamZvsR2->SetXTitle(
"Z (cm)");
355 fHistoImpactParamZvsR2->SetYTitle(
"R (cm)");
356 fImpactParamHistograms->Add(fHistoImpactParamZvsR2);
358 fHistoPt =
new TH1F(
"fHistoPt",
"Before all cuts",100,0,10);
359 fHistoPt->SetXTitle(
"Pt (GeV)");
360 fImpactParamHistograms->Add(fHistoPt);
362 fHistoPt2 =
new TH1F(
"fHistoPt2",
"After all cuts",100,0,10);
363 fHistoPt2->SetXTitle(
"Pt (GeV)");
364 fImpactParamHistograms->Add(fHistoPt2);
366 fHistoDCAzPhoton =
new TH1F(
"fHistoDCAzPhoton",
"Before cuts",20,-2,2);
367 fHistoDCAzPhoton->SetXTitle(
"DCAz photon (cm)");
368 fImpactParamHistograms->Add(fHistoDCAzPhoton);
370 fHistoDCAzPhoton2 =
new TH1F(
"fHistoDCAzPhoton2",
"After cuts",20,-2,2);
371 fHistoDCAzPhoton2->SetXTitle(
"DCAz photon (cm)");
372 fImpactParamHistograms->Add(fHistoDCAzPhoton2);
374 fHistoR =
new TH1F(
"fHistoR",
"",200,0,200);
375 fHistoR->SetXTitle(
"Conversion radius (cm)");
376 fImpactParamHistograms->Add(fHistoR);
378 fHistoRrecalc =
new TH1F(
"fHistoRrecalc",
"",200,0,200);
379 fHistoRrecalc->SetXTitle(
"conversion radius (cm)");
380 fImpactParamHistograms->Add(fHistoRrecalc);
382 fHistoRviaAlpha =
new TH1F(
"fHistoRviaAlpha",
"",200,0,200);
383 fHistoRviaAlpha->SetXTitle(
"Conversion radius (cm)");
384 fImpactParamHistograms->Add(fHistoRviaAlpha);
386 fHistoRviaAlphaRecalc =
new TH1F(
"fHistoRviaAlphaRecalc",
"",200,0,200);
387 fHistoRviaAlphaRecalc->SetXTitle(
"conversion radius (cm)");
388 fImpactParamHistograms->Add(fHistoRviaAlphaRecalc);
390 fHistoRdiff =
new TH1F(
"fHistoRdiff",
"",200,0,200);
391 fHistoRdiff->SetXTitle(
"R_conv - R_cluster conflict (cm)");
392 fImpactParamHistograms->Add(fHistoRdiff);
394 fHistoImpactParameterStudy =
new TH1F(
"fHistoImpactParameterStudy",
"",7,-0.5,6.5);
395 fHistoImpactParameterStudy->GetXaxis()->SetBinLabel(1,
"# V0s");
396 fHistoImpactParameterStudy->GetXaxis()->SetBinLabel(2,
"two TPC-only tracks");
397 fHistoImpactParameterStudy->GetXaxis()->SetBinLabel(3,
"Z cut not passed");
398 fHistoImpactParameterStudy->GetXaxis()->SetBinLabel(4,
"Y cut not passed");
399 fHistoImpactParameterStudy->GetXaxis()->SetBinLabel(5,
"R>80cm");
400 fHistoImpactParameterStudy->GetXaxis()->SetBinLabel(6,
"causality cut not p.");
401 fHistoImpactParameterStudy->GetXaxis()->SetBinLabel(7,
"# removed V0s");
402 fImpactParamHistograms->Add(fHistoImpactParameterStudy);
404 fImpactParamTree =
new TTree(
"fImpactParamTree",
"");
405 fImpactParamHistograms->Add(fImpactParamTree);
408 if (fProduceV0findingEffi){
409 TH1::AddDirectory(kFALSE);
410 if(fHistograms != NULL){
414 if(fHistograms==NULL){
415 fHistograms =
new TList();
416 fHistograms->SetOwner(kTRUE);
417 fHistograms->SetName(Form(
"V0FindingEfficiencyInput_%s_%s",fEventCuts->GetCutNumber().Data(),fConversionCuts->GetCutNumber().Data()));
420 fHistoMCGammaPtvsR =
new TH2F(
"MCconvGamma_Pt_R",
"MC converted gamma Pt vs R (|eta| < 0.9)",250,0.0,25,400,0,200);
421 fHistoMCGammaPtvsR->SetXTitle(
"p_{MC,T} (GeV/c)");
422 fHistoMCGammaPtvsR->SetYTitle(
"R_{MC,conv} (cm)");
423 fHistograms->Add(fHistoMCGammaPtvsR);
425 fHistoMCGammaPtvsEta =
new TH2F(
"MCconvGamma_Pt_Eta",
"MC converted gamma Pt vs Eta ",250,0.0,25,280,-1.4,1.4);
426 fHistoMCGammaPtvsEta->SetXTitle(
"p_{MC,T} (GeV/c)");
427 fHistoMCGammaPtvsEta->SetYTitle(
"#eta_{MC}");
428 fHistograms->Add(fHistoMCGammaPtvsEta);
430 fHistoMCGammaPtvsPhi =
new TH2F(
"MCconvGamma_Pt_Phi",
"MC converted gamma Pt vs Phi (|eta| < 0.9) ",250,0.0,25,400,0,2*TMath::Pi());
431 fHistoMCGammaPtvsPhi->SetXTitle(
"p_{MC,T} (GeV/c)");
432 fHistoMCGammaPtvsPhi->SetYTitle(
"#varphi_{MC} (rad)");
433 fHistograms->Add(fHistoMCGammaPtvsPhi);
435 fHistoMCGammaRvsPhi =
new TH2F(
"MCconvGamma_R_Phi",
"MC converted gamma R vs Phi (|eta| < 0.9) ",400,0,200,400,0,2*TMath::Pi());
436 fHistoMCGammaRvsPhi->SetXTitle(
"R_{MC,conv} (cm)");
437 fHistoMCGammaRvsPhi->SetYTitle(
"#varphi_{MC} (rad)");
438 fHistograms->Add(fHistoMCGammaRvsPhi);
440 fHistoMCGammaRvsEta =
new TH2F(
"MCconvGamma_R_Eta",
"MC converted gamma R vs Eta ",400,0,200,280,-1.4,1.4);
441 fHistoMCGammaRvsEta->SetXTitle(
"R_{MC,conv} (cm)");
442 fHistoMCGammaRvsEta->SetYTitle(
"#eta_{MC}");
443 fHistograms->Add(fHistoMCGammaRvsEta);
445 fHistoMCGammaPhivsEta =
new TH2F(
"MCconvGamma_Phi_Eta",
"MC converted gamma Phi vs Eta ",400,0,2*TMath::Pi(),280,-1.4,1.4);
446 fHistoMCGammaPhivsEta->SetXTitle(
"#phi_{MC} (rad)");
447 fHistoMCGammaPhivsEta->SetYTitle(
"#eta_{MC}");
448 fHistograms->Add(fHistoMCGammaPhivsEta);
450 fHistoRecMCGammaPtvsR =
new TH2F(
"RecMCconvGamma_Pt_R",
"rec MC converted gamma Pt vs R (|eta| < 0.9)",250,0.0,25,400,0,200);
451 fHistoRecMCGammaPtvsR->SetXTitle(
"p_{MC,T} (GeV/c)");
452 fHistoRecMCGammaPtvsR->SetYTitle(
"R_{MC,conv} (cm)");
453 fHistograms->Add(fHistoRecMCGammaPtvsR);
455 fHistoRecMCGammaPtvsEta =
new TH2F(
"RecMCconvGamma_Pt_Eta",
"rec MC converted gamma Pt vs Eta ",250,0.0,25,280,-1.4,1.4);
456 fHistoRecMCGammaPtvsEta->SetXTitle(
"p_{MC,T} (GeV/c)");
457 fHistoRecMCGammaPtvsEta->SetYTitle(
"#eta_{MC}");
458 fHistograms->Add(fHistoRecMCGammaPtvsEta);
460 fHistoRecMCGammaPtvsPhi =
new TH2F(
"RecMCconvGamma_Pt_Phi",
"rec MC converted gamma Pt vs Phi (|eta| < 0.9) ",250,0.0,25,400,0,2*TMath::Pi());
461 fHistoRecMCGammaPtvsPhi->SetXTitle(
"p_{MC,T} (GeV/c)");
462 fHistoRecMCGammaPtvsPhi->SetYTitle(
"#varphi_{MC} (rad)");
463 fHistograms->Add(fHistoRecMCGammaPtvsPhi);
465 fHistoRecMCGammaRvsPhi =
new TH2F(
"RecMCconvGamma_R_Phi",
"rec MC converted gamma R vs Phi (|eta| < 0.9) ",400,0,200,400,0,2*TMath::Pi());
466 fHistoRecMCGammaRvsPhi->SetXTitle(
"R_{MC,conv} (cm)");
467 fHistoRecMCGammaRvsPhi->SetYTitle(
"#varphi_{MC} (rad)");
468 fHistograms->Add(fHistoRecMCGammaRvsPhi);
470 fHistoRecMCGammaRvsEta =
new TH2F(
"RecMCconvGamma_R_Eta",
"rec MC converted gamma R vs Eta ",400,0,200,280,-1.4,1.4);
471 fHistoRecMCGammaRvsEta->SetXTitle(
"R_{MC,conv} (cm)");
472 fHistoRecMCGammaRvsEta->SetYTitle(
"#eta_{MC}");
473 fHistograms->Add(fHistoRecMCGammaRvsEta);
475 fHistoRecMCGammaPhivsEta =
new TH2F(
"RecMCconvGamma_Phi_Eta",
"rec MC converted gamma Phi vs Eta ",400,0,2*TMath::Pi(),280,-1.4,1.4);
476 fHistoRecMCGammaPhivsEta->SetXTitle(
"#phi_{MC} (rad)");
477 fHistoRecMCGammaPhivsEta->SetYTitle(
"#eta_{MC}");
478 fHistograms->Add(fHistoRecMCGammaPhivsEta);
480 fHistoRecMCGammaMultiPtvsEta =
new TH2F(
"RecMCconvGammaMulti_Pt_Eta",
"rec MC converted gamma (at least double counted) Pt vs Eta ",250,0.0,25,280,-1.4,1.4);
481 fHistoRecMCGammaMultiPtvsEta->SetXTitle(
"p_{MC,T} (GeV/c)");
482 fHistoRecMCGammaMultiPtvsEta->SetYTitle(
"#eta_{MC}");
483 fHistograms->Add(fHistoRecMCGammaMultiPtvsEta);
485 fHistoRecMCGammaMultiPt =
new TH1F(
"RecMCconvGammaMulti_Pt",
"rec MC converted gamma (at least double counted) Pt (|eta| < 0.9)",250,0.0,25);
486 fHistoRecMCGammaMultiPt->SetXTitle(
"p_{MC,T} (GeV/c)");
487 fHistograms->Add(fHistoRecMCGammaMultiPt);
489 fHistoRecMCGammaMultiR =
new TH1F(
"RecMCconvGammaMulti_R",
"rec MC converted gamma (at least double counted) R (|eta| < 0.9)",400,0,200);
490 fHistoRecMCGammaMultiR->SetXTitle(
"R_{MC,conv} (cm)");
491 fHistograms->Add(fHistoRecMCGammaMultiR);
493 fHistoRecMCGammaMultiPhi =
new TH1F(
"RecMCconvGammaMulti_Phi",
"rec MC converted gamma (at least double counted) Phi (|eta| < 0.9)",400,0,2*TMath::Pi());
494 fHistoRecMCGammaMultiPhi->SetXTitle(
"#phi_{MC} (rad)");
495 fHistograms->Add(fHistoRecMCGammaMultiPhi);
497 fVectorFoundGammas.clear();
505 fCurrentFileName =
"";
506 fMCFileChecked = kFALSE;
511 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
513 TTree* tree = (
TTree*) inputHandler->GetTree();
514 TFile*
file = (TFile*) tree->GetCurrentFile();
515 fCurrentFileName = file->GetName();
520 if (fPeriodName.CompareTo(
"") == 0){
521 TObjArray *arr = fCurrentFileName.Tokenize(
"/");
523 for (
Int_t i = 0; i < arr->GetEntriesFast();i++ ){
524 TObjString* testObjString = (TObjString*)arr->At(i);
525 if (testObjString->GetString().BeginsWith(
"LHC")){
526 fPeriodName = testObjString->GetString();
527 i = arr->GetEntriesFast();
530 if (fPeriodName.CompareTo(
"")==0){
531 TObjArray *arr2 = fCurrentFileName.Tokenize(
"__");
532 for (
Int_t i = 0; i < arr->GetEntriesFast();i++ ){
533 TObjString* testObjString = (TObjString*)arr2->At(i);
534 if (testObjString->GetString().BeginsWith(
"LHC")){
535 fPeriodName = testObjString->GetString();
536 i = arr2->GetEntriesFast();
541 fEventCuts->SetPeriodEnum (fPeriodName);
545 fEventCuts->SetPeriodEnum (fPeriodName);
557 TObjArray *arr = fCurrentFileName.Tokenize(
"/");
559 for (
Int_t i = 0; i < arr->GetEntriesFast();i++ ){
560 TObjString* testObjString = (TObjString*)arr->At(i);
561 if (testObjString->GetString().BeginsWith(
"LHC")){
562 TObjString* testObjString2 = (TObjString*)arr->At(i+1);
563 fPtHardBin = testObjString2->GetString().Atoi();
564 i = arr->GetEntriesFast();
569 if(!fEventCuts->GetDoEtaShift())
return kTRUE;
570 if(fEventCuts->GetEtaShift() == 0.0){
571 fEventCuts->GetCorrectEtaShiftFromPeriod();
572 fEventCuts->DoEtaShift(kFALSE);
575 printf(
" Gamma Conversion Reader %s_%s :: Eta Shift Manually Set to %f \n\n",
576 (fEventCuts->GetCutNumber()).
Data(),(fConversionCuts->GetCutNumber()).
Data(),fEventCuts->GetEtaShift());
577 fEventCuts->DoEtaShift(kFALSE);
587 if (!TGeoGlobalMagField::Instance()->GetField()) esdEvent->InitMagneticField();
591 if(!fConversionGammas)Init();
594 fEventIsSelected=ProcessEvent(fInputEvent,fMCEvent);
606 fConversionGammas->Delete();
609 if (kAddv0sInESDFilter){fPCMv0BitField->Clear();}
611 fInputEvent = inputEvent;
615 AliError(
"No Input event");
618 if(!fEventCuts){AliError(
"No EventCuts");
return kFALSE;}
619 if(!fConversionCuts){AliError(
"No ConversionCuts");
return kFALSE;}
630 if(!fEventCuts->EventIsSelected(fInputEvent,fMCEvent)){
631 if (fEventCuts->GetEventQuality() == 2 && !fMCFileChecked ){
632 cout <<
"ERROR with MC reading for: "<< fCurrentFileName.Data() << endl;
633 fMCFileChecked = kTRUE;
638 AliKFParticle::SetField(fInputEvent->GetMagneticField());
640 if(fInputEvent->IsA()==AliAODEvent::Class() && fProduceV0findingEffi){
641 fProduceV0findingEffi = kFALSE;
642 AliWarning(
"V0finding effi cannot be run on AODs ");
645 if(fProduceV0findingEffi){
646 CreatePureMCHistosForV0FinderEffiESD();
647 fVectorFoundGammas.clear();
650 if(fInputEvent->IsA()==AliESDEvent::Class()){
653 if(fInputEvent->IsA()==AliAODEvent::Class()){
654 GetAODConversionGammas();
664 if(fInputEvent->IsA()==AliESDEvent::Class()){
667 PostData(1, fPCMv0BitField);
668 AliAODHandler * aodhandler =
dynamic_cast<AliAODHandler*
>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
669 if (aodhandler && aodhandler->GetFillAOD()) {
670 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillExtension(kTRUE);
683 if(!(charge==1||charge==-1)){AliError(
"Charge not defined");
return 0x0;}
685 if(fConversionCuts->GetV0FinderSameSign()==1){
687 if((fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetPindex()))->Charge()!=(fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetNindex()))->Charge())
return 0x0;
688 if((fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetPindex()))->Charge()==(fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetNindex()))->Charge()){
690 tracklabel=fCurrentV0->GetPindex();
691 return fCurrentV0->GetParamP();
693 tracklabel=fCurrentV0->GetNindex();
694 return fCurrentV0->GetParamN();
698 }
else if(fConversionCuts->GetV0FinderSameSign()==2){
701 tracklabel=fCurrentV0->GetPindex();
702 return fCurrentV0->GetParamP();
704 tracklabel=fCurrentV0->GetNindex();
705 return fCurrentV0->GetParamN();
711 if(!fCurrentV0->GetParamN()||!fCurrentV0->GetParamP())
return 0x0;
712 if(!fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetNindex())||!fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetPindex()))
return 0x0;
713 if((fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetPindex()))->Charge()==
charge){
714 tracklabel=fCurrentV0->GetPindex();
715 return fCurrentV0->GetParamP();}
716 if((fConversionCuts->GetTrack(fInputEvent,fCurrentV0->GetNindex()))->Charge()==
charge){
717 tracklabel=fCurrentV0->GetNindex();
718 return fCurrentV0->GetParamN();}
734 for(
Int_t currentV0Index=0;currentV0Index<fESDEvent->GetNumberOfV0s();currentV0Index++){
735 AliESDv0 *fCurrentV0=(AliESDv0*)(fESDEvent->GetV0(currentV0Index));
737 printf(
"Requested V0 does not exist");
741 fCurrentMotherKFCandidate=ReconstructV0(fCurrentV0,currentV0Index);
743 if(fCurrentMotherKFCandidate){
746 if(kUseAODConversionPhoton){
747 new((*fConversionGammas)[fConversionGammas->GetEntriesFast()])
AliAODConversionPhoton(fCurrentMotherKFCandidate);
749 currentConversionPhoton->
SetMass(fCurrentMotherKFCandidate->
M());
750 if (fUseMassToZero) currentConversionPhoton->
SetMassToZero();
752 if(kAddv0sInESDFilter){fPCMv0BitField->SetBitNumber(currentV0Index, kTRUE);}
754 new((*fConversionGammas)[fConversionGammas->GetEntriesFast()])
AliKFConversionPhoton(*fCurrentMotherKFCandidate);
757 delete fCurrentMotherKFCandidate;
758 fCurrentMotherKFCandidate=NULL;
761 if(kAddv0sInESDFilter){fPCMv0BitField->Compact();}
774 if(!fConversionCuts->SelectV0Finder(fCurrentV0->GetOnFlyStatus())){
779 if (fMCEvent && fProduceV0findingEffi ) FillRecMCHistosForV0FinderEffiESD(fCurrentV0);
782 Int_t currentTrackLabels[2]={-1,-1};
786 const AliExternalTrackParam *fCurrentExternalTrackParamPositive=GetExternalTrackParamP(fCurrentV0,currentTrackLabels[0]);
788 const AliExternalTrackParam *fCurrentExternalTrackParamNegative=GetExternalTrackParamN(fCurrentV0,currentTrackLabels[1]);
790 if(!fCurrentExternalTrackParamPositive||!fCurrentExternalTrackParamNegative)
return 0x0;
794 AliVTrack * posTrack = fConversionCuts->GetTrack(fInputEvent,currentTrackLabels[0]);
795 AliVTrack * negTrack = fConversionCuts->GetTrack(fInputEvent,currentTrackLabels[1]);
796 if(!negTrack || !posTrack) {
801 if(!fConversionCuts->TracksAreSelected(negTrack, posTrack)){
806 fConversionCuts->FillV0EtaBeforedEdxCuts(fCurrentV0->Eta());
807 if (!fConversionCuts->dEdxCuts(posTrack)) {
812 if(!fConversionCuts->dEdxCuts(negTrack)) {
816 fConversionCuts->FillV0EtaAfterdEdxCuts(fCurrentV0->Eta());
821 AliKFParticle fCurrentNegativeKFParticle(*(fCurrentExternalTrackParamNegative),11);
823 AliKFParticle fCurrentPositiveKFParticle(*(fCurrentExternalTrackParamPositive),-11);
829 if(fUseConstructGamma){
831 fCurrentMotherKF->
ConstructGamma(fCurrentNegativeKFParticle,fCurrentPositiveKFParticle);
834 fCurrentMotherKF->SetMassConstraint(0,0.0001);
839 fCurrentMotherKF->
SetTrackLabels(currentTrackLabels[0],currentTrackLabels[1]);
855 TParticle *fNegativeMCParticle = 0x0;
856 if(labeln>-1) fNegativeMCParticle = fMCEvent->Particle(labeln);
857 TParticle *fPositiveMCParticle = 0x0;
858 if(labelp>-1) fPositiveMCParticle = fMCEvent->Particle(labelp);
860 if(fPositiveMCParticle&&fNegativeMCParticle){
868 if(fUseImprovedVertex == kTRUE){
869 AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
871 primaryVertexImproved+=*fCurrentMotherKF;
872 fCurrentMotherKF->SetProductionVertex(primaryVertexImproved);
876 if (fImprovedPsiPair == 0){
877 Double_t PsiPair=GetPsiPair(fCurrentV0,fCurrentExternalTrackParamPositive,fCurrentExternalTrackParamNegative, convpos);
883 if(fUseOwnXYZCalculation){
885 if(!GetConversionPoint(fCurrentExternalTrackParamPositive,fCurrentExternalTrackParamNegative,convpos,dca)){
887 delete fCurrentMotherKF;
888 fCurrentMotherKF=NULL;
897 if (fImprovedPsiPair >= 1){
899 Double_t PsiPair=GetPsiPair(fCurrentV0,fCurrentExternalTrackParamPositive,fCurrentExternalTrackParamNegative,convpos);
904 if(fCurrentMotherKF->GetNDF() > 0.)
905 fCurrentMotherKF->
SetChi2perNDF(fCurrentMotherKF->GetChi2()/fCurrentMotherKF->GetNDF());
909 fCurrentMotherKF->
SetMass(fCurrentMotherKF->
M());
912 Double_t mass=-99.0, mass_width=-99.0, Pt=-99.0, Pt_width=-99.0;
913 AliKFParticle fCurrentMotherKFForMass(fCurrentNegativeKFParticle,fCurrentPositiveKFParticle);
914 fCurrentMotherKFForMass.GetMass(mass,mass_width);
915 fCurrentMotherKFForMass.GetPt(Pt,Pt_width);
916 fCurrentInvMassPair=
mass;
919 if (!fConversionCuts->KappaCuts(fCurrentMotherKF,fInputEvent)){
921 delete fCurrentMotherKF;
922 fCurrentMotherKF=NULL;
927 if(!fConversionCuts->PhotonCuts(fCurrentMotherKF,fInputEvent)){
929 delete fCurrentMotherKF;
930 fCurrentMotherKF=NULL;
936 if(fProduceImpactParamHistograms) FillImpactParamHistograms(posTrack, negTrack, fCurrentV0, fCurrentMotherKF);
939 return fCurrentMotherKF;
948 AliExternalTrackParam nt(*negativeparam);
949 AliExternalTrackParam pt(*positiveparam);
951 Float_t magField = fInputEvent->GetMagneticField();
954 if (fImprovedPsiPair==0 ) {
955 v0->GetXYZ(xyz[0],xyz[1],xyz[2]);
956 }
else if (fImprovedPsiPair>=1 ) {
1023 v0->GetNPxPyPz(mn[0],mn[1],mn[2]);
1024 v0->GetPPxPyPz(mp[0],mp[1],mp[2]);
1027 deltat = TMath::ATan(mp[2]/(TMath::Sqrt(mp[0]*mp[0] + mp[1]*mp[1])+1.e-13)) - TMath::ATan(mn[2]/(TMath::Sqrt(mn[0]*mn[0] + mn[1]*mn[1])+1.e-13));
1028 Double_t radiussum = TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]) + 50;
1039 if (fImprovedPsiPair==1 || fImprovedPsiPair==0 ){
1040 if(nt.PropagateTo(radiussum,magField) == 0)
return psiPair;
1041 if(pt.PropagateTo(radiussum,magField) == 0)
return psiPair;
1043 pt.GetPxPyPz(momPosProp);
1044 nt.GetPxPyPz(momNegProp);
1045 }
else if (fImprovedPsiPair>=2) {
1046 momPosProp[0] = pt.GetParameterAtRadius(radiussum,magField,3);
1047 momPosProp[1] = pt.GetParameterAtRadius(radiussum,magField,4);
1048 momPosProp[2] = pt.GetParameterAtRadius(radiussum,magField,5);
1050 momNegProp[0] = nt.GetParameterAtRadius(radiussum,magField,3);
1051 momNegProp[1] = nt.GetParameterAtRadius(radiussum,magField,4);
1052 momNegProp[2] = nt.GetParameterAtRadius(radiussum,magField,5);
1053 pEle = TMath::Sqrt(momNegProp[0]*momNegProp[0]+momNegProp[1]*momNegProp[1]+momNegProp[2]*momNegProp[2]);
1055 pPos = TMath::Sqrt(momPosProp[0]*momPosProp[0]+momPosProp[1]*momPosProp[1]+momPosProp[2]*momPosProp[2]);
1057 if ( (pEle==0 || pPos==0) && fImprovedPsiPair==3) {
1058 radiussum = TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]) + 30;
1059 momPosProp[0] = pt.GetParameterAtRadius(radiussum,magField,3);
1060 momPosProp[1] = pt.GetParameterAtRadius(radiussum,magField,4);
1061 momPosProp[2] = pt.GetParameterAtRadius(radiussum,magField,5);
1063 momNegProp[0] = nt.GetParameterAtRadius(radiussum,magField,3);
1064 momNegProp[1] = nt.GetParameterAtRadius(radiussum,magField,4);
1065 momNegProp[2] = nt.GetParameterAtRadius(radiussum,magField,5);
1070 pEle = TMath::Sqrt(momNegProp[0]*momNegProp[0]+momNegProp[1]*momNegProp[1]+momNegProp[2]*momNegProp[2]);
1071 pPos = TMath::Sqrt(momPosProp[0]*momPosProp[0]+momPosProp[1]*momPosProp[1]+momPosProp[2]*momPosProp[2]);
1074 momPosProp[0]*momNegProp[0]+momPosProp[1]*momNegProp[1]+momPosProp[2]*momNegProp[2];
1076 if (pEle==0 || pPos==0)
return psiPair;
1079 Double_t chipair = TMath::ACos(scalarproduct/(pEle*pPos));
1082 psiPair = TMath::ASin(deltat/chipair);
1092 Double_t b=fInputEvent->GetMagneticField();
1095 track->GetHelixParameters(helix,b);
1099 Double_t radius = TMath::Abs(1./helix[4]);
1103 phi = phi + 2*TMath::Pi();
1106 phi -= TMath::Pi()/2.;
1107 Double_t xpoint = radius * TMath::Cos(phi);
1108 Double_t ypoint = radius * TMath::Sin(phi);
1122 center[0] = xpos + xpoint;
1123 center[1] = ypos + ypoint;
1132 if(!pparam||!nparam)
return kFALSE;
1135 GetHelixCenter(pparam,helixcenterpos);
1138 GetHelixCenter(nparam,helixcenterneg);
1141 pparam->GetHelixParameters(helixpos,fInputEvent->GetMagneticField());
1142 Double_t posradius = TMath::Abs(1./helixpos[4]);
1145 nparam->GetHelixParameters(helixneg,fInputEvent->GetMagneticField());
1146 Double_t negradius = TMath::Abs(1./helixneg[4]);
1155 convpos[0] = (xpos*negradius + xneg*posradius)/(negradius+posradius);
1156 convpos[1] = (ypos*negradius+ yneg*posradius)/(negradius+posradius);
1161 Double_t deltaXPos = convpos[0] - xpos;
1162 Double_t deltaYPos = convpos[1] - ypos;
1164 Double_t deltaXNeg = convpos[0] - xneg;
1165 Double_t deltaYNeg = convpos[1] - yneg;
1167 Double_t alphaPos = TMath::Pi() + TMath::ATan2(-deltaYPos,-deltaXPos);
1168 Double_t alphaNeg = TMath::Pi() + TMath::ATan2(-deltaYNeg,-deltaXNeg);
1170 Double_t vertexXNeg = xneg + TMath::Abs(negradius)*TMath::Cos(alphaNeg);
1171 Double_t vertexYNeg = yneg + TMath::Abs(negradius)*TMath::Sin(alphaNeg);
1173 Double_t vertexXPos = xpos + TMath::Abs(posradius)*TMath::Cos(alphaPos);
1174 Double_t vertexYPos = ypos + TMath::Abs(posradius)*TMath::Sin(alphaPos);
1176 AliExternalTrackParam p(*pparam);
1177 AliExternalTrackParam n(*nparam);
1179 TVector2 vertexPos(vertexXPos,vertexYPos);
1180 TVector2 vertexNeg(vertexXNeg,vertexYNeg);
1183 TVector2 vertexPosRot=vertexPos.Rotate(-p.GetAlpha());
1184 TVector2 vertexNegRot=vertexNeg.Rotate(-n.GetAlpha());
1188 if(!p.PropagateTo(vertexPosRot.X(),fInputEvent->GetMagneticField()))
return kFALSE;
1189 if(!n.PropagateTo(vertexNegRot.X(),fInputEvent->GetMagneticField()))
return kFALSE;
1193 if(TMath::Abs(vertexPos.Mod()-TMath::Sqrt(p.GetX()*p.GetX()+p.GetY()*p.GetY()))>0.01)
return kFALSE;
1194 if(TMath::Abs(vertexNeg.Mod()-TMath::Sqrt(n.GetX()*n.GetX()+n.GetY()*n.GetY()))>0.01)
return kFALSE;
1198 convpos[2] = (p.GetZ()*negradius+n.GetZ()*posradius)/(negradius+posradius);
1201 TVector2 vdca=vertexPos-vertexNeg;
1203 dca[1]=TMath::Abs(n.GetZ()-p.GetZ());
1217 if(fConversionGammas == NULL){
1218 fConversionGammas =
new TClonesArray(
"AliAODConversionPhoton",100);
1220 fConversionGammas->Delete();
1226 TClonesArray *fInputGammas=
dynamic_cast<TClonesArray*
>(fAODEvent->FindListObject(fDeltaAODBranchName.Data()));
1229 FindDeltaAODBranchName();
1230 fInputGammas=
dynamic_cast<TClonesArray*
>(fAODEvent->FindListObject(fDeltaAODBranchName.Data()));}
1231 if(!fInputGammas){AliError(
"No Gamma Satellites found");
return kFALSE;}
1234 for(
Int_t i=0;i<fInputGammas->GetEntriesFast();i++){
1237 if(fRelabelAODs)RelabelAODPhotonCandidates(gamma);
1238 if(fConversionCuts->PhotonIsSelected(gamma,fInputEvent)){
1245 if(fConversionGammas->GetEntries()){
return kTRUE;}
1255 TList *list=fInputEvent->GetList();
1256 for(
Int_t ii=0;ii<list->GetEntries();ii++){
1257 TString name((list->At(ii))->GetName());
1258 if(name.BeginsWith(fDeltaAODBranchName)&&name.EndsWith(
"gamma")){
1259 fDeltaAODBranchName=name;
1260 AliInfo(Form(
"Set DeltaAOD BranchName to: %s",fDeltaAODBranchName.Data()));
1269 if(fPreviousV0ReaderPerformsAODRelabeling == 2)
return;
1270 else if(fPreviousV0ReaderPerformsAODRelabeling == 0){
1271 printf(
"Running AODs! Determine if V0Reader '%s' should perform relabeling\n",this->GetName());
1273 Int_t iPosition = obj->IndexOf(
this);
1274 Bool_t prevV0ReaderRunningButNotRelabeling = kFALSE;
1275 for(
Int_t i=iPosition-1; i>=0; i--){
1276 if( (obj->At(i))->IsA() == AliV0ReaderV1::Class()){
1279 fPreviousV0ReaderPerformsAODRelabeling = 2;
1280 prevV0ReaderRunningButNotRelabeling = kFALSE;
1281 printf(
"V0Reader '%s' is running before this V0Reader '%s': do _NOT_ relabel AODs by current reader!\n",tempReader->GetName(),this->GetName());
1283 }
else prevV0ReaderRunningButNotRelabeling = kTRUE;
1286 if(prevV0ReaderRunningButNotRelabeling) AliFatal(Form(
"There are V0Readers before '%s', but none of them is relabeling!",this->GetName()));
1288 if(fPreviousV0ReaderPerformsAODRelabeling == 2)
return;
1290 printf(
"This V0Reader '%s' is first to be processed: do relabel AODs by current reader!\n",this->GetName());
1291 fPreviousV0ReaderPerformsAODRelabeling = 1;
1295 if(fPreviousV0ReaderPerformsAODRelabeling != 1) AliFatal(Form(
"In %s: fPreviousV0ReaderPerformsAODRelabeling = '%i' - while it should be impossible it is something different than '1'!",this->GetName(),fPreviousV0ReaderPerformsAODRelabeling));
1300 Bool_t AODLabelPos = kFALSE;
1301 Bool_t AODLabelNeg = kFALSE;
1303 for(
Int_t i = 0; i<fInputEvent->GetNumberOfTracks();i++){
1304 AliAODTrack *tempDaughter =
static_cast<AliAODTrack*
>(fInputEvent->GetTrack(i));
1309 AODLabelPos = kTRUE;
1316 AODLabelNeg = kTRUE;
1319 if(AODLabelNeg && AODLabelPos){
1323 if(!AODLabelPos || !AODLabelNeg){
1356 if(fInputEvent->IsA()==AliESDEvent::Class()){
1357 static AliESDtrackCuts *EsdTrackCuts = 0x0;
1358 static int prevRun = -1;
1360 Int_t runNumber = fInputEvent->GetRunNumber();
1362 if (prevRun!=runNumber) {
1363 delete EsdTrackCuts;
1365 prevRun = runNumber;
1367 if (!EsdTrackCuts) {
1369 if( (runNumber<=146860) || (runNumber>=197470 && runNumber<=197692) || (runNumber>=172440 && runNumber<=193766) ){
1370 EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010();
1372 }
else if (runNumber>=209122){
1375 EsdTrackCuts =
new AliESDtrackCuts();
1377 EsdTrackCuts->AliESDtrackCuts::SetMinNCrossedRowsTPC(70);
1378 EsdTrackCuts->AliESDtrackCuts::SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
1379 EsdTrackCuts->SetCutGeoNcrNcl(2., 130., 1.5, 0.0, 0.0);
1381 EsdTrackCuts->AliESDtrackCuts::SetMaxChi2PerClusterTPC(4);
1382 EsdTrackCuts->AliESDtrackCuts::SetAcceptKinkDaughters(kFALSE);
1383 EsdTrackCuts->AliESDtrackCuts::SetRequireTPCRefit(kTRUE);
1385 EsdTrackCuts->AliESDtrackCuts::SetRequireITSRefit(kTRUE);
1386 EsdTrackCuts->AliESDtrackCuts::SetClusterRequirementITS(AliESDtrackCuts::kSPD,
1387 AliESDtrackCuts::kAny);
1388 EsdTrackCuts->AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(
"0.0105+0.0350/pt^1.1");
1389 EsdTrackCuts->AliESDtrackCuts::SetMaxChi2TPCConstrainedGlobal(36);
1390 EsdTrackCuts->AliESDtrackCuts::SetMaxDCAToVertexZ(2);
1391 EsdTrackCuts->AliESDtrackCuts::SetDCAToVertex2D(kFALSE);
1392 EsdTrackCuts->AliESDtrackCuts::SetRequireSigmaToVertex(kFALSE);
1393 EsdTrackCuts->AliESDtrackCuts::SetMaxChi2PerClusterITS(36);
1396 EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
1398 EsdTrackCuts->SetMaxDCAToVertexZ(2);
1399 EsdTrackCuts->SetEtaRange(-0.8, 0.8);
1400 EsdTrackCuts->SetPtRange(0.15);
1402 fNumberOfPrimaryTracks = 0;
1403 for(
Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
1404 AliESDtrack* curTrack = (AliESDtrack*) fInputEvent->GetTrack(iTracks);
1405 if(!curTrack)
continue;
1406 if(!EsdTrackCuts->AcceptTrack(curTrack))
continue;
1408 fNumberOfPrimaryTracks++;
1411 else if(fInputEvent->IsA()==AliAODEvent::Class()){
1412 fNumberOfPrimaryTracks = 0;
1413 for(
Int_t iTracks = 0; iTracks<fInputEvent->GetNumberOfTracks(); iTracks++){
1414 AliAODTrack* curTrack = (AliAODTrack*) fInputEvent->GetTrack(iTracks);
1415 if(curTrack->GetID()<0)
continue;
1416 if(!curTrack->IsHybridGlobalConstrainedGlobal())
continue;
1417 if(TMath::Abs(curTrack->Eta())>0.8)
continue;
1418 if(curTrack->Pt()<0.15)
continue;
1421 fNumberOfPrimaryTracks++;
1430 fNumberOfTPCoutTracks = 0;
1432 for (
Int_t itrk = 0; itrk < fInputEvent->GetNumberOfTracks(); itrk++) {
1433 AliVTrack *trk =
dynamic_cast<AliVTrack*
>(fInputEvent->GetTrack(itrk));
1437 if (!(trk->Pt() < 0.15) && (TMath::Abs(trk->Eta()) < 0.8)) {
1438 if ((trk->GetStatus() & AliVTrack::kTPCout) == AliVTrack::kTPCout) {
1439 fNumberOfTPCoutTracks++;
1452 if(!mcEvent)
return kFALSE;
1454 if (particle->GetPdgCode() == 22){
1456 if( TMath::Abs(particle->Eta()) > etaMax )
return kFALSE;
1458 if(particle->GetMother(0) >-1 && mcEvent->Particle(particle->GetMother(0))->GetPdgCode() == 22){
1462 TParticle* ePos = NULL;
1463 TParticle* eNeg = NULL;
1464 if(particle->GetNDaughters() >= 2){
1465 for(
Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
1466 if(daughterIndex<0)
continue;
1467 TParticle *tmpDaughter = mcEvent->Particle(daughterIndex);
1468 if(tmpDaughter->GetUniqueID() == 5){
1469 if(tmpDaughter->GetPdgCode() == 11){
1471 }
else if(tmpDaughter->GetPdgCode() == -11){
1477 if(ePos == NULL || eNeg == NULL){
1481 if( TMath::Abs(ePos->Eta()) > etaMax ||
1482 TMath::Abs(eNeg->Eta()) > etaMax )
1486 if(ePos->R() > rMax){
1489 if(TMath::Abs(ePos->Vz()) > zMax){
1492 if(TMath::Abs(eNeg->Vz()) > zMax){
1497 Double_t lineCutZRSlope = tan(2*atan(exp(-etaMax)));
1499 if( ePos->R() <= ((TMath::Abs(ePos->Vz()) * lineCutZRSlope) - lineCutZValue)){
1502 if( eNeg->R() <= ((TMath::Abs(eNeg->Vz()) * lineCutZRSlope) - lineCutZValue)){
1505 if (ePos->Pt() < 0.05 || eNeg->Pt() < 0.05){
1516 const AliVVertex* primVtxMC = fMCEvent->GetPrimaryVertex();
1517 Double_t mcProdVtxX = primVtxMC->GetX();
1518 Double_t mcProdVtxY = primVtxMC->GetY();
1519 Double_t mcProdVtxZ = primVtxMC->GetZ();
1523 for(Long_t i = 0; i < fMCEvent->GetNumberOfTracks(); i++) {
1524 if (fEventCuts->IsConversionPrimaryESD( fMCEvent, i, mcProdVtxX, mcProdVtxY, mcProdVtxZ)){
1526 TParticle* particle = (TParticle *)fMCEvent->Particle(i);
1527 if (!particle)
continue;
1528 if (ParticleIsConvertedPhoton(fMCEvent, particle, 0.9, 180.,250. )){
1529 if(particle->GetFirstDaughter()<0)
continue;
1530 TParticle *tmpDaughter = fMCEvent->Particle(particle->GetFirstDaughter());
1531 if (!tmpDaughter)
continue;
1532 fHistoMCGammaPtvsR->Fill(particle->Pt(),tmpDaughter->R());
1533 fHistoMCGammaPtvsPhi->Fill(particle->Pt(),particle->Phi());
1534 fHistoMCGammaRvsPhi->Fill(tmpDaughter->R(),particle->Phi());
1536 if (ParticleIsConvertedPhoton(fMCEvent, particle, 1.4, 180.,250. )){
1537 if(particle->GetFirstDaughter()<0)
continue;
1538 TParticle *tmpDaughter = fMCEvent->Particle(particle->GetFirstDaughter());
1539 if (!tmpDaughter)
continue;
1540 fHistoMCGammaPtvsEta->Fill(particle->Pt(),particle->Eta());
1541 fHistoMCGammaRvsEta->Fill(tmpDaughter->R(),particle->Eta());
1542 fHistoMCGammaPhivsEta->Fill(particle->Phi(),particle->Eta());
1551 const AliVVertex* primVtxMC = fMCEvent->GetPrimaryVertex();
1552 Double_t mcProdVtxX = primVtxMC->GetX();
1553 Double_t mcProdVtxY = primVtxMC->GetY();
1554 Double_t mcProdVtxZ = primVtxMC->GetZ();
1557 Int_t tracklabelPos=currentV0->GetPindex();
1558 Int_t tracklabelNeg=currentV0->GetNindex();
1560 Int_t labelp=TMath::Abs(fConversionCuts->GetTrack(fInputEvent,tracklabelPos)->GetLabel());
1561 Int_t labeln=TMath::Abs(fConversionCuts->GetTrack(fInputEvent,tracklabelNeg)->GetLabel());
1563 TParticle* negPart = 0x0;
1564 if(labeln>-1) negPart = (TParticle *)fMCEvent->Particle(labeln);
1565 TParticle* posPart = 0x0;
1566 if(labelp>-1) posPart = (TParticle *)fMCEvent->Particle(labelp);
1568 if ( negPart == NULL || posPart == NULL )
return;
1571 Long_t motherlabelNeg = negPart->GetFirstMother();
1572 Long_t motherlabelPos = posPart->GetFirstMother();
1575 if (motherlabelNeg>-1 && motherlabelNeg == motherlabelPos && negPart->GetFirstMother() != -1){
1576 if (fEventCuts->IsConversionPrimaryESD( fMCEvent, negPart->GetFirstMother(), mcProdVtxX, mcProdVtxY, mcProdVtxZ)){
1578 TParticle* mother = (TParticle *)fMCEvent->Particle(motherlabelNeg);
1579 if (mother->GetPdgCode() == 22 ){
1580 if (!CheckVectorForDoubleCount(fVectorFoundGammas,motherlabelNeg ) ){
1581 if (ParticleIsConvertedPhoton(fMCEvent, mother, 0.9, 180.,250. )){
1582 fHistoRecMCGammaPtvsR->Fill(mother->Pt(),negPart->R());
1583 fHistoRecMCGammaPtvsPhi->Fill(mother->Pt(),mother->Phi());
1584 fHistoRecMCGammaRvsPhi->Fill(negPart->R(),mother->Phi());
1586 if (ParticleIsConvertedPhoton(fMCEvent, mother, 1.4, 180.,250. )){
1587 fHistoRecMCGammaPtvsEta->Fill(mother->Pt(),mother->Eta());
1588 fHistoRecMCGammaRvsEta->Fill(negPart->R(),mother->Eta());
1589 fHistoRecMCGammaPhivsEta->Fill(mother->Phi(),mother->Eta());
1593 if (ParticleIsConvertedPhoton(fMCEvent, mother, 0.9, 180.,250. )){
1594 fHistoRecMCGammaMultiPt->Fill(mother->Pt());
1595 fHistoRecMCGammaMultiPhi->Fill(mother->Phi());
1596 fHistoRecMCGammaMultiR->Fill(negPart->R());
1598 if (ParticleIsConvertedPhoton(fMCEvent, mother, 1.4, 180.,250. )){
1599 fHistoRecMCGammaMultiPtvsEta->Fill(mother->Pt(),mother->Eta());
1617 Int_t kMaxTPCV0Conflicts = 1;
1621 fCurrentV0->GetXYZ(convX,convY,convZ);
1622 Double_t convR = TMath::Sqrt(convX*convX+convY*convY);
1630 fHistoImpactParameterStudy->Fill(0);
1633 AliESDtrack* positiveTrack = (AliESDtrack*) pTrack;
1634 AliESDtrack* negativeTrack = (AliESDtrack*) nTrack;
1636 if (!positiveTrack->IsOn(AliESDtrack::kITSin) && !negativeTrack->IsOn(AliESDtrack::kITSin)){
1637 fHistoImpactParameterStudy->Fill(1);
1641 Bool_t RemovedByZcut = kFALSE;
1642 Bool_t RemovedByYcut = kFALSE;
1647 if(((TMath::Abs(positiveTrack->GetZ()))>fZmax) || ((TMath::Abs(negativeTrack->GetZ()))>fZmax)){
1648 fHistoImpactParameterStudy->Fill(2);
1649 RemovedByZcut=kTRUE;
1653 if(((TMath::Abs(positiveTrack->GetY()))>fYmax) || ((TMath::Abs(negativeTrack->GetY()))>fYmax)){
1654 fHistoImpactParameterStudy->Fill(3);
1655 RemovedByYcut=kTRUE;
1660 Bool_t RemovedByCausality=kFALSE;
1663 85.225, 85.975, 86.725, 87.475, 88.225, 88.975, 89.725, 90.475, 91.225, 91.975, 92.725, 93.475, 94.225, 94.975, 95.725,
1664 96.475, 97.225, 97.975, 98.725, 99.475,100.225,100.975,101.725,102.475,103.225,103.975,104.725,105.475,106.225,106.975,
1665 107.725,108.475,109.225,109.975,110.725,111.475,112.225,112.975,113.725,114.475,115.225,115.975,116.725,117.475,118.225,
1666 118.975,119.725,120.475,121.225,121.975,122.725,123.475,124.225,124.975,125.725,126.475,127.225,127.975,128.725,129.475,
1667 130.225,130.975,131.725,135.100,136.100,137.100,138.100,139.100,140.100,141.100,142.100,143.100,144.100,145.100,146.100,
1668 147.100,148.100,149.100,150.100,151.100,152.100,153.100,154.100,155.100,156.100,157.100,158.100,159.100,160.100,161.100,
1669 162.100,163.100,164.100,165.100,166.100,167.100,168.100,169.100,170.100,171.100,172.100,173.100,174.100,175.100,176.100,
1670 177.100,178.100,179.100,180.100,181.100,182.100,183.100,184.100,185.100,186.100,187.100,188.100,189.100,190.100,191.100,
1671 192.100,193.100,194.100,195.100,196.100,197.100,198.100,199.350,200.850,202.350,203.850,205.350,206.850,208.350,209.850,
1672 211.350,212.850,214.350,215.850,217.350,218.850,220.350,221.850,223.350,224.850,226.350,227.850,229.350,230.850,232.350,
1673 233.850,235.350,236.850,238.350,239.850,241.350,242.850,244.350,245.850};
1676 fHistoR->Fill(convR);
1677 fHistoRrecalc->Fill(convRrecalc);
1678 Double_t alpha = TMath::ATan2(convY,convX);
1679 if (alpha<0) alpha += TMath::Pi()*2;
1680 Int_t sec = alpha/(TMath::Pi()/9);
1681 alpha = (10.+sec*20.)*TMath::DegToRad();
1684 Double_t xsV0 = convX*cs - convY*sn;
1685 fHistoRviaAlpha->Fill(xsV0);
1686 Double_t alpha_r = TMath::ATan2(convYrecalc,convXrecalc);
1687 if (alpha_r<0) alpha_r += TMath::Pi()*2;
1688 Int_t sec_r = alpha_r/(TMath::Pi()/9);
1689 alpha_r = (10.+sec_r*20.)*TMath::DegToRad();
1690 Double_t cs_r = TMath::Cos(alpha_r);
1691 Double_t sn_r = TMath::Sin(alpha_r);
1692 Double_t xsV0_r = convXrecalc*cs_r - convYrecalc*sn_r;
1693 fHistoRviaAlphaRecalc->Fill(xsV0_r);
1696 fHistoImpactParameterStudy->Fill(4);
1698 for (
Int_t it=2;it--;) {
1699 Int_t trId = fCurrentV0->GetIndex(it);
1700 AliESDtrack* tr = fESDEvent->GetTrack(trId);
1701 const TBits& bits = tr->GetTPCClusterMap();
1702 Int_t nConflict = 0;
1703 for (
Int_t ic=0;ic<159;ic++) {
1704 if (rTPC[ic]>(xsV0-kTPCMargin))
break;
1705 if (bits.TestBitNumber(ic)){
1707 fHistoRdiff->Fill(xsV0-rTPC[ic]);
1709 if (nConflict>kMaxTPCV0Conflicts) {
1710 fHistoImpactParameterStudy->Fill(5);
1711 RemovedByCausality=kTRUE;
1719 Bool_t RemovedByAnyCut=kFALSE;
1720 if(RemovedByZcut||RemovedByYcut||RemovedByCausality){
1721 fHistoImpactParameterStudy->Fill(6);
1722 RemovedByAnyCut=kTRUE;
1735 fImpactParamTree->Branch(
"posPt",&posPt,
"posPt/F");
1736 fImpactParamTree->Branch(
"posY",&posY,
"posY/F");
1737 fImpactParamTree->Branch(
"R",&R,
"R/F");
1738 posZ = positiveTrack->GetZ();
1739 posY = positiveTrack->GetY();
1740 posX = positiveTrack->GetX();
1741 posPt = positiveTrack->Pt();
1742 negZ = negativeTrack->GetZ();
1743 negY = negativeTrack->GetY();
1744 negX = negativeTrack->GetX();
1745 negPt = negativeTrack->Pt();
1747 fImpactParamTree->Fill();
1750 fHistoPosTrackImpactParamZ->Fill(posZ);
1751 fHistoPosTrackImpactParamY->Fill(posY);
1752 fHistoPosTrackImpactParamX->Fill(posX);
1753 fHistoPosTrackImpactParamZvsPt->Fill(posPt, posZ);
1754 fHistoPosTrackImpactParamYvsPt->Fill(posPt, posY);
1755 fHistoPosTrackImpactParamXvsPt->Fill(posPt, posX);
1756 fHistoNegTrackImpactParamZ->Fill(negZ);
1757 fHistoNegTrackImpactParamY->Fill(negY);
1758 fHistoNegTrackImpactParamX->Fill(negX);
1759 fHistoNegTrackImpactParamZvsPt->Fill(negPt, negZ);
1760 fHistoNegTrackImpactParamYvsPt->Fill(negPt, negY);
1761 fHistoNegTrackImpactParamXvsPt->Fill(negPt, negX);
1764 fHistoPt->Fill(positiveTrack->Pt());
1765 fHistoImpactParamZvsR->Fill(convZrecalc,convRrecalc);
1773 fHistoDCAzPhoton->Fill(DCAzPhoton);
1774 if(!RemovedByAnyCut) {
1775 fHistoPt2->Fill(positiveTrack->Pt());
1776 fHistoImpactParamZvsR2->Fill(convZrecalc,convRrecalc);
1777 fHistoDCAzPhoton2->Fill(DCAzPhoton);
1786 if(tobechecked > -1)
1788 vector<Int_t>::iterator it;
1789 it = find (vec.begin(), vec.end(), tobechecked);
1790 if (it != vec.end())
return true;
1799 if(tobechecked > -1)
1801 vector<Int_t>::iterator it;
1802 it = find (vec.begin(), vec.end(), tobechecked);
1803 if (it != vec.end())
return true;
1805 vec.push_back(tobechecked);
1821 fCurrentIndex(position),
1828 fkData(other.fkData),
1829 fCurrentIndex(other.fCurrentIndex),
1830 fDirection(other.fDirection)
1844 if(fkData != other.
fkData)
return true;
1879 return (*fkData)[fCurrentIndex];
Int_t IsReaderPerformingRelabeling()
Direction_t fDirection
Iterator in forward direction.
Bool_t ParticleIsConvertedPhoton(AliMCEvent *mcEvent, TParticle *particle, Double_t etaMax, Double_t rMax, Double_t zMax)
anchored LHC13[d-e] pass 2 - JJ
void FindDeltaAODBranchName()
void SetConversionPoint(Double_t convpoint[3])
Bool_t CheckVectorForDoubleCount(vector< Int_t > &vec, Int_t tobechecked)
void SetMCLabelNegative(Int_t label)
Bool_t AreAODsRelabeled()
const AliV0ReaderV1 * fkData
V0 reader used to iterate over.
void CreatePureMCHistosForV0FinderEffiESD()
AliConversionPhotonBase * operator*()
Double_t GetConversionZ() const
Float_t GetDCAzToPrimVtx() const
Double_t GetPsiPair(const AliESDv0 *v0, const AliExternalTrackParam *positiveparam, const AliExternalTrackParam *negativeparam, const Double_t convpos[3]) const
void FillRecMCHistosForV0FinderEffiESD(AliESDv0 *currentV0)
Bool_t CheckVectorOnly(vector< Int_t > &vec, Int_t tobechecked)
anchored LHC16f pass 1 low B-field - Pythia8 JJ
anchored LHC13g pass 1 - JJ
anchored LHC13g pass 1 - JJ
int fCurrentIndex
Index of the current element.
Bool_t ProcessEvent(AliVEvent *inputEvent, AliMCEvent *mcEvent=NULL)
void SetMCLabelPositive(Int_t label)
Int_t GetTrackLabelNegative() const
void ConstructGamma(const AliKFParticle &fCurrentNegativeKFParticle, const AliKFParticle &fCurrentPositiveKFParticle)
Int_t GetTrackLabelPositive() const
void SetV0Index(Int_t index)
void SetInvMassPair(Float_t mass)
iterator(const AliV0ReaderV1 *reader, Direction_t dir, int position)
Bool_t GetHelixCenter(const AliExternalTrackParam *track, Double_t center[2])
void RelabelAODPhotonCandidates(AliAODConversionPhoton *PhotonCandidate)
anchored LHC12[a-h] pass 2 - JJ
void SetChi2perNDF(Float_t chi2)
anchored LHC13[d-e] pass 2 - GJ
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
iterator & operator=(const iterator &other)
void SetMass(Float_t mass)
Double_t GetConversionY() const
anchored LHC13[d-e] pass 2 - JJ
void SetTrackLabels(Int_t label1, Int_t label2)
anchored LHC11a pass 4 - JJ
virtual void Terminate(Option_t *)
const AliExternalTrackParam * GetExternalTrackParam(AliESDv0 *fCurrentV0, Int_t &tracklabel, Int_t charge)
anchored LHC13g pass 1 - JJ
AliKFConversionPhoton * ReconstructV0(AliESDv0 *fCurrentV0, Int_t currentV0Index)
void SetLabelPositive(Int_t label)
Track labels.
void SetLabelNegative(Int_t label)
bool operator!=(iterator &other) const
TFile * file
TList with histograms for a given trigger.
anchored LHC12[a-h] pass 2 - JJ - additional stat
void SetPsiPair(Float_t PsiPair)
void FillImpactParamHistograms(AliVTrack *ptrack, AliVTrack *ntrack, AliESDv0 *fCurrentV0, AliKFConversionPhoton *fCurrentMotherKF)
AliConversionPhotonBase * operator[](int index) const
Array index operator.
anchored LHC11a pass 4 - JJ
anchored LHC16x pass 1 nom B-field - Pythia8 JJ
Bool_t GetConversionPoint(const AliExternalTrackParam *pparam, const AliExternalTrackParam *nparam, Double_t convpos[3], Double_t dca[2])
Bool_t GetAODConversionGammas()
void UserCreateOutputObjects()
virtual void UserExec(Option_t *option)
Double_t GetConversionRadius() const
Double_t GetConversionX() const