00001 #include "HitExtractorSTRP.h"
00002 #include "Geometry/TrackerGeometryBuilder/interface/TrackerLayerIdAccessor.h"
00003 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00004
00005 #include "DataFormats/Common/interface/Handle.h"
00006 #include "FWCore/Framework/interface/Event.h"
00007
00008 #include "FWCore/Framework/interface/EventSetup.h"
00009 #include "FWCore/Framework/interface/ESHandle.h"
00010 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2DCollection.h"
00011 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2DCollection.h"
00012
00013 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00014 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00015 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00016 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00017
00018 using namespace ctfseeding;
00019 using namespace std;
00020 using namespace edm;
00021
00022 HitExtractorSTRP::HitExtractorSTRP( const DetLayer* detLayer,
00023 SeedingLayer::Side & side, int idLayer)
00024 : theLayer(detLayer), theSide(side), theIdLayer(idLayer),
00025 hasMatchedHits(false), hasRPhiHits(false), hasStereoHits(false),
00026 hasRingSelector(false), theMinRing(1), theMaxRing(0), hasSimpleRphiHitsCleaner(true)
00027 { }
00028
00029 void HitExtractorSTRP::useRingSelector(int minRing, int maxRing)
00030 {
00031 hasRingSelector=true;
00032 theMinRing=minRing;
00033 theMaxRing=maxRing;
00034 }
00035
00036 bool HitExtractorSTRP::ringRange(int ring) const
00037 {
00038 if (!hasRingSelector) return true;
00039 else if ( ring >= theMinRing && ring <= theMaxRing) return true;
00040 else return false;
00041 }
00042
00043 HitExtractor::Hits HitExtractorSTRP::hits(const SeedingLayer & sl, const edm::Event& ev, const edm::EventSetup& es) const
00044 {
00045 TrackerLayerIdAccessor accessor;
00046 HitExtractor::Hits result;
00047
00048
00049
00050
00051 if (theLayer->subDetector() == GeomDetEnumerators::TIB) {
00052 if (hasMatchedHits) {
00053 edm::Handle<SiStripMatchedRecHit2DCollection> matchedHits;
00054 ev.getByLabel( theMatchedHits, matchedHits);
00055 range2SeedingHits( *matchedHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
00056 }
00057 if (hasRPhiHits) {
00058 edm::Handle<SiStripRecHit2DCollection> rphiHits;
00059 ev.getByLabel( theRPhiHits, rphiHits);
00060 if (hasMatchedHits){
00061 if (!hasSimpleRphiHitsCleaner){
00062 range2SeedingHits( *rphiHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
00063 }
00064 } else {
00065 range2SeedingHits( *rphiHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
00066 }
00067 }
00068 if (hasStereoHits) {
00069 edm::Handle<SiStripRecHit2DCollection> stereoHits;
00070 ev.getByLabel( theStereoHits, stereoHits);
00071 range2SeedingHits( *stereoHits, result, accessor.stripTIBLayer(theIdLayer), sl, es);
00072 }
00073 }
00074
00075
00076
00077
00078 else if (theLayer->subDetector() == GeomDetEnumerators::TID) {
00079 if (hasMatchedHits) {
00080 edm::Handle<SiStripMatchedRecHit2DCollection> matchedHits;
00081 ev.getByLabel( theMatchedHits, matchedHits);
00082 std::pair<DetId,DetIdTIDSameDiskComparator> getter = accessor.stripTIDDisk(theSide,theIdLayer);
00083 SiStripMatchedRecHit2DCollection::Range range = matchedHits->equal_range(getter.first, getter.second);
00084 for (SiStripMatchedRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
00085 int ring = TIDDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
00086 for (SiStripMatchedRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
00087 result.push_back( sl.hitBuilder()->build(hit) );
00088 }
00089 }
00090 }
00091 if (hasRPhiHits) {
00092 edm::Handle<SiStripRecHit2DCollection> rphiHits;
00093 ev.getByLabel( theRPhiHits, rphiHits);
00094 std::pair<DetId,DetIdTIDSameDiskComparator> getter = accessor.stripTIDDisk(theSide,theIdLayer);
00095 SiStripRecHit2DCollection::Range range = rphiHits->equal_range(getter.first, getter.second);
00096 for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
00097 int ring = TIDDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
00098 if ((SiStripDetId(it->detId()).partnerDetId() != 0) && hasSimpleRphiHitsCleaner) continue;
00099 for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
00100 result.push_back( sl.hitBuilder()->build(hit) );
00101 }
00102 }
00103 }
00104 if (hasStereoHits) {
00105 edm::Handle<SiStripRecHit2DCollection> stereoHits;
00106 ev.getByLabel( theStereoHits, stereoHits);
00107 std::pair<DetId,DetIdTIDSameDiskComparator> getter = accessor.stripTIDDisk(theSide,theIdLayer);
00108 SiStripRecHit2DCollection::Range range = stereoHits->equal_range(getter.first, getter.second);
00109 for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
00110 int ring = TIDDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
00111 for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
00112 result.push_back( sl.hitBuilder()->build(hit) );
00113 }
00114 }
00115 }
00116 }
00117
00118
00119
00120 else if (theLayer->subDetector() == GeomDetEnumerators::TOB) {
00121 if (hasMatchedHits) {
00122 edm::Handle<SiStripMatchedRecHit2DCollection> matchedHits;
00123 ev.getByLabel( theMatchedHits, matchedHits);
00124 range2SeedingHits( *matchedHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
00125 }
00126 if (hasRPhiHits) {
00127 edm::Handle<SiStripRecHit2DCollection> rphiHits;
00128 ev.getByLabel( theRPhiHits, rphiHits);
00129 if (hasMatchedHits){
00130 if (!hasSimpleRphiHitsCleaner){
00131 range2SeedingHits( *rphiHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
00132 }
00133 } else {
00134 range2SeedingHits( *rphiHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
00135 }
00136 }
00137 if (hasStereoHits) {
00138 edm::Handle<SiStripRecHit2DCollection> stereoHits;
00139 ev.getByLabel( theStereoHits, stereoHits);
00140 range2SeedingHits( *stereoHits, result, accessor.stripTOBLayer(theIdLayer), sl, es);
00141 }
00142 }
00143
00144
00145
00146
00147 else if (theLayer->subDetector() == GeomDetEnumerators::TEC) {
00148 if (hasMatchedHits) {
00149 edm::Handle<SiStripMatchedRecHit2DCollection> matchedHits;
00150 ev.getByLabel( theMatchedHits, matchedHits);
00151 std::pair<DetId,DetIdTECSameDiskComparator> getter = accessor.stripTECDisk(theSide,theIdLayer);
00152 SiStripMatchedRecHit2DCollection::Range range = matchedHits->equal_range(getter.first, getter.second);
00153 for (SiStripMatchedRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
00154 int ring = TECDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
00155 for (SiStripMatchedRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
00156 result.push_back( sl.hitBuilder()->build(hit) );
00157 }
00158 }
00159 }
00160 if (hasRPhiHits) {
00161 edm::Handle<SiStripRecHit2DCollection> rphiHits;
00162 ev.getByLabel( theRPhiHits, rphiHits);
00163 std::pair<DetId,DetIdTECSameDiskComparator> getter = accessor.stripTECDisk(theSide,theIdLayer);
00164 SiStripRecHit2DCollection::Range range = rphiHits->equal_range(getter.first, getter.second);
00165 for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
00166 int ring = TECDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
00167 if ((SiStripDetId(it->detId()).partnerDetId() != 0) && hasSimpleRphiHitsCleaner) continue;
00168 for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
00169 result.push_back( sl.hitBuilder()->build(hit) );
00170 }
00171 }
00172
00173 }
00174 if (hasStereoHits) {
00175 edm::Handle<SiStripRecHit2DCollection> stereoHits;
00176 ev.getByLabel( theStereoHits, stereoHits);
00177 std::pair<DetId,DetIdTECSameDiskComparator> getter = accessor.stripTECDisk(theSide,theIdLayer);
00178 SiStripRecHit2DCollection::Range range = stereoHits->equal_range(getter.first, getter.second);
00179 for (SiStripRecHit2DCollection::const_iterator it = range.first; it != range.second; ++it) {
00180 int ring = TECDetId( it->detId() ).ring(); if (!ringRange(ring)) continue;
00181 for (SiStripRecHit2DCollection::DetSet::const_iterator hit = it->begin(), end = it->end(); hit != end; ++hit) {
00182 result.push_back( sl.hitBuilder()->build(hit) );
00183 }
00184 }
00185 }
00186 }
00187
00188
00189 return result;
00190 }
00191
00192