Skip to content

Commit

Permalink
Merge pull request #18354 from abbiendi/fix_Phase2TrackerAssociation
Browse files Browse the repository at this point in the history
Fix phase2 tracker association
  • Loading branch information
davidlange6 authored Apr 27, 2017
2 parents 2c1aaa7 + 84e1a67 commit 8adaf87
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 70 deletions.
5 changes: 3 additions & 2 deletions SimMuon/MCTruth/python/MuonAssociatorByHits_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,10 @@
#
associatePixel = cms.bool(True),
associateStrip = cms.bool(True),
usePhase2Tracker = cms.bool(False),
pixelSimLinkSrc = cms.InputTag("simSiPixelDigis"),
stripSimLinkSrc = cms.InputTag("simSiStripDigis"),
phase2TrackerSimLinkSrc = cms.InputTag("simSiPixelDigis","Tracker"),
associateRecoTracks = cms.bool(True),
#
ROUList = cms.vstring('TrackerHitsTIBLowTof',
Expand Down Expand Up @@ -142,6 +144,5 @@
from Configuration.Eras.Modifier_run3_GEM_cff import run3_GEM
run3_GEM.toModify( muonAssociatorByHits, useGEMs = cms.bool(True) )
from Configuration.Eras.Modifier_phase2_tracker_cff import phase2_tracker
phase2_tracker.toModify( muonAssociatorByHits, usePhase2Tracker = cms.bool(True) )
phase2_tracker.toModify( muonAssociatorByHits, pixelSimLinkSrc = "simSiPixelDigis:Pixel" )
phase2_tracker.toModify( muonAssociatorByHits, stripSimLinkSrc = "simSiPixelDigis:Tracker" )

5 changes: 3 additions & 2 deletions SimMuon/MCTruth/python/NewMuonAssociatorByHits_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,10 @@
#
associatePixel = cms.bool(True),
associateStrip = cms.bool(True),
usePhase2Tracker = cms.bool(False),
pixelSimLinkSrc = cms.InputTag("simSiPixelDigis"),
stripSimLinkSrc = cms.InputTag("simSiStripDigis"),
phase2TrackerSimLinkSrc = cms.InputTag("simSiPixelDigis","Tracker"),
associateRecoTracks = cms.bool(True),
#
ROUList = cms.vstring('TrackerHitsTIBLowTof',
Expand Down Expand Up @@ -142,6 +144,5 @@
from Configuration.Eras.Modifier_run3_GEM_cff import run3_GEM
run3_GEM.toModify( NewMuonAssociatorByHits, useGEMs = cms.bool(True) )
from Configuration.Eras.Modifier_phase2_tracker_cff import phase2_tracker
phase2_tracker.toModify( NewMuonAssociatorByHits, usePhase2Tracker = cms.bool(True) )
phase2_tracker.toModify( NewMuonAssociatorByHits, pixelSimLinkSrc = "simSiPixelDigis:Pixel" )
phase2_tracker.toModify( NewMuonAssociatorByHits, stripSimLinkSrc = "simSiPixelDigis:Tracker" )

Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
#include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"
#include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
#include "DataFormats/TrackerRecHit2D/interface/Phase2TrackerRecHit1D.h"
#include "DataFormats/TrackerRecHit2D/interface/ProjectedSiStripRecHit2D.h"
#include "DataFormats/TrackerRecHit2D/interface/SiTrackerMultiRecHit.h"
#include "DataFormats/TrackerRecHit2D/interface/FastTrackerRecHit.h"
Expand All @@ -57,9 +58,9 @@ class TrackerHitAssociator {
struct Config {
Config(const edm::ParameterSet& conf, edm::ConsumesCollector && iC);
Config(edm::ConsumesCollector && iC);
bool doPixel_, doStrip_, doTrackAssoc_, assocHitbySimTrack_;
bool doPixel_, doStrip_, useOTph2_, doTrackAssoc_, assocHitbySimTrack_;
edm::EDGetTokenT<edm::DetSetVector<StripDigiSimLink> > stripToken_;
edm::EDGetTokenT<edm::DetSetVector<PixelDigiSimLink> > pixelToken_;
edm::EDGetTokenT<edm::DetSetVector<PixelDigiSimLink> > pixelToken_, ph2OTrToken_;
std::vector<edm::EDGetTokenT<CrossingFrame<PSimHit> > > cfTokens_;
std::vector<edm::EDGetTokenT<std::vector<PSimHit> > > simHitTokens_;
};
Expand Down Expand Up @@ -92,7 +93,8 @@ class TrackerHitAssociator {

std::vector<SimHitIdpr> associateMatchedRecHit(const SiStripMatchedRecHit2D * matchedrechit, std::vector<simhitAddr>* simhitCFPos=0) const;
std::vector<SimHitIdpr> associateProjectedRecHit(const ProjectedSiStripRecHit2D * projectedrechit, std::vector<simhitAddr>* simhitCFPos=0) const;
void associatePixelRecHit(const SiPixelRecHit * pixelrechit, std::vector<SimHitIdpr> & simhitid, std::vector<simhitAddr>* simhitCFPos=0) const;
void associatePhase2TrackerRecHit(const Phase2TrackerRecHit1D* rechit, std::vector<SimHitIdpr> & simtrackid, std::vector<simhitAddr>* simhitCFPos=0) const;
void associatePixelRecHit(const SiPixelRecHit * pixelrechit, std::vector<SimHitIdpr> & simtrackid, std::vector<simhitAddr>* simhitCFPos=0) const;
std::vector<SimHitIdpr> associateFastRecHit(const FastTrackerRecHit * rechit) const;
std::vector<SimHitIdpr> associateMultiRecHitId(const SiTrackerMultiRecHit * multirechit, std::vector<simhitAddr>* simhitCFPos=0) const;
std::vector<PSimHit> associateMultiRecHit(const SiTrackerMultiRecHit * multirechit) const;
Expand All @@ -109,7 +111,8 @@ class TrackerHitAssociator {
void makeMaps(const edm::Event& theEvent, const Config& config);
edm::Handle< edm::DetSetVector<StripDigiSimLink> > stripdigisimlink;
edm::Handle< edm::DetSetVector<PixelDigiSimLink> > pixeldigisimlink;
bool doPixel_, doStrip_, doTrackAssoc_, assocHitbySimTrack_;
edm::Handle< edm::DetSetVector<PixelDigiSimLink> > ph2trackerdigisimlink;
bool doPixel_, doStrip_, useOTph2_, doTrackAssoc_, assocHitbySimTrack_;
};

#endif
179 changes: 117 additions & 62 deletions SimTracker/TrackerHitAssociation/src/TrackerHitAssociator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,18 @@ using namespace edm;
TrackerHitAssociator::Config::Config(edm::ConsumesCollector && iC) :
doPixel_(true),
doStrip_(true),
useOTph2_(false),
doTrackAssoc_(false),
assocHitbySimTrack_(false) {

if(doStrip_) stripToken_ = iC.consumes<edm::DetSetVector<StripDigiSimLink> >(edm::InputTag("simSiStripDigis"));
if(doPixel_) pixelToken_ = iC.consumes<edm::DetSetVector<PixelDigiSimLink> >(edm::InputTag("simSiPixelDigis"));
if(doStrip_) {
if (useOTph2_) ph2OTrToken_ = iC.consumes<edm::DetSetVector<PixelDigiSimLink> >(edm::InputTag("simSiPixelDigis","Tracker"));
else stripToken_ = iC.consumes<edm::DetSetVector<StripDigiSimLink> >(edm::InputTag("simSiStripDigis"));
}
if(doPixel_) {
if (useOTph2_) pixelToken_ = iC.consumes<edm::DetSetVector<PixelDigiSimLink> >(edm::InputTag("simSiPixelDigis","Pixel"));
else pixelToken_ = iC.consumes<edm::DetSetVector<PixelDigiSimLink> >(edm::InputTag("simSiPixelDigis"));
}
if(!doTrackAssoc_) {
std::vector<std::string> trackerContainers;
trackerContainers.reserve(12);
Expand Down Expand Up @@ -61,10 +68,15 @@ TrackerHitAssociator::Config::Config(edm::ConsumesCollector && iC) :
TrackerHitAssociator::Config::Config(const edm::ParameterSet& conf, edm::ConsumesCollector && iC) :
doPixel_( conf.getParameter<bool>("associatePixel") ),
doStrip_( conf.getParameter<bool>("associateStrip") ),
useOTph2_( conf.existsAs<bool>("usePhase2Tracker") ? conf.getParameter<bool>("usePhase2Tracker") : false),
//
doTrackAssoc_( conf.getParameter<bool>("associateRecoTracks") ),
assocHitbySimTrack_(conf.existsAs<bool>("associateHitbySimTrack") ? conf.getParameter<bool>("associateHitbySimTrack") : false) {

if(doStrip_) stripToken_ = iC.consumes<edm::DetSetVector<StripDigiSimLink> >(conf.getParameter<edm::InputTag>("stripSimLinkSrc"));
if(doStrip_) {
if (useOTph2_) ph2OTrToken_ = iC.consumes<edm::DetSetVector<PixelDigiSimLink> >(conf.getParameter<edm::InputTag>("phase2TrackerSimLinkSrc"));
else stripToken_ = iC.consumes<edm::DetSetVector<StripDigiSimLink> >(conf.getParameter<edm::InputTag>("stripSimLinkSrc"));
}
if(doPixel_) pixelToken_ = iC.consumes<edm::DetSetVector<PixelDigiSimLink> >(conf.getParameter<edm::InputTag>("pixelSimLinkSrc"));
if(!doTrackAssoc_) {
std::vector<std::string> trackerContainers(conf.getParameter<std::vector<std::string> >("ROUList"));
Expand All @@ -83,14 +95,18 @@ TrackerHitAssociator::Config::Config(const edm::ParameterSet& conf, edm::Consume
TrackerHitAssociator::TrackerHitAssociator(const edm::Event& e, const TrackerHitAssociator::Config& config) :
doPixel_(config.doPixel_),
doStrip_(config.doStrip_),
useOTph2_(config.useOTph2_),
doTrackAssoc_(config.doTrackAssoc_),
assocHitbySimTrack_(config.assocHitbySimTrack_) {
//if track association there is no need to access the input collections
if(!doTrackAssoc_) {
makeMaps(e, config);
}

if(doStrip_) e.getByToken(config.stripToken_, stripdigisimlink);
if(doStrip_) {
if (useOTph2_) e.getByToken(config.ph2OTrToken_, ph2trackerdigisimlink);
else e.getByToken(config.stripToken_, stripdigisimlink);
}
if(doPixel_) e.getByToken(config.pixelToken_, pixeldigisimlink);
}

Expand Down Expand Up @@ -325,65 +341,38 @@ std::vector< SimHitIdpr > TrackerHitAssociator::associateHitId(const TrackingRec
void TrackerHitAssociator::associateHitId(const TrackingRecHit & thit, std::vector< SimHitIdpr > & simtkid,
std::vector<simhitAddr>* simhitCFPos) const
{

simtkid.clear();
simtkid.clear();

//get the Detector type of the rechit
DetId detid= thit.geographicalId();
if (const SiTrackerMultiRecHit * rechit = dynamic_cast<const SiTrackerMultiRecHit *>(&thit)){
simtkid=associateMultiRecHitId(rechit, simhitCFPos);
}
if (const SiTrackerMultiRecHit * rechit = dynamic_cast<const SiTrackerMultiRecHit *>(&thit))
simtkid = associateMultiRecHitId(rechit, simhitCFPos);

// cout << "Associator ---> get Detid " << detID << endl;
//check we are in the strip tracker
if(detid.subdetId() == StripSubdetector::TIB ||
detid.subdetId() == StripSubdetector::TOB ||
detid.subdetId() == StripSubdetector::TID ||
detid.subdetId() == StripSubdetector::TEC)
{
//check if it is a simple SiStripRecHit2D
if(const SiStripRecHit2D * rechit =
dynamic_cast<const SiStripRecHit2D *>(&thit))
{
associateSiStripRecHit(rechit, simtkid, simhitCFPos);
}
//check if it is a SiStripRecHit1D
else if(const SiStripRecHit1D * rechit =
dynamic_cast<const SiStripRecHit1D *>(&thit))
{
associateSiStripRecHit(rechit, simtkid, simhitCFPos);
}
//check if it is a SiStripMatchedRecHit2D
else if(const SiStripMatchedRecHit2D * rechit =
dynamic_cast<const SiStripMatchedRecHit2D *>(&thit))
{
simtkid = associateMatchedRecHit(rechit, simhitCFPos);
}
//check if it is a ProjectedSiStripRecHit2D
else if(const ProjectedSiStripRecHit2D * rechit =
dynamic_cast<const ProjectedSiStripRecHit2D *>(&thit))
{
simtkid = associateProjectedRecHit(rechit, simhitCFPos);
}
else{
//std::cout << "associate to invalid" << std::endl;
//throw cms::Exception("Unknown RecHit Type") << "TrackerHitAssociator failed second casting of " << typeid(thit).name() << " type ";
}
}
//check we are in the pixel tracker
else if( (unsigned int)(detid.subdetId()) == PixelSubdetector::PixelBarrel ||
(unsigned int)(detid.subdetId()) == PixelSubdetector::PixelEndcap)
{
if(const SiPixelRecHit * rechit = dynamic_cast<const SiPixelRecHit *>(&thit))
{
associatePixelRecHit(rechit, simtkid, simhitCFPos);
}
}
//check if these are GSRecHits (from FastSim)
if(trackerHitRTTI::isFast(thit))
{
simtkid = associateFastRecHit(static_cast<const FastTrackerRecHit *>(&thit));
}
//check if it is a simple SiStripRecHit2D
if (const SiStripRecHit2D * rechit = dynamic_cast<const SiStripRecHit2D *>(&thit))
associateSiStripRecHit(rechit, simtkid, simhitCFPos);

//check if it is a SiStripRecHit1D
else if(const SiStripRecHit1D * rechit = dynamic_cast<const SiStripRecHit1D *>(&thit))
associateSiStripRecHit(rechit, simtkid, simhitCFPos);

//check if it is a SiStripMatchedRecHit2D
else if(const SiStripMatchedRecHit2D * rechit = dynamic_cast<const SiStripMatchedRecHit2D *>(&thit))
simtkid = associateMatchedRecHit(rechit, simhitCFPos);

//check if it is a ProjectedSiStripRecHit2D
else if(const ProjectedSiStripRecHit2D * rechit = dynamic_cast<const ProjectedSiStripRecHit2D *>(&thit))
simtkid = associateProjectedRecHit(rechit, simhitCFPos);

//check if it is a Phase2TrackerRecHit1D
else if(const Phase2TrackerRecHit1D * rechit = dynamic_cast<const Phase2TrackerRecHit1D *>(&thit))
associatePhase2TrackerRecHit(rechit, simtkid, simhitCFPos);

//check if it is a SiPixelRecHit
else if(const SiPixelRecHit * rechit = dynamic_cast<const SiPixelRecHit *>(&thit))
associatePixelRecHit(rechit, simtkid, simhitCFPos);

//check if these are GSRecHits (from FastSim)
if(trackerHitRTTI::isFast(thit))
simtkid = associateFastRecHit(static_cast<const FastTrackerRecHit *>(&thit));
}

template<typename T>
Expand Down Expand Up @@ -533,7 +522,6 @@ std::vector<SimHitIdpr> TrackerHitAssociator::associateMatchedRecHit(const SiSt
return simtrackid;
}


std::vector<SimHitIdpr> TrackerHitAssociator::associateProjectedRecHit(const ProjectedSiStripRecHit2D * projectedrechit,
std::vector<simhitAddr>* simhitCFPos) const
{
Expand All @@ -546,6 +534,73 @@ std::vector<SimHitIdpr> TrackerHitAssociator::associateProjectedRecHit(const Pr
return matched_mono;
}

void TrackerHitAssociator::associatePhase2TrackerRecHit(const Phase2TrackerRecHit1D* rechit,
std::vector<SimHitIdpr> & simtrackid,
std::vector<simhitAddr>* simhitCFPos) const
{
//
// Phase 2 outer tracker associator
//
DetId detid= rechit->geographicalId();
uint32_t detID = detid.rawId();

edm::DetSetVector<PixelDigiSimLink>::const_iterator isearch = ph2trackerdigisimlink->find(detID);
if(isearch != ph2trackerdigisimlink->end()) { //if it is not empty
edm::DetSet<PixelDigiSimLink> link_detset = (*isearch);
Phase2TrackerRecHit1D::CluRef const& cluster = rechit->cluster();

//check the reference is valid

if(!(cluster.isNull())){//if the cluster is valid
int minRow = (*cluster).firstStrip();
int maxRow = (*cluster).firstStrip() + (*cluster).size();
int Col = (*cluster).column();
// std::cout << " Cluster minRow " << minRow << " maxRow " << maxRow << " column " << Col << std::endl;
edm::DetSet<PixelDigiSimLink>::const_iterator linkiter = link_detset.data.begin(), linkEnd = link_detset.data.end();
int dsl = 0;
std::vector<SimHitIdpr> idcachev;
std::vector<simhitAddr> CFposcachev;
for( ; linkiter != linkEnd; ++linkiter) {
++dsl;
std::pair<int,int> coord = Phase2TrackerDigi::channelToPixel(linkiter->channel());
// std::cout << " " << dsl << ") Digi link: row " << pixel_coord.first << " col " << pixel_coord.second << std::endl;
if( coord.first <= maxRow &&
coord.first >= minRow &&
coord.second == Col ) {
// std::cout << " !-> trackid " << linkiter->SimTrackId() << endl;
// std::cout << " fraction " << linkiter->fraction() << endl;
SimHitIdpr currentId(linkiter->SimTrackId(), linkiter->eventId());
if(find(idcachev.begin(),idcachev.end(),currentId) == idcachev.end()){
simtrackid.push_back(currentId);
idcachev.push_back(currentId);
}

if (simhitCFPos != 0) {
//create a vector that contains all the position (in the MixCollection) of the SimHits that contributed to the RecHit
//write position only once
unsigned int currentCFPos = linkiter->CFposition();
unsigned int tofBin = linkiter->TofBin();
subDetTofBin theSubDetTofBin = std::make_pair(detid.subdetId(), tofBin);
simhit_collectionMap::const_iterator it = SimHitCollMap.find(theSubDetTofBin);
if (it!= SimHitCollMap.end()) {
simhitAddr currentAddr = std::make_pair(it->second, currentCFPos);
if(find(CFposcachev.begin(), CFposcachev.end(), currentAddr) == CFposcachev.end()) {
CFposcachev.push_back(currentAddr);
simhitCFPos->push_back(currentAddr);
}
}
}

}
} // end of simlink loop
}
else{
edm::LogError("TrackerHitAssociator")<<"no Pixel cluster reference attached";

}
}
}

void TrackerHitAssociator::associatePixelRecHit(const SiPixelRecHit * pixelrechit,
std::vector<SimHitIdpr> & simtrackid,
std::vector<simhitAddr>* simhitCFPos) const
Expand Down

0 comments on commit 8adaf87

Please sign in to comment.