3232#include " CommonTools/UtilAlgos/interface/TFileService.h"
3333#include " DataFormats/BeamSpot/interface/BeamSpot.h"
3434#include " DataFormats/Common/interface/Association.h"
35+ #include " DataFormats/Common/interface/RefToBase.h"
3536#include " DataFormats/Common/interface/ValueMap.h"
3637#include " DataFormats/TrackReco/interface/Track.h"
3738#include " DataFormats/TrackReco/interface/TrackFwd.h"
3839#include " DataFormats/VertexReco/interface/Vertex.h"
3940#include " DataFormats/VertexReco/interface/VertexFwd.h"
40- #include " FWCore/ServiceRegistry/interface/Service.h"
4141#include " FWCore/Framework/interface/Event.h"
4242#include " FWCore/Framework/interface/Frameworkfwd.h"
4343#include " FWCore/Framework/interface/MakerMacros.h"
4444#include " FWCore/Framework/interface/one/EDAnalyzer.h"
4545#include " FWCore/ParameterSet/interface/ParameterSet.h"
46+ #include " FWCore/ServiceRegistry/interface/Service.h"
4647#include " FWCore/Utilities/interface/InputTag.h"
4748#include " FWCore/Utilities/interface/isFinite.h"
4849
@@ -123,6 +124,7 @@ class GeneralPurposeVertexAnalyzer : public edm::one::EDAnalyzer<edm::one::Share
123124 TProfile2D *IPVsEtaVsPhi_, *IPErrVsEtaVsPhi_;
124125
125126 void bookIPMonitor (const edm::ParameterSet &, const edm::Service<TFileService> fs);
127+ void fillIPMonitor (const edm::RefToBase<reco::Track> &tk, const math::XYZPoint &pv);
126128 };
127129
128130 const edm::ParameterSet conf_;
@@ -187,23 +189,35 @@ class GeneralPurposeVertexAnalyzer : public edm::one::EDAnalyzer<edm::one::Share
187189
188190void GeneralPurposeVertexAnalyzer::IPMonitoring::bookIPMonitor (const edm::ParameterSet &config,
189191 const edm::Service<TFileService> fs) {
192+ // Lambda for range validation
193+ auto checkRange = [](const std::string &name, double min, double max) {
194+ if (min >= max) {
195+ throw cms::Exception (" IPMonitoring" )
196+ << " Invalid range for " << name << " : min (" << min << " ) >= max (" << max << " )" ;
197+ }
198+ };
199+
190200 int VarBin = config.getParameter <int >(fmt::format (" D{}Bin" , varname_));
191201 double VarMin = config.getParameter <double >(fmt::format (" D{}Min" , varname_));
192202 double VarMax = config.getParameter <double >(fmt::format (" D{}Max" , varname_));
203+ checkRange (fmt::format (" D{}" , varname_), VarMin, VarMax);
193204
194205 int PhiBin = config.getParameter <int >(" PhiBin" );
195206 int PhiBin2D = config.getParameter <int >(" PhiBin2D" );
196207 double PhiMin = config.getParameter <double >(" PhiMin" );
197208 double PhiMax = config.getParameter <double >(" PhiMax" );
209+ checkRange (" Phi" , PhiMin, PhiMax);
198210
199211 int EtaBin = config.getParameter <int >(" EtaBin" );
200212 int EtaBin2D = config.getParameter <int >(" EtaBin2D" );
201213 double EtaMin = config.getParameter <double >(" EtaMin" );
202214 double EtaMax = config.getParameter <double >(" EtaMax" );
215+ checkRange (" Eta" , EtaMin, EtaMax);
203216
204217 int PtBin = config.getParameter <int >(" PtBin" );
205218 double PtMin = config.getParameter <double >(" PtMin" ) * pTcut_;
206219 double PtMax = config.getParameter <double >(" PtMax" ) * pTcut_;
220+ checkRange (" Pt" , PtMin, PtMax);
207221
208222 IP_ = fs->make <TH1D>(fmt::format (" d{}_pt{}" , varname_, pTcut_).c_str (),
209223 fmt::format (" PV tracks (p_{{T}} > {} GeV) d_{{{}}} (#mum)" , pTcut_, varname_).c_str (),
@@ -336,6 +350,38 @@ void GeneralPurposeVertexAnalyzer::IPMonitoring::bookIPMonitor(const edm::Parame
336350 fmt::format (" PV tracks (p_{{T}} > {} GeV) d_{{{}}} error (#mum)" , pTcut_, varname_).c_str ());
337351}
338352
353+ void GeneralPurposeVertexAnalyzer::IPMonitoring::fillIPMonitor (const edm::RefToBase<reco::Track> &tk,
354+ const math::XYZPoint &pv) {
355+ float value = 999 .f , error = 9999 .f ;
356+
357+ if (varname_ == " xy" ) {
358+ value = tk->dxy (pv) * cmToUm;
359+ error = tk->dxyError () * cmToUm;
360+ } else if (varname_ == " z" ) {
361+ value = tk->dz (pv) * cmToUm;
362+ error = tk->dzError () * cmToUm;
363+ } else {
364+ throw cms::Exception (" IPMonitoring" ) << " Unknown varname: " << varname_ << " . Expected 'xy' or 'z\' ." ;
365+ }
366+
367+ const float eta = tk->eta ();
368+ const float phi = tk->phi ();
369+ const float pt = tk->pt ();
370+
371+ IP_->Fill (value);
372+ IPVsPhi_->Fill (phi, value);
373+ IPVsEta_->Fill (eta, value);
374+ IPVsPt_->Fill (pt, value);
375+ IPVsEtaVsPhi_->Fill (eta, phi, value);
376+
377+ IPErr_->Fill (error);
378+ IPPull_->Fill (value / error);
379+ IPErrVsPhi_->Fill (phi, error);
380+ IPErrVsEta_->Fill (eta, error);
381+ IPErrVsPt_->Fill (pt, error);
382+ IPErrVsEtaVsPhi_->Fill (eta, phi, error);
383+ }
384+
339385//
340386// constructors and destructor
341387//
@@ -510,9 +556,6 @@ void GeneralPurposeVertexAnalyzer::pvTracksPlots(const reco::Vertex &v) {
510556 const float chi2NDF = t->normalizedChi2 ();
511557 const float chi2Prob = TMath::Prob (t->chi2 (), static_cast <int >(t->ndof ()));
512558 const float Dxy = t->dxy (myVertex) * cmToUm;
513- const float Dz = t->dz (myVertex) * cmToUm;
514- const float DxyErr = t->dxyError () * cmToUm;
515- const float DzErr = t->dzError () * cmToUm;
516559
517560 sumPT += pt2;
518561
@@ -524,60 +567,20 @@ void GeneralPurposeVertexAnalyzer::pvTracksPlots(const reco::Vertex &v) {
524567 eta_pt1->Fill (eta);
525568
526569 // dxy pT>1
527-
528- dxy_pt1.IP_ ->Fill (Dxy);
529- dxy_pt1.IPVsPhi_ ->Fill (phi, Dxy);
530- dxy_pt1.IPVsEta_ ->Fill (eta, Dxy);
531- dxy_pt1.IPVsEtaVsPhi_ ->Fill (eta, phi, Dxy);
532-
533- dxy_pt1.IPErr_ ->Fill (DxyErr);
534- dxy_pt1.IPPull_ ->Fill (Dxy / DxyErr);
535- dxy_pt1.IPErrVsPhi_ ->Fill (phi, DxyErr);
536- dxy_pt1.IPErrVsEta_ ->Fill (eta, DxyErr);
537- dxy_pt1.IPErrVsEtaVsPhi_ ->Fill (eta, phi, DxyErr);
570+ dxy_pt1.fillIPMonitor (t, myVertex);
538571
539572 // dz pT>1
540-
541- dz_pt1.IP_ ->Fill (Dz);
542- dz_pt1.IPVsPhi_ ->Fill (phi, Dz);
543- dz_pt1.IPVsEta_ ->Fill (eta, Dz);
544- dz_pt1.IPVsEtaVsPhi_ ->Fill (eta, phi, Dz);
545-
546- dz_pt1.IPErr_ ->Fill (DzErr);
547- dz_pt1.IPPull_ ->Fill (Dz / DzErr);
548- dz_pt1.IPErrVsPhi_ ->Fill (phi, DzErr);
549- dz_pt1.IPErrVsEta_ ->Fill (eta, DzErr);
550- dz_pt1.IPErrVsEtaVsPhi_ ->Fill (eta, phi, DzErr);
573+ dz_pt1.fillIPMonitor (t, myVertex);
551574
552575 if (pt >= 10 .f ) {
553576 phi_pt10->Fill (phi);
554577 eta_pt10->Fill (eta);
555578
556579 // dxy pT>10
557-
558- dxy_pt10.IP_ ->Fill (Dxy);
559- dxy_pt10.IPVsPhi_ ->Fill (phi, Dxy);
560- dxy_pt10.IPVsEta_ ->Fill (eta, Dxy);
561- dxy_pt10.IPVsEtaVsPhi_ ->Fill (eta, phi, Dxy);
562-
563- dxy_pt10.IPErr_ ->Fill (DxyErr);
564- dxy_pt10.IPPull_ ->Fill (Dxy / DxyErr);
565- dxy_pt10.IPErrVsPhi_ ->Fill (phi, DxyErr);
566- dxy_pt10.IPErrVsEta_ ->Fill (eta, DxyErr);
567- dxy_pt10.IPErrVsEtaVsPhi_ ->Fill (eta, phi, DxyErr);
580+ dxy_pt10.fillIPMonitor (t, myVertex);
568581
569582 // dz pT>10
570-
571- dz_pt10.IP_ ->Fill (Dz);
572- dz_pt10.IPVsPhi_ ->Fill (phi, Dz);
573- dz_pt10.IPVsEta_ ->Fill (eta, Dz);
574- dz_pt10.IPVsEtaVsPhi_ ->Fill (eta, phi, Dz);
575-
576- dz_pt10.IPErr_ ->Fill (DzErr);
577- dz_pt10.IPPull_ ->Fill (Dz / DzErr);
578- dz_pt10.IPErrVsPhi_ ->Fill (phi, DzErr);
579- dz_pt10.IPErrVsEta_ ->Fill (eta, DzErr);
580- dz_pt10.IPErrVsEtaVsPhi_ ->Fill (eta, phi, DzErr);
583+ dz_pt10.fillIPMonitor (t, myVertex);
581584 }
582585 }
583586
0 commit comments