Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:19:05

0001 // This is CSCRecHitDBuilder.cc
0002 
0003 #include <RecoLocalMuon/CSCRecHitD/src/CSCRecHitDBuilder.h>
0004 #include <RecoLocalMuon/CSCRecHitD/src/CSCHitFromStripOnly.h>
0005 #include <RecoLocalMuon/CSCRecHitD/src/CSCHitFromWireOnly.h>
0006 #include <RecoLocalMuon/CSCRecHitD/src/CSCMake2DRecHit.h>
0007 #include <RecoLocalMuon/CSCRecHitD/src/CSCWireHitCollection.h>
0008 #include <RecoLocalMuon/CSCRecHitD/src/CSCStripHitCollection.h>
0009 #include <RecoLocalMuon/CSCRecHitD/src/CSCRangeMapForRecHit.h>
0010 
0011 #include <Geometry/CSCGeometry/interface/CSCChamberSpecs.h>
0012 #include <Geometry/CSCGeometry/interface/CSCLayer.h>
0013 #include <Geometry/CSCGeometry/interface/CSCGeometry.h>
0014 #include <Geometry/CSCGeometry/interface/CSCLayerGeometry.h>
0015 
0016 #include <DataFormats/MuonDetId/interface/CSCDetId.h>
0017 
0018 #include <CondFormats/CSCObjects/interface/CSCDBGains.h>
0019 #include <CondFormats/DataRecord/interface/CSCDBGainsRcd.h>
0020 #include <CondFormats/CSCObjects/interface/CSCDBCrosstalk.h>
0021 #include <CondFormats/DataRecord/interface/CSCDBCrosstalkRcd.h>
0022 #include <CondFormats/CSCObjects/interface/CSCDBNoiseMatrix.h>
0023 #include <CondFormats/DataRecord/interface/CSCDBNoiseMatrixRcd.h>
0024 
0025 #include <FWCore/Utilities/interface/Exception.h>
0026 #include <FWCore/MessageLogger/interface/MessageLogger.h>
0027 
0028 #include <iostream>
0029 #include <cassert>
0030 
0031 CSCRecHitDBuilder::CSCRecHitDBuilder(const edm::ParameterSet& ps) : geom_(nullptr) {
0032   // Receives ParameterSet percolated down from EDProducer
0033 
0034   useCalib = ps.getParameter<bool>("CSCUseCalibrations");
0035   stripWireDeltaT = ps.getParameter<int>("CSCstripWireDeltaTime");
0036 
0037   hitsFromStripOnly_ = new CSCHitFromStripOnly(ps);
0038   hitsFromWireOnly_ = new CSCHitFromWireOnly(ps);
0039   make2DHits_ = new CSCMake2DRecHit(ps);
0040 }
0041 
0042 CSCRecHitDBuilder::~CSCRecHitDBuilder() {
0043   delete hitsFromStripOnly_;
0044   delete hitsFromWireOnly_;
0045   delete make2DHits_;
0046 }
0047 
0048 void CSCRecHitDBuilder::build(const CSCStripDigiCollection* stripdc,
0049                               const CSCWireDigiCollection* wiredc,
0050                               CSCRecHit2DCollection& oc) {
0051   LogTrace("CSCRecHitDBuilder") << "[CSCRecHitDBuilder] build entered";
0052 
0053   if (!geom_)
0054     throw cms::Exception("MissingGeometry") << "[CSCRecHitDBuilder::getLayer] Missing geometry" << std::endl;
0055 
0056   //  create 2-D hits by looking at superposition of strip and wire hit in a layer
0057   //
0058   // N.B.  I've sorted the hits from layer 1-6 always, so can test if there are "holes",
0059   // that is layers without hits for a given chamber.
0060 
0061   int layer_idx = 0;
0062   CSCDetId old_id;
0063 
0064   for (CSCStripDigiCollection::DigiRangeIterator it = stripdc->begin(); it != stripdc->end(); ++it) {
0065     const CSCDetId& id = (*it).first;
0066     const CSCLayer* layer = getLayer(id);
0067     const CSCStripDigiCollection::Range& rstripd = (*it).second;
0068 
0069     // Skip if no strip digis in this layer
0070     if (rstripd.second == rstripd.first)
0071       continue;
0072 
0073     const CSCDetId& sDetId = id;
0074 
0075     // This is used to test for gaps in layers and needs to be initialized here
0076     if (layer_idx == 0) {
0077       old_id = sDetId;
0078     }
0079 
0080     CSCDetId compId = sDetId;
0081     CSCWireDigiCollection::Range rwired = wiredc->get(sDetId);
0082     // Skip if no wire digis in this layer
0083     // But for ME11, real wire digis are labelled as belonging to ME1b, so that's where ME1a must look
0084     // (We try ME1a - above - anyway, because simulated wire digis are labelled as ME1a.)
0085     if (rwired.second == rwired.first) {
0086       if (sDetId.station() != 1 || sDetId.ring() != 4) {
0087         continue;  // not ME1a, skip to next layer
0088       }
0089       // So if ME1a has no wire digis (always the case for data) make the
0090       // wire digi ID point to ME1b. This is what is compared to the
0091       // strip digi ID below (and not used anywhere else).
0092       // Later, rechits use the strip digi ID for construction.
0093 
0094       // It is ME1a but no wire digis there, so try ME1b...
0095       int endcap = sDetId.endcap();
0096       int chamber = sDetId.chamber();
0097       int layer = sDetId.layer();
0098       CSCDetId idw(endcap, 1, 1, chamber, layer);  // Set idw to same layer in ME1b
0099       compId = idw;
0100       rwired = wiredc->get(compId);
0101     }
0102 
0103     // Fill bad channel bitsets for this layer
0104     recoConditions_->fillBadChannelWords(id);
0105 
0106     // Build strip hits for this layer
0107     std::vector<CSCStripHit> const& cscStripHit = hitsFromStripOnly_->runStrip(id, layer, rstripd);
0108 
0109     if (cscStripHit.empty())
0110       continue;
0111 
0112     // now build collection of wire only hits !
0113     std::vector<CSCWireHit> const& cscWireHit = hitsFromWireOnly_->runWire(compId, layer, rwired);
0114 
0115     // Build 2D hit for all possible strip-wire pairs
0116     // overlapping within this layer
0117 
0118     LogTrace("CSCRecHitBuilder") << "[CSCRecHitDBuilder] found " << cscStripHit.size() << " strip and "
0119                                  << cscWireHit.size() << " wire hits in layer " << sDetId;
0120 
0121     // Vector to store rechit within layer
0122     std::vector<CSCRecHit2D> hitsInLayer;
0123     unsigned int hits_in_layer = 0;
0124 
0125     for (auto const& s_hit : cscStripHit) {
0126       for (auto const& w_hit : cscWireHit) {
0127         CSCRecHit2D rechit = make2DHits_->hitFromStripAndWire(sDetId, layer, w_hit, s_hit);
0128         // Store rechit as a Local Point:
0129         LocalPoint rhitlocal = rechit.localPosition();
0130         float yreco = rhitlocal.y();
0131         bool isInFiducial = false;
0132         //in me1/1 chambers the strip cut region is at local y = 30 cm, +-5 cm area around it proved to be a suitabla region for omiting the check
0133         if ((sDetId.station() == 1) && (sDetId.ring() == 1 || sDetId.ring() == 4) && (fabs(yreco + 30.) < 5.)) {
0134           isInFiducial = true;
0135         } else {
0136           isInFiducial = make2DHits_->isHitInFiducial(layer, rechit);
0137         }
0138         if (isInFiducial) {
0139           hitsInLayer.push_back(rechit);
0140           hits_in_layer++;
0141         }
0142       }
0143     }
0144 
0145     LogTrace("CSCRecHitDBuilder") << "[CSCRecHitDBuilder] " << hits_in_layer << " rechits found in layer " << sDetId;
0146 
0147     // output vector of 2D rechits to collection
0148     if (hits_in_layer > 0) {
0149       oc.put(sDetId, hitsInLayer.begin(), hitsInLayer.end());
0150     }
0151     layer_idx++;
0152     old_id = sDetId;
0153   }
0154 
0155   LogTrace("CSCRecHitDBuilder") << "[CSCRecHitDBuilder] " << oc.size() << " 2d rechits created in this event.";
0156 }
0157 
0158 const CSCLayer* CSCRecHitDBuilder::getLayer(const CSCDetId& detId) { return geom_->layer(detId); }
0159 
0160 void CSCRecHitDBuilder::setConditions(CSCRecoConditions* reco) {
0161   recoConditions_ = reco;
0162   hitsFromStripOnly_->setConditions(reco);
0163   hitsFromWireOnly_->setConditions(reco);
0164   make2DHits_->setConditions(reco);
0165 }