Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-06-03 00:12:13

0001 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0002 #include "FWCore/Framework/interface/Run.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/Framework/interface/EventSetup.h"
0005 #include "FWCore/Framework/interface/MakerMacros.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0007 #include "FWCore/ServiceRegistry/interface/Service.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/Utilities/interface/EDGetToken.h"
0010 #include "FWCore/Utilities/interface/InputTag.h"
0011 #include "FWCore/Utilities/interface/Exception.h"
0012 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0013 #include "DataFormats/Common/interface/Handle.h"
0014 
0015 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0016 
0017 #include <TProfile.h>
0018 #include <TH1F.h>
0019 
0020 #include <vector>
0021 #include <deque>
0022 
0023 namespace trackerDTC {
0024 
0025   /*! \class  trackerDTC::AnalyzerDAQ
0026    *  \brief  Class to analyze TTCluster Occupancies on DTCs, plots cluster occupancy
0027    *  \author Thomas Schuh
0028    *  \date   2020, Oct
0029    */
0030   class AnalyzerDAQ : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
0031   public:
0032     AnalyzerDAQ(const edm::ParameterSet& iConfig);
0033     void beginRun(const edm::Run& iEvent, const edm::EventSetup& iSetup) override;
0034     void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0035     void endRun(const edm::Run& iEvent, const edm::EventSetup& iSetup) override {}
0036     void endJob() override {}
0037 
0038   private:
0039     // ED input token of accepted TTClusters
0040     edm::EDGetTokenT<TTClusterDetSetVec> edGetToken_;
0041     // Setup token
0042     edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0043 
0044     // Histograms
0045 
0046     TProfile* profModules_;
0047     TH1F* hisModules_;
0048     TProfile* profDTCs_;
0049     TH1F* hisDTCs_;
0050     TH1F* hisTracker_;
0051   };
0052 
0053   AnalyzerDAQ::AnalyzerDAQ(const edm::ParameterSet& iConfig) {
0054     usesResource("TFileService");
0055     // book input ED products
0056     const auto& inputTag = iConfig.getParameter<edm::InputTag>("InputTagTTClusterDetSetVec");
0057     edGetToken_ = consumes<TTClusterDetSetVec>(inputTag);
0058     // book ES products
0059     esGetTokenSetup_ = esConsumes<edm::Transition::BeginRun>();
0060   }
0061 
0062   void AnalyzerDAQ::beginRun(const edm::Run& iEvent, const edm::EventSetup& iSetup) {
0063     // helper class to store configurations
0064     const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0065     // book histograms
0066     edm::Service<TFileService> fs;
0067     TFileDirectory dir;
0068     dir = fs->mkdir("Modules");
0069     int maxOcc = 150;
0070     int numChannels = setup->numDTCs() * setup->numModulesPerDTC();
0071     hisModules_ = dir.make<TH1F>("His Module Occupancy", ";", maxOcc, -.5, maxOcc - .5);
0072     profModules_ = dir.make<TProfile>("Prof Module Occupancy", ";", numChannels, -.5, numChannels - .5);
0073     dir = fs->mkdir("DTCs");
0074     maxOcc = 3456;
0075     numChannels = setup->numDTCs();
0076     hisDTCs_ = dir.make<TH1F>("His DTC Occupancy", ";", maxOcc / 16, -.5, maxOcc - .5);
0077     profDTCs_ = dir.make<TProfile>("Prof DTC Occupancy", ";", numChannels, -.5, numChannels - .5);
0078     dir = fs->mkdir("Tracker");
0079     maxOcc = pow(2, 29);
0080     hisTracker_ = dir.make<TH1F>("His Tracker Occupancy", ";", maxOcc * pow(2., -12), -.5, maxOcc - .5);
0081   }
0082 
0083   void AnalyzerDAQ::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0084     const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0085     // read in original TTCluster collection
0086     edm::Handle<TTClusterDetSetVec> handle;
0087     iEvent.getByToken<TTClusterDetSetVec>(edGetToken_, handle);
0088     // apply cabling map, reorganise cluster collections
0089     std::vector<std::vector<std::deque<TTClusterRef>>> dtcs(
0090         setup->numDTCs(), std::vector<std::deque<TTClusterRef>>(setup->numModulesPerDTC()));
0091     for (auto itModule = handle->begin(); itModule != handle->end(); itModule++) {
0092       // DetSetVec->detId - 1 or + 0 = tk layout det id depending from which of both sensor planes the cluster has been constructed
0093       const DetId& detIdModule = itModule->detId();
0094       const int offset = setup->trackerTopology()->isLower(detIdModule) ? 0 : setup->offsetDetIdTP();
0095       const DetId detId = detIdModule + offset;
0096       // corresponding sensor module
0097       tt::SensorModule* sm = setup->sensorModule(detId);
0098       // empty cluster collection
0099       std::deque<TTClusterRef>& module = dtcs[sm->dtcId()][sm->modId()];
0100       for (TTClusterDetSet::const_iterator itCluster = itModule->begin(); itCluster != itModule->end(); itCluster++)
0101         module.emplace_back(makeRefTo(handle, itCluster));
0102     }
0103     // analyze organized TTCluster collections
0104     int iDTC(0);
0105     int iModule(0);
0106     int nAll(0);
0107     for (const std::vector<std::deque<TTClusterRef>>& dtc : dtcs) {
0108       int nCluster(0);
0109       for (const std::deque<TTClusterRef>& module : dtc) {
0110         nCluster += module.size();
0111         hisModules_->Fill(module.size());
0112         profModules_->Fill(iModule++, module.size());
0113       }
0114       nAll += nCluster;
0115       hisDTCs_->Fill(nCluster);
0116       profDTCs_->Fill(iDTC++, nCluster);
0117     }
0118     hisTracker_->Fill(nAll);
0119   }
0120 
0121 }  // namespace trackerDTC
0122 
0123 DEFINE_FWK_MODULE(trackerDTC::AnalyzerDAQ);