33 inputCollection_(iConfig.getParameter<edm::InputTag>(
"InputCollection")),inputLinksCollection_(iConfig.getParameter<edm::InputTag>(
"InputLinksCollection")),theService(0),theGlbRefitter(0),theGlbMatcher(0)
46 double maxChi2 = iConfig.
getParameter<
double>(
"MaxChi2");
50 produces<edm::ValueMap<reco::MuonQuality> >();
63 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
85 std::vector<reco::MuonQuality> valuesQual;
86 valuesQual.reserve(glbMuons->size());
89 for (reco::TrackCollection::const_iterator track = glbMuons->begin(); track!=glbMuons->end(); ++track , ++trackIndex) {
95 LogTrace(theCategory)<<
"GLBQual N refitted " << refitted.size();
97 std::pair<double,double> thisKink;
98 double relative_muon_chi2 = 0.0;
99 double relative_tracker_chi2 = 0.0;
100 double glbTrackProbability = 0.0;
101 if(refitted.size()>0) {
102 thisKink =
kink(refitted.front()) ;
103 std::pair<double,double> chi =
newChi2(refitted.front());
104 relative_muon_chi2 = chi.second;
105 relative_tracker_chi2 = chi.first;
109 LogTrace(theCategory)<<
"GLBQual: Kink " << thisKink.first <<
" " << thisKink.second;
110 LogTrace(theCategory)<<
"GLBQual: Rel Chi2 " << relative_tracker_chi2 <<
" " << relative_muon_chi2;
111 LogTrace(theCategory)<<
"GLBQual: trackProbability " << glbTrackProbability;
114 float chi2, d, dist, Rpos;
115 chi2 = d = dist = Rpos = -1.0;
116 bool passTight =
false;
118 if ( linkCollectionHandle.
isValid() ) {
119 for ( reco::MuonTrackLinksCollection::const_iterator
links = linkCollectionHandle->begin();
120 links != linkCollectionHandle->end(); ++
links )
122 if (
links->trackerTrack().isNull() ||
123 links->standAloneTrack().isNull() ||
124 links->globalTrack().isNull() )
126 edm::LogWarning(theCategory) <<
"Global muon links to constituent tracks are invalid. There should be no such object. Muon is skipped.";
129 if (
links->globalTrack() == glbRef) {
131 TrackCand staCand = TrackCand((
Trajectory*)(0),
links->standAloneTrack());
147 muQual.
trkKink = thisKink.first > maxFloat01 ? maxFloat01 : thisKink.first;
148 muQual.
glbKink = thisKink.second > maxFloat01 ? maxFloat01 : thisKink.second;
149 muQual.
trkRelChi2 = relative_tracker_chi2 > maxFloat01 ? maxFloat01 : relative_tracker_chi2;
150 muQual.
staRelChi2 = relative_muon_chi2 > maxFloat01 ? maxFloat01 : relative_muon_chi2;
157 valuesQual.push_back(muQual);
169 fillerQual.
insert(glbMuons, valuesQual.begin(), valuesQual.end());
178 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
182 using namespace reco;
185 double resultGlb = 0.0;
190 typedef std::vector<TrajectoryMeasurement>::const_iterator TMI;
193 vector<TrajectoryMeasurement> meas = muon.
measurements();
195 for ( TMI
m = meas.begin();
m != meas.end();
m++ ) {
200 RecHit rhit = (*m).recHit();
202 if ( rhit->isValid() ) {
211 if ( tsos.
isValid() && rhit->isValid() && rhit->hit()->isValid()
218 if ( phi1 < 0 ) phi1 = 2*
M_PI + phi1;
220 double phi2 = rhit->globalPosition().phi();
221 if ( phi2 < 0 ) phi2 = 2*
M_PI + phi2;
223 double diff = fabs(phi1 - phi2);
232 double s = ( error > 0.0 ) ? (diff*diff)/error : (diff*
diff);
241 return std::pair<double,double>(
result,resultGlb);
246 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
250 using namespace reco;
254 unsigned int muNdof = 0;
255 unsigned int tkNdof = 0;
259 typedef vector<TrajectoryMeasurement>::const_iterator TMI;
261 vector<TrajectoryMeasurement> meas = muon.
measurements();
263 for ( TMI
m = meas.begin();
m != meas.end();
m++ ) {
267 double estimate = 0.0;
268 if (preciseHit->isValid() && uptsos.
isValid()) {
275 if ( hit->isValid() && (hit->geographicalId().det()) ==
DetId::Tracker ) {
278 tkNdof += hit->dimension();
280 if ( hit->isValid() && (hit->geographicalId().det()) ==
DetId::Muon ) {
283 muNdof += hit->dimension();
287 if (tkNdof < 6 ) tkChi2 = tkChi2;
288 else tkChi2 /= (tkNdof-5.);
290 if (muNdof < 6 ) muChi2 = muChi2;
291 else muChi2 /= (muNdof-5.);
293 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
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TransientTrackingRecHit &hit) const =0
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)
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)
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
const T & max(const T &a, const T &b)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
edm::InputTag inputCollection_
float globalDeltaEtaPhi
global delta-Eta-Phi of STA-TK matching
double match(const TrackCand &sta, const TrackCand &track, int matchOption=0, int surfaceOption=1) const
tuple Chi2MeasurementEstimator
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
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
tuple GlobalMuonTrackMatcher
float localDistance
local distance seperation for STA-TK TSOS matching on same surface
GlobalMuonTrackMatcher * theGlbMatcher
virtual ~GlobalTrackQualityProducer()
virtual void produce(edm::Event &, const edm::EventSetup &)
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
double chiSquared() const
GlobalTrackQualityProducer(const edm::ParameterSet &iConfig)