3131#include " SimDataFormats/Associations/interface/TrackToTrackingParticleAssociator.h"
3232#include " SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
3333#include " SimDataFormats/TrackingAnalysis/interface/TrackingVertexContainer.h"
34-
34+ #include " TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
35+ #include " TrackingTools/Records/interface/TransientTrackRecord.h"
36+ #include " RecoVertex/PrimaryVertexProducer/interface/HITrackFilterForPVFinding.h"
3537// Fastjet
3638#include < fastjet/internal/base.hh>
3739#include " fastjet/PseudoJet.hh"
@@ -256,7 +258,8 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
256258 const bool trkRecSel (const reco::TrackBase&);
257259
258260 // ----------member data ---------------------------
259-
261+ const edm::ESGetToken<TransientTrackBuilder, TransientTrackRecord> theTTBToken;
262+ TrackFilterForPVFindingBase* theTrackFilter;
260263 const std::string folder_;
261264 static constexpr unsigned int NOT_MATCHED = 66666 ;
262265 static constexpr double simUnit_ = 1e9 ; // sim time in s while reco time in ns
@@ -289,7 +292,7 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
289292 bool use_only_charged_tracks_;
290293 bool optionalPlots_;
291294 bool use3dNoTime_;
292-
295+
293296 const double minProbHeavy_;
294297 const double trackweightTh_;
295298 const double mvaTh_;
@@ -299,7 +302,7 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
299302 edm::EDGetTokenT<reco::TrackCollection> RecTrackToken_;
300303
301304 edm::EDGetTokenT<std::vector<PileupSummaryInfo>> vecPileupSummaryInfoToken_;
302-
305+ edm::EDGetTokenT<reco::TrackCollection> trkToken;
303306 edm::EDGetTokenT<TrackingParticleCollection> trackingParticleCollectionToken_;
304307 edm::EDGetTokenT<TrackingVertexCollection> trackingVertexCollectionToken_;
305308 edm::EDGetTokenT<reco::SimToRecoCollection> simToRecoAssociationToken_;
@@ -328,6 +331,8 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
328331 edm::ESGetToken<HepPDT::ParticleDataTable, edm::DefaultRecord> pdtToken_;
329332
330333 // histogram declaration
334+ MonitorElement* meUnAssocTracks_;
335+ MonitorElement* meFractionUnAssocTracks_;
331336 MonitorElement* meTrackEffPtTot_;
332337 MonitorElement* meTrackMatchedTPEffPtTot_;
333338 MonitorElement* meTrackMatchedTPEffPtMtd_;
@@ -523,7 +528,8 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
523528
524529// constructors and destructor
525530Primary4DVertexValidation::Primary4DVertexValidation (const edm::ParameterSet& iConfig)
526- : folder_(iConfig.getParameter<std::string>(" folder" )),
531+ : theTTBToken(esConsumes(edm::ESInputTag(" " , " TransientTrackBuilder" ))),
532+ folder_(iConfig.getParameter<std::string>(" folder" )),
527533 use_only_charged_tracks_(iConfig.getParameter<bool >(" useOnlyChargedTracks" )),
528534 optionalPlots_(iConfig.getUntrackedParameter<bool >(" optionalPlots" )),
529535 use3dNoTime_(iConfig.getParameter<bool >(" use3dNoTime" )),
@@ -532,6 +538,7 @@ Primary4DVertexValidation::Primary4DVertexValidation(const edm::ParameterSet& iC
532538 mvaTh_(iConfig.getParameter<double >(" mvaTh" )),
533539 pdtToken_(esConsumes<HepPDT::ParticleDataTable, edm::DefaultRecord>()) {
534540 vecPileupSummaryInfoToken_ = consumes<std::vector<PileupSummaryInfo>>(edm::InputTag (std::string (" addPileupInfo" )));
541+ trkToken = consumes<reco::TrackCollection>(iConfig.getParameter <edm::InputTag>(" TrackLabel" ));
535542 trackingParticleCollectionToken_ =
536543 consumes<TrackingParticleCollection>(iConfig.getParameter <edm::InputTag>(" SimTag" ));
537544 trackingVertexCollectionToken_ = consumes<TrackingVertexCollection>(iConfig.getParameter <edm::InputTag>(" SimTag" ));
@@ -558,6 +565,15 @@ Primary4DVertexValidation::Primary4DVertexValidation(const edm::ParameterSet& iC
558565 probPiToken_ = consumes<edm::ValueMap<float >>(iConfig.getParameter <edm::InputTag>(" probPi" ));
559566 probKToken_ = consumes<edm::ValueMap<float >>(iConfig.getParameter <edm::InputTag>(" probK" ));
560567 probPToken_ = consumes<edm::ValueMap<float >>(iConfig.getParameter <edm::InputTag>(" probP" ));
568+ std::string trackSelectionAlgorithm =
569+ iConfig.getParameter <edm::ParameterSet>(" TkFilterParameters" ).getParameter <std::string>(" algorithm" );
570+ if (trackSelectionAlgorithm == " filter" ) {
571+ theTrackFilter = new TrackFilterForPVFinding (iConfig.getParameter <edm::ParameterSet>(" TkFilterParameters" ));
572+ } else if (trackSelectionAlgorithm == " filterWithThreshold" ) {
573+ theTrackFilter = new HITrackFilterForPVFinding (iConfig.getParameter <edm::ParameterSet>(" TkFilterParameters" ));
574+ } else {
575+ edm::LogWarning (" MVATrainingNtuple: unknown track selection algorithm: " + trackSelectionAlgorithm);
576+ }
561577}
562578
563579Primary4DVertexValidation::~Primary4DVertexValidation () {}
@@ -570,6 +586,8 @@ void Primary4DVertexValidation::bookHistograms(DQMStore::IBooker& ibook,
570586 edm::EventSetup const & iSetup) {
571587 ibook.setCurrentFolder (folder_);
572588 // --- histograms booking
589+ meUnAssocTracks_ = ibook.book1D (" UnAssocTracks" , " Unassociated tracks" , 160 , 0.5 , 4.5 );
590+ meFractionUnAssocTracks_ = ibook.book1D (" FractionUnAssocTracks" , " Fraction Unassociated tracks" , 160 , 0.0 , 1 .);
573591 meTrackEffPtTot_ = ibook.book1D (" EffPtTot" , " Pt of tracks associated to LV; track pt [GeV] " , 110 , 0 ., 11 .);
574592 meTrackEffEtaTot_ = ibook.book1D (" EffEtaTot" , " Eta of tracks associated to LV; track eta " , 66 , 0 ., 3.3 );
575593 meTrackMatchedTPEffPtTot_ =
@@ -669,11 +687,11 @@ void Primary4DVertexValidation::bookHistograms(DQMStore::IBooker& ibook,
669687 mePUvsRealV_ =
670688 ibook.bookProfile (" PUvsReal" , " #PU vertices vs #real matched vertices;#PU;#real " , 100 , 0 , 300 , 100 , 0 , 200 );
671689 mePUvsFakeV_ =
672- ibook.bookProfile (" PUvsFake" , " #PU vertices vs #fake matched vertices;#PU;#fake " , 100 , 0 , 300 , 100 , 0 , 20 );
690+ ibook.bookProfile (" PUvsFake" , " #PU vertices vs #fake matched vertices;#PU;#fake " , 100 , 0 , 300 , 300 , 0 , 300 );
673691 mePUvsOtherFakeV_ = ibook.bookProfile (
674- " PUvsOtherFake" , " #PU vertices vs #other fake matched vertices;#PU;#other fake " , 100 , 0 , 300 , 100 , 0 , 20 );
692+ " PUvsOtherFake" , " #PU vertices vs #other fake matched vertices;#PU;#other fake " , 100 , 0 , 300 , 300 , 0 , 300 );
675693 mePUvsSplitV_ =
676- ibook.bookProfile (" PUvsSplit" , " #PU vertices vs #split matched vertices;#PU;#split " , 100 , 0 , 300 , 100 , 0 , 20 );
694+ ibook.bookProfile (" PUvsSplit" , " #PU vertices vs #split matched vertices;#PU;#split " , 100 , 0 , 300 , 300 , 0 , 300 );
677695 meMatchQual_ = ibook.book1D (" MatchQuality" , " RECO-SIM vertex match quality; " , 8 , 0 , 8 .);
678696 meDeltaZrealreal_ = ibook.book1D (" DeltaZrealreal" , " #Delta Z real-real; |#Delta Z (r-r)| [cm]" , 100 , 0 , 0.5 );
679697 meDeltaZfakefake_ = ibook.book1D (" DeltaZfakefake" , " #Delta Z fake-fake; |#Delta Z (f-f)| [cm]" , 100 , 0 , 0.5 );
@@ -704,7 +722,7 @@ void Primary4DVertexValidation::bookHistograms(DQMStore::IBooker& ibook,
704722 meSimPVZ_ = ibook.book1D (" simPVZ" , " #Sim vertices/10 mm" , 30 , -15 ., 15 .);
705723 meSimPVT_ = ibook.book1D (" simPVT" , " #Sim vertices/50 ps" , 30 , -0.75 , 0.75 );
706724 meSimPVTvsZ_ = ibook.bookProfile (" simPVTvsZ" , " PV Time vs Z" , 30 , -15 ., 15 ., 30 , -0.75 , 0.75 );
707-
725+
708726 meVtxTrackMult_ = ibook.book1D (" VtxTrackMult" , " Log10(Vertex track multiplicity)" , 80 , 0.5 , 2.5 );
709727 meVtxTrackW_ = ibook.book1D (" VtxTrackW" , " Vertex track weight (all)" , 50 , 0 ., 1 .);
710728 meVtxTrackWnt_ = ibook.book1D (" VtxTrackWnt" , " Vertex track Wnt" , 50 , 0 ., 1 .);
@@ -1476,7 +1494,7 @@ void Primary4DVertexValidation::observablesFromJets(const std::vector<reco::Trac
14761494 fjInputs_.clear ();
14771495 size_t countScale0 = 0 ;
14781496 for (size_t i = 0 ; i < reco_Tracks.size (); i++) {
1479- const auto & recotr = reco_Tracks[i];
1497+ const auto recotr = reco_Tracks[i];
14801498 const auto mass = mass_Tracks[i];
14811499 float scale = 1 .;
14821500 if (recotr.charge () == 0 ) {
@@ -2019,11 +2037,17 @@ void Primary4DVertexValidation::analyze(const edm::Event& iEvent, const edm::Eve
20192037 r2s_ = recoToSimH.product ();
20202038 else
20212039 edm::LogWarning (" Primary4DVertexValidation" ) << " recoToSimH is not valid" ;
2022-
2040+ reco::BeamSpot beamSpot;
20232041 edm::Handle<reco::BeamSpot> BeamSpotH;
20242042 iEvent.getByToken (RecBeamSpotToken_, BeamSpotH);
20252043 if (!BeamSpotH.isValid ())
20262044 edm::LogWarning (" Primary4DVertexValidation" ) << " BeamSpotH is not valid" ;
2045+ beamSpot = *BeamSpotH;
2046+
2047+ edm::Handle<reco::TrackCollection> tks;
2048+ iEvent.getByToken (trkToken, tks);
2049+ const auto & theB = &iSetup.getData (theTTBToken);
2050+ std::vector<reco::TransientTrack> t_tks;
20272051
20282052 std::vector<simPrimaryVertex> simpv; // a list of simulated primary MC vertices
20292053 simpv = getSimPVs (TVCollectionH);
@@ -2061,6 +2085,34 @@ void Primary4DVertexValidation::analyze(const edm::Event& iEvent, const edm::Eve
20612085 // I have simPV and recoPV collections
20622086 matchReco2Sim (recopv, simpv, sigmat0Safe, mtdQualMVA, BeamSpotH);
20632087
2088+ t_tks = (*theB).build (tks, beamSpot, t0Safe, sigmat0Safe);
2089+
2090+ // track filter
2091+ std::vector<reco::TransientTrack>&& seltks = theTrackFilter->select (t_tks);
2092+
2093+ int unassociatedCount = 0 ;
2094+ for (std::vector<reco::TransientTrack>::const_iterator itk = seltks.begin (); itk != seltks.end (); itk++) {
2095+ reco::TrackBaseRef trackref = (*itk).trackBaseRef ();
2096+ bool isAssociated = false ;
2097+ for (unsigned int iv = 0 ; iv < recopv.size (); iv++) {
2098+ const reco::Vertex* vertex = recopv.at (iv).recVtx ;
2099+ for (auto iTrack = vertex->tracks_begin (); iTrack != vertex->tracks_end (); ++iTrack) {
2100+ if (*iTrack == trackref) {
2101+ isAssociated = true ;
2102+ break ;
2103+ }
2104+ }
2105+ if (isAssociated) break ;
2106+ }
2107+
2108+ if (!isAssociated) {
2109+ unassociatedCount++;
2110+ }
2111+ }
2112+ double fraction = double (unassociatedCount)/(seltks.size ());
2113+ meUnAssocTracks_->Fill (log10 (unassociatedCount));
2114+ meFractionUnAssocTracks_->Fill (fraction);
2115+
20642116 // Loop on tracks
20652117 for (unsigned int iv = 0 ; iv < recopv.size (); iv++) {
20662118 if (recopv.at (iv).ndof > selNdof_) {
@@ -2633,6 +2685,7 @@ void Primary4DVertexValidation::analyze(const edm::Event& iEvent, const edm::Eve
26332685 LogTrace (" Primary4DVertexValidation" ) << " is_fake: " << fake;
26342686 LogTrace (" Primary4DVertexValidation" ) << " split_from: " << split;
26352687 LogTrace (" Primary4DVertexValidation" ) << " other fake: " << other_fake;
2688+ std::cout<<" Fake: " <<fake<<" Real: " <<real <<" other fake: " <<other_fake<<" split: " <<split<<std::endl;
26362689 mePUvsRealV_->Fill (simpv.size (), real);
26372690 mePUvsFakeV_->Fill (simpv.size (), fake);
26382691 mePUvsOtherFakeV_->Fill (simpv.size (), other_fake);
@@ -2752,6 +2805,7 @@ void Primary4DVertexValidation::fillDescriptions(edm::ConfigurationDescriptions&
27522805
27532806 desc.add <std::string>(" folder" , " MTD/Vertices" );
27542807 desc.add <edm::InputTag>(" TPtoRecoTrackAssoc" , edm::InputTag (" trackingParticleRecoTrackAsssociation" ));
2808+ desc.add <edm::InputTag>(" TrackLabel" , edm::InputTag (" generalTracks" ));
27552809 desc.add <edm::InputTag>(" mtdTracks" , edm::InputTag (" trackExtenderWithMTD" ));
27562810 desc.add <edm::InputTag>(" SimTag" , edm::InputTag (" mix" , " MergedTrackTruth" ));
27572811 desc.add <edm::InputTag>(" offlineBS" , edm::InputTag (" offlineBeamSpot" ));
@@ -2780,6 +2834,12 @@ void Primary4DVertexValidation::fillDescriptions(edm::ConfigurationDescriptions&
27802834 desc.add <double >(" trackweightTh" , 0.5 );
27812835 desc.add <double >(" mvaTh" , 0.8 );
27822836 desc.add <double >(" minProbHeavy" , 0.75 );
2837+ {
2838+ edm::ParameterSetDescription psd0;
2839+ HITrackFilterForPVFinding::fillPSetDescription (psd0); // extension of TrackFilterForPVFinding
2840+ desc.add <edm::ParameterSetDescription>(" TkFilterParameters" , psd0);
2841+ }
2842+
27832843 descriptions.add (" vertices4DValid" , desc);
27842844}
27852845
0 commit comments