2 // This class inspects the event
5 // - AliESDFMD object possibly corrected for sharing
8 // - A histogram of v_z of events with triggers.
9 // - A histogram of v_z of events with vertex and triggers
10 // - A histogram of trigger counters
12 // Note, that these are added to the master output list
17 #include "AliFMDEventInspector.h"
19 #include "AliESDEvent.h"
20 #include "AliMultiplicity.h"
21 #include "AliAnalysisManager.h"
22 #include "AliInputEventHandler.h"
23 #include "AliTriggerAnalysis.h"
24 #include "AliPhysicsSelection.h"
25 #include "AliAODForwardMult.h"
26 #include "AliForwardUtil.h"
27 #include "AliCentrality.h"
30 #include <TDirectory.h>
35 //====================================================================
36 AliFMDEventInspector::AliFMDEventInspector()
51 fCollisionSystem(kUnknown),
61 //____________________________________________________________________
62 AliFMDEventInspector::AliFMDEventInspector(const char* name)
63 : TNamed("fmdEventInspector", name),
77 fCollisionSystem(kUnknown),
86 // name Name of object
90 //____________________________________________________________________
91 AliFMDEventInspector::AliFMDEventInspector(const AliFMDEventInspector& o)
93 fHEventsTr(o.fHEventsTr),
94 fHEventsTrVtx(o.fHEventsTrVtx),
95 fHEventsAccepted(o.fHEventsAccepted),
96 fHTriggers(o.fHTriggers),
100 fHCentVsQual(o.fHCentVsQual),
101 fLowFluxCut(o.fLowFluxCut),
102 fMaxVzErr(o.fMaxVzErr),
106 fCollisionSystem(o.fCollisionSystem),
115 // o Object to copy from
119 //____________________________________________________________________
120 AliFMDEventInspector::~AliFMDEventInspector()
125 if (fList) delete fList;
127 //____________________________________________________________________
128 AliFMDEventInspector&
129 AliFMDEventInspector::operator=(const AliFMDEventInspector& o)
132 // Assignement operator
135 // o Object to assign from
138 // Reference to this object
140 TNamed::operator=(o);
141 fHEventsTr = o.fHEventsTr;
142 fHEventsTrVtx = o.fHEventsTrVtx;
143 fHEventsAccepted = o.fHEventsAccepted;
144 fHTriggers = o.fHTriggers;
148 fHCentVsQual = o.fHCentVsQual;
149 fLowFluxCut = o.fLowFluxCut;
150 fMaxVzErr = o.fMaxVzErr;
152 fList = (o.fList ? new TList : 0);
155 fCollisionSystem = o.fCollisionSystem;
156 fVtxAxis.Set(o.fVtxAxis.GetNbins(), o.fVtxAxis.GetXmin(),
157 o.fVtxAxis.GetXmax());
159 fList->SetName(GetName());
160 if (fHEventsTr) fList->Add(fHEventsTr);
161 if (fHEventsTrVtx) fList->Add(fHEventsTrVtx);
162 if (fHTriggers) fList->Add(fHTriggers);
163 if (fHType) fList->Add(fHType);
164 if (fHWords) fList->Add(fHWords);
165 if (fHCent) fList->Add(fHCent);
166 if (fHCentVsQual) fList->Add(fHCentVsQual);
171 //____________________________________________________________________
173 AliFMDEventInspector::FetchHistograms(const TList* d,
176 TH1I*& hTriggers) const
179 // Fetch our histograms from the passed list
183 // hEventsTr On return, pointer to histogram, or null
184 // hEventsTrVtx On return, pointer to histogram, or null
185 // hTriggers On return, pointer to histogram, or null
188 // true on success, false otherwise
193 TList* dd = dynamic_cast<TList*>(d->FindObject(GetName()));
194 if (!dd) return kFALSE;
196 hEventsTr = dynamic_cast<TH1I*>(dd->FindObject("nEventsTr"));
197 hEventsTrVtx = dynamic_cast<TH1I*>(dd->FindObject("nEventsTrVtx"));
198 hTriggers = dynamic_cast<TH1I*>(dd->FindObject("triggers"));
200 if (!hEventsTr || !hEventsTrVtx || !hTriggers) return kFALSE;
203 //____________________________________________________________________
205 AliFMDEventInspector::Init(const TAxis& vtxAxis)
208 // Initialize the object
211 // vtxAxis Vertex axis in use
214 // -1.5 -0.5 0.5 1.5 ... 89.5 ... 100.5
215 // ----- 92 number --------- ---- 1 ---
217 for (Int_t i = 0; i < 92; i++) limits[i] = -1.5 + i;
220 fVtxAxis.Set(vtxAxis.GetNbins(), vtxAxis.GetXmin(), vtxAxis.GetXmax());
222 fCentAxis = new TAxis(limits.GetSize()-1, limits.GetArray());
223 fHEventsTr = new TH1I("nEventsTr", "Number of events w/trigger",
224 4*vtxAxis.GetNbins(),
226 2*vtxAxis.GetXmax());
227 fHEventsTr->SetXTitle("v_{z} [cm]");
228 fHEventsTr->SetYTitle("# of events");
229 fHEventsTr->SetFillColor(kRed+1);
230 fHEventsTr->SetFillStyle(3001);
231 fHEventsTr->SetDirectory(0);
232 // fHEventsTr->Sumw2();
233 fList->Add(fHEventsTr);
235 fHEventsTrVtx = static_cast<TH1I*>(fHEventsTr->Clone("nEventsTrVtx"));
236 fHEventsTrVtx->SetTitle("Number of events w/trigger and vertex");
237 fHEventsTrVtx->SetFillColor(kBlue+1);
238 fHEventsTrVtx->SetDirectory(0);
239 // fHEventsTrVtx->Sumw2();
240 fList->Add(fHEventsTrVtx);
242 fHEventsAccepted = new TH1I("nEventsAccepted",
243 "Number of events w/trigger and vertex in range",
244 2*vtxAxis.GetNbins(),
246 2*vtxAxis.GetXmax());
247 fHEventsAccepted->SetXTitle("v_{z} [cm]");
248 fHEventsAccepted->SetYTitle("# of events");
249 fHEventsAccepted->SetFillColor(kGreen+1);
250 fHEventsAccepted->SetFillStyle(3001);
251 fHEventsAccepted->SetDirectory(0);
252 // fHEventsAccepted->Sumw2();
253 fList->Add(fHEventsAccepted);
256 fHTriggers = new TH1I("triggers", "Triggers", kOffline+1, 0, kOffline+1);
257 fHTriggers->SetFillColor(kRed+1);
258 fHTriggers->SetFillStyle(3001);
259 fHTriggers->SetStats(0);
260 fHTriggers->SetDirectory(0);
261 fHTriggers->GetXaxis()->SetBinLabel(kInel +1,"INEL");
262 fHTriggers->GetXaxis()->SetBinLabel(kInelGt0+1,"INEL>0");
263 fHTriggers->GetXaxis()->SetBinLabel(kNSD +1,"NSD");
264 fHTriggers->GetXaxis()->SetBinLabel(kEmpty +1,"Empty");
265 fHTriggers->GetXaxis()->SetBinLabel(kA +1,"A");
266 fHTriggers->GetXaxis()->SetBinLabel(kB +1,"B");
267 fHTriggers->GetXaxis()->SetBinLabel(kC +1,"C");
268 fHTriggers->GetXaxis()->SetBinLabel(kE +1,"E");
269 fHTriggers->GetXaxis()->SetBinLabel(kPileUp +1,"Pileup");
270 fHTriggers->GetXaxis()->SetBinLabel(kMCNSD +1,"NSD_{MC}");
271 fHTriggers->GetXaxis()->SetBinLabel(kOffline+1,"Offline");
272 fList->Add(fHTriggers);
274 fHType = new TH1I("type", Form("Event type (cut: SPD mult>%d)",
275 fLowFluxCut), 2, -.5, 1.5);
276 fHType->SetFillColor(kRed+1);
277 fHType->SetFillStyle(3001);
279 fHType->SetDirectory(0);
280 fHType->GetXaxis()->SetBinLabel(1,"Low-flux");
281 fHType->GetXaxis()->SetBinLabel(2,"High-flux");
285 fHWords = new TH1I("words", "Trigger words seen", 1, 0, 0);
286 fHWords->SetFillColor(kBlue+1);
287 fHWords->SetFillStyle(3001);
288 fHWords->SetStats(0);
289 fHWords->SetDirectory(0);
290 fHWords->SetBit(TH1::kCanRebin);
293 fHCent = new TH1F("cent", "Centrality", limits.GetSize()-1,limits.GetArray());
294 fHCent->SetFillColor(kBlue+1);
295 fHCent->SetFillStyle(3001);
297 fHCent->SetDirectory(0);
298 fHCent->SetXTitle("Centrality [%]");
299 fHCent->SetYTitle("Events");
302 fHCentVsQual = new TH2F("centVsQuality", "Quality vs Centrality",
303 5, 0, 5, limits.GetSize()-1, limits.GetArray());
304 fHCentVsQual->SetXTitle("Quality");
305 fHCentVsQual->SetYTitle("Centrality [%]");
306 fHCentVsQual->SetZTitle("Events");
307 fHCentVsQual->GetXaxis()->SetBinLabel(1, "OK");
308 fHCentVsQual->GetXaxis()->SetBinLabel(2, "Outside v_{z} cut");
309 fHCentVsQual->GetXaxis()->SetBinLabel(3, "V0 vs SPD outlier");
310 fHCentVsQual->GetXaxis()->SetBinLabel(4, "V0 vs TPC outlier");
311 fHCentVsQual->GetXaxis()->SetBinLabel(5, "V0 vs ZDC outlier");
312 fList->Add(fHCentVsQual);
315 //____________________________________________________________________
317 AliFMDEventInspector::StoreInformation()
319 // Write TNamed objects to output list containing information about
320 // the running conditions
323 TNamed* sys = new TNamed("sys", "");
324 TNamed* sNN = new TNamed("sNN", "");
325 TNamed* fld = new TNamed("field", "");
326 sys->SetTitle(AliForwardUtil::CollisionSystemString(fCollisionSystem));
327 sNN->SetTitle(AliForwardUtil::CenterOfMassEnergyString(fEnergy));
328 fld->SetTitle(AliForwardUtil::MagneticFieldString(fField));
329 sys->SetUniqueID(fCollisionSystem);
330 sNN->SetUniqueID(fEnergy);
331 fld->SetUniqueID(fField);
338 //____________________________________________________________________
340 AliFMDEventInspector::DefineOutput(TList* dir)
343 // Define the output histograms. These are put in a sub list of the
344 // passed list. The histograms are merged before the parent task calls
345 // AliAnalysisTaskSE::Terminate
347 // dir Directory to add to
350 fList->SetName(GetName());
354 //____________________________________________________________________
356 AliFMDEventInspector::Process(const AliESDEvent* event,
369 // triggers On return, the triggers fired
370 // lowFlux On return, true if the event is considered a low-flux
371 // event (according to the setting of fLowFluxCut)
372 // ivz On return, the found vertex bin (1-based). A zero
373 // means outside of the defined vertex range
374 // vz On return, the z position of the interaction
375 // cent On return, the centrality - if not available < 0
378 // 0 (or kOk) on success, otherwise a bit mask of error codes
381 // --- Check that we have an event ---------------------------------
383 AliWarning("No ESD event found for input event");
387 // --- Read trigger information from the ESD and store in AOD object
388 if (!ReadTriggers(event, triggers, nClusters)) {
390 AliWarning("Failed to read triggers from ESD"); }
394 // --- Check if this is a high-flux event --------------------------
395 const AliMultiplicity* testmult = event->GetMultiplicity();
398 AliWarning("No central multiplicity object found"); }
401 lowFlux = testmult->GetNumberOfTracklets() < fLowFluxCut;
403 fHType->Fill(lowFlux ? 0 : 1);
405 // --- Read centrality information
408 if (!ReadCentrality(event, cent, qual)) {
410 AliWarning("Failed to get centrality");
413 if (qual == 0) fHCentVsQual->Fill(0., cent);
415 for (UShort_t i = 0; i < 4; i++)
416 if (qual & (1 << i)) fHCentVsQual->Fill(Double_t(i+1), cent);
419 // --- Get the vertex information ----------------------------------
421 Bool_t vzOk = ReadVertex(event, vz);
423 fHEventsTr->Fill(vz);
426 AliWarning("Failed to read vertex from ESD"); }
429 fHEventsTrVtx->Fill(vz);
431 // --- Get the vertex bin ------------------------------------------
432 ivz = fVtxAxis.FindBin(vz);
433 if (ivz <= 0 || ivz > fVtxAxis.GetNbins()) {
435 AliWarning(Form("Vertex @ %f outside of range [%f,%f]",
436 vz, fVtxAxis.GetXmin(), fVtxAxis.GetXmax()));
441 fHEventsAccepted->Fill(vz);
443 // --- Check the FMD ESD data --------------------------------------
444 if (!event->GetFMDData()) {
446 AliWarning("No FMD data found in ESD"); }
454 //____________________________________________________________________
456 AliFMDEventInspector::ReadCentrality(const AliESDEvent* esd,
458 UShort_t& qual) const
461 // Read centrality from event
465 // cent On return, the centrality or negative if not found
468 // False on error, true otherwise
472 AliCentrality* centObj = const_cast<AliESDEvent*>(esd)->GetCentrality();
473 if (!centObj) return true;
475 // AliInfo(Form("Got centrality object %p with quality %d",
476 // centObj, centObj->GetQuality()));
478 cent = centObj->GetCentralityPercentile("V0M");
479 qual = centObj->GetQuality();
484 //____________________________________________________________________
486 AliFMDEventInspector::ReadTriggers(const AliESDEvent* esd, UInt_t& triggers,
490 // Read the trigger information from the ESD event
494 // triggers On return, contains the trigger bits
497 // @c true on success, @c false otherwise
501 // Get the analysis manager - should always be there
502 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
504 AliWarning("No analysis manager defined!");
508 // Get the input handler - should always be there
509 AliInputEventHandler* ih =
510 static_cast<AliInputEventHandler*>(am->GetInputEventHandler());
512 AliWarning("No input handler");
516 // Check if this is a collision candidate (MB)
517 // Note, that we should use the value cached in the input
518 // handler rather than calling IsCollisionCandiate directly
519 // on the AliPhysicsSelection obejct. If we called the latter
520 // then the AliPhysicsSelection object would overcount by a
522 Bool_t offline = ih->IsEventSelected();
525 triggers |= AliAODForwardMult::kOffline;
526 triggers |= AliAODForwardMult::kInel;
527 fHTriggers->Fill(kOffline+0.5);
529 // If this is inel, see if we have a tracklet
530 const AliMultiplicity* spdmult = esd->GetMultiplicity();
532 AliWarning("No SPD multiplicity");
535 // Check if we have one or more tracklets
536 // in the range -1 < eta < 1 to set the INEL>0
539 // Also count tracklets as a single cluster
540 Int_t n = spdmult->GetNumberOfTracklets();
541 for (Int_t j = 0; j < n; j++) {
542 if(TMath::Abs(spdmult->GetEta(j)) < 1) {
543 triggers |= AliAODForwardMult::kInelGt0;
547 n = spdmult->GetNumberOfSingleClusters();
548 for (Int_t j = 0; j < n; j++) {
549 Double_t eta = -TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.));
550 if (TMath::Abs(eta) < 1) nClusters++;
553 if (nClusters > 0) triggers |= AliAODForwardMult::kNClusterGt0;
556 // Analyse some trigger stuff
557 AliTriggerAnalysis ta;
558 if (ta.IsOfflineTriggerFired(esd, AliTriggerAnalysis::kNSD1))
559 triggers |= AliAODForwardMult::kNSD;
562 // Check for multiple vertices (pile-up) with at least 3
563 // contributors and at least 0.8cm from the primary vertex
564 Bool_t pileup = esd->IsPileupFromSPD(3,0.8);
566 triggers |= AliAODForwardMult::kPileUp;
567 fHTriggers->Fill(kPileUp+.5);
572 TString trigStr = esd->GetFiredTriggerClasses();
573 // AliWarning(Form("Fired trigger classes: %s", trigStr.Data()));
574 fHWords->Fill(trigStr.Data(), 1);
576 if (trigStr.Contains("MB1") || trigStr.Contains("MBBG3"))
577 triggers |= AliAOODForwardMult::kB;
578 if (trigStr.Contains("COTA"))
579 triggers |= AliAODForwardMult::kA;
580 if (trigStr.Contains("COTC"))
581 triggers |= AliAODForwardMult::kC;
583 if (trigStr.Contains("CBEAMB-ABCE-NOPF-ALL")) {
584 triggers |= AliAODForwardMult::kEmpty;
585 fHTriggers->Fill(kEmpty+.5);
588 // Check for B triggers
589 if (trigStr.Contains("CINT1B-ABCE-NOPF-ALL") || // Early pp
590 trigStr.Contains("CINT1-B-NOPF-ALLNOTRD") || // Late pp
591 trigStr.Contains("CINT1-B-NOPF-FASTNOTRD") || // Late pp
592 trigStr.Contains("CSMBB-ABCE-NOPF-ALL") || // pp
593 trigStr.Contains("CMBACS2-B-NOPF-ALL") || // PbPb
594 // trigStr.Contains("C0SMH-B-NOPF-ALL") || // PbPb - high mult
595 trigStr.Contains("CMBS2A-B-NOPF-ALL") || // PbPb
596 trigStr.Contains("CMBS2C-B-NOPF-ALL") || // PbPb
597 trigStr.Contains("CMBAC-B-NOPF-ALL") || // PbPb
598 // trigStr.Contains("C0SMH-B-NOPF-ALL") || // PbPb - high mult
599 trigStr.Contains("CMBACS2-B-NOPF-ALLNOTRD") // PbPb
600 // trigStr.Contains("C0SMH-B-NOPF-ALLNOTRD") // PbPb - high mult
602 triggers |= AliAODForwardMult::kB;
603 fHTriggers->Fill(kB+.5);
606 // Check for A triggers
607 if (trigStr.Contains("CINT1A-ABCE-NOPF-ALL") || // Early pp
608 trigStr.Contains("CINT1-AC_NOPF-ALLNOTRD") || // Late pp
609 trigStr.Contains("CINT1-AC_NOPF-FASTNOTRD")|| // Late pp
610 (trigStr.Contains("CSMBA-ABCE-NOPF-ALL") &&
611 !(triggers & AliAODForwardMult::kB)) || // pp
612 trigStr.Contains("CMBACS2-A-NOPF-ALL") || // PbPb
613 // trigStr.Contains("C0SMH-A-NOPF-ALL") || // PbPb - high mult
614 trigStr.Contains("CMBS2A-A-NOPF-ALL") || // PbPb
615 trigStr.Contains("CMBS2C-A-NOPF-ALL") || // PbPb
616 trigStr.Contains("CMBAC-A-NOPF-ALL") || // PbPb
617 // trigStr.Contains("C0SMH-A-NOPF-ALL") || // PbPb - high mult
618 trigStr.Contains("CMBACS2-A-NOPF-ALLNOTRD") // PbPb
619 // trigStr.Contains("C0SMH-A-NOPF-ALLNOTRD") // PbPb - high mult
621 triggers |= AliAODForwardMult::kA;
622 fHTriggers->Fill(kA+.5);
625 // Check for C triggers
626 if (trigStr.Contains("CINT1C-ABCE-NOPF-ALL") || // Early pp
627 (trigStr.Contains("CSMBC-ABCE-NOPF-ALL") &&
628 !(triggers & AliAODForwardMult::kB)) || // pp
629 trigStr.Contains("CMBACS2-C-NOPF-ALL") || // PbPb
630 // trigStr.Contains("C0SMH-B-NOPF-ALL") || // PbPb - high mult
631 trigStr.Contains("CMBS2A-C-NOPF-ALL") || // PbPb
632 trigStr.Contains("CMBS2C-C-NOPF-ALL") || // PbPb
633 trigStr.Contains("CMBAC-C-NOPF-ALL") || // PbPb
634 // trigStr.Contains("C0SMH-B-NOPF-ALL") || // PbPb - high mult
635 trigStr.Contains("CMBACS2-C-NOPF-ALLNOTRD") // PbPb
636 // trigStr.Contains("C0SMH-B-NOPF-ALLNOTRD") // PbPb - high mult
638 triggers |= AliAODForwardMult::kC;
639 fHTriggers->Fill(kC+.5);
642 // Check for E triggers
643 if (trigStr.Contains("CINT1-E-NOPF-ALL") || // Early pp
644 trigStr.Contains("CINT1-E-NOPF-ALLNOTRD") || // Late pp
645 trigStr.Contains("CINT1-E-NOPF-FASTNOTRD") || // Late pp
646 trigStr.Contains("CMBACS2-E-NOPF-ALL") || // PbPb
647 // trigStr.Contains("C0SMH-B-NOPF-ALL") || // PbPb - high mult
648 trigStr.Contains("CMBS2A-E-NOPF-ALL") || // PbPb
649 trigStr.Contains("CMBS2C-E-NOPF-ALL") || // PbPb
650 trigStr.Contains("CMBAC-E-NOPF-ALL") || // PbPb
651 // trigStr.Contains("C0SMH-B-NOPF-ALL") || // PbPb - high mult
652 trigStr.Contains("CMBACS2-E-NOPF-ALLNOTRD") // PbPb
653 // trigStr.Contains("C0SMH-B-NOPF-ALLNOTRD") // PbPb - high mult
655 triggers |= AliAODForwardMult::kE;
656 fHTriggers->Fill(kE+.5);
659 // Now check - if we have a collision - for offline triggers and
661 if (triggers & AliAODForwardMult::kB) {
662 if (triggers & AliAODForwardMult::kInel)
663 fHTriggers->Fill(kInel);
665 if (triggers & AliAODForwardMult::kInelGt0)
666 fHTriggers->Fill(kInelGt0+.5);
668 if (triggers & AliAODForwardMult::kNSD)
669 fHTriggers->Fill(kNSD+.5);
674 //____________________________________________________________________
676 AliFMDEventInspector::ReadVertex(const AliESDEvent* esd, Double_t& vz)
679 // Read the vertex information from the ESD event
683 // vz On return, the vertex Z position
686 // @c true on success, @c false otherwise
690 // This is the code used by the 1st physics people
691 const AliESDVertex* vertex = esd->GetPrimaryVertex();
692 if (!vertex || !vertex->GetStatus()) {
694 AliWarning(Form("No primary vertex (%p) or bad status %d",
695 vertex, (vertex ? vertex->GetStatus() : -1)));
699 const AliESDVertex* vertexSPD = esd->GetPrimaryVertexSPD();
700 if (!vertexSPD || !vertexSPD->GetStatus()) {
702 AliWarning(Form("No primary SPD vertex (%p) or bad status %d",
703 vertexSPD, (vertexSPD ? vertexSPD->GetStatus() : -1)));
708 // if vertex is from SPD vertexZ, require more stringent cuts
709 if (vertex->IsFromVertexerZ()) {
710 if (vertex->GetDispersion() > fMaxVzErr ||
711 vertex->GetZRes() > 1.25 * fMaxVzErr) {
713 AliWarning(Form("Dispersion %f > %f or resolution %f > %f",
714 vertex->GetDispersion(), fMaxVzErr,
715 vertex->GetZRes(), 1.25 * fMaxVzErr));
724 const AliESDVertex* vertex = esd->GetPrimaryVertexSPD();
727 AliWarning("No SPD vertex found in ESD"); }
731 // Check that enough tracklets contributed
732 if(vertex->GetNContributors() <= 0) {
734 AliWarning(Form("Number of contributors to vertex is %d<=0",
735 vertex->GetNContributors())); }
739 // Check that the uncertainty isn't too large
740 if (vertex->GetZRes() > fMaxVzErr) {
742 AliWarning(Form("Uncertaintity in Z of vertex is too large %f > %f",
743 vertex->GetZRes(), fMaxVzErr)); }
747 // Get the z coordiante
753 //____________________________________________________________________
755 AliFMDEventInspector::ReadRunDetails(const AliESDEvent* esd)
758 // Read the collision system, collision energy, and L3 field setting
762 // esd ESD to get information from
765 // true on success, false
767 // AliInfo(Form("Parameters from 1st ESD event: cms=%s, sNN=%f, field=%f",
768 // esd->GetBeamType(), 2*esd->GetBeamEnergy(),
769 // esd->GetMagneticField()));
771 AliForwardUtil::ParseCollisionSystem(esd->GetBeamType());
773 AliForwardUtil::ParseCenterOfMassEnergy(fCollisionSystem,
774 2 * esd->GetBeamEnergy());
776 AliForwardUtil::ParseMagneticField(esd->GetMagneticField());
779 if (fCollisionSystem == AliForwardUtil::kUnknown ||
781 TMath::Abs(fField) > 10)
787 //____________________________________________________________________
789 AliFMDEventInspector::Print(Option_t*) const
796 char ind[gROOT->GetDirLevel()+1];
797 for (Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] = ' ';
798 ind[gROOT->GetDirLevel()] = '\0';
799 TString sNN(AliForwardUtil::CenterOfMassEnergyString(fEnergy));
800 sNN.Strip(TString::kBoth, '0');
801 sNN.ReplaceAll("GeV", " GeV");
802 TString field(AliForwardUtil::MagneticFieldString(fField));
803 field.ReplaceAll("p", "+");
804 field.ReplaceAll("m", "-");
805 field.ReplaceAll("kG", " kG");
807 std::cout << ind << ClassName() << ": " << GetName() << '\n'
808 << ind << " Vertex bins: " << fVtxAxis.GetNbins() << '\n'
809 << ind << " Vertex range: [" << fVtxAxis.GetXmin()
810 << "," << fVtxAxis.GetXmax() << "]\n"
811 << ind << " Low flux cut: " << fLowFluxCut << '\n'
812 << ind << " Max(delta v_z): " << fMaxVzErr << " cm\n"
813 << ind << " System: "
814 << AliForwardUtil::CollisionSystemString(fCollisionSystem) << '\n'
815 << ind << " CMS energy per nucleon: " << sNN << '\n'
816 << ind << " Field: " << field << '\n';
817 if (!fCentAxis) { std::cout << std::flush; return; }
818 Int_t nBin = fCentAxis->GetNbins();
819 std::cout << ind << " Centrality axis: " << nBin << " bins"
821 for (Int_t i = 0; i < nBin; i++) {
822 if ((i % 10) == 0) std::cout << '\n' << ind << " ";
823 std::cout << std::setw(5) << fCentAxis->GetBinLowEdge(i+1) << '-';
825 std::cout << std::setw(5) << fCentAxis->GetBinUpEdge(nBin) << std::endl;