6 #include <fmt/printf.h> 22 #include "TLorentzVector.h" 26 constexpr
float mumass2 = 0.105658367 * 0.105658367;
33 motherName_(iConfig.getParameter<
std::
string>(
"decayMotherName")),
34 MEFolderName_(iConfig.getParameter<
std::
string>(
"FolderName")),
35 useClosestVertex_(iConfig.getParameter<
bool>(
"useClosestVertex")),
36 maxSVdist_(iConfig.getParameter<double>(
"maxSVdist")) {
39 }
else if (
motherName_.find(
"J/#psi") != std::string::npos) {
41 }
else if (
motherName_.find(
"#Upsilon") != std::string::npos) {
45 <<
" setting the default for the Z->mm (50.,120.)" << std::endl;
58 ts = fmt::sprintf(
"#chi^{2} of the %s vertex; #chi^{2} of the %s vertex; %s",
motherName_,
motherName_, ps);
61 ts = fmt::sprintf(
"#chi^{2}/ndf of the %s vertex; #chi^{2}/ndf of %s vertex; %s",
motherName_,
motherName_, ps);
65 ts = fmt::sprintf(
"%s;PV- %sV xy distance [#mum];%s", histTit,
motherName_, ps);
68 ts = fmt::sprintf(
"%s;PV-%sV xy distance error [#mum];%s", histTit,
motherName_, ps);
71 ts = fmt::sprintf(
"%s;PV-%sV xy distance signficance;%s", histTit,
motherName_, ps);
74 ts = fmt::sprintf(
"compatibility of %s vertex; compatibility of %s vertex; %s",
motherName_,
motherName_, ps);
77 ts = fmt::sprintf(
"%s;PV-%sV 3D distance [#mum];%s", histTit,
motherName_, ps);
80 ts = fmt::sprintf(
"%s;PV-%sV 3D distance error [#mum];%s", histTit,
motherName_, ps);
83 ts = fmt::sprintf(
"%s;PV-%sV 3D distance signficance;%s", histTit,
motherName_, ps);
86 ts = fmt::sprintf(
"3D compatibility of %s vertex;3D compatibility of %s vertex; %s",
motherName_,
motherName_, ps);
90 hCosPhi_ = iBooker.
book1D(
"CosPhi", fmt::sprintf(
"%s;cos(#phi_{xy});%s", histTit, ps), 50, -1., 1.);
91 hCosPhi3D_ = iBooker.
book1D(
"CosPhi3D", fmt::sprintf(
"%s;cos(#phi_{3D});%s", histTit, ps), 50, -1., 1.);
92 hCosPhiInv_ = iBooker.
book1D(
"CosPhiInv", fmt::sprintf(
"%s;inverted cos(#phi_{xy});%s", histTit, ps), 50, -1., 1.);
93 hCosPhiInv3D_ = iBooker.
book1D(
"CosPhiInv3D", fmt::sprintf(
"%s;inverted cos(#phi_{3D});%s", histTit, ps), 50, -1., 1.);
95 hdxy_ = iBooker.
book1D(
"dxy", fmt::sprintf(
"%s;muon track d_{xy}(PV) [#mum];muon tracks", histTit), 150, -300, 300);
96 hdz_ = iBooker.
book1D(
"dz", fmt::sprintf(
"%s;muon track d_{z}(PV) [#mum];muon tracks", histTit), 150, -300, 300);
97 hdxyErr_ = iBooker.
book1D(
"dxyErr", fmt::sprintf(
"%s;muon track err_{dxy} [#mum];muon tracks", histTit), 250, 0., 500.);
98 hdzErr_ = iBooker.
book1D(
"dzErr", fmt::sprintf(
"%s;muon track err_{dz} [#mum];muon tracks", histTit), 250, 0., 500.);
99 hIP2d_ = iBooker.
book1D(
"IP2d", fmt::sprintf(
"%s;muon track IP_{2D} [#mum];muon tracks", histTit), 150, -300, 300);
100 hIP3d_ = iBooker.
book1D(
"IP3d", fmt::sprintf(
"%s;muon track IP_{3D} [#mum];muon tracks", histTit), 150, -300, 300);
101 hIP2dsig_ = iBooker.
book1D(
"IP2Dsig", fmt::sprintf(
"%s;muon track IP_{2D} significance;muon tracks", histTit), 100, 0., 5.);
102 hIP3dsig_ = iBooker.
book1D(
"IP3Dsig", fmt::sprintf(
"%s;muon track IP_{3D} significance;muon tracks", histTit), 100, 0., 5.);
107 std::vector<const reco::Track*> myTracks;
109 if (!trackHandle.isValid()) {
110 edm::LogError(
"DiMuonVertexMonitor") <<
"invalid track collection encountered!";
114 for (
const auto& muonTrk : *trackHandle) {
115 myTracks.emplace_back(&muonTrk);
120 std::vector<reco::TransientTrack> tks;
122 if (myTracks.size() != 2) {
123 edm::LogWarning(
"DiMuonVertexMonitor") <<
"There are not enough tracks to monitor!";
127 const auto&
t1 = myTracks[1]->momentum();
128 const auto&
t0 = myTracks[0]->momentum();
129 const auto& ditrack =
t1 +
t0;
131 const auto& tplus = myTracks[0]->charge() > 0 ? myTracks[0] : myTracks[1];
132 const auto& tminus = myTracks[0]->charge() < 0 ? myTracks[0] : myTracks[1];
134 TLorentzVector p4_tplus(tplus->px(), tplus->py(), tplus->pz(),
sqrt((tplus->p() * tplus->p()) +
mumass2));
135 TLorentzVector p4_tminus(tminus->px(), tminus->py(), tminus->pz(),
sqrt((tminus->p() * tminus->p()) +
mumass2));
137 const auto& Zp4 = p4_tplus + p4_tminus;
138 float track_invMass = Zp4.M();
142 std::pair<TLorentzVector, TLorentzVector> tktk_p4 = std::make_pair(p4_tplus, p4_tminus);
147 for (
const auto&
track : myTracks) {
149 tks.push_back(trajectory);
153 mumuTransientVtx = kalman.
vertex(tks);
160 if (!mumuTransientVtx.
isValid())
170 edm::LogWarning(
"DiMuonVertexMonitor") <<
"invalid vertex collection encountered Skipping event!";
176 theMainVtx = *theClosestVertex;
178 theMainVtx = vertexHandle.
product()->front();
185 theMainVtxPos.x() - myVertex.x(), theMainVtxPos.y() - myVertex.y(), theMainVtxPos.z() - myVertex.z());
189 for (
const auto&
track : myTracks) {
209 double dist_err = vertTool.
distance(mumuTransientVtx, theMainVtx).
error();
210 float compatibility = 0.;
213 compatibility = vertTool.
compatibility(mumuTransientVtx, theMainVtx);
215 LogTrace(
"DiMuonVertexMonitor") <<
"caught std::exception " << er.
what() << std::endl;
225 double distance3D = vertTool3D.
distance(mumuTransientVtx, theMainVtx).
value();
226 double dist3D_err = vertTool3D.
distance(mumuTransientVtx, theMainVtx).
error();
227 float compatibility3D = 0.;
230 compatibility3D = vertTool3D.
compatibility(mumuTransientVtx, theMainVtx);
232 LogTrace(
"DiMuonVertexMonitor") <<
"caught std::exception " << er.
what() << std::endl;
242 double cosphi = (ZpT.x() * deltaVtx.x() + ZpT.y() * deltaVtx.y()) /
243 (
sqrt(ZpT.x() * ZpT.x() + ZpT.y() * ZpT.y()) *
244 sqrt(deltaVtx.x() * deltaVtx.x() + deltaVtx.y() * deltaVtx.y()));
246 double cosphi3D = (Zp.x() * deltaVtx.x() + Zp.y() * deltaVtx.y() + Zp.z() * deltaVtx.z()) /
247 (
sqrt(Zp.x() * Zp.x() + Zp.y() * Zp.y() + Zp.z() * Zp.z()) *
248 sqrt(deltaVtx.x() * deltaVtx.x() + deltaVtx.y() * deltaVtx.y() + deltaVtx.z() * deltaVtx.z()));
257 edm::LogWarning(
"DiMuonVertexMonitor") <<
"hardest primary vertex in the event is not valid!";
272 int closestVtxIndex = 0;
283 if ((*vertices).at(closestVtxIndex).isValid()) {
284 return &(
vertices->at(closestVtxIndex));
296 desc.add<
bool>(
"useClosestVertex",
true);
297 desc.add<
double>(
"maxSVdist", 50.);
MonitorElement * hdxyErr_
const std::string MEFolderName_
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
const bool useClosestVertex_
float totalChiSquared() const
MonitorElement * hCosPhiInv_
std::pair< float, float > massLimits_
GlobalPoint position() const
MonitorElement * hSVDist3DErr_
virtual void setCurrentFolder(std::string const &fullpath)
MonitorElement * hIP2dsig_
Measurement1D distance(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
MonitorElement * hSVProb_
static constexpr float mumass2
const Point & position() const
position
T const * product() const
std::vector< Track > TrackCollection
collection of Tracks
MonitorElement * hCosPhi_
MonitorElement * hSVCompatibility_
std::vector< Vertex > VertexCollection
collection of Vertex objects
Log< level::Error, false > LogError
std::vector< Vertex > VertexCollection
float degreesOfFreedom() const
MonitorElement * hIP3dsig_
const std::string motherName_
MonitorElement * hSVNormChi2_
CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &tracks) const override
MonitorElement * hCosPhiInv3D_
reco::TransientTrack build(const reco::Track *p) const
MonitorElement * hSVDist3D_
MonitorElement * hSVDist3DSig_
DiMuonVertexMonitor(const edm::ParameterSet &)
MonitorElement * hSVChi2_
const reco::Vertex * findClosestVertex(const TransientVertex aTransVtx, const reco::VertexCollection *vertices) const
const edm::EDGetTokenT< reco::TrackCollection > tracksToken_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
#define DEFINE_FWK_MODULE(type)
MonitorElement * hSVDistSig_
bool getData(T &iHolder) const
Measurement1D distance(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
void analyze(const edm::Event &, const edm::EventSetup &) override
XYZPointD XYZPoint
point in space with cartesian internal representation
MonitorElement * hSVDist_
float compatibility(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
MonitorElement * hSVCompatibility3D_
const edm::EDGetTokenT< reco::VertexCollection > vertexToken_
static std::atomic< unsigned int > counter
MonitorElement * hSVDistErr_
MonitorElement * hCosPhi3D_
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
char const * what() const noexcept override
static constexpr float cmToum
bool isValid() const
Tells whether the vertex is valid.
const edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > ttbESToken_
MonitorElement * hInvMass_
float compatibility(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)