Skip to content

Commit

Permalink
Merge pull request #12382 from calabria/assoByHits_porting_76X
Browse files Browse the repository at this point in the history
AssoByHits with GEM hits porting 8XY
  • Loading branch information
cmsbuild committed Dec 1, 2015
2 parents 15cc2e6 + 81a7ccc commit e63757a
Show file tree
Hide file tree
Showing 14 changed files with 337 additions and 52 deletions.
1 change: 1 addition & 0 deletions SimMuon/MCTruth/BuildFile.xml
Expand Up @@ -8,6 +8,7 @@
<use name="DataFormats/CSCRecHit"/>
<use name="DataFormats/DTRecHit"/>
<use name="DataFormats/RPCRecHit"/>
<use name="DataFormats/GEMRecHit"/>
<use name="DataFormats/TrackingRecHit"/>
<use name="DataFormats/TrackReco"/>
<use name="DataFormats/MuonReco"/>
Expand Down
70 changes: 70 additions & 0 deletions SimMuon/MCTruth/interface/GEMHitAssociator.h
@@ -0,0 +1,70 @@
#ifndef MCTruth_GEMHitAssociator_h
#define MCTruth_GEMHitAssociator_h

#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Utilities/interface/InputTag.h"
#include "DataFormats/Common/interface/Handle.h"
#include "SimDataFormats/EncodedEventId/interface/EncodedEventId.h"
#include "SimDataFormats/TrackingHit/interface/PSimHit.h"
#include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
#include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
#include "DataFormats/MuonDetId/interface/GEMDetId.h"
#include "SimDataFormats/TrackerDigiSimLink/interface/StripDigiSimLink.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"

#include <vector>
#include <map>
#include <string>
#include <set>

#include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h"
#include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
#include "DataFormats/DetId/interface/DetId.h"
#include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
#include "DataFormats/GEMDigi/interface/GEMDigiCollection.h"
#include "DataFormats/GEMRecHit/interface/GEMRecHitCollection.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "Geometry/Records/interface/MuonGeometryRecord.h"
#include "Geometry/GEMGeometry/interface/GEMGeometry.h"
#include "DataFormats/Common/interface/DetSetVector.h"

class GEMHitAssociator {

public:

typedef edm::DetSetVector<StripDigiSimLink> DigiSimLinks;
typedef edm::DetSet<StripDigiSimLink> LayerLinks;
typedef std::pair<uint32_t, EncodedEventId> SimHitIdpr;

// Constructor with configurable parameters
GEMHitAssociator(const edm::ParameterSet&, edm::ConsumesCollector && ic);
GEMHitAssociator(const edm::Event& e, const edm::EventSetup& eventSetup, const edm::ParameterSet& conf);

void initEvent(const edm::Event&, const edm::EventSetup&);

// Destructor
~GEMHitAssociator(){}

std::vector<SimHitIdpr> associateRecHit(const TrackingRecHit & hit) const;

private:

const DigiSimLinks * theDigiSimLinks;
edm::InputTag GEMdigisimlinkTag;

bool crossingframe;
bool useGEMs_;
edm::InputTag GEMsimhitsTag;
edm::InputTag GEMsimhitsXFTag;

edm::EDGetTokenT<CrossingFrame<PSimHit> > GEMsimhitsXFToken_;
edm::EDGetTokenT<edm::PSimHitContainer> GEMsimhitsToken_;
edm::EDGetTokenT<edm::DetSetVector<StripDigiSimLink> > GEMdigisimlinkToken_;

std::map<unsigned int, edm::PSimHitContainer> _SimHitMap;

};

#endif

12 changes: 7 additions & 5 deletions SimMuon/MCTruth/interface/MuonAssociatorByHitsHelper.h
Expand Up @@ -13,6 +13,7 @@
#include "SimMuon/MCTruth/interface/DTHitAssociator.h"
#include "SimMuon/MCTruth/interface/CSCHitAssociator.h"
#include "SimMuon/MCTruth/interface/RPCHitAssociator.h"
#include "SimMuon/MCTruth/interface/GEMHitAssociator.h"
#include "SimTracker/TrackerHitAssociation/interface/TrackerHitAssociator.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "SimDataFormats/Track/interface/SimTrackContainer.h"
Expand Down Expand Up @@ -40,6 +41,7 @@ class MuonAssociatorByHitsHelper {
CSCHitAssociator const* cscHitAssoc_;
DTHitAssociator const* dtHitAssoc_;
RPCHitAssociator const* rpcHitAssoc_;
GEMHitAssociator const* gemHitAssoc_;
std::function<void(const TrackHitsCollection&, const TrackingParticleCollection&)> diagnostics_;
};

Expand All @@ -65,12 +67,12 @@ class MuonAssociatorByHitsHelper {
void getMatchedIds
(MapOfMatchedIds & tracker_matchedIds_valid, MapOfMatchedIds & muon_matchedIds_valid,
MapOfMatchedIds & tracker_matchedIds_INVALID, MapOfMatchedIds & muon_matchedIds_INVALID,
int& n_tracker_valid, int& n_dt_valid, int& n_csc_valid, int& n_rpc_valid,
int& n_tracker_matched_valid, int& n_dt_matched_valid, int& n_csc_matched_valid, int& n_rpc_matched_valid,
int& n_tracker_INVALID, int& n_dt_INVALID, int& n_csc_INVALID, int& n_rpc_INVALID,
int& n_tracker_matched_INVALID, int& n_dt_matched_INVALID, int& n_csc_matched_INVALID, int& n_rpc_matched_INVALID,
int& n_tracker_valid, int& n_dt_valid, int& n_csc_valid, int& n_rpc_valid, int& n_gem_valid,
int& n_tracker_matched_valid, int& n_dt_matched_valid, int& n_csc_matched_valid, int& n_rpc_matched_valid, int& n_gem_matched_valid,
int& n_tracker_INVALID, int& n_dt_INVALID, int& n_csc_INVALID, int& n_rpc_INVALID, int& n_gem_INVALID,
int& n_tracker_matched_INVALID, int& n_dt_matched_INVALID, int& n_csc_matched_INVALID, int& n_rpc_matched_INVALID, int& n_gem_matched_INVALID,
trackingRecHit_iterator begin, trackingRecHit_iterator end,
const TrackerHitAssociator* trackertruth, const DTHitAssociator& dttruth, const CSCHitAssociator& csctruth, const RPCHitAssociator& rpctruth,
const TrackerHitAssociator* trackertruth, const DTHitAssociator& dttruth, const CSCHitAssociator& csctruth, const RPCHitAssociator& rpctruth, const GEMHitAssociator& gemtruth,
bool printRts, const TrackerTopology *) const;

int getShared(MapOfMatchedIds & matchedIds, TrackingParticleCollection::const_iterator trpart) const;
Expand Down
Expand Up @@ -182,6 +182,7 @@ class MuonToTrackingParticleAssociatorEDProducer : public edm::stream::EDProduce
TrackerMuonHitExtractor hitExtractor_;

std::unique_ptr<RPCHitAssociator> rpctruth_;
std::unique_ptr<GEMHitAssociator> gemtruth_;
std::unique_ptr<DTHitAssociator> dttruth_;
std::unique_ptr<CSCHitAssociator> csctruth_;
std::unique_ptr<TrackerHitAssociator> trackertruth_;
Expand Down Expand Up @@ -211,6 +212,7 @@ MuonToTrackingParticleAssociatorEDProducer::MuonToTrackingParticleAssociatorEDPr

//hack for consumes
RPCHitAssociator rpctruth(iConfig,consumesCollector());
GEMHitAssociator gemtruth(iConfig,consumesCollector());
DTHitAssociator dttruth(iConfig,consumesCollector());
CSCHitAssociator cscruth(iConfig,consumesCollector());

Expand Down Expand Up @@ -261,8 +263,10 @@ MuonToTrackingParticleAssociatorEDProducer::produce(edm::Event& iEvent, const ed
dttruth_.reset(new DTHitAssociator(iEvent,iSetup,config_,printRtS));
// RPC hit association
rpctruth_.reset( new RPCHitAssociator(iEvent,iSetup,config_) );
// GEM hit association
gemtruth_.reset( new GEMHitAssociator(iEvent,iSetup,config_) );

MuonAssociatorByHitsHelper::Resources resources = {tTopo, trackertruth_.get(), csctruth_.get(), dttruth_.get(), rpctruth_.get()};
MuonAssociatorByHitsHelper::Resources resources = {tTopo, trackertruth_.get(), csctruth_.get(), dttruth_.get(), rpctruth_.get(), gemtruth_.get()};

if(diagnostics_) {
diagnostics_->read(iEvent);
Expand Down
6 changes: 6 additions & 0 deletions SimMuon/MCTruth/python/MuonAssociatorByHits_cfi.py
Expand Up @@ -60,6 +60,12 @@
RPCsimhitsXFTag = cms.InputTag("mix","g4SimHitsMuonRPCHits"),
RPCdigisimlinkTag = cms.InputTag("simMuonRPCDigis","RPCDigiSimLink"),
#
# for GEM Hit associator
useGEMs = cms.bool(False),
GEMsimhitsTag = cms.InputTag("g4SimHits","MuonGEMHits"),
GEMsimhitsXFTag = cms.InputTag("mix","g4SimHitsMuonGEMHits"),
GEMdigisimlinkTag = cms.InputTag("simMuonGEMDigis","GEM"),
#
# for Tracker Hit associator
#
associatePixel = cms.bool(True),
Expand Down
Expand Up @@ -10,6 +10,7 @@
# don't read simhits, they're not there
muonAssociatorByHitsNoSimHitsHelper.CSCsimHitsTag = ""
muonAssociatorByHitsNoSimHitsHelper.RPCsimhitsTag = ""
muonAssociatorByHitsNoSimHitsHelper.GEMsimhitsTag = ""
muonAssociatorByHitsNoSimHitsHelper.DTsimhitsTag = ""

### The following is useful when running only on RECO
Expand Down
129 changes: 129 additions & 0 deletions SimMuon/MCTruth/src/GEMHitAssociator.cc
@@ -0,0 +1,129 @@
#include "SimMuon/MCTruth/interface/GEMHitAssociator.h"

using namespace std;

// Constructor
GEMHitAssociator::GEMHitAssociator( const edm::ParameterSet& conf,
edm::ConsumesCollector && iC):
GEMdigisimlinkTag(conf.getParameter<edm::InputTag>("GEMdigisimlinkTag")),
// CrossingFrame used or not ?
crossingframe(conf.getParameter<bool>("crossingframe")),
useGEMs_(conf.getParameter<bool>("useGEMs")),
GEMsimhitsTag(conf.getParameter<edm::InputTag>("GEMsimhitsTag")),
GEMsimhitsXFTag(conf.getParameter<edm::InputTag>("GEMsimhitsXFTag"))
{
if (crossingframe){
GEMsimhitsXFToken_=iC.consumes<CrossingFrame<PSimHit> >(GEMsimhitsXFTag);
} else if (!GEMsimhitsTag.label().empty()) {
GEMsimhitsToken_=iC.consumes<edm::PSimHitContainer>(GEMsimhitsTag);
}

GEMdigisimlinkToken_=iC.consumes< edm::DetSetVector<StripDigiSimLink> >(GEMdigisimlinkTag);
}

GEMHitAssociator::GEMHitAssociator(const edm::Event& e, const edm::EventSetup& eventSetup, const edm::ParameterSet& conf ):
GEMdigisimlinkTag(conf.getParameter<edm::InputTag>("GEMdigisimlinkTag")),
// CrossingFrame used or not ?
crossingframe(conf.getParameter<bool>("crossingframe")),
useGEMs_(conf.getParameter<bool>("useGEMs")),
GEMsimhitsTag(conf.getParameter<edm::InputTag>("GEMsimhitsTag")),
GEMsimhitsXFTag(conf.getParameter<edm::InputTag>("GEMsimhitsXFTag"))
{
initEvent(e,eventSetup);
}

void GEMHitAssociator::initEvent(const edm::Event& e, const edm::EventSetup& eventSetup)
{

if(useGEMs_){

if (crossingframe) {

edm::Handle<CrossingFrame<PSimHit> > cf;
LogTrace("GEMHitAssociator") <<"getting CrossingFrame<PSimHit> collection - "<<GEMsimhitsXFTag;
e.getByLabel(GEMsimhitsXFTag, cf);

std::auto_ptr<MixCollection<PSimHit> >
GEMsimhits( new MixCollection<PSimHit>(cf.product()) );
LogTrace("GEMHitAssociator") <<"... size = "<<GEMsimhits->size();

// MixCollection<PSimHit> & simHits = *hits;

for(MixCollection<PSimHit>::MixItr hitItr = GEMsimhits->begin();
hitItr != GEMsimhits->end(); ++hitItr)
{
_SimHitMap[hitItr->detUnitId()].push_back(*hitItr);
}

} else if (!GEMsimhitsTag.label().empty()) {
edm::Handle<edm::PSimHitContainer> GEMsimhits;
LogTrace("GEMHitAssociator") <<"getting PSimHit collection - "<<GEMsimhitsTag;
e.getByLabel(GEMsimhitsTag, GEMsimhits);
LogTrace("GEMHitAssociator") <<"... size = "<<GEMsimhits->size();

// arrange the hits by detUnit
for(edm::PSimHitContainer::const_iterator hitItr = GEMsimhits->begin();
hitItr != GEMsimhits->end(); ++hitItr)
{
_SimHitMap[hitItr->detUnitId()].push_back(*hitItr);
}
}

edm::Handle<DigiSimLinks> digiSimLinks;
LogTrace("GEMHitAssociator") <<"getting GEM Strip DigiSimLink collection - "<<GEMdigisimlinkTag;
e.getByLabel(GEMdigisimlinkTag, digiSimLinks);
theDigiSimLinks = digiSimLinks.product();

}

}
// end of constructor

std::vector<GEMHitAssociator::SimHitIdpr> GEMHitAssociator::associateRecHit(const TrackingRecHit & hit) const {

std::vector<SimHitIdpr> matched;

if(useGEMs_){

//std::cout<<"gemboo "<<useGEMs_<<std::endl;

const TrackingRecHit * hitp = &hit;
const GEMRecHit * gemrechit = dynamic_cast<const GEMRecHit *>(hitp);

if (gemrechit) {

GEMDetId gemDetId = gemrechit->gemId();
int fstrip = gemrechit->firstClusterStrip();
int cls = gemrechit->clusterSize();
//int bx = gemrechit->BunchX();

DigiSimLinks::const_iterator layerLinks = theDigiSimLinks->find(gemDetId);

if (layerLinks != theDigiSimLinks->end()) {

for(int i = fstrip; i < (fstrip+cls); ++i) {

for(LayerLinks::const_iterator itlink = layerLinks->begin(); itlink != layerLinks->end(); ++itlink) {

int ch = static_cast<int>(itlink->channel());
if(ch != i) continue;

SimHitIdpr currentId(itlink->SimTrackId(), itlink->eventId());
if(find(matched.begin(),matched.end(),currentId ) == matched.end())
matched.push_back(currentId);

}

}

}else edm::LogWarning("GEMHitAssociator")
<<"*** WARNING in GEMHitAssociator: GEM layer "<<gemDetId<<" has no DigiSimLinks !"<<std::endl;

} else edm::LogWarning("GEMHitAssociator")<<"*** WARNING in GEMHitAssociator::associateRecHit, null dynamic_cast !";

}

return matched;

}

9 changes: 7 additions & 2 deletions SimMuon/MCTruth/src/MuonAssociatorByHits.cc
Expand Up @@ -142,6 +142,7 @@ MuonAssociatorByHits::MuonAssociatorByHits (const edm::ParameterSet& conf, edm::
{
//hack for consumes
RPCHitAssociator rpctruth(conf,std::move(iC));
GEMHitAssociator gemtruth(conf,std::move(iC));
DTHitAssociator dttruth(conf,std::move(iC));
CSCHitAssociator muonTruth(conf,std::move(iC));
if( conf.getUntrackedParameter<bool>("dumpInputCollections") ) {
Expand Down Expand Up @@ -181,8 +182,10 @@ MuonAssociatorByHits::associateRecoToSim( const edm::RefToBaseVector<reco::Track
DTHitAssociator dttruth(*e,*setup,conf_,printRtS);
// RPC hit association
RPCHitAssociator rpctruth(*e,*setup,conf_);
// GEM hit association
GEMHitAssociator gemtruth(*e,*setup,conf_);

MuonAssociatorByHitsHelper::Resources resources = {tTopo, &trackertruth, &csctruth, &dttruth, &rpctruth};
MuonAssociatorByHitsHelper::Resources resources = {tTopo, &trackertruth, &csctruth, &dttruth, &rpctruth, &gemtruth};

if(diagnostics_) {
resources.diagnostics_ = [this, e](const TrackHitsCollection& hC, const TrackingParticleCollection& pC) {
Expand Down Expand Up @@ -226,8 +229,10 @@ MuonAssociatorByHits::associateSimToReco( const edm::RefToBaseVector<reco::Track
DTHitAssociator dttruth(*e,*setup,conf_,printRtS);
// RPC hit association
RPCHitAssociator rpctruth(*e,*setup,conf_);
// GEM hit association
GEMHitAssociator gemtruth(*e,*setup,conf_);

MuonAssociatorByHitsHelper::Resources resources = {tTopo, &trackertruth, &csctruth, &dttruth, &rpctruth};
MuonAssociatorByHitsHelper::Resources resources = {tTopo, &trackertruth, &csctruth, &dttruth, &rpctruth, &gemtruth};

auto bareAssoc = helper_.associateSimToRecoIndices(tH, TPCollectionH, resources);
for (auto it = bareAssoc.begin(), ed = bareAssoc.end(); it != ed; ++it) {
Expand Down

0 comments on commit e63757a

Please sign in to comment.