28 : inputCollection_(iConfig.getParameter<
edm::
InputTag>(
"InputCollection")),
29 inputLinksCollection_(iConfig.getParameter<
edm::
InputTag>(
"InputLinksCollection")),
32 theGlbRefitter(nullptr),
33 theGlbMatcher(nullptr) {
53 produces<edm::ValueMap<reco::MuonQuality>>();
68 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
87 std::vector<reco::MuonQuality> valuesQual;
88 valuesQual.reserve(glbMuons->size());
91 for (reco::TrackCollection::const_iterator
track = glbMuons->begin();
track != glbMuons->end();
92 ++
track, ++trackIndex) {
98 LogTrace(theCategory) <<
"GLBQual N refitted " << refitted.size();
100 std::pair<double, double> thisKink;
101 double relative_muon_chi2 = 0.0;
102 double relative_tracker_chi2 = 0.0;
103 double glbTrackProbability = 0.0;
104 if (!refitted.empty()) {
105 thisKink =
kink(refitted.front());
106 std::pair<double, double> chi =
newChi2(refitted.front());
107 relative_muon_chi2 = chi.second;
108 relative_tracker_chi2 = chi.first;
112 LogTrace(theCategory) <<
"GLBQual: Kink " << thisKink.first <<
" " << thisKink.second;
113 LogTrace(theCategory) <<
"GLBQual: Rel Chi2 " << relative_tracker_chi2 <<
" " << relative_muon_chi2;
114 LogTrace(theCategory) <<
"GLBQual: trackProbability " << glbTrackProbability;
117 float chi2,
d, dist, Rpos;
118 chi2 =
d = dist = Rpos = -1.0;
119 bool passTight =
false;
121 if (linkCollectionHandle.
isValid()) {
122 for (reco::MuonTrackLinksCollection::const_iterator
links = linkCollectionHandle->begin();
123 links != linkCollectionHandle->end();
125 if (
links->trackerTrack().isNull() ||
links->standAloneTrack().isNull() ||
links->globalTrack().isNull()) {
126 edm::LogWarning(theCategory) <<
"Global muon links to constituent tracks are invalid. There should be no " 127 "such object. Muon is skipped.";
130 if (
links->globalTrack() == glbRef) {
144 LogTrace(theCategory) <<
"GLBQual: Used UpdatedAtVtx : " 145 << (
iEvent.getStableProvenance(staTrack.
id()).productInstanceName() ==
153 iEvent.getStableProvenance(staTrack.
id()).productInstanceName() ==
std::string(
"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;
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);
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;
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()) {
283 tkNdof +=
hit->dimension();
288 muNdof +=
hit->dimension();
295 tkChi2 /= (tkNdof - 5.);
301 muChi2 /= (muNdof - 5.);
304 return std::pair<double, double>(tkChi2, muChi2);
311 if (
track.ndof() > 0 &&
track.chiSquared() > 0) {
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);
float chi2LocalPosition
chi2 value for the STA-TK matching of local position
GlobalMuonRefitter * theGlbRefitter
T getParameter(std::string const &) const
MuonServiceProxy * theService
ProductID id() const
Accessor for product ID.
float chi2LocalMomentum
chi2 value for the STA-TK matching of local momentum
std::pair< const Trajectory *, reco::TrackRef > TrackCand
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
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
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
T phierr(const GlobalPoint &aPoint) const
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
bool tightMatch
if the STA-TK matching passed the tighter matching criteria
GlobalPoint globalPosition() const
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
edm::InputTag inputCollection_
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
bool matchTight(const TrackCand &sta, const TrackCand &track) const
check if two tracks are compatible (less than Chi2Cut, DeltaDCut, DeltaRCut)
bool getData(T &iHolder) const
float globalDeltaEtaPhi
global delta-Eta-Phi of STA-TK matching
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isNull() const
Checks for null.
double match(const TrackCand &sta, const TrackCand &track, int matchOption=0, int surfaceOption=1) const
virtual std::pair< double, double > newChi2(Trajectory &muon) 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
virtual double trackProbability(Trajectory &track) 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
std::vector< Trajectory > refit(const reco::Track &globalTrack, const int theMuonHitsOption, const TrackerTopology *tTopo) const
build combined trajectory from sta Track and tracker RecHits
void update(const edm::EventSetup &setup, bool duringEvent=true)
update the services each event
const edm::EventSetup & eventSetup() const
virtual std::pair< double, double > kink(Trajectory &muon) const
Log< level::Warning, false > LogWarning
~GlobalTrackQualityProducer() override
GlobalTrackQualityProducer(const edm::ParameterSet &iConfig)