1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: Ana Marin, Kathrin Koch, Kenneth Aamodt *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // Class used to do analysis on conversion pairs
19 //---------------------------------------------
20 ////////////////////////////////////////////////
26 #include "AliAnalysisTaskGammaConversion.h"
29 #include "AliESDtrackCuts.h"
31 //#include "AliCFManager.h" // for CF
32 //#include "AliCFContainer.h" // for CF
33 #include "AliGammaConversionAODObject.h"
34 #include "AliGammaConversionBGHandler.h"
43 class AliMCEventHandler;
44 class AliESDInputHandler;
45 class AliAnalysisManager;
52 ClassImp(AliAnalysisTaskGammaConversion)
55 AliAnalysisTaskGammaConversion::AliAnalysisTaskGammaConversion():
59 fMCTruth(NULL), // for CF
60 fGCMCEvent(NULL), // for CF
62 fOutputContainer(NULL),
63 fCFManager(0x0), // for CF
65 fTriggerCINT1B(kFALSE),
67 fDoNeutralMeson(kFALSE),
70 fKFReconstructedGammasTClone(NULL),
71 fCurrentEventPosElectronTClone(NULL),
72 fCurrentEventNegElectronTClone(NULL),
73 fKFReconstructedGammasCutTClone(NULL),
74 fPreviousEventTLVNegElectronTClone(NULL),
75 fPreviousEventTLVPosElectronTClone(NULL),
85 fMinOpeningAngleGhostCut(0.),
87 fCalculateBackground(kFALSE),
90 fNeutralMesonNtuple(NULL),
91 fTotalNumberOfAddedNtupleEntries(0),
92 fChargedParticles(NULL),
93 fChargedParticlesId(),
95 fMinPtForGammaJet(1.),
98 fMinPtGamChargedCorr(0.5),
100 fLeadingChargedIndex(-1),
105 fAODBranchName("GammaConv"),
106 fDoNeutralMesonV0MCCheck(kFALSE),
107 fKFReconstructedGammasV0Index()
109 // Default constructor
111 /* Kenneth: the default constructor should not have any define input/output or the call to SetESDtrackCuts
112 // Common I/O in slot 0
113 DefineInput (0, TChain::Class());
114 DefineOutput(0, TTree::Class());
116 // Your private output
117 DefineOutput(1, TList::Class());
119 // Define standard ESD track cuts for Gamma-hadron correlation
124 AliAnalysisTaskGammaConversion::AliAnalysisTaskGammaConversion(const char* name):
125 AliAnalysisTaskSE(name),
128 fMCTruth(NULL), // for CF
129 fGCMCEvent(NULL), // for CF
131 fOutputContainer(0x0),
132 fCFManager(0x0), // for CF
134 fTriggerCINT1B(kFALSE),
136 fDoNeutralMeson(kFALSE),
139 fKFReconstructedGammasTClone(NULL),
140 fCurrentEventPosElectronTClone(NULL),
141 fCurrentEventNegElectronTClone(NULL),
142 fKFReconstructedGammasCutTClone(NULL),
143 fPreviousEventTLVNegElectronTClone(NULL),
144 fPreviousEventTLVPosElectronTClone(NULL),
154 fMinOpeningAngleGhostCut(0.),
156 fCalculateBackground(kFALSE),
157 fWriteNtuple(kFALSE),
159 fNeutralMesonNtuple(NULL),
160 fTotalNumberOfAddedNtupleEntries(0),
161 fChargedParticles(NULL),
162 fChargedParticlesId(),
164 fMinPtForGammaJet(1.),
165 fMinIsoConeSize(0.2),
167 fMinPtGamChargedCorr(0.5),
169 fLeadingChargedIndex(-1),
174 fAODBranchName("GammaConv"),
175 fDoNeutralMesonV0MCCheck(kFALSE),
176 fKFReconstructedGammasV0Index()
178 // Common I/O in slot 0
179 DefineInput (0, TChain::Class());
180 DefineOutput(0, TTree::Class());
182 // Your private output
183 DefineOutput(1, TList::Class());
184 DefineOutput(2, AliCFContainer::Class()); // for CF
187 // Define standard ESD track cuts for Gamma-hadron correlation
191 AliAnalysisTaskGammaConversion::~AliAnalysisTaskGammaConversion()
193 // Remove all pointers
195 if(fOutputContainer){
196 fOutputContainer->Clear() ;
197 delete fOutputContainer ;
212 delete fEsdTrackCuts;
222 void AliAnalysisTaskGammaConversion::Init()
225 // AliLog::SetGlobalLogLevel(AliLog::kError);
227 void AliAnalysisTaskGammaConversion::SetESDtrackCuts()
230 if (fEsdTrackCuts!=NULL){
231 delete fEsdTrackCuts;
233 fEsdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
234 //standard cuts from:
235 //http://aliceinfo.cern.ch/alicvs/viewvc/PWG0/dNdEta/CreateCuts.C?revision=1.4&view=markup
236 fEsdTrackCuts->SetMinNClustersTPC(50);
237 fEsdTrackCuts->SetMaxChi2PerClusterTPC(3.5);
238 fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
239 fEsdTrackCuts->SetRequireITSRefit(kTRUE);
240 fEsdTrackCuts->SetMaxNsigmaToVertex(3);
241 fEsdTrackCuts->SetRequireSigmaToVertex(kTRUE);
242 // fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);
243 // fV0Reader->SetESDtrackCuts(fEsdTrackCuts);
246 void AliAnalysisTaskGammaConversion::UserExec(Option_t */*option*/)
248 // Execute analysis for current event
249 ConnectInputData("");
251 //Each event needs an empty branch
252 // fAODBranch->Clear();
253 fAODBranch->Delete();
255 if(fKFReconstructedGammasTClone == NULL){
256 fKFReconstructedGammasTClone = new TClonesArray("AliKFParticle",0);
258 if(fCurrentEventPosElectronTClone == NULL){
259 fCurrentEventPosElectronTClone = new TClonesArray("AliESDtrack",0);
261 if(fCurrentEventNegElectronTClone == NULL){
262 fCurrentEventNegElectronTClone = new TClonesArray("AliESDtrack",0);
264 if(fKFReconstructedGammasCutTClone == NULL){
265 fKFReconstructedGammasCutTClone = new TClonesArray("AliKFParticle",0);
267 if(fPreviousEventTLVNegElectronTClone == NULL){
268 fPreviousEventTLVNegElectronTClone = new TClonesArray("TLorentzVector",0);
270 if(fPreviousEventTLVPosElectronTClone == NULL){
271 fPreviousEventTLVPosElectronTClone = new TClonesArray("TLorentzVector",0);
273 if(fChargedParticles == NULL){
274 fChargedParticles = new TClonesArray("AliESDtrack",0);
278 fKFReconstructedGammasTClone->Delete();
279 fCurrentEventPosElectronTClone->Delete();
280 fCurrentEventNegElectronTClone->Delete();
281 fKFReconstructedGammasCutTClone->Delete();
282 fPreviousEventTLVNegElectronTClone->Delete();
283 fPreviousEventTLVPosElectronTClone->Delete();
289 fChargedParticles->Delete();
291 fChargedParticlesId.clear();
293 fKFReconstructedGammasV0Index.clear();
295 //Clear the data in the v0Reader
296 // fV0Reader->UpdateEventByEventData();
298 //Take Only events with proper trigger
301 if(!fV0Reader->GetESDEvent()->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL")) return;
305 // Process the MC information
310 //Process the v0 information with no cuts
313 // Process the v0 information
318 FillAODWithConversionGammas() ;
320 // Process reconstructed gammas
321 if(fDoNeutralMeson == kTRUE){
322 ProcessGammasForNeutralMesonAnalysis();
325 if(fDoMCTruth == kTRUE){
328 //Process reconstructed gammas electrons for Chi_c Analysis
329 if(fDoChic == kTRUE){
330 ProcessGammaElectronsForChicAnalysis();
332 // Process reconstructed gammas for gamma Jet/hadron correlations
334 ProcessGammasForGammaJetAnalysis();
337 //calculate background if flag is set
338 if(fCalculateBackground){
339 CalculateBackground();
342 //Clear the data in the v0Reader
343 fV0Reader->UpdateEventByEventData();
345 PostData(1, fOutputContainer);
346 PostData(2, fCFManager->GetParticleContainer()); // for CF
350 void AliAnalysisTaskGammaConversion::ConnectInputData(Option_t *option){
351 // see header file for documentation
353 AliAnalysisTaskSE::ConnectInputData(option);
355 if(fV0Reader == NULL){
356 // Write warning here cuts and so on are default if this ever happens
358 fV0Reader->Initialize();
359 fDoMCTruth = fV0Reader->GetDoMCTruth();
364 void AliAnalysisTaskGammaConversion::ProcessMCData(){
365 // see header file for documentation
367 fStack = fV0Reader->GetMCStack();
368 fMCTruth = fV0Reader->GetMCTruth(); // for CF
369 fGCMCEvent = fV0Reader->GetMCEvent(); // for CF
373 Double_t containerInput[3];
375 if(!fGCMCEvent) cout << "NO MC INFO FOUND" << endl;
376 fCFManager->SetEventInfo(fGCMCEvent);
381 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
382 return; // aborts if the primary vertex does not have contributors.
385 for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++) {
386 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
393 ///////////////////////Begin Chic Analysis/////////////////////////////
395 if(particle->GetPdgCode() == 443){//Is JPsi
396 if(particle->GetNDaughters()==2){
397 if(TMath::Abs(fStack->Particle(particle->GetFirstDaughter())->GetPdgCode()) == 11 &&
398 TMath::Abs(fStack->Particle(particle->GetLastDaughter())->GetPdgCode()) == 11){
399 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
400 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
401 if(TMath::Abs(daug0->Eta()) < 0.9 && TMath::Abs(daug1->Eta()) < 0.9)
402 fHistograms->FillTable("Table_Electrons",3);//e+ e- from J/Psi inside acceptance
404 if( TMath::Abs(daug0->Eta()) < 0.9){
405 if(daug0->GetPdgCode() == -11)
406 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
408 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
411 if(TMath::Abs(daug1->Eta()) < 0.9){
412 if(daug1->GetPdgCode() == -11)
413 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
415 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
420 // const int CHI_C0 = 10441;
421 // const int CHI_C1 = 20443;
422 // const int CHI_C2 = 445
423 if(particle->GetPdgCode() == 22){//gamma from JPsi
424 if(particle->GetMother(0) > -1){
425 if(fStack->Particle(particle->GetMother(0))->GetPdgCode() == 10441 ||
426 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 20443 ||
427 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 445){
428 if(TMath::Abs(particle->Eta()) < 1.2)
429 fHistograms->FillTable("Table_Electrons",17);// gamma from chic inside accptance
433 if(particle->GetPdgCode() == 10441 || particle->GetPdgCode() == 20443 || particle->GetPdgCode() == 445){
434 if( particle->GetNDaughters() == 2){
435 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
436 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
438 if( (daug0->GetPdgCode() == 443 || daug0->GetPdgCode() == 22) && (daug1->GetPdgCode() == 443 || daug1->GetPdgCode() == 22) ){
439 if( daug0->GetPdgCode() == 443){
440 TParticle* daugE0 = fStack->Particle(daug0->GetFirstDaughter());
441 TParticle* daugE1 = fStack->Particle(daug0->GetLastDaughter());
442 if( TMath::Abs(daug1->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
443 fHistograms->FillTable("Table_Electrons",18);
446 else if (daug1->GetPdgCode() == 443){
447 TParticle* daugE0 = fStack->Particle(daug1->GetFirstDaughter());
448 TParticle* daugE1 = fStack->Particle(daug1->GetLastDaughter());
449 if( TMath::Abs(daug0->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
450 fHistograms->FillTable("Table_Electrons",18);
457 /////////////////////End Chic Analysis////////////////////////////
460 if(TMath::Abs(particle->Eta())> fV0Reader->GetEtaCut() ) continue;
462 if(particle->R()>fV0Reader->GetMaxRCut()) continue; // cuts on distance from collision point
464 Double_t tmpPhi=particle->Phi();
466 if(particle->Phi()> TMath::Pi()){
467 tmpPhi = particle->Phi()-(2*TMath::Pi());
471 if(particle->Energy() - particle->Pz() == 0 || particle->Energy() + particle->Pz() == 0){
475 rapidity = 0.5*(TMath::Log((particle->Energy()+particle->Pz()) / (particle->Energy()-particle->Pz())));
479 if (particle->GetPdgCode() == 22){
482 if(particle->GetMother(0) >-1 && fStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
483 continue; // no photon as mothers!
486 if(particle->GetMother(0) >= fStack->GetNprimary()){
487 continue; // the gamma has a mother, and it is not a primary particle
490 fHistograms->FillHistogram("MC_allGamma_Energy", particle->Energy());
491 fHistograms->FillHistogram("MC_allGamma_Pt", particle->Pt());
492 fHistograms->FillHistogram("MC_allGamma_Eta", particle->Eta());
493 fHistograms->FillHistogram("MC_allGamma_Phi", tmpPhi);
494 fHistograms->FillHistogram("MC_allGamma_Rapid", rapidity);
498 containerInput[0] = particle->Pt();
499 containerInput[1] = particle->Eta();
500 if(particle->GetMother(0) >=0){
501 containerInput[2] = fStack->Particle(particle->GetMother(0))->GetMass();
504 containerInput[2]=-1;
507 fCFManager->GetParticleContainer()->Fill(containerInput,kStepGenerated); // generated gamma
509 if(particle->GetMother(0) < 0){ // direct gamma
510 fHistograms->FillHistogram("MC_allDirectGamma_Energy",particle->Energy());
511 fHistograms->FillHistogram("MC_allDirectGamma_Pt", particle->Pt());
512 fHistograms->FillHistogram("MC_allDirectGamma_Eta", particle->Eta());
513 fHistograms->FillHistogram("MC_allDirectGamma_Phi", tmpPhi);
514 fHistograms->FillHistogram("MC_allDirectGamma_Rapid", rapidity);
517 // looking for conversion (electron + positron from pairbuilding (= 5) )
518 TParticle* ePos = NULL;
519 TParticle* eNeg = NULL;
521 if(particle->GetNDaughters() >= 2){
522 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
523 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
524 if(tmpDaughter->GetUniqueID() == 5){
525 if(tmpDaughter->GetPdgCode() == 11){
528 else if(tmpDaughter->GetPdgCode() == -11){
536 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
541 Double_t ePosPhi = ePos->Phi();
542 if(ePos->Phi()> TMath::Pi()) ePosPhi = ePos->Phi()-(2*TMath::Pi());
544 Double_t eNegPhi = eNeg->Phi();
545 if(eNeg->Phi()> TMath::Pi()) eNegPhi = eNeg->Phi()-(2*TMath::Pi());
548 if(ePos->Pt()<fV0Reader->GetPtCut() || eNeg->Pt()<fV0Reader->GetPtCut()){
549 continue; // no reconstruction below the Pt cut
552 if(TMath::Abs(ePos->Eta())> fV0Reader->GetEtaCut() || TMath::Abs(eNeg->Eta())> fV0Reader->GetEtaCut()){
556 if(ePos->R()>fV0Reader->GetMaxRCut()){
557 continue; // cuts on distance from collision point
560 if(TMath::Abs(ePos->Vz()) > fV0Reader->GetMaxZCut()){
561 continue; // outside material
565 if((TMath::Abs(ePos->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() > ePos->R()){
566 continue; // line cut to exclude regions where we do not reconstruct
572 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructable); // reconstructable gamma
574 fHistograms->FillHistogram("MC_ConvGamma_Energy", particle->Energy());
575 fHistograms->FillHistogram("MC_ConvGamma_Pt", particle->Pt());
576 fHistograms->FillHistogram("MC_ConvGamma_Eta", particle->Eta());
577 fHistograms->FillHistogram("MC_ConvGamma_Phi", tmpPhi);
578 fHistograms->FillHistogram("MC_ConvGamma_Rapid", rapidity);
579 fHistograms->FillHistogram("MC_ConvGamma_Pt_Eta", particle->Pt(),particle->Eta());
581 fHistograms->FillHistogram("MC_E_Energy", eNeg->Energy());
582 fHistograms->FillHistogram("MC_E_Pt", eNeg->Pt());
583 fHistograms->FillHistogram("MC_E_Eta", eNeg->Eta());
584 fHistograms->FillHistogram("MC_E_Phi", eNegPhi);
586 fHistograms->FillHistogram("MC_P_Energy", ePos->Energy());
587 fHistograms->FillHistogram("MC_P_Pt", ePos->Pt());
588 fHistograms->FillHistogram("MC_P_Eta", ePos->Eta());
589 fHistograms->FillHistogram("MC_P_Phi", ePosPhi);
593 Int_t rBin = fHistograms->GetRBin(ePos->R());
594 Int_t zBin = fHistograms->GetZBin(ePos->Vz());
595 Int_t phiBin = fHistograms->GetPhiBin(particle->Phi());
597 TVector3 vtxPos(ePos->Vx(),ePos->Vy(),ePos->Vz());
599 TString nameMCMappingPhiR="";
600 nameMCMappingPhiR.Form("MC_Conversion_Mapping_Phi%02d_R%02d",phiBin,rBin);
601 fHistograms->FillHistogram(nameMCMappingPhiR, ePos->Vz(), particle->Eta());
603 TString nameMCMappingPhi="";
604 nameMCMappingPhi.Form("MC_Conversion_Mapping_Phi%02d",phiBin);
605 // fHistograms->FillHistogram(nameMCMappingPhi, particle->Eta());
606 fHistograms->FillHistogram(nameMCMappingPhi, ePos->Vz(), particle->Eta());
608 TString nameMCMappingR="";
609 nameMCMappingR.Form("MC_Conversion_Mapping_R%02d",rBin);
610 // fHistograms->FillHistogram(nameMCMappingR, particle->Eta());
611 fHistograms->FillHistogram(nameMCMappingR,ePos->Vz(), particle->Eta());
613 TString nameMCMappingPhiInR="";
614 nameMCMappingPhiInR.Form("MC_Conversion_Mapping_Phi_in_R_%02d",rBin);
615 // fHistograms->FillHistogram(nameMCMappingPhiInR, tmpPhi);
616 fHistograms->FillHistogram(nameMCMappingPhiInR, vtxPos.Phi());
618 TString nameMCMappingZInR="";
619 nameMCMappingZInR.Form("MC_Conversion_Mapping_Z_in_R_%02d",rBin);
620 fHistograms->FillHistogram(nameMCMappingZInR,ePos->Vz() );
623 TString nameMCMappingPhiInZ="";
624 nameMCMappingPhiInZ.Form("MC_Conversion_Mapping_Phi_in_Z_%02d",zBin);
625 // fHistograms->FillHistogram(nameMCMappingPhiInR, tmpPhi);
626 fHistograms->FillHistogram(nameMCMappingPhiInZ, vtxPos.Phi());
628 TString nameMCMappingRInZ="";
629 nameMCMappingRInZ.Form("MC_Conversion_Mapping_R_in_Z_%02d",zBin);
630 fHistograms->FillHistogram(nameMCMappingRInZ,ePos->R() );
632 if(particle->Pt() > fLowPtMapping && particle->Pt()< fHighPtMapping){
633 TString nameMCMappingMidPtPhiInR="";
634 nameMCMappingMidPtPhiInR.Form("MC_Conversion_Mapping_MidPt_Phi_in_R_%02d",rBin);
635 fHistograms->FillHistogram(nameMCMappingMidPtPhiInR, vtxPos.Phi());
637 TString nameMCMappingMidPtZInR="";
638 nameMCMappingMidPtZInR.Form("MC_Conversion_Mapping_MidPt_Z_in_R_%02d",rBin);
639 fHistograms->FillHistogram(nameMCMappingMidPtZInR,ePos->Vz() );
642 TString nameMCMappingMidPtPhiInZ="";
643 nameMCMappingMidPtPhiInZ.Form("MC_Conversion_Mapping_MidPt_Phi_in_Z_%02d",zBin);
644 fHistograms->FillHistogram(nameMCMappingMidPtPhiInZ, vtxPos.Phi());
646 TString nameMCMappingMidPtRInZ="";
647 nameMCMappingMidPtRInZ.Form("MC_Conversion_Mapping_MidPt_R_in_Z_%02d",zBin);
648 fHistograms->FillHistogram(nameMCMappingMidPtRInZ,ePos->R() );
654 fHistograms->FillHistogram("MC_Conversion_R",ePos->R());
655 fHistograms->FillHistogram("MC_Conversion_ZR",ePos->Vz(),ePos->R());
656 fHistograms->FillHistogram("MC_Conversion_XY",ePos->Vx(),ePos->Vy());
657 fHistograms->FillHistogram("MC_Conversion_OpeningAngle",GetMCOpeningAngle(ePos, eNeg));
658 fHistograms->FillHistogram("MC_ConvGamma_E_AsymmetryP",particle->P(),eNeg->P()/particle->P());
659 fHistograms->FillHistogram("MC_ConvGamma_P_AsymmetryP",particle->P(),ePos->P()/particle->P());
662 if(particle->GetMother(0) < 0){ // no mother = direct gamma, still inside converted
663 fHistograms->FillHistogram("MC_ConvDirectGamma_Energy",particle->Energy());
664 fHistograms->FillHistogram("MC_ConvDirectGamma_Pt", particle->Pt());
665 fHistograms->FillHistogram("MC_ConvDirectGamma_Eta", particle->Eta());
666 fHistograms->FillHistogram("MC_ConvDirectGamma_Phi", tmpPhi);
667 fHistograms->FillHistogram("MC_ConvDirectGamma_Rapid", rapidity);
669 } // end direct gamma
670 else{ // mother exits
671 /* if( fStack->Particle(particle->GetMother(0))->GetPdgCode()==10441 ||//chic0
672 fStack->Particle(particle->GetMother(0))->GetPdgCode()==20443 ||//psi2S
673 fStack->Particle(particle->GetMother(0))->GetPdgCode()==445 //chic2
675 fMCGammaChic.push_back(particle);
678 } // end if mother exits
679 } // end if particle is a photon
683 // process motherparticles (2 gammas as daughters)
684 // the motherparticle had already to pass the R and the eta cut, but no line cut.
685 // the line cut is just valid for the conversions!
687 if(particle->GetNDaughters() == 2){
689 TParticle* daughter0 = (TParticle*)fStack->Particle(particle->GetFirstDaughter());
690 TParticle* daughter1 = (TParticle*)fStack->Particle(particle->GetLastDaughter());
692 if(daughter0->GetPdgCode() != 22 || daughter1->GetPdgCode() != 22) continue; //check for gamma gamma daughters
694 // Check the acceptance for both gammas
695 Bool_t gammaEtaCut = kTRUE;
696 if(TMath::Abs(daughter0->Eta()) > fV0Reader->GetEtaCut() || TMath::Abs(daughter1->Eta()) > fV0Reader->GetEtaCut() ) gammaEtaCut = kFALSE;
697 Bool_t gammaRCut = kTRUE;
698 if(daughter0->R() > fV0Reader->GetMaxRCut() || daughter1->R() > fV0Reader->GetMaxRCut() ) gammaRCut = kFALSE;
702 // check for conversions now -> have to pass eta, R and line cut!
703 Bool_t daughter0Electron = kFALSE;
704 Bool_t daughter0Positron = kFALSE;
705 Bool_t daughter1Electron = kFALSE;
706 Bool_t daughter1Positron = kFALSE;
708 if(daughter0->GetNDaughters() >= 2){ // first gamma
709 for(Int_t TrackIndex=daughter0->GetFirstDaughter();TrackIndex<=daughter0->GetLastDaughter();TrackIndex++){
710 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
711 if(tmpDaughter->GetUniqueID() == 5){
712 if(tmpDaughter->GetPdgCode() == 11){
713 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
714 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
715 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
716 daughter0Electron = kTRUE;
722 else if(tmpDaughter->GetPdgCode() == -11){
723 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
724 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
725 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
726 daughter0Positron = kTRUE;
736 if(daughter1->GetNDaughters() >= 2){ // second gamma
737 for(Int_t TrackIndex=daughter1->GetFirstDaughter();TrackIndex<=daughter1->GetLastDaughter();TrackIndex++){
738 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
739 if(tmpDaughter->GetUniqueID() == 5){
740 if(tmpDaughter->GetPdgCode() == 11){
741 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
742 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
743 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
744 daughter1Electron = kTRUE;
750 else if(tmpDaughter->GetPdgCode() == -11){
751 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
752 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
753 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
754 daughter1Positron = kTRUE;
766 if(particle->GetPdgCode()==111){ //Pi0
767 if( iTracks >= fStack->GetNprimary()){
768 fHistograms->FillHistogram("MC_Pi0_Secondaries_Eta", particle->Eta());
769 fHistograms->FillHistogram("MC_Pi0_Secondaries_Rapid", rapidity);
770 fHistograms->FillHistogram("MC_Pi0_Secondaries_Phi", tmpPhi);
771 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt", particle->Pt());
772 fHistograms->FillHistogram("MC_Pi0_Secondaries_Energy", particle->Energy());
773 fHistograms->FillHistogram("MC_Pi0_Secondaries_R", particle->R());
774 fHistograms->FillHistogram("MC_Pi0_Secondaries_ZR", particle->Vz(),particle->R());
775 fHistograms->FillHistogram("MC_Pi0_Secondaries_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
776 fHistograms->FillHistogram("MC_Pi0_Secondaries_XY", particle->Vx(),particle->Vy());//only fill from one daughter to avoid multiple filling
778 if(gammaEtaCut && gammaRCut){
779 //if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
780 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
781 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
782 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
783 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
784 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
789 fHistograms->FillHistogram("MC_Pi0_Eta", particle->Eta());
790 fHistograms->FillHistogram("MC_Pi0_Rapid", rapidity);
791 fHistograms->FillHistogram("MC_Pi0_Phi", tmpPhi);
792 fHistograms->FillHistogram("MC_Pi0_Pt", particle->Pt());
793 fHistograms->FillHistogram("MC_Pi0_Energy", particle->Energy());
794 fHistograms->FillHistogram("MC_Pi0_R", particle->R());
795 fHistograms->FillHistogram("MC_Pi0_ZR", particle->Vz(),particle->R());
796 fHistograms->FillHistogram("MC_Pi0_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
797 fHistograms->FillHistogram("MC_Pi0_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
799 if(gammaEtaCut && gammaRCut){
800 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
801 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
802 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
803 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
804 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
805 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
806 fHistograms->FillHistogram("MC_Pi0_ZR_ConvGamma_withinAcceptance", particle->Vz(),particle->R());
812 if(particle->GetPdgCode()==221){ //Eta
813 fHistograms->FillHistogram("MC_Eta_Eta", particle->Eta());
814 fHistograms->FillHistogram("MC_Eta_Rapid", rapidity);
815 fHistograms->FillHistogram("MC_Eta_Phi",tmpPhi);
816 fHistograms->FillHistogram("MC_Eta_Pt", particle->Pt());
817 fHistograms->FillHistogram("MC_Eta_Energy", particle->Energy());
818 fHistograms->FillHistogram("MC_Eta_R", particle->R());
819 fHistograms->FillHistogram("MC_Eta_ZR", particle->Vz(),particle->R());
820 fHistograms->FillHistogram("MC_Eta_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
821 fHistograms->FillHistogram("MC_Eta_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
823 if(gammaEtaCut && gammaRCut){
824 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
825 fHistograms->FillHistogram("MC_Eta_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
826 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
827 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
828 fHistograms->FillHistogram("MC_Eta_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
829 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
830 fHistograms->FillHistogram("MC_Eta_ZR_ConvGamma_withinAcceptance", particle->Vz(),particle->R());
837 // all motherparticles with 2 gammas as daughters
838 fHistograms->FillHistogram("MC_Mother_R", particle->R());
839 fHistograms->FillHistogram("MC_Mother_ZR", particle->Vz(),particle->R());
840 fHistograms->FillHistogram("MC_Mother_XY", particle->Vx(),particle->Vy());
841 fHistograms->FillHistogram("MC_Mother_Mass", particle->GetCalcMass());
842 fHistograms->FillHistogram("MC_Mother_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
843 fHistograms->FillHistogram("MC_Mother_Energy", particle->Energy());
844 fHistograms->FillHistogram("MC_Mother_Pt", particle->Pt());
845 fHistograms->FillHistogram("MC_Mother_Eta", particle->Eta());
846 fHistograms->FillHistogram("MC_Mother_Rapid", rapidity);
847 fHistograms->FillHistogram("MC_Mother_Phi",tmpPhi);
848 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt",particle->GetMass(),particle->Pt());
850 if(gammaEtaCut && gammaRCut){
851 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
852 fHistograms->FillHistogram("MC_Mother_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
853 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
854 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_withinAcceptance",particle->GetMass(),particle->Pt());
855 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
856 fHistograms->FillHistogram("MC_Mother_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
857 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
858 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_ConvGamma_withinAcceptance",particle->GetMass(),particle->Pt());
863 } // end passed R and eta cut
865 } // end if(particle->GetNDaughters() == 2)
867 }// end for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++)
869 } // end ProcessMCData
873 void AliAnalysisTaskGammaConversion::FillNtuple(){
874 //Fills the ntuple with the different values
876 if(fGammaNtuple == NULL){
879 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
880 for(Int_t i=0;i<numberOfV0s;i++){
881 Float_t values[27] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
882 AliESDv0 * cV0 = fV0Reader->GetV0(i);
885 fV0Reader->GetPIDProbability(negPID,posPID);
886 values[0]=cV0->GetOnFlyStatus();
887 values[1]=fV0Reader->CheckForPrimaryVertex();
890 values[4]=fV0Reader->GetX();
891 values[5]=fV0Reader->GetY();
892 values[6]=fV0Reader->GetZ();
893 values[7]=fV0Reader->GetXYRadius();
894 values[8]=fV0Reader->GetMotherCandidateNDF();
895 values[9]=fV0Reader->GetMotherCandidateChi2();
896 values[10]=fV0Reader->GetMotherCandidateEnergy();
897 values[11]=fV0Reader->GetMotherCandidateEta();
898 values[12]=fV0Reader->GetMotherCandidatePt();
899 values[13]=fV0Reader->GetMotherCandidateMass();
900 values[14]=fV0Reader->GetMotherCandidateWidth();
901 // values[15]=fV0Reader->GetMotherMCParticle()->Pt(); MOVED TO THE END, HAS TO BE CALLED AFTER HasSameMother NB: still has the same entry in the array
902 values[16]=fV0Reader->GetOpeningAngle();
903 values[17]=fV0Reader->GetNegativeTrackEnergy();
904 values[18]=fV0Reader->GetNegativeTrackPt();
905 values[19]=fV0Reader->GetNegativeTrackEta();
906 values[20]=fV0Reader->GetNegativeTrackPhi();
907 values[21]=fV0Reader->GetPositiveTrackEnergy();
908 values[22]=fV0Reader->GetPositiveTrackPt();
909 values[23]=fV0Reader->GetPositiveTrackEta();
910 values[24]=fV0Reader->GetPositiveTrackPhi();
911 values[25]=fV0Reader->HasSameMCMother();
913 values[26]=fV0Reader->GetMotherMCParticlePDGCode();
914 values[15]=fV0Reader->GetMotherMCParticle()->Pt();
916 fTotalNumberOfAddedNtupleEntries++;
917 fGammaNtuple->Fill(values);
919 fV0Reader->ResetV0IndexNumber();
923 void AliAnalysisTaskGammaConversion::ProcessV0sNoCut(){
924 // Process all the V0's without applying any cuts to it
926 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
927 for(Int_t i=0;i<numberOfV0s;i++){
928 /*AliESDv0 * cV0 = */fV0Reader->GetV0(i);
930 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
934 // if( !fV0Reader->GetV0(i)->GetOnFlyStatus()){
935 if( !fV0Reader->CheckV0FinderStatus(i)){
940 if( !((fV0Reader->GetNegativeESDTrack())->GetStatus() & AliESDtrack::kTPCrefit) ||
941 !((fV0Reader->GetPositiveESDTrack())->GetStatus() & AliESDtrack::kTPCrefit) ){
947 if(fV0Reader->HasSameMCMother() == kFALSE){
951 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
952 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
954 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
957 if(negativeMC->GetPdgCode() == positiveMC->GetPdgCode()){
961 if(negativeMC->GetUniqueID() != 5 || positiveMC->GetUniqueID() !=5){ // id 5 is conversion
965 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
967 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
968 fHistograms->FillHistogram("ESD_NoCutConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
969 fHistograms->FillHistogram("ESD_NoCutConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
970 fHistograms->FillHistogram("ESD_NoCutConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
971 fHistograms->FillHistogram("ESD_NoCutConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
972 fHistograms->FillHistogram("ESD_NoCutConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
973 fHistograms->FillHistogram("ESD_NoCutConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
974 fHistograms->FillHistogram("ESD_NoCutConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
975 fHistograms->FillHistogram("ESD_NoCutConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
976 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
978 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
979 fHistograms->FillHistogram("ESD_NoCutConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
981 fHistograms->FillHistogram("ESD_NoCutConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
982 fHistograms->FillHistogram("ESD_NoCutConversion_R", fV0Reader->GetXYRadius());
983 fHistograms->FillHistogram("ESD_NoCutConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
984 fHistograms->FillHistogram("ESD_NoCutConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
985 fHistograms->FillHistogram("ESD_NoCutConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
986 fHistograms->FillHistogram("ESD_NoCutConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
987 fHistograms->FillHistogram("ESD_NoCutConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
988 fHistograms->FillHistogram("ESD_NoCutConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
990 fHistograms->FillHistogram("ESD_NoCutConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
991 fHistograms->FillHistogram("ESD_NoCutConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
992 fHistograms->FillHistogram("ESD_NoCutConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
993 fHistograms->FillHistogram("ESD_NoCutConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
995 //store MCTruth properties
996 fHistograms->FillHistogram("ESD_NoCutConvGamma_MC_Pt_Eta", fV0Reader->GetMotherMCParticle()->Pt(),fV0Reader->GetMotherMCParticle()->Eta());
997 fHistograms->FillHistogram("ESD_NoCutConversion_MC_ZR", negativeMC->Vz(),negativeMC->R());
998 fHistograms->FillHistogram("ESD_NoCutConversion_MC_XY", negativeMC->Vx(),negativeMC->Vy());
1002 fV0Reader->ResetV0IndexNumber();
1005 void AliAnalysisTaskGammaConversion::ProcessV0s(){
1006 // see header file for documentation
1009 if(fWriteNtuple == kTRUE){
1013 Int_t nSurvivingV0s=0;
1014 while(fV0Reader->NextV0()){
1018 //-------------------------- filling v0 information -------------------------------------
1019 fHistograms->FillHistogram("ESD_Conversion_R", fV0Reader->GetXYRadius());
1020 fHistograms->FillHistogram("ESD_Conversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1021 fHistograms->FillHistogram("ESD_Conversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1022 fHistograms->FillHistogram("ESD_Conversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1024 fHistograms->FillHistogram("ESD_E_Energy", fV0Reader->GetNegativeTrackEnergy());
1025 fHistograms->FillHistogram("ESD_E_Pt", fV0Reader->GetNegativeTrackPt());
1026 fHistograms->FillHistogram("ESD_E_Eta", fV0Reader->GetNegativeTrackEta());
1027 fHistograms->FillHistogram("ESD_E_Phi", fV0Reader->GetNegativeTrackPhi());
1029 fHistograms->FillHistogram("ESD_P_Energy", fV0Reader->GetPositiveTrackEnergy());
1030 fHistograms->FillHistogram("ESD_P_Pt", fV0Reader->GetPositiveTrackPt());
1031 fHistograms->FillHistogram("ESD_P_Eta", fV0Reader->GetPositiveTrackEta());
1032 fHistograms->FillHistogram("ESD_P_Phi", fV0Reader->GetPositiveTrackPhi());
1034 fHistograms->FillHistogram("ESD_ConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1035 fHistograms->FillHistogram("ESD_ConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1036 fHistograms->FillHistogram("ESD_ConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1037 fHistograms->FillHistogram("ESD_ConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1038 fHistograms->FillHistogram("ESD_ConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1039 fHistograms->FillHistogram("ESD_ConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1040 fHistograms->FillHistogram("ESD_ConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1041 fHistograms->FillHistogram("ESD_ConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1042 fHistograms->FillHistogram("ESD_ConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1043 fHistograms->FillHistogram("ESD_ConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1045 fHistograms->FillHistogram("ESD_ConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1046 fHistograms->FillHistogram("ESD_ConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1048 fHistograms->FillHistogram("ESD_ConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1049 fHistograms->FillHistogram("ESD_ConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1050 fHistograms->FillHistogram("ESD_ConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1051 fHistograms->FillHistogram("ESD_ConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1053 fHistograms->FillHistogram("ESD_ConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1054 fHistograms->FillHistogram("ESD_ConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1055 fHistograms->FillHistogram("ESD_ConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1056 fHistograms->FillHistogram("ESD_ConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1060 Int_t rBin = fHistograms->GetRBin(fV0Reader->GetXYRadius());
1061 Int_t zBin = fHistograms->GetZBin(fV0Reader->GetZ());
1062 Int_t phiBin = fHistograms->GetPhiBin(fV0Reader->GetNegativeTrackPhi());
1063 TVector3 vtxConv(fV0Reader->GetX(),fV0Reader->GetY(), fV0Reader->GetZ());
1065 Double_t motherCandidateEta= fV0Reader->GetMotherCandidateEta();
1067 TString nameESDMappingPhiR="";
1068 nameESDMappingPhiR.Form("ESD_Conversion_Mapping_Phi%02d_R%02d",phiBin,rBin);
1069 fHistograms->FillHistogram(nameESDMappingPhiR, fV0Reader->GetZ(), motherCandidateEta);
1071 TString nameESDMappingPhi="";
1072 nameESDMappingPhi.Form("ESD_Conversion_Mapping_Phi%02d",phiBin);
1073 fHistograms->FillHistogram(nameESDMappingPhi, fV0Reader->GetZ(), motherCandidateEta);
1075 TString nameESDMappingR="";
1076 nameESDMappingR.Form("ESD_Conversion_Mapping_R%02d",rBin);
1077 fHistograms->FillHistogram(nameESDMappingR, fV0Reader->GetZ(), motherCandidateEta);
1079 TString nameESDMappingPhiInR="";
1080 nameESDMappingPhiInR.Form("ESD_Conversion_Mapping_Phi_in_R_%02d",rBin);
1081 // fHistograms->FillHistogram(nameESDMappingPhiInR, fV0Reader->GetMotherCandidatePhi());
1082 fHistograms->FillHistogram(nameESDMappingPhiInR, vtxConv.Phi());
1084 TString nameESDMappingZInR="";
1085 nameESDMappingZInR.Form("ESD_Conversion_Mapping_Z_in_R_%02d",rBin);
1086 fHistograms->FillHistogram(nameESDMappingZInR, fV0Reader->GetZ());
1088 TString nameESDMappingPhiInZ="";
1089 nameESDMappingPhiInZ.Form("ESD_Conversion_Mapping_Phi_in_Z_%02d",zBin);
1090 // fHistograms->FillHistogram(nameESDMappingPhiInR, fV0Reader->GetMotherCandidatePhi());
1091 fHistograms->FillHistogram(nameESDMappingPhiInZ, vtxConv.Phi());
1093 TString nameESDMappingRInZ="";
1094 nameESDMappingRInZ.Form("ESD_Conversion_Mapping_R_in_Z_%02d",zBin);
1095 fHistograms->FillHistogram(nameESDMappingRInZ, fV0Reader->GetXYRadius());
1097 if(fV0Reader->GetMotherCandidatePt() > fLowPtMapping && fV0Reader->GetMotherCandidatePt()< fHighPtMapping){
1098 TString nameESDMappingMidPtPhiInR="";
1099 nameESDMappingMidPtPhiInR.Form("ESD_Conversion_Mapping_MidPt_Phi_in_R_%02d",rBin);
1100 fHistograms->FillHistogram(nameESDMappingMidPtPhiInR, vtxConv.Phi());
1102 TString nameESDMappingMidPtZInR="";
1103 nameESDMappingMidPtZInR.Form("ESD_Conversion_Mapping_MidPt_Z_in_R_%02d",rBin);
1104 fHistograms->FillHistogram(nameESDMappingMidPtZInR, fV0Reader->GetZ());
1106 TString nameESDMappingMidPtPhiInZ="";
1107 nameESDMappingMidPtPhiInZ.Form("ESD_Conversion_Mapping_MidPt_Phi_in_Z_%02d",zBin);
1108 fHistograms->FillHistogram(nameESDMappingMidPtPhiInZ, vtxConv.Phi());
1110 TString nameESDMappingMidPtRInZ="";
1111 nameESDMappingMidPtRInZ.Form("ESD_Conversion_Mapping_MidPt_R_in_Z_%02d",zBin);
1112 fHistograms->FillHistogram(nameESDMappingMidPtRInZ, fV0Reader->GetXYRadius());
1119 new((*fKFReconstructedGammasTClone)[fKFReconstructedGammasTClone->GetEntriesFast()]) AliKFParticle(*fV0Reader->GetMotherCandidateKFCombination());
1120 fKFReconstructedGammasV0Index.push_back(fV0Reader->GetCurrentV0IndexNumber()-1);
1121 // fKFReconstructedGammas.push_back(*fV0Reader->GetMotherCandidateKFCombination());
1122 fElectronv1.push_back(fV0Reader->GetCurrentV0()->GetPindex());
1123 fElectronv2.push_back(fV0Reader->GetCurrentV0()->GetNindex());
1125 //----------------------------------- checking for "real" conversions (MC match) --------------------------------------
1128 if(fV0Reader->HasSameMCMother() == kFALSE){
1131 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1132 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1134 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
1138 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
1141 if(negativeMC->GetUniqueID() == 4 && positiveMC->GetUniqueID() ==4){// fill r distribution for Dalitz decays
1142 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 111){ //pi0
1143 fHistograms->FillHistogram("ESD_TrueDalitzContamination_R", fV0Reader->GetXYRadius());
1147 if(negativeMC->GetUniqueID() != 5 || positiveMC->GetUniqueID() !=5){// check if the daughters come from a conversion
1151 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1154 Double_t containerInput[3];
1155 containerInput[0] = fV0Reader->GetMotherCandidatePt();
1156 containerInput[1] = fV0Reader->GetMotherCandidateEta();
1157 containerInput[2] = fV0Reader->GetMotherCandidateMass();
1158 fCFManager->GetParticleContainer()->Fill(containerInput,kStepTrueGamma); // for CF
1161 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1162 fHistograms->FillHistogram("ESD_TrueConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1163 fHistograms->FillHistogram("ESD_TrueConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1164 fHistograms->FillHistogram("ESD_TrueConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1165 fHistograms->FillHistogram("ESD_TrueConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1166 fHistograms->FillHistogram("ESD_TrueConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1167 fHistograms->FillHistogram("ESD_TrueConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1168 fHistograms->FillHistogram("ESD_TrueConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1169 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1170 fHistograms->FillHistogram("ESD_TrueConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1171 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters());
1172 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters());
1173 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters(),fV0Reader->GetMotherCandidateMass());
1174 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters(),fV0Reader->GetMotherCandidateMass());
1176 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1177 fHistograms->FillHistogram("ESD_TrueConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1180 fHistograms->FillHistogram("ESD_TrueConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1181 fHistograms->FillHistogram("ESD_TrueConversion_R", fV0Reader->GetXYRadius());
1182 fHistograms->FillHistogram("ESD_TrueConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1183 fHistograms->FillHistogram("ESD_TrueConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1185 fHistograms->FillHistogram("ESD_TrueConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1186 fHistograms->FillHistogram("ESD_TrueConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1187 fHistograms->FillHistogram("ESD_TrueConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1188 fHistograms->FillHistogram("ESD_TrueConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1190 fHistograms->FillHistogram("ESD_TrueConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1191 fHistograms->FillHistogram("ESD_TrueConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1192 fHistograms->FillHistogram("ESD_TrueConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1193 fHistograms->FillHistogram("ESD_TrueConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1197 //store MCTruth properties
1198 fHistograms->FillHistogram("ESD_TrueConvGamma_MC_Pt_Eta", fV0Reader->GetMotherMCParticle()->Pt(),fV0Reader->GetMotherMCParticle()->Eta());
1199 fHistograms->FillHistogram("ESD_TrueConversion_MC_ZR", negativeMC->Vz(),negativeMC->R());
1200 fHistograms->FillHistogram("ESD_TrueConversion_MC_XY", negativeMC->Vx(),negativeMC->Vy());
1203 Double_t mcpt = fV0Reader->GetMotherMCParticle()->Pt();
1204 Double_t esdpt = fV0Reader->GetMotherCandidatePt();
1205 Double_t resdPt = 0;
1207 resdPt = ((esdpt - mcpt)/mcpt)*100;
1210 cout<<"Pt of MC particle is negative, this will cause wrong calculation of resPt"<<endl;
1213 fHistograms->FillHistogram("Resolution_dPt", mcpt, resdPt);
1214 fHistograms->FillHistogram("Resolution_MC_Pt", mcpt);
1215 fHistograms->FillHistogram("Resolution_ESD_Pt", esdpt);
1218 if(fV0Reader->GetNegativeMCParticle()->Vz() != 0){
1219 resdZ = ((fV0Reader->GetZ() -fV0Reader->GetNegativeMCParticle()->Vz())/fV0Reader->GetNegativeMCParticle()->Vz())*100;
1221 Double_t resdZAbs = 0;
1222 resdZAbs = (fV0Reader->GetZ() -fV0Reader->GetNegativeMCParticle()->Vz());
1224 fHistograms->FillHistogram("Resolution_dZAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdZAbs);
1225 fHistograms->FillHistogram("Resolution_dZ", fV0Reader->GetNegativeMCParticle()->Vz(), resdZ);
1226 fHistograms->FillHistogram("Resolution_MC_Z", fV0Reader->GetNegativeMCParticle()->Vz());
1227 fHistograms->FillHistogram("Resolution_ESD_Z", fV0Reader->GetZ());
1230 if(fV0Reader->GetNegativeMCParticle()->R() != 0){
1231 resdR = ((fV0Reader->GetXYRadius() - fV0Reader->GetNegativeMCParticle()->R())/fV0Reader->GetNegativeMCParticle()->R())*100;
1233 Double_t resdRAbs = 0;
1234 resdRAbs = (fV0Reader->GetXYRadius() - fV0Reader->GetNegativeMCParticle()->R());
1236 fHistograms->FillHistogram("Resolution_dRAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdRAbs);
1237 fHistograms->FillHistogram("Resolution_dR", fV0Reader->GetNegativeMCParticle()->R(), resdR);
1238 fHistograms->FillHistogram("Resolution_MC_R", fV0Reader->GetNegativeMCParticle()->R());
1239 fHistograms->FillHistogram("Resolution_ESD_R", fV0Reader->GetXYRadius());
1240 fHistograms->FillHistogram("Resolution_dR_dPt", resdR, resdPt);
1242 Double_t resdPhiAbs=0;
1244 resdPhiAbs= (fV0Reader->GetMotherCandidatePhi()-fV0Reader->GetNegativeMCParticle()->Phi());
1245 fHistograms->FillHistogram("Resolution_dPhiAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdPhiAbs);
1247 }//if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22)
1249 }//while(fV0Reader->NextV0)
1250 fHistograms->FillHistogram("ESD_NumberOfSurvivingV0s", nSurvivingV0s);
1251 fHistograms->FillHistogram("ESD_NumberOfV0s", fV0Reader->GetNumberOfV0s());
1252 fHistograms->FillHistogram("ESD_NumberOfContributorsVtx", fV0Reader->GetNumberOfContributorsVtx());
1254 fV0Reader->ResetV0IndexNumber();
1258 void AliAnalysisTaskGammaConversion::FillAODWithConversionGammas(){
1259 // Fill AOD with reconstructed Gamma
1261 for(Int_t gammaIndex=0;gammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();gammaIndex++){
1262 // for(UInt_t gammaIndex=0;gammaIndex<fKFReconstructedGammas.size();gammaIndex++){
1263 //Create AOD particle object from AliKFParticle
1265 /* AliKFParticle * gammakf = &fKFReconstructedGammas[gammaIndex];
1266 //You could add directly AliKFParticle objects to the AOD, avoiding dependences with PartCorr
1267 //but this means that I have to work a little bit more in my side.
1268 //AODPWG4Particle objects are simpler and lighter, I think
1269 AliAODPWG4Particle gamma = AliAODPWG4Particle(gammakf->Px(),gammakf->Py(),gammakf->Pz(), gammakf->E());
1270 gamma.SetLabel(-1);//How to get the MC label of the reconstructed gamma?
1271 gamma.SetCaloLabel(-1,-1); //How to get the MC label of the 2 electrons that form the gamma?
1272 gamma.SetDetector("CTS"); //tag the gamma as reconstructed in the central barrel
1273 gamma.SetPdg(AliCaloPID::kPhotonConv); //photon id
1274 gamma.SetTag(-1); //Here I usually put a flag saying that montecarlo says it is prompt, decay fragmentation photon, or hadrons or whatever
1276 //Add it to the aod list
1277 Int_t i = fAODBranch->GetEntriesFast();
1278 new((*fAODBranch)[i]) AliAODPWG4Particle(gamma);
1280 // AliKFParticle * gammakf = &fKFReconstructedGammas[gammaIndex];
1281 AliKFParticle * gammakf = (AliKFParticle *)fKFReconstructedGammasTClone->At(gammaIndex);
1282 AliGammaConversionAODObject aodObject;
1283 aodObject.SetPx(gammakf->GetPx());
1284 aodObject.SetPy(gammakf->GetPy());
1285 aodObject.SetPz(gammakf->GetPz());
1286 aodObject.SetLabel1(fElectronv1[gammaIndex]);
1287 aodObject.SetLabel2(fElectronv2[gammaIndex]);
1288 Int_t i = fAODBranch->GetEntriesFast();
1289 new((*fAODBranch)[i]) AliGammaConversionAODObject(aodObject);
1295 void AliAnalysisTaskGammaConversion::ProcessGammasForNeutralMesonAnalysis(){
1296 // see header file for documentation
1298 // for(UInt_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammas.size();firstGammaIndex++){
1299 // for(UInt_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFReconstructedGammas.size();secondGammaIndex++){
1301 if(fKFReconstructedGammasTClone->GetEntriesFast()>fV0Reader->GetNumberOfV0s()){
1302 cout<<"Warning, number of entries in the tclone is bigger than number of v0s"<<endl;
1305 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
1306 for(Int_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();secondGammaIndex++){
1308 // AliKFParticle * twoGammaDecayCandidateDaughter0 = &fKFReconstructedGammas[firstGammaIndex];
1309 // AliKFParticle * twoGammaDecayCandidateDaughter1 = &fKFReconstructedGammas[secondGammaIndex];
1311 AliKFParticle * twoGammaDecayCandidateDaughter0 = (AliKFParticle *)fKFReconstructedGammasTClone->At(firstGammaIndex);
1312 AliKFParticle * twoGammaDecayCandidateDaughter1 = (AliKFParticle *)fKFReconstructedGammasTClone->At(secondGammaIndex);
1314 if(fElectronv1[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv1[firstGammaIndex]==fElectronv2[secondGammaIndex]){
1317 if(fElectronv2[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv2[firstGammaIndex]==fElectronv2[secondGammaIndex]){
1321 AliKFParticle *twoGammaCandidate = new AliKFParticle(*twoGammaDecayCandidateDaughter0,*twoGammaDecayCandidateDaughter1);
1323 Double_t massTwoGammaCandidate = 0.;
1324 Double_t widthTwoGammaCandidate = 0.;
1325 Double_t chi2TwoGammaCandidate =10000.;
1326 twoGammaCandidate->GetMass(massTwoGammaCandidate,widthTwoGammaCandidate);
1327 if(twoGammaCandidate->GetNDF()>0){
1328 chi2TwoGammaCandidate = twoGammaCandidate->GetChi2()/twoGammaCandidate->GetNDF();
1330 if(chi2TwoGammaCandidate>0 && chi2TwoGammaCandidate<fV0Reader->GetChi2CutMeson()){
1332 TVector3 momentumVectorTwoGammaCandidate(twoGammaCandidate->GetPx(),twoGammaCandidate->GetPy(),twoGammaCandidate->GetPz());
1333 TVector3 spaceVectorTwoGammaCandidate(twoGammaCandidate->GetX(),twoGammaCandidate->GetY(),twoGammaCandidate->GetZ());
1335 Double_t openingAngleTwoGammaCandidate = twoGammaDecayCandidateDaughter0->GetAngle(*twoGammaDecayCandidateDaughter1);
1337 if(twoGammaCandidate->GetE() - twoGammaCandidate->GetPz() == 0 || twoGammaCandidate->GetE() + twoGammaCandidate->GetPz() == 0){
1341 rapidity = 0.5*(TMath::Log((twoGammaCandidate->GetE() +twoGammaCandidate->GetPz()) / (twoGammaCandidate->GetE()-twoGammaCandidate->GetPz())));
1344 if(openingAngleTwoGammaCandidate < fMinOpeningAngleGhostCut){
1345 delete twoGammaCandidate;
1346 continue; // minimum opening angle to avoid using ghosttracks
1349 fHistograms->FillHistogram("ESD_Mother_GammaDaughter_OpeningAngle", openingAngleTwoGammaCandidate);
1350 fHistograms->FillHistogram("ESD_Mother_Energy", twoGammaCandidate->GetE());
1351 fHistograms->FillHistogram("ESD_Mother_Pt", momentumVectorTwoGammaCandidate.Pt());
1352 fHistograms->FillHistogram("ESD_Mother_Eta", momentumVectorTwoGammaCandidate.Eta());
1353 fHistograms->FillHistogram("ESD_Mother_Rapid", rapidity);
1354 fHistograms->FillHistogram("ESD_Mother_Phi", spaceVectorTwoGammaCandidate.Phi());
1355 fHistograms->FillHistogram("ESD_Mother_Mass", massTwoGammaCandidate);
1356 fHistograms->FillHistogram("ESD_Mother_R", spaceVectorTwoGammaCandidate.Pt()); // Pt in Space == R!!!
1357 fHistograms->FillHistogram("ESD_Mother_ZR", twoGammaCandidate->GetZ(), spaceVectorTwoGammaCandidate.Pt());
1358 fHistograms->FillHistogram("ESD_Mother_XY", twoGammaCandidate->GetX(), twoGammaCandidate->GetY());
1359 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
1360 fHistograms->FillHistogram("ESD_Mother_InvMass",massTwoGammaCandidate);
1362 if(fDoNeutralMesonV0MCCheck){
1363 //Kenneth: Checking the eta of the gamma to check the difference between 0.9 and 1.2
1364 Int_t indexKF1 = fKFReconstructedGammasV0Index.at(firstGammaIndex);
1365 if(indexKF1<fV0Reader->GetNumberOfV0s()){
1366 fV0Reader->GetV0(indexKF1);//updates to the correct v0
1367 Double_t eta1 = fV0Reader->GetMotherCandidateEta();
1368 Bool_t isRealPi0=kFALSE;
1369 Int_t gamma1MotherLabel=-1;
1370 if(fV0Reader->HasSameMCMother() == kTRUE){
1371 //cout<<"This v0 is a real v0!!!!"<<endl;
1372 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1373 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1374 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){
1375 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){
1376 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1377 gamma1MotherLabel=fV0Reader->GetMotherMCParticle()->GetFirstMother();
1382 Int_t indexKF2 = fKFReconstructedGammasV0Index.at(secondGammaIndex);
1383 if(indexKF1 == indexKF2){
1384 cout<<"index of the two KF particles are the same.... should not happen"<<endl;
1386 if(indexKF2<fV0Reader->GetNumberOfV0s()){
1387 fV0Reader->GetV0(indexKF2);
1388 Double_t eta2 = fV0Reader->GetMotherCandidateEta();
1389 Int_t gamma2MotherLabel=-1;
1390 if(fV0Reader->HasSameMCMother() == kTRUE){
1391 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1392 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1393 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){
1394 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){
1395 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1396 gamma2MotherLabel=fV0Reader->GetMotherMCParticle()->GetFirstMother();
1401 if(gamma1MotherLabel>=0 && gamma1MotherLabel==gamma2MotherLabel){
1402 if(fV0Reader->CheckIfPi0IsMother(gamma1MotherLabel)){
1407 if(TMath::Abs(eta1)>0.9 && TMath::Abs(eta2)>0.9){
1408 fHistograms->FillHistogram("ESD_Mother_InvMass_1212",massTwoGammaCandidate);
1409 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1411 fHistograms->FillHistogram("ESD_TruePi0_InvMass_1212",massTwoGammaCandidate);
1412 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_1212",openingAngleTwoGammaCandidate);
1413 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1416 else if(TMath::Abs(eta1)>0.9 || TMath::Abs(eta2)>0.9){
1417 fHistograms->FillHistogram("ESD_Mother_InvMass_0912",massTwoGammaCandidate);
1418 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1420 fHistograms->FillHistogram("ESD_TruePi0_InvMass_0912",massTwoGammaCandidate);
1421 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_0912",openingAngleTwoGammaCandidate);
1422 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1426 fHistograms->FillHistogram("ESD_Mother_InvMass_0909",massTwoGammaCandidate);
1427 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1429 fHistograms->FillHistogram("ESD_TruePi0_InvMass_0909",massTwoGammaCandidate);
1430 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_0909",openingAngleTwoGammaCandidate);
1431 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1437 if ( TMath::Abs(twoGammaDecayCandidateDaughter0->GetEta())<0.9 && TMath::Abs(twoGammaDecayCandidateDaughter1->GetEta())<0.9 ){
1438 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt_Fiducial",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
1439 fHistograms->FillHistogram("ESD_Mother_InvMass_Fiducial",massTwoGammaCandidate);
1443 delete twoGammaCandidate;
1448 void AliAnalysisTaskGammaConversion::CalculateBackground(){
1449 // see header file for documentation
1452 TClonesArray * currentEventV0s = fV0Reader->GetCurrentEventGoodV0s();
1454 for(Int_t nEventsInBG=0;nEventsInBG <fV0Reader->GetNBGEvents();nEventsInBG++){
1455 AliGammaConversionKFVector * previousEventV0s = fV0Reader->GetBGGoodV0s(nEventsInBG);
1456 for(Int_t iCurrent=0;iCurrent<currentEventV0s->GetEntriesFast();iCurrent++){
1457 AliKFParticle currentEventGoodV0 = *(AliKFParticle *)(currentEventV0s->At(iCurrent));
1458 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1459 AliKFParticle previousGoodV0 = (AliKFParticle)(*(previousEventV0s->at(iPrevious)));
1461 AliKFParticle *backgroundCandidate = new AliKFParticle(currentEventGoodV0,previousGoodV0);
1463 Double_t massBG =0.;
1464 Double_t widthBG = 0.;
1465 Double_t chi2BG =10000.;
1466 backgroundCandidate->GetMass(massBG,widthBG);
1467 if(backgroundCandidate->GetNDF()>0){
1468 chi2BG = backgroundCandidate->GetChi2()/backgroundCandidate->GetNDF();
1469 if(chi2BG>0 && chi2BG<fV0Reader->GetChi2CutMeson()){
1471 TVector3 momentumVectorbackgroundCandidate(backgroundCandidate->GetPx(),backgroundCandidate->GetPy(),backgroundCandidate->GetPz());
1472 TVector3 spaceVectorbackgroundCandidate(backgroundCandidate->GetX(),backgroundCandidate->GetY(),backgroundCandidate->GetZ());
1474 Double_t openingAngleBG = currentEventGoodV0.GetAngle(previousGoodV0);
1477 if(backgroundCandidate->GetE() - backgroundCandidate->GetPz() == 0 || backgroundCandidate->GetE() + backgroundCandidate->GetPz() == 0) rapidity=0;
1478 else rapidity = 0.5*(TMath::Log((backgroundCandidate->GetE() +backgroundCandidate->GetPz()) / (backgroundCandidate->GetE()-backgroundCandidate->GetPz())));
1483 if(openingAngleBG < fMinOpeningAngleGhostCut ){
1484 delete backgroundCandidate;
1485 continue; // minimum opening angle to avoid using ghosttracks
1489 fHistograms->FillHistogram("ESD_Background_GammaDaughter_OpeningAngle", openingAngleBG);
1490 fHistograms->FillHistogram("ESD_Background_Energy", backgroundCandidate->GetE());
1491 fHistograms->FillHistogram("ESD_Background_Pt", momentumVectorbackgroundCandidate.Pt());
1492 fHistograms->FillHistogram("ESD_Background_Eta", momentumVectorbackgroundCandidate.Eta());
1493 fHistograms->FillHistogram("ESD_Background_Rapidity", rapidity);
1494 fHistograms->FillHistogram("ESD_Background_Phi", spaceVectorbackgroundCandidate.Phi());
1495 fHistograms->FillHistogram("ESD_Background_Mass", massBG);
1496 fHistograms->FillHistogram("ESD_Background_R", spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
1497 fHistograms->FillHistogram("ESD_Background_ZR", backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
1498 fHistograms->FillHistogram("ESD_Background_XY", backgroundCandidate->GetX(), backgroundCandidate->GetY());
1499 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt",massBG,momentumVectorbackgroundCandidate.Pt());
1500 fHistograms->FillHistogram("ESD_Background_InvMass",massBG);
1502 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
1503 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_Fiducial",massBG,momentumVectorbackgroundCandidate.Pt());
1504 fHistograms->FillHistogram("ESD_Background_InvMass_Fiducial",massBG);
1509 AliGammaConversionBGHandler * bgHandler = fV0Reader->GetBGHandler();
1511 Int_t zbin= bgHandler->GetZBinIndex(fV0Reader->GetVertexZ());
1512 Int_t mbin= bgHandler->GetMultiplicityBinIndex(fV0Reader->CountESDTracks());
1514 fHistograms->FillHistogram(Form("%d%dESD_Background_GammaDaughter_OpeningAngle",zbin,mbin), openingAngleBG);
1515 fHistograms->FillHistogram(Form("%d%dESD_Background_Energy",zbin,mbin), backgroundCandidate->GetE());
1516 fHistograms->FillHistogram(Form("%d%dESD_Background_Pt",zbin,mbin), momentumVectorbackgroundCandidate.Pt());
1517 fHistograms->FillHistogram(Form("%d%dESD_Background_Eta",zbin,mbin), momentumVectorbackgroundCandidate.Eta());
1518 fHistograms->FillHistogram(Form("%d%dESD_Background_Rapidity",zbin,mbin), rapidity);
1519 fHistograms->FillHistogram(Form("%d%dESD_Background_Phi",zbin,mbin), spaceVectorbackgroundCandidate.Phi());
1520 fHistograms->FillHistogram(Form("%d%dESD_Background_Mass",zbin,mbin), massBG);
1521 fHistograms->FillHistogram(Form("%d%dESD_Background_R",zbin,mbin), spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
1522 fHistograms->FillHistogram(Form("%d%dESD_Background_ZR",zbin,mbin), backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
1523 fHistograms->FillHistogram(Form("%d%dESD_Background_XY",zbin,mbin), backgroundCandidate->GetX(), backgroundCandidate->GetY());
1524 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
1525 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass",zbin,mbin),massBG);
1527 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
1528 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt_Fiducial",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
1529 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_Fiducial",zbin,mbin),massBG);
1533 delete backgroundCandidate;
1540 void AliAnalysisTaskGammaConversion::ProcessGammasForGammaJetAnalysis(){
1541 //ProcessGammasForGammaJetAnalysis
1543 Double_t distIsoMin;
1545 CreateListOfChargedParticles();
1548 // for(UInt_t gammaIndex=0;gammaIndex<fKFReconstructedGammas.size();gammaIndex++){
1549 for(Int_t gammaIndex=0;gammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();gammaIndex++){
1550 AliKFParticle * currentGamma = (AliKFParticle*)fKFReconstructedGammasTClone->At(gammaIndex);
1551 TVector3 momentumVectorCurrentGamma(currentGamma->GetPx(),currentGamma->GetPy(),currentGamma->GetPz());
1553 if( momentumVectorCurrentGamma.Pt()> fMinPtForGammaJet){
1554 distIsoMin=GetMinimumDistanceToCharge(gammaIndex);
1556 if (distIsoMin > fMinIsoConeSize && fLeadingChargedIndex>=0){
1557 CalculateJetCone(gammaIndex);
1563 void AliAnalysisTaskGammaConversion::CreateListOfChargedParticles(){
1564 // CreateListOfChargedParticles
1566 fESDEvent = fV0Reader->GetESDEvent();
1567 Int_t numberOfESDTracks=0;
1568 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
1569 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
1575 if(fEsdTrackCuts->AcceptTrack(curTrack) ){
1576 new((*fChargedParticles)[fChargedParticles->GetEntriesFast()]) AliESDtrack(*curTrack);
1577 // fChargedParticles.push_back(curTrack);
1578 fChargedParticlesId.push_back(iTracks);
1579 numberOfESDTracks++;
1582 fHistograms->FillHistogram("ESD_NumberOfGoodESDTracks",numberOfESDTracks);
1584 void AliAnalysisTaskGammaConversion::CalculateJetCone(Int_t gammaIndex){
1588 Double_t coneSize=0.3;
1591 // AliKFParticle * currentGamma = &fKFReconstructedGammas[gammaIndex];
1592 AliKFParticle * currentGamma = (AliKFParticle*)fKFReconstructedGammasTClone->At(gammaIndex);
1594 TVector3 momentumVectorCurrentGamma(currentGamma->GetPx(),currentGamma->GetPy(),currentGamma->GetPz());
1596 AliESDtrack* leadingCharged = (AliESDtrack*)(fChargedParticles->At(fLeadingChargedIndex));
1598 Double_t momLeadingCharged[3];
1599 leadingCharged->GetConstrainedPxPyPz(momLeadingCharged);
1601 TVector3 momentumVectorLeadingCharged(momLeadingCharged[0],momLeadingCharged[1],momLeadingCharged[2]);
1603 Double_t phi1=momentumVectorLeadingCharged.Phi();
1604 Double_t eta1=momentumVectorLeadingCharged.Eta();
1605 Double_t phi3=momentumVectorCurrentGamma.Phi();
1607 for(Int_t iCh=0;iCh<fChargedParticles->GetEntriesFast();iCh++){
1608 AliESDtrack* curTrack = (AliESDtrack*)(fChargedParticles->At(iCh));
1609 Int_t chId = fChargedParticlesId[iCh];
1610 if(fLeadingChargedIndex==chId || fLeadingChargedIndex==chId) continue;
1612 curTrack->GetConstrainedPxPyPz(mom);
1613 TVector3 momentumVectorChargedParticle(mom[0],mom[1],mom[2]);
1614 Double_t phi2=momentumVectorChargedParticle.Phi();
1615 Double_t eta2=momentumVectorChargedParticle.Eta();
1619 if( TMath::Abs(phi2 - phi1) <= ( TMath::TwoPi()-coneSize) ){
1620 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2-phi1),2) );
1622 if( (phi2 - phi1)> TMath::TwoPi()-coneSize ){
1623 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2-TMath::TwoPi()-phi1),2) );
1625 if( (phi2 - phi1)< -(TMath::TwoPi()-coneSize) ){
1626 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2+TMath::TwoPi()-phi1),2) );
1630 if(cone <coneSize&& momentumVectorChargedParticle.Pt()>fMinPtJetCone ){
1631 ptJet+= momentumVectorChargedParticle.Pt();
1632 Double_t ffzHdrGam = momentumVectorChargedParticle.Pt()/momentumVectorCurrentGamma.Pt();
1633 Double_t imbalanceHdrGam=-momentumVectorChargedParticle.Dot(momentumVectorCurrentGamma)/momentumVectorCurrentGamma.Mag2();
1634 fHistograms->FillHistogram("ESD_FFzHdrGam",ffzHdrGam);
1635 fHistograms->FillHistogram("ESD_ImbalanceHdrGam",imbalanceHdrGam);
1639 Double_t dphiHdrGam=phi3-phi2;
1640 if ( dphiHdrGam < (-TMath::PiOver2())){
1641 dphiHdrGam+=(TMath::TwoPi());
1644 if ( dphiHdrGam > (3.*TMath::PiOver2()) ){
1645 dphiHdrGam-=(TMath::TwoPi());
1648 if (momentumVectorChargedParticle.Pt()>fMinPtGamChargedCorr){
1649 fHistograms->FillHistogram("ESD_dphiHdrGamIsolated",dphiHdrGam);
1656 Double_t AliAnalysisTaskGammaConversion::GetMinimumDistanceToCharge(Int_t indexHighestPtGamma){
1657 // GetMinimumDistanceToCharge
1659 Double_t fIsoMin=100.;
1660 Double_t ptLeadingCharged=-1.;
1662 fLeadingChargedIndex=-1;
1664 AliKFParticle * gammaHighestPt = (AliKFParticle*)fKFReconstructedGammasTClone->At(indexHighestPtGamma);
1665 TVector3 momentumVectorgammaHighestPt(gammaHighestPt->GetPx(),gammaHighestPt->GetPy(),gammaHighestPt->GetPz());
1667 Double_t phi1=momentumVectorgammaHighestPt.Phi();
1668 Double_t eta1=momentumVectorgammaHighestPt.Eta();
1670 for(Int_t iCh=0;iCh<fChargedParticles->GetEntriesFast();iCh++){
1671 AliESDtrack* curTrack = (AliESDtrack*)(fChargedParticles->At(iCh));
1672 Int_t chId = fChargedParticlesId[iCh];
1673 if(fElectronv1[indexHighestPtGamma]==chId || fElectronv2[indexHighestPtGamma]==chId) continue;
1675 curTrack->GetConstrainedPxPyPz(mom);
1676 TVector3 momentumVectorChargedParticle(mom[0],mom[1],mom[2]);
1677 Double_t phi2=momentumVectorChargedParticle.Phi();
1678 Double_t eta2=momentumVectorChargedParticle.Eta();
1679 Double_t iso=pow( (pow( (eta1-eta2),2)+ pow((phi1-phi2),2)),0.5 );
1681 if(momentumVectorChargedParticle.Pt()>fMinPtIsoCone ){
1687 Double_t dphiHdrGam=phi1-phi2;
1688 if ( dphiHdrGam < (-TMath::PiOver2())){
1689 dphiHdrGam+=(TMath::TwoPi());
1692 if ( dphiHdrGam > (3.*TMath::PiOver2()) ){
1693 dphiHdrGam-=(TMath::TwoPi());
1695 if (momentumVectorChargedParticle.Pt()>fMinPtGamChargedCorr){
1696 fHistograms->FillHistogram("ESD_dphiHdrGam",dphiHdrGam);
1699 if (dphiHdrGam>0.9*TMath::Pi() && dphiHdrGam<1.1*TMath::Pi()){
1700 if (momentumVectorChargedParticle.Pt()> ptLeadingCharged && momentumVectorChargedParticle.Pt()>0.1*momentumVectorgammaHighestPt.Pt()){
1701 ptLeadingCharged=momentumVectorChargedParticle.Pt();
1702 fLeadingChargedIndex=iCh;
1707 fHistograms->FillHistogram("ESD_MinimumIsoDistance",fIsoMin);
1712 Int_t AliAnalysisTaskGammaConversion::GetIndexHighestPtGamma(){
1713 //GetIndexHighestPtGamma
1715 Int_t indexHighestPtGamma=-1;
1717 fGammaPtHighest = -100.;
1719 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
1720 AliKFParticle * gammaHighestPtCandidate = (AliKFParticle*)fKFReconstructedGammasTClone->At(firstGammaIndex);
1721 TVector3 momentumVectorgammaHighestPtCandidate(gammaHighestPtCandidate->GetPx(),gammaHighestPtCandidate->GetPy(),gammaHighestPtCandidate->GetPz());
1722 if (momentumVectorgammaHighestPtCandidate.Pt() > fGammaPtHighest){
1723 fGammaPtHighest=momentumVectorgammaHighestPtCandidate.Pt();
1724 //gammaHighestPt = gammaHighestPtCandidate;
1725 indexHighestPtGamma=firstGammaIndex;
1729 return indexHighestPtGamma;
1734 void AliAnalysisTaskGammaConversion::Terminate(Option_t */*option*/)
1736 // Terminate analysis
1738 AliDebug(1,"Do nothing in Terminate");
1741 void AliAnalysisTaskGammaConversion::UserCreateOutputObjects()
1744 if(fAODBranch==NULL){
1745 fAODBranch = new TClonesArray("AliGammaConversionAODObject", 0);
1747 fAODBranch->Delete();
1748 fAODBranch->SetName(fAODBranchName);
1749 AddAODBranch("TClonesArray", &fAODBranch);
1751 // Create the output container
1752 if(fOutputContainer != NULL){
1753 delete fOutputContainer;
1754 fOutputContainer = NULL;
1756 if(fOutputContainer == NULL){
1757 fOutputContainer = new TList();
1758 fOutputContainer->SetOwner(kTRUE);
1761 //Adding the histograms to the output container
1762 fHistograms->GetOutputContainer(fOutputContainer);
1766 if(fGammaNtuple == NULL){
1767 fGammaNtuple = new TNtuple("V0ntuple","V0ntuple","OnTheFly:HasVertex:NegPIDProb:PosPIDProb:X:Y:Z:R:MotherCandidateNDF:MotherCandidateChi2:MotherCandidateEnergy:MotherCandidateEta:MotherCandidatePt:MotherCandidateMass:MotherCandidateWidth:MCMotherCandidatePT:EPOpeningAngle:ElectronEnergy:ElectronPt:ElectronEta:ElectronPhi:PositronEnergy:PositronPt:PositronEta:PositronPhi:HasSameMCMother:MotherMCParticlePIDCode",50000);
1769 if(fNeutralMesonNtuple == NULL){
1770 fNeutralMesonNtuple = new TNtuple("NeutralMesonNtuple","NeutralMesonNtuple","test");
1772 TList * ntupleTList = new TList();
1773 ntupleTList->SetOwner(kTRUE);
1774 ntupleTList->SetName("Ntuple");
1775 ntupleTList->Add((TNtuple*)fGammaNtuple);
1776 fOutputContainer->Add(ntupleTList);
1779 fOutputContainer->SetName(GetName());
1782 Double_t AliAnalysisTaskGammaConversion::GetMCOpeningAngle(TParticle* const daughter0, TParticle* const daughter1) const{
1784 TVector3 v3D0(daughter0->Px(),daughter0->Py(),daughter0->Pz());
1785 TVector3 v3D1(daughter1->Px(),daughter1->Py(),daughter1->Pz());
1786 return v3D0.Angle(v3D1);
1789 void AliAnalysisTaskGammaConversion::CheckV0Efficiency(){
1790 // see header file for documentation
1792 vector<Int_t> indexOfGammaParticle;
1794 fStack = fV0Reader->GetMCStack();
1796 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
1797 return; // aborts if the primary vertex does not have contributors.
1800 for (Int_t iTracks = 0; iTracks < fStack->GetNprimary(); iTracks++) {
1801 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
1802 if(particle->GetPdgCode()==22){ //Gamma
1803 if(particle->GetNDaughters() >= 2){
1804 TParticle* electron=NULL;
1805 TParticle* positron=NULL;
1806 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
1807 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
1808 if(tmpDaughter->GetUniqueID() == 5){
1809 if(tmpDaughter->GetPdgCode() == 11){
1810 electron = tmpDaughter;
1812 else if(tmpDaughter->GetPdgCode() == -11){
1813 positron = tmpDaughter;
1817 if(electron!=NULL && positron!=0){
1818 if(electron->R()<160){
1819 indexOfGammaParticle.push_back(iTracks);
1826 Int_t nFoundGammas=0;
1827 Int_t nNotFoundGammas=0;
1829 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
1830 for(Int_t i=0;i<numberOfV0s;i++){
1831 fV0Reader->GetV0(i);
1833 if(fV0Reader->HasSameMCMother() == kFALSE){
1837 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1838 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1840 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
1843 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
1847 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1848 //TParticle * v0Gamma = fV0Reader->GetMotherMCParticle();
1849 for(UInt_t mcIndex=0;mcIndex<indexOfGammaParticle.size();mcIndex++){
1850 if(negativeMC->GetFirstMother()==indexOfGammaParticle[mcIndex]){
1862 void AliAnalysisTaskGammaConversion::ProcessGammaElectronsForChicAnalysis(){
1863 // see header file for documantation
1865 fESDEvent = fV0Reader->GetESDEvent();
1868 TClonesArray * vESDeNegTemp = new TClonesArray("AliESDtrack",0);
1869 TClonesArray * vESDePosTemp = new TClonesArray("AliESDtrack",0);
1870 TClonesArray * vESDxNegTemp = new TClonesArray("AliESDtrack",0);
1871 TClonesArray * vESDxPosTemp = new TClonesArray("AliESDtrack",0);
1872 TClonesArray * vESDeNegNoJPsi = new TClonesArray("AliESDtrack",0);
1873 TClonesArray * vESDePosNoJPsi = new TClonesArray("AliESDtrack",0);
1876 vector <AliESDtrack*> vESDeNegTemp(0);
1877 vector <AliESDtrack*> vESDePosTemp(0);
1878 vector <AliESDtrack*> vESDxNegTemp(0);
1879 vector <AliESDtrack*> vESDxPosTemp(0);
1880 vector <AliESDtrack*> vESDeNegNoJPsi(0);
1881 vector <AliESDtrack*> vESDePosNoJPsi(0);
1885 fHistograms->FillTable("Table_Electrons",0);//Count number of Events
1887 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
1888 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
1891 //print warning here
1895 double p[3];if(!curTrack->GetConstrainedPxPyPz(p))continue;
1896 double r[3];curTrack->GetConstrainedXYZ(r);
1900 fHistograms->FillTable("Table_Electrons",4);//Count number of ESD tracks
1902 Bool_t flagKink = kTRUE;
1903 Bool_t flagTPCrefit = kTRUE;
1904 Bool_t flagTRDrefit = kTRUE;
1905 Bool_t flagITSrefit = kTRUE;
1906 Bool_t flagTRDout = kTRUE;
1907 Bool_t flagVertex = kTRUE;
1910 //Cuts ---------------------------------------------------------------
1912 if(curTrack->GetKinkIndex(0) > 0){
1913 fHistograms->FillHistogram("Table_Electrons",5);//Count kink
1917 ULong_t trkStatus = curTrack->GetStatus();
1919 ULong_t tpcRefit = (trkStatus & AliESDtrack::kTPCrefit);
1922 fHistograms->FillHistogram("Table_Electrons",9);//Count not TPCrefit
1923 flagTPCrefit = kFALSE;
1926 ULong_t itsRefit = (trkStatus & AliESDtrack::kITSrefit);
1928 fHistograms->FillHistogram("Table_Electrons",10);//Count not ITSrefit
1929 flagITSrefit = kFALSE;
1932 ULong_t trdRefit = (trkStatus & AliESDtrack::kTRDrefit);
1935 fHistograms->FillHistogram("Table_Electrons",8); //Count not TRDrefit
1936 flagTRDrefit = kFALSE;
1939 ULong_t trdOut = (trkStatus & AliESDtrack::kTRDout);
1942 fHistograms->FillHistogram("Table_Electrons",7); //Count not TRDout
1943 flagTRDout = kFALSE;
1946 double nsigmaToVxt = GetSigmaToVertex(curTrack);
1948 if(nsigmaToVxt > 3){
1949 fHistograms->FillHistogram("Table_Electrons",6); //Count Tracks with number of sigmas > 3
1950 flagVertex = kFALSE;
1953 if(! (flagKink && flagTPCrefit && flagITSrefit && flagTRDrefit && flagTRDout && flagVertex ) ) continue;
1954 fHistograms->FillHistogram("Table_Electrons",11);//Count Tracks passed Cuts
1958 GetPID(curTrack, pid, weight);
1961 fHistograms->FillHistogram("Table_Electrons",12); //Count Tracks with pid != 0
1965 fHistograms->FillHistogram("Table_Electrons",13); //Count Tracks with pid != 0
1973 TLorentzVector curElec;
1974 curElec.SetXYZM(p[0],p[1],p[2],fElectronMass);
1978 Int_t labelMC = TMath::Abs(curTrack->GetLabel());
1979 TParticle* curParticle = fStack->Particle(labelMC);
1980 if(curTrack->GetSign() > 0){
1982 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
1983 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
1986 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
1987 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
1993 if(curTrack->GetSign() > 0){
1995 // vESDxPosTemp.push_back(curTrack);
1996 new((*vESDxPosTemp)[vESDxPosTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2000 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
2001 fHistograms->FillHistogram("ESD_ElectronPosPt",curElec.Pt());
2002 // fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
2003 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
2004 // fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
2005 // vESDePosTemp.push_back(curTrack);
2006 new((*vESDePosTemp)[vESDePosTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2013 new((*vESDxNegTemp)[vESDxNegTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2017 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
2018 fHistograms->FillHistogram("ESD_ElectronNegPt",curElec.Pt());
2019 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
2020 new((*vESDeNegTemp)[vESDeNegTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2029 Bool_t ePosJPsi = kFALSE;
2030 Bool_t eNegJPsi = kFALSE;
2031 Bool_t ePosPi0 = kFALSE;
2032 Bool_t eNegPi0 = kFALSE;
2034 UInt_t iePosJPsi=0,ieNegJPsi=0,iePosPi0=0,ieNegPi0=0;
2036 for(Int_t iNeg=0; iNeg < vESDeNegTemp->GetEntriesFast(); iNeg++){
2037 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetPdgCode() == 11)
2038 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetMother(0) > -1){
2039 Int_t labelMother = fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetMother(0);
2040 TParticle* partMother = fStack ->Particle(labelMother);
2041 if (partMother->GetPdgCode() == 111){
2045 if(partMother->GetPdgCode() == 443){ //Mother JPsi
2046 fHistograms->FillTable("Table_Electrons",14);
2051 // vESDeNegNoJPsi.push_back(vESDeNegTemp[iNeg]);
2052 new((*vESDeNegNoJPsi)[vESDeNegNoJPsi->GetEntriesFast()]) AliESDtrack(*(AliESDtrack*)(vESDeNegTemp->At(iNeg)));
2053 // cout<<"ESD No Positivo JPsi "<<endl;
2059 for(Int_t iPos=0; iPos < vESDePosTemp->GetEntriesFast(); iPos++){
2060 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetPdgCode() == -11)
2061 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetMother(0) > -1){
2062 Int_t labelMother = fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetMother(0);
2063 TParticle* partMother = fStack ->Particle(labelMother);
2064 if (partMother->GetPdgCode() == 111){
2068 if(partMother->GetPdgCode() == 443){ //Mother JPsi
2069 fHistograms->FillTable("Table_Electrons",15);
2074 // vESDePosNoJPsi.push_back(vESDePosTemp[iPos]);
2075 new((*vESDePosNoJPsi)[vESDePosNoJPsi->GetEntriesFast()]) AliESDtrack(*(AliESDtrack*)(vESDePosTemp->At(iPos)));
2076 // cout<<"ESD No Negativo JPsi "<<endl;
2082 if( eNegJPsi && ePosJPsi ){
2083 TVector3 tempeNegV,tempePosV;
2084 tempeNegV.SetXYZ(((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Px(),((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Py(),((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Pz());
2085 tempePosV.SetXYZ(((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Px(),((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Py(),((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Pz());
2086 fHistograms->FillTable("Table_Electrons",16);
2087 fHistograms->FillHistogram("ESD_ElectronPosNegJPsiAngle",tempeNegV.Angle(tempePosV));
2088 fHistograms->FillHistogram("MC_ElectronPosNegJPsiAngle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->GetLabel())),
2089 fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->GetLabel()))));
2092 if( eNegPi0 && ePosPi0 ){
2093 TVector3 tempeNegV,tempePosV;
2094 tempeNegV.SetXYZ(((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Px(),((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Py(),((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Pz());
2095 tempePosV.SetXYZ(((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Px(),((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Py(),((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Pz());
2096 fHistograms->FillHistogram("ESD_ElectronPosNegPi0Angle",tempeNegV.Angle(tempePosV));
2097 fHistograms->FillHistogram("MC_ElectronPosNegPi0Angle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->GetLabel())),
2098 fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->GetLabel()))));
2102 FillAngle("ESD_eNegePosAngleBeforeCut",GetTLorentzVector(vESDeNegTemp),GetTLorentzVector(vESDePosTemp));
2104 CleanWithAngleCuts(*vESDeNegTemp,*vESDePosTemp,*fKFReconstructedGammasTClone);
2106 // vector <TLorentzVector> vCurrentTLVeNeg = GetTLorentzVector(fCurrentEventNegElectron);
2107 // vector <TLorentzVector> vCurrentTLVePos = GetTLorentzVector(fCurrentEventPosElectron);
2109 TClonesArray vCurrentTLVeNeg = GetTLorentzVector(fCurrentEventNegElectronTClone);
2110 TClonesArray vCurrentTLVePos = GetTLorentzVector(fCurrentEventPosElectronTClone);
2113 FillAngle("ESD_eNegePosAngleAfterCut",vCurrentTLVeNeg,vCurrentTLVePos);
2118 //FillAngle("ESD_eNegePosAngleAfterCut",CurrentTLVeNeg,CurrentTLVePos);
2121 FillElectronInvMass("ESD_InvMass_ePluseMinus",vCurrentTLVeNeg,vCurrentTLVePos);
2122 FillElectronInvMass("ESD_InvMass_xPlusxMinus",GetTLorentzVector(vESDxNegTemp),GetTLorentzVector(vESDxPosTemp));
2126 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusChiC","ESD_InvMass_GammaePluseMinusChiCDiff",*fKFReconstructedGammasCutTClone,vCurrentTLVeNeg,vCurrentTLVePos);
2128 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusPi0","ESD_InvMass_GammaePluseMinusPi0Diff",
2129 *fKFReconstructedGammasCutTClone,vCurrentTLVeNeg,vCurrentTLVePos);
2134 ElectronBackground("ESD_ENegBackground",vCurrentTLVeNeg);
2135 ElectronBackground("ESD_EPosBackground",vCurrentTLVePos);
2136 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVeNeg);
2137 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVePos);
2139 // Like Sign e+e- no JPsi
2140 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDeNegNoJPsi));
2141 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDePosNoJPsi));
2145 if( fCurrentEventPosElectronTClone->GetEntriesFast() > 0 && fCurrentEventNegElectronTClone->GetEntriesFast() > 0 && fKFReconstructedGammasCutTClone->GetEntriesFast() > 0 ){
2146 FillGammaElectronInvMass("ESD_EPosENegGammaBackgroundMX","ESD_EPosENegGammaBackgroundMXDiff",
2147 *fKFReconstructedGammasCutTClone,*fPreviousEventTLVNegElectronTClone,*fPreviousEventTLVPosElectronTClone);
2148 *fPreviousEventTLVNegElectronTClone = vCurrentTLVeNeg;
2149 *fPreviousEventTLVPosElectronTClone = vCurrentTLVePos;
2156 vtx[0]=0;vtx[1]=0;vtx[2]=0;
2157 for(UInt_t i=0;i<fKFReconstructedGammasChic.size();i++){
2159 // if(fMCGammaChicTempCut[i]->GetMother(0) < 0) continue;
2163 Int_t tempLabel = fStack->Particle(fMCGammaChicTempCut[i]->GetMother(0))->GetPdgCode();
2164 // cout<<" Label Pedro Gonzalez " <<tempLabel <<endl;
2166 // cout<<" Label Distance"<<fKFReconstructedGammasChic[i].GetDistanceFromVertex(vtx)<<endl;
2168 if( tempLabel == 10441 || tempLabel == 20443 || tempLabel == 445 )
2170 fHistograms->FillHistogram("ESD_PhotonsMomentum",fKFReconstructedGammasChic[i].GetMomentum());
2179 vESDeNegTemp->Delete();
2180 vESDePosTemp->Delete();
2181 vESDxNegTemp->Delete();
2182 vESDxPosTemp->Delete();
2183 vESDeNegNoJPsi->Delete();
2184 vESDePosNoJPsi->Delete();
2186 delete vESDeNegTemp;
2187 delete vESDePosTemp;
2188 delete vESDxNegTemp;
2189 delete vESDxPosTemp;
2190 delete vESDeNegNoJPsi;
2191 delete vESDePosNoJPsi;
2195 void AliAnalysisTaskGammaConversion::FillAngle(TString histoName,vector <TLorentzVector> tlVeNeg, vector <TLorentzVector> tlVePos){
2196 //see header file for documentation
2197 for( UInt_t iNeg=0; iNeg < tlVeNeg.size(); iNeg++){
2198 for (UInt_t iPos=0; iPos < tlVePos.size(); iPos++){
2199 fHistograms->FillHistogram(histoName.Data(),tlVeNeg[iNeg].Vect().Angle(tlVePos[iPos].Vect()));
2204 void AliAnalysisTaskGammaConversion::FillAngle(TString histoName,TClonesArray const tlVeNeg, TClonesArray const tlVePos){
2205 //see header file for documentation
2206 for( Int_t iNeg=0; iNeg < tlVeNeg.GetEntriesFast(); iNeg++){
2207 for (Int_t iPos=0; iPos < tlVePos.GetEntriesFast(); iPos++){
2208 fHistograms->FillHistogram(histoName.Data(),((TLorentzVector*)(tlVeNeg.At(iNeg)))->Vect().Angle(((TLorentzVector*)(tlVePos.At(iPos)))->Vect()));
2212 void AliAnalysisTaskGammaConversion::FillElectronInvMass(TString histoName, TClonesArray const eNeg, TClonesArray const ePos){
2213 //see header file for documentation
2214 for( Int_t n=0; n < eNeg.GetEntriesFast(); n++){
2215 TLorentzVector en = (*(TLorentzVector*)(eNeg.At(n)));
2216 for (Int_t p=0; p < ePos.GetEntriesFast(); p++){
2217 TLorentzVector ep = (*(TLorentzVector*)(ePos.At(p)));
2218 TLorentzVector np = ep + en;
2219 fHistograms->FillHistogram(histoName.Data(),np.M());
2224 void AliAnalysisTaskGammaConversion::FillGammaElectronInvMass(TString histoMass,TString histoDiff,TClonesArray const fKFGammas,
2225 TClonesArray const tlVeNeg,TClonesArray const tlVePos)
2227 //see header file for documentation
2229 for( Int_t iNeg=0; iNeg < tlVeNeg.GetEntriesFast(); iNeg++ ){
2231 for (Int_t iPos=0; iPos < tlVePos.GetEntriesFast(); iPos++){
2233 TLorentzVector xy = *((TLorentzVector *)(tlVePos.At(iPos))) + *((TLorentzVector *)(tlVeNeg.At(iNeg)));
2235 for (Int_t iGam=0; iGam < fKFGammas.GetEntriesFast(); iGam++){
2237 // AliKFParticle * gammaCandidate = &fKFGammas[iGam];
2238 AliKFParticle * gammaCandidate = (AliKFParticle *)(fKFGammas.At(iGam));
2241 g.SetXYZM(gammaCandidate->GetPx(),gammaCandidate->GetPy(),gammaCandidate->GetPz(),fGammaMass);
2242 TLorentzVector xyg = xy + g;
2243 fHistograms->FillHistogram(histoMass.Data(),xyg.M());
2244 fHistograms->FillHistogram(histoDiff.Data(),(xyg.M()-xy.M()));
2250 void AliAnalysisTaskGammaConversion::ElectronBackground(TString hBg, TClonesArray e)
2252 // see header file for documentation
2253 for(Int_t i=0; i < e.GetEntriesFast(); i++)
2255 for (Int_t j=i+1; j < e.GetEntriesFast(); j++)
2257 TLorentzVector ee = (*(TLorentzVector*)(e.At(i))) + (*(TLorentzVector*)(e.At(j)));
2259 fHistograms->FillHistogram(hBg.Data(),ee.M());
2265 void AliAnalysisTaskGammaConversion::CleanWithAngleCuts(TClonesArray const negativeElectrons,
2266 TClonesArray const positiveElectrons,
2267 TClonesArray const gammas){
2268 // see header file for documentation
2270 UInt_t sizeN = negativeElectrons.GetEntriesFast();
2271 UInt_t sizeP = positiveElectrons.GetEntriesFast();
2272 UInt_t sizeG = gammas.GetEntriesFast();
2276 vector <Bool_t> xNegBand(sizeN);
2277 vector <Bool_t> xPosBand(sizeP);
2278 vector <Bool_t> gammaBand(sizeG);
2281 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++) xNegBand[iNeg]=kTRUE;
2282 for(UInt_t iPos=0; iPos < sizeP; iPos++) xPosBand[iPos]=kTRUE;
2283 for(UInt_t iGam=0; iGam < sizeG; iGam++) gammaBand[iGam]=kTRUE;
2286 for(UInt_t iPos=0; iPos < sizeP; iPos++){
2289 ((AliESDtrack*)(positiveElectrons.At(iPos)))->GetConstrainedPxPyPz(aP);
2291 TVector3 ePosV(aP[0],aP[1],aP[2]);
2293 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++){
2296 ((AliESDtrack*)(negativeElectrons.At(iNeg)))->GetConstrainedPxPyPz(aN);
2297 TVector3 eNegV(aN[0],aN[1],aN[2]);
2299 if(ePosV.Angle(eNegV) < 0.05){ //e+e- from gamma
2300 xPosBand[iPos]=kFALSE;
2301 xNegBand[iNeg]=kFALSE;
2304 for(UInt_t iGam=0; iGam < sizeG; iGam++){
2305 AliKFParticle* gammaCandidate = (AliKFParticle*)gammas.At(iGam);
2306 TVector3 gammaCandidateVector(gammaCandidate->Px(),gammaCandidate->Py(),gammaCandidate->Pz());
2307 if(ePosV.Angle(gammaCandidateVector) < 0.05 || eNegV.Angle(gammaCandidateVector) < 0.05)
2308 gammaBand[iGam]=kFALSE;
2316 for(UInt_t iPos=0; iPos < sizeP; iPos++){
2318 new((*fCurrentEventPosElectronTClone)[fCurrentEventPosElectronTClone->GetEntriesFast()]) AliESDtrack((*(AliESDtrack*)(positiveElectrons.At(iPos))));
2319 // fCurrentEventPosElectron.push_back(positiveElectrons[iPos]);
2322 for(UInt_t iNeg=0;iNeg < sizeN; iNeg++){
2324 new((*fCurrentEventNegElectronTClone)[fCurrentEventNegElectronTClone->GetEntriesFast()]) AliESDtrack((*(AliESDtrack*)(negativeElectrons.At(iNeg))));
2325 // fCurrentEventNegElectron.push_back(negativeElectrons[iNeg]);
2328 for(UInt_t iGam=0; iGam < sizeG; iGam++){
2329 if(gammaBand[iGam]){
2330 new((*fKFReconstructedGammasCutTClone)[fKFReconstructedGammasCutTClone->GetEntriesFast()]) AliKFParticle((*(AliKFParticle*)(gammas.At(iGam))));
2331 //fKFReconstructedGammasCut.push_back(*(AliKFParticle*)gammas->At(iGam));
2337 void AliAnalysisTaskGammaConversion::GetPID(AliESDtrack *track, Stat_t &pid, Stat_t &weight)
2339 // see header file for documentation
2344 double wpartbayes[5];
2346 //get probability of the diffenrent particle types
2347 track->GetESDpid(wpart);
2349 // Tentative particle type "concentrations"
2350 double c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
2354 for (int i = 0; i < 5; i++)
2356 rcc+=(c[i] * wpart[i]);
2361 for (int i=0; i<5; i++) {
2362 if( rcc>0 || rcc<0){//Kenneth: not sure if the rcc<0 should be there, this is from fixing a coding violation where we are not allowed to say: rcc!=0 (RC19)
2363 wpartbayes[i] = c[i] * wpart[i] / rcc;
2371 //find most probable particle in ESD pid
2372 //0:Electron - 1:Muon - 2:Pion - 3:Kaon - 4:Proton
2373 for (int i = 0; i < 5; i++)
2375 if (wpartbayes[i] > max)
2378 max = wpartbayes[i];
2385 double AliAnalysisTaskGammaConversion::GetSigmaToVertex(AliESDtrack* t)
2387 // Calculates the number of sigma to the vertex.
2392 t->GetImpactParameters(b,bCov);
2393 if (bCov[0]<=0 || bCov[2]<=0) {
2394 AliDebug(1, "Estimated b resolution lower or equal zero!");
2395 bCov[0]=0; bCov[2]=0;
2397 bRes[0] = TMath::Sqrt(bCov[0]);
2398 bRes[1] = TMath::Sqrt(bCov[2]);
2400 // -----------------------------------
2401 // How to get to a n-sigma cut?
2403 // The accumulated statistics from 0 to d is
2405 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
2406 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
2408 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
2409 // Can this be expressed in a different way?
2411 if (bRes[0] == 0 || bRes[1] ==0)
2414 double d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
2416 // stupid rounding problem screws up everything:
2417 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
2418 if (TMath::Exp(-d * d / 2) < 1e-10)
2422 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
2426 //vector <TLorentzVector> AliAnalysisTaskGammaConversion::GetTLorentzVector(vector <AliESDtrack*> esdTrack){
2427 TClonesArray AliAnalysisTaskGammaConversion::GetTLorentzVector(TClonesArray *const esdTrack){
2428 //Return TLoresntz vector of track?
2429 // vector <TLorentzVector> tlVtrack(0);
2430 TClonesArray array("TLorentzVector",0);
2432 for(Int_t itrack=0; itrack < esdTrack->GetEntriesFast(); itrack++){
2434 //esdTrack[itrack]->GetConstrainedPxPyPz(p);
2435 ((AliESDtrack*)(esdTrack->At(itrack)))->GetConstrainedPxPyPz(p);
2436 TLorentzVector currentTrack;
2437 currentTrack.SetXYZM(p[0],p[1],p[2],fElectronMass);
2438 new((array)[array.GetEntriesFast()]) TLorentzVector(currentTrack);
2439 // tlVtrack.push_back(currentTrack);