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(TMath::Abs(pv->GetZ())>15)
350 printf("+++Message+++: event passed the vertex cut\n");
353 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("Tracks"));
355 fTracks = dynamic_cast<TClonesArray*>(fAOD->GetTracks());
358 AliError("Track array in event is NULL!");
360 printf("returning due to not finding tracks!\n");
364 const Int_t Ntracks = fTracks->GetEntriesFast();
365 // Track loop to fill a pT spectrum
366 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
367 AliVTrack *track = (AliVTrack*)fTracks->At(iTracks);
370 AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(track);
371 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
373 if (fTrCuts && fTrCuts->IsSelected(track)){
374 fSelTracks->Add(track);
375 fDedxPAll->Fill(track->P(), track->GetTPCsignal());
377 if (fPrTrCuts && fPrTrCuts->IsSelected(track))
378 fSelPrimTracks->Add(track);
381 fSelPrimTracks->Add(track);
386 fHeader->fInputFileName = inpfile->GetName();
387 fHeader->fRunNumber = runnumber;
388 fHeader->fTrClassMask = fVev->GetHeader()->GetTriggerMask();
389 fHeader->fTrCluster = fVev->GetHeader()->GetTriggerCluster();
390 AliCentrality *cent = InputEvent()->GetCentrality();
391 fHeader->fV0Cent = cent->GetCentralityPercentileUnchecked("V0M");
392 fHeader->fCl1Cent = cent->GetCentralityPercentileUnchecked("CL1");
393 fHeader->fTrCent = cent->GetCentralityPercentileUnchecked("TRK");
395 TObjArray *matEMCAL=(TObjArray*)fOADBContainer->GetObject(runnumber,"EmcalMatrices");
396 for(Int_t mod=0; mod < (fGeom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
397 if(fGeoName=="EMCAL_FIRSTYEARV1" && mod>3)
400 fGeom->SetMisalMatrix(fESD->GetEMCALMatrix(mod), mod);
402 // if(event->GetEMCALMatrix(mod))
403 fGeomMatrix[mod] = (TGeoHMatrix*) matEMCAL->At(mod);
404 fGeom->SetMisalMatrix(fGeomMatrix[mod] , mod);
408 AliESDtrackCuts *fTrackCuts = new AliESDtrackCuts();
409 trackMult = fTrackCuts->GetReferenceMultiplicity(fESD);//kTrackletsITSTPC ,0.5);
411 printf("ESD Track mult= %d\n",trackMult);
416 printf("AOD Track mult= %d\n",trackMult);
419 TList *l = fESD->GetList();
420 fCaloClusters = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
421 fVCells = fESD->GetEMCALCells();
422 fHeader->fNCells = fVCells->GetNumberOfCells();
424 printf("ESD cluster mult= %d\n",fCaloClusters->GetEntriesFast());
427 fCaloClusters = dynamic_cast<TClonesArray*>(fAOD->GetCaloClusters());
428 fVCells = fAOD->GetEMCALCells();
429 fHeader->fNCells = fVCells->GetNumberOfCells();
431 printf("AOD cluster mult= %d\n",fCaloClusters->GetEntriesFast());
435 fHeader->fNClus = fCaloClusters->GetEntriesFast();
436 fHeader->fTrackMult = trackMult;
438 fMCEvent = MCEvent();
440 fStack = (AliStack*)fMCEvent->Stack();
442 fHeader->fNMcParts = this->fStack->GetNtrack();
444 printf("Stack not found\n");
445 fHeader->fNMcParts = 0;
446 fAODMCParticles = (TClonesArray*)fVev->FindListObject("mcparticles");
449 fHeader->fNMcParts = fAODMCParticles->GetEntriesFast();
453 printf("ERROR: MC Event not available, returning...\n");
461 printf("FindConversions done\n");
464 printf("FillMyCells done\n");
467 printf("FillMyClusters done\n");
474 if(this->fDebug && fIsMC)
475 printf("fMyMcParts nentries=%d",fMyMcParts->GetEntries());
479 fSelPrimTracks->Clear();
480 fPhotConvArray->Clear();
483 fMyAltClusts->Clear();
489 fCaloClusters->Clear();
491 fCaloClustersNew->Clear();
495 PostData(1, fOutputList);
499 //________________________________________________________________________
500 void AliAnalysisTaskEMCALPhoton::FindConversions() //WARNING: not ready to use with AODs
503 if(!fESD)//not working with AODs yet
506 printf("::FindConversions() starting\n");
512 nV0Orig = fESD->GetNumberOfV0s();
514 nV0Orig = fAOD->GetNumberOfV0s();
515 Int_t nV0s = nV0Orig;
516 Int_t ntracks = fSelTracks->GetEntriesFast();
517 if(fRedoV0 && !fAOD){
519 AliV0vertexer lV0vtxer;
520 lV0vtxer.Tracks2V0vertices(fESD);
521 nV0s = fESD->GetNumberOfV0s();
523 fNV0sBefAndAftRerun->Fill(nV0Orig, nV0s);
524 for(Int_t iv0=0; iv0<nV0s; iv0++){
525 AliESDv0 * v0 = fESD->GetV0(iv0);
529 fInvMassV0->Fill(v0->GetEffMass());
530 v0->GetXYZ(vpos[0], vpos[1], vpos[2]);
531 Int_t ipos = v0->GetPindex();
532 Int_t ineg = v0->GetNindex();
533 if(ipos<0 || ipos> ntracks)
535 if(ineg<0 || ineg> ntracks)
537 AliESDtrack *pos = static_cast<AliESDtrack*>(fSelTracks->At(ipos));
538 AliESDtrack *neg = static_cast<AliESDtrack*>(fSelTracks->At(ineg));
541 /*if(pos->GetTPCsignal()<65 || neg->GetTPCsignal()<65)
543 const AliExternalTrackParam * paramPos = v0->GetParamP() ;
544 const AliExternalTrackParam * paramNeg = v0->GetParamN() ;
545 if(!paramPos || !paramNeg)
547 if(pos->GetSign() <0){//change tracks
549 neg=fESD->GetTrack(v0->GetPindex()) ;
551 paramNeg=v0->GetParamP() ;
553 AliKFParticle negKF(*paramNeg,11);
554 AliKFParticle posKF(*paramPos,-11);
555 AliKFParticle photKF(negKF,posKF) ;
557 if( neg->GetKinkIndex(0) > 0 || pos->GetKinkIndex(0) > 0)
560 if(pos->GetSign() == neg->GetSign()){
561 fInvMassV0SS->Fill(photKF.GetMass());
564 fInvMassV0KF->Fill(photKF.GetMass());
565 TLorentzVector photLV(photKF.GetPx(), photKF.GetPy(),photKF.GetPz(), photKF.GetE());
566 if(photLV.M()>0.05 || photLV.M()<0)
568 fConversionVtxXY->Fill(vpos[0], vpos[1]);//negKF.GetX(), negKF.GetY());
569 Double_t convPhi = TMath::ATan2(photLV.Py(),photLV.Px());
571 convPhi+=TMath::TwoPi();
572 TVector3 vecpos(vpos);
577 v0Phi+=TMath::TwoPi();
578 AliPhotonConvObj *myconv = static_cast<AliPhotonConvObj*>(fPhotConvArray->New(iconv++));
579 myconv->fPt = photLV.Pt();
580 myconv->fEta = photLV.Eta();
581 myconv->fPhi = convPhi;
582 myconv->fVR = vecpos.Perp();
584 myconv->fVEta = vecpos.Eta();
585 myconv->fVPhi = v0Phi;
586 myconv->fMass = photLV.M();
587 myconv->fMcLabel = -3; //WARNING: include the correct labeling
589 myconv->fNegPt = negKF.GetPt();
590 myconv->fNegEta = negKF.GetEta();
591 Double_t trackPhi = negKF.GetPhi();
593 trackPhi+=TMath::TwoPi();
594 myconv->fNegPhi = trackPhi;
595 myconv->fNegDedx = neg->GetTPCsignal();
596 myconv->fNegMcLabel = neg->GetLabel();
598 myconv->fPosPt = posKF.GetPt();
599 myconv->fPosEta = posKF.GetEta();
600 trackPhi = posKF.GetPhi();
602 trackPhi+=TMath::TwoPi();
603 myconv->fPosPhi = trackPhi;
604 myconv->fPosDedx = pos->GetTPCsignal();
605 myconv->fPosMcLabel = pos->GetLabel();
608 printf("::FindConversions() returning...\n\n");
612 //________________________________________________________________________
613 void AliAnalysisTaskEMCALPhoton::FillMyCells()
617 printf("::FillMyCells() starting\n");
621 Int_t ncells = fVCells->GetNumberOfCells();
622 Int_t mcel = 0, maxcelid=-1;
623 Double_t maxcellE = 0, maxcellEta=0, maxcellPhi=0;
624 for(Int_t icell = 0; icell<ncells; icell++){
625 Int_t absID = TMath::Abs(fVCells->GetCellNumber(icell));
626 AliPhotonCellObj *mycell = static_cast<AliPhotonCellObj*>(fMyCells->New(mcel++));
627 Float_t eta=-1, phi=-1;
629 std::cout<<"+++fGeom not found! MyCells branch will not be filled for this event!+++\n";
634 /*if(!fIsMC)*/fGeom->EtaPhiFromIndex(absID,eta,phi);
635 if(maxcellE<fVCells->GetCellAmplitude(absID)){
636 maxcellE = fVCells->GetCellAmplitude(absID);
641 Float_t theta = 2*TMath::ATan(TMath::Exp(-eta));
642 mycell->fAbsID = absID;
643 mycell->fE = fVCells->GetCellAmplitude(absID);
644 mycell->fEt = fVCells->GetCellAmplitude(absID)*TMath::Sin(theta);
647 mycell->fTime = fVCells->GetCellTime(absID);
650 printf("::FillMyCells() returning...\n\n");
653 //________________________________________________________________________
654 void AliAnalysisTaskEMCALPhoton::FillMyClusters()
658 printf("::FillMyClusters() starting\n");
661 printf("CaloClusters is empty!\n");
664 Int_t nclus = fCaloClusters->GetEntries();
666 printf("CaloClusters has ZERO entries\n");
667 Int_t mcl = 0, maxcelid=-1;
668 Double_t maxcellE=0, maxcellEtac=0,maxcellPhic=0;
669 for(Int_t ic=0; ic < nclus; ic++){
670 AliVCluster *clus = static_cast<AliVCluster*>(fCaloClusters->At(ic));
675 if(clus->E() < fClusThresh)
678 printf("cluster %d survived\n", ic);
680 clus->GetPosition(pos);
683 AliPhotonClusterObj *myclus = static_cast<AliPhotonClusterObj*>(fMyClusts->New(mcl++));
684 myclus->fE = clus->E();
685 myclus->fEt = clus->E()*TMath::Sin(cpos.Theta());
686 myclus->fR = cpos.Perp();
687 myclus->fEta = cpos.Eta();
688 myclus->fPhi = cpos.Phi();
690 myclus->fPhi+=TMath::TwoPi();
692 myclus->fN = clus->GetNCells();
694 myclus->fEmax = GetMaxCellEnergy( clus, id);
696 if(maxcellE < myclus->fEmax){
697 maxcellE = myclus->fEmax;
699 maxcellEtac = cpos.Eta();
700 maxcellPhic = cpos.Phi();
702 myclus->fTmax = fVCells->GetCellTime(id);
703 myclus->fEcross = GetCrossEnergy( clus, id);
704 myclus->fDisp = clus->GetDispersion();
705 myclus->fM20 = clus->GetM20();
706 myclus->fM02 = clus->GetM02();
707 myclus->fTrDEta = clus->GetTrackDz();
708 myclus->fTrDPhi = clus->GetTrackDx();
709 myclus->fTrIso01 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.1, 0.);
710 myclus->fTrIso02 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.2, 0.);
711 myclus->fTrIso03 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.3, 0.);
712 myclus->fTrIso04 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.4, 0.);
713 myclus->fTrPhiBand01 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.1, 0.);
714 myclus->fTrPhiBand02 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.2, 0.);
715 myclus->fTrPhiBand03 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.3, 0.);
716 myclus->fTrPhiBand04 = GetPhiBandEt( cpos.Eta(), cpos.Phi(), 0.4, 0.);
717 for(Int_t icell=0;icell<myclus->fN;icell++){
718 Int_t absID = clus->GetCellAbsId(icell);
719 cellsAbsID.Append(Form("%d",absID));
720 cellsAbsID.Append(";");
722 myclus->fCellsAbsId = cellsAbsID;
723 myclus->fMcLabel = clus->GetLabel();
724 Int_t matchIndex = clus->GetTrackMatchedIndex();
725 if(matchIndex<0 || matchIndex>fVev->GetNumberOfTracks()){
729 AliVTrack* track = static_cast<AliVTrack*>(fVev->GetTrack(matchIndex));
735 if(!fPrTrCuts->IsSelected(track))
739 myclus->fTrEp = clus->E()/track->P();
740 myclus->fTrDedx = track->GetTPCsignal();
743 printf(" ---===+++ Max Cell among clusters: id=%d, E=%1.2f, eta-clus=%1.2f, phi-clus=%1.2f\n",maxcelid,maxcellE,maxcellEtac,maxcellPhic);
744 printf("::FillMyClusters() returning...\n\n");
748 //________________________________________________________________________
749 void AliAnalysisTaskEMCALPhoton::FillMyAltClusters()
753 printf("::FillMyAltClusters() starting\n");
755 if(!fCaloClustersNew)
757 Int_t nclus = fCaloClustersNew->GetEntries();
759 for(Int_t ic=0; ic < nclus; ic++){
760 AliVCluster *clus = static_cast<AliVCluster*>(fCaloClustersNew->At(ic));
765 if(clus->E() < fClusThresh)
768 clus->GetPosition(pos);
771 AliPhotonClusterObj *myclus = static_cast<AliPhotonClusterObj*>(fMyAltClusts->New(mcl++));
772 myclus->fE = clus->E();
773 myclus->fEt = clus->E()*TMath::Sin(cpos.Theta());
774 myclus->fR = cpos.Perp();
775 myclus->fEta = cpos.Eta();
776 myclus->fPhi = cpos.Phi();
778 myclus->fPhi+=TMath::TwoPi();
780 myclus->fN = clus->GetNCells();
781 myclus->fDisp = clus->GetDispersion();
782 myclus->fM20 = clus->GetM20();
783 myclus->fM02 = clus->GetM02();
784 myclus->fTrDEta = clus->GetTrackDz();
785 myclus->fTrDPhi = clus->GetTrackDx();
786 myclus->fTrIso01 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.1, 0.);
787 myclus->fTrIso02 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.2, 0.);
788 myclus->fTrIso03 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.3, 0.);
789 myclus->fTrIso04 = GetTrackIsolation( cpos.Eta(), cpos.Phi(), 0.4, 0.);
790 for(Int_t icell=0;icell<myclus->fN;icell++){
791 Int_t absID = clus->GetCellAbsId(icell);
792 cellsAbsID.Append(Form("%d",absID));
793 cellsAbsID.Append(";");
795 myclus->fCellsAbsId = cellsAbsID;
796 myclus->fMcLabel = clus->GetLabel();
797 Int_t matchIndex = clus->GetTrackMatchedIndex();
798 if(matchIndex<0 || matchIndex>fVev->GetNumberOfTracks()){
802 AliVTrack* track = static_cast<AliVTrack*>(fVev->GetTrack(matchIndex));
811 if(!fPrTrCuts->IsSelected(track)){
815 myclus->fTrEp = clus->E()/track->P();
818 printf("::FillMyAltClusters() returning...\n\n");
821 //________________________________________________________________________
822 void AliAnalysisTaskEMCALPhoton::FillIsoTracks()
824 // Fill high pt tracks.
826 printf("::FillIsoTracks() starting\n");
830 Int_t ntracks = fSelPrimTracks->GetEntries();
832 for(Int_t it=0;it<ntracks; it++){
833 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(it));
836 /*if(track->Phi()<1.0 || track->Phi()>3.55)
838 if(TMath::Abs(track->Eta())>1.1)
842 AliPhotonTrackObj *mtr = static_cast<AliPhotonTrackObj*>(fMyTracks->New(imtr++));
843 mtr->fPt = track->Pt();
844 mtr->fEta = track->Eta();
845 mtr->fPhi = track->Phi();
846 mtr->fCharge = track->Charge();
847 mtr->fDedx = track->GetTPCsignal();
848 mtr->fMcLabel = track->GetLabel();
851 printf("::FillIsoTracks() returning...\n\n");
854 //________________________________________________________________________
855 void AliAnalysisTaskEMCALPhoton::GetMcParts()
859 printf("::GetMcParts() starting\n");
861 if (!this->fStack && !fAODMCParticles)
864 printf("either stack or aodmcpaticles exists\n");
865 const AliVVertex *evtVtx = 0;
867 evtVtx = fMCEvent->GetPrimaryVertex();
869 printf("no such thing as mc vvtx\n");
873 printf("mc vvertex ok\n");
876 nTracks = this->fStack->GetNtrack();
877 else if(fAODMCParticles)
878 nTracks = fAODMCParticles->GetEntriesFast();
880 AliAODMCParticle *amcP = 0;
882 printf("loop in the %d mc particles starting\n",nTracks);
883 for (Int_t iTrack = 0; iTrack<nTracks; ++iTrack) {
885 mcP = dynamic_cast<TParticle*>(this->fStack->Particle(iTrack));
887 amcP = dynamic_cast<AliAODMCParticle*>(fAODMCParticles->At(iTrack));
892 dR = TMath::Sqrt((mcP->Vx()-evtVtx->GetX())*(mcP->Vx()-evtVtx->GetX()) +
893 (mcP->Vy()-evtVtx->GetY())*(mcP->Vy()-evtVtx->GetY()) +
894 (mcP->Vz()-evtVtx->GetZ())*(mcP->Vz()-evtVtx->GetZ()));
910 mother = mcP->GetMother(0);
911 pdgcode = mcP->GetPdgCode();
917 mother = amcP->GetMother();
918 pdgcode = amcP->GetPdgCode();
925 if (TMath::Abs(eta)>0.7)
928 if (phi<1.0||phi>3.3)
931 if (mother!=6 && mother!=7 )
935 // pion or eta meson or direct photon
937 } else if(pdgcode == 221) {
938 } else if(pdgcode == 22 ) {
943 FillMcPart( fMyMcIndex++, iTrack);
946 printf("::GetMcParts() returning...\n\n");
949 //________________________________________________________________________
950 void AliAnalysisTaskEMCALPhoton::FillMcPart( Int_t itrack, Int_t label)
952 // Fill MC particles.
955 AliAODMCParticle *amcP= 0;
957 nTracks = this->fStack->GetNtrack();
958 mcP = dynamic_cast<TParticle*>(this->fStack->Particle(itrack));
960 else if(fAODMCParticles){
961 nTracks = fAODMCParticles->GetEntriesFast();
962 amcP = dynamic_cast<AliAODMCParticle*>(fAODMCParticles->At(itrack));
965 printf("\t::FillMcParts() starting with label %d\n", itrack);
968 vmcv.SetXYZ(mcP->Vx(),mcP->Vy(), mcP->Vz());
971 vmcv.SetXYZ(amcP->Xv(),amcP->Yv(), amcP->Zv());
976 AliPhotonMcPartObj *mcp = static_cast<AliPhotonMcPartObj*>(fMyMcParts->New(itrack));
977 mcp->fLabel = label ;
979 mcp->fPdg = mcP->GetPdgCode() ;
980 mcp->fPt = mcP->Pt() ;
981 mcp->fEta = mcP->Eta() ;
982 mcp->fPhi = mcP->Phi() ;
983 mcp->fMother = mcP->GetMother(0) ;
984 mcp->fFirstD = mcP->GetFirstDaughter() ;
985 mcp->fLastD = mcP->GetLastDaughter() ;
986 mcp->fStatus = mcP->GetStatusCode();
989 mcp->fPdg = amcP->GetPdgCode() ;
990 mcp->fPt = amcP->Pt() ;
991 mcp->fEta = amcP->Eta() ;
992 mcp->fPhi = amcP->Phi() ;
993 mcp->fMother = amcP->GetMother() ;
994 mcp->fFirstD = amcP->GetDaughter(0) ;
995 mcp->fLastD = amcP->GetDaughter(amcP->GetNDaughters()-1) ;
996 mcp->fStatus = amcP->GetStatus();
998 mcp->fVR = vmcv.Perp();
1000 mcp->fVEta = vmcv.Eta() ;
1001 mcp->fVPhi = vmcv.Phi() ;
1004 mcp->fIso = AliAnalysisTaskEMCALPhoton::GetMcIsolation( itrack, 0.4 , 0.2);
1005 mcp->fIso3 = AliAnalysisTaskEMCALPhoton::GetMcIsolation( itrack, 0.3 , 0.2);
1008 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);
1009 for(Int_t id=mcp->fFirstD; id < mcp->fLastD; id++){
1010 if(id<=mcp->fMother)
1012 if(id<0 || id>nTracks)
1014 FillMcPart( fMyMcIndex++, id);
1018 //________________________________________________________________________
1019 Double_t AliAnalysisTaskEMCALPhoton::GetMcIsolation( Int_t itrack, Double_t radius, Double_t ptcut) const
1022 printf("\t\t::GetMcIsolation() starting\n");
1023 //printf("\t\t incoming particle: PDG = %d, itrack=%d;\n",mcP->GetPdgCode(),itrack);
1025 if (!this->fStack && !this->fAODMCParticles && this->fDebug){
1026 printf("\t\t\tNo MC stack/array!\n");
1029 if(itrack<6 || itrack>8)
1032 printf("\t\t\tparticle of interest selected\n");
1034 AliAODMCParticle *amcP = 0;
1042 nparts = fStack->GetNtrack();
1043 mcP = dynamic_cast<TParticle*>(this->fStack->Particle(itrack));
1046 pdgcode = mcP->GetPdgCode();
1048 if(this->fAODMCParticles){
1049 nparts = fAODMCParticles->GetEntriesFast();
1050 amcP = dynamic_cast<AliAODMCParticle*>(this->fAODMCParticles->At(itrack));
1054 pdgcode = amcP->GetPdgCode();
1059 TParticle *mcisop = 0;
1060 AliAODMCParticle *amcisop = 0;
1061 for(Int_t ip = 0; ip<nparts; ip++){
1065 mcisop = dynamic_cast<TParticle*>(this->fStack->Particle(ip));
1067 amcisop = dynamic_cast<AliAODMCParticle*>(fAODMCParticles->At(ip));
1071 Float_t isophi = -99;
1072 Float_t isoeta = -99;
1075 status = mcisop->GetStatusCode();
1076 mother = mcisop->GetMother(0);
1078 isophi = mcisop->Phi();
1079 isoeta = mcisop->Eta();
1080 vmcv.SetXYZ(mcisop->Vx(),mcisop->Vy(), mcisop->Vz());
1084 status = amcisop->GetStatus();
1085 mother = amcisop->GetMother();
1087 isophi = amcisop->Phi();
1088 isoeta = amcisop->Eta();
1089 vmcv.SetXYZ(amcisop->Xv(),amcisop->Yv(), amcisop->Zv());
1096 if(mother == itrack)
1102 dR = TMath::Sqrt((phi-isophi)*(phi-isophi)+(eta-isoeta)*(eta-isoeta));
1108 printf("\t\t::GetMcIsolation() returning value %f ...\n\n",sumpt);
1112 //________________________________________________________________________
1113 Double_t AliAnalysisTaskEMCALPhoton::GetTrackIsolation(Double_t cEta, Double_t cPhi, Double_t radius, Double_t pt) const
1115 // Compute isolation based on tracks.
1117 printf("\t::GetTrackIsolation() starting\n");
1119 Double_t trkIsolation = 0;
1120 Double_t rad2 = radius*radius;
1121 Int_t ntrks = fSelPrimTracks->GetEntries();
1122 for(Int_t j = 0; j<ntrks; ++j) {
1123 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(j));
1129 Float_t eta = track->Eta();
1130 Float_t phi = track->Phi();
1131 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
1132 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1135 trkIsolation += track->Pt();
1138 printf("\t::GetTrackIsolation() returning\n\n");
1139 return trkIsolation;
1142 //________________________________________________________________________
1143 Double_t AliAnalysisTaskEMCALPhoton::GetPhiBandEt(Double_t eta, Double_t phi, Double_t R, Double_t minpt) const
1149 Int_t ntracks = fSelPrimTracks->GetEntries();
1150 Double_t loweta = eta - R;
1151 Double_t upeta = eta + R;
1152 Double_t upphi = phi + R;
1153 Double_t lowphi = phi - R;
1155 for(Int_t itr=0; itr<ntracks; itr++){
1156 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(itr));
1159 if(track->Pt()<minpt)
1161 if((track->Eta() < upeta) && (track->Eta() > loweta))
1163 if((track->Phi() > upphi) || (track->Phi() < lowphi))
1170 //________________________________________________________________________
1171 Double_t AliAnalysisTaskEMCALPhoton::GetCrossEnergy(const AliVCluster *cluster, Short_t &idmax)
1173 // Calculate the energy of cross cells around the leading cell.
1189 Double_t crossEnergy = 0;
1191 fGeom->GetCellIndex(idmax,iSupMod,iTower,iIphi,iIeta);
1192 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphis,ietas);
1194 Int_t ncells = cluster->GetNCells();
1195 for (Int_t i=0; i<ncells; i++) {
1196 Int_t cellAbsId = cluster->GetCellAbsId(i);
1197 fGeom->GetCellIndex(cellAbsId,iSupMod,iTower,iIphi,iIeta);
1198 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphi,ieta);
1199 Int_t aphidiff = TMath::Abs(iphi-iphis);
1202 Int_t aetadiff = TMath::Abs(ieta-ietas);
1205 if ( (aphidiff==1 && aetadiff==0) ||
1206 (aphidiff==0 && aetadiff==1) ) {
1207 crossEnergy += fVCells->GetCellAmplitude(cellAbsId);
1214 //________________________________________________________________________
1215 Double_t AliAnalysisTaskEMCALPhoton ::GetMaxCellEnergy(const AliVCluster *cluster, Short_t &id) const
1217 // Get maximum energy of attached cell.
1224 Int_t ncells = cluster->GetNCells();
1225 for (Int_t i=0; i<ncells; i++) {
1226 Double_t e = fVCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
1229 id = cluster->GetCellAbsId(i);
1235 //________________________________________________________________________
1236 void AliAnalysisTaskEMCALPhoton::Terminate(Option_t *)
1238 // Called once at the end of the query
1242 printf("***tree %s being saved***\n",fTree->GetName());
1243 TFile *f = OpenFile(2);
1244 TDirectory::TContext context(f);