1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: Ana Marin, Kathrin Koch, Kenneth Aamodt *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
16 ////////////////////////////////////////////////
\r
17 //---------------------------------------------
\r
18 // Class used to do analysis on conversion pairs
\r
19 //---------------------------------------------
\r
20 ////////////////////////////////////////////////
\r
26 #include "AliAnalysisTaskGammaConversion.h"
\r
27 #include "AliStack.h"
\r
29 #include "TNtuple.h"
\r
32 class AliAODHandler;
\r
36 class AliMCEventHandler;
\r
37 class AliESDInputHandler;
\r
38 class AliAnalysisManager;
\r
45 ClassImp(AliAnalysisTaskGammaConversion)
\r
48 AliAnalysisTaskGammaConversion::AliAnalysisTaskGammaConversion():
\r
49 AliAnalysisTaskSE(),
\r
53 fOutputContainer(NULL),
\r
60 fKFReconstructedGammas(),
\r
61 fIsTrueReconstructedGammas(),
\r
64 fCurrentEventPosElectron(),
\r
65 fPreviousEventPosElectron(),
\r
66 fCurrentEventNegElectron(),
\r
67 fPreviousEventNegElectron(),
\r
68 fKFReconstructedGammasCut(),
\r
69 fPreviousEventTLVNegElectron(),
\r
70 fPreviousEventTLVPosElectron(),
\r
78 fMinOpeningAngleGhostCut(0.),
\r
79 fCalculateBackground(kFALSE),
\r
80 fWriteNtuple(kFALSE),
\r
82 fNeutralMesonNtuple(NULL),
\r
83 fTotalNumberOfAddedNtupleEntries(0)
\r
85 // Default constructor
\r
86 // Common I/O in slot 0
\r
87 DefineInput (0, TChain::Class());
\r
88 DefineOutput(0, TTree::Class());
\r
90 // Your private output
\r
91 DefineOutput(1, TList::Class());
\r
94 AliAnalysisTaskGammaConversion::AliAnalysisTaskGammaConversion(const char* name):
\r
95 AliAnalysisTaskSE(name),
\r
99 fOutputContainer(0x0),
\r
101 fDoMCTruth(kFALSE),
\r
106 fKFReconstructedGammas(),
\r
107 fIsTrueReconstructedGammas(),
\r
110 fCurrentEventPosElectron(),
\r
111 fPreviousEventPosElectron(),
\r
112 fCurrentEventNegElectron(),
\r
113 fPreviousEventNegElectron(),
\r
114 fKFReconstructedGammasCut(),
\r
115 fPreviousEventTLVNegElectron(),
\r
116 fPreviousEventTLVPosElectron(),
\r
124 fMinOpeningAngleGhostCut(0.),
\r
125 fCalculateBackground(kFALSE),
\r
126 fWriteNtuple(kFALSE),
\r
127 fGammaNtuple(NULL),
\r
128 fNeutralMesonNtuple(NULL),
\r
129 fTotalNumberOfAddedNtupleEntries(0)
\r
131 // Common I/O in slot 0
\r
132 DefineInput (0, TChain::Class());
\r
133 DefineOutput(0, TTree::Class());
\r
135 // Your private output
\r
136 DefineOutput(1, TList::Class());
\r
139 AliAnalysisTaskGammaConversion::~AliAnalysisTaskGammaConversion()
\r
141 // Remove all pointers
\r
143 if(fOutputContainer){
\r
144 fOutputContainer->Clear() ;
\r
145 delete fOutputContainer ;
\r
148 delete fHistograms;
\r
156 void AliAnalysisTaskGammaConversion::Init()
\r
159 AliLog::SetGlobalLogLevel(AliLog::kError);
\r
163 void AliAnalysisTaskGammaConversion::Exec(Option_t */*option*/)
\r
165 // Execute analysis for current event
\r
167 ConnectInputData("");
\r
170 fMCAllGammas.clear();
\r
173 fMCGammaChic.clear();
\r
175 fKFReconstructedGammas.clear();
\r
176 fIsTrueReconstructedGammas.clear();
\r
177 fElectronv1.clear();
\r
178 fElectronv2.clear();
\r
179 fCurrentEventPosElectron.clear();
\r
180 fCurrentEventNegElectron.clear();
\r
181 fKFReconstructedGammasCut.clear();
\r
183 //Clear the data in the v0Reader
\r
184 fV0Reader->UpdateEventByEventData();
\r
187 // Process the MC information
\r
192 //Process the v0 information with no cuts
\r
195 // Process the v0 information
\r
198 //calculate background if flag is set
\r
199 if(fCalculateBackground){
\r
200 CalculateBackground();
\r
203 // Process reconstructed gammas
\r
204 ProcessGammasForNeutralMesonAnalysis();
\r
206 CheckV0Efficiency();
\r
208 //Process reconstructed gammas electrons for Chi_c Analysis
\r
209 ProcessGammaElectronsForChicAnalysis();
\r
211 PostData(1, fOutputContainer);
\r
215 void AliAnalysisTaskGammaConversion::ConnectInputData(Option_t */*option*/){
\r
216 // see header file for documentation
\r
218 if(fV0Reader == NULL){
\r
219 // Write warning here cuts and so on are default if this ever happens
\r
221 fV0Reader->Initialize();
\r
226 void AliAnalysisTaskGammaConversion::ProcessMCData(){
\r
227 // see header file for documentation
\r
229 fStack = fV0Reader->GetMCStack();
\r
231 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
\r
232 return; // aborts if the primary vertex does not have contributors.
\r
235 for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++) {
\r
236 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
\r
239 //print warning here
\r
243 ///////////////////////Begin Chic Analysis/////////////////////////////
\r
246 if(particle->GetPdgCode() == 443){//Is JPsi
\r
248 if(particle->GetNDaughters()==2){
\r
249 if(TMath::Abs(fStack->Particle(particle->GetFirstDaughter())->GetPdgCode()) == 11 &&
\r
250 TMath::Abs(fStack->Particle(particle->GetLastDaughter())->GetPdgCode()) == 11){
\r
251 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
\r
252 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
\r
253 if(TMath::Abs(daug0->Eta()) < 0.9 && TMath::Abs(daug1->Eta()) < 0.9)
\r
254 fHistograms->FillTable("Table_Electrons",3);//e+ e- from J/Psi inside acceptance
\r
256 if( TMath::Abs(daug0->Eta()) < 0.9){
\r
257 if(daug0->GetPdgCode() == -11)
\r
258 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
\r
260 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
\r
263 if(TMath::Abs(daug1->Eta()) < 0.9){
\r
264 if(daug1->GetPdgCode() == -11)
\r
265 fHistograms->FillTable("Table_Electrons",1);//e+ from J/Psi inside acceptance
\r
267 fHistograms->FillTable("Table_Electrons",2);//e- from J/Psi inside acceptance
\r
272 // const int CHI_C0 = 10441;
\r
273 // const int CHI_C1 = 20443;
\r
274 // const int CHI_C2 = 445
\r
275 if(particle->GetPdgCode() == 22){//gamma from JPsi
\r
276 if(particle->GetMother(0) > -1){
\r
277 if(fStack->Particle(particle->GetMother(0))->GetPdgCode() == 10441 ||
\r
278 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 20443 ||
\r
279 fStack->Particle(particle->GetMother(0))->GetPdgCode() == 445){
\r
280 if(TMath::Abs(particle->Eta()) < 1.2)
\r
281 fHistograms->FillTable("Table_Electrons",17);// gamma from chic inside accptance
\r
285 if(particle->GetPdgCode() == 10441 || particle->GetPdgCode() == 20443 || particle->GetPdgCode() == 445){
\r
286 if( particle->GetNDaughters() == 2){
\r
287 TParticle* daug0 = fStack->Particle(particle->GetFirstDaughter());
\r
288 TParticle* daug1 = fStack->Particle(particle->GetLastDaughter());
\r
290 if( (daug0->GetPdgCode() == 443 || daug0->GetPdgCode() == 22) && (daug1->GetPdgCode() == 443 || daug1->GetPdgCode() == 22) ){
\r
291 if( daug0->GetPdgCode() == 443){
\r
292 TParticle* daugE0 = fStack->Particle(daug0->GetFirstDaughter());
\r
293 TParticle* daugE1 = fStack->Particle(daug0->GetLastDaughter());
\r
294 if( TMath::Abs(daug1->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
\r
295 fHistograms->FillTable("Table_Electrons",18);
\r
298 else if (daug1->GetPdgCode() == 443){
\r
299 TParticle* daugE0 = fStack->Particle(daug1->GetFirstDaughter());
\r
300 TParticle* daugE1 = fStack->Particle(daug1->GetLastDaughter());
\r
301 if( TMath::Abs(daug0->Eta()) < 1.2 && TMath::Abs(daugE0->Eta()) < 0.9 && TMath::Abs(daugE1->Eta()) < 0.9 )
\r
302 fHistograms->FillTable("Table_Electrons",18);
\r
309 /////////////////////End Chic Analysis////////////////////////////
\r
312 if(TMath::Abs(particle->Eta())> fV0Reader->GetEtaCut() ) continue;
\r
314 if(particle->R()>fV0Reader->GetMaxRCut()) continue; // cuts on distance from collision point
\r
316 Double_t tmpPhi=particle->Phi();
\r
318 if(particle->Phi()> TMath::Pi()){
\r
319 tmpPhi = particle->Phi()-(2*TMath::Pi());
\r
323 if(particle->Energy() - particle->Pz() == 0 || particle->Energy() + particle->Pz() == 0){
\r
327 rapidity = 0.5*(TMath::Log((particle->Energy()+particle->Pz()) / (particle->Energy()-particle->Pz())));
\r
330 //process the gammas
\r
331 if (particle->GetPdgCode() == 22){
\r
333 if(particle->GetMother(0) >-1 && fStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
\r
334 continue; // no photon as mothers!
\r
337 if(particle->GetMother(0) >= fStack->GetNprimary()){
\r
338 continue; // the gamma has a mother, and it is not a primary particle
\r
341 fMCAllGammas.push_back(particle);
\r
343 fHistograms->FillHistogram("MC_allGamma_Energy", particle->Energy());
\r
344 fHistograms->FillHistogram("MC_allGamma_Pt", particle->Pt());
\r
345 fHistograms->FillHistogram("MC_allGamma_Eta", particle->Eta());
\r
346 fHistograms->FillHistogram("MC_allGamma_Phi", tmpPhi);
\r
347 fHistograms->FillHistogram("MC_allGamma_Rapid", rapidity);
\r
350 if(particle->GetMother(0) < 0){ // direct gamma
\r
351 fHistograms->FillHistogram("MC_allDirectGamma_Energy",particle->Energy());
\r
352 fHistograms->FillHistogram("MC_allDirectGamma_Pt", particle->Pt());
\r
353 fHistograms->FillHistogram("MC_allDirectGamma_Eta", particle->Eta());
\r
354 fHistograms->FillHistogram("MC_allDirectGamma_Phi", tmpPhi);
\r
355 fHistograms->FillHistogram("MC_allDirectGamma_Rapid", rapidity);
\r
359 // looking for conversion (electron + positron from pairbuilding (= 5) )
\r
360 TParticle* ePos = NULL;
\r
361 TParticle* eNeg = NULL;
\r
363 if(particle->GetNDaughters() >= 2){
\r
364 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
\r
365 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
\r
366 if(tmpDaughter->GetUniqueID() == 5){
\r
367 if(tmpDaughter->GetPdgCode() == 11){
\r
368 eNeg = tmpDaughter;
\r
370 else if(tmpDaughter->GetPdgCode() == -11){
\r
371 ePos = tmpDaughter;
\r
378 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
\r
383 Double_t ePosPhi = ePos->Phi();
\r
384 if(ePos->Phi()> TMath::Pi()) ePosPhi = ePos->Phi()-(2*TMath::Pi());
\r
386 Double_t eNegPhi = eNeg->Phi();
\r
387 if(eNeg->Phi()> TMath::Pi()) eNegPhi = eNeg->Phi()-(2*TMath::Pi());
\r
390 if(ePos->Pt()<fV0Reader->GetPtCut() || eNeg->Pt()<fV0Reader->GetPtCut()){
\r
391 continue; // no reconstruction below the Pt cut
\r
394 if(TMath::Abs(ePos->Eta())> fV0Reader->GetEtaCut() || TMath::Abs(eNeg->Eta())> fV0Reader->GetEtaCut()){
\r
398 if(ePos->R()>fV0Reader->GetMaxRCut()){
\r
399 continue; // cuts on distance from collision point
\r
403 if((TMath::Abs(ePos->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() > ePos->R()){
\r
404 continue; // line cut to exclude regions where we do not reconstruct
\r
407 fHistograms->FillHistogram("MC_ConvGamma_Energy", particle->Energy());
\r
408 fHistograms->FillHistogram("MC_ConvGamma_Pt", particle->Pt());
\r
409 fHistograms->FillHistogram("MC_ConvGamma_Eta", particle->Eta());
\r
410 fHistograms->FillHistogram("MC_ConvGamma_Phi", tmpPhi);
\r
411 fHistograms->FillHistogram("MC_ConvGamma_Rapid", rapidity);
\r
412 fHistograms->FillHistogram("MC_ConvGamma_Pt_Eta", particle->Pt(),particle->Eta());
\r
414 fHistograms->FillHistogram("MC_E_Energy", eNeg->Energy());
\r
415 fHistograms->FillHistogram("MC_E_Pt", eNeg->Pt());
\r
416 fHistograms->FillHistogram("MC_E_Eta", eNeg->Eta());
\r
417 fHistograms->FillHistogram("MC_E_Phi", eNegPhi);
\r
419 fHistograms->FillHistogram("MC_P_Energy", ePos->Energy());
\r
420 fHistograms->FillHistogram("MC_P_Pt", ePos->Pt());
\r
421 fHistograms->FillHistogram("MC_P_Eta", ePos->Eta());
\r
422 fHistograms->FillHistogram("MC_P_Phi", ePosPhi);
\r
426 //cout << "filled histos for converted gamma, ePos, eNeg" << endl;
\r
429 Int_t rBin = fHistograms->GetRBin(ePos->R());
\r
430 Int_t phiBin = fHistograms->GetPhiBin(particle->Phi());
\r
432 TString nameMCMappingPhiR="";
\r
433 nameMCMappingPhiR.Form("MC_Conversion_Mapping-Phi%02d-R%02d",phiBin,rBin);
\r
434 fHistograms->FillHistogram(nameMCMappingPhiR, ePos->Vz(), particle->Eta());
\r
436 TString nameMCMappingPhi="";
\r
437 nameMCMappingPhi.Form("MC_Conversion_Mapping-Phi%02d",phiBin);
\r
438 fHistograms->FillHistogram(nameMCMappingPhi, particle->Eta());
\r
440 TString nameMCMappingR="";
\r
441 nameMCMappingR.Form("MC_Conversion_Mapping-R%02d",rBin);
\r
442 fHistograms->FillHistogram(nameMCMappingR, particle->Eta());
\r
444 TString nameMCMappingPhiInR="";
\r
445 nameMCMappingPhiInR.Form("MC_Conversion_Mapping_Phi_R-%02d",rBin);
\r
446 fHistograms->FillHistogram(nameMCMappingPhiInR, tmpPhi);
\r
449 fHistograms->FillHistogram("MC_Conversion_R",ePos->R());
\r
450 fHistograms->FillHistogram("MC_Conversion_ZR",ePos->Vz(),ePos->R());
\r
451 fHistograms->FillHistogram("MC_Conversion_XY",ePos->Vx(),ePos->Vy());
\r
452 fHistograms->FillHistogram("MC_Conversion_OpeningAngle",GetMCOpeningAngle(ePos, eNeg));
\r
454 //cout << "mapping is done" << endl;
\r
457 if(particle->GetMother(0) < 0){ // no mother = direct gamma, still inside converted
\r
458 fHistograms->FillHistogram("MC_ConvDirectGamma_Energy",particle->Energy());
\r
459 fHistograms->FillHistogram("MC_ConvDirectGamma_Pt", particle->Pt());
\r
460 fHistograms->FillHistogram("MC_ConvDirectGamma_Eta", particle->Eta());
\r
461 fHistograms->FillHistogram("MC_ConvDirectGamma_Phi", tmpPhi);
\r
462 fHistograms->FillHistogram("MC_ConvDirectGamma_Rapid", rapidity);
\r
464 } // end direct gamma
\r
465 else{ // mother exits
\r
466 if( fStack->Particle(particle->GetMother(0))->GetPdgCode()==10441 ||//chic0
\r
467 fStack->Particle(particle->GetMother(0))->GetPdgCode()==20443 ||//psi2S
\r
468 fStack->Particle(particle->GetMother(0))->GetPdgCode()==445 //chic2
\r
470 fMCGammaChic.push_back(particle);
\r
472 } // end if mother exits
\r
473 } // end if particle is a photon
\r
475 if(particle->GetNDaughters() == 2){
\r
477 TParticle* daughter0 = (TParticle*)fStack->Particle(particle->GetFirstDaughter());
\r
478 TParticle* daughter1 = (TParticle*)fStack->Particle(particle->GetLastDaughter());
\r
480 if(daughter0->GetPdgCode() != 22 || daughter1->GetPdgCode() != 22) continue; //check for gamma gamma daughters
\r
484 // check for conversions now -> have to pass eta and line cut!
\r
485 Bool_t daughter0Electron = kFALSE;
\r
486 Bool_t daughter0Positron = kFALSE;
\r
487 Bool_t daughter1Electron = kFALSE;
\r
488 Bool_t daughter1Positron = kFALSE;
\r
492 if(daughter0->GetNDaughters() >= 2){
\r
493 for(Int_t TrackIndex=daughter0->GetFirstDaughter();TrackIndex<=daughter0->GetLastDaughter();TrackIndex++){
\r
494 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
\r
495 if(tmpDaughter->GetUniqueID() == 5){
\r
496 if(tmpDaughter->GetPdgCode() == 11){
\r
497 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
\r
498 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
\r
499 daughter0Electron = kTRUE;
\r
504 else if(tmpDaughter->GetPdgCode() == -11){
\r
505 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
\r
506 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
\r
507 daughter0Positron = kTRUE;
\r
519 if(daughter1->GetNDaughters() >= 2){
\r
520 for(Int_t TrackIndex=daughter1->GetFirstDaughter();TrackIndex<=daughter1->GetLastDaughter();TrackIndex++){
\r
521 TParticle *tmpDaughter = fStack->Particle(TrackIndex);
\r
522 if(tmpDaughter->GetUniqueID() == 5){
\r
523 if(tmpDaughter->GetPdgCode() == 11){
\r
524 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
\r
525 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
\r
526 daughter1Electron = kTRUE;
\r
531 else if(tmpDaughter->GetPdgCode() == -11){
\r
532 if( TMath::Abs(tmpDaughter->Eta()) <= fV0Reader->GetEtaCut() ){
\r
533 if( ( TMath::Abs(tmpDaughter->Vz()) * fV0Reader->GetLineCutZRSlope()) - fV0Reader->GetLineCutZValue() < tmpDaughter->R() ){
\r
534 daughter1Positron = kTRUE;
\r
547 if(particle->GetPdgCode()==111){ //Pi0
\r
548 if( iTracks >= fStack->GetNprimary()){
\r
549 fHistograms->FillHistogram("MC_Pi0_Secondaries_Eta", particle->Eta());
\r
550 fHistograms->FillHistogram("MC_Pi0_Secondaries_Rapid", rapidity);
\r
551 fHistograms->FillHistogram("MC_Pi0_Secondaries_Phi", tmpPhi);
\r
552 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt", particle->Pt());
\r
553 fHistograms->FillHistogram("MC_Pi0_Secondaries_Energy", particle->Energy());
\r
554 fHistograms->FillHistogram("MC_Pi0_Secondaries_R", particle->R());
\r
555 fHistograms->FillHistogram("MC_Pi0_Secondaries_ZR", particle->Vz(),particle->R());
\r
556 fHistograms->FillHistogram("MC_Pi0_Secondaries_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
\r
557 fHistograms->FillHistogram("MC_Pi0_Secondaries_XY", particle->Vx(),particle->Vy());//only fill from one daughter to avoid multiple filling
\r
559 if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
\r
560 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
\r
561 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
\r
562 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
\r
563 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
\r
564 fHistograms->FillHistogram("MC_Pi0_Secondaries_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
\r
569 fHistograms->FillHistogram("MC_Pi0_Eta", particle->Eta());
\r
570 fHistograms->FillHistogram("MC_Pi0_Rapid", rapidity);
\r
571 fHistograms->FillHistogram("MC_Pi0_Phi", tmpPhi);
\r
572 fHistograms->FillHistogram("MC_Pi0_Pt", particle->Pt());
\r
573 fHistograms->FillHistogram("MC_Pi0_Energy", particle->Energy());
\r
574 fHistograms->FillHistogram("MC_Pi0_R", particle->R());
\r
575 fHistograms->FillHistogram("MC_Pi0_ZR", particle->Vz(),particle->R());
\r
576 fHistograms->FillHistogram("MC_Pi0_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
\r
577 fHistograms->FillHistogram("MC_Pi0_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
\r
579 if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
\r
580 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
\r
581 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
\r
582 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
\r
583 fHistograms->FillHistogram("MC_Pi0_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
\r
584 fHistograms->FillHistogram("MC_Pi0_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
\r
590 if(particle->GetPdgCode()==221){ //Eta
\r
591 fHistograms->FillHistogram("MC_Eta_Eta", particle->Eta());
\r
592 fHistograms->FillHistogram("MC_Eta_Rapid", rapidity);
\r
593 fHistograms->FillHistogram("MC_Eta_Phi",tmpPhi);
\r
594 fHistograms->FillHistogram("MC_Eta_Pt", particle->Pt());
\r
595 fHistograms->FillHistogram("MC_Eta_Energy", particle->Energy());
\r
596 fHistograms->FillHistogram("MC_Eta_R", particle->R());
\r
597 fHistograms->FillHistogram("MC_Eta_ZR", particle->Vz(),particle->R());
\r
598 fHistograms->FillHistogram("MC_Eta_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
\r
599 fHistograms->FillHistogram("MC_Eta_XY", particle->Vx(), particle->Vy());//only fill from one daughter to avoid multiple filling
\r
601 if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
\r
602 fHistograms->FillHistogram("MC_Eta_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
\r
603 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
\r
604 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
\r
605 fHistograms->FillHistogram("MC_Eta_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
\r
606 fHistograms->FillHistogram("MC_Eta_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
\r
613 // all motherparticles with 2 gammas as daughters
\r
614 fHistograms->FillHistogram("MC_Mother_R", particle->R());
\r
615 fHistograms->FillHistogram("MC_Mother_ZR", particle->Vz(),particle->R());
\r
616 fHistograms->FillHistogram("MC_Mother_XY", particle->Vx(),particle->Vy());
\r
617 fHistograms->FillHistogram("MC_Mother_Mass", particle->GetCalcMass());
\r
618 fHistograms->FillHistogram("MC_Mother_GammaDaughter_OpeningAngle", GetMCOpeningAngle(daughter0,daughter1));
\r
619 fHistograms->FillHistogram("MC_Mother_Energy", particle->Energy());
\r
620 fHistograms->FillHistogram("MC_Mother_Pt", particle->Pt());
\r
621 fHistograms->FillHistogram("MC_Mother_Eta", particle->Eta());
\r
622 fHistograms->FillHistogram("MC_Mother_Rapid", rapidity);
\r
623 fHistograms->FillHistogram("MC_Mother_Phi",tmpPhi);
\r
624 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt",particle->GetMass(),particle->Pt());
\r
625 if(TMath::Abs(daughter0->Eta()) <= fV0Reader->GetEtaCut() && TMath::Abs(daughter1->Eta()) <= fV0Reader->GetEtaCut() ){
\r
626 fHistograms->FillHistogram("MC_Mother_Pt_Eta_withinAcceptance", particle->Pt(),particle->Eta());
\r
627 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_withinAcceptance", particle->Pt(),rapidity);
\r
628 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_withinAcceptance",particle->GetMass(),particle->Pt());
\r
629 if(daughter0Electron && daughter0Positron && daughter1Electron && daughter1Positron){
\r
630 fHistograms->FillHistogram("MC_Mother_Pt_Eta_ConvGamma_withinAcceptance", particle->Pt(),particle->Eta());
\r
631 fHistograms->FillHistogram("MC_Mother_Pt_Rapid_ConvGamma_withinAcceptance", particle->Pt(),rapidity);
\r
632 fHistograms->FillHistogram("MC_Mother_InvMass_vs_Pt_ConvGamma_withinAcceptance",particle->GetMass(),particle->Pt());
\r
639 //cout << "mother histos are filled" << endl;
\r
641 } // end if(particle->GetNDaughters() == 2)
\r
643 }// end for (Int_t iTracks = 0; iTracks < fStack->GetNtrack(); iTracks++)
\r
645 //cout << "right before the end of processMCdata" << endl;
\r
647 } // end ProcessMCData
\r
651 void AliAnalysisTaskGammaConversion::FillNtuple(){
\r
652 //Fills the ntuple with the different values
\r
654 if(fGammaNtuple == NULL){
\r
657 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
\r
658 for(Int_t i=0;i<numberOfV0s;i++){
\r
659 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};
\r
660 AliESDv0 * cV0 = fV0Reader->GetV0(i);
\r
663 fV0Reader->GetPIDProbability(negPID,posPID);
\r
664 values[0]=cV0->GetOnFlyStatus();
\r
665 values[1]=fV0Reader->CheckForPrimaryVertex();
\r
668 values[4]=fV0Reader->GetX();
\r
669 values[5]=fV0Reader->GetY();
\r
670 values[6]=fV0Reader->GetZ();
\r
671 values[7]=fV0Reader->GetXYRadius();
\r
672 values[8]=fV0Reader->GetMotherCandidateNDF();
\r
673 values[9]=fV0Reader->GetMotherCandidateChi2();
\r
674 values[10]=fV0Reader->GetMotherCandidateEnergy();
\r
675 values[11]=fV0Reader->GetMotherCandidateEta();
\r
676 values[12]=fV0Reader->GetMotherCandidatePt();
\r
677 values[13]=fV0Reader->GetMotherCandidateMass();
\r
678 values[14]=fV0Reader->GetMotherCandidateWidth();
\r
679 // values[15]=fV0Reader->GetMotherMCParticle()->Pt(); MOVED TO THE END, HAS TO BE CALLED AFTER HasSameMother NB: still has the same entry in the array
\r
680 values[16]=fV0Reader->GetOpeningAngle();
\r
681 values[17]=fV0Reader->GetNegativeTrackEnergy();
\r
682 values[18]=fV0Reader->GetNegativeTrackPt();
\r
683 values[19]=fV0Reader->GetNegativeTrackEta();
\r
684 values[20]=fV0Reader->GetNegativeTrackPhi();
\r
685 values[21]=fV0Reader->GetPositiveTrackEnergy();
\r
686 values[22]=fV0Reader->GetPositiveTrackPt();
\r
687 values[23]=fV0Reader->GetPositiveTrackEta();
\r
688 values[24]=fV0Reader->GetPositiveTrackPhi();
\r
689 values[25]=fV0Reader->HasSameMCMother();
\r
690 if(values[25] != 0){
\r
691 values[26]=fV0Reader->GetMotherMCParticlePDGCode();
\r
692 values[15]=fV0Reader->GetMotherMCParticle()->Pt();
\r
694 fTotalNumberOfAddedNtupleEntries++;
\r
695 fGammaNtuple->Fill(values);
\r
697 fV0Reader->ResetV0IndexNumber();
\r
701 void AliAnalysisTaskGammaConversion::ProcessV0sNoCut(){
\r
702 // Process all the V0's without applying any cuts to it
\r
704 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
\r
705 for(Int_t i=0;i<numberOfV0s;i++){
\r
706 /*AliESDv0 * cV0 = */fV0Reader->GetV0(i);
\r
708 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
\r
714 if(fV0Reader->HasSameMCMother() == kFALSE){
\r
718 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
\r
719 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
\r
721 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
\r
724 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
\r
728 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
\r
730 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
\r
731 fHistograms->FillHistogram("ESD_NoCutConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
\r
732 fHistograms->FillHistogram("ESD_NoCutConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
\r
733 fHistograms->FillHistogram("ESD_NoCutConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
\r
734 fHistograms->FillHistogram("ESD_NoCutConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
\r
735 fHistograms->FillHistogram("ESD_NoCutConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
\r
736 fHistograms->FillHistogram("ESD_NoCutConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
\r
737 fHistograms->FillHistogram("ESD_NoCutConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
\r
738 fHistograms->FillHistogram("ESD_NoCutConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
\r
739 fHistograms->FillHistogram("ESD_NoCutConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
\r
741 fHistograms->FillHistogram("ESD_NoCutConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
\r
742 fHistograms->FillHistogram("ESD_NoCutConversion_R", fV0Reader->GetXYRadius());
\r
743 fHistograms->FillHistogram("ESD_NoCutConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
\r
744 fHistograms->FillHistogram("ESD_NoCutConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
\r
747 ESD_NoCutConvGamma_Pt
\r
748 ESD_NoCutConvGamma_Energy
\r
749 ESD_NoCutConvGamma_Eta
\r
750 ESD_NoCutConvGamma_Phi
\r
751 ESD_NoCutConvGamma_Mass
\r
752 ESD_NoCutConvGamma_Width
\r
753 ESD_NoCutConvGamma_Chi2
\r
754 ESD_NoCutConvGamma_NDF
\r
755 ESD_NoCutConvGamma_PtvsEta
\r
756 ESD_NoCutConversion_XY
\r
757 ESD_NoCutConversion_R
\r
758 ESD_NoCutConversion_ZR
\r
759 ESD_NoCutConversion_OpeningAngle
\r
764 fV0Reader->ResetV0IndexNumber();
\r
767 void AliAnalysisTaskGammaConversion::ProcessV0s(){
\r
768 // see header file for documentation
\r
770 if(fWriteNtuple == kTRUE){
\r
774 Int_t nSurvivingV0s=0;
\r
775 while(fV0Reader->NextV0()){
\r
779 //-------------------------- filling v0 information -------------------------------------
\r
780 fHistograms->FillHistogram("ESD_Conversion_R", fV0Reader->GetXYRadius());
\r
781 fHistograms->FillHistogram("ESD_Conversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
\r
782 fHistograms->FillHistogram("ESD_Conversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
\r
783 fHistograms->FillHistogram("ESD_Conversion_OpeningAngle", fV0Reader->GetOpeningAngle());
\r
785 fHistograms->FillHistogram("ESD_E_Energy", fV0Reader->GetNegativeTrackEnergy());
\r
786 fHistograms->FillHistogram("ESD_E_Pt", fV0Reader->GetNegativeTrackPt());
\r
787 fHistograms->FillHistogram("ESD_E_Eta", fV0Reader->GetNegativeTrackEta());
\r
788 fHistograms->FillHistogram("ESD_E_Phi", fV0Reader->GetNegativeTrackPhi());
\r
790 fHistograms->FillHistogram("ESD_P_Energy", fV0Reader->GetPositiveTrackEnergy());
\r
791 fHistograms->FillHistogram("ESD_P_Pt", fV0Reader->GetPositiveTrackPt());
\r
792 fHistograms->FillHistogram("ESD_P_Eta", fV0Reader->GetPositiveTrackEta());
\r
793 fHistograms->FillHistogram("ESD_P_Phi", fV0Reader->GetPositiveTrackPhi());
\r
795 fHistograms->FillHistogram("ESD_ConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
\r
796 fHistograms->FillHistogram("ESD_ConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
\r
797 fHistograms->FillHistogram("ESD_ConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
\r
798 fHistograms->FillHistogram("ESD_ConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
\r
799 fHistograms->FillHistogram("ESD_ConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
\r
800 fHistograms->FillHistogram("ESD_ConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
\r
801 fHistograms->FillHistogram("ESD_ConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
\r
802 fHistograms->FillHistogram("ESD_ConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
\r
803 fHistograms->FillHistogram("ESD_ConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
\r
804 fHistograms->FillHistogram("ESD_ConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
\r
808 Int_t rBin = fHistograms->GetRBin(fV0Reader->GetXYRadius());
\r
809 Int_t phiBin = fHistograms->GetPhiBin(fV0Reader->GetNegativeTrackPhi());
\r
810 Double_t motherCandidateEta= fV0Reader->GetMotherCandidateEta();
\r
812 TString nameESDMappingPhiR="";
\r
813 nameESDMappingPhiR.Form("ESD_Conversion_Mapping-Phi%02d-R%02d",phiBin,rBin);
\r
814 fHistograms->FillHistogram(nameESDMappingPhiR, fV0Reader->GetZ(), motherCandidateEta);
\r
816 TString nameESDMappingPhi="";
\r
817 nameESDMappingPhi.Form("ESD_Conversion_Mapping-Phi%02d",phiBin);
\r
818 fHistograms->FillHistogram(nameESDMappingPhi, fV0Reader->GetZ(), motherCandidateEta);
\r
820 TString nameESDMappingR="";
\r
821 nameESDMappingR.Form("ESD_Conversion_Mapping-R%02d",rBin);
\r
822 fHistograms->FillHistogram(nameESDMappingR, fV0Reader->GetZ(), motherCandidateEta);
\r
824 TString nameESDMappingPhiInR="";
\r
825 nameESDMappingPhiInR.Form("ESD_Conversion_Mapping_Phi_R-%02d",rBin);
\r
826 fHistograms->FillHistogram(nameESDMappingPhiInR, fV0Reader->GetMotherCandidatePhi());
\r
829 fKFReconstructedGammas.push_back(*fV0Reader->GetMotherCandidateKFCombination());
\r
830 fElectronv1.push_back(fV0Reader->GetCurrentV0()->GetPindex());
\r
831 fElectronv2.push_back(fV0Reader->GetCurrentV0()->GetNindex());
\r
834 //----------------------------------- checking for "real" conversions (MC match) --------------------------------------
\r
837 if(fV0Reader->HasSameMCMother() == kFALSE){
\r
838 fIsTrueReconstructedGammas.push_back(kFALSE);
\r
843 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
\r
844 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
\r
846 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
\r
847 fIsTrueReconstructedGammas.push_back(kFALSE);
\r
850 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
\r
851 fIsTrueReconstructedGammas.push_back(kFALSE);
\r
855 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
\r
856 fIsTrueReconstructedGammas.push_back(kTRUE);
\r
858 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt", fV0Reader->GetMotherCandidatePt());
\r
859 fHistograms->FillHistogram("ESD_TrueConvGamma_Energy", fV0Reader->GetMotherCandidateEnergy());
\r
860 fHistograms->FillHistogram("ESD_TrueConvGamma_Eta", fV0Reader->GetMotherCandidateEta());
\r
861 fHistograms->FillHistogram("ESD_TrueConvGamma_Phi", fV0Reader->GetMotherCandidatePhi());
\r
862 fHistograms->FillHistogram("ESD_TrueConvGamma_Mass", fV0Reader->GetMotherCandidateMass());
\r
863 fHistograms->FillHistogram("ESD_TrueConvGamma_Width", fV0Reader->GetMotherCandidateWidth());
\r
864 fHistograms->FillHistogram("ESD_TrueConvGamma_Chi2", fV0Reader->GetMotherCandidateChi2());
\r
865 fHistograms->FillHistogram("ESD_TrueConvGamma_NDF", fV0Reader->GetMotherCandidateNDF());
\r
866 fHistograms->FillHistogram("ESD_TrueConvGamma_Pt_Eta", fV0Reader->GetMotherCandidatePt(),fV0Reader->GetMotherCandidateEta());
\r
867 fHistograms->FillHistogram("ESD_TrueConvGamma_Rapid", fV0Reader->GetMotherCandidateRapidity());
\r
868 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters());
\r
869 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLength", /*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters());
\r
870 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetNegativeTrackLength()*/fV0Reader->GetNegativeNTPCClusters(),fV0Reader->GetMotherCandidateMass());
\r
871 fHistograms->FillHistogram("ESD_TrueConvGamma_TrackLengthVSInvMass",/*fV0Reader->GetPositiveTrackLength()*/fV0Reader->GetPositiveNTPCClusters(),fV0Reader->GetMotherCandidateMass());
\r
873 fHistograms->FillHistogram("ESD_TrueConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
\r
874 fHistograms->FillHistogram("ESD_TrueConversion_R", fV0Reader->GetXYRadius());
\r
875 fHistograms->FillHistogram("ESD_TrueConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
\r
876 fHistograms->FillHistogram("ESD_TrueConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
\r
880 fHistograms->FillHistogram("ESD_TrueConversion_XY", fV0Reader->GetX(),fV0Reader->GetY());
\r
881 fHistograms->FillHistogram("ESD_TrueConversion_R", fV0Reader->GetXYRadius());
\r
882 fHistograms->FillHistogram("ESD_TrueConversion_ZR", fV0Reader->GetZ(),fV0Reader->GetXYRadius());
\r
883 fHistograms->FillHistogram("ESD_TrueConversion_OpeningAngle", fV0Reader->GetOpeningAngle());
\r
889 Double_t mcpt = fV0Reader->GetMotherMCParticle()->Pt();
\r
890 Double_t esdpt = fV0Reader->GetMotherCandidatePt();
\r
891 Double_t resdPt = 0;
\r
893 resdPt = ((esdpt - mcpt)/mcpt)*100;
\r
896 fHistograms->FillHistogram("Resolution_dPt", mcpt, resdPt);
\r
897 fHistograms->FillHistogram("Resolution_MC_Pt", mcpt);
\r
898 fHistograms->FillHistogram("Resolution_ESD_Pt", esdpt);
\r
900 Double_t resdZ = 0;
\r
901 if(fV0Reader->GetNegativeMCParticle()->Vz() != 0){
\r
902 resdZ = ((fV0Reader->GetZ() -fV0Reader->GetNegativeMCParticle()->Vz())/fV0Reader->GetNegativeMCParticle()->Vz())*100;
\r
905 fHistograms->FillHistogram("Resolution_dZ", fV0Reader->GetNegativeMCParticle()->Vz(), resdZ);
\r
906 fHistograms->FillHistogram("Resolution_MC_Z", fV0Reader->GetNegativeMCParticle()->Vz());
\r
907 fHistograms->FillHistogram("Resolution_ESD_Z", fV0Reader->GetZ());
\r
909 Double_t resdR = 0;
\r
910 if(fV0Reader->GetNegativeMCParticle()->R() != 0){
\r
911 resdR = ((fV0Reader->GetXYRadius() - fV0Reader->GetNegativeMCParticle()->R())/fV0Reader->GetNegativeMCParticle()->R())*100;
\r
914 fHistograms->FillHistogram("Resolution_dR", fV0Reader->GetNegativeMCParticle()->R(), resdR);
\r
915 fHistograms->FillHistogram("Resolution_MC_R", fV0Reader->GetNegativeMCParticle()->R());
\r
916 fHistograms->FillHistogram("Resolution_ESD_R", fV0Reader->GetXYRadius());
\r
917 fHistograms->FillHistogram("Resolution_dR_dPt", resdR, resdPt);
\r
918 }//if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22)
\r
920 fIsTrueReconstructedGammas.push_back(kFALSE);
\r
923 }//while(fV0Reader->NextV0)
\r
924 fHistograms->FillHistogram("ESD_NumberOfSurvivingV0s", nSurvivingV0s);
\r
925 fHistograms->FillHistogram("ESD_NumberOfV0s", fV0Reader->GetNumberOfV0s());
\r
927 //cout << "nearly at the end of doMCTruth" << endl;
\r
931 void AliAnalysisTaskGammaConversion::ProcessGammasForNeutralMesonAnalysis(){
\r
932 // see header file for documentation
\r
934 for(UInt_t firstGammaIndex=0;firstGammaIndex<fKFReconstructedGammas.size();firstGammaIndex++){
\r
935 for(UInt_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fKFReconstructedGammas.size();secondGammaIndex++){
\r
937 AliKFParticle * twoGammaDecayCandidateDaughter0 = &fKFReconstructedGammas[firstGammaIndex];
\r
938 AliKFParticle * twoGammaDecayCandidateDaughter1 = &fKFReconstructedGammas[secondGammaIndex];
\r
940 if(fElectronv1[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv1[firstGammaIndex]==fElectronv2[secondGammaIndex]){
\r
943 if(fElectronv2[firstGammaIndex]==fElectronv1[secondGammaIndex] || fElectronv2[firstGammaIndex]==fElectronv2[secondGammaIndex]){
\r
948 if(fIsTrueReconstructedGammas[firstGammaIndex] == kFALSE || fIsTrueReconstructedGammas[secondGammaIndex] == kFALSE){
\r
953 AliKFParticle *twoGammaCandidate = new AliKFParticle(*twoGammaDecayCandidateDaughter0,*twoGammaDecayCandidateDaughter1);
\r
955 Double_t massTwoGammaCandidate = 0.;
\r
956 Double_t widthTwoGammaCandidate = 0.;
\r
957 Double_t chi2TwoGammaCandidate =10000.;
\r
958 twoGammaCandidate->GetMass(massTwoGammaCandidate,widthTwoGammaCandidate);
\r
959 if(twoGammaCandidate->GetNDF()>0){
\r
960 chi2TwoGammaCandidate = twoGammaCandidate->GetChi2()/twoGammaCandidate->GetNDF();
\r
962 if(chi2TwoGammaCandidate>0 && chi2TwoGammaCandidate<fV0Reader->GetChi2CutMeson()){
\r
964 TVector3 momentumVectorTwoGammaCandidate(twoGammaCandidate->GetPx(),twoGammaCandidate->GetPy(),twoGammaCandidate->GetPz());
\r
965 TVector3 spaceVectorTwoGammaCandidate(twoGammaCandidate->GetX(),twoGammaCandidate->GetY(),twoGammaCandidate->GetZ());
\r
967 Double_t openingAngleTwoGammaCandidate = twoGammaDecayCandidateDaughter0->GetAngle(*twoGammaDecayCandidateDaughter1);
\r
969 if(twoGammaCandidate->GetE() - twoGammaCandidate->GetPz() == 0 || twoGammaCandidate->GetE() + twoGammaCandidate->GetPz() == 0){
\r
973 rapidity = 0.5*(TMath::Log((twoGammaCandidate->GetE() +twoGammaCandidate->GetPz()) / (twoGammaCandidate->GetE()-twoGammaCandidate->GetPz())));
\r
976 if(openingAngleTwoGammaCandidate < fMinOpeningAngleGhostCut) continue; // minimum opening angle to avoid using ghosttracks
\r
978 fHistograms->FillHistogram("ESD_Mother_GammaDaughter_OpeningAngle", openingAngleTwoGammaCandidate);
\r
979 fHistograms->FillHistogram("ESD_Mother_Energy", twoGammaCandidate->GetE());
\r
980 fHistograms->FillHistogram("ESD_Mother_Pt", momentumVectorTwoGammaCandidate.Pt());
\r
981 fHistograms->FillHistogram("ESD_Mother_Eta", momentumVectorTwoGammaCandidate.Eta());
\r
982 fHistograms->FillHistogram("ESD_Mother_Rapid", rapidity);
\r
983 fHistograms->FillHistogram("ESD_Mother_Phi", spaceVectorTwoGammaCandidate.Phi());
\r
984 fHistograms->FillHistogram("ESD_Mother_Mass", massTwoGammaCandidate);
\r
985 fHistograms->FillHistogram("ESD_Mother_R", spaceVectorTwoGammaCandidate.Pt()); // Pt in Space == R!!!
\r
986 fHistograms->FillHistogram("ESD_Mother_ZR", twoGammaCandidate->GetZ(), spaceVectorTwoGammaCandidate.Pt());
\r
987 fHistograms->FillHistogram("ESD_Mother_XY", twoGammaCandidate->GetX(), twoGammaCandidate->GetY());
\r
988 fHistograms->FillHistogram("ESD_Mother_InvMass_vs_Pt",massTwoGammaCandidate ,momentumVectorTwoGammaCandidate.Pt());
\r
989 fHistograms->FillHistogram("ESD_Mother_InvMass",massTwoGammaCandidate);
\r
992 delete twoGammaCandidate;
\r
994 //cout << "nearly at the end of processgamma for neutral meson ..." << endl;
\r
1001 void AliAnalysisTaskGammaConversion::CalculateBackground(){
\r
1002 // see header file for documentation
\r
1004 vector<AliKFParticle> vectorCurrentEventGoodV0s = fV0Reader->GetCurrentEventGoodV0s();
\r
1005 vector<AliKFParticle> vectorPreviousEventGoodV0s = fV0Reader->GetPreviousEventGoodV0s();
\r
1006 for(UInt_t iCurrent=0;iCurrent<vectorCurrentEventGoodV0s.size();iCurrent++){
\r
1007 AliKFParticle * currentEventGoodV0 = &vectorCurrentEventGoodV0s.at(iCurrent);
\r
1008 for(UInt_t iPrevious=0;iPrevious<vectorPreviousEventGoodV0s.size();iPrevious++){
\r
1009 AliKFParticle * previousGoodV0 = &vectorPreviousEventGoodV0s.at(iPrevious);
\r
1011 AliKFParticle *backgroundCandidate = new AliKFParticle(*currentEventGoodV0,*previousGoodV0);
\r
1013 Double_t massBG =0.;
\r
1014 Double_t widthBG = 0.;
\r
1015 Double_t chi2BG =10000.;
\r
1016 backgroundCandidate->GetMass(massBG,widthBG);
\r
1017 if(backgroundCandidate->GetNDF()>0){
\r
1018 chi2BG = backgroundCandidate->GetChi2()/backgroundCandidate->GetNDF();
\r
1019 if(chi2BG>0 && chi2BG<fV0Reader->GetChi2CutMeson()){
\r
1021 TVector3 MomentumVectorbackgroundCandidate(backgroundCandidate->GetPx(),backgroundCandidate->GetPy(),backgroundCandidate->GetPz());
\r
1022 TVector3 SpaceVectorbackgroundCandidate(backgroundCandidate->GetX(),backgroundCandidate->GetY(),backgroundCandidate->GetZ());
\r
1024 Double_t openingAngleBG = currentEventGoodV0->GetAngle(*previousGoodV0);
\r
1026 Double_t rapidity;
\r
1027 if(backgroundCandidate->GetE() - backgroundCandidate->GetPz() == 0 || backgroundCandidate->GetE() + backgroundCandidate->GetPz() == 0) rapidity=0;
\r
1028 else rapidity = 0.5*(TMath::Log((backgroundCandidate->GetE() +backgroundCandidate->GetPz()) / (backgroundCandidate->GetE()-backgroundCandidate->GetPz())));
\r
1033 if(openingAngleBG < fMinOpeningAngleGhostCut ) continue; // minimum opening angle to avoid using ghosttracks
\r
1036 fHistograms->FillHistogram("ESD_Background_GammaDaughter_OpeningAngle", openingAngleBG);
\r
1037 fHistograms->FillHistogram("ESD_Background_Energy", backgroundCandidate->GetE());
\r
1038 fHistograms->FillHistogram("ESD_Background_Pt", MomentumVectorbackgroundCandidate.Pt());
\r
1039 fHistograms->FillHistogram("ESD_Background_Eta", MomentumVectorbackgroundCandidate.Eta());
\r
1040 fHistograms->FillHistogram("ESD_Background_Rapidity", rapidity);
\r
1041 fHistograms->FillHistogram("ESD_Background_Phi", SpaceVectorbackgroundCandidate.Phi());
\r
1042 fHistograms->FillHistogram("ESD_Background_Mass", massBG);
\r
1043 fHistograms->FillHistogram("ESD_Background_R", SpaceVectorbackgroundCandidate.Pt()); // Pt in Space == R!!!!
\r
1044 fHistograms->FillHistogram("ESD_Background_ZR", backgroundCandidate->GetZ(), SpaceVectorbackgroundCandidate.Pt());
\r
1045 fHistograms->FillHistogram("ESD_Background_XY", backgroundCandidate->GetX(), backgroundCandidate->GetY());
\r
1046 fHistograms->FillHistogram("ESD_Background_InvMass_vs_Pt",massBG,MomentumVectorbackgroundCandidate.Pt());
\r
1047 fHistograms->FillHistogram("ESD_Background_InvMass",massBG);
\r
1050 delete backgroundCandidate;
\r
1051 //cout << "nearly at the end of background" << endl;
\r
1057 void AliAnalysisTaskGammaConversion::Terminate(Option_t */*option*/)
\r
1059 // Terminate analysis
\r
1061 AliDebug(1,"Do nothing in Terminate");
\r
1064 void AliAnalysisTaskGammaConversion::UserCreateOutputObjects()
\r
1066 // Create the output container
\r
1067 if(fOutputContainer != NULL){
\r
1068 delete fOutputContainer;
\r
1069 fOutputContainer = NULL;
\r
1071 if(fOutputContainer == NULL){
\r
1072 fOutputContainer = new TList();
\r
1075 //Adding the histograms to the output container
\r
1076 fHistograms->GetOutputContainer(fOutputContainer);
\r
1080 if(fGammaNtuple == NULL){
\r
1081 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);
\r
1083 if(fNeutralMesonNtuple == NULL){
\r
1084 fNeutralMesonNtuple = new TNtuple("NeutralMesonNtuple","NeutralMesonNtuple","test");
\r
1086 TList * ntupleTList = new TList();
\r
1087 ntupleTList->SetName("Ntuple");
\r
1088 ntupleTList->Add((TNtuple*)fGammaNtuple);
\r
1089 fOutputContainer->Add(ntupleTList);
\r
1092 fOutputContainer->SetName(GetName());
\r
1095 Double_t AliAnalysisTaskGammaConversion::GetMCOpeningAngle(TParticle* const daughter0, TParticle* const daughter1) const{
\r
1097 TVector3 v3D0(daughter0->Px(),daughter0->Py(),daughter0->Pz());
\r
1098 TVector3 v3D1(daughter1->Px(),daughter1->Py(),daughter1->Pz());
\r
1099 return v3D0.Angle(v3D1);
\r
1102 void AliAnalysisTaskGammaConversion::CheckV0Efficiency(){
\r
1103 // see header file for documentation
\r
1105 vector<Int_t> indexOfGammaParticle;
\r
1107 fStack = fV0Reader->GetMCStack();
\r
1109 if(fV0Reader->CheckForPrimaryVertex() == kFALSE){
\r
1110 return; // aborts if the primary vertex does not have contributors.
\r
1113 for (Int_t iTracks = 0; iTracks < fStack->GetNprimary(); iTracks++) {
\r
1114 TParticle* particle = (TParticle *)fStack->Particle(iTracks);
\r
1115 if(particle->GetPdgCode()==22){ //Gamma
\r
1116 if(particle->GetNDaughters() >= 2){
\r
1117 TParticle* electron=NULL;
\r
1118 TParticle* positron=NULL;
\r
1119 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
\r
1120 TParticle *tmpDaughter = fStack->Particle(daughterIndex);
\r
1121 if(tmpDaughter->GetUniqueID() == 5){
\r
1122 if(tmpDaughter->GetPdgCode() == 11){
\r
1123 electron = tmpDaughter;
\r
1125 else if(tmpDaughter->GetPdgCode() == -11){
\r
1126 positron = tmpDaughter;
\r
1130 if(electron!=NULL && positron!=0){
\r
1131 if(electron->R()<160){
\r
1132 indexOfGammaParticle.push_back(iTracks);
\r
1139 Int_t nFoundGammas=0;
\r
1140 Int_t nNotFoundGammas=0;
\r
1142 Int_t numberOfV0s = fV0Reader->GetNumberOfV0s();
\r
1143 for(Int_t i=0;i<numberOfV0s;i++){
\r
1144 fV0Reader->GetV0(i);
\r
1146 if(fV0Reader->HasSameMCMother() == kFALSE){
\r
1150 TParticle * negativeMC = (TParticle*)fV0Reader->GetNegativeMCParticle();
\r
1151 TParticle * positiveMC = (TParticle*)fV0Reader->GetPositiveMCParticle();
\r
1153 if(TMath::Abs(negativeMC->GetPdgCode())!=11 || TMath::Abs(positiveMC->GetPdgCode())!=11){
\r
1156 if(negativeMC->GetPdgCode()==positiveMC->GetPdgCode()){
\r
1160 if(fV0Reader->GetMotherMCParticle()->GetPdgCode() == 22){
\r
1161 //TParticle * v0Gamma = fV0Reader->GetMotherMCParticle();
\r
1162 for(UInt_t mcIndex=0;mcIndex<indexOfGammaParticle.size();mcIndex++){
\r
1163 if(negativeMC->GetFirstMother()==indexOfGammaParticle[mcIndex]){
\r
1167 nNotFoundGammas++;
\r
1172 // cout<<"Found: "<<nFoundGammas<<" of: "<<indexOfGammaParticle.size()<<endl;
\r
1176 void AliAnalysisTaskGammaConversion::ProcessGammaElectronsForChicAnalysis(){
\r
1177 // see header file for documantation
\r
1179 fESDEvent = fV0Reader->GetESDEvent();
\r
1182 vector <AliESDtrack*> vESDeNegTemp(0);
\r
1183 vector <AliESDtrack*> vESDePosTemp(0);
\r
1184 vector <AliESDtrack*> vESDxNegTemp(0);
\r
1185 vector <AliESDtrack*> vESDxPosTemp(0);
\r
1186 vector <AliESDtrack*> vESDeNegNoJPsi(0);
\r
1187 vector <AliESDtrack*> vESDePosNoJPsi(0);
\r
1191 fHistograms->FillTable("Table_Electrons",0);//Count number of Events
\r
1193 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
\r
1194 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
\r
1197 //print warning here
\r
1201 double p[3];if(!curTrack->GetConstrainedPxPyPz(p))continue;
\r
1202 double r[3];curTrack->GetConstrainedXYZ(r);
\r
1206 fHistograms->FillTable("Table_Electrons",4);//Count number of ESD tracks
\r
1208 Bool_t flagKink = kTRUE;
\r
1209 Bool_t flagTPCrefit = kTRUE;
\r
1210 Bool_t flagTRDrefit = kTRUE;
\r
1211 Bool_t flagITSrefit = kTRUE;
\r
1212 Bool_t flagTRDout = kTRUE;
\r
1213 Bool_t flagVertex = kTRUE;
\r
1216 //Cuts ---------------------------------------------------------------
\r
1218 if(curTrack->GetKinkIndex(0) > 0){
\r
1219 fHistograms->FillHistogram("Table_Electrons",5);//Count kink
\r
1220 flagKink = kFALSE;
\r
1223 ULong_t trkStatus = curTrack->GetStatus();
\r
1225 ULong_t tpcRefit = (trkStatus & AliESDtrack::kTPCrefit);
\r
1228 fHistograms->FillHistogram("Table_Electrons",9);//Count not TPCrefit
\r
1229 flagTPCrefit = kFALSE;
\r
1232 ULong_t itsRefit = (trkStatus & AliESDtrack::kITSrefit);
\r
1234 fHistograms->FillHistogram("Table_Electrons",10);//Count not ITSrefit
\r
1235 flagITSrefit = kFALSE;
\r
1238 ULong_t trdRefit = (trkStatus & AliESDtrack::kTRDrefit);
\r
1241 fHistograms->FillHistogram("Table_Electrons",8); //Count not TRDrefit
\r
1242 flagTRDrefit = kFALSE;
\r
1245 ULong_t trdOut = (trkStatus & AliESDtrack::kTRDout);
\r
1248 fHistograms->FillHistogram("Table_Electrons",7); //Count not TRDout
\r
1249 flagTRDout = kFALSE;
\r
1252 double nsigmaToVxt = GetSigmaToVertex(curTrack);
\r
1254 if(nsigmaToVxt > 3){
\r
1255 fHistograms->FillHistogram("Table_Electrons",6); //Count Tracks with number of sigmas > 3
\r
1256 flagVertex = kFALSE;
\r
1259 if(! (flagKink && flagTPCrefit && flagITSrefit && flagTRDrefit && flagTRDout && flagVertex ) ) continue;
\r
1260 fHistograms->FillHistogram("Table_Electrons",11);//Count Tracks passed Cuts
\r
1263 Stat_t pid, weight;
\r
1264 GetPID(curTrack, pid, weight);
\r
1267 fHistograms->FillHistogram("Table_Electrons",12); //Count Tracks with pid != 0
\r
1271 fHistograms->FillHistogram("Table_Electrons",13); //Count Tracks with pid != 0
\r
1277 Int_t labelMC = TMath::Abs(curTrack->GetLabel());
\r
1278 TParticle* curParticle = fStack->Particle(labelMC);
\r
1283 TLorentzVector curElec;
\r
1284 curElec.SetXYZM(p[0],p[1],p[2],fElectronMass);
\r
1289 if(curTrack->GetSign() > 0){
\r
1291 vESDxPosTemp.push_back(curTrack);
\r
1295 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
\r
1296 fHistograms->FillHistogram("ESD_ElectronPosPt",curElec.Pt());
\r
1297 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
\r
1298 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
\r
1299 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
\r
1300 vESDePosTemp.push_back(curTrack);
\r
1308 vESDxNegTemp.push_back(curTrack);
\r
1312 fHistograms->FillHistogram("ESD_ElectronPosNegPt",curElec.Pt());
\r
1313 fHistograms->FillHistogram("ESD_ElectronNegPt",curElec.Pt());
\r
1314 fHistograms->FillHistogram("MC_ElectronPosNegPt",curParticle->Pt());
\r
1315 fHistograms->FillHistogram("ESD_ElectronPosNegEta",curElec.Eta());
\r
1316 fHistograms->FillHistogram("MC_ElectronPosNegEta",curParticle->Eta());
\r
1317 vESDeNegTemp.push_back(curTrack);
\r
1328 Bool_t ePosJPsi = kFALSE;
\r
1329 Bool_t eNegJPsi = kFALSE;
\r
1330 Bool_t ePosPi0 = kFALSE;
\r
1331 Bool_t eNegPi0 = kFALSE;
\r
1333 UInt_t iePosJPsi=0,ieNegJPsi=0,iePosPi0=0,ieNegPi0=0;
\r
1335 for(UInt_t iNeg=0; iNeg < vESDeNegTemp.size(); iNeg++){
\r
1336 if(fStack->Particle(TMath::Abs(vESDeNegTemp[iNeg]->GetLabel()))->GetPdgCode() == 11)
\r
1337 if(fStack->Particle(TMath::Abs(vESDeNegTemp[iNeg]->GetLabel()))->GetMother(0) > -1){
\r
1338 Int_t labelMother = fStack->Particle(TMath::Abs(vESDeNegTemp[iNeg]->GetLabel()))->GetMother(0);
\r
1339 TParticle* partMother = fStack ->Particle(labelMother);
\r
1340 if (partMother->GetPdgCode() == 111){
\r
1344 if(partMother->GetPdgCode() == 443){ //Mother JPsi
\r
1345 fHistograms->FillTable("Table_Electrons",14);
\r
1350 vESDeNegNoJPsi.push_back(vESDeNegTemp[iNeg]);
\r
1351 // cout<<"ESD No Positivo JPsi "<<endl;
\r
1357 for(UInt_t iPos=0; iPos < vESDePosTemp.size(); iPos++){
\r
1358 if(fStack->Particle(TMath::Abs(vESDePosTemp[iPos]->GetLabel()))->GetPdgCode() == -11)
\r
1359 if(fStack->Particle(TMath::Abs(vESDePosTemp[iPos]->GetLabel()))->GetMother(0) > -1){
\r
1360 Int_t labelMother = fStack->Particle(TMath::Abs(vESDePosTemp[iPos]->GetLabel()))->GetMother(0);
\r
1361 TParticle* partMother = fStack ->Particle(labelMother);
\r
1362 if (partMother->GetPdgCode() == 111){
\r
1366 if(partMother->GetPdgCode() == 443){ //Mother JPsi
\r
1367 fHistograms->FillTable("Table_Electrons",15);
\r
1372 vESDePosNoJPsi.push_back(vESDePosTemp[iPos]);
\r
1373 // cout<<"ESD No Negativo JPsi "<<endl;
\r
1379 if( eNegJPsi && ePosJPsi ){
\r
1380 TVector3 tempeNegV,tempePosV;
\r
1381 tempeNegV.SetXYZ(vESDeNegTemp[ieNegJPsi]->Px(),vESDeNegTemp[ieNegJPsi]->Py(),vESDeNegTemp[ieNegJPsi]->Pz());
\r
1382 tempePosV.SetXYZ(vESDePosTemp[iePosJPsi]->Px(),vESDePosTemp[iePosJPsi]->Py(),vESDePosTemp[iePosJPsi]->Pz());
\r
1383 fHistograms->FillTable("Table_Electrons",16);
\r
1384 fHistograms->FillHistogram("ESD_ElectronPosNegJPsiAngle",tempeNegV.Angle(tempePosV));
\r
1385 fHistograms->FillHistogram("MC_ElectronPosNegJPsiAngle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(vESDeNegTemp[ieNegJPsi]->GetLabel())),
\r
1386 fStack->Particle(TMath::Abs(vESDePosTemp[iePosJPsi]->GetLabel()))));
\r
1389 if( eNegPi0 && ePosPi0 ){
\r
1390 TVector3 tempeNegV,tempePosV;
\r
1391 tempeNegV.SetXYZ(vESDeNegTemp[ieNegPi0]->Px(),vESDeNegTemp[ieNegPi0]->Py(),vESDeNegTemp[ieNegPi0]->Pz());
\r
1392 tempePosV.SetXYZ(vESDePosTemp[iePosPi0]->Px(),vESDePosTemp[iePosPi0]->Py(),vESDePosTemp[iePosPi0]->Pz());
\r
1393 fHistograms->FillHistogram("ESD_ElectronPosNegPi0Angle",tempeNegV.Angle(tempePosV));
\r
1394 fHistograms->FillHistogram("MC_ElectronPosNegPi0Angle",GetMCOpeningAngle(fStack->Particle(TMath::Abs(vESDeNegTemp[ieNegPi0]->GetLabel())),
\r
1395 fStack->Particle(TMath::Abs(vESDePosTemp[iePosPi0]->GetLabel()))));
\r
1399 FillAngle("ESD_eNegePosAngleBeforeCut",GetTLorentzVector(vESDeNegTemp),GetTLorentzVector(vESDePosTemp));
\r
1401 CleanWithAngleCuts(vESDeNegTemp,vESDePosTemp,fKFReconstructedGammas);
\r
1403 vector <TLorentzVector> vCurrentTLVeNeg = GetTLorentzVector(fCurrentEventNegElectron);
\r
1404 vector <TLorentzVector> vCurrentTLVePos = GetTLorentzVector(fCurrentEventPosElectron);
\r
1407 FillAngle("ESD_eNegePosAngleAfterCut",vCurrentTLVeNeg,vCurrentTLVePos);
\r
1412 //FillAngle("ESD_eNegePosAngleAfterCut",CurrentTLVeNeg,CurrentTLVePos);
\r
1415 FillElectronInvMass("ESD_InvMass_ePluseMinus",vCurrentTLVeNeg,vCurrentTLVePos);
\r
1416 FillElectronInvMass("ESD_InvMass_xPlusxMinus",GetTLorentzVector(vESDxNegTemp),GetTLorentzVector(vESDxPosTemp));
\r
1420 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusChiC","ESD_InvMass_GammaePluseMinusChiCDiff",
\r
1421 fKFReconstructedGammasCut,vCurrentTLVeNeg,vCurrentTLVePos);
\r
1423 FillGammaElectronInvMass("ESD_InvMass_GammaePluseMinusPi0","ESD_InvMass_GammaePluseMinusPi0Diff",
\r
1424 fKFReconstructedGammasCut,vCurrentTLVeNeg,vCurrentTLVePos);
\r
1429 ElectronBackground("ESD_ENegBackground",vCurrentTLVeNeg);
\r
1430 ElectronBackground("ESD_EPosBackground",vCurrentTLVePos);
\r
1431 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVeNeg);
\r
1432 ElectronBackground("ESD_EPosENegBackground",vCurrentTLVePos);
\r
1434 // Like Sign e+e- no JPsi
\r
1435 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDeNegNoJPsi));
\r
1436 ElectronBackground("ESD_EPosENegNoJPsiBG",GetTLorentzVector(vESDePosNoJPsi));
\r
1440 if( fCurrentEventPosElectron.size() > 0 && fCurrentEventNegElectron.size() > 0 && fKFReconstructedGammasCut.size() > 0 ){
\r
1441 FillGammaElectronInvMass("ESD_EPosENegGammaBackgroundMX","ESD_EPosENegGammaBackgroundMXDiff",
\r
1442 fKFReconstructedGammasCut,fPreviousEventTLVNegElectron,fPreviousEventTLVPosElectron);
\r
1443 fPreviousEventTLVNegElectron = vCurrentTLVeNeg;
\r
1444 fPreviousEventTLVPosElectron = vCurrentTLVePos;
\r
1451 vtx[0]=0;vtx[1]=0;vtx[2]=0;
\r
1452 for(UInt_t i=0;i<fKFReconstructedGammasChic.size();i++){
\r
1454 // if(fMCGammaChicTempCut[i]->GetMother(0) < 0) continue;
\r
1458 Int_t tempLabel = fStack->Particle(fMCGammaChicTempCut[i]->GetMother(0))->GetPdgCode();
\r
1459 // cout<<" Label Pedro Gonzalez " <<tempLabel <<endl;
\r
1461 // cout<<" Label Distance"<<fKFReconstructedGammasChic[i].GetDistanceFromVertex(vtx)<<endl;
\r
1463 if( tempLabel == 10441 || tempLabel == 20443 || tempLabel == 445 )
\r
1465 fHistograms->FillHistogram("ESD_PhotonsMomentum",fKFReconstructedGammasChic[i].GetMomentum());
\r
1476 void AliAnalysisTaskGammaConversion::FillAngle(TString histoName,vector <TLorentzVector> tlVeNeg, vector <TLorentzVector> tlVePos){
\r
1477 //see header file for documentation
\r
1478 for( UInt_t iNeg=0; iNeg < tlVeNeg.size(); iNeg++){
\r
1479 for (UInt_t iPos=0; iPos < tlVePos.size(); iPos++){
\r
1480 fHistograms->FillHistogram(histoName.Data(),tlVeNeg[iNeg].Vect().Angle(tlVePos[iPos].Vect()));
\r
1484 void AliAnalysisTaskGammaConversion::FillElectronInvMass(TString histoName, vector <TLorentzVector> eNeg, vector <TLorentzVector> ePos){
\r
1485 //see header file for documentation
\r
1486 for( UInt_t n=0; n < eNeg.size(); n++){
\r
1488 TLorentzVector en = eNeg.at(n);
\r
1489 for (UInt_t p=0; p < ePos.size(); p++){
\r
1490 TLorentzVector ep = ePos.at(p);
\r
1491 TLorentzVector np = ep + en;
\r
1492 fHistograms->FillHistogram(histoName.Data(),np.M());
\r
1498 void AliAnalysisTaskGammaConversion::FillGammaElectronInvMass(TString histoMass,TString histoDiff,vector <AliKFParticle> fKFGammas,
\r
1499 vector <TLorentzVector> tlVeNeg,vector<TLorentzVector> tlVePos)
\r
1501 //see header file for documentation
\r
1503 for( UInt_t iNeg=0; iNeg < tlVeNeg.size(); iNeg++ ){
\r
1505 for (UInt_t iPos=0; iPos < tlVePos.size(); iPos++){
\r
1507 TLorentzVector xy = tlVePos[iPos] + tlVeNeg[iNeg];
\r
1509 for (UInt_t iGam=0; iGam < fKFGammas.size(); iGam++){
\r
1511 AliKFParticle * gammaCandidate = &fKFGammas[iGam];
\r
1514 g.SetXYZM(gammaCandidate->GetPx(),gammaCandidate->GetPy(),gammaCandidate->GetPz(),fGammaMass);
\r
1515 TLorentzVector xyg = xy + g;
\r
1516 fHistograms->FillHistogram(histoMass.Data(),xyg.M());
\r
1517 fHistograms->FillHistogram(histoDiff.Data(),(xyg.M()-xy.M()));
\r
1523 void AliAnalysisTaskGammaConversion::ElectronBackground(TString hBg, vector <TLorentzVector> e)
\r
1525 // see header file for documentation
\r
1526 for(UInt_t i=0; i < e.size(); i++)
\r
1528 for (UInt_t j=i+1; j < e.size(); j++)
\r
1530 TLorentzVector ee = e[i] + e[j];
\r
1532 fHistograms->FillHistogram(hBg.Data(),ee.M());
\r
1538 void AliAnalysisTaskGammaConversion::CleanWithAngleCuts(vector <AliESDtrack*> negativeElectrons,
\r
1539 vector <AliESDtrack*> positiveElectrons, vector <AliKFParticle> gammas){
\r
1540 // see header file for documentation
\r
1542 UInt_t sizeN = negativeElectrons.size();
\r
1543 UInt_t sizeP = positiveElectrons.size();
\r
1544 UInt_t sizeG = gammas.size();
\r
1548 vector <Bool_t> xNegBand(sizeN);
\r
1549 vector <Bool_t> xPosBand(sizeP);
\r
1550 vector <Bool_t> gammaBand(sizeG);
\r
1553 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++) xNegBand[iNeg]=kTRUE;
\r
1554 for(UInt_t iPos=0; iPos < sizeP; iPos++) xPosBand[iPos]=kTRUE;
\r
1555 for(UInt_t iGam=0; iGam < sizeG; iGam++) gammaBand[iGam]=kTRUE;
\r
1558 for(UInt_t iPos=0; iPos < sizeP; iPos++){
\r
1560 Double_t aP[3]; positiveElectrons[iPos]->GetConstrainedPxPyPz(aP);
\r
1562 TVector3 ePosV(aP[0],aP[1],aP[2]);
\r
1564 for(UInt_t iNeg=0; iNeg < sizeN; iNeg++){
\r
1566 Double_t aN[3]; negativeElectrons[iNeg]->GetConstrainedPxPyPz(aN);
\r
1567 TVector3 eNegV(aN[0],aN[1],aN[2]);
\r
1569 if(ePosV.Angle(eNegV) < 0.05){ //e+e- from gamma
\r
1570 xPosBand[iPos]=kFALSE;
\r
1571 xNegBand[iNeg]=kFALSE;
\r
1574 for(UInt_t iGam=0; iGam < sizeG; iGam++){
\r
1575 AliKFParticle* gammaCandidate = &gammas[iGam];
\r
1576 TVector3 gammaCandidateVector(gammaCandidate->Px(),gammaCandidate->Py(),gammaCandidate->Pz());
\r
1577 if(ePosV.Angle(gammaCandidateVector) < 0.05 || eNegV.Angle(gammaCandidateVector) < 0.05)
\r
1578 gammaBand[iGam]=kFALSE;
\r
1586 for(UInt_t iPos=0; iPos < sizeP; iPos++){
\r
1587 if(xPosBand[iPos]){
\r
1588 fCurrentEventPosElectron.push_back(positiveElectrons[iPos]);
\r
1591 for(UInt_t iNeg=0;iNeg < sizeN; iNeg++){
\r
1592 if(xNegBand[iNeg]){
\r
1593 fCurrentEventNegElectron.push_back(negativeElectrons[iNeg]);
\r
1596 for(UInt_t iGam=0; iGam < sizeG; iGam++){
\r
1597 if(gammaBand[iGam]){
\r
1598 fKFReconstructedGammasCut.push_back(gammas[iGam]);
\r
1604 void AliAnalysisTaskGammaConversion::GetPID(AliESDtrack *track, Stat_t &pid, Stat_t &weight)
\r
1606 // see header file for documentation
\r
1611 double wpartbayes[5];
\r
1613 //get probability of the diffenrent particle types
\r
1614 track->GetESDpid(wpart);
\r
1616 // Tentative particle type "concentrations"
\r
1617 double c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
\r
1621 for (int i = 0; i < 5; i++)
\r
1623 rcc+=(c[i] * wpart[i]);
\r
1628 for (int i=0; i<5; i++) {
\r
1630 wpartbayes[i] = c[i] * wpart[i] / rcc;
\r
1638 //find most probable particle in ESD pid
\r
1639 //0:Electron - 1:Muon - 2:Pion - 3:Kaon - 4:Proton
\r
1640 for (int i = 0; i < 5; i++)
\r
1642 if (wpartbayes[i] > max)
\r
1645 max = wpartbayes[i];
\r
1652 double AliAnalysisTaskGammaConversion::GetSigmaToVertex(AliESDtrack* t)
\r
1654 // Calculates the number of sigma to the vertex.
\r
1659 t->GetImpactParameters(b,bCov);
\r
1660 if (bCov[0]<=0 || bCov[2]<=0) {
\r
1661 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
1662 bCov[0]=0; bCov[2]=0;
\r
1664 bRes[0] = TMath::Sqrt(bCov[0]);
\r
1665 bRes[1] = TMath::Sqrt(bCov[2]);
\r
1667 // -----------------------------------
\r
1668 // How to get to a n-sigma cut?
\r
1670 // The accumulated statistics from 0 to d is
\r
1672 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
\r
1673 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
\r
1675 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
\r
1676 // Can this be expressed in a different way?
\r
1678 if (bRes[0] == 0 || bRes[1] ==0)
\r
1681 double d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
\r
1683 // stupid rounding problem screws up everything:
\r
1684 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
\r
1685 if (TMath::Exp(-d * d / 2) < 1e-10)
\r
1689 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
\r
1692 vector <TLorentzVector> AliAnalysisTaskGammaConversion::GetTLorentzVector(vector <AliESDtrack*> esdTrack){
\r
1694 vector <TLorentzVector> tlVtrack(0);
\r
1696 for(UInt_t itrack=0; itrack < esdTrack.size(); itrack++){
\r
1697 double P[3]; esdTrack[itrack]->GetConstrainedPxPyPz(P);
\r
1698 TLorentzVector currentTrack;
\r
1699 currentTrack.SetXYZM(P[0],P[1],P[2],fElectronMass);
\r
1700 tlVtrack.push_back(currentTrack);
\r