File indexing completed on 2024-04-06 12:25:58
0001
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
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
0056
0057
0058
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
0069 if (rstripd.second == rstripd.first)
0070 continue;
0071
0072 const CSCDetId& sDetId = id;
0073
0074
0075 if (layer_idx == 0) {
0076 old_id = sDetId;
0077 }
0078
0079 CSCDetId compId = sDetId;
0080 CSCWireDigiCollection::Range rwired = wiredc->get(sDetId);
0081
0082
0083
0084 if (rwired.second == rwired.first) {
0085 if (sDetId.station() != 1 || sDetId.ring() != 4) {
0086 continue;
0087 }
0088
0089
0090
0091
0092
0093
0094 int endcap = sDetId.endcap();
0095 int chamber = sDetId.chamber();
0096 int layer = sDetId.layer();
0097 CSCDetId idw(endcap, 1, 1, chamber, layer);
0098 compId = idw;
0099 rwired = wiredc->get(compId);
0100 }
0101
0102
0103 recoConditions_->fillBadChannelWords(id);
0104
0105
0106 std::vector<CSCStripHit> const& cscStripHit = hitsFromStripOnly_->runStrip(id, layer, rstripd);
0107
0108 if (cscStripHit.empty())
0109 continue;
0110
0111
0112 std::vector<CSCWireHit> const& cscWireHit = hitsFromWireOnly_->runWire(compId, layer, rwired);
0113
0114
0115
0116
0117 LogTrace("CSCRecHitBuilder") << "[CSCRecHitDBuilder] found " << cscStripHit.size() << " strip and "
0118 << cscWireHit.size() << " wire hits in layer " << sDetId;
0119
0120
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
0128 LocalPoint rhitlocal = rechit.localPosition();
0129 float yreco = rhitlocal.y();
0130 bool isInFiducial = false;
0131
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
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 }