28 inputCollection_(iConfig.getParameter<edm::InputTag>(
"InputCollection")),inputLinksCollection_(iConfig.getParameter<edm::InputTag>(
"InputLinksCollection")),theService(0),theGlbRefitter(0),theGlbMatcher(0)
42 double maxChi2 = iConfig.
getParameter<
double>(
"MaxChi2");
49 produces<edm::ValueMap<reco::MuonQuality> >();
62 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
84 std::vector<reco::MuonQuality> valuesQual;
85 valuesQual.reserve(glbMuons->size());
88 for (reco::TrackCollection::const_iterator track = glbMuons->begin(); track!=glbMuons->end(); ++track , ++trackIndex) {
94 LogTrace(theCategory)<<
"GLBQual N refitted " << refitted.size();
96 std::pair<double,double> thisKink;
97 double relative_muon_chi2 = 0.0;
98 double relative_tracker_chi2 = 0.0;
99 double glbTrackProbability = 0.0;
100 if(refitted.size()>0) {
101 thisKink =
kink(refitted.front()) ;
102 std::pair<double,double> chi =
newChi2(refitted.front());
103 relative_muon_chi2 = chi.second;
104 relative_tracker_chi2 = chi.first;
108 LogTrace(theCategory)<<
"GLBQual: Kink " << thisKink.first <<
" " << thisKink.second;
109 LogTrace(theCategory)<<
"GLBQual: Rel Chi2 " << relative_tracker_chi2 <<
" " << relative_muon_chi2;
110 LogTrace(theCategory)<<
"GLBQual: trackProbability " << glbTrackProbability;
113 float chi2, d, dist, Rpos;
114 chi2 = d = dist = Rpos = -1.0;
115 bool passTight =
false;
117 if ( linkCollectionHandle.
isValid() ) {
118 for ( reco::MuonTrackLinksCollection::const_iterator
links = linkCollectionHandle->begin();
119 links != linkCollectionHandle->end(); ++
links )
121 if (
links->trackerTrack().isNull() ||
122 links->standAloneTrack().isNull() ||
123 links->globalTrack().isNull() )
125 edm::LogWarning(theCategory) <<
"Global muon links to constituent tracks are invalid. There should be no such object. Muon is skipped.";
128 if (
links->globalTrack() == glbRef) {
130 TrackCand staCand = TrackCand((
Trajectory*)(0),
links->standAloneTrack());
146 muQual.
trkKink = thisKink.first > maxFloat01 ? maxFloat01 : thisKink.first;
147 muQual.
glbKink = thisKink.second > maxFloat01 ? maxFloat01 : thisKink.second;
148 muQual.
trkRelChi2 = relative_tracker_chi2 > maxFloat01 ? maxFloat01 : relative_tracker_chi2;
149 muQual.
staRelChi2 = relative_muon_chi2 > maxFloat01 ? maxFloat01 : relative_muon_chi2;
156 valuesQual.push_back(muQual);
168 fillerQual.
insert(glbMuons, valuesQual.begin(), valuesQual.end());
177 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
181 using namespace reco;
184 double resultGlb = 0.0;
189 typedef std::vector<TrajectoryMeasurement>::const_iterator TMI;
192 vector<TrajectoryMeasurement> meas = muon.
measurements();
194 for ( TMI
m = meas.begin();
m != meas.end();
m++ ) {
199 RecHit rhit = (*m).recHit();
201 if ( rhit->isValid() ) {
210 if ( tsos.
isValid() && rhit->isValid() && rhit->hit()->isValid()
217 if ( phi1 < 0 ) phi1 = 2*
M_PI + phi1;
219 double phi2 = rhit->globalPosition().phi();
220 if ( phi2 < 0 ) phi2 = 2*
M_PI + phi2;
222 double diff = fabs(phi1 - phi2);
231 double s = ( error > 0.0 ) ? (diff*diff)/error : (diff*
diff);
240 return std::pair<double,double>(
result,resultGlb);
245 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
249 using namespace reco;
253 unsigned int muNdof = 0;
254 unsigned int tkNdof = 0;
258 typedef vector<TrajectoryMeasurement>::const_iterator TMI;
260 vector<TrajectoryMeasurement> meas = muon.
measurements();
262 for ( TMI
m = meas.begin();
m != meas.end();
m++ ) {
267 auto preciseHit = hit;
268 double estimate = 0.0;
269 if (preciseHit->isValid() && uptsos.
isValid()) {
276 if ( hit->isValid() && (hit->geographicalId().det()) ==
DetId::Tracker ) {
279 tkNdof += hit->dimension();
281 if ( hit->isValid() && (hit->geographicalId().det()) ==
DetId::Muon ) {
284 muNdof += hit->dimension();
288 if (tkNdof < 6 ) tkChi2 = tkChi2;
289 else tkChi2 /= (tkNdof-5.);
291 if (muNdof < 6 ) muChi2 = muChi2;
292 else muChi2 /= (muNdof-5.);
294 return std::pair<double,double>(tkChi2,muChi2);
void update(const edm::EventSetup &setup)
update the services each event
float chi2LocalPosition
chi2 value for the STA-TK matching of local position
T getParameter(std::string const &) const
GlobalMuonRefitter * theGlbRefitter
const edm::EventSetup & eventSetup() const
get the whole EventSetup
MuonServiceProxy * theService
float chi2LocalMomentum
chi2 value for the STA-TK matching of local momentum
std::pair< const Trajectory *, reco::TrackRef > TrackCand
bool getByToken(EDGetToken token, Handle< PROD > &result) const
bool updatedSta
bool returns true if standAloneMuon_updatedAtVtx was used in the fit
float glbKink
value of the kink algorithm applied to the global track
float LnChiSquaredProbability(double chiSquared, double nrDOF)
edm::EDGetTokenT< reco::TrackCollection > glbMuonsToken
bool matchTight(const TrackCand &sta, const TrackCand &track) const
check if two tracks are compatible (less than Chi2Cut, DeltaDCut, DeltaRCut)
Geom::Phi< T > phi() const
float glbTrackProbability
the tail probability (-ln(P)) of the global fit
void insert(const H &h, I begin, I end)
virtual void produce(edm::Event &, const edm::EventSetup &) override
GlobalPoint globalPosition() const
void setServices(const edm::EventSetup &)
set the services needed by the TrackTransformer
float trkKink
value of the kink algorithm applied to the inner track stub
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
virtual std::pair< double, double > newChi2(Trajectory &muon) const
virtual double trackProbability(Trajectory &track) const
T phierr(const GlobalPoint &aPoint) const
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
virtual std::pair< double, double > kink(Trajectory &muon) const
DataContainer const & measurements() const
bool isNull() const
Checks for null.
bool tightMatch
if the STA-TK matching passed the tighter matching criteria
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
edm::InputTag inputCollection_
float globalDeltaEtaPhi
global delta-Eta-Phi of STA-TK matching
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
double match(const TrackCand &sta, const TrackCand &track, int matchOption=0, int surfaceOption=1) const
tuple Chi2MeasurementEstimator
MeasurementEstimator * theEstimator
edm::InputTag inputLinksCollection_
virtual void setEvent(const edm::Event &)
pass the Event to the algo at each event
float staRelChi2
chi2 value for the outer track stub with respect to the global track
int ndof(bool bon=true) const
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
T const * product() const
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken
tuple GlobalMuonTrackMatcher
float localDistance
local distance seperation for STA-TK TSOS matching on same surface
GlobalMuonTrackMatcher * theGlbMatcher
virtual ~GlobalTrackQualityProducer()
ProductID id() const
Accessor for product ID.
Provenance getProvenance(BranchID const &theID) const
std::vector< Trajectory > refit(const reco::Track &globalTrack, const int theMuonHitsOption, const TrackerTopology *tTopo) const
build combined trajectory from sta Track and tracker RecHits
GlobalTrackQualityProducer(const edm::ParameterSet &iConfig)