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