Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:25:58

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