Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:11

0001 /** \file GEMCSCSegmentProducer.cc
0002  *
0003  */
0004 
0005 #include <RecoLocalMuon/GEMCSCSegment/plugins/GEMCSCSegmentProducer.h>
0006 #include <RecoLocalMuon/GEMCSCSegment/plugins/GEMCSCSegmentBuilder.h>
0007 
0008 #include <DataFormats/Common/interface/Handle.h>
0009 #include <FWCore/Framework/interface/ESHandle.h>
0010 #include <FWCore/MessageLogger/interface/MessageLogger.h>
0011 
0012 #include <DataFormats/GEMRecHit/interface/GEMRecHitCollection.h>
0013 #include <DataFormats/GEMRecHit/interface/GEMCSCSegmentCollection.h>
0014 #include <DataFormats/GEMRecHit/interface/GEMCSCSegment.h>
0015 
0016 #include <DataFormats/CSCRecHit/interface/CSCRecHit2DCollection.h>
0017 #include <DataFormats/CSCRecHit/interface/CSCSegmentCollection.h>
0018 #include <DataFormats/CSCRecHit/interface/CSCSegment.h>
0019 
0020 GEMCSCSegmentProducer::GEMCSCSegmentProducer(const edm::ParameterSet& pas)
0021     : kCSCGeometryToken_(esConsumes<CSCGeometry, MuonGeometryRecord>()),
0022       kGEMGeometryToken_(esConsumes<GEMGeometry, MuonGeometryRecord>()),
0023       kCSCSegmentCollectionToken_(consumes<CSCSegmentCollection>(pas.getParameter<edm::InputTag>("inputObjectsCSC"))),
0024       kGEMRecHitCollectionToken_(consumes<GEMRecHitCollection>(pas.getParameter<edm::InputTag>("inputObjectsGEM"))),
0025       iev(0) {
0026   segmentBuilder_ = new GEMCSCSegmentBuilder(pas);  // pass on the parameterset
0027 
0028   // register what this produces
0029   produces<GEMCSCSegmentCollection>();
0030 }
0031 
0032 GEMCSCSegmentProducer::~GEMCSCSegmentProducer() {
0033   LogDebug("GEMCSCSegment") << "deleting GEMCSCSegmentBuilder after " << iev << " events w/ gem and csc data.";
0034   delete segmentBuilder_;
0035 }
0036 
0037 void GEMCSCSegmentProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0038   // gemcscSegments
0039   edm::ParameterSetDescription desc;
0040   desc.add<edm::InputTag>("inputObjectsGEM", edm::InputTag("gemRecHits"));
0041   desc.add<edm::InputTag>("inputObjectsCSC", edm::InputTag("cscSegments"));
0042   desc.add<bool>("enableME21GE21", false);
0043   desc.add<std::string>("algo_name", "GEMCSCSegAlgoRR");
0044   {
0045     edm::ParameterSetDescription psd0;
0046     psd0.addUntracked<bool>("GEMCSCDebug", true);
0047     psd0.add<unsigned int>("minHitsPerSegment", 2);
0048     psd0.add<bool>("preClustering", true);
0049     psd0.add<double>("dXclusBoxMax", 1.0);
0050     psd0.add<double>("dYclusBoxMax", 5.0);
0051     psd0.add<bool>("preClusteringUseChaining", true);
0052     psd0.add<double>("dPhiChainBoxMax", 1.0);
0053     psd0.add<double>("dThetaChainBoxMax", 0.02);
0054     psd0.add<double>("dRChainBoxMax", 0.5);
0055     psd0.add<int>("maxRecHitsInCluster", 6);
0056     desc.add<edm::ParameterSetDescription>("algo_psets", psd0);
0057   }
0058   descriptions.add("gemcscSegments", desc);
0059 }
0060 
0061 void GEMCSCSegmentProducer::produce(edm::Event& ev, const edm::EventSetup& setup) {
0062   LogDebug("GEMCSCSegment") << "start producing segments for " << ++iev << "th event w/ gem and csc data";
0063 
0064   // find the geometry (& conditions?) for this event & cache it in the builder
0065   const auto cscg = setup.getHandle(kCSCGeometryToken_);
0066   if (not cscg.isValid()) {
0067     edm::LogError("GEMCSCSegment") << "invalid CSCGeometry";
0068     return;
0069   }
0070   const CSCGeometry* cgeom = &*cscg;
0071 
0072   const auto gemg = setup.getHandle(kGEMGeometryToken_);
0073   if (not gemg.isValid()) {
0074     edm::LogError("GEMCSCSegment") << "invalid GEMGeometry";
0075     return;
0076   }
0077   const GEMGeometry* ggeom = &*gemg;
0078 
0079   // cache the geometry in the builder
0080   segmentBuilder_->setGeometry(ggeom, cgeom);
0081 
0082   // fill the map with matches between GEM and CSC chambers
0083   segmentBuilder_->LinkGEMRollsToCSCChamberIndex(ggeom, cgeom);
0084 
0085   // get the collection of CSCSegment and GEMRecHits
0086   const auto cscSegment = ev.getHandle(kCSCSegmentCollectionToken_);
0087   if (not cscSegment.isValid()) {
0088     edm::LogError("GEMCSCSegment") << "invalid CSCSegmentCollection";
0089     return;
0090   }
0091 
0092   const auto gemRecHits = ev.getHandle(kGEMRecHitCollectionToken_);
0093   if (not gemRecHits.isValid()) {
0094     edm::LogError("GEMCSCSegment") << "invalid GEMRecHitCollection";
0095     return;
0096   }
0097 
0098   // create empty collection of GEMCSC Segments
0099   auto oc = std::make_unique<GEMCSCSegmentCollection>();
0100 
0101   // pass the empty collection of GEMCSC Segments and fill it
0102   segmentBuilder_->build(gemRecHits.product(), cscSegment.product(), *oc);  //@@ FILL oc
0103 
0104   // put the filled collection in event
0105   ev.put(std::move(oc));
0106 }