21 const std::string
metname =
"Muon|RecoMuon|MuonTrajectoryCleaner";
23 LogTrace(metname) <<
"Muon Trajectory Cleaner called" << endl;
25 TrajectoryContainer::iterator iter, jter;
26 Trajectory::DataContainer::const_iterator m1, m2;
28 if ( trajC.size() < 1 )
return;
30 LogTrace(metname) <<
"Number of trajectories in the container: " <<trajC.size()<< endl;
36 map<int, vector<int> > seedmap;
41 vector<bool> mask(trajC.size(),
true);
45 for ( iter = trajC.begin(); iter != trajC.end(); iter++ ) {
46 if ( !mask[
i] ) { i++;
continue; }
47 if ( !(*iter)->isValid() || (*iter)->empty() ) {mask[
i] =
false; i++;
continue; }
48 if(seedmap.count(i)==0) seedmap[i].push_back(i);
52 for ( jter = iter+1; jter != trajC.end(); jter++ ) {
53 if ( !mask[j] ) { j++;
continue; }
54 if(seedmap.count(j)==0) seedmap[j].push_back(j);
57 for ( m1 = meas1.begin(); m1 != meas1.end(); m1++ ) {
58 for ( m2 = meas2.begin(); m2 != meas2.end(); m2++ ) {
59 if ( ( (*m1).recHit()->globalPosition() - (*m2).recHit()->globalPosition()).
mag()< 10
e-5 ) match++;
65 double chi2_dof_i = (*iter)->ndof() > 0 ? (*iter)->chiSquared()/(*iter)->ndof() : (*iter)->chiSquared()/1
e-10;
66 double chi2_dof_j = (*jter)->ndof() > 0 ? (*jter)->chiSquared()/(*jter)->ndof() : (*jter)->chiSquared()/1
e-10;
69 <<
" MuonTrajectoryCleaner: trajC "
70 << i <<
"(pT="<<(*iter)->lastMeasurement().updatedState().globalMomentum().perp() <<
" GeV)"
71 <<
" chi2/nDOF = " << (*iter)->chiSquared() <<
"/" << (*iter)->ndof()
72 <<
" (RH=" << (*iter)->foundHits() <<
") = " << chi2_dof_i
74 << j <<
"(pT="<<(*jter)->lastMeasurement().updatedState().globalMomentum().perp() <<
" GeV)"
75 <<
" chi2/nRH = " << (*jter)->chiSquared() <<
"/" << (*jter)->ndof()
76 <<
" (RH=" << (*jter)->foundHits() <<
") = " << chi2_dof_j
77 <<
" Shared RecHits: " <<
match;
79 int hit_diff = (*iter)->foundHits() - (*jter)->foundHits() ;
83 if (
abs(hit_diff) <= 4 ) {
88 double maxFraction = 0.95;
90 double fraction = (2.*
match)/((*iter)->measurements().size()+(*jter)->measurements().size());
94 if((*jter)->lastMeasurement().updatedState().globalMomentum().perp() <=
minPt) ++belowLimit;
95 if((*iter)->lastMeasurement().updatedState().globalMomentum().perp() <=
minPt) ++belowLimit;
97 if((*jter)->lastMeasurement().updatedState().globalMomentum().perp() >= dPt) ++above;
98 if((*iter)->lastMeasurement().updatedState().globalMomentum().perp() >= dPt) ++above;
101 if(fraction >= maxFraction && belowLimit == 1 && above == 1){
102 if((*iter)->lastMeasurement().updatedState().globalMomentum().perp() <
minPt){
105 seedmap[
j].insert(seedmap[j].
end(), seedmap[i].
begin(), seedmap[i].
end());
107 LogTrace(metname) <<
"Trajectory # " << i <<
" (pT="<<(*iter)->lastMeasurement().updatedState().globalMomentum().perp()
108 <<
" GeV) rejected because it has too low pt";
112 seedmap[
i].insert(seedmap[i].
end(), seedmap[j].
begin(), seedmap[j].
end());
114 LogTrace(metname) <<
"Trajectory # " << j <<
" (pT="<<(*jter)->lastMeasurement().updatedState().globalMomentum().perp()
115 <<
" GeV) rejected because it has too low pt";
119 if (chi2_dof_i > chi2_dof_j) {
122 seedmap[
j].insert(seedmap[j].
end(), seedmap[i].
begin(), seedmap[i].
end());
124 LogTrace(metname) <<
"Trajectory # " << i <<
" (pT="<<(*iter)->lastMeasurement().updatedState().globalMomentum().perp() <<
" GeV) rejected";
128 seedmap[
i].insert(seedmap[i].
end(), seedmap[j].
begin(), seedmap[j].
end());
130 LogTrace(metname) <<
"Trajectory # " << j <<
" (pT="<<(*jter)->lastMeasurement().updatedState().globalMomentum().perp() <<
" GeV) rejected";
135 if ( hit_diff < 0 ) {
138 seedmap[
j].insert(seedmap[j].
end(), seedmap[i].
begin(), seedmap[i].
end());
140 LogTrace(metname) <<
"Trajectory # " << i <<
" (pT="<<(*iter)->lastMeasurement().updatedState().globalMomentum().perp() <<
" GeV) rejected";
144 seedmap[
i].insert(seedmap[i].
end(), seedmap[j].
begin(), seedmap[j].
end());
146 LogTrace(metname) <<
"Trajectory # " << j <<
" (pT="<<(*jter)->lastMeasurement().updatedState().globalMomentum().perp() <<
" GeV) rejected";
154 if(skipnext)
continue;
160 LogTrace(metname) <<
" Creating map between chosen seed and ghost seeds." << std::endl;
162 auto_ptr<L2SeedAssoc> seedToSeedsMap(
new L2SeedAssoc);
165 for(
map<
int, vector<int> >::iterator itmap=seedmap.begin(); itmap!=seedmap.end(); ++itmap, ++seedcnt) {
169 int tmpsize=(*itmap).second.size();
170 for(
int cnt=0; cnt!=tmpsize; ++cnt) {
173 seedToSeedsMap->insert(tmpL2SeedRef1, tmpL2SeedRef2);
177 event.put(seedToSeedsMap,
"");
182 for ( iter = trajC.begin(); iter != trajC.end(); iter++ ) {
184 result.push_back(*iter);
185 LogTrace(metname) <<
"Keep trajectory with pT = " << (*iter)->lastMeasurement().updatedState().globalMomentum().perp() <<
" GeV";
199 const std::string
metname =
"Muon|RecoMuon|MuonTrajectoryCleaner";
201 LogTrace(metname) <<
"Muon Trajectory Cleaner called" << endl;
203 if ( candC.size() < 2 )
return;
205 CandidateContainer::iterator iter, jter;
206 Trajectory::DataContainer::const_iterator m1, m2;
208 const float deltaEta = 0.01;
210 const float deltaPt = 1.0;
212 LogTrace(metname) <<
"Number of muon candidates in the container: " <<candC.size()<< endl;
216 bool directionMatch =
false;
221 vector<bool> mask(candC.size(),
true);
225 for ( iter = candC.begin(); iter != candC.end(); iter++ ) {
226 if ( !mask[
i] ) { i++;
continue; }
234 innerTSOS = (*iter)->trajectory()->firstMeasurement().updatedState();
237 innerTSOS = (*iter)->trajectory()->lastMeasurement().updatedState();
239 if ( !(innerTSOS.
isValid()) )
continue;
244 for ( jter = iter+1; jter != candC.end(); jter++ ) {
245 if ( !mask[j] ) { j++;
continue; }
246 directionMatch =
false;
249 for ( m1 = meas1.begin(); m1 != meas1.end(); m1++ ) {
250 for ( m2 = meas2.begin(); m2 != meas2.end(); m2++ ) {
251 if ( (*m1).recHit()->isValid() && (*m2).recHit()->isValid() )
252 if ( ( (*m1).recHit()->globalPosition() - (*m2).recHit()->globalPosition()).
mag()< 10
e-5 ) match++;
257 <<
" MuonTrajectoryCleaner: candC " << i <<
" chi2/nRH = "
258 << (*iter)->trajectory()->chiSquared() <<
"/" << (*iter)->trajectory()->foundHits() <<
259 " vs trajC " << j <<
" chi2/nRH = " << (*jter)->trajectory()->chiSquared() <<
260 "/" << (*jter)->trajectory()->foundHits() <<
" Shared RecHits: " <<
match;
264 innerTSOS2 = (*jter)->trajectory()->firstMeasurement().updatedState();
267 innerTSOS2 = (*jter)->trajectory()->lastMeasurement().updatedState();
269 if ( !(innerTSOS2.
isValid()) )
continue;
275 float deta(fabs(eta1-eta2));
277 float dpt(fabs(pt1-pt2));
278 if ( dpt < deltaPt && deta < deltaEta && dphi < deltaPhi ) {
279 directionMatch =
true;
281 <<
" MuonTrajectoryCleaner: candC " << i<<
" and "<<j<<
" direction matched: "
286 bool hitsMatch = ((match > 0) && ((match/((*iter)->trajectory()->foundHits()) > 0.25) || (match/((*jter)->trajectory()->foundHits()) > 0.25))) ?
true :
false;
288 ( ( (*iter)->trackerTrack() == (*jter)->trackerTrack() ) &&
289 ( deltaR<double>((*iter)->muonTrack()->eta(),(*iter)->muonTrack()->phi(), (*jter)->muonTrack()->eta(),(*jter)->muonTrack()->phi()) < 0.2) );
292 if ( ( tracksMatch ) || (hitsMatch > 0) ) {
293 if ( (*iter)->trajectory()->foundHits() == (*jter)->trajectory()->foundHits() ) {
294 if ( (*iter)->trajectory()->chiSquared() > (*jter)->trajectory()->chiSquared() ) {
298 else mask[
j] =
false;
301 if ( (*iter)->trajectory()->foundHits() < (*jter)->trajectory()->foundHits() ) {
305 else mask[
j] =
false;
312 if(skipnext)
continue;
316 for ( iter = candC.begin(); iter != candC.end(); iter++ ) {
318 result.push_back(*iter);
320 delete (*iter)->trajectory();
321 delete (*iter)->trackerTrajectory();
const std::string metname
double deltaPhi(float phi1, float phi2)
Geom::Phi< T > phi() const
edm::AssociationMap< edm::OneToMany< L2MuonTrajectorySeedCollection, L2MuonTrajectorySeedCollection > > L2SeedAssoc
void clean(TrajectoryContainer &muonTrajectories, edm::Event &evt)
Clean the trajectories container, erasing the (worst) clone trajectory.
std::vector< TrajectoryMeasurement > DataContainer
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
MuonCandidate::CandidateContainer CandidateContainer
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
MuonCandidate::TrajectoryContainer TrajectoryContainer
REF castTo() const
cast to a concrete type
GlobalVector globalMomentum() const
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.