28 : inputCollection_(iConfig.getParameter<
edm::
InputTag>(
"InputCollection")),
29 inputLinksCollection_(iConfig.getParameter<
edm::
InputTag>(
"InputLinksCollection")),
52 produces<edm::ValueMap<reco::MuonQuality>>();
67 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
88 std::vector<reco::MuonQuality> valuesQual;
89 valuesQual.reserve(glbMuons->size());
92 for (reco::TrackCollection::const_iterator
track = glbMuons->begin();
track != glbMuons->end();
93 ++
track, ++trackIndex) {
99 LogTrace(theCategory) <<
"GLBQual N refitted " << refitted.size();
101 std::pair<double, double> thisKink;
102 double relative_muon_chi2 = 0.0;
103 double relative_tracker_chi2 = 0.0;
104 double glbTrackProbability = 0.0;
105 if (!refitted.empty()) {
106 thisKink =
kink(refitted.front());
107 std::pair<double, double> chi =
newChi2(refitted.front());
108 relative_muon_chi2 = chi.second;
109 relative_tracker_chi2 = chi.first;
113 LogTrace(theCategory) <<
"GLBQual: Kink " << thisKink.first <<
" " << thisKink.second;
114 LogTrace(theCategory) <<
"GLBQual: Rel Chi2 " << relative_tracker_chi2 <<
" " << relative_muon_chi2;
115 LogTrace(theCategory) <<
"GLBQual: trackProbability " << glbTrackProbability;
118 float chi2,
d, dist, Rpos;
119 chi2 = d = dist = Rpos = -1.0;
120 bool passTight =
false;
122 if (linkCollectionHandle.
isValid()) {
123 for (reco::MuonTrackLinksCollection::const_iterator
links = linkCollectionHandle->begin();
124 links != linkCollectionHandle->end();
126 if (
links->trackerTrack().isNull() ||
links->standAloneTrack().isNull() ||
links->globalTrack().isNull()) {
127 edm::LogWarning(theCategory) <<
"Global muon links to constituent tracks are invalid. There should be no " 128 "such object. Muon is skipped.";
131 if (
links->globalTrack() == glbRef) {
145 LogTrace(theCategory) <<
"GLBQual: Used UpdatedAtVtx : " 154 muQual.
trkKink = thisKink.first > maxFloat01 ? maxFloat01 : thisKink.first;
155 muQual.
glbKink = thisKink.second > maxFloat01 ? maxFloat01 : thisKink.second;
156 muQual.
trkRelChi2 = relative_tracker_chi2 > maxFloat01 ? maxFloat01 : relative_tracker_chi2;
157 muQual.
staRelChi2 = relative_muon_chi2 > maxFloat01 ? maxFloat01 : relative_muon_chi2;
164 valuesQual.push_back(muQual);
174 auto outQual = std::make_unique<edm::ValueMap<reco::MuonQuality>>();
176 fillerQual.insert(glbMuons, valuesQual.begin(), valuesQual.end());
184 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
188 using namespace reco;
191 double resultGlb = 0.0;
194 typedef ConstRecHitPointer RecHit;
195 typedef std::vector<TrajectoryMeasurement>::const_iterator TMI;
197 vector<TrajectoryMeasurement> meas = muon.
measurements();
199 for (TMI
m = meas.begin();
m != meas.end();
m++) {
204 RecHit rhit = (*m).recHit();
206 if (rhit->isValid()) {
215 if (tsos.
isValid() && rhit->isValid() && rhit->hit()->isValid() &&
221 phi1 = 2 *
M_PI + phi1;
223 double phi2 = rhit->globalPosition().phi();
225 phi2 = 2 *
M_PI + phi2;
227 double diff = fabs(phi1 - phi2);
237 double s = (error > 0.0) ? (diff *
diff) / error : (diff * diff);
245 return std::pair<double, double>(
result, resultGlb);
249 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
253 using namespace reco;
257 unsigned int muNdof = 0;
258 unsigned int tkNdof = 0;
261 typedef ConstRecHitPointer RecHit;
262 typedef vector<TrajectoryMeasurement>::const_iterator TMI;
264 vector<TrajectoryMeasurement> meas = muon.
measurements();
266 for (TMI
m = meas.begin();
m != meas.end();
m++) {
271 const auto& preciseHit = hit;
272 double estimate = 0.0;
273 if (preciseHit->isValid() && uptsos.
isValid()) {
280 if (hit->isValid() && (hit->geographicalId().det()) ==
DetId::Tracker) {
283 tkNdof += hit->dimension();
285 if (hit->isValid() && (hit->geographicalId().det()) ==
DetId::Muon) {
288 muNdof += hit->dimension();
295 tkChi2 /= (tkNdof - 5.);
301 muChi2 /= (muNdof - 5.);
304 return std::pair<double, double>(tkChi2, muChi2);
342 descGlbMuonRefitter.
add<
std::string>(
"Fitter",
"KFFitterForRefitInsideOut");
343 descGlbMuonRefitter.
add<
std::string>(
"Smoother",
"KFSmootherForRefitInsideOut");
344 descGlbMuonRefitter.
add<
std::string>(
"Propagator",
"SmartPropagatorAnyRK");
345 descGlbMuonRefitter.
add<
std::string>(
"TrackerRecHitBuilder",
"WithAngleAndTemplate");
346 descGlbMuonRefitter.
add<
std::string>(
"MuonRecHitBuilder",
"MuonRecHitBuilder");
347 descGlbMuonRefitter.
add<
bool>(
"DoPredictionsOnly",
false);
348 descGlbMuonRefitter.
add<
std::string>(
"RefitDirection",
"insideOut");
349 descGlbMuonRefitter.
add<
bool>(
"PropDirForCosmics",
false);
350 descGlbMuonRefitter.
add<
bool>(
"RefitRPCHits",
true);
352 descGlbMuonRefitter.
add<std::vector<int>>(
"DYTthrs", {10, 10});
353 descGlbMuonRefitter.
add<
int>(
"DYTselector", 1);
354 descGlbMuonRefitter.
add<
bool>(
"DYTupdator",
false);
355 descGlbMuonRefitter.
add<
bool>(
"DYTuseAPE",
false);
356 descGlbMuonRefitter.
add<
bool>(
"DYTuseThrsParametrization",
true);
359 descDYTthrs.
add<std::vector<double>>(
"eta0p8", {1, -0.919853, 0.990742});
360 descDYTthrs.
add<std::vector<double>>(
"eta1p2", {1, -0.897354, 0.987738});
361 descDYTthrs.
add<std::vector<double>>(
"eta2p0", {4, -0.986855, 0.998516});
362 descDYTthrs.
add<std::vector<double>>(
"eta2p2", {1, -0.940342, 0.992955});
363 descDYTthrs.
add<std::vector<double>>(
"eta2p4", {1, -0.947633, 0.993762});
367 descGlbMuonRefitter.
add<
int>(
"SkipStation", -1);
368 descGlbMuonRefitter.
add<
int>(
"TrackerSkipSystem", -1);
369 descGlbMuonRefitter.
add<
int>(
"TrackerSkipSection", -1);
370 descGlbMuonRefitter.
add<
bool>(
"RefitFlag",
true);
374 desc.
add<
double>(
"nSigma", 3.0);
375 desc.
add<
double>(
"MaxChi2", 100000.0);
377 descriptions.
add(
"globalTrackQualityProducer", desc);
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
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
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
void setAllowAnything()
allow any parameter label/value pairs
constexpr bool isNotFinite(T x)
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)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Geom::Phi< T > phi() const
float glbTrackProbability
the tail probability (-ln(P)) of the global fit
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
ProductID id() const
Accessor for product ID.
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 tightMatch
if the STA-TK matching passed the tighter matching criteria
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
edm::InputTag inputCollection_
float globalDeltaEtaPhi
global delta-Eta-Phi of STA-TK matching
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double match(const TrackCand &sta, const TrackCand &track, int matchOption=0, int surfaceOption=1) const
bool isNull() const
Checks for null.
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
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken
float localDistance
local distance seperation for STA-TK TSOS matching on same surface
GlobalMuonTrackMatcher * theGlbMatcher
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
~GlobalTrackQualityProducer() override
Provenance getProvenance(BranchID const &theID) const
T const * product() 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)