Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:21:40

0001 /****************************************************************************
0002  *
0003  * This is a part of TOTEM offline software.
0004  * Authors:
0005  *   Laurent Forthomme (laurent.forthomme@cern.ch)
0006  *
0007  ****************************************************************************/
0008 
0009 #include <memory>
0010 
0011 #include "FWCore/Framework/interface/Frameworkfwd.h"
0012 #include "FWCore/Framework/interface/stream/EDProducer.h"
0013 #include "FWCore/Framework/interface/Event.h"
0014 #include "FWCore/Framework/interface/MakerMacros.h"
0015 #include "FWCore/Framework/interface/ESWatcher.h"
0016 
0017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0018 #include "FWCore/Utilities/interface/StreamID.h"
0019 
0020 #include "DataFormats/Common/interface/DetSet.h"
0021 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0022 
0023 #include "DataFormats/CTPPSDetId/interface/TotemT2DetId.h"
0024 #include "DataFormats/TotemReco/interface/TotemT2Digi.h"
0025 #include "DataFormats/TotemReco/interface/TotemT2RecHit.h"
0026 
0027 #include "RecoPPS/Local/interface/TotemT2RecHitProducerAlgorithm.h"
0028 
0029 #include "Geometry/Records/interface/TotemGeometryRcd.h"
0030 #include "Geometry/CommonTopologies/interface/TrapezoidalStripTopology.h"
0031 #include "CondFormats/DataRecord/interface/PPSTimingCalibrationRcd.h"
0032 #include "CondFormats/DataRecord/interface/PPSTimingCalibrationLUTRcd.h"
0033 
0034 class TotemT2RecHitProducer : public edm::stream::EDProducer<> {
0035 public:
0036   explicit TotemT2RecHitProducer(const edm::ParameterSet&);
0037 
0038   static void fillDescriptions(edm::ConfigurationDescriptions&);
0039 
0040 private:
0041   void produce(edm::Event&, const edm::EventSetup&) override;
0042 
0043   edm::EDGetTokenT<edmNew::DetSetVector<TotemT2Digi> > digiToken_;
0044   edm::ESGetToken<PPSTimingCalibration, PPSTimingCalibrationRcd> timingCalibrationToken_;
0045   edm::ESGetToken<PPSTimingCalibrationLUT, PPSTimingCalibrationLUTRcd> timingCalibrationLUTToken_;
0046   edm::ESGetToken<TotemGeometry, TotemGeometryRcd> geometryToken_;
0047   /// A watcher to detect timing calibration changes.
0048   edm::ESWatcher<PPSTimingCalibrationRcd> calibWatcher_;
0049 
0050   const bool applyCalib_;
0051   TotemT2RecHitProducerAlgorithm algo_;
0052 };
0053 
0054 TotemT2RecHitProducer::TotemT2RecHitProducer(const edm::ParameterSet& iConfig)
0055     : digiToken_(consumes<edmNew::DetSetVector<TotemT2Digi> >(iConfig.getParameter<edm::InputTag>("digiTag"))),
0056       geometryToken_(esConsumes<TotemGeometry, TotemGeometryRcd>()),
0057       applyCalib_(iConfig.getParameter<bool>("applyCalibration")),
0058       algo_(iConfig) {
0059   if (applyCalib_)
0060     timingCalibrationToken_ = esConsumes<PPSTimingCalibration, PPSTimingCalibrationRcd>(
0061         edm::ESInputTag(iConfig.getParameter<std::string>("timingCalibrationTag")));
0062   produces<edmNew::DetSetVector<TotemT2RecHit> >();
0063 }
0064 
0065 void TotemT2RecHitProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0066   auto pOut = std::make_unique<edmNew::DetSetVector<TotemT2RecHit> >();
0067 
0068   // get the digi collection
0069   const auto& digis = iEvent.get(digiToken_);
0070 
0071   if (!digis.empty()) {
0072     if (applyCalib_ && calibWatcher_.check(iSetup))
0073       algo_.setCalibration(iSetup.getData(timingCalibrationToken_), iSetup.getData(timingCalibrationLUTToken_));
0074 
0075     // produce the rechits collection
0076     algo_.build(iSetup.getData(geometryToken_), digis, *pOut);
0077   }
0078 
0079   iEvent.put(std::move(pOut));
0080 }
0081 
0082 void TotemT2RecHitProducer::fillDescriptions(edm::ConfigurationDescriptions& descr) {
0083   edm::ParameterSetDescription desc;
0084 
0085   desc.add<edm::InputTag>("digiTag", edm::InputTag("totemT2Digis", "TotemT2"))
0086       ->setComment("input digis collection to retrieve");
0087   desc.add<std::string>("timingCalibrationTag", "GlobalTag:TotemT2TimingCalibration")
0088       ->setComment("input tag for timing calibrations retrieval");
0089   desc.add<double>("timeSliceNs", 25.0 / 1024.0)
0090       ->setComment("conversion constant between timing bin size and nanoseconds");
0091   desc.add<bool>("applyCalibration", false)->setComment("switch on/off the timing calibration");
0092 
0093   descr.add("totemT2RecHits", desc);
0094 }
0095 
0096 DEFINE_FWK_MODULE(TotemT2RecHitProducer);