29 : inputCollection_(iConfig.getParameter<edm::
InputTag>(
"InputCollection")),
30 inputLinksCollection_(iConfig.getParameter<edm::
InputTag>(
"InputLinksCollection")),
33 theGlbRefitter(nullptr),
34 theGlbMatcher(nullptr) {
54 produces<edm::ValueMap<reco::MuonQuality>>();
69 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 : "
155 muQual.
trkKink = thisKink.first > maxFloat01 ? maxFloat01 : thisKink.first;
156 muQual.
glbKink = thisKink.second > maxFloat01 ? maxFloat01 : thisKink.second;
157 muQual.
trkRelChi2 = relative_tracker_chi2 > maxFloat01 ? maxFloat01 : relative_tracker_chi2;
158 muQual.
staRelChi2 = relative_muon_chi2 > maxFloat01 ? maxFloat01 : relative_muon_chi2;
165 valuesQual.push_back(muQual);
175 auto outQual = std::make_unique<edm::ValueMap<reco::MuonQuality>>();
177 fillerQual.insert(glbMuons, valuesQual.begin(), valuesQual.end());
185 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
189 using namespace reco;
192 double resultGlb = 0.0;
196 typedef std::vector<TrajectoryMeasurement>::const_iterator TMI;
198 vector<TrajectoryMeasurement> meas = muon.
measurements();
200 for (TMI
m = meas.begin();
m != meas.end();
m++) {
205 RecHit rhit = (*m).recHit();
207 if (rhit->isValid()) {
216 if (tsos.
isValid() && rhit->isValid() && rhit->hit()->isValid() &&
222 phi1 = 2 *
M_PI + phi1;
224 double phi2 = rhit->globalPosition().phi();
226 phi2 = 2 *
M_PI + phi2;
228 double diff = fabs(phi1 - phi2);
238 double s = (error > 0.0) ? (diff *
diff) / error : (diff * diff);
246 return std::pair<double, double>(
result, resultGlb);
250 const std::string theCategory =
"Muon|RecoMuon|GlobalTrackQualityProducer";
254 using namespace reco;
258 unsigned int muNdof = 0;
259 unsigned int tkNdof = 0;
263 typedef vector<TrajectoryMeasurement>::const_iterator TMI;
265 vector<TrajectoryMeasurement> meas = muon.
measurements();
267 for (TMI
m = meas.begin();
m != meas.end();
m++) {
272 const auto& preciseHit = hit;
273 double estimate = 0.0;
274 if (preciseHit->isValid() && uptsos.
isValid()) {
281 if (hit->isValid() && (hit->geographicalId().det()) ==
DetId::Tracker) {
284 tkNdof += hit->dimension();
286 if (hit->isValid() && (hit->geographicalId().det()) ==
DetId::Muon) {
289 muNdof += hit->dimension();
296 tkChi2 /= (tkNdof - 5.);
302 muChi2 /= (muNdof - 5.);
305 return std::pair<double, double>(tkChi2, muChi2);
343 descGlbMuonRefitter.
add<
std::string>(
"Fitter",
"KFFitterForRefitInsideOut");
344 descGlbMuonRefitter.
add<
std::string>(
"Smoother",
"KFSmootherForRefitInsideOut");
345 descGlbMuonRefitter.
add<
std::string>(
"Propagator",
"SmartPropagatorAnyRK");
346 descGlbMuonRefitter.
add<
std::string>(
"TrackerRecHitBuilder",
"WithAngleAndTemplate");
347 descGlbMuonRefitter.
add<
std::string>(
"MuonRecHitBuilder",
"MuonRecHitBuilder");
348 descGlbMuonRefitter.
add<
bool>(
"DoPredictionsOnly",
false);
349 descGlbMuonRefitter.
add<
std::string>(
"RefitDirection",
"insideOut");
350 descGlbMuonRefitter.
add<
bool>(
"PropDirForCosmics",
false);
351 descGlbMuonRefitter.
add<
bool>(
"RefitRPCHits",
true);
353 descGlbMuonRefitter.
add<std::vector<int>>(
"DYTthrs", {10, 10});
354 descGlbMuonRefitter.
add<
int>(
"DYTselector", 1);
355 descGlbMuonRefitter.
add<
bool>(
"DYTupdator",
false);
356 descGlbMuonRefitter.
add<
bool>(
"DYTuseAPE",
false);
357 descGlbMuonRefitter.
add<
bool>(
"DYTuseThrsParametrization",
true);
360 descDYTthrs.
add<std::vector<double>>(
"eta0p8", {1, -0.919853, 0.990742});
361 descDYTthrs.
add<std::vector<double>>(
"eta1p2", {1, -0.897354, 0.987738});
362 descDYTthrs.
add<std::vector<double>>(
"eta2p0", {4, -0.986855, 0.998516});
363 descDYTthrs.
add<std::vector<double>>(
"eta2p2", {1, -0.940342, 0.992955});
364 descDYTthrs.
add<std::vector<double>>(
"eta2p4", {1, -0.947633, 0.993762});
368 descGlbMuonRefitter.
add<
int>(
"SkipStation", -1);
369 descGlbMuonRefitter.
add<
int>(
"TrackerSkipSystem", -1);
370 descGlbMuonRefitter.
add<
int>(
"TrackerSkipSection", -1);
371 descGlbMuonRefitter.
add<
bool>(
"RefitFlag",
true);
375 desc.
add<
double>(
"nSigma", 3.0);
376 desc.
add<
double>(
"MaxChi2", 100000.0);
378 descriptions.
add(
"globalTrackQualityProducer", desc);
float chi2LocalPosition
chi2 value for the STA-TK matching of local position
GlobalMuonRefitter * theGlbRefitter
const edm::EventSetup & eventSetup() const
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
bool getData(T &iHolder) const
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_
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
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)
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
T getParameter(std::string const &) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken
tuple GlobalMuonTrackMatcher
float localDistance
local distance seperation for STA-TK TSOS matching on same surface
GlobalMuonTrackMatcher * theGlbMatcher
void update(const edm::EventSetup &setup, bool duringEvent=true)
update the services each event
Log< level::Warning, false > LogWarning
~GlobalTrackQualityProducer() override
StableProvenance const & getStableProvenance(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)
tuple Chi2MeasurementEstimator