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
237 // Cuts used up to 3rd of March
239 // fEsdTrackCuts->SetMinNClustersTPC(50);
240 // fEsdTrackCuts->SetMaxChi2PerClusterTPC(3.5);
241 // fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
242 // fEsdTrackCuts->SetRequireITSRefit(kTRUE);
243 // fEsdTrackCuts->SetMaxNsigmaToVertex(3);
244 // fEsdTrackCuts->SetRequireSigmaToVertex(kTRUE);
246 //------- To be tested-----------
248 Double_t minNClustersTPC = 50;
249 Double_t maxChi2PerClusterTPC = 4.0;
250 Double_t maxDCAtoVertexXY = 2.4; // cm
251 Double_t maxDCAtoVertexZ = 3.2; // cm
252 fEsdTrackCuts->SetRequireSigmaToVertex(kFALSE);
253 fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
254 fEsdTrackCuts->SetRequireITSRefit(kTRUE);
255 // fEsdTrackCuts->SetRequireTPCStandAlone(kTRUE);
256 fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);
257 fEsdTrackCuts->SetMinNClustersTPC(minNClustersTPC);
258 fEsdTrackCuts->SetMaxChi2PerClusterTPC(maxChi2PerClusterTPC);
259 fEsdTrackCuts->SetMaxDCAToVertexXY(maxDCAtoVertexXY);
260 fEsdTrackCuts->SetMaxDCAToVertexZ(maxDCAtoVertexZ);
261 fEsdTrackCuts->SetDCAToVertex2D(kTRUE);
262 fEsdTrackCuts->SetEtaRange(-0.9, 0.9);
263 fEsdTrackCuts->SetPtRange(0.15);
268 //----- From Jacek 10.03.03 ------------------/
269 // minNClustersTPC = 70;
270 // maxChi2PerClusterTPC = 4.0;
271 // maxDCAtoVertexXY = 2.4; // cm
272 // maxDCAtoVertexZ = 3.2; // cm
274 // esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
275 // esdTrackCuts->SetRequireTPCRefit(kFALSE);
276 // esdTrackCuts->SetRequireTPCStandAlone(kTRUE);
277 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
278 // esdTrackCuts->SetMinNClustersTPC(minNClustersTPC);
279 // esdTrackCuts->SetMaxChi2PerClusterTPC(maxChi2PerClusterTPC);
280 // esdTrackCuts->SetMaxDCAToVertexXY(maxDCAtoVertexXY);
281 // esdTrackCuts->SetMaxDCAToVertexZ(maxDCAtoVertexZ);
282 // esdTrackCuts->SetDCAToVertex2D(kTRUE);
286 // fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);
287 // fV0Reader->SetESDtrackCuts(fEsdTrackCuts);
290 void AliAnalysisTaskGammaConversion::UserExec(Option_t */*option*/)
292 // Execute analysis for current event
293 ConnectInputData("");
295 //Each event needs an empty branch
296 // fAODBranch->Clear();
297 fAODBranch->Delete();
299 if(fKFReconstructedGammasTClone == NULL){
300 fKFReconstructedGammasTClone = new TClonesArray("AliKFParticle",0);
302 if(fCurrentEventPosElectronTClone == NULL){
303 fCurrentEventPosElectronTClone = new TClonesArray("AliESDtrack",0);
305 if(fCurrentEventNegElectronTClone == NULL){
306 fCurrentEventNegElectronTClone = new TClonesArray("AliESDtrack",0);
308 if(fKFReconstructedGammasCutTClone == NULL){
309 fKFReconstructedGammasCutTClone = new TClonesArray("AliKFParticle",0);
311 if(fPreviousEventTLVNegElectronTClone == NULL){
312 fPreviousEventTLVNegElectronTClone = new TClonesArray("TLorentzVector",0);
314 if(fPreviousEventTLVPosElectronTClone == NULL){
315 fPreviousEventTLVPosElectronTClone = new TClonesArray("TLorentzVector",0);
317 if(fChargedParticles == NULL){
318 fChargedParticles = new TClonesArray("AliESDtrack",0);
322 fKFReconstructedGammasTClone->Delete();
323 fCurrentEventPosElectronTClone->Delete();
324 fCurrentEventNegElectronTClone->Delete();
325 fKFReconstructedGammasCutTClone->Delete();
326 fPreviousEventTLVNegElectronTClone->Delete();
327 fPreviousEventTLVPosElectronTClone->Delete();
333 fChargedParticles->Delete();
335 fChargedParticlesId.clear();
337 fKFReconstructedGammasV0Index.clear();
339 //Clear the data in the v0Reader
340 // fV0Reader->UpdateEventByEventData();
342 //Take Only events with proper trigger
345 if(!fV0Reader->GetESDEvent()->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL")) return;
349 // Process the MC information
354 //Process the v0 information with no cuts
357 // Process the v0 information
362 FillAODWithConversionGammas() ;
364 // Process reconstructed gammas
365 if(fDoNeutralMeson == kTRUE){
366 ProcessGammasForNeutralMesonAnalysis();
369 if(fDoMCTruth == kTRUE){
372 //Process reconstructed gammas electrons for Chi_c Analysis
373 if(fDoChic == kTRUE){
374 ProcessGammaElectronsForChicAnalysis();
376 // Process reconstructed gammas for gamma Jet/hadron correlations
378 ProcessGammasForGammaJetAnalysis();
381 //calculate background if flag is set
382 if(fCalculateBackground){
383 CalculateBackground();
386 //Clear the data in the v0Reader
387 fV0Reader->UpdateEventByEventData();
389 PostData(1, fOutputContainer);
390 PostData(2, fCFManager->GetParticleContainer()); // for CF
394 void AliAnalysisTaskGammaConversion::ConnectInputData(Option_t *option){
395 // see header file for documentation
397 AliAnalysisTaskSE::ConnectInputData(option);
399 if(fV0Reader == NULL){
400 // Write warning here cuts and so on are default if this ever happens
402 fV0Reader->Initialize();
403 fDoMCTruth = fV0Reader->GetDoMCTruth();
408 void AliAnalysisTaskGammaConversion::ProcessMCData(){
409 // see header file for documentation
411 fStack = fV0Reader->GetMCStack();
412 fMCTruth = fV0Reader->GetMCTruth(); // for CF
413 fGCMCEvent = fV0Reader->GetMCEvent(); // for CF
417 Double_t containerInput[3];
419 if(!fGCMCEvent) cout << "NO MC INFO FOUND" << endl;
420 fCFManager->SetEventInfo(fGCMCEvent);
425 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
426 return; // aborts if the primary vertex does not have contributors.
429 for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++) {
430 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
437 ///////////////////////Begin Chic Analysis/////////////////////////////
439 if(particle->GetPdgCode() == 443){//Is JPsi
440 if(particle->GetNDaughters()==2){
441 if(TMath::Abs(fStack->Particle(particle->GetFirstDaughter())->GetPdgCode()) == 11 &&
442 TMath::Abs(fStack->Particle(particle->GetLastDaughter())->GetPdgCode()) == 11){
443 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
444 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
445 if(TMath::Abs(daug0->Eta()) < 0.9 && TMath::Abs(daug1->Eta()) < 0.9)
446 fHistograms->FillTable("Table_Electrons",3);//e+ e- from J/Psi inside acceptance
448 if( TMath::Abs(daug0->Eta()) < 0.9){
449 if(daug0->GetPdgCode() == -11)
450 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
452 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
455 if(TMath::Abs(daug1->Eta()) < 0.9){
456 if(daug1->GetPdgCode() == -11)
457 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
459 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
464 // const int CHI_C0 = 10441;
465 // const int CHI_C1 = 20443;
466 // const int CHI_C2 = 445
467 if(particle->GetPdgCode() == 22){//gamma from JPsi
468 if(particle->GetMother(0) > -1){
469 if(fStack->Particle(particle->GetMother(0))->GetPdgCode() == 10441 ||
470 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 20443 ||
471 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 445){
472 if(TMath::Abs(particle->Eta()) < 1.2)
473 fHistograms->FillTable("Table_Electrons",17);// gamma from chic inside accptance
477 if(particle->GetPdgCode() == 10441 || particle->GetPdgCode() == 20443 || particle->GetPdgCode() == 445){
478 if( particle->GetNDaughters() == 2){
479 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
480 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
482 if( (daug0->GetPdgCode() == 443 || daug0->GetPdgCode() == 22) && (daug1->GetPdgCode() == 443 || daug1->GetPdgCode() == 22) ){
483 if( daug0->GetPdgCode() == 443){
484 TParticle* daugE0 = fStack->Particle(daug0->GetFirstDaughter());
485 TParticle* daugE1 = fStack->Particle(daug0->GetLastDaughter());
486 if( TMath::Abs(daug1->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
487 fHistograms->FillTable("Table_Electrons",18);
490 else if (daug1->GetPdgCode() == 443){
491 TParticle* daugE0 = fStack->Particle(daug1->GetFirstDaughter());
492 TParticle* daugE1 = fStack->Particle(daug1->GetLastDaughter());
493 if( TMath::Abs(daug0->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
494 fHistograms->FillTable("Table_Electrons",18);
501 /////////////////////End Chic Analysis////////////////////////////
504 if(TMath::Abs(particle->Eta())> fV0Reader->GetEtaCut() ) continue;
506 if(particle->R()>fV0Reader->GetMaxRCut()) continue; // cuts on distance from collision point
508 Double_t tmpPhi=particle->Phi();
510 if(particle->Phi()> TMath::Pi()){
511 tmpPhi = particle->Phi()-(2*TMath::Pi());
515 if(particle->Energy() - particle->Pz() == 0 || particle->Energy() + particle->Pz() == 0){
519 rapidity = 0.5*(TMath::Log((particle->Energy()+particle->Pz()) / (particle->Energy()-particle->Pz())));
523 if (particle->GetPdgCode() == 22){
526 if(particle->GetMother(0) >-1 && fStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
527 continue; // no photon as mothers!
530 if(particle->GetMother(0) >= fStack->GetNprimary()){
531 continue; // the gamma has a mother, and it is not a primary particle
534 fHistograms->FillHistogram("MC_allGamma_Energy", particle->Energy());
535 fHistograms->FillHistogram("MC_allGamma_Pt", particle->Pt());
536 fHistograms->FillHistogram("MC_allGamma_Eta", particle->Eta());
537 fHistograms->FillHistogram("MC_allGamma_Phi", tmpPhi);
538 fHistograms->FillHistogram("MC_allGamma_Rapid", rapidity);
542 containerInput[0] = particle->Pt();
543 containerInput[1] = particle->Eta();
544 if(particle->GetMother(0) >=0){
545 containerInput[2] = fStack->Particle(particle->GetMother(0))->GetMass();
548 containerInput[2]=-1;
551 fCFManager->GetParticleContainer()->Fill(containerInput,kStepGenerated); // generated gamma
553 if(particle->GetMother(0) < 0){ // direct gamma
554 fHistograms->FillHistogram("MC_allDirectGamma_Energy",particle->Energy());
555 fHistograms->FillHistogram("MC_allDirectGamma_Pt", particle->Pt());
556 fHistograms->FillHistogram("MC_allDirectGamma_Eta", particle->Eta());
557 fHistograms->FillHistogram("MC_allDirectGamma_Phi", tmpPhi);
558 fHistograms->FillHistogram("MC_allDirectGamma_Rapid", rapidity);
561 // looking for conversion (electron + positron from pairbuilding (= 5) )
562 TParticle* ePos = NULL;
563 TParticle* eNeg = NULL;
565 if(particle->GetNDaughters() >= 2){
566 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
567 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
568 if(tmpDaughter->GetUniqueID() == 5){
569 if(tmpDaughter->GetPdgCode() == 11){
572 else if(tmpDaughter->GetPdgCode() == -11){
580 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
585 Double_t ePosPhi = ePos->Phi();
586 if(ePos->Phi()> TMath::Pi()) ePosPhi = ePos->Phi()-(2*TMath::Pi());
588 Double_t eNegPhi = eNeg->Phi();
589 if(eNeg->Phi()> TMath::Pi()) eNegPhi = eNeg->Phi()-(2*TMath::Pi());
592 if(ePos->Pt()<fV0Reader->GetPtCut() || eNeg->Pt()<fV0Reader->GetPtCut()){
593 continue; // no reconstruction below the Pt cut
596 if(TMath::Abs(ePos->Eta())> fV0Reader->GetEtaCut() || TMath::Abs(eNeg->Eta())> fV0Reader->GetEtaCut()){
600 if(ePos->R()>fV0Reader->GetMaxRCut()){
601 continue; // cuts on distance from collision point
604 if(TMath::Abs(ePos->Vz()) > fV0Reader->GetMaxZCut()){
605 continue; // outside material
609 if((TMath::Abs(ePos->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() > ePos->R()){
610 continue; // line cut to exclude regions where we do not reconstruct
616 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructable); // reconstructable gamma
618 fHistograms->FillHistogram("MC_ConvGamma_Energy", particle->Energy());
619 fHistograms->FillHistogram("MC_ConvGamma_Pt", particle->Pt());
620 fHistograms->FillHistogram("MC_ConvGamma_Eta", particle->Eta());
621 fHistograms->FillHistogram("MC_ConvGamma_Phi", tmpPhi);
622 fHistograms->FillHistogram("MC_ConvGamma_Rapid", rapidity);
623 fHistograms->FillHistogram("MC_ConvGamma_Pt_Eta", particle->Pt(),particle->Eta());
625 fHistograms->FillHistogram("MC_E_Energy", eNeg->Energy());
626 fHistograms->FillHistogram("MC_E_Pt", eNeg->Pt());
627 fHistograms->FillHistogram("MC_E_Eta", eNeg->Eta());
628 fHistograms->FillHistogram("MC_E_Phi", eNegPhi);
630 fHistograms->FillHistogram("MC_P_Energy", ePos->Energy());
631 fHistograms->FillHistogram("MC_P_Pt", ePos->Pt());
632 fHistograms->FillHistogram("MC_P_Eta", ePos->Eta());
633 fHistograms->FillHistogram("MC_P_Phi", ePosPhi);
637 Int_t rBin = fHistograms->GetRBin(ePos->R());
638 Int_t zBin = fHistograms->GetZBin(ePos->Vz());
639 Int_t phiBin = fHistograms->GetPhiBin(particle->Phi());
641 TVector3 vtxPos(ePos->Vx(),ePos->Vy(),ePos->Vz());
643 TString nameMCMappingPhiR="";
644 nameMCMappingPhiR.Form("MC_Conversion_Mapping_Phi%02d_R%02d",phiBin,rBin);
645 // fHistograms->FillHistogram(nameMCMappingPhiR, ePos->Vz(), particle->Eta());
647 TString nameMCMappingPhi="";
648 nameMCMappingPhi.Form("MC_Conversion_Mapping_Phi%02d",phiBin);
649 // fHistograms->FillHistogram(nameMCMappingPhi, particle->Eta());
650 //fHistograms->FillHistogram(nameMCMappingPhi, ePos->Vz(), particle->Eta());
652 TString nameMCMappingR="";
653 nameMCMappingR.Form("MC_Conversion_Mapping_R%02d",rBin);
654 // fHistograms->FillHistogram(nameMCMappingR, particle->Eta());
655 //fHistograms->FillHistogram(nameMCMappingR,ePos->Vz(), particle->Eta());
657 TString nameMCMappingPhiInR="";
658 nameMCMappingPhiInR.Form("MC_Conversion_Mapping_Phi_in_R_%02d",rBin);
659 // fHistograms->FillHistogram(nameMCMappingPhiInR, tmpPhi);
660 fHistograms->FillHistogram(nameMCMappingPhiInR, vtxPos.Phi());
662 TString nameMCMappingZInR="";
663 nameMCMappingZInR.Form("MC_Conversion_Mapping_Z_in_R_%02d",rBin);
664 fHistograms->FillHistogram(nameMCMappingZInR,ePos->Vz() );
667 TString nameMCMappingPhiInZ="";
668 nameMCMappingPhiInZ.Form("MC_Conversion_Mapping_Phi_in_Z_%02d",zBin);
669 // fHistograms->FillHistogram(nameMCMappingPhiInR, tmpPhi);
670 fHistograms->FillHistogram(nameMCMappingPhiInZ, vtxPos.Phi());
672 TString nameMCMappingRInZ="";
673 nameMCMappingRInZ.Form("MC_Conversion_Mapping_R_in_Z_%02d",zBin);
674 fHistograms->FillHistogram(nameMCMappingRInZ,ePos->R() );
676 if(particle->Pt() > fLowPtMapping && particle->Pt()< fHighPtMapping){
677 TString nameMCMappingMidPtPhiInR="";
678 nameMCMappingMidPtPhiInR.Form("MC_Conversion_Mapping_MidPt_Phi_in_R_%02d",rBin);
679 fHistograms->FillHistogram(nameMCMappingMidPtPhiInR, vtxPos.Phi());
681 TString nameMCMappingMidPtZInR="";
682 nameMCMappingMidPtZInR.Form("MC_Conversion_Mapping_MidPt_Z_in_R_%02d",rBin);
683 fHistograms->FillHistogram(nameMCMappingMidPtZInR,ePos->Vz() );
686 TString nameMCMappingMidPtPhiInZ="";
687 nameMCMappingMidPtPhiInZ.Form("MC_Conversion_Mapping_MidPt_Phi_in_Z_%02d",zBin);
688 fHistograms->FillHistogram(nameMCMappingMidPtPhiInZ, vtxPos.Phi());
690 TString nameMCMappingMidPtRInZ="";
691 nameMCMappingMidPtRInZ.Form("MC_Conversion_Mapping_MidPt_R_in_Z_%02d",zBin);
692 fHistograms->FillHistogram(nameMCMappingMidPtRInZ,ePos->R() );
698 fHistograms->FillHistogram("MC_Conversion_R",ePos->R());
699 fHistograms->FillHistogram("MC_Conversion_ZR",ePos->Vz(),ePos->R());
700 fHistograms->FillHistogram("MC_Conversion_XY",ePos->Vx(),ePos->Vy());
701 fHistograms->FillHistogram("MC_Conversion_OpeningAngle",GetMCOpeningAngle(ePos, eNeg));
702 fHistograms->FillHistogram("MC_ConvGamma_E_AsymmetryP",particle->P(),eNeg->P()/particle->P());
703 fHistograms->FillHistogram("MC_ConvGamma_P_AsymmetryP",particle->P(),ePos->P()/particle->P());
706 if(particle->GetMother(0) < 0){ // no mother = direct gamma, still inside converted
707 fHistograms->FillHistogram("MC_ConvDirectGamma_Energy",particle->Energy());
708 fHistograms->FillHistogram("MC_ConvDirectGamma_Pt", particle->Pt());
709 fHistograms->FillHistogram("MC_ConvDirectGamma_Eta", particle->Eta());
710 fHistograms->FillHistogram("MC_ConvDirectGamma_Phi", tmpPhi);
711 fHistograms->FillHistogram("MC_ConvDirectGamma_Rapid", rapidity);
713 } // end direct gamma
714 else{ // mother exits
715 /* if( fStack->Particle(particle->GetMother(0))->GetPdgCode()==10441 ||//chic0
716 fStack->Particle(particle->GetMother(0))->GetPdgCode()==20443 ||//psi2S
717 fStack->Particle(particle->GetMother(0))->GetPdgCode()==445 //chic2
719 fMCGammaChic.push_back(particle);
722 } // end if mother exits
723 } // end if particle is a photon
727 // process motherparticles (2 gammas as daughters)
728 // the motherparticle had already to pass the R and the eta cut, but no line cut.
729 // the line cut is just valid for the conversions!
731 if(particle->GetNDaughters() == 2){
733 TParticle* daughter0 = (TParticle*)fStack->Particle(particle->GetFirstDaughter());
734 TParticle* daughter1 = (TParticle*)fStack->Particle(particle->GetLastDaughter());
736 if(daughter0->GetPdgCode() != 22 || daughter1->GetPdgCode() != 22) continue; //check for gamma gamma daughters
738 // Check the acceptance for both gammas
739 Bool_t gammaEtaCut = kTRUE;
740 if(TMath::Abs(daughter0->Eta()) > fV0Reader->GetEtaCut() || TMath::Abs(daughter1->Eta()) > fV0Reader->GetEtaCut() ) gammaEtaCut = kFALSE;
741 Bool_t gammaRCut = kTRUE;
742 if(daughter0->R() > fV0Reader->GetMaxRCut() || daughter1->R() > fV0Reader->GetMaxRCut() ) gammaRCut = kFALSE;
746 // check for conversions now -> have to pass eta, R and line cut!
747 Bool_t daughter0Electron = kFALSE;
748 Bool_t daughter0Positron = kFALSE;
749 Bool_t daughter1Electron = kFALSE;
750 Bool_t daughter1Positron = kFALSE;
752 if(daughter0->GetNDaughters() >= 2){ // first gamma
753 for(Int_t TrackIndex=daughter0->GetFirstDaughter();TrackIndex<=daughter0->GetLastDaughter();TrackIndex++){
754 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
755 if(tmpDaughter->GetUniqueID() == 5){
756 if(tmpDaughter->GetPdgCode() == 11){
757 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
758 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
759 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
760 daughter0Electron = kTRUE;
766 else if(tmpDaughter->GetPdgCode() == -11){
767 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
768 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
769 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
770 daughter0Positron = kTRUE;
780 if(daughter1->GetNDaughters() >= 2){ // second gamma
781 for(Int_t TrackIndex=daughter1->GetFirstDaughter();TrackIndex<=daughter1->GetLastDaughter();TrackIndex++){
782 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
783 if(tmpDaughter->GetUniqueID() == 5){
784 if(tmpDaughter->GetPdgCode() == 11){
785 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
786 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
787 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
788 daughter1Electron = kTRUE;
794 else if(tmpDaughter->GetPdgCode() == -11){
795 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
796 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
797 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
798 daughter1Positron = kTRUE;
810 if(particle->GetPdgCode()==111){ //Pi0
811 if( iTracks >= fStack->GetNprimary()){
812 fHistograms->FillHistogram("MC_Pi0_Secondaries_Eta", particle->Eta());
813 fHistograms->FillHistogram("MC_Pi0_Secondaries_Rapid", rapidity);
814 fHistograms->FillHistogram("MC_Pi0_Secondaries_Phi", tmpPhi);
815 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt", particle->Pt());
816 fHistograms->FillHistogram("MC_Pi0_Secondaries_Energy", particle->Energy());
817 fHistograms->FillHistogram("MC_Pi0_Secondaries_R", particle->R());
818 fHistograms->FillHistogram("MC_Pi0_Secondaries_ZR", particle->Vz(),particle->R());
819 fHistograms->FillHistogram("MC_Pi0_Secondaries_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
820 fHistograms->FillHistogram("MC_Pi0_Secondaries_XY", particle->Vx(),particle->Vy());//only fill from one daughter to avoid multiple filling
822 if(gammaEtaCut && gammaRCut){
823 //if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
824 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
825 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
826 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
827 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
828 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
833 fHistograms->FillHistogram("MC_Pi0_Eta", particle->Eta());
834 fHistograms->FillHistogram("MC_Pi0_Rapid", rapidity);
835 fHistograms->FillHistogram("MC_Pi0_Phi", tmpPhi);
836 fHistograms->FillHistogram("MC_Pi0_Pt", particle->Pt());
837 fHistograms->FillHistogram("MC_Pi0_Energy", particle->Energy());
838 fHistograms->FillHistogram("MC_Pi0_R", particle->R());
839 fHistograms->FillHistogram("MC_Pi0_ZR", particle->Vz(),particle->R());
840 fHistograms->FillHistogram("MC_Pi0_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
841 fHistograms->FillHistogram("MC_Pi0_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
843 if(gammaEtaCut && gammaRCut){
844 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
845 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
846 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
847 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
848 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
849 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
850 fHistograms->FillHistogram("MC_Pi0_ZR_ConvGamma_withinAcceptance", particle->Vz(),particle->R());
856 if(particle->GetPdgCode()==221){ //Eta
857 fHistograms->FillHistogram("MC_Eta_Eta", particle->Eta());
858 fHistograms->FillHistogram("MC_Eta_Rapid", rapidity);
859 fHistograms->FillHistogram("MC_Eta_Phi",tmpPhi);
860 fHistograms->FillHistogram("MC_Eta_Pt", particle->Pt());
861 fHistograms->FillHistogram("MC_Eta_Energy", particle->Energy());
862 fHistograms->FillHistogram("MC_Eta_R", particle->R());
863 fHistograms->FillHistogram("MC_Eta_ZR", particle->Vz(),particle->R());
864 fHistograms->FillHistogram("MC_Eta_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
865 fHistograms->FillHistogram("MC_Eta_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
867 if(gammaEtaCut && gammaRCut){
868 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
869 fHistograms->FillHistogram("MC_Eta_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
870 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
871 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
872 fHistograms->FillHistogram("MC_Eta_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
873 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
874 fHistograms->FillHistogram("MC_Eta_ZR_ConvGamma_withinAcceptance", particle->Vz(),particle->R());
881 // all motherparticles with 2 gammas as daughters
882 fHistograms->FillHistogram("MC_Mother_R", particle->R());
883 fHistograms->FillHistogram("MC_Mother_ZR", particle->Vz(),particle->R());
884 fHistograms->FillHistogram("MC_Mother_XY", particle->Vx(),particle->Vy());
885 fHistograms->FillHistogram("MC_Mother_Mass", particle->GetCalcMass());
886 fHistograms->FillHistogram("MC_Mother_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
887 fHistograms->FillHistogram("MC_Mother_Energy", particle->Energy());
888 fHistograms->FillHistogram("MC_Mother_Pt", particle->Pt());
889 fHistograms->FillHistogram("MC_Mother_Eta", particle->Eta());
890 fHistograms->FillHistogram("MC_Mother_Rapid", rapidity);
891 fHistograms->FillHistogram("MC_Mother_Phi",tmpPhi);
892 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt",particle->GetMass(),particle->Pt());
894 if(gammaEtaCut && gammaRCut){
895 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
896 fHistograms->FillHistogram("MC_Mother_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
897 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
898 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_withinAcceptance",particle->GetMass(),particle->Pt());
899 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
900 fHistograms->FillHistogram("MC_Mother_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
901 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
902 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_ConvGamma_withinAcceptance",particle->GetMass(),particle->Pt());
907 } // end passed R and eta cut
909 } // end if(particle->GetNDaughters() == 2)
911 }// end for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++)
913 } // end ProcessMCData
917 void AliAnalysisTaskGammaConversion::FillNtuple(){
918 //Fills the ntuple with the different values
920 if(fGammaNtuple == NULL){
923 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
924 for(Int_t i=0;i<numberOfV0s;i++){
925 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};
926 AliESDv0 * cV0 = fV0Reader->GetV0(i);
929 fV0Reader->GetPIDProbability(negPID,posPID);
930 values[0]=cV0->GetOnFlyStatus();
931 values[1]=fV0Reader->CheckForPrimaryVertex();
934 values[4]=fV0Reader->GetX();
935 values[5]=fV0Reader->GetY();
936 values[6]=fV0Reader->GetZ();
937 values[7]=fV0Reader->GetXYRadius();
938 values[8]=fV0Reader->GetMotherCandidateNDF();
939 values[9]=fV0Reader->GetMotherCandidateChi2();
940 values[10]=fV0Reader->GetMotherCandidateEnergy();
941 values[11]=fV0Reader->GetMotherCandidateEta();
942 values[12]=fV0Reader->GetMotherCandidatePt();
943 values[13]=fV0Reader->GetMotherCandidateMass();
944 values[14]=fV0Reader->GetMotherCandidateWidth();
945 // values[15]=fV0Reader->GetMotherMCParticle()->Pt(); MOVED TO THE END, HAS TO BE CALLED AFTER HasSameMother NB: still has the same entry in the array
946 values[16]=fV0Reader->GetOpeningAngle();
947 values[17]=fV0Reader->GetNegativeTrackEnergy();
948 values[18]=fV0Reader->GetNegativeTrackPt();
949 values[19]=fV0Reader->GetNegativeTrackEta();
950 values[20]=fV0Reader->GetNegativeTrackPhi();
951 values[21]=fV0Reader->GetPositiveTrackEnergy();
952 values[22]=fV0Reader->GetPositiveTrackPt();
953 values[23]=fV0Reader->GetPositiveTrackEta();
954 values[24]=fV0Reader->GetPositiveTrackPhi();
955 values[25]=fV0Reader->HasSameMCMother();
957 values[26]=fV0Reader->GetMotherMCParticlePDGCode();
958 values[15]=fV0Reader->GetMotherMCParticle()->Pt();
960 fTotalNumberOfAddedNtupleEntries++;
961 fGammaNtuple->Fill(values);
963 fV0Reader->ResetV0IndexNumber();
967 void AliAnalysisTaskGammaConversion::ProcessV0sNoCut(){
968 // Process all the V0's without applying any cuts to it
970 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
971 for(Int_t i=0;i<numberOfV0s;i++){
972 /*AliESDv0 * cV0 = */fV0Reader->GetV0(i);
974 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
978 // if( !fV0Reader->GetV0(i)->GetOnFlyStatus()){
979 if( !fV0Reader->CheckV0FinderStatus(i)){
984 if( !((fV0Reader->GetNegativeESDTrack())->GetStatus() & AliESDtrack::kTPCrefit) ||
985 !((fV0Reader->GetPositiveESDTrack())->GetStatus() & AliESDtrack::kTPCrefit) ){
989 if( fV0Reader->GetNegativeESDTrack()->GetSign()== fV0Reader->GetPositiveESDTrack()->GetSign()){
993 if( fV0Reader->GetNegativeESDTrack()->GetKinkIndex(0) > 0 ||
994 fV0Reader->GetPositiveESDTrack()->GetKinkIndex(0) > 0) {
1000 if(fV0Reader->HasSameMCMother() == kFALSE){
1004 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1005 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1007 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
1010 if(negativeMC->GetPdgCode() == positiveMC->GetPdgCode()){
1014 if(negativeMC->GetUniqueID() != 5 || positiveMC->GetUniqueID() !=5){ // id 5 is conversion
1018 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1020 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1021 fHistograms->FillHistogram("ESD_NoCutConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1022 fHistograms->FillHistogram("ESD_NoCutConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1023 fHistograms->FillHistogram("ESD_NoCutConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1024 fHistograms->FillHistogram("ESD_NoCutConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1025 fHistograms->FillHistogram("ESD_NoCutConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1026 fHistograms->FillHistogram("ESD_NoCutConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1027 fHistograms->FillHistogram("ESD_NoCutConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1028 fHistograms->FillHistogram("ESD_NoCutConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1029 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1031 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1032 fHistograms->FillHistogram("ESD_NoCutConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1034 fHistograms->FillHistogram("ESD_NoCutConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1035 fHistograms->FillHistogram("ESD_NoCutConversion_R", fV0Reader->GetXYRadius());
1036 fHistograms->FillHistogram("ESD_NoCutConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1037 fHistograms->FillHistogram("ESD_NoCutConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1038 fHistograms->FillHistogram("ESD_NoCutConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1039 fHistograms->FillHistogram("ESD_NoCutConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1040 fHistograms->FillHistogram("ESD_NoCutConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1041 fHistograms->FillHistogram("ESD_NoCutConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1043 fHistograms->FillHistogram("ESD_NoCutConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1044 fHistograms->FillHistogram("ESD_NoCutConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1045 fHistograms->FillHistogram("ESD_NoCutConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1046 fHistograms->FillHistogram("ESD_NoCutConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1048 //store MCTruth properties
1049 fHistograms->FillHistogram("ESD_NoCutConvGamma_MC_Pt_Eta", fV0Reader->GetMotherMCParticle()->Pt(),fV0Reader->GetMotherMCParticle()->Eta());
1050 fHistograms->FillHistogram("ESD_NoCutConversion_MC_ZR", negativeMC->Vz(),negativeMC->R());
1051 fHistograms->FillHistogram("ESD_NoCutConversion_MC_XY", negativeMC->Vx(),negativeMC->Vy());
1055 fV0Reader->ResetV0IndexNumber();
1058 void AliAnalysisTaskGammaConversion::ProcessV0s(){
1059 // see header file for documentation
1062 if(fWriteNtuple == kTRUE){
1066 Int_t nSurvivingV0s=0;
1067 while(fV0Reader->NextV0()){
1071 //-------------------------- filling v0 information -------------------------------------
1072 fHistograms->FillHistogram("ESD_Conversion_R", fV0Reader->GetXYRadius());
1073 fHistograms->FillHistogram("ESD_Conversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1074 fHistograms->FillHistogram("ESD_Conversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1075 fHistograms->FillHistogram("ESD_Conversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1077 fHistograms->FillHistogram("ESD_E_Energy", fV0Reader->GetNegativeTrackEnergy());
1078 fHistograms->FillHistogram("ESD_E_Pt", fV0Reader->GetNegativeTrackPt());
1079 fHistograms->FillHistogram("ESD_E_Eta", fV0Reader->GetNegativeTrackEta());
1080 fHistograms->FillHistogram("ESD_E_Phi", fV0Reader->GetNegativeTrackPhi());
1081 fHistograms->FillHistogram("ESD_E_nTPCClusters", fV0Reader->GetNegativeTracknTPCClusters());
1082 fHistograms->FillHistogram("ESD_E_nITSClusters", fV0Reader->GetNegativeTracknITSClusters());
1084 fHistograms->FillHistogram("ESD_P_Energy", fV0Reader->GetPositiveTrackEnergy());
1085 fHistograms->FillHistogram("ESD_P_Pt", fV0Reader->GetPositiveTrackPt());
1086 fHistograms->FillHistogram("ESD_P_Eta", fV0Reader->GetPositiveTrackEta());
1087 fHistograms->FillHistogram("ESD_P_Phi", fV0Reader->GetPositiveTrackPhi());
1088 fHistograms->FillHistogram("ESD_P_nTPCClusters", fV0Reader->GetPositiveTracknTPCClusters());
1089 fHistograms->FillHistogram("ESD_P_nITSClusters", fV0Reader->GetPositiveTracknITSClusters());
1091 fHistograms->FillHistogram("ESD_ConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1092 fHistograms->FillHistogram("ESD_ConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1093 fHistograms->FillHistogram("ESD_ConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1094 fHistograms->FillHistogram("ESD_ConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1095 fHistograms->FillHistogram("ESD_ConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1096 fHistograms->FillHistogram("ESD_ConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1097 fHistograms->FillHistogram("ESD_ConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1098 fHistograms->FillHistogram("ESD_ConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1099 fHistograms->FillHistogram("ESD_ConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1100 fHistograms->FillHistogram("ESD_ConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1102 fHistograms->FillHistogram("ESD_ConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1103 fHistograms->FillHistogram("ESD_ConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1105 fHistograms->FillHistogram("ESD_ConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1106 fHistograms->FillHistogram("ESD_ConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1107 fHistograms->FillHistogram("ESD_ConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1108 fHistograms->FillHistogram("ESD_ConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1110 fHistograms->FillHistogram("ESD_ConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1111 fHistograms->FillHistogram("ESD_ConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1112 fHistograms->FillHistogram("ESD_ConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1113 fHistograms->FillHistogram("ESD_ConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1117 Int_t rBin = fHistograms->GetRBin(fV0Reader->GetXYRadius());
1118 Int_t zBin = fHistograms->GetZBin(fV0Reader->GetZ());
1119 Int_t phiBin = fHistograms->GetPhiBin(fV0Reader->GetNegativeTrackPhi());
1120 TVector3 vtxConv(fV0Reader->GetX(),fV0Reader->GetY(), fV0Reader->GetZ());
1122 // Double_t motherCandidateEta= fV0Reader->GetMotherCandidateEta();
1124 TString nameESDMappingPhiR="";
1125 nameESDMappingPhiR.Form("ESD_Conversion_Mapping_Phi%02d_R%02d",phiBin,rBin);
1126 //fHistograms->FillHistogram(nameESDMappingPhiR, fV0Reader->GetZ(), motherCandidateEta);
1128 TString nameESDMappingPhi="";
1129 nameESDMappingPhi.Form("ESD_Conversion_Mapping_Phi%02d",phiBin);
1130 //fHistograms->FillHistogram(nameESDMappingPhi, fV0Reader->GetZ(), motherCandidateEta);
1132 TString nameESDMappingR="";
1133 nameESDMappingR.Form("ESD_Conversion_Mapping_R%02d",rBin);
1134 //fHistograms->FillHistogram(nameESDMappingR, fV0Reader->GetZ(), motherCandidateEta);
1136 TString nameESDMappingPhiInR="";
1137 nameESDMappingPhiInR.Form("ESD_Conversion_Mapping_Phi_in_R_%02d",rBin);
1138 // fHistograms->FillHistogram(nameESDMappingPhiInR, fV0Reader->GetMotherCandidatePhi());
1139 fHistograms->FillHistogram(nameESDMappingPhiInR, vtxConv.Phi());
1141 TString nameESDMappingZInR="";
1142 nameESDMappingZInR.Form("ESD_Conversion_Mapping_Z_in_R_%02d",rBin);
1143 fHistograms->FillHistogram(nameESDMappingZInR, fV0Reader->GetZ());
1145 TString nameESDMappingPhiInZ="";
1146 nameESDMappingPhiInZ.Form("ESD_Conversion_Mapping_Phi_in_Z_%02d",zBin);
1147 // fHistograms->FillHistogram(nameESDMappingPhiInR, fV0Reader->GetMotherCandidatePhi());
1148 fHistograms->FillHistogram(nameESDMappingPhiInZ, vtxConv.Phi());
1150 TString nameESDMappingRInZ="";
1151 nameESDMappingRInZ.Form("ESD_Conversion_Mapping_R_in_Z_%02d",zBin);
1152 fHistograms->FillHistogram(nameESDMappingRInZ, fV0Reader->GetXYRadius());
1154 if(fV0Reader->GetMotherCandidatePt() > fLowPtMapping && fV0Reader->GetMotherCandidatePt()< fHighPtMapping){
1155 TString nameESDMappingMidPtPhiInR="";
1156 nameESDMappingMidPtPhiInR.Form("ESD_Conversion_Mapping_MidPt_Phi_in_R_%02d",rBin);
1157 fHistograms->FillHistogram(nameESDMappingMidPtPhiInR, vtxConv.Phi());
1159 TString nameESDMappingMidPtZInR="";
1160 nameESDMappingMidPtZInR.Form("ESD_Conversion_Mapping_MidPt_Z_in_R_%02d",rBin);
1161 fHistograms->FillHistogram(nameESDMappingMidPtZInR, fV0Reader->GetZ());
1163 TString nameESDMappingMidPtPhiInZ="";
1164 nameESDMappingMidPtPhiInZ.Form("ESD_Conversion_Mapping_MidPt_Phi_in_Z_%02d",zBin);
1165 fHistograms->FillHistogram(nameESDMappingMidPtPhiInZ, vtxConv.Phi());
1167 TString nameESDMappingMidPtRInZ="";
1168 nameESDMappingMidPtRInZ.Form("ESD_Conversion_Mapping_MidPt_R_in_Z_%02d",zBin);
1169 fHistograms->FillHistogram(nameESDMappingMidPtRInZ, fV0Reader->GetXYRadius());
1176 new((*fKFReconstructedGammasTClone)[fKFReconstructedGammasTClone->GetEntriesFast()]) AliKFParticle(*fV0Reader->GetMotherCandidateKFCombination());
1177 fKFReconstructedGammasV0Index.push_back(fV0Reader->GetCurrentV0IndexNumber()-1);
1178 // fKFReconstructedGammas.push_back(*fV0Reader->GetMotherCandidateKFCombination());
1179 fElectronv1.push_back(fV0Reader->GetCurrentV0()->GetPindex());
1180 fElectronv2.push_back(fV0Reader->GetCurrentV0()->GetNindex());
1182 //----------------------------------- checking for "real" conversions (MC match) --------------------------------------
1185 if(fV0Reader->HasSameMCMother() == kFALSE){
1188 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1189 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1191 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
1195 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
1198 if(negativeMC->GetUniqueID() == 4 && positiveMC->GetUniqueID() ==4){// fill r distribution for Dalitz decays
1199 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 111){ //pi0
1200 fHistograms->FillHistogram("ESD_TrueDalitzContamination_R", fV0Reader->GetXYRadius());
1204 if(negativeMC->GetUniqueID() != 5 || positiveMC->GetUniqueID() !=5){// check if the daughters come from a conversion
1208 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1211 Double_t containerInput[3];
1212 containerInput[0] = fV0Reader->GetMotherCandidatePt();
1213 containerInput[1] = fV0Reader->GetMotherCandidateEta();
1214 containerInput[2] = fV0Reader->GetMotherCandidateMass();
1215 fCFManager->GetParticleContainer()->Fill(containerInput,kStepTrueGamma); // for CF
1218 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1219 fHistograms->FillHistogram("ESD_TrueConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1220 fHistograms->FillHistogram("ESD_TrueConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1221 fHistograms->FillHistogram("ESD_TrueConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1222 fHistograms->FillHistogram("ESD_TrueConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1223 fHistograms->FillHistogram("ESD_TrueConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1224 fHistograms->FillHistogram("ESD_TrueConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1225 fHistograms->FillHistogram("ESD_TrueConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1226 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1227 fHistograms->FillHistogram("ESD_TrueConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1228 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters());
1229 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters());
1230 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters(),fV0Reader->GetMotherCandidateMass());
1231 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters(),fV0Reader->GetMotherCandidateMass());
1233 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1234 fHistograms->FillHistogram("ESD_TrueConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1237 fHistograms->FillHistogram("ESD_TrueConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1238 fHistograms->FillHistogram("ESD_TrueConversion_R", fV0Reader->GetXYRadius());
1239 fHistograms->FillHistogram("ESD_TrueConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1240 fHistograms->FillHistogram("ESD_TrueConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1242 fHistograms->FillHistogram("ESD_TrueConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1243 fHistograms->FillHistogram("ESD_TrueConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1244 fHistograms->FillHistogram("ESD_TrueConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1245 fHistograms->FillHistogram("ESD_TrueConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1247 fHistograms->FillHistogram("ESD_TrueConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1248 fHistograms->FillHistogram("ESD_TrueConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1249 fHistograms->FillHistogram("ESD_TrueConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1250 fHistograms->FillHistogram("ESD_TrueConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1254 //store MCTruth properties
1255 fHistograms->FillHistogram("ESD_TrueConvGamma_MC_Pt_Eta", fV0Reader->GetMotherMCParticle()->Pt(),fV0Reader->GetMotherMCParticle()->Eta());
1256 fHistograms->FillHistogram("ESD_TrueConversion_MC_ZR", negativeMC->Vz(),negativeMC->R());
1257 fHistograms->FillHistogram("ESD_TrueConversion_MC_XY", negativeMC->Vx(),negativeMC->Vy());
1260 Double_t mcpt = fV0Reader->GetMotherMCParticle()->Pt();
1261 Double_t esdpt = fV0Reader->GetMotherCandidatePt();
1262 Double_t resdPt = 0;
1264 resdPt = ((esdpt - mcpt)/mcpt)*100;
1267 cout<<"Pt of MC particle is negative, this will cause wrong calculation of resPt"<<endl;
1270 fHistograms->FillHistogram("Resolution_dPt", mcpt, resdPt);
1271 fHistograms->FillHistogram("Resolution_MC_Pt", mcpt);
1272 fHistograms->FillHistogram("Resolution_ESD_Pt", esdpt);
1275 if(fV0Reader->GetNegativeMCParticle()->Vz() != 0){
1276 resdZ = ((fV0Reader->GetZ() -fV0Reader->GetNegativeMCParticle()->Vz())/fV0Reader->GetNegativeMCParticle()->Vz())*100;
1278 Double_t resdZAbs = 0;
1279 resdZAbs = (fV0Reader->GetZ() -fV0Reader->GetNegativeMCParticle()->Vz());
1281 fHistograms->FillHistogram("Resolution_dZAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdZAbs);
1282 fHistograms->FillHistogram("Resolution_dZ", fV0Reader->GetNegativeMCParticle()->Vz(), resdZ);
1283 fHistograms->FillHistogram("Resolution_MC_Z", fV0Reader->GetNegativeMCParticle()->Vz());
1284 fHistograms->FillHistogram("Resolution_ESD_Z", fV0Reader->GetZ());
1287 if(fV0Reader->GetNegativeMCParticle()->R() != 0){
1288 resdR = ((fV0Reader->GetXYRadius() - fV0Reader->GetNegativeMCParticle()->R())/fV0Reader->GetNegativeMCParticle()->R())*100;
1290 Double_t resdRAbs = 0;
1291 resdRAbs = (fV0Reader->GetXYRadius() - fV0Reader->GetNegativeMCParticle()->R());
1293 fHistograms->FillHistogram("Resolution_dRAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdRAbs);
1294 fHistograms->FillHistogram("Resolution_dR", fV0Reader->GetNegativeMCParticle()->R(), resdR);
1295 fHistograms->FillHistogram("Resolution_MC_R", fV0Reader->GetNegativeMCParticle()->R());
1296 fHistograms->FillHistogram("Resolution_ESD_R", fV0Reader->GetXYRadius());
1297 fHistograms->FillHistogram("Resolution_dR_dPt", resdR, resdPt);
1299 Double_t resdPhiAbs=0;
1301 resdPhiAbs= (fV0Reader->GetMotherCandidatePhi()-fV0Reader->GetNegativeMCParticle()->Phi());
1302 fHistograms->FillHistogram("Resolution_dPhiAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdPhiAbs);
1304 }//if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22)
1306 }//while(fV0Reader->NextV0)
1307 fHistograms->FillHistogram("ESD_NumberOfSurvivingV0s", nSurvivingV0s);
1308 fHistograms->FillHistogram("ESD_NumberOfV0s", fV0Reader->GetNumberOfV0s());
1309 fHistograms->FillHistogram("ESD_NumberOfContributorsVtx", fV0Reader->GetNumberOfContributorsVtx());
1311 fV0Reader->ResetV0IndexNumber();
1315 void AliAnalysisTaskGammaConversion::FillAODWithConversionGammas(){
1316 // Fill AOD with reconstructed Gamma
1318 for(Int_t gammaIndex=0;gammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();gammaIndex++){
1319 // for(UInt_t gammaIndex=0;gammaIndex<fKFReconstructedGammas.size();gammaIndex++){
1320 //Create AOD particle object from AliKFParticle
1322 /* AliKFParticle * gammakf = &fKFReconstructedGammas[gammaIndex];
1323 //You could add directly AliKFParticle objects to the AOD, avoiding dependences with PartCorr
1324 //but this means that I have to work a little bit more in my side.
1325 //AODPWG4Particle objects are simpler and lighter, I think
1326 AliAODPWG4Particle gamma = AliAODPWG4Particle(gammakf->Px(),gammakf->Py(),gammakf->Pz(), gammakf->E());
1327 gamma.SetLabel(-1);//How to get the MC label of the reconstructed gamma?
1328 gamma.SetCaloLabel(-1,-1); //How to get the MC label of the 2 electrons that form the gamma?
1329 gamma.SetDetector("CTS"); //tag the gamma as reconstructed in the central barrel
1330 gamma.SetPdg(AliCaloPID::kPhotonConv); //photon id
1331 gamma.SetTag(-1); //Here I usually put a flag saying that montecarlo says it is prompt, decay fragmentation photon, or hadrons or whatever
1333 //Add it to the aod list
1334 Int_t i = fAODBranch->GetEntriesFast();
1335 new((*fAODBranch)[i]) AliAODPWG4Particle(gamma);
1337 // AliKFParticle * gammakf = &fKFReconstructedGammas[gammaIndex];
1338 AliKFParticle * gammakf = (AliKFParticle *)fKFReconstructedGammasTClone->At(gammaIndex);
1339 AliGammaConversionAODObject aodObject;
1340 aodObject.SetPx(gammakf->GetPx());
1341 aodObject.SetPy(gammakf->GetPy());
1342 aodObject.SetPz(gammakf->GetPz());
1343 aodObject.SetLabel1(fElectronv1[gammaIndex]);
1344 aodObject.SetLabel2(fElectronv2[gammaIndex]);
1345 Int_t i = fAODBranch->GetEntriesFast();
1346 new((*fAODBranch)[i]) AliGammaConversionAODObject(aodObject);
1352 void AliAnalysisTaskGammaConversion::ProcessGammasForNeutralMesonAnalysis(){
1353 // see header file for documentation
1355 // for(UInt_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammas.size();firstGammaIndex++){
1356 // for(UInt_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFReconstructedGammas.size();secondGammaIndex++){
1358 if(fKFReconstructedGammasTClone->GetEntriesFast()>fV0Reader->GetNumberOfV0s()){
1359 cout<<"Warning, number of entries in the tclone is bigger than number of v0s"<<endl;
1362 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
1363 for(Int_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();secondGammaIndex++){
1365 // AliKFParticle * twoGammaDecayCandidateDaughter0 = &fKFReconstructedGammas[firstGammaIndex];
1366 // AliKFParticle * twoGammaDecayCandidateDaughter1 = &fKFReconstructedGammas[secondGammaIndex];
1368 AliKFParticle * twoGammaDecayCandidateDaughter0 = (AliKFParticle *)fKFReconstructedGammasTClone->At(firstGammaIndex);
1369 AliKFParticle * twoGammaDecayCandidateDaughter1 = (AliKFParticle *)fKFReconstructedGammasTClone->At(secondGammaIndex);
1371 if(fElectronv1[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv1[firstGammaIndex]==fElectronv2[secondGammaIndex]){
1374 if(fElectronv2[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv2[firstGammaIndex]==fElectronv2[secondGammaIndex]){
1378 AliKFParticle *twoGammaCandidate = new AliKFParticle(*twoGammaDecayCandidateDaughter0,*twoGammaDecayCandidateDaughter1);
1380 Double_t massTwoGammaCandidate = 0.;
1381 Double_t widthTwoGammaCandidate = 0.;
1382 Double_t chi2TwoGammaCandidate =10000.;
1383 twoGammaCandidate->GetMass(massTwoGammaCandidate,widthTwoGammaCandidate);
1384 if(twoGammaCandidate->GetNDF()>0){
1385 chi2TwoGammaCandidate = twoGammaCandidate->GetChi2()/twoGammaCandidate->GetNDF();
1387 if(chi2TwoGammaCandidate>0 && chi2TwoGammaCandidate<fV0Reader->GetChi2CutMeson()){
1389 TVector3 momentumVectorTwoGammaCandidate(twoGammaCandidate->GetPx(),twoGammaCandidate->GetPy(),twoGammaCandidate->GetPz());
1390 TVector3 spaceVectorTwoGammaCandidate(twoGammaCandidate->GetX(),twoGammaCandidate->GetY(),twoGammaCandidate->GetZ());
1392 Double_t openingAngleTwoGammaCandidate = twoGammaDecayCandidateDaughter0->GetAngle(*twoGammaDecayCandidateDaughter1);
1394 if(twoGammaCandidate->GetE() - twoGammaCandidate->GetPz() == 0 || twoGammaCandidate->GetE() + twoGammaCandidate->GetPz() == 0){
1398 rapidity = 0.5*(TMath::Log((twoGammaCandidate->GetE() +twoGammaCandidate->GetPz()) / (twoGammaCandidate->GetE()-twoGammaCandidate->GetPz())));
1401 if(openingAngleTwoGammaCandidate < fMinOpeningAngleGhostCut){
1402 delete twoGammaCandidate;
1403 continue; // minimum opening angle to avoid using ghosttracks
1406 fHistograms->FillHistogram("ESD_Mother_GammaDaughter_OpeningAngle", openingAngleTwoGammaCandidate);
1407 fHistograms->FillHistogram("ESD_Mother_Energy", twoGammaCandidate->GetE());
1408 fHistograms->FillHistogram("ESD_Mother_Pt", momentumVectorTwoGammaCandidate.Pt());
1409 fHistograms->FillHistogram("ESD_Mother_Eta", momentumVectorTwoGammaCandidate.Eta());
1410 fHistograms->FillHistogram("ESD_Mother_Rapid", rapidity);
1411 fHistograms->FillHistogram("ESD_Mother_Phi", spaceVectorTwoGammaCandidate.Phi());
1412 fHistograms->FillHistogram("ESD_Mother_Mass", massTwoGammaCandidate);
1413 fHistograms->FillHistogram("ESD_Mother_R", spaceVectorTwoGammaCandidate.Pt()); // Pt in Space == R!!!
1414 fHistograms->FillHistogram("ESD_Mother_ZR", twoGammaCandidate->GetZ(), spaceVectorTwoGammaCandidate.Pt());
1415 fHistograms->FillHistogram("ESD_Mother_XY", twoGammaCandidate->GetX(), twoGammaCandidate->GetY());
1416 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
1417 fHistograms->FillHistogram("ESD_Mother_InvMass",massTwoGammaCandidate);
1419 // if(fDoNeutralMesonV0MCCheck){
1421 //Kenneth: Checking the eta of the gamma to check the difference between 0.9 and 1.2
1422 Int_t indexKF1 = fKFReconstructedGammasV0Index.at(firstGammaIndex);
1423 if(indexKF1<fV0Reader->GetNumberOfV0s()){
1424 fV0Reader->GetV0(indexKF1);//updates to the correct v0
1425 Double_t eta1 = fV0Reader->GetMotherCandidateEta();
1426 Bool_t isRealPi0=kFALSE;
1427 Int_t gamma1MotherLabel=-1;
1428 if(fV0Reader->HasSameMCMother() == kTRUE){
1429 //cout<<"This v0 is a real v0!!!!"<<endl;
1430 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1431 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1432 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){
1433 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){
1434 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1435 gamma1MotherLabel=fV0Reader->GetMotherMCParticle()->GetFirstMother();
1440 Int_t indexKF2 = fKFReconstructedGammasV0Index.at(secondGammaIndex);
1441 if(indexKF1 == indexKF2){
1442 cout<<"index of the two KF particles are the same.... should not happen"<<endl;
1444 if(indexKF2<fV0Reader->GetNumberOfV0s()){
1445 fV0Reader->GetV0(indexKF2);
1446 Double_t eta2 = fV0Reader->GetMotherCandidateEta();
1447 Int_t gamma2MotherLabel=-1;
1448 if(fV0Reader->HasSameMCMother() == kTRUE){
1449 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1450 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1451 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){
1452 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){
1453 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1454 gamma2MotherLabel=fV0Reader->GetMotherMCParticle()->GetFirstMother();
1459 if(gamma1MotherLabel>=0 && gamma1MotherLabel==gamma2MotherLabel){
1460 if(fV0Reader->CheckIfPi0IsMother(gamma1MotherLabel)){
1465 if(TMath::Abs(eta1)>0.9 && TMath::Abs(eta2)>0.9){
1466 // fHistograms->FillHistogram("ESD_Mother_InvMass_1212",massTwoGammaCandidate);
1467 // fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1469 fHistograms->FillHistogram("ESD_TruePi0_InvMass_1212",massTwoGammaCandidate);
1470 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_1212",openingAngleTwoGammaCandidate);
1471 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1472 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
1473 fHistograms->FillHistogram("ESD_TruePi0_InvMass",massTwoGammaCandidate);
1476 else if(TMath::Abs(eta1)>0.9 || TMath::Abs(eta2)>0.9){
1477 // fHistograms->FillHistogram("ESD_Mother_InvMass_0912",massTwoGammaCandidate);
1478 // fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1480 fHistograms->FillHistogram("ESD_TruePi0_InvMass_0912",massTwoGammaCandidate);
1481 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_0912",openingAngleTwoGammaCandidate);
1482 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1483 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
1484 fHistograms->FillHistogram("ESD_TruePi0_InvMass",massTwoGammaCandidate);
1488 // fHistograms->FillHistogram("ESD_Mother_InvMass_0909",massTwoGammaCandidate);
1489 // fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1491 fHistograms->FillHistogram("ESD_TruePi0_InvMass_0909",massTwoGammaCandidate);
1492 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_0909",openingAngleTwoGammaCandidate);
1493 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1494 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
1495 fHistograms->FillHistogram("ESD_TruePi0_InvMass",massTwoGammaCandidate);
1501 if ( TMath::Abs(twoGammaDecayCandidateDaughter0->GetEta())<0.9 && TMath::Abs(twoGammaDecayCandidateDaughter1->GetEta())<0.9 ){
1502 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt_Fiducial",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
1503 fHistograms->FillHistogram("ESD_Mother_InvMass_Fiducial",massTwoGammaCandidate);
1506 if(TMath::Abs(twoGammaDecayCandidateDaughter0->GetEta())>0.9 && TMath::Abs(twoGammaDecayCandidateDaughter1->GetEta())>0.9){
1507 fHistograms->FillHistogram("ESD_Mother_InvMass_1212",massTwoGammaCandidate);
1508 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1510 else if(TMath::Abs(twoGammaDecayCandidateDaughter0->GetEta())>0.9 || TMath::Abs(twoGammaDecayCandidateDaughter1->GetEta())>0.9){
1511 fHistograms->FillHistogram("ESD_Mother_InvMass_0912",massTwoGammaCandidate);
1512 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1515 fHistograms->FillHistogram("ESD_Mother_InvMass_0909",massTwoGammaCandidate);
1516 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
1520 delete twoGammaCandidate;
1525 void AliAnalysisTaskGammaConversion::CalculateBackground(){
1526 // see header file for documentation
1529 TClonesArray * currentEventV0s = fV0Reader->GetCurrentEventGoodV0s();
1531 for(Int_t nEventsInBG=0;nEventsInBG <fV0Reader->GetNBGEvents();nEventsInBG++){
1532 AliGammaConversionKFVector * previousEventV0s = fV0Reader->GetBGGoodV0s(nEventsInBG);
1533 for(Int_t iCurrent=0;iCurrent<currentEventV0s->GetEntriesFast();iCurrent++){
1534 AliKFParticle currentEventGoodV0 = *(AliKFParticle *)(currentEventV0s->At(iCurrent));
1535 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1536 AliKFParticle previousGoodV0 = (AliKFParticle)(*(previousEventV0s->at(iPrevious)));
1538 AliKFParticle *backgroundCandidate = new AliKFParticle(currentEventGoodV0,previousGoodV0);
1540 Double_t massBG =0.;
1541 Double_t widthBG = 0.;
1542 Double_t chi2BG =10000.;
1543 backgroundCandidate->GetMass(massBG,widthBG);
1544 if(backgroundCandidate->GetNDF()>0){
1545 chi2BG = backgroundCandidate->GetChi2()/backgroundCandidate->GetNDF();
1546 if(chi2BG>0 && chi2BG<fV0Reader->GetChi2CutMeson()){
1548 TVector3 momentumVectorbackgroundCandidate(backgroundCandidate->GetPx(),backgroundCandidate->GetPy(),backgroundCandidate->GetPz());
1549 TVector3 spaceVectorbackgroundCandidate(backgroundCandidate->GetX(),backgroundCandidate->GetY(),backgroundCandidate->GetZ());
1551 Double_t openingAngleBG = currentEventGoodV0.GetAngle(previousGoodV0);
1554 if(backgroundCandidate->GetE() - backgroundCandidate->GetPz() == 0 || backgroundCandidate->GetE() + backgroundCandidate->GetPz() == 0) rapidity=0;
1555 else rapidity = 0.5*(TMath::Log((backgroundCandidate->GetE() +backgroundCandidate->GetPz()) / (backgroundCandidate->GetE()-backgroundCandidate->GetPz())));
1560 if(openingAngleBG < fMinOpeningAngleGhostCut ){
1561 delete backgroundCandidate;
1562 continue; // minimum opening angle to avoid using ghosttracks
1566 fHistograms->FillHistogram("ESD_Background_GammaDaughter_OpeningAngle", openingAngleBG);
1567 fHistograms->FillHistogram("ESD_Background_Energy", backgroundCandidate->GetE());
1568 fHistograms->FillHistogram("ESD_Background_Pt", momentumVectorbackgroundCandidate.Pt());
1569 fHistograms->FillHistogram("ESD_Background_Eta", momentumVectorbackgroundCandidate.Eta());
1570 fHistograms->FillHistogram("ESD_Background_Rapidity", rapidity);
1571 fHistograms->FillHistogram("ESD_Background_Phi", spaceVectorbackgroundCandidate.Phi());
1572 fHistograms->FillHistogram("ESD_Background_Mass", massBG);
1573 fHistograms->FillHistogram("ESD_Background_R", spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
1574 fHistograms->FillHistogram("ESD_Background_ZR", backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
1575 fHistograms->FillHistogram("ESD_Background_XY", backgroundCandidate->GetX(), backgroundCandidate->GetY());
1576 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt",massBG,momentumVectorbackgroundCandidate.Pt());
1577 fHistograms->FillHistogram("ESD_Background_InvMass",massBG);
1579 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
1580 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_Fiducial",massBG,momentumVectorbackgroundCandidate.Pt());
1581 fHistograms->FillHistogram("ESD_Background_InvMass_Fiducial",massBG);
1586 AliGammaConversionBGHandler * bgHandler = fV0Reader->GetBGHandler();
1588 Int_t zbin= bgHandler->GetZBinIndex(fV0Reader->GetVertexZ());
1589 Int_t mbin= bgHandler->GetMultiplicityBinIndex(fV0Reader->CountESDTracks());
1591 fHistograms->FillHistogram(Form("%d%dESD_Background_GammaDaughter_OpeningAngle",zbin,mbin), openingAngleBG);
1592 fHistograms->FillHistogram(Form("%d%dESD_Background_Energy",zbin,mbin), backgroundCandidate->GetE());
1593 fHistograms->FillHistogram(Form("%d%dESD_Background_Pt",zbin,mbin), momentumVectorbackgroundCandidate.Pt());
1594 fHistograms->FillHistogram(Form("%d%dESD_Background_Eta",zbin,mbin), momentumVectorbackgroundCandidate.Eta());
1595 fHistograms->FillHistogram(Form("%d%dESD_Background_Rapidity",zbin,mbin), rapidity);
1596 fHistograms->FillHistogram(Form("%d%dESD_Background_Phi",zbin,mbin), spaceVectorbackgroundCandidate.Phi());
1597 fHistograms->FillHistogram(Form("%d%dESD_Background_Mass",zbin,mbin), massBG);
1598 fHistograms->FillHistogram(Form("%d%dESD_Background_R",zbin,mbin), spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
1599 fHistograms->FillHistogram(Form("%d%dESD_Background_ZR",zbin,mbin), backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
1600 fHistograms->FillHistogram(Form("%d%dESD_Background_XY",zbin,mbin), backgroundCandidate->GetX(), backgroundCandidate->GetY());
1601 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
1602 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass",zbin,mbin),massBG);
1604 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
1605 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt_Fiducial",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
1606 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_Fiducial",zbin,mbin),massBG);
1610 delete backgroundCandidate;
1617 void AliAnalysisTaskGammaConversion::ProcessGammasForGammaJetAnalysis(){
1618 //ProcessGammasForGammaJetAnalysis
1620 Double_t distIsoMin;
1622 CreateListOfChargedParticles();
1625 // for(UInt_t gammaIndex=0;gammaIndex<fKFReconstructedGammas.size();gammaIndex++){
1626 for(Int_t gammaIndex=0;gammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();gammaIndex++){
1627 AliKFParticle * currentGamma = (AliKFParticle*)fKFReconstructedGammasTClone->At(gammaIndex);
1628 TVector3 momentumVectorCurrentGamma(currentGamma->GetPx(),currentGamma->GetPy(),currentGamma->GetPz());
1630 if( momentumVectorCurrentGamma.Pt()> fMinPtForGammaJet){
1631 distIsoMin=GetMinimumDistanceToCharge(gammaIndex);
1633 if (distIsoMin > fMinIsoConeSize && fLeadingChargedIndex>=0){
1634 CalculateJetCone(gammaIndex);
1640 void AliAnalysisTaskGammaConversion::CreateListOfChargedParticles(){
1641 // CreateListOfChargedParticles
1643 fESDEvent = fV0Reader->GetESDEvent();
1644 Int_t numberOfESDTracks=0;
1645 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
1646 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
1652 if(fEsdTrackCuts->AcceptTrack(curTrack) ){
1653 new((*fChargedParticles)[fChargedParticles->GetEntriesFast()]) AliESDtrack(*curTrack);
1654 // fChargedParticles.push_back(curTrack);
1655 fChargedParticlesId.push_back(iTracks);
1656 numberOfESDTracks++;
1659 fHistograms->FillHistogram("ESD_NumberOfGoodESDTracks",numberOfESDTracks);
1661 void AliAnalysisTaskGammaConversion::CalculateJetCone(Int_t gammaIndex){
1665 Double_t coneSize=0.3;
1668 // AliKFParticle * currentGamma = &fKFReconstructedGammas[gammaIndex];
1669 AliKFParticle * currentGamma = (AliKFParticle*)fKFReconstructedGammasTClone->At(gammaIndex);
1671 TVector3 momentumVectorCurrentGamma(currentGamma->GetPx(),currentGamma->GetPy(),currentGamma->GetPz());
1673 AliESDtrack* leadingCharged = (AliESDtrack*)(fChargedParticles->At(fLeadingChargedIndex));
1675 Double_t momLeadingCharged[3];
1676 leadingCharged->GetConstrainedPxPyPz(momLeadingCharged);
1678 TVector3 momentumVectorLeadingCharged(momLeadingCharged[0],momLeadingCharged[1],momLeadingCharged[2]);
1680 Double_t phi1=momentumVectorLeadingCharged.Phi();
1681 Double_t eta1=momentumVectorLeadingCharged.Eta();
1682 Double_t phi3=momentumVectorCurrentGamma.Phi();
1684 for(Int_t iCh=0;iCh<fChargedParticles->GetEntriesFast();iCh++){
1685 AliESDtrack* curTrack = (AliESDtrack*)(fChargedParticles->At(iCh));
1686 Int_t chId = fChargedParticlesId[iCh];
1687 if(fLeadingChargedIndex==chId || fLeadingChargedIndex==chId) continue;
1689 curTrack->GetConstrainedPxPyPz(mom);
1690 TVector3 momentumVectorChargedParticle(mom[0],mom[1],mom[2]);
1691 Double_t phi2=momentumVectorChargedParticle.Phi();
1692 Double_t eta2=momentumVectorChargedParticle.Eta();
1696 if( TMath::Abs(phi2 - phi1) <= ( TMath::TwoPi()-coneSize) ){
1697 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2-phi1),2) );
1699 if( (phi2 - phi1)> TMath::TwoPi()-coneSize ){
1700 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2-TMath::TwoPi()-phi1),2) );
1702 if( (phi2 - phi1)< -(TMath::TwoPi()-coneSize) ){
1703 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2+TMath::TwoPi()-phi1),2) );
1707 if(cone <coneSize&& momentumVectorChargedParticle.Pt()>fMinPtJetCone ){
1708 ptJet+= momentumVectorChargedParticle.Pt();
1709 Double_t ffzHdrGam = momentumVectorChargedParticle.Pt()/momentumVectorCurrentGamma.Pt();
1710 Double_t imbalanceHdrGam=-momentumVectorChargedParticle.Dot(momentumVectorCurrentGamma)/momentumVectorCurrentGamma.Mag2();
1711 fHistograms->FillHistogram("ESD_FFzHdrGam",ffzHdrGam);
1712 fHistograms->FillHistogram("ESD_ImbalanceHdrGam",imbalanceHdrGam);
1716 Double_t dphiHdrGam=phi3-phi2;
1717 if ( dphiHdrGam < (-TMath::PiOver2())){
1718 dphiHdrGam+=(TMath::TwoPi());
1721 if ( dphiHdrGam > (3.*TMath::PiOver2()) ){
1722 dphiHdrGam-=(TMath::TwoPi());
1725 if (momentumVectorChargedParticle.Pt()>fMinPtGamChargedCorr){
1726 fHistograms->FillHistogram("ESD_dphiHdrGamIsolated",dphiHdrGam);
1733 Double_t AliAnalysisTaskGammaConversion::GetMinimumDistanceToCharge(Int_t indexHighestPtGamma){
1734 // GetMinimumDistanceToCharge
1736 Double_t fIsoMin=100.;
1737 Double_t ptLeadingCharged=-1.;
1739 fLeadingChargedIndex=-1;
1741 AliKFParticle * gammaHighestPt = (AliKFParticle*)fKFReconstructedGammasTClone->At(indexHighestPtGamma);
1742 TVector3 momentumVectorgammaHighestPt(gammaHighestPt->GetPx(),gammaHighestPt->GetPy(),gammaHighestPt->GetPz());
1744 Double_t phi1=momentumVectorgammaHighestPt.Phi();
1745 Double_t eta1=momentumVectorgammaHighestPt.Eta();
1747 for(Int_t iCh=0;iCh<fChargedParticles->GetEntriesFast();iCh++){
1748 AliESDtrack* curTrack = (AliESDtrack*)(fChargedParticles->At(iCh));
1749 Int_t chId = fChargedParticlesId[iCh];
1750 if(fElectronv1[indexHighestPtGamma]==chId || fElectronv2[indexHighestPtGamma]==chId) continue;
1752 curTrack->GetConstrainedPxPyPz(mom);
1753 TVector3 momentumVectorChargedParticle(mom[0],mom[1],mom[2]);
1754 Double_t phi2=momentumVectorChargedParticle.Phi();
1755 Double_t eta2=momentumVectorChargedParticle.Eta();
1756 Double_t iso=pow( (pow( (eta1-eta2),2)+ pow((phi1-phi2),2)),0.5 );
1758 if(momentumVectorChargedParticle.Pt()>fMinPtIsoCone ){
1764 Double_t dphiHdrGam=phi1-phi2;
1765 if ( dphiHdrGam < (-TMath::PiOver2())){
1766 dphiHdrGam+=(TMath::TwoPi());
1769 if ( dphiHdrGam > (3.*TMath::PiOver2()) ){
1770 dphiHdrGam-=(TMath::TwoPi());
1772 if (momentumVectorChargedParticle.Pt()>fMinPtGamChargedCorr){
1773 fHistograms->FillHistogram("ESD_dphiHdrGam",dphiHdrGam);
1776 if (dphiHdrGam>0.9*TMath::Pi() && dphiHdrGam<1.1*TMath::Pi()){
1777 if (momentumVectorChargedParticle.Pt()> ptLeadingCharged && momentumVectorChargedParticle.Pt()>0.1*momentumVectorgammaHighestPt.Pt()){
1778 ptLeadingCharged=momentumVectorChargedParticle.Pt();
1779 fLeadingChargedIndex=iCh;
1784 fHistograms->FillHistogram("ESD_MinimumIsoDistance",fIsoMin);
1789 Int_t AliAnalysisTaskGammaConversion::GetIndexHighestPtGamma(){
1790 //GetIndexHighestPtGamma
1792 Int_t indexHighestPtGamma=-1;
1794 fGammaPtHighest = -100.;
1796 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
1797 AliKFParticle * gammaHighestPtCandidate = (AliKFParticle*)fKFReconstructedGammasTClone->At(firstGammaIndex);
1798 TVector3 momentumVectorgammaHighestPtCandidate(gammaHighestPtCandidate->GetPx(),gammaHighestPtCandidate->GetPy(),gammaHighestPtCandidate->GetPz());
1799 if (momentumVectorgammaHighestPtCandidate.Pt() > fGammaPtHighest){
1800 fGammaPtHighest=momentumVectorgammaHighestPtCandidate.Pt();
1801 //gammaHighestPt = gammaHighestPtCandidate;
1802 indexHighestPtGamma=firstGammaIndex;
1806 return indexHighestPtGamma;
1811 void AliAnalysisTaskGammaConversion::Terminate(Option_t */*option*/)
1813 // Terminate analysis
1815 AliDebug(1,"Do nothing in Terminate");
1818 void AliAnalysisTaskGammaConversion::UserCreateOutputObjects()
1821 if(fAODBranch==NULL){
1822 fAODBranch = new TClonesArray("AliGammaConversionAODObject", 0);
1824 fAODBranch->Delete();
1825 fAODBranch->SetName(fAODBranchName);
1826 AddAODBranch("TClonesArray", &fAODBranch);
1828 // Create the output container
1829 if(fOutputContainer != NULL){
1830 delete fOutputContainer;
1831 fOutputContainer = NULL;
1833 if(fOutputContainer == NULL){
1834 fOutputContainer = new TList();
1835 fOutputContainer->SetOwner(kTRUE);
1838 //Adding the histograms to the output container
1839 fHistograms->GetOutputContainer(fOutputContainer);
1843 if(fGammaNtuple == NULL){
1844 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);
1846 if(fNeutralMesonNtuple == NULL){
1847 fNeutralMesonNtuple = new TNtuple("NeutralMesonNtuple","NeutralMesonNtuple","test");
1849 TList * ntupleTList = new TList();
1850 ntupleTList->SetOwner(kTRUE);
1851 ntupleTList->SetName("Ntuple");
1852 ntupleTList->Add((TNtuple*)fGammaNtuple);
1853 fOutputContainer->Add(ntupleTList);
1856 fOutputContainer->SetName(GetName());
1859 Double_t AliAnalysisTaskGammaConversion::GetMCOpeningAngle(TParticle* const daughter0, TParticle* const daughter1) const{
1861 TVector3 v3D0(daughter0->Px(),daughter0->Py(),daughter0->Pz());
1862 TVector3 v3D1(daughter1->Px(),daughter1->Py(),daughter1->Pz());
1863 return v3D0.Angle(v3D1);
1866 void AliAnalysisTaskGammaConversion::CheckV0Efficiency(){
1867 // see header file for documentation
1869 vector<Int_t> indexOfGammaParticle;
1871 fStack = fV0Reader->GetMCStack();
1873 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
1874 return; // aborts if the primary vertex does not have contributors.
1877 for (Int_t iTracks = 0; iTracks < fStack->GetNprimary(); iTracks++) {
1878 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
1879 if(particle->GetPdgCode()==22){ //Gamma
1880 if(particle->GetNDaughters() >= 2){
1881 TParticle* electron=NULL;
1882 TParticle* positron=NULL;
1883 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
1884 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
1885 if(tmpDaughter->GetUniqueID() == 5){
1886 if(tmpDaughter->GetPdgCode() == 11){
1887 electron = tmpDaughter;
1889 else if(tmpDaughter->GetPdgCode() == -11){
1890 positron = tmpDaughter;
1894 if(electron!=NULL && positron!=0){
1895 if(electron->R()<160){
1896 indexOfGammaParticle.push_back(iTracks);
1903 Int_t nFoundGammas=0;
1904 Int_t nNotFoundGammas=0;
1906 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
1907 for(Int_t i=0;i<numberOfV0s;i++){
1908 fV0Reader->GetV0(i);
1910 if(fV0Reader->HasSameMCMother() == kFALSE){
1914 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1915 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1917 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
1920 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
1924 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1925 //TParticle * v0Gamma = fV0Reader->GetMotherMCParticle();
1926 for(UInt_t mcIndex=0;mcIndex<indexOfGammaParticle.size();mcIndex++){
1927 if(negativeMC->GetFirstMother()==indexOfGammaParticle[mcIndex]){
1939 void AliAnalysisTaskGammaConversion::ProcessGammaElectronsForChicAnalysis(){
1940 // see header file for documantation
1942 fESDEvent = fV0Reader->GetESDEvent();
1945 TClonesArray * vESDeNegTemp = new TClonesArray("AliESDtrack",0);
1946 TClonesArray * vESDePosTemp = new TClonesArray("AliESDtrack",0);
1947 TClonesArray * vESDxNegTemp = new TClonesArray("AliESDtrack",0);
1948 TClonesArray * vESDxPosTemp = new TClonesArray("AliESDtrack",0);
1949 TClonesArray * vESDeNegNoJPsi = new TClonesArray("AliESDtrack",0);
1950 TClonesArray * vESDePosNoJPsi = new TClonesArray("AliESDtrack",0);
1953 vector <AliESDtrack*> vESDeNegTemp(0);
1954 vector <AliESDtrack*> vESDePosTemp(0);
1955 vector <AliESDtrack*> vESDxNegTemp(0);
1956 vector <AliESDtrack*> vESDxPosTemp(0);
1957 vector <AliESDtrack*> vESDeNegNoJPsi(0);
1958 vector <AliESDtrack*> vESDePosNoJPsi(0);
1962 fHistograms->FillTable("Table_Electrons",0);//Count number of Events
1964 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
1965 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
1968 //print warning here
1972 double p[3];if(!curTrack->GetConstrainedPxPyPz(p))continue;
1973 double r[3];curTrack->GetConstrainedXYZ(r);
1977 fHistograms->FillTable("Table_Electrons",4);//Count number of ESD tracks
1979 Bool_t flagKink = kTRUE;
1980 Bool_t flagTPCrefit = kTRUE;
1981 Bool_t flagTRDrefit = kTRUE;
1982 Bool_t flagITSrefit = kTRUE;
1983 Bool_t flagTRDout = kTRUE;
1984 Bool_t flagVertex = kTRUE;
1987 //Cuts ---------------------------------------------------------------
1989 if(curTrack->GetKinkIndex(0) > 0){
1990 fHistograms->FillHistogram("Table_Electrons",5);//Count kink
1994 ULong_t trkStatus = curTrack->GetStatus();
1996 ULong_t tpcRefit = (trkStatus & AliESDtrack::kTPCrefit);
1999 fHistograms->FillHistogram("Table_Electrons",9);//Count not TPCrefit
2000 flagTPCrefit = kFALSE;
2003 ULong_t itsRefit = (trkStatus & AliESDtrack::kITSrefit);
2005 fHistograms->FillHistogram("Table_Electrons",10);//Count not ITSrefit
2006 flagITSrefit = kFALSE;
2009 ULong_t trdRefit = (trkStatus & AliESDtrack::kTRDrefit);
2012 fHistograms->FillHistogram("Table_Electrons",8); //Count not TRDrefit
2013 flagTRDrefit = kFALSE;
2016 ULong_t trdOut = (trkStatus & AliESDtrack::kTRDout);
2019 fHistograms->FillHistogram("Table_Electrons",7); //Count not TRDout
2020 flagTRDout = kFALSE;
2023 double nsigmaToVxt = GetSigmaToVertex(curTrack);
2025 if(nsigmaToVxt > 3){
2026 fHistograms->FillHistogram("Table_Electrons",6); //Count Tracks with number of sigmas > 3
2027 flagVertex = kFALSE;
2030 if(! (flagKink && flagTPCrefit && flagITSrefit && flagTRDrefit && flagTRDout && flagVertex ) ) continue;
2031 fHistograms->FillHistogram("Table_Electrons",11);//Count Tracks passed Cuts
2035 GetPID(curTrack, pid, weight);
2038 fHistograms->FillHistogram("Table_Electrons",12); //Count Tracks with pid != 0
2042 fHistograms->FillHistogram("Table_Electrons",13); //Count Tracks with pid != 0
2050 TLorentzVector curElec;
2051 curElec.SetXYZM(p[0],p[1],p[2],fElectronMass);
2055 Int_t labelMC = TMath::Abs(curTrack->GetLabel());
2056 TParticle* curParticle = fStack->Particle(labelMC);
2057 if(curTrack->GetSign() > 0){
2059 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
2060 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
2063 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
2064 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
2070 if(curTrack->GetSign() > 0){
2072 // vESDxPosTemp.push_back(curTrack);
2073 new((*vESDxPosTemp)[vESDxPosTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2077 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
2078 fHistograms->FillHistogram("ESD_ElectronPosPt",curElec.Pt());
2079 // fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
2080 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
2081 // fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
2082 // vESDePosTemp.push_back(curTrack);
2083 new((*vESDePosTemp)[vESDePosTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2090 new((*vESDxNegTemp)[vESDxNegTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2094 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
2095 fHistograms->FillHistogram("ESD_ElectronNegPt",curElec.Pt());
2096 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
2097 new((*vESDeNegTemp)[vESDeNegTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
2106 Bool_t ePosJPsi = kFALSE;
2107 Bool_t eNegJPsi = kFALSE;
2108 Bool_t ePosPi0 = kFALSE;
2109 Bool_t eNegPi0 = kFALSE;
2111 UInt_t iePosJPsi=0,ieNegJPsi=0,iePosPi0=0,ieNegPi0=0;
2113 for(Int_t iNeg=0; iNeg < vESDeNegTemp->GetEntriesFast(); iNeg++){
2114 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetPdgCode() == 11)
2115 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetMother(0) > -1){
2116 Int_t labelMother = fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetMother(0);
2117 TParticle* partMother = fStack ->Particle(labelMother);
2118 if (partMother->GetPdgCode() == 111){
2122 if(partMother->GetPdgCode() == 443){ //Mother JPsi
2123 fHistograms->FillTable("Table_Electrons",14);
2128 // vESDeNegNoJPsi.push_back(vESDeNegTemp[iNeg]);
2129 new((*vESDeNegNoJPsi)[vESDeNegNoJPsi->GetEntriesFast()]) AliESDtrack(*(AliESDtrack*)(vESDeNegTemp->At(iNeg)));
2130 // cout<<"ESD No Positivo JPsi "<<endl;
2136 for(Int_t iPos=0; iPos < vESDePosTemp->GetEntriesFast(); iPos++){
2137 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetPdgCode() == -11)
2138 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetMother(0) > -1){
2139 Int_t labelMother = fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetMother(0);
2140 TParticle* partMother = fStack ->Particle(labelMother);
2141 if (partMother->GetPdgCode() == 111){
2145 if(partMother->GetPdgCode() == 443){ //Mother JPsi
2146 fHistograms->FillTable("Table_Electrons",15);
2151 // vESDePosNoJPsi.push_back(vESDePosTemp[iPos]);
2152 new((*vESDePosNoJPsi)[vESDePosNoJPsi->GetEntriesFast()]) AliESDtrack(*(AliESDtrack*)(vESDePosTemp->At(iPos)));
2153 // cout<<"ESD No Negativo JPsi "<<endl;
2159 if( eNegJPsi && ePosJPsi ){
2160 TVector3 tempeNegV,tempePosV;
2161 tempeNegV.SetXYZ(((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Px(),((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Py(),((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Pz());
2162 tempePosV.SetXYZ(((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Px(),((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Py(),((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Pz());
2163 fHistograms->FillTable("Table_Electrons",16);
2164 fHistograms->FillHistogram("ESD_ElectronPosNegJPsiAngle",tempeNegV.Angle(tempePosV));
2165 fHistograms->FillHistogram("MC_ElectronPosNegJPsiAngle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->GetLabel())),
2166 fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->GetLabel()))));
2169 if( eNegPi0 && ePosPi0 ){
2170 TVector3 tempeNegV,tempePosV;
2171 tempeNegV.SetXYZ(((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Px(),((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Py(),((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Pz());
2172 tempePosV.SetXYZ(((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Px(),((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Py(),((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Pz());
2173 fHistograms->FillHistogram("ESD_ElectronPosNegPi0Angle",tempeNegV.Angle(tempePosV));
2174 fHistograms->FillHistogram("MC_ElectronPosNegPi0Angle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->GetLabel())),
2175 fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->GetLabel()))));
2179 FillAngle("ESD_eNegePosAngleBeforeCut",GetTLorentzVector(vESDeNegTemp),GetTLorentzVector(vESDePosTemp));
2181 CleanWithAngleCuts(*vESDeNegTemp,*vESDePosTemp,*fKFReconstructedGammasTClone);
2183 // vector <TLorentzVector> vCurrentTLVeNeg = GetTLorentzVector(fCurrentEventNegElectron);
2184 // vector <TLorentzVector> vCurrentTLVePos = GetTLorentzVector(fCurrentEventPosElectron);
2186 TClonesArray vCurrentTLVeNeg = GetTLorentzVector(fCurrentEventNegElectronTClone);
2187 TClonesArray vCurrentTLVePos = GetTLorentzVector(fCurrentEventPosElectronTClone);
2190 FillAngle("ESD_eNegePosAngleAfterCut",vCurrentTLVeNeg,vCurrentTLVePos);
2195 //FillAngle("ESD_eNegePosAngleAfterCut",CurrentTLVeNeg,CurrentTLVePos);
2198 FillElectronInvMass("ESD_InvMass_ePluseMinus",vCurrentTLVeNeg,vCurrentTLVePos);
2199 FillElectronInvMass("ESD_InvMass_xPlusxMinus",GetTLorentzVector(vESDxNegTemp),GetTLorentzVector(vESDxPosTemp));
2203 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusChiC","ESD_InvMass_GammaePluseMinusChiCDiff",*fKFReconstructedGammasCutTClone,vCurrentTLVeNeg,vCurrentTLVePos);
2205 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusPi0","ESD_InvMass_GammaePluseMinusPi0Diff",
2206 *fKFReconstructedGammasCutTClone,vCurrentTLVeNeg,vCurrentTLVePos);
2211 ElectronBackground("ESD_ENegBackground",vCurrentTLVeNeg);
2212 ElectronBackground("ESD_EPosBackground",vCurrentTLVePos);
2213 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVeNeg);
2214 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVePos);
2216 // Like Sign e+e- no JPsi
2217 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDeNegNoJPsi));
2218 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDePosNoJPsi));
2222 if( fCurrentEventPosElectronTClone->GetEntriesFast() > 0 && fCurrentEventNegElectronTClone->GetEntriesFast() > 0 && fKFReconstructedGammasCutTClone->GetEntriesFast() > 0 ){
2223 FillGammaElectronInvMass("ESD_EPosENegGammaBackgroundMX","ESD_EPosENegGammaBackgroundMXDiff",
2224 *fKFReconstructedGammasCutTClone,*fPreviousEventTLVNegElectronTClone,*fPreviousEventTLVPosElectronTClone);
2225 *fPreviousEventTLVNegElectronTClone = vCurrentTLVeNeg;
2226 *fPreviousEventTLVPosElectronTClone = vCurrentTLVePos;
2233 vtx[0]=0;vtx[1]=0;vtx[2]=0;
2234 for(UInt_t i=0;i<fKFReconstructedGammasChic.size();i++){
2236 // if(fMCGammaChicTempCut[i]->GetMother(0) < 0) continue;
2240 Int_t tempLabel = fStack->Particle(fMCGammaChicTempCut[i]->GetMother(0))->GetPdgCode();
2241 // cout<<" Label Pedro Gonzalez " <<tempLabel <<endl;
2243 // cout<<" Label Distance"<<fKFReconstructedGammasChic[i].GetDistanceFromVertex(vtx)<<endl;
2245 if( tempLabel == 10441 || tempLabel == 20443 || tempLabel == 445 )
2247 fHistograms->FillHistogram("ESD_PhotonsMomentum",fKFReconstructedGammasChic[i].GetMomentum());
2256 vESDeNegTemp->Delete();
2257 vESDePosTemp->Delete();
2258 vESDxNegTemp->Delete();
2259 vESDxPosTemp->Delete();
2260 vESDeNegNoJPsi->Delete();
2261 vESDePosNoJPsi->Delete();
2263 delete vESDeNegTemp;
2264 delete vESDePosTemp;
2265 delete vESDxNegTemp;
2266 delete vESDxPosTemp;
2267 delete vESDeNegNoJPsi;
2268 delete vESDePosNoJPsi;
2272 void AliAnalysisTaskGammaConversion::FillAngle(TString histoName,vector <TLorentzVector> tlVeNeg, vector <TLorentzVector> tlVePos){
2273 //see header file for documentation
2274 for( UInt_t iNeg=0; iNeg < tlVeNeg.size(); iNeg++){
2275 for (UInt_t iPos=0; iPos < tlVePos.size(); iPos++){
2276 fHistograms->FillHistogram(histoName.Data(),tlVeNeg[iNeg].Vect().Angle(tlVePos[iPos].Vect()));
2281 void AliAnalysisTaskGammaConversion::FillAngle(TString histoName,TClonesArray const tlVeNeg, TClonesArray const tlVePos){
2282 //see header file for documentation
2283 for( Int_t iNeg=0; iNeg < tlVeNeg.GetEntriesFast(); iNeg++){
2284 for (Int_t iPos=0; iPos < tlVePos.GetEntriesFast(); iPos++){
2285 fHistograms->FillHistogram(histoName.Data(),((TLorentzVector*)(tlVeNeg.At(iNeg)))->Vect().Angle(((TLorentzVector*)(tlVePos.At(iPos)))->Vect()));
2289 void AliAnalysisTaskGammaConversion::FillElectronInvMass(TString histoName, TClonesArray const eNeg, TClonesArray const ePos){
2290 //see header file for documentation
2291 for( Int_t n=0; n < eNeg.GetEntriesFast(); n++){
2292 TLorentzVector en = (*(TLorentzVector*)(eNeg.At(n)));
2293 for (Int_t p=0; p < ePos.GetEntriesFast(); p++){
2294 TLorentzVector ep = (*(TLorentzVector*)(ePos.At(p)));
2295 TLorentzVector np = ep + en;
2296 fHistograms->FillHistogram(histoName.Data(),np.M());
2301 void AliAnalysisTaskGammaConversion::FillGammaElectronInvMass(TString histoMass,TString histoDiff,TClonesArray const fKFGammas,
2302 TClonesArray const tlVeNeg,TClonesArray const tlVePos)
2304 //see header file for documentation
2306 for( Int_t iNeg=0; iNeg < tlVeNeg.GetEntriesFast(); iNeg++ ){
2308 for (Int_t iPos=0; iPos < tlVePos.GetEntriesFast(); iPos++){
2310 TLorentzVector xy = *((TLorentzVector *)(tlVePos.At(iPos))) + *((TLorentzVector *)(tlVeNeg.At(iNeg)));
2312 for (Int_t iGam=0; iGam < fKFGammas.GetEntriesFast(); iGam++){
2314 // AliKFParticle * gammaCandidate = &fKFGammas[iGam];
2315 AliKFParticle * gammaCandidate = (AliKFParticle *)(fKFGammas.At(iGam));
2318 g.SetXYZM(gammaCandidate->GetPx(),gammaCandidate->GetPy(),gammaCandidate->GetPz(),fGammaMass);
2319 TLorentzVector xyg = xy + g;
2320 fHistograms->FillHistogram(histoMass.Data(),xyg.M());
2321 fHistograms->FillHistogram(histoDiff.Data(),(xyg.M()-xy.M()));
2327 void AliAnalysisTaskGammaConversion::ElectronBackground(TString hBg, TClonesArray e)
2329 // see header file for documentation
2330 for(Int_t i=0; i < e.GetEntriesFast(); i++)
2332 for (Int_t j=i+1; j < e.GetEntriesFast(); j++)
2334 TLorentzVector ee = (*(TLorentzVector*)(e.At(i))) + (*(TLorentzVector*)(e.At(j)));
2336 fHistograms->FillHistogram(hBg.Data(),ee.M());
2342 void AliAnalysisTaskGammaConversion::CleanWithAngleCuts(TClonesArray const negativeElectrons,
2343 TClonesArray const positiveElectrons,
2344 TClonesArray const gammas){
2345 // see header file for documentation
2347 UInt_t sizeN = negativeElectrons.GetEntriesFast();
2348 UInt_t sizeP = positiveElectrons.GetEntriesFast();
2349 UInt_t sizeG = gammas.GetEntriesFast();
2353 vector <Bool_t> xNegBand(sizeN);
2354 vector <Bool_t> xPosBand(sizeP);
2355 vector <Bool_t> gammaBand(sizeG);
2358 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++) xNegBand[iNeg]=kTRUE;
2359 for(UInt_t iPos=0; iPos < sizeP; iPos++) xPosBand[iPos]=kTRUE;
2360 for(UInt_t iGam=0; iGam < sizeG; iGam++) gammaBand[iGam]=kTRUE;
2363 for(UInt_t iPos=0; iPos < sizeP; iPos++){
2366 ((AliESDtrack*)(positiveElectrons.At(iPos)))->GetConstrainedPxPyPz(aP);
2368 TVector3 ePosV(aP[0],aP[1],aP[2]);
2370 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++){
2373 ((AliESDtrack*)(negativeElectrons.At(iNeg)))->GetConstrainedPxPyPz(aN);
2374 TVector3 eNegV(aN[0],aN[1],aN[2]);
2376 if(ePosV.Angle(eNegV) < 0.05){ //e+e- from gamma
2377 xPosBand[iPos]=kFALSE;
2378 xNegBand[iNeg]=kFALSE;
2381 for(UInt_t iGam=0; iGam < sizeG; iGam++){
2382 AliKFParticle* gammaCandidate = (AliKFParticle*)gammas.At(iGam);
2383 TVector3 gammaCandidateVector(gammaCandidate->Px(),gammaCandidate->Py(),gammaCandidate->Pz());
2384 if(ePosV.Angle(gammaCandidateVector) < 0.05 || eNegV.Angle(gammaCandidateVector) < 0.05)
2385 gammaBand[iGam]=kFALSE;
2393 for(UInt_t iPos=0; iPos < sizeP; iPos++){
2395 new((*fCurrentEventPosElectronTClone)[fCurrentEventPosElectronTClone->GetEntriesFast()]) AliESDtrack((*(AliESDtrack*)(positiveElectrons.At(iPos))));
2396 // fCurrentEventPosElectron.push_back(positiveElectrons[iPos]);
2399 for(UInt_t iNeg=0;iNeg < sizeN; iNeg++){
2401 new((*fCurrentEventNegElectronTClone)[fCurrentEventNegElectronTClone->GetEntriesFast()]) AliESDtrack((*(AliESDtrack*)(negativeElectrons.At(iNeg))));
2402 // fCurrentEventNegElectron.push_back(negativeElectrons[iNeg]);
2405 for(UInt_t iGam=0; iGam < sizeG; iGam++){
2406 if(gammaBand[iGam]){
2407 new((*fKFReconstructedGammasCutTClone)[fKFReconstructedGammasCutTClone->GetEntriesFast()]) AliKFParticle((*(AliKFParticle*)(gammas.At(iGam))));
2408 //fKFReconstructedGammasCut.push_back(*(AliKFParticle*)gammas->At(iGam));
2414 void AliAnalysisTaskGammaConversion::GetPID(AliESDtrack *track, Stat_t &pid, Stat_t &weight)
2416 // see header file for documentation
2421 double wpartbayes[5];
2423 //get probability of the diffenrent particle types
2424 track->GetESDpid(wpart);
2426 // Tentative particle type "concentrations"
2427 double c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
2431 for (int i = 0; i < 5; i++)
2433 rcc+=(c[i] * wpart[i]);
2438 for (int i=0; i<5; i++) {
2439 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)
2440 wpartbayes[i] = c[i] * wpart[i] / rcc;
2448 //find most probable particle in ESD pid
2449 //0:Electron - 1:Muon - 2:Pion - 3:Kaon - 4:Proton
2450 for (int i = 0; i < 5; i++)
2452 if (wpartbayes[i] > max)
2455 max = wpartbayes[i];
2462 double AliAnalysisTaskGammaConversion::GetSigmaToVertex(AliESDtrack* t)
2464 // Calculates the number of sigma to the vertex.
2469 t->GetImpactParameters(b,bCov);
2470 if (bCov[0]<=0 || bCov[2]<=0) {
2471 AliDebug(1, "Estimated b resolution lower or equal zero!");
2472 bCov[0]=0; bCov[2]=0;
2474 bRes[0] = TMath::Sqrt(bCov[0]);
2475 bRes[1] = TMath::Sqrt(bCov[2]);
2477 // -----------------------------------
2478 // How to get to a n-sigma cut?
2480 // The accumulated statistics from 0 to d is
2482 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
2483 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
2485 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
2486 // Can this be expressed in a different way?
2488 if (bRes[0] == 0 || bRes[1] ==0)
2491 double d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
2493 // stupid rounding problem screws up everything:
2494 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
2495 if (TMath::Exp(-d * d / 2) < 1e-10)
2499 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
2503 //vector <TLorentzVector> AliAnalysisTaskGammaConversion::GetTLorentzVector(vector <AliESDtrack*> esdTrack){
2504 TClonesArray AliAnalysisTaskGammaConversion::GetTLorentzVector(TClonesArray *const esdTrack){
2505 //Return TLoresntz vector of track?
2506 // vector <TLorentzVector> tlVtrack(0);
2507 TClonesArray array("TLorentzVector",0);
2509 for(Int_t itrack=0; itrack < esdTrack->GetEntriesFast(); itrack++){
2511 //esdTrack[itrack]->GetConstrainedPxPyPz(p);
2512 ((AliESDtrack*)(esdTrack->At(itrack)))->GetConstrainedPxPyPz(p);
2513 TLorentzVector currentTrack;
2514 currentTrack.SetXYZM(p[0],p[1],p[2],fElectronMass);
2515 new((array)[array.GetEntriesFast()]) TLorentzVector(currentTrack);
2516 // tlVtrack.push_back(currentTrack);