3232#include " SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
3333#include " SimDataFormats/TrackingAnalysis/interface/TrackingVertexContainer.h"
3434
35+ #include " TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
36+ #include " TrackingTools/Records/interface/TransientTrackRecord.h"
37+ #include " RecoVertex/PrimaryVertexProducer/interface/HITrackFilterForPVFinding.h"
3538// Fastjet
3639#include < fastjet/internal/base.hh>
3740#include " fastjet/PseudoJet.hh"
@@ -257,6 +260,8 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
257260
258261 // ----------member data ---------------------------
259262
263+ const edm::ESGetToken<TransientTrackBuilder, TransientTrackRecord> theTTBToken;
264+ TrackFilterForPVFindingBase* theTrackFilter;
260265 const std::string folder_;
261266 static constexpr unsigned int NOT_MATCHED = 66666 ;
262267 static constexpr double simUnit_ = 1e9 ; // sim time in s while reco time in ns
@@ -289,7 +294,6 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
289294 bool use_only_charged_tracks_;
290295 bool optionalPlots_;
291296 bool use3dNoTime_;
292-
293297 const double minProbHeavy_;
294298 const double trackweightTh_;
295299 const double mvaTh_;
@@ -300,6 +304,7 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
300304
301305 edm::EDGetTokenT<std::vector<PileupSummaryInfo>> vecPileupSummaryInfoToken_;
302306
307+ edm::EDGetTokenT<reco::TrackCollection> trkToken;
303308 edm::EDGetTokenT<TrackingParticleCollection> trackingParticleCollectionToken_;
304309 edm::EDGetTokenT<TrackingVertexCollection> trackingVertexCollectionToken_;
305310 edm::EDGetTokenT<reco::SimToRecoCollection> simToRecoAssociationToken_;
@@ -328,6 +333,8 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
328333 edm::ESGetToken<HepPDT::ParticleDataTable, edm::DefaultRecord> pdtToken_;
329334
330335 // histogram declaration
336+ MonitorElement* meUnAssocTracks_;
337+ MonitorElement* meFractionUnAssocTracks_;
331338 MonitorElement* meTrackEffPtTot_;
332339 MonitorElement* meTrackMatchedTPEffPtTot_;
333340 MonitorElement* meTrackMatchedTPEffPtMtd_;
@@ -523,7 +530,8 @@ class Primary4DVertexValidation : public DQMEDAnalyzer {
523530
524531// constructors and destructor
525532Primary4DVertexValidation::Primary4DVertexValidation (const edm::ParameterSet& iConfig)
526- : folder_(iConfig.getParameter<std::string>(" folder" )),
533+ : theTTBToken(esConsumes(edm::ESInputTag(" " , " TransientTrackBuilder" ))),
534+ folder_(iConfig.getParameter<std::string>(" folder" )),
527535 use_only_charged_tracks_(iConfig.getParameter<bool >(" useOnlyChargedTracks" )),
528536 optionalPlots_(iConfig.getUntrackedParameter<bool >(" optionalPlots" )),
529537 use3dNoTime_(iConfig.getParameter<bool >(" use3dNoTime" )),
@@ -532,6 +540,7 @@ Primary4DVertexValidation::Primary4DVertexValidation(const edm::ParameterSet& iC
532540 mvaTh_(iConfig.getParameter<double >(" mvaTh" )),
533541 pdtToken_(esConsumes<HepPDT::ParticleDataTable, edm::DefaultRecord>()) {
534542 vecPileupSummaryInfoToken_ = consumes<std::vector<PileupSummaryInfo>>(edm::InputTag (std::string (" addPileupInfo" )));
543+ trkToken = consumes<reco::TrackCollection>(iConfig.getParameter <edm::InputTag>(" TrackLabel" ));
535544 trackingParticleCollectionToken_ =
536545 consumes<TrackingParticleCollection>(iConfig.getParameter <edm::InputTag>(" SimTag" ));
537546 trackingVertexCollectionToken_ = consumes<TrackingVertexCollection>(iConfig.getParameter <edm::InputTag>(" SimTag" ));
@@ -558,6 +567,16 @@ Primary4DVertexValidation::Primary4DVertexValidation(const edm::ParameterSet& iC
558567 probPiToken_ = consumes<edm::ValueMap<float >>(iConfig.getParameter <edm::InputTag>(" probPi" ));
559568 probKToken_ = consumes<edm::ValueMap<float >>(iConfig.getParameter <edm::InputTag>(" probK" ));
560569 probPToken_ = consumes<edm::ValueMap<float >>(iConfig.getParameter <edm::InputTag>(" probP" ));
570+ std::string trackSelectionAlgorithm =
571+ iConfig.getParameter <edm::ParameterSet>(" TkFilterParameters" ).getParameter <std::string>(" algorithm" );
572+ if (trackSelectionAlgorithm == " filter" ) {
573+ theTrackFilter = new TrackFilterForPVFinding (iConfig.getParameter <edm::ParameterSet>(" TkFilterParameters" ));
574+ } else if (trackSelectionAlgorithm == " filterWithThreshold" ) {
575+ theTrackFilter = new HITrackFilterForPVFinding (iConfig.getParameter <edm::ParameterSet>(" TkFilterParameters" ));
576+ } else {
577+ edm::LogWarning (" Primary4DVertexValidation" )
578+ << " unknown track selection algorithm: " + trackSelectionAlgorithm << std::endl;
579+ }
561580}
562581
563582Primary4DVertexValidation::~Primary4DVertexValidation () {}
@@ -570,6 +589,8 @@ void Primary4DVertexValidation::bookHistograms(DQMStore::IBooker& ibook,
570589 edm::EventSetup const & iSetup) {
571590 ibook.setCurrentFolder (folder_);
572591 // --- histograms booking
592+ meUnAssocTracks_ = ibook.book1D (" UnAssocTracks" , " Unassociated tracks" , 160 , 0.5 , 4.5 );
593+ meFractionUnAssocTracks_ = ibook.book1D (" FractionUnAssocTracks" , " Fraction Unassociated tracks" , 160 , 0.0 , 1 .);
573594 meTrackEffPtTot_ = ibook.book1D (" EffPtTot" , " Pt of tracks associated to LV; track pt [GeV] " , 110 , 0 ., 11 .);
574595 meTrackEffEtaTot_ = ibook.book1D (" EffEtaTot" , " Eta of tracks associated to LV; track eta " , 66 , 0 ., 3.3 );
575596 meTrackMatchedTPEffPtTot_ =
@@ -2020,10 +2041,17 @@ void Primary4DVertexValidation::analyze(const edm::Event& iEvent, const edm::Eve
20202041 else
20212042 edm::LogWarning (" Primary4DVertexValidation" ) << " recoToSimH is not valid" ;
20222043
2044+ reco::BeamSpot beamSpot;
20232045 edm::Handle<reco::BeamSpot> BeamSpotH;
20242046 iEvent.getByToken (RecBeamSpotToken_, BeamSpotH);
20252047 if (!BeamSpotH.isValid ())
20262048 edm::LogWarning (" Primary4DVertexValidation" ) << " BeamSpotH is not valid" ;
2049+ beamSpot = *BeamSpotH;
2050+
2051+ edm::Handle<reco::TrackCollection> tks;
2052+ iEvent.getByToken (trkToken, tks);
2053+ const auto & theB = &iSetup.getData (theTTBToken);
2054+ std::vector<reco::TransientTrack> t_tks;
20272055
20282056 std::vector<simPrimaryVertex> simpv; // a list of simulated primary MC vertices
20292057 simpv = getSimPVs (TVCollectionH);
@@ -2061,6 +2089,35 @@ void Primary4DVertexValidation::analyze(const edm::Event& iEvent, const edm::Eve
20612089 // I have simPV and recoPV collections
20622090 matchReco2Sim (recopv, simpv, sigmat0Safe, mtdQualMVA, BeamSpotH);
20632091
2092+ t_tks = (*theB).build (tks, beamSpot, t0Safe, sigmat0Safe);
2093+
2094+ // track filter
2095+ std::vector<reco::TransientTrack>&& seltks = theTrackFilter->select (t_tks);
2096+
2097+ int unassociatedCount = 0 ;
2098+ for (std::vector<reco::TransientTrack>::const_iterator itk = seltks.begin (); itk != seltks.end (); itk++) {
2099+ reco::TrackBaseRef trackref = (*itk).trackBaseRef ();
2100+ bool isAssociated = false ;
2101+ for (unsigned int iv = 0 ; iv < recopv.size (); iv++) {
2102+ const reco::Vertex* vertex = recopv.at (iv).recVtx ;
2103+ for (auto iTrack = vertex->tracks_begin (); iTrack != vertex->tracks_end (); ++iTrack) {
2104+ if (*iTrack == trackref) {
2105+ isAssociated = true ;
2106+ break ;
2107+ }
2108+ }
2109+ if (isAssociated)
2110+ break ;
2111+ }
2112+
2113+ if (!isAssociated) {
2114+ unassociatedCount++;
2115+ }
2116+ }
2117+ double fraction = double (unassociatedCount) / (seltks.size ());
2118+ meUnAssocTracks_->Fill (log10 (unassociatedCount));
2119+ meFractionUnAssocTracks_->Fill (fraction);
2120+
20642121 // Loop on tracks
20652122 for (unsigned int iv = 0 ; iv < recopv.size (); iv++) {
20662123 if (recopv.at (iv).ndof > selNdof_) {
@@ -2752,6 +2809,7 @@ void Primary4DVertexValidation::fillDescriptions(edm::ConfigurationDescriptions&
27522809
27532810 desc.add <std::string>(" folder" , " MTD/Vertices" );
27542811 desc.add <edm::InputTag>(" TPtoRecoTrackAssoc" , edm::InputTag (" trackingParticleRecoTrackAsssociation" ));
2812+ desc.add <edm::InputTag>(" TrackLabel" , edm::InputTag (" generalTracks" ));
27552813 desc.add <edm::InputTag>(" mtdTracks" , edm::InputTag (" trackExtenderWithMTD" ));
27562814 desc.add <edm::InputTag>(" SimTag" , edm::InputTag (" mix" , " MergedTrackTruth" ));
27572815 desc.add <edm::InputTag>(" offlineBS" , edm::InputTag (" offlineBeamSpot" ));
@@ -2780,6 +2838,12 @@ void Primary4DVertexValidation::fillDescriptions(edm::ConfigurationDescriptions&
27802838 desc.add <double >(" trackweightTh" , 0.5 );
27812839 desc.add <double >(" mvaTh" , 0.8 );
27822840 desc.add <double >(" minProbHeavy" , 0.75 );
2841+ {
2842+ edm::ParameterSetDescription psd0;
2843+ HITrackFilterForPVFinding::fillPSetDescription (psd0); // extension of TrackFilterForPVFinding
2844+ desc.add <edm::ParameterSetDescription>(" TkFilterParameters" , psd0);
2845+ }
2846+
27832847 descriptions.add (" vertices4DValid" , desc);
27842848}
27852849
0 commit comments