Go to the documentation of this file.00001
00007 #include "RecoMuon/MuonSeedGenerator/src/RPCCosmicSeedrecHitFinder.h"
00008 #include <DataFormats/TrackingRecHit/interface/TrackingRecHit.h>
00009 #include <DataFormats/RPCRecHit/interface/RPCRecHit.h>
00010 #include <FWCore/Framework/interface/ESHandle.h>
00011 #include <Geometry/RPCGeometry/interface/RPCGeometry.h>
00012 #include <Geometry/Records/interface/MuonGeometryRecord.h>
00013
00014 using namespace std;
00015 using namespace edm;
00016
00017 MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator find(MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator firstIter, MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator lastIter, const MuonTransientTrackingRecHit::MuonRecHitPointer& recHitRef) {
00018
00019 MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator index = lastIter;
00020 for(MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator iter = firstIter; iter != lastIter; iter++)
00021 if((*iter) == recHitRef)
00022 index = iter;
00023 return index;
00024 }
00025
00026 RPCCosmicSeedrecHitFinder::RPCCosmicSeedrecHitFinder() {
00027
00028
00029 isLayerset = false;
00030 isConfigured = false;
00031 isInputset = false;
00032 isOutputset = false;
00033 isEdgeset = false;
00034 BxRange = 0;
00035 MaxDeltaPhi = 0;
00036 ClusterSet.clear();
00037 innerBounds.clear();
00038 isLayersmixed = false;
00039 LayersinRPC.clear();
00040 therecHits.clear();
00041 isOuterLayerfilled = false;
00042 }
00043
00044 RPCCosmicSeedrecHitFinder::~RPCCosmicSeedrecHitFinder() {
00045
00046 }
00047
00048 void RPCCosmicSeedrecHitFinder::configure(const edm::ParameterSet& iConfig) {
00049
00050
00051 BxRange = iConfig.getParameter<unsigned int>("BxRange");
00052 MaxDeltaPhi = iConfig.getParameter<double>("MaxDeltaPhi");
00053 ClusterSet = iConfig.getParameter< std::vector<int> >("ClusterSet");
00054
00055
00056 isConfigured = true;
00057 }
00058
00059 void RPCCosmicSeedrecHitFinder::setInput(MuonRecHitContainer (&recHits)[RPCLayerNumber]) {
00060
00061 for(unsigned int i = 0; i < RPCLayerNumber; i++) {
00062 AllrecHits[i].clear();
00063 AllrecHits[i] = recHits[i];
00064 }
00065
00066
00067 isInputset = true;
00068 }
00069
00070 void RPCCosmicSeedrecHitFinder::setEdge(const edm::EventSetup& iSetup) {
00071
00072
00073 edm::ESHandle<RPCGeometry> rpcGeometry;
00074 iSetup.get<MuonGeometryRecord>().get(rpcGeometry);
00075
00076
00077 const std::vector<DetId> AllRPCId = rpcGeometry->detIds();
00078 for(std::vector<DetId>::const_iterator it = AllRPCId.begin(); it != AllRPCId.end(); it++) {
00079 RPCDetId RPCId(it->rawId());
00080 int Region = RPCId.region();
00081 int Station = RPCId.station();
00082 int Layer = RPCId.layer();
00083 if(Region == 0 && Station == 1 && Layer == 1) {
00084 const BoundPlane RPCChamberSurface = rpcGeometry->chamber(RPCId)->surface();
00085 innerBounds.push_back(RPCChamberSurface);
00086 }
00087 }
00088
00089
00090 isEdgeset = true;
00091 }
00092
00093 void RPCCosmicSeedrecHitFinder::unsetEdge() {
00094
00095
00096 innerBounds.clear();
00097 isEdgeset = false;
00098 }
00099
00100 void RPCCosmicSeedrecHitFinder::unsetInput() {
00101
00102 for(unsigned int i = 0; i < RPCLayerNumber; i++)
00103 AllrecHits[i].clear();
00104 isInputset = false;
00105 }
00106
00107 void RPCCosmicSeedrecHitFinder::setOutput(RPCSeedFinder *Seed) {
00108
00109 theSeed = Seed;
00110
00111 isOutputset = true;
00112 }
00113
00114 void RPCCosmicSeedrecHitFinder::setLayers(const std::vector<unsigned int>& Layers) {
00115
00116 LayersinRPC = Layers;
00117
00118 isLayerset = true;
00119 }
00120
00121 void RPCCosmicSeedrecHitFinder::fillrecHits() {
00122
00123 if(isLayerset == false || isConfigured == false || isOutputset == false || isInputset == false || isEdgeset == false) {
00124 cout << "Not set the IO or not configured yet" << endl;
00125 return;
00126 }
00127
00128 therecHits.clear();
00129
00130 if(LayersinRPC.size() == 0) {
00131 cout << "Not set with any layers" << endl;
00132 LayersinRPC.clear();
00133 therecHits.clear();
00134 isLayerset = false;
00135 }
00136
00137
00138 unsigned int Component = LayerComponent();
00139 if(Component == 3)
00140 isLayersmixed = true;
00141 else
00142 isLayersmixed = false;
00143
00144 GlobalVector initVector(0, 0, 0);
00145 const MuonRecHitPointer recHitRef;
00146 isOuterLayerfilled = false;
00147 complete(initVector, recHitRef);
00148
00149
00150 LayersinRPC.clear();
00151 therecHits.clear();
00152 isLayerset = false;
00153 }
00154
00155 int RPCCosmicSeedrecHitFinder::LayerComponent() {
00156
00157 bool isBarrel = false;
00158 bool isEndcap = false;
00159 for(std::vector<unsigned int>::const_iterator it = LayersinRPC.begin(); it != LayersinRPC.end(); it++) {
00160 if((*it) < BarrelLayerNumber)
00161 isBarrel = true;
00162 if((*it) >= BarrelLayerNumber && (*it) < (BarrelLayerNumber+EachEndcapLayerNumber*2))
00163 isEndcap = true;
00164 }
00165 if(isBarrel == true && isEndcap == true)
00166 return 3;
00167 if(isEndcap == true)
00168 return 2;
00169 if(isBarrel == true)
00170 return 1;
00171 return 0;
00172 }
00173
00174 bool RPCCosmicSeedrecHitFinder::complete(const GlobalVector& lastSegment, const MuonRecHitPointer& lastrecHitRef) {
00175
00176 bool isrecHitsfound = false;
00177
00178 for(unsigned int i = 0; i < RPCLayerNumber; i++)
00179 for(MuonRecHitContainer::const_iterator it = AllrecHits[i].begin(); it != AllrecHits[i].end(); it++) {
00180
00181 cout << "Finding recHits from " << i << " th layer" << endl;
00182
00183 GlobalPoint currentPosition = (*it)->globalPosition();
00184 int currentBX;
00185
00186
00187 if(!(*it)->isValid())
00188 continue;
00189
00190
00191 TrackingRecHit* thisTrackingRecHit = (*it)->hit()->clone();
00192
00193 RPCRecHit* thisRPCRecHit = dynamic_cast<RPCRecHit*>(thisTrackingRecHit);
00194 currentBX = thisRPCRecHit->BunchX();
00195 int ClusterSize = thisRPCRecHit->clusterSize();
00196 delete thisTrackingRecHit;
00197
00198 if((unsigned int)abs(currentBX) > BxRange)
00199 continue;
00200
00201
00202 bool Clustercheck = false;
00203 if(ClusterSet.size() == 0)
00204 Clustercheck = true;
00205 for(std::vector<int>::const_iterator CluIter = ClusterSet.begin(); CluIter != ClusterSet.end(); CluIter++)
00206 if(ClusterSize == (*CluIter))
00207 Clustercheck = true;
00208 if(Clustercheck != true)
00209 continue;
00210
00211 cout << "Candidate recHit's position: " << currentPosition.x() << ", " << currentPosition.y() << ", " << currentPosition.z() << ". BX : " << currentBX << endl;
00212
00213 if(isOuterLayerfilled == false) {
00214
00215 if(!isouterLayer(*it))
00216 continue;
00217
00218
00219 GlobalVector currentSegment = GlobalVector(0, 0, 0);
00220 cout << "1st recHit's global position: " << currentPosition.x() << ", " << currentPosition.y() << ", " << currentPosition.z() << ". BX: " << currentBX << endl;
00221 isrecHitsfound = true;
00222 therecHits.push_back(*it);
00223 isOuterLayerfilled = true;
00224 complete(currentSegment, *it);
00225
00226 therecHits.pop_back();
00227 isOuterLayerfilled = false;
00228 }
00229 else {
00230 GlobalPoint lastPosition = lastrecHitRef->globalPosition();
00231 TrackingRecHit* lastTrackingRecHit = lastrecHitRef->hit()->clone();
00232
00233 RPCRecHit* lastRPCRecHit = dynamic_cast<RPCRecHit*>(lastTrackingRecHit);
00234 int lastBX = lastRPCRecHit->BunchX();
00235 delete lastTrackingRecHit;
00236
00237
00238 if(currentPosition.y() >= lastPosition.y())
00239 continue;
00240
00241
00242 if(currentBX < lastBX)
00243 continue;
00244
00245
00246 bool isinsideRegion = isinsideAngleRange(lastSegment, lastPosition, currentPosition);
00247 cout << "Check isinsideRegion: " << isinsideRegion << endl;
00248 if(!isinsideRegion)
00249 continue;
00250
00251
00252 bool iscrossanyEdge = iscorssEdge(lastrecHitRef, *it);
00253 cout << "Check iscrossanyEdge: " << iscrossanyEdge << endl;
00254 if(iscrossanyEdge)
00255 continue;
00256
00257
00258 unsigned int NumberinSeed = therecHits.size();
00259 GlobalVector currentSegment = (GlobalVector)(currentPosition - lastPosition);
00260 cout << (NumberinSeed + 1) << "th recHit's global position: " << currentPosition.x() << ", " << currentPosition.y() << ", " << currentPosition.z() << ". BX: " << currentBX << endl;
00261 isrecHitsfound = true;
00262 therecHits.push_back(*it);
00263
00264
00265 bool findNext = complete(currentSegment, *it);
00266 if(findNext == false && therecHits.size() > 3) {
00267 for(ConstMuonRecHitContainer::const_iterator iter = therecHits.begin(); iter != therecHits.end(); iter++)
00268 cout << "Find recHit in seed candidate : " << (*iter)->globalPosition().x() << ", " << (*iter)->globalPosition().y() << ", " << (*iter)->globalPosition().z() << endl;
00269 checkandfill();
00270 }
00271
00272
00273 therecHits.pop_back();
00274 }
00275 }
00276 return isrecHitsfound;
00277 }
00278
00279 bool RPCCosmicSeedrecHitFinder::isouterLayer(const MuonRecHitPointer& recHitRef) {
00280
00281 bool isinsideLayers = false;
00282 for(std::vector<unsigned int>::const_iterator it = LayersinRPC.begin(); it != LayersinRPC.end(); it++) {
00283 MuonRecHitContainer::const_iterator index = find(AllrecHits[*it].begin(), AllrecHits[*it].end(), recHitRef);
00284 if(index != AllrecHits[*it].end())
00285 isinsideLayers = true;
00286 }
00287 return isinsideLayers;
00288 }
00289
00290 bool RPCCosmicSeedrecHitFinder::isinsideAngleRange(const GlobalVector& lastSegment, const GlobalPoint& lastPosition, const GlobalPoint& currentPosition) {
00291
00292 bool isinsideAngle = true;
00293 GlobalVector SegVec = currentPosition - lastPosition;
00294 if(lastSegment.mag() != 0)
00295 if(fabs((lastSegment.phi()-SegVec.phi()).value()) > MaxDeltaPhi)
00296 isinsideAngle = false;
00297
00298 return isinsideAngle;
00299 }
00300
00301 bool RPCCosmicSeedrecHitFinder::iscorssEdge(const MuonRecHitPointer& lastrecHitRef, const MuonRecHitPointer& currentrecHitRef) {
00302
00303 bool iscorss = false;
00304
00305
00306
00307 GlobalPoint lastPosition = lastrecHitRef->globalPosition();
00308 GlobalPoint currentPosition = currentrecHitRef->globalPosition();
00309 GlobalPoint testPosition((lastPosition.x()+currentPosition.x())/2, (lastPosition.y()+currentPosition.y())/2, (lastPosition.z()+currentPosition.z())/2);
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322 if(isLayersmixed == false) {
00323 DetId lastId = lastrecHitRef->geographicalId();
00324 RPCDetId lastRPCId(lastId.rawId());
00325 int lastRegion = lastRPCId.region();
00326 DetId currentId = currentrecHitRef->geographicalId();
00327 RPCDetId currentRPCId(currentId.rawId());
00328 int currentRegion = currentRPCId.region();
00329
00330 if(lastRegion != currentRegion)
00331 iscorss = true;
00332 }
00333
00334 return iscorss;
00335 }
00336
00337 void RPCCosmicSeedrecHitFinder::checkandfill() {
00338
00339 if(therecHits.size() >= 3) {
00340 theSeed->setrecHits(therecHits);
00341 theSeed->seed();
00342 }
00343 else
00344 cout << "Layer less than 3, could not fill a RPCSeedFinder" << endl;
00345 }