3 #include "AliAnalysisTaskEMCALPi0PbPb.h"
6 #include <TClonesArray.h>
8 #include <TGeoGlobalMagField.h>
12 #include <TLorentzVector.h>
17 #include "AliAODEvent.h"
18 #include "AliAODVertex.h"
19 #include "AliAnalysisManager.h"
20 #include "AliAnalysisTaskEMCALClusterizeFast.h"
21 #include "AliCDBManager.h"
22 #include "AliCentrality.h"
23 #include "AliEMCALGeoUtils.h"
24 #include "AliEMCALGeometry.h"
25 #include "AliEMCALRecoUtils.h"
26 #include "AliESDCaloTrigger.h"
27 #include "AliESDEvent.h"
28 #include "AliESDVertex.h"
29 #include "AliESDtrack.h"
30 #include "AliESDtrackCuts.h"
31 #include "AliEventplane.h"
32 #include "AliGeomManager.h"
33 #include "AliInputEventHandler.h"
36 #include "AliTrackerBase.h"
38 ClassImp(AliAnalysisTaskEMCALPi0PbPb)
40 //________________________________________________________________________
41 AliAnalysisTaskEMCALPi0PbPb::AliAnalysisTaskEMCALPi0PbPb(const char *name)
42 : AliAnalysisTaskSE(name),
57 fGeoName("EMCAL_FIRSTYEARV1"),
98 fHTclsBeforeCuts(0x0),
107 fHCellFreqNoCut(0x0),
108 fHCellFreqCut100M(0x0),
109 fHCellFreqCut300M(0x0),
112 fHClustEccentricity(0),
114 fHClustEnergyPt(0x0),
115 fHClustEnergySigma(0x0),
116 fHClustSigmaSigma(0x0),
117 fHClustNCellEnergyRatio(0x0),
131 DefineInput(0, TChain::Class());
132 DefineOutput(1, TList::Class());
133 fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.,SPDVertex.,TPCVertex.,EMCALCells.,Tracks EMCALTrigger."
134 "AOD:header,vertices,emcalCells,tracks";
137 //________________________________________________________________________
138 AliAnalysisTaskEMCALPi0PbPb::~AliAnalysisTaskEMCALPi0PbPb()
142 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
143 delete fOutput; fOutput = 0;
145 delete fPtRanges; fPtRanges = 0;
146 delete fGeom; fGeom = 0;
147 delete fReco; fReco = 0;
148 delete fTrClassNamesArr;
150 delete fSelPrimTracks;
151 delete [] fAmpInTrigger;
153 delete [] fHColuRowE;
154 delete [] fHCellMult;
155 delete [] fHCellFreqNoCut;
156 delete [] fHCellFreqCut100M;
157 delete [] fHCellFreqCut300M;
160 //________________________________________________________________________
161 void AliAnalysisTaskEMCALPi0PbPb::UserCreateOutputObjects()
163 // Create user objects here.
165 fGeom = new AliEMCALGeoUtils(fGeoName,"EMCAL");
166 fReco = new AliEMCALRecoUtils();
167 fTrClassNamesArr = fTrClassNames.Tokenize(" ");
168 fOutput = new TList();
170 fSelTracks = new TObjArray;
171 fSelPrimTracks = new TObjArray;
174 TFile *f = OpenFile(1);
176 f->SetCompressionLevel(2);
177 fNtuple = new TTree(Form("tree%.0fto%.0f",fCentFrom,fCentTo), "StandaloneTree");
178 fNtuple->SetDirectory(f);
180 fNtuple->SetAutoFlush(-2*1024*1024);
181 fNtuple->SetAutoSave(0);
183 fNtuple->SetAutoFlush(-32*1024*1024);
184 fNtuple->SetAutoSave(0);
187 fHeader = new AliStaHeader;
188 fNtuple->Branch("header", &fHeader, 16*1024, 99);
189 fPrimVert = new AliStaVertex;
190 fNtuple->Branch("primv", &fPrimVert, 16*1024, 99);
191 fSpdVert = new AliStaVertex;
192 fNtuple->Branch("spdv", &fSpdVert, 16*1024, 99);
193 fTpcVert = new AliStaVertex;
194 fNtuple->Branch("tpcv", &fTpcVert, 16*1024, 99);
195 if (TClass::GetClass("AliStaCluster"))
196 TClass::GetClass("AliStaCluster")->IgnoreTObjectStreamer();
197 fClusters = new TClonesArray("AliStaCluster");
198 fNtuple->Branch("clusters", &fClusters, 8*16*1024, 99);
199 if (TClass::GetClass("AliStaTrigger"))
200 TClass::GetClass("AliStaTrigger")->IgnoreTObjectStreamer();
201 fTriggers = new TClonesArray("AliStaTrigger");
202 fNtuple->Branch("l0prim", &fTriggers, 16*1024, 99);
206 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
207 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad();
208 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad();
211 TH1::SetDefaultSumw2(kTRUE);
212 TH2::SetDefaultSumw2(kTRUE);
213 fHCuts = new TH1F("hEventCuts","",5,0.5,5.5);
214 fHCuts->GetXaxis()->SetBinLabel(1,"All");
215 fHCuts->GetXaxis()->SetBinLabel(2,"PS");
216 fHCuts->GetXaxis()->SetBinLabel(3,Form("%s: %.0f-%.0f",fCentVar.Data(),fCentFrom,fCentTo));
217 fHCuts->GetXaxis()->SetBinLabel(4,"QFlag");
218 fHCuts->GetXaxis()->SetBinLabel(5,Form("zvtx: %.0f-%.0f",fVtxZMin,fVtxZMax));
219 fOutput->Add(fHCuts);
220 fHVertexZ = new TH1F("hVertexZBeforeCut","",100,-25,25);
221 fHVertexZ->SetXTitle("z [cm]");
222 fOutput->Add(fHVertexZ);
223 fHVertexZ2 = new TH1F("hVertexZAfterCut","",100,-25,25);
224 fHVertexZ2->SetXTitle("z [cm]");
225 fOutput->Add(fHVertexZ2);
226 fHCent = new TH1F("hCentBeforeCut","",101,-1,100);
227 fHCent->SetXTitle(fCentVar.Data());
228 fOutput->Add(fHCent);
229 fHCentQual = new TH1F("hCentAfterCut","",101,-1,100);
230 fHCentQual->SetXTitle(fCentVar.Data());
231 fOutput->Add(fHCentQual);
232 fHTclsBeforeCuts = new TH1F("hTclsBeforeCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
233 fHTclsAfterCuts = new TH1F("hTclsAfterCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
234 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
235 const char *name = fTrClassNamesArr->At(i)->GetName();
236 fHTclsBeforeCuts->GetXaxis()->SetBinLabel(1+i,name);
237 fHTclsAfterCuts->GetXaxis()->SetBinLabel(1+i,name);
239 fOutput->Add(fHTclsBeforeCuts);
240 fOutput->Add(fHTclsAfterCuts);
242 // histograms for cells
243 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
244 fHColuRow = new TH2*[nsm];
245 fHColuRowE = new TH2*[nsm];
246 fHCellMult = new TH1*[nsm];
247 for (Int_t i = 0; i<nsm; ++i) {
248 fHColuRow[i] = new TH2F(Form("hColRow_Mod%d",i),"",48,0,48,24,0.,24);
249 fHColuRow[i]->SetTitle(Form("Module %d: Occupancy", i));
250 fHColuRow[i]->SetXTitle("col (i#eta)");
251 fHColuRow[i]->SetYTitle("row (i#phi)");
252 fHColuRowE[i] = new TH2F(Form("hColRowE_Mod%d", i),"",48,0,48,24,0,24);
253 fHColuRowE[i]->SetTitle(Form("Module %d: Cell energy",i));
254 fHColuRowE[i]->SetXTitle("col (i#eta)");
255 fHColuRowE[i]->SetYTitle("row (i#phi)");
256 fHCellMult[i] = new TH1F(Form("hCellMult_Mod%d",i),"",1000,0,1000);
257 fHCellMult[i]->SetTitle(Form("Module %d: Cell multiplicity",i));
258 fHCellMult[i]->SetXTitle("# of cells");
259 fOutput->Add(fHColuRow[i]);
260 fOutput->Add(fHColuRowE[i]);
261 fOutput->Add(fHCellMult[i]);
263 fHCellE = new TH1F("hCellE","",250,0.,25.);
264 fHCellE->SetXTitle("E_{cell} [GeV]");
265 fOutput->Add(fHCellE);
266 fHCellH = new TH1F ("hCellHighestE","",250,0.,25.);
267 fHCellH->SetXTitle("E^{max}_{cell} [GeV]");
268 fOutput->Add(fHCellH);
269 fHCellM = new TH1F ("hCellMeanEperHitCell","",250,0.,2.5);
270 fHCellM->SetXTitle("#LT E_{cell}#GT [GeV]");
271 fOutput->Add(fHCellM);
272 fHCellM2 = new TH1F ("hCellMeanEperAllCells","",250,0.,1);
273 fHCellM2->SetXTitle("1/N_{cells} #Sigma E_{cell} [GeV]");
274 fOutput->Add(fHCellM2);
276 fHCellFreqNoCut = new TH1*[nsm];
277 fHCellFreqCut100M = new TH1*[nsm];
278 fHCellFreqCut300M = new TH1*[nsm];
279 fHCellFreqE = new TH1*[nsm];
280 for (Int_t i = 0; i<nsm; ++i){
281 Double_t lbin = i*24*48-0.5;
282 Double_t hbin = lbin+24*48;
283 fHCellFreqNoCut[i] = new TH1F(Form("hCellFreqNoCut_SM%d",i),
284 Form("Frequency SM%d (no cut);id;#",i), 1152, lbin, hbin);
285 fHCellFreqCut100M[i] = new TH1F(Form("hCellFreqCut100M_SM%d",i),
286 Form("Frequency SM%d (>0.1GeV);id;#",i), 1152, lbin, hbin);
287 fHCellFreqCut300M[i] = new TH1F(Form("hCellFreqCut300M_SM%d",i),
288 Form("Frequency SM%d (>0.3GeV);id;#",i), 1152, lbin, hbin);
289 fHCellFreqE[i] = new TH1F(Form("hCellFreqE_SM%d",i),
290 Form("Frequency SM%d (E weighted);id;#",i), 1152, lbin, hbin);
291 fOutput->Add(fHCellFreqNoCut[i]);
292 fOutput->Add(fHCellFreqCut100M[i]);
293 fOutput->Add(fHCellFreqCut300M[i]);
294 fOutput->Add(fHCellFreqE[i]);
296 if (!fMarkCells.IsNull()) {
297 fHCellCheckE = new TH1*[24*48*nsm];
298 memset(fHCellCheckE,0,24*48*nsm*sizeof(TH1*));
299 TObjArray *cells = fMarkCells.Tokenize(" ");
300 Int_t n = cells->GetEntries();
301 Int_t *tcs = new Int_t[n];
302 for (Int_t i=0;i<n;++i) {
303 TString name(cells->At(i)->GetName());
306 for (Int_t i = 0; i<n; ++i) {
309 fHCellCheckE[i] = new TH1F(Form("hCellE_id%d",c), Form("Cell %d;E [GeV/c];#",c), 1000, 0, 10);
310 fOutput->Add(fHCellCheckE[i]);
317 // histograms for clusters
319 fHClustEccentricity = new TH1F("hClustEccentricity","",100,-0.1,1.1);
320 fHClustEccentricity->SetXTitle("#epsilon_{C}");
321 fOutput->Add(fHClustEccentricity);
322 fHClustEtaPhi = new TH2F("hClustEtaPhi","",500,-0.8,0.8,100*nsm,phimin,phimax);
323 fHClustEtaPhi->SetXTitle("#eta");
324 fHClustEtaPhi->SetYTitle("#varphi");
325 fOutput->Add(fHClustEtaPhi);
326 fHClustEnergyPt = new TH2F("hClustEnergyPt","",250,0,50,250,0,50);
327 fHClustEnergyPt->SetXTitle("E [GeV]");
328 fHClustEnergyPt->SetYTitle("p_{T} [GeV/c]");
329 fOutput->Add(fHClustEnergyPt);
330 fHClustEnergySigma = new TH2F("hClustEnergySigma","",100,0,100,500,0,50);
331 fHClustEnergySigma->SetXTitle("E_{C} * #sigma_{max} [GeV*cm]");
332 fHClustEnergySigma->SetYTitle("E_{C} [GeV]");
333 fOutput->Add(fHClustEnergySigma);
334 fHClustSigmaSigma = new TH2F("hClustSigmaSigma","",500,0,50,500,0,50);
335 fHClustSigmaSigma->SetXTitle("#lambda_{0} [cm]");
336 fHClustSigmaSigma->SetYTitle("#sigma_{max} [cm]");
337 fOutput->Add(fHClustSigmaSigma);
338 fHClustNCellEnergyRatio = new TH2F("hClustNCellEnergyRatio","",27,-0.5,26.5,101,-0.05,1.05);
339 fHClustNCellEnergyRatio->SetXTitle("N_{cells}");
340 fHClustNCellEnergyRatio->SetYTitle("E^{max}_{cell}/E_{clus}");
341 fOutput->Add(fHClustNCellEnergyRatio);
344 // histograms for track matching
345 fHMatchDr = new TH1F("hMatchDrDist",";dR [cm]",500,0,200);
346 fOutput->Add(fHMatchDr);
347 fHMatchDz = new TH1F("hMatchDzDist",";dZ [cm]",500,-100,100);
348 fOutput->Add(fHMatchDz);
349 fHMatchEp = new TH1F("hMatchEpDist",";E/p",100,0,10);
350 fOutput->Add(fHMatchEp);
352 // histograms for pion candidates
354 fHPionEtaPhi = new TH2F("hPionEtaPhi","",100,-0.8,0.8,100*nsm,phimin,phimax);
355 fHPionEtaPhi->SetXTitle("#eta_{#gamma#gamma}");
356 fHPionEtaPhi->SetYTitle("#varphi_{#gamma#gamma}");
357 fOutput->Add(fHPionEtaPhi);
358 fHPionMggPt = new TH2F("hPionMggPt","",1000,0,2,100,0,20.0);
359 fHPionMggPt->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
360 fHPionMggPt->SetYTitle("p_{T}^{#gamma#gamma} [GeV/c]");
361 fOutput->Add(fHPionMggPt);
362 fHPionMggAsym = new TH2F("hPionMggAsym","",1000,0,2,100,0,1);
363 fHPionMggAsym->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
364 fHPionMggAsym->SetYTitle("Z_{#gamma#gamma} [GeV]");
365 fOutput->Add(fHPionMggAsym);
366 fHPionMggDgg = new TH2F("hPionMggDgg","",1000,0,2,100,0,10);
367 fHPionMggDgg->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
368 fHPionMggDgg->SetYTitle("opening angle [grad]");
369 fOutput->Add(fHPionMggDgg);
370 const Int_t nbins = 20;
371 Double_t xbins[nbins] = {0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,6,7,8,9,10,12.5,15,20,25,50};
372 fPtRanges = new TAxis(nbins-1,xbins);
373 for (Int_t i = 0; i<=nbins; ++i) {
374 fHPionInvMasses[i] = new TH1F(Form("hPionInvMass%d",i),"",1000,0,2);
375 fHPionInvMasses[i]->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
377 fHPionInvMasses[i]->SetTitle(Form("0 < p_{T}^{#gamma#gamma} <%.1f",xbins[0]));
379 fHPionInvMasses[i]->SetTitle(Form("p_{T}^{#gamma#gamma} > 50"));
381 fHPionInvMasses[i]->SetTitle(Form("%.1f < p_{T}^{#gamma#gamma} <%.1f",xbins[i-1],xbins[i]));
382 fOutput->Add(fHPionInvMasses[i]);
386 PostData(1, fOutput);
389 //________________________________________________________________________
390 void AliAnalysisTaskEMCALPi0PbPb::UserExec(Option_t *)
392 // Called for each event.
397 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
398 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
400 am->LoadBranch("AliESDRun.");
401 am->LoadBranch("AliESDHeader.");
403 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
405 AliFatal("Neither ESD nor AOD event found");
408 am->LoadBranch("header");
411 if (fDoTrMatGeom && !AliGeomManager::GetGeometry()) { // get geometry
412 AliWarning("Accessing geometry from OCDB, this is not very efficient!");
413 AliCDBManager *cdb = AliCDBManager::Instance();
414 if (!cdb->IsDefaultStorageSet())
415 cdb->SetDefaultStorage("raw://");
416 Int_t runno = InputEvent()->GetRunNumber();
417 if (runno != cdb->GetRun())
419 AliGeomManager::LoadGeometry();
422 if (!AliGeomManager::GetGeometry()&&!fIsGeoMatsSet) { // set misalignment matrices (stored in first event)
423 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
425 for (Int_t i=0; i<nsm; ++i)
426 fGeom->SetMisalMatrix(fEsdEv->GetESDRun()->GetEMCALMatrix(i),i);
428 for (Int_t i=0; i<nsm; ++i)
429 fGeom->SetMisalMatrix(fAodEv->GetHeader()->GetEMCALMatrix(i),i);
431 fIsGeoMatsSet = kTRUE;
434 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
436 const AliESDRun *erun = fEsdEv->GetESDRun();
437 AliMagF *field = AliMagF::CreateFieldMap(erun->GetCurrentL3(),
438 erun->GetCurrentDip(),
441 erun->GetBeamEnergy(),
442 erun->GetBeamType());
443 TGeoGlobalMagField::Instance()->SetField(field);
445 Double_t pol = -1; //polarity
446 Double_t be = -1; //beam energy
447 AliMagF::BeamType_t btype = AliMagF::kBeamTypepp;
448 Int_t runno = fAodEv->GetRunNumber();
449 if (runno>=136851 && runno<138275) {
452 btype = AliMagF::kBeamTypeAA;
453 } else if (runno>=138275 && runno<=139517) {
456 btype = AliMagF::kBeamTypeAA;
458 AliError(Form("Do not know the bfield parameters for run %d! Using defaults!!!", runno));
460 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", pol, pol, AliMagF::k5kG, btype, be));
468 AliESDHeader *h = dynamic_cast<AliESDHeader*>(InputEvent()->GetHeader());
470 trgclasses = fEsdEv->GetFiredTriggerClasses();
472 AliAODHeader *h2 = dynamic_cast<AliAODHeader*>(InputEvent()->GetHeader());
474 trgclasses = h2->GetFiredTriggerClasses();
476 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
477 const char *name = fTrClassNamesArr->At(i)->GetName();
478 if (trgclasses.Contains(name))
479 fHTclsBeforeCuts->Fill(1+i);
482 UInt_t res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
488 const AliCentrality *centP = InputEvent()->GetCentrality();
489 Double_t cent = centP->GetCentralityPercentileUnchecked(fCentVar);
491 if (cent<fCentFrom||cent>fCentTo)
497 if (centP->GetQuality()>0)
501 fHCentQual->Fill(cent);
505 am->LoadBranch("PrimaryVertex.");
506 am->LoadBranch("SPDVertex.");
507 am->LoadBranch("TPCVertex.");
509 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
510 am->LoadBranch("vertices");
514 const AliVVertex *vertex = InputEvent()->GetPrimaryVertex();
518 fHVertexZ->Fill(vertex->GetZ());
520 if(vertex->GetZ()<fVtxZMin||vertex->GetZ()>fVtxZMax)
524 fHVertexZ2->Fill(vertex->GetZ());
526 // count number of accepted events
529 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
530 const char *name = fTrClassNamesArr->At(i)->GetName();
531 if (trgclasses.Contains(name))
532 fHTclsAfterCuts->Fill(1+i);
535 fRecPoints = 0; // will be set if fClusName is given and AliAnalysisTaskEMCALClusterizeFast is used
536 fEsdClusters = 0; // will be set if ESD input used and if fRecPoints are not set or if clusters are attached
537 fEsdCells = 0; // will be set if ESD input used
538 fAodClusters = 0; // will be set if AOD input used and if fRecPoints are not set or if clusters are attached
539 // or if fClusName is given and AliAnalysisTaskEMCALClusterizeFast in AOD output mode
540 fAodCells = 0; // will be set if AOD input used
542 // deal with special output from AliAnalysisTaskEMCALClusterizeFast first
543 Bool_t clusattached = 0;
544 Bool_t recalibrated = 0;
545 if (1 && !fClusName.IsNull()) {
546 AliAnalysisTaskEMCALClusterizeFast *cltask = 0;
547 TObjArray *ts = am->GetTasks();
548 cltask = dynamic_cast<AliAnalysisTaskEMCALClusterizeFast*>(ts->FindObject(fClusName));
549 if (cltask && cltask->GetClusters()) {
550 fRecPoints = const_cast<TObjArray*>(cltask->GetClusters());
551 clusattached = cltask->GetAttachClusters();
552 if (cltask->GetCalibData()!=0)
553 recalibrated = kTRUE;
556 if (1 && AODEvent() && !fClusName.IsNull()) {
557 TList *l = AODEvent()->GetList();
558 TClonesArray *clus = 0;
560 clus = dynamic_cast<TClonesArray*>(l->FindObject(fClusName));
565 if (fEsdEv) { // ESD input mode
566 if (1 && (!fRecPoints||clusattached)) {
568 am->LoadBranch("CaloClusters");
569 TList *l = fEsdEv->GetList();
570 TClonesArray *clus = 0;
572 clus = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
578 am->LoadBranch("EMCALCells.");
579 fEsdCells = fEsdEv->GetEMCALCells();
581 } else if (fAodEv) { // AOD input mode
582 if (1 && (!fAodClusters || clusattached)) {
584 am->LoadBranch("caloClusters");
585 TList *l = fAodEv->GetList();
586 TClonesArray *clus = 0;
588 clus = dynamic_cast<TClonesArray*>(l->FindObject("caloClusters"));
594 am->LoadBranch("emcalCells");
595 fAodCells = fAodEv->GetEMCALCells();
598 AliFatal("Impossible to not have either pointer to ESD or AOD event");
602 AliDebug(2,Form("fRecPoints set: %p", fRecPoints));
603 AliDebug(2,Form("fEsdClusters set: %p", fEsdClusters));
604 AliDebug(2,Form("fEsdCells set: %p", fEsdCells));
605 AliDebug(2,Form("fAodClusters set: %p", fAodClusters));
606 AliDebug(2,Form("fAodCells set: %p", fAodCells));
610 ClusterAfterburner();
627 fSelPrimTracks->Clear();
631 PostData(1, fOutput);
634 //________________________________________________________________________
635 void AliAnalysisTaskEMCALPi0PbPb::Terminate(Option_t *)
637 // Terminate called at the end of analysis.
640 TFile *f = OpenFile(1);
645 AliInfo(Form("%s: Accepted %lld events", GetName(), fNEvs));
648 //________________________________________________________________________
649 void AliAnalysisTaskEMCALPi0PbPb::CalcCaloTriggers()
651 // Calculate triggers
655 AliVCaloCells *cells = fEsdCells;
661 Int_t ncells = cells->GetNumberOfCells();
665 if (ncells>fNAmpInTrigger) {
666 delete [] fAmpInTrigger;
667 fAmpInTrigger = new Float_t[ncells];
668 fNAmpInTrigger = ncells;
670 for (Int_t i=0;i<ncells;++i)
671 fAmpInTrigger[i] = 0;
673 std::map<Short_t,Short_t> map;
674 for (Short_t pos=0;pos<ncells;++pos) {
675 Short_t id = cells->GetCellNumber(pos);
679 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
680 am->LoadBranch("EMCALTrigger.");
682 AliESDCaloTrigger *triggers = fEsdEv->GetCaloTrigger("EMCAL");
685 if (triggers->GetEntries()<=0)
690 while (triggers->Next()) {
691 Int_t gCol=0, gRow=0, ntimes=0;
692 triggers->GetPosition(gCol,gRow);
693 triggers->GetNL0Times(ntimes);
697 triggers->GetAmplitude(amp);
699 fGeom->GetAbsFastORIndexFromPositionInEMCAL(gCol,gRow,find);
702 Int_t cidx[4] = {-1};
703 Bool_t ret = fGeom->GetCellIndexFromFastORIndex(find, cidx);
707 triggers->GetL0Times(trgtimes);
708 Int_t mintime = trgtimes[0];
709 Int_t maxtime = trgtimes[0];
710 Bool_t trigInTimeWindow = 0;
711 for (Int_t i=0;i<ntimes;++i) {
712 if (trgtimes[i]<mintime)
713 mintime = trgtimes[i];
714 if (maxtime<trgtimes[i])
715 maxtime = trgtimes[i];
716 if ((fMinL0Time<trgtimes[i]) && (fMaxL0Time>trgtimes[i]))
717 trigInTimeWindow = 1;
720 Double_t tenergy = 0;
723 for (Int_t i=0;i<3;++i) {
725 std::map<Short_t,Short_t>::iterator it = map.find(cidx[i]);
730 if (trigInTimeWindow)
731 fAmpInTrigger[pos] = amp; // save for usage in CalcClusProperties
732 Float_t eta=-1, phi=-1;
733 fGeom->EtaPhiFromIndex(cidx[i],eta,phi);
734 Double_t en= cells->GetAmplitude(pos);
741 AliStaTrigger *trignew = static_cast<AliStaTrigger*>(fTriggers->New(ntrigs++));
742 trignew->fE = tenergy;
743 trignew->fEta = teta;
744 trignew->fPhi = tphi;
746 trignew->fMinTime = mintime;
747 trignew->fMaxTime = maxtime;
751 //________________________________________________________________________
752 void AliAnalysisTaskEMCALPi0PbPb::CalcClusterProps()
754 // Calculate cluster properties
758 AliVCaloCells *cells = fEsdCells;
764 TObjArray *clusters = fEsdClusters;
766 clusters = fAodClusters;
770 Int_t ncells = cells->GetNumberOfCells();
771 Int_t nclus = clusters->GetEntries();
772 Int_t ntrks = fSelTracks->GetEntries();
773 Bool_t btracks[6][ntrks];
774 memset(btracks,0,sizeof(btracks));
776 std::map<Short_t,Short_t> map;
777 for (Short_t pos=0;pos<ncells;++pos) {
778 Short_t id = cells->GetCellNumber(pos);
782 for(Int_t i=0, ncl=0; i<nclus; ++i) {
783 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
786 if (!clus->IsEMCAL())
791 Float_t clsPos[3] = {0};
792 clus->GetPosition(clsPos);
793 TVector3 clsVec(clsPos);
794 Double_t vertex[3] = {0};
795 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
796 TLorentzVector clusterVec;
797 clus->GetMomentum(clusterVec,vertex);
798 Double_t clsEta = clusterVec.Eta();
800 AliStaCluster *cl = static_cast<AliStaCluster*>(fClusters->New(ncl++));
802 cl->fR = clsVec.Perp();
803 cl->fEta = clsVec.Eta();
804 cl->fPhi = clsVec.Phi();
805 cl->fN = clus->GetNCells();
806 cl->fN1 = GetNCells(clus,0.100);
807 cl->fN3 = GetNCells(clus,0.300);
809 Double_t emax = GetMaxCellEnergy(clus, id);
812 if (clus->GetDistanceToBadChannel()<10000)
813 cl->fDbc = clus->GetDistanceToBadChannel();
814 if (!TMath::IsNaN(clus->GetDispersion()))
815 cl->fDisp = clus->GetDispersion();
816 if (!TMath::IsNaN(clus->GetM20()))
817 cl->fM20 = clus->GetM20();
818 if (!TMath::IsNaN(clus->GetM02()))
819 cl->fM02 = clus->GetM02();
820 Double_t maxAxis = 0, minAxis = 0;
821 GetSigma(clus,maxAxis,minAxis);
822 clus->SetTOF(maxAxis); // store sigma in TOF
824 Double_t clusterEcc = 0;
826 clusterEcc = TMath::Sqrt(1.0 - minAxis*minAxis/(maxAxis*maxAxis));
827 clus->SetChi2(clusterEcc); // store ecc in chi2
828 cl->fEcc = clusterEcc;
829 cl->fTrIso = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist);
830 cl->fTrIso1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 1);
831 cl->fTrIso2 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 2);
832 cl->fCeCore = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.05);
833 cl->fCeIso = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),fIsoDist);
834 Double_t trigpen = 0;
835 Double_t trignen = 0;
836 for(Int_t j=0; j<cl->fN; ++j) {
837 Short_t cid = TMath::Abs(clus->GetCellAbsId(j));
839 std::map<Short_t,Short_t>::iterator it = map.find(cid);
844 if (fAmpInTrigger[pos]>0)
845 trigpen += cells->GetAmplitude(pos);
846 else if (fAmpInTrigger[pos]<0)
847 trignen += cells->GetAmplitude(pos);
851 cl->fTrigE = trigpen;
855 cl->fTrigMaskE = trignen;
859 Double_t mind2 = 1e10;
860 for(Int_t j = 0; j<ntrks; ++j) {
861 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
865 if (TMath::Abs(clsEta-track->Eta())>0.5)
868 TVector3 vec(clsPos);
869 Int_t index = (Int_t)(vec.Phi()*TMath::RadToDeg()/20);
870 if (btracks[index-4][j]) {
874 Float_t tmpR=-1, tmpZ=-1;
876 AliExternalTrackParam *tParam = 0;
878 AliESDtrack *esdTrack = static_cast<AliESDtrack*>(track);
879 tParam = new AliExternalTrackParam(*esdTrack->GetTPCInnerParam());
881 tParam = new AliExternalTrackParam(track);
883 Double_t bfield[3] = {0};
884 track->GetBxByBz(bfield);
885 Double_t alpha = (index+0.5)*20*TMath::DegToRad();
886 vec.RotateZ(-alpha); //Rotate the cluster to the local extrapolation coordinate system
887 tParam->Rotate(alpha); //Rotate the track to the same local extrapolation system
888 Bool_t ret = tParam->PropagateToBxByBz(vec.X(), bfield);
890 btracks[index-4][j]=1;
894 Double_t trkPos[3] = {0};
895 tParam->GetXYZ(trkPos); //Get the extrapolated global position
896 tmpR = TMath::Sqrt( TMath::Power(clsPos[0]-trkPos[0],2)+TMath::Power(clsPos[1]-trkPos[1],2)+TMath::Power(clsPos[2]-trkPos[2],2) );
897 tmpZ = clsPos[2]-trkPos[2];
900 if (TMath::Abs(clsEta-track->Eta())>fIsoDist)
902 AliExternalTrackParam tParam(track);
903 if (!fReco->ExtrapolateTrackToCluster(&tParam, clus, tmpR, tmpZ))
911 cl->fTrDr = TMath::Sqrt(tmpR*tmpR-tmpZ*tmpZ);
912 cl->fTrEp = clus->E()/track->P();
918 fHMatchDr->Fill(cl->fTrDr);
919 fHMatchDz->Fill(cl->fTrDz);
920 fHMatchEp->Fill(cl->fTrEp);
925 //________________________________________________________________________
926 void AliAnalysisTaskEMCALPi0PbPb::CalcPrimTracks()
928 // Calculate track properties.
930 fSelPrimTracks->Clear();
932 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
933 TClonesArray *tracks = 0;
935 am->LoadBranch("Tracks");
936 TList *l = fEsdEv->GetList();
937 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
939 am->LoadBranch("tracks");
940 TList *l = fAodEv->GetList();
941 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
947 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
948 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad()-fIsoDist*1.25;
949 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad()+fIsoDist*1.25;
952 fSelPrimTracks->SetOwner(kTRUE);
953 am->LoadBranch("PrimaryVertex.");
954 const AliESDVertex *vtx = fEsdEv->GetPrimaryVertexSPD();
955 am->LoadBranch("SPDVertex.");
956 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
957 am->LoadBranch("Tracks");
958 const Int_t Ntracks = tracks->GetEntries();
959 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
960 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
962 AliWarning(Form("Could not receive track %d\n", iTracks));
965 if (fTrCuts && !fTrCuts->IsSelected(track))
967 Double_t eta = track->Eta();
970 if (track->Phi()<phimin||track->Phi()>phimax)
973 AliESDtrack copyt(*track);
975 copyt.GetBxByBz(bfield);
976 AliExternalTrackParam tParam;
977 Bool_t relate = copyt.RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&tParam);
980 copyt.Set(tParam.GetX(),tParam.GetAlpha(),tParam.GetParameter(),tParam.GetCovariance());
982 Double_t p[3] = { 0. };
984 Double_t pos[3] = { 0. };
986 Double_t covTr[21] = { 0. };
987 copyt.GetCovarianceXYZPxPyPz(covTr);
988 Double_t pid[10] = { 0. };
989 copyt.GetESDpid(pid);
990 AliAODTrack *aTrack = new AliAODTrack(copyt.GetID(),
997 (Short_t)copyt.GetSign(),
998 copyt.GetITSClusterMap(),
1000 0,/*fPrimaryVertex,*/
1001 kTRUE, // check if this is right
1002 vtx->UsesTrack(copyt.GetID()));
1003 aTrack->SetTPCClusterMap(copyt.GetTPCClusterMap());
1004 aTrack->SetTPCSharedMap (copyt.GetTPCSharedMap());
1005 Float_t ndf = copyt.GetTPCNcls() + 1 - 5 ;
1007 aTrack->SetChi2perNDF(copyt.GetTPCchi2()/ndf);
1009 aTrack->SetChi2perNDF(-1);
1010 aTrack->SetFlags(copyt.GetStatus());
1011 aTrack->SetTPCPointsF(copyt.GetTPCNclsF());
1012 fSelPrimTracks->Add(aTrack);
1015 Int_t ntracks = tracks->GetEntries();
1016 for (Int_t i=0; i<ntracks; ++i) {
1017 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1020 Double_t eta = track->Eta();
1023 if (track->Phi()<phimin||track->Phi()>phimax)
1025 if(track->GetTPCNcls()<fMinNClusPerTr)
1027 //todo: Learn how to set/filter AODs for prim/sec tracks
1028 fSelPrimTracks->Add(track);
1033 //________________________________________________________________________
1034 void AliAnalysisTaskEMCALPi0PbPb::CalcTracks()
1036 // Calculate track properties (including secondaries).
1038 fSelTracks->Clear();
1040 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1041 TClonesArray *tracks = 0;
1043 am->LoadBranch("Tracks");
1044 TList *l = fEsdEv->GetList();
1045 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
1047 am->LoadBranch("tracks");
1048 TList *l = fAodEv->GetList();
1049 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
1056 const Int_t Ntracks = tracks->GetEntries();
1057 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
1058 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
1060 AliWarning(Form("Could not receive track %d\n", iTracks));
1063 if (fTrCuts && !fTrCuts->IsSelected(track))
1065 Double_t eta = track->Eta();
1068 fSelTracks->Add(track);
1071 Int_t ntracks = tracks->GetEntries();
1072 for (Int_t i=0; i<ntracks; ++i) {
1073 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1076 Double_t eta = track->Eta();
1079 if(track->GetTPCNcls()<fMinNClusPerTr)
1082 if (0 && (track->Pt()>=0.6) && (track->PxAtDCA()==-999)) { // compute position on EMCAL
1083 AliExternalTrackParam tParam(track);
1084 if (AliTrackerBase::PropagateTrackToBxByBz(&tParam, 438, 0.139, 1, kTRUE)) {
1086 tParam.GetXYZ(trkPos);
1087 track->SetPxPyPzAtDCA(trkPos[0],trkPos[1],trkPos[2]);
1090 fSelTracks->Add(track);
1095 //________________________________________________________________________
1096 void AliAnalysisTaskEMCALPi0PbPb::ClusterAfterburner()
1098 // Run custer reconstruction afterburner.
1100 AliVCaloCells *cells = fEsdCells;
1107 Int_t ncells = cells->GetNumberOfCells();
1111 Double_t cellMeanE = 0, cellSigE = 0;
1112 for (Int_t i = 0; i<ncells; ++i) {
1113 Double_t cellE = cells->GetAmplitude(i);
1115 cellSigE += cellE*cellE;
1117 cellMeanE /= ncells;
1119 cellSigE -= cellMeanE*cellMeanE;
1122 cellSigE = TMath::Sqrt(cellSigE / ncells);
1124 Double_t subE = cellMeanE - 7*cellSigE;
1128 for (Int_t i = 0; i<ncells; ++i) {
1130 Double_t amp=0,time=0;
1131 if (!cells->GetCell(i, id, amp, time))
1136 cells->SetCell(i, id, amp, time);
1139 TObjArray *clusters = fEsdClusters;
1141 clusters = fAodClusters;
1145 Int_t nclus = clusters->GetEntries();
1146 for (Int_t i = 0; i<nclus; ++i) {
1147 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
1148 if (!clus->IsEMCAL())
1150 Int_t nc = clus->GetNCells();
1152 UShort_t ids[100] = {0};
1153 Double_t fra[100] = {0};
1154 for (Int_t j = 0; j<nc; ++j) {
1155 Short_t id = TMath::Abs(clus->GetCellAbsId(j));
1156 Double_t cen = cells->GetCellAmplitude(id);
1164 clusters->RemoveAt(i);
1168 for (Int_t j = 0; j<nc; ++j) {
1169 Short_t id = ids[j];
1170 Double_t cen = cells->GetCellAmplitude(id);
1174 AliAODCaloCluster *aodclus = dynamic_cast<AliAODCaloCluster*>(clus);
1177 aodclus->SetNCells(nc);
1178 aodclus->SetCellsAmplitudeFraction(fra);
1179 aodclus->SetCellsAbsId(ids);
1182 clusters->Compress();
1185 //________________________________________________________________________
1186 void AliAnalysisTaskEMCALPi0PbPb::FillCellHists()
1188 // Fill histograms related to cell properties.
1190 AliVCaloCells *cells = fEsdCells;
1197 Int_t cellModCount[12] = {0};
1198 Double_t cellMaxE = 0;
1199 Double_t cellMeanE = 0;
1200 Int_t ncells = cells->GetNumberOfCells();
1204 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
1206 for (Int_t i = 0; i<ncells; ++i) {
1207 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1208 Double_t cellE = cells->GetAmplitude(i);
1209 fHCellE->Fill(cellE);
1214 Int_t iSM=-1, iTower=-1, nIphi=-1, nIeta=-1;
1215 Bool_t ret = fGeom->GetCellIndex(absID, iSM, iTower, nIphi, nIeta);
1217 AliError(Form("Could not get cell index for %d", absID));
1220 ++cellModCount[iSM];
1221 Int_t iPhi=-1, iEta=-1;
1222 fGeom->GetCellPhiEtaIndexInSModule(iSM, iTower, nIphi, nIeta, iPhi, iEta);
1223 fHColuRow[iSM]->Fill(iEta,iPhi,1);
1224 fHColuRowE[iSM]->Fill(iEta,iPhi,cellE);
1225 fHCellFreqNoCut[iSM]->Fill(absID);
1226 if (cellE > 0.1) fHCellFreqCut100M[iSM]->Fill(absID);
1227 if (cellE > 0.3) fHCellFreqCut300M[iSM]->Fill(absID);
1228 if (fHCellCheckE && fHCellCheckE[absID])
1229 fHCellCheckE[absID]->Fill(cellE);
1230 fHCellFreqE[iSM]->Fill(absID, cellE);
1234 fGeom->GetGlobal(absID,pos);
1235 Int_t id2 = fGeom-> GetAbsCellIdFromCellIndexes(iSM, iPhi+1,iEta+1);
1237 fGeom->GetGlobal(id2,pos2);
1238 cout << "delta phi " << pos.DeltaPhi(pos2) << " " << TMath::Abs(pos2.Eta()-pos.Eta()) << endl;
1241 fHCellH->Fill(cellMaxE);
1242 cellMeanE /= ncells;
1243 fHCellM->Fill(cellMeanE);
1244 fHCellM2->Fill(cellMeanE*ncells/24/48/nsm);
1245 for (Int_t i=0; i<nsm; ++i)
1246 fHCellMult[i]->Fill(cellModCount[i]);
1249 //________________________________________________________________________
1250 void AliAnalysisTaskEMCALPi0PbPb::FillClusHists()
1252 // Fill histograms related to cluster properties.
1254 TObjArray *clusters = fEsdClusters;
1256 clusters = fAodClusters;
1260 Double_t vertex[3] = {0};
1261 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1263 Int_t nclus = clusters->GetEntries();
1264 for(Int_t i = 0; i<nclus; ++i) {
1265 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
1268 if (!clus->IsEMCAL())
1270 TLorentzVector clusterVec;
1271 clus->GetMomentum(clusterVec,vertex);
1272 Double_t maxAxis = clus->GetTOF(); //sigma
1273 Double_t clusterEcc = clus->Chi2(); //eccentricity
1274 fHClustEccentricity->Fill(clusterEcc);
1275 fHClustEtaPhi->Fill(clusterVec.Eta(),clusterVec.Phi());
1276 fHClustEnergyPt->Fill(clusterVec.E(),clusterVec.Pt());
1277 fHClustEnergySigma->Fill(clus->E()*maxAxis,clus->E());
1278 fHClustSigmaSigma->Fill(max(clus->GetM02(),clus->GetM20()),clus->E()*maxAxis);
1279 fHClustNCellEnergyRatio->Fill(clus->GetNCells(),GetMaxCellEnergy(clus)/clus->E());
1283 //________________________________________________________________________
1284 void AliAnalysisTaskEMCALPi0PbPb::FillNtuple()
1291 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1293 fHeader->fRun = fAodEv->GetRunNumber();
1294 fHeader->fOrbit = fAodEv->GetHeader()->GetOrbitNumber();
1295 fHeader->fPeriod = fAodEv->GetHeader()->GetPeriodNumber();
1296 fHeader->fBx = fAodEv->GetHeader()->GetBunchCrossNumber();
1297 fHeader->fL0 = fAodEv->GetHeader()->GetL0TriggerInputs();
1298 fHeader->fL1 = fAodEv->GetHeader()->GetL1TriggerInputs();
1299 fHeader->fL2 = fAodEv->GetHeader()->GetL2TriggerInputs();
1300 fHeader->fTrClassMask = fAodEv->GetHeader()->GetTriggerMask();
1301 fHeader->fTrCluster = fAodEv->GetHeader()->GetTriggerCluster();
1302 fHeader->fOffTriggers = fAodEv->GetHeader()->GetOfflineTrigger();
1303 fHeader->fFiredTriggers = fAodEv->GetHeader()->GetFiredTriggerClasses();
1305 fHeader->fRun = fEsdEv->GetRunNumber();
1306 fHeader->fOrbit = fEsdEv->GetHeader()->GetOrbitNumber();
1307 fHeader->fPeriod = fEsdEv->GetESDRun()->GetPeriodNumber();
1308 fHeader->fBx = fEsdEv->GetHeader()->GetBunchCrossNumber();
1309 fHeader->fL0 = fEsdEv->GetHeader()->GetL0TriggerInputs();
1310 fHeader->fL1 = fEsdEv->GetHeader()->GetL1TriggerInputs();
1311 fHeader->fL2 = fEsdEv->GetHeader()->GetL2TriggerInputs();
1312 fHeader->fTrClassMask = fEsdEv->GetHeader()->GetTriggerMask();
1313 fHeader->fTrCluster = fEsdEv->GetHeader()->GetTriggerCluster();
1314 fHeader->fOffTriggers = ((AliInputEventHandler*)(am->GetInputEventHandler()))->IsEventSelected();
1315 fHeader->fFiredTriggers = fEsdEv->GetFiredTriggerClasses();
1317 AliCentrality *cent = InputEvent()->GetCentrality();
1318 fHeader->fV0Cent = cent->GetCentralityPercentileUnchecked("V0M");
1319 fHeader->fCl1Cent = cent->GetCentralityPercentileUnchecked("CL1");
1320 fHeader->fTrCent = cent->GetCentralityPercentileUnchecked("TRK");
1321 fHeader->fCqual = cent->GetQuality();
1323 AliEventplane *ep = InputEvent()->GetEventplane();
1325 if (ep->GetQVector())
1326 fHeader->fPsi = ep->GetQVector()->Phi()/2. ;
1328 if (ep->GetQsub1()&&ep->GetQsub2())
1329 fHeader->fPsiRes = ep->GetQsub1()->Phi()/2.-ep->GetQsub2()->Phi()/2.;
1331 fHeader->fPsiRes = 0;
1335 TString trgclasses(fHeader->fFiredTriggers);
1336 for (Int_t j = 0; j<fTrClassNamesArr->GetEntries(); ++j) {
1337 const char *name = fTrClassNamesArr->At(j)->GetName();
1338 if (trgclasses.Contains(name))
1339 val += TMath::Power(2,j);
1341 fHeader->fTcls = (UInt_t)val;
1344 am->LoadBranch("vertices");
1345 AliAODVertex *pv = fAodEv->GetPrimaryVertex();
1346 FillVertex(fPrimVert, pv);
1347 AliAODVertex *sv = fAodEv->GetPrimaryVertexSPD();
1348 FillVertex(fSpdVert, sv);
1350 am->LoadBranch("PrimaryVertex.");
1351 const AliESDVertex *pv = fEsdEv->GetPrimaryVertexTracks();
1352 FillVertex(fPrimVert, pv);
1353 am->LoadBranch("SPDVertex.");
1354 const AliESDVertex *sv = fEsdEv->GetPrimaryVertexSPD();
1355 FillVertex(fSpdVert, sv);
1356 am->LoadBranch("TPCVertex.");
1357 const AliESDVertex *tv = fEsdEv->GetPrimaryVertexTPC();
1358 FillVertex(fTpcVert, tv);
1364 //________________________________________________________________________
1365 void AliAnalysisTaskEMCALPi0PbPb::FillPionHists()
1367 // Fill histograms related to pions.
1369 Double_t vertex[3] = {0};
1370 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1372 TObjArray *clusters = fEsdClusters;
1374 clusters = fAodClusters;
1377 TLorentzVector clusterVec1;
1378 TLorentzVector clusterVec2;
1379 TLorentzVector pionVec;
1381 Int_t nclus = clusters->GetEntries();
1382 for (Int_t i = 0; i<nclus; ++i) {
1383 AliVCluster *clus1 = static_cast<AliVCluster*>(clusters->At(i));
1386 if (!clus1->IsEMCAL())
1388 if (clus1->E()<fMinE)
1390 if (clus1->GetNCells()<fNminCells)
1392 if (GetMaxCellEnergy(clus1)/clus1->E()<fMinErat)
1394 if (clus1->Chi2()<fMinEcc) // eccentricity cut
1396 clus1->GetMomentum(clusterVec1,vertex);
1397 for (Int_t j = i+1; j<nclus; ++j) {
1398 AliVCluster *clus2 = static_cast<AliVCluster*>(clusters->At(j));
1401 if (!clus2->IsEMCAL())
1403 if (clus2->E()<fMinE)
1405 if (clus2->GetNCells()<fNminCells)
1407 if (GetMaxCellEnergy(clus2)/clus2->E()<fMinErat)
1409 if (clus2->Chi2()<fMinEcc) // eccentricity cut
1411 clus2->GetMomentum(clusterVec2,vertex);
1412 pionVec = clusterVec1 + clusterVec2;
1413 Double_t pionZgg = TMath::Abs(clusterVec1.E()-clusterVec2.E())/pionVec.E();
1414 Double_t pionOpeningAngle = clusterVec1.Angle(clusterVec2.Vect());
1415 if (pionZgg < fAsymMax) {
1416 fHPionEtaPhi->Fill(pionVec.Eta(),pionVec.Phi());
1417 fHPionMggPt->Fill(pionVec.M(),pionVec.Pt());
1418 fHPionMggAsym->Fill(pionVec.M(),pionZgg);
1419 fHPionMggDgg->Fill(pionVec.M(),pionOpeningAngle);
1420 Int_t bin = fPtRanges->FindBin(pionVec.Pt());
1421 fHPionInvMasses[bin]->Fill(pionVec.M());
1428 //________________________________________________________________________
1429 void AliAnalysisTaskEMCALPi0PbPb::FillOtherHists()
1431 // Fill other histograms.
1434 //__________________________________________________________________________________________________
1435 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliESDVertex *esdv)
1437 // Fill vertex from ESD vertex info.
1439 v->fVx = esdv->GetX();
1440 v->fVy = esdv->GetY();
1441 v->fVz = esdv->GetZ();
1442 v->fVc = esdv->GetNContributors();
1443 v->fDisp = esdv->GetDispersion();
1444 v->fZres = esdv->GetZRes();
1445 v->fChi2 = esdv->GetChi2();
1446 v->fSt = esdv->GetStatus();
1447 v->fIs3D = esdv->IsFromVertexer3D();
1448 v->fIsZ = esdv->IsFromVertexerZ();
1451 //__________________________________________________________________________________________________
1452 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliAODVertex *aodv)
1454 // Fill vertex from AOD vertex info.
1456 v->fVx = aodv->GetX();
1457 v->fVy = aodv->GetY();
1458 v->fVz = aodv->GetZ();
1459 v->fVc = aodv->GetNContributors();
1460 v->fChi2 = aodv->GetChi2();
1463 //________________________________________________________________________
1464 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellIsolation(Double_t cEta, Double_t cPhi, Double_t radius) const
1466 // Compute isolation based on cell content.
1468 AliVCaloCells *cells = fEsdCells;
1474 Double_t cellIsolation = 0;
1475 Double_t rad2 = radius*radius;
1476 Int_t ncells = cells->GetNumberOfCells();
1477 for (Int_t i = 0; i<ncells; ++i) {
1478 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1479 Double_t cellE = cells->GetAmplitude(i);
1481 fGeom->EtaPhiFromIndex(absID,eta,phi);
1482 Double_t phidiff = TVector2::Phi_0_2pi(phi-cPhi);
1483 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1486 cellIsolation += cellE;
1488 return cellIsolation;
1491 //________________________________________________________________________
1492 Double_t AliAnalysisTaskEMCALPi0PbPb::GetMaxCellEnergy(AliVCluster *cluster, Short_t &id) const
1494 // Get maximum energy of attached cell.
1498 Int_t ncells = cluster->GetNCells();
1500 for (Int_t i=0; i<ncells; i++) {
1501 Double_t e = fEsdCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
1504 id = cluster->GetCellAbsId(i);
1508 for (Int_t i=0; i<ncells; i++) {
1509 Double_t e = fAodCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
1512 id = cluster->GetCellAbsId(i);
1518 //________________________________________________________________________
1519 void AliAnalysisTaskEMCALPi0PbPb::GetSigma(AliVCluster *c, Double_t& sigmaMax, Double_t &sigmaMin) const
1521 // Calculate the (E) weighted variance along the longer (eigen) axis.
1523 sigmaMax = 0; // cluster variance along its longer axis
1524 sigmaMin = 0; // cluster variance along its shorter axis
1525 Double_t Ec = c->E(); // cluster energy
1528 Double_t Xc = 0 ; // cluster first moment along X
1529 Double_t Yc = 0 ; // cluster first moment along Y
1530 Double_t Sxx = 0 ; // cluster second central moment along X (variance_X^2)
1531 Double_t Sxy = 0 ; // cluster second central moment along Y (variance_Y^2)
1532 Double_t Syy = 0 ; // cluster covariance^2
1534 AliVCaloCells *cells = fEsdCells;
1541 Int_t ncells = c->GetNCells();
1545 for(Int_t j=0; j<ncells; ++j) {
1546 Int_t id = TMath::Abs(c->GetCellAbsId(j));
1547 Double_t cellen = cells->GetCellAmplitude(id);
1549 fGeom->GetGlobal(id,pos);
1550 Xc += cellen*pos.X();
1551 Yc += cellen*pos.Y();
1552 Sxx += cellen*pos.X()*pos.X();
1553 Syy += cellen*pos.Y()*pos.Y();
1554 Sxy += cellen*pos.X()*pos.Y();
1564 Sxx = TMath::Abs(Sxx);
1565 Syy = TMath::Abs(Syy);
1566 sigmaMax = (Sxx + Syy + TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
1567 sigmaMax = TMath::Sqrt(TMath::Abs(sigmaMax));
1568 sigmaMin = TMath::Abs(Sxx + Syy - TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
1569 sigmaMin = TMath::Sqrt(TMath::Abs(sigmaMin));
1572 //________________________________________________________________________
1573 Int_t AliAnalysisTaskEMCALPi0PbPb::GetNCells(AliVCluster *c, Double_t emin) const
1575 // Calculate number of attached cells above emin.
1577 AliVCaloCells *cells = fEsdCells;
1584 Int_t ncells = c->GetNCells();
1585 for(Int_t j=0; j<ncells; ++j) {
1586 Int_t id = TMath::Abs(c->GetCellAbsId(j));
1587 Double_t cellen = cells->GetCellAmplitude(id);
1594 //________________________________________________________________________
1595 Double_t AliAnalysisTaskEMCALPi0PbPb::GetTrackIsolation(Double_t cEta, Double_t cPhi, Double_t radius, Double_t pt) const
1597 // Compute isolation based on tracks.
1599 Double_t trkIsolation = 0;
1600 Double_t rad2 = radius*radius;
1601 Int_t ntrks = fSelPrimTracks->GetEntries();
1602 for(Int_t j = 0; j<ntrks; ++j) {
1603 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
1608 Float_t eta = track->Eta();
1609 Float_t phi = track->Phi();
1610 Double_t phidiff = TVector2::Phi_0_2pi(phi-cPhi);
1611 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1614 trkIsolation += track->Pt();
1616 return trkIsolation;