13 #include "AliAnalysisTask.h"
14 #include "AliAnalysisManager.h"
16 #include "AliESDEvent.h"
17 #include "AliESDHeader.h"
18 #include "AliESDUtils.h"
19 #include "AliESDInputHandler.h"
20 #include "AliCentrality.h"
21 #include "AliESDpid.h"
22 #include "AliKFParticle.h"
24 #include "AliMCEventHandler.h"
25 #include "AliMCEvent.h"
27 #include "TParticle.h"
28 #include "AliAODMCParticle.h"
31 #include "AliESDtrackCuts.h"
33 #include "AliV0vertexer.h"
34 #include "AliESDCaloCluster.h"
35 #include "AliESDCaloCells.h"
36 #include "AliAODEvent.h"
37 #include "AliEMCALGeometry.h"
38 #include "AliEMCALRecoUtils.h"
39 #include "AliOADBContainer.h"
40 #include "AliVEvent.h"
41 #include "AliVVertex.h"
42 #include "AliVCluster.h"
43 #include "AliVCaloCells.h"
44 #include "AliAnalysisTaskEMCALClusterizeFast.h"
45 #include "TLorentzVector.h"
48 #include "AliAnalysisTaskEMCALPhoton.h"
55 ClassImp(AliAnalysisTaskEMCALPhoton)
57 //________________________________________________________________________
58 AliAnalysisTaskEMCALPhoton::AliAnalysisTaskEMCALPhoton() :
80 fGeoName("EMCAL_COMPLETEV1"),
89 fCaloClustersName("EmcalClusterv2"),
98 fNV0sBefAndAftRerun(0),
105 // Default constructor.
106 for(Int_t i = 0; i < 12; i++) fGeomMatrix[i] = 0;
109 //________________________________________________________________________
110 AliAnalysisTaskEMCALPhoton::AliAnalysisTaskEMCALPhoton(const char *name) :
111 AliAnalysisTaskSE(name),
132 fGeoName("EMCAL_COMPLETEV1"),
141 fCaloClustersName("EmcalClusterv2"),
150 fNV0sBefAndAftRerun(0),
159 // Define input and output slots here
160 // Input slot #0 works with a TChain
161 DefineInput(0, TChain::Class());
162 // Output slot #0 id reserved by the base class for AOD
163 // Output slot #1 writes into a TH1 container
164 DefineOutput(1, TList::Class());
165 DefineOutput(2, TTree::Class());
168 //________________________________________________________________________
169 void AliAnalysisTaskEMCALPhoton::UserCreateOutputObjects()
171 // Create histograms, called once.
173 printf("::UserCreateOutputObjects() starting\n");
175 fSelTracks = new TObjArray();
177 fSelPrimTracks = new TObjArray();
179 if (TClass::GetClass("AliPhotonHeaderObj"))
180 TClass::GetClass("AliPhotonHeaderObj")->IgnoreTObjectStreamer();
181 fHeader = new AliPhotonHeaderObj;
183 if (TClass::GetClass("AliPhotonConvObj"))
184 TClass::GetClass("AliPhotonConvObj")->IgnoreTObjectStreamer();
185 fPhotConvArray = new TClonesArray("AliPhotonConvObj");
187 if (TClass::GetClass("AliPhotonClusterObj"))
188 TClass::GetClass("AliPhotonClusterObj")->IgnoreTObjectStreamer();
189 fMyClusts = new TClonesArray("AliPhotonClusterObj");
191 if (TClass::GetClass("AliPhotonCellObj"))
192 TClass::GetClass("AliPhotonCellObj")->IgnoreTObjectStreamer();
193 fMyCells = new TClonesArray("AliPhotonCellObj");
195 if (TClass::GetClass("AliPhotonTrackObj"))
196 TClass::GetClass("AliPhotonTrackObj")->IgnoreTObjectStreamer();
197 fMyTracks = new TClonesArray("AliPhotonTrackObj");
199 if (fClusterizer || fIsTrain){
201 fCaloClustersName = fClusterizer->GetNewClusterArrayName();
203 if(fPeriod.Contains("10h") || fPeriod.Contains("11h"))
204 fCaloClustersName = "EmcalClustersv1";
206 fCaloClustersName = "EmcalClustersv2";
208 if (TClass::GetClass("AliPhotonClusterObj"))
209 TClass::GetClass("AliPhotonClusterObj")->IgnoreTObjectStreamer();
210 fMyAltClusts = new TClonesArray("AliPhotonClusterObj");
212 cout<<fCaloClustersName<<endl;
214 if (TClass::GetClass("AliPhotonMcPartObj"))
215 TClass::GetClass("AliPhotonMcPartObj")->IgnoreTObjectStreamer();
216 fMyMcParts = new TClonesArray("AliPhotonMcPartObj");
219 fCaloClusters = new TClonesArray();
221 fOutputList = new TList();
222 fOutputList->SetOwner();// Container cleans up all histos (avoids leaks in merging)
225 TFile *f = OpenFile(2);
226 TDirectory::TContext context(f);
228 f->SetCompressionLevel(2);
229 fTree = new TTree("photon_ana_out", "StandaloneTree");
230 fTree->SetDirectory(f);
232 fTree->SetAutoFlush(-2*1024*1024);
233 fTree->SetAutoSave(0);
235 fTree->SetAutoFlush(-32*1024*1024);
236 fTree->SetAutoSave(0);
239 fTree->Branch("header", &fHeader, 16*1024, 99);
240 fTree->Branch("conversions", &fPhotConvArray, 8*16*1024, 99);
241 fTree->Branch("clusters", &fMyClusts, 8*16*1024, 99);
242 if(fClusterizer || fIsTrain)
243 fTree->Branch(fCaloClustersName, &fMyAltClusts, 8*16*1024, 99);
244 fTree->Branch("cells", &fMyCells, 8*16*1024, 99);
245 fTree->Branch("IsoTracks", &fMyTracks, 8*16*1024, 99);
247 fTree->Branch("mcparts", &fMyMcParts, 8*16*1024, 99);
250 //if(fIsGrid)fOutputList->Add(fTree);
251 fGeom = AliEMCALGeometry::GetInstance(fGeoName);
252 fOADBContainer = new AliOADBContainer("AliEMCALgeo");
253 fOADBContainer->InitFromFile(Form("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root"),"AliEMCALgeo");
256 fNV0sBefAndAftRerun = new TH2F("hNV0sBefAndAftRerun","check if the number of v0s change with rerun;old v0 n;new v0 n",50,0.5,50.5,50,0.5,50.5);
257 fOutputList->Add(fNV0sBefAndAftRerun);
259 fConversionVtxXY = new TH2F("hConversionVtxXY","x and y of conversion vertex candidates;x;y",1000,-100,100,1000,-100,100);
260 fOutputList->Add(fConversionVtxXY);
262 fInvMassV0 = new TH1F("hInvMassV0","v0->GetEffMass();v0->GetEffMass();dN/dM",400,0,4);
263 fOutputList->Add(fInvMassV0);
265 fInvMassV0KF = new TH1F("hInvMassV0KF","Inv. mass calculated from AliKFParticle made of V0 tracks;mass_{TrTr};dN/dM",400,0,4);
266 fOutputList->Add(fInvMassV0KF);
268 fInvMassV0SS = new TH1F("hInvMassV0SS","Inv. mass (same sign) calculated from AliKFParticle made of V0 tracks;mass_{TrTr};dN/dM",400,0,4);
269 fOutputList->Add(fInvMassV0SS);
271 fDedxPAll = new TH2F("hDedxPAll","dE/dx vs p (all selected tracks);p (GeV/c);dE/dx (a.u.)",400,0,40, 150,0,150);
272 fOutputList->Add(fDedxPAll);
275 PostData(1, fOutputList);
279 printf("::UserCreateOutputObjects() DONE!\n");
283 //________________________________________________________________________
284 void AliAnalysisTaskEMCALPhoton::UserExec(Option_t *)
286 // User exec, called once per event.
288 Bool_t isSelected = kTRUE;
289 if(fPeriod.Contains("11")){
290 if(fPeriod.Contains("11a"))
291 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC1);
292 if(fPeriod.Contains("11c") ||fPeriod.Contains("11d") )
293 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC7);
294 if(fPeriod.Contains("11h") )
295 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kAny);//kEMCEGA);
301 printf("+++Message+++: MC input files.\n");
305 printf("+++Message+++: Event didn't pass the selection\n");
309 printf("::UserExec(): event accepted\n");
311 printf("\t in MC mode\n");
314 TTree *tree = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetTree();
315 TFile *inpfile = (TFile*)tree->GetCurrentFile();
317 fVev = (AliVEvent*)InputEvent();
319 printf("ERROR: event not available\n");
322 Int_t runnumber = InputEvent()->GetRunNumber() ;
324 printf("run number = %d\n",runnumber);
325 fESD = dynamic_cast<AliESDEvent*>(fVev);
327 fAOD = dynamic_cast<AliAODEvent*>(fVev);
329 printf("ERROR: Invalid type of event!!!\n");
332 else if(this->fDebug)
333 printf("AOD EVENT!\n");
336 AliVVertex *pv = (AliVVertex*)fVev->GetPrimaryVertex();
337 Bool_t pvStatus = kTRUE;
339 AliESDVertex *esdv = (AliESDVertex*)fESD->GetPrimaryVertex();
340 pvStatus = esdv->GetStatus();
344 printf("Error: no primary vertex found!\n");
347 if(!pvStatus && this->fDebug)
348 printf("bad pv status\n");
349 if(TMath::Abs(pv->GetZ())>15)
352 printf("+++Message+++: event passed the vertex cut\n");
355 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("Tracks"));
357 fTracks = dynamic_cast<TClonesArray*>(fAOD->GetTracks());
360 AliError("Track array in event is NULL!");
362 printf("returning due to not finding tracks!\n");
366 const Int_t Ntracks = fTracks->GetEntriesFast();
367 // Track loop to fill a pT spectrum
368 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
369 AliVTrack *track = (AliVTrack*)fTracks->At(iTracks);
372 AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(track);
373 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
375 if (fTrCuts && fTrCuts->IsSelected(track)){
376 fSelTracks->Add(track);
377 fDedxPAll->Fill(track->P(), track->GetTPCsignal());
379 if (fPrTrCuts && fPrTrCuts->IsSelected(track))
380 fSelPrimTracks->Add(track);
383 fSelPrimTracks->Add(track);
388 fHeader->fInputFileName = inpfile->GetName();
389 fHeader->fRunNumber = runnumber;
390 fHeader->fTrClassMask = fVev->GetHeader()->GetTriggerMask();
391 fHeader->fTrCluster = fVev->GetHeader()->GetTriggerCluster();
392 AliCentrality *cent = InputEvent()->GetCentrality();
393 fHeader->fV0Cent = cent->GetCentralityPercentileUnchecked("V0M");
394 fHeader->fCl1Cent = cent->GetCentralityPercentileUnchecked("CL1");
395 fHeader->fTrCent = cent->GetCentralityPercentileUnchecked("TRK");
397 TObjArray *matEMCAL=(TObjArray*)fOADBContainer->GetObject(runnumber,"EmcalMatrices");
398 for(Int_t mod=0; mod < (fGeom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
399 if(fGeoName=="EMCAL_FIRSTYEARV1" && mod>3)
402 fGeom->SetMisalMatrix(fESD->GetEMCALMatrix(mod), mod);
404 // if(event->GetEMCALMatrix(mod))
405 fGeomMatrix[mod] = (TGeoHMatrix*) matEMCAL->At(mod);
406 fGeom->SetMisalMatrix(fGeomMatrix[mod] , mod);
410 AliESDtrackCuts *fTrackCuts = new AliESDtrackCuts();
411 trackMult = fTrackCuts->GetReferenceMultiplicity(fESD);//kTrackletsITSTPC ,0.5);
413 printf("ESD Track mult= %d\n",trackMult);
418 printf("AOD Track mult= %d\n",trackMult);
421 TList *l = fESD->GetList();
422 fCaloClusters = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
423 fVCells = fESD->GetEMCALCells();
424 fHeader->fNCells = fVCells->GetNumberOfCells();
426 printf("ESD cluster mult= %d\n",fCaloClusters->GetEntriesFast());
429 fCaloClusters = dynamic_cast<TClonesArray*>(fAOD->GetCaloClusters());
430 fVCells = fAOD->GetEMCALCells();
431 fHeader->fNCells = fVCells->GetNumberOfCells();
433 printf("AOD cluster mult= %d\n",fCaloClusters->GetEntriesFast());
437 fHeader->fNClus = fCaloClusters->GetEntriesFast();
438 fHeader->fTrackMult = trackMult;
440 fMCEvent = MCEvent();
442 fStack = (AliStack*)fMCEvent->Stack();
444 fHeader->fNMcParts = this->fStack->GetNtrack();
446 printf("Stack not found\n");
447 fHeader->fNMcParts = 0;
448 fAODMCParticles = (TClonesArray*)fVev->FindListObject("mcparticles");
451 fHeader->fNMcParts = fAODMCParticles->GetEntriesFast();
455 printf("ERROR: MC Event not available, returning...\n");
463 printf("FindConversions done\n");
466 printf("FillMyCells done\n");
469 printf("FillMyClusters done\n");
476 if(this->fDebug && fIsMC)
477 printf("fMyMcParts nentries=%d",fMyMcParts->GetEntries());
481 fSelPrimTracks->Clear();
482 fPhotConvArray->Clear();
485 fMyAltClusts->Clear();
491 fCaloClusters->Clear();
493 fCaloClustersNew->Clear();
497 PostData(1, fOutputList);
501 //________________________________________________________________________
502 void AliAnalysisTaskEMCALPhoton::FindConversions() //WARNING: not ready to use with AODs
505 if(!fESD)//not working with AODs yet
508 printf("::FindConversions() starting\n");
514 nV0Orig = fESD->GetNumberOfV0s();
516 nV0Orig = fAOD->GetNumberOfV0s();
517 Int_t nV0s = nV0Orig;
518 Int_t ntracks = fSelTracks->GetEntriesFast();
519 if(fRedoV0 && !fAOD){
521 AliV0vertexer lV0vtxer;
522 lV0vtxer.Tracks2V0vertices(fESD);
523 nV0s = fESD->GetNumberOfV0s();
525 fNV0sBefAndAftRerun->Fill(nV0Orig, nV0s);
526 for(Int_t iv0=0; iv0<nV0s; iv0++){
527 AliESDv0 * v0 = fESD->GetV0(iv0);
531 fInvMassV0->Fill(v0->GetEffMass());
532 v0->GetXYZ(vpos[0], vpos[1], vpos[2]);
533 Int_t ipos = v0->GetPindex();
534 Int_t ineg = v0->GetNindex();
535 if(ipos<0 || ipos> ntracks)
537 if(ineg<0 || ineg> ntracks)
539 AliESDtrack *pos = static_cast<AliESDtrack*>(fSelTracks->At(ipos));
540 AliESDtrack *neg = static_cast<AliESDtrack*>(fSelTracks->At(ineg));
543 /*if(pos->GetTPCsignal()<65 || neg->GetTPCsignal()<65)
545 const AliExternalTrackParam * paramPos = v0->GetParamP() ;
546 const AliExternalTrackParam * paramNeg = v0->GetParamN() ;
547 if(!paramPos || !paramNeg)
549 if(pos->GetSign() <0){//change tracks
551 neg=fESD->GetTrack(v0->GetPindex()) ;
553 paramNeg=v0->GetParamP() ;
555 AliKFParticle negKF(*paramNeg,11);
556 AliKFParticle posKF(*paramPos,-11);
557 AliKFParticle photKF(negKF,posKF) ;
559 if( neg->GetKinkIndex(0) > 0 || pos->GetKinkIndex(0) > 0)
562 if(pos->GetSign() == neg->GetSign()){
563 fInvMassV0SS->Fill(photKF.GetMass());
566 fInvMassV0KF->Fill(photKF.GetMass());
567 TLorentzVector photLV(photKF.GetPx(), photKF.GetPy(),photKF.GetPz(), photKF.GetE());
568 if(photLV.M()>0.05 || photLV.M()<0)
570 fConversionVtxXY->Fill(vpos[0], vpos[1]);//negKF.GetX(), negKF.GetY());
571 Double_t convPhi = TMath::ATan2(photLV.Py(),photLV.Px());
573 convPhi+=TMath::TwoPi();
574 TVector3 vecpos(vpos);
579 v0Phi+=TMath::TwoPi();
580 AliPhotonConvObj *myconv = static_cast<AliPhotonConvObj*>(fPhotConvArray->New(iconv++));
581 myconv->fPt = photLV.Pt();
582 myconv->fEta = photLV.Eta();
583 myconv->fPhi = convPhi;
584 myconv->fVR = vecpos.Perp();
586 myconv->fVEta = vecpos.Eta();
587 myconv->fVPhi = v0Phi;
588 myconv->fMass = photLV.M();
589 myconv->fMcLabel = -3; //WARNING: include the correct labeling
591 myconv->fNegPt = negKF.GetPt();
592 myconv->fNegEta = negKF.GetEta();
593 Double_t trackPhi = negKF.GetPhi();
595 trackPhi+=TMath::TwoPi();
596 myconv->fNegPhi = trackPhi;
597 myconv->fNegDedx = neg->GetTPCsignal();
598 myconv->fNegMcLabel = neg->GetLabel();
600 myconv->fPosPt = posKF.GetPt();
601 myconv->fPosEta = posKF.GetEta();
602 trackPhi = posKF.GetPhi();
604 trackPhi+=TMath::TwoPi();
605 myconv->fPosPhi = trackPhi;
606 myconv->fPosDedx = pos->GetTPCsignal();
607 myconv->fPosMcLabel = pos->GetLabel();
610 printf("::FindConversions() returning...\n\n");
614 //________________________________________________________________________
615 void AliAnalysisTaskEMCALPhoton::FillMyCells()
619 printf("::FillMyCells() starting\n");
623 Int_t ncells = fVCells->GetNumberOfCells();
624 Int_t mcel = 0;//, maxcelid=-1;
625 Double_t maxcellE = 0;//, maxcellEta=0, maxcellPhi=0;
626 for(Int_t icell = 0; icell<ncells; icell++){
627 Int_t absID = TMath::Abs(fVCells->GetCellNumber(icell));
628 AliPhotonCellObj *mycell = static_cast<AliPhotonCellObj*>(fMyCells->New(mcel++));
629 Float_t eta=-1, phi=-1;
631 std::cout<<"+++fGeom not found! MyCells branch will not be filled for this event!+++\n";
636 /*if(!fIsMC)*/fGeom->EtaPhiFromIndex(absID,eta,phi);
637 if(maxcellE<fVCells->GetCellAmplitude(absID)){
638 maxcellE = fVCells->GetCellAmplitude(absID);
643 Float_t theta = 2*TMath::ATan(TMath::Exp(-eta));
644 mycell->fAbsID = absID;
645 mycell->fE = fVCells->GetCellAmplitude(absID);
646 mycell->fEt = fVCells->GetCellAmplitude(absID)*TMath::Sin(theta);
649 mycell->fTime = fVCells->GetCellTime(absID);
652 printf("::FillMyCells() returning...\n\n");
655 //________________________________________________________________________
656 void AliAnalysisTaskEMCALPhoton::FillMyClusters()
660 printf("::FillMyClusters() starting\n");
663 printf("CaloClusters is empty!\n");
666 Int_t nclus = fCaloClusters->GetEntries();
668 printf("CaloClusters has ZERO entries\n");
669 Int_t mcl = 0, maxcelid=-1;
670 Double_t maxcellE=0, maxcellEtac=0,maxcellPhic=0;
671 for(Int_t ic=0; ic < nclus; ic++){
672 AliVCluster *clus = static_cast<AliVCluster*>(fCaloClusters->At(ic));
677 if(clus->E() < fClusThresh)
680 printf("cluster %d survived\n", ic);
682 clus->GetPosition(pos);
685 AliPhotonClusterObj *myclus = static_cast<AliPhotonClusterObj*>(fMyClusts->New(mcl++));
686 myclus->fE = clus->E();
687 myclus->fEt = clus->E()*TMath::Sin(cpos.Theta());
688 myclus->fR = cpos.Perp();
689 myclus->fEta = cpos.Eta();
690 myclus->fPhi = cpos.Phi();
692 myclus->fPhi+=TMath::TwoPi();
694 myclus->fN = clus->GetNCells();
696 myclus->fEmax = GetMaxCellEnergy( clus, id);
698 if(maxcellE < myclus->fEmax){
699 maxcellE = myclus->fEmax;
701 maxcellEtac = cpos.Eta();
702 maxcellPhic = cpos.Phi();
704 myclus->fTmax = fVCells->GetCellTime(id);
705 myclus->fEcross = GetCrossEnergy( clus, id);
706 myclus->fDisp = clus->GetDispersion();
707 myclus->fM20 = clus->GetM20();
708 myclus->fM02 = clus->GetM02();
709 myclus->fTrDEta = clus->GetTrackDz();
710 myclus->fTrDPhi = clus->GetTrackDx();
711 myclus->fTrIso01 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.1, 0.);
712 myclus->fTrIso02 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.2, 0.);
713 myclus->fTrIso03 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.3, 0.);
714 myclus->fTrIso04 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.4, 0.);
715 myclus->fTrPhiBand01 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.1, 0.);
716 myclus->fTrPhiBand02 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.2, 0.);
717 myclus->fTrPhiBand03 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.3, 0.);
718 myclus->fTrPhiBand04 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.4, 0.);
719 for(Int_t icell=0;icell<myclus->fN;icell++){
720 Int_t absID = clus->GetCellAbsId(icell);
721 cellsAbsID.Append(Form("%d",absID));
722 cellsAbsID.Append(";");
724 myclus->fCellsAbsId = cellsAbsID;
725 myclus->fMcLabel = clus->GetLabel();
726 Int_t matchIndex = clus->GetTrackMatchedIndex();
727 if(matchIndex<0 || matchIndex>fVev->GetNumberOfTracks()){
731 AliVTrack* track = static_cast<AliVTrack*>(fVev->GetTrack(matchIndex));
737 if(!fPrTrCuts->IsSelected(track))
741 myclus->fTrEp = clus->E()/track->P();
742 myclus->fTrDedx = track->GetTPCsignal();
745 printf(" ---===+++ Max Cell among clusters: id=%d, E=%1.2f, eta-clus=%1.2f, phi-clus=%1.2f\n",maxcelid,maxcellE,maxcellEtac,maxcellPhic);
746 printf("::FillMyClusters() returning...\n\n");
750 //________________________________________________________________________
751 void AliAnalysisTaskEMCALPhoton::FillMyAltClusters()
755 printf("::FillMyAltClusters() starting\n");
757 if(!fCaloClustersNew)
759 Int_t nclus = fCaloClustersNew->GetEntries();
761 for(Int_t ic=0; ic < nclus; ic++){
762 AliVCluster *clus = static_cast<AliVCluster*>(fCaloClustersNew->At(ic));
767 if(clus->E() < fClusThresh)
770 clus->GetPosition(pos);
773 AliPhotonClusterObj *myclus = static_cast<AliPhotonClusterObj*>(fMyAltClusts->New(mcl++));
774 myclus->fE = clus->E();
775 myclus->fEt = clus->E()*TMath::Sin(cpos.Theta());
776 myclus->fR = cpos.Perp();
777 myclus->fEta = cpos.Eta();
778 myclus->fPhi = cpos.Phi();
780 myclus->fPhi+=TMath::TwoPi();
782 myclus->fN = clus->GetNCells();
783 myclus->fDisp = clus->GetDispersion();
784 myclus->fM20 = clus->GetM20();
785 myclus->fM02 = clus->GetM02();
786 myclus->fTrDEta = clus->GetTrackDz();
787 myclus->fTrDPhi = clus->GetTrackDx();
788 myclus->fTrIso01 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.1, 0.);
789 myclus->fTrIso02 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.2, 0.);
790 myclus->fTrIso03 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.3, 0.);
791 myclus->fTrIso04 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.4, 0.);
792 for(Int_t icell=0;icell<myclus->fN;icell++){
793 Int_t absID = clus->GetCellAbsId(icell);
794 cellsAbsID.Append(Form("%d",absID));
795 cellsAbsID.Append(";");
797 myclus->fCellsAbsId = cellsAbsID;
798 myclus->fMcLabel = clus->GetLabel();
799 Int_t matchIndex = clus->GetTrackMatchedIndex();
800 if(matchIndex<0 || matchIndex>fVev->GetNumberOfTracks()){
804 AliVTrack* track = static_cast<AliVTrack*>(fVev->GetTrack(matchIndex));
813 if(!fPrTrCuts->IsSelected(track)){
817 myclus->fTrEp = clus->E()/track->P();
820 printf("::FillMyAltClusters() returning...\n\n");
823 //________________________________________________________________________
824 void AliAnalysisTaskEMCALPhoton::FillIsoTracks()
826 // Fill high pt tracks.
828 printf("::FillIsoTracks() starting\n");
832 Int_t ntracks = fSelPrimTracks->GetEntries();
834 for(Int_t it=0;it<ntracks; it++){
835 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(it));
838 /*if(track->Phi()<1.0 || track->Phi()>3.55)
840 if(TMath::Abs(track->Eta())>1.1)
844 AliPhotonTrackObj *mtr = static_cast<AliPhotonTrackObj*>(fMyTracks->New(imtr++));
845 mtr->fPt = track->Pt();
846 mtr->fEta = track->Eta();
847 mtr->fPhi = track->Phi();
848 mtr->fCharge = track->Charge();
849 mtr->fDedx = track->GetTPCsignal();
850 mtr->fMcLabel = track->GetLabel();
853 printf("::FillIsoTracks() returning...\n\n");
856 //________________________________________________________________________
857 void AliAnalysisTaskEMCALPhoton::GetMcParts()
861 printf("::GetMcParts() starting\n");
863 if (!this->fStack && !fAODMCParticles)
866 printf("either stack or aodmcpaticles exists\n");
867 const AliVVertex *evtVtx = 0;
869 evtVtx = fMCEvent->GetPrimaryVertex();
871 printf("no such thing as mc vvtx\n");
875 printf("mc vvertex ok\n");
878 nTracks = this->fStack->GetNtrack();
879 else if(fAODMCParticles)
880 nTracks = fAODMCParticles->GetEntriesFast();
882 AliAODMCParticle *amcP = 0;
884 printf("loop in the %d mc particles starting\n",nTracks);
885 for (Int_t iTrack = 0; iTrack<nTracks; ++iTrack) {
887 mcP = dynamic_cast<TParticle*>(this->fStack->Particle(iTrack));
889 amcP = dynamic_cast<AliAODMCParticle*>(fAODMCParticles->At(iTrack));
894 dR = TMath::Sqrt((mcP->Vx()-evtVtx->GetX())*(mcP->Vx()-evtVtx->GetX()) +
895 (mcP->Vy()-evtVtx->GetY())*(mcP->Vy()-evtVtx->GetY()) +
896 (mcP->Vz()-evtVtx->GetZ())*(mcP->Vz()-evtVtx->GetZ()));
912 mother = mcP->GetMother(0);
913 pdgcode = mcP->GetPdgCode();
919 mother = amcP->GetMother();
920 pdgcode = amcP->GetPdgCode();
927 if (TMath::Abs(eta)>0.7)
930 if (phi<1.0||phi>3.3)
933 if (mother!=6 && mother!=7 )
937 // pion or eta meson or direct photon
939 } else if(pdgcode == 221) {
940 } else if(pdgcode == 22 ) {
945 FillMcPart( fMyMcIndex++, iTrack);
948 printf("::GetMcParts() returning...\n\n");
951 //________________________________________________________________________
952 void AliAnalysisTaskEMCALPhoton::FillMcPart( Int_t itrack, Int_t label)
954 // Fill MC particles.
957 AliAODMCParticle *amcP= 0;
959 nTracks = this->fStack->GetNtrack();
960 mcP = dynamic_cast<TParticle*>(this->fStack->Particle(itrack));
962 else if(fAODMCParticles){
963 nTracks = fAODMCParticles->GetEntriesFast();
964 amcP = dynamic_cast<AliAODMCParticle*>(fAODMCParticles->At(itrack));
967 printf("\t::FillMcParts() starting with label %d\n", itrack);
970 vmcv.SetXYZ(mcP->Vx(),mcP->Vy(), mcP->Vz());
973 vmcv.SetXYZ(amcP->Xv(),amcP->Yv(), amcP->Zv());
978 AliPhotonMcPartObj *mcp = static_cast<AliPhotonMcPartObj*>(fMyMcParts->New(itrack));
979 mcp->fLabel = label ;
981 mcp->fPdg = mcP->GetPdgCode() ;
982 mcp->fPt = mcP->Pt() ;
983 mcp->fEta = mcP->Eta() ;
984 mcp->fPhi = mcP->Phi() ;
985 mcp->fMother = mcP->GetMother(0) ;
986 mcp->fFirstD = mcP->GetFirstDaughter() ;
987 mcp->fLastD = mcP->GetLastDaughter() ;
988 mcp->fStatus = mcP->GetStatusCode();
991 mcp->fPdg = amcP->GetPdgCode() ;
992 mcp->fPt = amcP->Pt() ;
993 mcp->fEta = amcP->Eta() ;
994 mcp->fPhi = amcP->Phi() ;
995 mcp->fMother = amcP->GetMother() ;
996 mcp->fFirstD = amcP->GetDaughter(0) ;
997 mcp->fLastD = amcP->GetDaughter(amcP->GetNDaughters()-1) ;
998 mcp->fStatus = amcP->GetStatus();
1000 mcp->fVR = vmcv.Perp();
1002 mcp->fVEta = vmcv.Eta() ;
1003 mcp->fVPhi = vmcv.Phi() ;
1006 mcp->fIso = AliAnalysisTaskEMCALPhoton::GetMcIsolation( itrack, 0.4 , 0.2);
1007 mcp->fIso3 = AliAnalysisTaskEMCALPhoton::GetMcIsolation( itrack, 0.3 , 0.2);
1010 printf("\t::FillMcParts(): label=%d, pdg=%d, pt=%1.1f, mom=%d, 1stD=%d,last=%d\n\t::FillMcParts() returning...\n\n", mcp->fLabel,mcp->fPdg,mcp->fPt,mcp->fMother,mcp->fFirstD,mcp->fLastD);
1011 for(Int_t id=mcp->fFirstD; id < mcp->fLastD; id++){
1012 if(id<=mcp->fMother)
1014 if(id<0 || id>nTracks)
1016 FillMcPart( fMyMcIndex++, id);
1020 //________________________________________________________________________
1021 Double_t AliAnalysisTaskEMCALPhoton::GetMcIsolation( Int_t itrack, Double_t radius, Double_t ptcut) const
1024 printf("\t\t::GetMcIsolation() starting\n");
1025 //printf("\t\t incoming particle: PDG = %d, itrack=%d;\n",mcP->GetPdgCode(),itrack);
1027 if (!this->fStack && !this->fAODMCParticles && this->fDebug){
1028 printf("\t\t\tNo MC stack/array!\n");
1031 if(itrack<6 || itrack>8)
1034 printf("\t\t\tparticle of interest selected\n");
1036 AliAODMCParticle *amcP = 0;
1044 nparts = fStack->GetNtrack();
1045 mcP = dynamic_cast<TParticle*>(this->fStack->Particle(itrack));
1048 pdgcode = mcP->GetPdgCode();
1050 if(this->fAODMCParticles){
1051 nparts = fAODMCParticles->GetEntriesFast();
1052 amcP = dynamic_cast<AliAODMCParticle*>(this->fAODMCParticles->At(itrack));
1056 pdgcode = amcP->GetPdgCode();
1061 TParticle *mcisop = 0;
1062 AliAODMCParticle *amcisop = 0;
1063 for(Int_t ip = 0; ip<nparts; ip++){
1067 mcisop = dynamic_cast<TParticle*>(this->fStack->Particle(ip));
1069 amcisop = dynamic_cast<AliAODMCParticle*>(fAODMCParticles->At(ip));
1073 Float_t isophi = -99;
1074 Float_t isoeta = -99;
1077 status = mcisop->GetStatusCode();
1078 mother = mcisop->GetMother(0);
1080 isophi = mcisop->Phi();
1081 isoeta = mcisop->Eta();
1082 vmcv.SetXYZ(mcisop->Vx(),mcisop->Vy(), mcisop->Vz());
1086 status = amcisop->GetStatus();
1087 mother = amcisop->GetMother();
1089 isophi = amcisop->Phi();
1090 isoeta = amcisop->Eta();
1091 vmcv.SetXYZ(amcisop->Xv(),amcisop->Yv(), amcisop->Zv());
1098 if(mother == itrack)
1104 dR = TMath::Sqrt((phi-isophi)*(phi-isophi)+(eta-isoeta)*(eta-isoeta));
1110 printf("\t\t::GetMcIsolation() returning value %f ...\n\n",sumpt);
1114 //________________________________________________________________________
1115 Double_t AliAnalysisTaskEMCALPhoton::GetTrackIsolation(Double_t cEta, Double_t cPhi, Double_t radius, Double_t pt) const
1117 // Compute isolation based on tracks.
1119 printf("\t::GetTrackIsolation() starting\n");
1121 Double_t trkIsolation = 0;
1122 Double_t rad2 = radius*radius;
1123 Int_t ntrks = fSelPrimTracks->GetEntries();
1124 for(Int_t j = 0; j<ntrks; ++j) {
1125 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(j));
1131 Float_t eta = track->Eta();
1132 Float_t phi = track->Phi();
1133 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
1134 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1137 trkIsolation += track->Pt();
1140 printf("\t::GetTrackIsolation() returning\n\n");
1141 return trkIsolation;
1144 //________________________________________________________________________
1145 Double_t AliAnalysisTaskEMCALPhoton::GetPhiBandEt(Double_t eta, Double_t phi, Double_t R, Double_t minpt) const
1151 Int_t ntracks = fSelPrimTracks->GetEntries();
1152 Double_t loweta = eta - R;
1153 Double_t upeta = eta + R;
1154 Double_t upphi = phi + R;
1155 Double_t lowphi = phi - R;
1157 for(Int_t itr=0; itr<ntracks; itr++){
1158 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(itr));
1161 if(track->Pt()<minpt)
1163 if((track->Eta() < upeta) && (track->Eta() > loweta))
1165 if((track->Phi() > upphi) || (track->Phi() < lowphi))
1172 //________________________________________________________________________
1173 Double_t AliAnalysisTaskEMCALPhoton::GetCrossEnergy(const AliVCluster *cluster, Short_t &idmax)
1175 // Calculate the energy of cross cells around the leading cell.
1191 Double_t crossEnergy = 0;
1193 fGeom->GetCellIndex(idmax,iSupMod,iTower,iIphi,iIeta);
1194 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphis,ietas);
1196 Int_t ncells = cluster->GetNCells();
1197 for (Int_t i=0; i<ncells; i++) {
1198 Int_t cellAbsId = cluster->GetCellAbsId(i);
1199 fGeom->GetCellIndex(cellAbsId,iSupMod,iTower,iIphi,iIeta);
1200 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphi,ieta);
1201 Int_t aphidiff = TMath::Abs(iphi-iphis);
1204 Int_t aetadiff = TMath::Abs(ieta-ietas);
1207 if ( (aphidiff==1 && aetadiff==0) ||
1208 (aphidiff==0 && aetadiff==1) ) {
1209 crossEnergy += fVCells->GetCellAmplitude(cellAbsId);
1216 //________________________________________________________________________
1217 Double_t AliAnalysisTaskEMCALPhoton ::GetMaxCellEnergy(const AliVCluster *cluster, Short_t &id) const
1219 // Get maximum energy of attached cell.
1226 Int_t ncells = cluster->GetNCells();
1227 for (Int_t i=0; i<ncells; i++) {
1228 Double_t e = fVCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
1231 id = cluster->GetCellAbsId(i);
1237 //________________________________________________________________________
1238 void AliAnalysisTaskEMCALPhoton::Terminate(Option_t *)
1240 // Called once at the end of the query
1244 printf("***tree %s being saved***\n",fTree->GetName());
1245 TFile *f = OpenFile(2);
1246 TDirectory::TContext context(f);