// Gaudi #include "GaudiUtils/HistoLabels.h" // Tb/TbEvent #include "Event/TbHit.h" // Tb/TbKernel #include "TbKernel/TbConstants.h" #include "TbKernel/TbModule.h" // Local #include "TbHitMonitor.h" using namespace Gaudi::Utils::Histos; DECLARE_ALGORITHM_FACTORY(TbHitMonitor) //============================================================================= // Standard constructor //============================================================================= TbHitMonitor::TbHitMonitor(const std::string& name, ISvcLocator* pSvcLocator) : TbAlgorithm(name, pSvcLocator), m_parToT("", 0.5, 1024.5, 1024), m_parCharge("", 0., 20000., 200), m_parHitsInEvent("", 0., 10000., 100), m_parDeltaT("", 0., 100., 200), m_nEvents(0) { declareProperty("HitLocation", m_hitLocation = LHCb::TbHitLocation::Default); declareProperty("ParametersToT", m_parToT); declareProperty("ParametersCharge", m_parCharge); declareProperty("ParametersHitsInEvent", m_parHitsInEvent); declareProperty("ParametersDeltaT", m_parDeltaT); } //============================================================================= // Destructor //============================================================================= TbHitMonitor::~TbHitMonitor() {} //============================================================================= // Initialisation //============================================================================= StatusCode TbHitMonitor::initialize() { // Initialise the base class. StatusCode sc = TbAlgorithm::initialize(); if (sc.isFailure()) return sc; // Setup the histograms. for (unsigned int i = 0; i < m_nPlanes; ++i) { const std::string plane = std::to_string(i); const std::string title = geomSvc()->modules().at(i)->id(); const unsigned int nRows = Tb::NRows; const unsigned int nCols = geomSvc()->modules().at(i)->cols(); std::string name = "HitMap/Plane" + plane; m_hHitMap.push_back(book2D(name, title, -0.5, nCols - 0.5, nCols, -0.5, nRows - 0.5, nRows)); setAxisLabels(m_hHitMap[i], "column", "row"); int bins = m_parToT.bins(); double low = m_parToT.lowEdge(); double high = m_parToT.highEdge(); name = "ToT/Plane" + plane; m_hToT.push_back(book1D(name, title, low, high, bins)); setAxisLabels(m_hToT[i], "ToT", "entries"); bins = m_parCharge.bins(); low = m_parCharge.lowEdge(); high = m_parCharge.highEdge(); name = "Charge/Plane" + plane; m_hCharge.push_back(book1D(name, title, low, high, bins)); setAxisLabels(m_hCharge[i], "charge [electrons]", "entries"); name = "ToTvsCol/Plane" + plane; m_hToTvsCol.push_back(bookProfile1D(name, title, -0.5, nCols - 0.5, nCols)); setAxisLabels(m_hToTvsCol[i], "column", "ToT"); name = "ChargevsCol/Plane" + plane; m_hChargevsCol.push_back(bookProfile1D(name, title, -0.5, nCols - 0.5, nCols)); setAxisLabels(m_hChargevsCol[i], "column", "charge [electrons]"); bins = m_parHitsInEvent.bins(); low = m_parHitsInEvent.lowEdge(); high = m_parHitsInEvent.highEdge(); name = "HitsInEvent/Plane" + plane; m_hHitsInEvent.push_back(book1D(name, title, low, high, bins)); setAxisLabels(m_hHitsInEvent[i], "number of hits", "events"); name = "HitsInEventTrend/Plane" + plane; m_hHitsInEventTrend.push_back(book1D(name, title, -0.5, 999.5, 1000)); setAxisLabels(m_hHitsInEventTrend[i], "event", "number of hits"); bins = m_parDeltaT.bins(); low = m_parDeltaT.lowEdge(); high = m_parDeltaT.highEdge(); name = "TimeBetweenHits/Plane" + plane; m_hTimeBetweenHits.push_back(book1D(name, title, low, high, bins)); setAxisLabels(m_hTimeBetweenHits[i], "#Deltat [ns]", "entries"); } return StatusCode::SUCCESS; } //============================================================================= // Main execution //============================================================================= StatusCode TbHitMonitor::execute() { for (unsigned int i = 0; i < m_nPlanes; ++i) { // Grab the hits. const std::string hitLocation = m_hitLocation + std::to_string(i); const LHCb::TbHits* hits = getIfExists<LHCb::TbHits>(hitLocation); if (!hits) continue; m_hHitsInEvent[i]->fill(hits->size()); m_hHitsInEventTrend[i]->fill(m_nEvents, hits->size()); if (hits->empty()) continue; double tprev = 0.; LHCb::TbHits::const_iterator begin = hits->begin(); LHCb::TbHits::const_iterator end = hits->end(); for (LHCb::TbHits::const_iterator ith = begin; ith != end; ++ith) { const LHCb::TbHit* hit = *ith; m_hToT[i]->fill(hit->ToT()); m_hCharge[i]->fill(hit->charge()); m_hToTvsCol[i]->fill(hit->scol(), hit->ToT()); m_hChargevsCol[i]->fill(hit->scol(), hit->charge()); m_hHitMap[i]->fill(hit->scol(), hit->row()); const double t = hit->htime(); if (ith != begin) m_hTimeBetweenHits[i]->fill(t - tprev); tprev = t; } } ++m_nEvents; return StatusCode::SUCCESS; }