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 "AliESDInputHandler.h"
34 #include "AliAnalysisManager.h"
35 #include "AliGammaConversionAODObject.h"
36 #include "AliGammaConversionBGHandler.h"
37 #include "AliESDCaloCluster.h" // for combining PHOS and GammaConv
38 #include "AliKFVertex.h"
39 #include "AliGenPythiaEventHeader.h"
40 #include "AliGenDPMjetEventHeader.h"
41 #include "AliGenEventHeader.h"
42 #include <AliMCEventHandler.h>
43 class AliESDTrackCuts;
51 class AliMCEventHandler;
52 class AliESDInputHandler;
53 class AliAnalysisManager;
60 ClassImp(AliAnalysisTaskGammaConversion)
63 AliAnalysisTaskGammaConversion::AliAnalysisTaskGammaConversion():
67 fMCTruth(NULL), // for CF
68 fGCMCEvent(NULL), // for CF
70 fOutputContainer(NULL),
71 fCFManager(0x0), // for CF
73 fTriggerCINT1B(kFALSE),
75 fDoNeutralMeson(kFALSE),
76 fDoOmegaMeson(kFALSE),
79 fRecalculateV0ForGamma(kFALSE),
80 fKFReconstructedGammasTClone(NULL),
81 fKFReconstructedPi0sTClone(NULL),
82 fKFRecalculatedGammasTClone(NULL),
83 fCurrentEventPosElectronTClone(NULL),
84 fCurrentEventNegElectronTClone(NULL),
85 fKFReconstructedGammasCutTClone(NULL),
86 fPreviousEventTLVNegElectronTClone(NULL),
87 fPreviousEventTLVPosElectronTClone(NULL),
92 fElectronRecalculatedv1(),
93 fElectronRecalculatedv2(),
101 fMinOpeningAngleGhostCut(0.),
103 fCalculateBackground(kFALSE),
104 fWriteNtuple(kFALSE),
106 fNeutralMesonNtuple(NULL),
107 fTotalNumberOfAddedNtupleEntries(0),
108 fChargedParticles(NULL),
109 fChargedParticlesId(),
111 fMinPtForGammaJet(1.),
112 fMinIsoConeSize(0.2),
114 fMinPtGamChargedCorr(0.5),
116 fLeadingChargedIndex(-1),
123 fAODBranchName("GammaConv"),
125 fKFDeltaAODFileName(""),
126 fDoNeutralMesonV0MCCheck(kFALSE),
127 fUseTrackMultiplicityForBG(kTRUE),
128 fMoveParticleAccordingToVertex(kFALSE),
129 fApplyChi2Cut(kFALSE),
130 nRandomEventsForBG(15),
131 nDegreesPMBackground(15),
133 fCheckBGProbability(kTRUE),
134 fKFReconstructedGammasV0Index()
136 // Default constructor
138 /* Kenneth: the default constructor should not have any define input/output or the call to SetESDtrackCuts
139 // Common I/O in slot 0
140 DefineInput (0, TChain::Class());
141 DefineOutput(0, TTree::Class());
143 // Your private output
144 DefineOutput(1, TList::Class());
146 // Define standard ESD track cuts for Gamma-hadron correlation
151 AliAnalysisTaskGammaConversion::AliAnalysisTaskGammaConversion(const char* name):
152 AliAnalysisTaskSE(name),
155 fMCTruth(NULL), // for CF
156 fGCMCEvent(NULL), // for CF
158 fOutputContainer(0x0),
159 fCFManager(0x0), // for CF
161 fTriggerCINT1B(kFALSE),
163 fDoNeutralMeson(kFALSE),
164 fDoOmegaMeson(kFALSE),
167 fRecalculateV0ForGamma(kFALSE),
168 fKFReconstructedGammasTClone(NULL),
169 fKFReconstructedPi0sTClone(NULL),
170 fKFRecalculatedGammasTClone(NULL),
171 fCurrentEventPosElectronTClone(NULL),
172 fCurrentEventNegElectronTClone(NULL),
173 fKFReconstructedGammasCutTClone(NULL),
174 fPreviousEventTLVNegElectronTClone(NULL),
175 fPreviousEventTLVPosElectronTClone(NULL),
180 fElectronRecalculatedv1(),
181 fElectronRecalculatedv2(),
189 fMinOpeningAngleGhostCut(0.),
191 fCalculateBackground(kFALSE),
192 fWriteNtuple(kFALSE),
194 fNeutralMesonNtuple(NULL),
195 fTotalNumberOfAddedNtupleEntries(0),
196 fChargedParticles(NULL),
197 fChargedParticlesId(),
199 fMinPtForGammaJet(1.),
200 fMinIsoConeSize(0.2),
202 fMinPtGamChargedCorr(0.5),
204 fLeadingChargedIndex(-1),
211 fAODBranchName("GammaConv"),
213 fKFDeltaAODFileName(""),
214 fDoNeutralMesonV0MCCheck(kFALSE),
215 fUseTrackMultiplicityForBG(kTRUE),
216 fMoveParticleAccordingToVertex(kFALSE),
217 fApplyChi2Cut(kFALSE),
218 nRandomEventsForBG(15),
219 nDegreesPMBackground(15),
221 fCheckBGProbability(kTRUE),
222 fKFReconstructedGammasV0Index()
224 // Common I/O in slot 0
225 DefineInput (0, TChain::Class());
226 DefineOutput(0, TTree::Class());
228 // Your private output
229 DefineOutput(1, TList::Class());
230 DefineOutput(2, AliCFContainer::Class()); // for CF
233 // Define standard ESD track cuts for Gamma-hadron correlation
238 AliAnalysisTaskGammaConversion::~AliAnalysisTaskGammaConversion()
240 // Remove all pointers
242 if(fOutputContainer){
243 fOutputContainer->Clear() ;
244 delete fOutputContainer ;
259 delete fEsdTrackCuts;
284 void AliAnalysisTaskGammaConversion::Init()
287 // AliLog::SetGlobalLogLevel(AliLog::kError);
289 void AliAnalysisTaskGammaConversion::SetESDtrackCuts()
292 if (fEsdTrackCuts!=NULL){
293 delete fEsdTrackCuts;
295 fEsdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
296 //standard cuts from:
297 //http://aliceinfo.cern.ch/alicvs/viewvc/PWG0/dNdEta/CreateCuts.C?revision=1.4&view=markup
299 // Cuts used up to 3rd of March
301 // fEsdTrackCuts->SetMinNClustersTPC(50);
302 // fEsdTrackCuts->SetMaxChi2PerClusterTPC(3.5);
303 // fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
304 // fEsdTrackCuts->SetRequireITSRefit(kTRUE);
305 // fEsdTrackCuts->SetMaxNsigmaToVertex(3);
306 // fEsdTrackCuts->SetRequireSigmaToVertex(kTRUE);
308 //------- To be tested-----------
309 // Cuts used up to 26th of Agost
310 // Int_t minNClustersTPC = 70;
311 // Double_t maxChi2PerClusterTPC = 4.0;
312 // Double_t maxDCAtoVertexXY = 2.4; // cm
313 // Double_t maxDCAtoVertexZ = 3.2; // cm
314 // fEsdTrackCuts->SetRequireSigmaToVertex(kFALSE);
315 // fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
316 // fEsdTrackCuts->SetRequireITSRefit(kTRUE);
317 // // fEsdTrackCuts->SetRequireTPCStandAlone(kTRUE);
318 // fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);
319 // fEsdTrackCuts->SetMinNClustersTPC(minNClustersTPC);
320 // fEsdTrackCuts->SetMaxChi2PerClusterTPC(maxChi2PerClusterTPC);
321 // fEsdTrackCuts->SetMaxDCAToVertexXY(maxDCAtoVertexXY);
322 // fEsdTrackCuts->SetMaxDCAToVertexZ(maxDCAtoVertexZ);
323 // fEsdTrackCuts->SetDCAToVertex2D(kTRUE);
324 // fEsdTrackCuts->SetEtaRange(-0.8, 0.8);
325 // fEsdTrackCuts->SetPtRange(0.15);
327 // fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
330 // Using standard function for setting Cuts
331 Bool_t selectPrimaries=kTRUE;
332 fEsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selectPrimaries);
333 fEsdTrackCuts->SetEtaRange(-0.8, 0.8);
334 fEsdTrackCuts->SetPtRange(0.15);
336 //----- From Jacek 10.03.03 ------------------/
337 // minNClustersTPC = 70;
338 // maxChi2PerClusterTPC = 4.0;
339 // maxDCAtoVertexXY = 2.4; // cm
340 // maxDCAtoVertexZ = 3.2; // cm
342 // esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
343 // esdTrackCuts->SetRequireTPCRefit(kFALSE);
344 // esdTrackCuts->SetRequireTPCStandAlone(kTRUE);
345 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
346 // esdTrackCuts->SetMinNClustersTPC(minNClustersTPC);
347 // esdTrackCuts->SetMaxChi2PerClusterTPC(maxChi2PerClusterTPC);
348 // esdTrackCuts->SetMaxDCAToVertexXY(maxDCAtoVertexXY);
349 // esdTrackCuts->SetMaxDCAToVertexZ(maxDCAtoVertexZ);
350 // esdTrackCuts->SetDCAToVertex2D(kTRUE);
354 // fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);
355 // fV0Reader->SetESDtrackCuts(fEsdTrackCuts);
358 void AliAnalysisTaskGammaConversion::UserExec(Option_t */*option*/)
360 // Execute analysis for current event
362 // Load the esdpid from the esdhandler if exists (tender was applied) otherwise set the Bethe Bloch parameters
363 Int_t eventQuality=-1;
365 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
366 AliESDInputHandler *esdHandler=0x0;
367 if ( (esdHandler=dynamic_cast<AliESDInputHandler*>(man->GetInputEventHandler())) && esdHandler->GetESDpid() ){
368 AliV0Reader::SetESDpid(esdHandler->GetESDpid());
370 //load esd pid bethe bloch parameters depending on the existance of the MC handler
371 // yes: MC parameters
372 // no: data parameters
373 if (!AliV0Reader::GetESDpid()){
375 AliV0Reader::InitESDpid();
377 AliV0Reader::InitESDpid(1);
382 //Must set fForceAOD to true for the AOD to get filled. Should only be done when running independent chain / train.
384 if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) AliFatal("Cannot run ESD filter without an output event handler");
385 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
388 if(fV0Reader == NULL){
389 // Write warning here cuts and so on are default if this ever happens
393 // To avoid crashes due to unzip errors. Sometimes the trees are not there.
395 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
397 AliError("Could not retrive MC event handler!");
401 fHistograms->FillHistogram("ESD_EventQuality",eventQuality);
403 if (!mcHandler->InitOk() ){
405 fHistograms->FillHistogram("ESD_EventQuality",eventQuality);
408 if (!mcHandler->TreeK() ){
410 fHistograms->FillHistogram("ESD_EventQuality",eventQuality);
413 if (!mcHandler->TreeTR() ) {
415 fHistograms->FillHistogram("ESD_EventQuality",eventQuality);
420 fV0Reader->SetInputAndMCEvent(InputEvent(), MCEvent());
422 fV0Reader->Initialize();
423 fDoMCTruth = fV0Reader->GetDoMCTruth();
425 if(fAODGamma) fAODGamma->Delete();
426 if(fAODPi0) fAODPi0->Delete();
427 if(fAODOmega) fAODOmega->Delete();
429 if(fKFReconstructedGammasTClone == NULL){
430 fKFReconstructedGammasTClone = new TClonesArray("AliKFParticle",0);
432 if(fCurrentEventPosElectronTClone == NULL){
433 fCurrentEventPosElectronTClone = new TClonesArray("AliESDtrack",0);
435 if(fCurrentEventNegElectronTClone == NULL){
436 fCurrentEventNegElectronTClone = new TClonesArray("AliESDtrack",0);
438 if(fKFReconstructedGammasCutTClone == NULL){
439 fKFReconstructedGammasCutTClone = new TClonesArray("AliKFParticle",0);
441 if(fPreviousEventTLVNegElectronTClone == NULL){
442 fPreviousEventTLVNegElectronTClone = new TClonesArray("TLorentzVector",0);
444 if(fPreviousEventTLVPosElectronTClone == NULL){
445 fPreviousEventTLVPosElectronTClone = new TClonesArray("TLorentzVector",0);
447 if(fChargedParticles == NULL){
448 fChargedParticles = new TClonesArray("AliESDtrack",0);
451 if(fKFReconstructedPi0sTClone == NULL){
452 fKFReconstructedPi0sTClone = new TClonesArray("AliKFParticle",0);
455 if(fKFRecalculatedGammasTClone == NULL){
456 fKFRecalculatedGammasTClone = new TClonesArray("AliKFParticle",0);
461 fKFReconstructedGammasTClone->Delete();
462 fCurrentEventPosElectronTClone->Delete();
463 fCurrentEventNegElectronTClone->Delete();
464 fKFReconstructedGammasCutTClone->Delete();
465 fPreviousEventTLVNegElectronTClone->Delete();
466 fPreviousEventTLVPosElectronTClone->Delete();
467 fKFReconstructedPi0sTClone->Delete();
468 fKFRecalculatedGammasTClone->Delete();
477 fElectronRecalculatedv1.clear();
478 fElectronRecalculatedv2.clear();
481 fChargedParticles->Delete();
483 fChargedParticlesId.clear();
485 fKFReconstructedGammasV0Index.clear();
487 //Clear the data in the v0Reader
488 // fV0Reader->UpdateEventByEventData();
490 //Take Only events with proper trigger
493 if(!fV0Reader->GetESDEvent()->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL")) return;
497 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
498 // cout<< "Event not taken"<< endl;
500 fHistograms->FillHistogram("ESD_EventQuality",eventQuality);
502 CheckMesonProcessTypeEventQuality(eventQuality);
504 return; // aborts if the primary vertex does not have contributors.
508 if(!fV0Reader->CheckForPrimaryVertexZ() ){
510 fHistograms->FillHistogram("ESD_EventQuality",eventQuality);
512 CheckMesonProcessTypeEventQuality(eventQuality);
517 fHistograms->FillHistogram("ESD_EventQuality",eventQuality);
519 // Process the MC information
524 //Process the v0 information with no cuts
527 // Process the v0 information
532 FillAODWithConversionGammas() ;
534 // Process reconstructed gammas
535 if(fDoNeutralMeson == kTRUE){
536 ProcessGammasForNeutralMesonAnalysis();
540 if(fDoMCTruth == kTRUE){
543 //Process reconstructed gammas electrons for Chi_c Analysis
544 if(fDoChic == kTRUE){
545 ProcessGammaElectronsForChicAnalysis();
547 // Process reconstructed gammas for gamma Jet/hadron correlations
549 ProcessGammasForGammaJetAnalysis();
552 //calculate background if flag is set
553 if(fCalculateBackground){
554 CalculateBackground();
557 if(fDoNeutralMeson == kTRUE){
558 // ProcessConvPHOSGammasForNeutralMesonAnalysis();
559 if(fDoOmegaMeson == kTRUE){
560 ProcessGammasForOmegaMesonAnalysis();
564 //Clear the data in the v0Reader
565 fV0Reader->UpdateEventByEventData();
566 if(fRecalculateV0ForGamma==kTRUE){
567 RecalculateV0ForGamma();
569 PostData(1, fOutputContainer);
570 PostData(2, fCFManager->GetParticleContainer()); // for CF
574 // void AliAnalysisTaskGammaConversion::ConnectInputData(Option_t *option){
575 // // see header file for documentation
576 // // printf(" ConnectInputData %s\n", GetName());
578 // AliAnalysisTaskSE::ConnectInputData(option);
580 // if(fV0Reader == NULL){
581 // // Write warning here cuts and so on are default if this ever happens
583 // fV0Reader->Initialize();
584 // fDoMCTruth = fV0Reader->GetDoMCTruth();
587 void AliAnalysisTaskGammaConversion::CheckMesonProcessTypeEventQuality(Int_t evtQ){
588 fStack= MCEvent()->Stack();
589 fGCMCEvent=MCEvent();
591 for (Int_t iTracks = 0; iTracks < fStack->GetNprimary(); iTracks++) {
592 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
597 if(particle->GetPdgCode()!=111){ //Pi0
600 if(TMath::Abs(particle->Eta())> fV0Reader->GetEtaCut() ) continue;
602 switch(GetProcessType(fGCMCEvent)){
604 fHistograms->FillHistogram("MC_SD_EvtQ1_Pi0_Pt", particle->Pt());
607 fHistograms->FillHistogram("MC_DD_EvtQ1_Pi0_Pt", particle->Pt());
610 fHistograms->FillHistogram("MC_ND_EvtQ1_Pi0_Pt", particle->Pt());
613 AliError("Unknown Process");
617 switch(GetProcessType(fGCMCEvent)){
619 fHistograms->FillHistogram("MC_SD_EvtQ2_Pi0_Pt", particle->Pt());
622 fHistograms->FillHistogram("MC_DD_EvtQ2_Pi0_Pt", particle->Pt());
625 fHistograms->FillHistogram("MC_ND_EvtQ2_Pi0_Pt", particle->Pt());
628 AliError("Unknown Process");
637 void AliAnalysisTaskGammaConversion::ProcessMCData(){
638 // see header file for documentation
639 //InputEvent(), MCEvent());
641 fStack = fV0Reader->GetMCStack();
642 fMCTruth = fV0Reader->GetMCTruth(); // for CF
643 fGCMCEvent = fV0Reader->GetMCEvent(); // for CF
645 fStack= MCEvent()->Stack();
646 fGCMCEvent=MCEvent();
649 Double_t containerInput[3];
651 if(!fGCMCEvent) cout << "NO MC INFO FOUND" << endl;
652 fCFManager->SetEventInfo(fGCMCEvent);
657 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
658 return; // aborts if the primary vertex does not have contributors.
661 for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++) {
662 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
671 ///////////////////////Begin Chic Analysis/////////////////////////////
673 if(particle->GetPdgCode() == 443){//Is JPsi
674 if(particle->GetNDaughters()==2){
675 if(TMath::Abs(fStack->Particle(particle->GetFirstDaughter())->GetPdgCode()) == 11 &&
676 TMath::Abs(fStack->Particle(particle->GetLastDaughter())->GetPdgCode()) == 11){
678 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
679 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
680 if(TMath::Abs(daug0->Eta()) < 0.9 && TMath::Abs(daug1->Eta()) < 0.9)
681 fHistograms->FillTable("Table_Electrons",3);//e+ e- from J/Psi inside acceptance
683 if( TMath::Abs(daug0->Eta()) < 0.9){
684 if(daug0->GetPdgCode() == -11)
685 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
687 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
690 if(TMath::Abs(daug1->Eta()) < 0.9){
691 if(daug1->GetPdgCode() == -11)
692 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
694 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
699 // const int CHI_C0 = 10441;
700 // const int CHI_C1 = 20443;
701 // const int CHI_C2 = 445
702 if(particle->GetPdgCode() == 22){//gamma from JPsi
703 if(particle->GetMother(0) > -1){
704 if(fStack->Particle(particle->GetMother(0))->GetPdgCode() == 10441 ||
705 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 20443 ||
706 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 445){
707 if(TMath::Abs(particle->Eta()) < 1.2)
708 fHistograms->FillTable("Table_Electrons",17);// gamma from chic inside accptance
712 if(particle->GetPdgCode() == 10441 || particle->GetPdgCode() == 20443 || particle->GetPdgCode() == 445){
713 if( particle->GetNDaughters() == 2){
714 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
715 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
717 if( (daug0->GetPdgCode() == 443 || daug0->GetPdgCode() == 22) && (daug1->GetPdgCode() == 443 || daug1->GetPdgCode() == 22) ){
718 if( daug0->GetPdgCode() == 443){
719 TParticle* daugE0 = fStack->Particle(daug0->GetFirstDaughter());
720 TParticle* daugE1 = fStack->Particle(daug0->GetLastDaughter());
721 if( TMath::Abs(daug1->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
722 fHistograms->FillTable("Table_Electrons",18);
725 else if (daug1->GetPdgCode() == 443){
726 TParticle* daugE0 = fStack->Particle(daug1->GetFirstDaughter());
727 TParticle* daugE1 = fStack->Particle(daug1->GetLastDaughter());
728 if( TMath::Abs(daug0->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
729 fHistograms->FillTable("Table_Electrons",18);
736 /////////////////////End Chic Analysis////////////////////////////
739 // if(TMath::Abs(particle->Eta())> fV0Reader->GetEtaCut() ) continue;
741 if(particle->R()>fV0Reader->GetMaxRCut()) continue; // cuts on distance from collision point
743 Double_t tmpPhi=particle->Phi();
745 if(particle->Phi()> TMath::Pi()){
746 tmpPhi = particle->Phi()-(2*TMath::Pi());
750 if(particle->Energy() - particle->Pz() == 0 || particle->Energy() + particle->Pz() == 0){
754 rapidity = 0.5*(TMath::Log((particle->Energy()+particle->Pz()) / (particle->Energy()-particle->Pz())));
759 if(iTracks<=fStack->GetNprimary() ){
760 if ( particle->GetPdgCode()== -211 || particle->GetPdgCode()== 211 ||
761 particle->GetPdgCode()== 2212 || particle->GetPdgCode()==-2212 ||
762 particle->GetPdgCode()== 321 || particle->GetPdgCode()==-321 ){
763 if(TMath::Abs(particle->Eta())> fV0Reader->GetEtaCut() ) continue;
764 fHistograms->FillHistogram("MC_PhysicalPrimaryCharged_Pt", particle->Pt());
771 if (particle->GetPdgCode() == 22){
772 if(TMath::Abs(particle->Eta())> fV0Reader->GetEtaCut() ) continue;
774 if(particle->GetMother(0) >-1 && fStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
775 continue; // no photon as mothers!
778 if(particle->GetMother(0) >= fStack->GetNprimary()){
779 continue; // the gamma has a mother, and it is not a primary particle
782 if(particle->GetMother(0) >-1){
783 fHistograms->FillHistogram("MC_DecayAllGamma_Pt", particle->Pt()); // All
784 switch(fStack->Particle(particle->GetMother(0))->GetPdgCode()){
786 fHistograms->FillHistogram("MC_DecayPi0Gamma_Pt", particle->Pt());
789 fHistograms->FillHistogram("MC_DecayRho0Gamma_Pt", particle->Pt());
792 fHistograms->FillHistogram("MC_DecayEtaGamma_Pt", particle->Pt());
795 fHistograms->FillHistogram("MC_DecayOmegaGamma_Pt", particle->Pt());
798 fHistograms->FillHistogram("MC_DecayK0sGamma_Pt", particle->Pt());
801 fHistograms->FillHistogram("MC_DecayEtapGamma_Pt", particle->Pt());
806 fHistograms->FillHistogram("MC_allGamma_Energy", particle->Energy());
807 fHistograms->FillHistogram("MC_allGamma_Pt", particle->Pt());
808 fHistograms->FillHistogram("MC_allGamma_Eta", particle->Eta());
809 fHistograms->FillHistogram("MC_allGamma_Phi", tmpPhi);
810 fHistograms->FillHistogram("MC_allGamma_Rapid", rapidity);
814 containerInput[0] = particle->Pt();
815 containerInput[1] = particle->Eta();
816 if(particle->GetMother(0) >=0){
817 containerInput[2] = fStack->Particle(particle->GetMother(0))->GetMass();
820 containerInput[2]=-1;
823 fCFManager->GetParticleContainer()->Fill(containerInput,kStepGenerated); // generated gamma
825 if(particle->GetMother(0) < 0){ // direct gamma
826 fHistograms->FillHistogram("MC_allDirectGamma_Energy",particle->Energy());
827 fHistograms->FillHistogram("MC_allDirectGamma_Pt", particle->Pt());
828 fHistograms->FillHistogram("MC_allDirectGamma_Eta", particle->Eta());
829 fHistograms->FillHistogram("MC_allDirectGamma_Phi", tmpPhi);
830 fHistograms->FillHistogram("MC_allDirectGamma_Rapid", rapidity);
833 // looking for conversion (electron + positron from pairbuilding (= 5) )
834 TParticle* ePos = NULL;
835 TParticle* eNeg = NULL;
837 if(particle->GetNDaughters() >= 2){
838 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
839 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
840 if(tmpDaughter->GetUniqueID() == 5){
841 if(tmpDaughter->GetPdgCode() == 11){
844 else if(tmpDaughter->GetPdgCode() == -11){
852 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
857 Double_t ePosPhi = ePos->Phi();
858 if(ePos->Phi()> TMath::Pi()) ePosPhi = ePos->Phi()-(2*TMath::Pi());
860 Double_t eNegPhi = eNeg->Phi();
861 if(eNeg->Phi()> TMath::Pi()) eNegPhi = eNeg->Phi()-(2*TMath::Pi());
864 if(ePos->Pt()<fV0Reader->GetPtCut() || eNeg->Pt()<fV0Reader->GetPtCut()){
865 continue; // no reconstruction below the Pt cut
868 if(TMath::Abs(ePos->Eta())> fV0Reader->GetEtaCut() || TMath::Abs(eNeg->Eta())> fV0Reader->GetEtaCut()){
872 if(ePos->R()>fV0Reader->GetMaxRCut()){
873 continue; // cuts on distance from collision point
876 if(TMath::Abs(ePos->Vz()) > fV0Reader->GetMaxZCut()){
877 continue; // outside material
881 if((TMath::Abs(ePos->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() > ePos->R()){
882 continue; // line cut to exclude regions where we do not reconstruct
888 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructable); // reconstructable gamma
890 fHistograms->FillHistogram("MC_ConvGamma_Energy", particle->Energy());
891 fHistograms->FillHistogram("MC_ConvGamma_Pt", particle->Pt());
892 fHistograms->FillHistogram("MC_ConvGamma_Eta", particle->Eta());
893 fHistograms->FillHistogram("MC_ConvGamma_Phi", tmpPhi);
894 fHistograms->FillHistogram("MC_ConvGamma_Rapid", rapidity);
895 fHistograms->FillHistogram("MC_ConvGamma_Pt_Eta", particle->Pt(),particle->Eta());
897 fHistograms->FillHistogram("MC_E_Energy", eNeg->Energy());
898 fHistograms->FillHistogram("MC_E_Pt", eNeg->Pt());
899 fHistograms->FillHistogram("MC_E_Eta", eNeg->Eta());
900 fHistograms->FillHistogram("MC_E_Phi", eNegPhi);
902 fHistograms->FillHistogram("MC_P_Energy", ePos->Energy());
903 fHistograms->FillHistogram("MC_P_Pt", ePos->Pt());
904 fHistograms->FillHistogram("MC_P_Eta", ePos->Eta());
905 fHistograms->FillHistogram("MC_P_Phi", ePosPhi);
909 Int_t rBin = fHistograms->GetRBin(ePos->R());
910 Int_t zBin = fHistograms->GetZBin(ePos->Vz());
911 Int_t phiBin = fHistograms->GetPhiBin(particle->Phi());
914 TVector3 vtxPos(ePos->Vx(),ePos->Vy(),ePos->Vz());
916 TString nameMCMappingPhiR="";
917 nameMCMappingPhiR.Form("MC_Conversion_Mapping_Phi%02d_R%02d",phiBin,rBin);
918 // fHistograms->FillHistogram(nameMCMappingPhiR, ePos->Vz(), particle->Eta());
920 TString nameMCMappingPhi="";
921 nameMCMappingPhi.Form("MC_Conversion_Mapping_Phi%02d",phiBin);
922 // fHistograms->FillHistogram(nameMCMappingPhi, particle->Eta());
923 //fHistograms->FillHistogram(nameMCMappingPhi, ePos->Vz(), particle->Eta());
925 TString nameMCMappingR="";
926 nameMCMappingR.Form("MC_Conversion_Mapping_R%02d",rBin);
927 // fHistograms->FillHistogram(nameMCMappingR, particle->Eta());
928 //fHistograms->FillHistogram(nameMCMappingR,ePos->Vz(), particle->Eta());
930 TString nameMCMappingPhiInR="";
931 nameMCMappingPhiInR.Form("MC_Conversion_Mapping_Phi_in_R_%02d",rBin);
932 // fHistograms->FillHistogram(nameMCMappingPhiInR, tmpPhi);
933 fHistograms->FillHistogram(nameMCMappingPhiInR, vtxPos.Phi());
935 TString nameMCMappingZInR="";
936 nameMCMappingZInR.Form("MC_Conversion_Mapping_Z_in_R_%02d",rBin);
937 fHistograms->FillHistogram(nameMCMappingZInR,ePos->Vz() );
940 TString nameMCMappingPhiInZ="";
941 nameMCMappingPhiInZ.Form("MC_Conversion_Mapping_Phi_in_Z_%02d",zBin);
942 // fHistograms->FillHistogram(nameMCMappingPhiInR, tmpPhi);
943 fHistograms->FillHistogram(nameMCMappingPhiInZ, vtxPos.Phi());
947 TString nameMCMappingFMDPhiInZ="";
948 nameMCMappingFMDPhiInZ.Form("MC_Conversion_Mapping_FMD_Phi_in_Z_%02d",zBin);
949 fHistograms->FillHistogram(nameMCMappingFMDPhiInZ, vtxPos.Phi());
952 TString nameMCMappingRInZ="";
953 nameMCMappingRInZ.Form("MC_Conversion_Mapping_R_in_Z_%02d",zBin);
954 fHistograms->FillHistogram(nameMCMappingRInZ,ePos->R() );
956 if(particle->Pt() > fLowPtMapping && particle->Pt()< fHighPtMapping){
957 TString nameMCMappingMidPtPhiInR="";
958 nameMCMappingMidPtPhiInR.Form("MC_Conversion_Mapping_MidPt_Phi_in_R_%02d",rBin);
959 fHistograms->FillHistogram(nameMCMappingMidPtPhiInR, vtxPos.Phi());
961 TString nameMCMappingMidPtZInR="";
962 nameMCMappingMidPtZInR.Form("MC_Conversion_Mapping_MidPt_Z_in_R_%02d",rBin);
963 fHistograms->FillHistogram(nameMCMappingMidPtZInR,ePos->Vz() );
966 TString nameMCMappingMidPtPhiInZ="";
967 nameMCMappingMidPtPhiInZ.Form("MC_Conversion_Mapping_MidPt_Phi_in_Z_%02d",zBin);
968 fHistograms->FillHistogram(nameMCMappingMidPtPhiInZ, vtxPos.Phi());
972 TString nameMCMappingMidPtFMDPhiInZ="";
973 nameMCMappingMidPtFMDPhiInZ.Form("MC_Conversion_Mapping_MidPt_FMD_Phi_in_Z_%02d",zBin);
974 fHistograms->FillHistogram(nameMCMappingMidPtFMDPhiInZ, vtxPos.Phi());
978 TString nameMCMappingMidPtRInZ="";
979 nameMCMappingMidPtRInZ.Form("MC_Conversion_Mapping_MidPt_R_in_Z_%02d",zBin);
980 fHistograms->FillHistogram(nameMCMappingMidPtRInZ,ePos->R() );
986 fHistograms->FillHistogram("MC_Conversion_R",ePos->R());
987 fHistograms->FillHistogram("MC_Conversion_ZR",ePos->Vz(),ePos->R());
988 fHistograms->FillHistogram("MC_Conversion_XY",ePos->Vx(),ePos->Vy());
989 fHistograms->FillHistogram("MC_Conversion_OpeningAngle",GetMCOpeningAngle(ePos, eNeg));
990 fHistograms->FillHistogram("MC_ConvGamma_E_AsymmetryP",particle->P(),eNeg->P()/particle->P());
991 fHistograms->FillHistogram("MC_ConvGamma_P_AsymmetryP",particle->P(),ePos->P()/particle->P());
994 if(particle->GetMother(0) < 0){ // no mother = direct gamma, still inside converted
995 fHistograms->FillHistogram("MC_ConvDirectGamma_Energy",particle->Energy());
996 fHistograms->FillHistogram("MC_ConvDirectGamma_Pt", particle->Pt());
997 fHistograms->FillHistogram("MC_ConvDirectGamma_Eta", particle->Eta());
998 fHistograms->FillHistogram("MC_ConvDirectGamma_Phi", tmpPhi);
999 fHistograms->FillHistogram("MC_ConvDirectGamma_Rapid", rapidity);
1001 } // end direct gamma
1002 else{ // mother exits
1003 /* if( fStack->Particle(particle->GetMother(0))->GetPdgCode()==10441 ||//chic0
1004 fStack->Particle(particle->GetMother(0))->GetPdgCode()==20443 ||//psi2S
1005 fStack->Particle(particle->GetMother(0))->GetPdgCode()==445 //chic2
1007 fMCGammaChic.push_back(particle);
1010 } // end if mother exits
1011 } // end if particle is a photon
1015 // process motherparticles (2 gammas as daughters)
1016 // the motherparticle had already to pass the R and the eta cut, but no line cut.
1017 // the line cut is just valid for the conversions!
1019 if(particle->GetNDaughters() == 2){
1021 TParticle* daughter0 = (TParticle*)fStack->Particle(particle->GetFirstDaughter());
1022 TParticle* daughter1 = (TParticle*)fStack->Particle(particle->GetLastDaughter());
1024 if(daughter0->GetPdgCode() != 22 || daughter1->GetPdgCode() != 22) continue; //check for gamma gamma daughters
1026 if(TMath::Abs(rapidity) > fV0Reader->GetRapidityMesonCut() ) continue;
1028 // Check the acceptance for both gammas
1029 Bool_t gammaEtaCut = kTRUE;
1030 if(TMath::Abs(daughter0->Eta()) > fV0Reader->GetEtaCut() || TMath::Abs(daughter1->Eta()) > fV0Reader->GetEtaCut() ) gammaEtaCut = kFALSE;
1031 Bool_t gammaRCut = kTRUE;
1032 if(daughter0->R() > fV0Reader->GetMaxRCut() || daughter1->R() > fV0Reader->GetMaxRCut() ) gammaRCut = kFALSE;
1036 // check for conversions now -> have to pass eta, R and line cut!
1037 Bool_t daughter0Electron = kFALSE;
1038 Bool_t daughter0Positron = kFALSE;
1039 Bool_t daughter1Electron = kFALSE;
1040 Bool_t daughter1Positron = kFALSE;
1042 if(daughter0->GetNDaughters() >= 2){ // first gamma
1043 for(Int_t TrackIndex=daughter0->GetFirstDaughter();TrackIndex<=daughter0->GetLastDaughter();TrackIndex++){
1044 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
1045 if(tmpDaughter->GetUniqueID() == 5){
1046 if(tmpDaughter->GetPdgCode() == 11){
1047 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
1048 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
1049 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
1050 daughter0Electron = kTRUE;
1056 else if(tmpDaughter->GetPdgCode() == -11){
1057 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
1058 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
1059 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
1060 daughter0Positron = kTRUE;
1070 if(daughter1->GetNDaughters() >= 2){ // second gamma
1071 for(Int_t TrackIndex=daughter1->GetFirstDaughter();TrackIndex<=daughter1->GetLastDaughter();TrackIndex++){
1072 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
1073 if(tmpDaughter->GetUniqueID() == 5){
1074 if(tmpDaughter->GetPdgCode() == 11){
1075 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
1076 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
1077 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
1078 daughter1Electron = kTRUE;
1084 else if(tmpDaughter->GetPdgCode() == -11){
1085 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
1086 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
1087 if(tmpDaughter->R()< fV0Reader->GetMaxRCut()){
1088 daughter1Positron = kTRUE;
1100 if(particle->GetPdgCode()==111){ //Pi0
1101 if( iTracks >= fStack->GetNprimary()){
1102 fHistograms->FillHistogram("MC_Pi0_Secondaries_Eta", particle->Eta());
1103 fHistograms->FillHistogram("MC_Pi0_Secondaries_Rapid", rapidity);
1104 fHistograms->FillHistogram("MC_Pi0_Secondaries_Phi", tmpPhi);
1105 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt", particle->Pt());
1106 fHistograms->FillHistogram("MC_Pi0_Secondaries_Energy", particle->Energy());
1107 fHistograms->FillHistogram("MC_Pi0_Secondaries_R", particle->R());
1108 fHistograms->FillHistogram("MC_Pi0_Secondaries_ZR", particle->Vz(),particle->R());
1109 fHistograms->FillHistogram("MC_Pi0_Secondaries_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
1110 fHistograms->FillHistogram("MC_Pi0_Secondaries_XY", particle->Vx(),particle->Vy());//only fill from one daughter to avoid multiple filling
1112 if(gammaEtaCut && gammaRCut){
1113 //if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
1114 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
1115 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
1116 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
1117 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
1118 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
1123 fHistograms->FillHistogram("MC_Pi0_Eta", particle->Eta());
1124 fHistograms->FillHistogram("MC_Pi0_Rapid", rapidity);
1125 fHistograms->FillHistogram("MC_Pi0_Phi", tmpPhi);
1126 fHistograms->FillHistogram("MC_Pi0_Pt", particle->Pt());
1127 fHistograms->FillHistogram("MC_Pi0_Pt_vs_Rapid", particle->Pt(),rapidity);
1128 fHistograms->FillHistogram("MC_Pi0_Energy", particle->Energy());
1129 fHistograms->FillHistogram("MC_Pi0_R", particle->R());
1130 fHistograms->FillHistogram("MC_Pi0_ZR", particle->Vz(),particle->R());
1131 fHistograms->FillHistogram("MC_Pi0_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
1132 fHistograms->FillHistogram("MC_Pi0_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
1133 if(TMath::Abs(particle->Eta())<0.9)fHistograms->FillHistogram("MC_Pi0_Pt_Fiducial", particle->Pt());
1135 switch(GetProcessType(fGCMCEvent)){
1137 fHistograms->FillHistogram("MC_SD_EvtQ3_Pi0_Pt", particle->Pt());
1140 fHistograms->FillHistogram("MC_DD_EvtQ3_Pi0_Pt", particle->Pt());
1143 fHistograms->FillHistogram("MC_ND_EvtQ3_Pi0_Pt", particle->Pt());
1146 AliError("Unknown Process");
1149 if(gammaEtaCut && gammaRCut){
1150 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
1151 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
1152 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
1153 if(TMath::Abs(particle->Eta())<0.9)fHistograms->FillHistogram("MC_Pi0_Pt_withinAcceptance_Fiducial", particle->Pt());
1155 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
1156 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
1157 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
1158 fHistograms->FillHistogram("MC_Pi0_ZR_ConvGamma_withinAcceptance", particle->Vz(),particle->R());
1159 fHistograms->FillHistogram("MC_Pi0_ConvGamma_OpeningAngle_Pt", particle->Pt(),GetMCOpeningAngle(daughter0,daughter1));
1160 fHistograms->FillHistogram("MC_Pi0_ConvGamma_PtGamma_Pt", particle->Pt(),daughter0->Pt());
1161 fHistograms->FillHistogram("MC_Pi0_ConvGamma_PtGamma_Pt", particle->Pt(),daughter1->Pt());
1164 if((daughter0->Energy()+daughter1->Energy())!= 0.){
1165 alfa= TMath::Abs((daughter0->Energy()-daughter1->Energy())/(daughter0->Energy()+daughter1->Energy()));
1167 fHistograms->FillHistogram("MC_Pi0_alpha",alfa);
1168 if(TMath::Abs(particle->Eta())<0.9)fHistograms->FillHistogram("MC_Pi0_Pt_ConvGamma_withinAcceptance_Fiducial", particle->Pt());
1175 if(particle->GetPdgCode()==221){ //Eta
1176 fHistograms->FillHistogram("MC_Eta_Eta", particle->Eta());
1177 fHistograms->FillHistogram("MC_Eta_Rapid", rapidity);
1178 fHistograms->FillHistogram("MC_Eta_Phi",tmpPhi);
1179 fHistograms->FillHistogram("MC_Eta_Pt", particle->Pt());
1180 fHistograms->FillHistogram("MC_Eta_Pt_vs_Rapid", particle->Pt(),rapidity);
1181 fHistograms->FillHistogram("MC_Eta_Energy", particle->Energy());
1182 fHistograms->FillHistogram("MC_Eta_R", particle->R());
1183 fHistograms->FillHistogram("MC_Eta_ZR", particle->Vz(),particle->R());
1184 fHistograms->FillHistogram("MC_Eta_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
1185 fHistograms->FillHistogram("MC_Eta_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
1187 if(gammaEtaCut && gammaRCut){
1188 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
1189 fHistograms->FillHistogram("MC_Eta_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
1190 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
1191 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
1192 fHistograms->FillHistogram("MC_Eta_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
1193 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
1194 fHistograms->FillHistogram("MC_Eta_ZR_ConvGamma_withinAcceptance", particle->Vz(),particle->R());
1195 fHistograms->FillHistogram("MC_Eta_ConvGamma_OpeningAngle_Pt", particle->Pt(),GetMCOpeningAngle(daughter0,daughter1));
1196 fHistograms->FillHistogram("MC_Eta_ConvGamma_PtGamma_Pt", particle->Pt(),daughter0->Pt());
1197 fHistograms->FillHistogram("MC_Eta_ConvGamma_PtGamma_Pt", particle->Pt(),daughter1->Pt());
1205 // all motherparticles with 2 gammas as daughters
1206 fHistograms->FillHistogram("MC_Mother_R", particle->R());
1207 fHistograms->FillHistogram("MC_Mother_ZR", particle->Vz(),particle->R());
1208 fHistograms->FillHistogram("MC_Mother_XY", particle->Vx(),particle->Vy());
1209 fHistograms->FillHistogram("MC_Mother_Mass", particle->GetCalcMass());
1210 fHistograms->FillHistogram("MC_Mother_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
1211 fHistograms->FillHistogram("MC_Mother_Energy", particle->Energy());
1212 fHistograms->FillHistogram("MC_Mother_Pt", particle->Pt());
1213 fHistograms->FillHistogram("MC_Mother_Eta", particle->Eta());
1214 fHistograms->FillHistogram("MC_Mother_Rapid", rapidity);
1215 fHistograms->FillHistogram("MC_Mother_Phi",tmpPhi);
1216 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt",particle->GetMass(),particle->Pt());
1218 if(gammaEtaCut && gammaRCut){
1219 // if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
1220 fHistograms->FillHistogram("MC_Mother_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
1221 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
1222 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_withinAcceptance",particle->GetMass(),particle->Pt());
1223 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
1224 fHistograms->FillHistogram("MC_Mother_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
1225 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
1226 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_ConvGamma_withinAcceptance",particle->GetMass(),particle->Pt());
1231 } // end passed R and eta cut
1233 } // end if(particle->GetNDaughters() == 2)
1235 }// end for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++)
1237 } // end ProcessMCData
1241 void AliAnalysisTaskGammaConversion::FillNtuple(){
1242 //Fills the ntuple with the different values
1244 if(fGammaNtuple == NULL){
1247 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
1248 for(Int_t i=0;i<numberOfV0s;i++){
1249 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};
1250 AliESDv0 * cV0 = fV0Reader->GetV0(i);
1253 fV0Reader->GetPIDProbability(negPID,posPID);
1254 values[0]=cV0->GetOnFlyStatus();
1255 values[1]=fV0Reader->CheckForPrimaryVertex();
1258 values[4]=fV0Reader->GetX();
1259 values[5]=fV0Reader->GetY();
1260 values[6]=fV0Reader->GetZ();
1261 values[7]=fV0Reader->GetXYRadius();
1262 values[8]=fV0Reader->GetMotherCandidateNDF();
1263 values[9]=fV0Reader->GetMotherCandidateChi2();
1264 values[10]=fV0Reader->GetMotherCandidateEnergy();
1265 values[11]=fV0Reader->GetMotherCandidateEta();
1266 values[12]=fV0Reader->GetMotherCandidatePt();
1267 values[13]=fV0Reader->GetMotherCandidateMass();
1268 values[14]=fV0Reader->GetMotherCandidateWidth();
1269 // values[15]=fV0Reader->GetMotherMCParticle()->Pt(); MOVED TO THE END, HAS TO BE CALLED AFTER HasSameMother NB: still has the same entry in the array
1270 values[16]=fV0Reader->GetOpeningAngle();
1271 values[17]=fV0Reader->GetNegativeTrackEnergy();
1272 values[18]=fV0Reader->GetNegativeTrackPt();
1273 values[19]=fV0Reader->GetNegativeTrackEta();
1274 values[20]=fV0Reader->GetNegativeTrackPhi();
1275 values[21]=fV0Reader->GetPositiveTrackEnergy();
1276 values[22]=fV0Reader->GetPositiveTrackPt();
1277 values[23]=fV0Reader->GetPositiveTrackEta();
1278 values[24]=fV0Reader->GetPositiveTrackPhi();
1279 values[25]=fV0Reader->HasSameMCMother();
1280 if(values[25] != 0){
1281 values[26]=fV0Reader->GetMotherMCParticlePDGCode();
1282 values[15]=fV0Reader->GetMotherMCParticle()->Pt();
1284 fTotalNumberOfAddedNtupleEntries++;
1285 fGammaNtuple->Fill(values);
1287 fV0Reader->ResetV0IndexNumber();
1291 void AliAnalysisTaskGammaConversion::ProcessV0sNoCut(){
1292 // Process all the V0's without applying any cuts to it
1294 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
1295 for(Int_t i=0;i<numberOfV0s;i++){
1296 /*AliESDv0 * cV0 = */fV0Reader->GetV0(i);
1298 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
1302 // if( !fV0Reader->GetV0(i)->GetOnFlyStatus()){
1303 if( !fV0Reader->CheckV0FinderStatus(i)){
1308 if( !((fV0Reader->GetNegativeESDTrack())->GetStatus() & AliESDtrack::kTPCrefit) ||
1309 !((fV0Reader->GetPositiveESDTrack())->GetStatus() & AliESDtrack::kTPCrefit) ){
1313 if( fV0Reader->GetNegativeESDTrack()->GetSign()== fV0Reader->GetPositiveESDTrack()->GetSign()){
1317 if( fV0Reader->GetNegativeESDTrack()->GetKinkIndex(0) > 0 ||
1318 fV0Reader->GetPositiveESDTrack()->GetKinkIndex(0) > 0) {
1321 if(TMath::Abs(fV0Reader->GetMotherCandidateEta())> fV0Reader->GetEtaCut()){
1324 if(TMath::Abs(fV0Reader->GetPositiveTrackEta())> fV0Reader->GetEtaCut()){
1327 if(TMath::Abs(fV0Reader->GetNegativeTrackEta())> fV0Reader->GetEtaCut()){
1330 if((TMath::Abs(fV0Reader->GetZ())*fV0Reader->GetLineCutZRSlope())-fV0Reader->GetLineCutZValue() > fV0Reader->GetXYRadius() ){ // cuts out regions where we do not reconstruct
1335 if(fV0Reader->HasSameMCMother() == kFALSE){
1339 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1340 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1342 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
1345 if(negativeMC->GetPdgCode() == positiveMC->GetPdgCode()){
1349 if(negativeMC->GetUniqueID() != 5 || positiveMC->GetUniqueID() !=5){ // id 5 is conversion
1353 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1355 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1356 fHistograms->FillHistogram("ESD_NoCutConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1357 fHistograms->FillHistogram("ESD_NoCutConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1358 fHistograms->FillHistogram("ESD_NoCutConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1359 fHistograms->FillHistogram("ESD_NoCutConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1360 fHistograms->FillHistogram("ESD_NoCutConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1361 fHistograms->FillHistogram("ESD_NoCutConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1362 fHistograms->FillHistogram("ESD_NoCutConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1363 fHistograms->FillHistogram("ESD_NoCutConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1364 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1366 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1367 fHistograms->FillHistogram("ESD_NoCutConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1369 fHistograms->FillHistogram("ESD_NoCutConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1370 fHistograms->FillHistogram("ESD_NoCutConversion_R", fV0Reader->GetXYRadius());
1371 fHistograms->FillHistogram("ESD_NoCutConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1372 fHistograms->FillHistogram("ESD_NoCutConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1373 fHistograms->FillHistogram("ESD_NoCutConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1374 fHistograms->FillHistogram("ESD_NoCutConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1375 fHistograms->FillHistogram("ESD_NoCutConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1376 fHistograms->FillHistogram("ESD_NoCutConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1378 fHistograms->FillHistogram("ESD_NoCutConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1379 fHistograms->FillHistogram("ESD_NoCutConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1380 fHistograms->FillHistogram("ESD_NoCutConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1381 fHistograms->FillHistogram("ESD_NoCutConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1383 //store MCTruth properties
1384 fHistograms->FillHistogram("ESD_NoCutConvGamma_MC_Pt_Eta", fV0Reader->GetMotherMCParticle()->Pt(),fV0Reader->GetMotherMCParticle()->Eta());
1385 fHistograms->FillHistogram("ESD_NoCutConversion_MC_ZR", negativeMC->Vz(),negativeMC->R());
1386 fHistograms->FillHistogram("ESD_NoCutConversion_MC_XY", negativeMC->Vx(),negativeMC->Vy());
1390 fV0Reader->ResetV0IndexNumber();
1393 void AliAnalysisTaskGammaConversion::ProcessV0s(){
1394 // see header file for documentation
1397 if(fWriteNtuple == kTRUE){
1401 Int_t nSurvivingV0s=0;
1402 fV0Reader->ResetNGoodV0s();
1403 while(fV0Reader->NextV0()){
1407 TVector3 vtxConv(fV0Reader->GetX(),fV0Reader->GetY(), fV0Reader->GetZ());
1409 //-------------------------- filling v0 information -------------------------------------
1410 fHistograms->FillHistogram("ESD_Conversion_R", fV0Reader->GetXYRadius());
1411 fHistograms->FillHistogram("ESD_Conversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1412 fHistograms->FillHistogram("ESD_Conversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1413 fHistograms->FillHistogram("ESD_Conversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1415 // Specific histograms for beam pipe studies
1416 if( TMath::Abs(fV0Reader->GetZ()) < fV0Reader->GetLineCutZValue() ){
1417 fHistograms->FillHistogram("ESD_Conversion_XY_BeamPipe", fV0Reader->GetX(),fV0Reader->GetY());
1418 fHistograms->FillHistogram("ESD_Conversion_RPhi_BeamPipe", vtxConv.Phi(),fV0Reader->GetXYRadius());
1422 fHistograms->FillHistogram("ESD_E_Energy", fV0Reader->GetNegativeTrackEnergy());
1423 fHistograms->FillHistogram("ESD_E_Pt", fV0Reader->GetNegativeTrackPt());
1424 fHistograms->FillHistogram("ESD_E_Eta", fV0Reader->GetNegativeTrackEta());
1425 fHistograms->FillHistogram("ESD_E_Phi", fV0Reader->GetNegativeTrackPhi());
1426 fHistograms->FillHistogram("ESD_E_nTPCClusters", fV0Reader->GetNegativeTracknTPCClusters());
1427 fHistograms->FillHistogram("ESD_E_nITSClusters", fV0Reader->GetNegativeTracknITSClusters());
1428 if(fV0Reader->GetNegativeTracknTPCFClusters()!=0 && fV0Reader->GetNegativeTracknTPCClusters()!=0 ){
1429 Double_t EclsToF= (Double_t)fV0Reader->GetNegativeTracknTPCClusters()/(Double_t)fV0Reader->GetNegativeTracknTPCFClusters();
1430 fHistograms->FillHistogram("ESD_E_nTPCClustersToFP", fV0Reader->GetNegativeTrackP(),EclsToF );
1431 fHistograms->FillHistogram("ESD_E_TPCchi2", fV0Reader->GetNegativeTrackTPCchi2()/(Double_t)fV0Reader->GetNegativeTracknTPCClusters());
1436 fHistograms->FillHistogram("ESD_P_Energy", fV0Reader->GetPositiveTrackEnergy());
1437 fHistograms->FillHistogram("ESD_P_Pt", fV0Reader->GetPositiveTrackPt());
1438 fHistograms->FillHistogram("ESD_P_Eta", fV0Reader->GetPositiveTrackEta());
1439 fHistograms->FillHistogram("ESD_P_Phi", fV0Reader->GetPositiveTrackPhi());
1440 fHistograms->FillHistogram("ESD_P_nTPCClusters", fV0Reader->GetPositiveTracknTPCClusters());
1441 fHistograms->FillHistogram("ESD_P_nITSClusters", fV0Reader->GetPositiveTracknITSClusters());
1442 if(fV0Reader->GetPositiveTracknTPCFClusters()!=0 && (Double_t)fV0Reader->GetPositiveTracknTPCClusters()!=0 ){
1443 Double_t PclsToF= (Double_t)fV0Reader->GetPositiveTracknTPCClusters()/(Double_t)fV0Reader->GetPositiveTracknTPCFClusters();
1444 fHistograms->FillHistogram("ESD_P_nTPCClustersToFP",fV0Reader->GetPositiveTrackP(), PclsToF);
1445 fHistograms->FillHistogram("ESD_P_TPCchi2", fV0Reader->GetPositiveTrackTPCchi2()/(Double_t)fV0Reader->GetPositiveTracknTPCClusters());
1449 fHistograms->FillHistogram("ESD_ConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1450 fHistograms->FillHistogram("ESD_ConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1451 fHistograms->FillHistogram("ESD_ConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1452 fHistograms->FillHistogram("ESD_ConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1453 fHistograms->FillHistogram("ESD_ConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1454 fHistograms->FillHistogram("ESD_ConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1455 fHistograms->FillHistogram("ESD_ConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1456 fHistograms->FillHistogram("ESD_ConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1457 fHistograms->FillHistogram("ESD_ConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1458 fHistograms->FillHistogram("ESD_ConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1460 fHistograms->FillHistogram("ESD_ConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1461 fHistograms->FillHistogram("ESD_ConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1463 fHistograms->FillHistogram("ESD_ConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1464 fHistograms->FillHistogram("ESD_ConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1465 fHistograms->FillHistogram("ESD_ConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1466 fHistograms->FillHistogram("ESD_ConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1468 fHistograms->FillHistogram("ESD_ConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1469 fHistograms->FillHistogram("ESD_ConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1470 fHistograms->FillHistogram("ESD_ConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1471 fHistograms->FillHistogram("ESD_ConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1475 fV0Reader->GetPIDProbability(negPID,posPID);
1476 fHistograms->FillHistogram("ESD_ConvGamma_E_EProbP",fV0Reader->GetNegativeTrackP(),negPID);
1477 fHistograms->FillHistogram("ESD_ConvGamma_P_EProbP",fV0Reader->GetPositiveTrackP(),posPID);
1479 Double_t negPIDmupi=0;
1480 Double_t posPIDmupi=0;
1481 fV0Reader->GetPIDProbabilityMuonPion(negPIDmupi,posPIDmupi);
1482 fHistograms->FillHistogram("ESD_ConvGamma_E_mupiProbP",fV0Reader->GetNegativeTrackP(),negPIDmupi);
1483 fHistograms->FillHistogram("ESD_ConvGamma_P_mupiProbP",fV0Reader->GetPositiveTrackP(),posPIDmupi);
1485 Double_t armenterosQtAlfa[2];
1486 fV0Reader->GetArmenterosQtAlfa(fV0Reader-> GetNegativeKFParticle(),
1487 fV0Reader-> GetPositiveKFParticle(),
1488 fV0Reader->GetMotherCandidateKFCombination(),
1491 fHistograms->FillHistogram("ESD_ConvGamma_alfa_qt",armenterosQtAlfa[1],armenterosQtAlfa[0]);
1495 Int_t rBin = fHistograms->GetRBin(fV0Reader->GetXYRadius());
1496 Int_t zBin = fHistograms->GetZBin(fV0Reader->GetZ());
1497 Int_t phiBin = fHistograms->GetPhiBin(fV0Reader->GetNegativeTrackPhi());
1502 // Double_t motherCandidateEta= fV0Reader->GetMotherCandidateEta();
1504 TString nameESDMappingPhiR="";
1505 nameESDMappingPhiR.Form("ESD_Conversion_Mapping_Phi%02d_R%02d",phiBin,rBin);
1506 //fHistograms->FillHistogram(nameESDMappingPhiR, fV0Reader->GetZ(), motherCandidateEta);
1508 TString nameESDMappingPhi="";
1509 nameESDMappingPhi.Form("ESD_Conversion_Mapping_Phi%02d",phiBin);
1510 //fHistograms->FillHistogram(nameESDMappingPhi, fV0Reader->GetZ(), motherCandidateEta);
1512 TString nameESDMappingR="";
1513 nameESDMappingR.Form("ESD_Conversion_Mapping_R%02d",rBin);
1514 //fHistograms->FillHistogram(nameESDMappingR, fV0Reader->GetZ(), motherCandidateEta);
1516 TString nameESDMappingPhiInR="";
1517 nameESDMappingPhiInR.Form("ESD_Conversion_Mapping_Phi_in_R_%02d",rBin);
1518 // fHistograms->FillHistogram(nameESDMappingPhiInR, fV0Reader->GetMotherCandidatePhi());
1519 fHistograms->FillHistogram(nameESDMappingPhiInR, vtxConv.Phi());
1521 TString nameESDMappingZInR="";
1522 nameESDMappingZInR.Form("ESD_Conversion_Mapping_Z_in_R_%02d",rBin);
1523 fHistograms->FillHistogram(nameESDMappingZInR, fV0Reader->GetZ());
1525 TString nameESDMappingPhiInZ="";
1526 nameESDMappingPhiInZ.Form("ESD_Conversion_Mapping_Phi_in_Z_%02d",zBin);
1527 // fHistograms->FillHistogram(nameESDMappingPhiInR, fV0Reader->GetMotherCandidatePhi());
1528 fHistograms->FillHistogram(nameESDMappingPhiInZ, vtxConv.Phi());
1530 if(fV0Reader->GetXYRadius()<rFMD){
1531 TString nameESDMappingFMDPhiInZ="";
1532 nameESDMappingFMDPhiInZ.Form("ESD_Conversion_Mapping_FMD_Phi_in_Z_%02d",zBin);
1533 fHistograms->FillHistogram(nameESDMappingFMDPhiInZ, vtxConv.Phi());
1537 TString nameESDMappingRInZ="";
1538 nameESDMappingRInZ.Form("ESD_Conversion_Mapping_R_in_Z_%02d",zBin);
1539 fHistograms->FillHistogram(nameESDMappingRInZ, fV0Reader->GetXYRadius());
1541 if(fV0Reader->GetMotherCandidatePt() > fLowPtMapping && fV0Reader->GetMotherCandidatePt()< fHighPtMapping){
1542 TString nameESDMappingMidPtPhiInR="";
1543 nameESDMappingMidPtPhiInR.Form("ESD_Conversion_Mapping_MidPt_Phi_in_R_%02d",rBin);
1544 fHistograms->FillHistogram(nameESDMappingMidPtPhiInR, vtxConv.Phi());
1546 TString nameESDMappingMidPtZInR="";
1547 nameESDMappingMidPtZInR.Form("ESD_Conversion_Mapping_MidPt_Z_in_R_%02d",rBin);
1548 fHistograms->FillHistogram(nameESDMappingMidPtZInR, fV0Reader->GetZ());
1550 TString nameESDMappingMidPtPhiInZ="";
1551 nameESDMappingMidPtPhiInZ.Form("ESD_Conversion_Mapping_MidPt_Phi_in_Z_%02d",zBin);
1552 fHistograms->FillHistogram(nameESDMappingMidPtPhiInZ, vtxConv.Phi());
1553 if(fV0Reader->GetXYRadius()<rFMD){
1554 TString nameESDMappingMidPtFMDPhiInZ="";
1555 nameESDMappingMidPtFMDPhiInZ.Form("ESD_Conversion_Mapping_MidPt_FMD_Phi_in_Z_%02d",zBin);
1556 fHistograms->FillHistogram(nameESDMappingMidPtFMDPhiInZ, vtxConv.Phi());
1560 TString nameESDMappingMidPtRInZ="";
1561 nameESDMappingMidPtRInZ.Form("ESD_Conversion_Mapping_MidPt_R_in_Z_%02d",zBin);
1562 fHistograms->FillHistogram(nameESDMappingMidPtRInZ, fV0Reader->GetXYRadius());
1569 new((*fKFReconstructedGammasTClone)[fKFReconstructedGammasTClone->GetEntriesFast()]) AliKFParticle(*fV0Reader->GetMotherCandidateKFCombination());
1570 fKFReconstructedGammasV0Index.push_back(fV0Reader->GetCurrentV0IndexNumber()-1);
1571 // fKFReconstructedGammas.push_back(*fV0Reader->GetMotherCandidateKFCombination());
1572 fElectronv1.push_back(fV0Reader->GetCurrentV0()->GetPindex());
1573 fElectronv2.push_back(fV0Reader->GetCurrentV0()->GetNindex());
1575 //----------------------------------- checking for "real" conversions (MC match) --------------------------------------
1578 if(fV0Reader->HasSameMCMother() == kFALSE){
1581 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
1582 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
1584 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
1588 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
1591 if( (negativeMC->GetUniqueID() == 4 && positiveMC->GetUniqueID() ==4) ||
1592 (negativeMC->GetUniqueID() == 0 && positiveMC->GetUniqueID() ==0) ){// fill r distribution for Dalitz decays
1593 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 111){ //pi0
1594 fHistograms->FillHistogram("ESD_TrueDalitzContamination_R", fV0Reader->GetXYRadius());
1598 if(negativeMC->GetUniqueID() != 5 || positiveMC->GetUniqueID() !=5){// check if the daughters come from a conversion
1602 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
1605 Double_t containerInput[3];
1606 containerInput[0] = fV0Reader->GetMotherCandidatePt();
1607 containerInput[1] = fV0Reader->GetMotherCandidateEta();
1608 containerInput[2] = fV0Reader->GetMotherCandidateMass();
1609 fCFManager->GetParticleContainer()->Fill(containerInput,kStepTrueGamma); // for CF
1612 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
1613 fHistograms->FillHistogram("ESD_TrueConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
1614 fHistograms->FillHistogram("ESD_TrueConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
1615 fHistograms->FillHistogram("ESD_TrueConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
1616 fHistograms->FillHistogram("ESD_TrueConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
1617 fHistograms->FillHistogram("ESD_TrueConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
1618 fHistograms->FillHistogram("ESD_TrueConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
1619 fHistograms->FillHistogram("ESD_TrueConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
1620 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
1621 fHistograms->FillHistogram("ESD_TrueConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
1622 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters());
1623 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters());
1624 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters(),fV0Reader->GetMotherCandidateMass());
1625 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters(),fV0Reader->GetMotherCandidateMass());
1627 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt_Chi2", fV0Reader->GetMotherCandidatePt(), fV0Reader->GetMotherCandidateChi2());
1628 fHistograms->FillHistogram("ESD_TrueConvGamma_Eta_Chi2", fV0Reader->GetMotherCandidateEta(), fV0Reader->GetMotherCandidateChi2());
1631 fHistograms->FillHistogram("ESD_TrueConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
1632 fHistograms->FillHistogram("ESD_TrueConversion_R", fV0Reader->GetXYRadius());
1633 fHistograms->FillHistogram("ESD_TrueConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
1634 fHistograms->FillHistogram("ESD_TrueConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
1636 fHistograms->FillHistogram("ESD_TrueConvGamma_CosPointingAngle", fV0Reader->GetCosPointingAngle());
1637 fHistograms->FillHistogram("ESD_TrueConvGamma_DcaDaughters", fV0Reader->GetDcaDaughters());
1638 fHistograms->FillHistogram("ESD_TrueConvGamma_NormDcaDistDaughters", fV0Reader->GetNormDcaDistDaughters());
1639 fHistograms->FillHistogram("ESD_TrueConvGamma_LikelihoodAP", fV0Reader->GetLikelihoodAP());
1640 if (fV0Reader->GetMotherCandidateP() != 0) {
1641 fHistograms->FillHistogram("ESD_TrueConvGamma_E_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetNegativeTrackP()/fV0Reader->GetMotherCandidateP());
1642 fHistograms->FillHistogram("ESD_TrueConvGamma_P_AsymmetryP",fV0Reader->GetMotherCandidateP(),fV0Reader->GetPositiveTrackP()/fV0Reader->GetMotherCandidateP());
1643 } else { cout << "Error::fV0Reader->GetNegativeTrackP() == 0 !!!" << endl; }
1645 fHistograms->FillHistogram("ESD_TrueConvGamma_E_dEdxP",fV0Reader->GetNegativeTrackP(),fV0Reader->GetNegativeTrackTPCdEdx());
1646 fHistograms->FillHistogram("ESD_TrueConvGamma_P_dEdxP",fV0Reader->GetPositiveTrackP(),fV0Reader->GetPositiveTrackTPCdEdx());
1647 fHistograms->FillHistogram("ESD_TrueConvGamma_alfa_qt",armenterosQtAlfa[1],armenterosQtAlfa[0]);
1651 //store MCTruth properties
1652 fHistograms->FillHistogram("ESD_TrueConvGamma_MC_Pt_Eta", fV0Reader->GetMotherMCParticle()->Pt(),fV0Reader->GetMotherMCParticle()->Eta());
1653 fHistograms->FillHistogram("ESD_TrueConversion_MC_ZR", negativeMC->Vz(),negativeMC->R());
1654 fHistograms->FillHistogram("ESD_TrueConversion_MC_XY", negativeMC->Vx(),negativeMC->Vy());
1657 Double_t mcpt = fV0Reader->GetMotherMCParticle()->Pt();
1658 Double_t esdpt = fV0Reader->GetMotherCandidatePt();
1659 Double_t resdPt = 0.;
1661 resdPt = ((esdpt - mcpt)/mcpt)*100.;
1664 cout<<"Pt of MC particle is negative, this will cause wrong calculation of resPt"<<endl;
1667 fHistograms->FillHistogram("Resolution_Gamma_dPt_Pt", mcpt, resdPt);
1668 fHistograms->FillHistogram("Resolution_MC_Pt", mcpt);
1669 fHistograms->FillHistogram("Resolution_ESD_Pt", esdpt);
1670 fHistograms->FillHistogram("Resolution_Gamma_dPt_Phi", fV0Reader->GetMotherCandidatePhi(), resdPt);
1672 Double_t resdZ = 0.;
1673 if(fV0Reader->GetNegativeMCParticle()->Vz() != 0){
1674 resdZ = ((fV0Reader->GetZ() -fV0Reader->GetNegativeMCParticle()->Vz())/fV0Reader->GetNegativeMCParticle()->Vz())*100.;
1676 Double_t resdZAbs = 0.;
1677 resdZAbs = (fV0Reader->GetZ() -fV0Reader->GetNegativeMCParticle()->Vz());
1679 fHistograms->FillHistogram("Resolution_dZAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdZAbs);
1680 fHistograms->FillHistogram("Resolution_dZ", fV0Reader->GetNegativeMCParticle()->Vz(), resdZ);
1681 fHistograms->FillHistogram("Resolution_MC_Z", fV0Reader->GetNegativeMCParticle()->Vz());
1682 fHistograms->FillHistogram("Resolution_ESD_Z", fV0Reader->GetZ());
1684 // new for dPt_Pt-histograms for Electron and Positron
1685 Double_t mcEpt = fV0Reader->GetNegativeMCParticle()->Pt();
1686 Double_t resEdPt = 0.;
1688 resEdPt = ((fV0Reader->GetNegativeTrackPt()-mcEpt)/mcEpt)*100.;
1690 UInt_t statusN = fV0Reader->GetNegativeESDTrack()->GetStatus();
1691 // AliESDtrack * negTrk = fV0Reader->GetNegativeESDTrack();
1692 UInt_t kTRDoutN = (statusN & AliESDtrack::kTRDout);
1694 Int_t ITSclsE= fV0Reader->GetNegativeTracknITSClusters();
1695 // filling Resolution_Pt_dPt with respect to the Number of ITS clusters for Positrons
1697 case 0: // 0 ITS clusters
1698 fHistograms->FillHistogram("Resolution_E_dPt_Pt_ITS0", mcEpt, resEdPt);
1700 case 1: // 1 ITS cluster
1701 fHistograms->FillHistogram("Resolution_E_dPt_Pt_ITS1", mcEpt, resEdPt);
1703 case 2: // 2 ITS clusters
1704 fHistograms->FillHistogram("Resolution_E_dPt_Pt_ITS2", mcEpt, resEdPt);
1706 case 3: // 3 ITS clusters
1707 fHistograms->FillHistogram("Resolution_E_dPt_Pt_ITS3", mcEpt, resEdPt);
1709 case 4: // 4 ITS clusters
1710 fHistograms->FillHistogram("Resolution_E_dPt_Pt_ITS4", mcEpt, resEdPt);
1712 case 5: // 5 ITS clusters
1713 fHistograms->FillHistogram("Resolution_E_dPt_Pt_ITS5", mcEpt, resEdPt);
1715 case 6: // 6 ITS clusters
1716 fHistograms->FillHistogram("Resolution_E_dPt_Pt_ITS6", mcEpt, resEdPt);
1719 //Filling histograms with respect to Electron resolution
1720 fHistograms->FillHistogram("Resolution_E_dPt_Pt", mcEpt, resEdPt);
1721 fHistograms->FillHistogram("Resolution_E_dPt_Phi", fV0Reader->GetNegativeTrackPhi(), resEdPt);
1723 fHistograms->FillHistogram("Resolution_E_nTRDtracklets_ESDPt", fV0Reader->GetNegativeTrackPt(), fV0Reader->GetNegativeESDTrack()->GetTRDntracklets());
1724 fHistograms->FillHistogram("Resolution_E_nTRDtracklets_MCPt", mcEpt, fV0Reader->GetNegativeESDTrack()->GetTRDntracklets());
1725 fHistograms->FillHistogram("Resolution_E_nTRDclusters_ESDPt",fV0Reader->GetNegativeTrackPt(), fV0Reader->GetNegativeESDTrack()->GetTRDncls());
1726 fHistograms->FillHistogram("Resolution_E_nTRDclusters_MCPt",mcEpt, fV0Reader->GetNegativeESDTrack()->GetTRDncls());
1727 fHistograms->FillHistogram("Resolution_E_TRDsignal_ESDPt", fV0Reader->GetNegativeTrackPt(), fV0Reader->GetNegativeESDTrack()->GetTRDsignal());
1730 Double_t mcPpt = fV0Reader->GetPositiveMCParticle()->Pt();
1731 Double_t resPdPt = 0;
1733 resPdPt = ((fV0Reader->GetPositiveTrackPt()-mcPpt)/mcPpt)*100.;
1736 UInt_t statusP = fV0Reader->GetPositiveESDTrack()->GetStatus();
1737 // AliESDtrack * posTr= fV0Reader->GetPositiveESDTrack();
1738 UInt_t kTRDoutP = (statusP & AliESDtrack::kTRDout);
1740 Int_t ITSclsP = fV0Reader->GetPositiveTracknITSClusters();
1741 // filling Resolution_Pt_dPt with respect to the Number of ITS clusters for Positrons
1743 case 0: // 0 ITS clusters
1744 fHistograms->FillHistogram("Resolution_P_dPt_Pt_ITS0", mcPpt, resPdPt);
1746 case 1: // 1 ITS cluster
1747 fHistograms->FillHistogram("Resolution_P_dPt_Pt_ITS1", mcPpt, resPdPt);
1749 case 2: // 2 ITS clusters
1750 fHistograms->FillHistogram("Resolution_P_dPt_Pt_ITS2", mcPpt, resPdPt);
1752 case 3: // 3 ITS clusters
1753 fHistograms->FillHistogram("Resolution_P_dPt_Pt_ITS3", mcPpt, resPdPt);
1755 case 4: // 4 ITS clusters
1756 fHistograms->FillHistogram("Resolution_P_dPt_Pt_ITS4", mcPpt, resPdPt);
1758 case 5: // 5 ITS clusters
1759 fHistograms->FillHistogram("Resolution_P_dPt_Pt_ITS5", mcPpt, resPdPt);
1761 case 6: // 6 ITS clusters
1762 fHistograms->FillHistogram("Resolution_P_dPt_Pt_ITS6", mcPpt, resPdPt);
1765 //Filling histograms with respect to Positron resolution
1766 fHistograms->FillHistogram("Resolution_P_dPt_Pt", mcPpt, resPdPt);
1767 fHistograms->FillHistogram("Resolution_P_dPt_Phi", fV0Reader->GetPositiveTrackPhi(), resPdPt);
1769 fHistograms->FillHistogram("Resolution_P_nTRDtracklets_ESDPt", fV0Reader->GetPositiveTrackPt(), fV0Reader->GetPositiveESDTrack()->GetTRDntracklets());
1770 fHistograms->FillHistogram("Resolution_P_nTRDtracklets_MCPt", mcPpt, fV0Reader->GetPositiveESDTrack()->GetTRDntracklets());
1771 fHistograms->FillHistogram("Resolution_P_nTRDclusters_ESDPt",fV0Reader->GetPositiveTrackPt(), fV0Reader->GetPositiveESDTrack()->GetTRDncls());
1772 fHistograms->FillHistogram("Resolution_P_nTRDclusters_MCPt",mcPpt, fV0Reader->GetPositiveESDTrack()->GetTRDncls());
1773 fHistograms->FillHistogram("Resolution_P_TRDsignal_ESDPt", fV0Reader->GetPositiveTrackPt(), fV0Reader->GetPositiveESDTrack()->GetTRDsignal());
1777 Double_t resdR = 0.;
1778 if(fV0Reader->GetNegativeMCParticle()->R() != 0){
1779 resdR = ((fV0Reader->GetXYRadius() - fV0Reader->GetNegativeMCParticle()->R())/fV0Reader->GetNegativeMCParticle()->R())*100.;
1781 Double_t resdRAbs = 0.;
1782 resdRAbs = (fV0Reader->GetXYRadius() - fV0Reader->GetNegativeMCParticle()->R());
1784 fHistograms->FillHistogram("Resolution_dRAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdRAbs);
1785 fHistograms->FillHistogram("Resolution_dR", fV0Reader->GetNegativeMCParticle()->R(), resdR);
1786 fHistograms->FillHistogram("Resolution_MC_R", fV0Reader->GetNegativeMCParticle()->R());
1787 fHistograms->FillHistogram("Resolution_ESD_R", fV0Reader->GetXYRadius());
1788 fHistograms->FillHistogram("Resolution_R_dPt", fV0Reader->GetNegativeMCParticle()->R(), resdPt);
1790 Double_t resdPhiAbs=0.;
1792 resdPhiAbs= (fV0Reader->GetMotherCandidatePhi()-fV0Reader->GetNegativeMCParticle()->Phi());
1793 fHistograms->FillHistogram("Resolution_dPhiAbs_VS_R", fV0Reader->GetNegativeMCParticle()->R(), resdPhiAbs);
1795 }//if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22)
1797 }//while(fV0Reader->NextV0)
1798 fHistograms->FillHistogram("ESD_NumberOfSurvivingV0s", nSurvivingV0s);
1799 fHistograms->FillHistogram("ESD_NumberOfV0s", fV0Reader->GetNumberOfV0s());
1800 fHistograms->FillHistogram("ESD_NumberOfContributorsVtx", fV0Reader->GetNumberOfContributorsVtx());
1802 fV0Reader->ResetV0IndexNumber();
1805 void AliAnalysisTaskGammaConversion::FillAODWithConversionGammas(){
1806 // Fill AOD with reconstructed Gamma
1808 for(Int_t gammaIndex=0;gammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();gammaIndex++){
1809 // for(UInt_t gammaIndex=0;gammaIndex<fKFReconstructedGammas.size();gammaIndex++){
1810 //Create AOD particle object from AliKFParticle
1811 //You could add directly AliKFParticle objects to the AOD, avoiding dependences with PartCorr
1812 //but this means that I have to work a little bit more in my side.
1813 //AODPWG4Particle objects are simpler and lighter, I think
1815 AliKFParticle * gammakf = dynamic_cast<AliKFParticle*>(fKFReconstructedGammasTClone->At(gammaIndex));
1816 AliAODPWG4Particle gamma = AliAODPWG4Particle(gammakf->Px(),gammakf->Py(),gammakf->Pz(), gammakf->E());
1817 //gamma.SetLabel(-1);//How to get the MC label of the reconstructed gamma?
1818 gamma.SetTrackLabel( fElectronv1[gammaIndex], fElectronv2[gammaIndex] ); //How to get the MC label of the 2 electrons that form the gamma?
1819 gamma.SetDetector("CTS"); //tag the gamma as reconstructed in the central barrel
1820 gamma.SetPdg(AliPID::kEleCon); //photon id
1821 gamma.SetTag(-1); //Here I usually put a flag saying that montecarlo says it is prompt, decay fragmentation photon, or hadrons or whatever
1822 gamma.SetChi2(gammakf->Chi2());
1823 Int_t i = fAODBranch->GetEntriesFast();
1824 new((*fAODBranch)[i]) AliAODPWG4Particle(gamma);
1827 AliKFParticle * gammakf = (AliKFParticle *)fKFReconstructedGammasTClone->At(gammaIndex);
1828 AliGammaConversionAODObject aodObject;
1829 aodObject.SetPx(gammakf->GetPx());
1830 aodObject.SetPy(gammakf->GetPy());
1831 aodObject.SetPz(gammakf->GetPz());
1832 aodObject.SetLabel1(fElectronv1[gammaIndex]);
1833 aodObject.SetLabel2(fElectronv2[gammaIndex]);
1834 aodObject.SetChi2(gammakf->Chi2());
1835 aodObject.SetE(gammakf->E());
1836 Int_t i = fAODGamma->GetEntriesFast();
1837 new((*fAODGamma)[i]) AliGammaConversionAODObject(aodObject);
1842 void AliAnalysisTaskGammaConversion::ProcessGammasForOmegaMesonAnalysis(){
1843 // omega meson analysis pi0+gamma decay
1844 for(Int_t firstPi0Index=0;firstPi0Index<fKFReconstructedPi0sTClone->GetEntriesFast();firstPi0Index++){
1845 AliKFParticle * omegaCandidatePi0Daughter = (AliKFParticle *)fKFReconstructedPi0sTClone->At(firstPi0Index);
1846 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
1848 AliKFParticle * omegaCandidateGammaDaughter = (AliKFParticle *)fKFReconstructedGammasTClone->At(firstGammaIndex);
1849 if(fGammav1[firstPi0Index]==firstGammaIndex || fGammav2[firstPi0Index]==firstGammaIndex){
1853 AliKFParticle omegaCandidate(*omegaCandidatePi0Daughter,*omegaCandidateGammaDaughter);
1854 Double_t massOmegaCandidate = 0.;
1855 Double_t widthOmegaCandidate = 0.;
1857 omegaCandidate.GetMass(massOmegaCandidate,widthOmegaCandidate);
1859 if ( massOmegaCandidate > 733 && massOmegaCandidate < 833 ) {
1860 AddOmegaToAOD(&omegaCandidate, massOmegaCandidate, firstPi0Index, firstGammaIndex);
1863 fHistograms->FillHistogram("ESD_Omega_InvMass_vs_Pt",massOmegaCandidate ,omegaCandidate.GetPt());
1864 fHistograms->FillHistogram("ESD_Omega_InvMass",massOmegaCandidate);
1866 //delete omegaCandidate;
1868 }// end of omega reconstruction in pi0+gamma channel
1870 if(fDoJet == kTRUE){
1871 AliKFParticle* negPiKF=NULL;
1872 AliKFParticle* posPiKF=NULL;
1874 // look at the pi+pi+pi0 channel
1875 for(Int_t iCh=0;iCh<fChargedParticles->GetEntriesFast();iCh++){
1876 AliESDtrack* posTrack = (AliESDtrack*)(fChargedParticles->At(iCh));
1877 if (posTrack->GetSign()<0) continue;
1878 if(TMath::Abs(fV0Reader->GetESDpid()->NumberOfSigmasTPC(posTrack,AliPID::kPion))>2.) continue;
1879 if (posPiKF) delete posPiKF; posPiKF=NULL;
1880 posPiKF = new AliKFParticle( *(posTrack) ,211);
1882 for(Int_t jCh=0;jCh<fChargedParticles->GetEntriesFast();jCh++){
1883 AliESDtrack* negTrack = (AliESDtrack*)(fChargedParticles->At(jCh));
1884 if( negTrack->GetSign()>0) continue;
1885 if(TMath::Abs(fV0Reader->GetESDpid()->NumberOfSigmasTPC(negTrack,AliPID::kPion))>2.) continue;
1886 if (negPiKF) delete negPiKF; negPiKF=NULL;
1887 negPiKF = new AliKFParticle( *(negTrack) ,-211);
1888 AliKFParticle omegaCandidatePipPinPi0(*omegaCandidatePi0Daughter,*posPiKF,*negPiKF);
1889 Double_t massOmegaCandidatePipPinPi0 = 0.;
1890 Double_t widthOmegaCandidatePipPinPi0 = 0.;
1892 omegaCandidatePipPinPi0.GetMass(massOmegaCandidatePipPinPi0,widthOmegaCandidatePipPinPi0);
1894 if ( massOmegaCandidatePipPinPi0 > 733 && massOmegaCandidatePipPinPi0 < 833 ) {
1895 AddOmegaToAOD(&omegaCandidatePipPinPi0, massOmegaCandidatePipPinPi0, -1, -1);
1898 fHistograms->FillHistogram("ESD_OmegaPipPinPi0_InvMass_vs_Pt",massOmegaCandidatePipPinPi0 ,omegaCandidatePipPinPi0.GetPt());
1899 fHistograms->FillHistogram("ESD_OmegaPipPinPi0_InvMass",massOmegaCandidatePipPinPi0);
1901 // delete omegaCandidatePipPinPi0;
1904 } // checking ig gammajet because in that case the chargedparticle list is created
1910 if(fCalculateBackground){
1912 AliGammaConversionBGHandler * bgHandler = fV0Reader->GetBGHandler();
1914 Int_t zbin= bgHandler->GetZBinIndex(fV0Reader->GetVertexZ());
1916 if(fUseTrackMultiplicityForBG == kTRUE){
1917 mbin = bgHandler->GetMultiplicityBinIndex(fV0Reader->CountESDTracks());
1920 mbin = bgHandler->GetMultiplicityBinIndex(fV0Reader->GetNGoodV0s());
1923 AliGammaConversionBGHandler::GammaConversionVertex *bgEventVertex = NULL;
1925 // Background calculation for the omega
1926 for(Int_t nEventsInBG=0;nEventsInBG <fV0Reader->GetNBGEvents();nEventsInBG++){
1927 AliGammaConversionKFVector * previousEventV0s = bgHandler->GetBGGoodV0s(zbin,mbin,nEventsInBG);
1929 if(fMoveParticleAccordingToVertex == kTRUE){
1930 bgEventVertex = bgHandler->GetBGEventVertex(zbin,mbin,nEventsInBG);
1932 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1933 AliKFParticle previousGoodV0 = (AliKFParticle)(*(previousEventV0s->at(iPrevious)));
1935 if(fMoveParticleAccordingToVertex == kTRUE){
1936 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
1939 for(Int_t firstPi0Index=0;firstPi0Index<fKFReconstructedPi0sTClone->GetEntriesFast();firstPi0Index++){
1940 AliKFParticle * omegaCandidatePi0Daughter = (AliKFParticle *)fKFReconstructedPi0sTClone->At(firstPi0Index);
1941 AliKFParticle * omegaBckCandidate = new AliKFParticle(*omegaCandidatePi0Daughter,previousGoodV0);
1942 Double_t massOmegaBckCandidate = 0.;
1943 Double_t widthOmegaBckCandidate = 0.;
1945 omegaBckCandidate->GetMass(massOmegaBckCandidate,widthOmegaBckCandidate);
1948 fHistograms->FillHistogram("ESD_Omega_Bck_InvMass_vs_Pt",massOmegaBckCandidate ,omegaBckCandidate->GetPt());
1949 fHistograms->FillHistogram("ESD_Omega_Bck_InvMass",massOmegaBckCandidate);
1951 delete omegaBckCandidate;
1955 } // end of checking if background calculation is available
1959 void AliAnalysisTaskGammaConversion::AddOmegaToAOD(AliKFParticle * omegakf, Double_t mass, Int_t omegaDaughter, Int_t gammaDaughter) {
1960 //See header file for documentation
1961 AliGammaConversionAODObject omega;
1962 omega.SetPx(omegakf->Px());
1963 omega.SetPy(omegakf->Py());
1964 omega.SetPz(omegakf->Pz());
1965 omega.SetChi2(omegakf->GetChi2());
1966 omega.SetE(omegakf->E());
1967 omega.SetIMass(mass);
1968 omega.SetLabel1(omegaDaughter);
1969 //dynamic_cast<AliGammaConversionAODObject*>(fAODBranch->At(daughter1))->SetTagged(kTRUE);
1970 omega.SetLabel2(gammaDaughter);
1971 new((*fAODOmega)[fAODOmega->GetEntriesFast()]) AliGammaConversionAODObject(omega);
1976 void AliAnalysisTaskGammaConversion::ProcessGammasForNeutralMesonAnalysis(){
1977 // see header file for documentation
1979 // for(UInt_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammas.size();firstGammaIndex++){
1980 // for(UInt_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFReconstructedGammas.size();secondGammaIndex++){
1982 fESDEvent = fV0Reader->GetESDEvent();
1984 if(fKFReconstructedGammasTClone->GetEntriesFast()>fV0Reader->GetNumberOfV0s()){
1985 cout<<"Warning, number of entries in the tclone is bigger than number of v0s"<<endl;
1988 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
1989 for(Int_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();secondGammaIndex++){
1991 // AliKFParticle * twoGammaDecayCandidateDaughter0 = &fKFReconstructedGammas[firstGammaIndex];
1992 // AliKFParticle * twoGammaDecayCandidateDaughter1 = &fKFReconstructedGammas[secondGammaIndex];
1994 AliKFParticle * twoGammaDecayCandidateDaughter0 = (AliKFParticle *)fKFReconstructedGammasTClone->At(firstGammaIndex);
1995 AliKFParticle * twoGammaDecayCandidateDaughter1 = (AliKFParticle *)fKFReconstructedGammasTClone->At(secondGammaIndex);
1997 if(fElectronv1[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv1[firstGammaIndex]==fElectronv2[secondGammaIndex]){
2000 if(fElectronv2[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv2[firstGammaIndex]==fElectronv2[secondGammaIndex]){
2004 AliKFParticle *twoGammaCandidate = new AliKFParticle(*twoGammaDecayCandidateDaughter0,*twoGammaDecayCandidateDaughter1);
2006 Double_t massTwoGammaCandidate = 0.;
2007 Double_t widthTwoGammaCandidate = 0.;
2008 Double_t chi2TwoGammaCandidate =10000.;
2009 twoGammaCandidate->GetMass(massTwoGammaCandidate,widthTwoGammaCandidate);
2010 // if(twoGammaCandidate->GetNDF()>0){
2011 // chi2TwoGammaCandidate = twoGammaCandidate->GetChi2()/twoGammaCandidate->GetNDF();
2012 chi2TwoGammaCandidate = twoGammaCandidate->GetChi2();
2014 fHistograms->FillHistogram("ESD_Mother_Chi2",chi2TwoGammaCandidate);
2015 if((chi2TwoGammaCandidate>0 && chi2TwoGammaCandidate<fV0Reader->GetChi2CutMeson()) || fApplyChi2Cut == kFALSE){
2017 TVector3 momentumVectorTwoGammaCandidate(twoGammaCandidate->GetPx(),twoGammaCandidate->GetPy(),twoGammaCandidate->GetPz());
2018 TVector3 spaceVectorTwoGammaCandidate(twoGammaCandidate->GetX(),twoGammaCandidate->GetY(),twoGammaCandidate->GetZ());
2020 Double_t openingAngleTwoGammaCandidate = twoGammaDecayCandidateDaughter0->GetAngle(*twoGammaDecayCandidateDaughter1);
2022 if(twoGammaCandidate->GetE() - twoGammaCandidate->GetPz() <= 0 || twoGammaCandidate->GetE() + twoGammaCandidate->GetPz() <= 0){
2023 cout << "Error: |Pz| > E !!!! " << endl;
2027 rapidity = 0.5*(TMath::Log((twoGammaCandidate->GetE() +twoGammaCandidate->GetPz()) / (twoGammaCandidate->GetE()-twoGammaCandidate->GetPz())));
2030 if(TMath::Abs(rapidity) > fV0Reader->GetRapidityMesonCut()){
2031 delete twoGammaCandidate;
2032 continue; // rapidity cut
2037 if( (twoGammaDecayCandidateDaughter0->GetE()+twoGammaDecayCandidateDaughter1->GetE()) != 0){
2038 alfa=TMath::Abs((twoGammaDecayCandidateDaughter0->GetE()-twoGammaDecayCandidateDaughter1->GetE())
2039 /(twoGammaDecayCandidateDaughter0->GetE()+twoGammaDecayCandidateDaughter1->GetE()));
2042 if(openingAngleTwoGammaCandidate < fMinOpeningAngleGhostCut){
2043 delete twoGammaCandidate;
2044 continue; // minimum opening angle to avoid using ghosttracks
2047 if(alfa>fV0Reader->GetAlphaMinCutMeson() && alfa<fV0Reader->GetAlphaCutMeson()){
2048 fHistograms->FillHistogram("ESD_Mother_GammaDaughter_OpeningAngle", openingAngleTwoGammaCandidate);
2049 fHistograms->FillHistogram("ESD_Mother_Energy", twoGammaCandidate->GetE());
2050 fHistograms->FillHistogram("ESD_Mother_Pt", momentumVectorTwoGammaCandidate.Pt());
2051 fHistograms->FillHistogram("ESD_Mother_Eta", momentumVectorTwoGammaCandidate.Eta());
2052 fHistograms->FillHistogram("ESD_Mother_Rapid", rapidity);
2053 fHistograms->FillHistogram("ESD_Mother_Phi", spaceVectorTwoGammaCandidate.Phi());
2054 fHistograms->FillHistogram("ESD_Mother_Mass", massTwoGammaCandidate);
2055 fHistograms->FillHistogram("ESD_Mother_alfa", alfa);
2056 fHistograms->FillHistogram("ESD_Mother_R", spaceVectorTwoGammaCandidate.Pt()); // Pt in Space == R!!!
2057 fHistograms->FillHistogram("ESD_Mother_ZR", twoGammaCandidate->GetZ(), spaceVectorTwoGammaCandidate.Pt());
2058 fHistograms->FillHistogram("ESD_Mother_XY", twoGammaCandidate->GetX(), twoGammaCandidate->GetY());
2059 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2060 fHistograms->FillHistogram("ESD_Mother_InvMass",massTwoGammaCandidate);
2061 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt_alpha",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2064 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_E_alpha",massTwoGammaCandidate ,twoGammaCandidate->GetE());
2068 if(fCalculateBackground){
2069 /* Kenneth, just for testing*/
2070 AliGammaConversionBGHandler * bgHandlerTest = fV0Reader->GetBGHandler();
2072 Int_t zbin= bgHandlerTest->GetZBinIndex(fV0Reader->GetVertexZ());
2075 if(fUseTrackMultiplicityForBG == kTRUE){
2076 multKAA=fV0Reader->CountESDTracks();
2077 mbin = bgHandlerTest->GetMultiplicityBinIndex(fV0Reader->CountESDTracks());
2079 else{// means we use #v0s for multiplicity
2080 multKAA=fV0Reader->GetNGoodV0s();
2081 mbin = bgHandlerTest->GetMultiplicityBinIndex(fV0Reader->GetNGoodV0s());
2083 // cout<<"Filling bin number "<<zbin<<" and "<<mbin<<endl;
2084 // cout<<"Corresponding to z = "<<fV0Reader->GetVertexZ()<<" and m = "<<multKAA<<endl;
2085 if(alfa>fV0Reader->GetAlphaMinCutMeson() && alfa<fV0Reader->GetAlphaCutMeson()){
2086 fHistograms->FillHistogram(Form("%d%dESD_Mother_InvMass",zbin,mbin),massTwoGammaCandidate);
2087 fHistograms->FillHistogram(Form("%d%dESD_Mother_InvMass_vs_Pt",zbin,mbin),massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2088 /* end Kenneth, just for testing*/
2089 fHistograms->FillHistogram(Form("%dESD_Mother_InvMass_vs_Pt",mbin),massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2092 /* if(fCalculateBackground){
2093 AliGammaConversionBGHandler * bgHandler = fV0Reader->GetBGHandler();
2094 Int_t mbin= bgHandler->GetMultiplicityBinIndex(fV0Reader->CountESDTracks());
2095 fHistograms->FillHistogram(Form("%dESD_Mother_InvMass_vs_Pt",mbin),massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2097 // if(fDoNeutralMesonV0MCCheck){
2099 //Kenneth: Checking the eta of the gamma to check the difference between 0.9 and 1.2
2100 Int_t indexKF1 = fKFReconstructedGammasV0Index.at(firstGammaIndex);
2101 if(indexKF1<fV0Reader->GetNumberOfV0s()){
2102 fV0Reader->GetV0(indexKF1);//updates to the correct v0
2103 Double_t eta1 = fV0Reader->GetMotherCandidateEta();
2104 Bool_t isRealPi0=kFALSE;
2105 Bool_t isRealEta=kFALSE;
2106 Int_t gamma1MotherLabel=-1;
2107 if(fV0Reader->HasSameMCMother() == kTRUE){
2108 //cout<<"This v0 is a real v0!!!!"<<endl;
2109 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
2110 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
2111 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){
2112 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){
2113 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
2114 gamma1MotherLabel=fV0Reader->GetMotherMCParticle()->GetFirstMother();
2119 Int_t indexKF2 = fKFReconstructedGammasV0Index.at(secondGammaIndex);
2120 if(indexKF1 == indexKF2){
2121 cout<<"index of the two KF particles are the same.... should not happen"<<endl;
2123 if(indexKF2<fV0Reader->GetNumberOfV0s()){
2124 fV0Reader->GetV0(indexKF2);
2125 Double_t eta2 = fV0Reader->GetMotherCandidateEta();
2126 Int_t gamma2MotherLabel=-1;
2127 if(fV0Reader->HasSameMCMother() == kTRUE){
2128 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
2129 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
2130 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){
2131 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){
2132 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
2133 gamma2MotherLabel=fV0Reader->GetMotherMCParticle()->GetFirstMother();
2138 if(gamma1MotherLabel>=0 && gamma1MotherLabel==gamma2MotherLabel){
2139 if(fV0Reader->CheckIfPi0IsMother(gamma1MotherLabel)){
2142 if(fV0Reader->CheckIfEtaIsMother(gamma1MotherLabel)){
2147 if(alfa>fV0Reader->GetAlphaMinCutMeson() && alfa<fV0Reader->GetAlphaCutMeson()){
2148 if(TMath::Abs(eta1)>0.9 && TMath::Abs(eta2)>0.9){
2149 // fHistograms->FillHistogram("ESD_Mother_InvMass_1212",massTwoGammaCandidate);
2150 // fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2151 if(isRealPi0 || isRealEta){
2152 fHistograms->FillHistogram("ESD_TruePi0_InvMass_1212",massTwoGammaCandidate);
2153 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_1212",openingAngleTwoGammaCandidate);
2154 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2155 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2156 fHistograms->FillHistogram("ESD_TruePi0_InvMass",massTwoGammaCandidate);
2157 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt_alpha",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2160 if(!isRealPi0 && !isRealEta){
2161 if(gamma1MotherLabel>-1 && gamma2MotherLabel>-1){
2162 fHistograms->FillHistogram("ESD_TrueBckGG_InvMass",massTwoGammaCandidate);
2164 fHistograms->FillHistogram("ESD_TrueBckCont_InvMass",massTwoGammaCandidate);
2169 else if(TMath::Abs(eta1)>0.9 || TMath::Abs(eta2)>0.9){
2170 // fHistograms->FillHistogram("ESD_Mother_InvMass_0912",massTwoGammaCandidate);
2171 // fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2173 if(isRealPi0 || isRealEta){
2174 fHistograms->FillHistogram("ESD_TruePi0_InvMass_0912",massTwoGammaCandidate);
2175 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_0912",openingAngleTwoGammaCandidate);
2176 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2177 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2178 fHistograms->FillHistogram("ESD_TruePi0_InvMass",massTwoGammaCandidate);
2179 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt_alpha",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2181 if(!isRealPi0 && !isRealEta){
2182 if(gamma1MotherLabel>-1 && gamma2MotherLabel>-1){
2183 fHistograms->FillHistogram("ESD_TrueBckGG_InvMass",massTwoGammaCandidate);
2185 fHistograms->FillHistogram("ESD_TrueBckCont_InvMass",massTwoGammaCandidate);
2190 // fHistograms->FillHistogram("ESD_Mother_InvMass_0909",massTwoGammaCandidate);
2191 // fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2192 if(isRealPi0 || isRealEta){
2193 fHistograms->FillHistogram("ESD_TruePi0_InvMass_0909",massTwoGammaCandidate);
2194 fHistograms->FillHistogram("ESD_TruePi0_OpeningAngle_0909",openingAngleTwoGammaCandidate);
2195 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2196 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2197 fHistograms->FillHistogram("ESD_TruePi0_InvMass",massTwoGammaCandidate);
2198 fHistograms->FillHistogram("ESD_TruePi0_InvMass_vs_Pt_alpha",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2199 if(gamma1MotherLabel > fV0Reader->GetMCStack()->GetNprimary()){
2200 fHistograms->FillHistogram("ESD_TruePi0Sec_InvMass",massTwoGammaCandidate);
2203 if(!isRealPi0 && !isRealEta){
2204 if(gamma1MotherLabel>-1 && gamma2MotherLabel>-1){
2205 fHistograms->FillHistogram("ESD_TrueBckGG_InvMass",massTwoGammaCandidate);
2207 fHistograms->FillHistogram("ESD_TrueBckCont_InvMass",massTwoGammaCandidate);
2215 if(alfa>fV0Reader->GetAlphaMinCutMeson() && alfa<fV0Reader->GetAlphaCutMeson()){
2216 if ( TMath::Abs(twoGammaDecayCandidateDaughter0->GetEta())<0.9 && TMath::Abs(twoGammaDecayCandidateDaughter1->GetEta())<0.9 ){
2217 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt_Fiducial",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
2218 fHistograms->FillHistogram("ESD_Mother_InvMass_Fiducial",massTwoGammaCandidate);
2221 if(TMath::Abs(twoGammaDecayCandidateDaughter0->GetEta())>0.9 && TMath::Abs(twoGammaDecayCandidateDaughter1->GetEta())>0.9){
2222 fHistograms->FillHistogram("ESD_Mother_InvMass_1212",massTwoGammaCandidate);
2223 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt1212",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2225 else if(TMath::Abs(twoGammaDecayCandidateDaughter0->GetEta())>0.9 || TMath::Abs(twoGammaDecayCandidateDaughter1->GetEta())>0.9){
2226 fHistograms->FillHistogram("ESD_Mother_InvMass_0912",massTwoGammaCandidate);
2227 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0912",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2230 fHistograms->FillHistogram("ESD_Mother_InvMass_0909",massTwoGammaCandidate);
2231 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt0909",massTwoGammaCandidate,momentumVectorTwoGammaCandidate.Pt());
2234 Double_t lowMassPi0=0.1;
2235 Double_t highMassPi0=0.15;
2236 if (massTwoGammaCandidate > lowMassPi0 && massTwoGammaCandidate < highMassPi0 ){
2237 new((*fKFReconstructedPi0sTClone)[fKFReconstructedPi0sTClone->GetEntriesFast()]) AliKFParticle(*twoGammaCandidate);
2238 fGammav1.push_back(firstGammaIndex);
2239 fGammav2.push_back(secondGammaIndex);
2240 AddPionToAOD(twoGammaCandidate, massTwoGammaCandidate, firstGammaIndex, secondGammaIndex);
2246 delete twoGammaCandidate;
2251 void AliAnalysisTaskGammaConversion::AddPionToAOD(AliKFParticle * pionkf, Double_t mass, Int_t daughter1, Int_t daughter2) {
2252 //See header file for documentation
2253 AliGammaConversionAODObject pion;
2254 pion.SetPx(pionkf->Px());
2255 pion.SetPy(pionkf->Py());
2256 pion.SetPz(pionkf->Pz());
2257 pion.SetChi2(pionkf->GetChi2());
2258 pion.SetE(pionkf->E());
2259 pion.SetIMass(mass);
2260 pion.SetLabel1(daughter1);
2261 //dynamic_cast<AliGammaConversionAODObject*>(fAODBranch->At(daughter1))->SetTagged(kTRUE);
2262 pion.SetLabel2(daughter2);
2263 new((*fAODPi0)[fAODPi0->GetEntriesFast()]) AliGammaConversionAODObject(pion);
2269 void AliAnalysisTaskGammaConversion::ProcessConvPHOSGammasForNeutralMesonAnalysis(){
2271 // see header file for documentation
2272 // Analyse Pi0 with one photon from Phos and 1 photon from conversions
2277 vtx[0] = fV0Reader->GetPrimaryVertex()->GetX();
2278 vtx[1] = fV0Reader->GetPrimaryVertex()->GetY();
2279 vtx[2] = fV0Reader->GetPrimaryVertex()->GetZ();
2282 // Loop over all CaloClusters and consider only the PHOS ones:
2283 AliESDCaloCluster *clu;
2284 TLorentzVector pPHOS;
2285 TLorentzVector gammaPHOS;
2286 TLorentzVector gammaGammaConv;
2287 TLorentzVector pi0GammaConvPHOS;
2288 TLorentzVector gammaGammaConvBck;
2289 TLorentzVector pi0GammaConvPHOSBck;
2292 for (Int_t i=0; i<fV0Reader->GetESDEvent()->GetNumberOfCaloClusters(); i++) {
2293 clu = fV0Reader->GetESDEvent()->GetCaloCluster(i);
2294 if ( !clu->IsPHOS() || clu->E()<0.1 ) continue;
2295 clu ->GetMomentum(pPHOS ,vtx);
2296 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
2297 AliKFParticle * twoGammaDecayCandidateDaughter0 = (AliKFParticle *)fKFReconstructedGammasTClone->At(firstGammaIndex);
2298 gammaGammaConv.SetXYZM(twoGammaDecayCandidateDaughter0->Px(),twoGammaDecayCandidateDaughter0->Py(),twoGammaDecayCandidateDaughter0->Pz(),0.);
2299 gammaPHOS.SetXYZM(pPHOS.Px(),pPHOS.Py(),pPHOS.Pz(),0.);
2300 pi0GammaConvPHOS=gammaGammaConv+gammaPHOS;
2301 fHistograms->FillHistogram("ESD_Mother_InvMass_GammaConvPHOS",pi0GammaConvPHOS.M());
2302 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt_GammaConvPHOS",pi0GammaConvPHOS.M(),pi0GammaConvPHOS.Pt());
2304 TVector3 v3D0(twoGammaDecayCandidateDaughter0->Px(),twoGammaDecayCandidateDaughter0->Py(),twoGammaDecayCandidateDaughter0->Pz());
2305 TVector3 v3D1(gammaPHOS.Px(),gammaPHOS.Py(),gammaPHOS.Pz());
2306 Double_t opanConvPHOS= v3D0.Angle(v3D1);
2307 if ( opanConvPHOS < 0.35){
2308 fHistograms->FillHistogram("ESD_Mother_InvMass_GammaConvPHOS_OpanLow",pi0GammaConvPHOS.M());
2310 fHistograms->FillHistogram("ESD_Mother_InvMass_GammaConvPHOS_OpanHigh",pi0GammaConvPHOS.M());
2315 // Now the LorentVector pPHOS is obtained and can be paired with the converted proton
2317 //==== End of the PHOS cluster selection ============
2318 TLorentzVector pEMCAL;
2319 TLorentzVector gammaEMCAL;
2320 TLorentzVector pi0GammaConvEMCAL;
2321 TLorentzVector pi0GammaConvEMCALBck;
2323 for (Int_t i=0; i<fV0Reader->GetESDEvent()->GetNumberOfCaloClusters(); i++) {
2324 clu = fV0Reader->GetESDEvent()->GetCaloCluster(i);
2325 if ( !clu->IsEMCAL() || clu->E()<0.1 ) continue;
2326 if (clu->GetNCells() <= 1) continue;
2327 if ( clu->GetTOF()*1e9 < 550 || clu->GetTOF()*1e9 > 750) continue;
2329 clu ->GetMomentum(pEMCAL ,vtx);
2330 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
2331 AliKFParticle * twoGammaDecayCandidateDaughter0 = (AliKFParticle *)fKFReconstructedGammasTClone->At(firstGammaIndex);
2332 gammaGammaConv.SetXYZM(twoGammaDecayCandidateDaughter0->Px(),
2333 twoGammaDecayCandidateDaughter0->Py(),
2334 twoGammaDecayCandidateDaughter0->Pz(),0.);
2335 gammaEMCAL.SetXYZM(pEMCAL.Px(),pEMCAL.Py(),pEMCAL.Pz(),0.);
2336 pi0GammaConvEMCAL=gammaGammaConv+gammaEMCAL;
2337 fHistograms->FillHistogram("ESD_Mother_InvMass_GammaConvEMCAL",pi0GammaConvEMCAL.M());
2338 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt_GammaConvEMCAL",pi0GammaConvEMCAL.M(),pi0GammaConvEMCAL.Pt());
2339 TVector3 v3D0(twoGammaDecayCandidateDaughter0->Px(),
2340 twoGammaDecayCandidateDaughter0->Py(),
2341 twoGammaDecayCandidateDaughter0->Pz());
2342 TVector3 v3D1(gammaEMCAL.Px(),gammaEMCAL.Py(),gammaEMCAL.Pz());
2345 Double_t opanConvEMCAL= v3D0.Angle(v3D1);
2346 if ( opanConvEMCAL < 0.35){
2347 fHistograms->FillHistogram("ESD_Mother_InvMass_GammaConvEMCAL_OpanLow",pi0GammaConvEMCAL.M());
2349 fHistograms->FillHistogram("ESD_Mother_InvMass_GammaConvEMCAL_OpanHigh",pi0GammaConvEMCAL.M());
2353 if(fCalculateBackground){
2354 for(Int_t nEventsInBG=0;nEventsInBG <fV0Reader->GetNBGEvents();nEventsInBG++){
2355 AliGammaConversionKFVector * previousEventV0s = fV0Reader->GetBGGoodV0s(nEventsInBG);
2356 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
2357 AliKFParticle previousGoodV0 = (AliKFParticle)(*(previousEventV0s->at(iPrevious)));
2358 gammaGammaConvBck.SetXYZM(previousGoodV0.Px(),
2359 previousGoodV0.Py(),
2360 previousGoodV0.Pz(),0.);
2361 pi0GammaConvEMCALBck=gammaGammaConvBck+gammaEMCAL;
2362 fHistograms->FillHistogram("ESD_Mother_InvMass_GammaConvEMCAL_Bck",pi0GammaConvEMCALBck.M());
2363 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt_GammaConvEMCAL_Bck",pi0GammaConvEMCALBck.M(),
2364 pi0GammaConvEMCALBck.Pt());
2368 // Now the LorentVector pEMCAL is obtained and can be paired with the converted proton
2369 } // end of checking if background photons are available
2371 //==== End of the PHOS cluster selection ============
2375 void AliAnalysisTaskGammaConversion::MoveParticleAccordingToVertex(AliKFParticle *particle,AliGammaConversionBGHandler::GammaConversionVertex *vertex){
2376 //see header file for documentation
2378 Double_t dx = vertex->fX - fESDEvent->GetPrimaryVertex()->GetX();
2379 Double_t dy = vertex->fY - fESDEvent->GetPrimaryVertex()->GetY();
2380 Double_t dz = vertex->fZ - fESDEvent->GetPrimaryVertex()->GetZ();
2382 // cout<<"dx, dy, dz: ["<<dx<<","<<dy<<","<<dz<<"]"<<endl;
2383 particle->X() = particle->GetX() - dx;
2384 particle->Y() = particle->GetY() - dy;
2385 particle->Z() = particle->GetZ() - dz;
2388 void AliAnalysisTaskGammaConversion::RotateKFParticle(AliKFParticle * kfParticle,Double_t angle){
2390 Double_t c = cos(angle);
2391 Double_t s = sin(angle);
2394 for( Int_t i=0; i<7; i++ ){
2395 for( Int_t j=0; j<7; j++){
2399 for( int i=0; i<7; i++ ){
2402 A[0][0] = c; A[0][1] = s;
2403 A[1][0] = -s; A[1][1] = c;
2404 A[3][3] = c; A[3][4] = s;
2405 A[4][3] = -s; A[4][4] = c;
2410 for( Int_t i=0; i<7; i++ ){
2412 for( Int_t k=0; k<7; k++){
2413 Ap[i]+=A[i][k] * kfParticle->GetParameter(k);
2417 for( Int_t i=0; i<7; i++){
2418 kfParticle->Parameter(i) = Ap[i];
2421 for( Int_t i=0; i<7; i++ ){
2422 for( Int_t j=0; j<7; j++ ){
2424 for( Int_t k=0; k<7; k++ ){
2425 AC[i][j]+= A[i][k] * kfParticle->GetCovariance(k,j);
2430 for( Int_t i=0; i<7; i++ ){
2431 for( Int_t j=0; j<=i; j++ ){
2433 for( Int_t k=0; k<7; k++){
2434 xx+= AC[i][k]*A[j][k];
2436 kfParticle->Covariance(i,j) = xx;
2442 void AliAnalysisTaskGammaConversion::CalculateBackground(){
2443 // see header file for documentation
2446 TClonesArray * currentEventV0s = fV0Reader->GetCurrentEventGoodV0s();
2448 AliGammaConversionBGHandler * bgHandler = fV0Reader->GetBGHandler();
2450 Int_t zbin= bgHandler->GetZBinIndex(fV0Reader->GetVertexZ());
2452 if(fUseTrackMultiplicityForBG == kTRUE){
2453 mbin = bgHandler->GetMultiplicityBinIndex(fV0Reader->CountESDTracks());
2456 mbin = bgHandler->GetMultiplicityBinIndex(fV0Reader->GetNGoodV0s());
2459 if(fDoRotation == kTRUE){
2460 TRandom3 *random = new TRandom3();
2461 for(Int_t iCurrent=0;iCurrent<currentEventV0s->GetEntriesFast();iCurrent++){
2462 AliKFParticle currentEventGoodV0 = *(AliKFParticle *)(currentEventV0s->At(iCurrent));
2463 for(Int_t iCurrent2=iCurrent+1;iCurrent2<currentEventV0s->GetEntriesFast();iCurrent2++){
2464 for(Int_t nRandom=0;nRandom<nRandomEventsForBG;nRandom++){
2466 AliKFParticle currentEventGoodV02 = *(AliKFParticle *)(currentEventV0s->At(iCurrent2));
2468 if(fCheckBGProbability == kTRUE){
2469 Double_t massBGprob =0.;
2470 Double_t widthBGprob = 0.;
2471 AliKFParticle *backgroundCandidateProb = new AliKFParticle(currentEventGoodV0,currentEventGoodV02);
2472 backgroundCandidateProb->GetMass(massBGprob,widthBGprob);
2473 if(massBGprob>0.1 && massBGprob<0.14){
2474 if(random->Rndm()>bgHandler->GetBGProb(zbin,mbin)){
2475 delete backgroundCandidateProb;
2479 delete backgroundCandidateProb;
2482 Double_t nRadiansPM = nDegreesPMBackground*TMath::Pi()/180;
2484 Double_t rotationValue = random->Rndm()*2*nRadiansPM + TMath::Pi()-nRadiansPM;
2486 RotateKFParticle(¤tEventGoodV02,rotationValue);
2488 AliKFParticle *backgroundCandidate = new AliKFParticle(currentEventGoodV0,currentEventGoodV02);
2490 Double_t massBG =0.;
2491 Double_t widthBG = 0.;
2492 Double_t chi2BG =10000.;
2493 backgroundCandidate->GetMass(massBG,widthBG);
2495 // if(backgroundCandidate->GetNDF()>0){
2496 chi2BG = backgroundCandidate->GetChi2();
2497 if((chi2BG>0 && chi2BG<fV0Reader->GetChi2CutMeson()) || fApplyChi2Cut == kFALSE){
2499 TVector3 momentumVectorbackgroundCandidate(backgroundCandidate->GetPx(),backgroundCandidate->GetPy(),backgroundCandidate->GetPz());
2500 TVector3 spaceVectorbackgroundCandidate(backgroundCandidate->GetX(),backgroundCandidate->GetY(),backgroundCandidate->GetZ());
2502 Double_t openingAngleBG = currentEventGoodV0.GetAngle(currentEventGoodV02);
2505 if(backgroundCandidate->GetE() - backgroundCandidate->GetPz() == 0 || backgroundCandidate->GetE() + backgroundCandidate->GetPz() == 0) rapidity=0;
2506 else rapidity = 0.5*(TMath::Log((backgroundCandidate->GetE() +backgroundCandidate->GetPz()) / (backgroundCandidate->GetE()-backgroundCandidate->GetPz())));
2508 if(TMath::Abs(rapidity) > fV0Reader->GetRapidityMesonCut() ){
2509 delete backgroundCandidate;
2510 continue; // rapidity cut
2515 if( (currentEventGoodV0.GetE()+currentEventGoodV02.GetE()) != 0){
2516 alfa=TMath::Abs((currentEventGoodV0.GetE()-currentEventGoodV02.GetE())
2517 /(currentEventGoodV0.GetE()+currentEventGoodV02.GetE()));
2521 if(openingAngleBG < fMinOpeningAngleGhostCut ){
2522 delete backgroundCandidate;
2523 continue; // minimum opening angle to avoid using ghosttracks
2527 if(alfa>fV0Reader->GetAlphaMinCutMeson() && alfa<fV0Reader->GetAlphaCutMeson()){
2528 fHistograms->FillHistogram("ESD_Background_GammaDaughter_OpeningAngle", openingAngleBG);
2529 fHistograms->FillHistogram("ESD_Background_Energy", backgroundCandidate->GetE());
2530 fHistograms->FillHistogram("ESD_Background_Pt", momentumVectorbackgroundCandidate.Pt());
2531 fHistograms->FillHistogram("ESD_Background_Eta", momentumVectorbackgroundCandidate.Eta());
2532 fHistograms->FillHistogram("ESD_Background_Rapidity", rapidity);
2533 fHistograms->FillHistogram("ESD_Background_Phi", spaceVectorbackgroundCandidate.Phi());
2534 fHistograms->FillHistogram("ESD_Background_Mass", massBG);
2535 fHistograms->FillHistogram("ESD_Background_R", spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
2536 fHistograms->FillHistogram("ESD_Background_ZR", backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
2537 fHistograms->FillHistogram("ESD_Background_XY", backgroundCandidate->GetX(), backgroundCandidate->GetY());
2538 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt",massBG,momentumVectorbackgroundCandidate.Pt());
2539 fHistograms->FillHistogram("ESD_Background_InvMass",massBG);
2540 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_alpha",massBG,momentumVectorbackgroundCandidate.Pt());
2543 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(currentEventGoodV02.GetEta())<0.9 ){
2544 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_Fiducial",massBG,momentumVectorbackgroundCandidate.Pt());
2545 fHistograms->FillHistogram("ESD_Background_InvMass_Fiducial",massBG);
2548 fHistograms->FillHistogram(Form("%d%dESD_Background_GammaDaughter_OpeningAngle",zbin,mbin), openingAngleBG);
2549 fHistograms->FillHistogram(Form("%d%dESD_Background_Energy",zbin,mbin), backgroundCandidate->GetE());
2550 fHistograms->FillHistogram(Form("%d%dESD_Background_Pt",zbin,mbin), momentumVectorbackgroundCandidate.Pt());
2551 fHistograms->FillHistogram(Form("%d%dESD_Background_Eta",zbin,mbin), momentumVectorbackgroundCandidate.Eta());
2552 fHistograms->FillHistogram(Form("%d%dESD_Background_Rapidity",zbin,mbin), rapidity);
2553 fHistograms->FillHistogram(Form("%d%dESD_Background_Phi",zbin,mbin), spaceVectorbackgroundCandidate.Phi());
2554 fHistograms->FillHistogram(Form("%d%dESD_Background_Mass",zbin,mbin), massBG);
2555 fHistograms->FillHistogram(Form("%d%dESD_Background_R",zbin,mbin), spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
2556 fHistograms->FillHistogram(Form("%d%dESD_Background_ZR",zbin,mbin), backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
2557 fHistograms->FillHistogram(Form("%d%dESD_Background_XY",zbin,mbin), backgroundCandidate->GetX(), backgroundCandidate->GetY());
2558 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
2559 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass",zbin,mbin),massBG);
2561 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(currentEventGoodV02.GetEta())<0.9 ){
2562 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt_Fiducial",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
2563 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_Fiducial",zbin,mbin),massBG);
2567 fHistograms->FillHistogram("ESD_Background_InvMass_vs_E_alpha",massBG ,backgroundCandidate->GetE());
2572 delete backgroundCandidate;
2578 else{ // means no rotation
2579 AliGammaConversionBGHandler::GammaConversionVertex *bgEventVertex = NULL;
2581 if(fUseTrackMultiplicityForBG){
2582 // cout<<"Using charged track multiplicity for background calculation"<<endl;
2583 for(Int_t nEventsInBG=0;nEventsInBG <fV0Reader->GetNBGEvents();nEventsInBG++){
2585 AliGammaConversionKFVector * previousEventV0s = bgHandler->GetBGGoodV0s(zbin,mbin,nEventsInBG);//fV0Reader->GetBGGoodV0s(nEventsInBG);
2587 if(fMoveParticleAccordingToVertex == kTRUE){
2588 bgEventVertex = bgHandler->GetBGEventVertex(zbin,mbin,nEventsInBG);
2591 for(Int_t iCurrent=0;iCurrent<currentEventV0s->GetEntriesFast();iCurrent++){
2592 AliKFParticle currentEventGoodV0 = *(AliKFParticle *)(currentEventV0s->At(iCurrent));
2593 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
2594 AliKFParticle previousGoodV0 = (AliKFParticle)(*(previousEventV0s->at(iPrevious)));
2595 AliKFParticle previousGoodV0test = (AliKFParticle)(*(previousEventV0s->at(iPrevious)));
2597 //cout<<"Primary Vertex event: ["<<fESDEvent->GetPrimaryVertex()->GetX()<<","<<fESDEvent->GetPrimaryVertex()->GetY()<<","<<fESDEvent->GetPrimaryVertex()->GetZ()<<"]"<<endl;
2598 //cout<<"BG prim Vertex event: ["<<bgEventVertex->fX<<","<<bgEventVertex->fY<<","<<bgEventVertex->fZ<<"]"<<endl;
2600 //cout<<"XYZ of particle before transport: ["<<previousGoodV0.X()<<","<<previousGoodV0.Y()<<","<<previousGoodV0.Z()<<"]"<<endl;
2601 if(fMoveParticleAccordingToVertex == kTRUE){
2602 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
2604 //cout<<"XYZ of particle after transport: ["<<previousGoodV0.X()<<","<<previousGoodV0.Y()<<","<<previousGoodV0.Z()<<"]"<<endl;
2606 AliKFParticle *backgroundCandidate = new AliKFParticle(currentEventGoodV0,previousGoodV0);
2608 Double_t massBG =0.;
2609 Double_t widthBG = 0.;
2610 Double_t chi2BG =10000.;
2611 backgroundCandidate->GetMass(massBG,widthBG);
2612 // if(backgroundCandidate->GetNDF()>0){
2613 // chi2BG = backgroundCandidate->GetChi2()/backgroundCandidate->GetNDF();
2614 chi2BG = backgroundCandidate->GetChi2();
2615 if((chi2BG>0 && chi2BG<fV0Reader->GetChi2CutMeson()) || fApplyChi2Cut == kFALSE){
2617 TVector3 momentumVectorbackgroundCandidate(backgroundCandidate->GetPx(),backgroundCandidate->GetPy(),backgroundCandidate->GetPz());
2618 TVector3 spaceVectorbackgroundCandidate(backgroundCandidate->GetX(),backgroundCandidate->GetY(),backgroundCandidate->GetZ());
2620 Double_t openingAngleBG = currentEventGoodV0.GetAngle(previousGoodV0);
2624 if(backgroundCandidate->GetE() - backgroundCandidate->GetPz() <= 0 || backgroundCandidate->GetE() + backgroundCandidate->GetPz() <= 0){
2625 cout << "Error: |Pz| > E !!!! " << endl;
2628 rapidity = 0.5*(TMath::Log((backgroundCandidate->GetE() +backgroundCandidate->GetPz()) / (backgroundCandidate->GetE()-backgroundCandidate->GetPz())));
2630 if(TMath::Abs(rapidity) > fV0Reader->GetRapidityMesonCut() ){
2631 delete backgroundCandidate;
2632 continue; // rapidity cut
2637 if( (currentEventGoodV0.GetE()+previousGoodV0.GetE()) != 0){
2638 alfa=TMath::Abs((currentEventGoodV0.GetE()-previousGoodV0.GetE())
2639 /(currentEventGoodV0.GetE()+previousGoodV0.GetE()));
2643 if(openingAngleBG < fMinOpeningAngleGhostCut ){
2644 delete backgroundCandidate;
2645 continue; // minimum opening angle to avoid using ghosttracks
2649 if(alfa>fV0Reader->GetAlphaMinCutMeson() && alfa<fV0Reader->GetAlphaCutMeson()){
2650 fHistograms->FillHistogram("ESD_Background_GammaDaughter_OpeningAngle", openingAngleBG);
2651 fHistograms->FillHistogram("ESD_Background_Energy", backgroundCandidate->GetE());
2652 fHistograms->FillHistogram("ESD_Background_Pt", momentumVectorbackgroundCandidate.Pt());
2653 fHistograms->FillHistogram("ESD_Background_Eta", momentumVectorbackgroundCandidate.Eta());
2654 fHistograms->FillHistogram("ESD_Background_Rapidity", rapidity);
2655 fHistograms->FillHistogram("ESD_Background_Phi", spaceVectorbackgroundCandidate.Phi());
2656 fHistograms->FillHistogram("ESD_Background_Mass", massBG);
2657 fHistograms->FillHistogram("ESD_Background_R", spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
2658 fHistograms->FillHistogram("ESD_Background_ZR", backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
2659 fHistograms->FillHistogram("ESD_Background_XY", backgroundCandidate->GetX(), backgroundCandidate->GetY());
2660 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt",massBG,momentumVectorbackgroundCandidate.Pt());
2661 fHistograms->FillHistogram("ESD_Background_InvMass",massBG);
2662 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_alpha",massBG,momentumVectorbackgroundCandidate.Pt());
2665 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
2666 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_Fiducial",massBG,momentumVectorbackgroundCandidate.Pt());
2667 fHistograms->FillHistogram("ESD_Background_InvMass_Fiducial",massBG);
2671 fHistograms->FillHistogram(Form("%d%dESD_Background_GammaDaughter_OpeningAngle",zbin,mbin), openingAngleBG);
2672 fHistograms->FillHistogram(Form("%d%dESD_Background_Energy",zbin,mbin), backgroundCandidate->GetE());
2673 fHistograms->FillHistogram(Form("%d%dESD_Background_Pt",zbin,mbin), momentumVectorbackgroundCandidate.Pt());
2674 fHistograms->FillHistogram(Form("%d%dESD_Background_Eta",zbin,mbin), momentumVectorbackgroundCandidate.Eta());
2675 fHistograms->FillHistogram(Form("%d%dESD_Background_Rapidity",zbin,mbin), rapidity);
2676 fHistograms->FillHistogram(Form("%d%dESD_Background_Phi",zbin,mbin), spaceVectorbackgroundCandidate.Phi());
2677 fHistograms->FillHistogram(Form("%d%dESD_Background_Mass",zbin,mbin), massBG);
2678 fHistograms->FillHistogram(Form("%d%dESD_Background_R",zbin,mbin), spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
2679 fHistograms->FillHistogram(Form("%d%dESD_Background_ZR",zbin,mbin), backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
2680 fHistograms->FillHistogram(Form("%d%dESD_Background_XY",zbin,mbin), backgroundCandidate->GetX(), backgroundCandidate->GetY());
2681 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
2682 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass",zbin,mbin),massBG);
2684 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
2685 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt_Fiducial",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
2686 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_Fiducial",zbin,mbin),massBG);
2691 fHistograms->FillHistogram("ESD_Background_InvMass_vs_E_alpha",massBG ,backgroundCandidate->GetE());
2695 delete backgroundCandidate;
2700 else{ // means using #V0s for multiplicity
2702 // cout<<"Using the v0 multiplicity to calculate background"<<endl;
2704 fHistograms->FillHistogram("ESD_Background_z_m",zbin,mbin);
2705 fHistograms->FillHistogram("ESD_Mother_multpilicityVSv0s",fV0Reader->CountESDTracks(),fV0Reader->GetNumberOfV0s());
2707 for(Int_t nEventsInBG=0;nEventsInBG <fV0Reader->GetNBGEvents();nEventsInBG++){
2708 AliGammaConversionKFVector * previousEventV0s = bgHandler->GetBGGoodV0s(zbin,mbin,nEventsInBG);// fV0Reader->GetBGGoodV0s(nEventsInBG);
2709 if(previousEventV0s){
2711 if(fMoveParticleAccordingToVertex == kTRUE){
2712 bgEventVertex = bgHandler->GetBGEventVertex(zbin,mbin,nEventsInBG);
2715 for(Int_t iCurrent=0;iCurrent<currentEventV0s->GetEntriesFast();iCurrent++){
2716 AliKFParticle currentEventGoodV0 = *(AliKFParticle *)(currentEventV0s->At(iCurrent));
2717 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
2718 AliKFParticle previousGoodV0 = (AliKFParticle)(*(previousEventV0s->at(iPrevious)));
2720 if(fMoveParticleAccordingToVertex == kTRUE){
2721 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
2724 AliKFParticle *backgroundCandidate = new AliKFParticle(currentEventGoodV0,previousGoodV0);
2725 Double_t massBG =0.;
2726 Double_t widthBG = 0.;
2727 Double_t chi2BG =10000.;
2728 backgroundCandidate->GetMass(massBG,widthBG);
2729 /* if(backgroundCandidate->GetNDF()>0){
2730 chi2BG = backgroundCandidate->GetChi2()/backgroundCandidate->GetNDF();
2731 {//remember to remove
2732 TVector3 momentumVectorbackgroundCandidate(backgroundCandidate->GetPx(),backgroundCandidate->GetPy(),backgroundCandidate->GetPz());
2733 TVector3 spaceVectorbackgroundCandidate(backgroundCandidate->GetX(),backgroundCandidate->GetY(),backgroundCandidate->GetZ());
2735 Double_t openingAngleBG = currentEventGoodV0.GetAngle(previousGoodV0);
2736 fHistograms->FillHistogram("ESD_Background_GammaDaughter_OpeningAngle_nochi2", openingAngleBG);
2739 chi2BG = backgroundCandidate->GetChi2();
2740 if((chi2BG>0 && chi2BG<fV0Reader->GetChi2CutMeson()) || fApplyChi2Cut == kFALSE){
2741 TVector3 momentumVectorbackgroundCandidate(backgroundCandidate->GetPx(),backgroundCandidate->GetPy(),backgroundCandidate->GetPz());
2742 TVector3 spaceVectorbackgroundCandidate(backgroundCandidate->GetX(),backgroundCandidate->GetY(),backgroundCandidate->GetZ());
2744 Double_t openingAngleBG = currentEventGoodV0.GetAngle(previousGoodV0);
2747 if(backgroundCandidate->GetE() - backgroundCandidate->GetPz() == 0 || backgroundCandidate->GetE() + backgroundCandidate->GetPz() == 0) rapidity=0;
2748 else rapidity = 0.5*(TMath::Log((backgroundCandidate->GetE() +backgroundCandidate->GetPz()) / (backgroundCandidate->GetE()-backgroundCandidate->GetPz())));
2750 if(TMath::Abs(rapidity) > fV0Reader->GetRapidityMesonCut() ){
2751 delete backgroundCandidate;
2752 continue; // rapidity cut
2757 if( (currentEventGoodV0.GetE()+previousGoodV0.GetE()) != 0){
2758 alfa=TMath::Abs((currentEventGoodV0.GetE()-previousGoodV0.GetE())
2759 /(currentEventGoodV0.GetE()+previousGoodV0.GetE()));
2763 if(openingAngleBG < fMinOpeningAngleGhostCut ){
2764 delete backgroundCandidate;
2765 continue; // minimum opening angle to avoid using ghosttracks
2768 if(alfa>fV0Reader->GetAlphaMinCutMeson() && alfa<fV0Reader->GetAlphaCutMeson()){
2769 fHistograms->FillHistogram("ESD_Background_GammaDaughter_OpeningAngle", openingAngleBG);
2770 fHistograms->FillHistogram("ESD_Background_Energy", backgroundCandidate->GetE());
2771 fHistograms->FillHistogram("ESD_Background_Pt", momentumVectorbackgroundCandidate.Pt());
2772 fHistograms->FillHistogram("ESD_Background_Eta", momentumVectorbackgroundCandidate.Eta());
2773 fHistograms->FillHistogram("ESD_Background_Rapidity", rapidity);
2774 fHistograms->FillHistogram("ESD_Background_Phi", spaceVectorbackgroundCandidate.Phi());
2775 fHistograms->FillHistogram("ESD_Background_Mass", massBG);
2776 fHistograms->FillHistogram("ESD_Background_R", spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
2777 fHistograms->FillHistogram("ESD_Background_ZR", backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
2778 fHistograms->FillHistogram("ESD_Background_XY", backgroundCandidate->GetX(), backgroundCandidate->GetY());
2779 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt",massBG,momentumVectorbackgroundCandidate.Pt());
2780 fHistograms->FillHistogram("ESD_Background_InvMass",massBG);
2783 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_alpha",massBG,momentumVectorbackgroundCandidate.Pt());
2786 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
2787 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt_Fiducial",massBG,momentumVectorbackgroundCandidate.Pt());
2788 fHistograms->FillHistogram("ESD_Background_InvMass_Fiducial",massBG);
2791 if(massBG>0.5 && massBG<0.6){
2792 fHistograms->FillHistogram("ESD_Background_alfa_pt0506",momentumVectorbackgroundCandidate.Pt(),alfa);
2794 if(massBG>0.3 && massBG<0.4){
2795 fHistograms->FillHistogram("ESD_Background_alfa_pt0304",momentumVectorbackgroundCandidate.Pt(),alfa);
2799 fHistograms->FillHistogram(Form("%d%dESD_Background_GammaDaughter_OpeningAngle",zbin,mbin), openingAngleBG);
2800 fHistograms->FillHistogram(Form("%d%dESD_Background_Energy",zbin,mbin), backgroundCandidate->GetE());
2801 fHistograms->FillHistogram(Form("%d%dESD_Background_Pt",zbin,mbin), momentumVectorbackgroundCandidate.Pt());
2802 fHistograms->FillHistogram(Form("%d%dESD_Background_Eta",zbin,mbin), momentumVectorbackgroundCandidate.Eta());
2803 fHistograms->FillHistogram(Form("%d%dESD_Background_Rapidity",zbin,mbin), rapidity);
2804 fHistograms->FillHistogram(Form("%d%dESD_Background_Phi",zbin,mbin), spaceVectorbackgroundCandidate.Phi());
2805 fHistograms->FillHistogram(Form("%d%dESD_Background_Mass",zbin,mbin), massBG);
2806 fHistograms->FillHistogram(Form("%d%dESD_Background_R",zbin,mbin), spaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
2807 fHistograms->FillHistogram(Form("%d%dESD_Background_ZR",zbin,mbin), backgroundCandidate->GetZ(), spaceVectorbackgroundCandidate.Pt());
2808 fHistograms->FillHistogram(Form("%d%dESD_Background_XY",zbin,mbin), backgroundCandidate->GetX(), backgroundCandidate->GetY());
2809 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
2810 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass",zbin,mbin),massBG);
2812 if ( TMath::Abs(currentEventGoodV0.GetEta())<0.9 && TMath::Abs(previousGoodV0.GetEta())<0.9 ){
2813 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_vs_Pt_Fiducial",zbin,mbin),massBG,momentumVectorbackgroundCandidate.Pt());
2814 fHistograms->FillHistogram(Form("%d%dESD_Background_InvMass_Fiducial",zbin,mbin),massBG);
2819 fHistograms->FillHistogram("ESD_Background_InvMass_vs_E_alpha",massBG ,backgroundCandidate->GetE());
2823 delete backgroundCandidate;
2828 } // end else (means use #v0s as multiplicity)
2829 } // end no rotation
2833 void AliAnalysisTaskGammaConversion::ProcessGammasForGammaJetAnalysis(){
2834 //ProcessGammasForGammaJetAnalysis
2836 Double_t distIsoMin;
2838 CreateListOfChargedParticles();
2841 // for(UInt_t gammaIndex=0;gammaIndex<fKFReconstructedGammas.size();gammaIndex++){
2842 for(Int_t gammaIndex=0;gammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();gammaIndex++){
2843 AliKFParticle * currentGamma = (AliKFParticle*)fKFReconstructedGammasTClone->At(gammaIndex);
2844 TVector3 momentumVectorCurrentGamma(currentGamma->GetPx(),currentGamma->GetPy(),currentGamma->GetPz());
2846 if( momentumVectorCurrentGamma.Pt()> fMinPtForGammaJet){
2847 distIsoMin=GetMinimumDistanceToCharge(gammaIndex);
2849 if (distIsoMin > fMinIsoConeSize && fLeadingChargedIndex>=0){
2850 CalculateJetCone(gammaIndex);
2856 //____________________________________________________________________
2857 Bool_t AliAnalysisTaskGammaConversion::IsGoodImpPar(AliESDtrack *const track)
2860 // check whether particle has good DCAr(Pt) impact
2861 // parameter. Only for TPC+ITS tracks (7*sigma cut)
2862 // Origin: Andrea Dainese
2865 Float_t d0z0[2],covd0z0[3];
2866 track->GetImpactParameters(d0z0,covd0z0);
2867 Float_t sigma= 0.0050+0.0060/TMath::Power(track->Pt(),0.9);
2868 Float_t d0max = 7.*sigma;
2869 if(TMath::Abs(d0z0[0]) < d0max) return kTRUE;
2875 void AliAnalysisTaskGammaConversion::CreateListOfChargedParticles(){
2876 // CreateListOfChargedParticles
2878 fESDEvent = fV0Reader->GetESDEvent();
2879 Int_t numberOfESDTracks=0;
2880 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
2881 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
2886 // Not needed if Standard function used.
2887 // if(!IsGoodImpPar(curTrack)){
2891 if(fEsdTrackCuts->AcceptTrack(curTrack) ){
2892 new((*fChargedParticles)[fChargedParticles->GetEntriesFast()]) AliESDtrack(*curTrack);
2893 // fChargedParticles.push_back(curTrack);
2894 fChargedParticlesId.push_back(iTracks);
2895 numberOfESDTracks++;
2898 fHistograms->FillHistogram("ESD_NumberOfGoodESDTracks",numberOfESDTracks);
2900 if (fV0Reader->GetNumberOfContributorsVtx()>=1){
2901 fHistograms->FillHistogram("ESD_NumberOfGoodESDTracksVtx",numberOfESDTracks);
2904 void AliAnalysisTaskGammaConversion::RecalculateV0ForGamma(){
2906 Double_t massE=0.00051099892;
2907 TLorentzVector curElecPos;
2908 TLorentzVector curElecNeg;
2909 TLorentzVector curGamma;
2911 TLorentzVector curGammaAt;
2912 TLorentzVector curElecPosAt;
2913 TLorentzVector curElecNegAt;
2914 AliKFVertex primVtxGamma(*(fESDEvent->GetPrimaryVertex()));
2915 AliKFVertex primVtxImprovedGamma = primVtxGamma;
2917 const AliESDVertex *vtxT3D=fESDEvent->GetPrimaryVertex();
2919 Double_t xPrimaryVertex=vtxT3D->GetXv();
2920 Double_t yPrimaryVertex=vtxT3D->GetYv();
2921 Double_t zPrimaryVertex=vtxT3D->GetZv();
2922 // Float_t primvertex[3]={xPrimaryVertex,yPrimaryVertex,zPrimaryVertex};
2924 Float_t nsigmaTPCtrackPos;
2925 Float_t nsigmaTPCtrackNeg;
2926 Float_t nsigmaTPCtrackPosToPion;
2927 Float_t nsigmaTPCtrackNegToPion;
2928 AliKFParticle* negKF=NULL;
2929 AliKFParticle* posKF=NULL;
2931 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
2932 AliESDtrack* posTrack = fESDEvent->GetTrack(iTracks);
2936 if (posKF) delete posKF; posKF=NULL;
2937 if(posTrack->GetSign()<0) continue;
2938 if(!(posTrack->GetStatus() & AliESDtrack::kTPCrefit))continue;
2939 if(posTrack->GetKinkIndex(0)>0 ) continue;
2940 if(posTrack->GetNcls(1)<50)continue;
2942 // posTrack->GetConstrainedPxPyPz(momPos);
2943 posTrack->GetPxPyPz(momPos);
2944 AliESDtrack *ptrk=fESDEvent->GetTrack(iTracks);
2945 curElecPos.SetXYZM(momPos[0],momPos[1],momPos[2],massE);
2946 if(TMath::Abs(curElecPos.Eta())<0.9) continue;
2947 posKF = new AliKFParticle( *(posTrack),-11);
2949 nsigmaTPCtrackPos = fV0Reader->GetESDpid()->NumberOfSigmasTPC(posTrack,AliPID::kElectron);
2950 nsigmaTPCtrackPosToPion = fV0Reader->GetESDpid()->NumberOfSigmasTPC(posTrack,AliPID::kPion);
2952 if ( nsigmaTPCtrackPos>5.|| nsigmaTPCtrackPos<-2.){
2956 if(pow((momPos[0]*momPos[0]+momPos[1]*momPos[1]+momPos[2]*momPos[2]),0.5)>0.5 && nsigmaTPCtrackPosToPion<1){
2962 for(Int_t jTracks = 0; jTracks < fESDEvent->GetNumberOfTracks(); jTracks++){
2963 AliESDtrack* negTrack = fESDEvent->GetTrack(jTracks);
2967 if (negKF) delete negKF; negKF=NULL;
2968 if(negTrack->GetSign()>0) continue;
2969 if(!(negTrack->GetStatus() & AliESDtrack::kTPCrefit))continue;
2970 if(negTrack->GetKinkIndex(0)>0 ) continue;
2971 if(negTrack->GetNcls(1)<50)continue;
2973 // negTrack->GetConstrainedPxPyPz(momNeg);
2974 negTrack->GetPxPyPz(momNeg);
2976 nsigmaTPCtrackNeg = fV0Reader->GetESDpid()->NumberOfSigmasTPC(negTrack,AliPID::kElectron);
2977 nsigmaTPCtrackNegToPion = fV0Reader->GetESDpid()->NumberOfSigmasTPC(negTrack,AliPID::kPion);
2978 if ( nsigmaTPCtrackNeg>5. || nsigmaTPCtrackNeg<-2.){
2981 if(pow((momNeg[0]*momNeg[0]+momNeg[1]*momNeg[1]+momNeg[2]*momNeg[2]),0.5)>0.5 && nsigmaTPCtrackNegToPion<1){
2984 AliESDtrack *ntrk=fESDEvent->GetTrack(jTracks);
2985 curElecNeg.SetXYZM(momNeg[0],momNeg[1],momNeg[2],massE);
2986 if(TMath::Abs(curElecNeg.Eta())<0.9) continue;
2987 negKF = new AliKFParticle( *(negTrack) ,11);
2989 Double_t b=fESDEvent->GetMagneticField();
2990 Double_t xn, xp, dca=ntrk->GetDCA(ptrk,b,xn,xp);
2991 AliExternalTrackParam nt(*ntrk), pt(*ptrk);
2992 nt.PropagateTo(xn,b); pt.PropagateTo(xp,b);
2995 //--- Like in ITSV0Finder
2996 AliExternalTrackParam ntAt0(*ntrk), ptAt0(*ptrk);
2997 Double_t xxP,yyP,alphaP;
3000 // if (!ptAt0.GetGlobalXYZat(ptAt0->GetX(),xxP,yyP,zzP)) continue;
3001 if (!ptAt0.GetXYZAt(ptAt0.GetX(),b,rP)) continue;
3004 alphaP = TMath::ATan2(yyP,xxP);
3007 ptAt0.Propagate(alphaP,0,b);
3008 Float_t ptfacP = (1.+100.*TMath::Abs(ptAt0.GetC(b)));
3010 // Double_t distP = ptAt0.GetY();
3011 Double_t normP = ptfacP*TMath::Sqrt(ptAt0.GetSigmaY2());
3012 Double_t normdist0P = TMath::Abs(ptAt0.GetY()/normP);
3013 Double_t normdist1P = TMath::Abs((ptAt0.GetZ()-zPrimaryVertex)/(ptfacP*TMath::Sqrt(ptAt0.GetSigmaZ2())));
3014 Double_t normdistP = TMath::Sqrt(normdist0P*normdist0P+normdist1P*normdist1P);
3017 Double_t xxN,yyN,alphaN;
3019 // if (!ntAt0.GetGlobalXYZat(ntAt0->GetX(),xxN,yyN,zzN)) continue;
3020 if (!ntAt0.GetXYZAt(ntAt0.GetX(),b,rN)) continue;
3024 alphaN = TMath::ATan2(yyN,xxN);
3026 ntAt0.Propagate(alphaN,0,b);
3028 Float_t ptfacN = (1.+100.*TMath::Abs(ntAt0.GetC(b)));
3029 // Double_t distN = ntAt0.GetY();
3030 Double_t normN = ptfacN*TMath::Sqrt(ntAt0.GetSigmaY2());
3031 Double_t normdist0N = TMath::Abs(ntAt0.GetY()/normN);
3032 Double_t normdist1N = TMath::Abs((ntAt0.GetZ()-zPrimaryVertex)/(ptfacN*TMath::Sqrt(ntAt0.GetSigmaZ2())));
3033 Double_t normdistN = TMath::Sqrt(normdist0N*normdist0N+normdist1N*normdist1N);
3035 //-----------------------------
3037 Double_t momNegAt[3];
3038 nt.GetPxPyPz(momNegAt);
3039 curElecNegAt.SetXYZM(momNegAt[0],momNegAt[1],momNegAt[2],massE);
3041 Double_t momPosAt[3];
3042 pt.GetPxPyPz(momPosAt);
3043 curElecPosAt.SetXYZM(momPosAt[0],momPosAt[1],momPosAt[2],massE);
3048 // Double_t dneg= negTrack->GetD(xPrimaryVertex,yPrimaryVertex,b);
3049 // Double_t dpos= posTrack->GetD(xPrimaryVertex,yPrimaryVertex,b);
3050 AliESDv0 vertex(nt,jTracks,pt,iTracks);
3053 Float_t cpa=vertex.GetV0CosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex);
3057 // cout<< "v0Rr::"<< v0Rr<<endl;
3058 // if (pvertex.GetRr()<0.5){
3061 // cout<<"vertex.GetChi2V0()"<<vertex.GetChi2V0()<<endl;
3062 if(cpa<0.9)continue;
3063 // if (vertex.GetChi2V0() > 30) continue;
3064 // cout<<"xp+xn::"<<xp<<" "<<xn<<endl;
3065 if ((xn+xp) < 0.4) continue;
3066 if (TMath::Abs(ntrk->GetD(xPrimaryVertex,yPrimaryVertex,b))<0.05)
3067 if (TMath::Abs(ptrk->GetD(xPrimaryVertex,yPrimaryVertex,b))<0.05) continue;
3069 //cout<<"pass"<<endl;
3071 AliKFParticle v0GammaC;
3074 v0GammaC.SetMassConstraint(0,0.001);
3075 primVtxImprovedGamma+=v0GammaC;
3076 v0GammaC.SetProductionVertex(primVtxImprovedGamma);
3079 curGamma=curElecNeg+curElecPos;
3080 curGammaAt=curElecNegAt+curElecPosAt;
3082 // invariant mass versus pt of K0short
3084 Double_t chi2V0GammaC=100000.;
3085 if( v0GammaC.GetNDF() != 0) {
3086 chi2V0GammaC = v0GammaC.GetChi2()/v0GammaC.GetNDF();
3088 cout<< "ERROR::v0K0C.GetNDF()" << endl;
3091 if(chi2V0GammaC<200 &&chi2V0GammaC>0 ){
3092 if(fHistograms != NULL){
3093 fHistograms->FillHistogram("ESD_RecalculateV0_InvMass",v0GammaC.GetMass());
3094 fHistograms->FillHistogram("ESD_RecalculateV0_Pt",v0GammaC.GetPt());
3095 fHistograms->FillHistogram("ESD_RecalculateV0_E_dEdxP",curElecNegAt.P(),negTrack->GetTPCsignal());
3096 fHistograms->FillHistogram("ESD_RecalculateV0_P_dEdxP",curElecPosAt.P(),posTrack->GetTPCsignal());
3097 fHistograms->FillHistogram("ESD_RecalculateV0_cpa",cpa);
3098 fHistograms->FillHistogram("ESD_RecalculateV0_dca",dca);
3099 fHistograms->FillHistogram("ESD_RecalculateV0_normdistP",normdistP);
3100 fHistograms->FillHistogram("ESD_RecalculateV0_normdistN",normdistN);
3102 new((*fKFRecalculatedGammasTClone)[fKFRecalculatedGammasTClone->GetEntriesFast()]) AliKFParticle(v0GammaC);
3103 fElectronRecalculatedv1.push_back(iTracks);
3104 fElectronRecalculatedv2.push_back(jTracks);
3110 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFRecalculatedGammasTClone->GetEntriesFast();firstGammaIndex++){
3111 for(Int_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFRecalculatedGammasTClone->GetEntriesFast();secondGammaIndex++){
3112 AliKFParticle * twoGammaDecayCandidateDaughter0 = (AliKFParticle *)fKFRecalculatedGammasTClone->At(firstGammaIndex);
3113 AliKFParticle * twoGammaDecayCandidateDaughter1 = (AliKFParticle *)fKFRecalculatedGammasTClone->At(secondGammaIndex);
3115 if(fElectronRecalculatedv1[firstGammaIndex]==fElectronRecalculatedv1[secondGammaIndex]){
3118 if( fElectronRecalculatedv2[firstGammaIndex]==fElectronRecalculatedv2[secondGammaIndex]){
3122 AliKFParticle twoGammaCandidate(*twoGammaDecayCandidateDaughter0,*twoGammaDecayCandidateDaughter1);
3123 fHistograms->FillHistogram("ESD_RecalculateGG_InvMass",twoGammaCandidate.GetMass());
3124 fHistograms->FillHistogram("ESD_RecalculateGG_InvMass_vs_Pt",twoGammaCandidate.GetMass(),twoGammaCandidate.GetPt());
3128 void AliAnalysisTaskGammaConversion::CalculateJetCone(Int_t gammaIndex){
3132 Double_t coneSize=0.3;
3135 // AliKFParticle * currentGamma = &fKFReconstructedGammas[gammaIndex];
3136 AliKFParticle * currentGamma = (AliKFParticle*)fKFReconstructedGammasTClone->At(gammaIndex);
3138 TVector3 momentumVectorCurrentGamma(currentGamma->GetPx(),currentGamma->GetPy(),currentGamma->GetPz());
3140 AliESDtrack* leadingCharged = (AliESDtrack*)(fChargedParticles->At(fLeadingChargedIndex));
3142 Double_t momLeadingCharged[3];
3143 leadingCharged->GetConstrainedPxPyPz(momLeadingCharged);
3145 TVector3 momentumVectorLeadingCharged(momLeadingCharged[0],momLeadingCharged[1],momLeadingCharged[2]);
3147 Double_t phi1=momentumVectorLeadingCharged.Phi();
3148 Double_t eta1=momentumVectorLeadingCharged.Eta();
3149 Double_t phi3=momentumVectorCurrentGamma.Phi();
3151 for(Int_t iCh=0;iCh<fChargedParticles->GetEntriesFast();iCh++){
3152 AliESDtrack* curTrack = (AliESDtrack*)(fChargedParticles->At(iCh));
3153 Int_t chId = fChargedParticlesId[iCh];
3154 if(fLeadingChargedIndex==chId || fLeadingChargedIndex==chId) continue;
3156 curTrack->GetConstrainedPxPyPz(mom);
3157 TVector3 momentumVectorChargedParticle(mom[0],mom[1],mom[2]);
3158 Double_t phi2=momentumVectorChargedParticle.Phi();
3159 Double_t eta2=momentumVectorChargedParticle.Eta();
3163 if( TMath::Abs(phi2 - phi1) <= ( TMath::TwoPi()-coneSize) ){
3164 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2-phi1),2) );
3166 if( (phi2 - phi1)> TMath::TwoPi()-coneSize ){
3167 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2-TMath::TwoPi()-phi1),2) );
3169 if( (phi2 - phi1)< -(TMath::TwoPi()-coneSize) ){
3170 cone = TMath::Sqrt( TMath::Power((eta2-eta1),2)+ TMath::Power((phi2+TMath::TwoPi()-phi1),2) );
3174 if(cone <coneSize&& momentumVectorChargedParticle.Pt()>fMinPtJetCone ){
3175 ptJet+= momentumVectorChargedParticle.Pt();
3176 Double_t ffzHdrGam = momentumVectorChargedParticle.Pt()/momentumVectorCurrentGamma.Pt();
3177 Double_t imbalanceHdrGam=-momentumVectorChargedParticle.Dot(momentumVectorCurrentGamma)/momentumVectorCurrentGamma.Mag2();
3178 fHistograms->FillHistogram("ESD_FFzHdrGam",ffzHdrGam);
3179 fHistograms->FillHistogram("ESD_ImbalanceHdrGam",imbalanceHdrGam);
3183 Double_t dphiHdrGam=phi3-phi2;
3184 if ( dphiHdrGam < (-TMath::PiOver2())){
3185 dphiHdrGam+=(TMath::TwoPi());
3188 if ( dphiHdrGam > (3.*TMath::PiOver2()) ){
3189 dphiHdrGam-=(TMath::TwoPi());
3192 if (momentumVectorChargedParticle.Pt()>fMinPtGamChargedCorr){
3193 fHistograms->FillHistogram("ESD_dphiHdrGamIsolated",dphiHdrGam);
3200 Double_t AliAnalysisTaskGammaConversion::GetMinimumDistanceToCharge(Int_t indexHighestPtGamma){
3201 // GetMinimumDistanceToCharge
3203 Double_t fIsoMin=100.;
3204 Double_t ptLeadingCharged=-1.;
3206 fLeadingChargedIndex=-1;
3208 AliKFParticle * gammaHighestPt = (AliKFParticle*)fKFReconstructedGammasTClone->At(indexHighestPtGamma);
3209 TVector3 momentumVectorgammaHighestPt(gammaHighestPt->GetPx(),gammaHighestPt->GetPy(),gammaHighestPt->GetPz());
3211 Double_t phi1=momentumVectorgammaHighestPt.Phi();
3212 Double_t eta1=momentumVectorgammaHighestPt.Eta();
3214 for(Int_t iCh=0;iCh<fChargedParticles->GetEntriesFast();iCh++){
3215 AliESDtrack* curTrack = (AliESDtrack*)(fChargedParticles->At(iCh));
3216 Int_t chId = fChargedParticlesId[iCh];
3217 if(fElectronv1[indexHighestPtGamma]==chId || fElectronv2[indexHighestPtGamma]==chId) continue;
3219 curTrack->GetConstrainedPxPyPz(mom);
3220 TVector3 momentumVectorChargedParticle(mom[0],mom[1],mom[2]);
3221 Double_t phi2=momentumVectorChargedParticle.Phi();
3222 Double_t eta2=momentumVectorChargedParticle.Eta();
3223 Double_t iso=pow( (pow( (eta1-eta2),2)+ pow((phi1-phi2),2)),0.5 );
3225 if(momentumVectorChargedParticle.Pt()>fMinPtIsoCone ){
3231 Double_t dphiHdrGam=phi1-phi2;
3232 if ( dphiHdrGam < (-TMath::PiOver2())){
3233 dphiHdrGam+=(TMath::TwoPi());
3236 if ( dphiHdrGam > (3.*TMath::PiOver2()) ){
3237 dphiHdrGam-=(TMath::TwoPi());
3239 if (momentumVectorChargedParticle.Pt()>fMinPtGamChargedCorr){
3240 fHistograms->FillHistogram("ESD_dphiHdrGam",dphiHdrGam);
3243 if (dphiHdrGam>0.9*TMath::Pi() && dphiHdrGam<1.1*TMath::Pi()){
3244 if (momentumVectorChargedParticle.Pt()> ptLeadingCharged && momentumVectorChargedParticle.Pt()>0.1*momentumVectorgammaHighestPt.Pt()){
3245 ptLeadingCharged=momentumVectorChargedParticle.Pt();
3246 fLeadingChargedIndex=iCh;
3251 fHistograms->FillHistogram("ESD_MinimumIsoDistance",fIsoMin);
3256 Int_t AliAnalysisTaskGammaConversion::GetIndexHighestPtGamma(){
3257 //GetIndexHighestPtGamma
3259 Int_t indexHighestPtGamma=-1;
3261 fGammaPtHighest = -100.;
3263 for(Int_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammasTClone->GetEntriesFast();firstGammaIndex++){
3264 AliKFParticle * gammaHighestPtCandidate = (AliKFParticle*)fKFReconstructedGammasTClone->At(firstGammaIndex);
3265 TVector3 momentumVectorgammaHighestPtCandidate(gammaHighestPtCandidate->GetPx(),gammaHighestPtCandidate->GetPy(),gammaHighestPtCandidate->GetPz());
3266 if (momentumVectorgammaHighestPtCandidate.Pt() > fGammaPtHighest){
3267 fGammaPtHighest=momentumVectorgammaHighestPtCandidate.Pt();
3268 //gammaHighestPt = gammaHighestPtCandidate;
3269 indexHighestPtGamma=firstGammaIndex;
3273 return indexHighestPtGamma;
3278 void AliAnalysisTaskGammaConversion::Terminate(Option_t */*option*/)
3280 // Terminate analysis
3282 AliDebug(1,"Do nothing in Terminate");
3285 void AliAnalysisTaskGammaConversion::UserCreateOutputObjects()
3288 if(!fAODGamma) fAODGamma = new TClonesArray("AliGammaConversionAODObject", 0);
3289 else fAODGamma->Delete();
3290 fAODGamma->SetName(Form("%s_gamma", fAODBranchName.Data()));
3292 if(!fAODPi0) fAODPi0 = new TClonesArray("AliGammaConversionAODObject", 0);
3293 else fAODPi0->Delete();
3294 fAODPi0->SetName(Form("%s_Pi0", fAODBranchName.Data()));
3296 if(!fAODOmega) fAODOmega = new TClonesArray("AliGammaConversionAODObject", 0);
3297 else fAODOmega->Delete();
3298 fAODOmega->SetName(Form("%s_Omega", fAODBranchName.Data()));
3300 //If delta AOD file name set, add in separate file. Else add in standard aod file.
3301 if(fKFDeltaAODFileName.Length() > 0) {
3302 AddAODBranch("TClonesArray", &fAODGamma, fKFDeltaAODFileName.Data());
3303 AddAODBranch("TClonesArray", &fAODPi0, fKFDeltaAODFileName.Data());
3304 AddAODBranch("TClonesArray", &fAODOmega, fKFDeltaAODFileName.Data());
3305 AliAnalysisManager::GetAnalysisManager()->RegisterExtraFile(fKFDeltaAODFileName.Data());
3307 AddAODBranch("TClonesArray", &fAODGamma);
3308 AddAODBranch("TClonesArray", &fAODPi0);
3309 AddAODBranch("TClonesArray", &fAODOmega);
3312 // Create the output container
3313 if(fOutputContainer != NULL){
3314 delete fOutputContainer;
3315 fOutputContainer = NULL;
3317 if(fOutputContainer == NULL){
3318 fOutputContainer = new TList();
3319 fOutputContainer->SetOwner(kTRUE);
3322 //Adding the histograms to the output container
3323 fHistograms->GetOutputContainer(fOutputContainer);
3327 if(fGammaNtuple == NULL){
3328 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);
3330 if(fNeutralMesonNtuple == NULL){
3331 fNeutralMesonNtuple = new TNtuple("NeutralMesonNtuple","NeutralMesonNtuple","test");
3333 TList * ntupleTList = new TList();
3334 ntupleTList->SetOwner(kTRUE);
3335 ntupleTList->SetName("Ntuple");
3336 ntupleTList->Add((TNtuple*)fGammaNtuple);
3337 fOutputContainer->Add(ntupleTList);
3340 fOutputContainer->SetName(GetName());
3343 Double_t AliAnalysisTaskGammaConversion::GetMCOpeningAngle(TParticle* const daughter0, TParticle* const daughter1) const{
3345 TVector3 v3D0(daughter0->Px(),daughter0->Py(),daughter0->Pz());
3346 TVector3 v3D1(daughter1->Px(),daughter1->Py(),daughter1->Pz());
3347 return v3D0.Angle(v3D1);
3350 void AliAnalysisTaskGammaConversion::CheckV0Efficiency(){
3351 // see header file for documentation
3353 vector<Int_t> indexOfGammaParticle;
3355 fStack = fV0Reader->GetMCStack();
3357 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
3358 return; // aborts if the primary vertex does not have contributors.
3361 for (Int_t iTracks = 0; iTracks < fStack->GetNprimary(); iTracks++) {
3362 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
3363 if(particle->GetPdgCode()==22){ //Gamma
3364 if(particle->GetNDaughters() >= 2){
3365 TParticle* electron=NULL;
3366 TParticle* positron=NULL;
3367 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
3368 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
3369 if(tmpDaughter->GetUniqueID() == 5){
3370 if(tmpDaughter->GetPdgCode() == 11){
3371 electron = tmpDaughter;
3373 else if(tmpDaughter->GetPdgCode() == -11){
3374 positron = tmpDaughter;
3378 if(electron!=NULL && positron!=0){
3379 if(electron->R()<160){
3380 indexOfGammaParticle.push_back(iTracks);
3387 Int_t nFoundGammas=0;
3388 Int_t nNotFoundGammas=0;
3390 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
3391 for(Int_t i=0;i<numberOfV0s;i++){
3392 fV0Reader->GetV0(i);
3394 if(fV0Reader->HasSameMCMother() == kFALSE){
3398 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
3399 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
3401 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
3404 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
3408 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
3409 //TParticle * v0Gamma = fV0Reader->GetMotherMCParticle();
3410 for(UInt_t mcIndex=0;mcIndex<indexOfGammaParticle.size();mcIndex++){
3411 if(negativeMC->GetFirstMother()==indexOfGammaParticle[mcIndex]){
3423 void AliAnalysisTaskGammaConversion::ProcessGammaElectronsForChicAnalysis(){
3424 // see header file for documantation
3426 fESDEvent = fV0Reader->GetESDEvent();
3429 TClonesArray * vESDeNegTemp = new TClonesArray("AliESDtrack",0);
3430 TClonesArray * vESDePosTemp = new TClonesArray("AliESDtrack",0);
3431 TClonesArray * vESDxNegTemp = new TClonesArray("AliESDtrack",0);
3432 TClonesArray * vESDxPosTemp = new TClonesArray("AliESDtrack",0);
3433 TClonesArray * vESDeNegNoJPsi = new TClonesArray("AliESDtrack",0);
3434 TClonesArray * vESDePosNoJPsi = new TClonesArray("AliESDtrack",0);
3437 vector <AliESDtrack*> vESDeNegTemp(0);
3438 vector <AliESDtrack*> vESDePosTemp(0);
3439 vector <AliESDtrack*> vESDxNegTemp(0);
3440 vector <AliESDtrack*> vESDxPosTemp(0);
3441 vector <AliESDtrack*> vESDeNegNoJPsi(0);
3442 vector <AliESDtrack*> vESDePosNoJPsi(0);
3446 fHistograms->FillTable("Table_Electrons",0);//Count number of Events
3448 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
3449 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
3452 //print warning here
3456 double p[3];if(!curTrack->GetConstrainedPxPyPz(p))continue;
3457 double r[3];curTrack->GetConstrainedXYZ(r);
3461 fHistograms->FillTable("Table_Electrons",4);//Count number of ESD tracks
3463 Bool_t flagKink = kTRUE;
3464 Bool_t flagTPCrefit = kTRUE;
3465 Bool_t flagTRDrefit = kTRUE;
3466 Bool_t flagITSrefit = kTRUE;
3467 Bool_t flagTRDout = kTRUE;
3468 Bool_t flagVertex = kTRUE;
3471 //Cuts ---------------------------------------------------------------
3473 if(curTrack->GetKinkIndex(0) > 0){
3474 fHistograms->FillHistogram("Table_Electrons",5);//Count kink
3478 ULong_t trkStatus = curTrack->GetStatus();
3480 ULong_t tpcRefit = (trkStatus & AliESDtrack::kTPCrefit);
3483 fHistograms->FillHistogram("Table_Electrons",9);//Count not TPCrefit
3484 flagTPCrefit = kFALSE;
3487 ULong_t itsRefit = (trkStatus & AliESDtrack::kITSrefit);
3489 fHistograms->FillHistogram("Table_Electrons",10);//Count not ITSrefit
3490 flagITSrefit = kFALSE;
3493 ULong_t trdRefit = (trkStatus & AliESDtrack::kTRDrefit);
3496 fHistograms->FillHistogram("Table_Electrons",8); //Count not TRDrefit
3497 flagTRDrefit = kFALSE;
3500 ULong_t trdOut = (trkStatus & AliESDtrack::kTRDout);
3503 fHistograms->FillHistogram("Table_Electrons",7); //Count not TRDout
3504 flagTRDout = kFALSE;
3507 double nsigmaToVxt = GetSigmaToVertex(curTrack);
3509 if(nsigmaToVxt > 3){
3510 fHistograms->FillHistogram("Table_Electrons",6); //Count Tracks with number of sigmas > 3
3511 flagVertex = kFALSE;
3514 if(! (flagKink && flagTPCrefit && flagITSrefit && flagTRDrefit && flagTRDout && flagVertex ) ) continue;
3515 fHistograms->FillHistogram("Table_Electrons",11);//Count Tracks passed Cuts
3519 GetPID(curTrack, pid, weight);
3522 fHistograms->FillHistogram("Table_Electrons",12); //Count Tracks with pid != 0
3526 fHistograms->FillHistogram("Table_Electrons",13); //Count Tracks with pid != 0
3534 TLorentzVector curElec;
3535 curElec.SetXYZM(p[0],p[1],p[2],fElectronMass);
3539 Int_t labelMC = TMath::Abs(curTrack->GetLabel());
3540 TParticle* curParticle = fStack->Particle(labelMC);
3541 if(curTrack->GetSign() > 0){
3543 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
3544 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
3547 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
3548 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
3554 if(curTrack->GetSign() > 0){
3556 // vESDxPosTemp.push_back(curTrack);
3557 new((*vESDxPosTemp)[vESDxPosTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
3561 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
3562 fHistograms->FillHistogram("ESD_ElectronPosPt",curElec.Pt());
3563 // fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
3564 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
3565 // fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
3566 // vESDePosTemp.push_back(curTrack);
3567 new((*vESDePosTemp)[vESDePosTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
3574 new((*vESDxNegTemp)[vESDxNegTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
3578 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
3579 fHistograms->FillHistogram("ESD_ElectronNegPt",curElec.Pt());
3580 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
3581 new((*vESDeNegTemp)[vESDeNegTemp->GetEntriesFast()]) AliESDtrack(*curTrack);
3590 Bool_t ePosJPsi = kFALSE;
3591 Bool_t eNegJPsi = kFALSE;
3592 Bool_t ePosPi0 = kFALSE;
3593 Bool_t eNegPi0 = kFALSE;
3595 UInt_t iePosJPsi=0,ieNegJPsi=0,iePosPi0=0,ieNegPi0=0;
3597 for(Int_t iNeg=0; iNeg < vESDeNegTemp->GetEntriesFast(); iNeg++){
3598 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetPdgCode() == 11)
3599 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetMother(0) > -1){
3600 Int_t labelMother = fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(iNeg)))->GetLabel()))->GetMother(0);
3601 TParticle* partMother = fStack ->Particle(labelMother);
3602 if (partMother->GetPdgCode() == 111){
3606 if(partMother->GetPdgCode() == 443){ //Mother JPsi
3607 fHistograms->FillTable("Table_Electrons",14);
3612 // vESDeNegNoJPsi.push_back(vESDeNegTemp[iNeg]);
3613 new((*vESDeNegNoJPsi)[vESDeNegNoJPsi->GetEntriesFast()]) AliESDtrack(*(AliESDtrack*)(vESDeNegTemp->At(iNeg)));
3614 // cout<<"ESD No Positivo JPsi "<<endl;
3620 for(Int_t iPos=0; iPos < vESDePosTemp->GetEntriesFast(); iPos++){
3621 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetPdgCode() == -11)
3622 if(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetMother(0) > -1){
3623 Int_t labelMother = fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iPos)))->GetLabel()))->GetMother(0);
3624 TParticle* partMother = fStack ->Particle(labelMother);
3625 if (partMother->GetPdgCode() == 111){
3629 if(partMother->GetPdgCode() == 443){ //Mother JPsi
3630 fHistograms->FillTable("Table_Electrons",15);
3635 // vESDePosNoJPsi.push_back(vESDePosTemp[iPos]);
3636 new((*vESDePosNoJPsi)[vESDePosNoJPsi->GetEntriesFast()]) AliESDtrack(*(AliESDtrack*)(vESDePosTemp->At(iPos)));
3637 // cout<<"ESD No Negativo JPsi "<<endl;
3643 if( eNegJPsi && ePosJPsi ){
3644 TVector3 tempeNegV,tempePosV;
3645 tempeNegV.SetXYZ(((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Px(),((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Py(),((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->Pz());
3646 tempePosV.SetXYZ(((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Px(),((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Py(),((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->Pz());
3647 fHistograms->FillTable("Table_Electrons",16);
3648 fHistograms->FillHistogram("ESD_ElectronPosNegJPsiAngle",tempeNegV.Angle(tempePosV));
3649 fHistograms->FillHistogram("MC_ElectronPosNegJPsiAngle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(ieNegJPsi)))->GetLabel())),
3650 fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iePosJPsi)))->GetLabel()))));
3653 if( eNegPi0 && ePosPi0 ){
3654 TVector3 tempeNegV,tempePosV;
3655 tempeNegV.SetXYZ(((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Px(),((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Py(),((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->Pz());
3656 tempePosV.SetXYZ(((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Px(),((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Py(),((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->Pz());
3657 fHistograms->FillHistogram("ESD_ElectronPosNegPi0Angle",tempeNegV.Angle(tempePosV));
3658 fHistograms->FillHistogram("MC_ElectronPosNegPi0Angle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDeNegTemp->At(ieNegPi0)))->GetLabel())),
3659 fStack->Particle(TMath::Abs(((AliESDtrack*)(vESDePosTemp->At(iePosPi0)))->GetLabel()))));
3663 FillAngle("ESD_eNegePosAngleBeforeCut",GetTLorentzVector(vESDeNegTemp),GetTLorentzVector(vESDePosTemp));
3665 CleanWithAngleCuts(*vESDeNegTemp,*vESDePosTemp,*fKFReconstructedGammasTClone);
3667 // vector <TLorentzVector> vCurrentTLVeNeg = GetTLorentzVector(fCurrentEventNegElectron);
3668 // vector <TLorentzVector> vCurrentTLVePos = GetTLorentzVector(fCurrentEventPosElectron);
3670 TClonesArray vCurrentTLVeNeg = GetTLorentzVector(fCurrentEventNegElectronTClone);
3671 TClonesArray vCurrentTLVePos = GetTLorentzVector(fCurrentEventPosElectronTClone);
3674 FillAngle("ESD_eNegePosAngleAfterCut",vCurrentTLVeNeg,vCurrentTLVePos);
3679 //FillAngle("ESD_eNegePosAngleAfterCut",CurrentTLVeNeg,CurrentTLVePos);
3682 FillElectronInvMass("ESD_InvMass_ePluseMinus",vCurrentTLVeNeg,vCurrentTLVePos);
3683 FillElectronInvMass("ESD_InvMass_xPlusxMinus",GetTLorentzVector(vESDxNegTemp),GetTLorentzVector(vESDxPosTemp));
3687 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusChiC","ESD_InvMass_GammaePluseMinusChiCDiff",*fKFReconstructedGammasCutTClone,vCurrentTLVeNeg,vCurrentTLVePos);
3689 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusPi0","ESD_InvMass_GammaePluseMinusPi0Diff",
3690 *fKFReconstructedGammasCutTClone,vCurrentTLVeNeg,vCurrentTLVePos);
3695 ElectronBackground("ESD_ENegBackground",vCurrentTLVeNeg);
3696 ElectronBackground("ESD_EPosBackground",vCurrentTLVePos);
3697 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVeNeg);
3698 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVePos);
3700 // Like Sign e+e- no JPsi
3701 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDeNegNoJPsi));
3702 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDePosNoJPsi));
3706 if( fCurrentEventPosElectronTClone->GetEntriesFast() > 0 && fCurrentEventNegElectronTClone->GetEntriesFast() > 0 && fKFReconstructedGammasCutTClone->GetEntriesFast() > 0 ){
3707 FillGammaElectronInvMass("ESD_EPosENegGammaBackgroundMX","ESD_EPosENegGammaBackgroundMXDiff",
3708 *fKFReconstructedGammasCutTClone,*fPreviousEventTLVNegElectronTClone,*fPreviousEventTLVPosElectronTClone);
3709 *fPreviousEventTLVNegElectronTClone = vCurrentTLVeNeg;
3710 *fPreviousEventTLVPosElectronTClone = vCurrentTLVePos;
3717 vtx[0]=0;vtx[1]=0;vtx[2]=0;
3718 for(UInt_t i=0;i<fKFReconstructedGammasChic.size();i++){
3720 // if(fMCGammaChicTempCut[i]->GetMother(0) < 0) continue;
3724 Int_t tempLabel = fStack->Particle(fMCGammaChicTempCut[i]->GetMother(0))->GetPdgCode();
3725 // cout<<" Label Pedro Gonzalez " <<tempLabel <<endl;
3727 // cout<<" Label Distance"<<fKFReconstructedGammasChic[i].GetDistanceFromVertex(vtx)<<endl;
3729 if( tempLabel == 10441 || tempLabel == 20443 || tempLabel == 445 )
3731 fHistograms->FillHistogram("ESD_PhotonsMomentum",fKFReconstructedGammasChic[i].GetMomentum());
3740 vESDeNegTemp->Delete();
3741 vESDePosTemp->Delete();
3742 vESDxNegTemp->Delete();
3743 vESDxPosTemp->Delete();
3744 vESDeNegNoJPsi->Delete();
3745 vESDePosNoJPsi->Delete();
3747 delete vESDeNegTemp;
3748 delete vESDePosTemp;
3749 delete vESDxNegTemp;
3750 delete vESDxPosTemp;
3751 delete vESDeNegNoJPsi;
3752 delete vESDePosNoJPsi;
3756 void AliAnalysisTaskGammaConversion::FillAngle(TString histoName,vector <TLorentzVector> tlVeNeg, vector <TLorentzVector> tlVePos){
3757 //see header file for documentation
3758 for( UInt_t iNeg=0; iNeg < tlVeNeg.size(); iNeg++){
3759 for (UInt_t iPos=0; iPos < tlVePos.size(); iPos++){
3760 fHistograms->FillHistogram(histoName.Data(),tlVeNeg[iNeg].Vect().Angle(tlVePos[iPos].Vect()));
3765 void AliAnalysisTaskGammaConversion::FillAngle(TString histoName,TClonesArray const tlVeNeg, TClonesArray const tlVePos){
3766 //see header file for documentation
3767 for( Int_t iNeg=0; iNeg < tlVeNeg.GetEntriesFast(); iNeg++){
3768 for (Int_t iPos=0; iPos < tlVePos.GetEntriesFast(); iPos++){
3769 fHistograms->FillHistogram(histoName.Data(),((TLorentzVector*)(tlVeNeg.At(iNeg)))->Vect().Angle(((TLorentzVector*)(tlVePos.At(iPos)))->Vect()));
3773 void AliAnalysisTaskGammaConversion::FillElectronInvMass(TString histoName, TClonesArray const eNeg, TClonesArray const ePos){
3774 //see header file for documentation
3775 for( Int_t n=0; n < eNeg.GetEntriesFast(); n++){
3776 TLorentzVector en = (*(TLorentzVector*)(eNeg.At(n)));
3777 for (Int_t p=0; p < ePos.GetEntriesFast(); p++){
3778 TLorentzVector ep = (*(TLorentzVector*)(ePos.At(p)));
3779 TLorentzVector np = ep + en;
3780 fHistograms->FillHistogram(histoName.Data(),np.M());
3785 void AliAnalysisTaskGammaConversion::FillGammaElectronInvMass(TString histoMass,TString histoDiff,TClonesArray const fKFGammas,
3786 TClonesArray const tlVeNeg,TClonesArray const tlVePos)
3788 //see header file for documentation
3790 for( Int_t iNeg=0; iNeg < tlVeNeg.GetEntriesFast(); iNeg++ ){
3792 for (Int_t iPos=0; iPos < tlVePos.GetEntriesFast(); iPos++){
3794 TLorentzVector xy = *((TLorentzVector *)(tlVePos.At(iPos))) + *((TLorentzVector *)(tlVeNeg.At(iNeg)));
3796 for (Int_t iGam=0; iGam < fKFGammas.GetEntriesFast(); iGam++){
3798 // AliKFParticle * gammaCandidate = &fKFGammas[iGam];
3799 AliKFParticle * gammaCandidate = (AliKFParticle *)(fKFGammas.At(iGam));
3802 g.SetXYZM(gammaCandidate->GetPx(),gammaCandidate->GetPy(),gammaCandidate->GetPz(),fGammaMass);
3803 TLorentzVector xyg = xy + g;
3804 fHistograms->FillHistogram(histoMass.Data(),xyg.M());
3805 fHistograms->FillHistogram(histoDiff.Data(),(xyg.M()-xy.M()));
3811 void AliAnalysisTaskGammaConversion::ElectronBackground(TString hBg, TClonesArray e)
3813 // see header file for documentation
3814 for(Int_t i=0; i < e.GetEntriesFast(); i++)
3816 for (Int_t j=i+1; j < e.GetEntriesFast(); j++)
3818 TLorentzVector ee = (*(TLorentzVector*)(e.At(i))) + (*(TLorentzVector*)(e.At(j)));
3820 fHistograms->FillHistogram(hBg.Data(),ee.M());
3826 void AliAnalysisTaskGammaConversion::CleanWithAngleCuts(TClonesArray const negativeElectrons,
3827 TClonesArray const positiveElectrons,
3828 TClonesArray const gammas){
3829 // see header file for documentation
3831 UInt_t sizeN = negativeElectrons.GetEntriesFast();
3832 UInt_t sizeP = positiveElectrons.GetEntriesFast();
3833 UInt_t sizeG = gammas.GetEntriesFast();
3837 vector <Bool_t> xNegBand(sizeN);
3838 vector <Bool_t> xPosBand(sizeP);
3839 vector <Bool_t> gammaBand(sizeG);
3842 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++) xNegBand[iNeg]=kTRUE;
3843 for(UInt_t iPos=0; iPos < sizeP; iPos++) xPosBand[iPos]=kTRUE;
3844 for(UInt_t iGam=0; iGam < sizeG; iGam++) gammaBand[iGam]=kTRUE;
3847 for(UInt_t iPos=0; iPos < sizeP; iPos++){
3850 ((AliESDtrack*)(positiveElectrons.At(iPos)))->GetConstrainedPxPyPz(aP);
3852 TVector3 ePosV(aP[0],aP[1],aP[2]);
3854 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++){
3857 ((AliESDtrack*)(negativeElectrons.At(iNeg)))->GetConstrainedPxPyPz(aN);
3858 TVector3 eNegV(aN[0],aN[1],aN[2]);
3860 if(ePosV.Angle(eNegV) < 0.05){ //e+e- from gamma
3861 xPosBand[iPos]=kFALSE;
3862 xNegBand[iNeg]=kFALSE;
3865 for(UInt_t iGam=0; iGam < sizeG; iGam++){
3866 AliKFParticle* gammaCandidate = (AliKFParticle*)gammas.At(iGam);
3867 TVector3 gammaCandidateVector(gammaCandidate->Px(),gammaCandidate->Py(),gammaCandidate->Pz());
3868 if(ePosV.Angle(gammaCandidateVector) < 0.05 || eNegV.Angle(gammaCandidateVector) < 0.05)
3869 gammaBand[iGam]=kFALSE;
3877 for(UInt_t iPos=0; iPos < sizeP; iPos++){
3879 new((*fCurrentEventPosElectronTClone)[fCurrentEventPosElectronTClone->GetEntriesFast()]) AliESDtrack((*(AliESDtrack*)(positiveElectrons.At(iPos))));
3880 // fCurrentEventPosElectron.push_back(positiveElectrons[iPos]);
3883 for(UInt_t iNeg=0;iNeg < sizeN; iNeg++){
3885 new((*fCurrentEventNegElectronTClone)[fCurrentEventNegElectronTClone->GetEntriesFast()]) AliESDtrack((*(AliESDtrack*)(negativeElectrons.At(iNeg))));
3886 // fCurrentEventNegElectron.push_back(negativeElectrons[iNeg]);
3889 for(UInt_t iGam=0; iGam < sizeG; iGam++){
3890 if(gammaBand[iGam]){
3891 new((*fKFReconstructedGammasCutTClone)[fKFReconstructedGammasCutTClone->GetEntriesFast()]) AliKFParticle((*(AliKFParticle*)(gammas.At(iGam))));
3892 //fKFReconstructedGammasCut.push_back(*(AliKFParticle*)gammas->At(iGam));
3898 void AliAnalysisTaskGammaConversion::GetPID(AliESDtrack *track, Stat_t &pid, Stat_t &weight)
3900 // see header file for documentation
3905 double wpartbayes[5];
3907 //get probability of the diffenrent particle types
3908 track->GetESDpid(wpart);
3910 // Tentative particle type "concentrations"
3911 double c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
3915 for (int i = 0; i < 5; i++)
3917 rcc+=(c[i] * wpart[i]);
3922 for (int i=0; i<5; i++) {
3923 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)
3924 wpartbayes[i] = c[i] * wpart[i] / rcc;
3932 //find most probable particle in ESD pid
3933 //0:Electron - 1:Muon - 2:Pion - 3:Kaon - 4:Proton
3934 for (int i = 0; i < 5; i++)
3936 if (wpartbayes[i] > max)
3939 max = wpartbayes[i];
3946 double AliAnalysisTaskGammaConversion::GetSigmaToVertex(AliESDtrack* t)
3948 // Calculates the number of sigma to the vertex.
3953 t->GetImpactParameters(b,bCov);
3954 if (bCov[0]<=0 || bCov[2]<=0) {
3955 AliDebug(1, "Estimated b resolution lower or equal zero!");
3956 bCov[0]=0; bCov[2]=0;
3958 bRes[0] = TMath::Sqrt(bCov[0]);
3959 bRes[1] = TMath::Sqrt(bCov[2]);
3961 // -----------------------------------
3962 // How to get to a n-sigma cut?
3964 // The accumulated statistics from 0 to d is
3966 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
3967 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
3969 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
3970 // Can this be expressed in a different way?
3972 if (bRes[0] == 0 || bRes[1] ==0)
3975 double d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
3977 // stupid rounding problem screws up everything:
3978 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
3979 if (TMath::Exp(-d * d / 2) < 1e-10)
3983 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
3987 //vector <TLorentzVector> AliAnalysisTaskGammaConversion::GetTLorentzVector(vector <AliESDtrack*> esdTrack){
3988 TClonesArray AliAnalysisTaskGammaConversion::GetTLorentzVector(TClonesArray *const esdTrack){
3989 //Return TLoresntz vector of track?
3990 // vector <TLorentzVector> tlVtrack(0);
3991 TClonesArray array("TLorentzVector",0);
3993 for(Int_t itrack=0; itrack < esdTrack->GetEntriesFast(); itrack++){
3995 //esdTrack[itrack]->GetConstrainedPxPyPz(p);
3996 ((AliESDtrack*)(esdTrack->At(itrack)))->GetConstrainedPxPyPz(p);
3997 TLorentzVector currentTrack;
3998 currentTrack.SetXYZM(p[0],p[1],p[2],fElectronMass);
3999 new((array)[array.GetEntriesFast()]) TLorentzVector(currentTrack);
4000 // tlVtrack.push_back(currentTrack);
4008 Int_t AliAnalysisTaskGammaConversion::GetProcessType(AliMCEvent * mcEvt) {
4010 // Determine if the event was generated with pythia or phojet and return the process type
4012 // Check if mcEvt is fine
4014 AliFatal("NULL mc event");
4017 // Determine if it was a pythia or phojet header, and return the correct process type
4018 AliGenPythiaEventHeader * headPy = 0;
4019 AliGenDPMjetEventHeader * headPho = 0;
4020 AliGenEventHeader * htmp = mcEvt->GenEventHeader();
4022 AliFatal("Cannot Get MC Header!!");
4024 if( TString(htmp->IsA()->GetName()) == "AliGenPythiaEventHeader") {
4025 headPy = (AliGenPythiaEventHeader*) htmp;
4026 } else if (TString(htmp->IsA()->GetName()) == "AliGenDPMjetEventHeader") {
4027 headPho = (AliGenDPMjetEventHeader*) htmp;
4029 AliError("Unknown header");
4032 // Determine process type
4034 if(headPy->ProcessType() == 92 || headPy->ProcessType() == 93) {
4035 // single difractive
4037 } else if (headPy->ProcessType() == 94) {
4038 // double diffractive
4041 else if(headPy->ProcessType() != 92 && headPy->ProcessType() != 93 && headPy->ProcessType() != 94) {
4045 } else if (headPho) {
4046 if(headPho->ProcessType() == 5 || headPho->ProcessType() == 6 ) {
4047 // single difractive
4049 } else if (headPho->ProcessType() == 7) {
4050 // double diffractive
4052 } else if(headPho->ProcessType() != 5 && headPho->ProcessType() != 6 && headPho->ProcessType() != 7 ) {
4059 // no process type found?
4060 AliError(Form("Unknown header: %s", htmp->IsA()->GetName()));
4061 return kProcUnknown;