Go to the documentation of this file.00001
00007 #include "RecoMuon/MuonSeedGenerator/src/RPCSeedOverlapper.h"
00008 #include <Geometry/Records/interface/MuonGeometryRecord.h>
00009 #include <Geometry/CommonDetUnit/interface/GeomDetUnit.h>
00010
00011 using namespace std;
00012 using namespace edm;
00013
00014 RPCSeedOverlapper::RPCSeedOverlapper() {
00015
00016 isConfigured = false;
00017 isIOset = false;
00018 isEventSetupset = false;
00019 }
00020
00021 RPCSeedOverlapper::~RPCSeedOverlapper() {
00022
00023 }
00024
00025 void RPCSeedOverlapper::configure(const edm::ParameterSet& iConfig) {
00026
00027 isCheckgoodOverlap = iConfig.getParameter<bool>("isCheckgoodOverlap");
00028 isCheckcandidateOverlap = iConfig.getParameter<bool>("isCheckcandidateOverlap");
00029 ShareRecHitsNumberThreshold = iConfig.getParameter<unsigned int>("ShareRecHitsNumberThreshold");
00030 isConfigured = true;
00031 }
00032
00033 void RPCSeedOverlapper::setIO(std::vector<weightedTrajectorySeed> *goodweightedRef, std::vector<weightedTrajectorySeed> *candidateweightedRef) {
00034
00035 goodweightedSeedsRef = goodweightedRef;
00036 candidateweightedSeedsRef = candidateweightedRef;
00037 isIOset = true;
00038 }
00039
00040 void RPCSeedOverlapper::unsetIO() {
00041
00042 isIOset = false;
00043 }
00044
00045 void RPCSeedOverlapper::setEventSetup(const edm::EventSetup& iSetup) {
00046
00047 eSetup = &iSetup;
00048 isEventSetupset = true;
00049 }
00050
00051 void RPCSeedOverlapper::run() {
00052
00053 if(isConfigured == false || isIOset == false || isEventSetupset == false) {
00054 cout << "Configuration or IO is not set yet" << endl;
00055 return;
00056 }
00057 if(isCheckgoodOverlap == true)
00058 CheckOverlap(*eSetup, goodweightedSeedsRef);
00059 if(isCheckcandidateOverlap == true)
00060 CheckOverlap(*eSetup, candidateweightedSeedsRef);
00061 }
00062
00063 void RPCSeedOverlapper::CheckOverlap(const edm::EventSetup& iSetup, std::vector<weightedTrajectorySeed> *weightedSeedsRef) {
00064
00065 std::vector<weightedTrajectorySeed> sortweightedSeeds;
00066 std::vector<weightedTrajectorySeed> tempweightedSeeds;
00067 edm::OwnVector<TrackingRecHit> tempRecHits;
00068
00069 edm::ESHandle<RPCGeometry> rpcGeometry;
00070 iSetup.get<MuonGeometryRecord>().get(rpcGeometry);
00071
00072 while(weightedSeedsRef->size() != 0) {
00073 cout << "Finding the weighted seeds group from " << weightedSeedsRef->size() << " seeds which share some recHits" << endl;
00074
00075 tempRecHits.clear();
00076 tempweightedSeeds.clear();
00077 int N = 0;
00078 for(vector<weightedTrajectorySeed>::iterator itweightedseed = weightedSeedsRef->begin(); itweightedseed != weightedSeedsRef->end(); N++) {
00079 TrajectorySeed::range RecHitsRange = itweightedseed->first.recHits();
00080 if(N == 0) {
00081 cout << "Always take the 1st weighted seed to be the referrence." << endl;
00082 for(TrajectorySeed::const_iterator it = RecHitsRange.first; it != RecHitsRange.second; it++) {
00083 cout << "Put its recHits to tempRecHits" << endl;
00084 tempRecHits.push_back(it->clone());
00085 }
00086 cout << "Put it to tempweightedSeeds" << endl;
00087 tempweightedSeeds.push_back(*itweightedseed);
00088 cout << "Then erase from weightedSeedsRef->" << endl;
00089 itweightedseed = weightedSeedsRef->erase(itweightedseed);
00090 }
00091 else {
00092 cout << "Come to other weighted seed for checking " << itweightedseed->first.nHits() << " recHits from " << tempRecHits.size() << " temp recHits" << endl;
00093 unsigned int ShareRecHitsNumber = 0;
00094 for(TrajectorySeed::const_iterator it = RecHitsRange.first; it != RecHitsRange.second; it++) {
00095 if(isShareHit(tempRecHits, *it, rpcGeometry))
00096 ShareRecHitsNumber++;
00097 }
00098 if(ShareRecHitsNumber >= ShareRecHitsNumberThreshold) {
00099 cout <<"This seed is found to belong to current share group" << endl;
00100 for(TrajectorySeed::const_iterator it = RecHitsRange.first; it != RecHitsRange.second; it++) {
00101 if(!isShareHit(tempRecHits, *it, rpcGeometry)) {
00102 cout << "Put its extra recHits to tempRecHits" << endl;
00103 tempRecHits.push_back(it->clone());
00104 }
00105 }
00106 cout << "Put it to tempSeeds" << endl;
00107 tempweightedSeeds.push_back(*itweightedseed);
00108 cout << "Then erase from SeedsRef" << endl;
00109 itweightedseed = weightedSeedsRef->erase(itweightedseed);
00110 }
00111 else
00112 itweightedseed++;
00113 }
00114 }
00115
00116
00117 weightedTrajectorySeed bestweightedSeed;
00118 vector<weightedTrajectorySeed>::iterator bestweightediter;
00119
00120 double Quality = 1000000;
00121 unsigned NumberofHits = 0;
00122 cout << "Find " << tempweightedSeeds.size() << " seeds into one trajectory group" << endl;
00123 for(vector<weightedTrajectorySeed>::iterator itweightedseed = tempweightedSeeds.begin(); itweightedseed != tempweightedSeeds.end(); itweightedseed++) {
00124 unsigned int nHits = itweightedseed->first.nHits();
00125
00126
00127 double weightedQuality = itweightedseed->second;
00128 cout << "Find a weighted seed with quality " << weightedQuality << endl;
00129 if((NumberofHits < nHits) || (NumberofHits == nHits && weightedQuality < Quality)) {
00130 NumberofHits = nHits;
00131 Quality = weightedQuality;
00132 bestweightedSeed = *itweightedseed;
00133 bestweightediter = itweightedseed;
00134 }
00135 }
00136 cout << "Best good temp seed's quality is " << Quality <<endl;
00137 sortweightedSeeds.push_back(bestweightedSeed);
00138 tempweightedSeeds.erase(bestweightediter);
00139 tempRecHits.clear();
00140
00141 for(TrajectorySeed::const_iterator it = bestweightedSeed.first.recHits().first; it != bestweightedSeed.first.recHits().second; it++)
00142 tempRecHits.push_back(it->clone());
00143
00144 for(vector<weightedTrajectorySeed>::iterator itweightedseed = tempweightedSeeds.begin(); itweightedseed != tempweightedSeeds.end(); ) {
00145 cout << "Checking the temp weighted seed's " << itweightedseed->first.nHits() << " hits to " << tempRecHits.size() << " temp recHits" << endl;
00146 TrajectorySeed::range RecHitsRange = itweightedseed->first.recHits();
00147 bool isShare = false;
00148 for(TrajectorySeed::const_iterator it = RecHitsRange.first; it != RecHitsRange.second; it++)
00149 if(isShareHit(tempRecHits, *it, rpcGeometry))
00150 isShare = true;
00151
00152 if(isShare == true) {
00153 cout << "Find one temp seed share some recHits with best weighted seed" << endl;
00154 itweightedseed = tempweightedSeeds.erase(itweightedseed);
00155 }
00156 else {
00157 cout << "This seed has no relation with best weighted seed" << endl;
00158 weightedSeedsRef->push_back(*itweightedseed);
00159 itweightedseed = tempweightedSeeds.erase(itweightedseed);
00160 }
00161 }
00162 }
00163
00164 weightedSeedsRef->clear();
00165 *weightedSeedsRef = sortweightedSeeds;
00166 }
00167
00168 bool RPCSeedOverlapper::isShareHit(const edm::OwnVector<TrackingRecHit> &RecHits, const TrackingRecHit& hit, edm::ESHandle<RPCGeometry> rpcGeometry) {
00169
00170 bool istheSame = false;
00171 unsigned int n = 1;
00172 cout << "Checking from " << RecHits.size() << " temp recHits" << endl;
00173
00174 LocalPoint lpos1 = hit.localPosition();
00175 DetId RPCId1 = hit.geographicalId();
00176 const GeomDetUnit *rpcroll1 = rpcGeometry->idToDetUnit(RPCId1);
00177 GlobalPoint gpos1 = rpcroll1->toGlobal(lpos1);
00178 cout << "The hit's position: " << gpos1.x() << ", " << gpos1.y() << ", " << gpos1.z() << endl;
00179 for(edm::OwnVector<TrackingRecHit>::const_iterator it = RecHits.begin(); it !=RecHits.end(); it++, n++) {
00180 cout << "Checking the " << n << " th recHit from tempRecHits" << endl;
00181 LocalPoint lpos2 = it->localPosition();
00182 DetId RPCId2 = it->geographicalId();
00183 const GeomDetUnit *rpcroll2 = rpcGeometry->idToDetUnit(RPCId2);
00184 GlobalPoint gpos2 = rpcroll2->toGlobal(lpos2);
00185 cout << "The temp hit's position: " << gpos2.x() << ", " << gpos2.y() << ", " << gpos2.z() << endl;
00186
00187 if((gpos1.x() == gpos2.x()) && (gpos1.y() == gpos2.y()) && (gpos1.z() == gpos2.z())) {
00188 cout << "This hit is found to be the same" << endl;
00189 istheSame = true;
00190 }
00191 }
00192 return istheSame;
00193 }