31 template<
typename T,
typename Comp>
33 for (
int i=2;
i>=0; --
i) {
34 if (
comp(val,cuts[
i]) )
return mvaVal[
i];
42 return (tk.
pt() != 0. ? float(tk.
ptError())/
float(tk.
pt()) : 9999999.);
49 inline int n3DLayers(
reco::Track const & tk,
bool isHLT) {
61 if (thit.isMatched()) count3D++;
84 inline void dzCut_par1(
reco::Track const & trk,
int & nLayers,
const float * par,
const int *
exp,
float dzCut[]) {
86 for (
int i=2;
i>=0; --
i) {
87 dzCut[
i] = powN(par[
i]*nLayers,exp[
i])*dzE;
90 inline void drCut_par1(
reco::Track const & trk,
int & nLayers,
const float * par,
const int * exp,
float drCut[]) {
92 for (
int i=2;
i>=0; --
i) {
93 drCut[
i] = powN(par[
i]*nLayers,exp[
i])*drE;
97 inline void dzCut_par2(
reco::Track const & trk,
int & nLayers,
const float * par,
const int * exp,
const float * d0err,
const float * d0err_par,
float dzCut[]) {
98 float pt = float(trk.
pt());
99 float p = float(trk.
p());
101 for (
int i=2;
i>=0; --
i) {
103 float nomd0E =
sqrt(d0err[
i]*d0err[
i]+(d0err_par[
i]/pt)*(d0err_par[
i]/pt));
105 float nomdzE = nomd0E*(p/
pt);
107 dzCut[
i] = powN(par[
i]*nLayers,exp[
i])*nomdzE;
110 inline void drCut_par2(
reco::Track const & trk,
int & nLayers,
const float* par,
const int * exp,
const float * d0err,
const float * d0err_par,
float drCut[]) {
113 for (
int i=2;
i>=0; --
i) {
115 float nomd0E =
sqrt(d0err[
i]*d0err[
i]+(d0err_par[
i]/pt)*(d0err_par[
i]/pt));
117 drCut[
i] = powN(par[
i]*nLayers,exp[
i])*nomd0E;
121 inline void dzCut_wPVerror_par(
reco::Track const & trk,
int & nLayers,
const float * par,
const int * exp,
Point const & bestVertexError,
float dzCut[]) {
123 float zPVerr = bestVertexError.z();
125 float dzErrPV =
std::sqrt(dzE*dzE+zPVerr*zPVerr);
126 for (
int i=2;
i>=0; --
i) {
127 dzCut[
i] = par[
i]*dzErrPV;
129 dzCut[
i] *=
pow(nLayers,exp[
i]);
133 inline void drCut_wPVerror_par(
reco::Track const & trk,
int & nLayers,
const float* par,
const int * exp,
Point const & bestVertexError,
float drCut[]) {
135 float rPVerr =
sqrt(bestVertexError.x()*bestVertexError.y());
137 float drErrPV =
std::sqrt(drE*drE+rPVerr*rPVerr);
138 for (
int i=2;
i>=0; --
i) {
139 drCut[
i] = par[
i]*drErrPV;
141 drCut[
i] *=
pow(nLayers,exp[
i]);
150 fillArrayF(
minNdof, cfg,
"minNdof");
151 fillArrayF(
maxChi2, cfg,
"maxChi2");
152 fillArrayF(maxChi2n, cfg,
"maxChi2n");
153 fillArrayI(minHits4pass, cfg,
"minHits4pass");
154 fillArrayI(
minHits, cfg,
"minHits");
156 fillArrayI(min3DLayers, cfg,
"min3DLayers");
157 fillArrayI(minLayers, cfg,
"minLayers");
158 fillArrayI(maxLostLayers,cfg,
"maxLostLayers");
159 fillArrayF(maxRelPtErr, cfg,
"maxRelPtErr");
161 fillArrayF(maxDz, cfg,
"maxDz");
162 fillArrayF(maxDzWrtBS, cfg,
"maxDzWrtBS");
163 fillArrayF(maxDr, cfg,
"maxDr");
165 fillArrayI(dz_exp, dz_par,
"dz_exp");
166 fillArrayF(
dz_par1, dz_par,
"dz_par1");
167 fillArrayF(
dz_par2, dz_par,
"dz_par2");
168 fillArrayF(dzWPVerr_par, dz_par,
"dzWPVerr_par");
170 fillArrayI(dr_exp, dr_par,
"dr_exp");
171 fillArrayF(dr_par1, dr_par,
"dr_par1");
172 fillArrayF(dr_par2, dr_par,
"dr_par2");
173 fillArrayF(d0err, dr_par,
"d0err");
174 fillArrayF(d0err_par, dr_par,
"d0err_par");
175 fillArrayF(drWPVerr_par, dr_par,
"drWPVerr_par");
188 ret =
std::min(ret,
cut(nHits(trk),minHits4pass,std::greater_equal<int>()));
189 if (ret==1.
f)
return ret;
193 ret =
std::min(ret,
cut(relPtErr(trk),maxRelPtErr,std::less_equal<float>()) );
194 if (ret==-1.
f)
return ret;
198 if (ret==-1.
f)
return ret;
201 ret =
std::min(ret,
cut(nLayers,minLayers,std::greater_equal<int>()));
202 if (ret==-1.
f)
return ret;
204 ret =
std::min(ret,
cut(
chi2n(trk)/
float(nLayers),maxChi2n,std::less_equal<float>()));
205 if (ret==-1.
f)
return ret;
208 if (ret==-1.
f)
return ret;
210 ret =
std::min(ret,
cut(n3DLayers(trk,isHLT),min3DLayers,std::greater_equal<int>()));
211 if (ret==-1.
f)
return ret;
214 if (ret==-1.
f)
return ret;
217 if (ret==-1.
f)
return ret;
219 ret =
std::min(ret,
cut(lostLayers(trk),maxLostLayers,std::less_equal<int>()));
220 if (ret==-1.
f)
return ret;
226 Point bestVertex = getBestVertex(trk,vertices,minNVtxTrk);
229 if (bestVertex.z() < -99998.) {
233 ret =
std::min(ret,
cut(dr(trk,bestVertex), maxDr,std::less<float>()));
234 if (ret==-1.
f)
return ret;
236 ret =
std::min(ret,
cut(dz(trk,bestVertex), maxDzcut,std::less<float>()));
237 if (ret==-1.
f)
return ret;
245 Point bestVertexError(-1.,-1.,-1.);
246 Point bestVertex = getBestVertex_withError(trk,vertices,bestVertexError,minNVtxTrk);
250 dzCut_wPVerror_par(trk,nLayers,dzWPVerr_par,dz_exp,bestVertexError, maxDz_par);
251 drCut_wPVerror_par(trk,nLayers,drWPVerr_par,dr_exp,bestVertexError, maxDr_par);
253 ret =
std::min(ret,
cut(dr(trk,bestVertex), maxDr_par,std::less<float>()));
254 if (ret==-1.
f)
return ret;
256 ret =
std::min(ret,
cut(dz(trk,bestVertex), maxDr_par,std::less<float>()));
257 if (ret==-1.
f)
return ret;
266 dzCut_par1(trk,nLayers,
dz_par1,dz_exp, maxDz_par1);
267 drCut_par1(trk,nLayers,dr_par1,dr_exp, maxDr_par1);
279 dzCut_par2(trk,nLayers,
dz_par2,dz_exp,d0err,d0err_par, maxDz_par2);
280 drCut_par2(trk,nLayers,dr_par2,dr_exp,d0err,d0err_par, maxDr_par2);
283 for (
int i=2;
i>=0; --
i) {
284 if (maxDr_par2[
i]<maxDr_par[
i]) maxDr_par[
i] = maxDr_par2[
i];
285 if (maxDz_par2[i]<maxDz_par[i]) maxDz_par[
i] = maxDz_par2[
i];
289 Point bestVertex = getBestVertex(trk,vertices,minNVtxTrk);
290 if (bestVertex.z() < -99998.) {
294 ret =
std::min(ret,
cut(dz(trk,bestVertex), maxDz_par,std::less<float>()));
295 if (ret==-1.
f)
return ret;
296 ret =
std::min(ret,
cut(dr(trk,bestVertex), maxDr_par,std::less<float>()));
297 if (ret==-1.
f)
return ret;
301 if (ret==-1.
f)
return ret;
309 static const char *
name() {
return "TrackCutClassifier";}
312 desc.
add<
bool>(
"isHLT",
false);
314 desc.
add<std::vector<int>>(
"minHits", { 0, 0, 1});
315 desc.
add<std::vector<int>>(
"minPixelHits", { 0, 0, 1});
316 desc.
add<std::vector<int>>(
"minLayers", { 3, 4, 5});
317 desc.
add<std::vector<int>>(
"min3DLayers", { 1, 2, 3});
318 desc.
add<std::vector<int>>(
"maxLostLayers",{99, 3, 3});
320 desc.
add<std::vector<double>>(
"minNdof", {-1., -1., -1.});
321 desc.
add<std::vector<double>>(
"maxChi2", {9999.,25., 16. });
322 desc.
add<std::vector<double>>(
"maxChi2n", {9999., 1.0, 0.4});
324 desc.
add<
int>(
"minNVtxTrk", 2);
341 dr_par.add<std::vector<double>>(
"d0err", {0.003, 0.003, 0.003});
342 dr_par.add<std::vector<double>>(
"d0err_par", {0.001, 0.001, 0.001});
349 float maxRelPtErr[3];
358 int maxLostLayers[3];
366 float dzWPVerr_par[3];
372 float drWPVerr_par[3];
double p() const
momentum vector magnitude
T getParameter(std::string const &) const
virtual int dimension() const =0
tuple ret
prodAgent to be discontinued
double d0Error() const
error on d0
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
#define DEFINE_FWK_MODULE(type)
std::vector< Vertex > VertexCollection
collection of Vertex objects
int pixelLayersWithMeasurement() const
int trackerLayersWithMeasurement() const
T x() const
Cartesian x coordinate.
int numberOfValidStripLayersWithMonoAndStereo(uint16_t stripdet, uint16_t layer) const
double ndof() const
number of degrees of freedom of the fit
double pt() const
track transverse momentum
double ptError() const
error on Pt (set to 1000 TeV if charge==0 for safety)
Abs< T >::type abs(const T &t)
unsigned short numberOfValidHits() const
number of valid hits found
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
double dzError() const
error on dz
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
int trackerLayersWithoutMeasurement(HitCategory category) const
int numberOfValidPixelHits() const
bool isUndef(TrackingRecHit const &hit)
const Point & position() const
position
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Power< A, B >::type pow(const A &a, const B &b)
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.