// $Id$ // // Emcal sample analysis task. // // Author: S.Aiola, M. Verweij #include #include #include #include #include #include #include "AliVCluster.h" #include "AliAODCaloCluster.h" #include "AliESDCaloCluster.h" #include "AliVTrack.h" #include "AliLog.h" #include "AliParticleContainer.h" #include "AliClusterContainer.h" #include "AliPicoTrack.h" #include "AliAnalysisTaskEmcalSample.h" ClassImp(AliAnalysisTaskEmcalSample) //________________________________________________________________________ AliAnalysisTaskEmcalSample::AliAnalysisTaskEmcalSample() : AliAnalysisTaskEmcal("AliAnalysisTaskEmcalSample", kTRUE), fHistTracksPt(0), fHistClustersPt(0), fHistPtDEtaDPhiTrackClus(0), fHistPtDEtaDPhiClusTrack(0), fTracksCont(0), fCaloClustersCont(0) { // Default constructor. fHistTracksPt = new TH1*[fNcentBins]; fHistClustersPt = new TH1*[fNcentBins]; for (Int_t i = 0; i < fNcentBins; i++) { fHistTracksPt[i] = 0; fHistClustersPt[i] = 0; } SetMakeGeneralHistograms(kTRUE); } //________________________________________________________________________ AliAnalysisTaskEmcalSample::AliAnalysisTaskEmcalSample(const char *name) : AliAnalysisTaskEmcal(name, kTRUE), fHistTracksPt(0), fHistClustersPt(0), fHistPtDEtaDPhiTrackClus(0), fHistPtDEtaDPhiClusTrack(0), fTracksCont(0), fCaloClustersCont(0) { // Standard constructor. fHistTracksPt = new TH1*[fNcentBins]; fHistClustersPt = new TH1*[fNcentBins]; for (Int_t i = 0; i < fNcentBins; i++) { fHistTracksPt[i] = 0; fHistClustersPt[i] = 0; } SetMakeGeneralHistograms(kTRUE); } //________________________________________________________________________ AliAnalysisTaskEmcalSample::~AliAnalysisTaskEmcalSample() { // Destructor. } //________________________________________________________________________ void AliAnalysisTaskEmcalSample::UserCreateOutputObjects() { // Create user output. AliAnalysisTaskEmcal::UserCreateOutputObjects(); fTracksCont = GetParticleContainer(0); fCaloClustersCont = GetClusterContainer(0); fTracksCont->SetClassName("AliVTrack"); fCaloClustersCont->SetClassName("AliVCluster"); TString histname; for (Int_t i = 0; i < fNcentBins; i++) { if (fParticleCollArray.GetEntriesFast()>0) { histname = "fHistTracksPt_"; histname += i; fHistTracksPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2); fHistTracksPt[i]->GetXaxis()->SetTitle("p_{T,track} (GeV/c)"); fHistTracksPt[i]->GetYaxis()->SetTitle("counts"); fOutput->Add(fHistTracksPt[i]); } if (fClusterCollArray.GetEntriesFast()>0) { histname = "fHistClustersPt_"; histname += i; fHistClustersPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2); fHistClustersPt[i]->GetXaxis()->SetTitle("p_{T,clus} (GeV/c)"); fHistClustersPt[i]->GetYaxis()->SetTitle("counts"); fOutput->Add(fHistClustersPt[i]); } } histname = "fHistPtDEtaDPhiTrackClus"; fHistPtDEtaDPhiTrackClus = new TH3F(histname.Data(),Form("%s;#it{p}_{T}^{track};#Delta#eta;#Delta#varphi",histname.Data()),100,0.,100.,100,-0.1,0.1,100,-0.1,0.1); fOutput->Add(fHistPtDEtaDPhiTrackClus); histname = "fHistPtDEtaDPhiClusTrack"; fHistPtDEtaDPhiClusTrack = new TH3F(histname.Data(),Form("%s;#it{p}_{T}^{clus};#Delta#eta;#Delta#varphi",histname.Data()),100,0.,100.,100,-0.1,0.1,100,-0.1,0.1); fOutput->Add(fHistPtDEtaDPhiClusTrack); PostData(1, fOutput); // Post data for ALL output slots > 0 here. } //________________________________________________________________________ Bool_t AliAnalysisTaskEmcalSample::FillHistograms() { // Fill histograms. if (fTracksCont) { AliVTrack *track = static_cast(fTracksCont->GetNextAcceptParticle(0)); while(track) { fHistTracksPt[fCentBin]->Fill(track->Pt()); track = static_cast(fTracksCont->GetNextAcceptParticle()); } } if (fCaloClustersCont) { AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0); while(cluster) { TLorentzVector nPart; cluster->GetMomentum(nPart, fVertex); fHistClustersPt[fCentBin]->Fill(nPart.Pt()); cluster = fCaloClustersCont->GetNextAcceptCluster(); } } CheckClusTrackMatching(); return kTRUE; } //________________________________________________________________________ void AliAnalysisTaskEmcalSample::CheckClusTrackMatching() { if(!fTracksCont || !fCaloClustersCont) return; Double_t deta = 999; Double_t dphi = 999; //Get closest cluster to track AliVTrack *track = static_cast(fTracksCont->GetNextAcceptParticle(0)); while(track) { //Get matched cluster Int_t emc1 = track->GetEMCALcluster(); if(fCaloClustersCont && emc1>=0) { AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1); if(clusMatch) { AliPicoTrack::GetEtaPhiDiff(track, clusMatch, dphi, deta); fHistPtDEtaDPhiTrackClus->Fill(track->Pt(),deta,dphi); } } track = static_cast(fTracksCont->GetNextAcceptParticle()); } //Get closest track to cluster AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0); while(cluster) { TLorentzVector nPart; cluster->GetMomentum(nPart, fVertex); fHistClustersPt[fCentBin]->Fill(nPart.Pt()); //Get matched track AliVTrack *mt = NULL; AliAODCaloCluster *acl = dynamic_cast(cluster); if(acl) { if(acl->GetNTracksMatched()>1) mt = static_cast(acl->GetTrackMatched(0)); } else { AliESDCaloCluster *ecl = dynamic_cast(cluster); Int_t im = ecl->GetTrackMatchedIndex(); if(fTracksCont && im>=0) { mt = static_cast(fTracksCont->GetParticle(im)); } } if(mt) { AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta); fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi); /* //debugging if(mt->IsEMCAL()) { Int_t emc1 = mt->GetEMCALcluster(); Printf("current id: %d emc1: %d",fCaloClustersCont->GetCurrentID(),emc1); AliVCluster *clm = fCaloClustersCont->GetCluster(emc1); AliPicoTrack::GetEtaPhiDiff(mt, clm, dphi, deta); Printf("deta: %f dphi: %f",deta,dphi); } */ } cluster = fCaloClustersCont->GetNextAcceptCluster(); } } //________________________________________________________________________ void AliAnalysisTaskEmcalSample::ExecOnce() { AliAnalysisTaskEmcal::ExecOnce(); if (fTracksCont && fTracksCont->GetArray() == 0) fTracksCont = 0; if (fCaloClustersCont && fCaloClustersCont->GetArray() == 0) fCaloClustersCont = 0; } //________________________________________________________________________ Bool_t AliAnalysisTaskEmcalSample::Run() { // Run analysis code here, if needed. It will be executed before FillHistograms(). return kTRUE; // If return kFALSE FillHistogram() will NOT be executed. } //________________________________________________________________________ void AliAnalysisTaskEmcalSample::Terminate(Option_t *) { // Called once at the end of the analysis. }