![]() |
![]() |
enum muon::AlgorithmType |
Definition at line 20 of file MuonSelectors.h.
00020 { TMLastStation, TM2DCompatibility, TMOneStation };
float muon::caloCompatibility | ( | const reco::Muon & | muon | ) |
Definition at line 21 of file MuonSelectors.cc.
References reco::Muon::caloCompatibility().
Referenced by isGoodMuon(), and VisMuonTwig::update().
00021 { 00022 return muon.caloCompatibility(); 00023 }
bool muon::isGoodMuon | ( | const reco::Muon & | muon, | |
AlgorithmType | type, | |||
int | minNumberOfMatches, | |||
double | maxAbsDx, | |||
double | maxAbsPullX, | |||
double | maxAbsDy, | |||
double | maxAbsPullY, | |||
double | maxChamberDist, | |||
double | maxChamberDistPull, | |||
reco::Muon::ArbitrationType | arbitrationType | |||
) |
Definition at line 260 of file MuonSelectors.cc.
References reco::Muon::dX(), reco::Muon::dY(), reco::Particle::eta(), reco::Muon::isMatchesValid(), it, reco::Muon::pullX(), reco::Muon::pullY(), RequiredStationMask(), reco::Muon::stationMask(), TMLastStation, and TMOneStation.
Referenced by TrackEfficiencyMonitor::analyze().
00270 { 00271 if (!muon.isMatchesValid()) return false; 00272 bool goodMuon = false; 00273 00274 if (type == TMLastStation) { 00275 // To satisfy my own paranoia, if the user specifies that the 00276 // minimum number of matches is zero, then return true. 00277 if(minNumberOfMatches == 0) return true; 00278 00279 unsigned int theStationMask = muon.stationMask(arbitrationType); 00280 unsigned int theRequiredStationMask = RequiredStationMask(muon, maxChamberDist, maxChamberDistPull, arbitrationType); 00281 00282 // Require that there be at least a minimum number of segments 00283 int numSegs = 0; 00284 int numRequiredStations = 0; 00285 for(int it = 0; it < 8; ++it) { 00286 if(theStationMask & 1<<it) ++numSegs; 00287 if(theRequiredStationMask & 1<<it) ++numRequiredStations; 00288 } 00289 00290 // Make sure the minimum number of matches is not greater than 00291 // the number of required stations but still greater than zero 00292 // Note that we only do this in the barrel region! 00293 if (fabs(muon.eta()) < 1.2) { 00294 if(minNumberOfMatches > numRequiredStations) 00295 minNumberOfMatches = numRequiredStations; 00296 if(minNumberOfMatches < 1) 00297 minNumberOfMatches = 1; 00298 } 00299 00300 if(numSegs >= minNumberOfMatches) goodMuon = 1; 00301 00302 // Require that last required station have segment 00303 // If there are zero required stations keep track 00304 // of the last station with a segment so that we may 00305 // apply the quality cuts below to it instead 00306 int lastSegBit = 0; 00307 if(theRequiredStationMask) { 00308 for(int stationIdx = 7; stationIdx >= 0; --stationIdx) 00309 if(theRequiredStationMask & 1<<stationIdx) 00310 if(theStationMask & 1<<stationIdx) { 00311 lastSegBit = stationIdx; 00312 goodMuon &= 1; 00313 break; 00314 } else { 00315 goodMuon = false; 00316 break; 00317 } 00318 } else { 00319 for(int stationIdx = 7; stationIdx >= 0; --stationIdx) 00320 if(theStationMask & 1<<stationIdx) { 00321 lastSegBit = stationIdx; 00322 break; 00323 } 00324 } 00325 00326 if(!goodMuon) return false; 00327 00328 // Impose pull cuts on last segment 00329 int station = 0, detector = 0; 00330 station = lastSegBit < 4 ? lastSegBit+1 : lastSegBit-3; 00331 detector = lastSegBit < 4 ? 1 : 2; 00332 00333 // Check x information 00334 if(fabs(muon.pullX(station,detector,arbitrationType,1)) > maxAbsPullX && 00335 fabs(muon.dX(station,detector,arbitrationType)) > maxAbsDx) 00336 return false; 00337 00338 // Is this a tight algorithm, i.e. do we bother to check y information? 00339 if (maxAbsDy < 999999) { // really if maxAbsDy < 1E9 as currently defined 00340 00341 // Check y information 00342 if (detector == 2) { // CSC 00343 if(fabs(muon.pullY(station,2,arbitrationType,1)) > maxAbsPullY && 00344 fabs(muon.dY(station,2,arbitrationType)) > maxAbsDy) 00345 return false; 00346 } else { 00347 // 00348 // In DT, if this is a "Tight" algorithm and the last segment is 00349 // missing y information (always the case in station 4!!!), impose 00350 // respective cuts on the next station in the stationMask that has 00351 // a segment with y information. If there are no segments with y 00352 // information then there is nothing to penalize. Should we 00353 // penalize in Tight for having zero segments with y information? 00354 // That is the fundamental question. Of course I am being uber 00355 // paranoid; if this is a good muon then there will probably be at 00356 // least one segment with y information but not always. Suppose 00357 // somehow a muon only creates segments in station 4, then we 00358 // definitely do not want to require that there be at least one 00359 // segment with y information because we will lose it completely. 00360 // 00361 00362 for (int stationIdx = station; stationIdx > 0; --stationIdx) { 00363 if(! (theStationMask & 1<<(stationIdx-1))) // don't bother if the station is not in the stationMask 00364 continue; 00365 00366 if(muon.dY(stationIdx,1,arbitrationType) > 999998) // no y-information 00367 continue; 00368 00369 if(fabs(muon.pullY(stationIdx,1,arbitrationType,1)) > maxAbsPullY && 00370 fabs(muon.dY(stationIdx,1,arbitrationType)) > maxAbsDy) { 00371 return false; 00372 } 00373 00374 // If we get this far then great this is a good muon 00375 return true; 00376 } 00377 } 00378 } 00379 00380 return goodMuon; 00381 } // TMLastStation 00382 00383 // TMOneStation requires only that there be one "good" segment, regardless 00384 // of the required stations. We do not penalize if there are absolutely zero 00385 // segments with y information in the Tight algorithm. Maybe I'm being 00386 // paranoid but so be it. If it's really a good muon then we will probably 00387 // find at least one segment with both x and y information but you never 00388 // know, and I don't want to deal with a potential inefficiency in the DT 00389 // like we did with the original TMLastStation. Incidentally, not penalizing 00390 // for total lack of y information in the Tight algorithm is what is done in 00391 // the new TMLastStation 00392 // 00393 if (type == TMOneStation) { 00394 unsigned int theStationMask = muon.stationMask(arbitrationType); 00395 00396 // Of course there must be at least one segment 00397 if (! theStationMask) return false; 00398 00399 int station = 0, detector = 0; 00400 // Keep track of whether or not there is a DT segment with y information. 00401 // In the end, if it turns out there are absolutely zero DT segments with 00402 // y information, require only that there was a segment with good x info. 00403 // This of course only applies to the Tight algorithms. 00404 bool existsGoodDTSegX = false; 00405 bool existsDTSegY = false; 00406 00407 // Impose cuts on the segments in the station mask until we find a good one 00408 // Might as well start with the lowest bit to speed things up. 00409 for(int stationIdx = 0; stationIdx <= 7; ++stationIdx) 00410 if(theStationMask & 1<<stationIdx) { 00411 station = stationIdx < 4 ? stationIdx+1 : stationIdx-3; 00412 detector = stationIdx < 4 ? 1 : 2; 00413 00414 if(fabs(muon.pullX(station,detector,arbitrationType,1)) > maxAbsPullX && 00415 fabs(muon.dX(station,detector,arbitrationType)) > maxAbsDx) 00416 continue; 00417 else if (detector == 1) 00418 existsGoodDTSegX = true; 00419 00420 // Is this a tight algorithm? If yes, use y information 00421 if (maxAbsDy < 999999) { 00422 if (detector == 2) { // CSC 00423 if(fabs(muon.pullY(station,2,arbitrationType,1)) > maxAbsPullY && 00424 fabs(muon.dY(station,2,arbitrationType)) > maxAbsDy) 00425 continue; 00426 } else { 00427 00428 if(muon.dY(station,1,arbitrationType) > 999998) // no y-information 00429 continue; 00430 else 00431 existsDTSegY = true; 00432 00433 if(fabs(muon.pullY(station,1,arbitrationType,1)) > maxAbsPullY && 00434 fabs(muon.dY(station,1,arbitrationType)) > maxAbsDy) { 00435 continue; 00436 } 00437 } 00438 } 00439 00440 // If we get this far then great this is a good muon 00441 return true; 00442 } 00443 00444 // If we get this far then for sure there are no "good" CSC segments. For 00445 // DT, check if there were any segments with y information. If there 00446 // were none, but there was a segment with good x, then we're happy. If 00447 // there WERE segments with y information, then they must have been shit 00448 // since we are here so fail it. Of course, if this is a Loose algorithm 00449 // then fail immediately since if we had good x we would already have 00450 // returned true 00451 if (maxAbsDy < 999999) { 00452 if (existsDTSegY) 00453 return false; 00454 else if (existsGoodDTSegX) 00455 return true; 00456 } else 00457 return false; 00458 } // TMOneStation 00459 00460 return goodMuon; 00461 }
bool muon::isGoodMuon | ( | const reco::Muon & | muon, | |
AlgorithmType | type, | |||
double | minCompatibility | |||
) |
Definition at line 239 of file MuonSelectors.cc.
References caloCompatibility(), reco::Muon::isMatchesValid(), segmentCompatibility(), and TM2DCompatibility.
00241 { 00242 if (!muon.isMatchesValid()) return false; 00243 bool goodMuon = false; 00244 00245 switch( type ) { 00246 case TM2DCompatibility: 00247 // Simplistic first cut in the 2D segment- vs calo-compatibility plane. Will have to be refined! 00248 if( ( (0.8*caloCompatibility( muon ))+(1.2*segmentCompatibility( muon )) ) > minCompatibility ) goodMuon = true; 00249 else goodMuon = false; 00250 return goodMuon; 00251 break; 00252 default : 00253 // LogTrace("MuonIdentification")<<" // Invalid Algorithm Type called!"; 00254 goodMuon = false; 00255 return goodMuon; 00256 break; 00257 } 00258 }
bool muon::isGoodMuon | ( | const reco::Muon & | muon, | |
reco::Muon::SelectionType | type | |||
) |
main GoodMuon wrapper call
Definition at line 463 of file MuonSelectors.cc.
References reco::Muon::All, reco::Muon::AllArbitrated, reco::Muon::AllGlobalMuons, reco::Muon::AllStandAloneMuons, reco::Muon::AllTrackerMuons, reco::Particle::eta(), reco::Muon::GlobalMuonPromptTight, reco::Muon::globalTrack(), reco::Muon::isGlobalMuon(), reco::Muon::isStandAloneMuon(), reco::Muon::isTrackerMuon(), reco::Muon::numberOfMatches(), reco::Particle::pt(), reco::Muon::SegmentAndTrackArbitration, TM2DCompatibility, reco::Muon::TM2DCompatibilityLoose, reco::Muon::TM2DCompatibilityTight, TMLastStation, reco::Muon::TMLastStationLoose, reco::Muon::TMLastStationOptimizedLowPtLoose, reco::Muon::TMLastStationOptimizedLowPtTight, reco::Muon::TMLastStationTight, TMOneStation, reco::Muon::TMOneStationLoose, reco::Muon::TMOneStationTight, and reco::Muon::TrackerMuonArbitrated.
Referenced by reco::Muon::isGood(), and MuonRefProducer::produce().
00464 { 00465 switch (type) 00466 { 00467 case reco::Muon::All: 00468 return true; 00469 break; 00470 case reco::Muon::AllGlobalMuons: 00471 return muon.isGlobalMuon(); 00472 break; 00473 case reco::Muon::AllTrackerMuons: 00474 return muon.isTrackerMuon(); 00475 break; 00476 case reco::Muon::AllStandAloneMuons: 00477 return muon.isStandAloneMuon(); 00478 break; 00479 case reco::Muon::TrackerMuonArbitrated: 00480 return muon.isTrackerMuon() && muon.numberOfMatches(reco::Muon::SegmentAndTrackArbitration)>0; 00481 break; 00482 case reco::Muon::AllArbitrated: 00483 return ! muon.isTrackerMuon() || muon.numberOfMatches(reco::Muon::SegmentAndTrackArbitration)>0; 00484 break; 00485 case reco::Muon::GlobalMuonPromptTight: 00486 return muon.isGlobalMuon() && muon.globalTrack()->normalizedChi2()<10.; 00487 break; 00488 // For "Loose" algorithms we choose maximum y quantity cuts of 1E9 instead of 00489 // 9999 as before. We do this because the muon methods return 999999 (note 00490 // there are six 9's) when the requested information is not available. For 00491 // example, if a muon fails to traverse the z measuring superlayer in a station 00492 // in the DT, then all methods involving segmentY in this station return 00493 // 999999 to demonstrate that the information is missing. In order to not 00494 // penalize muons for missing y information in Loose algorithms where we do 00495 // not care at all about y information, we raise these limits. In the 00496 // TMLastStation and TMOneStation algorithms we actually use this huge number 00497 // to determine whether to consider y information at all. 00498 case reco::Muon::TMLastStationLoose: 00499 return isGoodMuon(muon,TMLastStation,2,3,3,1E9,1E9,-3,-3,reco::Muon::SegmentAndTrackArbitration); 00500 break; 00501 case reco::Muon::TMLastStationTight: 00502 return isGoodMuon(muon,TMLastStation,2,3,3,3,3,-3,-3,reco::Muon::SegmentAndTrackArbitration); 00503 break; 00504 case reco::Muon::TMOneStationLoose: 00505 return isGoodMuon(muon,TMOneStation,1,3,3,1E9,1E9,1E9,1E9,reco::Muon::SegmentAndTrackArbitration); 00506 break; 00507 case reco::Muon::TMOneStationTight: 00508 return isGoodMuon(muon,TMOneStation,1,3,3,3,3,1E9,1E9,reco::Muon::SegmentAndTrackArbitration); 00509 break; 00510 case reco::Muon::TMLastStationOptimizedLowPtLoose: 00511 if (muon.pt() < 8. && fabs(muon.eta()) < 1.2) 00512 return isGoodMuon(muon,TMOneStation,1,3,3,1E9,1E9,1E9,1E9,reco::Muon::SegmentAndTrackArbitration); 00513 else 00514 return isGoodMuon(muon,TMLastStation,2,3,3,1E9,1E9,-3,-3,reco::Muon::SegmentAndTrackArbitration); 00515 break; 00516 case reco::Muon::TMLastStationOptimizedLowPtTight: 00517 if (muon.pt() < 8. && fabs(muon.eta()) < 1.2) 00518 return isGoodMuon(muon,TMOneStation,1,3,3,3,3,1E9,1E9,reco::Muon::SegmentAndTrackArbitration); 00519 else 00520 return isGoodMuon(muon,TMLastStation,2,3,3,3,3,-3,-3,reco::Muon::SegmentAndTrackArbitration); 00521 break; 00522 //compatibility loose 00523 case reco::Muon::TM2DCompatibilityLoose: 00524 return isGoodMuon(muon,TM2DCompatibility,0.7); 00525 break; 00526 //compatibility tight 00527 case reco::Muon::TM2DCompatibilityTight: 00528 return isGoodMuon(muon,TM2DCompatibility,1.0); 00529 break; 00530 default: 00531 return false; 00532 } 00533 }
unsigned int muon::RequiredStationMask | ( | const reco::Muon & | muon, | |
double | maxChamberDist, | |||
double | maxChamberDistPull, | |||
reco::Muon::ArbitrationType | arbitrationType | |||
) |
Definition at line 4 of file MuonSelectors.cc.
References reco::Muon::trackDist(), and reco::Muon::trackDistErr().
Referenced by isGoodMuon().
00008 { 00009 unsigned int theMask = 0; 00010 00011 for(int stationIdx = 1; stationIdx < 5; ++stationIdx) 00012 for(int detectorIdx = 1; detectorIdx < 3; ++detectorIdx) 00013 if(muon.trackDist(stationIdx,detectorIdx,arbitrationType) < maxChamberDist && 00014 muon.trackDist(stationIdx,detectorIdx,arbitrationType)/muon.trackDistErr(stationIdx,detectorIdx,arbitrationType) < maxChamberDistPull) 00015 theMask += 1<<((stationIdx-1)+4*(detectorIdx-1)); 00016 00017 return theMask; 00018 }
float muon::segmentCompatibility | ( | const reco::Muon & | muon | ) |
Definition at line 26 of file MuonSelectors.cc.
References reco::Muon::dX(), reco::Muon::dY(), i, reco::Muon::pullX(), reco::Muon::pullY(), reco::Muon::segmentX(), and reco::Muon::trackDist().
Referenced by isGoodMuon(), PFRecoTauDiscriminationAgainstMuon::produce(), reco::Muon::segmentCompatibility(), and VisMuonTwig::update().
00026 { 00027 bool use_weight_regain_at_chamber_boundary = true; 00028 bool use_match_dist_penalty = true; 00029 00030 int nr_of_stations_crossed = 0; 00031 int nr_of_stations_with_segment = 0; 00032 std::vector<int> stations_w_track(8); 00033 std::vector<int> station_has_segmentmatch(8); 00034 std::vector<int> station_was_crossed(8); 00035 std::vector<float> stations_w_track_at_boundary(8); 00036 std::vector<float> station_weight(8); 00037 int position_in_stations = 0; 00038 float full_weight = 0.; 00039 00040 for(int i = 1; i<=8; ++i) { 00041 // ********************************************************; 00042 // *** fill local info for this muon (do some counting) ***; 00043 // ************** begin ***********************************; 00044 if(i<=4) { // this is the section for the DTs 00045 if( muon.trackDist(i,1) < 999999 ) { //current "raw" info that a track is close to a chamber 00046 ++nr_of_stations_crossed; 00047 station_was_crossed[i-1] = 1; 00048 if(muon.trackDist(i,1) > -10. ) stations_w_track_at_boundary[i-1] = muon.trackDist(i,1); 00049 else stations_w_track_at_boundary[i-1] = 0.; 00050 } 00051 if( muon.segmentX(i,1) < 999999 ) { //current "raw" info that a segment is matched to the current track 00052 ++nr_of_stations_with_segment; 00053 station_has_segmentmatch[i-1] = 1; 00054 } 00055 } 00056 else { // this is the section for the CSCs 00057 if( muon.trackDist(i-4,2) < 999999 ) { //current "raw" info that a track is close to a chamber 00058 ++nr_of_stations_crossed; 00059 station_was_crossed[i-1] = 1; 00060 if(muon.trackDist(i-4,2) > -10. ) stations_w_track_at_boundary[i-1] = muon.trackDist(i-4,2); 00061 else stations_w_track_at_boundary[i-1] = 0.; 00062 } 00063 if( muon.segmentX(i-4,2) < 999999 ) { //current "raw" info that a segment is matched to the current track 00064 ++nr_of_stations_with_segment; 00065 station_has_segmentmatch[i-1] = 1; 00066 } 00067 } 00068 // rough estimation of chamber border efficiency (should be parametrized better, this is just a quick guess): 00069 // TF1 * merf = new TF1("merf","-0.5*(TMath::Erf(x/6.)-1)",-100,100); 00070 // use above value to "unpunish" missing segment if close to border, i.e. rather than not adding any weight, add 00071 // the one from the function. Only for dist ~> -10 cm, else full punish!. 00072 00073 // ********************************************************; 00074 // *** fill local info for this muon (do some counting) ***; 00075 // ************** end *************************************; 00076 } 00077 00078 // ********************************************************; 00079 // *** calculate weights for each station *****************; 00080 // ************** begin ***********************************; 00081 // const float slope = 0.5; 00082 // const float attenuate_weight_regain = 1.; 00083 // if attenuate_weight_regain < 1., additional punishment if track is close to boundary and no segment 00084 const float attenuate_weight_regain = 0.5; 00085 00086 for(int i = 1; i<=8; ++i) { // loop over all possible stations 00087 00088 // first set all weights if a station has been crossed 00089 // later penalize if a station did not have a matching segment 00090 00091 //old logic if(station_has_segmentmatch[i-1] > 0 ) { // the track has an associated segment at the current station 00092 if( station_was_crossed[i-1] > 0 ) { // the track crossed this chamber (or was nearby) 00093 // - Apply a weight depending on the "depth" of the muon passage. 00094 // - The station_weight is later reduced for stations with badly matched segments. 00095 // - Even if there is no segment but the track passes close to a chamber boundary, the 00096 // weight is set non zero and can go up to 0.5 of the full weight if the track is quite 00097 // far from any station. 00098 ++position_in_stations; 00099 00100 switch ( nr_of_stations_crossed ) { // define different weights depending on how many stations were crossed 00101 case 1 : 00102 station_weight[i-1] = 1.; 00103 break; 00104 case 2 : 00105 if ( position_in_stations == 1 ) station_weight[i-1] = 0.33; 00106 else station_weight[i-1] = 0.67; 00107 break; 00108 case 3 : 00109 if ( position_in_stations == 1 ) station_weight[i-1] = 0.23; 00110 else if( position_in_stations == 2 ) station_weight[i-1] = 0.33; 00111 else station_weight[i-1] = 0.44; 00112 break; 00113 case 4 : 00114 if ( position_in_stations == 1 ) station_weight[i-1] = 0.10; 00115 else if( position_in_stations == 2 ) station_weight[i-1] = 0.20; 00116 else if( position_in_stations == 3 ) station_weight[i-1] = 0.30; 00117 else station_weight[i-1] = 0.40; 00118 break; 00119 00120 default : 00121 // LogTrace("MuonIdentification")<<" // Message: A muon candidate track has more than 4 stations with matching segments."; 00122 // LogTrace("MuonIdentification")<<" // Did not expect this - please let me know: ibloch@fnal.gov"; 00123 // for all other cases 00124 station_weight[i-1] = 1./nr_of_stations_crossed; 00125 } 00126 00127 if( use_weight_regain_at_chamber_boundary ) { // reconstitute some weight if there is no match but the segment is close to a boundary: 00128 if(station_has_segmentmatch[i-1] <= 0 && stations_w_track_at_boundary[i-1] != 0. ) { 00129 // if segment is not present but track in inefficient region, do not count as "missing match" but add some reduced weight. 00130 // original "match weight" is currently reduced by at least attenuate_weight_regain, variing with an error function down to 0 if the track is 00131 // inside the chamber. 00132 station_weight[i-1] = station_weight[i-1]*attenuate_weight_regain*0.5*(TMath::Erf(stations_w_track_at_boundary[i-1]/6.)+1.); // remark: the additional scale of 0.5 normalizes Err to run from 0 to 1 in y 00133 } 00134 else if(station_has_segmentmatch[i-1] <= 0 && stations_w_track_at_boundary[i-1] == 0.) { // no segment match and track well inside chamber 00135 // full penalization 00136 station_weight[i-1] = 0.; 00137 } 00138 } 00139 else { // always fully penalize tracks with no matching segment, whether the segment is close to the boundary or not. 00140 if(station_has_segmentmatch[i-1] <= 0) station_weight[i-1] = 0.; 00141 } 00142 00143 if( station_has_segmentmatch[i-1] > 0 && 42 == 42 ) { // if track has matching segment, but the matching is not high quality, penalize 00144 if(i<=4) { // we are in the DTs 00145 if( muon.dY(i,1) < 999999 && muon.dX(i,1) < 999999) { // have both X and Y match 00146 if( 00147 TMath::Sqrt(TMath::Power(muon.pullX(i,1),2.)+TMath::Power(muon.pullY(i,1),2.))> 1. ) { 00148 // reduce weight 00149 if(use_match_dist_penalty) { 00150 // only use pull if 3 sigma is not smaller than 3 cm 00151 if(TMath::Sqrt(TMath::Power(muon.dX(i,1),2.)+TMath::Power(muon.dY(i,1),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.pullX(i,1),2.)+TMath::Power(muon.pullY(i,1),2.)) > 3. ) { 00152 station_weight[i-1] *= 1./TMath::Power( 00153 TMath::Max((double)TMath::Sqrt(TMath::Power(muon.dX(i,1),2.)+TMath::Power(muon.dY(i,1),2.)),(double)1.),.25); 00154 } 00155 else { 00156 station_weight[i-1] *= 1./TMath::Power( 00157 TMath::Sqrt(TMath::Power(muon.pullX(i,1),2.)+TMath::Power(muon.pullY(i,1),2.)),.25); 00158 } 00159 } 00160 } 00161 } 00162 else if (muon.dY(i,1) >= 999999) { // has no match in Y 00163 if( muon.pullX(i,1) > 1. ) { // has a match in X. Pull larger that 1 to avoid increasing the weight (just penalize, don't anti-penalize) 00164 // reduce weight 00165 if(use_match_dist_penalty) { 00166 // only use pull if 3 sigma is not smaller than 3 cm 00167 if( muon.dX(i,1) < 3. && muon.pullX(i,1) > 3. ) { 00168 station_weight[i-1] *= 1./TMath::Power(TMath::Max((double)muon.dX(i,1),(double)1.),.25); 00169 } 00170 else { 00171 station_weight[i-1] *= 1./TMath::Power(muon.pullX(i,1),.25); 00172 } 00173 } 00174 } 00175 } 00176 else { // has no match in X 00177 if( muon.pullY(i,1) > 1. ) { // has a match in Y. Pull larger that 1 to avoid increasing the weight (just penalize, don't anti-penalize) 00178 // reduce weight 00179 if(use_match_dist_penalty) { 00180 // only use pull if 3 sigma is not smaller than 3 cm 00181 if( muon.dY(i,1) < 3. && muon.pullY(i,1) > 3. ) { 00182 station_weight[i-1] *= 1./TMath::Power(TMath::Max((double)muon.dY(i,1),(double)1.),.25); 00183 } 00184 else { 00185 station_weight[i-1] *= 1./TMath::Power(muon.pullY(i,1),.25); 00186 } 00187 } 00188 } 00189 } 00190 } 00191 else { // We are in the CSCs 00192 if( 00193 TMath::Sqrt(TMath::Power(muon.pullX(i-4,2),2.)+TMath::Power(muon.pullY(i-4,2),2.)) > 1. ) { 00194 // reduce weight 00195 if(use_match_dist_penalty) { 00196 // only use pull if 3 sigma is not smaller than 3 cm 00197 if(TMath::Sqrt(TMath::Power(muon.dX(i-4,2),2.)+TMath::Power(muon.dY(i-4,2),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.pullX(i-4,2),2.)+TMath::Power(muon.pullY(i-4,2),2.)) > 3. ) { 00198 station_weight[i-1] *= 1./TMath::Power( 00199 TMath::Max((double)TMath::Sqrt(TMath::Power(muon.dX(i-4,2),2.)+TMath::Power(muon.dY(i-4,2),2.)),(double)1.),.25); 00200 } 00201 else { 00202 station_weight[i-1] *= 1./TMath::Power( 00203 TMath::Sqrt(TMath::Power(muon.pullX(i-4,2),2.)+TMath::Power(muon.pullY(i-4,2),2.)),.25); 00204 } 00205 } 00206 } 00207 } 00208 } 00209 00210 // Thoughts: 00211 // - should penalize if the segment has only x OR y info 00212 // - should also use the segment direction, as it now works! 00213 00214 } 00215 else { // track did not pass a chamber in this station - just reset weight 00216 station_weight[i-1] = 0.; 00217 } 00218 00219 //increment final weight for muon: 00220 full_weight += station_weight[i-1]; 00221 } 00222 00223 // if we don't expect any matches, we set the compatibility to 00224 // 0.5 as the track is as compatible with a muon as it is with 00225 // background - we should maybe rather set it to -0.5! 00226 if( nr_of_stations_crossed == 0 ) { 00227 // full_weight = attenuate_weight_regain*0.5; 00228 full_weight = 0.5; 00229 } 00230 00231 // ********************************************************; 00232 // *** calculate weights for each station *****************; 00233 // ************** end *************************************; 00234 00235 return full_weight; 00236 00237 }
reco::TrackRef muon::tevOptimized | ( | const reco::Muon & | muon, | |
const reco::TrackToTrackMap | tevMap1, | |||
const reco::TrackToTrackMap | tevMap2, | |||
const reco::TrackToTrackMap | tevMap3 | |||
) |
Definition at line 123 of file MuonCocktails.cc.
References reco::Muon::combinedMuon(), tevOptimized(), and reco::Muon::track().
00126 { 00127 return muon::tevOptimized(muon.combinedMuon(), muon.track(), 00128 tevMap1, tevMap2, tevMap3); 00129 }
reco::TrackRef muon::tevOptimized | ( | const reco::TrackRef & | combinedTrack, | |
const reco::TrackRef & | trackerTrack, | |||
const reco::TrackToTrackMap | tevMap1, | |||
const reco::TrackToTrackMap | tevMap2, | |||
const reco::TrackToTrackMap | tevMap3 | |||
) |
Referenced by tevOptimized().
reco::TrackRef muon::tevOptimizedOld | ( | const reco::Muon & | muon, | |
const reco::TrackToTrackMap | tevMap1, | |||
const reco::TrackToTrackMap | tevMap2, | |||
const reco::TrackToTrackMap | tevMap3 | |||
) |
Definition at line 134 of file MuonCocktails.cc.
References reco::Muon::combinedMuon(), tevOptimizedOld(), and reco::Muon::track().
00137 { 00138 return muon::tevOptimizedOld(muon.combinedMuon(), muon.track(), 00139 tevMap1, tevMap2, tevMap3); 00140 }
reco::TrackRef muon::tevOptimizedOld | ( | const reco::TrackRef & | combinedTrack, | |
const reco::TrackRef & | trackerTrack, | |||
const reco::TrackToTrackMap | tevMap1, | |||
const reco::TrackToTrackMap | tevMap2, | |||
const reco::TrackToTrackMap | tevMap3 | |||
) |
Referenced by tevOptimizedOld().
double muon::trackProbability | ( | const reco::TrackRef | track | ) |
Referenced by HistogramProbabilityEstimator::probability().