34 using namespace trigger;
35 using namespace l1extra;
46 vector<string> moduleLabels) :
47 hltProcessName_(pset.getParameter<
string>(
"hltProcessName")),
48 destination_(pset.getUntrackedParameter<
string>(
"destination")),
49 requiredTriggers_(pset.getUntrackedParameter<
vstring>(
"requiredTriggers")),
53 moduleLabels_(moduleLabels),
54 hasTargetRecoCuts(targetParams_.exists(
"recoCuts")),
55 hasProbeRecoCuts(probeParams_.exists(
"recoCuts")),
56 targetMuonSelector_(targetParams_.getUntrackedParameter<
string>(
"recoCuts",
"")),
57 targetZ0Cut_(targetParams_.getUntrackedParameter<double>(
"z0Cut",0.)),
58 targetD0Cut_(targetParams_.getUntrackedParameter<double>(
"d0Cut",0.)),
59 probeMuonSelector_(probeParams_.getUntrackedParameter<
string>(
"recoCuts",
"")),
60 probeZ0Cut_(probeParams_.getUntrackedParameter<double>(
"z0Cut",0.)),
61 probeD0Cut_(probeParams_.getUntrackedParameter<double>(
"d0Cut",0.))
81 TPRegexp levelRegexp(
"L[1-3]");
83 TObjArray * levelArray = levelRegexp.MatchS(
moduleLabels_[nModules - 1]);
84 if (levelArray->GetEntriesFast() > 0) {
85 triggerLevel_ = ((TObjString *)levelArray->At(0))->GetString();
91 TPRegexp ptRegexp(
"Mu([0-9]*)");
92 TObjArray * objArray = ptRegexp.MatchS(
hltPath_);
93 if (objArray->GetEntriesFast() >= 2) {
94 TObjString * ptCutString = (TObjString *)objArray->At(1);
95 cutMinPt_ = atoi(ptCutString->GetString());
105 TPRegexp suffixPtCut(
"Mu[0-9]+$");
108 if (baseDir[baseDir.size() - 1] !=
'/') baseDir +=
'/';
116 book1D(
"deltaR",
"deltaR",
";#Deltar(reco, HLT);");
117 book1D(
"hltPt",
"pt",
";p_{T} of HLT object");
118 book1D(
"hltEta",
"eta",
";#eta of HLT object");
119 book1D(
"hltPhi",
"phi",
";#phi of HLT object");
120 book1D(
"resolutionEta",
"resolutionEta",
";#eta^{reco}-#eta^{HLT};");
121 book1D(
"resolutionPhi",
"resolutionPhi",
";#phi^{reco}-#phi^{HLT};");
122 book1D(
"resolutionPt",
"resolutionRel",
123 ";(p_{T}^{reco}-p_{T}^{HLT})/|p_{T}^{reco}|;");
125 for (
size_t i = 0;
i < 2;
i++) {
129 book1D(
"efficiencyEta_" + suffix,
"eta",
";#eta;");
130 book1D(
"efficiencyPhi_" + suffix,
"phi",
";#phi;");
131 book1D(
"efficiencyTurnOn_" + suffix,
"pt",
";p_{T};");
132 book1D(
"efficiencyD0_" + suffix,
"d0",
";d0;");
133 book1D(
"efficiencyZ0_" + suffix,
"z0",
";z0;");
134 book1D(
"efficiencyCharge_" + suffix,
"charge",
";charge;");
135 book1D(
"efficiencyVertex_" + suffix,
"NVertex",
";NVertex;");
137 book2D(
"efficiencyPhiVsEta_" + suffix,
"etaCoarse",
"phiCoarse",
140 book1D(
"fakerateEta_" + suffix,
"eta",
";#eta;");
141 book1D(
"fakerateVertex_" + suffix,
"NVertex",
";NVertex;");
142 book1D(
"fakeratePhi_" + suffix,
"phi",
";#phi;");
143 book1D(
"fakerateTurnOn_" + suffix,
"pt",
";p_{T};");
145 book1D(
"massVsEtaZ_" + suffix,
"etaCoarse",
";#eta");
146 book1D(
"massVsEtaJpsi_" + suffix,
"etaCoarse",
";#eta");
147 book1D(
"massVsPtZ_" + suffix,
"ptCoarse",
";p_{T}");
148 book1D(
"massVsPtJpsi_" + suffix,
"ptCoarse",
";p_{T}");
149 book1D(
"massVsVertexZ_" + suffix,
"NVertex",
";NVertex");
150 book1D(
"massVsVertexJpsi_" + suffix,
"NVertex",
";NVertex");
182 iEvent.
getByLabel(
"offlinePrimaryVertices", vertices);
193 edm::LogError(
"HLTMuonMatchAndPlot")<<
"Missing triggerSummary with label " <<
inputTags_[
"triggerSummary"] <<std::endl;
199 edm::LogError(
"HLTMuonMatchAndPlot")<<
"Missing triggerResults with label " <<
inputTags_[
"triggerResults"] <<std::endl;
251 if (triggerIndex < triggerResults->
size() ||
252 !triggerResults->accept(triggerIndex))
264 for (
size_t i = 0;
i < hltMuons.size();
i++) {
265 hists_[
"hltPt"]->Fill(hltMuons[
i].pt());
271 vector<size_t> matches =
matchByDeltaR(targetMuons, hltMuons,
276 bool pairalreadyconsidered =
false;
277 for (
size_t i = 0;
i < targetMuons.size();
i++) {
282 if (matches[
i] < targetMuons.size()) {
284 double ptRes = (muon.
pt() - hltMuon.
pt()) / muon.
pt();
285 double etaRes = muon.
eta() - hltMuon.
eta();
286 double phiRes = muon.
phi() - hltMuon.
phi();
287 hists_[
"resolutionEta"]->Fill(etaRes);
288 hists_[
"resolutionPhi"]->Fill(phiRes);
289 hists_[
"resolutionPt"]->Fill(ptRes);
294 for (
size_t j = 0;
j < 2;
j++) {
299 if (suffix ==
"numer" && matches[
i] >= targetMuons.size())
continue;
311 const Track * track = 0;
315 double d0 = track->
dxy(beamSpot->position());
316 double z0 = track->
dz(beamSpot->position());
317 hists_[
"efficiencyVertex_" +
suffix]->Fill(vertices->size());
328 if(matches[
i] >= targetMuons.size())
continue;
329 for (
size_t k = 0;
k < targetMuons.size();
k++) {
331 if(muon.
pt() < 20.0)
continue;
332 Muon & theProbe = targetMuons[
k];
333 if (muon.
charge() != theProbe.
charge() && !pairalreadyconsidered) {
334 double mass = (muon.
p4() + theProbe.
p4()).M();
335 if(mass > 60 && mass < 120) {
336 hists_[
"massVsEtaZ_denom"]->Fill(theProbe.
eta());
337 hists_[
"massVsPtZ_denom"]->Fill(theProbe.
pt());
338 hists_[
"massVsVertexZ_denom"]->Fill(vertices->size());
339 if(matches[
k] < targetMuons.size()) {
340 hists_[
"massVsEtaZ_numer"]->Fill(theProbe.
eta());
341 hists_[
"massVsPtZ_numer"]->Fill(theProbe.
pt());
342 hists_[
"massVsVertexZ_numer"]->Fill(vertices->size());
344 pairalreadyconsidered =
true;
346 if(mass > 1 && mass < 4) {
347 hists_[
"massVsEtaJpsi_denom"]->Fill(theProbe.
eta());
348 hists_[
"massVsPtJpsi_denom"]->Fill(theProbe.
pt());
349 hists_[
"massVsVertexJpsi_denom"]->Fill(vertices->size());
350 if(matches[
k] < targetMuons.size()) {
351 hists_[
"massVsEtaJpsi_numer"]->Fill(theProbe.
eta());
352 hists_[
"massVsPtJpsi_numer"]->Fill(theProbe.
pt());
353 hists_[
"massVsVertexJpsi_numer"]->Fill(vertices->size());
355 pairalreadyconsidered =
true;
362 vector<size_t> hltMatches =
matchByDeltaR(hltMuons, targetMuons,
364 for (
size_t i = 0;
i < hltMuons.size();
i++) {
366 bool isFake = hltMatches[
i] > hltMuons.size();
367 for (
size_t j = 0;
j < 2;
j++) {
370 if (suffix ==
"numer" && ! isFake)
continue;
371 hists_[
"fakerateVertex_" +
suffix]->Fill(vertices->size());
388 if (binning.size() < 3) {
389 LogWarning(
"HLTMuonVal") <<
"Invalid binning parameters!";
394 if (binning.size() == 3) {
396 edges =
new float[nBins + 1];
397 const double min = binning[1];
398 const double binwidth = (binning[2] - binning[1]) / nBins;
399 for (
size_t i = 0;
i <= nBins;
i++) edges[
i] = min + (binwidth *
i);
404 nBins = binning.size() - 1;
405 edges =
new float[nBins + 1];
406 for (
size_t i = 0;
i <= nBins;
i++) edges[
i] = binning[
i];
430 vector<string>::const_iterator iter;
432 for (iter = names.begin(); iter != names.end(); ++iter) {
433 if (targetPset.
existsAs<
T>(* iter,
true))
435 else if (targetPset.
existsAs<
T>(* iter,
false))
444 template <
class T1,
class T2>
447 const vector<T2> & collection2,
448 const double maxDeltaR) {
450 const size_t n1 = collection1.size();
451 const size_t n2 = collection2.size();
453 vector<size_t>
result(n1, -1);
454 vector<vector<double> > deltaRMatrix(n1, vector<double>(n2,
NOMATCH));
456 for (
size_t i = 0;
i < n1;
i++)
457 for (
size_t j = 0;
j < n2;
j++) {
458 deltaRMatrix[
i][
j] =
deltaR(collection1[
i], collection2[
j]);
462 for (
size_t k = 0;
k < n1;
k++) {
465 double minDeltaR = maxDeltaR;
467 for (
size_t i = 0;
i < n1;
i++)
468 for (
size_t j = 0;
j < n2;
j++)
469 if (deltaRMatrix[
i][
j] < minDeltaR) {
472 minDeltaR = deltaRMatrix[
i][
j];
475 if (minDeltaR < maxDeltaR) {
476 result[i_min] = j_min;
477 deltaRMatrix[i_min] = vector<double>(n2,
NOMATCH);
478 for (
size_t i = 0;
i < n1;
i++)
494 double d0Cut,
double z0Cut)
501 MuonCollection::iterator iter = reducedMuons.begin();
502 while (iter != reducedMuons.end()) {
503 const Track * track = 0;
504 if (iter->isTrackerMuon()) track = & * iter->innerTrack();
505 else if (iter->isStandAloneMuon()) track = & * iter->outerTrack();
506 if (track && selector(* iter) &&
510 else reducedMuons.erase(iter);
527 if (!pset.
exists(
"hltCuts"))
535 size_t filterIndex = triggerSummary.
filterIndex(filterTag);
541 for (
size_t j = 0;
j < keys.size();
j++ ){
543 if (selector(foundObject))
544 selectedObjects.push_back(foundObject);
548 return selectedObjects;
579 string binningTypeY,
string title)
597 nBinsX, edgesX, nBinsY, edgesY);
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
reco::MuonCollection selectedMuons(const reco::MuonCollection &, const reco::BeamSpot &, bool, const StringCutObjectSelector< reco::Muon > &, double, double)
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
StringCutObjectSelector< reco::Muon > probeMuonSelector_
The single EDProduct to be saved for each event (AOD case)
trigger::size_type sizeFilters() const
static const HistoName names[]
const std::string EFFICIENCY_SUFFIXES[2]
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
virtual const LorentzVector & p4() const GCC11_FINAL
four-momentum Lorentz vector
virtual TrackRef innerTrack() const
edm::ParameterSet targetParams_
bool isTrackerMuon() const
ParameterSet const & getParameterSet(ParameterSetID const &id)
std::vector< std::string > moduleLabels_
const Keys & filterKeys(trigger::size_type index) const
trigger::size_type filterIndex(const edm::InputTag &filterTag) const
find index of filter in data-member vector from filter tag
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void fillEdges(size_t &nBins, float *&edges, std::vector< double > binning)
void book1D(std::string, std::string, std::string)
std::map< std::string, std::vector< double > > binParams_
std::string triggerLevel_
std::map< std::string, MonitorElement * > hists_
bool isStandAloneMuon() const
std::vector< Muon > MuonCollection
collection of Muon objects
std::vector< std::string > requiredTriggers_
Single trigger physics object (e.g., an isolated muon)
virtual float phi() const GCC11_FINAL
momentum azimuthal angle
void analyze(const edm::Event &, const edm::EventSetup &)
std::string hltProcessName_
void beginRun(const edm::Run &, const edm::EventSetup &)
std::vector< size_t > matchByDeltaR(const std::vector< T1 > &, const std::vector< T2 > &, const double maxDeltaR=NOMATCH)
HLTMuonMatchAndPlot(const edm::ParameterSet &, std::string, std::vector< std::string >)
Constructor.
ParameterSet const & getUntrackedParameterSet(std::string const &name, ParameterSet const &defaultValue) const
TH1F * getTH1F(std::string name, std::string process, std::string rootfolder, DQMStore *dbe_, bool verb, bool clone)
std::vector< std::string > getParameterNames() const
void book2D(std::string, std::string, std::string, std::string)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
virtual float eta() const GCC11_FINAL
momentum pseudorapidity
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 deltaR(double eta1, double eta2, double phi1, double phi2)
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
StringCutObjectSelector< reco::Muon > targetMuonSelector_
ParameterSet const & getParameterSet(std::string const &) const
virtual int charge() const GCC11_FINAL
electric charge
std::vector< size_type > Keys
std::map< std::string, edm::InputTag > inputTags_
trigger::TriggerObjectCollection selectedTriggerObjects(const trigger::TriggerObjectCollection &, const trigger::TriggerEvent &, const edm::ParameterSet &)
void fillMapFromPSet(std::map< std::string, T > &, edm::ParameterSet, std::string)
TH2F * getTH2F(std::string name, std::string process, std::string rootfolder, DQMStore *dbe_, bool verb, bool clone)
void endRun(const edm::Run &, const edm::EventSetup &)
const Point & position() const
position
MonitorElement * book2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D histogram.
virtual float pt() const GCC11_FINAL
transverse momentum
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::map< std::string, double > plotCuts_
tuple size
Write out results.
void setCurrentFolder(const std::string &fullpath)