Skip to content

Commit

Permalink
Merge pull request #14448 from mtosi/from-CMSSW_8_0_X_2016-05-10-2300…
Browse files Browse the repository at this point in the history
…_hitEffVsBX

add track hit eff monitoring vs BX
  • Loading branch information
cmsbuild committed May 31, 2016
2 parents 5ce8684 + e0d4c74 commit d74708f
Show file tree
Hide file tree
Showing 11 changed files with 181 additions and 92 deletions.
22 changes: 16 additions & 6 deletions DQM/TrackingMonitor/interface/TrackAnalyzer.h
Expand Up @@ -50,6 +50,7 @@ class TrackAnalyzer
// each and every track while in the analyze method. A
// redesign of the class is needed in the future.
void setNumberOfGoodVertices(const edm::Event &);
void setBX(const edm::Event &);

private:
void initHistos();
Expand All @@ -59,10 +60,11 @@ class TrackAnalyzer
void bookHistosForLScertification(DQMStore::IBooker & ibooker);
void bookHistosForBeamSpot(DQMStore::IBooker & ibooker);
void bookHistosForTrackerSpecific(DQMStore::IBooker & ibooker);
void bookHistosForEfficiencyFromHitPatter(DQMStore::IBooker &ibooker, const edm::EventSetup & iSetup);
void bookHistosForEfficiencyFromHitPatter(DQMStore::IBooker &ibooker, const edm::EventSetup & iSetup, const std::string suffix);
void fillHistosForHitProperties(const edm::EventSetup& iSetup, const reco::Track & track, std::string sname);
void fillHistosForLScertification(const edm::EventSetup& iSetup, const reco::Track & track, std::string sname);
void fillHistosForTrackerSpecific(const reco::Track & track);
void fillHistosForEfficiencyFromHitPatter(const reco::Track & track, const std::string suffix, const unsigned int monitoring);

// ----------member data ---------------------------
std::string TopFolder_;
Expand Down Expand Up @@ -109,7 +111,8 @@ class TrackAnalyzer

// Compute the hit-finding efficiency using the HitPattern of
// the reconstructed tracks
bool doEffFromHitPattern_;
bool doEffFromHitPatternVsPU_;
bool doEffFromHitPatternVsBX_;
int pvNDOF_;
std::string qualityString_;

Expand Down Expand Up @@ -370,16 +373,17 @@ class TrackAnalyzer
struct Key {
int det;
int subdet;
explicit Key(int det, int subdet):det(det),subdet(subdet){};
int monitoring;
explicit Key(int det, int subdet,int monitoring):det(det),subdet(subdet),monitoring(monitoring){};
bool operator==(const Key & other) const {
return (det == other.det && subdet == other.subdet);
return (det == other.det && subdet == other.subdet && monitoring == other.monitoring);
}
};

// Trivial hasher function: warning, it only works if det has less than 99 subdets.
struct KeyHasher {
std::size_t operator()(const Key& k) const {
return k.det*100+k.subdet;
return k.det*1000+k.subdet*10+k.monitoring;
}
};

Expand All @@ -389,8 +393,14 @@ class TrackAnalyzer
std::unordered_map<Key, MonitorElement *, KeyHasher> hits_bad_;
std::unordered_map<Key, MonitorElement *, KeyHasher> hits_total_;
unsigned int good_vertices_;
unsigned int bx_;
enum monQuantity {
VsPU,
VsBX,
END
};
std::string monName[monQuantity::END] = { "", "VsBX" };


std::string histname; //for naming the histograms according to algorithm used
};
#endif
1 change: 1 addition & 0 deletions DQM/TrackingMonitor/interface/TrackingMonitor.h
Expand Up @@ -160,6 +160,7 @@ class TrackingMonitor : public DQMEDAnalyzer

StringCutObjectSelector<reco::Track,true> numSelection_;
StringCutObjectSelector<reco::Track,true> denSelection_;
int pvNDOF_;

};

Expand Down
3 changes: 2 additions & 1 deletion DQM/TrackingMonitor/python/MonitorTrackGLBMuons_cfi.py
Expand Up @@ -17,5 +17,6 @@
MonitorTrackGLBMuons.doDCAwrtPVPlots = True
MonitorTrackGLBMuons.doDCAwrt000Plots = False
MonitorTrackGLBMuons.doSIPPlots = True
MonitorTrackGLBMuons.doEffFromHitPattern = False
MonitorTrackGLBMuons.doEffFromHitPatternVsPU = False
MonitorTrackGLBMuons.doEffFromHitPatternVsBX = False

3 changes: 2 additions & 1 deletion DQM/TrackingMonitor/python/MonitorTrackSTAMuons_cfi.py
Expand Up @@ -35,7 +35,8 @@
MonitorTrackSTAMuons.doDCAPlots = cms.bool(False)
MonitorTrackSTAMuons.doGeneralPropertiesPlots = cms.bool(True)
MonitorTrackSTAMuons.doHitPropertiesPlots = cms.bool(True)
MonitorTrackSTAMuons.doEffFromHitPattern = cms.bool(False)
MonitorTrackSTAMuons.doEffFromHitPatternVsPU = cms.bool(False)
MonitorTrackSTAMuons.doEffFromHitPatternVsBX = cms.bool(False)
#MonitorTrackSTAMuons.doGoodTrackPlots = cms.bool(False)
MonitorTrackSTAMuons.doMeasurementStatePlots = cms.bool(True)
MonitorTrackSTAMuons.doProfilesVsLS = cms.bool(False)
Expand Down
Expand Up @@ -47,7 +47,8 @@
TrackerCollisionTrackMon.doPUmonitoring = cms.bool(False)
TrackerCollisionTrackMon.doPlotsVsBXlumi = cms.bool(False)
TrackerCollisionTrackMon.doPlotsVsGoodPVtx = cms.bool(True)
TrackerCollisionTrackMon.doEffFromHitPattern = cms.bool(True)
TrackerCollisionTrackMon.doEffFromHitPatternVsPU = cms.bool(True)
TrackerCollisionTrackMon.doEffFromHitPatternVsBX = cms.bool(True)

# LS analysis
TrackerCollisionTrackMon.doLumiAnalysis = cms.bool(True)
Expand Down
3 changes: 2 additions & 1 deletion DQM/TrackingMonitor/python/TrackingMonitor_cfi.py
Expand Up @@ -59,7 +59,8 @@
doDCAwrtPVPlots = cms.bool(False),
doDCAwrt000Plots = cms.bool(False),
doSIPPlots = cms.bool(False),
doEffFromHitPattern = cms.bool(False),
doEffFromHitPatternVsPU = cms.bool(False),
doEffFromHitPatternVsBX = cms.bool(False),
pvNDOF = cms.int32(4),
doGeneralPropertiesPlots = cms.bool(False),
doHitPropertiesPlots = cms.bool(False),
Expand Down
165 changes: 101 additions & 64 deletions DQM/TrackingMonitor/src/TrackAnalyzer.cc
Expand Up @@ -41,10 +41,12 @@ TrackAnalyzer::TrackAnalyzer(const edm::ParameterSet& iConfig)
, doTestPlots_ ( conf_.getParameter<bool>("doTestPlots") )
, doHIPlots_ ( conf_.getParameter<bool>("doHIPlots") )
, doSIPPlots_ ( conf_.getParameter<bool>("doSIPPlots") )
, doEffFromHitPattern_ ( conf_.getParameter<bool>("doEffFromHitPattern") )
, doEffFromHitPatternVsPU_ ( conf_.getParameter<bool>("doEffFromHitPatternVsPU") )
, doEffFromHitPatternVsBX_ ( conf_.getParameter<bool>("doEffFromHitPatternVsBX") )
, pvNDOF_ ( conf_.getParameter<int> ("pvNDOF") )
, qualityString_ ( conf_.getParameter<std::string>("qualityString"))
, good_vertices_(0)
, bx_(0)
{
initHistos();
TopFolder_ = conf_.getParameter<std::string>("FolderName");
Expand Down Expand Up @@ -145,7 +147,8 @@ void TrackAnalyzer::initHisto(DQMStore::IBooker & ibooker, const edm::EventSetup
bookHistosForHitProperties(ibooker);
bookHistosForBeamSpot(ibooker);
bookHistosForLScertification( ibooker);
bookHistosForEfficiencyFromHitPatter(ibooker, iSetup);
if (doEffFromHitPatternVsPU_ || doAllPlots_) bookHistosForEfficiencyFromHitPatter(ibooker, iSetup, "");
if (doEffFromHitPatternVsBX_ || doAllPlots_) bookHistosForEfficiencyFromHitPatter(ibooker, iSetup, "VsBX");

// book tracker specific related histograms
// ---------------------------------------------------------------------------------//
Expand Down Expand Up @@ -177,10 +180,26 @@ void TrackAnalyzer::initHisto(DQMStore::IBooker & ibooker, const edm::EventSetup
}

void TrackAnalyzer::bookHistosForEfficiencyFromHitPatter(DQMStore::IBooker &ibooker,
const edm::EventSetup & iSetup)
const edm::EventSetup & iSetup,
const std::string suffix)
{
if (doEffFromHitPattern_ || doAllPlots_) {
ibooker.setCurrentFolder(TopFolder_ + "/HitEffFromHitPattern");
if (doEffFromHitPatternVsPU_ || doEffFromHitPatternVsBX_ || doAllPlots_) {

ibooker.setCurrentFolder(TopFolder_ + "/HitEffFromHitPattern" + suffix);

int NBINS[] = { 50, 3564 };
float MAX[] = { 50.5, 3564.5 };

int mon = -1;
int nbins = -1;
float max = -1.;
for (int i=0; i<monQuantity::END; i++) {
if (monName[i] == suffix) {
mon = i;
nbins = NBINS[i];
max = MAX[i];
}
}

edm::ESHandle<TrackerGeometry> trackerGeometry;
iSetup.get<TrackerDigiGeometryRecord>().get(trackerGeometry);
Expand All @@ -203,32 +222,32 @@ void TrackAnalyzer::bookHistosForEfficiencyFromHitPatter(DQMStore::IBooker &iboo
for (unsigned int cat = 0;
cat < sizeof(hit_category)/sizeof(char *); ++cat) {
memset(title, 0, sizeof(title));
snprintf(title, sizeof(title), "Hits_%s_%s_Subdet%d", hit_category[cat], dets[det], sub_det);
snprintf(title, sizeof(title), "Hits%s_%s_%s_Subdet%d", suffix.c_str(), hit_category[cat], dets[det], sub_det);
switch(cat) {
case 0:
hits_valid_.insert(std::make_pair(
Key(det, sub_det),
ibooker.book1D(title, title, 50, 0.5, 50.5)));
Key(det, sub_det, mon),
ibooker.book1D(title, title, nbins, 0.5, max)));
break;
case 1:
hits_missing_.insert(std::make_pair(
Key(det, sub_det),
ibooker.book1D(title, title, 50, 0.5, 50.5)));
Key(det, sub_det, mon),
ibooker.book1D(title, title, nbins, 0.5, max)));
break;
case 2:
hits_inactive_.insert(std::make_pair(
Key(det, sub_det),
ibooker.book1D(title, title, 50, 0.5, 50.5)));
Key(det, sub_det, mon),
ibooker.book1D(title, title, nbins, 0.5, max)));
break;
case 3:
hits_bad_.insert(std::make_pair(
Key(det, sub_det),
ibooker.book1D(title, title, 50, 0.5, 50.5)));
Key(det, sub_det, mon),
ibooker.book1D(title, title, nbins, 0.5, max)));
break;
case 4:
hits_total_.insert(std::make_pair(
Key(det, sub_det),
ibooker.book1D(title, title, 50, 0.5, 50.5)));
Key(det, sub_det, mon),
ibooker.book1D(title, title, nbins, 0.5, max)));
break;
default:
LogDebug("TrackAnalyzer") << "Invalid hit category used " << cat << " ignored\n";
Expand Down Expand Up @@ -665,7 +684,7 @@ void TrackAnalyzer::bookHistosForBeamSpot(DQMStore::IBooker & ibooker) {
histname = "zPointOfClosestApproachVsPhi_";
zPointOfClosestApproachVsPhi = ibooker.bookProfile(histname+CategoryName, histname+CategoryName, PhiBin, PhiMin, PhiMax, VZBinProf, VZMinProf, VZMaxProf, "");
zPointOfClosestApproachVsPhi->setAxisTitle("Track #phi",1);
zPointOfClosestApproachVsPhi->setAxisTitle("y component of Track PCA to beam line (cm)",2);
zPointOfClosestApproachVsPhi->setAxisTitle("z component of Track PCA to beam line (cm)",2);
}

if(doDCAPlots_ || doPVPlots_ || doAllPlots_) {
Expand Down Expand Up @@ -847,6 +866,10 @@ void TrackAnalyzer::setNumberOfGoodVertices(const edm::Event & iEvent) {
++good_vertices_;
}

void TrackAnalyzer::setBX(const edm::Event & iEvent) {
bx_ = iEvent.bunchCrossing();
}

void TrackAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup, const reco::Track& track)
{
double phi = track.phi();
Expand Down Expand Up @@ -900,53 +923,10 @@ void TrackAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSe

}

if (doEffFromHitPattern_ || doAllPlots_) {
if (track.pt() > 1.0 && track.dxy() < 0.1 and good_vertices_ > 0) {
auto hp = track.hitPattern();
// Here hit_category is meant to iterate over
// reco::HitPattern::HitCategory, defined here:
// http://cmslxr.fnal.gov/dxr/CMSSW/source/DataFormats/TrackReco/interface/HitPattern.h
for (unsigned int category = 0; category < 3; ++category) {
for (int hit = 0; hit < hp.numberOfHits((reco::HitPattern::HitCategory)(category)); ++hit) {
auto pattern = hp.getHitPattern((reco::HitPattern::HitCategory)(category), hit);
// Boolean bad is missing simply because it is inferred and the only missing case.
bool valid = hp.validHitFilter(pattern);
bool missing = hp.missingHitFilter(pattern);
bool inactive = hp.inactiveHitFilter(pattern);
int hit_type = -1;
hit_type = valid ? 0 :
( missing ? 1 :
( inactive ? 2 : 3));
if (hits_valid_.find(Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern))) == hits_valid_.end()) {
LogDebug("TrackAnalyzer") << "Invalid combination of detector and subdetector: ("
<< hp.getSubStructure(pattern) << ", "
<< hp.getSubSubStructure(pattern)
<< "): ignoring it.\n";
continue;
}
switch (hit_type) {
case 0:
hits_valid_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern))]->Fill(good_vertices_);
hits_total_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern))]->Fill(good_vertices_);
break;
case 1:
hits_missing_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern))]->Fill(good_vertices_);
hits_total_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern))]->Fill(good_vertices_);
break;
case 2:
hits_inactive_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern))]->Fill(good_vertices_);
break;
case 3:
hits_bad_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern))]->Fill(good_vertices_);
break;
default:
LogDebug("TrackAnalyzer") << "Invalid hit category used " << hit_type << " ignored\n";
}
}
}
}
}

if (doEffFromHitPatternVsPU_ || doAllPlots_) fillHistosForEfficiencyFromHitPatter(track,"", good_vertices_);
if (doEffFromHitPatternVsBX_ || doAllPlots_) fillHistosForEfficiencyFromHitPatter(track,"VsBX", bx_);


if (doGeneralPropertiesPlots_ || doAllPlots_){
// fitting
Chi2 -> Fill(chi2);
Expand Down Expand Up @@ -1109,6 +1089,63 @@ void TrackAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSe

}

void TrackAnalyzer::fillHistosForEfficiencyFromHitPatter(const reco::Track & track, const std::string suffix, const unsigned int monitoring) {

if (doEffFromHitPatternVsPU_ || doEffFromHitPatternVsBX_ || doAllPlots_) {

int mon = -1;
for (int i=0; i<monQuantity::END; i++) {
if (monName[i] == suffix) mon = i;
}

if (track.pt() > 1.0 && track.dxy() < 0.1 and monitoring > 0) {
auto hp = track.hitPattern();
// Here hit_category is meant to iterate over
// reco::HitPattern::HitCategory, defined here:
// http://cmslxr.fnal.gov/dxr/CMSSW/source/DataFormats/TrackReco/interface/HitPattern.h
for (unsigned int category = 0; category < 3; ++category) {
for (int hit = 0; hit < hp.numberOfHits((reco::HitPattern::HitCategory)(category)); ++hit) {
auto pattern = hp.getHitPattern((reco::HitPattern::HitCategory)(category), hit);
// Boolean bad is missing simply because it is inferred and the only missing case.
bool valid = hp.validHitFilter(pattern);
bool missing = hp.missingHitFilter(pattern);
bool inactive = hp.inactiveHitFilter(pattern);
int hit_type = -1;
hit_type = valid ? 0 :
( missing ? 1 :
( inactive ? 2 : 3));
if (hits_valid_.find(Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern), mon)) == hits_valid_.end()) {
LogDebug("TrackAnalyzer") << "Invalid combination of detector and subdetector: ("
<< hp.getSubStructure(pattern) << ", "
<< hp.getSubSubStructure(pattern)
<< "): ignoring it.\n";
continue;
}
switch (hit_type) {
case 0:
hits_valid_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern), mon)]->Fill(monitoring);
hits_total_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern), mon)]->Fill(monitoring);
break;
case 1:
hits_missing_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern), mon)]->Fill(monitoring);
hits_total_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern), mon)]->Fill(monitoring);
break;
case 2:
hits_inactive_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern), mon)]->Fill(monitoring);
break;
case 3:
hits_bad_[Key(hp.getSubStructure(pattern), hp.getSubSubStructure(pattern), mon)]->Fill(monitoring);
break;
default:
LogDebug("TrackAnalyzer") << "Invalid hit category used " << hit_type << " ignored\n";
}
}
}
}
}

}

// book histograms at differnt measurement points
// ---------------------------------------------------------------------------------//
void TrackAnalyzer::bookHistosForState(std::string sname, DQMStore::IBooker & ibooker)
Expand Down
6 changes: 4 additions & 2 deletions DQM/TrackingMonitor/src/TrackingMonitor.cc
Expand Up @@ -73,6 +73,7 @@ TrackingMonitor::TrackingMonitor(const edm::ParameterSet& iConfig)
, genTriggerEventFlag_(new GenericTriggerEventFlag(iConfig,consumesCollector(), *this))
, numSelection_ (conf_.getParameter<std::string>("numCut"))
, denSelection_ (conf_.getParameter<std::string>("denCut"))
, pvNDOF_ ( conf_.getParameter<int> ("pvNDOF") )
{

edm::ConsumesCollector c{ consumesCollector() };
Expand Down Expand Up @@ -520,7 +521,7 @@ void TrackingMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& i
//--- pv fake (the pv collection should have size==1 and the pv==beam spot)
if ( pv0->isFake() || pv0->tracksSize()==0
// definition of goodOfflinePrimaryVertex
|| pv0->ndof() < 4. || pv0->z() > 24.) pv0 = nullptr;
|| pv0->ndof() < pvNDOF_ || pv0->z() > 24.) pv0 = nullptr;
}


Expand All @@ -535,6 +536,7 @@ void TrackingMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& i
int totalRecHits = 0, totalLayers = 0;

theTrackAnalyzer->setNumberOfGoodVertices(iEvent);
theTrackAnalyzer->setBX(iEvent);
for (reco::TrackCollection::const_iterator track = trackCollection.begin();
track!=trackCollection.end(); ++track) {

Expand Down Expand Up @@ -695,7 +697,7 @@ void TrackingMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& i
if (pv->isFake() || pv->tracksSize()==0) continue;

// definition of goodOfflinePrimaryVertex
if (pv->ndof() < 4. || pv->z() > 24.) continue;
if (pv->ndof() < pvNDOF_ || pv->z() > 24.) continue;
totalNumGoodPV++;
}

Expand Down

0 comments on commit d74708f

Please sign in to comment.