00001
00002
00003
00004
00005
00006 #include <vector>
00007 #include <algorithm>
00008 #include <ext/algorithm>
00009 #include <iostream>
00010
00011 #include "RecoLocalTracker/SiStripRecHitConverter/interface/SiStripRecHitConverterAlgorithm.h"
00012 #include "RecoLocalTracker/SiStripRecHitConverter/interface/StripCPE.h"
00013
00014
00015
00016 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
00017 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00018 #include "DataFormats/Common/interface/Ref.h"
00019
00020
00021 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00022 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00023 #include "Geometry/TrackerGeometryBuilder/interface/GluedGeomDet.h"
00024
00025
00026 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00027
00028 #include "CalibTracker/Records/interface/SiStripQualityRcd.h"
00029
00030 using namespace std;
00031
00032 SiStripRecHitConverterAlgorithm::SiStripRecHitConverterAlgorithm(const edm::ParameterSet& conf) : conf_(conf) {
00033 }
00034
00035 SiStripRecHitConverterAlgorithm::~SiStripRecHitConverterAlgorithm() {
00036 }
00037
00038 void SiStripRecHitConverterAlgorithm::run(edm::Handle<edmNew::DetSetVector<SiStripCluster> > input,SiStripMatchedRecHit2DCollection & outmatched,SiStripRecHit2DCollection & outrphi, SiStripRecHit2DCollection & outstereo,const TrackerGeometry& tracker,const StripClusterParameterEstimator ¶meterestimator, const SiStripRecHitMatcher & matcher, const SiStripQuality *quality)
00039 {
00040 run(input, outmatched,outrphi,outstereo,tracker,parameterestimator,matcher,LocalVector(0.,0.,0.),quality);
00041 }
00042
00043
00044 void SiStripRecHitConverterAlgorithm::run(edm::Handle<edmNew::DetSetVector<SiStripCluster> > inputhandle,SiStripMatchedRecHit2DCollection & outmatched,SiStripRecHit2DCollection & outrphi, SiStripRecHit2DCollection & outstereo,const TrackerGeometry& tracker,const StripClusterParameterEstimator ¶meterestimator, const SiStripRecHitMatcher & matcher,LocalVector trackdirection, const SiStripQuality *quality)
00045 {
00046
00047 int nmono=0;
00048 int nstereo=0;
00049 bool maskBad128StripBlocks, bad128StripBlocks[6];
00050 maskBad128StripBlocks = ((quality != 0) && conf_.existsAs<bool>("MaskBadAPVFibers") && conf_.getParameter<bool>("MaskBadAPVFibers"));
00051
00052 std::vector<SiStripRecHit2D> collectorrphi, collectorstereo;
00053 for (edmNew::DetSetVector<SiStripCluster>::const_iterator DSViter=inputhandle->begin(); DSViter!=inputhandle->end();DSViter++ ) {
00054
00055 unsigned int id = DSViter->id();
00056 collectorrphi.clear(); collectorstereo.clear();
00057
00058
00059 DetId detId(id);
00060
00061 const StripGeomDetUnit * stripdet=(const StripGeomDetUnit*)tracker.idToDetUnit(detId);
00062 if(stripdet==0)edm::LogWarning("SiStripRecHitConverter")<<"Detid="<<id<<" not found, trying next one";
00063 else if ((quality == 0) || quality->IsModuleUsable(detId)) {
00064 if (maskBad128StripBlocks) fillBad128StripBlocks(*quality, detId, bad128StripBlocks);
00065 edmNew::DetSet<SiStripCluster>::const_iterator begin=DSViter->begin();
00066 edmNew::DetSet<SiStripCluster>::const_iterator end =DSViter->end();
00067
00068 StripSubdetector specDetId=StripSubdetector(id);
00069 for(edmNew::DetSet<SiStripCluster>::const_iterator iter=begin;iter!=end;++iter){
00070
00071 if (maskBad128StripBlocks && isMasked(*iter, bad128StripBlocks)) continue;
00072
00073
00074 StripClusterParameterEstimator::LocalValues parameters=parameterestimator.localParameters(*iter,*stripdet);
00075
00076
00077
00078
00079
00080
00081
00082
00083 SiStripRecHit2D::ClusterRef cluster=edmNew::makeRefTo(inputhandle,iter);
00084
00085 if(!specDetId.stereo()){
00086 collectorrphi.push_back(SiStripRecHit2D(parameters.first, parameters.second,detId,cluster));
00087 nmono++;
00088 }
00089 else{
00090 collectorstereo.push_back(SiStripRecHit2D(parameters.first, parameters.second,detId,cluster));
00091 nstereo++;
00092 }
00093 }
00094 if (collectorrphi.size() > 0) {
00095 outrphi.put(detId,collectorrphi.begin(),collectorrphi.end());
00096 }
00097 if (collectorstereo.size() > 0) {
00098 outstereo.put(detId, collectorstereo.begin(),collectorstereo.end());
00099 }
00100 }
00101 }
00102
00103 edm::LogInfo("SiStripRecHitConverter")
00104 << "found\n"
00105 << nmono
00106 << " clusters in mono detectors\n"
00107 << nstereo
00108 << " clusters in partners stereo detectors\n";
00109
00110
00111 match(outmatched,outrphi,outstereo,tracker,matcher,trackdirection);
00112 }
00113
00114 void SiStripRecHitConverterAlgorithm::run(edm::Handle<edm::RefGetter<SiStripCluster> > refGetterhandle, edm::Handle<edm::LazyGetter<SiStripCluster> > lazyGetterhandle, SiStripMatchedRecHit2DCollection & outmatched,SiStripRecHit2DCollection & outrphi, SiStripRecHit2DCollection & outstereo,const TrackerGeometry& tracker,const StripClusterParameterEstimator ¶meterestimator, const SiStripRecHitMatcher & matcher, const SiStripQuality *quality)
00115 {
00116
00117 int nmono=0;
00118 int nstereo=0;
00119 bool maskBad128StripBlocks, bad128StripBlocks[6];
00120 maskBad128StripBlocks = ((quality != 0) && conf_.existsAs<bool>("MaskBadAPVFibers") && conf_.getParameter<bool>("MaskBadAPVFibers"));
00121
00122 edm::OwnVector<SiStripRecHit2D> collectorrphi;
00123 edm::OwnVector<SiStripRecHit2D> collectorstereo;
00124
00125 DetId lastId; bool goodDet = true;
00126
00127 edm::RefGetter<SiStripCluster>::const_iterator iregion = refGetterhandle->begin();
00128 for(;iregion!=refGetterhandle->end();++iregion) {
00129 const edm::RegionIndex<SiStripCluster>& region = *iregion;
00130 const uint32_t start = region.start();
00131 const uint32_t finish = region.finish();
00132 for (uint32_t i = start; i < finish; i++) {
00133 edm::RegionIndex<SiStripCluster>::const_iterator icluster = region.begin()+(i-start);
00134
00135 DetId detId(icluster->geographicalId());
00136 const StripGeomDetUnit * stripdet=(const StripGeomDetUnit*)tracker.idToDetUnit(detId);
00137 if(stripdet==0)
00138 edm::LogWarning("SiStripRecHitConverter")
00139 <<"Detid="
00140 <<icluster->geographicalId()
00141 <<" not found";
00142 else {
00143 if (quality != 0) {
00144 if (detId != lastId) {
00145 lastId = detId;
00146 goodDet = quality->IsModuleUsable(detId);
00147 if (goodDet) fillBad128StripBlocks(*quality, detId, bad128StripBlocks);
00148 }
00149 if (!goodDet) continue;
00150
00151 if (maskBad128StripBlocks && isMasked(*icluster, bad128StripBlocks)) continue;
00152 }
00153
00154 StripSubdetector specDetId=StripSubdetector(icluster->geographicalId());
00155 StripClusterParameterEstimator::LocalValues parameters=parameterestimator.localParameters(*icluster,*stripdet);
00156 edm::Ref< edm::LazyGetter<SiStripCluster>, SiStripCluster, edm::FindValue<SiStripCluster> > cluster =
00157 makeRefToLazyGetter(lazyGetterhandle,i);
00158
00159 if(!specDetId.stereo()){
00160 collectorrphi.push_back(new SiStripRecHit2D(parameters.first, parameters.second,detId,cluster));
00161 nmono++;
00162 }
00163 else{
00164 collectorstereo.push_back(new SiStripRecHit2D(parameters.first, parameters.second,detId,cluster));
00165 nstereo++;
00166 }
00167
00168
00169 if (((icluster+1 )==iregion->end())
00170 || ((icluster+1)->geographicalId() != icluster->geographicalId())) {
00171
00172 if (collectorrphi.size() > 0) {
00173 outrphi.put(detId,collectorrphi.begin(),collectorrphi.end());
00174 collectorrphi.clear();
00175 }
00176
00177 if (collectorstereo.size() > 0) {
00178 outstereo.put(detId, collectorstereo.begin(),collectorstereo.end());
00179 collectorstereo.clear();
00180 }
00181 }
00182 }
00183 }
00184 }
00185
00186 edm::LogInfo("SiStripRecHitConverter")
00187 << "found\n"
00188 << nmono
00189 << " clusters in mono detectors\n"
00190 << nstereo
00191 << " clusters in partners stereo detectors\n";
00192
00193
00194 match(outmatched,outrphi,outstereo,tracker,matcher,LocalVector(0.,0.,0.));
00195
00196 }
00197
00198
00199 void SiStripRecHitConverterAlgorithm::match(SiStripMatchedRecHit2DCollection & outmatched,SiStripRecHit2DCollection & outrphi, SiStripRecHit2DCollection & outstereo,const TrackerGeometry& tracker, const SiStripRecHitMatcher & matcher,LocalVector trackdirection) const {
00200 int maximumHits2BeforeMatching = conf_.getParameter<uint32_t>("maximumHits2BeforeMatching");
00201 bool skippedPairs = false;
00202
00203 int nmatch=0;
00204
00205 std::vector<DetId> rphidetIDs = outrphi.ids();
00206 std::vector<DetId> stereodetIDs = outstereo.ids();
00207 if (!__gnu_cxx::is_sorted(stereodetIDs.begin(), stereodetIDs.end())) {
00208
00209 std::sort(stereodetIDs.begin(), stereodetIDs.end());
00210 }
00211 for ( std::vector<DetId>::const_iterator detunit_iterator = rphidetIDs.begin(); detunit_iterator != rphidetIDs.end(); detunit_iterator++ ) {
00212 edm::OwnVector<SiStripMatchedRecHit2D> collectorMatched;
00213
00214 edm::OwnVector<SiStripMatchedRecHit2D> collectorMatchedSingleHit;
00215 StripSubdetector specDetId(*detunit_iterator);
00216 unsigned int id = specDetId.partnerDetId();
00217 const DetId theId(id);
00218
00219
00220 if (!std::binary_search(stereodetIDs.begin(),stereodetIDs.end(),theId)) id = 0;
00221
00222
00223
00224
00225 SiStripRecHit2DCollection::range monoRecHitRange = outrphi.get((*detunit_iterator));
00226 SiStripRecHit2DCollection::const_iterator rhRangeIteratorBegin = monoRecHitRange.first;
00227 SiStripRecHit2DCollection::const_iterator rhRangeIteratorEnd = monoRecHitRange.second;
00228 SiStripRecHit2DCollection::const_iterator iter;
00229
00230 for(iter=rhRangeIteratorBegin;iter!=rhRangeIteratorEnd;++iter){
00231
00232 if (id>0){
00233
00234 const SiStripRecHit2DCollection::range rhpartnerRange = outstereo.get(theId);
00235 SiStripRecHit2DCollection::const_iterator rhpartnerRangeIteratorBegin = rhpartnerRange.first;
00236 SiStripRecHit2DCollection::const_iterator rhpartnerRangeIteratorEnd = rhpartnerRange.second;
00237
00238 if ((maximumHits2BeforeMatching > 0) &&
00239 (monoRecHitRange.second - monoRecHitRange.first) * (rhpartnerRange.second - rhpartnerRange.first) > maximumHits2BeforeMatching) {
00240 skippedPairs = true;
00241 break;
00242 }
00243
00244 const GluedGeomDet* gluedDet = (const GluedGeomDet*)tracker.idToDet(DetId(specDetId.glued()));
00245 SiStripRecHitMatcher::SimpleHitCollection stereoHits;
00246 stereoHits.reserve(rhpartnerRangeIteratorEnd-rhpartnerRangeIteratorBegin);
00247
00248 for (SiStripRecHit2DCollection::const_iterator i=rhpartnerRangeIteratorBegin; i != rhpartnerRangeIteratorEnd; ++i) {
00249 stereoHits.push_back( &(*i));
00250 }
00251
00252 matcher.match(&(*iter),stereoHits.begin(),stereoHits.end(),collectorMatched,gluedDet,trackdirection);
00253
00254 }
00255 }
00256 if (collectorMatched.size()>0){
00257 nmatch+=collectorMatched.size();
00258 StripSubdetector stripDetId(*detunit_iterator);
00259 outmatched.put(DetId(stripDetId.glued()),collectorMatched.begin(),collectorMatched.end());
00260 }
00261 }
00262
00263 edm::LogInfo("SiStripRecHitConverter")
00264 << "found\n"
00265 << nmatch
00266 << " matched RecHits\n";
00267 if (skippedPairs) {
00268 edm::LogWarning("SiStripRecHitConverter") << "Skipped matched rechits on some noisy modules.\n";
00269 }
00270 }
00271 void SiStripRecHitConverterAlgorithm::fillBad128StripBlocks(const SiStripQuality &quality, const uint32_t &detid, bool bad128StripBlocks[6]) const {
00272 short badApvs = quality.getBadApvs(detid);
00273 short badFibers = quality.getBadFibers(detid);
00274 for (int j = 0; j < 6; j++) {
00275 bad128StripBlocks[j] = (badApvs & (1 << j));
00276 }
00277 for (int j = 0; j < 3; j++) {
00278 if (badFibers & (1 << j)) {
00279 bad128StripBlocks[2*j+0] = true;
00280 bad128StripBlocks[2*j+1] = true;
00281 }
00282 }
00283 }