9 #include <Math/DistFunc.h>
18 static T op(
T t) {
return PowN<
N/2>::op(t)*PowN<(
N+1)/2>::op(t);}
23 static T op(
T t) {
return T(1);}
28 static T op(
T t) {
return t;}
33 static T op(
T t) {
return t*
t;}
39 case 4:
return PowN<4>::op(t);
40 case 3:
return PowN<3>::op(t);
41 case 8:
return PowN<8>::op(t);
42 case 2:
return PowN<2>::op(t);
43 case 5:
return PowN<5>::op(t);
44 case 6:
return PowN<6>::op(t);
45 case 7:
return PowN<7>::op(t);
46 case 0:
return PowN<0>::op(t);
47 case 1:
return PowN<1>::op(t);
60 useForestFromDB_ =
true;
67 useVertices_( cfg.getParameter<bool>(
"useVertices" ) ),
68 useVtxError_( cfg.getParameter<bool>(
"useVtxError" ) )
73 edm::LogWarning(
"MultiTRackSelector") <<
"you are executing buggy code, if intentional please help to fix it";
82 if(cfg.
exists(
"GBRForestFileName")){
87 std::vector<edm::ParameterSet> trkSelectors( cfg.
getParameter<std::vector< edm::ParameterSet> >(
"trackSelectors") );
91 res_par_.reserve(trkSelectors.size());
94 d0_par1_.reserve(trkSelectors.size());
95 dz_par1_.reserve(trkSelectors.size());
96 d0_par2_.reserve(trkSelectors.size());
97 dz_par2_.reserve(trkSelectors.size());
99 max_d0_.reserve(trkSelectors.size());
100 max_z0_.reserve(trkSelectors.size());
101 nSigmaZ_.reserve(trkSelectors.size());
114 min_eta_.reserve(trkSelectors.size());
115 max_eta_.reserve(trkSelectors.size());
116 useMVA_.reserve(trkSelectors.size());
119 min_MVA_.reserve(trkSelectors.size());
120 mvaType_.reserve(trkSelectors.size());
122 forest_.reserve(trkSelectors.size());
124 produces<edm::ValueMap<float> >(
"MVAVals");
126 for (
unsigned int i=0;
i<trkSelectors.size();
i++) {
133 res_par_.push_back(trkSelectors[
i].getParameter< std::vector<double> >(
"res_par") );
134 chi2n_par_.push_back( trkSelectors[
i].getParameter<double>(
"chi2n_par") );
136 d0_par1_.push_back(trkSelectors[
i].getParameter< std::vector<double> >(
"d0_par1"));
137 dz_par1_.push_back(trkSelectors[
i].getParameter< std::vector<double> >(
"dz_par1"));
138 d0_par2_.push_back(trkSelectors[
i].getParameter< std::vector<double> >(
"d0_par2"));
139 dz_par2_.push_back(trkSelectors[
i].getParameter< std::vector<double> >(
"dz_par2"));
143 max_d0_.push_back(trkSelectors[
i].getParameter<double>(
"max_d0"));
144 max_z0_.push_back(trkSelectors[
i].getParameter<double>(
"max_z0"));
145 nSigmaZ_.push_back(trkSelectors[
i].getParameter<double>(
"nSigmaZ"));
147 min_layers_.push_back(trkSelectors[
i].getParameter<uint32_t>(
"minNumberLayers") );
148 min_3Dlayers_.push_back(trkSelectors[
i].getParameter<uint32_t>(
"minNumber3DLayers") );
149 max_lostLayers_.push_back(trkSelectors[
i].getParameter<uint32_t>(
"maxNumberLostLayers"));
150 min_hits_bypass_.push_back(trkSelectors[
i].getParameter<uint32_t>(
"minHitsToBypassChecks"));
153 keepAllTracks_.push_back( trkSelectors[
i].getParameter<bool>(
"keepAllTracks"));
154 max_relpterr_.push_back(trkSelectors[
i].getParameter<double>(
"max_relpterr"));
155 min_nhits_.push_back(trkSelectors[
i].getParameter<uint32_t>(
"min_nhits"));
157 trkSelectors[
i].existsAs<int32_t>(
"max_minMissHitOutOrIn") ?
158 trkSelectors[
i].getParameter<int32_t>(
"max_minMissHitOutOrIn") : 99);
160 trkSelectors[
i].existsAs<double>(
"max_lostHitFraction") ?
161 trkSelectors[
i].getParameter<double>(
"max_lostHitFraction") : 1.0);
162 min_eta_.push_back(trkSelectors[
i].existsAs<double>(
"min_eta") ?
163 trkSelectors[
i].getParameter<double>(
"min_eta"):-9999);
164 max_eta_.push_back(trkSelectors[
i].existsAs<double>(
"max_eta") ?
165 trkSelectors[
i].getParameter<double>(
"max_eta"):9999);
169 if (qualityStr !=
"") {
171 qualityToSet_[
i] = TrackBase::qualityByName(trkSelectors[
i].getParameter<std::string>(
"qualityBit"));
175 "You can't set the quality bit " << trkSelectors[
i].getParameter<
std::string>(
"qualityBit") <<
" as it is 'undefQuality' or unknown.\n";
178 max_d0NoPV_.push_back(trkSelectors[i].getParameter<double>(
"max_d0NoPV"));
179 max_z0NoPV_.push_back(trkSelectors[i].getParameter<double>(
"max_z0NoPV"));
186 name_.push_back( trkSelectors[i].getParameter<std::string>(
"name") );
193 for (
unsigned int j=0;
j<
i;
j++)
199 throw cms::Exception(
"Configuration") <<
"Invalid prefilter name in MultiTrackSelector "
200 << trkSelectors[
i].getParameter<
std::string>(
"preFilterName");
205 produces<edm::ValueMap<int> >(
name_[
i]).setBranchAlias(
name_[i] +
"TrackQuals");
207 bool thisMVA =
false;
208 if(trkSelectors[i].exists(
"useMVA"))thisMVA = trkSelectors[
i].getParameter<
bool>(
"useMVA");
212 if(trkSelectors[i].exists(
"minMVA"))minVal = trkSelectors[
i].getParameter<
double>(
"minMVA");
214 mvaType_.push_back(trkSelectors[i].exists(
"mvaType") ? trkSelectors[i].getParameter<std::string>(
"mvaType") :
"Detached");
215 forestLabel_.push_back(trkSelectors[i].exists(
"GBRForestLabel") ? trkSelectors[i].getParameter<std::string>(
"GBRForestLabel") :
"MVASelectorIter0");
216 useMVAonly_.push_back(trkSelectors[i].exists(
"useMVAonly") ? trkSelectors[i].getParameter<bool>(
"useMVAonly") :
false);
235 for(
auto forest :
forest_)
delete forest;
255 using namespace reco;
262 if (hSrcTrack.failedToGet())
263 edm::LogWarning(
"MultiTrackSelector")<<
"could not get Track collection";
280 if (hVtx.failedToGet())
281 edm::LogWarning(
"MultiTrackSelector")<<
"could not get Vertex collection";
284 unsigned int trkSize=srcTracks.size();
285 std::vector<int> selTracksSave(
qualityToSet_.size()*trkSize,0);
287 std::vector<Point> points;
288 std::vector<float> vterr, vzerr;
292 std::vector<float> mvaVals_(srcTracks.size(),-99.f);
293 processMVA(evt,es,vertexBeamSpot,*(hVtx.product()),
i, mvaVals_,
i == 0 ?
true :
false);
294 std::vector<int> selTracks(trkSize,0);
295 auto_ptr<edm::ValueMap<int> > selTracksValueMap = auto_ptr<edm::ValueMap<int> >(
new edm::ValueMap<int>);
302 for (TrackCollection::const_iterator it = srcTracks.begin(), ed = srcTracks.end(); it != ed; ++it, ++
current) {
303 const Track & trk = * it;
306 LogTrace(
"TrackSelection") <<
"ready to check track with pt="<< trk.
pt() ;
319 ok =
select(
i,vertexBeamSpot, srcHits, trk, points, vterr, vzerr,mvaVal);
321 LogTrace(
"TrackSelection") <<
"track with pt="<< trk.
pt() <<
" NOT selected";
328 LogTrace(
"TrackSelection") <<
"track with pt="<< trk.
pt() <<
" selected";
346 if (!points.empty()) {
348 selTracks[
current]=(selTracks[
current] | (1<<TrackBase::looseSetWithPV));
351 selTracks[
current]=(selTracks[
current] | (1<<TrackBase::looseSetWithPV));
352 selTracks[
current]=(selTracks[
current] | (1<<TrackBase::highPuritySetWithPV));
357 for (
unsigned int j=0;
j< trkSize;
j++ ) selTracksSave[
j+
i*trkSize]=selTracks[
j];
358 filler.insert(hSrcTrack, selTracks.begin(),selTracks.end());
371 const std::vector<Point> &points,
372 std::vector<float> &vterr,
373 std::vector<float> &vzerr,
374 double mvaVal)
const {
384 if ( tk.
ndof() < 1E-5 )
return false;
392 if(mvaVal < min_MVA_[tsNum])
return false;
404 LogDebug(
"TrackSelection") <<
"cuts on nlayers: " <<
nlayers <<
" " << nlayers3D <<
" " << nlayersLost <<
" vs "
409 LogTrace(
"TrackSelection") <<
"cuts on nlayers passed";
412 float chi2n_no1Dmod =
chi2n;
415 auto ith = tk.
extra()->firstRecHit();
417 for (; ith<edh; ++ith) {
421 if (count1dhits > 0) {
424 chi2n = (chi2+count1dhits)/
float(ndof+count1dhits);
443 int minLost =
std::min(lostIn,lostOut);
457 float nomdzE = nomd0E*(std::cosh(
eta));
466 bool primaryVertexZCompatibility(
false);
467 bool primaryVertexD0Compatibility(
false);
469 if (points.empty()) {
471 if (
abs(dz) < hypot(vertexBeamSpot.
sigmaZ()*
nSigmaZ_[tsNum],dzCut) ) primaryVertexZCompatibility =
true;
473 if (
abs(d0) < d0Cut) primaryVertexD0Compatibility =
true;
477 for (std::vector<Point>::const_iterator
point = points.begin(),
end = points.end();
point !=
end; ++
point) {
478 LogTrace(
"TrackSelection") <<
"Test track w.r.t. vertex with z position " <<
point->z();
479 if(primaryVertexZCompatibility && primaryVertexD0Compatibility)
break;
483 float dzErrPV =
std::sqrt(dzE*dzE+vzerr[iv]*vzerr[iv]);
484 float d0ErrPV =
std::sqrt(d0E*d0E+vterr[iv]*vterr[iv]);
488 abs(dzPV) <
max_z0_[tsNum]) primaryVertexZCompatibility =
true;
491 abs(d0PV) <
max_d0_[tsNum]) primaryVertexD0Compatibility =
true;
493 if (
abs(dzPV) < dzCut) primaryVertexZCompatibility =
true;
494 if (
abs(d0PV) < d0Cut) primaryVertexD0Compatibility =
true;
496 LogTrace(
"TrackSelection") <<
"distances " << dzPV <<
" " << d0PV <<
" vs " << dzCut <<
" " << d0Cut;
504 if (
abs(d0) >
max_d0_[tsNum] && !primaryVertexD0Compatibility)
return false;
505 LogTrace(
"TrackSelection") <<
"absolute cuts on d0 passed";
506 if (
abs(dz) >
max_z0_[tsNum] && !primaryVertexZCompatibility)
return false;
507 LogTrace(
"TrackSelection") <<
"absolute cuts on dz passed";
511 <<
" d0 compatibility? " << primaryVertexD0Compatibility
512 <<
" z compatibility? " << primaryVertexZCompatibility ;
515 return (primaryVertexD0Compatibility && primaryVertexZCompatibility);
524 std::vector<Point> &points,
525 std::vector<float> &vterr,
526 std::vector<float> &vzerr)
const {
528 using namespace reco;
530 for (VertexCollection::const_iterator it = vtxs.begin(), ed = vtxs.end(); it != ed; ++it) {
532 LogDebug(
"SelectVertex") <<
" select vertex with z position " << it->z() <<
" "
533 << it->chi2() <<
" " << it->ndof() <<
" " << TMath::Prob(it->chi2(),
static_cast<int32_t
>(it->ndof()));
537 points.push_back(it->position());
538 vterr.push_back(
sqrt(it->yError()*it->xError()));
539 vzerr.push_back(it->zError());
540 LogTrace(
"SelectVertex") <<
" SELECTED vertex with z position " << it->z();
541 toTake--;
if (toTake == 0)
break;
551 using namespace reco;
558 assert(mvaVals_.size()==srcTracks.size());
566 auto_ptr<edm::ValueMap<float> >mvaValValueMap = auto_ptr<edm::ValueMap<float> >(
new edm::ValueMap<float>);
572 mvaFiller.insert(hSrcTrack,mvaVals_.begin(),mvaVals_.end());
574 evt.
put(mvaValValueMap,
"MVAVals");
578 if(!
useMVA_[selIndex] && !writeIt)
return;
582 for (TrackCollection::const_iterator it = srcTracks.begin(), ed = srcTracks.end(); it != ed; ++it, ++
current) {
583 const Track & trk = * it;
585 auto tmva_ndof_ = trk.
ndof();
591 float chi2n_no1Dmod =
chi2n;
594 auto ith = trk.
extra()->firstRecHit();
596 for (; ith<edh; ++ith) {
600 if (count1dhits > 0) {
603 chi2n = (chi2+count1dhits)/
float(ndof+count1dhits);
605 auto tmva_chi2n_ =
chi2n;
606 auto tmva_chi2n_no1dmod_ = chi2n_no1Dmod;
607 auto tmva_eta_ = trk.
eta();
612 auto tmva_minlost_ =
std::min(lostIn,lostOut);
614 auto tmva_absd0_ = fabs(-trk.
dxy(beamspot.
position()));
615 auto tmva_absdz_ = fabs(trk.
dz(beamspot.
position()));
617 auto tmva_absd0PV_ = fabs(trk.
dxy(bestVertex));
618 auto tmva_absdzPV_ = fabs(trk.
dz(bestVertex));
619 auto tmva_pt_ = trk.
pt();
625 forest = forestHandle.
product();
629 gbrVals_[0] = tmva_pt_;
630 gbrVals_[1] = tmva_lostmidfrac_;
631 gbrVals_[2] = tmva_minlost_;
632 gbrVals_[3] = tmva_nhits_;
633 gbrVals_[4] = tmva_relpterr_;
634 gbrVals_[5] = tmva_eta_;
635 gbrVals_[6] = tmva_chi2n_no1dmod_;
636 gbrVals_[7] = tmva_chi2n_;
637 gbrVals_[8] = tmva_nlayerslost_;
638 gbrVals_[9] = tmva_nlayers3D_;
639 gbrVals_[10] = tmva_nlayers_;
640 gbrVals_[11] = tmva_ndof_;
641 gbrVals_[12] = tmva_absd0PV_;
642 gbrVals_[13] = tmva_absdzPV_;
643 gbrVals_[14] = tmva_absdz_;
644 gbrVals_[15] = tmva_absd0_;
646 if (
mvaType_[selIndex] ==
"Prompt"){
650 float detachedGbrVals_[12];
651 for(
int jjj = 0; jjj < 12; jjj++)detachedGbrVals_[jjj] = gbrVals_[jjj];
658 mvaFiller.insert(hSrcTrack,mvaVals_.begin(),mvaVals_.end());
660 evt.
put(mvaValValueMap,
"MVAVals");
667 Point p_dz(0,0,-99999);
668 float bestWeight = 0;
670 bool weightMatch =
false;
671 for(
auto const & vertex : vertices){
672 float w = vertex.trackWeight(track);
673 Point v_pos = vertex.position();
679 float dz = fabs(track.
get()->
dz(v_pos));
685 if(weightMatch)
return p;
std::vector< double > chi2n_no1Dmod_par_
value_type const * get() const
T getParameter(std::string const &) const
std::vector< uint32_t > min_nhits_
std::vector< double > chi2n_par_
virtual int dimension() const =0
std::vector< std::vector< double > > d0_par1_
std::vector< double > max_d0NoPV_
double d0Error() const
error on d0
std::vector< double > max_z0_
std::vector< uint32_t > min_layers_
Cuts on numbers of layers with hits/3D hits/lost hits.
std::vector< std::string > name_
std::vector< double > max_z0NoPV_
MultiTrackSelector()
constructor
const TrackExtraRef & extra() const
reference to "extra" object
std::vector< bool > useMVA_
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
std::vector< bool > keepAllTracks_
void beginStream(edm::StreamID) overridefinal
#define DEFINE_FWK_MODULE(type)
size_t recHitsSize() const
Get number of RecHits. (Warning, this includes invalid hits, which are not physical hits)...
Point getBestVertex(const reco::TrackBaseRef, const reco::VertexCollection) const
std::vector< uint32_t > min_hits_bypass_
bool select(unsigned tsNum, const reco::BeamSpot &vertexBeamSpot, const TrackingRecHitCollection &recHits, const reco::Track &tk, const std::vector< Point > &points, std::vector< float > &vterr, std::vector< float > &vzerr, double mvaVal) const
return class, or -1 if rejected
std::vector< Track > TrackCollection
collection of Tracks
bool exists(std::string const ¶meterName) const
checks if a parameter exists
std::vector< bool > applyAdaptedPVCuts_
unsigned short numberOfLostHits() const
number of cases where track crossed a layer without getting a hit.
std::vector< Vertex > VertexCollection
collection of Vertex objects
virtual void run(edm::Event &evt, const edm::EventSetup &es) const
std::vector< double > nSigmaZ_
std::vector< std::string > mvaType_
std::vector< unsigned int > preFilter_
int pixelLayersWithMeasurement() const
edm::EDGetTokenT< TrackingRecHitCollection > hSrc_
virtual ~MultiTrackSelector()
destructor
int trackerLayersWithMeasurement() const
edm::EDGetTokenT< reco::VertexCollection > vertices_
std::vector< uint32_t > min_3Dlayers_
int numberOfLostTrackerHits(HitCategory category) const
std::vector< uint32_t > max_lostLayers_
double eta() const
pseudorapidity of momentum vector
int numberOfValidStripLayersWithMonoAndStereo(uint16_t stripdet, uint16_t layer) const
std::vector< int32_t > max_lostHitFraction_
edm::EDGetTokenT< reco::BeamSpot > beamspot_
std::vector< double > min_eta_
double chi2() const
chi-squared of the fit
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
double ndof() const
number of degrees of freedom of the fit
std::vector< bool > setQualityBit_
do I have to set a quality bit?
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)
std::vector< std::vector< double > > dz_par1_
unsigned short numberOfValidHits() const
number of valid hits found
std::vector< std::vector< double > > dz_par2_
std::vector< std::vector< double > > res_par_
std::vector< double > max_relpterr_
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
std::vector< int32_t > vtxNumber_
vertex cuts
void selectVertices(unsigned int tsNum, const reco::VertexCollection &vtxs, std::vector< Point > &points, std::vector< float > &vterr, std::vector< float > &vzerr) const
std::vector< reco::TrackBase::TrackQuality > qualityToSet_
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
double sigmaZ() const
sigma z
T const * product() const
std::vector< std::string > forestLabel_
int trackerLayersWithoutMeasurement(HitCategory category) const
std::vector< StringCutObjectSelector< reco::Vertex > > vertexCut_
std::vector< bool > applyAbsCutsIfNoPV_
const Point & position() const
position
std::vector< int32_t > max_minMissHitOutOrIn_
std::vector< double > min_MVA_
edm::EDGetTokenT< reco::TrackCollection > src_
source collection label
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
std::vector< std::vector< double > > d0_par2_
double GetClassifier(const float *vector) const
std::vector< double > max_d0_
Impact parameter absolute cuts.
std::vector< bool > useMVAonly_
void processMVA(edm::Event &evt, const edm::EventSetup &es, const reco::BeamSpot &beamspot, const reco::VertexCollection &vertices, int selIndex, std::vector< float > &mvaVals_, bool writeIt=false) const
Power< A, B >::type pow(const A &a, const B &b)
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
std::vector< double > max_eta_
std::vector< GBRForest * > forest_