3 #include "AliAnalysisTaskEMCALPi0PbPb.h"
6 #include <TClonesArray.h>
8 #include <TGeoGlobalMagField.h>
12 #include <TLorentzVector.h>
18 #include "AliAODEvent.h"
19 #include "AliAODMCParticle.h"
20 #include "AliAODVertex.h"
21 #include "AliAnalysisManager.h"
22 #include "AliAnalysisTaskEMCALClusterizeFast.h"
23 #include "AliCDBManager.h"
24 #include "AliCentrality.h"
25 #include "AliEMCALDigit.h"
26 #include "AliEMCALGeometry.h"
27 #include "AliEMCALRecPoint.h"
28 #include "AliEMCALRecoUtils.h"
29 #include "AliESDCaloTrigger.h"
30 #include "AliESDEvent.h"
31 #include "AliESDUtils.h"
32 #include "AliESDVertex.h"
33 #include "AliESDtrack.h"
34 #include "AliESDtrackCuts.h"
35 #include "AliEventplane.h"
36 #include "AliGeomManager.h"
37 #include "AliInputEventHandler.h"
39 #include "AliMCEvent.h"
40 #include "AliMCParticle.h"
42 #include "AliMultiplicity.h"
44 #include "AliTrackerBase.h"
45 #include "AliTriggerAnalysis.h"
47 ClassImp(AliAnalysisTaskEMCALPi0PbPb)
49 //________________________________________________________________________
50 AliAnalysisTaskEMCALPi0PbPb::AliAnalysisTaskEMCALPi0PbPb()
51 : AliAnalysisTaskSE(),
66 fGeoName("EMCAL_FIRSTYEARV1"),
81 fTrigName("EmcalClusters_L0FEE"),
111 fHTclsBeforeCuts(0x0),
112 fHTclsAfterCuts(0x0),
120 fHCellFreqNoCut(0x0),
121 fHCellFreqCut100M(0x0),
122 fHCellFreqCut300M(0x0),
125 fHClustEccentricity(0),
127 fHClustEnergyPt(0x0),
128 fHClustEnergySigma(0x0),
129 fHClustSigmaSigma(0x0),
130 fHClustNCellEnergyRatio(0x0),
131 fHClustEnergyNCell(0x0),
146 //________________________________________________________________________
147 AliAnalysisTaskEMCALPi0PbPb::AliAnalysisTaskEMCALPi0PbPb(const char *name)
148 : AliAnalysisTaskSE(name),
163 fGeoName("EMCAL_FIRSTYEARV1"),
178 fTrigName("EmcalClusters_L0FEE"),
208 fHTclsBeforeCuts(0x0),
209 fHTclsAfterCuts(0x0),
217 fHCellFreqNoCut(0x0),
218 fHCellFreqCut100M(0x0),
219 fHCellFreqCut300M(0x0),
222 fHClustEccentricity(0),
224 fHClustEnergyPt(0x0),
225 fHClustEnergySigma(0x0),
226 fHClustSigmaSigma(0x0),
227 fHClustNCellEnergyRatio(0x0),
228 fHClustEnergyNCell(0x0),
242 DefineOutput(1, TList::Class());
243 fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.,SPDVertex.,TPCVertex.,EMCALCells.,Tracks,EMCALTrigger. "
244 "AOD:header,vertices,emcalCells,tracks";
247 //________________________________________________________________________
248 AliAnalysisTaskEMCALPi0PbPb::~AliAnalysisTaskEMCALPi0PbPb()
252 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
253 delete fOutput; fOutput = 0;
255 delete fPtRanges; fPtRanges = 0;
256 fGeom = 0; // do not delete geometry when using instance
257 delete fReco; fReco = 0;
258 delete fTrClassNamesArr;
260 delete fSelPrimTracks;
262 delete [] fHColuRowE;
263 delete [] fHCellMult;
264 delete [] fHCellFreqNoCut;
265 delete [] fHCellFreqCut100M;
266 delete [] fHCellFreqCut300M;
269 //________________________________________________________________________
270 void AliAnalysisTaskEMCALPi0PbPb::UserCreateOutputObjects()
272 // Create user objects here.
274 cout << "AliAnalysisTaskEMCALPi0PbPb: Input settings" << endl;
275 cout << " fCentVar: " << fCentVar << endl;
276 cout << " fCentFrom: " << fCentFrom << endl;
277 cout << " fCentTo: " << fCentTo << endl;
278 cout << " fVtxZMin: " << fVtxZMin << endl;
279 cout << " fVtxZMax: " << fVtxZMax << endl;
280 cout << " fUseQualFlag: " << fUseQualFlag << endl;
281 cout << " fClusName: \"" << fClusName << "\"" << endl;
282 cout << " fDoNtuple: " << fDoNtuple << endl;
283 cout << " fDoAfterburner: " << fDoAfterburner << endl;
284 cout << " fAsymMax: " << fAsymMax << endl;
285 cout << " fNminCells: " << fNminCells << endl;
286 cout << " fMinE: " << fMinE << endl;
287 cout << " fMinErat: " << fMinErat << endl;
288 cout << " fMinEcc: " << fMinEcc << endl;
289 cout << " fGeoName: \"" << fGeoName << "\"" << endl;
290 cout << " fMinNClusPerTr: " << fMinNClusPerTr << endl;
291 cout << " fIsoDist: " << fIsoDist << endl;
292 cout << " fTrClassNames: \"" << fTrClassNames << "\"" << endl;
293 cout << " fTrCuts: " << fTrCuts << endl;
294 cout << " fPrimTrCuts: " << fPrimTrCuts << endl;
295 cout << " fDoTrMatGeom: " << fDoTrMatGeom << endl;
296 cout << " fTrainMode: " << fTrainMode << endl;
297 cout << " fMarkCells: " << fMarkCells << endl;
298 cout << " fMinL0Time: " << fMinL0Time << endl;
299 cout << " fMaxL0Time: " << fMaxL0Time << endl;
300 cout << " fMcMode: " << fMcMode << endl;
301 cout << " fEmbedMode: " << fEmbedMode << endl;
302 cout << " fGeom: " << fGeom << endl;
303 cout << " fReco: " << fReco << endl;
304 cout << " fTrigName: " << fTrigName << endl;
305 cout << " fDoPSel: " << fDoPSel << endl;
308 fGeom = AliEMCALGeometry::GetInstance(fGeoName);
310 if (fGeom->GetMatrixForSuperModule(0))
311 fIsGeoMatsSet = kTRUE;
314 fReco = new AliEMCALRecoUtils();
315 fTrClassNamesArr = fTrClassNames.Tokenize(" ");
316 fOutput = new TList();
317 fOutput->SetOwner(1);
318 fSelTracks = new TObjArray;
319 fSelPrimTracks = new TObjArray;
322 TFile *f = OpenFile(1);
323 TDirectory::TContext context(f);
325 f->SetCompressionLevel(2);
326 fNtuple = new TTree(Form("tree%.0fto%.0f",fCentFrom,fCentTo), "StandaloneTree");
327 fNtuple->SetDirectory(f);
329 fNtuple->SetAutoFlush(-2*1024*1024);
330 fNtuple->SetAutoSave(0);
332 fNtuple->SetAutoFlush(-32*1024*1024);
333 fNtuple->SetAutoSave(0);
336 fHeader = new AliStaHeader;
337 fNtuple->Branch("header", &fHeader, 16*1024, 99);
338 fPrimVert = new AliStaVertex;
339 fNtuple->Branch("primv", &fPrimVert, 16*1024, 99);
340 fSpdVert = new AliStaVertex;
341 fNtuple->Branch("spdv", &fSpdVert, 16*1024, 99);
342 fTpcVert = new AliStaVertex;
343 fNtuple->Branch("tpcv", &fTpcVert, 16*1024, 99);
344 if (TClass::GetClass("AliStaCluster"))
345 TClass::GetClass("AliStaCluster")->IgnoreTObjectStreamer();
346 fClusters = new TClonesArray("AliStaCluster");
347 fNtuple->Branch("clusters", &fClusters, 8*16*1024, 99);
348 if (TClass::GetClass("AliStaTrigger"))
349 TClass::GetClass("AliStaTrigger")->IgnoreTObjectStreamer();
350 fTriggers = new TClonesArray("AliStaTrigger");
351 fNtuple->Branch("l0prim", &fTriggers, 16*1024, 99);
352 if (fMcMode||fEmbedMode) {
353 if (TClass::GetClass("AliStaPart"))
354 TClass::GetClass("AliStaPart")->IgnoreTObjectStreamer();
355 fMcParts = new TClonesArray("AliStaPart");
356 fNtuple->Branch("mcparts", &fMcParts, 8*16*1024, 99);
361 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
362 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad();
363 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad();
366 Bool_t th1 = TH1::GetDefaultSumw2();
367 TH1::SetDefaultSumw2(kTRUE);
368 Bool_t th2 = TH2::GetDefaultSumw2();
369 TH2::SetDefaultSumw2(kTRUE);
370 fHCuts = new TH1F("hEventCuts","",5,0.5,5.5);
371 fHCuts->GetXaxis()->SetBinLabel(1,"All");
372 fHCuts->GetXaxis()->SetBinLabel(2,"PS");
373 fHCuts->GetXaxis()->SetBinLabel(3,Form("%s: %.0f-%.0f",fCentVar.Data(),fCentFrom,fCentTo));
374 fHCuts->GetXaxis()->SetBinLabel(4,"QFlag");
375 fHCuts->GetXaxis()->SetBinLabel(5,Form("zvtx: %.0f-%.0f",fVtxZMin,fVtxZMax));
376 fOutput->Add(fHCuts);
377 fHVertexZ = new TH1F("hVertexZBeforeCut","",100,-25,25);
378 fHVertexZ->SetXTitle("z [cm]");
379 fOutput->Add(fHVertexZ);
380 fHVertexZ2 = new TH1F("hVertexZAfterCut","",100,-25,25);
381 fHVertexZ2->SetXTitle("z [cm]");
382 fOutput->Add(fHVertexZ2);
383 fHCent = new TH1F("hCentBeforeCut","",102,-1,101);
384 fHCent->SetXTitle(fCentVar.Data());
385 fOutput->Add(fHCent);
386 fHCentQual = new TH1F("hCentAfterCut","",102,-1,101);
387 fHCentQual->SetXTitle(fCentVar.Data());
388 fOutput->Add(fHCentQual);
389 fHTclsBeforeCuts = new TH1F("hTclsBeforeCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
390 fHTclsAfterCuts = new TH1F("hTclsAfterCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
391 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
392 const char *name = fTrClassNamesArr->At(i)->GetName();
393 fHTclsBeforeCuts->GetXaxis()->SetBinLabel(1+i,name);
394 fHTclsAfterCuts->GetXaxis()->SetBinLabel(1+i,name);
396 fOutput->Add(fHTclsBeforeCuts);
397 fOutput->Add(fHTclsAfterCuts);
399 // histograms for cells
400 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
401 fHColuRow = new TH2*[nsm];
402 fHColuRowE = new TH2*[nsm];
403 fHCellMult = new TH1*[nsm];
404 for (Int_t i = 0; i<nsm; ++i) {
405 fHColuRow[i] = new TH2F(Form("hColRow_Mod%d",i),"",48,0,48,24,0.,24);
406 fHColuRow[i]->SetTitle(Form("Module %d: Occupancy", i));
407 fHColuRow[i]->SetXTitle("col (i#eta)");
408 fHColuRow[i]->SetYTitle("row (i#phi)");
409 fHColuRowE[i] = new TH2F(Form("hColRowE_Mod%d", i),"",48,0,48,24,0,24);
410 fHColuRowE[i]->SetTitle(Form("Module %d: Cell energy",i));
411 fHColuRowE[i]->SetXTitle("col (i#eta)");
412 fHColuRowE[i]->SetYTitle("row (i#phi)");
413 fHCellMult[i] = new TH1F(Form("hCellMult_Mod%d",i),"",1000,0,1000);
414 fHCellMult[i]->SetTitle(Form("Module %d: Cell multiplicity",i));
415 fHCellMult[i]->SetXTitle("# of cells");
416 fOutput->Add(fHColuRow[i]);
417 fOutput->Add(fHColuRowE[i]);
418 fOutput->Add(fHCellMult[i]);
420 fHCellE = new TH1F("hCellE","",250,0.,25.);
421 fHCellE->SetXTitle("E_{cell} [GeV]");
422 fOutput->Add(fHCellE);
423 fHCellH = new TH1F ("hCellHighestE","",250,0.,25.);
424 fHCellH->SetXTitle("E^{max}_{cell} [GeV]");
425 fOutput->Add(fHCellH);
426 fHCellM = new TH1F ("hCellMeanEperHitCell","",250,0.,2.5);
427 fHCellM->SetXTitle("#LT E_{cell}#GT [GeV]");
428 fOutput->Add(fHCellM);
429 fHCellM2 = new TH1F ("hCellMeanEperAllCells","",250,0.,1);
430 fHCellM2->SetXTitle("1/N_{cells} #Sigma E_{cell} [GeV]");
431 fOutput->Add(fHCellM2);
433 fHCellFreqNoCut = new TH1*[nsm];
434 fHCellFreqCut100M = new TH1*[nsm];
435 fHCellFreqCut300M = new TH1*[nsm];
436 fHCellFreqE = new TH1*[nsm];
437 for (Int_t i = 0; i<nsm; ++i){
438 Double_t lbin = i*24*48-0.5;
439 Double_t hbin = lbin+24*48;
440 fHCellFreqNoCut[i] = new TH1F(Form("hCellFreqNoCut_SM%d",i),
441 Form("Frequency SM%d (no cut);id;#",i), 1152, lbin, hbin);
442 fHCellFreqCut100M[i] = new TH1F(Form("hCellFreqCut100M_SM%d",i),
443 Form("Frequency SM%d (>0.1GeV);id;#",i), 1152, lbin, hbin);
444 fHCellFreqCut300M[i] = new TH1F(Form("hCellFreqCut300M_SM%d",i),
445 Form("Frequency SM%d (>0.3GeV);id;#",i), 1152, lbin, hbin);
446 fHCellFreqE[i] = new TH1F(Form("hCellFreqE_SM%d",i),
447 Form("Frequency SM%d (E weighted);id;#",i), 1152, lbin, hbin);
448 fOutput->Add(fHCellFreqNoCut[i]);
449 fOutput->Add(fHCellFreqCut100M[i]);
450 fOutput->Add(fHCellFreqCut300M[i]);
451 fOutput->Add(fHCellFreqE[i]);
453 if (!fMarkCells.IsNull()) {
454 fHCellCheckE = new TH1*[24*48*nsm];
455 memset(fHCellCheckE,0,24*48*nsm*sizeof(TH1*));
456 TObjArray *cells = fMarkCells.Tokenize(" ");
457 Int_t n = cells->GetEntries();
458 Int_t *tcs = new Int_t[n];
459 for (Int_t i=0;i<n;++i) {
460 TString name(cells->At(i)->GetName());
463 for (Int_t i = 0; i<n; ++i) {
466 fHCellCheckE[i] = new TH1F(Form("hCellE_id%d",c), Form("Cell %d;E [GeV/c];#",c), 1000, 0, 10);
467 fOutput->Add(fHCellCheckE[i]);
474 // histograms for clusters
476 fHClustEccentricity = new TH1F("hClustEccentricity","",100,-0.1,1.1);
477 fHClustEccentricity->SetXTitle("#epsilon_{C}");
478 fOutput->Add(fHClustEccentricity);
479 fHClustEtaPhi = new TH2F("hClustEtaPhi","",500,-0.8,0.8,100*nsm,phimin,phimax);
480 fHClustEtaPhi->SetXTitle("#eta");
481 fHClustEtaPhi->SetYTitle("#varphi");
482 fOutput->Add(fHClustEtaPhi);
483 fHClustEnergyPt = new TH2F("hClustEnergyPt","",250,0,50,250,0,50);
484 fHClustEnergyPt->SetXTitle("E [GeV]");
485 fHClustEnergyPt->SetYTitle("p_{T} [GeV/c]");
486 fOutput->Add(fHClustEnergyPt);
487 fHClustEnergySigma = new TH2F("hClustEnergySigma","",100,0,100,500,0,50);
488 fHClustEnergySigma->SetXTitle("E_{C} * #sigma_{max} [GeV*cm]");
489 fHClustEnergySigma->SetYTitle("E_{C} [GeV]");
490 fOutput->Add(fHClustEnergySigma);
491 fHClustSigmaSigma = new TH2F("hClustSigmaSigma","",500,0,50,500,0,50);
492 fHClustSigmaSigma->SetXTitle("#lambda_{0} [cm]");
493 fHClustSigmaSigma->SetYTitle("#sigma_{max} [cm]");
494 fOutput->Add(fHClustSigmaSigma);
495 fHClustNCellEnergyRatio = new TH2F("hClustNCellEnergyRatio","",27,-0.5,26.5,101,-0.05,1.05);
496 fHClustNCellEnergyRatio->SetXTitle("N_{cells}");
497 fHClustNCellEnergyRatio->SetYTitle("E^{max}_{cell}/E_{clus}");
498 fOutput->Add(fHClustNCellEnergyRatio);
499 fHClustEnergyNCell = new TH2F("hClustEnergyNCell","",200,0,100,50,0,50);
500 fHClustEnergyNCell->SetXTitle("E_{clus}");
501 fHClustEnergyNCell->SetYTitle("N_{cells}");
502 fOutput->Add(fHClustEnergyNCell);
505 // histograms for primary tracks
506 fHPrimTrackPt = new TH1F("hPrimTrackPt",";p_{T} [GeV/c]",500,0,50);
507 fOutput->Add(fHPrimTrackPt);
508 fHPrimTrackEta = new TH1F("hPrimTrackEta",";#eta",40,-2,2);
509 fOutput->Add(fHPrimTrackEta);
510 fHPrimTrackPhi = new TH1F("hPrimTrackPhi",";#varPhi [rad]",63,0,6.3);
511 fOutput->Add(fHPrimTrackPhi);
512 // histograms for track matching
513 fHMatchDr = new TH1F("hMatchDrDist",";dR [cm]",500,0,200);
514 fOutput->Add(fHMatchDr);
515 fHMatchDz = new TH1F("hMatchDzDist",";dZ [cm]",500,-100,100);
516 fOutput->Add(fHMatchDz);
517 fHMatchEp = new TH1F("hMatchEpDist",";E/p",100,0,10);
518 fOutput->Add(fHMatchEp);
520 // histograms for pion candidates
522 fHPionEtaPhi = new TH2F("hPionEtaPhi","",100,-0.8,0.8,100*nsm,phimin,phimax);
523 fHPionEtaPhi->SetXTitle("#eta_{#gamma#gamma}");
524 fHPionEtaPhi->SetYTitle("#varphi_{#gamma#gamma}");
525 fOutput->Add(fHPionEtaPhi);
526 fHPionMggPt = new TH2F("hPionMggPt","",1000,0,2,100,0,20.0);
527 fHPionMggPt->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
528 fHPionMggPt->SetYTitle("p_{T}^{#gamma#gamma} [GeV/c]");
529 fOutput->Add(fHPionMggPt);
530 fHPionMggAsym = new TH2F("hPionMggAsym","",1000,0,2,100,0,1);
531 fHPionMggAsym->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
532 fHPionMggAsym->SetYTitle("Z_{#gamma#gamma} [GeV]");
533 fOutput->Add(fHPionMggAsym);
534 fHPionMggDgg = new TH2F("hPionMggDgg","",1000,0,2,100,0,10);
535 fHPionMggDgg->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
536 fHPionMggDgg->SetYTitle("opening angle [grad]");
537 fOutput->Add(fHPionMggDgg);
538 const Int_t nbins = 20;
539 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};
540 fPtRanges = new TAxis(nbins-1,xbins);
541 for (Int_t i = 0; i<=nbins; ++i) {
542 fHPionInvMasses[i] = new TH1F(Form("hPionInvMass%d",i),"",1000,0,2);
543 fHPionInvMasses[i]->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
545 fHPionInvMasses[i]->SetTitle(Form("0 < p_{T}^{#gamma#gamma} <%.1f",xbins[0]));
547 fHPionInvMasses[i]->SetTitle(Form("p_{T}^{#gamma#gamma} > 50"));
549 fHPionInvMasses[i]->SetTitle(Form("%.1f < p_{T}^{#gamma#gamma} <%.1f",xbins[i-1],xbins[i]));
550 fOutput->Add(fHPionInvMasses[i]);
554 TH1::SetDefaultSumw2(th1);
555 TH2::SetDefaultSumw2(th2);
556 PostData(1, fOutput);
559 //________________________________________________________________________
560 void AliAnalysisTaskEMCALPi0PbPb::UserExec(Option_t *)
562 // Called for each event.
567 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
568 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
569 UInt_t offtrigger = 0;
571 am->LoadBranch("AliESDRun.");
572 am->LoadBranch("AliESDHeader.");
573 UInt_t mask1 = fEsdEv->GetESDRun()->GetDetectorsInDAQ();
574 UInt_t mask2 = fEsdEv->GetESDRun()->GetDetectorsInReco();
575 Bool_t desc1 = (mask1 >> 18) & 0x1;
576 Bool_t desc2 = (mask2 >> 18) & 0x1;
577 if (desc1==0 || desc2==0) { //AliDAQ::OfflineModuleName(18)=="EMCAL"
578 AliError(Form("EMCAL not in DAQ/RECO: %u (%u)/%u (%u)",
579 mask1, fEsdEv->GetESDRun()->GetDetectorsInReco(),
580 mask2, fEsdEv->GetESDRun()->GetDetectorsInDAQ()));
583 offtrigger = ((AliInputEventHandler*)(am->GetInputEventHandler()))->IsEventSelected();
585 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
587 AliFatal("Neither ESD nor AOD event found");
590 am->LoadBranch("header");
591 offtrigger = fAodEv->GetHeader()->GetOfflineTrigger();
593 if (!fMcMode && (offtrigger & AliVEvent::kFastOnly)) {
594 AliWarning(Form("EMCAL not in fast only partition"));
597 if (fDoTrMatGeom && !AliGeomManager::GetGeometry()) { // get geometry
598 AliWarning("Accessing geometry from OCDB, this is not very efficient!");
599 AliCDBManager *cdb = AliCDBManager::Instance();
600 if (!cdb->IsDefaultStorageSet())
601 cdb->SetDefaultStorage("raw://");
602 Int_t runno = InputEvent()->GetRunNumber();
603 if (runno != cdb->GetRun())
605 AliGeomManager::LoadGeometry();
608 if (!AliGeomManager::GetGeometry()&&!fIsGeoMatsSet) { // set misalignment matrices (stored in first event)
609 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
610 for (Int_t i=0; i<nsm; ++i) {
611 const TGeoHMatrix *geom = 0;
613 geom = fEsdEv->GetESDRun()->GetEMCALMatrix(i);
615 geom = fAodEv->GetHeader()->GetEMCALMatrix(i);
619 fGeom->SetMisalMatrix(geom,i);
621 fIsGeoMatsSet = kTRUE;
624 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
626 const AliESDRun *erun = fEsdEv->GetESDRun();
627 AliMagF *field = AliMagF::CreateFieldMap(erun->GetCurrentL3(),
628 erun->GetCurrentDip(),
631 erun->GetBeamEnergy(),
632 erun->GetBeamType());
633 TGeoGlobalMagField::Instance()->SetField(field);
635 Double_t pol = -1; //polarity
636 Double_t be = -1; //beam energy
637 AliMagF::BeamType_t btype = AliMagF::kBeamTypepp;
638 Int_t runno = fAodEv->GetRunNumber();
639 if (runno>=136851 && runno<138275) {
642 btype = AliMagF::kBeamTypeAA;
643 } else if (runno>=138275 && runno<=139517) {
646 btype = AliMagF::kBeamTypeAA;
648 AliError(Form("Do not know the bfield parameters for run %d! Using defaults!!!", runno));
650 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", pol, pol, AliMagF::k5kG, btype, be));
658 AliESDHeader *h = dynamic_cast<AliESDHeader*>(InputEvent()->GetHeader());
660 trgclasses = fEsdEv->GetFiredTriggerClasses();
662 AliAODHeader *h2 = dynamic_cast<AliAODHeader*>(InputEvent()->GetHeader());
664 trgclasses = h2->GetFiredTriggerClasses();
666 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
667 const char *name = fTrClassNamesArr->At(i)->GetName();
668 TRegexp regexp(name);
669 if (trgclasses.Contains(regexp))
670 fHTclsBeforeCuts->Fill(1+i);
673 if (fDoPSel && offtrigger==0)
678 const AliCentrality *centP = InputEvent()->GetCentrality();
679 Double_t cent = centP->GetCentralityPercentileUnchecked(fCentVar);
681 if (cent<fCentFrom||cent>fCentTo)
687 if (centP->GetQuality()>0)
691 fHCentQual->Fill(cent);
695 am->LoadBranch("PrimaryVertex.");
696 am->LoadBranch("SPDVertex.");
697 am->LoadBranch("TPCVertex.");
699 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
700 am->LoadBranch("vertices");
704 const AliVVertex *vertex = InputEvent()->GetPrimaryVertex();
708 fHVertexZ->Fill(vertex->GetZ());
710 if(vertex->GetZ()<fVtxZMin||vertex->GetZ()>fVtxZMax)
714 fHVertexZ2->Fill(vertex->GetZ());
716 // count number of accepted events
719 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
720 const char *name = fTrClassNamesArr->At(i)->GetName();
721 TRegexp regexp(name);
722 if (trgclasses.Contains(regexp))
723 fHTclsAfterCuts->Fill(1+i);
726 fRecPoints = 0; // will be set if fClusName is given and AliAnalysisTaskEMCALClusterizeFast is used
727 fDigits = 0; // will be set if fClusName is given and AliAnalysisTaskEMCALClusterizeFast is used
728 fEsdClusters = 0; // will be set if ESD input used and if fRecPoints are not set or if clusters are attached
729 fEsdCells = 0; // will be set if ESD input used
730 fAodClusters = 0; // will be set if AOD input used and if fRecPoints are not set or if clusters are attached
731 // or if fClusName is given and AliAnalysisTaskEMCALClusterizeFast in AOD output mode
732 fAodCells = 0; // will be set if AOD input used
734 // deal with special output from AliAnalysisTaskEMCALClusterizeFast first
735 Bool_t overwrite = 0;
736 Bool_t clusattached = 0;
737 Bool_t recalibrated = 0;
738 if (1 && !fClusName.IsNull()) {
739 AliAnalysisTaskEMCALClusterizeFast *cltask = 0;
740 TObjArray *ts = am->GetTasks();
741 cltask = dynamic_cast<AliAnalysisTaskEMCALClusterizeFast*>(ts->FindObject(fClusName));
742 if (cltask && cltask->GetClusters()) {
743 fRecPoints = cltask->GetClusters();
744 fDigits = cltask->GetDigits();
745 clusattached = cltask->GetAttachClusters();
746 overwrite = cltask->GetOverwrite();
747 if (cltask->GetCalibData()!=0)
748 recalibrated = kTRUE;
751 if (1 && !fClusName.IsNull()) {
754 l = AODEvent()->GetList();
756 l = fAodEv->GetList();
758 fAodClusters = dynamic_cast<TClonesArray*>(l->FindObject(fClusName));
762 if (fEsdEv) { // ESD input mode
763 if (1 && (!fRecPoints||clusattached)) {
764 if (!clusattached && !overwrite)
765 am->LoadBranch("CaloClusters");
766 TList *l = fEsdEv->GetList();
768 fEsdClusters = dynamic_cast<TClonesArray*>(l->FindObject(fClusName));
769 } else if (overwrite) {
770 fEsdClusters = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
775 am->LoadBranch("EMCALCells.");
776 fEsdCells = fEsdEv->GetEMCALCells();
778 } else if (fAodEv) { // AOD input mode
779 if (1 && (!fAodClusters || clusattached)) {
781 am->LoadBranch("caloClusters");
782 TList *l = fAodEv->GetList();
784 fAodClusters = dynamic_cast<TClonesArray*>(l->FindObject("caloClusters"));
789 am->LoadBranch("emcalCells");
790 fAodCells = fAodEv->GetEMCALCells();
793 AliFatal("Impossible to not have either pointer to ESD or AOD event");
797 AliDebug(2,Form("fRecPoints set: %p", fRecPoints));
798 AliDebug(2,Form("fDigits set: %p", fDigits));
799 AliDebug(2,Form("fEsdClusters set: %p", fEsdClusters));
800 AliDebug(2,Form("fEsdCells set: %p", fEsdCells));
801 AliDebug(2,Form("fAodClusters set: %p", fAodClusters));
802 AliDebug(2,Form("fAodCells set: %p", fAodCells));
806 ClusterAfterburner();
825 fSelPrimTracks->Clear();
834 PostData(1, fOutput);
837 //________________________________________________________________________
838 void AliAnalysisTaskEMCALPi0PbPb::Terminate(Option_t *)
840 // Terminate called at the end of analysis.
843 TFile *f = OpenFile(1);
844 TDirectory::TContext context(f);
849 AliInfo(Form("%s: Accepted %lld events ", GetName(), fNEvs));
852 //________________________________________________________________________
853 void AliAnalysisTaskEMCALPi0PbPb::CalcCaloTriggers()
855 // Calculate triggers
858 return; // information not available in AOD
865 if (fTrigName.Length()<=0)
868 TClonesArray *arr = dynamic_cast<TClonesArray*>(fEsdEv->FindListObject(fTrigName));
870 AliError(Form("Could not get array with name %s", fTrigName.Data()));
874 Int_t nNumberOfCaloClusters = arr->GetEntries();
875 for(Int_t j = 0, ntrigs = 0; j < nNumberOfCaloClusters; ++j) {
876 AliVCluster *cl = dynamic_cast<AliVCluster*>(arr->At(j));
883 AliStaTrigger *trignew = static_cast<AliStaTrigger*>(fTriggers->New(ntrigs++));
884 Float_t pos[3] = {0,0,0};
885 cl->GetPosition(pos);
887 trignew->fE = cl->E();
888 trignew->fEta = vpos.Eta();
889 trignew->fPhi = vpos.Phi();
891 GetMaxCellEnergy(cl, id);
892 trignew->fIdMax = id;
896 //________________________________________________________________________
897 void AliAnalysisTaskEMCALPi0PbPb::CalcClusterProps()
899 // Calculate cluster properties
906 AliVCaloCells *cells = fEsdCells;
912 TObjArray *clusters = fEsdClusters;
914 clusters = fAodClusters;
918 Int_t ncells = cells->GetNumberOfCells();
919 Int_t nclus = clusters->GetEntries();
920 Int_t ntrks = fSelTracks->GetEntries();
921 Int_t btracks[6][ntrks];
922 memset(btracks,0,sizeof(Int_t)*6*ntrks);
924 std::map<Short_t,Short_t> map;
925 for (Short_t pos=0;pos<ncells;++pos) {
926 Short_t id = cells->GetCellNumber(pos);
930 TObjArray filtMcParts;
932 Int_t nmc = fMcParts->GetEntries();
933 for (Int_t i=0; i<nmc; ++i) {
934 AliStaPart *pa = static_cast<AliStaPart*>(fMcParts->At(i));
940 for(Int_t i=0, ncl=0; i<nclus; ++i) {
941 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
945 if (!clus->IsEMCAL())
950 Float_t clsPos[3] = {0};
951 clus->GetPosition(clsPos);
952 TVector3 clsVec(clsPos);
953 Double_t vertex[3] = {0};
954 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
955 TLorentzVector clusterVec;
956 clus->GetMomentum(clusterVec,vertex);
957 Double_t clsEta = clusterVec.Eta();
959 AliStaCluster *cl = static_cast<AliStaCluster*>(fClusters->New(ncl++));
961 cl->fR = clsVec.Perp();
962 cl->fEta = clsVec.Eta();
963 cl->fPhi = clsVec.Phi();
964 cl->fN = clus->GetNCells();
965 cl->fN1 = GetNCells(clus,0.100);
966 cl->fN3 = GetNCells(clus,0.300);
968 Double_t emax = GetMaxCellEnergy(clus, id);
970 cl->fSM = fGeom->GetSuperModuleNumber(id);
972 cl->fE2max = GetSecondMaxCell(clus);
973 cl->fTmax = cells->GetCellTime(id);
974 if (clus->GetDistanceToBadChannel()<10000)
975 cl->fDbc = clus->GetDistanceToBadChannel();
976 if (!TMath::IsNaN(clus->GetDispersion()))
977 cl->fDisp = clus->GetDispersion();
978 if (!TMath::IsNaN(clus->GetM20()))
979 cl->fM20 = clus->GetM20();
980 if (!TMath::IsNaN(clus->GetM02()))
981 cl->fM02 = clus->GetM02();
982 Double_t maxAxis = -1, minAxis = -1;
983 GetSigma(clus,maxAxis,minAxis);
984 clus->SetTOF(maxAxis); // store sigma in TOF for later plotting
986 Double_t sEtaEta = -1;
987 Double_t sPhiPhi = -1;
988 GetSigmaEtaEta(clus, sEtaEta, sPhiPhi);
989 cl->fSigEtaEta = sEtaEta;
990 cl->fSigPhiPhi = sPhiPhi;
991 Double_t clusterEcc = -1;
993 clusterEcc = TMath::Sqrt(1.0 - minAxis*minAxis/(maxAxis*maxAxis));
994 clus->SetChi2(clusterEcc); // store ecc in chi2 for later plotting
995 cl->fEcc = clusterEcc;
996 cl->fTrIso = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist);
997 cl->fTrIso1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 1);
998 cl->fTrIso2 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 2);
999 cl->fTrIsoD1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist-0.1);
1000 cl->fTrIso1D1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist-0.1, 1);
1001 cl->fTrIso2D1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist-0.1, 2);
1002 cl->fTrIsoD3 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.1);
1003 cl->fTrIso1D3 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.1, 1);
1004 cl->fTrIso2D3 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.1, 2);
1005 cl->fTrIsoStrip = GetTrackIsoStrip(clusterVec.Eta(), clusterVec.Phi());
1006 cl->fCeCore = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.05);
1007 cl->fCeIso = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),fIsoDist);
1008 cl->fCeIso1 = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.10);
1009 cl->fCeIso3 = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.30);
1010 cl->fCeIso4x4 = GetCellIsoNxM(clsVec.Eta(),clsVec.Phi(), 4, 4);
1011 cl->fCeIso5x5 = GetCellIsoNxM(clsVec.Eta(),clsVec.Phi(), 5, 5);
1012 cl->fCeIso3x22 = GetCellIsoNxM(clsVec.Eta(),clsVec.Phi(), 3, 22);
1013 cl->fIsShared = IsShared(clus);
1017 Int_t ntrig = fTriggers->GetEntries();
1018 for (Int_t j = 0; j<ntrig; ++j) {
1019 AliStaTrigger *sta = static_cast<AliStaTrigger*>(fTriggers->At(j));
1022 Short_t idmax = sta->fIdMax;
1023 Bool_t inc = IsIdPartOfCluster(clus, idmax);
1026 cl->fTrigE = sta->fE;
1033 Double_t mind2 = 1e10;
1034 for(Int_t j = 0; j<ntrks; ++j) {
1035 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
1039 if (TMath::Abs(clsEta-track->Eta())>0.5)
1042 TVector3 vec(clsPos);
1043 Int_t index = (Int_t)(vec.Phi()*TMath::RadToDeg()/20);
1044 if (btracks[index-4][j]) {
1048 Float_t tmpR=-1, tmpZ=-1;
1050 if (!fDoTrMatGeom) {
1051 AliExternalTrackParam *tParam = 0;
1053 AliESDtrack *esdTrack = static_cast<AliESDtrack*>(track);
1054 tParam = new AliExternalTrackParam(*esdTrack->GetTPCInnerParam());
1055 dedx = esdTrack->GetTPCsignal();
1057 tParam = new AliExternalTrackParam(track);
1059 Double_t bfield[3] = {0};
1060 track->GetBxByBz(bfield);
1061 Double_t alpha = (index+0.5)*20*TMath::DegToRad();
1062 vec.RotateZ(-alpha); //Rotate the cluster to the local extrapolation coordinate system
1063 tParam->Rotate(alpha); //Rotate the track to the same local extrapolation system
1064 Bool_t ret = tParam->PropagateToBxByBz(vec.X(), bfield);
1066 btracks[index-4][j]=1;
1070 Double_t trkPos[3] = {0};
1071 tParam->GetXYZ(trkPos); //Get the extrapolated global position
1072 tmpR = TMath::Sqrt( TMath::Power(clsPos[0]-trkPos[0],2) +
1073 TMath::Power(clsPos[1]-trkPos[1],2) +
1074 TMath::Power(clsPos[2]-trkPos[2],2) );
1075 tmpZ = clsPos[2]-trkPos[2];
1078 if (TMath::Abs(clsEta-track->Eta())>fIsoDist)
1080 AliExternalTrackParam tParam(track);
1081 if (!fReco->ExtrapolateTrackToCluster(&tParam, clus, tmpR, tmpZ))
1089 cl->fTrDr = TMath::Sqrt(tmpR*tmpR-tmpZ*tmpZ);
1090 cl->fTrEp = clus->E()/track->P();
1096 if (cl->fIsTrackM) {
1097 fHMatchDr->Fill(cl->fTrDr);
1098 fHMatchDz->Fill(cl->fTrDz);
1099 fHMatchEp->Fill(cl->fTrEp);
1104 Int_t nmc = filtMcParts.GetEntries();
1105 Double_t diffR2 = 1e9;
1106 AliStaPart *msta = 0;
1107 for (Int_t j=0; j<nmc; ++j) {
1108 AliStaPart *pa = static_cast<AliStaPart*>(filtMcParts.At(j));
1109 Double_t t1=clsVec.Eta()-pa->fVEta;
1110 Double_t t2=TVector2::Phi_mpi_pi(clsVec.Phi()-pa->fVPhi);
1111 Double_t tmp = t1*t1+t2*t2;
1117 if (diffR2<10 && msta!=0) {
1118 cl->fMcLabel = msta->fLab;
1123 if (fDigits && fEmbedMode) {
1124 for(Int_t j=0; j<cl->fN; ++j) {
1125 Short_t cid = TMath::Abs(clus->GetCellAbsId(j));
1127 std::map<Short_t,Short_t>::iterator it = map.find(cid);
1132 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(fDigits->At(pos));
1135 if (digit->GetId() != cid) {
1136 AliError(Form("Ids should be equal: %d %d", cid, digit->GetId()));
1139 if (digit->GetType()<-1) {
1140 cl->fEmbE += digit->GetChi2();
1147 //________________________________________________________________________
1148 void AliAnalysisTaskEMCALPi0PbPb::CalcPrimTracks()
1150 // Calculate track properties for primary tracks.
1152 fSelPrimTracks->Clear();
1154 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1155 TClonesArray *tracks = 0;
1157 am->LoadBranch("Tracks");
1158 TList *l = fEsdEv->GetList();
1159 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
1161 am->LoadBranch("tracks");
1162 TList *l = fAodEv->GetList();
1163 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
1169 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
1170 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad()-fIsoDist*1.25;
1171 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad()+fIsoDist*1.25;
1174 fSelPrimTracks->SetOwner(kTRUE);
1175 am->LoadBranch("PrimaryVertex.");
1176 const AliESDVertex *vtx = fEsdEv->GetPrimaryVertexSPD();
1177 am->LoadBranch("SPDVertex.");
1178 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
1179 am->LoadBranch("Tracks");
1180 const Int_t Ntracks = tracks->GetEntries();
1181 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
1182 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
1184 AliWarning(Form("Could not receive track %d\n", iTracks));
1187 if (fTrCuts && !fTrCuts->IsSelected(track))
1189 Double_t eta = track->Eta();
1192 if (track->Phi()<phimin||track->Phi()>phimax)
1195 AliESDtrack copyt(*track);
1197 copyt.GetBxByBz(bfield);
1198 AliExternalTrackParam tParam;
1199 Bool_t relate = copyt.RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&tParam);
1202 copyt.Set(tParam.GetX(),tParam.GetAlpha(),tParam.GetParameter(),tParam.GetCovariance());
1204 Double_t p[3] = { 0. };
1206 Double_t pos[3] = { 0. };
1208 Double_t covTr[21] = { 0. };
1209 copyt.GetCovarianceXYZPxPyPz(covTr);
1210 Double_t pid[10] = { 0. };
1211 copyt.GetESDpid(pid);
1212 AliAODTrack *aTrack = new AliAODTrack(copyt.GetID(),
1219 (Short_t)copyt.GetSign(),
1220 copyt.GetITSClusterMap(),
1222 0,/*fPrimaryVertex,*/
1223 kTRUE, // check if this is right
1224 vtx->UsesTrack(copyt.GetID()));
1225 aTrack->SetTPCClusterMap(copyt.GetTPCClusterMap());
1226 aTrack->SetTPCSharedMap (copyt.GetTPCSharedMap());
1227 Float_t ndf = copyt.GetTPCNcls() + 1 - 5 ;
1229 aTrack->SetChi2perNDF(copyt.GetTPCchi2()/ndf);
1231 aTrack->SetChi2perNDF(-1);
1232 aTrack->SetFlags(copyt.GetStatus());
1233 aTrack->SetTPCPointsF(copyt.GetTPCNclsF());
1234 fSelPrimTracks->Add(aTrack);
1237 Int_t ntracks = tracks->GetEntries();
1238 for (Int_t i=0; i<ntracks; ++i) {
1239 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1242 Double_t eta = track->Eta();
1245 if (track->Phi()<phimin||track->Phi()>phimax)
1247 if(track->GetTPCNcls()<fMinNClusPerTr)
1249 //todo: Learn how to set/filter AODs for prim/sec tracks
1250 fSelPrimTracks->Add(track);
1255 //________________________________________________________________________
1256 void AliAnalysisTaskEMCALPi0PbPb::CalcTracks()
1258 // Calculate track properties (including secondaries).
1260 fSelTracks->Clear();
1262 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1263 TClonesArray *tracks = 0;
1265 am->LoadBranch("Tracks");
1266 TList *l = fEsdEv->GetList();
1267 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
1269 am->LoadBranch("tracks");
1270 TList *l = fAodEv->GetList();
1271 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
1278 const Int_t Ntracks = tracks->GetEntries();
1279 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
1280 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
1282 AliWarning(Form("Could not receive track %d\n", iTracks));
1285 if (fTrCuts && !fTrCuts->IsSelected(track))
1287 Double_t eta = track->Eta();
1290 fSelTracks->Add(track);
1293 Int_t ntracks = tracks->GetEntries();
1294 for (Int_t i=0; i<ntracks; ++i) {
1295 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1298 Double_t eta = track->Eta();
1301 if(track->GetTPCNcls()<fMinNClusPerTr)
1304 if (0 && (track->Pt()>=0.6) && (track->PxAtDCA()==-999)) { // compute position on EMCAL
1305 AliExternalTrackParam tParam(track);
1306 if (AliTrackerBase::PropagateTrackToBxByBz(&tParam, 438, 0.139, 1, kTRUE)) {
1308 tParam.GetXYZ(trkPos);
1309 track->SetPxPyPzAtDCA(trkPos[0],trkPos[1],trkPos[2]);
1312 fSelTracks->Add(track);
1317 //________________________________________________________________________
1318 void AliAnalysisTaskEMCALPi0PbPb::ClusterAfterburner()
1320 // Run custer reconstruction afterburner.
1322 AliVCaloCells *cells = fEsdCells;
1329 Int_t ncells = cells->GetNumberOfCells();
1333 Double_t cellMeanE = 0, cellSigE = 0;
1334 for (Int_t i = 0; i<ncells; ++i) {
1335 Double_t cellE = cells->GetAmplitude(i);
1337 cellSigE += cellE*cellE;
1339 cellMeanE /= ncells;
1341 cellSigE -= cellMeanE*cellMeanE;
1344 cellSigE = TMath::Sqrt(cellSigE / ncells);
1346 Double_t subE = cellMeanE - 7*cellSigE;
1350 for (Int_t i = 0; i<ncells; ++i) {
1352 Double_t amp=0,time=0;
1353 if (!cells->GetCell(i, id, amp, time))
1358 cells->SetCell(i, id, amp, time);
1361 TObjArray *clusters = fEsdClusters;
1363 clusters = fAodClusters;
1367 Int_t nclus = clusters->GetEntries();
1368 for (Int_t i = 0; i<nclus; ++i) {
1369 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
1370 if (!clus->IsEMCAL())
1372 Int_t nc = clus->GetNCells();
1374 UShort_t ids[100] = {0};
1375 Double_t fra[100] = {0};
1376 for (Int_t j = 0; j<nc; ++j) {
1377 Short_t id = TMath::Abs(clus->GetCellAbsId(j));
1378 Double_t cen = cells->GetCellAmplitude(id);
1386 clusters->RemoveAt(i);
1390 for (Int_t j = 0; j<nc; ++j) {
1391 Short_t id = ids[j];
1392 Double_t cen = cells->GetCellAmplitude(id);
1396 AliAODCaloCluster *aodclus = dynamic_cast<AliAODCaloCluster*>(clus);
1399 aodclus->SetNCells(nc);
1400 aodclus->SetCellsAmplitudeFraction(fra);
1401 aodclus->SetCellsAbsId(ids);
1404 clusters->Compress();
1407 //________________________________________________________________________
1408 void AliAnalysisTaskEMCALPi0PbPb::FillCellHists()
1410 // Fill histograms related to cell properties.
1412 AliVCaloCells *cells = fEsdCells;
1419 Int_t cellModCount[12] = {0};
1420 Double_t cellMaxE = 0;
1421 Double_t cellMeanE = 0;
1422 Int_t ncells = cells->GetNumberOfCells();
1426 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
1428 for (Int_t i = 0; i<ncells; ++i) {
1429 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1430 Double_t cellE = cells->GetAmplitude(i);
1431 fHCellE->Fill(cellE);
1436 Int_t iSM=-1, iTower=-1, nIphi=-1, nIeta=-1;
1437 Bool_t ret = fGeom->GetCellIndex(absID, iSM, iTower, nIphi, nIeta);
1439 AliError(Form("Could not get cell index for %d", absID));
1442 ++cellModCount[iSM];
1443 Int_t iPhi=-1, iEta=-1;
1444 fGeom->GetCellPhiEtaIndexInSModule(iSM, iTower, nIphi, nIeta, iPhi, iEta);
1445 fHColuRow[iSM]->Fill(iEta,iPhi,1);
1446 fHColuRowE[iSM]->Fill(iEta,iPhi,cellE);
1447 fHCellFreqNoCut[iSM]->Fill(absID);
1448 if (cellE > 0.1) fHCellFreqCut100M[iSM]->Fill(absID);
1449 if (cellE > 0.3) fHCellFreqCut300M[iSM]->Fill(absID);
1450 if (fHCellCheckE && fHCellCheckE[absID])
1451 fHCellCheckE[absID]->Fill(cellE);
1452 fHCellFreqE[iSM]->Fill(absID, cellE);
1454 fHCellH->Fill(cellMaxE);
1455 cellMeanE /= ncells;
1456 fHCellM->Fill(cellMeanE);
1457 fHCellM2->Fill(cellMeanE*ncells/24/48/nsm);
1458 for (Int_t i=0; i<nsm; ++i)
1459 fHCellMult[i]->Fill(cellModCount[i]);
1462 //________________________________________________________________________
1463 void AliAnalysisTaskEMCALPi0PbPb::FillClusHists()
1465 // Fill histograms related to cluster properties.
1467 TObjArray *clusters = fEsdClusters;
1469 clusters = fAodClusters;
1473 Double_t vertex[3] = {0};
1474 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1476 Int_t nclus = clusters->GetEntries();
1477 for(Int_t i = 0; i<nclus; ++i) {
1478 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
1481 if (!clus->IsEMCAL())
1483 TLorentzVector clusterVec;
1484 clus->GetMomentum(clusterVec,vertex);
1485 Double_t maxAxis = clus->GetTOF(); //sigma
1486 Double_t clusterEcc = clus->Chi2(); //eccentricity
1487 fHClustEccentricity->Fill(clusterEcc);
1488 fHClustEtaPhi->Fill(clusterVec.Eta(),clusterVec.Phi());
1489 fHClustEnergyPt->Fill(clusterVec.E(),clusterVec.Pt());
1490 fHClustEnergySigma->Fill(clus->E()*maxAxis,clus->E());
1491 fHClustSigmaSigma->Fill(max(clus->GetM02(),clus->GetM20()),clus->E()*maxAxis);
1492 fHClustNCellEnergyRatio->Fill(clus->GetNCells(),GetMaxCellEnergy(clus)/clus->E());
1494 fHClustEnergyNCell->Fill(clus->E(),clus->GetNCells());
1498 //________________________________________________________________________
1499 void AliAnalysisTaskEMCALPi0PbPb::CalcMcInfo()
1501 // Get Mc truth particle information.
1508 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
1509 Double_t etamin = -0.7;
1510 Double_t etamax = +0.7;
1511 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad();
1512 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad();
1515 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1516 am->LoadBranch(AliAODMCParticle::StdBranchName());
1517 TClonesArray *tca = dynamic_cast<TClonesArray*>(fAodEv->FindListObject(AliAODMCParticle::StdBranchName()));
1521 Int_t nents = tca->GetEntries();
1522 for(int it=0; it<nents; ++it) {
1523 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(tca->At(it));
1526 // pion or eta meson or direct photon
1527 if(part->GetPdgCode() == 111) {
1528 } else if(part->GetPdgCode() == 221) {
1529 } else if(part->GetPdgCode() == 22 ) {
1534 Double_t dR = TMath::Sqrt((part->Xv()*part->Xv())+(part->Yv()*part->Yv()));
1539 Double_t pt = part->Pt() ;
1542 Double_t eta = part->Eta();
1543 if (eta<etamin||eta>etamax)
1545 Double_t phi = part->Phi();
1546 if (phi<phimin||phi>phimax)
1549 ProcessDaughters(part, it, tca);
1554 AliMCEvent *mcEvent = MCEvent();
1558 const AliVVertex *evtVtx = mcEvent->GetPrimaryVertex();
1562 mcEvent->PreReadAll();
1564 Int_t nTracks = mcEvent->GetNumberOfPrimaries();
1565 for (Int_t iTrack = 0; iTrack<nTracks; ++iTrack) {
1566 AliMCParticle *mcP = static_cast<AliMCParticle*>(mcEvent->GetTrack(iTrack));
1570 // pion or eta meson or direct photon
1571 if(mcP->PdgCode() == 111) {
1572 } else if(mcP->PdgCode() == 221) {
1573 } else if(mcP->PdgCode() == 22 ) {
1578 Double_t dR = TMath::Sqrt((mcP->Xv()-evtVtx->GetX())*(mcP->Xv()-evtVtx->GetX()) +
1579 (mcP->Yv()-evtVtx->GetY())*(mcP->Yv()-evtVtx->GetY()));
1584 Double_t pt = mcP->Pt() ;
1587 Double_t eta = mcP->Eta();
1588 if (eta<etamin||eta>etamax)
1590 Double_t phi = mcP->Phi();
1591 if (phi<phimin||phi>phimax)
1594 ProcessDaughters(mcP, iTrack, mcEvent);
1598 //________________________________________________________________________
1599 void AliAnalysisTaskEMCALPi0PbPb::FillNtuple()
1606 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1608 fHeader->fRun = fAodEv->GetRunNumber();
1609 fHeader->fOrbit = fAodEv->GetHeader()->GetOrbitNumber();
1610 fHeader->fPeriod = fAodEv->GetHeader()->GetPeriodNumber();
1611 fHeader->fBx = fAodEv->GetHeader()->GetBunchCrossNumber();
1612 fHeader->fL0 = fAodEv->GetHeader()->GetL0TriggerInputs();
1613 fHeader->fL1 = fAodEv->GetHeader()->GetL1TriggerInputs();
1614 fHeader->fL2 = fAodEv->GetHeader()->GetL2TriggerInputs();
1615 fHeader->fTrClassMask = fAodEv->GetHeader()->GetTriggerMask();
1616 fHeader->fTrCluster = fAodEv->GetHeader()->GetTriggerCluster();
1617 fHeader->fOffTriggers = fAodEv->GetHeader()->GetOfflineTrigger();
1618 fHeader->fFiredTriggers = fAodEv->GetHeader()->GetFiredTriggerClasses();
1620 fHeader->fRun = fEsdEv->GetRunNumber();
1621 fHeader->fOrbit = fEsdEv->GetHeader()->GetOrbitNumber();
1622 fHeader->fPeriod = fEsdEv->GetESDRun()->GetPeriodNumber();
1623 fHeader->fBx = fEsdEv->GetHeader()->GetBunchCrossNumber();
1624 fHeader->fL0 = fEsdEv->GetHeader()->GetL0TriggerInputs();
1625 fHeader->fL1 = fEsdEv->GetHeader()->GetL1TriggerInputs();
1626 fHeader->fL2 = fEsdEv->GetHeader()->GetL2TriggerInputs();
1627 fHeader->fTrClassMask = fEsdEv->GetHeader()->GetTriggerMask();
1628 fHeader->fTrCluster = fEsdEv->GetHeader()->GetTriggerCluster();
1629 fHeader->fOffTriggers = ((AliInputEventHandler*)(am->GetInputEventHandler()))->IsEventSelected();
1630 fHeader->fFiredTriggers = fEsdEv->GetFiredTriggerClasses();
1631 Float_t v0CorrR = 0;
1632 fHeader->fV0 = AliESDUtils::GetCorrV0(fEsdEv,v0CorrR);
1633 const AliMultiplicity *mult = fEsdEv->GetMultiplicity();
1635 fHeader->fCl1 = mult->GetNumberOfITSClusters(1);
1636 fHeader->fTr = AliESDtrackCuts::GetReferenceMultiplicity(fEsdEv,1);
1637 AliTriggerAnalysis trAn; /// Trigger Analysis
1638 Bool_t v0B = trAn.IsOfflineTriggerFired(fEsdEv, AliTriggerAnalysis::kV0C);
1639 Bool_t v0A = trAn.IsOfflineTriggerFired(fEsdEv, AliTriggerAnalysis::kV0A);
1640 fHeader->fV0And = v0A && v0B;
1642 fHeader->fIsHT = (fHeader->fOffTriggers & AliVEvent::kEMC1) || (fHeader->fOffTriggers & AliVEvent::kEMC7);
1644 AliCentrality *cent = InputEvent()->GetCentrality();
1645 fHeader->fV0Cent = cent->GetCentralityPercentileUnchecked("V0M");
1646 fHeader->fCl1Cent = cent->GetCentralityPercentileUnchecked("CL1");
1647 fHeader->fTrCent = cent->GetCentralityPercentileUnchecked("TRK");
1648 fHeader->fCqual = cent->GetQuality();
1650 AliEventplane *ep = InputEvent()->GetEventplane();
1652 if (ep->GetQVector())
1653 fHeader->fPsi = ep->GetQVector()->Phi()/2. ;
1656 if (ep->GetQsub1()&&ep->GetQsub2())
1657 fHeader->fPsiRes = ep->GetQsub1()->Phi()/2.-ep->GetQsub2()->Phi()/2.;
1659 fHeader->fPsiRes = 0;
1663 TString trgclasses(fHeader->fFiredTriggers);
1664 for (Int_t j = 0; j<fTrClassNamesArr->GetEntries(); ++j) {
1665 const char *name = fTrClassNamesArr->At(j)->GetName();
1666 TRegexp regexp(name);
1667 if (trgclasses.Contains(regexp))
1668 val += TMath::Power(2,j);
1670 fHeader->fTcls = (UInt_t)val;
1672 fHeader->fNSelTr = fSelTracks->GetEntries();
1673 fHeader->fNSelPrimTr = fSelPrimTracks->GetEntries();
1674 fHeader->fNSelPrimTr1 = 0;
1675 fHeader->fNSelPrimTr2 = 0;
1676 for(int iTracks=0; iTracks < fSelPrimTracks->GetEntries(); iTracks++){
1677 AliESDtrack *track = static_cast<AliESDtrack*>(fSelPrimTracks->At(iTracks));
1679 ++fHeader->fNSelPrimTr1;
1681 ++fHeader->fNSelPrimTr2;
1684 fHeader->fNCells = 0;
1685 fHeader->fNCells0 = 0;
1686 fHeader->fNCells01 = 0;
1687 fHeader->fNCells03 = 0;
1688 fHeader->fNCells1 = 0;
1689 fHeader->fNCells2 = 0;
1690 fHeader->fNCells5 = 0;
1691 fHeader->fMaxCellE = 0;
1693 AliVCaloCells *cells = fEsdCells;
1698 Int_t ncells = cells->GetNumberOfCells();
1699 for(Int_t j=0; j<ncells; ++j) {
1700 Double_t cellen = cells->GetAmplitude(j);
1702 ++fHeader->fNCells0;
1704 ++fHeader->fNCells01;
1706 ++fHeader->fNCells03;
1708 ++fHeader->fNCells1;
1710 ++fHeader->fNCells2;
1712 ++fHeader->fNCells5;
1713 if (cellen>fHeader->fMaxCellE)
1714 fHeader->fMaxCellE = cellen;
1716 fHeader->fNCells = ncells;
1719 fHeader->fNClus = 0;
1720 fHeader->fNClus1 = 0;
1721 fHeader->fNClus2 = 0;
1722 fHeader->fNClus5 = 0;
1723 fHeader->fMaxClusE = 0;
1725 TObjArray *clusters = fEsdClusters;
1727 clusters = fAodClusters;
1730 Int_t nclus = clusters->GetEntries();
1731 for(Int_t j=0; j<nclus; ++j) {
1732 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(j));
1733 if (!clus->IsEMCAL())
1735 Double_t clusen = clus->E();
1742 if (clusen>fHeader->fMaxClusE)
1743 fHeader->fMaxClusE = clusen;
1745 fHeader->fNClus = nclus;
1748 fHeader->fMaxTrE = 0;
1750 Int_t ntrig = fTriggers->GetEntries();
1751 for (Int_t j = 0; j<ntrig; ++j) {
1752 AliStaTrigger *sta = static_cast<AliStaTrigger*>(fTriggers->At(j));
1755 if (sta->fE>fHeader->fMaxTrE)
1756 fHeader->fMaxTrE = sta->fE;
1760 // count cells above 100 MeV on super modules
1761 fHeader->fNcSM0 = GetNCells(0, 0.100);
1762 fHeader->fNcSM1 = GetNCells(1, 0.100);
1763 fHeader->fNcSM2 = GetNCells(2, 0.100);
1764 fHeader->fNcSM3 = GetNCells(3, 0.100);
1765 fHeader->fNcSM4 = GetNCells(4, 0.100);
1766 fHeader->fNcSM5 = GetNCells(5, 0.100);
1767 fHeader->fNcSM6 = GetNCells(6, 0.100);
1768 fHeader->fNcSM7 = GetNCells(7, 0.100);
1769 fHeader->fNcSM8 = GetNCells(8, 0.100);
1770 fHeader->fNcSM9 = GetNCells(9, 0.100);
1773 am->LoadBranch("vertices");
1774 AliAODVertex *pv = fAodEv->GetPrimaryVertex();
1775 FillVertex(fPrimVert, pv);
1776 AliAODVertex *sv = fAodEv->GetPrimaryVertexSPD();
1777 FillVertex(fSpdVert, sv);
1779 am->LoadBranch("PrimaryVertex.");
1780 const AliESDVertex *pv = fEsdEv->GetPrimaryVertexTracks();
1781 FillVertex(fPrimVert, pv);
1782 am->LoadBranch("SPDVertex.");
1783 const AliESDVertex *sv = fEsdEv->GetPrimaryVertexSPD();
1784 FillVertex(fSpdVert, sv);
1785 am->LoadBranch("TPCVertex.");
1786 const AliESDVertex *tv = fEsdEv->GetPrimaryVertexTPC();
1787 FillVertex(fTpcVert, tv);
1793 //________________________________________________________________________
1794 void AliAnalysisTaskEMCALPi0PbPb::FillPionHists()
1796 // Fill histograms related to pions.
1798 Double_t vertex[3] = {0};
1799 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1801 TObjArray *clusters = fEsdClusters;
1803 clusters = fAodClusters;
1806 TLorentzVector clusterVec1;
1807 TLorentzVector clusterVec2;
1808 TLorentzVector pionVec;
1810 Int_t nclus = clusters->GetEntries();
1811 for (Int_t i = 0; i<nclus; ++i) {
1812 AliVCluster *clus1 = static_cast<AliVCluster*>(clusters->At(i));
1815 if (!clus1->IsEMCAL())
1817 if (clus1->E()<fMinE)
1819 if (clus1->GetNCells()<fNminCells)
1821 if (GetMaxCellEnergy(clus1)/clus1->E()<fMinErat)
1823 if (clus1->Chi2()<fMinEcc) // eccentricity cut
1825 clus1->GetMomentum(clusterVec1,vertex);
1826 for (Int_t j = i+1; j<nclus; ++j) {
1827 AliVCluster *clus2 = static_cast<AliVCluster*>(clusters->At(j));
1830 if (!clus2->IsEMCAL())
1832 if (clus2->E()<fMinE)
1834 if (clus2->GetNCells()<fNminCells)
1836 if (GetMaxCellEnergy(clus2)/clus2->E()<fMinErat)
1838 if (clus2->Chi2()<fMinEcc) // eccentricity cut
1840 clus2->GetMomentum(clusterVec2,vertex);
1841 pionVec = clusterVec1 + clusterVec2;
1842 Double_t pionZgg = TMath::Abs(clusterVec1.E()-clusterVec2.E())/pionVec.E();
1843 Double_t pionOpeningAngle = clusterVec1.Angle(clusterVec2.Vect());
1844 if (pionZgg < fAsymMax) {
1845 fHPionEtaPhi->Fill(pionVec.Eta(),pionVec.Phi());
1846 fHPionMggPt->Fill(pionVec.M(),pionVec.Pt());
1847 fHPionMggAsym->Fill(pionVec.M(),pionZgg);
1848 fHPionMggDgg->Fill(pionVec.M(),pionOpeningAngle);
1849 Int_t bin = fPtRanges->FindBin(pionVec.Pt());
1850 fHPionInvMasses[bin]->Fill(pionVec.M());
1857 //________________________________________________________________________
1858 void AliAnalysisTaskEMCALPi0PbPb::FillMcHists()
1860 // Fill additional MC information histograms.
1865 // check if aod or esd mc mode and the fill histos
1868 //________________________________________________________________________
1869 void AliAnalysisTaskEMCALPi0PbPb::FillOtherHists()
1871 // Fill other histograms.
1873 for(int iTracks=0; iTracks < fSelPrimTracks->GetEntries(); ++iTracks){
1874 AliESDtrack *track = static_cast<AliESDtrack*>(fSelPrimTracks->At(iTracks));
1877 fHPrimTrackPt->Fill(track->Pt());
1878 fHPrimTrackEta->Fill(track->Eta());
1879 fHPrimTrackPhi->Fill(track->Phi());
1883 //________________________________________________________________________
1884 void AliAnalysisTaskEMCALPi0PbPb::FillTrackHists()
1886 // Fill track histograms.
1888 if (fSelPrimTracks) {
1889 for(int iTracks=0; iTracks < fSelPrimTracks->GetEntries(); iTracks++) {
1890 AliESDtrack *track = static_cast<AliESDtrack*>(fSelPrimTracks->At(iTracks));
1893 fHPrimTrackPt->Fill(track->Pt());
1894 fHPrimTrackEta->Fill(track->Eta());
1895 fHPrimTrackPhi->Fill(track->Phi());
1900 //__________________________________________________________________________________________________
1901 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliESDVertex *esdv)
1903 // Fill vertex from ESD vertex info.
1905 v->fVx = esdv->GetX();
1906 v->fVy = esdv->GetY();
1907 v->fVz = esdv->GetZ();
1908 v->fVc = esdv->GetNContributors();
1909 v->fDisp = esdv->GetDispersion();
1910 v->fZres = esdv->GetZRes();
1911 v->fChi2 = esdv->GetChi2();
1912 v->fSt = esdv->GetStatus();
1913 v->fIs3D = esdv->IsFromVertexer3D();
1914 v->fIsZ = esdv->IsFromVertexerZ();
1917 //__________________________________________________________________________________________________
1918 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliAODVertex *aodv)
1920 // Fill vertex from AOD vertex info.
1922 v->fVx = aodv->GetX();
1923 v->fVy = aodv->GetY();
1924 v->fVz = aodv->GetZ();
1925 v->fVc = aodv->GetNContributors();
1926 v->fChi2 = aodv->GetChi2();
1929 //________________________________________________________________________
1930 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellIsolation(Double_t cEta, Double_t cPhi, Double_t radius) const
1932 // Compute isolation based on cell content.
1934 AliVCaloCells *cells = fEsdCells;
1940 Double_t cellIsolation = 0;
1941 Double_t rad2 = radius*radius;
1942 Int_t ncells = cells->GetNumberOfCells();
1943 for (Int_t i = 0; i<ncells; ++i) {
1944 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1945 Float_t eta=-1, phi=-1;
1946 fGeom->EtaPhiFromIndex(absID,eta,phi);
1947 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
1948 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1951 Double_t cellE = cells->GetAmplitude(i);
1952 Double_t theta = 2*TMath::ATan(TMath::Exp(-eta));
1953 Double_t cellEt = cellE*sin(theta);
1954 cellIsolation += cellEt;
1956 return cellIsolation;
1959 //________________________________________________________________________
1960 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellIsoNxM(Double_t cEta, Double_t cPhi, Int_t N, Int_t M) const
1962 // Compute isolation based on cell content, in a NxM rectangle.
1964 AliVCaloCells *cells = fEsdCells;
1970 Double_t cellIsolation = 0;
1971 Int_t ncells = cells->GetNumberOfCells();
1972 for (Int_t i = 0; i<ncells; ++i) {
1973 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1974 Float_t eta=-1, phi=-1;
1975 fGeom->EtaPhiFromIndex(absID,eta,phi);
1976 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
1977 Double_t etadiff = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1978 if(TMath::Abs(etadiff)/0.014>N)
1980 if(TMath::Abs(phidiff)/0.014>M)
1982 Double_t cellE = cells->GetAmplitude(i);
1983 Double_t theta = 2*TMath::ATan(TMath::Exp(-eta));
1984 Double_t cellEt = cellE*sin(theta);
1985 cellIsolation += cellEt;
1987 return cellIsolation;
1990 //________________________________________________________________________
1991 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellEnergy(const AliVCluster *cluster) const
1993 // Get maximum energy of attached cell.
1996 Int_t ncells = cluster->GetNCells();
1998 for (Int_t i=0; i<ncells; i++) {
1999 Double_t e = fEsdCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2003 for (Int_t i=0; i<ncells; i++) {
2004 Double_t e = fAodCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2011 //________________________________________________________________________
2012 Double_t AliAnalysisTaskEMCALPi0PbPb::GetMaxCellEnergy(const AliVCluster *cluster, Short_t &id) const
2014 // Get maximum energy of attached cell.
2018 Int_t ncells = cluster->GetNCells();
2020 for (Int_t i=0; i<ncells; i++) {
2021 Double_t e = fEsdCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2024 id = cluster->GetCellAbsId(i);
2028 for (Int_t i=0; i<ncells; i++) {
2029 Double_t e = fAodCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2032 id = cluster->GetCellAbsId(i);
2038 //________________________________________________________________________
2039 void AliAnalysisTaskEMCALPi0PbPb::GetSigma(const AliVCluster *c, Double_t& sigmaMax, Double_t &sigmaMin) const
2041 // Calculate the (E) weighted variance along the longer (eigen) axis.
2043 sigmaMax = 0; // cluster variance along its longer axis
2044 sigmaMin = 0; // cluster variance along its shorter axis
2045 Double_t Ec = c->E(); // cluster energy
2048 Double_t Xc = 0 ; // cluster first moment along X
2049 Double_t Yc = 0 ; // cluster first moment along Y
2050 Double_t Sxx = 0 ; // cluster second central moment along X (variance_X^2)
2051 Double_t Sxy = 0 ; // cluster second central moment along Y (variance_Y^2)
2052 Double_t Syy = 0 ; // cluster covariance^2
2054 AliVCaloCells *cells = fEsdCells;
2061 Int_t ncells = c->GetNCells();
2065 for(Int_t j=0; j<ncells; ++j) {
2066 Int_t id = TMath::Abs(c->GetCellAbsId(j));
2067 Double_t cellen = cells->GetCellAmplitude(id);
2069 fGeom->GetGlobal(id,pos);
2070 Xc += cellen*pos.X();
2071 Yc += cellen*pos.Y();
2072 Sxx += cellen*pos.X()*pos.X();
2073 Syy += cellen*pos.Y()*pos.Y();
2074 Sxy += cellen*pos.X()*pos.Y();
2084 Sxx = TMath::Abs(Sxx);
2085 Syy = TMath::Abs(Syy);
2086 sigmaMax = (Sxx + Syy + TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
2087 sigmaMax = TMath::Sqrt(TMath::Abs(sigmaMax));
2088 sigmaMin = TMath::Abs(Sxx + Syy - TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
2089 sigmaMin = TMath::Sqrt(TMath::Abs(sigmaMin));
2092 //________________________________________________________________________
2093 void AliAnalysisTaskEMCALPi0PbPb::GetSigmaEtaEta(const AliVCluster *c, Double_t& sEtaEta, Double_t &sPhiPhi) const
2095 // Calculate the (E) weighted variance along the pseudorapidity.
2100 Double_t Ec = c->E(); // cluster energy
2104 const Int_t ncells = c->GetNCells();
2106 Double_t EtaC = 0; // cluster first moment along eta
2107 Double_t PhiC = 0; // cluster first moment along phi
2108 Double_t Setaeta = 0; // cluster second central moment along eta
2109 Double_t Sphiphi = 0; // cluster second central moment along phi
2110 Double_t w[ncells]; // weight max(0,4.5*log(E_i/Ec))
2114 AliVCaloCells *cells = fEsdCells;
2124 for(Int_t j=0; j<ncells; ++j) {
2125 id[j] = TMath::Abs(c->GetCellAbsId(j));
2126 Double_t cellen = cells->GetCellAmplitude(id[j]);
2127 w[j] = TMath::Max(0., 4.5+TMath::Log(cellen/Ec));
2129 fGeom->GetGlobal(id[j],pos);
2130 EtaC += w[j]*pos.Eta();
2131 PhiC += w[j]*pos.Phi();
2137 for(Int_t j=0; j<ncells; ++j) {
2139 fGeom->GetGlobal(id[j],pos);
2140 Setaeta = w[j]*(pos.Eta() - EtaC)*(pos.Eta() - EtaC);
2141 Sphiphi = w[j]*(pos.Phi() - PhiC)*(pos.Phi() - PhiC);
2144 sEtaEta = TMath::Sqrt(Setaeta);
2146 sPhiPhi = TMath::Sqrt(Sphiphi);
2149 //________________________________________________________________________
2150 Int_t AliAnalysisTaskEMCALPi0PbPb::GetNCells(const AliVCluster *c, Double_t emin) const
2152 // Calculate number of attached cells above emin.
2154 AliVCaloCells *cells = fEsdCells;
2161 Int_t ncells = c->GetNCells();
2162 for(Int_t j=0; j<ncells; ++j) {
2163 Int_t id = TMath::Abs(c->GetCellAbsId(j));
2164 Double_t cellen = cells->GetCellAmplitude(id);
2171 //________________________________________________________________________
2172 Int_t AliAnalysisTaskEMCALPi0PbPb::GetNCells(Int_t sm, Double_t emin) const
2174 // Calculate number of cells per SM above emin.
2176 AliVCaloCells *cells = fEsdCells;
2183 Int_t ncells = cells->GetNumberOfCells();
2184 for(Int_t j=0; j<ncells; ++j) {
2185 Int_t id = TMath::Abs(cells->GetCellNumber(j));
2186 Double_t cellen = cells->GetCellAmplitude(id);
2189 Int_t fsm = fGeom->GetSuperModuleNumber(id);
2197 //________________________________________________________________________
2198 Double_t AliAnalysisTaskEMCALPi0PbPb::GetTrackIsolation(Double_t cEta, Double_t cPhi, Double_t radius, Double_t pt) const
2200 // Compute isolation based on tracks.
2202 Double_t trkIsolation = 0;
2203 Double_t rad2 = radius*radius;
2204 Int_t ntrks = fSelPrimTracks->GetEntries();
2205 for(Int_t j = 0; j<ntrks; ++j) {
2206 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
2211 Float_t eta = track->Eta();
2212 Float_t phi = track->Phi();
2213 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
2214 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
2217 trkIsolation += track->Pt();
2219 return trkIsolation;
2222 //________________________________________________________________________
2223 Double_t AliAnalysisTaskEMCALPi0PbPb::GetTrackIsoStrip(Double_t cEta, Double_t cPhi, Double_t dEta, Double_t dPhi, Double_t pt) const
2225 // Compute isolation based on tracks.
2227 Double_t trkIsolation = 0;
2228 Int_t ntrks = fSelPrimTracks->GetEntries();
2229 for(Int_t j = 0; j<ntrks; ++j) {
2230 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
2235 Float_t eta = track->Eta();
2236 Float_t phi = track->Phi();
2237 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
2238 Double_t etadiff = (eta-cEta);
2239 if(TMath::Abs(etadiff)>dEta || TMath::Abs(phidiff)>dPhi)
2241 trkIsolation += track->Pt();
2243 return trkIsolation;
2246 //________________________________________________________________________
2247 Bool_t AliAnalysisTaskEMCALPi0PbPb::IsShared(const AliVCluster *c) const
2249 // Returns if cluster shared across super modules.
2251 AliVCaloCells *cells = fEsdCells;
2258 Int_t ncells = c->GetNCells();
2259 for(Int_t j=0; j<ncells; ++j) {
2260 Int_t id = TMath::Abs(c->GetCellAbsId(j));
2261 Int_t got = id / (24*48);
2272 //________________________________________________________________________
2273 Bool_t AliAnalysisTaskEMCALPi0PbPb::IsIdPartOfCluster(const AliVCluster *c, Short_t id) const
2275 // Returns if id is part of cluster.
2277 AliVCaloCells *cells = fEsdCells;
2283 Int_t ncells = c->GetNCells();
2284 for(Int_t j=0; j<ncells; ++j) {
2285 Int_t cid = TMath::Abs(c->GetCellAbsId(j));
2292 //________________________________________________________________________
2293 void AliAnalysisTaskEMCALPi0PbPb::PrintDaughters(const AliVParticle *p, const TObjArray *arr, Int_t level) const
2295 // Print recursively daughter information.
2300 const AliAODMCParticle *amc = dynamic_cast<const AliAODMCParticle*>(p);
2303 for (Int_t i=0; i<level; ++i) printf(" ");
2306 Int_t n = amc->GetNDaughters();
2307 for (Int_t i=0; i<n; ++i) {
2308 Int_t d = amc->GetDaughter(i);
2309 const AliVParticle *dmc = static_cast<const AliVParticle*>(arr->At(d));
2310 PrintDaughters(dmc,arr,level+1);
2314 //________________________________________________________________________
2315 void AliAnalysisTaskEMCALPi0PbPb::PrintDaughters(const AliMCParticle *p, const AliMCEvent *arr, Int_t level) const
2317 // Print recursively daughter information.
2322 for (Int_t i=0; i<level; ++i) printf(" ");
2323 Int_t d1 = p->GetFirstDaughter();
2324 Int_t d2 = p->GetLastDaughter();
2325 printf("pid=%d: %.2f %.2f %.2f (%.2f %.2f %.2f); nd=%d,%d\n",
2326 p->PdgCode(),p->Px(),p->Py(),p->Pz(),p->Xv(),p->Yv(),p->Zv(),d1,d2);
2331 for (Int_t i=d1;i<=d2;++i) {
2332 const AliMCParticle *dmc = static_cast<const AliMCParticle *>(arr->GetTrack(i));
2333 PrintDaughters(dmc,arr,level+1);
2337 //________________________________________________________________________
2338 void AliAnalysisTaskEMCALPi0PbPb::PrintTrackRefs(AliMCParticle *p) const
2340 // Print track ref array.
2345 Int_t n = p->GetNumberOfTrackReferences();
2346 for (Int_t i=0; i<n; ++i) {
2347 AliTrackReference *ref = p->GetTrackReference(i);
2350 ref->SetUserId(ref->DetectorId());
2355 //________________________________________________________________________
2356 void AliAnalysisTaskEMCALPi0PbPb::ProcessDaughters(AliVParticle *p, Int_t index, const TObjArray *arr)
2358 // Process and create daughters.
2363 AliAODMCParticle *amc = dynamic_cast<AliAODMCParticle*>(p);
2369 Int_t nparts = arr->GetEntries();
2370 Int_t nents = fMcParts->GetEntries();
2372 AliStaPart *newp = static_cast<AliStaPart*>(fMcParts->New(nents));
2373 newp->fPt = amc->Pt();
2374 newp->fEta = amc->Eta();
2375 newp->fPhi = amc->Phi();
2376 if (amc->Xv() != 0 || amc->Yv() != 0 || amc->Zv() != 0) {
2377 TVector3 vec(amc->Xv(),amc->Yv(),amc->Zv());
2378 newp->fVR = vec.Perp();
2379 newp->fVEta = vec.Eta();
2380 newp->fVPhi = vec.Phi();
2382 newp->fPid = amc->PdgCode();
2384 Int_t moi = amc->GetMother();
2385 if (moi>=0&&moi<nparts) {
2386 const AliAODMCParticle *mmc = static_cast<const AliAODMCParticle*>(arr->At(moi));
2387 moi = mmc->GetUniqueID();
2390 p->SetUniqueID(nents);
2392 // TODO: Determine which detector was hit
2395 Int_t n = amc->GetNDaughters();
2396 for (Int_t i=0; i<n; ++i) {
2397 Int_t d = amc->GetDaughter(i);
2398 if (d<=index || d>=nparts)
2400 AliVParticle *dmc = static_cast<AliVParticle*>(arr->At(d));
2401 ProcessDaughters(dmc,d,arr);
2405 //________________________________________________________________________
2406 void AliAnalysisTaskEMCALPi0PbPb::ProcessDaughters(AliMCParticle *p, Int_t index, const AliMCEvent *arr)
2408 // Process and create daughters.
2413 Int_t d1 = p->GetFirstDaughter();
2414 Int_t d2 = p->GetLastDaughter();
2416 printf("%d pid=%d: %.3f %.3f %.3f (%.2f %.2f %.2f); nd=%d,%d, mo=%d\n",
2417 index,p->PdgCode(),p->Px(),p->Py(),p->Pz(),p->Xv(),p->Yv(),p->Zv(),d1,d2, p->GetMother());
2420 Int_t nents = fMcParts->GetEntries();
2422 AliStaPart *newp = static_cast<AliStaPart*>(fMcParts->New(nents));
2423 newp->fPt = p->Pt();
2424 newp->fEta = p->Eta();
2425 newp->fPhi = p->Phi();
2426 if (p->Xv() != 0 || p->Yv() != 0 || p->Zv() != 0) {
2427 TVector3 vec(p->Xv(),p->Yv(),p->Zv());
2428 newp->fVR = vec.Perp();
2429 newp->fVEta = vec.Eta();
2430 newp->fVPhi = vec.Phi();
2432 newp->fPid = p->PdgCode();
2434 Int_t moi = p->GetMother();
2436 const AliMCParticle *mmc = static_cast<const AliMCParticle *>(arr->GetTrack(moi));
2437 moi = mmc->GetUniqueID();
2440 p->SetUniqueID(nents);
2442 Int_t nref = p->GetNumberOfTrackReferences();
2444 AliTrackReference *ref = p->GetTrackReference(nref-1);
2446 newp->fDet = ref->DetectorId();
2454 for (Int_t i=d1;i<=d2;++i) {
2455 AliMCParticle *dmc = static_cast<AliMCParticle *>(arr->GetTrack(i));
2458 ProcessDaughters(dmc,i,arr);
2462 //________________________________________________________________________
2463 Double_t AliAnalysisTaskEMCALPi0PbPb::GetSecondMaxCell(AliVCluster *clus)
2465 // Get second maximum cell.
2467 AliVCaloCells *cells = fEsdCells;
2473 Double_t secondEmax=0, firstEmax=0;
2475 for(Int_t iCell=0;iCell<clus->GetNCells();iCell++){
2476 Int_t absId = clus->GetCellAbsId(iCell);
2477 cellen = cells->GetCellAmplitude(absId);
2478 if(cellen > firstEmax)
2481 for(Int_t iCell=0;iCell<clus->GetNCells();iCell++){
2482 Int_t absId = clus->GetCellAbsId(iCell);
2483 cellen = cells->GetCellAmplitude(absId);
2484 if(cellen < firstEmax && cellen > secondEmax)
2485 secondEmax = cellen;