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]);
85 if (levelArray->GetEntriesFast() > 0) {
86 triggerLevel_ = ((TObjString *)levelArray->At(0))->GetString();
92 TPRegexp ptRegexp(
"Mu([0-9]*)");
93 TObjArray * objArray = ptRegexp.MatchS(
hltPath_);
94 if (objArray->GetEntriesFast() >= 2) {
95 TObjString * ptCutString = (TObjString *)objArray->At(1);
96 cutMinPt_ = atoi(ptCutString->GetString());
106 TPRegexp suffixPtCut(
"Mu[0-9]+$");
109 if (baseDir[baseDir.size() - 1] !=
'/') baseDir +=
'/';
117 book1D(
"deltaR",
"deltaR",
";#Deltar(reco, HLT);");
118 book1D(
"hltPt",
"pt",
";p_{T} of HLT object");
119 book1D(
"hltEta",
"eta",
";#eta of HLT object");
120 book1D(
"hltPhi",
"phi",
";#phi of HLT object");
121 book1D(
"resolutionEta",
"resolutionEta",
";#eta^{reco}-#eta^{HLT};");
122 book1D(
"resolutionPhi",
"resolutionPhi",
";#phi^{reco}-#phi^{HLT};");
123 book1D(
"resolutionPt",
"resolutionRel",
124 ";(p_{T}^{reco}-p_{T}^{HLT})/|p_{T}^{reco}|;");
126 for (
size_t i = 0;
i < 2;
i++) {
130 book1D(
"efficiencyEta_" + suffix,
"eta",
";#eta;");
131 book1D(
"efficiencyPhi_" + suffix,
"phi",
";#phi;");
132 book1D(
"efficiencyTurnOn_" + suffix,
"pt",
";p_{T};");
133 book1D(
"efficiencyD0_" + suffix,
"d0",
";d0;");
134 book1D(
"efficiencyZ0_" + suffix,
"z0",
";z0;");
135 book1D(
"efficiencyCharge_" + suffix,
"charge",
";charge;");
136 book1D(
"efficiencyVertex_" + suffix,
"NVertex",
";NVertex;");
138 book2D(
"efficiencyPhiVsEta_" + suffix,
"etaCoarse",
"phiCoarse",
141 book1D(
"fakerateEta_" + suffix,
"eta",
";#eta;");
142 book1D(
"fakerateVertex_" + suffix,
"NVertex",
";NVertex;");
143 book1D(
"fakeratePhi_" + suffix,
"phi",
";#phi;");
144 book1D(
"fakerateTurnOn_" + suffix,
"pt",
";p_{T};");
146 book1D(
"massVsEtaZ_" + suffix,
"etaCoarse",
";#eta");
147 book1D(
"massVsEtaJpsi_" + suffix,
"etaCoarse",
";#eta");
148 book1D(
"massVsPtZ_" + suffix,
"ptCoarse",
";p_{T}");
149 book1D(
"massVsPtJpsi_" + suffix,
"ptCoarse",
";p_{T}");
150 book1D(
"massVsVertexZ_" + suffix,
"NVertex",
";NVertex");
151 book1D(
"massVsVertexJpsi_" + suffix,
"NVertex",
";NVertex");
183 iEvent.
getByLabel(
"offlinePrimaryVertices", vertices);
194 edm::LogError(
"HLTMuonMatchAndPlot")<<
"Missing triggerSummary with label " <<
inputTags_[
"triggerSummary"] <<std::endl;
200 edm::LogError(
"HLTMuonMatchAndPlot")<<
"Missing triggerResults with label " <<
inputTags_[
"triggerResults"] <<std::endl;
252 if (triggerIndex < triggerResults->
size() ||
253 !triggerResults->accept(triggerIndex))
265 for (
size_t i = 0;
i < hltMuons.size();
i++) {
266 hists_[
"hltPt"]->Fill(hltMuons[
i].pt());
272 vector<size_t> matches =
matchByDeltaR(targetMuons, hltMuons,
277 bool pairalreadyconsidered =
false;
278 for (
size_t i = 0;
i < targetMuons.size();
i++) {
283 if (matches[
i] < targetMuons.size()) {
285 double ptRes = (muon.
pt() - hltMuon.
pt()) / muon.
pt();
286 double etaRes = muon.
eta() - hltMuon.
eta();
287 double phiRes = muon.
phi() - hltMuon.
phi();
288 hists_[
"resolutionEta"]->Fill(etaRes);
289 hists_[
"resolutionPhi"]->Fill(phiRes);
290 hists_[
"resolutionPt"]->Fill(ptRes);
295 for (
size_t j = 0;
j < 2;
j++) {
300 if (suffix ==
"numer" && matches[
i] >= targetMuons.size())
continue;
312 const Track * track = 0;
316 double d0 = track->
dxy(beamSpot->position());
317 double z0 = track->
dz(beamSpot->position());
318 hists_[
"efficiencyVertex_" +
suffix]->Fill(vertices->size());
329 if(matches[
i] >= targetMuons.size())
continue;
330 for (
size_t k = 0;
k < targetMuons.size();
k++) {
332 if(muon.
pt() < 20.0)
continue;
333 Muon & theProbe = targetMuons[
k];
334 if (muon.
charge() != theProbe.
charge() && !pairalreadyconsidered) {
335 double mass = (muon.
p4() + theProbe.
p4()).M();
336 if(mass > 60 && mass < 120) {
337 hists_[
"massVsEtaZ_denom"]->Fill(theProbe.
eta());
338 hists_[
"massVsPtZ_denom"]->Fill(theProbe.
pt());
339 hists_[
"massVsVertexZ_denom"]->Fill(vertices->size());
340 if(matches[
k] < targetMuons.size()) {
341 hists_[
"massVsEtaZ_numer"]->Fill(theProbe.
eta());
342 hists_[
"massVsPtZ_numer"]->Fill(theProbe.
pt());
343 hists_[
"massVsVertexZ_numer"]->Fill(vertices->size());
345 pairalreadyconsidered =
true;
347 if(mass > 1 && mass < 4) {
348 hists_[
"massVsEtaJpsi_denom"]->Fill(theProbe.
eta());
349 hists_[
"massVsPtJpsi_denom"]->Fill(theProbe.
pt());
350 hists_[
"massVsVertexJpsi_denom"]->Fill(vertices->size());
351 if(matches[
k] < targetMuons.size()) {
352 hists_[
"massVsEtaJpsi_numer"]->Fill(theProbe.
eta());
353 hists_[
"massVsPtJpsi_numer"]->Fill(theProbe.
pt());
354 hists_[
"massVsVertexJpsi_numer"]->Fill(vertices->size());
356 pairalreadyconsidered =
true;
363 vector<size_t> hltMatches =
matchByDeltaR(hltMuons, targetMuons,
365 for (
size_t i = 0;
i < hltMuons.size();
i++) {
367 bool isFake = hltMatches[
i] > hltMuons.size();
368 for (
size_t j = 0;
j < 2;
j++) {
371 if (suffix ==
"numer" && ! isFake)
continue;
372 hists_[
"fakerateVertex_" +
suffix]->Fill(vertices->size());
389 if (binning.size() < 3) {
390 LogWarning(
"HLTMuonVal") <<
"Invalid binning parameters!";
395 if (binning.size() == 3) {
397 edges =
new float[nBins + 1];
398 const double min = binning[1];
399 const double binwidth = (binning[2] - binning[1]) / nBins;
400 for (
size_t i = 0;
i <= nBins;
i++) edges[
i] = min + (binwidth *
i);
405 nBins = binning.size() - 1;
406 edges =
new float[nBins + 1];
407 for (
size_t i = 0;
i <= nBins;
i++) edges[
i] = binning[
i];
431 vector<string>::const_iterator iter;
433 for (iter = names.begin(); iter != names.end(); ++iter) {
434 if (targetPset.
existsAs<
T>(* iter,
true))
436 else if (targetPset.
existsAs<
T>(* iter,
false))
445 template <
class T1,
class T2>
448 const vector<T2> & collection2,
449 const double maxDeltaR) {
451 const size_t n1 = collection1.size();
452 const size_t n2 = collection2.size();
454 vector<size_t>
result(n1, -1);
455 vector<vector<double> > deltaRMatrix(n1, vector<double>(n2,
NOMATCH));
457 for (
size_t i = 0;
i < n1;
i++)
458 for (
size_t j = 0;
j < n2;
j++) {
459 deltaRMatrix[
i][
j] =
deltaR(collection1[
i], collection2[
j]);
463 for (
size_t k = 0;
k < n1;
k++) {
466 double minDeltaR = maxDeltaR;
468 for (
size_t i = 0;
i < n1;
i++)
469 for (
size_t j = 0;
j < n2;
j++)
470 if (deltaRMatrix[
i][
j] < minDeltaR) {
473 minDeltaR = deltaRMatrix[
i][
j];
476 if (minDeltaR < maxDeltaR) {
477 result[i_min] = j_min;
478 deltaRMatrix[i_min] = vector<double>(n2,
NOMATCH);
479 for (
size_t i = 0;
i < n1;
i++)
495 double d0Cut,
double z0Cut)
502 MuonCollection::iterator iter = reducedMuons.begin();
503 while (iter != reducedMuons.end()) {
504 const Track * track = 0;
505 if (iter->isTrackerMuon()) track = & * iter->innerTrack();
506 else if (iter->isStandAloneMuon()) track = & * iter->outerTrack();
507 if (track && selector(* iter) &&
511 else reducedMuons.erase(iter);
528 if (!pset.
exists(
"hltCuts"))
536 size_t filterIndex = triggerSummary.
filterIndex(filterTag);
542 for (
size_t j = 0;
j < keys.size();
j++ ){
544 if (selector(foundObject))
545 selectedObjects.push_back(foundObject);
549 return selectedObjects;
580 string binningTypeY,
string title)
598 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
const std::string EFFICIENCY_SUFFIXES[2]
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
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
virtual double eta() const
momentum pseudorapidity
std::vector< Muon > MuonCollection
collection of Muon objects
std::vector< std::string > requiredTriggers_
Single trigger physics object (e.g., an isolated muon)
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
virtual int charge() const
electric charge
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
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 double pt() const
transverse momentum
std::vector< size_type > Keys
std::map< std::string, edm::InputTag > inputTags_
trigger::TriggerObjectCollection selectedTriggerObjects(const trigger::TriggerObjectCollection &, const trigger::TriggerEvent &, const edm::ParameterSet &)
std::vector< std::string > vstring
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.
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
virtual double phi() const
momentum azimuthal angle
virtual const LorentzVector & p4() const
four-momentum Lorentz vector
static const HistoName names[]
std::map< std::string, double > plotCuts_
tuple size
Write out results.
void setCurrentFolder(const std::string &fullpath)