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"),
112 fHTclsBeforeCuts(0x0),
113 fHTclsAfterCuts(0x0),
121 fHCellFreqNoCut(0x0),
122 fHCellFreqCut100M(0x0),
123 fHCellFreqCut300M(0x0),
126 fHClustEccentricity(0),
128 fHClustEnergyPt(0x0),
129 fHClustEnergySigma(0x0),
130 fHClustSigmaSigma(0x0),
131 fHClustNCellEnergyRatio(0x0),
132 fHClustEnergyNCell(0x0),
148 //________________________________________________________________________
149 AliAnalysisTaskEMCALPi0PbPb::AliAnalysisTaskEMCALPi0PbPb(const char *name)
150 : AliAnalysisTaskSE(name),
165 fGeoName("EMCAL_FIRSTYEARV1"),
211 fHTclsBeforeCuts(0x0),
212 fHTclsAfterCuts(0x0),
220 fHCellFreqNoCut(0x0),
221 fHCellFreqCut100M(0x0),
222 fHCellFreqCut300M(0x0),
225 fHClustEccentricity(0),
227 fHClustEnergyPt(0x0),
228 fHClustEnergySigma(0x0),
229 fHClustSigmaSigma(0x0),
230 fHClustNCellEnergyRatio(0x0),
231 fHClustEnergyNCell(0x0),
246 DefineOutput(1, TList::Class());
247 fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.,SPDVertex.,TPCVertex.,EMCALCells.,Tracks,EMCALTrigger.,SPDPileupVertices,TrkPileupVertices "
248 "AOD:header,vertices,emcalCells,tracks";
251 //________________________________________________________________________
252 AliAnalysisTaskEMCALPi0PbPb::~AliAnalysisTaskEMCALPi0PbPb()
256 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
257 delete fOutput; fOutput = 0;
259 delete fPtRanges; fPtRanges = 0;
260 fGeom = 0; // do not delete geometry when using instance
261 delete fReco; fReco = 0;
262 delete fTrClassNamesArr;
264 delete fSelPrimTracks;
266 delete [] fHColuRowE;
267 delete [] fHCellMult;
268 delete [] fHCellFreqNoCut;
269 delete [] fHCellFreqCut100M;
270 delete [] fHCellFreqCut300M;
273 //________________________________________________________________________
274 void AliAnalysisTaskEMCALPi0PbPb::UserCreateOutputObjects()
276 // Create user objects here.
278 cout << "AliAnalysisTaskEMCALPi0PbPb: Input settings" << endl;
279 cout << " fCentVar: " << fCentVar << endl;
280 cout << " fCentFrom: " << fCentFrom << endl;
281 cout << " fCentTo: " << fCentTo << endl;
282 cout << " fVtxZMin: " << fVtxZMin << endl;
283 cout << " fVtxZMax: " << fVtxZMax << endl;
284 cout << " fUseQualFlag: " << fUseQualFlag << endl;
285 cout << " fClusName: \"" << fClusName << "\"" << endl;
286 cout << " fDoNtuple: " << fDoNtuple << endl;
287 cout << " fDoAfterburner: " << fDoAfterburner << endl;
288 cout << " fAsymMax: " << fAsymMax << endl;
289 cout << " fNminCells: " << fNminCells << endl;
290 cout << " fMinE: " << fMinE << endl;
291 cout << " fMinErat: " << fMinErat << endl;
292 cout << " fMinEcc: " << fMinEcc << endl;
293 cout << " fGeoName: \"" << fGeoName << "\"" << endl;
294 cout << " fMinNClusPerTr: " << fMinNClusPerTr << endl;
295 cout << " fIsoDist: " << fIsoDist << endl;
296 cout << " fTrClassNames: \"" << fTrClassNames << "\"" << endl;
297 cout << " fTrCuts: " << fTrCuts << endl;
298 cout << " fPrimTrCuts: " << fPrimTrCuts << endl;
299 cout << " fDoTrMatGeom: " << fDoTrMatGeom << endl;
300 cout << " fTrainMode: " << fTrainMode << endl;
301 cout << " fMarkCells: " << fMarkCells << endl;
302 cout << " fMinL0Time: " << fMinL0Time << endl;
303 cout << " fMaxL0Time: " << fMaxL0Time << endl;
304 cout << " fMcMode: " << fMcMode << endl;
305 cout << " fEmbedMode: " << fEmbedMode << endl;
306 cout << " fGeom: " << fGeom << endl;
307 cout << " fReco: " << fReco << endl;
308 cout << " fTrigName: " << fTrigName << endl;
309 cout << " fDoPSel: " << fDoPSel << endl;
312 fGeom = AliEMCALGeometry::GetInstance(fGeoName);
314 if (fGeom->GetMatrixForSuperModule(0))
315 fIsGeoMatsSet = kTRUE;
318 fReco = new AliEMCALRecoUtils();
319 fTrClassNamesArr = fTrClassNames.Tokenize(" ");
320 fOutput = new TList();
321 fOutput->SetOwner(1);
322 fSelTracks = new TObjArray;
323 fSelPrimTracks = new TObjArray;
326 TFile *f = OpenFile(1);
327 TDirectory::TContext context(f);
329 f->SetCompressionLevel(2);
330 fNtuple = new TTree(Form("tree%.0fto%.0f",fCentFrom,fCentTo), "StandaloneTree");
331 fNtuple->SetDirectory(f);
333 fNtuple->SetAutoFlush(-2*1024*1024);
334 fNtuple->SetAutoSave(0);
336 fNtuple->SetAutoFlush(-32*1024*1024);
337 fNtuple->SetAutoSave(0);
340 fHeader = new AliStaHeader;
341 fNtuple->Branch("header", &fHeader, 16*1024, 99);
342 fPrimVert = new AliStaVertex;
343 fNtuple->Branch("primv", &fPrimVert, 16*1024, 99);
344 fSpdVert = new AliStaVertex;
345 fNtuple->Branch("spdv", &fSpdVert, 16*1024, 99);
346 fTpcVert = new AliStaVertex;
347 fNtuple->Branch("tpcv", &fTpcVert, 16*1024, 99);
348 if (TClass::GetClass("AliStaCluster"))
349 TClass::GetClass("AliStaCluster")->IgnoreTObjectStreamer();
350 fClusters = new TClonesArray("AliStaCluster");
351 fNtuple->Branch("clusters", &fClusters, 8*16*1024, 99);
352 if (TClass::GetClass("AliStaTrigger"))
353 TClass::GetClass("AliStaTrigger")->IgnoreTObjectStreamer();
354 fTriggers = new TClonesArray("AliStaTrigger");
355 fNtuple->Branch("l0prim", &fTriggers, 16*1024, 99);
356 if (fMcMode||fEmbedMode) {
357 if (TClass::GetClass("AliStaPart"))
358 TClass::GetClass("AliStaPart")->IgnoreTObjectStreamer();
359 fMcParts = new TClonesArray("AliStaPart");
360 fNtuple->Branch("mcparts", &fMcParts, 8*16*1024, 99);
365 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
366 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad();
367 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad();
370 Bool_t th1 = TH1::GetDefaultSumw2();
371 TH1::SetDefaultSumw2(kTRUE);
372 Bool_t th2 = TH2::GetDefaultSumw2();
373 TH2::SetDefaultSumw2(kTRUE);
374 fHCuts = new TH1F("hEventCuts","",5,0.5,5.5);
375 fHCuts->GetXaxis()->SetBinLabel(1,"All");
376 fHCuts->GetXaxis()->SetBinLabel(2,"PS");
377 fHCuts->GetXaxis()->SetBinLabel(3,Form("%s: %.0f-%.0f",fCentVar.Data(),fCentFrom,fCentTo));
378 fHCuts->GetXaxis()->SetBinLabel(4,"QFlag");
379 fHCuts->GetXaxis()->SetBinLabel(5,Form("zvtx: %.0f-%.0f",fVtxZMin,fVtxZMax));
380 fOutput->Add(fHCuts);
381 fHVertexZ = new TH1F("hVertexZBeforeCut","",100,-25,25);
382 fHVertexZ->SetXTitle("z [cm]");
383 fOutput->Add(fHVertexZ);
384 fHVertexZ2 = new TH1F("hVertexZAfterCut","",100,-25,25);
385 fHVertexZ2->SetXTitle("z [cm]");
386 fOutput->Add(fHVertexZ2);
387 fHCent = new TH1F("hCentBeforeCut","",102,-1,101);
388 fHCent->SetXTitle(fCentVar.Data());
389 fOutput->Add(fHCent);
390 fHCentQual = new TH1F("hCentAfterCut","",102,-1,101);
391 fHCentQual->SetXTitle(fCentVar.Data());
392 fOutput->Add(fHCentQual);
393 fHTclsBeforeCuts = new TH1F("hTclsBeforeCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
394 fHTclsAfterCuts = new TH1F("hTclsAfterCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
395 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
396 const char *name = fTrClassNamesArr->At(i)->GetName();
397 fHTclsBeforeCuts->GetXaxis()->SetBinLabel(1+i,name);
398 fHTclsAfterCuts->GetXaxis()->SetBinLabel(1+i,name);
400 fOutput->Add(fHTclsBeforeCuts);
401 fOutput->Add(fHTclsAfterCuts);
403 // histograms for cells
404 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
405 fHColuRow = new TH2*[nsm];
406 fHColuRowE = new TH2*[nsm];
407 fHCellMult = new TH1*[nsm];
408 for (Int_t i = 0; i<nsm; ++i) {
409 fHColuRow[i] = new TH2F(Form("hColRow_Mod%d",i),"",48,0,48,24,0.,24);
410 fHColuRow[i]->SetTitle(Form("Module %d: Occupancy", i));
411 fHColuRow[i]->SetXTitle("col (i#eta)");
412 fHColuRow[i]->SetYTitle("row (i#phi)");
413 fHColuRowE[i] = new TH2F(Form("hColRowE_Mod%d", i),"",48,0,48,24,0,24);
414 fHColuRowE[i]->SetTitle(Form("Module %d: Cell energy",i));
415 fHColuRowE[i]->SetXTitle("col (i#eta)");
416 fHColuRowE[i]->SetYTitle("row (i#phi)");
417 fHCellMult[i] = new TH1F(Form("hCellMult_Mod%d",i),"",1000,0,1000);
418 fHCellMult[i]->SetTitle(Form("Module %d: Cell multiplicity",i));
419 fHCellMult[i]->SetXTitle("# of cells");
420 fOutput->Add(fHColuRow[i]);
421 fOutput->Add(fHColuRowE[i]);
422 fOutput->Add(fHCellMult[i]);
424 fHCellE = new TH1F("hCellE","",250,0.,25.);
425 fHCellE->SetXTitle("E_{cell} [GeV]");
426 fOutput->Add(fHCellE);
427 fHCellH = new TH1F ("hCellHighestE","",250,0.,25.);
428 fHCellH->SetXTitle("E^{max}_{cell} [GeV]");
429 fOutput->Add(fHCellH);
430 fHCellM = new TH1F ("hCellMeanEperHitCell","",250,0.,2.5);
431 fHCellM->SetXTitle("#LT E_{cell}#GT [GeV]");
432 fOutput->Add(fHCellM);
433 fHCellM2 = new TH1F ("hCellMeanEperAllCells","",250,0.,1);
434 fHCellM2->SetXTitle("1/N_{cells} #Sigma E_{cell} [GeV]");
435 fOutput->Add(fHCellM2);
437 fHCellFreqNoCut = new TH1*[nsm];
438 fHCellFreqCut100M = new TH1*[nsm];
439 fHCellFreqCut300M = new TH1*[nsm];
440 fHCellFreqE = new TH1*[nsm];
441 for (Int_t i = 0; i<nsm; ++i){
442 Double_t lbin = i*24*48-0.5;
443 Double_t hbin = lbin+24*48;
444 fHCellFreqNoCut[i] = new TH1F(Form("hCellFreqNoCut_SM%d",i),
445 Form("Frequency SM%d (no cut);id;#",i), 1152, lbin, hbin);
446 fHCellFreqCut100M[i] = new TH1F(Form("hCellFreqCut100M_SM%d",i),
447 Form("Frequency SM%d (>0.1GeV);id;#",i), 1152, lbin, hbin);
448 fHCellFreqCut300M[i] = new TH1F(Form("hCellFreqCut300M_SM%d",i),
449 Form("Frequency SM%d (>0.3GeV);id;#",i), 1152, lbin, hbin);
450 fHCellFreqE[i] = new TH1F(Form("hCellFreqE_SM%d",i),
451 Form("Frequency SM%d (E weighted);id;#",i), 1152, lbin, hbin);
452 fOutput->Add(fHCellFreqNoCut[i]);
453 fOutput->Add(fHCellFreqCut100M[i]);
454 fOutput->Add(fHCellFreqCut300M[i]);
455 fOutput->Add(fHCellFreqE[i]);
457 if (!fMarkCells.IsNull()) {
458 fHCellCheckE = new TH1*[24*48*nsm];
459 memset(fHCellCheckE,0,24*48*nsm*sizeof(TH1*));
460 TObjArray *cells = fMarkCells.Tokenize(" ");
461 Int_t n = cells->GetEntries();
462 Int_t *tcs = new Int_t[n];
463 for (Int_t i=0;i<n;++i) {
464 TString name(cells->At(i)->GetName());
467 for (Int_t i = 0; i<n; ++i) {
470 fHCellCheckE[i] = new TH1F(Form("hCellE_id%d",c), Form("Cell %d;E [GeV/c];#",c), 1000, 0, 10);
471 fOutput->Add(fHCellCheckE[i]);
478 // histograms for clusters
480 fHClustEccentricity = new TH1F("hClustEccentricity","",100,-0.1,1.1);
481 fHClustEccentricity->SetXTitle("#epsilon_{C}");
482 fOutput->Add(fHClustEccentricity);
483 fHClustEtaPhi = new TH2F("hClustEtaPhi","",500,-0.8,0.8,100*nsm,phimin,phimax);
484 fHClustEtaPhi->SetXTitle("#eta");
485 fHClustEtaPhi->SetYTitle("#varphi");
486 fOutput->Add(fHClustEtaPhi);
487 fHClustEnergyPt = new TH2F("hClustEnergyPt","",250,0,50,250,0,50);
488 fHClustEnergyPt->SetXTitle("E [GeV]");
489 fHClustEnergyPt->SetYTitle("p_{T} [GeV/c]");
490 fOutput->Add(fHClustEnergyPt);
491 fHClustEnergySigma = new TH2F("hClustEnergySigma","",100,0,100,500,0,50);
492 fHClustEnergySigma->SetXTitle("E_{C} * #sigma_{max} [GeV*cm]");
493 fHClustEnergySigma->SetYTitle("E_{C} [GeV]");
494 fOutput->Add(fHClustEnergySigma);
495 fHClustSigmaSigma = new TH2F("hClustSigmaSigma","",500,0,50,500,0,50);
496 fHClustSigmaSigma->SetXTitle("#lambda_{0} [cm]");
497 fHClustSigmaSigma->SetYTitle("#sigma_{max} [cm]");
498 fOutput->Add(fHClustSigmaSigma);
499 fHClustNCellEnergyRatio = new TH2F("hClustNCellEnergyRatio","",27,-0.5,26.5,101,-0.05,1.05);
500 fHClustNCellEnergyRatio->SetXTitle("N_{cells}");
501 fHClustNCellEnergyRatio->SetYTitle("E^{max}_{cell}/E_{clus}");
502 fOutput->Add(fHClustNCellEnergyRatio);
503 fHClustEnergyNCell = new TH2F("hClustEnergyNCell","",200,0,100,50,0,50);
504 fHClustEnergyNCell->SetXTitle("E_{clus}");
505 fHClustEnergyNCell->SetYTitle("N_{cells}");
506 fOutput->Add(fHClustEnergyNCell);
509 // histograms for primary tracks
510 fHPrimTrackPt = new TH1F("hPrimTrackPt",";p_{T} [GeV/c]",500,0,50);
511 fOutput->Add(fHPrimTrackPt);
512 fHPrimTrackEta = new TH1F("hPrimTrackEta",";#eta",40,-2,2);
513 fOutput->Add(fHPrimTrackEta);
514 fHPrimTrackPhi = new TH1F("hPrimTrackPhi",";#varPhi [rad]",63,0,6.3);
515 fOutput->Add(fHPrimTrackPhi);
517 // histograms for track matching
519 fHMatchDr = new TH1F("hMatchDrDist",";dR [cm]",500,0,200);
520 fOutput->Add(fHMatchDr);
521 fHMatchDz = new TH1F("hMatchDzDist",";dZ [cm]",500,-100,100);
522 fOutput->Add(fHMatchDz);
523 fHMatchEp = new TH1F("hMatchEpDist",";E/p",100,0,10);
524 fOutput->Add(fHMatchEp);
527 // histograms for pion candidates
529 fHPionEtaPhi = new TH2F("hPionEtaPhi","",100,-0.8,0.8,100*nsm,phimin,phimax);
530 fHPionEtaPhi->SetXTitle("#eta_{#gamma#gamma}");
531 fHPionEtaPhi->SetYTitle("#varphi_{#gamma#gamma}");
532 fOutput->Add(fHPionEtaPhi);
533 fHPionMggPt = new TH2F("hPionMggPt","",1000,0,2,100,0,20.0);
534 fHPionMggPt->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
535 fHPionMggPt->SetYTitle("p_{T}^{#gamma#gamma} [GeV/c]");
536 fOutput->Add(fHPionMggPt);
537 fHPionMggAsym = new TH2F("hPionMggAsym","",1000,0,2,100,0,1);
538 fHPionMggAsym->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
539 fHPionMggAsym->SetYTitle("Z_{#gamma#gamma} [GeV]");
540 fOutput->Add(fHPionMggAsym);
541 fHPionMggDgg = new TH2F("hPionMggDgg","",1000,0,2,100,0,10);
542 fHPionMggDgg->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
543 fHPionMggDgg->SetYTitle("opening angle [grad]");
544 fOutput->Add(fHPionMggDgg);
545 const Int_t nbins = 20;
546 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};
547 fPtRanges = new TAxis(nbins-1,xbins);
548 for (Int_t i = 0; i<=nbins; ++i) {
549 fHPionInvMasses[i] = new TH1F(Form("hPionInvMass%d",i),"",1000,0,2);
550 fHPionInvMasses[i]->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
552 fHPionInvMasses[i]->SetTitle(Form("0 < p_{T}^{#gamma#gamma} <%.1f",xbins[0]));
554 fHPionInvMasses[i]->SetTitle(Form("p_{T}^{#gamma#gamma} > 50"));
556 fHPionInvMasses[i]->SetTitle(Form("%.1f < p_{T}^{#gamma#gamma} <%.1f",xbins[i-1],xbins[i]));
557 fOutput->Add(fHPionInvMasses[i]);
561 TH1::SetDefaultSumw2(th1);
562 TH2::SetDefaultSumw2(th2);
563 PostData(1, fOutput);
566 //________________________________________________________________________
567 void AliAnalysisTaskEMCALPi0PbPb::UserExec(Option_t *)
569 // Called for each event.
574 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
575 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
576 UInt_t offtrigger = 0;
578 am->LoadBranch("AliESDRun.");
579 am->LoadBranch("AliESDHeader.");
580 UInt_t mask1 = fEsdEv->GetESDRun()->GetDetectorsInDAQ();
581 UInt_t mask2 = fEsdEv->GetESDRun()->GetDetectorsInReco();
582 Bool_t desc1 = (mask1 >> 18) & 0x1;
583 Bool_t desc2 = (mask2 >> 18) & 0x1;
584 if (desc1==0 || desc2==0) { //AliDAQ::OfflineModuleName(18)=="EMCAL"
585 AliError(Form("EMCAL not in DAQ/RECO: %u (%u)/%u (%u)",
586 mask1, fEsdEv->GetESDRun()->GetDetectorsInReco(),
587 mask2, fEsdEv->GetESDRun()->GetDetectorsInDAQ()));
590 offtrigger = ((AliInputEventHandler*)(am->GetInputEventHandler()))->IsEventSelected();
592 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
594 AliFatal("Neither ESD nor AOD event found");
597 am->LoadBranch("header");
598 offtrigger = fAodEv->GetHeader()->GetOfflineTrigger();
600 if (!fMcMode && (offtrigger & AliVEvent::kFastOnly)) {
601 AliWarning(Form("EMCAL not in fast only partition"));
604 if (fDoTrMatGeom && !AliGeomManager::GetGeometry()) { // get geometry
605 AliWarning("Accessing geometry from OCDB, this is not very efficient!");
606 AliCDBManager *cdb = AliCDBManager::Instance();
607 if (!cdb->IsDefaultStorageSet())
608 cdb->SetDefaultStorage("raw://");
609 Int_t runno = InputEvent()->GetRunNumber();
610 if (runno != cdb->GetRun())
612 AliGeomManager::LoadGeometry();
615 if (!AliGeomManager::GetGeometry()&&!fIsGeoMatsSet) { // set misalignment matrices (stored in first event)
616 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
617 for (Int_t i=0; i<nsm; ++i) {
618 const TGeoHMatrix *geom = 0;
620 geom = fEsdEv->GetESDRun()->GetEMCALMatrix(i);
622 geom = fAodEv->GetHeader()->GetEMCALMatrix(i);
626 fGeom->SetMisalMatrix(geom,i);
628 fIsGeoMatsSet = kTRUE;
631 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
633 const AliESDRun *erun = fEsdEv->GetESDRun();
634 AliMagF *field = AliMagF::CreateFieldMap(erun->GetCurrentL3(),
635 erun->GetCurrentDip(),
638 erun->GetBeamEnergy(),
639 erun->GetBeamType());
640 TGeoGlobalMagField::Instance()->SetField(field);
642 Double_t pol = -1; //polarity
643 Double_t be = -1; //beam energy
644 AliMagF::BeamType_t btype = AliMagF::kBeamTypepp;
645 Int_t runno = fAodEv->GetRunNumber();
646 if (runno>=136851 && runno<138275) {
649 btype = AliMagF::kBeamTypeAA;
650 } else if (runno>=138275 && runno<=139517) {
653 btype = AliMagF::kBeamTypeAA;
655 AliError(Form("Do not know the bfield parameters for run %d! Using defaults!!!", runno));
657 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", pol, pol, AliMagF::k5kG, btype, be));
665 AliESDHeader *h = dynamic_cast<AliESDHeader*>(InputEvent()->GetHeader());
667 trgclasses = fEsdEv->GetFiredTriggerClasses();
669 AliAODHeader *h2 = dynamic_cast<AliAODHeader*>(InputEvent()->GetHeader());
671 trgclasses = h2->GetFiredTriggerClasses();
673 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
674 const char *name = fTrClassNamesArr->At(i)->GetName();
675 TRegexp regexp(name);
676 if (trgclasses.Contains(regexp))
677 fHTclsBeforeCuts->Fill(1+i);
680 if (fDoPSel && offtrigger==0)
685 const AliCentrality *centP = InputEvent()->GetCentrality();
686 Double_t cent = centP->GetCentralityPercentileUnchecked(fCentVar);
688 if (cent<fCentFrom||cent>fCentTo)
694 if (centP->GetQuality()>0)
698 fHCentQual->Fill(cent);
702 am->LoadBranch("PrimaryVertex.");
703 am->LoadBranch("SPDVertex.");
704 am->LoadBranch("TPCVertex.");
706 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
707 am->LoadBranch("vertices");
711 const AliVVertex *vertex = InputEvent()->GetPrimaryVertex();
715 fHVertexZ->Fill(vertex->GetZ());
717 if(vertex->GetZ()<fVtxZMin||vertex->GetZ()>fVtxZMax)
721 fHVertexZ2->Fill(vertex->GetZ());
723 // count number of accepted events
726 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
727 const char *name = fTrClassNamesArr->At(i)->GetName();
728 TRegexp regexp(name);
729 if (trgclasses.Contains(regexp))
730 fHTclsAfterCuts->Fill(1+i);
733 fRecPoints = 0; // will be set if fClusName is given and AliAnalysisTaskEMCALClusterizeFast is used
734 fDigits = 0; // will be set if fClusName is given and AliAnalysisTaskEMCALClusterizeFast is used
735 fEsdClusters = 0; // will be set if ESD input used and if fRecPoints are not set or if clusters are attached
736 fEsdCells = 0; // will be set if ESD input used
737 fAodClusters = 0; // will be set if AOD input used and if fRecPoints are not set or if clusters are attached
738 // or if fClusName is given and AliAnalysisTaskEMCALClusterizeFast in AOD output mode
739 fAodCells = 0; // will be set if AOD input used
741 // deal with special output from AliAnalysisTaskEMCALClusterizeFast first
742 Bool_t overwrite = 0;
743 Bool_t clusattached = 0;
744 Bool_t recalibrated = 0;
745 if (1 && !fClusName.IsNull()) {
746 AliAnalysisTaskEMCALClusterizeFast *cltask = 0;
747 TObjArray *ts = am->GetTasks();
748 cltask = dynamic_cast<AliAnalysisTaskEMCALClusterizeFast*>(ts->FindObject(fClusName));
749 if (cltask && cltask->GetClusters()) {
750 fRecPoints = cltask->GetClusters();
751 fDigits = cltask->GetDigits();
752 clusattached = cltask->GetAttachClusters();
753 overwrite = cltask->GetOverwrite();
754 if (cltask->GetCalibData()!=0)
755 recalibrated = kTRUE;
758 if (1 && !fClusName.IsNull()) {
761 l = AODEvent()->GetList();
763 l = fAodEv->GetList();
765 fAodClusters = dynamic_cast<TClonesArray*>(l->FindObject(fClusName));
769 if (fEsdEv) { // ESD input mode
770 if (1 && (!fRecPoints||clusattached)) {
771 if (!clusattached && !overwrite)
772 am->LoadBranch("CaloClusters");
773 TList *l = fEsdEv->GetList();
775 fEsdClusters = dynamic_cast<TClonesArray*>(l->FindObject(fClusName));
777 fEsdClusters = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
782 am->LoadBranch("EMCALCells.");
783 fEsdCells = fEsdEv->GetEMCALCells();
785 } else if (fAodEv) { // AOD input mode
786 if (1 && (!fAodClusters || clusattached)) {
788 am->LoadBranch("caloClusters");
789 TList *l = fAodEv->GetList();
791 fAodClusters = dynamic_cast<TClonesArray*>(l->FindObject("caloClusters"));
796 am->LoadBranch("emcalCells");
797 fAodCells = fAodEv->GetEMCALCells();
800 AliFatal("Impossible to not have either pointer to ESD or AOD event");
804 AliDebug(2,Form("fRecPoints set: %p", fRecPoints));
805 AliDebug(2,Form("fDigits set: %p", fDigits));
806 AliDebug(2,Form("fEsdClusters set: %p", fEsdClusters));
807 AliDebug(2,Form("fEsdCells set: %p", fEsdCells));
808 AliDebug(2,Form("fAodClusters set: %p", fAodClusters));
809 AliDebug(2,Form("fAodCells set: %p", fAodCells));
813 ClusterAfterburner();
832 fSelPrimTracks->Clear();
841 PostData(1, fOutput);
844 //________________________________________________________________________
845 void AliAnalysisTaskEMCALPi0PbPb::Terminate(Option_t *)
847 // Terminate called at the end of analysis.
850 TFile *f = OpenFile(1);
851 TDirectory::TContext context(f);
856 AliInfo(Form("%s: Accepted %lld events ", GetName(), fNEvs));
859 //________________________________________________________________________
860 void AliAnalysisTaskEMCALPi0PbPb::CalcCaloTriggers()
862 // Calculate triggers
865 return; // information not available in AOD
872 if (fTrigName.Length()<=0)
875 TClonesArray *arr = dynamic_cast<TClonesArray*>(fEsdEv->FindListObject(fTrigName));
877 AliError(Form("Could not get array with name %s", fTrigName.Data()));
881 Int_t nNumberOfCaloClusters = arr->GetEntries();
882 for(Int_t j = 0, ntrigs = 0; j < nNumberOfCaloClusters; ++j) {
883 AliVCluster *cl = dynamic_cast<AliVCluster*>(arr->At(j));
890 AliStaTrigger *trignew = static_cast<AliStaTrigger*>(fTriggers->New(ntrigs++));
891 Float_t pos[3] = {0,0,0};
892 cl->GetPosition(pos);
894 trignew->fE = cl->E();
895 trignew->fEta = vpos.Eta();
896 trignew->fPhi = vpos.Phi();
898 GetMaxCellEnergy(cl, id);
899 trignew->fIdMax = id;
903 //________________________________________________________________________
904 void AliAnalysisTaskEMCALPi0PbPb::CalcClusterProps()
906 // Calculate cluster properties
913 AliVCaloCells *cells = fEsdCells;
919 TObjArray *clusters = fEsdClusters;
921 clusters = fAodClusters;
925 const Int_t ncells = cells->GetNumberOfCells();
926 const Int_t nclus = clusters->GetEntries();
927 const Int_t ntrks = fSelTracks->GetEntries();
929 std::map<Short_t,Short_t> map;
930 for (Short_t pos=0; pos<ncells; ++pos) {
931 Short_t id = cells->GetCellNumber(pos);
932 if (id>24*48*fGeom->GetNumberOfSuperModules()) {
933 AliError(Form("Id of cell found to be too large: %d", id));
936 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(fDigits->At(pos));
937 if (digit->GetId() != id) {
938 AliError(Form("Ids should be equal: %d %d", id, digit->GetId()));
944 TObjArray filtMcParts;
946 Int_t nmc = fMcParts->GetEntries();
947 for (Int_t i=0; i<nmc; ++i) {
948 AliStaPart *pa = static_cast<AliStaPart*>(fMcParts->At(i));
954 Double_t vertex[3] = {0,0,0};
955 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
957 for(Int_t i=0, ncl=0; i<nclus; ++i) {
958 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
962 if (!clus->IsEMCAL())
967 Float_t clsPos[3] = {0,0,0};
968 clus->GetPosition(clsPos);
969 TVector3 clsVec(clsPos);
970 TLorentzVector clusterVec;
971 clus->GetMomentum(clusterVec,vertex);
972 Double_t clsEta = clusterVec.Eta();
974 AliStaCluster *cl = static_cast<AliStaCluster*>(fClusters->New(ncl++));
976 cl->fR = clsVec.Perp();
977 cl->fEta = clsVec.Eta();
978 cl->fPhi = clsVec.Phi();
979 cl->fN = clus->GetNCells();
980 cl->fN1 = GetNCells(clus,0.100);
981 cl->fN3 = GetNCells(clus,0.300);
983 Double_t emax = GetMaxCellEnergy(clus, id);
985 cl->fSM = fGeom->GetSuperModuleNumber(id);
988 cl->fE2max = GetSecondMaxCellEnergy(clus,id2);
989 cl->fTmax = cells->GetCellTime(id);
990 if (clus->GetDistanceToBadChannel()<10000)
991 cl->fDbc = clus->GetDistanceToBadChannel();
992 if (!TMath::IsNaN(clus->GetDispersion()))
993 cl->fDisp = clus->GetDispersion();
994 if (!TMath::IsNaN(clus->GetM20()))
995 cl->fM20 = clus->GetM20();
996 if (!TMath::IsNaN(clus->GetM02()))
997 cl->fM02 = clus->GetM02();
998 Double_t maxAxis = -1, minAxis = -1;
999 GetSigma(clus,maxAxis,minAxis);
1000 clus->SetTOF(maxAxis); // store sigma in TOF for later plotting
1002 Double_t sEtaEta = -1;
1003 Double_t sPhiPhi = -1;
1004 GetSigmaEtaEta(clus, sEtaEta, sPhiPhi);
1005 cl->fSigEtaEta = sEtaEta;
1006 cl->fSigPhiPhi = sPhiPhi;
1007 Double_t clusterEcc = -1;
1009 clusterEcc = TMath::Sqrt(1.0 - minAxis*minAxis/(maxAxis*maxAxis));
1010 clus->SetChi2(clusterEcc); // store ecc in chi2 for later plotting
1011 cl->fEcc = clusterEcc;
1012 cl->fTrIso = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist);
1013 cl->fTrIso1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 1);
1014 cl->fTrIso2 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 2);
1015 cl->fTrIsoD1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist-0.1);
1016 cl->fTrIso1D1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist-0.1, 1);
1017 cl->fTrIso2D1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist-0.1, 2);
1018 cl->fTrIsoD3 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.1);
1019 cl->fTrIso1D3 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.1, 1);
1020 cl->fTrIso2D3 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.1, 2);
1021 cl->fTrIsoD4 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.2);
1022 cl->fTrIso1D4 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.2, 1);
1023 cl->fTrIso2D4 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist+0.2, 2);
1024 cl->fTrIsoStrip = GetTrackIsoStrip(clusterVec.Eta(), clusterVec.Phi());
1025 cl->fCeCore = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.05);
1026 cl->fCeIso = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),fIsoDist);
1027 cl->fCeIso1 = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.10);
1028 cl->fCeIso3 = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.30);
1029 cl->fCeIso4 = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.40);
1030 cl->fCeIso3x3 = GetCellIsoNxM(clsVec.Eta(),clsVec.Phi(), 3, 3);
1031 cl->fCeIso4x4 = GetCellIsoNxM(clsVec.Eta(),clsVec.Phi(), 4, 4);
1032 cl->fCeIso5x5 = GetCellIsoNxM(clsVec.Eta(),clsVec.Phi(), 5, 5);
1033 cl->fCeIso3x22 = GetCellIsoNxM(clsVec.Eta(),clsVec.Phi(), 3, 22);
1034 cl->fIsShared = IsShared(clus);
1039 Int_t ntrig = fTriggers->GetEntries();
1040 for (Int_t j = 0; j<ntrig; ++j) {
1041 AliStaTrigger *sta = static_cast<AliStaTrigger*>(fTriggers->At(j));
1044 Short_t idmax = sta->fIdMax;
1045 Bool_t inc = IsIdPartOfCluster(clus, idmax);
1048 cl->fTrigE = sta->fE;
1056 Double_t mind2 = 1e10;
1057 for(Int_t j = 0; j<ntrks; ++j) {
1058 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
1061 if (TMath::Abs(clsEta-track->Eta())>0.5)
1063 TVector3 vec(clsPos);
1064 Float_t tmpEta=-1, tmpPhi=-1, tmpR2=1e10;
1067 AliESDtrack *esdTrack = static_cast<AliESDtrack*>(track);
1068 dedx = esdTrack->GetTPCsignal();
1070 if (TMath::Abs(clsEta-track->Eta())>fIsoDist)
1072 AliExternalTrackParam tParam;
1073 tParam.CopyFromVTrack(track);
1074 if (!fReco->ExtrapolateTrackToCluster(&tParam, clus, tmpEta, tmpPhi))
1076 tmpR2 = tmpEta*tmpEta + tmpPhi*tmpPhi;
1077 Double_t d2 = tmpR2;
1082 cl->fTrEp = clus->E()/track->P();
1087 if (cl->fIsTrackM) {
1088 fHMatchDr->Fill(cl->fTrDr);
1089 fHMatchDz->Fill(cl->fTrDz);
1090 fHMatchEp->Fill(cl->fTrEp);
1096 Int_t nmc = filtMcParts.GetEntries();
1097 Double_t diffR2 = 1e9;
1098 AliStaPart *msta = 0;
1099 for (Int_t j=0; j<nmc; ++j) {
1100 AliStaPart *pa = static_cast<AliStaPart*>(filtMcParts.At(j));
1101 Double_t t1=clsVec.Eta()-pa->fVEta;
1102 Double_t t2=TVector2::Phi_mpi_pi(clsVec.Phi()-pa->fVPhi);
1103 Double_t tmp = t1*t1+t2*t2;
1109 if (diffR2<10 && msta!=0) {
1110 cl->fMcLabel = msta->fLab;
1115 if (fDigits && fEmbedMode) {
1116 for(Int_t j=0; j<cl->fN; ++j) {
1117 Short_t cid = TMath::Abs(clus->GetCellAbsId(j));
1119 std::map<Short_t,Short_t>::iterator it = map.find(cid);
1124 AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(fDigits->At(pos));
1127 if (digit->GetType()<-1) {
1128 cl->fEmbE += digit->GetChi2();
1135 //________________________________________________________________________
1136 void AliAnalysisTaskEMCALPi0PbPb::CalcPrimTracks()
1138 // Calculate track properties for primary tracks.
1140 fSelPrimTracks->Clear();
1142 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1143 TClonesArray *tracks = 0;
1144 Bool_t doConstrain = kFALSE;
1145 TString trkname(fPrimTracksName);
1147 if (trkname.IsNull()) {
1149 am->LoadBranch("Tracks");
1150 fSelPrimTracks->SetOwner(kTRUE);
1151 doConstrain = kTRUE;
1153 TList *l = fEsdEv->GetList();
1154 tracks = dynamic_cast<TClonesArray*>(l->FindObject(trkname));
1157 am->LoadBranch("tracks");
1158 TList *l = fAodEv->GetList();
1159 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
1163 AliError(Form("Pointer to tracks %s == 0", trkname.Data() ));
1167 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
1168 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad()-fIsoDist*1.25;
1169 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad()+fIsoDist*1.25;
1172 am->LoadBranch("PrimaryVertex.");
1173 const AliESDVertex *vtx = fEsdEv->GetPrimaryVertexSPD();
1174 am->LoadBranch("SPDVertex.");
1175 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
1176 am->LoadBranch("Tracks");
1177 const Int_t Ntracks = tracks->GetEntries();
1178 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
1179 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
1181 AliWarning(Form("Could not receive track %d\n", iTracks));
1184 if (fPrimTrCuts && !fPrimTrCuts->IsSelected(track))
1186 Double_t eta = track->Eta();
1189 if (track->Phi()<phimin||track->Phi()>phimax)
1192 fSelPrimTracks->Add(track);
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());
1203 Double_t p[3] = { 0. };
1205 Double_t pos[3] = { 0. };
1207 Double_t covTr[21] = { 0. };
1208 copyt.GetCovarianceXYZPxPyPz(covTr);
1209 Double_t pid[10] = { 0. };
1210 copyt.GetESDpid(pid);
1211 AliAODTrack *aTrack = new AliAODTrack(copyt.GetID(),
1218 (Short_t)copyt.GetSign(),
1219 copyt.GetITSClusterMap(),
1221 0,/*fPrimaryVertex,*/
1222 kTRUE, // check if this is right
1223 vtx->UsesTrack(copyt.GetID()));
1224 aTrack->SetTPCClusterMap(copyt.GetTPCClusterMap());
1225 aTrack->SetTPCSharedMap (copyt.GetTPCSharedMap());
1226 Float_t ndf = copyt.GetTPCNcls() + 1 - 5 ;
1228 aTrack->SetChi2perNDF(copyt.GetTPCchi2()/ndf);
1230 aTrack->SetChi2perNDF(-1);
1231 aTrack->SetFlags(copyt.GetStatus());
1232 aTrack->SetTPCPointsF(copyt.GetTPCNclsF());
1233 fSelPrimTracks->Add(aTrack);
1236 Int_t ntracks = tracks->GetEntries();
1237 for (Int_t i=0; i<ntracks; ++i) {
1238 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1241 Double_t eta = track->Eta();
1244 if (track->Phi()<phimin||track->Phi()>phimax)
1246 if(track->GetTPCNcls()<fMinNClusPerTr)
1248 //todo: Learn how to set/filter AODs for prim/sec tracks
1249 fSelPrimTracks->Add(track);
1254 //________________________________________________________________________
1255 void AliAnalysisTaskEMCALPi0PbPb::CalcTracks()
1257 // Calculate track properties (including secondaries).
1259 fSelTracks->Clear();
1261 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1262 TClonesArray *tracks = 0;
1264 am->LoadBranch("Tracks");
1265 TList *l = fEsdEv->GetList();
1266 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
1268 am->LoadBranch("tracks");
1269 TList *l = fAodEv->GetList();
1270 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
1277 const Int_t Ntracks = tracks->GetEntries();
1278 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
1279 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
1281 AliWarning(Form("Could not receive track %d\n", iTracks));
1284 if (fTrCuts && !fTrCuts->IsSelected(track))
1286 Double_t eta = track->Eta();
1289 fSelTracks->Add(track);
1292 Int_t ntracks = tracks->GetEntries();
1293 for (Int_t i=0; i<ntracks; ++i) {
1294 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1297 Double_t eta = track->Eta();
1300 if(track->GetTPCNcls()<fMinNClusPerTr)
1303 if (0 && (track->Pt()>=0.6) && (track->PxAtDCA()==-999)) { // compute position on EMCAL
1304 AliExternalTrackParam tParam;
1305 tParam.CopyFromVTrack(track);
1306 if (AliTrackerBase::PropagateTrackToBxByBz(&tParam, 430, 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());
1493 fHClustEnergyNCell->Fill(clus->E(),clus->GetNCells());
1497 //________________________________________________________________________
1498 void AliAnalysisTaskEMCALPi0PbPb::CalcMcInfo()
1500 // Get Mc truth particle information.
1507 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
1508 Double_t etamin = -0.7;
1509 Double_t etamax = +0.7;
1510 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad();
1511 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad();
1514 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1515 am->LoadBranch(AliAODMCParticle::StdBranchName());
1516 TClonesArray *tca = dynamic_cast<TClonesArray*>(fAodEv->FindListObject(AliAODMCParticle::StdBranchName()));
1520 Int_t nents = tca->GetEntries();
1521 for(int it=0; it<nents; ++it) {
1522 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(tca->At(it));
1525 // pion or eta meson or direct photon
1526 if(part->GetPdgCode() == 111) {
1527 } else if(part->GetPdgCode() == 221) {
1528 } else if(part->GetPdgCode() == 22 ) {
1533 Double_t dR = TMath::Sqrt((part->Xv()*part->Xv())+(part->Yv()*part->Yv()));
1538 Double_t pt = part->Pt() ;
1541 Double_t eta = part->Eta();
1542 if (eta<etamin||eta>etamax)
1544 Double_t phi = part->Phi();
1545 if (phi<phimin||phi>phimax)
1548 ProcessDaughters(part, it, tca);
1553 AliMCEvent *mcEvent = MCEvent();
1557 const AliVVertex *evtVtx = mcEvent->GetPrimaryVertex();
1561 mcEvent->PreReadAll();
1563 Int_t nTracks = mcEvent->GetNumberOfPrimaries();
1564 for (Int_t iTrack = 0; iTrack<nTracks; ++iTrack) {
1565 AliMCParticle *mcP = static_cast<AliMCParticle*>(mcEvent->GetTrack(iTrack));
1569 // pion or eta meson or direct photon
1570 if(mcP->PdgCode() == 111) {
1571 } else if(mcP->PdgCode() == 221) {
1572 } else if(mcP->PdgCode() == 22 ) {
1577 Double_t dR = TMath::Sqrt((mcP->Xv()-evtVtx->GetX())*(mcP->Xv()-evtVtx->GetX()) +
1578 (mcP->Yv()-evtVtx->GetY())*(mcP->Yv()-evtVtx->GetY()));
1583 Double_t pt = mcP->Pt() ;
1586 Double_t eta = mcP->Eta();
1587 if (eta<etamin||eta>etamax)
1589 Double_t phi = mcP->Phi();
1590 if (phi<phimin||phi>phimax)
1593 ProcessDaughters(mcP, iTrack, mcEvent);
1597 //________________________________________________________________________
1598 void AliAnalysisTaskEMCALPi0PbPb::FillNtuple()
1605 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1607 fHeader->fRun = fAodEv->GetRunNumber();
1608 fHeader->fOrbit = fAodEv->GetHeader()->GetOrbitNumber();
1609 fHeader->fPeriod = fAodEv->GetHeader()->GetPeriodNumber();
1610 fHeader->fBx = fAodEv->GetHeader()->GetBunchCrossNumber();
1611 fHeader->fL0 = fAodEv->GetHeader()->GetL0TriggerInputs();
1612 fHeader->fL1 = fAodEv->GetHeader()->GetL1TriggerInputs();
1613 fHeader->fL2 = fAodEv->GetHeader()->GetL2TriggerInputs();
1614 fHeader->fTrClassMask = fAodEv->GetHeader()->GetTriggerMask();
1615 fHeader->fTrCluster = fAodEv->GetHeader()->GetTriggerCluster();
1616 fHeader->fOffTriggers = fAodEv->GetHeader()->GetOfflineTrigger();
1617 fHeader->fFiredTriggers = fAodEv->GetHeader()->GetFiredTriggerClasses();
1619 fHeader->fRun = fEsdEv->GetRunNumber();
1620 fHeader->fOrbit = fEsdEv->GetHeader()->GetOrbitNumber();
1621 fHeader->fPeriod = fEsdEv->GetESDRun()->GetPeriodNumber();
1622 fHeader->fBx = fEsdEv->GetHeader()->GetBunchCrossNumber();
1623 fHeader->fL0 = fEsdEv->GetHeader()->GetL0TriggerInputs();
1624 fHeader->fL1 = fEsdEv->GetHeader()->GetL1TriggerInputs();
1625 fHeader->fL2 = fEsdEv->GetHeader()->GetL2TriggerInputs();
1626 fHeader->fTrClassMask = fEsdEv->GetHeader()->GetTriggerMask();
1627 fHeader->fTrCluster = fEsdEv->GetHeader()->GetTriggerCluster();
1628 fHeader->fOffTriggers = ((AliInputEventHandler*)(am->GetInputEventHandler()))->IsEventSelected();
1629 fHeader->fFiredTriggers = fEsdEv->GetFiredTriggerClasses();
1630 Float_t v0CorrR = 0;
1631 fHeader->fV0 = AliESDUtils::GetCorrV0(fEsdEv,v0CorrR);
1632 const AliMultiplicity *mult = fEsdEv->GetMultiplicity();
1634 fHeader->fCl1 = mult->GetNumberOfITSClusters(1);
1635 fHeader->fTr = AliESDtrackCuts::GetReferenceMultiplicity(fEsdEv,1);
1636 AliTriggerAnalysis trAn; /// Trigger Analysis
1637 Bool_t v0B = trAn.IsOfflineTriggerFired(fEsdEv, AliTriggerAnalysis::kV0C);
1638 Bool_t v0A = trAn.IsOfflineTriggerFired(fEsdEv, AliTriggerAnalysis::kV0A);
1639 fHeader->fV0And = v0A && v0B;
1640 fHeader->fIsHT = (fHeader->fOffTriggers & AliVEvent::kEMC1) || (fHeader->fOffTriggers & AliVEvent::kEMC7);
1641 am->LoadBranch("SPDPileupVertices");
1642 am->LoadBranch("TrkPileupVertices");
1643 fHeader->fIsPileup = fEsdEv->IsPileupFromSPD(3,0.8);
1644 fHeader->fIsPileup2 = fEsdEv->IsPileupFromSPD(3,0.4);
1645 fHeader->fIsPileup4 = fEsdEv->IsPileupFromSPD(3,0.2);
1646 fHeader->fIsPileup8 = fEsdEv->IsPileupFromSPD(3,0.1);
1647 fHeader->fNSpdVertices = fEsdEv->GetNumberOfPileupVerticesSPD();
1648 fHeader->fNTpcVertices = fEsdEv->GetNumberOfPileupVerticesTracks();
1651 AliCentrality *cent = InputEvent()->GetCentrality();
1652 fHeader->fV0Cent = cent->GetCentralityPercentileUnchecked("V0M");
1653 fHeader->fCl1Cent = cent->GetCentralityPercentileUnchecked("CL1");
1654 fHeader->fTrCent = cent->GetCentralityPercentileUnchecked("TRK");
1655 fHeader->fCqual = cent->GetQuality();
1657 AliEventplane *ep = InputEvent()->GetEventplane();
1659 if (ep->GetQVector())
1660 fHeader->fPsi = ep->GetQVector()->Phi()/2. ;
1663 if (ep->GetQsub1()&&ep->GetQsub2())
1664 fHeader->fPsiRes = ep->GetQsub1()->Phi()/2.-ep->GetQsub2()->Phi()/2.;
1666 fHeader->fPsiRes = 0;
1670 TString trgclasses(fHeader->fFiredTriggers);
1671 for (Int_t j = 0; j<fTrClassNamesArr->GetEntries(); ++j) {
1672 const char *name = fTrClassNamesArr->At(j)->GetName();
1673 TRegexp regexp(name);
1674 if (trgclasses.Contains(regexp))
1675 val += TMath::Power(2,j);
1677 fHeader->fTcls = (UInt_t)val;
1679 fHeader->fNSelTr = fSelTracks->GetEntries();
1680 fHeader->fNSelPrimTr = fSelPrimTracks->GetEntries();
1681 fHeader->fNSelPrimTr1 = 0;
1682 fHeader->fNSelPrimTr2 = 0;
1683 for(int iTracks=0; iTracks < fSelPrimTracks->GetEntries(); iTracks++){
1684 AliESDtrack *track = static_cast<AliESDtrack*>(fSelPrimTracks->At(iTracks));
1686 ++fHeader->fNSelPrimTr1;
1688 ++fHeader->fNSelPrimTr2;
1691 fHeader->fNCells = 0;
1692 fHeader->fNCells0 = 0;
1693 fHeader->fNCells01 = 0;
1694 fHeader->fNCells03 = 0;
1695 fHeader->fNCells1 = 0;
1696 fHeader->fNCells2 = 0;
1697 fHeader->fNCells5 = 0;
1698 fHeader->fMaxCellE = 0;
1700 AliVCaloCells *cells = fEsdCells;
1705 Int_t ncells = cells->GetNumberOfCells();
1706 for(Int_t j=0; j<ncells; ++j) {
1707 Double_t cellen = cells->GetAmplitude(j);
1709 ++fHeader->fNCells0;
1711 ++fHeader->fNCells01;
1713 ++fHeader->fNCells03;
1715 ++fHeader->fNCells1;
1717 ++fHeader->fNCells2;
1719 ++fHeader->fNCells5;
1720 if (cellen>fHeader->fMaxCellE)
1721 fHeader->fMaxCellE = cellen;
1723 fHeader->fNCells = ncells;
1726 fHeader->fNClus = 0;
1727 fHeader->fNClus1 = 0;
1728 fHeader->fNClus2 = 0;
1729 fHeader->fNClus5 = 0;
1730 fHeader->fMaxClusE = 0;
1732 TObjArray *clusters = fEsdClusters;
1734 clusters = fAodClusters;
1737 Int_t nclus = clusters->GetEntries();
1738 for(Int_t j=0; j<nclus; ++j) {
1739 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(j));
1740 if (!clus->IsEMCAL())
1742 Double_t clusen = clus->E();
1749 if (clusen>fHeader->fMaxClusE)
1750 fHeader->fMaxClusE = clusen;
1752 fHeader->fNClus = nclus;
1755 fHeader->fMaxTrE = 0;
1757 Int_t ntrig = fTriggers->GetEntries();
1758 for (Int_t j = 0; j<ntrig; ++j) {
1759 AliStaTrigger *sta = static_cast<AliStaTrigger*>(fTriggers->At(j));
1762 if (sta->fE>fHeader->fMaxTrE)
1763 fHeader->fMaxTrE = sta->fE;
1767 // count cells above 100 MeV on super modules
1768 fHeader->fNcSM0 = GetNCells(0, 0.100);
1769 fHeader->fNcSM1 = GetNCells(1, 0.100);
1770 fHeader->fNcSM2 = GetNCells(2, 0.100);
1771 fHeader->fNcSM3 = GetNCells(3, 0.100);
1772 fHeader->fNcSM4 = GetNCells(4, 0.100);
1773 fHeader->fNcSM5 = GetNCells(5, 0.100);
1774 fHeader->fNcSM6 = GetNCells(6, 0.100);
1775 fHeader->fNcSM7 = GetNCells(7, 0.100);
1776 fHeader->fNcSM8 = GetNCells(8, 0.100);
1777 fHeader->fNcSM9 = GetNCells(9, 0.100);
1780 am->LoadBranch("vertices");
1781 AliAODVertex *pv = fAodEv->GetPrimaryVertex();
1782 FillVertex(fPrimVert, pv);
1783 AliAODVertex *sv = fAodEv->GetPrimaryVertexSPD();
1784 FillVertex(fSpdVert, sv);
1786 am->LoadBranch("PrimaryVertex.");
1787 const AliESDVertex *pv = fEsdEv->GetPrimaryVertexTracks();
1788 FillVertex(fPrimVert, pv);
1789 am->LoadBranch("SPDVertex.");
1790 const AliESDVertex *sv = fEsdEv->GetPrimaryVertexSPD();
1791 FillVertex(fSpdVert, sv);
1792 am->LoadBranch("TPCVertex.");
1793 const AliESDVertex *tv = fEsdEv->GetPrimaryVertexTPC();
1794 FillVertex(fTpcVert, tv);
1800 //________________________________________________________________________
1801 void AliAnalysisTaskEMCALPi0PbPb::FillPionHists()
1803 // Fill histograms related to pions.
1805 Double_t vertex[3] = {0};
1806 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1808 TObjArray *clusters = fEsdClusters;
1810 clusters = fAodClusters;
1813 TLorentzVector clusterVec1;
1814 TLorentzVector clusterVec2;
1815 TLorentzVector pionVec;
1817 Int_t nclus = clusters->GetEntries();
1818 for (Int_t i = 0; i<nclus; ++i) {
1819 AliVCluster *clus1 = static_cast<AliVCluster*>(clusters->At(i));
1822 if (!clus1->IsEMCAL())
1824 if (clus1->E()<fMinE)
1826 if (clus1->GetNCells()<fNminCells)
1828 if (GetMaxCellEnergy(clus1)/clus1->E()<fMinErat)
1830 if (clus1->Chi2()<fMinEcc) // eccentricity cut
1832 clus1->GetMomentum(clusterVec1,vertex);
1833 for (Int_t j = i+1; j<nclus; ++j) {
1834 AliVCluster *clus2 = static_cast<AliVCluster*>(clusters->At(j));
1837 if (!clus2->IsEMCAL())
1839 if (clus2->E()<fMinE)
1841 if (clus2->GetNCells()<fNminCells)
1843 if (GetMaxCellEnergy(clus2)/clus2->E()<fMinErat)
1845 if (clus2->Chi2()<fMinEcc) // eccentricity cut
1847 clus2->GetMomentum(clusterVec2,vertex);
1848 pionVec = clusterVec1 + clusterVec2;
1849 Double_t pionZgg = TMath::Abs(clusterVec1.E()-clusterVec2.E())/pionVec.E();
1850 Double_t pionOpeningAngle = clusterVec1.Angle(clusterVec2.Vect());
1851 if (pionZgg < fAsymMax) {
1852 fHPionEtaPhi->Fill(pionVec.Eta(),pionVec.Phi());
1853 fHPionMggPt->Fill(pionVec.M(),pionVec.Pt());
1854 fHPionMggAsym->Fill(pionVec.M(),pionZgg);
1855 fHPionMggDgg->Fill(pionVec.M(),pionOpeningAngle);
1856 Int_t bin = fPtRanges->FindBin(pionVec.Pt());
1857 fHPionInvMasses[bin]->Fill(pionVec.M());
1864 //________________________________________________________________________
1865 void AliAnalysisTaskEMCALPi0PbPb::FillMcHists()
1867 // Fill additional MC information histograms.
1872 // check if aod or esd mc mode and the fill histos
1875 //________________________________________________________________________
1876 void AliAnalysisTaskEMCALPi0PbPb::FillOtherHists()
1878 // Fill other histograms.
1880 for(int iTracks=0; iTracks < fSelPrimTracks->GetEntries(); ++iTracks){
1881 AliESDtrack *track = static_cast<AliESDtrack*>(fSelPrimTracks->At(iTracks));
1884 fHPrimTrackPt->Fill(track->Pt());
1885 fHPrimTrackEta->Fill(track->Eta());
1886 fHPrimTrackPhi->Fill(track->Phi());
1890 //________________________________________________________________________
1891 void AliAnalysisTaskEMCALPi0PbPb::FillTrackHists()
1893 // Fill track histograms.
1895 if (fSelPrimTracks) {
1896 for(int iTracks=0; iTracks < fSelPrimTracks->GetEntries(); iTracks++) {
1897 AliESDtrack *track = static_cast<AliESDtrack*>(fSelPrimTracks->At(iTracks));
1900 fHPrimTrackPt->Fill(track->Pt());
1901 fHPrimTrackEta->Fill(track->Eta());
1902 fHPrimTrackPhi->Fill(track->Phi());
1907 //__________________________________________________________________________________________________
1908 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliESDVertex *esdv)
1910 // Fill vertex from ESD vertex info.
1912 v->fVx = esdv->GetX();
1913 v->fVy = esdv->GetY();
1914 v->fVz = esdv->GetZ();
1915 v->fVc = esdv->GetNContributors();
1916 v->fDisp = esdv->GetDispersion();
1917 v->fZres = esdv->GetZRes();
1918 v->fChi2 = esdv->GetChi2();
1919 v->fSt = esdv->GetStatus();
1920 v->fIs3D = esdv->IsFromVertexer3D();
1921 v->fIsZ = esdv->IsFromVertexerZ();
1924 //__________________________________________________________________________________________________
1925 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliAODVertex *aodv)
1927 // Fill vertex from AOD vertex info.
1929 v->fVx = aodv->GetX();
1930 v->fVy = aodv->GetY();
1931 v->fVz = aodv->GetZ();
1932 v->fVc = aodv->GetNContributors();
1933 v->fChi2 = aodv->GetChi2();
1936 //________________________________________________________________________
1937 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellIsolation(Double_t cEta, Double_t cPhi, Double_t radius) const
1939 // Compute isolation based on cell content.
1941 AliVCaloCells *cells = fEsdCells;
1947 Double_t cellIsolation = 0;
1948 Double_t rad2 = radius*radius;
1949 Int_t ncells = cells->GetNumberOfCells();
1950 for (Int_t i = 0; i<ncells; ++i) {
1951 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1952 Float_t eta=-1, phi=-1;
1953 fGeom->EtaPhiFromIndex(absID,eta,phi);
1954 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
1955 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1958 Double_t cellE = cells->GetAmplitude(i);
1959 Double_t theta = 2*TMath::ATan(TMath::Exp(-eta));
1960 Double_t cellEt = cellE*sin(theta);
1961 cellIsolation += cellEt;
1963 return cellIsolation;
1966 //________________________________________________________________________
1967 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellIsoNxM(Double_t cEta, Double_t cPhi, Int_t N, Int_t M) const
1969 // Compute isolation based on cell content, in a NxM rectangle.
1971 AliVCaloCells *cells = fEsdCells;
1977 Double_t cellIsolation = 0;
1978 Int_t ncells = cells->GetNumberOfCells();
1979 for (Int_t i = 0; i<ncells; ++i) {
1980 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1981 Float_t eta=-1, phi=-1;
1982 fGeom->EtaPhiFromIndex(absID,eta,phi);
1983 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
1984 Double_t etadiff = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1985 if(TMath::Abs(etadiff)/0.014>N)
1987 if(TMath::Abs(phidiff)/0.014>M)
1989 Double_t cellE = cells->GetAmplitude(i);
1990 Double_t theta = 2*TMath::ATan(TMath::Exp(-eta));
1991 Double_t cellEt = cellE*sin(theta);
1992 cellIsolation += cellEt;
1994 return cellIsolation;
1997 //________________________________________________________________________
1998 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellEnergy(const AliVCluster *cluster) const
2000 // Get maximum energy of attached cell.
2003 Int_t ncells = cluster->GetNCells();
2005 for (Int_t i=0; i<ncells; i++) {
2006 Double_t e = fEsdCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2010 for (Int_t i=0; i<ncells; i++) {
2011 Double_t e = fAodCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2018 //________________________________________________________________________
2019 Double_t AliAnalysisTaskEMCALPi0PbPb::GetMaxCellEnergy(const AliVCluster *cluster, Short_t &id) const
2021 // Get maximum energy of attached cell.
2025 Int_t ncells = cluster->GetNCells();
2027 for (Int_t i=0; i<ncells; i++) {
2028 Double_t e = fEsdCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2031 id = cluster->GetCellAbsId(i);
2035 for (Int_t i=0; i<ncells; i++) {
2036 Double_t e = fAodCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
2039 id = cluster->GetCellAbsId(i);
2045 //________________________________________________________________________
2046 Double_t AliAnalysisTaskEMCALPi0PbPb::GetSecondMaxCellEnergy(AliVCluster *clus, Short_t &id) const
2048 // Get second maximum cell.
2050 AliVCaloCells *cells = fEsdCells;
2056 Double_t secondEmax=0, firstEmax=0;
2058 for(Int_t iCell=0;iCell<clus->GetNCells();iCell++){
2059 Int_t absId = clus->GetCellAbsId(iCell);
2060 cellen = cells->GetCellAmplitude(absId);
2061 if(cellen > firstEmax)
2064 for(Int_t iCell=0;iCell<clus->GetNCells();iCell++){
2065 Int_t absId = clus->GetCellAbsId(iCell);
2066 cellen = cells->GetCellAmplitude(absId);
2067 if(cellen < firstEmax && cellen > secondEmax) {
2068 secondEmax = cellen;
2075 //________________________________________________________________________
2076 void AliAnalysisTaskEMCALPi0PbPb::GetSigma(const AliVCluster *c, Double_t& sigmaMax, Double_t &sigmaMin) const
2078 // Calculate the (E) weighted variance along the longer (eigen) axis.
2080 sigmaMax = 0; // cluster variance along its longer axis
2081 sigmaMin = 0; // cluster variance along its shorter axis
2082 Double_t Ec = c->E(); // cluster energy
2085 Double_t Xc = 0 ; // cluster first moment along X
2086 Double_t Yc = 0 ; // cluster first moment along Y
2087 Double_t Sxx = 0 ; // cluster second central moment along X (variance_X^2)
2088 Double_t Sxy = 0 ; // cluster second central moment along Y (variance_Y^2)
2089 Double_t Syy = 0 ; // cluster covariance^2
2091 AliVCaloCells *cells = fEsdCells;
2098 Int_t ncells = c->GetNCells();
2102 for(Int_t j=0; j<ncells; ++j) {
2103 Int_t id = TMath::Abs(c->GetCellAbsId(j));
2104 Double_t cellen = cells->GetCellAmplitude(id);
2106 fGeom->GetGlobal(id,pos);
2107 Xc += cellen*pos.X();
2108 Yc += cellen*pos.Y();
2109 Sxx += cellen*pos.X()*pos.X();
2110 Syy += cellen*pos.Y()*pos.Y();
2111 Sxy += cellen*pos.X()*pos.Y();
2121 Sxx = TMath::Abs(Sxx);
2122 Syy = TMath::Abs(Syy);
2123 sigmaMax = (Sxx + Syy + TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
2124 sigmaMax = TMath::Sqrt(TMath::Abs(sigmaMax));
2125 sigmaMin = TMath::Abs(Sxx + Syy - TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
2126 sigmaMin = TMath::Sqrt(TMath::Abs(sigmaMin));
2129 //________________________________________________________________________
2130 void AliAnalysisTaskEMCALPi0PbPb::GetSigmaEtaEta(const AliVCluster *c, Double_t& sEtaEta, Double_t &sPhiPhi) const
2132 // Calculate the (E) weighted variance along the pseudorapidity.
2137 Double_t Ec = c->E(); // cluster energy
2141 const Int_t ncells = c->GetNCells();
2143 Double_t EtaC = 0; // cluster first moment along eta
2144 Double_t PhiC = 0; // cluster first moment along phi
2145 Double_t Setaeta = 0; // cluster second central moment along eta
2146 Double_t Sphiphi = 0; // cluster second central moment along phi
2147 Double_t w[ncells]; // weight max(0,4.5*log(E_i/Ec))
2151 AliVCaloCells *cells = fEsdCells;
2161 for(Int_t j=0; j<ncells; ++j) {
2162 id[j] = TMath::Abs(c->GetCellAbsId(j));
2163 Double_t cellen = cells->GetCellAmplitude(id[j]);
2164 w[j] = TMath::Max(0., 4.5+TMath::Log(cellen/Ec));
2166 fGeom->GetGlobal(id[j],pos);
2167 EtaC += w[j]*pos.Eta();
2168 PhiC += w[j]*pos.Phi();
2174 for(Int_t j=0; j<ncells; ++j) {
2176 fGeom->GetGlobal(id[j],pos);
2177 Setaeta = w[j]*(pos.Eta() - EtaC)*(pos.Eta() - EtaC);
2178 Sphiphi = w[j]*(pos.Phi() - PhiC)*(pos.Phi() - PhiC);
2181 sEtaEta = TMath::Sqrt(Setaeta);
2183 sPhiPhi = TMath::Sqrt(Sphiphi);
2186 //________________________________________________________________________
2187 Int_t AliAnalysisTaskEMCALPi0PbPb::GetNCells(const AliVCluster *c, Double_t emin) const
2189 // Calculate number of attached cells above emin.
2191 AliVCaloCells *cells = fEsdCells;
2198 Int_t ncells = c->GetNCells();
2199 for(Int_t j=0; j<ncells; ++j) {
2200 Int_t id = TMath::Abs(c->GetCellAbsId(j));
2201 Double_t cellen = cells->GetCellAmplitude(id);
2208 //________________________________________________________________________
2209 Int_t AliAnalysisTaskEMCALPi0PbPb::GetNCells(Int_t sm, Double_t emin) const
2211 // Calculate number of cells per SM above emin.
2213 AliVCaloCells *cells = fEsdCells;
2220 Int_t ncells = cells->GetNumberOfCells();
2221 for(Int_t j=0; j<ncells; ++j) {
2222 Int_t id = TMath::Abs(cells->GetCellNumber(j));
2223 Double_t cellen = cells->GetCellAmplitude(id);
2226 Int_t fsm = fGeom->GetSuperModuleNumber(id);
2234 //________________________________________________________________________
2235 Double_t AliAnalysisTaskEMCALPi0PbPb::GetTrackIsolation(Double_t cEta, Double_t cPhi, Double_t radius, Double_t pt) const
2237 // Compute isolation based on tracks.
2239 Double_t trkIsolation = 0;
2240 Double_t rad2 = radius*radius;
2241 Int_t ntrks = fSelPrimTracks->GetEntries();
2242 for(Int_t j = 0; j<ntrks; ++j) {
2243 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(j));
2248 Float_t eta = track->Eta();
2249 Float_t phi = track->Phi();
2250 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
2251 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
2254 trkIsolation += track->Pt();
2256 return trkIsolation;
2259 //________________________________________________________________________
2260 Double_t AliAnalysisTaskEMCALPi0PbPb::GetTrackIsoStrip(Double_t cEta, Double_t cPhi, Double_t dEta, Double_t dPhi, Double_t pt) const
2262 // Compute isolation based on tracks.
2264 Double_t trkIsolation = 0;
2265 Int_t ntrks = fSelPrimTracks->GetEntries();
2266 for(Int_t j = 0; j<ntrks; ++j) {
2267 AliVTrack *track = static_cast<AliVTrack*>(fSelPrimTracks->At(j));
2272 Float_t eta = track->Eta();
2273 Float_t phi = track->Phi();
2274 Double_t phidiff = TVector2::Phi_mpi_pi(phi-cPhi);
2275 Double_t etadiff = (eta-cEta);
2276 if(TMath::Abs(etadiff)>dEta || TMath::Abs(phidiff)>dPhi)
2278 trkIsolation += track->Pt();
2280 return trkIsolation;
2283 //________________________________________________________________________
2284 Bool_t AliAnalysisTaskEMCALPi0PbPb::IsShared(const AliVCluster *c) const
2286 // Returns if cluster shared across super modules.
2292 Int_t ncells = c->GetNCells();
2293 for(Int_t j=0; j<ncells; ++j) {
2294 Int_t id = TMath::Abs(c->GetCellAbsId(j));
2295 Int_t got = id / (24*48);
2306 //________________________________________________________________________
2307 Bool_t AliAnalysisTaskEMCALPi0PbPb::IsIdPartOfCluster(const AliVCluster *c, Short_t id) const
2309 // Returns if id is part of cluster.
2311 AliVCaloCells *cells = fEsdCells;
2317 Int_t ncells = c->GetNCells();
2318 for(Int_t j=0; j<ncells; ++j) {
2319 Int_t cid = TMath::Abs(c->GetCellAbsId(j));
2326 //________________________________________________________________________
2327 void AliAnalysisTaskEMCALPi0PbPb::PrintDaughters(const AliVParticle *p, const TObjArray *arr, Int_t level) const
2329 // Print recursively daughter information.
2334 const AliAODMCParticle *amc = dynamic_cast<const AliAODMCParticle*>(p);
2337 for (Int_t i=0; i<level; ++i) printf(" ");
2340 Int_t n = amc->GetNDaughters();
2341 for (Int_t i=0; i<n; ++i) {
2342 Int_t d = amc->GetDaughter(i);
2343 const AliVParticle *dmc = static_cast<const AliVParticle*>(arr->At(d));
2344 PrintDaughters(dmc,arr,level+1);
2348 //________________________________________________________________________
2349 void AliAnalysisTaskEMCALPi0PbPb::PrintDaughters(const AliMCParticle *p, const AliMCEvent *arr, Int_t level) const
2351 // Print recursively daughter information.
2356 for (Int_t i=0; i<level; ++i) printf(" ");
2357 Int_t d1 = p->GetFirstDaughter();
2358 Int_t d2 = p->GetLastDaughter();
2359 printf("pid=%d: %.2f %.2f %.2f (%.2f %.2f %.2f); nd=%d,%d\n",
2360 p->PdgCode(),p->Px(),p->Py(),p->Pz(),p->Xv(),p->Yv(),p->Zv(),d1,d2);
2365 for (Int_t i=d1;i<=d2;++i) {
2366 const AliMCParticle *dmc = static_cast<const AliMCParticle *>(arr->GetTrack(i));
2367 PrintDaughters(dmc,arr,level+1);
2371 //________________________________________________________________________
2372 void AliAnalysisTaskEMCALPi0PbPb::PrintTrackRefs(AliMCParticle *p) const
2374 // Print track ref array.
2379 Int_t n = p->GetNumberOfTrackReferences();
2380 for (Int_t i=0; i<n; ++i) {
2381 AliTrackReference *ref = p->GetTrackReference(i);
2384 ref->SetUserId(ref->DetectorId());
2389 //________________________________________________________________________
2390 void AliAnalysisTaskEMCALPi0PbPb::ProcessDaughters(AliVParticle *p, Int_t index, const TObjArray *arr)
2392 // Process and create daughters.
2397 AliAODMCParticle *amc = dynamic_cast<AliAODMCParticle*>(p);
2403 Int_t nparts = arr->GetEntries();
2404 Int_t nents = fMcParts->GetEntries();
2406 AliStaPart *newp = static_cast<AliStaPart*>(fMcParts->New(nents));
2407 newp->fPt = amc->Pt();
2408 newp->fEta = amc->Eta();
2409 newp->fPhi = amc->Phi();
2410 if (amc->Xv() != 0 || amc->Yv() != 0 || amc->Zv() != 0) {
2411 TVector3 vec(amc->Xv(),amc->Yv(),amc->Zv());
2412 newp->fVR = vec.Perp();
2413 newp->fVEta = vec.Eta();
2414 newp->fVPhi = vec.Phi();
2416 newp->fPid = amc->PdgCode();
2418 Int_t moi = amc->GetMother();
2419 if (moi>=0&&moi<nparts) {
2420 const AliAODMCParticle *mmc = static_cast<const AliAODMCParticle*>(arr->At(moi));
2421 moi = mmc->GetUniqueID();
2424 p->SetUniqueID(nents);
2426 // TODO: Determine which detector was hit
2429 Int_t n = amc->GetNDaughters();
2430 for (Int_t i=0; i<n; ++i) {
2431 Int_t d = amc->GetDaughter(i);
2432 if (d<=index || d>=nparts)
2434 AliVParticle *dmc = static_cast<AliVParticle*>(arr->At(d));
2435 ProcessDaughters(dmc,d,arr);
2439 //________________________________________________________________________
2440 void AliAnalysisTaskEMCALPi0PbPb::ProcessDaughters(AliMCParticle *p, Int_t index, const AliMCEvent *arr)
2442 // Process and create daughters.
2447 Int_t d1 = p->GetFirstDaughter();
2448 Int_t d2 = p->GetLastDaughter();
2450 printf("%d pid=%d: %.3f %.3f %.3f (%.2f %.2f %.2f); nd=%d,%d, mo=%d\n",
2451 index,p->PdgCode(),p->Px(),p->Py(),p->Pz(),p->Xv(),p->Yv(),p->Zv(),d1,d2, p->GetMother());
2454 Int_t nents = fMcParts->GetEntries();
2456 AliStaPart *newp = static_cast<AliStaPart*>(fMcParts->New(nents));
2457 newp->fPt = p->Pt();
2458 newp->fEta = p->Eta();
2459 newp->fPhi = p->Phi();
2460 if (p->Xv() != 0 || p->Yv() != 0 || p->Zv() != 0) {
2461 TVector3 vec(p->Xv(),p->Yv(),p->Zv());
2462 newp->fVR = vec.Perp();
2463 newp->fVEta = vec.Eta();
2464 newp->fVPhi = vec.Phi();
2466 newp->fPid = p->PdgCode();
2468 Int_t moi = p->GetMother();
2470 const AliMCParticle *mmc = static_cast<const AliMCParticle *>(arr->GetTrack(moi));
2471 moi = mmc->GetUniqueID();
2474 p->SetUniqueID(nents);
2476 Int_t nref = p->GetNumberOfTrackReferences();
2478 AliTrackReference *ref = p->GetTrackReference(nref-1);
2480 newp->fDet = ref->DetectorId();
2488 for (Int_t i=d1;i<=d2;++i) {
2489 AliMCParticle *dmc = static_cast<AliMCParticle *>(arr->GetTrack(i));
2492 ProcessDaughters(dmc,i,arr);
2496 //__________________________________________________________________________________________________
2497 void AliStaCluster::GetMom(TLorentzVector& p, Double_t *vertex)
2499 // Calculate momentum.
2502 pos.SetPtEtaPhi(fR,fEta,fPhi);
2504 if(vertex){ //calculate direction relative to vertex
2508 Double_t r = pos.Mag();
2509 p.SetPxPyPzE(fE*pos.x()/r, fE*pos.y()/r, fE*pos.z()/r, fE);
2512 //__________________________________________________________________________________________________
2513 void AliStaCluster::GetMom(TLorentzVector& p, AliStaVertex *vertex)
2515 // Calculate momentum.
2517 Double_t v[3] = {0,0,0};