From e42d8b0558e5934002d83d92f310d913f469b906 Mon Sep 17 00:00:00 2001 From: Cms Build Date: Fri, 7 Jun 2019 08:36:54 +0200 Subject: [PATCH 1/2] Clang-tidy --- .../FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc | 2 +- .../FinalTrackSelectors/plugins/CosmicTrackSelector.cc | 2 +- RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc index 1d2e895c41164..ac421ded7fbb4 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc @@ -178,7 +178,7 @@ AnalyticalTrackSelector::AnalyticalTrackSelector( const edm::ParameterSet & cfg if (cfg.exists("qualityBit")) { std::string qualityStr = cfg.getParameter("qualityBit"); - if (qualityStr != "") { + if (!qualityStr.empty()) { setQualityBit_[0] = true; qualityToSet_ [0] = TrackBase::qualityByName(cfg.getParameter("qualityBit")); } diff --git a/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc index 6bed305a2ffb5..6f48fd7d4a9d5 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc @@ -124,7 +124,7 @@ CosmicTrackSelector::CosmicTrackSelector( const edm::ParameterSet & cfg ) : { if (cfg.exists("qualityBit")) { std::string qualityStr = cfg.getParameter("qualityBit"); - if (qualityStr != "") { + if (!qualityStr.empty()) { setQualityBit_ = true; qualityToSet_ = TrackBase::qualityByName(cfg.getParameter("qualityBit")); } diff --git a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc index 372972f85a57b..a838c1a3cd556 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc @@ -129,7 +129,7 @@ MultiTrackSelector::MultiTrackSelector( const edm::ParameterSet & cfg ) : setQualityBit_.push_back( false ); std::string qualityStr = trkSelectors[i].getParameter("qualityBit"); - if (qualityStr != "") { + if (!qualityStr.empty()) { setQualityBit_[i] = true; qualityToSet_[i] = TrackBase::qualityByName(trkSelectors[i].getParameter("qualityBit")); } @@ -151,7 +151,7 @@ MultiTrackSelector::MultiTrackSelector( const edm::ParameterSet & cfg ) : preFilter_[i]=trkSelectors.size(); // no prefilter std::string pfName=trkSelectors[i].getParameter("preFilterName"); - if (pfName!="") { + if (!pfName.empty()) { bool foundPF=false; for ( unsigned int j=0; j Date: Fri, 7 Jun 2019 08:37:03 +0200 Subject: [PATCH 2/2] Clang-Format --- .../SiStripCluster/interface/SiStripCluster.h | 74 +- .../interface/SiStripClusterCollection.h | 4 +- .../interface/SiStripClusterTools.h | 66 +- .../SiStripCluster/src/SiStripCluster.cc | 30 +- DataFormats/SiStripCluster/src/classes.h | 4 +- .../TrackerCommon/interface/ClusterSummary.h | 105 +- .../TrackerCommon/interface/SiStripEnums.h | 2 +- .../TrackerCommon/interface/TrackerDetSide.h | 2 +- .../TrackerCommon/interface/TrackerTopology.h | 502 +++--- .../TrackerCommon/src/ClusterSummary.cc | 105 +- .../TrackerCommon/src/TrackerTopology.cc | 573 +++--- DataFormats/TrackerCommon/src/classes.h | 6 +- .../interface/ClusterMultiplicityFilter.h | 18 +- .../interface/ClusterSummaryProducer.h | 48 +- .../interface/ClusterVariables.h | 26 +- .../interface/PixelClusterSelectorTopBottom.h | 17 +- .../interface/StripClusterSelectorTopBottom.h | 17 +- .../src/ClusterChargeMasker.cc | 109 +- .../src/ClusterMultiplicityFilter.cc | 48 +- .../src/ClusterSummaryProducer.cc | 225 +-- .../src/HITrackClusterRemover.cc | 900 ++++----- .../src/HLTTrackClusterRemoverNew.cc | 718 ++++---- .../src/JetCoreClusterSplitter.cc | 310 ++-- .../src/PixelClusterSelectorTopBottom.cc | 37 +- .../src/SeedClusterRemover.cc | 470 ++--- .../src/SeedClusterRemoverPhase2.cc | 235 +-- .../src/StripClusterSelectorTopBottom.cc | 36 +- .../src/TopBottomClusterInfoProducer.cc | 215 +-- .../src/TrackClusterRemover.cc | 255 ++- .../src/TrackClusterRemoverPhase2.cc | 206 +-- .../test/ClusterAnalyzer.cc | 139 +- .../test/ClusterMCsplitStrips.cc | 238 +-- .../interface/TrackAlgoPriorityOrder.h | 4 +- .../interface/TrackCollectionCloner.h | 44 +- .../interface/TrackMVAClassifier.h | 109 +- .../plugins/AnalyticalTrackSelector.cc | 541 +++--- .../plugins/ClassifierMerger.cc | 87 +- .../plugins/CosmicTrackSelector.cc | 398 ++-- .../plugins/CosmicTrackSplitter.cc | 664 +++---- .../plugins/DefaultTrackMVAClassifier.cc | 207 +-- .../plugins/DuplicateListMerger.cc | 386 ++-- .../plugins/DuplicateTrackMerger.cc | 795 ++++---- .../plugins/DuplicateTrackType.h | 6 +- .../plugins/LwtnnESProducer.cc | 7 +- .../plugins/MultiTrackSelector.cc | 661 +++---- .../plugins/MultiTrackSelector.h | 245 +-- .../TrackAlgoPriorityOrderESProducer.cc | 6 +- .../TrackCandidateTopBottomHitFilter.cc | 27 +- .../plugins/TrackCollectionFilterCloner.cc | 232 ++- .../plugins/TrackCollectionMerger.cc | 442 +++-- .../plugins/TrackCutClassifier.cc | 546 +++--- .../plugins/TrackListMerger.cc | 1382 +++++++------- .../plugins/TrackLwtnnClassifier.cc | 47 +- .../plugins/TrackMerger.cc | 301 ++-- .../FinalTrackSelectors/plugins/TrackMerger.h | 74 +- .../plugins/TrackerTrackHitFilter.cc | 1604 +++++++++-------- .../plugins/getBestVertex.h | 69 +- .../FinalTrackSelectors/plugins/powN.h | 85 +- .../src/TrackAlgoPriorityOrder.cc | 11 +- .../src/TrackCollectionCloner.cc | 103 +- .../src/TrackMVAClassifierBase.cc | 86 +- .../src/trackAlgoPriorityOrder.h | 130 +- .../test/trackAlgoPriorityOrder_t.cpp | 8 +- 63 files changed, 7544 insertions(+), 7503 deletions(-) diff --git a/DataFormats/SiStripCluster/interface/SiStripCluster.h b/DataFormats/SiStripCluster/interface/SiStripCluster.h index 11bb1beb14638..8b29e852fec54 100644 --- a/DataFormats/SiStripCluster/interface/SiStripCluster.h +++ b/DataFormats/SiStripCluster/interface/SiStripCluster.h @@ -6,39 +6,36 @@ #include #include "FWCore/MessageLogger/interface/MessageLogger.h" -class SiStripCluster { +class SiStripCluster { public: + typedef std::vector::const_iterator SiStripDigiIter; + typedef std::pair SiStripDigiRange; - typedef std::vector::const_iterator SiStripDigiIter; - typedef std::pair SiStripDigiRange; - - static const uint16_t stripIndexMask = 0x7FFF; // The first strip index is in the low 15 bits of firstStrip_ + static const uint16_t stripIndexMask = 0x7FFF; // The first strip index is in the low 15 bits of firstStrip_ static const uint16_t mergedValueMask = 0x8000; // The merged state is given by the high bit of firstStrip_ - /** Construct from a range of digis that form a cluster and from * a DetID. The range is assumed to be non-empty. */ - + SiStripCluster() {} explicit SiStripCluster(const SiStripDigiRange& range); - template - SiStripCluster(const uint16_t& firstStrip, - Iter begin, Iter end ): - amplitudes_(begin,end), firstStrip_(firstStrip) {} + template + SiStripCluster(const uint16_t& firstStrip, Iter begin, Iter end) : amplitudes_(begin, end), firstStrip_(firstStrip) {} - template - SiStripCluster(const uint16_t& firstStrip, Iter begin, Iter end, bool merged): - amplitudes_(begin,end), firstStrip_(firstStrip) { - if (merged) firstStrip_ |= mergedValueMask; // if this is a candidate merged cluster - } + template + SiStripCluster(const uint16_t& firstStrip, Iter begin, Iter end, bool merged) + : amplitudes_(begin, end), firstStrip_(firstStrip) { + if (merged) + firstStrip_ |= mergedValueMask; // if this is a candidate merged cluster + } /** The number of the first strip in the cluster. * The high bit of firstStrip_ indicates whether the cluster is a candidate for being merged. */ - uint16_t firstStrip() const {return firstStrip_ & stripIndexMask;} + uint16_t firstStrip() const { return firstStrip_ & stripIndexMask; } /** The amplitudes of the strips forming the cluster. * The amplitudes are on consecutive strips; if a strip is missing @@ -51,7 +48,7 @@ class SiStripCluster { * You can find the special meanings of values { 0, 254, 255} in section 3.4.1 of * http://www.te.rl.ac.uk/esdg/cms-fed/firmware/Documents/FE_FPGA_Technical_Description.pdf */ - const std::vector& amplitudes() const {return amplitudes_;} + const std::vector& amplitudes() const { return amplitudes_; } /** The barycenter of the cluster, not corrected for Lorentz shift; * should not be used as position estimate for tracking. @@ -61,31 +58,29 @@ class SiStripCluster { /** total charge * */ - int charge() const { return std::accumulate(amplitudes().begin(), amplitudes().end(), int(0)); } + int charge() const { return std::accumulate(amplitudes().begin(), amplitudes().end(), int(0)); } /** Test (set) the merged status of the cluster * */ - bool isMerged() const {return (firstStrip_ & mergedValueMask) != 0;} - void setMerged(bool mergedState) {mergedState ? firstStrip_ |= mergedValueMask : firstStrip_ &= stripIndexMask;} - - float getSplitClusterError () const { return error_x; } - void setSplitClusterError ( float errx ) { error_x = errx; } + bool isMerged() const { return (firstStrip_ & mergedValueMask) != 0; } + void setMerged(bool mergedState) { mergedState ? firstStrip_ |= mergedValueMask : firstStrip_ &= stripIndexMask; } + float getSplitClusterError() const { return error_x; } + void setSplitClusterError(float errx) { error_x = errx; } private: + std::vector amplitudes_; - std::vector amplitudes_; - - uint16_t firstStrip_ = 0; + uint16_t firstStrip_ = 0; // ggiurgiu@fnal.gov, 01/05/12 - // Add cluster errors to be used by rechits from split clusters. - // A rechit from a split cluster has larger errors than rechits from normal clusters. - // However, when presented with a cluster, the CPE does not know if the cluster comes - // from a splitting procedure or not. That's why we have to instruct the CPE to use + // Add cluster errors to be used by rechits from split clusters. + // A rechit from a split cluster has larger errors than rechits from normal clusters. + // However, when presented with a cluster, the CPE does not know if the cluster comes + // from a splitting procedure or not. That's why we have to instruct the CPE to use // appropriate errors for split clusters. - // To avoid increase of data size on disk,these new data members are set as transient in: + // To avoid increase of data size on disk,these new data members are set as transient in: // DataFormats/SiStripCluster/src/classes_def.xml float error_x = -99999.9; @@ -94,19 +89,18 @@ class SiStripCluster { // The CPE will check these errors and if they are not un-physical, // it will recognize the clusters as split and assign these (increased) // errors to the corresponding rechit. - }; // Comparison operators -inline bool operator<( const SiStripCluster& one, const SiStripCluster& other) { - return one.firstStrip() < other.firstStrip(); -} +inline bool operator<(const SiStripCluster& one, const SiStripCluster& other) { + return one.firstStrip() < other.firstStrip(); +} inline bool operator<(const SiStripCluster& cluster, const uint16_t& firstStrip) { return cluster.firstStrip() < firstStrip; -} +} -inline bool operator<(const uint16_t& firstStrip,const SiStripCluster& cluster) { +inline bool operator<(const uint16_t& firstStrip, const SiStripCluster& cluster) { return firstStrip < cluster.firstStrip(); -} -#endif // DATAFORMATS_SISTRIPCLUSTER_H +} +#endif // DATAFORMATS_SISTRIPCLUSTER_H diff --git a/DataFormats/SiStripCluster/interface/SiStripClusterCollection.h b/DataFormats/SiStripCluster/interface/SiStripClusterCollection.h index cd26f740bc56f..72a6551eb00e0 100644 --- a/DataFormats/SiStripCluster/interface/SiStripClusterCollection.h +++ b/DataFormats/SiStripCluster/interface/SiStripClusterCollection.h @@ -1,5 +1,3 @@ #ifndef DATAFORMATS_SISTRIPCLUSTERCOLLECTION_H #define DATAFORMATS_SISTRIPCLUSTERCOLLECTION_H -#endif // - - +#endif // diff --git a/DataFormats/SiStripCluster/interface/SiStripClusterTools.h b/DataFormats/SiStripCluster/interface/SiStripClusterTools.h index eaa7de35da7e3..545db3b43bdfb 100644 --- a/DataFormats/SiStripCluster/interface/SiStripClusterTools.h +++ b/DataFormats/SiStripCluster/interface/SiStripClusterTools.h @@ -4,56 +4,52 @@ #include "DataFormats/TrajectoryState/interface/LocalTrajectoryParameters.h" #include "DataFormats/SiStripDetId/interface/SiStripDetId.h" -#include +#include namespace siStripClusterTools { // to be moved and optimized in TrackerCommon when TrackerTopology will support moduleGeometry - inline float sensorThicknessInverse (DetId detid) - { - if (detid.subdetId()>=SiStripDetId::TIB) { - SiStripDetId siStripDetId = detid(); - if (siStripDetId.subdetId()==SiStripDetId::TOB) return 1.f/0.047f; - if (siStripDetId.moduleGeometry()==SiStripModuleGeometry::W5 || siStripDetId.moduleGeometry()==SiStripModuleGeometry::W6 || - siStripDetId.moduleGeometry()==SiStripModuleGeometry::W7) - return 1.f/0.047f; - return 1.f/0.029f; // so it is TEC ring 1-4 or TIB or TOB; - } else if (detid.subdetId()==1) return 1.f/0.0285f; - else return 1.f/0.027f; + inline float sensorThicknessInverse(DetId detid) { + if (detid.subdetId() >= SiStripDetId::TIB) { + SiStripDetId siStripDetId = detid(); + if (siStripDetId.subdetId() == SiStripDetId::TOB) + return 1.f / 0.047f; + if (siStripDetId.moduleGeometry() == SiStripModuleGeometry::W5 || + siStripDetId.moduleGeometry() == SiStripModuleGeometry::W6 || + siStripDetId.moduleGeometry() == SiStripModuleGeometry::W7) + return 1.f / 0.047f; + return 1.f / 0.029f; // so it is TEC ring 1-4 or TIB or TOB; + } else if (detid.subdetId() == 1) + return 1.f / 0.0285f; + else + return 1.f / 0.027f; } - - template + template inline float chargePerCM(DetId detid, Iter a, Iter b) { - return float(std::accumulate(a,b,int(0)))*sensorThicknessInverse(detid); + return float(std::accumulate(a, b, int(0))) * sensorThicknessInverse(detid); } - template - inline float chargePerCM(DetId detid, Clus const & cl) { - return cl.charge()*sensorThicknessInverse(detid); + template + inline float chargePerCM(DetId detid, Clus const& cl) { + return cl.charge() * sensorThicknessInverse(detid); } - - template - inline float chargePerCM(DetId detid, Clus const & cl, LocalTrajectoryParameters const & tp) { - return chargePerCM(detid,cl)*tp.absdz(); + template + inline float chargePerCM(DetId detid, Clus const& cl, LocalTrajectoryParameters const& tp) { + return chargePerCM(detid, cl) * tp.absdz(); } - template - inline float chargePerCM(Clus const & cl, LocalTrajectoryParameters const & tp, float invThick) { - return cl.charge()*invThick*tp.absdz(); + template + inline float chargePerCM(Clus const& cl, LocalTrajectoryParameters const& tp, float invThick) { + return cl.charge() * invThick * tp.absdz(); } - - template - inline float chargePerCM(DetId detid, Clus const & cl, const LocalVector & ldir) { - return chargePerCM(detid,cl)*std::abs(ldir.z())/ldir.mag(); + template + inline float chargePerCM(DetId detid, Clus const& cl, const LocalVector& ldir) { + return chargePerCM(detid, cl) * std::abs(ldir.z()) / ldir.mag(); } +} // namespace siStripClusterTools - -} - - -#endif // DataFormatsSiStripClusterSiStripClusterTools_H - +#endif // DataFormatsSiStripClusterSiStripClusterTools_H diff --git a/DataFormats/SiStripCluster/src/SiStripCluster.cc b/DataFormats/SiStripCluster/src/SiStripCluster.cc index 61dafd59aba77..4cee2270134f6 100644 --- a/DataFormats/SiStripCluster/src/SiStripCluster.cc +++ b/DataFormats/SiStripCluster/src/SiStripCluster.cc @@ -1,40 +1,34 @@ #include "DataFormats/SiStripCluster/interface/SiStripCluster.h" -SiStripCluster::SiStripCluster(const SiStripDigiRange& range) : - firstStrip_(range.first->strip()), - error_x(-99999.9) -{ +SiStripCluster::SiStripCluster(const SiStripDigiRange& range) : firstStrip_(range.first->strip()), error_x(-99999.9) { + amplitudes_.reserve(range.second - range.first); - amplitudes_.reserve( range.second - range.first); - - uint16_t lastStrip=0; + uint16_t lastStrip = 0; bool firstInloop = true; - for (SiStripDigiIter i=range.first; i!=range.second; i++) { - + for (SiStripDigiIter i = range.first; i != range.second; i++) { /// check if digis consecutive if (!firstInloop && i->strip() != lastStrip + 1) { - for (int j=0; j < i->strip()-(lastStrip+1); j++) { - amplitudes_.push_back( 0); + for (int j = 0; j < i->strip() - (lastStrip + 1); j++) { + amplitudes_.push_back(0); } } lastStrip = i->strip(); firstInloop = false; - - amplitudes_.push_back(i->adc()); + + amplitudes_.push_back(i->adc()); } } - -float SiStripCluster::barycenter() const{ +float SiStripCluster::barycenter() const { int sumx = 0; int suma = 0; auto asize = amplitudes_.size(); - for (auto i=0U;i #include #include -#include +#include #include #include #include "FWCore/Utilities/interface/Exception.h" @@ -39,11 +39,10 @@ #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" #include "DataFormats/Common/interface/DetSetVectorNew.h" - #include "DataFormats/SiStripDigi/interface/SiStripProcessedRawDigi.h" #include "DataFormats/Common/interface/DetSetVector.h" -#include "DataFormats/DetId/interface/DetId.h" +#include "DataFormats/DetId/interface/DetId.h" #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" #include "DataFormats/SiPixelDetId/interface/PixelBarrelName.h" @@ -58,7 +57,6 @@ The number of variables for each module is stored within iterator_ ********************************************************************************************/ - class ClusterSummary { public: ClusterSummary(); @@ -75,69 +73,80 @@ class ClusterSummary { #endif // Enum for each partition within Tracker - enum CMSTracker {STRIP = 0, TIB = 1, TOB = 2, TID = 3, TEC = 4, PIXEL = 5, FPIX = 6, BPIX = 7, NVALIDENUMS = 8, NTRACKERENUMS = 100}; + enum CMSTracker { + STRIP = 0, + TIB = 1, + TOB = 2, + TID = 3, + TEC = 4, + PIXEL = 5, + FPIX = 6, + BPIX = 7, + NVALIDENUMS = 8, + NTRACKERENUMS = 100 + }; static const std::vector subDetNames; - static const std::vector > subDetSelections ; + static const std::vector > subDetSelections; // Enum which describes the ordering of the summary variables inside vector variables_ - enum VariablePlacement{NCLUSTERS, CLUSTERSIZE, CLUSTERCHARGE, NVARIABLES}; + enum VariablePlacement { NCLUSTERS, CLUSTERSIZE, CLUSTERCHARGE, NVARIABLES }; static const std::vector variableNames; - //===================+++++++++++++======================== // - // Main methods to fill + // Main methods to fill // Variables // //===================+++++++++++++======================== - + //These functions are broken into two categories. The standard versions take the enums as input and find the locations in the vector. //The ones labeled "byIndex" take the vector location as input - public: - int getNClusByIndex (const int mod) const {return nClus .at(mod);} - int getClusSizeByIndex (const int mod) const {return clusSize .at(mod);} - float getClusChargeByIndex(const int mod) const {return clusCharge.at(mod);} - - int getNClus (const CMSTracker mod) const {int pos = getModuleLocation(mod); return pos < 0 ? 0. : nClus [pos];} - int getClusSize (const CMSTracker mod) const {int pos = getModuleLocation(mod); return pos < 0 ? 0. : clusSize [pos];} - float getClusCharge(const CMSTracker mod) const {int pos = getModuleLocation(mod); return pos < 0 ? 0. : clusCharge[pos];} - - const std::vector & getNClusVector() const {return nClus;} - const std::vector & getClusSizeVector() const {return clusSize;} - const std::vector& getClusChargeVector() const {return clusCharge;} - - void addNClusByIndex (const int mod, const int val) {nClus .at(mod)+=val;} - void addClusSizeByIndex (const int mod, const int val) {clusSize .at(mod)+=val;} - void addClusChargeByIndex(const int mod, const float val) {clusCharge.at(mod)+=val;} - - void addNClus (const CMSTracker mod, const int val) {nClus .at(getModuleLocation(mod))+=val;} - void addClusSize (const CMSTracker mod, const int val) {clusSize .at(getModuleLocation(mod))+=val;} - void addClusCharge(const CMSTracker mod, const float val) {clusCharge.at(getModuleLocation(mod))+=val;} - - const std::vector& getModules() const { return modules; } +public: + int getNClusByIndex(const int mod) const { return nClus.at(mod); } + int getClusSizeByIndex(const int mod) const { return clusSize.at(mod); } + float getClusChargeByIndex(const int mod) const { return clusCharge.at(mod); } + + int getNClus(const CMSTracker mod) const { + int pos = getModuleLocation(mod); + return pos < 0 ? 0. : nClus[pos]; + } + int getClusSize(const CMSTracker mod) const { + int pos = getModuleLocation(mod); + return pos < 0 ? 0. : clusSize[pos]; + } + float getClusCharge(const CMSTracker mod) const { + int pos = getModuleLocation(mod); + return pos < 0 ? 0. : clusCharge[pos]; + } + + const std::vector& getNClusVector() const { return nClus; } + const std::vector& getClusSizeVector() const { return clusSize; } + const std::vector& getClusChargeVector() const { return clusCharge; } + + void addNClusByIndex(const int mod, const int val) { nClus.at(mod) += val; } + void addClusSizeByIndex(const int mod, const int val) { clusSize.at(mod) += val; } + void addClusChargeByIndex(const int mod, const float val) { clusCharge.at(mod) += val; } + + void addNClus(const CMSTracker mod, const int val) { nClus.at(getModuleLocation(mod)) += val; } + void addClusSize(const CMSTracker mod, const int val) { clusSize.at(getModuleLocation(mod)) += val; } + void addClusCharge(const CMSTracker mod, const float val) { clusCharge.at(getModuleLocation(mod)) += val; } + + const std::vector& getModules() const { return modules; } // Return the location of desired module within modules_. If warn is set to true, a warnign will be outputed in case no module was found - int getModuleLocation ( int mod, bool warn = true ) const; - unsigned int getNumberOfModules() const {return modules.size();} - int getModule(const int index) const { return modules[index];} + int getModuleLocation(int mod, bool warn = true) const; + unsigned int getNumberOfModules() const { return modules.size(); } + int getModule(const int index) const { return modules[index]; } //copies over only non-zero entries into the current one void copyNonEmpty(const ClusterSummary& src); //Set values to 0 void reset(); - private: - std::vector modules ; // - std::vector nClus ; - std::vector clusSize ; +private: + std::vector modules; // + std::vector nClus; + std::vector clusSize; std::vector clusCharge; }; - #endif - - - - - - - diff --git a/DataFormats/TrackerCommon/interface/SiStripEnums.h b/DataFormats/TrackerCommon/interface/SiStripEnums.h index 4a699b74de894..e2744b35db2b3 100644 --- a/DataFormats/TrackerCommon/interface/SiStripEnums.h +++ b/DataFormats/TrackerCommon/interface/SiStripEnums.h @@ -5,6 +5,6 @@ namespace SiStripSubdetector { enum Subdetector { UNKNOWN = 0, TIB = 3, TID = 4, TOB = 5, TEC = 6 }; } -enum class SiStripModuleGeometry { UNKNOWNGEOMETRY, IB1 , IB2, OB1, OB2, W1A, W2A, W3A, W1B, W2B, W3B, W4, W5, W6, W7 }; +enum class SiStripModuleGeometry { UNKNOWNGEOMETRY, IB1, IB2, OB1, OB2, W1A, W2A, W3A, W1B, W2B, W3B, W4, W5, W6, W7 }; #endif diff --git a/DataFormats/TrackerCommon/interface/TrackerDetSide.h b/DataFormats/TrackerCommon/interface/TrackerDetSide.h index ba6845b237769..522f674bb3c1d 100644 --- a/DataFormats/TrackerCommon/interface/TrackerDetSide.h +++ b/DataFormats/TrackerCommon/interface/TrackerDetSide.h @@ -1,6 +1,6 @@ #ifndef DataFormats_TrackerCommon_TrackerDetSide_H #define DataFormats_TrackerCommon_TrackerDetSide_H -enum class TrackerDetSide { Barrel = 0, NegEndcap = 1, PosEndcap = 2 }; +enum class TrackerDetSide { Barrel = 0, NegEndcap = 1, PosEndcap = 2 }; #endif diff --git a/DataFormats/TrackerCommon/interface/TrackerTopology.h b/DataFormats/TrackerCommon/interface/TrackerTopology.h index fa3c3b3526ccf..28fb47215a784 100644 --- a/DataFormats/TrackerCommon/interface/TrackerTopology.h +++ b/DataFormats/TrackerCommon/interface/TrackerTopology.h @@ -14,9 +14,7 @@ // endcap pixel class TrackerTopology { - - public: - +public: struct PixelBarrelValues { unsigned int layerStartBit_; unsigned int ladderStartBit_; @@ -101,154 +99,142 @@ class TrackerTopology { }; enum DetIdFields { - PBModule, PBLadder, PBLayer, - PFModule, PFPanel, PFBlade, PFDisk, PFSide, + PBModule, + PBLadder, + PBLayer, + PFModule, + PFPanel, + PFBlade, + PFDisk, + PFSide, /* TODO: this can be extended for all subdetectors */ DETID_FIELDS_MAX }; class SameLayerComparator { public: - explicit SameLayerComparator(const TrackerTopology *topo): topo_(topo) {} + explicit SameLayerComparator(const TrackerTopology *topo) : topo_(topo) {} bool operator()(DetId i1, DetId i2) const { - if(i1.det() == i2.det() && - i1.subdetId() == i2.subdetId() && - topo_->side(i1) == topo_->side(i2) && - topo_->layer(i1) == topo_->layer(i2)) { + if (i1.det() == i2.det() && i1.subdetId() == i2.subdetId() && topo_->side(i1) == topo_->side(i2) && + topo_->layer(i1) == topo_->layer(i2)) { return false; } return i1 < i2; } - bool operator()(uint32_t i1, uint32_t i2) const { - return operator()(DetId(i1), DetId(i2)); - } + bool operator()(uint32_t i1, uint32_t i2) const { return operator()(DetId(i1), DetId(i2)); } + private: const TrackerTopology *topo_; }; - - TrackerTopology( const PixelBarrelValues& pxb, const PixelEndcapValues& pxf, - const TECValues& tecv, const TIBValues& tibv, - const TIDValues& tidv, const TOBValues& tobv); + TrackerTopology(const PixelBarrelValues &pxb, + const PixelEndcapValues &pxf, + const TECValues &tecv, + const TIBValues &tibv, + const TIDValues &tidv, + const TOBValues &tobv); unsigned int side(const DetId &id) const; unsigned int layer(const DetId &id) const; unsigned int module(const DetId &id) const; - // layer numbers unsigned int pxbLayer(const DetId &id) const { - return int((id.rawId()>>pbVals_.layerStartBit_) & pbVals_.layerMask_); + return int((id.rawId() >> pbVals_.layerStartBit_) & pbVals_.layerMask_); } unsigned int tobLayer(const DetId &id) const { - return int((id.rawId()>>tobVals_.layerStartBit_) & tobVals_.layerMask_); + return int((id.rawId() >> tobVals_.layerStartBit_) & tobVals_.layerMask_); } unsigned int tibLayer(const DetId &id) const { - return int((id.rawId()>>tibVals_.layerStartBit_) & tibVals_.layerMask_); + return int((id.rawId() >> tibVals_.layerStartBit_) & tibVals_.layerMask_); } //ladder unsigned int pxbLadder(const DetId &id) const { - return ((id.rawId()>>pbVals_.ladderStartBit_) & pbVals_.ladderMask_) ; + return ((id.rawId() >> pbVals_.ladderStartBit_) & pbVals_.ladderMask_); } //module unsigned int pxbModule(const DetId &id) const { - return ((id.rawId()>>pbVals_.moduleStartBit_)& pbVals_.moduleMask_); + return ((id.rawId() >> pbVals_.moduleStartBit_) & pbVals_.moduleMask_); } unsigned int pxfModule(const DetId &id) const { - return int((id.rawId()>>pfVals_.moduleStartBit_) & pfVals_.moduleMask_); + return int((id.rawId() >> pfVals_.moduleStartBit_) & pfVals_.moduleMask_); } unsigned int tobModule(const DetId &id) const { - return ((id.rawId()>>tobVals_.moduleStartBit_)& tobVals_.moduleMask_); + return ((id.rawId() >> tobVals_.moduleStartBit_) & tobVals_.moduleMask_); } - unsigned int tecModule(const DetId &id) const { - return ((id.rawId()>>tecVals_.moduleStartBit_) & tecVals_.moduleMask_); + unsigned int tecModule(const DetId &id) const { + return ((id.rawId() >> tecVals_.moduleStartBit_) & tecVals_.moduleMask_); } unsigned int tibModule(const DetId &id) const { - return ((id.rawId()>>tibVals_.moduleStartBit_)& tibVals_.moduleMask_); + return ((id.rawId() >> tibVals_.moduleStartBit_) & tibVals_.moduleMask_); } unsigned int tidModule(const DetId &id) const { - return ((id.rawId()>>tidVals_.moduleStartBit_)& tidVals_.moduleMask_); + return ((id.rawId() >> tidVals_.moduleStartBit_) & tidVals_.moduleMask_); } //side unsigned int tobSide(const DetId &id) const { - return ((id.rawId()>>tobVals_.rod_fw_bwStartBit_) & tobVals_.rod_fw_bwMask_); + return ((id.rawId() >> tobVals_.rod_fw_bwStartBit_) & tobVals_.rod_fw_bwMask_); } - unsigned int tecSide(const DetId &id) const { - return ((id.rawId()>>tecVals_.sideStartBit_)&tecVals_.sideMask_); - } + unsigned int tecSide(const DetId &id) const { return ((id.rawId() >> tecVals_.sideStartBit_) & tecVals_.sideMask_); } unsigned int tibSide(const DetId &id) const { - return ((id.rawId()>>tibVals_.str_fw_bwStartBit_) & tibVals_.str_fw_bwMask_); + return ((id.rawId() >> tibVals_.str_fw_bwStartBit_) & tibVals_.str_fw_bwMask_); } - unsigned int tidSide(const DetId &id) const { - return ((id.rawId()>>tidVals_.sideStartBit_)&tidVals_.sideMask_); - } + unsigned int tidSide(const DetId &id) const { return ((id.rawId() >> tidVals_.sideStartBit_) & tidVals_.sideMask_); } - unsigned int pxfSide(const DetId &id) const { - return ((id.rawId()>>pfVals_.sideStartBit_)&pfVals_.sideMask_); - } + unsigned int pxfSide(const DetId &id) const { return ((id.rawId() >> pfVals_.sideStartBit_) & pfVals_.sideMask_); } //rod - unsigned int tobRod(const DetId &id) const { - return ((id.rawId()>>tobVals_.rodStartBit_) & tobVals_.rodMask_); - } + unsigned int tobRod(const DetId &id) const { return ((id.rawId() >> tobVals_.rodStartBit_) & tobVals_.rodMask_); } //wheel - unsigned int tecWheel(const DetId &id) const { - return ((id.rawId()>>tecVals_.wheelStartBit_) & tecVals_.wheelMask_) ; + unsigned int tecWheel(const DetId &id) const { + return ((id.rawId() >> tecVals_.wheelStartBit_) & tecVals_.wheelMask_); } - unsigned int tidWheel(const DetId &id) const { - return ((id.rawId()>>tidVals_.wheelStartBit_) & tidVals_.wheelMask_) ; + unsigned int tidWheel(const DetId &id) const { + return ((id.rawId() >> tidVals_.wheelStartBit_) & tidVals_.wheelMask_); } //order - unsigned int tecOrder(const DetId &id) const { - return ((id.rawId()>>tecVals_.petal_fw_bwStartBit_) & tecVals_.petal_fw_bwMask_); + unsigned int tecOrder(const DetId &id) const { + return ((id.rawId() >> tecVals_.petal_fw_bwStartBit_) & tecVals_.petal_fw_bwMask_); } - unsigned int tibOrder(const DetId &id) const { - return ((id.rawId()>>tibVals_.str_int_extStartBit_) & tibVals_.str_int_extMask_); + unsigned int tibOrder(const DetId &id) const { + return ((id.rawId() >> tibVals_.str_int_extStartBit_) & tibVals_.str_int_extMask_); } - unsigned int tidOrder(const DetId &id) const { - return ((id.rawId()>>tidVals_.module_fw_bwStartBit_) & tidVals_.module_fw_bwMask_); + unsigned int tidOrder(const DetId &id) const { + return ((id.rawId() >> tidVals_.module_fw_bwStartBit_) & tidVals_.module_fw_bwMask_); } - /// ring id - unsigned int tecRing(const DetId &id) const { - return ((id.rawId()>>tecVals_.ringStartBit_) & tecVals_.ringMask_) ; - } - unsigned int tidRing(const DetId &id) const { - return ((id.rawId()>>tidVals_.ringStartBit_) & tidVals_.ringMask_) ; - } - + unsigned int tecRing(const DetId &id) const { return ((id.rawId() >> tecVals_.ringStartBit_) & tecVals_.ringMask_); } + unsigned int tidRing(const DetId &id) const { return ((id.rawId() >> tidVals_.ringStartBit_) & tidVals_.ringMask_); } //petal - unsigned int tecPetalNumber(const DetId &id) const - { return ((id.rawId()>>tecVals_.petalStartBit_) & tecVals_.petalMask_);} - - - + unsigned int tecPetalNumber(const DetId &id) const { + return ((id.rawId() >> tecVals_.petalStartBit_) & tecVals_.petalMask_); + } //misc tob std::vector tobRodInfo(const DetId &id) const { std::vector num; - num.push_back( tobSide(id) ); - num.push_back( tobRod(id) ); - return num ; + num.push_back(tobSide(id)); + num.push_back(tobRod(id)); + return num; } //generic function to return DetIds and boolean factors - uint32_t glued(const DetId &id) const ; - uint32_t stack(const DetId &id) const ; - uint32_t lower(const DetId &id) const ; - uint32_t upper(const DetId &id) const ; + uint32_t glued(const DetId &id) const; + uint32_t stack(const DetId &id) const; + uint32_t lower(const DetId &id) const; + uint32_t upper(const DetId &id) const; bool isStereo(const DetId &id) const; bool isRPhi(const DetId &id) const; @@ -256,48 +242,50 @@ class TrackerTopology { bool isUpper(const DetId &id) const; //specific function to return boolean factors - bool tobIsDoubleSide(const DetId &id) const { return tobGlued(id)==0 && (tobLayer(id)==1 || tobLayer(id)==2);} - bool tecIsDoubleSide(const DetId &id) const { return tecGlued(id)==0 && (tecRing(id)==1 || tecRing(id)==2 || tecRing(id)==5);} - bool tibIsDoubleSide(const DetId &id) const { return tibGlued(id)==0 && (tibLayer(id)==1 || tibLayer(id)==2);} - bool tidIsDoubleSide(const DetId &id) const { return tidGlued(id)==0 && (tidRing(id)==1 || tidRing(id)==2);} + bool tobIsDoubleSide(const DetId &id) const { return tobGlued(id) == 0 && (tobLayer(id) == 1 || tobLayer(id) == 2); } + bool tecIsDoubleSide(const DetId &id) const { + return tecGlued(id) == 0 && (tecRing(id) == 1 || tecRing(id) == 2 || tecRing(id) == 5); + } + bool tibIsDoubleSide(const DetId &id) const { return tibGlued(id) == 0 && (tibLayer(id) == 1 || tibLayer(id) == 2); } + bool tidIsDoubleSide(const DetId &id) const { return tidGlued(id) == 0 && (tidRing(id) == 1 || tidRing(id) == 2); } - bool tobIsZPlusSide(const DetId &id) const {return !tobIsZMinusSide(id);} - bool tobIsZMinusSide(const DetId &id) const { return tobSide(id)==1;} + bool tobIsZPlusSide(const DetId &id) const { return !tobIsZMinusSide(id); } + bool tobIsZMinusSide(const DetId &id) const { return tobSide(id) == 1; } - bool tibIsZPlusSide(const DetId &id) const {return !tibIsZMinusSide(id);} - bool tibIsZMinusSide(const DetId &id) const { return tibSide(id)==1;} + bool tibIsZPlusSide(const DetId &id) const { return !tibIsZMinusSide(id); } + bool tibIsZMinusSide(const DetId &id) const { return tibSide(id) == 1; } - bool tidIsZPlusSide(const DetId &id) const {return !tidIsZMinusSide(id);} - bool tidIsZMinusSide(const DetId &id) const { return tidSide(id)==1;} + bool tidIsZPlusSide(const DetId &id) const { return !tidIsZMinusSide(id); } + bool tidIsZMinusSide(const DetId &id) const { return tidSide(id) == 1; } - bool tecIsZPlusSide(const DetId &id) const {return !tecIsZMinusSide(id);} - bool tecIsZMinusSide(const DetId &id) const { return tecSide(id)==1;} + bool tecIsZPlusSide(const DetId &id) const { return !tecIsZMinusSide(id); } + bool tecIsZMinusSide(const DetId &id) const { return tecSide(id) == 1; } - bool tobIsStereo(const DetId &id) const {return tobStereo(id)!=0 && !tobIsDoubleSide(id);} - bool tecIsStereo(const DetId &id) const {return tecStereo(id)!=0 && !tecIsDoubleSide(id);} - bool tibIsStereo(const DetId &id) const {return tibStereo(id)!=0 && !tibIsDoubleSide(id);} - bool tidIsStereo(const DetId &id) const {return tidStereo(id)!=0 && !tidIsDoubleSide(id);} + bool tobIsStereo(const DetId &id) const { return tobStereo(id) != 0 && !tobIsDoubleSide(id); } + bool tecIsStereo(const DetId &id) const { return tecStereo(id) != 0 && !tecIsDoubleSide(id); } + bool tibIsStereo(const DetId &id) const { return tibStereo(id) != 0 && !tibIsDoubleSide(id); } + bool tidIsStereo(const DetId &id) const { return tidStereo(id) != 0 && !tidIsDoubleSide(id); } - bool tobIsRPhi(const DetId &id) const { return tobRPhi(id)!=0 && !tobIsDoubleSide(id);} - bool tecIsRPhi(const DetId &id) const { return tecRPhi(id)!=0 && !tecIsDoubleSide(id);} - bool tibIsRPhi(const DetId &id) const { return tibRPhi(id)!=0 && !tibIsDoubleSide(id);} - bool tidIsRPhi(const DetId &id) const { return tidRPhi(id)!=0 && !tidIsDoubleSide(id);} + bool tobIsRPhi(const DetId &id) const { return tobRPhi(id) != 0 && !tobIsDoubleSide(id); } + bool tecIsRPhi(const DetId &id) const { return tecRPhi(id) != 0 && !tecIsDoubleSide(id); } + bool tibIsRPhi(const DetId &id) const { return tibRPhi(id) != 0 && !tibIsDoubleSide(id); } + bool tidIsRPhi(const DetId &id) const { return tidRPhi(id) != 0 && !tidIsDoubleSide(id); } //phase0 stereo uint32_t tobStereo(const DetId &id) const { - return ( ((id.rawId() >>tobVals_.sterStartBit_ ) & tobVals_.sterMask_ ) == 1 ) ? 1 : 0; + return (((id.rawId() >> tobVals_.sterStartBit_) & tobVals_.sterMask_) == 1) ? 1 : 0; } uint32_t tibStereo(const DetId &id) const { - return ( ((id.rawId() >>tibVals_.sterStartBit_ ) & tibVals_.sterMask_ ) == 1 ) ? 1 : 0; + return (((id.rawId() >> tibVals_.sterStartBit_) & tibVals_.sterMask_) == 1) ? 1 : 0; } uint32_t tidStereo(const DetId &id) const { - return ( ((id.rawId() >>tidVals_.sterStartBit_ ) & tidVals_.sterMask_ ) == 1 ) ? 1 : 0; + return (((id.rawId() >> tidVals_.sterStartBit_) & tidVals_.sterMask_) == 1) ? 1 : 0; } uint32_t tecStereo(const DetId &id) const { - return ( ((id.rawId() >>tecVals_.sterStartBit_ ) & tecVals_.sterMask_ ) == 1 ) ? 1 : 0; + return (((id.rawId() >> tecVals_.sterStartBit_) & tecVals_.sterMask_) == 1) ? 1 : 0; } //phase0 stereo == phase2 lower @@ -308,27 +296,35 @@ class TrackerTopology { //phase0 rphi uint32_t tobRPhi(const DetId &id) const { - if ( ((id.rawId() >>tobVals_.sterStartBit_ ) & tobVals_.sterMask_ ) == 2 ) { - return ( (id.rawId()>>tobVals_.sterStartBit_) & tobVals_.sterMask_ ); - } else { return 0; } + if (((id.rawId() >> tobVals_.sterStartBit_) & tobVals_.sterMask_) == 2) { + return ((id.rawId() >> tobVals_.sterStartBit_) & tobVals_.sterMask_); + } else { + return 0; + } } uint32_t tibRPhi(const DetId &id) const { - if ( ((id.rawId() >>tibVals_.sterStartBit_ ) & tibVals_.sterMask_ ) == 2 ) { - return ( (id.rawId()>>tibVals_.sterStartBit_) & tibVals_.sterMask_ ); - } else { return 0; } + if (((id.rawId() >> tibVals_.sterStartBit_) & tibVals_.sterMask_) == 2) { + return ((id.rawId() >> tibVals_.sterStartBit_) & tibVals_.sterMask_); + } else { + return 0; + } } uint32_t tidRPhi(const DetId &id) const { - if ( ((id.rawId() >>tidVals_.sterStartBit_ ) & tidVals_.sterMask_ ) == 2 ) { - return ( (id.rawId()>>tidVals_.sterStartBit_) & tidVals_.sterMask_ ); - } else { return 0; } + if (((id.rawId() >> tidVals_.sterStartBit_) & tidVals_.sterMask_) == 2) { + return ((id.rawId() >> tidVals_.sterStartBit_) & tidVals_.sterMask_); + } else { + return 0; + } } uint32_t tecRPhi(const DetId &id) const { - if ( ((id.rawId() >>tecVals_.sterStartBit_ ) & tecVals_.sterMask_ ) == 2 ) { - return ( (id.rawId()>>tecVals_.sterStartBit_) & tecVals_.sterMask_ ); - } else { return 0; } + if (((id.rawId() >> tecVals_.sterStartBit_) & tecVals_.sterMask_) == 2) { + return ((id.rawId() >> tecVals_.sterStartBit_) & tecVals_.sterMask_); + } else { + return 0; + } } //phase0 rphi == phase2 upper @@ -336,26 +332,26 @@ class TrackerTopology { uint32_t tidUpper(const DetId &id) const { return tidRPhi(id); } uint32_t tobUpper(const DetId &id) const { return tobRPhi(id); } uint32_t tecUpper(const DetId &id) const { return tecRPhi(id); } - + //phase0 glued uint32_t tibGlued(const DetId &id) const { - uint32_t testId = (id.rawId()>>tibVals_.sterStartBit_) & tibVals_.sterMask_; - return ( testId == 0 ) ? 0 : (id.rawId() - testId); + uint32_t testId = (id.rawId() >> tibVals_.sterStartBit_) & tibVals_.sterMask_; + return (testId == 0) ? 0 : (id.rawId() - testId); } uint32_t tecGlued(const DetId &id) const { - uint32_t testId = (id.rawId()>>tecVals_.sterStartBit_) & tecVals_.sterMask_; - return ( testId == 0 ) ? 0 : (id.rawId() - testId); + uint32_t testId = (id.rawId() >> tecVals_.sterStartBit_) & tecVals_.sterMask_; + return (testId == 0) ? 0 : (id.rawId() - testId); } uint32_t tobGlued(const DetId &id) const { - uint32_t testId = (id.rawId()>>tobVals_.sterStartBit_) & tobVals_.sterMask_; - return ( testId == 0 ) ? 0 : (id.rawId() - testId); + uint32_t testId = (id.rawId() >> tobVals_.sterStartBit_) & tobVals_.sterMask_; + return (testId == 0) ? 0 : (id.rawId() - testId); } uint32_t tidGlued(const DetId &id) const { - uint32_t testId = (id.rawId()>>tidVals_.sterStartBit_) & tidVals_.sterMask_; - return ( testId == 0 ) ? 0 : (id.rawId() - testId); + uint32_t testId = (id.rawId() >> tidVals_.sterStartBit_) & tidVals_.sterMask_; + return (testId == 0) ? 0 : (id.rawId() - testId); } //phase0 glued == phase2 stack @@ -368,35 +364,43 @@ class TrackerTopology { DetId partnerDetId(const DetId &id) const; DetId tibPartnerDetId(const DetId &id) const { - if ( ((id.rawId()>>tibVals_.sterStartBit_) & tibVals_.sterMask_ ) == 1 ) { - return DetId( id.rawId() + 1 ); - } else if ( ((id.rawId()>>tibVals_.sterStartBit_) & tibVals_.sterMask_ ) == 2 ) { - return DetId( id.rawId() - 1 ); - } else { return DetId(); } + if (((id.rawId() >> tibVals_.sterStartBit_) & tibVals_.sterMask_) == 1) { + return DetId(id.rawId() + 1); + } else if (((id.rawId() >> tibVals_.sterStartBit_) & tibVals_.sterMask_) == 2) { + return DetId(id.rawId() - 1); + } else { + return DetId(); + } } DetId tobPartnerDetId(const DetId &id) const { - if ( ((id.rawId()>>tobVals_.sterStartBit_) & tobVals_.sterMask_ ) == 1 ) { - return DetId( id.rawId() + 1 ); - } else if ( ((id.rawId()>>tobVals_.sterStartBit_) & tobVals_.sterMask_ ) == 2 ) { - return DetId( id.rawId() - 1 ); - } else { return DetId(); } + if (((id.rawId() >> tobVals_.sterStartBit_) & tobVals_.sterMask_) == 1) { + return DetId(id.rawId() + 1); + } else if (((id.rawId() >> tobVals_.sterStartBit_) & tobVals_.sterMask_) == 2) { + return DetId(id.rawId() - 1); + } else { + return DetId(); + } } DetId tidPartnerDetId(const DetId &id) const { - if ( ((id.rawId()>>tidVals_.sterStartBit_) & tidVals_.sterMask_ ) == 1 ) { - return DetId( id.rawId() + 1 ); - } else if ( ((id.rawId()>>tidVals_.sterStartBit_) & tidVals_.sterMask_ ) == 2 ) { - return DetId( id.rawId() - 1 ); - } else { return DetId(); } + if (((id.rawId() >> tidVals_.sterStartBit_) & tidVals_.sterMask_) == 1) { + return DetId(id.rawId() + 1); + } else if (((id.rawId() >> tidVals_.sterStartBit_) & tidVals_.sterMask_) == 2) { + return DetId(id.rawId() - 1); + } else { + return DetId(); + } } uint32_t tecPartnerDetId(const DetId &id) const { - if ( ((id.rawId()>>tecVals_.sterStartBit_) & tecVals_.sterMask_ ) == 1 ) { - return DetId( id.rawId() + 1 ); - } else if ( ((id.rawId()>>tecVals_.sterStartBit_) & tecVals_.sterMask_ ) == 2 ) { - return DetId( id.rawId() - 1 ); - } else { return DetId(); } + if (((id.rawId() >> tecVals_.sterStartBit_) & tecVals_.sterMask_) == 1) { + return DetId(id.rawId() + 1); + } else if (((id.rawId() >> tecVals_.sterStartBit_) & tecVals_.sterMask_) == 2) { + return DetId(id.rawId() - 1); + } else { + return DetId(); + } } //misc tec @@ -404,203 +408,171 @@ class TrackerTopology { std::vector num; num.push_back(tecOrder(id)); num.push_back(tecPetalNumber(id)); - return num ; + return num; } - bool tecIsBackPetal(const DetId &id) const { - return (tecOrder(id)==1); - } + bool tecIsBackPetal(const DetId &id) const { return (tecOrder(id) == 1); } - bool tecIsFrontPetal(const DetId &id) const {return !tecIsBackPetal(id);} + bool tecIsFrontPetal(const DetId &id) const { return !tecIsBackPetal(id); } //misc tib - unsigned int tibString(const DetId &id) const { - return (id.rawId()>>tibVals_.strStartBit_)&tibVals_.strMask_; - } - - std::vector tibStringInfo(const DetId &id) const - { std::vector num; - num.push_back( tibSide(id) ); - num.push_back( tibOrder(id) ); - num.push_back(tibString(id)); - return num ; - } + unsigned int tibString(const DetId &id) const { return (id.rawId() >> tibVals_.strStartBit_) & tibVals_.strMask_; } - bool tibIsInternalString(const DetId &id) const { - return (tibOrder(id)==1); + std::vector tibStringInfo(const DetId &id) const { + std::vector num; + num.push_back(tibSide(id)); + num.push_back(tibOrder(id)); + num.push_back(tibString(id)); + return num; } - bool tibIsExternalString(const DetId &id) const { - return !tibIsInternalString(id); - } + bool tibIsInternalString(const DetId &id) const { return (tibOrder(id) == 1); } + + bool tibIsExternalString(const DetId &id) const { return !tibIsInternalString(id); } //misc tid std::vector tidModuleInfo(const DetId &id) const { std::vector num; - num.push_back( tidOrder(id) ); - num.push_back( tidModule(id) ); - return num ; - } - - bool tidIsBackRing(const DetId &id) const { - return (tidOrder(id)==1); + num.push_back(tidOrder(id)); + num.push_back(tidModule(id)); + return num; } - bool tidIsFrontRing(const DetId &id) const {return !tidIsBackRing(id);} + bool tidIsBackRing(const DetId &id) const { return (tidOrder(id) == 1); } + bool tidIsFrontRing(const DetId &id) const { return !tidIsBackRing(id); } //misc pf - unsigned int pxfDisk(const DetId &id) const { - return int((id.rawId()>>pfVals_.diskStartBit_) & pfVals_.diskMask_); - } + unsigned int pxfDisk(const DetId &id) const { return int((id.rawId() >> pfVals_.diskStartBit_) & pfVals_.diskMask_); } unsigned int pxfBlade(const DetId &id) const { - return int((id.rawId()>>pfVals_.bladeStartBit_) & pfVals_.bladeMask_); + return int((id.rawId() >> pfVals_.bladeStartBit_) & pfVals_.bladeMask_); } unsigned int pxfPanel(const DetId &id) const { - return int((id.rawId()>>pfVals_.panelStartBit_) & pfVals_.panelMask_); + return int((id.rawId() >> pfVals_.panelStartBit_) & pfVals_.panelMask_); } //old constructors, now return DetId - DetId pxbDetId(uint32_t layer, - uint32_t ladder, - uint32_t module) const { + DetId pxbDetId(uint32_t layer, uint32_t ladder, uint32_t module) const { //uply - DetId id(DetId::Tracker,PixelSubdetector::PixelBarrel); - uint32_t rawid=id.rawId(); - rawid |= (layer& pbVals_.layerMask_) << pbVals_.layerStartBit_ | - (ladder& pbVals_.ladderMask_) << pbVals_.ladderStartBit_ | - (module& pbVals_.moduleMask_) << pbVals_.moduleStartBit_; + DetId id(DetId::Tracker, PixelSubdetector::PixelBarrel); + uint32_t rawid = id.rawId(); + rawid |= (layer & pbVals_.layerMask_) << pbVals_.layerStartBit_ | + (ladder & pbVals_.ladderMask_) << pbVals_.ladderStartBit_ | + (module & pbVals_.moduleMask_) << pbVals_.moduleStartBit_; return DetId(rawid); } - DetId pxfDetId(uint32_t side, - uint32_t disk, - uint32_t blade, - uint32_t panel, - uint32_t module) const { - DetId id(DetId::Tracker,PixelSubdetector::PixelEndcap); - uint32_t rawid=id.rawId(); - rawid |= (side& pfVals_.sideMask_) << pfVals_.sideStartBit_ | - (disk& pfVals_.diskMask_) << pfVals_.diskStartBit_ | - (blade& pfVals_.bladeMask_) << pfVals_.bladeStartBit_ | - (panel& pfVals_.panelMask_) << pfVals_.panelStartBit_ | - (module& pfVals_.moduleMask_) << pfVals_.moduleStartBit_ ; + DetId pxfDetId(uint32_t side, uint32_t disk, uint32_t blade, uint32_t panel, uint32_t module) const { + DetId id(DetId::Tracker, PixelSubdetector::PixelEndcap); + uint32_t rawid = id.rawId(); + rawid |= (side & pfVals_.sideMask_) << pfVals_.sideStartBit_ | (disk & pfVals_.diskMask_) << pfVals_.diskStartBit_ | + (blade & pfVals_.bladeMask_) << pfVals_.bladeStartBit_ | + (panel & pfVals_.panelMask_) << pfVals_.panelStartBit_ | + (module & pfVals_.moduleMask_) << pfVals_.moduleStartBit_; return DetId(rawid); } - DetId tecDetId(uint32_t side, uint32_t wheel, - uint32_t petal_fw_bw, uint32_t petal, - uint32_t ring, uint32_t module, uint32_t ster) const { - - DetId id=DetId(DetId::Tracker,SiStripSubdetector::TEC); - uint32_t rawid=id.rawId(); - - rawid |= (side& tecVals_.sideMask_) << tecVals_.sideStartBit_ | - (wheel& tecVals_.wheelMask_) << tecVals_.wheelStartBit_ | - (petal_fw_bw& tecVals_.petal_fw_bwMask_) << tecVals_.petal_fw_bwStartBit_ | - (petal& tecVals_.petalMask_) << tecVals_.petalStartBit_ | - (ring& tecVals_.ringMask_) << tecVals_.ringStartBit_ | - (module& tecVals_.moduleMask_) << tecVals_.moduleStartBit_ | - (ster& tecVals_.sterMask_) << tecVals_.sterStartBit_ ; + DetId tecDetId(uint32_t side, + uint32_t wheel, + uint32_t petal_fw_bw, + uint32_t petal, + uint32_t ring, + uint32_t module, + uint32_t ster) const { + DetId id = DetId(DetId::Tracker, SiStripSubdetector::TEC); + uint32_t rawid = id.rawId(); + + rawid |= (side & tecVals_.sideMask_) << tecVals_.sideStartBit_ | + (wheel & tecVals_.wheelMask_) << tecVals_.wheelStartBit_ | + (petal_fw_bw & tecVals_.petal_fw_bwMask_) << tecVals_.petal_fw_bwStartBit_ | + (petal & tecVals_.petalMask_) << tecVals_.petalStartBit_ | + (ring & tecVals_.ringMask_) << tecVals_.ringStartBit_ | + (module & tecVals_.moduleMask_) << tecVals_.moduleStartBit_ | + (ster & tecVals_.sterMask_) << tecVals_.sterStartBit_; return DetId(rawid); } - DetId tibDetId(uint32_t layer, - uint32_t str_fw_bw, - uint32_t str_int_ext, - uint32_t str, - uint32_t module, - uint32_t ster) const { - DetId id=DetId(DetId::Tracker,SiStripSubdetector::TIB); - uint32_t rawid=id.rawId(); - rawid |= (layer& tibVals_.layerMask_) << tibVals_.layerStartBit_ | - (str_fw_bw& tibVals_.str_fw_bwMask_) << tibVals_.str_fw_bwStartBit_ | - (str_int_ext& tibVals_.str_int_extMask_) << tibVals_.str_int_extStartBit_ | - (str& tibVals_.strMask_) << tibVals_.strStartBit_ | - (module& tibVals_.moduleMask_) << tibVals_.moduleStartBit_ | - (ster& tibVals_.sterMask_) << tibVals_.sterStartBit_ ; + DetId tibDetId( + uint32_t layer, uint32_t str_fw_bw, uint32_t str_int_ext, uint32_t str, uint32_t module, uint32_t ster) const { + DetId id = DetId(DetId::Tracker, SiStripSubdetector::TIB); + uint32_t rawid = id.rawId(); + rawid |= (layer & tibVals_.layerMask_) << tibVals_.layerStartBit_ | + (str_fw_bw & tibVals_.str_fw_bwMask_) << tibVals_.str_fw_bwStartBit_ | + (str_int_ext & tibVals_.str_int_extMask_) << tibVals_.str_int_extStartBit_ | + (str & tibVals_.strMask_) << tibVals_.strStartBit_ | + (module & tibVals_.moduleMask_) << tibVals_.moduleStartBit_ | + (ster & tibVals_.sterMask_) << tibVals_.sterStartBit_; return DetId(rawid); } - DetId tidDetId(uint32_t side, - uint32_t wheel, - uint32_t ring, - uint32_t module_fw_bw, - uint32_t module, - uint32_t ster) const { - DetId id=DetId(DetId::Tracker,SiStripSubdetector::TID); - uint32_t rawid=id.rawId(); - rawid |= (side& tidVals_.sideMask_) << tidVals_.sideStartBit_ | - (wheel& tidVals_.wheelMask_) << tidVals_.wheelStartBit_ | - (ring& tidVals_.ringMask_) << tidVals_.ringStartBit_ | - (module_fw_bw& tidVals_.module_fw_bwMask_) << tidVals_.module_fw_bwStartBit_ | - (module& tidVals_.moduleMask_) << tidVals_.moduleStartBit_ | - (ster& tidVals_.sterMask_) << tidVals_.sterStartBit_ ; + DetId tidDetId( + uint32_t side, uint32_t wheel, uint32_t ring, uint32_t module_fw_bw, uint32_t module, uint32_t ster) const { + DetId id = DetId(DetId::Tracker, SiStripSubdetector::TID); + uint32_t rawid = id.rawId(); + rawid |= (side & tidVals_.sideMask_) << tidVals_.sideStartBit_ | + (wheel & tidVals_.wheelMask_) << tidVals_.wheelStartBit_ | + (ring & tidVals_.ringMask_) << tidVals_.ringStartBit_ | + (module_fw_bw & tidVals_.module_fw_bwMask_) << tidVals_.module_fw_bwStartBit_ | + (module & tidVals_.moduleMask_) << tidVals_.moduleStartBit_ | + (ster & tidVals_.sterMask_) << tidVals_.sterStartBit_; return DetId(rawid); } - DetId tobDetId(uint32_t layer, - uint32_t rod_fw_bw, - uint32_t rod, - uint32_t module, - uint32_t ster) const { - DetId id=DetId(DetId::Tracker,SiStripSubdetector::TOB); - uint32_t rawid=id.rawId(); - rawid |= (layer& tobVals_.layerMask_) << tobVals_.layerStartBit_ | - (rod_fw_bw& tobVals_.rod_fw_bwMask_) << tobVals_.rod_fw_bwStartBit_ | - (rod& tobVals_.rodMask_) << tobVals_.rodStartBit_ | - (module& tobVals_.moduleMask_) << tobVals_.moduleStartBit_ | - (ster& tobVals_.sterMask_) << tobVals_.sterStartBit_ ; + DetId tobDetId(uint32_t layer, uint32_t rod_fw_bw, uint32_t rod, uint32_t module, uint32_t ster) const { + DetId id = DetId(DetId::Tracker, SiStripSubdetector::TOB); + uint32_t rawid = id.rawId(); + rawid |= (layer & tobVals_.layerMask_) << tobVals_.layerStartBit_ | + (rod_fw_bw & tobVals_.rod_fw_bwMask_) << tobVals_.rod_fw_bwStartBit_ | + (rod & tobVals_.rodMask_) << tobVals_.rodStartBit_ | + (module & tobVals_.moduleMask_) << tobVals_.moduleStartBit_ | + (ster & tobVals_.sterMask_) << tobVals_.sterStartBit_; return DetId(rawid); } std::pair pxbDetIdLayerComparator(uint32_t layer) const { - return std::make_pair(pxbDetId(layer, 1,1), SameLayerComparator(this)); + return std::make_pair(pxbDetId(layer, 1, 1), SameLayerComparator(this)); } std::pair pxfDetIdDiskComparator(uint32_t side, uint32_t disk) const { - return std::make_pair(pxfDetId(side, disk, 1,1,1), SameLayerComparator(this)); + return std::make_pair(pxfDetId(side, disk, 1, 1, 1), SameLayerComparator(this)); } std::pair tecDetIdWheelComparator(uint32_t side, uint32_t wheel) const { - return std::make_pair(tecDetId(side, wheel, 1,1,1,1,1), SameLayerComparator(this)); + return std::make_pair(tecDetId(side, wheel, 1, 1, 1, 1, 1), SameLayerComparator(this)); } std::pair tibDetIdLayerComparator(uint32_t layer) const { - return std::make_pair(tibDetId(layer, 1,1,1,1,1), SameLayerComparator(this)); + return std::make_pair(tibDetId(layer, 1, 1, 1, 1, 1), SameLayerComparator(this)); } std::pair tidDetIdWheelComparator(uint32_t side, uint32_t wheel) const { - return std::make_pair(tidDetId(side, wheel, 1,1,1,1), SameLayerComparator(this)); + return std::make_pair(tidDetId(side, wheel, 1, 1, 1, 1), SameLayerComparator(this)); } std::pair tobDetIdLayerComparator(uint32_t layer) const { - return std::make_pair(tobDetId(layer, 1,1,1,1), SameLayerComparator(this)); + return std::make_pair(tobDetId(layer, 1, 1, 1, 1), SameLayerComparator(this)); } std::string print(DetId detid) const; SiStripModuleGeometry moduleGeometry(const DetId &id) const; - - int getOTLayerNumber(const DetId &id)const; - int getITPixelLayerNumber(const DetId &id)const; - // Those is only implemented for Pixel right now, but can be extended to all + int getOTLayerNumber(const DetId &id) const; + int getITPixelLayerNumber(const DetId &id) const; + + // Those is only implemented for Pixel right now, but can be extended to all // subdetectors. // Extract the raw bit value for a given field type. // E.g. getField(id, PBLadder) == pxbLadder(id) unsigned int getField(const DetId &id, DetIdFields idx) const { - return ((id.rawId()>>bits_per_field[idx].startBit)&bits_per_field[idx].mask); + return ((id.rawId() >> bits_per_field[idx].startBit) & bits_per_field[idx].mask); } // checks whether a given field can be extracted from a given DetId. // This boils down to checking whether it is the correct subdetector. - bool hasField(const DetId &id, DetIdFields idx) const { - return id.subdetId() == bits_per_field[idx].subdet; - } - - private: + bool hasField(const DetId &id, DetIdFields idx) const { return id.subdetId() == bits_per_field[idx].subdet; } +private: const PixelBarrelValues pbVals_; const PixelEndcapValues pfVals_; @@ -609,14 +581,12 @@ class TrackerTopology { const TIDValues tidVals_; const TECValues tecVals_; - struct BitmaskAndSubdet { - unsigned int startBit; + struct BitmaskAndSubdet { + unsigned int startBit; unsigned int mask; int subdet; }; const BitmaskAndSubdet bits_per_field[DETID_FIELDS_MAX]; - }; #endif - diff --git a/DataFormats/TrackerCommon/src/ClusterSummary.cc b/DataFormats/TrackerCommon/src/ClusterSummary.cc index 47697f120f83c..e4704ffd8d8e4 100644 --- a/DataFormats/TrackerCommon/src/ClusterSummary.cc +++ b/DataFormats/TrackerCommon/src/ClusterSummary.cc @@ -1,84 +1,89 @@ #include "DataFormats/TrackerCommon/interface/ClusterSummary.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" -const std::vector ClusterSummary::subDetNames {"STRIP","TOB","TIB","TID","TEC","PIXEL","BPIX","FPIX"}; -const std::vector > ClusterSummary::subDetSelections { -{"0x1e000000-0x1A000000","0x1e000000-0x16000000","0x1e000000-0x18000000","0x1e000000-0x1C000000"}, -{"0x1e000000-0x1A000000"},{"0x1e000000-0x16000000"},{"0x1e000000-0x18000000"},{"0x1e000000-0x1C000000"}, -{"0x1e000000-0x12000000","0x1e000000-0x14000000"}, -{"0x1e000000-0x12000000"},{"0x1e000000-0x14000000"} -}; -const std::vector ClusterSummary::variableNames {"NCLUSTERS","CLUSTERSIZE","CLUSTERCHARGE"}; +const std::vector ClusterSummary::subDetNames{ + "STRIP", "TOB", "TIB", "TID", "TEC", "PIXEL", "BPIX", "FPIX"}; +const std::vector > ClusterSummary::subDetSelections{ + {"0x1e000000-0x1A000000", "0x1e000000-0x16000000", "0x1e000000-0x18000000", "0x1e000000-0x1C000000"}, + {"0x1e000000-0x1A000000"}, + {"0x1e000000-0x16000000"}, + {"0x1e000000-0x18000000"}, + {"0x1e000000-0x1C000000"}, + {"0x1e000000-0x12000000", "0x1e000000-0x14000000"}, + {"0x1e000000-0x12000000"}, + {"0x1e000000-0x14000000"}}; +const std::vector ClusterSummary::variableNames{"NCLUSTERS", "CLUSTERSIZE", "CLUSTERCHARGE"}; ClusterSummary::ClusterSummary() : ClusterSummary(NVALIDENUMS) {} -ClusterSummary::ClusterSummary(const int nSelections) : modules(nSelections),nClus(nSelections),clusSize(nSelections),clusCharge(nSelections) -{ - for(int i = 0; i < nSelections; ++i) modules[i] = i; +ClusterSummary::ClusterSummary(const int nSelections) + : modules(nSelections), nClus(nSelections), clusSize(nSelections), clusCharge(nSelections) { + for (int i = 0; i < nSelections; ++i) + modules[i] = i; } -ClusterSummary& ClusterSummary::operator=(const ClusterSummary& rhs) -{ - modules = rhs.modules ; - nClus = rhs.nClus ; - clusSize = rhs.clusSize ; - clusCharge = rhs.clusCharge ; +ClusterSummary& ClusterSummary::operator=(const ClusterSummary& rhs) { + modules = rhs.modules; + nClus = rhs.nClus; + clusSize = rhs.clusSize; + clusCharge = rhs.clusCharge; return *this; } // move ctor -ClusterSummary::ClusterSummary(ClusterSummary&& other) : ClusterSummary() -{ - *this = other; -} +ClusterSummary::ClusterSummary(ClusterSummary&& other) : ClusterSummary() { *this = other; } -ClusterSummary::ClusterSummary(const ClusterSummary& src) : - modules (src.getModules() ), - nClus (src.getNClusVector() ), - clusSize (src.getClusSizeVector() ), - clusCharge(src.getClusChargeVector()) -{} +ClusterSummary::ClusterSummary(const ClusterSummary& src) + : modules(src.getModules()), + nClus(src.getNClusVector()), + clusSize(src.getClusSizeVector()), + clusCharge(src.getClusChargeVector()) {} -int ClusterSummary::getModuleLocation ( int mod, bool warn ) const { +int ClusterSummary::getModuleLocation(int mod, bool warn) const { int iM = -1; - for (auto m : modules){++iM; if (m==mod) return iM;} + for (auto m : modules) { + ++iM; + if (m == mod) + return iM; + } - if(warn) - edm::LogWarning("NoModule") << "No information for requested module "< & src_modules = src.getModules(); - const std::vector & src_nClus = src.getNClusVector(); - const std::vector & src_clusSize = src.getClusSizeVector(); + const std::vector& src_modules = src.getModules(); + const std::vector& src_nClus = src.getNClusVector(); + const std::vector& src_clusSize = src.getClusSizeVector(); const std::vector& src_clusCharge = src.getClusChargeVector(); - modules .reserve(src_modules.size()); - nClus .reserve(src_modules.size()); - clusSize .reserve(src_modules.size()); + modules.reserve(src_modules.size()); + nClus.reserve(src_modules.size()); + clusSize.reserve(src_modules.size()); clusCharge.reserve(src_modules.size()); - for(unsigned int iM = 0; iM < src_nClus.size(); ++iM){ - if(src.nClus[iM] != 0){ - modules .push_back(src_modules [iM]); - nClus .push_back(src_nClus [iM]); - clusSize .push_back(src_clusSize [iM]); + for (unsigned int iM = 0; iM < src_nClus.size(); ++iM) { + if (src.nClus[iM] != 0) { + modules.push_back(src_modules[iM]); + nClus.push_back(src_nClus[iM]); + clusSize.push_back(src_clusSize[iM]); clusCharge.push_back(src_clusCharge[iM]); } } } -void ClusterSummary::reset(){ - for(unsigned int iM = 0; iM < modules.size(); ++iM){ - nClus [iM] = 0; - clusSize [iM] = 0; +void ClusterSummary::reset() { + for (unsigned int iM = 0; iM < modules.size(); ++iM) { + nClus[iM] = 0; + clusSize[iM] = 0; clusCharge[iM] = 0; } } diff --git a/DataFormats/TrackerCommon/src/TrackerTopology.cc b/DataFormats/TrackerCommon/src/TrackerTopology.cc index 89b46d5d7deb3..2286f7d0a5e32 100644 --- a/DataFormats/TrackerCommon/src/TrackerTopology.cc +++ b/DataFormats/TrackerCommon/src/TrackerTopology.cc @@ -4,42 +4,40 @@ #include "FWCore/MessageLogger/interface/MessageLogger.h" #include -TrackerTopology::TrackerTopology( const PixelBarrelValues& pxb, const PixelEndcapValues& pxf, - const TECValues& tecv, const TIBValues& tibv, - const TIDValues& tidv, const TOBValues& tobv) +TrackerTopology::TrackerTopology(const PixelBarrelValues &pxb, + const PixelEndcapValues &pxf, + const TECValues &tecv, + const TIBValues &tibv, + const TIDValues &tidv, + const TOBValues &tobv) : pbVals_(pxb), pfVals_(pxf), tobVals_(tobv), tibVals_(tibv), tidVals_(tidv), tecVals_(tecv), - bits_per_field{ - [PBModule] = { pbVals_.moduleStartBit_, pbVals_.moduleMask_, PixelSubdetector::PixelBarrel}, - [PBLadder] = { pbVals_.ladderStartBit_, pbVals_.ladderMask_, PixelSubdetector::PixelBarrel}, - [PBLayer] = { pbVals_.layerStartBit_, pbVals_.layerMask_, PixelSubdetector::PixelBarrel}, - [PFModule] = { pfVals_.moduleStartBit_, pfVals_.moduleMask_, PixelSubdetector::PixelEndcap}, - [PFPanel] = { pfVals_.panelStartBit_, pfVals_.panelMask_, PixelSubdetector::PixelEndcap}, - [PFBlade] = { pfVals_.bladeStartBit_, pfVals_.bladeMask_, PixelSubdetector::PixelEndcap}, - [PFDisk] = { pfVals_.diskStartBit_, pfVals_.diskMask_, PixelSubdetector::PixelEndcap}, - [PFSide] = { pfVals_.sideStartBit_, pfVals_.sideMask_, PixelSubdetector::PixelEndcap} - } -{} - - + bits_per_field{[PBModule] = {pbVals_.moduleStartBit_, pbVals_.moduleMask_, PixelSubdetector::PixelBarrel}, + [PBLadder] = {pbVals_.ladderStartBit_, pbVals_.ladderMask_, PixelSubdetector::PixelBarrel}, + [PBLayer] = {pbVals_.layerStartBit_, pbVals_.layerMask_, PixelSubdetector::PixelBarrel}, + [PFModule] = {pfVals_.moduleStartBit_, pfVals_.moduleMask_, PixelSubdetector::PixelEndcap}, + [PFPanel] = {pfVals_.panelStartBit_, pfVals_.panelMask_, PixelSubdetector::PixelEndcap}, + [PFBlade] = {pfVals_.bladeStartBit_, pfVals_.bladeMask_, PixelSubdetector::PixelEndcap}, + [PFDisk] = {pfVals_.diskStartBit_, pfVals_.diskMask_, PixelSubdetector::PixelEndcap}, + [PFSide] = {pfVals_.sideStartBit_, pfVals_.sideMask_, PixelSubdetector::PixelEndcap}} {} unsigned int TrackerTopology::side(const DetId &id) const { - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) return 0; - if ( subdet == PixelSubdetector::PixelEndcap ) + if (subdet == PixelSubdetector::PixelEndcap) return pxfSide(id); - if ( subdet == SiStripSubdetector::TIB ) + if (subdet == SiStripSubdetector::TIB) return 0; - if ( subdet == SiStripSubdetector::TID ) + if (subdet == SiStripSubdetector::TID) return tidSide(id); - if ( subdet == SiStripSubdetector::TOB ) + if (subdet == SiStripSubdetector::TOB) return 0; - if ( subdet == SiStripSubdetector::TEC ) + if (subdet == SiStripSubdetector::TEC) return tecSide(id); throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::side"; @@ -47,18 +45,18 @@ unsigned int TrackerTopology::side(const DetId &id) const { } unsigned int TrackerTopology::layer(const DetId &id) const { - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) return pxbLayer(id); - if ( subdet == PixelSubdetector::PixelEndcap ) + if (subdet == PixelSubdetector::PixelEndcap) return pxfDisk(id); - if ( subdet == SiStripSubdetector::TIB ) + if (subdet == SiStripSubdetector::TIB) return tibLayer(id); - if ( subdet == SiStripSubdetector::TID ) + if (subdet == SiStripSubdetector::TID) return tidWheel(id); - if ( subdet == SiStripSubdetector::TOB ) + if (subdet == SiStripSubdetector::TOB) return tobLayer(id); - if ( subdet == SiStripSubdetector::TEC ) + if (subdet == SiStripSubdetector::TEC) return tecWheel(id); throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::layer"; @@ -66,18 +64,18 @@ unsigned int TrackerTopology::layer(const DetId &id) const { } unsigned int TrackerTopology::module(const DetId &id) const { - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) return pxbModule(id); - if ( subdet == PixelSubdetector::PixelEndcap ) + if (subdet == PixelSubdetector::PixelEndcap) return pxfModule(id); - if ( subdet == SiStripSubdetector::TIB ) + if (subdet == SiStripSubdetector::TIB) return tibModule(id); - if ( subdet == SiStripSubdetector::TID ) + if (subdet == SiStripSubdetector::TID) return tidModule(id); - if ( subdet == SiStripSubdetector::TOB ) + if (subdet == SiStripSubdetector::TOB) return tobModule(id); - if ( subdet == SiStripSubdetector::TEC ) + if (subdet == SiStripSubdetector::TEC) return tecModule(id); throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::module"; @@ -85,317 +83,293 @@ unsigned int TrackerTopology::module(const DetId &id) const { } uint32_t TrackerTopology::glued(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return 0; - if ( subdet == PixelSubdetector::PixelEndcap ) - return 0; - if ( subdet == SiStripSubdetector::TIB ) - return tibGlued(id); - if ( subdet == SiStripSubdetector::TID ) - return tidGlued(id); - if ( subdet == SiStripSubdetector::TOB ) - return tobGlued(id); - if ( subdet == SiStripSubdetector::TEC ) - return tecGlued(id); - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::glued"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) return 0; + if (subdet == PixelSubdetector::PixelEndcap) + return 0; + if (subdet == SiStripSubdetector::TIB) + return tibGlued(id); + if (subdet == SiStripSubdetector::TID) + return tidGlued(id); + if (subdet == SiStripSubdetector::TOB) + return tobGlued(id); + if (subdet == SiStripSubdetector::TEC) + return tecGlued(id); + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::glued"; + return 0; } uint32_t TrackerTopology::stack(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return 0; - if ( subdet == PixelSubdetector::PixelEndcap ) - return 0; - if ( subdet == SiStripSubdetector::TIB ) - return tibStack(id); - if ( subdet == SiStripSubdetector::TID ) - return tidStack(id); - if ( subdet == SiStripSubdetector::TOB ) - return tobStack(id); - if ( subdet == SiStripSubdetector::TEC ) - return tecStack(id); - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::stack"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) + return 0; + if (subdet == PixelSubdetector::PixelEndcap) + return 0; + if (subdet == SiStripSubdetector::TIB) + return tibStack(id); + if (subdet == SiStripSubdetector::TID) + return tidStack(id); + if (subdet == SiStripSubdetector::TOB) + return tobStack(id); + if (subdet == SiStripSubdetector::TEC) + return tecStack(id); + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::stack"; } uint32_t TrackerTopology::lower(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return 0; - if ( subdet == PixelSubdetector::PixelEndcap ) - return 0; - if ( subdet == SiStripSubdetector::TIB ) - return tibLower(id); - if ( subdet == SiStripSubdetector::TID ) - return tidLower(id); - if ( subdet == SiStripSubdetector::TOB ) - return tobLower(id); - if ( subdet == SiStripSubdetector::TEC ) - return tecLower(id); - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::lower"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) + return 0; + if (subdet == PixelSubdetector::PixelEndcap) + return 0; + if (subdet == SiStripSubdetector::TIB) + return tibLower(id); + if (subdet == SiStripSubdetector::TID) + return tidLower(id); + if (subdet == SiStripSubdetector::TOB) + return tobLower(id); + if (subdet == SiStripSubdetector::TEC) + return tecLower(id); + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::lower"; } uint32_t TrackerTopology::upper(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return 0; - if ( subdet == PixelSubdetector::PixelEndcap ) - return 0; - if ( subdet == SiStripSubdetector::TIB ) - return tibUpper(id); - if ( subdet == SiStripSubdetector::TID ) - return tidUpper(id); - if ( subdet == SiStripSubdetector::TOB ) - return tobUpper(id); - if ( subdet == SiStripSubdetector::TEC ) - return tecUpper(id); - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::upper"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) + return 0; + if (subdet == PixelSubdetector::PixelEndcap) + return 0; + if (subdet == SiStripSubdetector::TIB) + return tibUpper(id); + if (subdet == SiStripSubdetector::TID) + return tidUpper(id); + if (subdet == SiStripSubdetector::TOB) + return tobUpper(id); + if (subdet == SiStripSubdetector::TEC) + return tecUpper(id); + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::upper"; } - bool TrackerTopology::isStereo(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return false; - if ( subdet == PixelSubdetector::PixelEndcap ) - return false; - if ( subdet == SiStripSubdetector::TIB ) - return tibStereo(id)!=0; - if ( subdet == SiStripSubdetector::TID ) - return tidStereo(id)!=0; - if ( subdet == SiStripSubdetector::TOB ) - return tobStereo(id)!=0; - if ( subdet == SiStripSubdetector::TEC ) - return tecStereo(id)!=0; - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isStereo"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) + return false; + if (subdet == PixelSubdetector::PixelEndcap) return false; + if (subdet == SiStripSubdetector::TIB) + return tibStereo(id) != 0; + if (subdet == SiStripSubdetector::TID) + return tidStereo(id) != 0; + if (subdet == SiStripSubdetector::TOB) + return tobStereo(id) != 0; + if (subdet == SiStripSubdetector::TEC) + return tecStereo(id) != 0; + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isStereo"; + return false; } bool TrackerTopology::isRPhi(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return false; - if ( subdet == PixelSubdetector::PixelEndcap ) - return false; - if ( subdet == SiStripSubdetector::TIB ) - return tibRPhi(id)!=0; - if ( subdet == SiStripSubdetector::TID ) - return tidRPhi(id)!=0; - if ( subdet == SiStripSubdetector::TOB ) - return tobRPhi(id)!=0; - if ( subdet == SiStripSubdetector::TEC ) - return tecRPhi(id)!=0; - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isRPhi"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) + return false; + if (subdet == PixelSubdetector::PixelEndcap) return false; + if (subdet == SiStripSubdetector::TIB) + return tibRPhi(id) != 0; + if (subdet == SiStripSubdetector::TID) + return tidRPhi(id) != 0; + if (subdet == SiStripSubdetector::TOB) + return tobRPhi(id) != 0; + if (subdet == SiStripSubdetector::TEC) + return tecRPhi(id) != 0; + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isRPhi"; + return false; } bool TrackerTopology::isLower(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return false; - if ( subdet == PixelSubdetector::PixelEndcap ) - return false; - if ( subdet == SiStripSubdetector::TIB ) - return tibLower(id)!=0; - if ( subdet == SiStripSubdetector::TID ) - return tidLower(id)!=0; - if ( subdet == SiStripSubdetector::TOB ) - return tobLower(id)!=0; - if ( subdet == SiStripSubdetector::TEC ) - return tecLower(id)!=0; - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isLower"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) return false; - + if (subdet == PixelSubdetector::PixelEndcap) + return false; + if (subdet == SiStripSubdetector::TIB) + return tibLower(id) != 0; + if (subdet == SiStripSubdetector::TID) + return tidLower(id) != 0; + if (subdet == SiStripSubdetector::TOB) + return tobLower(id) != 0; + if (subdet == SiStripSubdetector::TEC) + return tecLower(id) != 0; + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isLower"; + return false; } bool TrackerTopology::isUpper(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return false; - if ( subdet == PixelSubdetector::PixelEndcap ) - return false; - if ( subdet == SiStripSubdetector::TIB ) - return tibUpper(id)!=0; - if ( subdet == SiStripSubdetector::TID ) - return tidUpper(id)!=0; - if ( subdet == SiStripSubdetector::TOB ) - return tobUpper(id)!=0; - if ( subdet == SiStripSubdetector::TEC ) - return tecUpper(id)!=0; - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isUpper"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) + return false; + if (subdet == PixelSubdetector::PixelEndcap) return false; + if (subdet == SiStripSubdetector::TIB) + return tibUpper(id) != 0; + if (subdet == SiStripSubdetector::TID) + return tidUpper(id) != 0; + if (subdet == SiStripSubdetector::TOB) + return tobUpper(id) != 0; + if (subdet == SiStripSubdetector::TEC) + return tecUpper(id) != 0; + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isUpper"; + return false; } DetId TrackerTopology::partnerDetId(const DetId &id) const { - - uint32_t subdet=id.subdetId(); - if ( subdet == PixelSubdetector::PixelBarrel ) - return 0; - if ( subdet == PixelSubdetector::PixelEndcap ) - return 0; - if ( subdet == SiStripSubdetector::TIB ) - return tibPartnerDetId(id); - if ( subdet == SiStripSubdetector::TID ) - return tidPartnerDetId(id); - if ( subdet == SiStripSubdetector::TOB ) - return tobPartnerDetId(id); - if ( subdet == SiStripSubdetector::TEC ) - return tecPartnerDetId(id); - - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::partnerDetId"; + uint32_t subdet = id.subdetId(); + if (subdet == PixelSubdetector::PixelBarrel) + return 0; + if (subdet == PixelSubdetector::PixelEndcap) return 0; + if (subdet == SiStripSubdetector::TIB) + return tibPartnerDetId(id); + if (subdet == SiStripSubdetector::TID) + return tidPartnerDetId(id); + if (subdet == SiStripSubdetector::TOB) + return tobPartnerDetId(id); + if (subdet == SiStripSubdetector::TEC) + return tecPartnerDetId(id); + + throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::partnerDetId"; + return 0; } std::string TrackerTopology::print(DetId id) const { - uint32_t subdet=id.subdetId(); + uint32_t subdet = id.subdetId(); std::stringstream strstr; - if ( subdet == PixelSubdetector::PixelBarrel ) { - unsigned int theLayer = pxbLayer(id); + if (subdet == PixelSubdetector::PixelBarrel) { + unsigned int theLayer = pxbLayer(id); unsigned int theLadder = pxbLadder(id); unsigned int theModule = pxbModule(id); - strstr << "PixelBarrel" - << " Layer " << theLayer - << " Ladder " << theLadder - << " Module " << theModule ; + strstr << "PixelBarrel" + << " Layer " << theLayer << " Ladder " << theLadder << " Module " << theModule; strstr << " (" << id.rawId() << ")"; return strstr.str(); } - if ( subdet == PixelSubdetector::PixelEndcap ) { - unsigned int theSide = pxfSide(id); - unsigned int theDisk = pxfDisk(id); - unsigned int theBlade = pxfBlade(id); - unsigned int thePanel = pxfPanel(id); + if (subdet == PixelSubdetector::PixelEndcap) { + unsigned int theSide = pxfSide(id); + unsigned int theDisk = pxfDisk(id); + unsigned int theBlade = pxfBlade(id); + unsigned int thePanel = pxfPanel(id); unsigned int theModule = pxfModule(id); - std::string side = (pxfSide(id) == 1 ) ? "-" : "+"; - strstr << "PixelEndcap" - << " Side " << theSide << side - << " Disk " << theDisk - << " Blade " << theBlade - << " Panel " << thePanel - << " Module " << theModule ; + std::string side = (pxfSide(id) == 1) ? "-" : "+"; + strstr << "PixelEndcap" + << " Side " << theSide << side << " Disk " << theDisk << " Blade " << theBlade << " Panel " << thePanel + << " Module " << theModule; strstr << " (" << id.rawId() << ")"; return strstr.str(); } - if ( subdet == SiStripSubdetector::TIB ) { - unsigned int theLayer = tibLayer(id); + if (subdet == SiStripSubdetector::TIB) { + unsigned int theLayer = tibLayer(id); std::vector theString = tibStringInfo(id); - unsigned int theModule = tibModule(id); + unsigned int theModule = tibModule(id); std::string side; std::string part; - side = (theString[0] == 1 ) ? "-" : "+"; - part = (theString[1] == 1 ) ? "int" : "ext"; + side = (theString[0] == 1) ? "-" : "+"; + part = (theString[1] == 1) ? "int" : "ext"; std::string type; type = (isStereo(id)) ? "stereo" : type; type = (isRPhi(id)) ? "r-phi" : type; - type = (isStereo(id) || isRPhi(id)) ? type+" glued": "module"; + type = (isStereo(id) || isRPhi(id)) ? type + " glued" : "module"; std::string typeUpgrade; typeUpgrade = (isLower(id)) ? "lower" : typeUpgrade; typeUpgrade = (isUpper(id)) ? "upper" : typeUpgrade; - typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade+" stack": "module"; - strstr << "TIB" << side - << " Layer " << theLayer << " " << part - << " String " << theString[2]; + typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade + " stack" : "module"; + strstr << "TIB" << side << " Layer " << theLayer << " " << part << " String " << theString[2]; strstr << " Module for phase0 " << theModule << " " << type; strstr << " Module for phase2 " << theModule << " " << typeUpgrade; strstr << " (" << id.rawId() << ")"; return strstr.str(); } - if ( subdet == SiStripSubdetector::TID ) { - unsigned int theSide = tidSide(id); - unsigned int theWheel = tidWheel(id); - unsigned int theRing = tidRing(id); + if (subdet == SiStripSubdetector::TID) { + unsigned int theSide = tidSide(id); + unsigned int theWheel = tidWheel(id); + unsigned int theRing = tidRing(id); std::vector theModule = tidModuleInfo(id); std::string side; std::string part; - side = (tidSide(id) == 1 ) ? "-" : "+"; - part = (theModule[0] == 1 ) ? "back" : "front"; + side = (tidSide(id) == 1) ? "-" : "+"; + part = (theModule[0] == 1) ? "back" : "front"; std::string type; type = (isStereo(id)) ? "stereo" : type; type = (isRPhi(id)) ? "r-phi" : type; - type = (isStereo(id) || isRPhi(id)) ? type+" glued": "module"; + type = (isStereo(id) || isRPhi(id)) ? type + " glued" : "module"; std::string typeUpgrade; typeUpgrade = (isLower(id)) ? "lower" : typeUpgrade; typeUpgrade = (isUpper(id)) ? "upper" : typeUpgrade; - typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade+" stack": "module"; - strstr << "TID" - << " Side " << theSide << side - << " Wheel " << theWheel - << " Ring " << theRing << " " << part; + typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade + " stack" : "module"; + strstr << "TID" + << " Side " << theSide << side << " Wheel " << theWheel << " Ring " << theRing << " " << part; strstr << " Module for phase0 " << theModule[1] << " " << type; strstr << " Module for phase2 " << theModule[1] << " " << typeUpgrade; strstr << " (" << id.rawId() << ")"; return strstr.str(); } - if ( subdet == SiStripSubdetector::TOB ) { - unsigned int theLayer = tobLayer(id); - std::vector theRod = tobRodInfo(id); - unsigned int theModule = tobModule(id); + if (subdet == SiStripSubdetector::TOB) { + unsigned int theLayer = tobLayer(id); + std::vector theRod = tobRodInfo(id); + unsigned int theModule = tobModule(id); std::string side; std::string part; - side = (((theRod[0] == 1 ) ? "-" : ((theRod[0] == 2 ) ? "+" : (theRod[0] == 3 ) ? "0" : ""))); -// side = (theRod[0] == 2 ) ? "+" : ""; -// side = (theRod[0] == 3 ) ? "0" : ""; + side = (((theRod[0] == 1) ? "-" : ((theRod[0] == 2) ? "+" : (theRod[0] == 3) ? "0" : ""))); + // side = (theRod[0] == 2 ) ? "+" : ""; + // side = (theRod[0] == 3 ) ? "0" : ""; std::string type; type = (isStereo(id)) ? "stereo" : type; type = (isRPhi(id)) ? "r-phi" : type; - type = (isStereo(id) || isRPhi(id)) ? type+" glued": "module"; + type = (isStereo(id) || isRPhi(id)) ? type + " glued" : "module"; std::string typeUpgrade; typeUpgrade = (isLower(id)) ? "lower" : typeUpgrade; typeUpgrade = (isUpper(id)) ? "upper" : typeUpgrade; - typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade+" stack": "module"; - strstr << "TOB" << side - << " Layer " << theLayer - << " Rod " << theRod[1]; + typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade + " stack" : "module"; + strstr << "TOB" << side << " Layer " << theLayer << " Rod " << theRod[1]; strstr << " Module for phase0 " << theModule << " " << type; strstr << " Module for phase2 " << theModule << " " << typeUpgrade; strstr << " (" << id.rawId() << ")"; return strstr.str(); } - if ( subdet == SiStripSubdetector::TEC ) { - unsigned int theSide = tecSide(id); - unsigned int theWheel = tecWheel(id); - unsigned int theModule = tecModule(id); - std::vector thePetal = tecPetalInfo(id); - unsigned int theRing = tecRing(id); + if (subdet == SiStripSubdetector::TEC) { + unsigned int theSide = tecSide(id); + unsigned int theWheel = tecWheel(id); + unsigned int theModule = tecModule(id); + std::vector thePetal = tecPetalInfo(id); + unsigned int theRing = tecRing(id); std::string side; std::string petal; - side = (tecSide(id) == 1 ) ? "-" : "+"; - petal = (thePetal[0] == 1 ) ? "back" : "front"; + side = (tecSide(id) == 1) ? "-" : "+"; + petal = (thePetal[0] == 1) ? "back" : "front"; std::string type; type = (isStereo(id)) ? "stereo" : type; type = (isRPhi(id)) ? "r-phi" : type; - type = (isStereo(id) || isRPhi(id)) ? type+" glued": "module"; + type = (isStereo(id) || isRPhi(id)) ? type + " glued" : "module"; std::string typeUpgrade; typeUpgrade = (isLower(id)) ? "lower" : typeUpgrade; typeUpgrade = (isUpper(id)) ? "upper" : typeUpgrade; - typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade+" stack": "module"; - strstr << "TEC" - << " Side " << theSide << side - << " Wheel " << theWheel - << " Petal " << thePetal[1] << " " << petal - << " Ring " << theRing; + typeUpgrade = (isUpper(id) || isLower(id)) ? typeUpgrade + " stack" : "module"; + strstr << "TEC" + << " Side " << theSide << side << " Wheel " << theWheel << " Petal " << thePetal[1] << " " << petal + << " Ring " << theRing; strstr << " Module for phase0 " << theModule << " " << type; strstr << " Module for phase2 " << theModule << " " << typeUpgrade; strstr << " (" << id.rawId() << ")"; @@ -403,61 +377,72 @@ std::string TrackerTopology::print(DetId id) const { return strstr.str(); } - throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::module"; return strstr.str(); } - SiStripModuleGeometry TrackerTopology::moduleGeometry(const DetId &id) const { - switch(id.subdetId()) { - case SiStripSubdetector::TIB: return tibLayer(id)<3? SiStripModuleGeometry::IB1 : SiStripModuleGeometry::IB2; - case SiStripSubdetector::TOB: return tobLayer(id)<5? SiStripModuleGeometry::OB2 : SiStripModuleGeometry::OB1; - case SiStripSubdetector::TID: switch (tidRing(id)) { - case 1: return SiStripModuleGeometry::W1A; - case 2: return SiStripModuleGeometry::W2A; - case 3: return SiStripModuleGeometry::W3A; - } - case SiStripSubdetector::TEC: switch (tecRing(id)) { - case 1: return SiStripModuleGeometry::W1B; - case 2: return SiStripModuleGeometry::W2B; - case 3: return SiStripModuleGeometry::W3B; - case 4: return SiStripModuleGeometry::W4; - //generic function to return DetIds and boolean factors - case 5: return SiStripModuleGeometry::W5; - case 6: return SiStripModuleGeometry::W6; - case 7: return SiStripModuleGeometry::W7; - } + switch (id.subdetId()) { + case SiStripSubdetector::TIB: + return tibLayer(id) < 3 ? SiStripModuleGeometry::IB1 : SiStripModuleGeometry::IB2; + case SiStripSubdetector::TOB: + return tobLayer(id) < 5 ? SiStripModuleGeometry::OB2 : SiStripModuleGeometry::OB1; + case SiStripSubdetector::TID: + switch (tidRing(id)) { + case 1: + return SiStripModuleGeometry::W1A; + case 2: + return SiStripModuleGeometry::W2A; + case 3: + return SiStripModuleGeometry::W3A; + } + case SiStripSubdetector::TEC: + switch (tecRing(id)) { + case 1: + return SiStripModuleGeometry::W1B; + case 2: + return SiStripModuleGeometry::W2B; + case 3: + return SiStripModuleGeometry::W3B; + case 4: + return SiStripModuleGeometry::W4; + //generic function to return DetIds and boolean factors + case 5: + return SiStripModuleGeometry::W5; + case 6: + return SiStripModuleGeometry::W6; + case 7: + return SiStripModuleGeometry::W7; + } } return SiStripModuleGeometry::UNKNOWNGEOMETRY; } int TrackerTopology::getOTLayerNumber(const DetId &id) const { - int layer = -1; - - if (id.det() == DetId::Tracker) { - if (id.subdetId() == SiStripSubdetector::TOB) { - layer = tobLayer(id); - } else if (id.subdetId() == SiStripSubdetector::TID) { - layer = 100 * tidSide(id) + tidWheel(id); - } else { - edm::LogInfo("TrackerTopology") << ">>> Invalid subdetId() " ; - } + int layer = -1; + + if (id.det() == DetId::Tracker) { + if (id.subdetId() == SiStripSubdetector::TOB) { + layer = tobLayer(id); + } else if (id.subdetId() == SiStripSubdetector::TID) { + layer = 100 * tidSide(id) + tidWheel(id); + } else { + edm::LogInfo("TrackerTopology") << ">>> Invalid subdetId() "; } - return layer; + } + return layer; } int TrackerTopology::getITPixelLayerNumber(const DetId &id) const { - int layer = -1; - - if (id.det() == DetId::Tracker) { - if (id.subdetId() == PixelSubdetector::PixelBarrel) { - layer = pxbLayer(id); - } else if (id.subdetId() == PixelSubdetector::PixelEndcap) { - layer = 100 * pxfSide(id) + pxfDisk(id); - } else { - edm::LogInfo("TrackerTopology") << ">>> Invalid subdetId() " ; - } + int layer = -1; + + if (id.det() == DetId::Tracker) { + if (id.subdetId() == PixelSubdetector::PixelBarrel) { + layer = pxbLayer(id); + } else if (id.subdetId() == PixelSubdetector::PixelEndcap) { + layer = 100 * pxfSide(id) + pxfDisk(id); + } else { + edm::LogInfo("TrackerTopology") << ">>> Invalid subdetId() "; } - return layer; + } + return layer; } - diff --git a/DataFormats/TrackerCommon/src/classes.h b/DataFormats/TrackerCommon/src/classes.h index 836e3850cf2c8..8d7da1b6127ea 100644 --- a/DataFormats/TrackerCommon/src/classes.h +++ b/DataFormats/TrackerCommon/src/classes.h @@ -2,7 +2,9 @@ #include "DataFormats/Common/interface/Wrapper.h" #include -namespace DataFormats_TrackerCommon { class dictionary { +namespace DataFormats_TrackerCommon { + class dictionary { ClusterSummary dummy0; edm::Wrapper dummy1; -};} + }; +} // namespace DataFormats_TrackerCommon diff --git a/RecoLocalTracker/SubCollectionProducers/interface/ClusterMultiplicityFilter.h b/RecoLocalTracker/SubCollectionProducers/interface/ClusterMultiplicityFilter.h index 4b1acbf0ac2bf..6421ee122befb 100644 --- a/RecoLocalTracker/SubCollectionProducers/interface/ClusterMultiplicityFilter.h +++ b/RecoLocalTracker/SubCollectionProducers/interface/ClusterMultiplicityFilter.h @@ -10,19 +10,17 @@ #include "DataFormats/SiStripCluster/interface/SiStripCluster.h" #include "DataFormats/Common/interface/DetSetVectorNew.h" - class ClusterMultiplicityFilter : public edm::global::EDFilter<> { - public: - explicit ClusterMultiplicityFilter(const edm::ParameterSet&); - ~ClusterMultiplicityFilter() override; - - private: - bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override; +public: + explicit ClusterMultiplicityFilter(const edm::ParameterSet&); + ~ClusterMultiplicityFilter() override; - const unsigned int maxNumberOfClusters_; - const edm::InputTag clusterCollectionTag_; - const edm::EDGetTokenT > clusters_; +private: + bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override; + const unsigned int maxNumberOfClusters_; + const edm::InputTag clusterCollectionTag_; + const edm::EDGetTokenT > clusters_; }; #endif diff --git a/RecoLocalTracker/SubCollectionProducers/interface/ClusterSummaryProducer.h b/RecoLocalTracker/SubCollectionProducers/interface/ClusterSummaryProducer.h index 0d336d3706ff5..7dc51e62cb677 100644 --- a/RecoLocalTracker/SubCollectionProducers/interface/ClusterSummaryProducer.h +++ b/RecoLocalTracker/SubCollectionProducers/interface/ClusterSummaryProducer.h @@ -5,7 +5,7 @@ // // Package: ClusterSummaryProducer // Class: ClusterSummaryProducer -// +// /**\class ClusterSummaryProducer ClusterSummaryProducer.cc msegala/ClusterSummaryProducer/src/ClusterSummaryProducer.cc Description: [one line class summary] @@ -19,13 +19,12 @@ // // - // system include files #include #include #include #include -#include +#include #include // user include files @@ -44,12 +43,10 @@ #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" #include "DataFormats/Common/interface/DetSetVectorNew.h" - #include "RecoLocalTracker/SiStripClusterizer/interface/SiStripClusterInfo.h" #include "DataFormats/SiStripDigi/interface/SiStripProcessedRawDigi.h" #include "DataFormats/Common/interface/DetSetVector.h" - #include "DataFormats/TrackerCommon/interface/ClusterSummary.h" #include "RecoLocalTracker/SubCollectionProducers/interface/ClusterVariables.h" @@ -57,43 +54,38 @@ #include "DataFormats/DetId/interface/DetId.h" #include "CommonTools/UtilAlgos/interface/DetIdSelector.h" - // // class declaration // class ClusterVariables; class ClusterSummary; - class ClusterSummaryProducer : public edm::stream::EDProducer<> { - public: - explicit ClusterSummaryProducer(const edm::ParameterSet&); - ~ClusterSummaryProducer() override{}; - - private: - void beginStream(edm::StreamID) override; - void produce(edm::Event&, const edm::EventSetup&) override; - +public: + explicit ClusterSummaryProducer(const edm::ParameterSet&); + ~ClusterSummaryProducer() override{}; - typedef std::pair ModuleSelection; - typedef std::vector ModuleSelections; +private: + void beginStream(edm::StreamID) override; + void produce(edm::Event&, const edm::EventSetup&) override; - // ----------member data --------------------------- - - edm::EDGetTokenT > pixelClusters_; - edm::EDGetTokenT > stripClusters_; + typedef std::pair ModuleSelection; + typedef std::vector ModuleSelections; - ModuleSelections selectors; - std::vector moduleNames; + // ----------member data --------------------------- - ClusterSummary cCluster; - std::map< std::string, int > EnumMap; + edm::EDGetTokenT > pixelClusters_; + edm::EDGetTokenT > stripClusters_; + ModuleSelections selectors; + std::vector moduleNames; - bool doStrips; - bool doPixels; - bool verbose; + ClusterSummary cCluster; + std::map EnumMap; + bool doStrips; + bool doPixels; + bool verbose; }; #endif diff --git a/RecoLocalTracker/SubCollectionProducers/interface/ClusterVariables.h b/RecoLocalTracker/SubCollectionProducers/interface/ClusterVariables.h index 65aaefd0ba0d5..6f90a3eb85ded 100644 --- a/RecoLocalTracker/SubCollectionProducers/interface/ClusterVariables.h +++ b/RecoLocalTracker/SubCollectionProducers/interface/ClusterVariables.h @@ -1,7 +1,6 @@ #ifndef CLUSTERSUMMARY_CLUSTERVARIABLES_H #define CLUSTERSUMMARY_CLUSTERVARIABLES_H - #include "FWCore/Framework/interface/Frameworkfwd.h" #include "DataFormats/SiStripCluster/interface/SiStripCluster.h" @@ -12,35 +11,28 @@ // never seen a more useless class... class ClusterVariables { +public: + ClusterVariables() {} + ~ClusterVariables() {} - public: - - ClusterVariables(){} - ~ClusterVariables(){} - - ClusterVariables(const SiStripCluster& cluster): cluster_ptr(&cluster){} + ClusterVariables(const SiStripCluster& cluster) : cluster_ptr(&cluster) {} - - const SiStripCluster * cluster() const {return cluster_ptr;} + const SiStripCluster* cluster() const { return cluster_ptr; } /* Returns the number of strips in the Cluster */ - const unsigned clusterSize() const {return cluster()->amplitudes().size();} - + const unsigned clusterSize() const { return cluster()->amplitudes().size(); } - auto stripCharges() const -> decltype(cluster()->amplitudes()) {return cluster()->amplitudes();} + auto stripCharges() const -> decltype(cluster()->amplitudes()) { return cluster()->amplitudes(); } /* Returns the total charge of all the strips in the Cluster */ - uint16_t charge() const {return std::accumulate( stripCharges().begin(), stripCharges().end(), uint16_t(0));} - + uint16_t charge() const { return std::accumulate(stripCharges().begin(), stripCharges().end(), uint16_t(0)); } - private: - +private: const SiStripCluster* cluster_ptr; - }; #endif diff --git a/RecoLocalTracker/SubCollectionProducers/interface/PixelClusterSelectorTopBottom.h b/RecoLocalTracker/SubCollectionProducers/interface/PixelClusterSelectorTopBottom.h index 709ea6e8c39e3..90bc8a50ea942 100644 --- a/RecoLocalTracker/SubCollectionProducers/interface/PixelClusterSelectorTopBottom.h +++ b/RecoLocalTracker/SubCollectionProducers/interface/PixelClusterSelectorTopBottom.h @@ -26,15 +26,16 @@ #include "FWCore/Utilities/interface/InputTag.h" class PixelClusterSelectorTopBottom : public edm::global::EDProducer<> { +public: + explicit PixelClusterSelectorTopBottom(const edm::ParameterSet& cfg) + : token_(consumes(cfg.getParameter("label"))), + y_(cfg.getParameter("y")) { + produces(); + } - public: - explicit PixelClusterSelectorTopBottom( const edm::ParameterSet& cfg) : - token_( consumes(cfg.getParameter( "label" )) ), - y_( cfg.getParameter( "y" ) ) { produces(); } - - void produce( edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const override; - - private: + void produce(edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const override; + +private: edm::EDGetTokenT token_; double y_; }; diff --git a/RecoLocalTracker/SubCollectionProducers/interface/StripClusterSelectorTopBottom.h b/RecoLocalTracker/SubCollectionProducers/interface/StripClusterSelectorTopBottom.h index 9458290ddf8fd..b47abf504dfc4 100644 --- a/RecoLocalTracker/SubCollectionProducers/interface/StripClusterSelectorTopBottom.h +++ b/RecoLocalTracker/SubCollectionProducers/interface/StripClusterSelectorTopBottom.h @@ -27,15 +27,16 @@ #include "DataFormats/Common/interface/DetSetVectorNew.h" class StripClusterSelectorTopBottom : public edm::global::EDProducer<> { +public: + explicit StripClusterSelectorTopBottom(const edm::ParameterSet& cfg) + : token_(consumes>(cfg.getParameter("label"))), + y_(cfg.getParameter("y")) { + produces>(); + } - public: - explicit StripClusterSelectorTopBottom( const edm::ParameterSet& cfg) : - token_( consumes>(cfg.getParameter( "label" ) )), - y_( cfg.getParameter( "y" ) ) { produces >(); } - - void produce( edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const override; - - private: + void produce(edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const override; + +private: edm::EDGetTokenT> token_; double y_; }; diff --git a/RecoLocalTracker/SubCollectionProducers/src/ClusterChargeMasker.cc b/RecoLocalTracker/SubCollectionProducers/src/ClusterChargeMasker.cc index d69ff69234b5c..95de428b04218 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/ClusterChargeMasker.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/ClusterChargeMasker.cc @@ -6,7 +6,6 @@ #include "DataFormats/SiStripCluster/interface/SiStripCluster.h" #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" - #include "DataFormats/Common/interface/ValueMap.h" #include "DataFormats/Common/interface/DetSetVectorNew.h" #include "DataFormats/Provenance/interface/ProductID.h" @@ -19,114 +18,98 @@ #include "DataFormats/SiStripCluster/interface/SiStripClusterTools.h" #include "RecoLocalTracker/SiStripClusterizer/interface/ClusterChargeCut.h" - namespace { class ClusterChargeMasker : public edm::stream::EDProducer<> { public: ClusterChargeMasker(const edm::ParameterSet& iConfig); - ~ClusterChargeMasker() override{} - void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override ; - private: - + ~ClusterChargeMasker() override {} + void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override; + private: using PixelMaskContainer = edm::ContainerMask>; using StripMaskContainer = edm::ContainerMask>; - bool mergeOld_; float minGoodStripCharge_; - edm::EDGetTokenT > pixelClusters_; - edm::EDGetTokenT > stripClusters_; + edm::EDGetTokenT> pixelClusters_; + edm::EDGetTokenT> stripClusters_; edm::EDGetTokenT oldPxlMaskToken_; edm::EDGetTokenT oldStrMaskToken_; - - - }; + ClusterChargeMasker::ClusterChargeMasker(const edm::ParameterSet& iConfig) + : mergeOld_(iConfig.exists("oldClusterRemovalInfo")), minGoodStripCharge_(clusterChargeCut(iConfig)) { + produces>>(); + produces>>(); - ClusterChargeMasker::ClusterChargeMasker(const edm::ParameterSet& iConfig) : - mergeOld_(iConfig.exists("oldClusterRemovalInfo")), - minGoodStripCharge_(clusterChargeCut(iConfig)) - { - produces > >(); - produces > >(); - - - pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); - stripClusters_ = consumes >(iConfig.getParameter("stripClusters")); + pixelClusters_ = + consumes>(iConfig.getParameter("pixelClusters")); + stripClusters_ = + consumes>(iConfig.getParameter("stripClusters")); if (mergeOld_) { oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); } - } - - void - ClusterChargeMasker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) - { - - - edm::Handle > pixelClusters; + void ClusterChargeMasker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { + edm::Handle> pixelClusters; iEvent.getByToken(pixelClusters_, pixelClusters); - edm::Handle > stripClusters; + edm::Handle> stripClusters; iEvent.getByToken(stripClusters_, stripClusters); - std::vector collectedStrips; std::vector collectedPixels; - if(mergeOld_) { + if (mergeOld_) { edm::Handle oldPxlMask; edm::Handle oldStrMask; - iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask); - iEvent.getByToken(oldStrMaskToken_ ,oldStrMask); - LogDebug("ClusterChargeMasker")<<"to merge in, "<size()<<" strp and "<size()<<" pxl"; + iEvent.getByToken(oldPxlMaskToken_, oldPxlMask); + iEvent.getByToken(oldStrMaskToken_, oldStrMask); + LogDebug("ClusterChargeMasker") << "to merge in, " << oldStrMask->size() << " strp and " << oldPxlMask->size() + << " pxl"; oldStrMask->copyMaskTo(collectedStrips); oldPxlMask->copyMaskTo(collectedPixels); - assert(stripClusters->dataSize()>=collectedStrips.size()); + assert(stripClusters->dataSize() >= collectedStrips.size()); collectedStrips.resize(stripClusters->dataSize(), false); - }else { + } else { collectedStrips.resize(stripClusters->dataSize(), false); collectedPixels.resize(pixelClusters->dataSize(), false); - } - - auto const & clusters = stripClusters->data(); - for (auto const & item : stripClusters->ids()) { - - if (!item.isValid()) continue; // not umpacked (hlt only) - - auto detid = item.id; - - for (int i = item.offset; i(edm::RefProd >(stripClusters),collectedStrips)); + auto const& clusters = stripClusters->data(); + for (auto const& item : stripClusters->ids()) { + if (!item.isValid()) + continue; // not umpacked (hlt only) - LogDebug("ClusterChargeMasker")<<"total pxl to skip: "<(edm::RefProd >(pixelClusters),collectedPixels)); - + auto detid = item.id; + for (int i = item.offset; i < item.offset + int(item.size); ++i) { + auto clusCharge = siStripClusterTools::chargePerCM(detid, clusters[i]); + if (clusCharge < minGoodStripCharge_) + collectedStrips[i] = true; + } + } + LogDebug("ClusterChargeMasker") << "total strip to skip: " + << std::count(collectedStrips.begin(), collectedStrips.end(), true); + // std::cout << "ClusterChargeMasker " <<"total strip to skip: "<(edm::RefProd>(stripClusters), + collectedStrips)); + + LogDebug("ClusterChargeMasker") << "total pxl to skip: " + << std::count(collectedPixels.begin(), collectedPixels.end(), true); + iEvent.put(std::make_unique(edm::RefProd>(pixelClusters), + collectedPixels)); } - -} - +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(ClusterChargeMasker); - diff --git a/RecoLocalTracker/SubCollectionProducers/src/ClusterMultiplicityFilter.cc b/RecoLocalTracker/SubCollectionProducers/src/ClusterMultiplicityFilter.cc index e68579969c4c7..1a9c497cec71a 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/ClusterMultiplicityFilter.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/ClusterMultiplicityFilter.cc @@ -2,7 +2,7 @@ // // Package: ClusterMultiplicityFilter // Class: ClusterMultiplicityFilter -// +// // // Original Author: Carsten Noeding @@ -10,7 +10,6 @@ // // - // system include files #include @@ -18,31 +17,24 @@ #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +ClusterMultiplicityFilter::ClusterMultiplicityFilter(const edm::ParameterSet& iConfig) + : maxNumberOfClusters_(iConfig.getParameter("MaxNumberOfClusters")), + clusterCollectionTag_(iConfig.getParameter("ClusterCollection")), + clusters_(consumes >(clusterCollectionTag_)) {} -ClusterMultiplicityFilter::ClusterMultiplicityFilter(const edm::ParameterSet& iConfig) : - maxNumberOfClusters_(iConfig.getParameter("MaxNumberOfClusters")), - clusterCollectionTag_(iConfig.getParameter("ClusterCollection")), - clusters_ (consumes >(clusterCollectionTag_)) -{ - -} - - -ClusterMultiplicityFilter::~ClusterMultiplicityFilter() { -} - +ClusterMultiplicityFilter::~ClusterMultiplicityFilter() {} // ------------ method called on each new Event ------------ bool ClusterMultiplicityFilter::filter(edm::StreamID iID, edm::Event& iEvent, edm::EventSetup const& iSetup) const { - bool result = true; - const edmNew::DetSetVector *clusters = nullptr; + const edmNew::DetSetVector* clusters = nullptr; edm::Handle > clusterHandle; - iEvent.getByToken(clusters_,clusterHandle); - if( !clusterHandle.isValid() ) { + iEvent.getByToken(clusters_, clusterHandle); + if (!clusterHandle.isValid()) { throw cms::Exception("CorruptData") - << "ClusterMultiplicityFilter requires collection with label " << clusterCollectionTag_.label() << std::endl; + << "ClusterMultiplicityFilter requires collection with label " + << clusterCollectionTag_.label() << std::endl; } clusters = clusterHandle.product(); @@ -51,21 +43,21 @@ bool ClusterMultiplicityFilter::filter(edm::StreamID iID, edm::Event& iEvent, ed unsigned int totalClusters = 0; //loop over detectors - for (edmNew::DetSetVector::const_iterator DSViter=input.begin(); DSViter!=input.end();DSViter++ ) { - totalClusters+=DSViter->size(); + for (edmNew::DetSetVector::const_iterator DSViter = input.begin(); DSViter != input.end(); + DSViter++) { + totalClusters += DSViter->size(); } - - - if (totalClusters>maxNumberOfClusters_) { - edm::LogInfo("ClusterMultiplicityFilter") << "Total number of clusters: " << totalClusters << " ==> exceeds allowed maximum of " << maxNumberOfClusters_ << " clusters"; + + if (totalClusters > maxNumberOfClusters_) { + edm::LogInfo("ClusterMultiplicityFilter") + << "Total number of clusters: " << totalClusters << " ==> exceeds allowed maximum of " << maxNumberOfClusters_ + << " clusters"; result = false; } - + return result; } #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(ClusterMultiplicityFilter); - - diff --git a/RecoLocalTracker/SubCollectionProducers/src/ClusterSummaryProducer.cc b/RecoLocalTracker/SubCollectionProducers/src/ClusterSummaryProducer.cc index d885e3899ec6d..58f8423bba9c7 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/ClusterSummaryProducer.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/ClusterSummaryProducer.cc @@ -1,136 +1,139 @@ #include "RecoLocalTracker/SubCollectionProducers/interface/ClusterSummaryProducer.h" ClusterSummaryProducer::ClusterSummaryProducer(const edm::ParameterSet& iConfig) - : doStrips(iConfig.getParameter("doStrips")), - doPixels(iConfig.getParameter("doPixels")), - verbose(iConfig.getParameter("verbose")) -{ - - pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); - stripClusters_ = consumes >(iConfig.getParameter("stripClusters")); + : doStrips(iConfig.getParameter("doStrips")), + doPixels(iConfig.getParameter("doPixels")), + verbose(iConfig.getParameter("verbose")) { + pixelClusters_ = + consumes >(iConfig.getParameter("pixelClusters")); + stripClusters_ = + consumes >(iConfig.getParameter("stripClusters")); ClusterSummary::CMSTracker maxEnum = ClusterSummary::STRIP; std::vector wantedsubdets = iConfig.getParameter >("wantedSubDets"); - for(const auto& iS : wantedsubdets){ - + for (const auto& iS : wantedsubdets) { ClusterSummary::CMSTracker subdet = ClusterSummary::NVALIDENUMS; - for(int iN = 0; iN < ClusterSummary::NVALIDENUMS; ++iN) - if(ClusterSummary::subDetNames[iN] == iS) + for (int iN = 0; iN < ClusterSummary::NVALIDENUMS; ++iN) + if (ClusterSummary::subDetNames[iN] == iS) subdet = ClusterSummary::CMSTracker(iN); - if(subdet == ClusterSummary::NVALIDENUMS) throw cms::Exception( "No standard selection: ") << iS; - - selectors.push_back(ModuleSelection(DetIdSelector(ClusterSummary::subDetSelections[subdet]),subdet)); - if(subdet > maxEnum) maxEnum = subdet; - if(verbose)moduleNames.push_back(ClusterSummary::subDetNames[subdet]); + if (subdet == ClusterSummary::NVALIDENUMS) + throw cms::Exception("No standard selection: ") << iS; + + selectors.push_back(ModuleSelection(DetIdSelector(ClusterSummary::subDetSelections[subdet]), subdet)); + if (subdet > maxEnum) + maxEnum = subdet; + if (verbose) + moduleNames.push_back(ClusterSummary::subDetNames[subdet]); } - - std::vector wantedusersubdets_ps = iConfig.getParameter >("wantedUserSubDets"); - for(const auto& iS : wantedusersubdets_ps){ - ClusterSummary::CMSTracker subdet = (ClusterSummary::CMSTracker)iS.getParameter("detSelection"); - std::string detname = iS.getParameter("detLabel"); - std::vector selection = iS.getParameter >("selection"); - - if(subdet <= ClusterSummary::NVALIDENUMS) throw cms::Exception( "Already predefined selection: ") << subdet; - if(subdet >= ClusterSummary::NTRACKERENUMS) throw cms::Exception( "Selection is out of range: ") << subdet; - - selectors.push_back(ModuleSelection(DetIdSelector(selection),subdet)); - if(subdet > maxEnum) maxEnum = subdet; - if(verbose)moduleNames.push_back(detname); + std::vector wantedusersubdets_ps = + iConfig.getParameter >("wantedUserSubDets"); + for (const auto& iS : wantedusersubdets_ps) { + ClusterSummary::CMSTracker subdet = (ClusterSummary::CMSTracker)iS.getParameter("detSelection"); + std::string detname = iS.getParameter("detLabel"); + std::vector selection = iS.getParameter >("selection"); + + if (subdet <= ClusterSummary::NVALIDENUMS) + throw cms::Exception("Already predefined selection: ") << subdet; + if (subdet >= ClusterSummary::NTRACKERENUMS) + throw cms::Exception("Selection is out of range: ") << subdet; + + selectors.push_back(ModuleSelection(DetIdSelector(selection), subdet)); + if (subdet > maxEnum) + maxEnum = subdet; + if (verbose) + moduleNames.push_back(detname); } cCluster = ClusterSummary(maxEnum + 1); produces().setBranchAlias("trackerClusterSummary"); } -void -ClusterSummaryProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) -{ - using namespace edm; - cCluster.reset(); - std::vector selectedVector(selectors.size(),false); - - auto getSelections = [&] (const uint32_t detid ){ - for(unsigned int iS = 0; iS < selectors.size(); ++iS) - selectedVector[iS] = selectors[iS].first.isSelected(detid); - }; - auto fillSelections = [&] (const int clusterSize, const float clusterCharge ){ - for(unsigned int iS = 0; iS < selectors.size(); ++iS){ - if(!selectedVector[iS]) continue; - const ClusterSummary::CMSTracker module = selectors[iS].second; - cCluster.addNClusByIndex (module, 1 ); - cCluster.addClusSizeByIndex (module, clusterSize ); - cCluster.addClusChargeByIndex(module, clusterCharge ); - } - }; - - //===================++++++++++++======================== - // For SiStrips - //===================++++++++++++======================== - if (doStrips){ - edm::Handle > stripClusters; - iEvent.getByToken(stripClusters_, stripClusters); - edmNew::DetSetVector::const_iterator itClusters=stripClusters->begin(); - for(;itClusters!=stripClusters->end();++itClusters){ - getSelections(itClusters->id()); - for(edmNew::DetSet::const_iterator cluster=itClusters->begin(); cluster!=itClusters->end();++cluster){ - const ClusterVariables Summaryinfo(*cluster); - fillSelections(Summaryinfo.clusterSize(),Summaryinfo.charge()); - } - } - } - - //===================++++++++++++======================== - // For SiPixels - //===================++++++++++++======================== - if (doPixels){ - edm::Handle > pixelClusters; - iEvent.getByToken(pixelClusters_, pixelClusters); - edmNew::DetSetVector::const_iterator itClusters=pixelClusters->begin(); - for(;itClusters!=pixelClusters->end();++itClusters){ - getSelections(itClusters->id()); - for(edmNew::DetSet::const_iterator cluster=itClusters->begin(); cluster!=itClusters->end();++cluster){ - fillSelections(cluster->size(),float(cluster->charge())/1000.); - } - } - } - - //===================+++++++++++++======================== - // Fill Producer - //===================+++++++++++++======================== - if(verbose){ - for(const auto& iS : selectors){ - const ClusterSummary::CMSTracker module = iS.second; - edm::LogInfo("ClusterSummaryProducer") << "n" << moduleNames[module] <<", avg size, avg charge = " - << cCluster.getNClusByIndex (module ) << ", " - << cCluster.getClusSizeByIndex (module )/cCluster.getNClusByIndex(module ) << ", " - << cCluster.getClusChargeByIndex(module )/cCluster.getNClusByIndex(module) - << std::endl; - } - std::cout << "-------------------------------------------------------" << std::endl; - } - - //Put the filled class into the producer - auto result = std::make_unique(); - //Cleanup empty selections - result->copyNonEmpty(cCluster); - iEvent.put(std::move(result)); -} +void ClusterSummaryProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { + using namespace edm; + cCluster.reset(); + std::vector selectedVector(selectors.size(), false); + + auto getSelections = [&](const uint32_t detid) { + for (unsigned int iS = 0; iS < selectors.size(); ++iS) + selectedVector[iS] = selectors[iS].first.isSelected(detid); + }; + auto fillSelections = [&](const int clusterSize, const float clusterCharge) { + for (unsigned int iS = 0; iS < selectors.size(); ++iS) { + if (!selectedVector[iS]) + continue; + const ClusterSummary::CMSTracker module = selectors[iS].second; + cCluster.addNClusByIndex(module, 1); + cCluster.addClusSizeByIndex(module, clusterSize); + cCluster.addClusChargeByIndex(module, clusterCharge); + } + }; + + //===================++++++++++++======================== + // For SiStrips + //===================++++++++++++======================== + if (doStrips) { + edm::Handle > stripClusters; + iEvent.getByToken(stripClusters_, stripClusters); + edmNew::DetSetVector::const_iterator itClusters = stripClusters->begin(); + for (; itClusters != stripClusters->end(); ++itClusters) { + getSelections(itClusters->id()); + for (edmNew::DetSet::const_iterator cluster = itClusters->begin(); cluster != itClusters->end(); + ++cluster) { + const ClusterVariables Summaryinfo(*cluster); + fillSelections(Summaryinfo.clusterSize(), Summaryinfo.charge()); + } + } + } + //===================++++++++++++======================== + // For SiPixels + //===================++++++++++++======================== + if (doPixels) { + edm::Handle > pixelClusters; + iEvent.getByToken(pixelClusters_, pixelClusters); + edmNew::DetSetVector::const_iterator itClusters = pixelClusters->begin(); + for (; itClusters != pixelClusters->end(); ++itClusters) { + getSelections(itClusters->id()); + for (edmNew::DetSet::const_iterator cluster = itClusters->begin(); cluster != itClusters->end(); + ++cluster) { + fillSelections(cluster->size(), float(cluster->charge()) / 1000.); + } + } + } + + //===================+++++++++++++======================== + // Fill Producer + //===================+++++++++++++======================== + if (verbose) { + for (const auto& iS : selectors) { + const ClusterSummary::CMSTracker module = iS.second; + edm::LogInfo("ClusterSummaryProducer") + << "n" << moduleNames[module] << ", avg size, avg charge = " << cCluster.getNClusByIndex(module) << ", " + << cCluster.getClusSizeByIndex(module) / cCluster.getNClusByIndex(module) << ", " + << cCluster.getClusChargeByIndex(module) / cCluster.getNClusByIndex(module) << std::endl; + } + std::cout << "-------------------------------------------------------" << std::endl; + } -void -ClusterSummaryProducer::beginStream(edm::StreamID) -{ - if(!verbose) return; - edm::LogInfo("ClusterSummaryProducer") << "+++++++++++++++++++++++++++++++ " << std::endl << "Getting info on " ; - for (const auto& iS : moduleNames ) { edm::LogInfo("ClusterSummaryProducer") << iS<< " " ;} - edm::LogInfo("ClusterSummaryProducer") << std::endl; + //Put the filled class into the producer + auto result = std::make_unique(); + //Cleanup empty selections + result->copyNonEmpty(cCluster); + iEvent.put(std::move(result)); } +void ClusterSummaryProducer::beginStream(edm::StreamID) { + if (!verbose) + return; + edm::LogInfo("ClusterSummaryProducer") << "+++++++++++++++++++++++++++++++ " << std::endl << "Getting info on "; + for (const auto& iS : moduleNames) { + edm::LogInfo("ClusterSummaryProducer") << iS << " "; + } + edm::LogInfo("ClusterSummaryProducer") << std::endl; +} #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(ClusterSummaryProducer); - - diff --git a/RecoLocalTracker/SubCollectionProducers/src/HITrackClusterRemover.cc b/RecoLocalTracker/SubCollectionProducers/src/HITrackClusterRemover.cc index dd9a1cc39d169..01fabca36b9ce 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/HITrackClusterRemover.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/HITrackClusterRemover.cc @@ -28,7 +28,6 @@ #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/TrackerRecHit2D/interface/ClusterRemovalInfo.h" - #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" #include "Geometry/CommonDetUnit/interface/GeomDet.h" @@ -36,69 +35,75 @@ #include "RecoTracker/TransientTrackingRecHit/interface/Traj2TrackHits.h" - // // class decleration // class HITrackClusterRemover : public edm::stream::EDProducer<> { - public: - HITrackClusterRemover(const edm::ParameterSet& iConfig) ; - ~HITrackClusterRemover() override ; - void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override ; - private: - struct ParamBlock { - ParamBlock() : isSet_(false), usesCharge_(false) {} - ParamBlock(const edm::ParameterSet& iConfig) : - isSet_(true), - usesCharge_(iConfig.exists("maxCharge")), - usesSize_(iConfig.exists("maxSize")), - cutOnPixelCharge_(iConfig.exists("minGoodPixelCharge")), - cutOnStripCharge_(iConfig.exists("minGoodStripCharge")), - maxChi2_(iConfig.getParameter("maxChi2")), - maxCharge_(usesCharge_ ? iConfig.getParameter("maxCharge") : 0), - minGoodPixelCharge_(cutOnPixelCharge_ ? iConfig.getParameter("minGoodPixelCharge") : 0), - minGoodStripCharge_(cutOnStripCharge_ ? iConfig.getParameter("minGoodStripCharge") : 0), - maxSize_(usesSize_ ? iConfig.getParameter("maxSize") : 0) { } - bool isSet_, usesCharge_, usesSize_, cutOnPixelCharge_, cutOnStripCharge_; - float maxChi2_, maxCharge_, minGoodPixelCharge_, minGoodStripCharge_; - size_t maxSize_; - }; - static const unsigned int NumberOfParamBlocks = 6; - - bool doTracks_; - bool doStrip_, doPixel_; - bool mergeOld_; - typedef edm::ContainerMask > PixelMaskContainer; - typedef edm::ContainerMask > StripMaskContainer; - edm::EDGetTokenT > pixelClusters_; - edm::EDGetTokenT > stripClusters_; - edm::EDGetTokenT tracks_; - edm::EDGetTokenT oldRemovalInfo_; - edm::EDGetTokenT oldPxlMaskToken_; - edm::EDGetTokenT oldStrMaskToken_; - std::vector< edm::EDGetTokenT > > overrideTrkQuals_; - edm::EDGetTokenT rphiRecHitToken_, stereoRecHitToken_; -// edm::EDGetTokenT pixelRecHitsToken_; - - ParamBlock pblocks_[NumberOfParamBlocks]; - void readPSet(const edm::ParameterSet& iConfig, const std::string &name, - int id1=-1, int id2=-1, int id3=-1, int id4=-1, int id5=-1, int id6=-1) ; - - std::vector pixels, strips; // avoid unneed alloc/dealloc of this - edm::ProductID pixelSourceProdID, stripSourceProdID; // ProdIDs refs must point to (for consistency tests) - - inline void process(const TrackingRecHit *hit, unsigned char chi2, const TrackerGeometry* tg); - inline void process(const OmniClusterRef & cluRef, SiStripDetId & detid, bool fromTrack); - - - template - std::unique_ptr > - cleanup(const edmNew::DetSetVector &oldClusters, const std::vector &isGood, - reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices *oldRefs) ; - - // Carries in full removal info about a given det from oldRefs - void mergeOld(reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices &oldRefs) ; +public: + HITrackClusterRemover(const edm::ParameterSet &iConfig); + ~HITrackClusterRemover() override; + void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; + +private: + struct ParamBlock { + ParamBlock() : isSet_(false), usesCharge_(false) {} + ParamBlock(const edm::ParameterSet &iConfig) + : isSet_(true), + usesCharge_(iConfig.exists("maxCharge")), + usesSize_(iConfig.exists("maxSize")), + cutOnPixelCharge_(iConfig.exists("minGoodPixelCharge")), + cutOnStripCharge_(iConfig.exists("minGoodStripCharge")), + maxChi2_(iConfig.getParameter("maxChi2")), + maxCharge_(usesCharge_ ? iConfig.getParameter("maxCharge") : 0), + minGoodPixelCharge_(cutOnPixelCharge_ ? iConfig.getParameter("minGoodPixelCharge") : 0), + minGoodStripCharge_(cutOnStripCharge_ ? iConfig.getParameter("minGoodStripCharge") : 0), + maxSize_(usesSize_ ? iConfig.getParameter("maxSize") : 0) {} + bool isSet_, usesCharge_, usesSize_, cutOnPixelCharge_, cutOnStripCharge_; + float maxChi2_, maxCharge_, minGoodPixelCharge_, minGoodStripCharge_; + size_t maxSize_; + }; + static const unsigned int NumberOfParamBlocks = 6; + + bool doTracks_; + bool doStrip_, doPixel_; + bool mergeOld_; + typedef edm::ContainerMask > PixelMaskContainer; + typedef edm::ContainerMask > StripMaskContainer; + edm::EDGetTokenT > pixelClusters_; + edm::EDGetTokenT > stripClusters_; + edm::EDGetTokenT tracks_; + edm::EDGetTokenT oldRemovalInfo_; + edm::EDGetTokenT oldPxlMaskToken_; + edm::EDGetTokenT oldStrMaskToken_; + std::vector > > overrideTrkQuals_; + edm::EDGetTokenT rphiRecHitToken_, stereoRecHitToken_; + // edm::EDGetTokenT pixelRecHitsToken_; + + ParamBlock pblocks_[NumberOfParamBlocks]; + void readPSet(const edm::ParameterSet &iConfig, + const std::string &name, + int id1 = -1, + int id2 = -1, + int id3 = -1, + int id4 = -1, + int id5 = -1, + int id6 = -1); + + std::vector pixels, strips; // avoid unneed alloc/dealloc of this + edm::ProductID pixelSourceProdID, stripSourceProdID; // ProdIDs refs must point to (for consistency tests) + + inline void process(const TrackingRecHit *hit, unsigned char chi2, const TrackerGeometry *tg); + inline void process(const OmniClusterRef &cluRef, SiStripDetId &detid, bool fromTrack); + + template + std::unique_ptr > cleanup(const edmNew::DetSetVector &oldClusters, + const std::vector &isGood, + reco::ClusterRemovalInfo::Indices &refs, + const reco::ClusterRemovalInfo::Indices *oldRefs); + + // Carries in full removal info about a given det from oldRefs + void mergeOld(reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices &oldRefs); bool clusterWasteSolution_, doStripChargeCheck_, doPixelChargeCheck_; std::string stripRecHits_, pixelRecHits_; @@ -108,266 +113,293 @@ class HITrackClusterRemover : public edm::stream::EDProducer<> { std::vector collectedStrips_; std::vector collectedPixels_; - float sensorThickness (const SiStripDetId& detid) const; - + float sensorThickness(const SiStripDetId &detid) const; }; - using namespace std; using namespace edm; using namespace reco; -void -HITrackClusterRemover::readPSet(const edm::ParameterSet& iConfig, const std::string &name, - int id1, int id2, int id3, int id4, int id5, int id6) -{ - if (iConfig.exists(name)) { - ParamBlock pblock(iConfig.getParameter(name)); - if (id1 == -1) { - fill(pblocks_, pblocks_+NumberOfParamBlocks, pblock); - } else { - pblocks_[id1] = pblock; - if (id2 != -1) pblocks_[id2] = pblock; - if (id3 != -1) pblocks_[id3] = pblock; - if (id4 != -1) pblocks_[id4] = pblock; - if (id5 != -1) pblocks_[id5] = pblock; - if (id6 != -1) pblocks_[id6] = pblock; - } +void HITrackClusterRemover::readPSet( + const edm::ParameterSet &iConfig, const std::string &name, int id1, int id2, int id3, int id4, int id5, int id6) { + if (iConfig.exists(name)) { + ParamBlock pblock(iConfig.getParameter(name)); + if (id1 == -1) { + fill(pblocks_, pblocks_ + NumberOfParamBlocks, pblock); + } else { + pblocks_[id1] = pblock; + if (id2 != -1) + pblocks_[id2] = pblock; + if (id3 != -1) + pblocks_[id3] = pblock; + if (id4 != -1) + pblocks_[id4] = pblock; + if (id5 != -1) + pblocks_[id5] = pblock; + if (id6 != -1) + pblocks_[id6] = pblock; } + } } -HITrackClusterRemover::HITrackClusterRemover(const ParameterSet& iConfig): - doTracks_(iConfig.exists("trajectories")), - doStrip_(iConfig.existsAs("doStrip") ? iConfig.getParameter("doStrip") : true), - doPixel_(iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true), - mergeOld_(iConfig.exists("oldClusterRemovalInfo")), - clusterWasteSolution_(true), - doStripChargeCheck_(iConfig.existsAs("doStripChargeCheck") ? iConfig.getParameter("doStripChargeCheck") : false), - doPixelChargeCheck_(iConfig.existsAs("doPixelChargeCheck") ? iConfig.getParameter("doPixelChargeCheck") : false), - stripRecHits_(doStripChargeCheck_ ? iConfig.getParameter("stripRecHits") : std::string("siStripMatchedRecHits")), - pixelRecHits_(doPixelChargeCheck_ ? iConfig.getParameter("pixelRecHits") : std::string("siPixelRecHits")) -{ +HITrackClusterRemover::HITrackClusterRemover(const ParameterSet &iConfig) + : doTracks_(iConfig.exists("trajectories")), + doStrip_(iConfig.existsAs("doStrip") ? iConfig.getParameter("doStrip") : true), + doPixel_(iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true), + mergeOld_(iConfig.exists("oldClusterRemovalInfo")), + clusterWasteSolution_(true), + doStripChargeCheck_( + iConfig.existsAs("doStripChargeCheck") ? iConfig.getParameter("doStripChargeCheck") : false), + doPixelChargeCheck_( + iConfig.existsAs("doPixelChargeCheck") ? iConfig.getParameter("doPixelChargeCheck") : false), + stripRecHits_(doStripChargeCheck_ ? iConfig.getParameter("stripRecHits") + : std::string("siStripMatchedRecHits")), + pixelRecHits_(doPixelChargeCheck_ ? iConfig.getParameter("pixelRecHits") + : std::string("siPixelRecHits")) { mergeOld_ = mergeOld_ && !iConfig.getParameter("oldClusterRemovalInfo").label().empty(); if (iConfig.exists("overrideTrkQuals")) overrideTrkQuals_.push_back(consumes >(iConfig.getParameter("overrideTrkQuals"))); if (iConfig.exists("clusterLessSolution")) - clusterWasteSolution_=!iConfig.getParameter("clusterLessSolution"); + clusterWasteSolution_ = !iConfig.getParameter("clusterLessSolution"); if ((doPixelChargeCheck_ && !doPixel_) || (doStripChargeCheck_ && !doStrip_)) - throw cms::Exception("Configuration Error") << "HITrackClusterRemover: Charge check asked without cluster collection "; + throw cms::Exception("Configuration Error") + << "HITrackClusterRemover: Charge check asked without cluster collection "; if (doPixelChargeCheck_) - throw cms::Exception("Configuration Error") << "HITrackClusterRemover: Pixel cluster charge check not yet implemented"; + throw cms::Exception("Configuration Error") + << "HITrackClusterRemover: Pixel cluster charge check not yet implemented"; - if (doPixel_ && clusterWasteSolution_) produces< edmNew::DetSetVector >(); - if (doStrip_ && clusterWasteSolution_) produces< edmNew::DetSetVector >(); - if (clusterWasteSolution_) produces< ClusterRemovalInfo >(); + if (doPixel_ && clusterWasteSolution_) + produces >(); + if (doStrip_ && clusterWasteSolution_) + produces >(); + if (clusterWasteSolution_) + produces(); assert(!clusterWasteSolution_); + fill(pblocks_, pblocks_ + NumberOfParamBlocks, ParamBlock()); + readPSet(iConfig, "Common", -1); + if (doPixel_) { + readPSet(iConfig, "Pixel", 0, 1); + readPSet(iConfig, "PXB", 0); + readPSet(iConfig, "PXE", 1); + } + if (doStrip_) { + readPSet(iConfig, "Strip", 2, 3, 4, 5); + readPSet(iConfig, "StripInner", 2, 3); + readPSet(iConfig, "StripOuter", 4, 5); + readPSet(iConfig, "TIB", 2); + readPSet(iConfig, "TID", 3); + readPSet(iConfig, "TOB", 4); + readPSet(iConfig, "TEC", 5); + } - fill(pblocks_, pblocks_+NumberOfParamBlocks, ParamBlock()); - readPSet(iConfig, "Common",-1); - if (doPixel_) { - readPSet(iConfig, "Pixel" ,0,1); - readPSet(iConfig, "PXB" ,0); - readPSet(iConfig, "PXE" ,1); - } - if (doStrip_) { - readPSet(iConfig, "Strip" ,2,3,4,5); - readPSet(iConfig, "StripInner" ,2,3); - readPSet(iConfig, "StripOuter" ,4,5); - readPSet(iConfig, "TIB" ,2); - readPSet(iConfig, "TID" ,3); - readPSet(iConfig, "TOB" ,4); - readPSet(iConfig, "TEC" ,5); - } - - bool usingCharge = false; - for (size_t i = 0; i < NumberOfParamBlocks; ++i) { - if (!pblocks_[i].isSet_) throw cms::Exception("Configuration Error") << "HITrackClusterRemover: Missing configuration for detector with subDetID = " << (i+1); - if (pblocks_[i].usesCharge_ && !usingCharge) { - throw cms::Exception("Configuration Error") << "HITrackClusterRemover: Configuration for subDetID = " << (i+1) << " uses cluster charge, which is not enabled."; - } - } - - if (!clusterWasteSolution_){ - produces > >(); - produces > >(); - } - trackQuality_=reco::TrackBase::undefQuality; - filterTracks_=false; - if (iConfig.exists("TrackQuality")){ - filterTracks_=true; - trackQuality_=reco::TrackBase::qualityByName(iConfig.getParameter("TrackQuality")); - minNumberOfLayersWithMeasBeforeFiltering_ = iConfig.existsAs("minNumberOfLayersWithMeasBeforeFiltering") ? - iConfig.getParameter("minNumberOfLayersWithMeasBeforeFiltering") : 0; + bool usingCharge = false; + for (size_t i = 0; i < NumberOfParamBlocks; ++i) { + if (!pblocks_[i].isSet_) + throw cms::Exception("Configuration Error") + << "HITrackClusterRemover: Missing configuration for detector with subDetID = " << (i + 1); + if (pblocks_[i].usesCharge_ && !usingCharge) { + throw cms::Exception("Configuration Error") << "HITrackClusterRemover: Configuration for subDetID = " << (i + 1) + << " uses cluster charge, which is not enabled."; } + } - if (doTracks_) tracks_ = consumes(iConfig.getParameter("trajectories")); - if (doPixel_) pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); - if (doStrip_) stripClusters_ = consumes >(iConfig.getParameter("stripClusters")); - if (mergeOld_) { - oldRemovalInfo_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - } + if (!clusterWasteSolution_) { + produces > >(); + produces > >(); + } + trackQuality_ = reco::TrackBase::undefQuality; + filterTracks_ = false; + if (iConfig.exists("TrackQuality")) { + filterTracks_ = true; + trackQuality_ = reco::TrackBase::qualityByName(iConfig.getParameter("TrackQuality")); + minNumberOfLayersWithMeasBeforeFiltering_ = + iConfig.existsAs("minNumberOfLayersWithMeasBeforeFiltering") + ? iConfig.getParameter("minNumberOfLayersWithMeasBeforeFiltering") + : 0; + } - if (doStripChargeCheck_) { - rphiRecHitToken_ = consumes(InputTag(stripRecHits_,"rphiRecHit")); - stereoRecHitToken_ = consumes(InputTag(stripRecHits_,"stereoRecHit")); - } -// if(doPixelChargeCheck_) pixelRecHitsToken_ = consumes(InputTag(pixelRecHits_)); + if (doTracks_) + tracks_ = consumes(iConfig.getParameter("trajectories")); + if (doPixel_) + pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); + if (doStrip_) + stripClusters_ = consumes >(iConfig.getParameter("stripClusters")); + if (mergeOld_) { + oldRemovalInfo_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + } + if (doStripChargeCheck_) { + rphiRecHitToken_ = consumes(InputTag(stripRecHits_, "rphiRecHit")); + stereoRecHitToken_ = consumes(InputTag(stripRecHits_, "stereoRecHit")); + } + // if(doPixelChargeCheck_) pixelRecHitsToken_ = consumes(InputTag(pixelRecHits_)); } +HITrackClusterRemover::~HITrackClusterRemover() {} -HITrackClusterRemover::~HITrackClusterRemover() -{ -} - -void HITrackClusterRemover::mergeOld(ClusterRemovalInfo::Indices &refs, - const ClusterRemovalInfo::Indices &oldRefs) -{ - for (size_t i = 0, n = refs.size(); i < n; ++i) { - refs[i] = oldRefs[refs[i]]; - } +void HITrackClusterRemover::mergeOld(ClusterRemovalInfo::Indices &refs, const ClusterRemovalInfo::Indices &oldRefs) { + for (size_t i = 0, n = refs.size(); i < n; ++i) { + refs[i] = oldRefs[refs[i]]; + } } - -template -std::unique_ptr > -HITrackClusterRemover::cleanup(const edmNew::DetSetVector &oldClusters, const std::vector &isGood, - reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices *oldRefs){ - typedef typename edmNew::DetSetVector DSV; - typedef typename edmNew::DetSetVector::FastFiller DSF; - typedef typename edmNew::DetSet DS; - auto output = std::make_unique(); - output->reserve(oldClusters.size(), oldClusters.dataSize()); - - unsigned int countOld=0; - unsigned int countNew=0; - - // cluster removal loop - const T * firstOffset = & oldClusters.data().front(); - for (typename DSV::const_iterator itdet = oldClusters.begin(), enddet = oldClusters.end(); itdet != enddet; ++itdet) { - DS oldDS = *itdet; - - if (oldDS.empty()) continue; // skip empty detsets - - uint32_t id = oldDS.detId(); - DSF outds(*output, id); - - for (typename DS::const_iterator it = oldDS.begin(), ed = oldDS.end(); it != ed; ++it) { - uint32_t index = ((&*it) - firstOffset); - countOld++; - if (isGood[index]) { - outds.push_back(*it); - countNew++; - refs.push_back(index); - //std::cout << "HITrackClusterRemover::cleanup " << typeid(T).name() << " reference " << index << " to " << (refs.size() - 1) << std::endl; - } - - } - if (outds.empty()) outds.abort(); // not write in an empty DSV +template +std::unique_ptr > HITrackClusterRemover::cleanup( + const edmNew::DetSetVector &oldClusters, + const std::vector &isGood, + reco::ClusterRemovalInfo::Indices &refs, + const reco::ClusterRemovalInfo::Indices *oldRefs) { + typedef typename edmNew::DetSetVector DSV; + typedef typename edmNew::DetSetVector::FastFiller DSF; + typedef typename edmNew::DetSet DS; + auto output = std::make_unique(); + output->reserve(oldClusters.size(), oldClusters.dataSize()); + + unsigned int countOld = 0; + unsigned int countNew = 0; + + // cluster removal loop + const T *firstOffset = &oldClusters.data().front(); + for (typename DSV::const_iterator itdet = oldClusters.begin(), enddet = oldClusters.end(); itdet != enddet; ++itdet) { + DS oldDS = *itdet; + + if (oldDS.empty()) + continue; // skip empty detsets + + uint32_t id = oldDS.detId(); + DSF outds(*output, id); + + for (typename DS::const_iterator it = oldDS.begin(), ed = oldDS.end(); it != ed; ++it) { + uint32_t index = ((&*it) - firstOffset); + countOld++; + if (isGood[index]) { + outds.push_back(*it); + countNew++; + refs.push_back(index); + //std::cout << "HITrackClusterRemover::cleanup " << typeid(T).name() << " reference " << index << " to " << (refs.size() - 1) << std::endl; + } } + if (outds.empty()) + outds.abort(); // not write in an empty DSV + } - if (oldRefs != nullptr) mergeOld(refs, *oldRefs); - return output; + if (oldRefs != nullptr) + mergeOld(refs, *oldRefs); + return output; } -float HITrackClusterRemover::sensorThickness (const SiStripDetId& detid) const -{ - if (detid.subdetId()>=SiStripDetId::TIB) { - if (detid.subdetId()==SiStripDetId::TOB) return 0.047; - if (detid.moduleGeometry()==SiStripModuleGeometry::W5 || detid.moduleGeometry()==SiStripModuleGeometry::W6 || - detid.moduleGeometry()==SiStripModuleGeometry::W7) - return 0.047; - return 0.029; // so it is TEC ring 1-4 or TIB or TOB; - } else if (detid.subdetId()==PixelSubdetector::PixelBarrel) return 0.0285; - else return 0.027; +float HITrackClusterRemover::sensorThickness(const SiStripDetId &detid) const { + if (detid.subdetId() >= SiStripDetId::TIB) { + if (detid.subdetId() == SiStripDetId::TOB) + return 0.047; + if (detid.moduleGeometry() == SiStripModuleGeometry::W5 || detid.moduleGeometry() == SiStripModuleGeometry::W6 || + detid.moduleGeometry() == SiStripModuleGeometry::W7) + return 0.047; + return 0.029; // so it is TEC ring 1-4 or TIB or TOB; + } else if (detid.subdetId() == PixelSubdetector::PixelBarrel) + return 0.0285; + else + return 0.027; } -void HITrackClusterRemover::process(OmniClusterRef const & ocluster, SiStripDetId & detid, bool fromTrack) { - SiStripRecHit2D::ClusterRef cluster = ocluster.cluster_strip(); - if (cluster.id() != stripSourceProdID) throw cms::Exception("Inconsistent Data") << - "HITrackClusterRemover: strip cluster ref from Product ID = " << cluster.id() << - " does not match with source cluster collection (ID = " << stripSourceProdID << ")\n."; - +void HITrackClusterRemover::process(OmniClusterRef const &ocluster, SiStripDetId &detid, bool fromTrack) { + SiStripRecHit2D::ClusterRef cluster = ocluster.cluster_strip(); + if (cluster.id() != stripSourceProdID) + throw cms::Exception("Inconsistent Data") + << "HITrackClusterRemover: strip cluster ref from Product ID = " << cluster.id() + << " does not match with source cluster collection (ID = " << stripSourceProdID << ")\n."; + uint32_t subdet = detid.subdetId(); assert(cluster.id() == stripSourceProdID); - if (pblocks_[subdet-1].usesSize_ && (cluster->amplitudes().size() > pblocks_[subdet-1].maxSize_)) return; + if (pblocks_[subdet - 1].usesSize_ && (cluster->amplitudes().size() > pblocks_[subdet - 1].maxSize_)) + return; if (!fromTrack) { - int clusCharge=0; - for( std::vector::const_iterator iAmp = cluster->amplitudes().begin(); iAmp != cluster->amplitudes().end(); ++iAmp){ + int clusCharge = 0; + for (std::vector::const_iterator iAmp = cluster->amplitudes().begin(); iAmp != cluster->amplitudes().end(); + ++iAmp) { clusCharge += *iAmp; } - if (pblocks_[subdet-1].cutOnStripCharge_ && (clusCharge > (pblocks_[subdet-1].minGoodStripCharge_*sensorThickness(detid)))) return; + if (pblocks_[subdet - 1].cutOnStripCharge_ && + (clusCharge > (pblocks_[subdet - 1].minGoodStripCharge_ * sensorThickness(detid)))) + return; } - if (collectedStrips_.size()<=cluster.key()) - edm::LogError("BadCollectionSize")< cluster.key()); strips[cluster.key()] = false; - if (!clusterWasteSolution_) collectedStrips_[cluster.key()]=true; - + if (!clusterWasteSolution_) + collectedStrips_[cluster.key()] = true; } +void HITrackClusterRemover::process(const TrackingRecHit *hit, unsigned char chi2, const TrackerGeometry *tg) { + SiStripDetId detid = hit->geographicalId(); + uint32_t subdet = detid.subdetId(); -void HITrackClusterRemover::process(const TrackingRecHit *hit, unsigned char chi2, const TrackerGeometry* tg) { - SiStripDetId detid = hit->geographicalId(); - uint32_t subdet = detid.subdetId(); - - assert ((subdet > 0) && (subdet <= NumberOfParamBlocks)); - - // chi2 cut - if (chi2 > Traj2TrackHits::toChi2x5(pblocks_[subdet-1].maxChi2_)) return; - - if(GeomDetEnumerators::isTrackerPixel(tg->geomDetSubDetector(subdet))) { - if (!doPixel_) return; - // this is a pixel, and i *know* it is - const SiPixelRecHit *pixelHit = static_cast(hit); - - SiPixelRecHit::ClusterRef cluster = pixelHit->cluster(); - - if (cluster.id() != pixelSourceProdID) throw cms::Exception("Inconsistent Data") << - "HITrackClusterRemover: pixel cluster ref from Product ID = " << cluster.id() << - " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; - - assert(cluster.id() == pixelSourceProdID); -//DBG// cout << "HIT NEW PIXEL DETID = " << detid.rawId() << ", Cluster [ " << cluster.key().first << " / " << cluster.key().second << " ] " << endl; - - // if requested, cut on cluster size - if (pblocks_[subdet-1].usesSize_ && (cluster->pixels().size() > pblocks_[subdet-1].maxSize_)) return; - - // mark as used - pixels[cluster.key()] = false; - - //if(!clusterWasteSolution_) collectedPixel[detid.rawId()].insert(cluster); - assert(collectedPixels_.size() > cluster.key()); - //assert(detid.rawId() == cluster->geographicalId()); //This condition fails - if(!clusterWasteSolution_) collectedPixels_[cluster.key()]=true; - - } else { // aka Strip - if (!doStrip_) return; - const type_info &hitType = typeid(*hit); - if (hitType == typeid(SiStripRecHit2D)) { - const SiStripRecHit2D *stripHit = static_cast(hit); -//DBG// cout << "Plain RecHit 2D: " << endl; - process(stripHit->omniClusterRef(),detid, true);} - else if (hitType == typeid(SiStripRecHit1D)) { - const SiStripRecHit1D *hit1D = static_cast(hit); - process(hit1D->omniClusterRef(),detid, true); - } else if (hitType == typeid(SiStripMatchedRecHit2D)) { - const SiStripMatchedRecHit2D *matchHit = static_cast(hit); -//DBG// cout << "Matched RecHit 2D: " << endl; - process(matchHit->monoClusterRef(),detid, true); - process(matchHit->stereoClusterRef(),detid, true); - } else if (hitType == typeid(ProjectedSiStripRecHit2D)) { - const ProjectedSiStripRecHit2D *projHit = static_cast(hit); -//DBG// cout << "Projected RecHit 2D: " << endl; - process(projHit->originalHit().omniClusterRef(),detid, true); - } else throw cms::Exception("NOT IMPLEMENTED") << "Don't know how to handle " << hitType.name() << " on detid " << detid.rawId() << "\n"; - } + assert((subdet > 0) && (subdet <= NumberOfParamBlocks)); + + // chi2 cut + if (chi2 > Traj2TrackHits::toChi2x5(pblocks_[subdet - 1].maxChi2_)) + return; + + if (GeomDetEnumerators::isTrackerPixel(tg->geomDetSubDetector(subdet))) { + if (!doPixel_) + return; + // this is a pixel, and i *know* it is + const SiPixelRecHit *pixelHit = static_cast(hit); + + SiPixelRecHit::ClusterRef cluster = pixelHit->cluster(); + + if (cluster.id() != pixelSourceProdID) + throw cms::Exception("Inconsistent Data") + << "HITrackClusterRemover: pixel cluster ref from Product ID = " << cluster.id() + << " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; + + assert(cluster.id() == pixelSourceProdID); + //DBG// cout << "HIT NEW PIXEL DETID = " << detid.rawId() << ", Cluster [ " << cluster.key().first << " / " << cluster.key().second << " ] " << endl; + + // if requested, cut on cluster size + if (pblocks_[subdet - 1].usesSize_ && (cluster->pixels().size() > pblocks_[subdet - 1].maxSize_)) + return; + + // mark as used + pixels[cluster.key()] = false; + + //if(!clusterWasteSolution_) collectedPixel[detid.rawId()].insert(cluster); + assert(collectedPixels_.size() > cluster.key()); + //assert(detid.rawId() == cluster->geographicalId()); //This condition fails + if (!clusterWasteSolution_) + collectedPixels_[cluster.key()] = true; + + } else { // aka Strip + if (!doStrip_) + return; + const type_info &hitType = typeid(*hit); + if (hitType == typeid(SiStripRecHit2D)) { + const SiStripRecHit2D *stripHit = static_cast(hit); + //DBG// cout << "Plain RecHit 2D: " << endl; + process(stripHit->omniClusterRef(), detid, true); + } else if (hitType == typeid(SiStripRecHit1D)) { + const SiStripRecHit1D *hit1D = static_cast(hit); + process(hit1D->omniClusterRef(), detid, true); + } else if (hitType == typeid(SiStripMatchedRecHit2D)) { + const SiStripMatchedRecHit2D *matchHit = static_cast(hit); + //DBG// cout << "Matched RecHit 2D: " << endl; + process(matchHit->monoClusterRef(), detid, true); + process(matchHit->stereoClusterRef(), detid, true); + } else if (hitType == typeid(ProjectedSiStripRecHit2D)) { + const ProjectedSiStripRecHit2D *projHit = static_cast(hit); + //DBG// cout << "Projected RecHit 2D: " << endl; + process(projHit->originalHit().omniClusterRef(), detid, true); + } else + throw cms::Exception("NOT IMPLEMENTED") + << "Don't know how to handle " << hitType.name() << " on detid " << detid.rawId() << "\n"; + } } /* Schematic picture of n-th step Iterative removal @@ -380,182 +412,194 @@ void HITrackClusterRemover::process(const TrackingRecHit *hit, unsigned char chi * \-- Old ClusterRemovalInfo "old" ID */ +void HITrackClusterRemover::produce(Event &iEvent, const EventSetup &iSetup) { + ProductID pixelOldProdID, stripOldProdID; -void -HITrackClusterRemover::produce(Event& iEvent, const EventSetup& iSetup) -{ - ProductID pixelOldProdID, stripOldProdID; + edm::ESHandle tgh; + iSetup.get().get(tgh); - edm::ESHandle tgh; - iSetup.get().get(tgh); - - Handle > pixelClusters; - if (doPixel_) { - iEvent.getByToken(pixelClusters_, pixelClusters); - pixelSourceProdID = pixelClusters.id(); - } -//DBG// std::cout << "HITrackClusterRemover: Read pixel " << pixelClusters_.encode() << " = ID " << pixelSourceProdID << std::endl; + Handle > pixelClusters; + if (doPixel_) { + iEvent.getByToken(pixelClusters_, pixelClusters); + pixelSourceProdID = pixelClusters.id(); + } + //DBG// std::cout << "HITrackClusterRemover: Read pixel " << pixelClusters_.encode() << " = ID " << pixelSourceProdID << std::endl; - Handle > stripClusters; - if (doStrip_) { - iEvent.getByToken(stripClusters_, stripClusters); - stripSourceProdID = stripClusters.id(); - } -//DBG// std::cout << "HITrackClusterRemover: Read strip " << stripClusters_.encode() << " = ID " << stripSourceProdID << std::endl; + Handle > stripClusters; + if (doStrip_) { + iEvent.getByToken(stripClusters_, stripClusters); + stripSourceProdID = stripClusters.id(); + } + //DBG// std::cout << "HITrackClusterRemover: Read strip " << stripClusters_.encode() << " = ID " << stripSourceProdID << std::endl; + + std::unique_ptr cri; + if (clusterWasteSolution_) { + if (doStrip_ && doPixel_) + cri = std::make_unique(pixelClusters, stripClusters); + else if (doStrip_) + cri = std::make_unique(stripClusters); + else if (doPixel_) + cri = std::make_unique(pixelClusters); + } - std::unique_ptr cri; - if (clusterWasteSolution_){ - if (doStrip_ && doPixel_) cri = std::make_unique(pixelClusters, stripClusters); - else if (doStrip_) cri = std::make_unique(stripClusters); - else if (doPixel_) cri = std::make_unique(pixelClusters); + Handle oldRemovalInfo; + if (mergeOld_ && clusterWasteSolution_) { + iEvent.getByToken(oldRemovalInfo_, oldRemovalInfo); + // Check ProductIDs + if ((oldRemovalInfo->stripNewRefProd().id() == stripClusters.id()) && + (oldRemovalInfo->pixelNewRefProd().id() == pixelClusters.id())) { + cri->getOldClustersFrom(*oldRemovalInfo); + + pixelOldProdID = oldRemovalInfo->pixelRefProd().id(); + stripOldProdID = oldRemovalInfo->stripRefProd().id(); + + } else { + edm::EDConsumerBase::Labels labels; + labelsForToken(oldRemovalInfo_, labels); + throw cms::Exception("Inconsistent Data") + << "HITrackClusterRemover: " + << "Input collection product IDs are [pixel: " << pixelClusters.id() << ", strip: " << stripClusters.id() + << "] \n" + << "\t but the *old* ClusterRemovalInfo " << labels.productInstance << " refers as 'new product ids' to " + << "[pixel: " << oldRemovalInfo->pixelNewRefProd().id() + << ", strip: " << oldRemovalInfo->stripNewRefProd().id() << "]\n" + << "NOTA BENE: when running HITrackClusterRemover with an old ClusterRemovalInfo the hits in the trajectory " + "MUST be already re-keyed.\n"; } + } else { // then Old == Source + pixelOldProdID = pixelSourceProdID; + stripOldProdID = stripSourceProdID; + } - Handle oldRemovalInfo; - if (mergeOld_ && clusterWasteSolution_) { - iEvent.getByToken(oldRemovalInfo_, oldRemovalInfo); - // Check ProductIDs - if ( (oldRemovalInfo->stripNewRefProd().id() == stripClusters.id()) && - (oldRemovalInfo->pixelNewRefProd().id() == pixelClusters.id()) ) { - - cri->getOldClustersFrom(*oldRemovalInfo); - - pixelOldProdID = oldRemovalInfo->pixelRefProd().id(); - stripOldProdID = oldRemovalInfo->stripRefProd().id(); - - } else { - - edm::EDConsumerBase::Labels labels; - labelsForToken(oldRemovalInfo_,labels); - throw cms::Exception("Inconsistent Data") << "HITrackClusterRemover: " << - "Input collection product IDs are [pixel: " << pixelClusters.id() << ", strip: " << stripClusters.id() << "] \n" << - "\t but the *old* ClusterRemovalInfo " << labels.productInstance << " refers as 'new product ids' to " << - "[pixel: " << oldRemovalInfo->pixelNewRefProd().id() << ", strip: " << oldRemovalInfo->stripNewRefProd().id() << "]\n" << - "NOTA BENE: when running HITrackClusterRemover with an old ClusterRemovalInfo the hits in the trajectory MUST be already re-keyed.\n"; - } - } else { // then Old == Source - pixelOldProdID = pixelSourceProdID; - stripOldProdID = stripSourceProdID; - } + if (doStrip_) { + strips.resize(stripClusters->dataSize()); + fill(strips.begin(), strips.end(), true); + } + if (doPixel_) { + pixels.resize(pixelClusters->dataSize()); + fill(pixels.begin(), pixels.end(), true); + } + if (mergeOld_) { + edm::Handle oldPxlMask; + edm::Handle oldStrMask; + iEvent.getByToken(oldPxlMaskToken_, oldPxlMask); + iEvent.getByToken(oldStrMaskToken_, oldStrMask); + LogDebug("HITrackClusterRemover") << "to merge in, " << oldStrMask->size() << " strp and " << oldPxlMask->size() + << " pxl"; + oldStrMask->copyMaskTo(collectedStrips_); + oldPxlMask->copyMaskTo(collectedPixels_); + assert(stripClusters->dataSize() >= collectedStrips_.size()); + collectedStrips_.resize(stripClusters->dataSize(), false); + } else { + collectedStrips_.resize(stripClusters->dataSize(), false); + collectedPixels_.resize(pixelClusters->dataSize(), false); + } - if (doStrip_) { - strips.resize(stripClusters->dataSize()); fill(strips.begin(), strips.end(), true); - } - if (doPixel_) { - pixels.resize(pixelClusters->dataSize()); fill(pixels.begin(), pixels.end(), true); + if (doTracks_) { + Handle tracks; + iEvent.getByToken(tracks_, tracks); + + std::vector > > quals; + if (!overrideTrkQuals_.empty()) { + quals.resize(1); + iEvent.getByToken(overrideTrkQuals_[0], quals[0]); } - if(mergeOld_) { - edm::Handle oldPxlMask; - edm::Handle oldStrMask; - iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask); - iEvent.getByToken(oldStrMaskToken_ ,oldStrMask); - LogDebug("HITrackClusterRemover")<<"to merge in, "<size()<<" strp and "<size()<<" pxl"; - oldStrMask->copyMaskTo(collectedStrips_); - oldPxlMask->copyMaskTo(collectedPixels_); - assert(stripClusters->dataSize()>=collectedStrips_.size()); - collectedStrips_.resize(stripClusters->dataSize(), false); - }else { - collectedStrips_.resize(stripClusters->dataSize(), false); - collectedPixels_.resize(pixelClusters->dataSize(), false); - } - - if (doTracks_) { - - Handle tracks; - iEvent.getByToken(tracks_,tracks); - - std::vector > > quals; - if ( !overrideTrkQuals_.empty()) { - quals.resize(1); - iEvent.getByToken(overrideTrkQuals_[0],quals[0]); + int it = 0; + for (const auto &track : *tracks) { + if (filterTracks_) { + bool goodTk = true; + if (!quals.empty()) { + int qual = (*(quals[0])).get(it++); + if (qual < 0) { + goodTk = false; + } + //note that this does not work for some trackquals (goodIterative or undefQuality) + else + goodTk = (qual & (1 << trackQuality_)) >> trackQuality_; + } else + goodTk = (track.quality(trackQuality_)); + if (!goodTk) + continue; + if (track.hitPattern().trackerLayersWithMeasurement() < minNumberOfLayersWithMeasBeforeFiltering_) + continue; } - int it=0; - for (const auto & track: *tracks) { - if (filterTracks_) { - bool goodTk = true; - if ( !quals.empty()) { - int qual=(*(quals[0])). get(it++); - if ( qual < 0 ) {goodTk=false;} - //note that this does not work for some trackquals (goodIterative or undefQuality) - else - goodTk = ( qual & (1<>trackQuality_; - } - else - goodTk=(track.quality(trackQuality_)); - if ( !goodTk) continue; - if(track.hitPattern().trackerLayersWithMeasurement() < minNumberOfLayersWithMeasBeforeFiltering_) continue; - } - auto const & chi2sX5 = track.extra()->chi2sX5(); - assert(chi2sX5.size()==track.recHitsSize()); - auto hb = track.recHitsBegin(); - for(unsigned int h=0;hisValid()) continue; - process( hit, chi2sX5[h], tgh.product()); - } + auto const &chi2sX5 = track.extra()->chi2sX5(); + assert(chi2sX5.size() == track.recHitsSize()); + auto hb = track.recHitsBegin(); + for (unsigned int h = 0; h < track.recHitsSize(); h++) { + auto hit = *(hb + h); + if (!hit->isValid()) + continue; + process(hit, chi2sX5[h], tgh.product()); } } + } - if (doStripChargeCheck_) { - edm::Handle rechitsrphi; - iEvent.getByToken(rphiRecHitToken_, rechitsrphi); - const SiStripRecHit2DCollection::DataContainer * rphiRecHits = & (rechitsrphi).product()->data(); - for( SiStripRecHit2DCollection::DataContainer::const_iterator - recHit = rphiRecHits->begin(); recHit!= rphiRecHits->end(); recHit++){ - SiStripDetId detid = recHit->geographicalId(); - process(recHit->omniClusterRef(),detid,false); - } - edm::Handle rechitsstereo; - iEvent.getByToken(stereoRecHitToken_, rechitsstereo); - const SiStripRecHit2DCollection::DataContainer * stereoRecHits = & (rechitsstereo).product()->data(); - for( SiStripRecHit2DCollection::DataContainer::const_iterator - recHit = stereoRecHits->begin(); recHit!= stereoRecHits->end(); recHit++){ - SiStripDetId detid = recHit->geographicalId(); - process(recHit->omniClusterRef(),detid,false); - } - - } -// if(doPixelChargeCheck_) { -// edm::Handle pixelrechits; -// iEvent.getByToken(pixelRecHitsToken_,pixelrechits); -// } - - if (doPixel_ && clusterWasteSolution_) { - OrphanHandle > newPixels = - iEvent.put(cleanup(*pixelClusters, pixels, cri->pixelIndices(), mergeOld_ ? &oldRemovalInfo->pixelIndices() : nullptr)); -//DBG// std::cout << "HITrackClusterRemover: Wrote pixel " << newPixels.id() << " from " << pixelSourceProdID << std::endl; - cri->setNewPixelClusters(newPixels); + if (doStripChargeCheck_) { + edm::Handle rechitsrphi; + iEvent.getByToken(rphiRecHitToken_, rechitsrphi); + const SiStripRecHit2DCollection::DataContainer *rphiRecHits = &(rechitsrphi).product()->data(); + for (SiStripRecHit2DCollection::DataContainer::const_iterator recHit = rphiRecHits->begin(); + recHit != rphiRecHits->end(); + recHit++) { + SiStripDetId detid = recHit->geographicalId(); + process(recHit->omniClusterRef(), detid, false); } - if (doStrip_ && clusterWasteSolution_) { - OrphanHandle > newStrips = iEvent.put(cleanup(*stripClusters, strips, cri->stripIndices(), mergeOld_ ? &oldRemovalInfo->stripIndices() : nullptr)); -//DBG// std::cout << "HITrackClusterRemover: Wrote strip " << newStrips.id() << " from " << stripSourceProdID << std::endl; - cri->setNewStripClusters(newStrips); + edm::Handle rechitsstereo; + iEvent.getByToken(stereoRecHitToken_, rechitsstereo); + const SiStripRecHit2DCollection::DataContainer *stereoRecHits = &(rechitsstereo).product()->data(); + for (SiStripRecHit2DCollection::DataContainer::const_iterator recHit = stereoRecHits->begin(); + recHit != stereoRecHits->end(); + recHit++) { + SiStripDetId detid = recHit->geographicalId(); + process(recHit->omniClusterRef(), detid, false); } + } + // if(doPixelChargeCheck_) { + // edm::Handle pixelrechits; + // iEvent.getByToken(pixelRecHitsToken_,pixelrechits); + // } + + if (doPixel_ && clusterWasteSolution_) { + OrphanHandle > newPixels = iEvent.put( + cleanup(*pixelClusters, pixels, cri->pixelIndices(), mergeOld_ ? &oldRemovalInfo->pixelIndices() : nullptr)); + //DBG// std::cout << "HITrackClusterRemover: Wrote pixel " << newPixels.id() << " from " << pixelSourceProdID << std::endl; + cri->setNewPixelClusters(newPixels); + } + if (doStrip_ && clusterWasteSolution_) { + OrphanHandle > newStrips = iEvent.put( + cleanup(*stripClusters, strips, cri->stripIndices(), mergeOld_ ? &oldRemovalInfo->stripIndices() : nullptr)); + //DBG// std::cout << "HITrackClusterRemover: Wrote strip " << newStrips.id() << " from " << stripSourceProdID << std::endl; + cri->setNewStripClusters(newStrips); + } - - if (clusterWasteSolution_) { - // double fraction_pxl= cri->pixelIndices().size() / (double) pixels.size(); - // double fraction_strp= cri->stripIndices().size() / (double) strips.size(); - // edm::LogWarning("HITrackClusterRemover")<<" fraction: " << fraction_pxl <<" "<pixelIndices().size() / (double) pixels.size(); + // double fraction_strp= cri->stripIndices().size() / (double) strips.size(); + // edm::LogWarning("HITrackClusterRemover")<<" fraction: " << fraction_pxl <<" "< > removedPixelClsuterRefs(new edmNew::DetSetVector()); - //auto_ptr > removedStripClsuterRefs(new edmNew::DetSetVector()); - - LogDebug("HITrackClusterRemover")<<"total strip to skip: "<(edm::RefProd >(stripClusters),collectedStrips_)); + if (!clusterWasteSolution_) { + //auto_ptr > removedPixelClsuterRefs(new edmNew::DetSetVector()); + //auto_ptr > removedStripClsuterRefs(new edmNew::DetSetVector()); - LogDebug("HITrackClusterRemover")<<"total pxl to skip: "<(edm::RefProd >(pixelClusters),collectedPixels_)); - - } - collectedStrips_.clear(); - collectedPixels_.clear(); + LogDebug("HITrackClusterRemover") << "total strip to skip: " + << std::count(collectedStrips_.begin(), collectedStrips_.end(), true); + // std::cout << "HITrackClusterRemover " <<"total strip to skip: "<(edm::RefProd >(stripClusters), + collectedStrips_)); + LogDebug("HITrackClusterRemover") << "total pxl to skip: " + << std::count(collectedPixels_.begin(), collectedPixels_.end(), true); + iEvent.put(std::make_unique(edm::RefProd >(pixelClusters), + collectedPixels_)); + } + collectedStrips_.clear(); + collectedPixels_.clear(); } #include "FWCore/PluginManager/interface/ModuleDef.h" diff --git a/RecoLocalTracker/SubCollectionProducers/src/HLTTrackClusterRemoverNew.cc b/RecoLocalTracker/SubCollectionProducers/src/HLTTrackClusterRemoverNew.cc index 930c807f49aaa..a5f025fb7e833 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/HLTTrackClusterRemoverNew.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/HLTTrackClusterRemoverNew.cc @@ -37,298 +37,318 @@ // class HLTTrackClusterRemoverNew final : public edm::stream::EDProducer<> { - public: - HLTTrackClusterRemoverNew(const edm::ParameterSet& iConfig) ; - ~HLTTrackClusterRemoverNew() override ; - void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override ; - private: - struct ParamBlock { - ParamBlock() : isSet_(false), usesCharge_(false) {} - ParamBlock(const edm::ParameterSet& iConfig) : - isSet_(true), - usesCharge_(iConfig.exists("maxCharge")), - usesSize_(iConfig.exists("maxSize")), - cutOnPixelCharge_(iConfig.exists("minGoodPixelCharge")), - cutOnStripCharge_(iConfig.exists("minGoodStripCharge")), - maxChi2_(iConfig.getParameter("maxChi2")), - maxCharge_(usesCharge_ ? iConfig.getParameter("maxCharge") : 0), - minGoodPixelCharge_(cutOnPixelCharge_ ? iConfig.getParameter("minGoodPixelCharge") : 0), - minGoodStripCharge_(cutOnStripCharge_ ? iConfig.getParameter("minGoodStripCharge") : 0), - maxSize_(usesSize_ ? iConfig.getParameter("maxSize") : 0) { } - bool isSet_, usesCharge_, usesSize_, cutOnPixelCharge_, cutOnStripCharge_; - float maxChi2_, maxCharge_, minGoodPixelCharge_, minGoodStripCharge_; - size_t maxSize_; - }; - static const unsigned int NumberOfParamBlocks = 6; - - bool doTracks_; - bool doStrip_, doPixel_; - bool mergeOld_; - - typedef edm::ContainerMask > PixelMaskContainer; - typedef edm::ContainerMask > StripMaskContainer; - edm::EDGetTokenT > pixelClusters_; - edm::EDGetTokenT > stripClusters_; - edm::EDGetTokenT oldPxlMaskToken_; - edm::EDGetTokenT oldStrMaskToken_; - edm::EDGetTokenT > trajectories_; - - - ParamBlock pblocks_[NumberOfParamBlocks]; - void readPSet(const edm::ParameterSet& iConfig, const std::string &name, - int id1=-1, int id2=-1, int id3=-1, int id4=-1, int id5=-1, int id6=-1) ; - - std::vector pixels, strips; // avoid unneed alloc/dealloc of this - edm::ProductID pixelSourceProdID, stripSourceProdID; // ProdIDs refs must point to (for consistency tests) - - inline void process(const TrackingRecHit *hit, float chi2, const TrackerGeometry* tg); - inline void process(const OmniClusterRef & cluRef, uint32_t subdet); - - template - std::unique_ptr > - cleanup(const edmNew::DetSetVector &oldClusters, const std::vector &isGood, - reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices *oldRefs) ; - - // Carries in full removal info about a given det from oldRefs - void mergeOld(reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices &oldRefs) ; +public: + HLTTrackClusterRemoverNew(const edm::ParameterSet &iConfig); + ~HLTTrackClusterRemoverNew() override; + void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; + +private: + struct ParamBlock { + ParamBlock() : isSet_(false), usesCharge_(false) {} + ParamBlock(const edm::ParameterSet &iConfig) + : isSet_(true), + usesCharge_(iConfig.exists("maxCharge")), + usesSize_(iConfig.exists("maxSize")), + cutOnPixelCharge_(iConfig.exists("minGoodPixelCharge")), + cutOnStripCharge_(iConfig.exists("minGoodStripCharge")), + maxChi2_(iConfig.getParameter("maxChi2")), + maxCharge_(usesCharge_ ? iConfig.getParameter("maxCharge") : 0), + minGoodPixelCharge_(cutOnPixelCharge_ ? iConfig.getParameter("minGoodPixelCharge") : 0), + minGoodStripCharge_(cutOnStripCharge_ ? iConfig.getParameter("minGoodStripCharge") : 0), + maxSize_(usesSize_ ? iConfig.getParameter("maxSize") : 0) {} + bool isSet_, usesCharge_, usesSize_, cutOnPixelCharge_, cutOnStripCharge_; + float maxChi2_, maxCharge_, minGoodPixelCharge_, minGoodStripCharge_; + size_t maxSize_; + }; + static const unsigned int NumberOfParamBlocks = 6; + + bool doTracks_; + bool doStrip_, doPixel_; + bool mergeOld_; + + typedef edm::ContainerMask > PixelMaskContainer; + typedef edm::ContainerMask > StripMaskContainer; + edm::EDGetTokenT > pixelClusters_; + edm::EDGetTokenT > stripClusters_; + edm::EDGetTokenT oldPxlMaskToken_; + edm::EDGetTokenT oldStrMaskToken_; + edm::EDGetTokenT > trajectories_; + + ParamBlock pblocks_[NumberOfParamBlocks]; + void readPSet(const edm::ParameterSet &iConfig, + const std::string &name, + int id1 = -1, + int id2 = -1, + int id3 = -1, + int id4 = -1, + int id5 = -1, + int id6 = -1); + + std::vector pixels, strips; // avoid unneed alloc/dealloc of this + edm::ProductID pixelSourceProdID, stripSourceProdID; // ProdIDs refs must point to (for consistency tests) + + inline void process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg); + inline void process(const OmniClusterRef &cluRef, uint32_t subdet); + + template + std::unique_ptr > cleanup(const edmNew::DetSetVector &oldClusters, + const std::vector &isGood, + reco::ClusterRemovalInfo::Indices &refs, + const reco::ClusterRemovalInfo::Indices *oldRefs); + + // Carries in full removal info about a given det from oldRefs + void mergeOld(reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices &oldRefs); bool makeProducts_; bool doStripChargeCheck_, doPixelChargeCheck_; std::vector collectedRegStrips_; - std::vector collectedPixels_; - + std::vector collectedPixels_; }; - using namespace std; using namespace edm; using namespace reco; -void -HLTTrackClusterRemoverNew::readPSet(const edm::ParameterSet& iConfig, const std::string &name, - int id1, int id2, int id3, int id4, int id5, int id6) -{ - if (iConfig.exists(name)) { - ParamBlock pblock(iConfig.getParameter(name)); - if (id1 == -1) { - fill(pblocks_, pblocks_+NumberOfParamBlocks, pblock); - } else { - pblocks_[id1] = pblock; - if (id2 != -1) pblocks_[id2] = pblock; - if (id3 != -1) pblocks_[id3] = pblock; - if (id4 != -1) pblocks_[id4] = pblock; - if (id5 != -1) pblocks_[id5] = pblock; - if (id6 != -1) pblocks_[id6] = pblock; - } +void HLTTrackClusterRemoverNew::readPSet( + const edm::ParameterSet &iConfig, const std::string &name, int id1, int id2, int id3, int id4, int id5, int id6) { + if (iConfig.exists(name)) { + ParamBlock pblock(iConfig.getParameter(name)); + if (id1 == -1) { + fill(pblocks_, pblocks_ + NumberOfParamBlocks, pblock); + } else { + pblocks_[id1] = pblock; + if (id2 != -1) + pblocks_[id2] = pblock; + if (id3 != -1) + pblocks_[id3] = pblock; + if (id4 != -1) + pblocks_[id4] = pblock; + if (id5 != -1) + pblocks_[id5] = pblock; + if (id6 != -1) + pblocks_[id6] = pblock; } + } } -HLTTrackClusterRemoverNew::HLTTrackClusterRemoverNew(const ParameterSet& iConfig) - : doTracks_(iConfig.exists("trajectories")) - , doStrip_ (iConfig.existsAs("doStrip") ? iConfig.getParameter("doStrip") : true) - , doPixel_ (iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true) - , mergeOld_(false) - , makeProducts_(true) - , doStripChargeCheck_(iConfig.existsAs("doStripChargeCheck") ? iConfig.getParameter("doStripChargeCheck") : false) - , doPixelChargeCheck_(iConfig.existsAs("doPixelChargeCheck") ? iConfig.getParameter("doPixelChargeCheck") : false) +HLTTrackClusterRemoverNew::HLTTrackClusterRemoverNew(const ParameterSet &iConfig) + : doTracks_(iConfig.exists("trajectories")), + doStrip_(iConfig.existsAs("doStrip") ? iConfig.getParameter("doStrip") : true), + doPixel_(iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true), + mergeOld_(false), + makeProducts_(true), + doStripChargeCheck_( + iConfig.existsAs("doStripChargeCheck") ? iConfig.getParameter("doStripChargeCheck") : false), + doPixelChargeCheck_( + iConfig.existsAs("doPixelChargeCheck") ? iConfig.getParameter("doPixelChargeCheck") : false) { - - if (iConfig.exists("oldClusterRemovalInfo")) - { - oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - if (not (iConfig.getParameter("oldClusterRemovalInfo")== edm::InputTag())) mergeOld_=true; - } + if (iConfig.exists("oldClusterRemovalInfo")) { + oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + if (not(iConfig.getParameter("oldClusterRemovalInfo") == edm::InputTag())) + mergeOld_ = true; + } if ((doPixelChargeCheck_ && !doPixel_) || (doStripChargeCheck_ && !doStrip_)) - throw cms::Exception("Configuration Error") << "HLTTrackClusterRemoverNew: Charge check asked without cluster collection "; + throw cms::Exception("Configuration Error") + << "HLTTrackClusterRemoverNew: Charge check asked without cluster collection "; if (doPixelChargeCheck_) - throw cms::Exception("Configuration Error") << "HLTTrackClusterRemoverNew: Pixel cluster charge check not yet implemented"; - - fill(pblocks_, pblocks_+NumberOfParamBlocks, ParamBlock()); - readPSet(iConfig, "Common",-1); - if (doPixel_) { - readPSet(iConfig, "Pixel" , 0,1); - readPSet(iConfig, "PXB" , 0); - readPSet(iConfig, "PXE" , 1); - } - if (doStrip_) { - readPSet(iConfig, "Strip" , 2,3,4,5); - readPSet(iConfig, "StripInner" ,2,3); - readPSet(iConfig, "StripOuter" ,4,5); - readPSet(iConfig, "TIB" , 2); - readPSet(iConfig, "TID" , 3); - readPSet(iConfig, "TOB" , 4); - readPSet(iConfig, "TEC" , 5); - } + throw cms::Exception("Configuration Error") + << "HLTTrackClusterRemoverNew: Pixel cluster charge check not yet implemented"; + + fill(pblocks_, pblocks_ + NumberOfParamBlocks, ParamBlock()); + readPSet(iConfig, "Common", -1); + if (doPixel_) { + readPSet(iConfig, "Pixel", 0, 1); + readPSet(iConfig, "PXB", 0); + readPSet(iConfig, "PXE", 1); + } + if (doStrip_) { + readPSet(iConfig, "Strip", 2, 3, 4, 5); + readPSet(iConfig, "StripInner", 2, 3); + readPSet(iConfig, "StripOuter", 4, 5); + readPSet(iConfig, "TIB", 2); + readPSet(iConfig, "TID", 3); + readPSet(iConfig, "TOB", 4); + readPSet(iConfig, "TEC", 5); + } - bool usingCharge = false; - for (size_t i = 0; i < NumberOfParamBlocks; ++i) { - if (!pblocks_[i].isSet_) throw cms::Exception("Configuration Error") << "HLTTrackClusterRemoverNew: Missing configuration for detector with subDetID = " << (i+1); - if (pblocks_[i].usesCharge_ && !usingCharge) { - throw cms::Exception("Configuration Error") << "HLTTrackClusterRemoverNew: Configuration for subDetID = " << (i+1) << " uses cluster charge, which is not enabled."; - } - } - - // trajectories_ = consumes >(iConfig.getParameter("trajectories")); - if (doTracks_) trajectories_ = consumes > (iConfig.getParameter("trajectories") ); - if (doPixel_) pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); - if (doStrip_) stripClusters_ = consumes > (iConfig.getParameter("stripClusters")); - if (mergeOld_) { - oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + bool usingCharge = false; + for (size_t i = 0; i < NumberOfParamBlocks; ++i) { + if (!pblocks_[i].isSet_) + throw cms::Exception("Configuration Error") + << "HLTTrackClusterRemoverNew: Missing configuration for detector with subDetID = " << (i + 1); + if (pblocks_[i].usesCharge_ && !usingCharge) { + throw cms::Exception("Configuration Error") + << "HLTTrackClusterRemoverNew: Configuration for subDetID = " << (i + 1) + << " uses cluster charge, which is not enabled."; } + } - //produces >(); - //produces >(); - - produces< edm::ContainerMask > >(); - produces< edm::ContainerMask > >(); - -} + // trajectories_ = consumes >(iConfig.getParameter("trajectories")); + if (doTracks_) + trajectories_ = consumes >(iConfig.getParameter("trajectories")); + if (doPixel_) + pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); + if (doStrip_) + stripClusters_ = consumes >(iConfig.getParameter("stripClusters")); + if (mergeOld_) { + oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + } + //produces >(); + //produces >(); -HLTTrackClusterRemoverNew::~HLTTrackClusterRemoverNew() -{ + produces > >(); + produces > >(); } +HLTTrackClusterRemoverNew::~HLTTrackClusterRemoverNew() {} + void HLTTrackClusterRemoverNew::mergeOld(ClusterRemovalInfo::Indices &refs, - const ClusterRemovalInfo::Indices &oldRefs) -{ - for (size_t i = 0, n = refs.size(); i < n; ++i) { - refs[i] = oldRefs[refs[i]]; - } + const ClusterRemovalInfo::Indices &oldRefs) { + for (size_t i = 0, n = refs.size(); i < n; ++i) { + refs[i] = oldRefs[refs[i]]; + } } - -template -std::unique_ptr > -HLTTrackClusterRemoverNew::cleanup(const edmNew::DetSetVector &oldClusters, const std::vector &isGood, - reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices *oldRefs){ - typedef typename edmNew::DetSetVector DSV; - typedef typename edmNew::DetSetVector::FastFiller DSF; - typedef typename edmNew::DetSet DS; - auto output = std::make_unique(); - output->reserve(oldClusters.size(), oldClusters.dataSize()); - - unsigned int countOld=0; - unsigned int countNew=0; - - // cluster removal loop - const T * firstOffset = & oldClusters.data().front(); - for (typename DSV::const_iterator itdet = oldClusters.begin(), enddet = oldClusters.end(); itdet != enddet; ++itdet) { - DS oldDS = *itdet; - - if (oldDS.empty()) continue; // skip empty detsets - - uint32_t id = oldDS.detId(); - DSF outds(*output, id); - - for (typename DS::const_iterator it = oldDS.begin(), ed = oldDS.end(); it != ed; ++it) { - uint32_t index = ((&*it) - firstOffset); - countOld++; - if (isGood[index]) { - outds.push_back(*it); - countNew++; - refs.push_back(index); - //std::cout << "HLTTrackClusterRemoverNew::cleanup " << typeid(T).name() << " reference " << index << " to " << (refs.size() - 1) << std::endl; - } - - } - if (outds.empty()) outds.abort(); // not write in an empty DSV +template +std::unique_ptr > HLTTrackClusterRemoverNew::cleanup( + const edmNew::DetSetVector &oldClusters, + const std::vector &isGood, + reco::ClusterRemovalInfo::Indices &refs, + const reco::ClusterRemovalInfo::Indices *oldRefs) { + typedef typename edmNew::DetSetVector DSV; + typedef typename edmNew::DetSetVector::FastFiller DSF; + typedef typename edmNew::DetSet DS; + auto output = std::make_unique(); + output->reserve(oldClusters.size(), oldClusters.dataSize()); + + unsigned int countOld = 0; + unsigned int countNew = 0; + + // cluster removal loop + const T *firstOffset = &oldClusters.data().front(); + for (typename DSV::const_iterator itdet = oldClusters.begin(), enddet = oldClusters.end(); itdet != enddet; ++itdet) { + DS oldDS = *itdet; + + if (oldDS.empty()) + continue; // skip empty detsets + + uint32_t id = oldDS.detId(); + DSF outds(*output, id); + + for (typename DS::const_iterator it = oldDS.begin(), ed = oldDS.end(); it != ed; ++it) { + uint32_t index = ((&*it) - firstOffset); + countOld++; + if (isGood[index]) { + outds.push_back(*it); + countNew++; + refs.push_back(index); + //std::cout << "HLTTrackClusterRemoverNew::cleanup " << typeid(T).name() << " reference " << index << " to " << (refs.size() - 1) << std::endl; + } } - // double fraction = countNew / (double) countOld; - // std::cout<<"fraction: "<clusterReg.key()); + assert(collectedRegStrips_.size() > clusterReg.key()); } - collectedRegStrips_[clusterReg.key()]=true; + collectedRegStrips_[clusterReg.key()] = true; } - - -void HLTTrackClusterRemoverNew::process(const TrackingRecHit *hit, float chi2, const TrackerGeometry* tg) { - DetId detid = hit->geographicalId(); - uint32_t subdet = detid.subdetId(); - - - assert ((subdet > 0) && (subdet <= NumberOfParamBlocks)); - - // chi2 cut - if (chi2 > pblocks_[subdet-1].maxChi2_) return; - - if(GeomDetEnumerators::isTrackerPixel(tg->geomDetSubDetector(subdet))) { - // std::cout<<"process pxl hit"<(hit); - - SiPixelRecHit::ClusterRef cluster = pixelHit->cluster(); - if (cluster.id() != pixelSourceProdID) throw cms::Exception("Inconsistent Data") << - "HLTTrackClusterRemoverNew: pixel cluster ref from Product ID = " << cluster.id() << - " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; - - assert(cluster.id() == pixelSourceProdID); - //DBG// cout << "HIT NEW PIXEL DETID = " << detid.rawId() << ", Cluster [ " << cluster.key().first << " / " << cluster.key().second << " ] " << endl; - - // if requested, cut on cluster size - if (pblocks_[subdet-1].usesSize_ && (cluster->pixels().size() > pblocks_[subdet-1].maxSize_)) return; - - // mark as used - //pixels[cluster.key()] = false; - assert(collectedPixels_.size() > cluster.key()); - collectedPixels_[cluster.key()]=true; - } else { // aka Strip - if (!doStrip_) return; - const type_info &hitType = typeid(*hit); - if (hitType == typeid(SiStripRecHit2D)) { - const SiStripRecHit2D *stripHit = static_cast(hit); - //DBG// cout << "Plain RecHit 2D: " << endl; - process(stripHit->omniClusterRef(),subdet); - // int clusCharge=0; - // for ( auto cAmp : stripHit->omniClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; - // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripRecHit2D) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; - } else if (hitType == typeid(SiStripRecHit1D)) { - const SiStripRecHit1D *hit1D = static_cast(hit); - process(hit1D->omniClusterRef(),subdet); - // int clusCharge=0; - // for ( auto cAmp : hit1D->omniClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; - // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripRecHit1D) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; - } else if (hitType == typeid(SiStripMatchedRecHit2D)) { - const SiStripMatchedRecHit2D *matchHit = static_cast(hit); - //DBG// cout << "Matched RecHit 2D: " << endl; - process(matchHit->monoClusterRef(), subdet); - // int clusCharge=0; - // for ( auto cAmp : matchHit->monoClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; - // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripMatchedRecHit2D:mono) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; - - process(matchHit->stereoClusterRef(),subdet); - // clusCharge=0; - // for ( auto cAmp : matchHit->stereoClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; - // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripMatchedRecHit2D:stereo) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; - - } else if (hitType == typeid(ProjectedSiStripRecHit2D)) { - const ProjectedSiStripRecHit2D *projHit = static_cast(hit); - //DBG// cout << "Projected RecHit 2D: " << endl; - process(projHit->originalHit().omniClusterRef(),subdet); - // int clusCharge=0; - // for ( auto cAmp : projHit->originalHit().omniClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; - // std::cout << "[HLTTrackClusterRemoverNew::process (ProjectedSiStripRecHit2D) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; - } else throw cms::Exception("NOT IMPLEMENTED") << "Don't know how to handle " << hitType.name() << " on detid " << detid.rawId() << "\n"; - } +void HLTTrackClusterRemoverNew::process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg) { + DetId detid = hit->geographicalId(); + uint32_t subdet = detid.subdetId(); + + assert((subdet > 0) && (subdet <= NumberOfParamBlocks)); + + // chi2 cut + if (chi2 > pblocks_[subdet - 1].maxChi2_) + return; + + if (GeomDetEnumerators::isTrackerPixel(tg->geomDetSubDetector(subdet))) { + // std::cout<<"process pxl hit"<(hit); + + SiPixelRecHit::ClusterRef cluster = pixelHit->cluster(); + if (cluster.id() != pixelSourceProdID) + throw cms::Exception("Inconsistent Data") + << "HLTTrackClusterRemoverNew: pixel cluster ref from Product ID = " << cluster.id() + << " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; + + assert(cluster.id() == pixelSourceProdID); + //DBG// cout << "HIT NEW PIXEL DETID = " << detid.rawId() << ", Cluster [ " << cluster.key().first << " / " << cluster.key().second << " ] " << endl; + + // if requested, cut on cluster size + if (pblocks_[subdet - 1].usesSize_ && (cluster->pixels().size() > pblocks_[subdet - 1].maxSize_)) + return; + + // mark as used + //pixels[cluster.key()] = false; + assert(collectedPixels_.size() > cluster.key()); + collectedPixels_[cluster.key()] = true; + } else { // aka Strip + if (!doStrip_) + return; + const type_info &hitType = typeid(*hit); + if (hitType == typeid(SiStripRecHit2D)) { + const SiStripRecHit2D *stripHit = static_cast(hit); + //DBG// cout << "Plain RecHit 2D: " << endl; + process(stripHit->omniClusterRef(), subdet); + // int clusCharge=0; + // for ( auto cAmp : stripHit->omniClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; + // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripRecHit2D) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; + } else if (hitType == typeid(SiStripRecHit1D)) { + const SiStripRecHit1D *hit1D = static_cast(hit); + process(hit1D->omniClusterRef(), subdet); + // int clusCharge=0; + // for ( auto cAmp : hit1D->omniClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; + // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripRecHit1D) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; + } else if (hitType == typeid(SiStripMatchedRecHit2D)) { + const SiStripMatchedRecHit2D *matchHit = static_cast(hit); + //DBG// cout << "Matched RecHit 2D: " << endl; + process(matchHit->monoClusterRef(), subdet); + // int clusCharge=0; + // for ( auto cAmp : matchHit->monoClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; + // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripMatchedRecHit2D:mono) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; + + process(matchHit->stereoClusterRef(), subdet); + // clusCharge=0; + // for ( auto cAmp : matchHit->stereoClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; + // std::cout << "[HLTTrackClusterRemoverNew::process (SiStripMatchedRecHit2D:stereo) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; + + } else if (hitType == typeid(ProjectedSiStripRecHit2D)) { + const ProjectedSiStripRecHit2D *projHit = static_cast(hit); + //DBG// cout << "Projected RecHit 2D: " << endl; + process(projHit->originalHit().omniClusterRef(), subdet); + // int clusCharge=0; + // for ( auto cAmp : projHit->originalHit().omniClusterRef().stripCluster().amplitudes() ) clusCharge+=cAmp; + // std::cout << "[HLTTrackClusterRemoverNew::process (ProjectedSiStripRecHit2D) chi2: " << chi2 << " [" << subdet << " --> charge: " << clusCharge << "]" << std::endl; + } else + throw cms::Exception("NOT IMPLEMENTED") + << "Don't know how to handle " << hitType.name() << " on detid " << detid.rawId() << "\n"; + } } /* Schematic picture of n-th step Iterative removal @@ -341,108 +361,106 @@ void HLTTrackClusterRemoverNew::process(const TrackingRecHit *hit, float chi2, c * \-- Old ClusterRemovalInfo "old" ID */ +void HLTTrackClusterRemoverNew::produce(Event &iEvent, const EventSetup &iSetup) { + ProductID pixelOldProdID, stripOldProdID; -void -HLTTrackClusterRemoverNew::produce(Event& iEvent, const EventSetup& iSetup) -{ - ProductID pixelOldProdID, stripOldProdID; + edm::ESHandle tgh; + iSetup.get().get(tgh); + + edm::Handle > pixelClusters; + if (doPixel_) { + iEvent.getByToken(pixelClusters_, pixelClusters); + pixelSourceProdID = pixelClusters.id(); + } - edm::ESHandle tgh; - iSetup.get().get(tgh); + edm::Handle > stripClusters; + if (doStrip_) { + iEvent.getByToken(stripClusters_, stripClusters); + stripSourceProdID = stripClusters.id(); + } - edm::Handle > pixelClusters; - if (doPixel_) { - iEvent.getByToken(pixelClusters_, pixelClusters); - pixelSourceProdID = pixelClusters.id(); - } + //Handle trajectories; + edm::Handle > trajectories; + iEvent.getByToken(trajectories_, trajectories); + + if (mergeOld_) { + edm::Handle oldPxlMask; + edm::Handle oldStrMask; + iEvent.getByToken(oldPxlMaskToken_, oldPxlMask); + iEvent.getByToken(oldStrMaskToken_, oldStrMask); + LogDebug("TrackClusterRemover") << "to merge in, " << oldStrMask->size() << " strp and " << oldPxlMask->size() + << " pxl"; + oldStrMask->copyMaskTo(collectedRegStrips_); + oldPxlMask->copyMaskTo(collectedPixels_); + collectedRegStrips_.resize(stripClusters->dataSize(), false); + } else { + collectedRegStrips_.resize(stripClusters->dataSize(), false); + collectedPixels_.resize(pixelClusters->dataSize(), false); + } - edm::Handle > stripClusters; - if (doStrip_) { - iEvent.getByToken(stripClusters_, stripClusters); - stripSourceProdID = stripClusters.id(); - } + //for (TrajTrackAssociationCollection::const_iterator it = trajectories->begin(), ed = trajectories->end(); it != ed; ++it) { + // const Trajectory &tj = * it->key; - //Handle trajectories; - edm::Handle > trajectories; - iEvent.getByToken(trajectories_, trajectories); - - if(mergeOld_) { - edm::Handle oldPxlMask; - edm::Handle oldStrMask; - iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask); - iEvent.getByToken(oldStrMaskToken_ ,oldStrMask); - LogDebug("TrackClusterRemover")<<"to merge in, "<size()<<" strp and "<size()<<" pxl"; - oldStrMask->copyMaskTo(collectedRegStrips_); - oldPxlMask->copyMaskTo(collectedPixels_); - collectedRegStrips_.resize(stripClusters->dataSize(),false); - }else { - collectedRegStrips_.resize(stripClusters->dataSize(), false); - collectedPixels_.resize(pixelClusters->dataSize(), false); - } - - - //for (TrajTrackAssociationCollection::const_iterator it = trajectories->begin(), ed = trajectories->end(); it != ed; ++it) { - // const Trajectory &tj = * it->key; - - for (std::vector::const_iterator it = trajectories->begin(), ed = trajectories->end(); it != ed; ++it) { - const Trajectory &tj = * it; - const std::vector &tms = tj.measurements(); - - std::vector::const_iterator itm, endtm; - for (itm = tms.begin(), endtm = tms.end(); itm != endtm; ++itm) { - - const TrackingRecHit *hit = itm->recHit()->hit(); - if (!hit->isValid()) continue; - // std::cout<<"process hit"<estimate() , tgh.product()); - } + for (std::vector::const_iterator it = trajectories->begin(), ed = trajectories->end(); it != ed; ++it) { + const Trajectory &tj = *it; + const std::vector &tms = tj.measurements(); + + std::vector::const_iterator itm, endtm; + for (itm = tms.begin(), endtm = tms.end(); itm != endtm; ++itm) { + const TrackingRecHit *hit = itm->recHit()->hit(); + if (!hit->isValid()) + continue; + // std::cout<<"process hit"<estimate(), tgh.product()); } - - - // std::cout << " => collectedRegStrips_: " << collectedRegStrips_.size() << std::endl; - // std::cout << " total strip to skip (before charge check): "<size() << std::endl; - - - auto const & clusters = stripClusters->data(); - for (auto const & item : stripClusters->ids()) { - - if (!item.isValid()) continue; // not umpacked - - DetId detid = item.id; - uint32_t subdet = detid.subdetId(); - if (!pblocks_[subdet-1].cutOnStripCharge_) continue; - - // std::cout << " i: " << i << " --> detid: " << detid << " --> subdet: " << subdet << std::endl; - - for (int i = item.offset; i collectedRegStrips_: " << collectedRegStrips_.size() << std::endl; + // std::cout << " total strip to skip (before charge check): "<size() << std::endl; + + auto const &clusters = stripClusters->data(); + for (auto const &item : stripClusters->ids()) { + if (!item.isValid()) + continue; // not umpacked + + DetId detid = item.id; + uint32_t subdet = detid.subdetId(); + if (!pblocks_[subdet - 1].cutOnStripCharge_) + continue; + + // std::cout << " i: " << i << " --> detid: " << detid << " --> subdet: " << subdet << std::endl; + + for (int i = item.offset; i < item.offset + int(item.size); ++i) { + int clusCharge = 0; + for (auto cAmp : clusters[i].amplitudes()) + clusCharge += cAmp; + + // if (clusCharge < pblocks_[subdet-1].minGoodStripCharge_) std::cout << " clusCharge: " << clusCharge << std::endl; + if (clusCharge < pblocks_[subdet - 1].minGoodStripCharge_) + collectedRegStrips_[i] = true; // (|= does not work!) } } - - // std::cout << " => collectedRegStrips_: " << collectedRegStrips_.size() << std::endl; - // std::cout << " total strip to skip: "<(edm::RefProd >(stripClusters),collectedRegStrips_)); - - LogDebug("TrackClusterRemover")<<"total pxl to skip: "<(edm::RefProd >(pixelClusters),collectedPixels_)); - - collectedRegStrips_.clear(); - collectedPixels_.clear(); - - + } + + // std::cout << " => collectedRegStrips_: " << collectedRegStrips_.size() << std::endl; + // std::cout << " total strip to skip: "<(edm::RefProd >(stripClusters), + collectedRegStrips_)); + + LogDebug("TrackClusterRemover") << "total pxl to skip: " + << std::count(collectedPixels_.begin(), collectedPixels_.end(), true); + iEvent.put(std::make_unique(edm::RefProd >(pixelClusters), + collectedPixels_)); + + collectedRegStrips_.clear(); + collectedPixels_.clear(); } #include "FWCore/PluginManager/interface/ModuleDef.h" diff --git a/RecoLocalTracker/SubCollectionProducers/src/JetCoreClusterSplitter.cc b/RecoLocalTracker/SubCollectionProducers/src/JetCoreClusterSplitter.cc index deb122a9bdfbf..b6a69cae8037f 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/JetCoreClusterSplitter.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/JetCoreClusterSplitter.cc @@ -24,35 +24,36 @@ #include class JetCoreClusterSplitter : public edm::stream::EDProducer<> { - public: +public: JetCoreClusterSplitter(const edm::ParameterSet& iConfig); ~JetCoreClusterSplitter() override; void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override; - private: +private: bool split(const SiPixelCluster& aCluster, edmNew::DetSetVector::FastFiller& filler, - float expectedADC, int sizeY, int sizeX, float jetZOverRho); + float expectedADC, + int sizeY, + int sizeX, + float jetZOverRho); std::vector fittingSplit(const SiPixelCluster& aCluster, - float expectedADC, int sizeY, - int sizeX, float jetZOverRho, + float expectedADC, + int sizeY, + int sizeX, + float jetZOverRho, unsigned int nSplitted); - std::pair closestClusters( - const std::vector& distanceMap); - std::multimap secondDistDiffScore( - const std::vector >& distanceMap); - std::multimap secondDistScore( - const std::vector >& distanceMap); - std::multimap distScore( - const std::vector >& distanceMap); + std::pair closestClusters(const std::vector& distanceMap); + std::multimap secondDistDiffScore(const std::vector>& distanceMap); + std::multimap secondDistScore(const std::vector>& distanceMap); + std::multimap distScore(const std::vector>& distanceMap); bool verbose; std::string pixelCPE_; double ptMin_; double deltaR_; double chargeFracMin_; - edm::EDGetTokenT > pixelClusters_; + edm::EDGetTokenT> pixelClusters_; edm::EDGetTokenT vertices_; - edm::EDGetTokenT > cores_; + edm::EDGetTokenT> cores_; double forceXError_; double forceYError_; double fractionalWidth_; @@ -66,12 +67,10 @@ JetCoreClusterSplitter::JetCoreClusterSplitter(const edm::ParameterSet& iConfig) ptMin_(iConfig.getParameter("ptMin")), deltaR_(iConfig.getParameter("deltaRmax")), chargeFracMin_(iConfig.getParameter("chargeFractionMin")), - pixelClusters_(consumes >( - iConfig.getParameter("pixelClusters"))), - vertices_(consumes( - iConfig.getParameter("vertices"))), - cores_(consumes >( - iConfig.getParameter("cores"))), + pixelClusters_( + consumes>(iConfig.getParameter("pixelClusters"))), + vertices_(consumes(iConfig.getParameter("vertices"))), + cores_(consumes>(iConfig.getParameter("cores"))), forceXError_(iConfig.getParameter("forceXError")), forceYError_(iConfig.getParameter("forceYError")), fractionalWidth_(iConfig.getParameter("fractionalWidth")), @@ -79,30 +78,26 @@ JetCoreClusterSplitter::JetCoreClusterSplitter(const edm::ParameterSet& iConfig) centralMIPCharge_(iConfig.getParameter("centralMIPCharge")) { - produces >(); + produces>(); } JetCoreClusterSplitter::~JetCoreClusterSplitter() {} -bool SortPixels(const SiPixelCluster::Pixel& i, - const SiPixelCluster::Pixel& j) { - return (i.adc > j.adc); -} +bool SortPixels(const SiPixelCluster::Pixel& i, const SiPixelCluster::Pixel& j) { return (i.adc > j.adc); } -void JetCoreClusterSplitter::produce(edm::Event& iEvent, - const edm::EventSetup& iSetup) { +void JetCoreClusterSplitter::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { using namespace edm; edm::ESHandle geometry; iSetup.get().get(geometry); - Handle > inputPixelClusters; + Handle> inputPixelClusters; iEvent.getByToken(pixelClusters_, inputPixelClusters); - Handle > vertices; + Handle> vertices; iEvent.getByToken(vertices_, vertices); const reco::Vertex& pv = (*vertices)[0]; - Handle > cores; + Handle> cores; iEvent.getByToken(cores_, cores); edm::ESHandle pe; @@ -112,21 +107,17 @@ void JetCoreClusterSplitter::produce(edm::Event& iEvent, auto output = std::make_unique>(); - edmNew::DetSetVector::const_iterator detIt = - inputPixelClusters->begin(); + edmNew::DetSetVector::const_iterator detIt = inputPixelClusters->begin(); for (; detIt != inputPixelClusters->end(); detIt++) { - edmNew::DetSetVector::FastFiller filler(*output, - detIt->id()); + edmNew::DetSetVector::FastFiller filler(*output, detIt->id()); const edmNew::DetSet& detset = *detIt; const GeomDet* det = geometry->idToDet(detset.id()); - for (auto cluster = detset.begin(); - cluster != detset.end(); cluster++) { + for (auto cluster = detset.begin(); cluster != detset.end(); cluster++) { const SiPixelCluster& aCluster = *cluster; bool hasBeenSplit = false; bool shouldBeSplit = false; - GlobalPoint cPos = det->surface().toGlobal( - pp->localParametersV(aCluster, - (*geometry->idToDetUnit(detIt->id())))[0].first); + GlobalPoint cPos = + det->surface().toGlobal(pp->localParametersV(aCluster, (*geometry->idToDetUnit(detIt->id())))[0].first); GlobalPoint ppv(pv.position().x(), pv.position().y(), pv.position().z()); GlobalVector clusterDir = cPos - ppv; for (unsigned int ji = 0; ji < cores->size(); ji++) { @@ -136,39 +127,32 @@ void JetCoreClusterSplitter::produce(edm::Event& iEvent, if (Geom::deltaR(jetDir, clusterDir) < deltaR_) { // check if the cluster has to be splitted - bool isEndCap = - (std::abs(cPos.z()) > 30.f); // FIXME: check detID instead! + bool isEndCap = (std::abs(cPos.z()) > 30.f); // FIXME: check detID instead! float jetZOverRho = jet.momentum().Z() / jet.momentum().Rho(); if (isEndCap) jetZOverRho = jet.momentum().Rho() / jet.momentum().Z(); - float expSizeY = - std::sqrt((1.3f*1.3f) + (1.9f*1.9f) * jetZOverRho*jetZOverRho); - if (expSizeY < 1.f) expSizeY = 1.f; + float expSizeY = std::sqrt((1.3f * 1.3f) + (1.9f * 1.9f) * jetZOverRho * jetZOverRho); + if (expSizeY < 1.f) + expSizeY = 1.f; float expSizeX = 1.5f; if (isEndCap) { expSizeX = expSizeY; expSizeY = 1.5f; } // in endcap col/rows are switched - float expCharge = - std::sqrt(1.08f + jetZOverRho * jetZOverRho) * centralMIPCharge_; + float expCharge = std::sqrt(1.08f + jetZOverRho * jetZOverRho) * centralMIPCharge_; if (aCluster.charge() > expCharge * chargeFracMin_ && - (aCluster.sizeX() > expSizeX + 1 || - aCluster.sizeY() > expSizeY + 1)) { + (aCluster.sizeX() > expSizeX + 1 || aCluster.sizeY() > expSizeY + 1)) { shouldBeSplit = true; if (verbose) - std::cout << "Trying to split: charge and deltaR " - << aCluster.charge() << " " - << Geom::deltaR(jetDir, clusterDir) << " size x y " - << aCluster.sizeX() << " " << aCluster.sizeY() - << " exp. size (x,y) " - << expSizeX << " " << expSizeY - << " detid " << detIt->id() << std::endl; + std::cout << "Trying to split: charge and deltaR " << aCluster.charge() << " " + << Geom::deltaR(jetDir, clusterDir) << " size x y " << aCluster.sizeX() << " " + << aCluster.sizeY() << " exp. size (x,y) " << expSizeX << " " << expSizeY << " detid " + << detIt->id() << std::endl; if (verbose) std::cout << "jetZOverRho=" << jetZOverRho << std::endl; - if (split(aCluster, filler, expCharge, expSizeY, expSizeX, - jetZOverRho)) { + if (split(aCluster, filler, expCharge, expSizeY, expSizeX, jetZOverRho)) { hasBeenSplit = true; } } @@ -180,46 +164,48 @@ void JetCoreClusterSplitter::produce(edm::Event& iEvent, if (shouldBeSplit) { // blowup the error if we failed to split a splittable cluster (does // it ever happen) - c.setSplitClusterErrorX(c.sizeX() * (100.f/3.f)); // this is not really blowing up .. TODO: tune - c.setSplitClusterErrorY(c.sizeY() * (150.f/3.f)); + c.setSplitClusterErrorX(c.sizeX() * (100.f / 3.f)); // this is not really blowing up .. TODO: tune + c.setSplitClusterErrorY(c.sizeY() * (150.f / 3.f)); } filler.push_back(c); - std::push_heap(filler.begin(),filler.end(), - [](SiPixelCluster const & cl1,SiPixelCluster const & cl2) { return cl1.minPixelRow() < cl2.minPixelRow();}); - + std::push_heap(filler.begin(), filler.end(), [](SiPixelCluster const& cl1, SiPixelCluster const& cl2) { + return cl1.minPixelRow() < cl2.minPixelRow(); + }); } - }// loop over clusters - std::sort_heap(filler.begin(),filler.end(), - [](SiPixelCluster const & cl1,SiPixelCluster const & cl2) { return cl1.minPixelRow() < cl2.minPixelRow();}); + } // loop over clusters + std::sort_heap(filler.begin(), filler.end(), [](SiPixelCluster const& cl1, SiPixelCluster const& cl2) { + return cl1.minPixelRow() < cl2.minPixelRow(); + }); } // loop over det iEvent.put(std::move(output)); } -bool JetCoreClusterSplitter::split( - const SiPixelCluster& aCluster, - edmNew::DetSetVector::FastFiller& filler, float expectedADC, - int sizeY, int sizeX, float jetZOverRho) { +bool JetCoreClusterSplitter::split(const SiPixelCluster& aCluster, + edmNew::DetSetVector::FastFiller& filler, + float expectedADC, + int sizeY, + int sizeX, + float jetZOverRho) { // This function should test several configuration of splitting, and then // return the one with best chi2 - std::vector sp = - fittingSplit(aCluster, expectedADC, sizeY, sizeX, jetZOverRho, - std::floor(aCluster.charge() / expectedADC + 0.5f)); + std::vector sp = fittingSplit( + aCluster, expectedADC, sizeY, sizeX, jetZOverRho, std::floor(aCluster.charge() / expectedADC + 0.5f)); // for the config with best chi2 for (unsigned int i = 0; i < sp.size(); i++) { filler.push_back(sp[i]); - std::push_heap(filler.begin(),filler.end(), - [](SiPixelCluster const & cl1,SiPixelCluster const & cl2) { return cl1.minPixelRow() < cl2.minPixelRow();}); + std::push_heap(filler.begin(), filler.end(), [](SiPixelCluster const& cl1, SiPixelCluster const& cl2) { + return cl1.minPixelRow() < cl2.minPixelRow(); + }); } return (!sp.empty()); } // order with fast algo and pick first and second instead? -std::pair JetCoreClusterSplitter::closestClusters( - const std::vector& distanceMap) { +std::pair JetCoreClusterSplitter::closestClusters(const std::vector& distanceMap) { float minDist = std::numeric_limits::max(); float secondMinDist = std::numeric_limits::max(); for (unsigned int i = 0; i < distanceMap.size(); i++) { @@ -235,7 +221,7 @@ std::pair JetCoreClusterSplitter::closestClusters( } std::multimap JetCoreClusterSplitter::secondDistDiffScore( - const std::vector >& distanceMap) { + const std::vector>& distanceMap) { std::multimap scores; for (unsigned int j = 0; j < distanceMap.size(); j++) { std::pair d = closestClusters(distanceMap[j]); @@ -244,8 +230,7 @@ std::multimap JetCoreClusterSplitter::secondDistDiffScore( return scores; } -std::multimap JetCoreClusterSplitter::secondDistScore( - const std::vector >& distanceMap) { +std::multimap JetCoreClusterSplitter::secondDistScore(const std::vector>& distanceMap) { std::multimap scores; for (unsigned int j = 0; j < distanceMap.size(); j++) { std::pair d = closestClusters(distanceMap[j]); @@ -254,8 +239,7 @@ std::multimap JetCoreClusterSplitter::secondDistScore( return scores; } -std::multimap JetCoreClusterSplitter::distScore( - const std::vector >& distanceMap) { +std::multimap JetCoreClusterSplitter::distScore(const std::vector>& distanceMap) { std::multimap scores; for (unsigned int j = 0; j < distanceMap.size(); j++) { std::pair d = closestClusters(distanceMap[j]); @@ -264,9 +248,12 @@ std::multimap JetCoreClusterSplitter::distScore( return scores; } -std::vector JetCoreClusterSplitter::fittingSplit( - const SiPixelCluster& aCluster, float expectedADC, int sizeY, int sizeX, - float jetZOverRho, unsigned int nSplitted) { +std::vector JetCoreClusterSplitter::fittingSplit(const SiPixelCluster& aCluster, + float expectedADC, + int sizeY, + int sizeX, + float jetZOverRho, + unsigned int nSplitted) { std::vector output; unsigned int meanExp = nSplitted; @@ -281,22 +268,20 @@ std::vector JetCoreClusterSplitter::fittingSplit( std::vector oldclx(meanExp); std::vector oldcly(meanExp); std::vector originalpixels = aCluster.pixels(); - std::vector > pixels; + std::vector> pixels; for (unsigned int j = 0; j < originalpixels.size(); j++) { - int sub = originalpixels[j].adc / chargePerUnit_ * expectedADC / - centralMIPCharge_; - if (sub < 1) sub = 1; + int sub = originalpixels[j].adc / chargePerUnit_ * expectedADC / centralMIPCharge_; + if (sub < 1) + sub = 1; int perDiv = originalpixels[j].adc / sub; if (verbose) - std::cout << "Splitting " << j << " in [ " << pixels.size() << " , " - << pixels.size() + sub << " ], expected numb of clusters: " - << meanExp << " original pixel (x,y) " - << originalpixels[j].x << " " << originalpixels[j].y - << " sub " << sub << std::endl; + std::cout << "Splitting " << j << " in [ " << pixels.size() << " , " << pixels.size() + sub + << " ], expected numb of clusters: " << meanExp << " original pixel (x,y) " << originalpixels[j].x + << " " << originalpixels[j].y << " sub " << sub << std::endl; for (int k = 0; k < sub; k++) { - if (k == sub - 1) perDiv = originalpixels[j].adc - perDiv * k; - pixels.push_back(std::make_pair(j, SiPixelCluster::Pixel(originalpixels[j].x, - originalpixels[j].y, perDiv))); + if (k == sub - 1) + perDiv = originalpixels[j].adc - perDiv * k; + pixels.push_back(std::make_pair(j, SiPixelCluster::Pixel(originalpixels[j].x, originalpixels[j].y, perDiv))); } } std::vector clusterForPixel(pixels.size()); @@ -313,42 +298,34 @@ std::vector JetCoreClusterSplitter::fittingSplit( while (!stop && remainingSteps > 0) { remainingSteps--; // Compute all distances - std::vector > distanceMapX(originalpixels.size(), - std::vector(meanExp)); - std::vector > distanceMapY(originalpixels.size(), - std::vector(meanExp)); - std::vector > distanceMap(originalpixels.size(), - std::vector(meanExp)); + std::vector> distanceMapX(originalpixels.size(), std::vector(meanExp)); + std::vector> distanceMapY(originalpixels.size(), std::vector(meanExp)); + std::vector> distanceMap(originalpixels.size(), std::vector(meanExp)); for (unsigned int j = 0; j < originalpixels.size(); j++) { if (verbose) - std::cout << "Original Pixel pos " << j << " " << pixels[j].second.x << " " - << pixels[j].second.y << std::endl; + std::cout << "Original Pixel pos " << j << " " << pixels[j].second.x << " " << pixels[j].second.y << std::endl; for (unsigned int i = 0; i < meanExp; i++) { distanceMapX[j][i] = 1.f * originalpixels[j].x - clx[i]; distanceMapY[j][i] = 1.f * originalpixels[j].y - cly[i]; float dist = 0; // float sizeX=2; - if (std::abs(distanceMapX[j][i]) > sizeX/2.f) { - dist += (std::abs(distanceMapX[j][i]) - sizeX/2.f + 1.f) * - (std::abs(distanceMapX[j][i]) - sizeX/2.f + 1.f); - } else { + if (std::abs(distanceMapX[j][i]) > sizeX / 2.f) { dist += - (2.f*distanceMapX[j][i]/sizeX)*(2.f*distanceMapX[j][i]/sizeX); + (std::abs(distanceMapX[j][i]) - sizeX / 2.f + 1.f) * (std::abs(distanceMapX[j][i]) - sizeX / 2.f + 1.f); + } else { + dist += (2.f * distanceMapX[j][i] / sizeX) * (2.f * distanceMapX[j][i] / sizeX); } - if (std::abs(distanceMapY[j][i]) > sizeY/2.f) { - dist += 1.f * (std::abs(distanceMapY[j][i]) - sizeY/2.f + 1.f) * - (std::abs(distanceMapY[j][i]) - sizeY/2.f + 1.f); + if (std::abs(distanceMapY[j][i]) > sizeY / 2.f) { + dist += 1.f * (std::abs(distanceMapY[j][i]) - sizeY / 2.f + 1.f) * + (std::abs(distanceMapY[j][i]) - sizeY / 2.f + 1.f); } else { - dist += 1.f * (2.f*distanceMapY[j][i]/sizeY) * - (2.f*distanceMapY[j][i]/sizeY); + dist += 1.f * (2.f * distanceMapY[j][i] / sizeY) * (2.f * distanceMapY[j][i] / sizeY); } distanceMap[j][i] = sqrt(dist); if (verbose) - std::cout << "Cluster " << i << " Original Pixel " << j - << " distances: " << distanceMapX[j][i] << " " - << distanceMapY[j][i] << " " << distanceMap[j][i] - << std::endl; + std::cout << "Cluster " << i << " Original Pixel " << j << " distances: " << distanceMapX[j][i] << " " + << distanceMapY[j][i] << " " << distanceMap[j][i] << std::endl; } } // Compute scores for sequential addition. The first index is the @@ -362,15 +339,13 @@ std::vector JetCoreClusterSplitter::fittingSplit( // Iterate starting from the ones with furthest second best clusters, i.e. // easy choices std::vector weightOfPixel(pixels.size()); - for (std::multimap::iterator it = scores.begin(); - it != scores.end(); it++) { + for (std::multimap::iterator it = scores.begin(); it != scores.end(); it++) { int pixel_index = it->second; if (verbose) std::cout << "Original Pixel " << pixel_index << " with score " << it->first << std::endl; // find cluster that is both close and has some charge still to assign int subpixel_counter = 0; - for (auto subpixel = pixels.begin(); subpixel != pixels.end(); - ++subpixel, ++subpixel_counter) { + for (auto subpixel = pixels.begin(); subpixel != pixels.end(); ++subpixel, ++subpixel_counter) { if (subpixel->first > pixel_index) { break; } else if (subpixel->first != pixel_index) { @@ -378,18 +353,15 @@ std::vector JetCoreClusterSplitter::fittingSplit( } else { float maxEst = 0; int cl = -1; - for (unsigned int subcluster_index = 0; - subcluster_index < meanExp; subcluster_index++) { - float nsig = - (cls[subcluster_index] - expectedADC) / - (expectedADC * - fractionalWidth_); // 20% uncertainty? realistic from Landau? + for (unsigned int subcluster_index = 0; subcluster_index < meanExp; subcluster_index++) { + float nsig = (cls[subcluster_index] - expectedADC) / + (expectedADC * fractionalWidth_); // 20% uncertainty? realistic from Landau? float clQest = 1.f / (1.f + std::exp(nsig)) + 1e-6f; // 1./(1.+exp(x*x-3*3)) float clDest = 1.f / (distanceMap[pixel_index][subcluster_index] + 0.05f); if (verbose) - std::cout << " Q: " << clQest << " D: " << clDest << " " - << distanceMap[pixel_index][subcluster_index] << std::endl; + std::cout << " Q: " << clQest << " D: " << clDest << " " << distanceMap[pixel_index][subcluster_index] + << std::endl; float est = clQest * clDest; if (est > maxEst) { cl = subcluster_index; @@ -400,16 +372,14 @@ std::vector JetCoreClusterSplitter::fittingSplit( clusterForPixel[subpixel_counter] = cl; weightOfPixel[subpixel_counter] = maxEst; if (verbose) - std::cout << "Pixel weight j cl " << weightOfPixel[subpixel_counter] - << " " << subpixel_counter - << " " << cl << std::endl; + std::cout << "Pixel weight j cl " << weightOfPixel[subpixel_counter] << " " << subpixel_counter << " " << cl + << std::endl; } } } // Recompute cluster centers stop = true; - for (unsigned int subcluster_index = 0; - subcluster_index < meanExp; subcluster_index++) { + for (unsigned int subcluster_index = 0; subcluster_index < meanExp; subcluster_index++) { if (std::abs(clx[subcluster_index] - oldclx[subcluster_index]) > 0.01f) stop = false; // still moving if (std::abs(cly[subcluster_index] - oldcly[subcluster_index]) > 0.01f) @@ -420,63 +390,54 @@ std::vector JetCoreClusterSplitter::fittingSplit( cly[subcluster_index] = 0; cls[subcluster_index] = 1e-99; } - for (unsigned int pixel_index = 0; - pixel_index < pixels.size(); pixel_index++) { - if (clusterForPixel[pixel_index] < 0) continue; + for (unsigned int pixel_index = 0; pixel_index < pixels.size(); pixel_index++) { + if (clusterForPixel[pixel_index] < 0) + continue; if (verbose) std::cout << "j " << pixel_index << " x " << pixels[pixel_index].second.x << " * y " - << pixels[pixel_index].second.y << " * ADC " - << pixels[pixel_index].second.adc << " * W " + << pixels[pixel_index].second.y << " * ADC " << pixels[pixel_index].second.adc << " * W " << weightOfPixel[pixel_index] << std::endl; clx[clusterForPixel[pixel_index]] += pixels[pixel_index].second.x * pixels[pixel_index].second.adc; cly[clusterForPixel[pixel_index]] += pixels[pixel_index].second.y * pixels[pixel_index].second.adc; cls[clusterForPixel[pixel_index]] += pixels[pixel_index].second.adc; } - for (unsigned int subcluster_index = 0; - subcluster_index < meanExp; subcluster_index++) { + for (unsigned int subcluster_index = 0; subcluster_index < meanExp; subcluster_index++) { if (cls[subcluster_index] != 0) { clx[subcluster_index] /= cls[subcluster_index]; cly[subcluster_index] /= cls[subcluster_index]; } if (verbose) - std::cout << "Center for cluster " << subcluster_index << " x,y " - << clx[subcluster_index] << " " + std::cout << "Center for cluster " << subcluster_index << " x,y " << clx[subcluster_index] << " " << cly[subcluster_index] << std::endl; cls[subcluster_index] = 0; } } - if (verbose) std::cout << "maxstep " << remainingSteps << std::endl; + if (verbose) + std::cout << "maxstep " << remainingSteps << std::endl; // accumulate pixel with same cl - std::vector > pixelsForCl(meanExp); + std::vector> pixelsForCl(meanExp); for (int cl = 0; cl < (int)meanExp; cl++) { for (unsigned int j = 0; j < pixels.size(); j++) { - if (clusterForPixel[j] == cl and - pixels[j].second.adc != 0) { // for each pixel of cluster - // cl find the other pixels - // with same x,y and - // accumulate+reset their adc + if (clusterForPixel[j] == cl and pixels[j].second.adc != 0) { // for each pixel of cluster + // cl find the other pixels + // with same x,y and + // accumulate+reset their adc for (unsigned int k = j + 1; k < pixels.size(); k++) { - if (pixels[k].second.adc != 0 - and pixels[k].second.x == pixels[j].second.x - and pixels[k].second.y == pixels[j].second.y - and clusterForPixel[k] == cl) { + if (pixels[k].second.adc != 0 and pixels[k].second.x == pixels[j].second.x and + pixels[k].second.y == pixels[j].second.y and clusterForPixel[k] == cl) { if (verbose) - std::cout << "Resetting all sub-pixel for location " - << pixels[k].second.x << ", " << pixels[k].second.y - << " at index " << k << " associated to cl " - << clusterForPixel[k] << std::endl; + std::cout << "Resetting all sub-pixel for location " << pixels[k].second.x << ", " << pixels[k].second.y + << " at index " << k << " associated to cl " << clusterForPixel[k] << std::endl; pixels[j].second.adc += pixels[k].second.adc; pixels[k].second.adc = 0; } } for (unsigned int p = 0; p < pixels.size(); ++p) if (verbose) - std::cout << "index, x, y, ADC: " << p << ", " - << pixels[p].second.x << ", " << pixels[p].second.y - << ", " << pixels[p].second.adc - << " associated to cl " << clusterForPixel[p] << std::endl - << "Adding pixel " << pixels[j].second.x << ", " << pixels[j].second.y - << " to cluster " << cl << std::endl; + std::cout << "index, x, y, ADC: " << p << ", " << pixels[p].second.x << ", " << pixels[p].second.y << ", " + << pixels[p].second.adc << " associated to cl " << clusterForPixel[p] << std::endl + << "Adding pixel " << pixels[j].second.x << ", " << pixels[j].second.y << " to cluster " << cl + << std::endl; pixelsForCl[cl].push_back(pixels[j].second); } } @@ -487,22 +448,25 @@ std::vector JetCoreClusterSplitter::fittingSplit( //>(512,std::vector(512,0))); for (int cl = 0; cl < (int)meanExp; cl++) { - if (verbose) std::cout << "Pixels of cl " << cl << " "; + if (verbose) + std::cout << "Pixels of cl " << cl << " "; for (unsigned int j = 0; j < pixelsForCl[cl].size(); j++) { - SiPixelCluster::PixelPos newpix(pixelsForCl[cl][j].x, - pixelsForCl[cl][j].y); + SiPixelCluster::PixelPos newpix(pixelsForCl[cl][j].x, pixelsForCl[cl][j].y); if (verbose) std::cout << pixelsForCl[cl][j].x << "," << pixelsForCl[cl][j].y << "|"; - if (j==0) { + if (j == 0) { output.emplace_back(newpix, pixelsForCl[cl][j].adc); } else { output.back().add(newpix, pixelsForCl[cl][j].adc); } } - if (verbose) std::cout << std::endl; + if (verbose) + std::cout << std::endl; if (!pixelsForCl[cl].empty()) { - if (forceXError_ > 0) output.back().setSplitClusterErrorX(forceXError_); - if (forceYError_ > 0) output.back().setSplitClusterErrorY(forceYError_); + if (forceXError_ > 0) + output.back().setSplitClusterErrorX(forceXError_); + if (forceYError_ > 0) + output.back().setSplitClusterErrorY(forceYError_); } } // if(verbose) std::cout << "Weights" << std::endl; diff --git a/RecoLocalTracker/SubCollectionProducers/src/PixelClusterSelectorTopBottom.cc b/RecoLocalTracker/SubCollectionProducers/src/PixelClusterSelectorTopBottom.cc index 95330f1e9a49d..ddff02e19af6c 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/PixelClusterSelectorTopBottom.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/PixelClusterSelectorTopBottom.cc @@ -1,36 +1,35 @@ #include "FWCore/Framework/interface/MakerMacros.h" #include "RecoLocalTracker/SubCollectionProducers/interface/PixelClusterSelectorTopBottom.h" -void PixelClusterSelectorTopBottom::produce( edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const { - - edm::Handle< SiPixelClusterCollectionNew > input; +void PixelClusterSelectorTopBottom::produce(edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const { + edm::Handle input; event.getByToken(token_, input); edm::ESHandle geom; - setup.get().get( geom ); - const TrackerGeometry& theTracker( *geom ); - + setup.get().get(geom); + const TrackerGeometry& theTracker(*geom); + auto output = std::make_unique(); - for (SiPixelClusterCollectionNew::const_iterator clustSet = input->begin(); clustSet!=input->end(); ++clustSet) { + for (SiPixelClusterCollectionNew::const_iterator clustSet = input->begin(); clustSet != input->end(); ++clustSet) { edmNew::DetSet::const_iterator clustIt = clustSet->begin(); - edmNew::DetSet::const_iterator end = clustSet->end(); - - DetId detIdObject( clustSet->detId() ); + edmNew::DetSet::const_iterator end = clustSet->end(); + + DetId detIdObject(clustSet->detId()); edmNew::DetSetVector::FastFiller spc(*output, detIdObject); - const PixelGeomDetUnit* theGeomDet = dynamic_cast (theTracker.idToDet(detIdObject) ); - const PixelTopology * topol = (&(theGeomDet->specificTopology())); - - for(; clustIt!=end;++clustIt) { - LocalPoint lpclust = topol->localPosition(MeasurementPoint((*clustIt).x(),(*clustIt).y())); - GlobalPoint GPclust = theGeomDet->surface().toGlobal(Local3DPoint(lpclust.x(),lpclust.y(),lpclust.z())); + const PixelGeomDetUnit* theGeomDet = dynamic_cast(theTracker.idToDet(detIdObject)); + const PixelTopology* topol = (&(theGeomDet->specificTopology())); + + for (; clustIt != end; ++clustIt) { + LocalPoint lpclust = topol->localPosition(MeasurementPoint((*clustIt).x(), (*clustIt).y())); + GlobalPoint GPclust = theGeomDet->surface().toGlobal(Local3DPoint(lpclust.x(), lpclust.y(), lpclust.z())); double clustY = GPclust.y(); if ((clustY * y_) > 0) { - spc.push_back(*clustIt); + spc.push_back(*clustIt); } } } - event.put(std::move(output)); + event.put(std::move(output)); } -DEFINE_FWK_MODULE( PixelClusterSelectorTopBottom ); +DEFINE_FWK_MODULE(PixelClusterSelectorTopBottom); diff --git a/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemover.cc b/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemover.cc index be2dbcbb47950..2e5b62f848dff 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemover.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemover.cc @@ -34,260 +34,276 @@ // class SeedClusterRemover : public edm::stream::EDProducer<> { - public: - SeedClusterRemover(const edm::ParameterSet& iConfig) ; - void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override ; - private: - struct ParamBlock { - ParamBlock() : isSet_(false), usesCharge_(false) {} - ParamBlock(const edm::ParameterSet& iConfig) : - isSet_(true), - usesCharge_(iConfig.exists("maxCharge")), - usesSize_(iConfig.exists("maxSize")), - maxChi2_(iConfig.getParameter("maxChi2")), - maxCharge_(usesCharge_ ? iConfig.getParameter("maxCharge") : 0), - maxSize_(usesSize_ ? iConfig.getParameter("maxSize") : 0) { } - bool isSet_, usesCharge_, usesSize_; - float maxChi2_, maxCharge_; - size_t maxSize_; - }; - static const unsigned int NumberOfParamBlocks = 6; - - bool doStrip_, doPixel_; - bool mergeOld_; - - typedef edm::ContainerMask > PixelMaskContainer; - typedef edm::ContainerMask > StripMaskContainer; - edm::EDGetTokenT > pixelClusters_; - edm::EDGetTokenT > stripClusters_; - edm::EDGetTokenT oldPxlMaskToken_; - edm::EDGetTokenT oldStrMaskToken_; - edm::EDGetTokenT trajectories_; - - - ParamBlock pblocks_[NumberOfParamBlocks]; - void readPSet(const edm::ParameterSet& iConfig, const std::string &name, - int id1=-1, int id2=-1, int id3=-1, int id4=-1, int id5=-1, int id6=-1) ; - - std::vector pixels, strips; // avoid unneed alloc/dealloc of this - edm::ProductID pixelSourceProdID, stripSourceProdID; // ProdIDs refs must point to (for consistency tests) - - inline void process(const TrackingRecHit *hit, float chi2, const TrackerGeometry* tg); - inline void process(const OmniClusterRef & cluRef, uint32_t subdet); - +public: + SeedClusterRemover(const edm::ParameterSet &iConfig); + void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; + +private: + struct ParamBlock { + ParamBlock() : isSet_(false), usesCharge_(false) {} + ParamBlock(const edm::ParameterSet &iConfig) + : isSet_(true), + usesCharge_(iConfig.exists("maxCharge")), + usesSize_(iConfig.exists("maxSize")), + maxChi2_(iConfig.getParameter("maxChi2")), + maxCharge_(usesCharge_ ? iConfig.getParameter("maxCharge") : 0), + maxSize_(usesSize_ ? iConfig.getParameter("maxSize") : 0) {} + bool isSet_, usesCharge_, usesSize_; + float maxChi2_, maxCharge_; + size_t maxSize_; + }; + static const unsigned int NumberOfParamBlocks = 6; + + bool doStrip_, doPixel_; + bool mergeOld_; + + typedef edm::ContainerMask > PixelMaskContainer; + typedef edm::ContainerMask > StripMaskContainer; + edm::EDGetTokenT > pixelClusters_; + edm::EDGetTokenT > stripClusters_; + edm::EDGetTokenT oldPxlMaskToken_; + edm::EDGetTokenT oldStrMaskToken_; + edm::EDGetTokenT trajectories_; + + ParamBlock pblocks_[NumberOfParamBlocks]; + void readPSet(const edm::ParameterSet &iConfig, + const std::string &name, + int id1 = -1, + int id2 = -1, + int id3 = -1, + int id4 = -1, + int id5 = -1, + int id6 = -1); + + std::vector pixels, strips; // avoid unneed alloc/dealloc of this + edm::ProductID pixelSourceProdID, stripSourceProdID; // ProdIDs refs must point to (for consistency tests) + + inline void process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg); + inline void process(const OmniClusterRef &cluRef, uint32_t subdet); std::vector collectedStrips_; std::vector collectedPixels_; }; - using namespace std; using namespace edm; -void -SeedClusterRemover::readPSet(const edm::ParameterSet& iConfig, const std::string &name, - int id1, int id2, int id3, int id4, int id5, int id6) -{ - if (iConfig.exists(name)) { - ParamBlock pblock(iConfig.getParameter(name)); - if (id1 == -1) { - fill(pblocks_, pblocks_+NumberOfParamBlocks, pblock); - } else { - pblocks_[id1] = pblock; - if (id2 != -1) pblocks_[id2] = pblock; - if (id3 != -1) pblocks_[id3] = pblock; - if (id4 != -1) pblocks_[id4] = pblock; - if (id5 != -1) pblocks_[id5] = pblock; - if (id6 != -1) pblocks_[id6] = pblock; - } +void SeedClusterRemover::readPSet( + const edm::ParameterSet &iConfig, const std::string &name, int id1, int id2, int id3, int id4, int id5, int id6) { + if (iConfig.exists(name)) { + ParamBlock pblock(iConfig.getParameter(name)); + if (id1 == -1) { + fill(pblocks_, pblocks_ + NumberOfParamBlocks, pblock); + } else { + pblocks_[id1] = pblock; + if (id2 != -1) + pblocks_[id2] = pblock; + if (id3 != -1) + pblocks_[id3] = pblock; + if (id4 != -1) + pblocks_[id4] = pblock; + if (id5 != -1) + pblocks_[id5] = pblock; + if (id6 != -1) + pblocks_[id6] = pblock; } + } } -SeedClusterRemover::SeedClusterRemover(const ParameterSet& iConfig): - doStrip_(iConfig.existsAs("doStrip") ? iConfig.getParameter("doStrip") : true), - doPixel_(iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true), - mergeOld_(iConfig.exists("oldClusterRemovalInfo")) -{ - - fill(pblocks_, pblocks_+NumberOfParamBlocks, ParamBlock()); - readPSet(iConfig, "Common",-1); - if (doPixel_) { - readPSet(iConfig, "Pixel" ,0,1); - readPSet(iConfig, "PXB" ,0); - readPSet(iConfig, "PXE" ,1); - } - if (doStrip_) { - readPSet(iConfig, "Strip" ,2,3,4,5); - readPSet(iConfig, "StripInner" ,2,3); - readPSet(iConfig, "StripOuter" ,4,5); - readPSet(iConfig, "TIB" ,2); - readPSet(iConfig, "TID" ,3); - readPSet(iConfig, "TOB" ,4); - readPSet(iConfig, "TEC" ,5); - } - - bool usingCharge = false; - for (size_t i = 0; i < NumberOfParamBlocks; ++i) { - if (!pblocks_[i].isSet_) throw cms::Exception("Configuration Error") << "SeedClusterRemover: Missing configuration for detector with subDetID = " << (i+1); - if (pblocks_[i].usesCharge_ && !usingCharge) { - throw cms::Exception("Configuration Error") << "SeedClusterRemover: Configuration for subDetID = " << (i+1) << " uses cluster charge, which is not enabled."; - } +SeedClusterRemover::SeedClusterRemover(const ParameterSet &iConfig) + : doStrip_(iConfig.existsAs("doStrip") ? iConfig.getParameter("doStrip") : true), + doPixel_(iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true), + mergeOld_(iConfig.exists("oldClusterRemovalInfo")) { + fill(pblocks_, pblocks_ + NumberOfParamBlocks, ParamBlock()); + readPSet(iConfig, "Common", -1); + if (doPixel_) { + readPSet(iConfig, "Pixel", 0, 1); + readPSet(iConfig, "PXB", 0); + readPSet(iConfig, "PXE", 1); + } + if (doStrip_) { + readPSet(iConfig, "Strip", 2, 3, 4, 5); + readPSet(iConfig, "StripInner", 2, 3); + readPSet(iConfig, "StripOuter", 4, 5); + readPSet(iConfig, "TIB", 2); + readPSet(iConfig, "TID", 3); + readPSet(iConfig, "TOB", 4); + readPSet(iConfig, "TEC", 5); + } + + bool usingCharge = false; + for (size_t i = 0; i < NumberOfParamBlocks; ++i) { + if (!pblocks_[i].isSet_) + throw cms::Exception("Configuration Error") + << "SeedClusterRemover: Missing configuration for detector with subDetID = " << (i + 1); + if (pblocks_[i].usesCharge_ && !usingCharge) { + throw cms::Exception("Configuration Error") << "SeedClusterRemover: Configuration for subDetID = " << (i + 1) + << " uses cluster charge, which is not enabled."; } - - - trajectories_ = consumes(iConfig.getParameter("trajectories")); - if (doPixel_) pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); - if (doStrip_) stripClusters_ = consumes >(iConfig.getParameter("stripClusters")); - if (mergeOld_) { - oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); - } - - produces > >(); - produces > >(); + } + + trajectories_ = consumes(iConfig.getParameter("trajectories")); + if (doPixel_) + pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); + if (doStrip_) + stripClusters_ = consumes >(iConfig.getParameter("stripClusters")); + if (mergeOld_) { + oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + oldStrMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); + } + + produces > >(); + produces > >(); } +void SeedClusterRemover::process(OmniClusterRef const &ocluster, uint32_t subdet) { + SiStripRecHit2D::ClusterRef cluster = ocluster.cluster_strip(); + if (cluster.id() != stripSourceProdID) + throw cms::Exception("Inconsistent Data") + << "SeedClusterRemover: strip cluster ref from Product ID = " << cluster.id() + << " does not match with source cluster collection (ID = " << stripSourceProdID << ")\n."; -void SeedClusterRemover::process(OmniClusterRef const & ocluster, uint32_t subdet) { - SiStripRecHit2D::ClusterRef cluster = ocluster.cluster_strip(); - if (cluster.id() != stripSourceProdID) throw cms::Exception("Inconsistent Data") << - "SeedClusterRemover: strip cluster ref from Product ID = " << cluster.id() << - " does not match with source cluster collection (ID = " << stripSourceProdID << ")\n."; - assert(cluster.id() == stripSourceProdID); - if (pblocks_[subdet-1].usesSize_ && (cluster->amplitudes().size() > pblocks_[subdet-1].maxSize_)) return; + if (pblocks_[subdet - 1].usesSize_ && (cluster->amplitudes().size() > pblocks_[subdet - 1].maxSize_)) + return; - strips[cluster.key()] = false; + strips[cluster.key()] = false; assert(collectedStrips_.size() > cluster.key()); - collectedStrips_[cluster.key()]=true; + collectedStrips_[cluster.key()] = true; } - -void SeedClusterRemover::process(const TrackingRecHit *hit, float chi2, const TrackerGeometry* tg) { - DetId detid = hit->geographicalId(); - uint32_t subdet = detid.subdetId(); - - assert ((subdet > 0) && (subdet <= NumberOfParamBlocks)); - - // chi2 cut - if (chi2 > pblocks_[subdet-1].maxChi2_) return; - - if(GeomDetEnumerators::isTrackerPixel(tg->geomDetSubDetector(subdet))) { - if (!doPixel_) return; - // this is a pixel, and i *know* it is - const SiPixelRecHit *pixelHit = static_cast(hit); - - SiPixelRecHit::ClusterRef cluster = pixelHit->cluster(); - - if (cluster.id() != pixelSourceProdID) throw cms::Exception("Inconsistent Data") << - "SeedClusterRemover: pixel cluster ref from Product ID = " << cluster.id() << - " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; - - assert(cluster.id() == pixelSourceProdID); -//DBG// cout << "HIT NEW PIXEL DETID = " << detid.rawId() << ", Cluster [ " << cluster.key().first << " / " << cluster.key().second << " ] " << endl; - - // if requested, cut on cluster size - if (pblocks_[subdet-1].usesSize_ && (cluster->pixels().size() > pblocks_[subdet-1].maxSize_)) return; - - // mark as used - pixels[cluster.key()] = false; - - assert(collectedPixels_.size() > cluster.key()); - collectedPixels_[cluster.key()]=true; - - } else { // aka Strip - if (!doStrip_) return; - const type_info &hitType = typeid(*hit); - if (hitType == typeid(SiStripRecHit2D)) { - const SiStripRecHit2D *stripHit = static_cast(hit); -//DBG// cout << "Plain RecHit 2D: " << endl; - process(stripHit->omniClusterRef(),subdet);} - else if (hitType == typeid(SiStripRecHit1D)) { - const SiStripRecHit1D *hit1D = static_cast(hit); - process(hit1D->omniClusterRef(),subdet); - } else if (hitType == typeid(SiStripMatchedRecHit2D)) { - const SiStripMatchedRecHit2D *matchHit = static_cast(hit); -//DBG// cout << "Matched RecHit 2D: " << endl; - process(matchHit->monoClusterRef(),subdet); - process(matchHit->stereoClusterRef(),subdet); - } else if (hitType == typeid(ProjectedSiStripRecHit2D)) { - const ProjectedSiStripRecHit2D *projHit = static_cast(hit); -//DBG// cout << "Projected RecHit 2D: " << endl; - process(projHit->originalHit().omniClusterRef(),subdet); - } else throw cms::Exception("NOT IMPLEMENTED") << "Don't know how to handle " << hitType.name() << " on detid " << detid.rawId() << "\n"; - } +void SeedClusterRemover::process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg) { + DetId detid = hit->geographicalId(); + uint32_t subdet = detid.subdetId(); + + assert((subdet > 0) && (subdet <= NumberOfParamBlocks)); + + // chi2 cut + if (chi2 > pblocks_[subdet - 1].maxChi2_) + return; + + if (GeomDetEnumerators::isTrackerPixel(tg->geomDetSubDetector(subdet))) { + if (!doPixel_) + return; + // this is a pixel, and i *know* it is + const SiPixelRecHit *pixelHit = static_cast(hit); + + SiPixelRecHit::ClusterRef cluster = pixelHit->cluster(); + + if (cluster.id() != pixelSourceProdID) + throw cms::Exception("Inconsistent Data") + << "SeedClusterRemover: pixel cluster ref from Product ID = " << cluster.id() + << " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; + + assert(cluster.id() == pixelSourceProdID); + //DBG// cout << "HIT NEW PIXEL DETID = " << detid.rawId() << ", Cluster [ " << cluster.key().first << " / " << cluster.key().second << " ] " << endl; + + // if requested, cut on cluster size + if (pblocks_[subdet - 1].usesSize_ && (cluster->pixels().size() > pblocks_[subdet - 1].maxSize_)) + return; + + // mark as used + pixels[cluster.key()] = false; + + assert(collectedPixels_.size() > cluster.key()); + collectedPixels_[cluster.key()] = true; + + } else { // aka Strip + if (!doStrip_) + return; + const type_info &hitType = typeid(*hit); + if (hitType == typeid(SiStripRecHit2D)) { + const SiStripRecHit2D *stripHit = static_cast(hit); + //DBG// cout << "Plain RecHit 2D: " << endl; + process(stripHit->omniClusterRef(), subdet); + } else if (hitType == typeid(SiStripRecHit1D)) { + const SiStripRecHit1D *hit1D = static_cast(hit); + process(hit1D->omniClusterRef(), subdet); + } else if (hitType == typeid(SiStripMatchedRecHit2D)) { + const SiStripMatchedRecHit2D *matchHit = static_cast(hit); + //DBG// cout << "Matched RecHit 2D: " << endl; + process(matchHit->monoClusterRef(), subdet); + process(matchHit->stereoClusterRef(), subdet); + } else if (hitType == typeid(ProjectedSiStripRecHit2D)) { + const ProjectedSiStripRecHit2D *projHit = static_cast(hit); + //DBG// cout << "Projected RecHit 2D: " << endl; + process(projHit->originalHit().omniClusterRef(), subdet); + } else + throw cms::Exception("NOT IMPLEMENTED") + << "Don't know how to handle " << hitType.name() << " on detid " << detid.rawId() << "\n"; + } } - -void -SeedClusterRemover::produce(Event& iEvent, const EventSetup& iSetup) -{ - - edm::ESHandle tgh; - iSetup.get().get("",tgh); //is it correct to use "" ? - - Handle > pixelClusters; - if (doPixel_) { - iEvent.getByToken(pixelClusters_, pixelClusters); - pixelSourceProdID = pixelClusters.id(); - } - //DBG// std::cout << "SeedClusterRemover: Read pixel " << pixelClusters_.encode() << " = ID " << pixelSourceProdID << std::endl; - - Handle > stripClusters; - if (doStrip_) { - iEvent.getByToken(stripClusters_, stripClusters); - stripSourceProdID = stripClusters.id(); +void SeedClusterRemover::produce(Event &iEvent, const EventSetup &iSetup) { + edm::ESHandle tgh; + iSetup.get().get("", tgh); //is it correct to use "" ? + + Handle > pixelClusters; + if (doPixel_) { + iEvent.getByToken(pixelClusters_, pixelClusters); + pixelSourceProdID = pixelClusters.id(); + } + //DBG// std::cout << "SeedClusterRemover: Read pixel " << pixelClusters_.encode() << " = ID " << pixelSourceProdID << std::endl; + + Handle > stripClusters; + if (doStrip_) { + iEvent.getByToken(stripClusters_, stripClusters); + stripSourceProdID = stripClusters.id(); + } + //DBG// std::cout << "SeedClusterRemover: Read strip " << stripClusters_.encode() << " = ID " << stripSourceProdID << std::endl; + + if (doStrip_) { + strips.resize(stripClusters->dataSize()); + fill(strips.begin(), strips.end(), true); + } + if (doPixel_) { + pixels.resize(pixelClusters->dataSize()); + fill(pixels.begin(), pixels.end(), true); + } + if (mergeOld_) { + edm::Handle oldPxlMask; + edm::Handle oldStrMask; + iEvent.getByToken(oldPxlMaskToken_, oldPxlMask); + iEvent.getByToken(oldStrMaskToken_, oldStrMask); + LogDebug("SeedClusterRemover") << "to merge in, " << oldStrMask->size() << " strp and " << oldPxlMask->size() + << " pxl"; + oldStrMask->copyMaskTo(collectedStrips_); + oldPxlMask->copyMaskTo(collectedPixels_); + assert(stripClusters->dataSize() >= collectedStrips_.size()); + collectedStrips_.resize(stripClusters->dataSize(), false); // for ondemand + } else { + collectedStrips_.resize(stripClusters->dataSize(), false); + collectedPixels_.resize(pixelClusters->dataSize(), false); + } + + edm::Handle seeds; + iEvent.getByToken(trajectories_, seeds); + + for (auto const &seed : (*seeds)) { + auto hits = seed.recHits(); + auto hit = hits.first; + for (; hit != hits.second; ++hit) { + if (!hit->isValid()) + continue; + process(&(*hit), 0., tgh.product()); } - //DBG// std::cout << "SeedClusterRemover: Read strip " << stripClusters_.encode() << " = ID " << stripSourceProdID << std::endl; - + } - if (doStrip_) { - strips.resize(stripClusters->dataSize()); fill(strips.begin(), strips.end(), true); - } - if (doPixel_) { - pixels.resize(pixelClusters->dataSize()); fill(pixels.begin(), pixels.end(), true); - } - if(mergeOld_) { - edm::Handle oldPxlMask; - edm::Handle oldStrMask; - iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask); - iEvent.getByToken(oldStrMaskToken_ ,oldStrMask); - LogDebug("SeedClusterRemover")<<"to merge in, "<size()<<" strp and "<size()<<" pxl"; - oldStrMask->copyMaskTo(collectedStrips_); - oldPxlMask->copyMaskTo(collectedPixels_); - assert(stripClusters->dataSize()>=collectedStrips_.size()); - collectedStrips_.resize(stripClusters->dataSize(),false); // for ondemand - }else { - collectedStrips_.resize(stripClusters->dataSize(), false); - collectedPixels_.resize(pixelClusters->dataSize(), false); - } - - - edm::Handle seeds; - iEvent.getByToken(trajectories_,seeds); - - for (auto const & seed : (*seeds) ){ - auto hits=seed.recHits(); - auto hit=hits.first; - for (;hit!=hits.second;++hit){ - if (!hit->isValid()) continue; - process( &(*hit), 0. , tgh.product()); - } - } - - - pixels.clear(); strips.clear(); + pixels.clear(); + strips.clear(); - - LogDebug("SeedClusterRemover")<<"total strip to skip: "<(edm::RefProd >(stripClusters),collectedStrips_)); + LogDebug("SeedClusterRemover") << "total strip to skip: " + << std::count(collectedStrips_.begin(), collectedStrips_.end(), true); + iEvent.put(std::make_unique(edm::RefProd >(stripClusters), + collectedStrips_)); - LogDebug("SeedClusterRemover")<<"total pxl to skip: "<(edm::RefProd >(pixelClusters),collectedPixels_)); - - collectedStrips_.clear(); - collectedPixels_.clear(); + LogDebug("SeedClusterRemover") << "total pxl to skip: " + << std::count(collectedPixels_.begin(), collectedPixels_.end(), true); + iEvent.put(std::make_unique(edm::RefProd >(pixelClusters), + collectedPixels_)); + collectedStrips_.clear(); + collectedPixels_.clear(); } #include "FWCore/PluginManager/interface/ModuleDef.h" diff --git a/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemoverPhase2.cc b/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemoverPhase2.cc index 5d5fc6c7b9f66..6a87c2bddac3c 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemoverPhase2.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/SeedClusterRemoverPhase2.cc @@ -32,173 +32,178 @@ // class SeedClusterRemoverPhase2 : public edm::stream::EDProducer<> { - - public: - SeedClusterRemoverPhase2(const edm::ParameterSet& iConfig) ; - void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override ; - private: - bool doOuterTracker_, doPixel_; - bool mergeOld_; - typedef edm::ContainerMask > PixelMaskContainer; - typedef edm::ContainerMask > Phase2OTMaskContainer; - edm::EDGetTokenT > pixelClusters_; - edm::EDGetTokenT > phase2OTClusters_; - edm::EDGetTokenT oldPxlMaskToken_; - edm::EDGetTokenT oldPh2OTMaskToken_; - edm::EDGetTokenT trajectories_; - - std::vector pixels, OTs; // avoid unneed alloc/dealloc of this - edm::ProductID pixelSourceProdID, outerTrackerSourceProdID; // ProdIDs refs must point to (for consistency tests) - - inline void process(const TrackingRecHit *hit, float chi2, const TrackerGeometry* tg); - - std::vector collectedOuterTrackers_; - std::vector collectedPixels_; +public: + SeedClusterRemoverPhase2(const edm::ParameterSet &iConfig); + void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; + +private: + bool doOuterTracker_, doPixel_; + bool mergeOld_; + typedef edm::ContainerMask > PixelMaskContainer; + typedef edm::ContainerMask > Phase2OTMaskContainer; + edm::EDGetTokenT > pixelClusters_; + edm::EDGetTokenT > phase2OTClusters_; + edm::EDGetTokenT oldPxlMaskToken_; + edm::EDGetTokenT oldPh2OTMaskToken_; + edm::EDGetTokenT trajectories_; + + std::vector pixels, OTs; // avoid unneed alloc/dealloc of this + edm::ProductID pixelSourceProdID, outerTrackerSourceProdID; // ProdIDs refs must point to (for consistency tests) + + inline void process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg); + + std::vector collectedOuterTrackers_; + std::vector collectedPixels_; }; - using namespace std; using namespace edm; -SeedClusterRemoverPhase2::SeedClusterRemoverPhase2(const ParameterSet& iConfig): - doOuterTracker_(iConfig.existsAs("doOuterTracker") ? iConfig.getParameter("doOuterTracker") : true), - doPixel_(iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true), - mergeOld_(iConfig.exists("oldClusterRemovalInfo")) -{ +SeedClusterRemoverPhase2::SeedClusterRemoverPhase2(const ParameterSet &iConfig) + : doOuterTracker_(iConfig.existsAs("doOuterTracker") ? iConfig.getParameter("doOuterTracker") : true), + doPixel_(iConfig.existsAs("doPixel") ? iConfig.getParameter("doPixel") : true), + mergeOld_(iConfig.exists("oldClusterRemovalInfo")) { produces > >(); produces > >(); - + trajectories_ = consumes(iConfig.getParameter("trajectories")); - if (doPixel_) pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); - if (doOuterTracker_) phase2OTClusters_ = consumes >(iConfig.getParameter("phase2OTClusters")); + if (doPixel_) + pixelClusters_ = consumes >(iConfig.getParameter("pixelClusters")); + if (doOuterTracker_) + phase2OTClusters_ = + consumes >(iConfig.getParameter("phase2OTClusters")); if (mergeOld_) { oldPxlMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); oldPh2OTMaskToken_ = consumes(iConfig.getParameter("oldClusterRemovalInfo")); } } - -void SeedClusterRemoverPhase2::process(const TrackingRecHit *hit, float chi2, const TrackerGeometry* tg) { - - DetId detid = hit->geographicalId(); +void SeedClusterRemoverPhase2::process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg) { + DetId detid = hit->geographicalId(); uint32_t subdet = detid.subdetId(); assert(subdet > 0); const type_info &hitType = typeid(*hit); if (hitType == typeid(SiPixelRecHit)) { - - if(!doPixel_) return; + if (!doPixel_) + return; const SiPixelRecHit *pixelHit = static_cast(hit); SiPixelRecHit::ClusterRef cluster = pixelHit->cluster(); LogDebug("SeedClusterRemoverPhase2") << "Plain Pixel RecHit in det " << detid.rawId(); - if (cluster.id() != pixelSourceProdID) throw cms::Exception("Inconsistent Data") << - "SeedClusterRemoverPhase2: pixel cluster ref from Product ID = " << cluster.id() << - " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; + if (cluster.id() != pixelSourceProdID) + throw cms::Exception("Inconsistent Data") + << "SeedClusterRemoverPhase2: pixel cluster ref from Product ID = " << cluster.id() + << " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n."; assert(cluster.id() == pixelSourceProdID); // mark as used pixels[cluster.key()] = false; - + assert(collectedPixels_.size() > cluster.key()); - collectedPixels_[cluster.key()]=true; - - } else if (hitType == typeid(Phase2TrackerRecHit1D)) { + collectedPixels_[cluster.key()] = true; - if(!doOuterTracker_) return; + } else if (hitType == typeid(Phase2TrackerRecHit1D)) { + if (!doOuterTracker_) + return; - const Phase2TrackerRecHit1D *ph2OThit = static_cast(hit); + const Phase2TrackerRecHit1D *ph2OThit = static_cast(hit); LogDebug("SeedClusterRemoverPhase2") << "Plain Phase2TrackerRecHit1D in det " << detid.rawId(); Phase2TrackerRecHit1D::CluRef cluster = ph2OThit->cluster(); - if (cluster.id() != outerTrackerSourceProdID) throw cms::Exception("Inconsistent Data") << - "SeedClusterRemoverPhase2: strip cluster ref from Product ID = " << cluster.id() << - " does not match with source cluster collection (ID = " << outerTrackerSourceProdID << ")\n."; - + if (cluster.id() != outerTrackerSourceProdID) + throw cms::Exception("Inconsistent Data") + << "SeedClusterRemoverPhase2: strip cluster ref from Product ID = " << cluster.id() + << " does not match with source cluster collection (ID = " << outerTrackerSourceProdID << ")\n."; + assert(cluster.id() == outerTrackerSourceProdID); OTs[cluster.key()] = false; assert(collectedOuterTrackers_.size() > cluster.key()); - collectedOuterTrackers_[cluster.key()]=true; - - } else throw cms::Exception("NOT IMPLEMENTED") << "I received a hit that was neither SiPixelRecHit nor Phase2TrackerRecHit1D but " << hitType.name() << " on detid " << detid.rawId() << "\n"; + collectedOuterTrackers_[cluster.key()] = true; - + } else + throw cms::Exception("NOT IMPLEMENTED") + << "I received a hit that was neither SiPixelRecHit nor Phase2TrackerRecHit1D but " << hitType.name() + << " on detid " << detid.rawId() << "\n"; } -void -SeedClusterRemoverPhase2::produce(Event& iEvent, const EventSetup& iSetup) -{ - ProductID pixelOldProdID, stripOldProdID; +void SeedClusterRemoverPhase2::produce(Event &iEvent, const EventSetup &iSetup) { + ProductID pixelOldProdID, stripOldProdID; - edm::ESHandle tgh; - iSetup.get().get("",tgh); //is it correct to use "" ? + edm::ESHandle tgh; + iSetup.get().get("", tgh); //is it correct to use "" ? - Handle > pixelClusters; - if (doPixel_) { - iEvent.getByToken(pixelClusters_, pixelClusters); - pixelSourceProdID = pixelClusters.id(); - } - LogDebug("SeedClusterRemoverPhase2") << "Read pixel with id " << pixelSourceProdID << std::endl; + Handle > pixelClusters; + if (doPixel_) { + iEvent.getByToken(pixelClusters_, pixelClusters); + pixelSourceProdID = pixelClusters.id(); + } + LogDebug("SeedClusterRemoverPhase2") << "Read pixel with id " << pixelSourceProdID << std::endl; - Handle > phase2OTClusters; - if (doOuterTracker_) { - iEvent.getByToken(phase2OTClusters_, phase2OTClusters); - outerTrackerSourceProdID = phase2OTClusters.id(); - } - LogDebug("SeedClusterRemoverPhase2") << "Read OT cluster with id " << outerTrackerSourceProdID << std::endl; + Handle > phase2OTClusters; + if (doOuterTracker_) { + iEvent.getByToken(phase2OTClusters_, phase2OTClusters); + outerTrackerSourceProdID = phase2OTClusters.id(); + } + LogDebug("SeedClusterRemoverPhase2") << "Read OT cluster with id " << outerTrackerSourceProdID << std::endl; + if (doOuterTracker_) { + OTs.resize(phase2OTClusters->dataSize()); + fill(OTs.begin(), OTs.end(), true); + } + if (doPixel_) { + pixels.resize(pixelClusters->dataSize()); + fill(pixels.begin(), pixels.end(), true); + } + if (mergeOld_) { + edm::Handle oldPxlMask; + edm::Handle oldPh2OTMask; + iEvent.getByToken(oldPxlMaskToken_, oldPxlMask); + iEvent.getByToken(oldPh2OTMaskToken_, oldPh2OTMask); + LogDebug("SeedClusterRemoverPhase2") << "to merge in, " << oldPh2OTMask->size() << " strp and " + << oldPxlMask->size() << " pxl"; + oldPh2OTMask->copyMaskTo(collectedOuterTrackers_); + oldPxlMask->copyMaskTo(collectedPixels_); + assert(phase2OTClusters->dataSize() >= collectedOuterTrackers_.size()); + collectedOuterTrackers_.resize(phase2OTClusters->dataSize(), false); // for ondemand + } else { + collectedOuterTrackers_.resize(phase2OTClusters->dataSize(), false); + collectedPixels_.resize(pixelClusters->dataSize(), false); + } - if (doOuterTracker_) { - OTs.resize(phase2OTClusters->dataSize()); fill(OTs.begin(), OTs.end(), true); - } - if (doPixel_) { - pixels.resize(pixelClusters->dataSize()); fill(pixels.begin(), pixels.end(), true); - } - if(mergeOld_) { - edm::Handle oldPxlMask; - edm::Handle oldPh2OTMask; - iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask); - iEvent.getByToken(oldPh2OTMaskToken_ ,oldPh2OTMask); - LogDebug("SeedClusterRemoverPhase2") << "to merge in, "<size()<<" strp and "<size()<<" pxl"; - oldPh2OTMask->copyMaskTo(collectedOuterTrackers_); - oldPxlMask->copyMaskTo(collectedPixels_); - assert(phase2OTClusters->dataSize()>=collectedOuterTrackers_.size()); - collectedOuterTrackers_.resize(phase2OTClusters->dataSize(),false); // for ondemand - }else { - collectedOuterTrackers_.resize(phase2OTClusters->dataSize(), false); - collectedPixels_.resize(pixelClusters->dataSize(), false); - } - - - edm::Handle seeds; - iEvent.getByToken(trajectories_,seeds); - - for (auto const & seed : (*seeds) ){ - auto hits=seed.recHits(); - auto hit=hits.first; - for (;hit!=hits.second;++hit){ - if (!hit->isValid()) continue; - process( &(*hit), 0. , tgh.product()); - } + edm::Handle seeds; + iEvent.getByToken(trajectories_, seeds); + + for (auto const &seed : (*seeds)) { + auto hits = seed.recHits(); + auto hit = hits.first; + for (; hit != hits.second; ++hit) { + if (!hit->isValid()) + continue; + process(&(*hit), 0., tgh.product()); } - - - pixels.clear(); OTs.clear(); + } + + pixels.clear(); + OTs.clear(); - - LogDebug("SeedClusterRemoverPhase2")<<"total strip to skip: "<(edm::RefProd >(phase2OTClusters),collectedOuterTrackers_)); + LogDebug("SeedClusterRemoverPhase2") << "total strip to skip: " + << std::count( + collectedOuterTrackers_.begin(), collectedOuterTrackers_.end(), true); + iEvent.put(std::make_unique( + edm::RefProd >(phase2OTClusters), collectedOuterTrackers_)); - LogDebug("SeedClusterRemoverPhase2")<<"total pxl to skip: "<(edm::RefProd >(pixelClusters),collectedPixels_)); - - collectedOuterTrackers_.clear(); - collectedPixels_.clear(); + LogDebug("SeedClusterRemoverPhase2") << "total pxl to skip: " + << std::count(collectedPixels_.begin(), collectedPixels_.end(), true); + iEvent.put(std::make_unique(edm::RefProd >(pixelClusters), + collectedPixels_)); + collectedOuterTrackers_.clear(); + collectedPixels_.clear(); } #include "FWCore/PluginManager/interface/ModuleDef.h" diff --git a/RecoLocalTracker/SubCollectionProducers/src/StripClusterSelectorTopBottom.cc b/RecoLocalTracker/SubCollectionProducers/src/StripClusterSelectorTopBottom.cc index b0999b31e7371..ce7eaca7083bd 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/StripClusterSelectorTopBottom.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/StripClusterSelectorTopBottom.cc @@ -1,36 +1,36 @@ #include "FWCore/Framework/interface/MakerMacros.h" #include "RecoLocalTracker/SubCollectionProducers/interface/StripClusterSelectorTopBottom.h" -void StripClusterSelectorTopBottom::produce( edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const { - - edm::Handle< edmNew::DetSetVector > input; +void StripClusterSelectorTopBottom::produce(edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const { + edm::Handle> input; event.getByToken(token_, input); edm::ESHandle geom; - setup.get().get( geom ); - const TrackerGeometry& theTracker( *geom ); - + setup.get().get(geom); + const TrackerGeometry& theTracker(*geom); + auto output = std::make_unique>(); - for (edmNew::DetSetVector::const_iterator clustSet = input->begin(); clustSet!=input->end(); ++clustSet) { + for (edmNew::DetSetVector::const_iterator clustSet = input->begin(); clustSet != input->end(); + ++clustSet) { edmNew::DetSet::const_iterator clustIt = clustSet->begin(); - edmNew::DetSet::const_iterator end = clustSet->end(); - - DetId detIdObject( clustSet->detId() ); + edmNew::DetSet::const_iterator end = clustSet->end(); + + DetId detIdObject(clustSet->detId()); edmNew::DetSetVector::FastFiller spc(*output, detIdObject.rawId()); - const StripGeomDetUnit* theGeomDet = dynamic_cast (theTracker.idToDet(detIdObject) ); - const StripTopology * topol = dynamic_cast(&(theGeomDet->specificTopology())); - - for(; clustIt!=end;++clustIt) { + const StripGeomDetUnit* theGeomDet = dynamic_cast(theTracker.idToDet(detIdObject)); + const StripTopology* topol = dynamic_cast(&(theGeomDet->specificTopology())); + + for (; clustIt != end; ++clustIt) { LocalPoint lpclust = topol->localPosition(clustIt->barycenter()); - GlobalPoint GPclust = theGeomDet->surface().toGlobal(Local3DPoint(lpclust.x(),lpclust.y(),lpclust.z())); + GlobalPoint GPclust = theGeomDet->surface().toGlobal(Local3DPoint(lpclust.x(), lpclust.y(), lpclust.z())); double clustY = GPclust.y(); if ((clustY * y_) > 0) { - spc.push_back(*clustIt); + spc.push_back(*clustIt); } } } - event.put(std::move(output)); + event.put(std::move(output)); } -DEFINE_FWK_MODULE( StripClusterSelectorTopBottom ); +DEFINE_FWK_MODULE(StripClusterSelectorTopBottom); diff --git a/RecoLocalTracker/SubCollectionProducers/src/TopBottomClusterInfoProducer.cc b/RecoLocalTracker/SubCollectionProducers/src/TopBottomClusterInfoProducer.cc index 96f832b0114e1..cf94805c85e0b 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/TopBottomClusterInfoProducer.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/TopBottomClusterInfoProducer.cc @@ -31,10 +31,10 @@ class TopBottomClusterInfoProducer : public edm::global::EDProducer<> { public: - TopBottomClusterInfoProducer(const edm::ParameterSet& iConfig) ; - ~TopBottomClusterInfoProducer() override ; - void produce(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const override ; - + TopBottomClusterInfoProducer(const edm::ParameterSet& iConfig); + ~TopBottomClusterInfoProducer() override; + void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override; + private: edm::EDGetTokenT > pixelClustersOld_; edm::EDGetTokenT > pixelClustersNew_; @@ -42,115 +42,124 @@ class TopBottomClusterInfoProducer : public edm::global::EDProducer<> { edm::EDGetTokenT > stripClustersNew_; }; - using namespace std; using namespace edm; using namespace reco; -TopBottomClusterInfoProducer::TopBottomClusterInfoProducer(const ParameterSet& iConfig) -{ - pixelClustersOld_ = consumes >(iConfig.getParameter("stripClustersOld")); - stripClustersOld_ = consumes >(iConfig.getParameter("pixelClustersOld")); - pixelClustersNew_ = consumes >(iConfig.getParameter("stripClustersNew")); - stripClustersNew_ = consumes >(iConfig.getParameter("pixelClustersNew")); - produces< ClusterRemovalInfo >(); -} - - -TopBottomClusterInfoProducer::~TopBottomClusterInfoProducer() -{ +TopBottomClusterInfoProducer::TopBottomClusterInfoProducer(const ParameterSet& iConfig) { + pixelClustersOld_ = + consumes >(iConfig.getParameter("stripClustersOld")); + stripClustersOld_ = + consumes >(iConfig.getParameter("pixelClustersOld")); + pixelClustersNew_ = + consumes >(iConfig.getParameter("stripClustersNew")); + stripClustersNew_ = + consumes >(iConfig.getParameter("pixelClustersNew")); + produces(); } -void -TopBottomClusterInfoProducer::produce(edm::StreamID, Event& iEvent, const EventSetup& iSetup) const -{ - - Handle > pixelClustersOld; - iEvent.getByToken(pixelClustersOld_, pixelClustersOld); - Handle > stripClustersOld; - iEvent.getByToken(stripClustersOld_, stripClustersOld); - - Handle > pixelClustersNew; - iEvent.getByToken(pixelClustersNew_, pixelClustersNew); - Handle > stripClustersNew; - iEvent.getByToken(stripClustersNew_, stripClustersNew); - - auto cri = std::make_unique(pixelClustersOld, stripClustersOld); - ClusterRemovalInfo::Indices& pixelInd = cri->pixelIndices(); - ClusterRemovalInfo::Indices& stripInd = cri->stripIndices(); - stripInd.reserve(stripClustersNew->size()); - pixelInd.reserve(pixelClustersNew->size()); - - //const SiStripCluster * firstOffsetStripNew = & stripClustersNew->data().front(); - for (edmNew::DetSetVector::const_iterator itdetNew = stripClustersNew->begin(); itdetNew != stripClustersNew->end(); ++itdetNew) { - edmNew::DetSet oldDSstripNew = *itdetNew; - if (oldDSstripNew.empty()) continue; // skip empty detsets - for (edmNew::DetSet::const_iterator clNew = oldDSstripNew.begin(); clNew != oldDSstripNew.end(); ++clNew) { - uint16_t firstStripNew = clNew->firstStrip(); - uint32_t idStripNew = itdetNew->id(); - //uint32_t keyNew = ((&*clNew) - firstOffsetStripNew); - //cout << "new strip index=" << keyNew << endl; - uint32_t keyOld=99999; - - const SiStripCluster * firstOffsetStripOld = & stripClustersOld->data().front(); - edmNew::DetSetVector::const_iterator itdetOld = stripClustersOld->find(itdetNew->id()); - if (itdetOld != stripClustersOld->end()) { - edmNew::DetSet oldDSstripOld = *itdetOld; - if (oldDSstripOld.empty()) continue; // skip empty detsets - for (edmNew::DetSet::const_iterator clOld = oldDSstripOld.begin(); clOld != oldDSstripOld.end(); ++clOld) { - uint16_t firstStripOld = clOld->firstStrip(); - uint32_t idStripOld = itdetOld->id(); - if (idStripNew==idStripOld && firstStripNew==firstStripOld) { - keyOld = ((&*clOld) - firstOffsetStripOld); - //cout << "old strip index=" << keyOld << endl; - break; - } - } - } - //assert(keyOld!=99999); - //cout << "push back strip index=" << keyOld << endl; - stripInd.push_back(keyOld); - } +TopBottomClusterInfoProducer::~TopBottomClusterInfoProducer() {} + +void TopBottomClusterInfoProducer::produce(edm::StreamID, Event& iEvent, const EventSetup& iSetup) const { + Handle > pixelClustersOld; + iEvent.getByToken(pixelClustersOld_, pixelClustersOld); + Handle > stripClustersOld; + iEvent.getByToken(stripClustersOld_, stripClustersOld); + + Handle > pixelClustersNew; + iEvent.getByToken(pixelClustersNew_, pixelClustersNew); + Handle > stripClustersNew; + iEvent.getByToken(stripClustersNew_, stripClustersNew); + + auto cri = std::make_unique(pixelClustersOld, stripClustersOld); + ClusterRemovalInfo::Indices& pixelInd = cri->pixelIndices(); + ClusterRemovalInfo::Indices& stripInd = cri->stripIndices(); + stripInd.reserve(stripClustersNew->size()); + pixelInd.reserve(pixelClustersNew->size()); + + //const SiStripCluster * firstOffsetStripNew = & stripClustersNew->data().front(); + for (edmNew::DetSetVector::const_iterator itdetNew = stripClustersNew->begin(); + itdetNew != stripClustersNew->end(); + ++itdetNew) { + edmNew::DetSet oldDSstripNew = *itdetNew; + if (oldDSstripNew.empty()) + continue; // skip empty detsets + for (edmNew::DetSet::const_iterator clNew = oldDSstripNew.begin(); clNew != oldDSstripNew.end(); + ++clNew) { + uint16_t firstStripNew = clNew->firstStrip(); + uint32_t idStripNew = itdetNew->id(); + //uint32_t keyNew = ((&*clNew) - firstOffsetStripNew); + //cout << "new strip index=" << keyNew << endl; + uint32_t keyOld = 99999; + + const SiStripCluster* firstOffsetStripOld = &stripClustersOld->data().front(); + edmNew::DetSetVector::const_iterator itdetOld = stripClustersOld->find(itdetNew->id()); + if (itdetOld != stripClustersOld->end()) { + edmNew::DetSet oldDSstripOld = *itdetOld; + if (oldDSstripOld.empty()) + continue; // skip empty detsets + for (edmNew::DetSet::const_iterator clOld = oldDSstripOld.begin(); clOld != oldDSstripOld.end(); + ++clOld) { + uint16_t firstStripOld = clOld->firstStrip(); + uint32_t idStripOld = itdetOld->id(); + if (idStripNew == idStripOld && firstStripNew == firstStripOld) { + keyOld = ((&*clOld) - firstOffsetStripOld); + //cout << "old strip index=" << keyOld << endl; + break; + } + } + } + //assert(keyOld!=99999); + //cout << "push back strip index=" << keyOld << endl; + stripInd.push_back(keyOld); } - - - //const SiPixelCluster * firstOffsetPixelNew = & pixelClustersNew->data().front(); - for (edmNew::DetSetVector::const_iterator itdetNew = pixelClustersNew->begin(); itdetNew != pixelClustersNew->end(); ++itdetNew) { - edmNew::DetSet oldDSpixelNew = *itdetNew; - if (oldDSpixelNew.empty()) continue; // skip empty detsets - for (edmNew::DetSet::const_iterator clNew = oldDSpixelNew.begin(); clNew != oldDSpixelNew.end(); ++clNew) { - int minPixelRowNew = clNew->minPixelRow(); - //uint32_t keyNew = ((&*clNew) - firstOffsetPixelNew); - //cout << "new pixel index=" << keyNew << endl; - uint32_t keyOld=99999; - - const SiPixelCluster * firstOffsetPixelOld = & pixelClustersOld->data().front(); - edmNew::DetSetVector::const_iterator itdetOld = pixelClustersOld->find(oldDSpixelNew.detId()); - if (itdetOld != pixelClustersOld->end()) { - edmNew::DetSet oldDSpixelOld = *itdetOld; - if (oldDSpixelOld.empty()) continue; // skip empty detsets - for (edmNew::DetSet::const_iterator clOld = oldDSpixelOld.begin(); clOld != oldDSpixelOld.end(); ++clOld) { - int minPixelRowOld = clOld->minPixelRow(); - if (minPixelRowNew==minPixelRowOld) { - keyOld = ((&*clOld) - firstOffsetPixelOld); - //cout << "old pixel index=" << keyOld << endl; - break; - } - } - } - assert(keyOld!=99999); - //cout << "push back pixel index=" << keyOld << endl; - pixelInd.push_back(keyOld); - } + } + + //const SiPixelCluster * firstOffsetPixelNew = & pixelClustersNew->data().front(); + for (edmNew::DetSetVector::const_iterator itdetNew = pixelClustersNew->begin(); + itdetNew != pixelClustersNew->end(); + ++itdetNew) { + edmNew::DetSet oldDSpixelNew = *itdetNew; + if (oldDSpixelNew.empty()) + continue; // skip empty detsets + for (edmNew::DetSet::const_iterator clNew = oldDSpixelNew.begin(); clNew != oldDSpixelNew.end(); + ++clNew) { + int minPixelRowNew = clNew->minPixelRow(); + //uint32_t keyNew = ((&*clNew) - firstOffsetPixelNew); + //cout << "new pixel index=" << keyNew << endl; + uint32_t keyOld = 99999; + + const SiPixelCluster* firstOffsetPixelOld = &pixelClustersOld->data().front(); + edmNew::DetSetVector::const_iterator itdetOld = pixelClustersOld->find(oldDSpixelNew.detId()); + if (itdetOld != pixelClustersOld->end()) { + edmNew::DetSet oldDSpixelOld = *itdetOld; + if (oldDSpixelOld.empty()) + continue; // skip empty detsets + for (edmNew::DetSet::const_iterator clOld = oldDSpixelOld.begin(); clOld != oldDSpixelOld.end(); + ++clOld) { + int minPixelRowOld = clOld->minPixelRow(); + if (minPixelRowNew == minPixelRowOld) { + keyOld = ((&*clOld) - firstOffsetPixelOld); + //cout << "old pixel index=" << keyOld << endl; + break; + } + } + } + assert(keyOld != 99999); + //cout << "push back pixel index=" << keyOld << endl; + pixelInd.push_back(keyOld); } - - //cout << "pixelInd size" << pixelInd.size() << endl; - //cout << "stripInd size" << stripInd.size() << endl; + } + + //cout << "pixelInd size" << pixelInd.size() << endl; + //cout << "stripInd size" << stripInd.size() << endl; - cri->setNewPixelClusters(edm::OrphanHandle(pixelClustersNew.product(),pixelClustersNew.id())); - cri->setNewStripClusters(edm::OrphanHandle >(stripClustersNew.product(),stripClustersNew.id())); + cri->setNewPixelClusters( + edm::OrphanHandle(pixelClustersNew.product(), pixelClustersNew.id())); + cri->setNewStripClusters( + edm::OrphanHandle >(stripClustersNew.product(), stripClustersNew.id())); - iEvent.put(std::move(cri)); + iEvent.put(std::move(cri)); } #include "FWCore/PluginManager/interface/ModuleDef.h" diff --git a/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemover.cc b/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemover.cc index f9bfc6265d499..295416acdaa1b 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemover.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemover.cc @@ -10,7 +10,6 @@ #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h" - #include "DataFormats/Common/interface/ValueMap.h" #include "DataFormats/Common/interface/DetSetVectorNew.h" #include "DataFormats/Provenance/interface/ProductID.h" @@ -25,21 +24,21 @@ #include "RecoTracker/TransientTrackingRecHit/interface/Traj2TrackHits.h" -#include +#include namespace { class TrackClusterRemover final : public edm::global::EDProducer<> { public: - TrackClusterRemover(const edm::ParameterSet& iConfig) ; - ~TrackClusterRemover() override{} + TrackClusterRemover(const edm::ParameterSet& iConfig); + ~TrackClusterRemover() override {} static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + private: - void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override; - - using PixelMaskContainer = edm::ContainerMask>; - using StripMaskContainer = edm::ContainerMask>; + + using PixelMaskContainer = edm::ContainerMask>; + using StripMaskContainer = edm::ContainerMask>; using QualityMaskCollection = std::vector; @@ -47,139 +46,134 @@ namespace { const int minNumberOfLayersWithMeasBeforeFiltering_; const reco::TrackBase::TrackQuality trackQuality_; - const TrackCollectionTokens trajectories_; edm::EDGetTokenT srcQuals; - - edm::EDGetTokenT > pixelClusters_; - edm::EDGetTokenT > stripClusters_; - + + edm::EDGetTokenT> pixelClusters_; + edm::EDGetTokenT> stripClusters_; + edm::EDGetTokenT oldPxlMaskToken_; edm::EDGetTokenT oldStrMaskToken_; - + // backward compatibility during transition period - edm::EDGetTokenT> overrideTrkQuals_; - + edm::EDGetTokenT> overrideTrkQuals_; }; void TrackClusterRemover::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("trajectories",edm::InputTag()); - desc.add("trackClassifier",edm::InputTag("","QualityMasks")); - desc.add("pixelClusters",edm::InputTag("siPixelClusters")); - desc.add("stripClusters",edm::InputTag("siStripClusters")); - desc.add("oldClusterRemovalInfo",edm::InputTag()); - - desc.add("TrackQuality","highPurity"); - desc.add("maxChi2",30.); - desc.add("minNumberOfLayersWithMeasBeforeFiltering",0); - // old mode - desc.add("overrideTrkQuals",edm::InputTag()); + desc.add("trajectories", edm::InputTag()); + desc.add("trackClassifier", edm::InputTag("", "QualityMasks")); + desc.add("pixelClusters", edm::InputTag("siPixelClusters")); + desc.add("stripClusters", edm::InputTag("siStripClusters")); + desc.add("oldClusterRemovalInfo", edm::InputTag()); + + desc.add("TrackQuality", "highPurity"); + desc.add("maxChi2", 30.); + desc.add("minNumberOfLayersWithMeasBeforeFiltering", 0); + // old mode + desc.add("overrideTrkQuals", edm::InputTag()); descriptions.add("trackClusterRemover", desc); - } - - TrackClusterRemover::TrackClusterRemover(const edm::ParameterSet& iConfig) : - maxChi2x5_(Traj2TrackHits::toChi2x5(iConfig.getParameter("maxChi2"))), - minNumberOfLayersWithMeasBeforeFiltering_(iConfig.getParameter("minNumberOfLayersWithMeasBeforeFiltering")), - trackQuality_(reco::TrackBase::qualityByName(iConfig.getParameter("TrackQuality"))), - trajectories_(iConfig.getParameter("trajectories"),consumesCollector()) - - { + TrackClusterRemover::TrackClusterRemover(const edm::ParameterSet& iConfig) + : maxChi2x5_(Traj2TrackHits::toChi2x5(iConfig.getParameter("maxChi2"))), + minNumberOfLayersWithMeasBeforeFiltering_( + iConfig.getParameter("minNumberOfLayersWithMeasBeforeFiltering")), + trackQuality_(reco::TrackBase::qualityByName(iConfig.getParameter("TrackQuality"))), + trajectories_(iConfig.getParameter("trajectories"), consumesCollector()) - auto const & pixelClusters = iConfig.getParameter("pixelClusters"); - auto const & stripClusters = iConfig.getParameter("stripClusters"); - - if (pixelClusters.label().empty() && stripClusters.label().empty() ) throw edm::Exception(edm::errors::Configuration) << "Configuration Error: TrackClusterRemover used without input cluster collections"; - if ( !pixelClusters.label().empty() ){ - pixelClusters_ = consumes >(pixelClusters); - produces > >(); + { + auto const& pixelClusters = iConfig.getParameter("pixelClusters"); + auto const& stripClusters = iConfig.getParameter("stripClusters"); + + if (pixelClusters.label().empty() && stripClusters.label().empty()) + throw edm::Exception(edm::errors::Configuration) + << "Configuration Error: TrackClusterRemover used without input cluster collections"; + if (!pixelClusters.label().empty()) { + pixelClusters_ = consumes>(pixelClusters); + produces>>(); } - if ( !stripClusters.label().empty() ){ - stripClusters_ = consumes >(stripClusters); - produces > >(); + if (!stripClusters.label().empty()) { + stripClusters_ = consumes>(stripClusters); + produces>>(); } // old mode - auto const & overrideTrkQuals = iConfig.getParameter("overrideTrkQuals"); - if ( !overrideTrkQuals.label().empty() ) - overrideTrkQuals_ = consumes >(overrideTrkQuals); + auto const& overrideTrkQuals = iConfig.getParameter("overrideTrkQuals"); + if (!overrideTrkQuals.label().empty()) + overrideTrkQuals_ = consumes>(overrideTrkQuals); - auto const & classifier = iConfig.getParameter("trackClassifier"); - if ( !classifier.label().empty()) + auto const& classifier = iConfig.getParameter("trackClassifier"); + if (!classifier.label().empty()) srcQuals = consumes(classifier); - auto const & oldClusterRemovalInfo = iConfig.getParameter("oldClusterRemovalInfo"); + auto const& oldClusterRemovalInfo = iConfig.getParameter("oldClusterRemovalInfo"); if (!oldClusterRemovalInfo.label().empty()) { oldPxlMaskToken_ = consumes(oldClusterRemovalInfo); oldStrMaskToken_ = consumes(oldClusterRemovalInfo); } - } - - void - TrackClusterRemover::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup&) const - { - - - edm::Handle > pixelClusters; - if(!pixelClusters_.isUninitialized()) iEvent.getByToken(pixelClusters_, pixelClusters); - edm::Handle > stripClusters; - if(!stripClusters_.isUninitialized()) iEvent.getByToken(stripClusters_, stripClusters); - + void TrackClusterRemover::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup&) const { + edm::Handle> pixelClusters; + if (!pixelClusters_.isUninitialized()) + iEvent.getByToken(pixelClusters_, pixelClusters); + edm::Handle> stripClusters; + if (!stripClusters_.isUninitialized()) + iEvent.getByToken(stripClusters_, stripClusters); std::vector collectedStrips; std::vector collectedPixels; - if(!oldPxlMaskToken_.isUninitialized()) { + if (!oldPxlMaskToken_.isUninitialized()) { edm::Handle oldPxlMask; edm::Handle oldStrMask; - iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask); - iEvent.getByToken(oldStrMaskToken_ ,oldStrMask); - LogDebug("TrackClusterRemover")<<"to merge in, "<size()<<" strp, "<size()<<" pxl"; - - // std::cout <<"TrackClusterRemover "<<"to merge in, "<size()<<" strp and "<size()<<" pxl" << std::endl; + iEvent.getByToken(oldPxlMaskToken_, oldPxlMask); + iEvent.getByToken(oldStrMaskToken_, oldStrMask); + LogDebug("TrackClusterRemover") << "to merge in, " << oldStrMask->size() << " strp, " << oldPxlMask->size() + << " pxl"; + + // std::cout <<"TrackClusterRemover "<<"to merge in, "<size()<<" strp and "<size()<<" pxl" << std::endl; oldStrMask->copyMaskTo(collectedStrips); oldPxlMask->copyMaskTo(collectedPixels); - if(!stripClusters_.isUninitialized()){ - assert(stripClusters->dataSize()>=collectedStrips.size()); - collectedStrips.resize(stripClusters->dataSize(), false); - //std::cout << "TrackClusterRemover " <<"total strip already to skip: " - // <dataSize() >= collectedStrips.size()); + collectedStrips.resize(stripClusters->dataSize(), false); + //std::cout << "TrackClusterRemover " <<"total strip already to skip: " + // <dataSize(), false); - if(!pixelClusters_.isUninitialized()) collectedPixels.resize(pixelClusters->dataSize(), false); - } - - - + } else { + if (!stripClusters_.isUninitialized()) + collectedStrips.resize(stripClusters->dataSize(), false); + if (!pixelClusters_.isUninitialized()) + collectedPixels.resize(pixelClusters->dataSize(), false); + } // loop over trajectories, filter, mask clusters../ - unsigned char qualMask = ~0; - if (trackQuality_!=reco::TrackBase::undefQuality) qualMask = 1< > quals; - iEvent.getByToken(overrideTrkQuals_,quals); - assert(s==(*quals).size()); + QualityMaskCollection const* pquals = nullptr; - oldStyle.resize(s,0); - for (auto i=0U; i 0 ) oldStyle[i] = (255)&(*quals).get(i); - pquals = &oldStyle; + if (!overrideTrkQuals_.isUninitialized()) { + edm::Handle> quals; + iEvent.getByToken(overrideTrkQuals_, quals); + assert(s == (*quals).size()); + + oldStyle.resize(s, 0); + for (auto i = 0U; i < s; ++i) + if ((*quals).get(i) > 0) + oldStyle[i] = (255) & (*quals).get(i); + pquals = &oldStyle; } if (!srcQuals.isUninitialized()) { @@ -188,52 +182,55 @@ namespace { pquals = hqual.product(); } // if (!pquals) std::cout << "no qual collection" << std::endl; - for (auto i=0U; ichi2sX5(); - assert(chi2sX5.size()==track.recHitsSize()); + for (auto i = 0U; i < s; ++i) { + const reco::Track& track = tracks[i]; + bool goodTk = (pquals) ? (*pquals)[i] & qualMask : track.quality(trackQuality_); + if (!goodTk) + continue; + if (track.hitPattern().trackerLayersWithMeasurement() < minNumberOfLayersWithMeasBeforeFiltering_) + continue; + + auto const& chi2sX5 = track.extra()->chi2sX5(); + assert(chi2sX5.size() == track.recHitsSize()); auto hb = track.recHitsBegin(); - for(unsigned int h=0;h maxChi2x5_ ) continue; // skip outliers - auto const & thit = reinterpret_cast(hit); - auto const & cluster = thit.firstClusterRef(); - if(!stripClusters_.isUninitialized() && cluster.isStrip()) collectedStrips[cluster.key()]=true; - if(!pixelClusters_.isUninitialized() && cluster.isPixel()) collectedPixels[cluster.key()]=true; - if (trackerHitRTTI::isMatched(thit)) - collectedStrips[reinterpret_cast(hit).stereoClusterRef().key()]=true; + for (unsigned int h = 0; h < track.recHitsSize(); h++) { + auto recHit = *(hb + h); + auto const& hit = *recHit; + if (!trackerHitRTTI::isFromDet(hit)) + continue; + if (chi2sX5[h] > maxChi2x5_) + continue; // skip outliers + auto const& thit = reinterpret_cast(hit); + auto const& cluster = thit.firstClusterRef(); + if (!stripClusters_.isUninitialized() && cluster.isStrip()) + collectedStrips[cluster.key()] = true; + if (!pixelClusters_.isUninitialized() && cluster.isPixel()) + collectedPixels[cluster.key()] = true; + if (trackerHitRTTI::isMatched(thit)) + collectedStrips[reinterpret_cast(hit).stereoClusterRef().key()] = true; } } - // std::cout << " => collectedStrips: " << collectedStrips.size() << std::endl; - if(!stripClusters_.isUninitialized()){ - auto removedStripClusterMask = - std::make_unique(edm::RefProd>(stripClusters),collectedStrips); - LogDebug("TrackClusterRemover")<<"total strip to skip: "<( + edm::RefProd>(stripClusters), collectedStrips); + LogDebug("TrackClusterRemover") << "total strip to skip: " + << std::count(collectedStrips.begin(), collectedStrips.end(), true); // std::cout << "TrackClusterRemover " <<"total strip to skip: "<(edm::RefProd>(pixelClusters),collectedPixels); - LogDebug("TrackClusterRemover")<<"total pxl to skip: "<( + edm::RefProd>(pixelClusters), collectedPixels); + LogDebug("TrackClusterRemover") << "total pxl to skip: " + << std::count(collectedPixels.begin(), collectedPixels.end(), true); iEvent.put(std::move(removedPixelClusterMask)); } - } - -} - +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(TrackClusterRemover); - diff --git a/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemoverPhase2.cc b/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemoverPhase2.cc index 3fab4552adda8..a7afaf340eba6 100644 --- a/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemoverPhase2.cc +++ b/RecoLocalTracker/SubCollectionProducers/src/TrackClusterRemoverPhase2.cc @@ -23,7 +23,7 @@ #include "RecoTracker/TransientTrackingRecHit/interface/Traj2TrackHits.h" -#include +#include /* This is a copy of the TrackClusterRemover * for Phase2 Tk upgrade @@ -35,14 +35,14 @@ namespace { class TrackClusterRemoverPhase2 final : public edm::global::EDProducer<> { public: - TrackClusterRemoverPhase2(const edm::ParameterSet& iConfig) ; - ~TrackClusterRemoverPhase2() override{} + TrackClusterRemoverPhase2(const edm::ParameterSet& iConfig); + ~TrackClusterRemoverPhase2() override {} static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + private: - void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override; - - using PixelMaskContainer = edm::ContainerMask>; + + using PixelMaskContainer = edm::ContainerMask>; using Phase2OTMaskContainer = edm::ContainerMask>; using QualityMaskCollection = std::vector; @@ -51,124 +51,114 @@ namespace { const int minNumberOfLayersWithMeasBeforeFiltering_; const reco::TrackBase::TrackQuality trackQuality_; - const TrackCollectionTokens tracks_; edm::EDGetTokenT srcQuals; - - const edm::EDGetTokenT > pixelClusters_; - const edm::EDGetTokenT > phase2OTClusters_; - + + const edm::EDGetTokenT> pixelClusters_; + const edm::EDGetTokenT> phase2OTClusters_; + edm::EDGetTokenT oldPxlMaskToken_; edm::EDGetTokenT oldPh2OTMaskToken_; - + // backward compatibility during transition period - edm::EDGetTokenT> overrideTrkQuals_; - + edm::EDGetTokenT> overrideTrkQuals_; }; void TrackClusterRemoverPhase2::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("trajectories",edm::InputTag()); - desc.add("trackClassifier",edm::InputTag("","QualityMasks")); - desc.add("phase2pixelClusters",edm::InputTag("siPixelClusters")); - desc.add("phase2OTClusters",edm::InputTag("siPhase2Clusters")); - desc.add("oldClusterRemovalInfo",edm::InputTag()); - - desc.add("TrackQuality","highPurity"); - desc.add("maxChi2",30.); - desc.add("minNumberOfLayersWithMeasBeforeFiltering",0); - // old mode - desc.add("overrideTrkQuals",edm::InputTag()); + desc.add("trajectories", edm::InputTag()); + desc.add("trackClassifier", edm::InputTag("", "QualityMasks")); + desc.add("phase2pixelClusters", edm::InputTag("siPixelClusters")); + desc.add("phase2OTClusters", edm::InputTag("siPhase2Clusters")); + desc.add("oldClusterRemovalInfo", edm::InputTag()); + + desc.add("TrackQuality", "highPurity"); + desc.add("maxChi2", 30.); + desc.add("minNumberOfLayersWithMeasBeforeFiltering", 0); + // old mode + desc.add("overrideTrkQuals", edm::InputTag()); descriptions.add("phase2trackClusterRemover", desc); - } - - TrackClusterRemoverPhase2::TrackClusterRemoverPhase2(const edm::ParameterSet& iConfig) : - maxChi2_(Traj2TrackHits::toChi2x5(iConfig.getParameter("maxChi2"))), - minNumberOfLayersWithMeasBeforeFiltering_(iConfig.getParameter("minNumberOfLayersWithMeasBeforeFiltering")), - trackQuality_(reco::TrackBase::qualityByName(iConfig.getParameter("TrackQuality"))), - tracks_(iConfig.getParameter("trajectories"),consumesCollector()), - pixelClusters_(consumes >(iConfig.getParameter("phase2pixelClusters"))), - phase2OTClusters_(consumes >(iConfig.getParameter("phase2OTClusters"))) - { + TrackClusterRemoverPhase2::TrackClusterRemoverPhase2(const edm::ParameterSet& iConfig) + : maxChi2_(Traj2TrackHits::toChi2x5(iConfig.getParameter("maxChi2"))), + minNumberOfLayersWithMeasBeforeFiltering_( + iConfig.getParameter("minNumberOfLayersWithMeasBeforeFiltering")), + trackQuality_(reco::TrackBase::qualityByName(iConfig.getParameter("TrackQuality"))), - produces > >(); - produces > >(); + tracks_(iConfig.getParameter("trajectories"), consumesCollector()), + pixelClusters_( + consumes>(iConfig.getParameter("phase2pixelClusters"))), + phase2OTClusters_(consumes>( + iConfig.getParameter("phase2OTClusters"))) { + produces>>(); + produces>>(); // old mode - auto const & overrideTrkQuals = iConfig.getParameter("overrideTrkQuals"); - if ( !overrideTrkQuals.label().empty() ) - overrideTrkQuals_ = consumes >(overrideTrkQuals); + auto const& overrideTrkQuals = iConfig.getParameter("overrideTrkQuals"); + if (!overrideTrkQuals.label().empty()) + overrideTrkQuals_ = consumes>(overrideTrkQuals); - auto const & classifier = iConfig.getParameter("trackClassifier"); - if ( !classifier.label().empty()) + auto const& classifier = iConfig.getParameter("trackClassifier"); + if (!classifier.label().empty()) srcQuals = consumes(classifier); - auto const & oldClusterRemovalInfo = iConfig.getParameter("oldClusterRemovalInfo"); + auto const& oldClusterRemovalInfo = iConfig.getParameter("oldClusterRemovalInfo"); if (!oldClusterRemovalInfo.label().empty()) { oldPxlMaskToken_ = consumes(oldClusterRemovalInfo); oldPh2OTMaskToken_ = consumes(oldClusterRemovalInfo); } - } - - void - TrackClusterRemoverPhase2::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup&) const - { - - - edm::Handle > pixelClusters; + void TrackClusterRemoverPhase2::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup&) const { + edm::Handle> pixelClusters; iEvent.getByToken(pixelClusters_, pixelClusters); - edm::Handle > phase2OTClusters; + edm::Handle> phase2OTClusters; iEvent.getByToken(phase2OTClusters_, phase2OTClusters); - std::vector collectedPixels; std::vector collectedPhase2OTs; - if(!oldPxlMaskToken_.isUninitialized()) { - + if (!oldPxlMaskToken_.isUninitialized()) { edm::Handle oldPxlMask; edm::Handle oldPh2OTMask; - iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask); - iEvent.getByToken(oldPh2OTMaskToken_ ,oldPh2OTMask); - LogDebug("TrackClusterRemoverPhase2")<<"to merge in, "<size()<<" phase2 pixel and " << oldPh2OTMask->size() << " phase2 OT"; + iEvent.getByToken(oldPxlMaskToken_, oldPxlMask); + iEvent.getByToken(oldPh2OTMaskToken_, oldPh2OTMask); + LogDebug("TrackClusterRemoverPhase2") + << "to merge in, " << oldPxlMask->size() << " phase2 pixel and " << oldPh2OTMask->size() << " phase2 OT"; oldPxlMask->copyMaskTo(collectedPixels); oldPh2OTMask->copyMaskTo(collectedPhase2OTs); assert(phase2OTClusters->dataSize() >= collectedPhase2OTs.size()); collectedPhase2OTs.resize(phase2OTClusters->dataSize(), false); - }else { - + } else { collectedPixels.resize(pixelClusters->dataSize(), false); collectedPhase2OTs.resize(phase2OTClusters->dataSize(), false); - - } - + } // loop over trajectories, filter, mask clusters../ - unsigned char qualMask = ~0; - if (trackQuality_!=reco::TrackBase::undefQuality) qualMask = 1< > quals; - iEvent.getByToken(overrideTrkQuals_,quals); - assert(s==(*quals).size()); + QualityMaskCollection const* pquals = nullptr; - oldStyle.resize(s,0); - for (auto i=0U; i 0 ) oldStyle[i] = (255)&(*quals).get(i); - pquals = &oldStyle; + if (!overrideTrkQuals_.isUninitialized()) { + edm::Handle> quals; + iEvent.getByToken(overrideTrkQuals_, quals); + assert(s == (*quals).size()); + + oldStyle.resize(s, 0); + for (auto i = 0U; i < s; ++i) + if ((*quals).get(i) > 0) + oldStyle[i] = (255) & (*quals).get(i); + pquals = &oldStyle; } if (!srcQuals.isUninitialized()) { @@ -177,47 +167,47 @@ namespace { pquals = hqual.product(); } - for (auto i=0U; ichi2sX5(); - assert(chi2sX5.size()==track.recHitsSize()); + for (auto i = 0U; i < s; ++i) { + const reco::Track& track = tracks[i]; + bool goodTk = (pquals) ? (*pquals)[i] & qualMask : track.quality(trackQuality_); + if (!goodTk) + continue; + if (track.hitPattern().trackerLayersWithMeasurement() < minNumberOfLayersWithMeasBeforeFiltering_) + continue; + auto const& chi2sX5 = track.extra()->chi2sX5(); + assert(chi2sX5.size() == track.recHitsSize()); auto hb = track.recHitsBegin(); - for(unsigned int h=0;hisValid()) continue; - if ( chi2sX5[h] > maxChi2_ ) continue; // skip outliers - auto const & thit = reinterpret_cast(*hit); - auto const & cluster = thit.firstClusterRef(); + for (unsigned int h = 0; h < track.recHitsSize(); h++) { + auto hit = *(hb + h); + if (!hit->isValid()) + continue; + if (chi2sX5[h] > maxChi2_) + continue; // skip outliers + auto const& thit = reinterpret_cast(*hit); + auto const& cluster = thit.firstClusterRef(); // FIXME when we will get also Phase2 pixel - if (cluster.isPixel()) collectedPixels[cluster.key()]=true; - else if (cluster.isPhase2()) collectedPhase2OTs[cluster.key()]=true; + if (cluster.isPixel()) + collectedPixels[cluster.key()] = true; + else if (cluster.isPhase2()) + collectedPhase2OTs[cluster.key()] = true; } - } - - auto removedPixelClusterMask= - std::make_unique(edm::RefProd>(pixelClusters),collectedPixels); - LogDebug("TrackClusterRemoverPhase2")<<"total pxl to skip: "<( + edm::RefProd>(pixelClusters), collectedPixels); + LogDebug("TrackClusterRemoverPhase2") + << "total pxl to skip: " << std::count(collectedPixels.begin(), collectedPixels.end(), true); iEvent.put(std::move(removedPixelClusterMask)); - - auto removedPhase2OTClusterMask= - std::make_unique(edm::RefProd>(phase2OTClusters),collectedPhase2OTs); - LogDebug("TrackClusterRemoverPhase2")<<"total ph2OT to skip: "<( + edm::RefProd>(phase2OTClusters), collectedPhase2OTs); + LogDebug("TrackClusterRemoverPhase2") + << "total ph2OT to skip: " << std::count(collectedPhase2OTs.begin(), collectedPhase2OTs.end(), true); + iEvent.put(std::move(removedPhase2OTClusterMask)); } - -} - +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(TrackClusterRemoverPhase2); - diff --git a/RecoLocalTracker/SubCollectionProducers/test/ClusterAnalyzer.cc b/RecoLocalTracker/SubCollectionProducers/test/ClusterAnalyzer.cc index 5b46a0093cee6..8eb5a4bd59df5 100644 --- a/RecoLocalTracker/SubCollectionProducers/test/ClusterAnalyzer.cc +++ b/RecoLocalTracker/SubCollectionProducers/test/ClusterAnalyzer.cc @@ -2,7 +2,7 @@ // // Package: ClusterAnalyzer // Class: ClusterAnalyzer -// +// /**\class ClusterAnalyzer ClusterAnalyzer.cc msegala/ClusterSummary/src/ClusterAnalyzer.cc Description: [one line class summary] @@ -16,7 +16,6 @@ // // - // system include files #include @@ -30,134 +29,124 @@ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "TTree.h" -#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/ServiceRegistry/interface/Service.h" #include "CommonTools/UtilAlgos/interface/TFileService.h" #include #include #include "DataFormats/TrackerCommon/interface/ClusterSummary.h" - // // class declaration // class ClusterSummary; - using namespace std; class ClusterAnalyzer : public edm::EDAnalyzer { - public: - explicit ClusterAnalyzer(const edm::ParameterSet&); - ~ClusterAnalyzer(); +public: + explicit ClusterAnalyzer(const edm::ParameterSet&); + ~ClusterAnalyzer(); +private: + virtual void beginJob() override; + virtual void analyze(const edm::Event&, const edm::EventSetup&) override; - private: - virtual void beginJob() override ; - virtual void analyze(const edm::Event&, const edm::EventSetup&) override; - - - // ----------member data --------------------------- + // ----------member data --------------------------- - edm::EDGetTokenT token; + edm::EDGetTokenT token; - std::map enumModules_; - std::map< std::string, TH1D* > histos1D_; + std::map enumModules_; + std::map histos1D_; - std::vector nType_; - std::vector clusterSize_; - std::vector clusterCharge_; + std::vector nType_; + std::vector clusterSize_; + std::vector clusterCharge_; - std::map allModules_; + std::map allModules_; - edm::Service fs; + edm::Service fs; - bool _verbose; + bool _verbose; }; - -ClusterAnalyzer::ClusterAnalyzer(const edm::ParameterSet& iConfig) -{ - +ClusterAnalyzer::ClusterAnalyzer(const edm::ParameterSet& iConfig) { token = consumes(iConfig.getParameter("clusterSum")); - _verbose = true; //set to true to see the event by event summary info + _verbose = true; //set to true to see the event by event summary info std::vector wantedsubdets = iConfig.getParameter >("wantedSubDets"); - for(auto iS : wantedsubdets){ - + for (auto iS : wantedsubdets) { ClusterSummary::CMSTracker subdet = ClusterSummary::NVALIDENUMS; - for(int iN = 0; iN < ClusterSummary::NVALIDENUMS; ++iN) - if(ClusterSummary::subDetNames[iN] == iS) + for (int iN = 0; iN < ClusterSummary::NVALIDENUMS; ++iN) + if (ClusterSummary::subDetNames[iN] == iS) subdet = ClusterSummary::CMSTracker(iN); - if(subdet == ClusterSummary::NVALIDENUMS) throw cms::Exception( "No standard selection: ") << iS; + if (subdet == ClusterSummary::NVALIDENUMS) + throw cms::Exception("No standard selection: ") << iS; allModules_[subdet] = iS; } - std::vector wantedusersubdets_ps = iConfig.getParameter >("wantedUserSubDets"); - for(const auto& iS : wantedusersubdets_ps){ - ClusterSummary::CMSTracker subdet = (ClusterSummary::CMSTracker)iS.getParameter("detSelection"); - std::string detname = iS.getParameter("detLabel"); - if(subdet <= ClusterSummary::NVALIDENUMS) throw cms::Exception( "Already predefined selection: ") << subdet; - if(subdet >= ClusterSummary::NTRACKERENUMS) throw cms::Exception( "Selection is out of range: ") << subdet; + std::vector wantedusersubdets_ps = + iConfig.getParameter >("wantedUserSubDets"); + for (const auto& iS : wantedusersubdets_ps) { + ClusterSummary::CMSTracker subdet = (ClusterSummary::CMSTracker)iS.getParameter("detSelection"); + std::string detname = iS.getParameter("detLabel"); + if (subdet <= ClusterSummary::NVALIDENUMS) + throw cms::Exception("Already predefined selection: ") << subdet; + if (subdet >= ClusterSummary::NTRACKERENUMS) + throw cms::Exception("Selection is out of range: ") << subdet; allModules_[subdet] = detname; } cout << "From provenance infomation the selected modules are = "; for (auto i : allModules_) - cout << i.second <<" "; + cout << i.second << " "; cout << endl; - for( auto i = allModules_.begin(); i != allModules_.end(); ++i){ + for (auto i = allModules_.begin(); i != allModules_.end(); ++i) { std::string tmpstr = i->second; - histos1D_[ (tmpstr + "nclusters").c_str() ] = fs->make< TH1D >( (tmpstr + "nclusters").c_str() , (tmpstr + "nclusters").c_str() , 1000 , 0 , 3000 ); - histos1D_[ (tmpstr + "nclusters").c_str() ]->SetXTitle( ("number of Clusters in " + tmpstr).c_str() ); - - histos1D_[ (tmpstr + "avgCharge").c_str() ] = fs->make< TH1D >( (tmpstr + "avgCharge").c_str() , (tmpstr + "avgCharge").c_str() , 500 , 0 , 1000 ); - histos1D_[ (tmpstr + "avgCharge").c_str() ]->SetXTitle( ("average cluster charge in " + tmpstr).c_str() ); + histos1D_[(tmpstr + "nclusters").c_str()] = + fs->make((tmpstr + "nclusters").c_str(), (tmpstr + "nclusters").c_str(), 1000, 0, 3000); + histos1D_[(tmpstr + "nclusters").c_str()]->SetXTitle(("number of Clusters in " + tmpstr).c_str()); - histos1D_[ (tmpstr + "avgSize").c_str() ] = fs->make< TH1D >( (tmpstr + "avgSize").c_str() , (tmpstr + "avgSize").c_str() , 30 , 0 , 10 ); - histos1D_[ (tmpstr + "avgSize").c_str() ]->SetXTitle( ("average cluster size in " + tmpstr).c_str() ); + histos1D_[(tmpstr + "avgCharge").c_str()] = + fs->make((tmpstr + "avgCharge").c_str(), (tmpstr + "avgCharge").c_str(), 500, 0, 1000); + histos1D_[(tmpstr + "avgCharge").c_str()]->SetXTitle(("average cluster charge in " + tmpstr).c_str()); + histos1D_[(tmpstr + "avgSize").c_str()] = + fs->make((tmpstr + "avgSize").c_str(), (tmpstr + "avgSize").c_str(), 30, 0, 10); + histos1D_[(tmpstr + "avgSize").c_str()]->SetXTitle(("average cluster size in " + tmpstr).c_str()); } - } +ClusterAnalyzer::~ClusterAnalyzer() {} -ClusterAnalyzer::~ClusterAnalyzer(){} +void ClusterAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { + using namespace edm; -void -ClusterAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) -{ - using namespace edm; - - Handle< ClusterSummary > class_; - iEvent.getByToken( token, class_); - - for ( unsigned int iM = 0; iM < class_->getNumberOfModules(); iM++ ){ - auto iAllModules = allModules_.find(class_->getModule(iM)); - if(iAllModules == allModules_.end()) continue; + Handle class_; + iEvent.getByToken(token, class_); - std::string tmpstr = iAllModules->second; + for (unsigned int iM = 0; iM < class_->getNumberOfModules(); iM++) { + auto iAllModules = allModules_.find(class_->getModule(iM)); + if (iAllModules == allModules_.end()) + continue; - histos1D_[ (tmpstr + "nclusters").c_str() ] -> Fill( class_ -> getNClusByIndex (iM )); - histos1D_[ (tmpstr + "avgSize").c_str() ] -> Fill( class_ -> getClusSizeByIndex (iM )/class_ -> getNClusByIndex(iM )); - histos1D_[ (tmpstr + "avgCharge").c_str() ] -> Fill( class_ -> getClusChargeByIndex(iM )/class_ -> getNClusByIndex(iM )); + std::string tmpstr = iAllModules->second; - cout << "n"< getClusSizeByIndex (iM) /class_ -> getNClusByIndex(iM ); - cout << ", "<< class_ -> getClusChargeByIndex(iM) /class_ -> getNClusByIndex(iM ) << endl; - } - cout << "-------------------------------------------------------" << endl; - + histos1D_[(tmpstr + "nclusters").c_str()]->Fill(class_->getNClusByIndex(iM)); + histos1D_[(tmpstr + "avgSize").c_str()]->Fill(class_->getClusSizeByIndex(iM) / class_->getNClusByIndex(iM)); + histos1D_[(tmpstr + "avgCharge").c_str()]->Fill(class_->getClusChargeByIndex(iM) / class_->getNClusByIndex(iM)); + cout << "n" << tmpstr << ", avg size, avg charge = " << class_->getNClusByIndex(iM); + cout << ", " << class_->getClusSizeByIndex(iM) / class_->getNClusByIndex(iM); + cout << ", " << class_->getClusChargeByIndex(iM) / class_->getNClusByIndex(iM) << endl; + } + cout << "-------------------------------------------------------" << endl; } - // ------------ method called once each job just before starting event loop ------------ -void -ClusterAnalyzer::beginJob(){} +void ClusterAnalyzer::beginJob() {} //define this as a plug-in DEFINE_FWK_MODULE(ClusterAnalyzer); diff --git a/RecoLocalTracker/SubCollectionProducers/test/ClusterMCsplitStrips.cc b/RecoLocalTracker/SubCollectionProducers/test/ClusterMCsplitStrips.cc index 6bd4d9dbdf6db..254f20b1b60f1 100644 --- a/RecoLocalTracker/SubCollectionProducers/test/ClusterMCsplitStrips.cc +++ b/RecoLocalTracker/SubCollectionProducers/test/ClusterMCsplitStrips.cc @@ -23,144 +23,155 @@ // Class declaration -class ClusterMCsplitStrips : public edm::stream::EDProducer<> { - +class ClusterMCsplitStrips : public edm::stream::EDProducer<> { public: - explicit ClusterMCsplitStrips(const edm::ParameterSet& conf); virtual void produce(edm::Event&, const edm::EventSetup&); private: - - template bool findInput(const edm::EDGetTokenT&, edm::Handle&, const edm::Event&); - void refineCluster(const edm::Handle< edmNew::DetSetVector >& input, - edmNew::DetSetVector& output); + template + bool findInput(const edm::EDGetTokenT&, edm::Handle&, const edm::Event&); + void refineCluster(const edm::Handle>& input, + edmNew::DetSetVector& output); const edm::InputTag inputTag; - typedef edm::EDGetTokenT< edmNew::DetSetVector > token_t; + typedef edm::EDGetTokenT> token_t; token_t inputToken; edm::ParameterSet confClusterRefiner_; - edm::EDGetTokenT< edm::DetSetVector > stripdigisimlinkToken; - edm::Handle< edm::DetSetVector > stripdigisimlink_; + edm::EDGetTokenT> stripdigisimlinkToken; + edm::Handle> stripdigisimlink_; edm::ESHandle tTopoHandle_; std::vector moduleTypeStrings_; std::vector moduleTypeCodes_; - }; - // Class implementation -ClusterMCsplitStrips:: -ClusterMCsplitStrips(const edm::ParameterSet& conf) - : inputTag( conf.getParameter("UnsplitClusterProducer") ), - confClusterRefiner_(conf.getParameter("ClusterRefiner")) { - produces< edmNew::DetSetVector > (); - inputToken = consumes< edmNew::DetSetVector >(inputTag); - stripdigisimlinkToken = consumes< edm::DetSetVector >(edm::InputTag("simSiStripDigis")); - moduleTypeStrings_ = confClusterRefiner_.getParameter >("moduleTypes"); +ClusterMCsplitStrips::ClusterMCsplitStrips(const edm::ParameterSet& conf) + : inputTag(conf.getParameter("UnsplitClusterProducer")), + confClusterRefiner_(conf.getParameter("ClusterRefiner")) { + produces>(); + inputToken = consumes>(inputTag); + stripdigisimlinkToken = consumes>(edm::InputTag("simSiStripDigis")); + moduleTypeStrings_ = confClusterRefiner_.getParameter>("moduleTypes"); for (auto mod = moduleTypeStrings_.begin(); mod != moduleTypeStrings_.end(); ++mod) { - if (*mod == "IB1") moduleTypeCodes_.push_back(SiStripModuleGeometry::IB1); - if (*mod == "IB2") moduleTypeCodes_.push_back(SiStripModuleGeometry::IB2); - if (*mod == "OB1") moduleTypeCodes_.push_back(SiStripModuleGeometry::OB1); - if (*mod == "OB2") moduleTypeCodes_.push_back(SiStripModuleGeometry::OB2); - if (*mod == "W1A") moduleTypeCodes_.push_back(SiStripModuleGeometry::W1A); - if (*mod == "W2A") moduleTypeCodes_.push_back(SiStripModuleGeometry::W2A); - if (*mod == "W3A") moduleTypeCodes_.push_back(SiStripModuleGeometry::W3A); - if (*mod == "W1B") moduleTypeCodes_.push_back(SiStripModuleGeometry::W1B); - if (*mod == "W2B") moduleTypeCodes_.push_back(SiStripModuleGeometry::W2B); - if (*mod == "W3B") moduleTypeCodes_.push_back(SiStripModuleGeometry::W3B); - if (*mod == "W4") moduleTypeCodes_.push_back(SiStripModuleGeometry::W4); - if (*mod == "W5") moduleTypeCodes_.push_back(SiStripModuleGeometry::W5); - if (*mod == "W6") moduleTypeCodes_.push_back(SiStripModuleGeometry::W6); - if (*mod == "W7") moduleTypeCodes_.push_back(SiStripModuleGeometry::W7); + if (*mod == "IB1") + moduleTypeCodes_.push_back(SiStripModuleGeometry::IB1); + if (*mod == "IB2") + moduleTypeCodes_.push_back(SiStripModuleGeometry::IB2); + if (*mod == "OB1") + moduleTypeCodes_.push_back(SiStripModuleGeometry::OB1); + if (*mod == "OB2") + moduleTypeCodes_.push_back(SiStripModuleGeometry::OB2); + if (*mod == "W1A") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W1A); + if (*mod == "W2A") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W2A); + if (*mod == "W3A") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W3A); + if (*mod == "W1B") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W1B); + if (*mod == "W2B") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W2B); + if (*mod == "W3B") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W3B); + if (*mod == "W4") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W4); + if (*mod == "W5") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W5); + if (*mod == "W6") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W6); + if (*mod == "W7") + moduleTypeCodes_.push_back(SiStripModuleGeometry::W7); } } -void ClusterMCsplitStrips:: -produce(edm::Event& event, const edm::EventSetup& evSetup) { - +void ClusterMCsplitStrips::produce(edm::Event& event, const edm::EventSetup& evSetup) { //Retrieve tracker topology from geometry evSetup.get().get(tTopoHandle_); auto output = std::make_unique>(); - output->reserve(10000,4*10000); + output->reserve(10000, 4 * 10000); event.getByToken(stripdigisimlinkToken, stripdigisimlink_); - edm::Handle< edmNew::DetSetVector > input; + edm::Handle> input; - if ( findInput(inputToken, input, event) ) refineCluster(input, *output); - else edm::LogError("Input Not Found") << "[ClusterMCsplitStrips::produce] ";// << inputTag; + if (findInput(inputToken, input, event)) + refineCluster(input, *output); + else + edm::LogError("Input Not Found") << "[ClusterMCsplitStrips::produce] "; // << inputTag; - LogDebug("Output") << output->dataSize() << " clusters from " - << output->size() << " modules"; + LogDebug("Output") << output->dataSize() << " clusters from " << output->size() << " modules"; output->shrink_to_fit(); event.put(std::move(output)); } -void ClusterMCsplitStrips:: -refineCluster(const edm::Handle< edmNew::DetSetVector >& input, - edmNew::DetSetVector& output) { - +void ClusterMCsplitStrips::refineCluster(const edm::Handle>& input, + edmNew::DetSetVector& output) { const TrackerTopology* const tTopo = tTopoHandle_.product(); for (edmNew::DetSetVector::const_iterator det = input->begin(); det != input->end(); det++) { - uint32_t detID = det->id(); DetId theDet(detID); // int subDet = theDet.subdetId(); edm::DetSetVector::const_iterator isearch = stripdigisimlink_->find(detID); - if (isearch == stripdigisimlink_->end()) continue; // This sensor has no simlinks; - // Any clusters must be from noise. + if (isearch == stripdigisimlink_->end()) + continue; // This sensor has no simlinks; + // Any clusters must be from noise. // DetSetVector filler to receive the clusters we produce edmNew::DetSetVector::FastFiller outFill(output, det->id()); // Consider clusters of selected module types for splitting; else just push original cluster to output. - if (std::find(moduleTypeCodes_.begin(), moduleTypeCodes_.end(), tTopo->moduleGeometry(theDet)) == moduleTypeCodes_.end()) { + if (std::find(moduleTypeCodes_.begin(), moduleTypeCodes_.end(), tTopo->moduleGeometry(theDet)) == + moduleTypeCodes_.end()) { for (auto clust = det->begin(); clust != det->end(); clust++) - outFill.push_back(*clust); + outFill.push_back(*clust); continue; // On to the next sensor. } // Traverse the clusters for this sensor. for (edmNew::DetSet::iterator clust = det->begin(); clust != det->end(); clust++) { int clusiz = clust->amplitudes().size(); - int first = clust->firstStrip(); - int last = first + clusiz; + int first = clust->firstStrip(); + int last = first + clusiz; edm::DetSet link_detset = (*isearch); // First pass to count simTracks and set this cluster's range in the simlink vector - edm::DetSet::const_iterator - firstlink = link_detset.data.begin(), - lastlink = link_detset.data.end(); + edm::DetSet::const_iterator firstlink = link_detset.data.begin(), + lastlink = link_detset.data.end(); bool firstlinkInit = false; std::vector trackID; for (edm::DetSet::const_iterator linkiter = link_detset.data.begin(); - linkiter != link_detset.data.end(); linkiter++) { + linkiter != link_detset.data.end(); + linkiter++) { // DigiSimLinks are ordered first by channel; there can be > 1 track, and > 1 simHit for each track - int thisChannel = linkiter->channel(); - if (thisChannel < first) continue; - if (thisChannel >= first && !firstlinkInit) { - firstlinkInit = true; - firstlink = linkiter; - } - if (thisChannel >= last) break; - lastlink = linkiter; lastlink++; - auto const& thisSimTrk = linkiter->SimTrackId(); - if(std::find(trackID.begin(), trackID.end(), thisSimTrk) == trackID.end()) { - trackID.push_back(thisSimTrk); - } + int thisChannel = linkiter->channel(); + if (thisChannel < first) + continue; + if (thisChannel >= first && !firstlinkInit) { + firstlinkInit = true; + firstlink = linkiter; + } + if (thisChannel >= last) + break; + lastlink = linkiter; + lastlink++; + auto const& thisSimTrk = linkiter->SimTrackId(); + if (std::find(trackID.begin(), trackID.end(), thisSimTrk) == trackID.end()) { + trackID.push_back(thisSimTrk); + } } // end initial loop over this sensor's simlinks size_t NsimTrk = trackID.size(); if (NsimTrk < 2) { - if (NsimTrk == 1) outFill.push_back(*clust); // Unmerged cluster: push it to the output. + if (NsimTrk == 1) + outFill.push_back(*clust); // Unmerged cluster: push it to the output. - // (If NsimTrk = 0, cluster has no matched simlinks; abandon it.) - continue; // On to the next cluster + // (If NsimTrk = 0, cluster has no matched simlinks; abandon it.) + continue; // On to the next cluster } // std::cout << "subDet " << DetId(detID).subdetId() << ", det " << detID << ": " << NsimTrk << " simTracks:"; @@ -170,57 +181,56 @@ refineCluster(const edm::Handle< edmNew::DetSetVector >& input, // This cluster matches more than one simTrack, so we proceed to split it. auto const& amp = clust->amplitudes(); std::vector TKfirstStrip(NsimTrk, -1); - std::vector< std::vector > TKampl(NsimTrk); - std::vector prevStrip(NsimTrk,-1); + std::vector> TKampl(NsimTrk); + std::vector prevStrip(NsimTrk, -1); for (edm::DetSet::const_iterator linkiter = firstlink; linkiter != lastlink; linkiter++) { - int stripIdx = (int)linkiter->channel()-first; - - uint16_t rawAmpl = (uint16_t)(amp[stripIdx]); - uint16_t thisAmpl; - if (rawAmpl < 254) { - thisAmpl = std::min( uint16_t(253), std::max(uint16_t(0), (uint16_t)(rawAmpl*linkiter->fraction()+0.5)) ); - } else { - thisAmpl = rawAmpl; - } - - unsigned int thisSimTrk = linkiter->SimTrackId(); - auto const& TKiter = std::find(trackID.begin(), trackID.end(), thisSimTrk); - unsigned int TKidx = TKiter - trackID.begin(); - - if (TKfirstStrip[TKidx] == -1) TKfirstStrip[TKidx] = linkiter->channel(); - if (stripIdx != prevStrip[TKidx]) { - prevStrip[TKidx] = stripIdx; - TKampl[TKidx].push_back(thisAmpl); - } else { - if (rawAmpl < 254) - (TKampl[TKidx])[linkiter->channel() - TKfirstStrip[TKidx]] += thisAmpl; - } + int stripIdx = (int)linkiter->channel() - first; + + uint16_t rawAmpl = (uint16_t)(amp[stripIdx]); + uint16_t thisAmpl; + if (rawAmpl < 254) { + thisAmpl = std::min(uint16_t(253), std::max(uint16_t(0), (uint16_t)(rawAmpl * linkiter->fraction() + 0.5))); + } else { + thisAmpl = rawAmpl; + } + + unsigned int thisSimTrk = linkiter->SimTrackId(); + auto const& TKiter = std::find(trackID.begin(), trackID.end(), thisSimTrk); + unsigned int TKidx = TKiter - trackID.begin(); + + if (TKfirstStrip[TKidx] == -1) + TKfirstStrip[TKidx] = linkiter->channel(); + if (stripIdx != prevStrip[TKidx]) { + prevStrip[TKidx] = stripIdx; + TKampl[TKidx].push_back(thisAmpl); + } else { + if (rawAmpl < 254) + (TKampl[TKidx])[linkiter->channel() - TKfirstStrip[TKidx]] += thisAmpl; + } } - - for (unsigned int TKidx = 0; TKidx < NsimTrk; ++TKidx) { - if (std::accumulate(TKampl[TKidx].begin(), TKampl[TKidx].end(), 0) > 0) { - // std::cout << "SimTrackID, 1st: ampl " << trackID[TKidx] << ", " << TKfirstStrip[TKidx] << ":"; - // for (unsigned i=0; i 0) { + // std::cout << "SimTrackID, 1st: ampl " << trackID[TKidx] << ", " << TKfirstStrip[TKidx] << ":"; + // for (unsigned i=0; i -inline -bool ClusterMCsplitStrips:: -findInput(const edm::EDGetTokenT& tag, edm::Handle& handle, const edm::Event& e) { - e.getByToken( tag, handle); - return handle.isValid(); +template +inline bool ClusterMCsplitStrips::findInput(const edm::EDGetTokenT& tag, + edm::Handle& handle, + const edm::Event& e) { + e.getByToken(tag, handle); + return handle.isValid(); } -//define this as a plug-in +//define this as a plug-in DEFINE_FWK_MODULE(ClusterMCsplitStrips); diff --git a/RecoTracker/FinalTrackSelectors/interface/TrackAlgoPriorityOrder.h b/RecoTracker/FinalTrackSelectors/interface/TrackAlgoPriorityOrder.h index cc9f9e66d999f..1226008acecbd 100644 --- a/RecoTracker/FinalTrackSelectors/interface/TrackAlgoPriorityOrder.h +++ b/RecoTracker/FinalTrackSelectors/interface/TrackAlgoPriorityOrder.h @@ -7,9 +7,7 @@ class TrackAlgoPriorityOrder { public: explicit TrackAlgoPriorityOrder(const std::vector& algoOrder); - unsigned int priority(reco::TrackBase::TrackAlgorithm algo) const { - return priority_[algo]; - } + unsigned int priority(reco::TrackBase::TrackAlgorithm algo) const { return priority_[algo]; } private: std::array priority_; diff --git a/RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h b/RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h index 9f48949ef7932..4122a7995ba74 100644 --- a/RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h +++ b/RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h @@ -21,63 +21,55 @@ #include "DataFormats/TrackReco/interface/TrackExtra.h" #include "TrackingTools/PatternTools/interface/TrackCollectionTokens.h" - - class TrackCollectionCloner { public: - /// copy only the tracks, not extras and rechits (for AOD) bool copyExtras_; /// copy also trajectories and trajectory->track associations bool copyTrajectories_; - using Tokens = TrackCollectionTokens; - - template - TrackCollectionCloner(Producer & producer, const edm::ParameterSet & cfg, bool copyDefault ) : - copyExtras_(cfg.template getUntrackedParameter("copyExtras", copyDefault)), - copyTrajectories_(cfg.template getUntrackedParameter("copyTrajectories", copyDefault)) { - - std::string alias( cfg.getParameter( "@module_label" ) ); - producer.template produces().setBranchAlias( alias + "Tracks" ); + template + TrackCollectionCloner(Producer& producer, const edm::ParameterSet& cfg, bool copyDefault) + : copyExtras_(cfg.template getUntrackedParameter("copyExtras", copyDefault)), + copyTrajectories_(cfg.template getUntrackedParameter("copyTrajectories", copyDefault)) { + std::string alias(cfg.getParameter("@module_label")); + producer.template produces().setBranchAlias(alias + "Tracks"); if (copyExtras_) { - producer.template produces().setBranchAlias( alias + "TrackExtras" ); - producer.template produces().setBranchAlias( alias + "RecHits" ); + producer.template produces().setBranchAlias(alias + "TrackExtras"); + producer.template produces().setBranchAlias(alias + "RecHits"); } if (copyTrajectories_) { - producer.template produces< std::vector >().setBranchAlias( alias + "Trajectories" ); - producer.template produces< TrajTrackAssociationCollection >().setBranchAlias( alias + "TrajectoryTrackAssociations" ); - } - + producer.template produces >().setBranchAlias(alias + "Trajectories"); + producer.template produces().setBranchAlias(alias + + "TrajectoryTrackAssociations"); } + } - static void fill(edm::ParameterSetDescription& desc); + static void fill(edm::ParameterSetDescription& desc); struct Producer { - Producer(edm::Event& ievt, TrackCollectionCloner const & cloner); + Producer(edm::Event& ievt, TrackCollectionCloner const& cloner); ~Producer(); - void operator()(Tokens const & tokens, std::vector const & selected); + void operator()(Tokens const& tokens, std::vector const& selected); /// copy only the tracks, not extras and rechits (for AOD) bool copyExtras_; /// copy also trajectories and trajectory->track associations bool copyTrajectories_; - + /// the event edm::Event& evt; // some space std::unique_ptr selTracks_; std::unique_ptr selTrackExtras_; std::unique_ptr selHits_; - std::unique_ptr< std::vector > selTrajs_; - std::unique_ptr< TrajTrackAssociationCollection > selTTAss_; + std::unique_ptr > selTrajs_; + std::unique_ptr selTTAss_; }; - - }; #endif diff --git a/RecoTracker/FinalTrackSelectors/interface/TrackMVAClassifier.h b/RecoTracker/FinalTrackSelectors/interface/TrackMVAClassifier.h index eaccb7873f28a..e433fe5bed0cd 100644 --- a/RecoTracker/FinalTrackSelectors/interface/TrackMVAClassifier.h +++ b/RecoTracker/FinalTrackSelectors/interface/TrackMVAClassifier.h @@ -1,12 +1,10 @@ #ifndef RecoTracker_FinalTrackSelectors_TrackMVAClassifierBase_h #define RecoTracker_FinalTrackSelectors_TrackMVAClassifierBase_h - #include "DataFormats/TrackReco/interface/TrackFwd.h" #include "DataFormats/VertexReco/interface/VertexFwd.h" #include "DataFormats/BeamSpot/interface/BeamSpot.h" - #include "FWCore/Framework/interface/stream/EDProducer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" @@ -22,7 +20,7 @@ class TrackMVAClassifierBase : public edm::stream::EDProducer<> { public: - explicit TrackMVAClassifierBase( const edm::ParameterSet & cfg ); + explicit TrackMVAClassifierBase(const edm::ParameterSet& cfg); ~TrackMVAClassifierBase() override; using MVACollection = std::vector; @@ -32,19 +30,17 @@ class TrackMVAClassifierBase : public edm::stream::EDProducer<> { using MVAPairCollection = std::vector>; protected: + static void fill(edm::ParameterSetDescription& desc); - static void fill( edm::ParameterSetDescription& desc); - - virtual void initEvent(const edm::EventSetup& es) = 0; - virtual void computeMVA(reco::TrackCollection const & tracks, - reco::BeamSpot const & beamSpot, - reco::VertexCollection const & vertices, - MVAPairCollection & mvas) const = 0; + virtual void computeMVA(reco::TrackCollection const& tracks, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices, + MVAPairCollection& mvas) const = 0; private: - void produce(edm::Event& evt, const edm::EventSetup& es ) final; + void produce(edm::Event& evt, const edm::EventSetup& es) final; /// source collection label edm::EDGetTokenT src_; @@ -57,24 +53,22 @@ class TrackMVAClassifierBase : public edm::stream::EDProducer<> { // qualitycuts (loose, tight, hp) float qualityCuts[3]; - }; namespace trackMVAClassifierImpl { - template + template struct ComputeMVA { template - void operator()(MVA const & mva, - reco::TrackCollection const & tracks, - reco::BeamSpot const & beamSpot, - reco::VertexCollection const & vertices, - TrackMVAClassifierBase::MVAPairCollection & mvas) { - + void operator()(MVA const& mva, + reco::TrackCollection const& tracks, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices, + TrackMVAClassifierBase::MVAPairCollection& mvas) { EventCache cache; size_t current = 0; - for (auto const & trk : tracks) { - mvas[current++] = mva(trk,beamSpot,vertices,cache); + for (auto const& trk : tracks) { + mvas[current++] = mva(trk, beamSpot, vertices, cache); } } }; @@ -82,61 +76,50 @@ namespace trackMVAClassifierImpl { template <> struct ComputeMVA { template - void operator()(MVA const & mva, - reco::TrackCollection const & tracks, - reco::BeamSpot const & beamSpot, - reco::VertexCollection const & vertices, - TrackMVAClassifierBase::MVAPairCollection & mvas) { - + void operator()(MVA const& mva, + reco::TrackCollection const& tracks, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices, + TrackMVAClassifierBase::MVAPairCollection& mvas) { size_t current = 0; - for (auto const & trk : tracks) { + for (auto const& trk : tracks) { //BDT outputs are considered always reliable. Hence "true" - std::pair output (mva(trk,beamSpot,vertices), true); - mvas[current++]= output; + std::pair output(mva(trk, beamSpot, vertices), true); + mvas[current++] = output; } } }; -} +} // namespace trackMVAClassifierImpl -template +template class TrackMVAClassifier : public TrackMVAClassifierBase { public: - explicit TrackMVAClassifier( const edm::ParameterSet & cfg ) : - TrackMVAClassifierBase(cfg), - mva(cfg.getParameter("mva")){} - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc; - fill(desc); - edm::ParameterSetDescription mvaDesc; - MVA::fillDescriptions(mvaDesc); - desc.add("mva",mvaDesc); - descriptions.add(MVA::name(), desc); - } + explicit TrackMVAClassifier(const edm::ParameterSet& cfg) + : TrackMVAClassifierBase(cfg), mva(cfg.getParameter("mva")) {} + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + fill(desc); + edm::ParameterSetDescription mvaDesc; + MVA::fillDescriptions(mvaDesc); + desc.add("mva", mvaDesc); + descriptions.add(MVA::name(), desc); + } - private: - void beginStream(edm::StreamID) final { - mva.beginStream(); - } + void beginStream(edm::StreamID) final { mva.beginStream(); } - void initEvent(const edm::EventSetup& es) final { - mva.initEvent(es); - } - - void computeMVA(reco::TrackCollection const & tracks, - reco::BeamSpot const & beamSpot, - reco::VertexCollection const & vertices, - MVAPairCollection & mvas) const final { + void initEvent(const edm::EventSetup& es) final { mva.initEvent(es); } - trackMVAClassifierImpl::ComputeMVA computer; - computer(mva, tracks, beamSpot, vertices, mvas); - } + void computeMVA(reco::TrackCollection const& tracks, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices, + MVAPairCollection& mvas) const final { + trackMVAClassifierImpl::ComputeMVA computer; + computer(mva, tracks, beamSpot, vertices, mvas); + } MVA mva; }; - - -#endif // RecoTracker_FinalTrackSelectors_TrackMVAClassifierBase_h - +#endif // RecoTracker_FinalTrackSelectors_TrackMVAClassifierBase_h diff --git a/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc index ac421ded7fbb4..72258daa59a4b 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc @@ -33,35 +33,30 @@ using namespace reco; - class dso_hidden AnalyticalTrackSelector final : public MultiTrackSelector { - private: - public: - /// constructor - explicit AnalyticalTrackSelector( const edm::ParameterSet & cfg ) ; - /// destructor - ~AnalyticalTrackSelector() override ; - - private: - typedef math::XYZPoint Point; - /// process one event - void run( edm::Event& evt, const edm::EventSetup& es ) const override; - - /// copy only the tracks, not extras and rechits (for AOD) - bool copyExtras_; - /// copy also trajectories and trajectory->track associations - bool copyTrajectories_; - /// eta restrictions - double minEta_; - double maxEta_; - - edm::EDGetTokenT > srcTraj_; - edm::EDGetTokenT srcTass_; - - - }; - - - +class dso_hidden AnalyticalTrackSelector final : public MultiTrackSelector { +private: +public: + /// constructor + explicit AnalyticalTrackSelector(const edm::ParameterSet& cfg); + /// destructor + ~AnalyticalTrackSelector() override; + +private: + typedef math::XYZPoint Point; + /// process one event + void run(edm::Event& evt, const edm::EventSetup& es) const override; + + /// copy only the tracks, not extras and rechits (for AOD) + bool copyExtras_; + /// copy also trajectories and trajectory->track associations + bool copyTrajectories_; + /// eta restrictions + double minEta_; + double maxEta_; + + edm::EDGetTokenT> srcTraj_; + edm::EDGetTokenT srcTass_; +}; #include "DataFormats/Common/interface/ValueMap.h" @@ -69,229 +64,222 @@ using namespace reco; #include #include "TMath.h" +AnalyticalTrackSelector::AnalyticalTrackSelector(const edm::ParameterSet& cfg) : MultiTrackSelector() { + //Spoof the pset for each track selector! + //Size is always 1!!! + qualityToSet_.reserve(1); + vtxNumber_.reserve(1); + vertexCut_.reserve(1); + res_par_.reserve(1); + chi2n_par_.reserve(1); + chi2n_no1Dmod_par_.reserve(1); + d0_par1_.reserve(1); + dz_par1_.reserve(1); + d0_par2_.reserve(1); + dz_par2_.reserve(1); + applyAdaptedPVCuts_.reserve(1); + max_d0_.reserve(1); + max_z0_.reserve(1); + nSigmaZ_.reserve(1); + min_layers_.reserve(1); + min_3Dlayers_.reserve(1); + max_lostLayers_.reserve(1); + min_hits_bypass_.reserve(1); + applyAbsCutsIfNoPV_.reserve(1); + max_d0NoPV_.reserve(1); + max_z0NoPV_.reserve(1); + preFilter_.reserve(1); + max_relpterr_.reserve(1); + min_nhits_.reserve(1); + max_minMissHitOutOrIn_.reserve(1); + max_lostHitFraction_.reserve(1); + min_eta_.reserve(1); + max_eta_.reserve(1); + forest_.reserve(1); + mvaType_.reserve(1); + useMVA_.reserve(1); + + produces>("MVAVals"); + //foward compatibility + produces("MVAValues"); + useAnyMVA_ = false; + forest_[0] = nullptr; + if (cfg.exists("useAnyMVA")) + useAnyMVA_ = cfg.getParameter("useAnyMVA"); + + src_ = consumes(cfg.getParameter("src")); + hSrc_ = consumes(cfg.getParameter("src")); + beamspot_ = consumes(cfg.getParameter("beamspot")); + useVertices_ = cfg.getParameter("useVertices"); + useVtxError_ = cfg.getParameter("useVtxError"); + if (useVertices_) + vertices_ = consumes(cfg.getParameter("vertices")); + copyExtras_ = cfg.getUntrackedParameter("copyExtras", false); + copyTrajectories_ = cfg.getUntrackedParameter("copyTrajectories", false); + if (copyTrajectories_) { + srcTraj_ = consumes>(cfg.getParameter("src")); + srcTass_ = consumes(cfg.getParameter("src")); + } -AnalyticalTrackSelector::AnalyticalTrackSelector( const edm::ParameterSet & cfg ) : MultiTrackSelector( ) -{ - //Spoof the pset for each track selector! - //Size is always 1!!! - qualityToSet_.reserve(1); - vtxNumber_.reserve(1); - vertexCut_.reserve(1); - res_par_.reserve(1); - chi2n_par_.reserve(1); - chi2n_no1Dmod_par_.reserve(1); - d0_par1_.reserve(1); - dz_par1_.reserve(1); - d0_par2_.reserve(1); - dz_par2_.reserve(1); - applyAdaptedPVCuts_.reserve(1); - max_d0_.reserve(1); - max_z0_.reserve(1); - nSigmaZ_.reserve(1); - min_layers_.reserve(1); - min_3Dlayers_.reserve(1); - max_lostLayers_.reserve(1); - min_hits_bypass_.reserve(1); - applyAbsCutsIfNoPV_.reserve(1); - max_d0NoPV_.reserve(1); - max_z0NoPV_.reserve(1); - preFilter_.reserve(1); - max_relpterr_.reserve(1); - min_nhits_.reserve(1); - max_minMissHitOutOrIn_.reserve(1); - max_lostHitFraction_.reserve(1); - min_eta_.reserve(1); - max_eta_.reserve(1); - forest_.reserve(1); - mvaType_.reserve(1); - useMVA_.reserve(1); - - produces >("MVAVals"); - //foward compatibility - produces("MVAValues"); - useAnyMVA_ = false; - forest_[0] = nullptr; - if(cfg.exists("useAnyMVA")) useAnyMVA_ = cfg.getParameter("useAnyMVA"); - - src_ = consumes(cfg.getParameter( "src" )); - hSrc_ = consumes(cfg.getParameter( "src" )); - beamspot_ = consumes(cfg.getParameter( "beamspot" )); - useVertices_ = cfg.getParameter( "useVertices" ); - useVtxError_ = cfg.getParameter( "useVtxError" ); - if (useVertices_) vertices_ = consumes(cfg.getParameter( "vertices" )); - copyExtras_ = cfg.getUntrackedParameter("copyExtras", false); - copyTrajectories_ = cfg.getUntrackedParameter("copyTrajectories", false); - if (copyTrajectories_) { - srcTraj_ = consumes >(cfg.getParameter( "src" )); - srcTass_ = consumes(cfg.getParameter( "src" )); - } - - qualityToSet_.push_back( TrackBase::undefQuality ); - // parameters for vertex selection - vtxNumber_.push_back( useVertices_ ? cfg.getParameter("vtxNumber") : 0 ); - vertexCut_.push_back( useVertices_ ? cfg.getParameter("vertexCut") : ""); - // parameters for adapted optimal cuts on chi2 and primary vertex compatibility - res_par_.push_back(cfg.getParameter< std::vector >("res_par") ); - chi2n_par_.push_back( cfg.getParameter("chi2n_par") ); - chi2n_no1Dmod_par_.push_back( cfg.getParameter("chi2n_no1Dmod_par") ); - d0_par1_.push_back(cfg.getParameter< std::vector >("d0_par1")); - dz_par1_.push_back(cfg.getParameter< std::vector >("dz_par1")); - d0_par2_.push_back(cfg.getParameter< std::vector >("d0_par2")); - dz_par2_.push_back(cfg.getParameter< std::vector >("dz_par2")); - - // Boolean indicating if adapted primary vertex compatibility cuts are to be applied. - applyAdaptedPVCuts_.push_back(cfg.getParameter("applyAdaptedPVCuts")); - // Impact parameter absolute cuts. - max_d0_.push_back(cfg.getParameter("max_d0")); - max_z0_.push_back(cfg.getParameter("max_z0")); - nSigmaZ_.push_back(cfg.getParameter("nSigmaZ")); - // Cuts on numbers of layers with hits/3D hits/lost hits. - min_layers_.push_back(cfg.getParameter("minNumberLayers") ); - min_3Dlayers_.push_back(cfg.getParameter("minNumber3DLayers") ); - max_lostLayers_.push_back(cfg.getParameter("maxNumberLostLayers")); - min_hits_bypass_.push_back(cfg.getParameter("minHitsToBypassChecks")); - max_relpterr_.push_back(cfg.getParameter("max_relpterr")); - min_nhits_.push_back(cfg.getParameter("min_nhits")); - max_minMissHitOutOrIn_.push_back( - cfg.existsAs("max_minMissHitOutOrIn") ? - cfg.getParameter("max_minMissHitOutOrIn") : 99); - max_lostHitFraction_.push_back( - cfg.existsAs("max_lostHitFraction") ? - cfg.getParameter("max_lostHitFraction") : 1.0); - min_eta_.push_back(cfg.getParameter("min_eta")); - max_eta_.push_back(cfg.getParameter("max_eta")); - - // Flag to apply absolute cuts if no PV passes the selection - applyAbsCutsIfNoPV_.push_back(cfg.getParameter("applyAbsCutsIfNoPV")); - keepAllTracks_.push_back( cfg.exists("keepAllTracks") ? - cfg.getParameter("keepAllTracks") : - false ); - - setQualityBit_.push_back( false ); + qualityToSet_.push_back(TrackBase::undefQuality); + // parameters for vertex selection + vtxNumber_.push_back(useVertices_ ? cfg.getParameter("vtxNumber") : 0); + vertexCut_.push_back(useVertices_ ? cfg.getParameter("vertexCut") : ""); + // parameters for adapted optimal cuts on chi2 and primary vertex compatibility + res_par_.push_back(cfg.getParameter>("res_par")); + chi2n_par_.push_back(cfg.getParameter("chi2n_par")); + chi2n_no1Dmod_par_.push_back(cfg.getParameter("chi2n_no1Dmod_par")); + d0_par1_.push_back(cfg.getParameter>("d0_par1")); + dz_par1_.push_back(cfg.getParameter>("dz_par1")); + d0_par2_.push_back(cfg.getParameter>("d0_par2")); + dz_par2_.push_back(cfg.getParameter>("dz_par2")); + + // Boolean indicating if adapted primary vertex compatibility cuts are to be applied. + applyAdaptedPVCuts_.push_back(cfg.getParameter("applyAdaptedPVCuts")); + // Impact parameter absolute cuts. + max_d0_.push_back(cfg.getParameter("max_d0")); + max_z0_.push_back(cfg.getParameter("max_z0")); + nSigmaZ_.push_back(cfg.getParameter("nSigmaZ")); + // Cuts on numbers of layers with hits/3D hits/lost hits. + min_layers_.push_back(cfg.getParameter("minNumberLayers")); + min_3Dlayers_.push_back(cfg.getParameter("minNumber3DLayers")); + max_lostLayers_.push_back(cfg.getParameter("maxNumberLostLayers")); + min_hits_bypass_.push_back(cfg.getParameter("minHitsToBypassChecks")); + max_relpterr_.push_back(cfg.getParameter("max_relpterr")); + min_nhits_.push_back(cfg.getParameter("min_nhits")); + max_minMissHitOutOrIn_.push_back( + cfg.existsAs("max_minMissHitOutOrIn") ? cfg.getParameter("max_minMissHitOutOrIn") : 99); + max_lostHitFraction_.push_back( + cfg.existsAs("max_lostHitFraction") ? cfg.getParameter("max_lostHitFraction") : 1.0); + min_eta_.push_back(cfg.getParameter("min_eta")); + max_eta_.push_back(cfg.getParameter("max_eta")); + + // Flag to apply absolute cuts if no PV passes the selection + applyAbsCutsIfNoPV_.push_back(cfg.getParameter("applyAbsCutsIfNoPV")); + keepAllTracks_.push_back(cfg.exists("keepAllTracks") ? cfg.getParameter("keepAllTracks") : false); + + setQualityBit_.push_back(false); + std::string qualityStr = cfg.getParameter("qualityBit"); + + if (d0_par1_[0].size() != 2 || dz_par1_[0].size() != 2 || d0_par2_[0].size() != 2 || dz_par2_[0].size() != 2) { + edm::LogError("MisConfiguration") << "vector of size less then 2"; + throw; + } + + if (cfg.exists("qualityBit")) { std::string qualityStr = cfg.getParameter("qualityBit"); - - if(d0_par1_[0].size()!=2 || dz_par1_[0].size()!=2 || d0_par2_[0].size()!=2 || dz_par2_[0].size()!=2) - { - edm::LogError("MisConfiguration")<<"vector of size less then 2"; - throw; + if (!qualityStr.empty()) { + setQualityBit_[0] = true; + qualityToSet_[0] = TrackBase::qualityByName(cfg.getParameter("qualityBit")); } + } - if (cfg.exists("qualityBit")) { - std::string qualityStr = cfg.getParameter("qualityBit"); - if (!qualityStr.empty()) { - setQualityBit_[0] = true; - qualityToSet_ [0] = TrackBase::qualityByName(cfg.getParameter("qualityBit")); - } - } - - if (keepAllTracks_[0] && !setQualityBit_[0]) throw cms::Exception("Configuration") << - "If you set 'keepAllTracks' to true, you must specify which qualityBit to set.\n"; - if (setQualityBit_[0] && (qualityToSet_[0] == TrackBase::undefQuality)) throw cms::Exception("Configuration") << - "You can't set the quality bit " << cfg.getParameter("qualityBit") << " as it is 'undefQuality' or unknown.\n"; - if (applyAbsCutsIfNoPV_[0]) { - max_d0NoPV_.push_back(cfg.getParameter("max_d0NoPV")); - max_z0NoPV_.push_back(cfg.getParameter("max_z0NoPV")); - } - else{//dummy values - max_d0NoPV_.push_back(0.); - max_z0NoPV_.push_back(0.); - } + if (keepAllTracks_[0] && !setQualityBit_[0]) + throw cms::Exception("Configuration") + << "If you set 'keepAllTracks' to true, you must specify which qualityBit to set.\n"; + if (setQualityBit_[0] && (qualityToSet_[0] == TrackBase::undefQuality)) + throw cms::Exception("Configuration") + << "You can't set the quality bit " << cfg.getParameter("qualityBit") + << " as it is 'undefQuality' or unknown.\n"; + if (applyAbsCutsIfNoPV_[0]) { + max_d0NoPV_.push_back(cfg.getParameter("max_d0NoPV")); + max_z0NoPV_.push_back(cfg.getParameter("max_z0NoPV")); + } else { //dummy values + max_d0NoPV_.push_back(0.); + max_z0NoPV_.push_back(0.); + } - if(useAnyMVA_){ - bool thisMVA = false; - if(cfg.exists("useMVA"))thisMVA = cfg.getParameter("useMVA"); - useMVA_.push_back(thisMVA); - if(thisMVA){ - double minVal = -1; - if(cfg.exists("minMVA"))minVal = cfg.getParameter("minMVA"); - min_MVA_.push_back(minVal); - mvaType_.push_back(cfg.exists("mvaType") ? cfg.getParameter("mvaType") : "Detached"); - forestLabel_.push_back(cfg.exists("GBRForestLabel") ? cfg.getParameter("GBRForestLabel") : "MVASelectorIter0"); - useMVAonly_.push_back(cfg.exists("useMVAonly") ? cfg.getParameter("useMVAonly") : false); - }else{ - min_MVA_.push_back(-9999.0); - useMVAonly_.push_back(false); - mvaType_.push_back("Detached"); - forestLabel_.push_back("MVASelectorIter0"); - } - }else{ - useMVA_.push_back(false); - useMVAonly_.push_back(false); + if (useAnyMVA_) { + bool thisMVA = false; + if (cfg.exists("useMVA")) + thisMVA = cfg.getParameter("useMVA"); + useMVA_.push_back(thisMVA); + if (thisMVA) { + double minVal = -1; + if (cfg.exists("minMVA")) + minVal = cfg.getParameter("minMVA"); + min_MVA_.push_back(minVal); + mvaType_.push_back(cfg.exists("mvaType") ? cfg.getParameter("mvaType") : "Detached"); + forestLabel_.push_back(cfg.exists("GBRForestLabel") ? cfg.getParameter("GBRForestLabel") + : "MVASelectorIter0"); + useMVAonly_.push_back(cfg.exists("useMVAonly") ? cfg.getParameter("useMVAonly") : false); + } else { min_MVA_.push_back(-9999.0); + useMVAonly_.push_back(false); mvaType_.push_back("Detached"); forestLabel_.push_back("MVASelectorIter0"); } - - std::string alias( cfg.getParameter( "@module_label" ) ); - produces().setBranchAlias( alias + "Tracks"); - if (copyExtras_) { - produces().setBranchAlias( alias + "TrackExtras"); - produces().setBranchAlias( alias + "RecHits"); - } - if (copyTrajectories_) { - produces< std::vector >().setBranchAlias( alias + "Trajectories"); - produces< TrajTrackAssociationCollection >().setBranchAlias( alias + "TrajectoryTrackAssociations"); - } -} + } else { + useMVA_.push_back(false); + useMVAonly_.push_back(false); + min_MVA_.push_back(-9999.0); + mvaType_.push_back("Detached"); + forestLabel_.push_back("MVASelectorIter0"); + } -AnalyticalTrackSelector::~AnalyticalTrackSelector() { + std::string alias(cfg.getParameter("@module_label")); + produces().setBranchAlias(alias + "Tracks"); + if (copyExtras_) { + produces().setBranchAlias(alias + "TrackExtras"); + produces().setBranchAlias(alias + "RecHits"); + } + if (copyTrajectories_) { + produces>().setBranchAlias(alias + "Trajectories"); + produces().setBranchAlias(alias + "TrajectoryTrackAssociations"); + } } - -void AnalyticalTrackSelector::run( edm::Event& evt, const edm::EventSetup& es ) const -{ - - // storage.... - std::unique_ptr selTracks_; - std::unique_ptr selTrackExtras_; - std::unique_ptr selHits_; - std::unique_ptr > selTrajs_; - std::unique_ptr > selTrajPtrs_; - std::unique_ptr selTTAss_; - reco::TrackRefProd rTracks_; - reco::TrackExtraRefProd rTrackExtras_; - TrackingRecHitRefProd rHits_; - edm::RefProd< std::vector > rTrajectories_; - std::vector trackRefs_; - - - using namespace std; +AnalyticalTrackSelector::~AnalyticalTrackSelector() {} + +void AnalyticalTrackSelector::run(edm::Event& evt, const edm::EventSetup& es) const { + // storage.... + std::unique_ptr selTracks_; + std::unique_ptr selTrackExtras_; + std::unique_ptr selHits_; + std::unique_ptr> selTrajs_; + std::unique_ptr> selTrajPtrs_; + std::unique_ptr selTTAss_; + reco::TrackRefProd rTracks_; + reco::TrackExtraRefProd rTrackExtras_; + TrackingRecHitRefProd rHits_; + edm::RefProd> rTrajectories_; + std::vector trackRefs_; + + using namespace std; using namespace edm; using namespace reco; Handle hSrcTrack; - Handle< vector > hTraj; - Handle< vector > hTrajP; - Handle< TrajTrackAssociationCollection > hTTAss; + Handle> hTraj; + Handle> hTrajP; + Handle hTTAss; // looking for the beam spot edm::Handle hBsp; evt.getByToken(beamspot_, hBsp); reco::BeamSpot vertexBeamSpot; vertexBeamSpot = *hBsp; - + // Select good primary vertices for use in subsequent track selection edm::Handle hVtx; std::vector points; std::vector vterr, vzerr; if (useVertices_) { - evt.getByToken(vertices_, hVtx); - selectVertices(0,*hVtx, points, vterr, vzerr); - // Debug - LogDebug("SelectVertex") << points.size() << " good pixel vertices"; + evt.getByToken(vertices_, hVtx); + selectVertices(0, *hVtx, points, vterr, vzerr); + // Debug + LogDebug("SelectVertex") << points.size() << " good pixel vertices"; } - // Get tracks - evt.getByToken( src_, hSrcTrack ); + // Get tracks + evt.getByToken(src_, hSrcTrack); // get hits in track.. Handle hSrcHits; - evt.getByToken( hSrc_, hSrcHits ); - const TrackingRecHitCollection & srcHits(*hSrcHits); - - + evt.getByToken(hSrc_, hSrcHits); + const TrackingRecHitCollection& srcHits(*hSrcHits); selTracks_ = std::make_unique(); - rTracks_ = evt.getRefBeforePut(); + rTracks_ = evt.getRefBeforePut(); if (copyExtras_) { selTrackExtras_ = std::make_unique(); selHits_ = std::make_unique(); @@ -299,109 +287,114 @@ void AnalyticalTrackSelector::run( edm::Event& evt, const edm::EventSetup& es ) rTrackExtras_ = evt.getRefBeforePut(); } - if (copyTrajectories_) trackRefs_.resize(hSrcTrack->size()); + if (copyTrajectories_) + trackRefs_.resize(hSrcTrack->size()); - std::vector mvaVals_(hSrcTrack->size(),-99.f); - processMVA(evt,es,vertexBeamSpot,*(hVtx.product()),0,mvaVals_,true); + std::vector mvaVals_(hSrcTrack->size(), -99.f); + processMVA(evt, es, vertexBeamSpot, *(hVtx.product()), 0, mvaVals_, true); // Loop over tracks size_t current = 0; for (TrackCollection::const_iterator it = hSrcTrack->begin(), ed = hSrcTrack->end(); it != ed; ++it, ++current) { - const Track & trk = * it; + const Track& trk = *it; // Check if this track passes cuts - LogTrace("TrackSelection") << "ready to check track with pt="<< trk.pt() ; + LogTrace("TrackSelection") << "ready to check track with pt=" << trk.pt(); float mvaVal = 0; - if(useAnyMVA_)mvaVal = mvaVals_[current]; - bool ok = select(0,vertexBeamSpot, srcHits, trk, points, vterr, vzerr,mvaVal); + if (useAnyMVA_) + mvaVal = mvaVals_[current]; + bool ok = select(0, vertexBeamSpot, srcHits, trk, points, vterr, vzerr, mvaVal); if (!ok) { + LogTrace("TrackSelection") << "track with pt=" << trk.pt() << " NOT selected"; - LogTrace("TrackSelection") << "track with pt="<< trk.pt() << " NOT selected"; - - if (copyTrajectories_) trackRefs_[current] = reco::TrackRef(); - if (!keepAllTracks_[0]) continue; + if (copyTrajectories_) + trackRefs_[current] = reco::TrackRef(); + if (!keepAllTracks_[0]) + continue; } - LogTrace("TrackSelection") << "track with pt="<< trk.pt() << " selected"; - selTracks_->push_back( Track( trk ) ); // clone and store + LogTrace("TrackSelection") << "track with pt=" << trk.pt() << " selected"; + selTracks_->push_back(Track(trk)); // clone and store if (ok && setQualityBit_[0]) { selTracks_->back().setQuality(qualityToSet_[0]); - if (qualityToSet_[0]==TrackBase::tight) { - selTracks_->back().setQuality(TrackBase::loose); - } - else if (qualityToSet_[0]==TrackBase::highPurity) { - selTracks_->back().setQuality(TrackBase::loose); - selTracks_->back().setQuality(TrackBase::tight); + if (qualityToSet_[0] == TrackBase::tight) { + selTracks_->back().setQuality(TrackBase::loose); + } else if (qualityToSet_[0] == TrackBase::highPurity) { + selTracks_->back().setQuality(TrackBase::loose); + selTracks_->back().setQuality(TrackBase::tight); } if (!points.empty()) { - if (qualityToSet_[0]==TrackBase::loose) { - selTracks_->back().setQuality(TrackBase::looseSetWithPV); - } - else if (qualityToSet_[0]==TrackBase::highPurity) { - selTracks_->back().setQuality(TrackBase::looseSetWithPV); - selTracks_->back().setQuality(TrackBase::highPuritySetWithPV); - } + if (qualityToSet_[0] == TrackBase::loose) { + selTracks_->back().setQuality(TrackBase::looseSetWithPV); + } else if (qualityToSet_[0] == TrackBase::highPurity) { + selTracks_->back().setQuality(TrackBase::looseSetWithPV); + selTracks_->back().setQuality(TrackBase::highPuritySetWithPV); + } } } if (copyExtras_) { // TrackExtras - selTrackExtras_->push_back( TrackExtra( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(), - trk.innerPosition(), trk.innerMomentum(), trk.innerOk(), - trk.outerStateCovariance(), trk.outerDetId(), - trk.innerStateCovariance(), trk.innerDetId(), - trk.seedDirection(), trk.seedRef() ) ); - selTracks_->back().setExtra( TrackExtraRef( rTrackExtras_, selTrackExtras_->size() - 1) ); - TrackExtra & tx = selTrackExtras_->back(); + selTrackExtras_->push_back(TrackExtra(trk.outerPosition(), + trk.outerMomentum(), + trk.outerOk(), + trk.innerPosition(), + trk.innerMomentum(), + trk.innerOk(), + trk.outerStateCovariance(), + trk.outerDetId(), + trk.innerStateCovariance(), + trk.innerDetId(), + trk.seedDirection(), + trk.seedRef())); + selTracks_->back().setExtra(TrackExtraRef(rTrackExtras_, selTrackExtras_->size() - 1)); + TrackExtra& tx = selTrackExtras_->back(); tx.setResiduals(trk.residuals()); // TrackingRecHits auto const firstHitIndex = selHits_->size(); - for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit ) { - selHits_->push_back( (*hit)->clone() ); + for (trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++hit) { + selHits_->push_back((*hit)->clone()); } - tx.setHits( rHits_, firstHitIndex, selHits_->size() - firstHitIndex); - tx.setTrajParams(trk.extra()->trajParams(),trk.extra()->chi2sX5()); + tx.setHits(rHits_, firstHitIndex, selHits_->size() - firstHitIndex); + tx.setTrajParams(trk.extra()->trajParams(), trk.extra()->chi2sX5()); } if (copyTrajectories_) { trackRefs_[current] = TrackRef(rTracks_, selTracks_->size() - 1); } } - if ( copyTrajectories_ ) { - Handle< vector > hTraj; - Handle< TrajTrackAssociationCollection > hTTAss; + if (copyTrajectories_) { + Handle> hTraj; + Handle hTTAss; evt.getByToken(srcTass_, hTTAss); evt.getByToken(srcTraj_, hTraj); - selTrajs_ = std::make_unique>(); - rTrajectories_ = evt.getRefBeforePut< vector >(); + selTrajs_ = std::make_unique>(); + rTrajectories_ = evt.getRefBeforePut>(); selTTAss_ = std::make_unique(rTrajectories_, rTracks_); for (size_t i = 0, n = hTraj->size(); i < n; ++i) { - Ref< vector > trajRef(hTraj, i); + Ref> trajRef(hTraj, i); TrajTrackAssociationCollection::const_iterator match = hTTAss->find(trajRef); if (match != hTTAss->end()) { - const Ref &trkRef = match->val; - short oldKey = static_cast(trkRef.key()); - if (trackRefs_[oldKey].isNonnull()) { - selTrajs_->push_back( Trajectory(*trajRef) ); - selTTAss_->insert ( Ref< vector >(rTrajectories_, selTrajs_->size() - 1), trackRefs_[oldKey] ); - } + const Ref& trkRef = match->val; + short oldKey = static_cast(trkRef.key()); + if (trackRefs_[oldKey].isNonnull()) { + selTrajs_->push_back(Trajectory(*trajRef)); + selTTAss_->insert(Ref>(rTrajectories_, selTrajs_->size() - 1), trackRefs_[oldKey]); + } } } } evt.put(std::move(selTracks_)); - if (copyExtras_ ) { - evt.put(std::move(selTrackExtras_)); + if (copyExtras_) { + evt.put(std::move(selTrackExtras_)); evt.put(std::move(selHits_)); } - if ( copyTrajectories_ ) { + if (copyTrajectories_) { evt.put(std::move(selTrajs_)); evt.put(std::move(selTTAss_)); } } - #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" - DEFINE_FWK_MODULE(AnalyticalTrackSelector); - diff --git a/RecoTracker/FinalTrackSelectors/plugins/ClassifierMerger.cc b/RecoTracker/FinalTrackSelectors/plugins/ClassifierMerger.cc index 8ad51a7c76f7a..cf6e81496bbe4 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/ClassifierMerger.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/ClassifierMerger.cc @@ -6,72 +6,63 @@ #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" - -#include -#include +#include +#include namespace { class ClassifierMerger final : public edm::global::EDProducer<> { - public: + public: explicit ClassifierMerger(const edm::ParameterSet& conf) { - for (auto const & it : conf.getParameter >("inputClassifiers")) { - srcMVAs.push_back(consumes(edm::InputTag(it,"MVAValues"))); - srcQuals.push_back(consumes(edm::InputTag(it,"QualityMasks"))); + for (auto const& it : conf.getParameter>("inputClassifiers")) { + srcMVAs.push_back(consumes(edm::InputTag(it, "MVAValues"))); + srcQuals.push_back(consumes(edm::InputTag(it, "QualityMasks"))); } produces("MVAValues"); produces("QualityMasks"); - } - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add >("inputClassifiers",std::vector()); + desc.add>("inputClassifiers", std::vector()); descriptions.add("ClassifierMerger", desc); } - private: - - using MVACollection = std::vector; - using QualityMaskCollection = std::vector; - - void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override { - - // get Master - edm::Handle hmva; - evt.getByToken(srcMVAs[0], hmva); - auto size = (*hmva).size(); - - edm::Handle hqual; - evt.getByToken(srcQuals[0], hqual); - - - // products - auto mvas = std::make_unique(*hmva); - auto quals = std::make_unique(*hqual); - - for (auto i=1U; i; + using QualityMaskCollection = std::vector; + + void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override { + // get Master + edm::Handle hmva; + evt.getByToken(srcMVAs[0], hmva); + auto size = (*hmva).size(); + + edm::Handle hqual; + evt.getByToken(srcQuals[0], hqual); + + // products + auto mvas = std::make_unique(*hmva); + auto quals = std::make_unique(*hqual); + + for (auto i = 1U; i < srcQuals.size(); ++i) { + evt.getByToken(srcQuals[i], hqual); + auto const& iq = *hqual; + assert(iq.size() == size); + for (auto j = 0U; j != size; ++j) + (*quals)[j] |= iq[j]; } - - std::vector> srcMVAs; - std::vector> srcQuals; - - }; -} + evt.put(std::move(mvas), "MVAValues"); + evt.put(std::move(quals), "QualityMasks"); + } + std::vector> srcMVAs; + std::vector> srcQuals; + }; +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(ClassifierMerger); - diff --git a/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc index 6f48fd7d4a9d5..6f976634b98b5 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSelector.cc @@ -14,7 +14,7 @@ #include #include #include "FWCore/Framework/interface/stream/EDProducer.h" -#include "FWCore/Framework/interface/EventPrincipal.h" +#include "FWCore/Framework/interface/EventPrincipal.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/InputTag.h" @@ -29,282 +29,296 @@ using namespace reco; - class dso_hidden CosmicTrackSelector final : public edm::stream::EDProducer<> { - private: - public: - // constructor - explicit CosmicTrackSelector( const edm::ParameterSet & cfg ) ; - // destructor - ~CosmicTrackSelector() override ; - - private: - typedef math::XYZPoint Point; - // process one event - void produce( edm::Event& evt, const edm::EventSetup& es ) override; - // return class, or -1 if rejected - bool select (const reco::BeamSpot &vertexBeamSpot, const reco::Track &tk); - // source collection label - edm::EDGetTokenT src_; - edm::EDGetTokenT beamspot_; - // copy only the tracks, not extras and rechits (for AOD) - bool copyExtras_; - // copy also trajectories and trajectory->track associations - bool copyTrajectories_; - edm::EDGetTokenT > srcTraj_; - edm::EDGetTokenT srcTass_; - - // save all the tracks - bool keepAllTracks_; - // do I have to set a quality bit? - bool setQualityBit_; - TrackBase::TrackQuality qualityToSet_; - - // parameters for adapted optimal cuts on chi2 and primary vertex compatibility - std::vector res_par_; - double chi2n_par_; - - // Impact parameter absolute cuts - double max_d0_; - double max_z0_; - // Trackk parameter cuts - double min_pt_; - double max_eta_; - // Cut on number of valid hits - uint32_t min_nHit_; - // Cut on number of valid Pixel hits - uint32_t min_nPixelHit_; - // Cuts on numbers of layers with hits/3D hits/lost hits. - uint32_t min_layers_; - uint32_t min_3Dlayers_; - uint32_t max_lostLayers_; - - // storage - std::unique_ptr selTracks_; - std::unique_ptr selTrackExtras_; - std::unique_ptr selHits_; - std::unique_ptr > selTrajs_; - std::unique_ptr > selTrajPtrs_; - std::unique_ptr selTTAss_; - reco::TrackRefProd rTracks_; - reco::TrackExtraRefProd rTrackExtras_; - TrackingRecHitRefProd rHits_; - edm::RefProd< std::vector > rTrajectories_; - std::vector trackRefs_; - - }; - -#include -#include "TMath.h" +class dso_hidden CosmicTrackSelector final : public edm::stream::EDProducer<> { +private: +public: + // constructor + explicit CosmicTrackSelector(const edm::ParameterSet &cfg); + // destructor + ~CosmicTrackSelector() override; -CosmicTrackSelector::CosmicTrackSelector( const edm::ParameterSet & cfg ) : - src_( consumes( cfg.getParameter( "src" ) ) ), - beamspot_( consumes( cfg.getParameter( "beamspot" ) ) ), - copyExtras_(cfg.getUntrackedParameter("copyExtras", false)), - copyTrajectories_(cfg.getUntrackedParameter("copyTrajectories", false)), - keepAllTracks_( cfg.exists("keepAllTracks") ? - cfg.getParameter("keepAllTracks") : - false ), // as this is what you expect from a well behaved selector - setQualityBit_( false ), - qualityToSet_( TrackBase::undefQuality ), - chi2n_par_( cfg.getParameter("chi2n_par") ), - // Impact parameter absolute cuts. - max_d0_(cfg.getParameter("max_d0")), - max_z0_(cfg.getParameter("max_z0")), - // Track parameter cuts. - min_pt_(cfg.getParameter("min_pt")), - max_eta_(cfg.getParameter("max_eta")), - // Cut on number of valid hits - min_nHit_(cfg.getParameter("min_nHit")), +private: + typedef math::XYZPoint Point; + // process one event + void produce(edm::Event &evt, const edm::EventSetup &es) override; + // return class, or -1 if rejected + bool select(const reco::BeamSpot &vertexBeamSpot, const reco::Track &tk); + // source collection label + edm::EDGetTokenT src_; + edm::EDGetTokenT beamspot_; + // copy only the tracks, not extras and rechits (for AOD) + bool copyExtras_; + // copy also trajectories and trajectory->track associations + bool copyTrajectories_; + edm::EDGetTokenT> srcTraj_; + edm::EDGetTokenT srcTass_; + + // save all the tracks + bool keepAllTracks_; + // do I have to set a quality bit? + bool setQualityBit_; + TrackBase::TrackQuality qualityToSet_; + + // parameters for adapted optimal cuts on chi2 and primary vertex compatibility + std::vector res_par_; + double chi2n_par_; + + // Impact parameter absolute cuts + double max_d0_; + double max_z0_; + // Trackk parameter cuts + double min_pt_; + double max_eta_; // Cut on number of valid hits - min_nPixelHit_(cfg.getParameter("min_nPixelHit")), + uint32_t min_nHit_; + // Cut on number of valid Pixel hits + uint32_t min_nPixelHit_; // Cuts on numbers of layers with hits/3D hits/lost hits. - min_layers_(cfg.getParameter("minNumberLayers") ), - min_3Dlayers_(cfg.getParameter("minNumber3DLayers") ), - max_lostLayers_(cfg.getParameter("maxNumberLostLayers") ) -{ + uint32_t min_layers_; + uint32_t min_3Dlayers_; + uint32_t max_lostLayers_; + + // storage + std::unique_ptr selTracks_; + std::unique_ptr selTrackExtras_; + std::unique_ptr selHits_; + std::unique_ptr> selTrajs_; + std::unique_ptr> selTrajPtrs_; + std::unique_ptr selTTAss_; + reco::TrackRefProd rTracks_; + reco::TrackExtraRefProd rTrackExtras_; + TrackingRecHitRefProd rHits_; + edm::RefProd> rTrajectories_; + std::vector trackRefs_; +}; + +#include +#include "TMath.h" + +CosmicTrackSelector::CosmicTrackSelector(const edm::ParameterSet &cfg) + : src_(consumes(cfg.getParameter("src"))), + beamspot_(consumes(cfg.getParameter("beamspot"))), + copyExtras_(cfg.getUntrackedParameter("copyExtras", false)), + copyTrajectories_(cfg.getUntrackedParameter("copyTrajectories", false)), + keepAllTracks_(cfg.exists("keepAllTracks") ? cfg.getParameter("keepAllTracks") + : false), // as this is what you expect from a well behaved selector + setQualityBit_(false), + qualityToSet_(TrackBase::undefQuality), + chi2n_par_(cfg.getParameter("chi2n_par")), + // Impact parameter absolute cuts. + max_d0_(cfg.getParameter("max_d0")), + max_z0_(cfg.getParameter("max_z0")), + // Track parameter cuts. + min_pt_(cfg.getParameter("min_pt")), + max_eta_(cfg.getParameter("max_eta")), + // Cut on number of valid hits + min_nHit_(cfg.getParameter("min_nHit")), + // Cut on number of valid hits + min_nPixelHit_(cfg.getParameter("min_nPixelHit")), + // Cuts on numbers of layers with hits/3D hits/lost hits. + min_layers_(cfg.getParameter("minNumberLayers")), + min_3Dlayers_(cfg.getParameter("minNumber3DLayers")), + max_lostLayers_(cfg.getParameter("maxNumberLostLayers")) { if (cfg.exists("qualityBit")) { std::string qualityStr = cfg.getParameter("qualityBit"); if (!qualityStr.empty()) { setQualityBit_ = true; - qualityToSet_ = TrackBase::qualityByName(cfg.getParameter("qualityBit")); + qualityToSet_ = TrackBase::qualityByName(cfg.getParameter("qualityBit")); } } - if (keepAllTracks_ && !setQualityBit_) throw cms::Exception("Configuration") << - "If you set 'keepAllTracks' to true, you must specify which qualityBit to set.\n"; - if (setQualityBit_ && (qualityToSet_ == TrackBase::undefQuality)) throw cms::Exception("Configuration") << - "You can't set the quality bit " << cfg.getParameter("qualityBit") << " as it is 'undefQuality' or unknown.\n"; - - std::string alias( cfg.getParameter( "@module_label" ) ); - produces().setBranchAlias( alias + "Tracks"); + if (keepAllTracks_ && !setQualityBit_) + throw cms::Exception("Configuration") + << "If you set 'keepAllTracks' to true, you must specify which qualityBit to set.\n"; + if (setQualityBit_ && (qualityToSet_ == TrackBase::undefQuality)) + throw cms::Exception("Configuration") + << "You can't set the quality bit " << cfg.getParameter("qualityBit") + << " as it is 'undefQuality' or unknown.\n"; + + std::string alias(cfg.getParameter("@module_label")); + produces().setBranchAlias(alias + "Tracks"); if (copyExtras_) { - produces().setBranchAlias( alias + "TrackExtras"); - produces().setBranchAlias( alias + "RecHits"); + produces().setBranchAlias(alias + "TrackExtras"); + produces().setBranchAlias(alias + "RecHits"); } if (copyTrajectories_) { - srcTraj_ = consumes >(cfg.getParameter( "src" )); - srcTass_ = consumes(cfg.getParameter( "src" )); - produces< std::vector >().setBranchAlias( alias + "Trajectories"); - produces< TrajTrackAssociationCollection >().setBranchAlias( alias + "TrajectoryTrackAssociations"); + srcTraj_ = consumes>(cfg.getParameter("src")); + srcTass_ = consumes(cfg.getParameter("src")); + produces>().setBranchAlias(alias + "Trajectories"); + produces().setBranchAlias(alias + "TrajectoryTrackAssociations"); } - } -CosmicTrackSelector::~CosmicTrackSelector() { -} +CosmicTrackSelector::~CosmicTrackSelector() {} -void CosmicTrackSelector::produce( edm::Event& evt, const edm::EventSetup& es ) -{ - using namespace std; +void CosmicTrackSelector::produce(edm::Event &evt, const edm::EventSetup &es) { + using namespace std; using namespace edm; using namespace reco; - + Handle hSrcTrack; - Handle< vector > hTraj; - Handle< vector > hTrajP; - Handle< TrajTrackAssociationCollection > hTTAss; - + Handle> hTraj; + Handle> hTrajP; + Handle hTTAss; + // looking for the beam spot edm::Handle hBsp; evt.getByToken(beamspot_, hBsp); reco::BeamSpot vertexBeamSpot; vertexBeamSpot = *hBsp; - - // Get tracks - evt.getByToken( src_, hSrcTrack ); - + + // Get tracks + evt.getByToken(src_, hSrcTrack); + selTracks_ = std::make_unique(); - rTracks_ = evt.getRefBeforePut(); + rTracks_ = evt.getRefBeforePut(); if (copyExtras_) { selTrackExtras_ = std::make_unique(); selHits_ = std::make_unique(); rHits_ = evt.getRefBeforePut(); rTrackExtras_ = evt.getRefBeforePut(); } - - if (copyTrajectories_) trackRefs_.resize(hSrcTrack->size()); - + + if (copyTrajectories_) + trackRefs_.resize(hSrcTrack->size()); + // Loop over tracks size_t current = 0; for (TrackCollection::const_iterator it = hSrcTrack->begin(), ed = hSrcTrack->end(); it != ed; ++it, ++current) { - const Track & trk = * it; + const Track &trk = *it; // Check if this track passes cuts bool ok = select(vertexBeamSpot, trk); if (!ok) { - if (copyTrajectories_) trackRefs_[current] = reco::TrackRef(); - if (!keepAllTracks_) continue; + if (copyTrajectories_) + trackRefs_[current] = reco::TrackRef(); + if (!keepAllTracks_) + continue; } - selTracks_->push_back( Track( trk ) ); // clone and store - if (ok && setQualityBit_) selTracks_->back().setQuality(qualityToSet_); + selTracks_->push_back(Track(trk)); // clone and store + if (ok && setQualityBit_) + selTracks_->back().setQuality(qualityToSet_); if (copyExtras_) { // TrackExtras - selTrackExtras_->push_back( TrackExtra( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(), - trk.innerPosition(), trk.innerMomentum(), trk.innerOk(), - trk.outerStateCovariance(), trk.outerDetId(), - trk.innerStateCovariance(), trk.innerDetId(), - trk.seedDirection(), trk.seedRef() ) ); - selTracks_->back().setExtra( TrackExtraRef( rTrackExtras_, selTrackExtras_->size() - 1) ); - TrackExtra & tx = selTrackExtras_->back(); + selTrackExtras_->push_back(TrackExtra(trk.outerPosition(), + trk.outerMomentum(), + trk.outerOk(), + trk.innerPosition(), + trk.innerMomentum(), + trk.innerOk(), + trk.outerStateCovariance(), + trk.outerDetId(), + trk.innerStateCovariance(), + trk.innerDetId(), + trk.seedDirection(), + trk.seedRef())); + selTracks_->back().setExtra(TrackExtraRef(rTrackExtras_, selTrackExtras_->size() - 1)); + TrackExtra &tx = selTrackExtras_->back(); tx.setResiduals(trk.residuals()); // TrackingRecHits auto const firstHitIndex = selHits_->size(); - for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit ) { - selHits_->push_back( (*hit)->clone() ); + for (trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++hit) { + selHits_->push_back((*hit)->clone()); } - tx.setHits( rHits_, firstHitIndex, selHits_->size() - firstHitIndex ); - tx.setTrajParams(trk.extra()->trajParams(),trk.extra()->chi2sX5()); + tx.setHits(rHits_, firstHitIndex, selHits_->size() - firstHitIndex); + tx.setTrajParams(trk.extra()->trajParams(), trk.extra()->chi2sX5()); } if (copyTrajectories_) { trackRefs_[current] = TrackRef(rTracks_, selTracks_->size() - 1); } - } - if ( copyTrajectories_ ) { - Handle< vector > hTraj; - Handle< TrajTrackAssociationCollection > hTTAss; + } + if (copyTrajectories_) { + Handle> hTraj; + Handle hTTAss; evt.getByToken(srcTass_, hTTAss); evt.getByToken(srcTraj_, hTraj); - selTrajs_ = std::make_unique>(); - rTrajectories_ = evt.getRefBeforePut< vector >(); + selTrajs_ = std::make_unique>(); + rTrajectories_ = evt.getRefBeforePut>(); selTTAss_ = std::make_unique(&evt.productGetter()); for (size_t i = 0, n = hTraj->size(); i < n; ++i) { - Ref< vector > trajRef(hTraj, i); + Ref> trajRef(hTraj, i); TrajTrackAssociationCollection::const_iterator match = hTTAss->find(trajRef); if (match != hTTAss->end()) { - const Ref &trkRef = match->val; - short oldKey = static_cast(trkRef.key()); - if (trackRefs_[oldKey].isNonnull()) { - selTrajs_->push_back( Trajectory(*trajRef) ); - selTTAss_->insert ( Ref< vector >(rTrajectories_, selTrajs_->size() - 1), trackRefs_[oldKey] ); - } + const Ref &trkRef = match->val; + short oldKey = static_cast(trkRef.key()); + if (trackRefs_[oldKey].isNonnull()) { + selTrajs_->push_back(Trajectory(*trajRef)); + selTTAss_->insert(Ref>(rTrajectories_, selTrajs_->size() - 1), trackRefs_[oldKey]); + } } } } - + static const std::string emptyString; evt.put(std::move(selTracks_)); - if (copyExtras_ ) { - evt.put(std::move(selTrackExtras_)); + if (copyExtras_) { + evt.put(std::move(selTrackExtras_)); evt.put(std::move(selHits_)); } - if ( copyTrajectories_ ) { + if (copyTrajectories_) { evt.put(std::move(selTrajs_)); evt.put(std::move(selTTAss_)); } } - bool CosmicTrackSelector::select(const reco::BeamSpot &vertexBeamSpot, const reco::Track &tk) { // Decide if the given track passes selection cuts. - - using namespace std; - + + using namespace std; + // Cuts on numbers of layers with hits/3D hits/lost hits. - uint32_t nlayers = tk.hitPattern().trackerLayersWithMeasurement(); - uint32_t nlayers3D = tk.hitPattern().pixelLayersWithMeasurement() + - tk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); + uint32_t nlayers = tk.hitPattern().trackerLayersWithMeasurement(); + uint32_t nlayers3D = + tk.hitPattern().pixelLayersWithMeasurement() + tk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); uint32_t nlayersLost = tk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); - + // Get the number of valid hits and PixelHits uint32_t nHit = 0; uint32_t nPixelHit = 0; - for ( trackingRecHit_iterator recHit = tk.recHitsBegin(); recHit != tk.recHitsEnd(); ++recHit ) { - if ( !((*recHit)->isValid()) ) continue; + for (trackingRecHit_iterator recHit = tk.recHitsBegin(); recHit != tk.recHitsEnd(); ++recHit) { + if (!((*recHit)->isValid())) + continue; ++nHit; DetId id((*recHit)->geographicalId()); - if ( (unsigned int)id.subdetId() == PixelSubdetector::PixelBarrel - || (unsigned int)id.subdetId() == PixelSubdetector::PixelEndcap ) + if ((unsigned int)id.subdetId() == PixelSubdetector::PixelBarrel || + (unsigned int)id.subdetId() == PixelSubdetector::PixelEndcap) ++nPixelHit; - } - + } + // Cut on the number of valid hits - if (nHit < min_nHit_) return false; + if (nHit < min_nHit_) + return false; // Cut on the number of valid Pixel hits - if (nPixelHit < min_nPixelHit_) return false; - if (nlayers < min_layers_) return false; - if (nlayers3D < min_3Dlayers_) return false; - if (nlayersLost > max_lostLayers_) return false; - + if (nPixelHit < min_nPixelHit_) + return false; + if (nlayers < min_layers_) + return false; + if (nlayers3D < min_3Dlayers_) + return false; + if (nlayersLost > max_lostLayers_) + return false; + // Get track parameters - double pt = tk.pt(),eta = tk.eta(), chi2n = tk.normalizedChi2(); + double pt = tk.pt(), eta = tk.eta(), chi2n = tk.normalizedChi2(); double d0 = -tk.dxy(vertexBeamSpot.position()), dz = tk.dz(); - + // Absolute cuts on all tracks impact parameters with respect to beam-spot. - if (abs(d0) > max_d0_) return false; - if (abs(dz) > max_z0_) return false; - - // optimized cuts adapted to the track eta, pt and chiquare/ndof - if (abs(eta) > max_eta_) return false; - if (pt < min_pt_) return false; - if (chi2n > chi2n_par_*nlayers) return false; - - - else + if (abs(d0) > max_d0_) + return false; + if (abs(dz) > max_z0_) + return false; + + // optimized cuts adapted to the track eta, pt and chiquare/ndof + if (abs(eta) > max_eta_) + return false; + if (pt < min_pt_) + return false; + if (chi2n > chi2n_par_ * nlayers) + return false; + + else return true; - } - #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(CosmicTrackSelector); - diff --git a/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSplitter.cc b/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSplitter.cc index 7f3648fa9bf92..6343cac8f860b 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSplitter.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/CosmicTrackSplitter.cc @@ -44,12 +44,10 @@ #include "FWCore/Framework/interface/ESHandle.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" - #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h" #include "TrackingTools/PatternTools/interface/Trajectory.h" #include "TrackingTools/TrackFitters/interface/TrajectoryStateCombiner.h" - #include /** @@ -73,162 +71,159 @@ * Individual modules: * detsToIgnore = individual list of detids on which hits must be discarded */ -namespace reco { namespace modules { - class CosmicTrackSplitter : public edm::stream::EDProducer<> { +namespace reco { + namespace modules { + class CosmicTrackSplitter : public edm::stream::EDProducer<> { public: - CosmicTrackSplitter(const edm::ParameterSet &iConfig) ; - void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; + CosmicTrackSplitter(const edm::ParameterSet &iConfig); + void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; private: - edm::EDGetTokenT tokenTracks; - edm::EDGetTokenT tokenTrajTrack; - int totalTracks_; - size_t minimumHits_; - - bool replaceWithInactiveHits_; - bool stripFrontInvalidHits_; - bool stripBackInvalidHits_; - bool stripAllInvalidHits_; - bool excludePixelHits_; - - double dZcut_; - double dXYcut_; - - std::vector detsToIgnore_; - - edm::ESHandle theGeometry; - edm::ESHandle theMagField; - - TrackCandidate makeCandidate(const reco::Track &tk, std::vector::iterator hitsBegin, std::vector::iterator hitsEnd) ; - - }; // class - - - CosmicTrackSplitter::CosmicTrackSplitter(const edm::ParameterSet &iConfig) : - minimumHits_(iConfig.getParameter("minimumHits")), - replaceWithInactiveHits_(iConfig.getParameter("replaceWithInactiveHits")), - stripFrontInvalidHits_(iConfig.getParameter("stripFrontInvalidHits")), - stripBackInvalidHits_( iConfig.getParameter("stripBackInvalidHits") ), - stripAllInvalidHits_( iConfig.getParameter("stripAllInvalidHits") ), - excludePixelHits_( iConfig.getParameter("excludePixelHits") ), - dZcut_(iConfig.getParameter("dzCut") ), - dXYcut_(iConfig.getParameter("dxyCut") ), - detsToIgnore_( iConfig.getParameter >("detsToIgnore") ) - { - // sanity check - if (stripAllInvalidHits_ && replaceWithInactiveHits_) { - throw cms::Exception("Configuration") << "Inconsistent Configuration: you can't set both 'stripAllInvalidHits' and 'replaceWithInactiveHits' to true\n"; - } - tokenTracks= consumes(iConfig.getParameter("tracks")); - tokenTrajTrack = consumes(iConfig.getParameter("tjTkAssociationMapTag") ); - - LogDebug("CosmicTrackSplitter") << "sanity check"; - - // sort detids to ignore - std::sort(detsToIgnore_.begin(), detsToIgnore_.end()); - - totalTracks_ = 0; - - // issue the produce<> - produces(); - } - - void - CosmicTrackSplitter::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) - { - LogDebug("CosmicTrackSplitter") << "IN THE SPLITTER!!!!!"; - - // read with View, so we can read also a TrackRefVector - edm::Handle > tracks; - iEvent.getByToken(tokenTracks, tracks); - - // also need trajectories ... - // Retrieve trajectories and tracks from the event - // -> merely skip if collection is empty - edm::Handle m_TrajTracksMap; - iEvent.getByToken( tokenTrajTrack, m_TrajTracksMap ); - - // read from EventSetup - iSetup.get().get(theGeometry); - iSetup.get().get(theMagField); - - // prepare output collection - auto output = std::make_unique(); - output->reserve(tracks->size()); - - // working area and tools - std::vector hits; - - // Form pairs of trajectories and tracks - //ConstTrajTrackPairCollection trajTracks; - LogDebug("CosmicTrackSplitter") << "size of map: " << m_TrajTracksMap->size(); - int HITTOSPLITFROM = 0; - for ( TrajTrackAssociationCollection::const_iterator iPair = m_TrajTracksMap->begin(); iPair != m_TrajTracksMap->end(); iPair++ ){ - const Trajectory* trajFromMap = &(*(*iPair).key); - const reco::Track* trackFromMap = &(*(*iPair).val); - - // loop to find the hit to split from (by taking dot product of pT and transverse position - std::vector measurements = trajFromMap->measurements(); - int totalNumberOfHits = measurements.size(); - int numberOfHits = 0; - double previousDotProduct = 0; - for (trackingRecHit_iterator ith = trackFromMap->recHitsBegin(), edh = trackFromMap->recHitsEnd(); ith != edh; ++ith) { - - GlobalVector stateMomentum = measurements[numberOfHits].forwardPredictedState().globalMomentum(); - GlobalPoint statePosition = measurements[numberOfHits].forwardPredictedState().globalPosition(); - double dotProduct = stateMomentum.x()*statePosition.x() + stateMomentum.y()*statePosition.y(); - if ( dotProduct*previousDotProduct < 0 ){ - //found hit to split from... - HITTOSPLITFROM = numberOfHits; - } - - previousDotProduct = dotProduct; - numberOfHits++; - - } - LogDebug("CosmicTrackSplitter") << "number of rechits: " << numberOfHits; - - // check if the trajectories and rechits are in reverse order... - trackingRecHit_iterator bIt = trackFromMap->recHitsBegin(); - trackingRecHit_iterator fIt = trackFromMap->recHitsEnd() - 1; - const TrackingRecHit* bHit = (*bIt); - const TrackingRecHit* fHit = (*fIt); - // hit type valid = 0, missing = 1, inactive = 2, bad = 3 - if( bHit->type() != 0 || bHit->isValid() != 1){ - //loop over hits forwards until first Valid hit is found - trackingRecHit_iterator ihit; - for( ihit = trackFromMap->recHitsBegin(); - ihit != trackFromMap->recHitsEnd(); ++ihit){ - const TrackingRecHit* iHit = (*ihit); - if( iHit->type() == 0 && iHit->isValid() == 1){ - bHit = iHit; - break; - } - } - } - DetId bdetid = bHit->geographicalId(); - GlobalPoint bPosHit = theGeometry->idToDetUnit( bdetid)->surface(). - toGlobal(bHit->localPosition()); - if( fHit->type() != 0 || fHit->isValid() != 1){ - //loop over hits backwards until first Valid hit is found - trackingRecHit_iterator ihitf; - for( ihitf = trackFromMap->recHitsEnd()-1; - ihitf != trackFromMap->recHitsBegin(); --ihitf){ - const TrackingRecHit* iHit = (*ihitf); - if( iHit->type() == 0 && iHit->isValid() == 1){ - fHit = iHit; - break; - } - } - } - DetId fdetid = fHit->geographicalId(); - GlobalPoint fPosHit = theGeometry-> - idToDetUnit( fdetid )->surface().toGlobal(fHit->localPosition()); - GlobalPoint bPosState = measurements[0].updatedState().globalPosition(); - GlobalPoint fPosState = measurements[measurements.size()-1]. - updatedState().globalPosition(); - bool trajReversedFlag = false; - /* + edm::EDGetTokenT tokenTracks; + edm::EDGetTokenT tokenTrajTrack; + int totalTracks_; + size_t minimumHits_; + + bool replaceWithInactiveHits_; + bool stripFrontInvalidHits_; + bool stripBackInvalidHits_; + bool stripAllInvalidHits_; + bool excludePixelHits_; + + double dZcut_; + double dXYcut_; + + std::vector detsToIgnore_; + + edm::ESHandle theGeometry; + edm::ESHandle theMagField; + + TrackCandidate makeCandidate(const reco::Track &tk, + std::vector::iterator hitsBegin, + std::vector::iterator hitsEnd); + + }; // class + + CosmicTrackSplitter::CosmicTrackSplitter(const edm::ParameterSet &iConfig) + : minimumHits_(iConfig.getParameter("minimumHits")), + replaceWithInactiveHits_(iConfig.getParameter("replaceWithInactiveHits")), + stripFrontInvalidHits_(iConfig.getParameter("stripFrontInvalidHits")), + stripBackInvalidHits_(iConfig.getParameter("stripBackInvalidHits")), + stripAllInvalidHits_(iConfig.getParameter("stripAllInvalidHits")), + excludePixelHits_(iConfig.getParameter("excludePixelHits")), + dZcut_(iConfig.getParameter("dzCut")), + dXYcut_(iConfig.getParameter("dxyCut")), + detsToIgnore_(iConfig.getParameter >("detsToIgnore")) { + // sanity check + if (stripAllInvalidHits_ && replaceWithInactiveHits_) { + throw cms::Exception("Configuration") << "Inconsistent Configuration: you can't set both 'stripAllInvalidHits' " + "and 'replaceWithInactiveHits' to true\n"; + } + tokenTracks = consumes(iConfig.getParameter("tracks")); + tokenTrajTrack = + consumes(iConfig.getParameter("tjTkAssociationMapTag")); + + LogDebug("CosmicTrackSplitter") << "sanity check"; + + // sort detids to ignore + std::sort(detsToIgnore_.begin(), detsToIgnore_.end()); + + totalTracks_ = 0; + + // issue the produce<> + produces(); + } + + void CosmicTrackSplitter::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) { + LogDebug("CosmicTrackSplitter") << "IN THE SPLITTER!!!!!"; + + // read with View, so we can read also a TrackRefVector + edm::Handle > tracks; + iEvent.getByToken(tokenTracks, tracks); + + // also need trajectories ... + // Retrieve trajectories and tracks from the event + // -> merely skip if collection is empty + edm::Handle m_TrajTracksMap; + iEvent.getByToken(tokenTrajTrack, m_TrajTracksMap); + + // read from EventSetup + iSetup.get().get(theGeometry); + iSetup.get().get(theMagField); + + // prepare output collection + auto output = std::make_unique(); + output->reserve(tracks->size()); + + // working area and tools + std::vector hits; + + // Form pairs of trajectories and tracks + //ConstTrajTrackPairCollection trajTracks; + LogDebug("CosmicTrackSplitter") << "size of map: " << m_TrajTracksMap->size(); + int HITTOSPLITFROM = 0; + for (TrajTrackAssociationCollection::const_iterator iPair = m_TrajTracksMap->begin(); + iPair != m_TrajTracksMap->end(); + iPair++) { + const Trajectory *trajFromMap = &(*(*iPair).key); + const reco::Track *trackFromMap = &(*(*iPair).val); + + // loop to find the hit to split from (by taking dot product of pT and transverse position + std::vector measurements = trajFromMap->measurements(); + int totalNumberOfHits = measurements.size(); + int numberOfHits = 0; + double previousDotProduct = 0; + for (trackingRecHit_iterator ith = trackFromMap->recHitsBegin(), edh = trackFromMap->recHitsEnd(); ith != edh; + ++ith) { + GlobalVector stateMomentum = measurements[numberOfHits].forwardPredictedState().globalMomentum(); + GlobalPoint statePosition = measurements[numberOfHits].forwardPredictedState().globalPosition(); + double dotProduct = stateMomentum.x() * statePosition.x() + stateMomentum.y() * statePosition.y(); + if (dotProduct * previousDotProduct < 0) { + //found hit to split from... + HITTOSPLITFROM = numberOfHits; + } + + previousDotProduct = dotProduct; + numberOfHits++; + } + LogDebug("CosmicTrackSplitter") << "number of rechits: " << numberOfHits; + + // check if the trajectories and rechits are in reverse order... + trackingRecHit_iterator bIt = trackFromMap->recHitsBegin(); + trackingRecHit_iterator fIt = trackFromMap->recHitsEnd() - 1; + const TrackingRecHit *bHit = (*bIt); + const TrackingRecHit *fHit = (*fIt); + // hit type valid = 0, missing = 1, inactive = 2, bad = 3 + if (bHit->type() != 0 || bHit->isValid() != 1) { + //loop over hits forwards until first Valid hit is found + trackingRecHit_iterator ihit; + for (ihit = trackFromMap->recHitsBegin(); ihit != trackFromMap->recHitsEnd(); ++ihit) { + const TrackingRecHit *iHit = (*ihit); + if (iHit->type() == 0 && iHit->isValid() == 1) { + bHit = iHit; + break; + } + } + } + DetId bdetid = bHit->geographicalId(); + GlobalPoint bPosHit = theGeometry->idToDetUnit(bdetid)->surface().toGlobal(bHit->localPosition()); + if (fHit->type() != 0 || fHit->isValid() != 1) { + //loop over hits backwards until first Valid hit is found + trackingRecHit_iterator ihitf; + for (ihitf = trackFromMap->recHitsEnd() - 1; ihitf != trackFromMap->recHitsBegin(); --ihitf) { + const TrackingRecHit *iHit = (*ihitf); + if (iHit->type() == 0 && iHit->isValid() == 1) { + fHit = iHit; + break; + } + } + } + DetId fdetid = fHit->geographicalId(); + GlobalPoint fPosHit = theGeometry->idToDetUnit(fdetid)->surface().toGlobal(fHit->localPosition()); + GlobalPoint bPosState = measurements[0].updatedState().globalPosition(); + GlobalPoint fPosState = measurements[measurements.size() - 1].updatedState().globalPosition(); + bool trajReversedFlag = false; + /* DetId bdetid = bHit->geographicalId(); DetId fdetid = fHit->geographicalId(); GlobalPoint bPosHit = theGeometry->idToDetUnit( bdetid )->surface().toGlobal(bHit->localPosition()); @@ -237,184 +232,197 @@ namespace reco { namespace modules { GlobalPoint fPosState = measurements[measurements.size() - 1].updatedState().globalPosition(); bool trajReversedFlag = false; */ - if (( (bPosHit - bPosState).mag() > (bPosHit - fPosState).mag() ) && ( (fPosHit - fPosState).mag() > (fPosHit - bPosState).mag() ) ){ - trajReversedFlag = true; - } - if (trajReversedFlag){ int temp = HITTOSPLITFROM; HITTOSPLITFROM = totalNumberOfHits - temp; } - } - - totalTracks_ = totalTracks_ + tracks->size(); - // loop on tracks - for (std::vector::const_iterator itt = tracks->begin(), edt = tracks->end(); itt != edt; ++itt) { - hits.clear(); // extra safety - - LogDebug("CosmicTrackSplitter") << "ntracks: " << tracks->size(); - - // try to find distance of closest approach - GlobalPoint v( itt->vx(), itt->vy(), itt->vz() ); - - //checks on impact parameter - bool continueWithTrack = true; - if (fabs(v.z()) > dZcut_) continueWithTrack = false; - if (v.perp() > dXYcut_) continueWithTrack = false; - if (continueWithTrack == false) return; - - // LOOP TWICE, ONCE FOR TOP AND ONCE FOR BOTTOM - for (int i = 0; i < 2; ++i){ - hits.clear(); // extra safety - LogDebug("CosmicTrackSplitter") << " loop on hits of track #" << (itt - tracks->begin()); - int usedHitCtr = 0; - int hitCtr = 0; - for (trackingRecHit_iterator ith = itt->recHitsBegin(), edh = itt->recHitsEnd(); ith != edh; ++ith) { - //hitCtr++; - const TrackingRecHit * hit = (*ith); // ith is an iterator on edm::Ref to rechit - LogDebug("CosmicTrackSplitter") << " hit number " << (ith - itt->recHitsBegin()); - // let's look at valid hits - if (hit->isValid()) { - LogDebug("CosmicTrackSplitter") << " valid, detid = " << hit->geographicalId().rawId(); - DetId detid = hit->geographicalId(); - - if (detid.det() == DetId::Tracker) { // check for tracker hits - LogDebug("CosmicTrackSplitter") << " valid, tracker "; - bool verdict = false; - - //trying to get the global position of the hit - //const GeomDetUnit* geomDetUnit = theGeometry->idToDetUnit( detid ).; - - const GlobalPoint pos = theGeometry->idToDetUnit( detid )->surface().toGlobal(hit->localPosition()); - LogDebug("CosmicTrackSplitter") << "hit pos: " << pos << ", dca pos: " << v; - - // top half - if ((i == 0)&&(hitCtr < HITTOSPLITFROM)){ - verdict = true; - LogDebug("CosmicTrackSplitter") << "tophalf"; - } - // bottom half - if ((i == 1)&&(hitCtr >= HITTOSPLITFROM)){ - verdict = true; - LogDebug("CosmicTrackSplitter") << "bottomhalf"; - } - - // if the hit is good, check again at module level - if ( verdict && std::binary_search(detsToIgnore_.begin(), detsToIgnore_.end(), detid.rawId())) { - verdict = false; - } - - // if hit is good check to make sure that we are keeping pixel hits - if ( excludePixelHits_){ - if ((detid.det() == DetId::Tracker)&&((detid.subdetId() == 1)||(detid.subdetId() == 2))) { // check for pixel hits - verdict = false; - } - } - - LogDebug("CosmicTrackSplitter") << " verdict after module list: " << (verdict ? "ok" : "no"); - if (verdict == true) { - // just copy the hit - hits.push_back(hit->clone()); - usedHitCtr++; - } - else { - // still, if replaceWithInactiveHits is true we have to put a new hit - if (replaceWithInactiveHits_) { - hits.push_back(new InvalidTrackingRecHit(*hit->det(), TrackingRecHit::inactive)); - } - } - } - else { // just copy non tracker hits - hits.push_back(hit->clone()); - } - } - else { - if (!stripAllInvalidHits_) { - hits.push_back(hit->clone()); - } - } // is valid hit - LogDebug("CosmicTrackSplitter") << " end of hit " << (ith - itt->recHitsBegin()); - hitCtr++; - } // loop on hits - LogDebug("CosmicTrackSplitter") << " end of loop on hits of track #" << (itt - tracks->begin()); - - std::vector::iterator begin = hits.begin(), end = hits.end(); - - LogDebug("CosmicTrackSplitter") << " selected " << hits.size() << " hits "; - - // strip invalid hits at the beginning - if (stripFrontInvalidHits_) { - while ( (begin != end) && ( (*begin)->isValid() == false ) ) ++begin; - } - - LogDebug("CosmicTrackSplitter") << " after front stripping we have " << (end - begin) << " hits "; - - // strip invalid hits at the end - if (stripBackInvalidHits_ && (begin != end)) { - --end; - while ( (begin != end) && ( (*end)->isValid() == false ) ) --end; - ++end; - } - - LogDebug("CosmicTrackSplitter") << " after back stripping we have " << (end - begin) << " hits "; - - // if we still have some hits - //if ((end - begin) >= int(minimumHits_)) { - if ( usedHitCtr >= int(minimumHits_)) { - output->push_back( makeCandidate ( *itt, begin, end ) ); - LogDebug("CosmicTrackSplitter") << "we made a candidate of " << hits.size() << " hits!"; - } - // now delete the hits not used by the candidate - for (begin = hits.begin(), end = hits.end(); begin != end; ++begin) { - if (*begin) delete *begin; - } - LogDebug("CosmicTrackSplitter") << "loop: " << i << " has " << usedHitCtr << " active hits and " << hits.size() << " total hits..."; - hits.clear(); - } // loop twice for top and bottom - } // loop on tracks - LogDebug("CosmicTrackSplitter") << "totalTracks_ = " << totalTracks_; - iEvent.put(std::move(output)); - } - - TrackCandidate - CosmicTrackSplitter::makeCandidate(const reco::Track &tk, std::vector::iterator hitsBegin, std::vector::iterator hitsEnd) { - - LogDebug("CosmicTrackSplitter") << "Making a candidate!"; - - - PropagationDirection pdir = tk.seedDirection(); - PTrajectoryStateOnDet state; - if ( pdir == anyDirection ) throw cms::Exception("UnimplementedFeature") << "Cannot work with tracks that have 'anyDirecton' \n"; - //if ( (pdir == alongMomentum) == ( tk.p() >= tk.outerP() ) ) { - if ( (pdir == alongMomentum) == ( (tk.outerPosition()-tk.innerPosition()).Dot(tk.momentum()) >= 0 ) ) { - // use inner state - TrajectoryStateOnSurface originalTsosIn(trajectoryStateTransform::innerStateOnSurface(tk, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosIn, DetId(tk.innerDetId()) ); - } else { - // use outer state - TrajectoryStateOnSurface originalTsosOut(trajectoryStateTransform::outerStateOnSurface(tk, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosOut, DetId(tk.outerDetId()) ); - } - - TrajectorySeed seed(state, TrackCandidate::RecHitContainer(), pdir); - - TrackCandidate::RecHitContainer ownHits; - ownHits.reserve(hitsEnd - hitsBegin); - for ( ; hitsBegin != hitsEnd; ++hitsBegin) { ownHits.push_back( *hitsBegin ); } - - TrackCandidate cand(ownHits, seed, state, tk.seedRef()); - + if (((bPosHit - bPosState).mag() > (bPosHit - fPosState).mag()) && + ((fPosHit - fPosState).mag() > (fPosHit - bPosState).mag())) { + trajReversedFlag = true; + } + if (trajReversedFlag) { + int temp = HITTOSPLITFROM; + HITTOSPLITFROM = totalNumberOfHits - temp; + } + } + + totalTracks_ = totalTracks_ + tracks->size(); + // loop on tracks + for (std::vector::const_iterator itt = tracks->begin(), edt = tracks->end(); itt != edt; ++itt) { + hits.clear(); // extra safety + + LogDebug("CosmicTrackSplitter") << "ntracks: " << tracks->size(); + + // try to find distance of closest approach + GlobalPoint v(itt->vx(), itt->vy(), itt->vz()); + + //checks on impact parameter + bool continueWithTrack = true; + if (fabs(v.z()) > dZcut_) + continueWithTrack = false; + if (v.perp() > dXYcut_) + continueWithTrack = false; + if (continueWithTrack == false) + return; + + // LOOP TWICE, ONCE FOR TOP AND ONCE FOR BOTTOM + for (int i = 0; i < 2; ++i) { + hits.clear(); // extra safety + LogDebug("CosmicTrackSplitter") << " loop on hits of track #" << (itt - tracks->begin()); + int usedHitCtr = 0; + int hitCtr = 0; + for (trackingRecHit_iterator ith = itt->recHitsBegin(), edh = itt->recHitsEnd(); ith != edh; ++ith) { + //hitCtr++; + const TrackingRecHit *hit = (*ith); // ith is an iterator on edm::Ref to rechit + LogDebug("CosmicTrackSplitter") << " hit number " << (ith - itt->recHitsBegin()); + // let's look at valid hits + if (hit->isValid()) { + LogDebug("CosmicTrackSplitter") << " valid, detid = " << hit->geographicalId().rawId(); + DetId detid = hit->geographicalId(); + + if (detid.det() == DetId::Tracker) { // check for tracker hits + LogDebug("CosmicTrackSplitter") << " valid, tracker "; + bool verdict = false; + + //trying to get the global position of the hit + //const GeomDetUnit* geomDetUnit = theGeometry->idToDetUnit( detid ).; + + const GlobalPoint pos = theGeometry->idToDetUnit(detid)->surface().toGlobal(hit->localPosition()); + LogDebug("CosmicTrackSplitter") << "hit pos: " << pos << ", dca pos: " << v; + + // top half + if ((i == 0) && (hitCtr < HITTOSPLITFROM)) { + verdict = true; + LogDebug("CosmicTrackSplitter") << "tophalf"; + } + // bottom half + if ((i == 1) && (hitCtr >= HITTOSPLITFROM)) { + verdict = true; + LogDebug("CosmicTrackSplitter") << "bottomhalf"; + } + + // if the hit is good, check again at module level + if (verdict && std::binary_search(detsToIgnore_.begin(), detsToIgnore_.end(), detid.rawId())) { + verdict = false; + } + + // if hit is good check to make sure that we are keeping pixel hits + if (excludePixelHits_) { + if ((detid.det() == DetId::Tracker) && + ((detid.subdetId() == 1) || (detid.subdetId() == 2))) { // check for pixel hits + verdict = false; + } + } + + LogDebug("CosmicTrackSplitter") + << " verdict after module list: " << (verdict ? "ok" : "no"); + if (verdict == true) { + // just copy the hit + hits.push_back(hit->clone()); + usedHitCtr++; + } else { + // still, if replaceWithInactiveHits is true we have to put a new hit + if (replaceWithInactiveHits_) { + hits.push_back(new InvalidTrackingRecHit(*hit->det(), TrackingRecHit::inactive)); + } + } + } else { // just copy non tracker hits + hits.push_back(hit->clone()); + } + } else { + if (!stripAllInvalidHits_) { + hits.push_back(hit->clone()); + } + } // is valid hit + LogDebug("CosmicTrackSplitter") << " end of hit " << (ith - itt->recHitsBegin()); + hitCtr++; + } // loop on hits + LogDebug("CosmicTrackSplitter") << " end of loop on hits of track #" << (itt - tracks->begin()); + + std::vector::iterator begin = hits.begin(), end = hits.end(); + + LogDebug("CosmicTrackSplitter") << " selected " << hits.size() << " hits "; + + // strip invalid hits at the beginning + if (stripFrontInvalidHits_) { + while ((begin != end) && ((*begin)->isValid() == false)) + ++begin; + } + + LogDebug("CosmicTrackSplitter") << " after front stripping we have " << (end - begin) << " hits "; + + // strip invalid hits at the end + if (stripBackInvalidHits_ && (begin != end)) { + --end; + while ((begin != end) && ((*end)->isValid() == false)) + --end; + ++end; + } + + LogDebug("CosmicTrackSplitter") << " after back stripping we have " << (end - begin) << " hits "; + + // if we still have some hits + //if ((end - begin) >= int(minimumHits_)) { + if (usedHitCtr >= int(minimumHits_)) { + output->push_back(makeCandidate(*itt, begin, end)); + LogDebug("CosmicTrackSplitter") << "we made a candidate of " << hits.size() << " hits!"; + } + // now delete the hits not used by the candidate + for (begin = hits.begin(), end = hits.end(); begin != end; ++begin) { + if (*begin) + delete *begin; + } + LogDebug("CosmicTrackSplitter") + << "loop: " << i << " has " << usedHitCtr << " active hits and " << hits.size() << " total hits..."; + hits.clear(); + } // loop twice for top and bottom + } // loop on tracks + LogDebug("CosmicTrackSplitter") << "totalTracks_ = " << totalTracks_; + iEvent.put(std::move(output)); + } + + TrackCandidate CosmicTrackSplitter::makeCandidate(const reco::Track &tk, + std::vector::iterator hitsBegin, + std::vector::iterator hitsEnd) { + LogDebug("CosmicTrackSplitter") << "Making a candidate!"; + + PropagationDirection pdir = tk.seedDirection(); + PTrajectoryStateOnDet state; + if (pdir == anyDirection) + throw cms::Exception("UnimplementedFeature") << "Cannot work with tracks that have 'anyDirecton' \n"; + //if ( (pdir == alongMomentum) == ( tk.p() >= tk.outerP() ) ) { + if ((pdir == alongMomentum) == ((tk.outerPosition() - tk.innerPosition()).Dot(tk.momentum()) >= 0)) { + // use inner state + TrajectoryStateOnSurface originalTsosIn( + trajectoryStateTransform::innerStateOnSurface(tk, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosIn, DetId(tk.innerDetId())); + } else { + // use outer state + TrajectoryStateOnSurface originalTsosOut( + trajectoryStateTransform::outerStateOnSurface(tk, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosOut, DetId(tk.outerDetId())); + } + + TrajectorySeed seed(state, TrackCandidate::RecHitContainer(), pdir); + + TrackCandidate::RecHitContainer ownHits; + ownHits.reserve(hitsEnd - hitsBegin); + for (; hitsBegin != hitsEnd; ++hitsBegin) { + ownHits.push_back(*hitsBegin); + } + + TrackCandidate cand(ownHits, seed, state, tk.seedRef()); #ifdef EDM_ML_DEBUG - LogDebug("CosmicTrackSplitter") << " dumping the hits now: "; - for (TrackCandidate::range hitR = cand.recHits(); hitR.first != hitR.second; ++hitR.first) { - auto const& tmp = *hitR.first; - LogTrace("CosmicTrackSplitter") << " hit detid = " << hitR.first->geographicalId().rawId() << - ", type = " << typeid(tmp).name(); - } + LogDebug("CosmicTrackSplitter") << " dumping the hits now: "; + for (TrackCandidate::range hitR = cand.recHits(); hitR.first != hitR.second; ++hitR.first) { + auto const &tmp = *hitR.first; + LogTrace("CosmicTrackSplitter") << " hit detid = " << hitR.first->geographicalId().rawId() + << ", type = " << typeid(tmp).name(); + } #endif - return cand; - } - -}} //namespaces + return cand; + } + } // namespace modules +} // namespace reco // ========= MODULE DEF ============== #include "FWCore/PluginManager/interface/ModuleDef.h" diff --git a/RecoTracker/FinalTrackSelectors/plugins/DefaultTrackMVAClassifier.cc b/RecoTracker/FinalTrackSelectors/plugins/DefaultTrackMVAClassifier.cc index d86de6d415d01..34fe0392cccff 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/DefaultTrackMVAClassifier.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/DefaultTrackMVAClassifier.cc @@ -13,120 +13,121 @@ #include "TFile.h" namespace { - -template -struct mva { - mva(const edm::ParameterSet &cfg): - forestLabel_ ( cfg.getParameter("GBRForestLabel") ), - dbFileName_ ( cfg.getParameter("GBRForestFileName") ), - useForestFromDB_( (!forestLabel_.empty()) & dbFileName_.empty()) - {} - - void beginStream() { - if(!dbFileName_.empty()){ - TFile gbrfile(dbFileName_.c_str()); - forestFromFile_.reset((GBRForest*)gbrfile.Get(forestLabel_.c_str())); - } - } - void initEvent(const edm::EventSetup& es) { - forest_ = forestFromFile_.get(); - if(useForestFromDB_){ - edm::ESHandle forestHandle; - es.get().get(forestLabel_,forestHandle); - forest_ = forestHandle.product(); + template + struct mva { + mva(const edm::ParameterSet &cfg) + : forestLabel_(cfg.getParameter("GBRForestLabel")), + dbFileName_(cfg.getParameter("GBRForestFileName")), + useForestFromDB_((!forestLabel_.empty()) & dbFileName_.empty()) {} + + void beginStream() { + if (!dbFileName_.empty()) { + TFile gbrfile(dbFileName_.c_str()); + forestFromFile_.reset((GBRForest *)gbrfile.Get(forestLabel_.c_str())); + } } - } - float operator()(reco::Track const & trk, - reco::BeamSpot const & beamSpot, - reco::VertexCollection const & vertices) const { - - auto tmva_pt_ = trk.pt(); - auto tmva_ndof_ = trk.ndof(); - auto tmva_nlayers_ = trk.hitPattern().trackerLayersWithMeasurement(); - auto tmva_nlayers3D_ = trk.hitPattern().pixelLayersWithMeasurement() - + trk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); - auto tmva_nlayerslost_ = trk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); - float chi2n = trk.normalizedChi2(); - float chi2n_no1Dmod = chi2n; - - int count1dhits = 0; - for (auto ith =trk.recHitsBegin(); ith!=trk.recHitsEnd(); ++ith) { - const auto & hit = *(*ith); - if (hit.dimension()==1) ++count1dhits; - } - - if (count1dhits > 0) { - float chi2 = trk.chi2(); - float ndof = trk.ndof(); - chi2n = (chi2+count1dhits)/float(ndof+count1dhits); - } - auto tmva_chi2n_ = chi2n; - auto tmva_chi2n_no1dmod_ = chi2n_no1Dmod; - auto tmva_eta_ = trk.eta(); - auto tmva_relpterr_ = float(trk.ptError())/std::max(float(trk.pt()),0.000001f); - auto tmva_nhits_ = trk.numberOfValidHits(); - int lostIn = trk.hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS); - int lostOut = trk.hitPattern().numberOfLostHits(reco::HitPattern::MISSING_OUTER_HITS); - auto tmva_minlost_ = std::min(lostIn,lostOut); - auto tmva_lostmidfrac_ = static_cast(trk.numberOfLostHits()) / static_cast(trk.numberOfValidHits() + trk.numberOfLostHits()); - - float gbrVals_[PROMPT ? 16 : 12]; - gbrVals_[0] = tmva_pt_; - gbrVals_[1] = tmva_lostmidfrac_; - gbrVals_[2] = tmva_minlost_; - gbrVals_[3] = tmva_nhits_; - gbrVals_[4] = tmva_relpterr_; - gbrVals_[5] = tmva_eta_; - gbrVals_[6] = tmva_chi2n_no1dmod_; - gbrVals_[7] = tmva_chi2n_; - gbrVals_[8] = tmva_nlayerslost_; - gbrVals_[9] = tmva_nlayers3D_; - gbrVals_[10] = tmva_nlayers_; - gbrVals_[11] = tmva_ndof_; - - if (PROMPT) { - auto tmva_absd0_ = std::abs(trk.dxy(beamSpot.position())); - auto tmva_absdz_ = std::abs(trk.dz(beamSpot.position())); - Point bestVertex = getBestVertex(trk,vertices); - auto tmva_absd0PV_ = std::abs(trk.dxy(bestVertex)); - auto tmva_absdzPV_ = std::abs(trk.dz(bestVertex)); - - gbrVals_[12] = tmva_absd0PV_; - gbrVals_[13] = tmva_absdzPV_; - gbrVals_[14] = tmva_absdz_; - gbrVals_[15] = tmva_absd0_; + void initEvent(const edm::EventSetup &es) { + forest_ = forestFromFile_.get(); + if (useForestFromDB_) { + edm::ESHandle forestHandle; + es.get().get(forestLabel_, forestHandle); + forest_ = forestHandle.product(); + } } - + float operator()(reco::Track const &trk, + reco::BeamSpot const &beamSpot, + reco::VertexCollection const &vertices) const { + auto tmva_pt_ = trk.pt(); + auto tmva_ndof_ = trk.ndof(); + auto tmva_nlayers_ = trk.hitPattern().trackerLayersWithMeasurement(); + auto tmva_nlayers3D_ = + trk.hitPattern().pixelLayersWithMeasurement() + trk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); + auto tmva_nlayerslost_ = trk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); + float chi2n = trk.normalizedChi2(); + float chi2n_no1Dmod = chi2n; + + int count1dhits = 0; + for (auto ith = trk.recHitsBegin(); ith != trk.recHitsEnd(); ++ith) { + const auto &hit = *(*ith); + if (hit.dimension() == 1) + ++count1dhits; + } + + if (count1dhits > 0) { + float chi2 = trk.chi2(); + float ndof = trk.ndof(); + chi2n = (chi2 + count1dhits) / float(ndof + count1dhits); + } + auto tmva_chi2n_ = chi2n; + auto tmva_chi2n_no1dmod_ = chi2n_no1Dmod; + auto tmva_eta_ = trk.eta(); + auto tmva_relpterr_ = float(trk.ptError()) / std::max(float(trk.pt()), 0.000001f); + auto tmva_nhits_ = trk.numberOfValidHits(); + int lostIn = trk.hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS); + int lostOut = trk.hitPattern().numberOfLostHits(reco::HitPattern::MISSING_OUTER_HITS); + auto tmva_minlost_ = std::min(lostIn, lostOut); + auto tmva_lostmidfrac_ = static_cast(trk.numberOfLostHits()) / + static_cast(trk.numberOfValidHits() + trk.numberOfLostHits()); + + float gbrVals_[PROMPT ? 16 : 12]; + gbrVals_[0] = tmva_pt_; + gbrVals_[1] = tmva_lostmidfrac_; + gbrVals_[2] = tmva_minlost_; + gbrVals_[3] = tmva_nhits_; + gbrVals_[4] = tmva_relpterr_; + gbrVals_[5] = tmva_eta_; + gbrVals_[6] = tmva_chi2n_no1dmod_; + gbrVals_[7] = tmva_chi2n_; + gbrVals_[8] = tmva_nlayerslost_; + gbrVals_[9] = tmva_nlayers3D_; + gbrVals_[10] = tmva_nlayers_; + gbrVals_[11] = tmva_ndof_; + + if (PROMPT) { + auto tmva_absd0_ = std::abs(trk.dxy(beamSpot.position())); + auto tmva_absdz_ = std::abs(trk.dz(beamSpot.position())); + Point bestVertex = getBestVertex(trk, vertices); + auto tmva_absd0PV_ = std::abs(trk.dxy(bestVertex)); + auto tmva_absdzPV_ = std::abs(trk.dz(bestVertex)); + + gbrVals_[12] = tmva_absd0PV_; + gbrVals_[13] = tmva_absdzPV_; + gbrVals_[14] = tmva_absdz_; + gbrVals_[15] = tmva_absd0_; + } + + return forest_->GetClassifier(gbrVals_); + } - return forest_->GetClassifier(gbrVals_); - - } + static const char *name(); - static const char * name(); + static void fillDescriptions(edm::ParameterSetDescription &desc) { + desc.add("GBRForestLabel", std::string()); + desc.add("GBRForestFileName", std::string()); + } - static void fillDescriptions(edm::ParameterSetDescription & desc) { - desc.add("GBRForestLabel",std::string()); - desc.add("GBRForestFileName",std::string()); - } - - std::unique_ptr forestFromFile_; - const GBRForest *forest_ = nullptr; // owned by somebody else - const std::string forestLabel_; - const std::string dbFileName_; - const bool useForestFromDB_; -}; + std::unique_ptr forestFromFile_; + const GBRForest *forest_ = nullptr; // owned by somebody else + const std::string forestLabel_; + const std::string dbFileName_; + const bool useForestFromDB_; + }; using TrackMVAClassifierDetached = TrackMVAClassifier>; using TrackMVAClassifierPrompt = TrackMVAClassifier>; - template<> - const char * mva::name() { return "TrackMVAClassifierDetached";} - template<> - const char * mva::name() { return "TrackMVAClassifierPrompt";} - -} + template <> + const char *mva::name() { + return "TrackMVAClassifierDetached"; + } + template <> + const char *mva::name() { + return "TrackMVAClassifierPrompt"; + } + +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/RecoTracker/FinalTrackSelectors/plugins/DuplicateListMerger.cc b/RecoTracker/FinalTrackSelectors/plugins/DuplicateListMerger.cc index e79a9d5a8d858..c235166379e5f 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/DuplicateListMerger.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/DuplicateListMerger.cc @@ -5,10 +5,8 @@ * \author Matthew Walker */ - #include "RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h" - #include "FWCore/Framework/interface/global/EDProducer.h" #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/ESHandle.h" @@ -18,11 +16,9 @@ #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" - #include "DataFormats/TrackReco/interface/TrackFwd.h" #include "DataFormats/TrackReco/interface/Track.h" - #include "DataFormats/TrackCandidate/interface/TrackCandidate.h" #include "RecoTracker/FinalTrackSelectors/interface/TrackAlgoPriorityOrder.h" @@ -32,266 +28,234 @@ #include #include #include -#include +#include // #include "TMVA/Reader.h" using namespace reco; namespace { -class DuplicateListMerger final : public edm::global::EDProducer<> { - public: - /// constructor - explicit DuplicateListMerger(const edm::ParameterSet& iPara); - /// destructor - ~DuplicateListMerger() override; - - /// alias for container of candidate and input tracks - using CandidateToDuplicate = std::vector>; - - using RecHitContainer = edm::OwnVector; - - using MVACollection = std::vector; - using QualityMaskCollection = std::vector; - - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - - - private: - /// produce one event - void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override; - - private: - - - TrackCollectionCloner collectionCloner; - TrackCollectionCloner::Tokens mergedTrackSource_; - TrackCollectionCloner::Tokens originalTrackSource_; - - - edm::EDGetTokenT candidateComponents_; - edm::EDGetTokenT> candidateSource_; - - edm::EDGetTokenT originalMVAValsToken_; - edm::EDGetTokenT mergedMVAValsToken_; - - std::string priorityName_; - - int diffHitsCut_; - - -}; -} + class DuplicateListMerger final : public edm::global::EDProducer<> { + public: + /// constructor + explicit DuplicateListMerger(const edm::ParameterSet& iPara); + /// destructor + ~DuplicateListMerger() override; -#include "TrackingTools/PatternTools/interface/Trajectory.h" -#include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h" -#include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h" -#include "DataFormats/TrackerRecHit2D/interface/ClusterRemovalRefSetter.h" + /// alias for container of candidate and input tracks + using CandidateToDuplicate = std::vector>; -#include "FWCore/Framework/interface/Event.h" -#include "CommonTools/Statistics/interface/ChiSquaredProbability.h" + using RecHitContainer = edm::OwnVector; -#include -#include -#include "CommonTools/Utils/interface/DynArray.h" + using MVACollection = std::vector; + using QualityMaskCollection = std::vector; + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); -namespace { -void DuplicateListMerger::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc; - desc.add("mergedSource",edm::InputTag()); - desc.add("originalSource",edm::InputTag()); - desc.add("mergedMVAVals",edm::InputTag()); - desc.add("originalMVAVals",edm::InputTag()); - desc.add("candidateSource",edm::InputTag()); - desc.add("candidateComponents",edm::InputTag()); - desc.add("trackAlgoPriorityOrder", "trackAlgoPriorityOrder"); - desc.add("diffHitsCut",5); - TrackCollectionCloner::fill(desc); - descriptions.add("DuplicateListMerger", desc); -} + private: + /// produce one event + void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override; + + private: + TrackCollectionCloner collectionCloner; + TrackCollectionCloner::Tokens mergedTrackSource_; + TrackCollectionCloner::Tokens originalTrackSource_; -DuplicateListMerger::DuplicateListMerger(const edm::ParameterSet& iPara) : - collectionCloner(*this, iPara, true), - mergedTrackSource_(iPara.getParameter("mergedSource"),consumesCollector()), - originalTrackSource_(iPara.getParameter("originalSource"),consumesCollector()), - priorityName_(iPara.getParameter("trackAlgoPriorityOrder")) -{ - - diffHitsCut_ = iPara.getParameter("diffHitsCut"); - candidateSource_ = consumes >(iPara.getParameter("candidateSource")); - candidateComponents_ = consumes(iPara.getParameter("candidateComponents")); + edm::EDGetTokenT candidateComponents_; + edm::EDGetTokenT> candidateSource_; - mergedMVAValsToken_ = consumes(iPara.getParameter("mergedMVAVals")); - originalMVAValsToken_ = consumes(iPara.getParameter("originalMVAVals")); + edm::EDGetTokenT originalMVAValsToken_; + edm::EDGetTokenT mergedMVAValsToken_; - + std::string priorityName_; - produces("MVAValues"); - produces("QualityMasks"); + int diffHitsCut_; + }; +} // namespace +#include "TrackingTools/PatternTools/interface/Trajectory.h" +#include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h" +#include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h" +#include "DataFormats/TrackerRecHit2D/interface/ClusterRemovalRefSetter.h" -} +#include "FWCore/Framework/interface/Event.h" +#include "CommonTools/Statistics/interface/ChiSquaredProbability.h" -DuplicateListMerger::~DuplicateListMerger() -{ +#include +#include +#include "CommonTools/Utils/interface/DynArray.h" - /* no op */ +namespace { + void DuplicateListMerger::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("mergedSource", edm::InputTag()); + desc.add("originalSource", edm::InputTag()); + desc.add("mergedMVAVals", edm::InputTag()); + desc.add("originalMVAVals", edm::InputTag()); + desc.add("candidateSource", edm::InputTag()); + desc.add("candidateComponents", edm::InputTag()); + desc.add("trackAlgoPriorityOrder", "trackAlgoPriorityOrder"); + desc.add("diffHitsCut", 5); + TrackCollectionCloner::fill(desc); + descriptions.add("DuplicateListMerger", desc); + } -} + DuplicateListMerger::DuplicateListMerger(const edm::ParameterSet& iPara) + : collectionCloner(*this, iPara, true), + mergedTrackSource_(iPara.getParameter("mergedSource"), consumesCollector()), + originalTrackSource_(iPara.getParameter("originalSource"), consumesCollector()), + priorityName_(iPara.getParameter("trackAlgoPriorityOrder")) { + diffHitsCut_ = iPara.getParameter("diffHitsCut"); + candidateSource_ = consumes>(iPara.getParameter("candidateSource")); + candidateComponents_ = consumes(iPara.getParameter("candidateComponents")); -void DuplicateListMerger::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const -{ + mergedMVAValsToken_ = consumes(iPara.getParameter("mergedMVAVals")); + originalMVAValsToken_ = consumes(iPara.getParameter("originalMVAVals")); - TrackCollectionCloner::Producer producer(iEvent, collectionCloner); + produces("MVAValues"); + produces("QualityMasks"); + } - - - auto const & originals = originalTrackSource_.tracks(iEvent); - auto const & merged = mergedTrackSource_.tracks(iEvent); - auto const & candIndices = mergedTrackSource_.indicesInput(iEvent); - - edm::Handle> candidateH; - iEvent.getByToken(candidateSource_,candidateH); - auto const & candidates = *candidateH; + DuplicateListMerger::~DuplicateListMerger() { /* no op */ + } - edm::Handle candidateComponentsH; - iEvent.getByToken(candidateComponents_,candidateComponentsH); - auto const & candidateComponents = *candidateComponentsH; + void DuplicateListMerger::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + TrackCollectionCloner::Producer producer(iEvent, collectionCloner); + auto const& originals = originalTrackSource_.tracks(iEvent); + auto const& merged = mergedTrackSource_.tracks(iEvent); + auto const& candIndices = mergedTrackSource_.indicesInput(iEvent); - - edm::Handle originalMVAStore; - edm::Handle mergedMVAStore; + edm::Handle> candidateH; + iEvent.getByToken(candidateSource_, candidateH); + auto const& candidates = *candidateH; - iEvent.getByToken(originalMVAValsToken_,originalMVAStore); - iEvent.getByToken(mergedMVAValsToken_,mergedMVAStore); + edm::Handle candidateComponentsH; + iEvent.getByToken(candidateComponents_, candidateComponentsH); + auto const& candidateComponents = *candidateComponentsH; - edm::ESHandle priorityH; - iSetup.get().get(priorityName_, priorityH); - auto const & trackAlgoPriorityOrder = *priorityH; + edm::Handle originalMVAStore; + edm::Handle mergedMVAStore; - MVACollection mvaVec; + iEvent.getByToken(originalMVAValsToken_, originalMVAStore); + iEvent.getByToken(mergedMVAValsToken_, mergedMVAStore); + edm::ESHandle priorityH; + iSetup.get().get(priorityName_, priorityH); + auto const& trackAlgoPriorityOrder = *priorityH; - auto mergedMVA = *mergedMVAStore; + MVACollection mvaVec; - //match new tracks to their candidates - std::vector> matches; - for(int i = 0; i < (int)merged.size(); ++i) { - auto cInd = candIndices[i]; - auto const & cand = candidates[cInd]; - const reco::Track& matchedTrack = merged[i]; + auto mergedMVA = *mergedMVAStore; - if (mergedMVA[i]< -0.7f) continue; // at least "loose" ( FIXME: take cut value from CutSelector) + //match new tracks to their candidates + std::vector> matches; + for (int i = 0; i < (int)merged.size(); ++i) { + auto cInd = candIndices[i]; + auto const& cand = candidates[cInd]; + const reco::Track& matchedTrack = merged[i]; - // if( ChiSquaredProbability(matchedTrack.chi2(),matchedTrack.ndof()) < minTrkProbCut_)continue; - int dHits = (cand.recHits().second - cand.recHits().first) - matchedTrack.recHitsSize(); - if(dHits > diffHitsCut_)continue; - matches.push_back(std::array{{i,candidateComponents[cInd].first,candidateComponents[cInd].second}}); - } + if (mergedMVA[i] < -0.7f) + continue; // at least "loose" ( FIXME: take cut value from CutSelector) - //check for candidates/tracks that share merged tracks, select minimum chi2, remove the rest - if (matches.size()>1) - for ( auto matchIter0 = matches.begin(); matchIter0 != matches.end()-1; ++matchIter0) { - if ( (*matchIter0)[0]<0) continue; - auto nchi2 = merged[(*matchIter0)[0]].normalizedChi2(); - for( auto matchIter1 = matchIter0+1; matchIter1 != matches.end(); ++matchIter1){ - if ( (*matchIter1)[0]<0) continue; - if ( (*matchIter0)[1]==(*matchIter1)[1] - || (*matchIter0)[1]==(*matchIter1)[2] - || (*matchIter0)[2]==(*matchIter1)[1] - || (*matchIter0)[2]==(*matchIter1)[2] - ) { - auto nchi2_1 = merged[(*matchIter1)[0]].normalizedChi2(); - if(nchi2_1 < nchi2){ - (*matchIter0)[0] = -1; - break; - }else{ - (*matchIter1)[0] = -1; - } - } - } + // if( ChiSquaredProbability(matchedTrack.chi2(),matchedTrack.ndof()) < minTrkProbCut_)continue; + int dHits = (cand.recHits().second - cand.recHits().first) - matchedTrack.recHitsSize(); + if (dHits > diffHitsCut_) + continue; + matches.push_back(std::array{{i, candidateComponents[cInd].first, candidateComponents[cInd].second}}); } + //check for candidates/tracks that share merged tracks, select minimum chi2, remove the rest + if (matches.size() > 1) + for (auto matchIter0 = matches.begin(); matchIter0 != matches.end() - 1; ++matchIter0) { + if ((*matchIter0)[0] < 0) + continue; + auto nchi2 = merged[(*matchIter0)[0]].normalizedChi2(); + for (auto matchIter1 = matchIter0 + 1; matchIter1 != matches.end(); ++matchIter1) { + if ((*matchIter1)[0] < 0) + continue; + if ((*matchIter0)[1] == (*matchIter1)[1] || (*matchIter0)[1] == (*matchIter1)[2] || + (*matchIter0)[2] == (*matchIter1)[1] || (*matchIter0)[2] == (*matchIter1)[2]) { + auto nchi2_1 = merged[(*matchIter1)[0]].normalizedChi2(); + if (nchi2_1 < nchi2) { + (*matchIter0)[0] = -1; + break; + } else { + (*matchIter1)[0] = -1; + } + } + } + } - // products - auto pmvas = std::make_unique(); - auto pquals = std::make_unique(); - + // products + auto pmvas = std::make_unique(); + auto pquals = std::make_unique(); - //add the good merged tracks to the output list, remove input tracks - std::vector inputTracks; + //add the good merged tracks to the output list, remove input tracks + std::vector inputTracks; + std::vector selId; + auto ntotTk = matches.size(); + // declareDynArray(reco::TrackBase::TrackAlgorithm, ntotTk, algo); + declareDynArray(reco::TrackBase::TrackAlgorithm, ntotTk, oriAlgo); + declareDynArray(reco::TrackBase::AlgoMask, ntotTk, algoMask); - std::vector selId; - auto ntotTk = matches.size(); - // declareDynArray(reco::TrackBase::TrackAlgorithm, ntotTk, algo); - declareDynArray(reco::TrackBase::TrackAlgorithm, ntotTk, oriAlgo); - declareDynArray(reco::TrackBase::AlgoMask, ntotTk, algoMask); + auto nsel = 0U; + for (auto matchIter0 = matches.begin(); matchIter0 != matches.end(); matchIter0++) { + if ((*matchIter0)[0] < 0) + continue; + selId.push_back((*matchIter0)[0]); - auto nsel=0U; - for(auto matchIter0 = matches.begin(); matchIter0 != matches.end(); matchIter0++){ - if ( (*matchIter0)[0]<0) continue; - selId.push_back((*matchIter0)[0]); + pmvas->push_back(mergedMVA[(*matchIter0)[0]]); - pmvas->push_back(mergedMVA[(*matchIter0)[0]]); - - const reco::Track& inTrk1 = originals[(*matchIter0)[1]]; - const reco::Track& inTrk2 = originals[(*matchIter0)[2]]; - oriAlgo[nsel] = std::min(inTrk1.algo(),inTrk2.algo(), - [&](reco::TrackBase::TrackAlgorithm a, reco::TrackBase::TrackAlgorithm b) { - return trackAlgoPriorityOrder.priority(a) < trackAlgoPriorityOrder.priority(b); - }); + const reco::Track& inTrk1 = originals[(*matchIter0)[1]]; + const reco::Track& inTrk2 = originals[(*matchIter0)[2]]; + oriAlgo[nsel] = std::min( + inTrk1.algo(), inTrk2.algo(), [&](reco::TrackBase::TrackAlgorithm a, reco::TrackBase::TrackAlgorithm b) { + return trackAlgoPriorityOrder.priority(a) < trackAlgoPriorityOrder.priority(b); + }); + algoMask[nsel] = inTrk1.algoMask() | inTrk2.algoMask(); - algoMask[nsel] = inTrk1.algoMask() | inTrk2.algoMask(); - - pquals->push_back((inTrk1.qualityMask() | inTrk2.qualityMask())); - pquals->back() |= (1<push_back((inTrk1.qualityMask() | inTrk2.qualityMask())); + pquals->back() |= (1 << reco::TrackBase::confirmed); - - ++nsel; - - } + inputTracks.push_back((*matchIter0)[1]); + inputTracks.push_back((*matchIter0)[2]); - - producer(mergedTrackSource_,selId); - assert(producer.selTracks_->size()==pquals->size()); - - for (auto isel=0U;iselpush_back((*originalMVAStore)[i]); - pquals->push_back(origTrack.qualityMask()); - } + producer(mergedTrackSource_, selId); + assert(producer.selTracks_->size() == pquals->size()); - producer(originalTrackSource_,selId); - assert(producer.selTracks_->size()==pquals->size()); + for (auto isel = 0U; isel < nsel; ++isel) { + algoMask[isel].set(reco::TrackBase::duplicateMerge); + auto& otk = (*producer.selTracks_)[isel]; + otk.setQualityMask((*pquals)[isel]); + otk.setAlgorithm(reco::TrackBase::duplicateMerge); + otk.setOriginalAlgorithm(oriAlgo[isel]); + otk.setAlgoMask(algoMask[isel]); + } - iEvent.put(std::move(pmvas),"MVAValues"); - iEvent.put(std::move(pquals),"QualityMasks"); + selId.clear(); + for (int i = 0; i < (int)originals.size(); i++) { + const reco::Track& origTrack = originals[i]; + if (std::find(inputTracks.begin(), inputTracks.end(), i) != inputTracks.end()) + continue; + selId.push_back(i); + pmvas->push_back((*originalMVAStore)[i]); + pquals->push_back(origTrack.qualityMask()); + } + producer(originalTrackSource_, selId); + assert(producer.selTracks_->size() == pquals->size()); -} + iEvent.put(std::move(pmvas), "MVAValues"); + iEvent.put(std::move(pquals), "QualityMasks"); + } -} +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackMerger.cc b/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackMerger.cc index 6a2eb32a8c5f7..b7a3b0bb76944 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackMerger.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackMerger.cc @@ -12,7 +12,6 @@ #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" - #include "DataFormats/TrackReco/interface/TrackFwd.h" #include "DataFormats/TrackReco/interface/Track.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" @@ -31,87 +30,85 @@ #include #include - #include "CondFormats/EgammaObjects/interface/GBRForest.h" using namespace reco; namespace { - class DuplicateTrackMerger final : public edm::stream::EDProducer<> { + class DuplicateTrackMerger final : public edm::stream::EDProducer<> { public: /// constructor - explicit DuplicateTrackMerger(const edm::ParameterSet& iPara); + explicit DuplicateTrackMerger(const edm::ParameterSet &iPara); /// destructor ~DuplicateTrackMerger() override; - + using CandidateToDuplicate = std::vector>; - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - - - private: - /// produce one event - void produce( edm::Event &, const edm::EventSetup &) override; - - bool checkForDisjointTracks(const reco::Track *t1, const reco::Track *t2, TSCPBuilderNoMaterial& tscpBuilder) const; - bool checkForOverlappingTracks(const reco::Track *t1, const reco::Track *t2, unsigned int nvh1, unsigned int nvh2, double cosT) const; - - private: - /// MVA discriminator - const GBRForest* forest_; - - - /// MVA weights file - std::string dbFileName_; - bool useForestFromDB_; - std::string forestLabel_; - - std::string propagatorName_; - std::string chi2EstimatorName_; - - /// track input collection - edm::EDGetTokenT trackSource_; - /// minDeltaR3d cut value - double minDeltaR3d2_; - /// minBDTG cut value - double minBDTG_; - ///min pT cut value - double minpT2_; - ///min p cut value - double minP_; - ///max distance between two tracks at closest approach - float maxDCA2_; - ///max difference in phi between two tracks - float maxDPhi_; - ///max difference in Lambda between two tracks - float maxDLambda_; - ///max difference in transverse impact parameter between two tracks - float maxDdxy_; - ///max difference in longitudinal impact parameter between two tracks - float maxDdsz_; - ///max difference in q/p between two tracks - float maxDQoP_; - /// max number of hits for shorter track for the overlap check - unsigned int overlapCheckMaxHits_; - /// max number of missing layers for the overlap check - unsigned int overlapCheckMaxMissingLayers_; - /// min cosT for the overlap check - double overlapCheckMinCosT_; - - const MagneticField *magfield_; - const TrackerTopology *ttopo_; - const TrackerGeometry *geom_; - const Propagator *propagator_; - const Chi2MeasurementEstimatorBase *chi2Estimator_; - - ///Merger - TrackMerger merger_; + + static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); + + private: + /// produce one event + void produce(edm::Event &, const edm::EventSetup &) override; + + bool checkForDisjointTracks(const reco::Track *t1, const reco::Track *t2, TSCPBuilderNoMaterial &tscpBuilder) const; + bool checkForOverlappingTracks( + const reco::Track *t1, const reco::Track *t2, unsigned int nvh1, unsigned int nvh2, double cosT) const; + + private: + /// MVA discriminator + const GBRForest *forest_; + + /// MVA weights file + std::string dbFileName_; + bool useForestFromDB_; + std::string forestLabel_; + + std::string propagatorName_; + std::string chi2EstimatorName_; + + /// track input collection + edm::EDGetTokenT trackSource_; + /// minDeltaR3d cut value + double minDeltaR3d2_; + /// minBDTG cut value + double minBDTG_; + ///min pT cut value + double minpT2_; + ///min p cut value + double minP_; + ///max distance between two tracks at closest approach + float maxDCA2_; + ///max difference in phi between two tracks + float maxDPhi_; + ///max difference in Lambda between two tracks + float maxDLambda_; + ///max difference in transverse impact parameter between two tracks + float maxDdxy_; + ///max difference in longitudinal impact parameter between two tracks + float maxDdsz_; + ///max difference in q/p between two tracks + float maxDQoP_; + /// max number of hits for shorter track for the overlap check + unsigned int overlapCheckMaxHits_; + /// max number of missing layers for the overlap check + unsigned int overlapCheckMaxMissingLayers_; + /// min cosT for the overlap check + double overlapCheckMinCosT_; + + const MagneticField *magfield_; + const TrackerTopology *ttopo_; + const TrackerGeometry *geom_; + const Propagator *propagator_; + const Chi2MeasurementEstimatorBase *chi2Estimator_; + + ///Merger + TrackMerger merger_; #ifdef EDM_ML_DEBUG - bool debug_; + bool debug_; #endif - }; - } - + }; +} // namespace + #include "FWCore/Framework/interface/Event.h" #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h" #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h" @@ -119,7 +116,7 @@ namespace { #include "CondFormats/DataRecord/interface/GBRWrapperRcd.h" #include "TrackingTools/Records/interface/TrackingComponentsRecord.h" #include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ESHandle.h" #include "TFile.h" #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" @@ -129,65 +126,62 @@ namespace { namespace { + void DuplicateTrackMerger::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { + edm::ParameterSetDescription desc; + desc.add("source", edm::InputTag()); + desc.add("minDeltaR3d", -4.0); + desc.add("minBDTG", -0.1); + desc.add("minpT", 0.2); + desc.add("minP", 0.4); + desc.add("maxDCA", 30.0); + desc.add("maxDPhi", 0.30); + desc.add("maxDLambda", 0.30); + desc.add("maxDdsz", 10.0); + desc.add("maxDdxy", 10.0); + desc.add("maxDQoP", 0.25); + desc.add("overlapCheckMaxHits", 4); + desc.add("overlapCheckMaxMissingLayers", 1); + desc.add("overlapCheckMinCosT", 0.99); + desc.add("forestLabel", "MVADuplicate"); + desc.add("GBRForestFileName", ""); + desc.add("useInnermostState", true); + desc.add("ttrhBuilderName", "WithAngleAndTemplate"); + desc.add("propagatorName", "PropagatorWithMaterial"); + desc.add("chi2EstimatorName", "DuplicateTrackMergerChi2Est"); + descriptions.add("DuplicateTrackMerger", desc); + } -void -DuplicateTrackMerger::fillDescriptions(edm::ConfigurationDescriptions& descriptions) -{ - edm::ParameterSetDescription desc; - desc.add("source",edm::InputTag()); - desc.add("minDeltaR3d",-4.0); - desc.add("minBDTG",-0.1); - desc.add("minpT",0.2); - desc.add("minP",0.4); - desc.add("maxDCA",30.0); - desc.add("maxDPhi",0.30); - desc.add("maxDLambda",0.30); - desc.add("maxDdsz",10.0); - desc.add("maxDdxy",10.0); - desc.add("maxDQoP",0.25); - desc.add("overlapCheckMaxHits", 4); - desc.add("overlapCheckMaxMissingLayers", 1); - desc.add("overlapCheckMinCosT", 0.99); - desc.add("forestLabel","MVADuplicate"); - desc.add("GBRForestFileName",""); - desc.add("useInnermostState",true); - desc.add("ttrhBuilderName","WithAngleAndTemplate"); - desc.add("propagatorName", "PropagatorWithMaterial"); - desc.add("chi2EstimatorName", "DuplicateTrackMergerChi2Est"); - descriptions.add("DuplicateTrackMerger", desc); -} - - -DuplicateTrackMerger::DuplicateTrackMerger(const edm::ParameterSet& iPara) : forest_(nullptr), merger_(iPara) -{ - - trackSource_ = consumes(iPara.getParameter("source")); - minDeltaR3d2_ = iPara.getParameter("minDeltaR3d"); minDeltaR3d2_*=std::abs(minDeltaR3d2_); - minBDTG_ = iPara.getParameter("minBDTG"); - minpT2_ = iPara.getParameter("minpT"); minpT2_ *= minpT2_; - minP_ = iPara.getParameter("minP"); - maxDCA2_ = iPara.getParameter("maxDCA"); maxDCA2_*=maxDCA2_; - maxDPhi_ = iPara.getParameter("maxDPhi"); - maxDLambda_ = iPara.getParameter("maxDLambda"); - maxDdsz_ = iPara.getParameter("maxDdsz"); - maxDdxy_ = iPara.getParameter("maxDdxy"); - maxDQoP_ = iPara.getParameter("maxDQoP"); - overlapCheckMaxHits_ = iPara.getParameter("overlapCheckMaxHits"); - overlapCheckMaxMissingLayers_ = iPara.getParameter("overlapCheckMaxMissingLayers"); - overlapCheckMinCosT_ = iPara.getParameter("overlapCheckMinCosT"); - - produces >("candidates"); - produces("candidateMap"); - - forestLabel_ = iPara.getParameter("forestLabel"); - - dbFileName_ = iPara.getParameter("GBRForestFileName"); - useForestFromDB_ = dbFileName_.empty(); - - propagatorName_ = iPara.getParameter("propagatorName"); - chi2EstimatorName_ = iPara.getParameter("chi2EstimatorName"); - - /* + DuplicateTrackMerger::DuplicateTrackMerger(const edm::ParameterSet &iPara) : forest_(nullptr), merger_(iPara) { + trackSource_ = consumes(iPara.getParameter("source")); + minDeltaR3d2_ = iPara.getParameter("minDeltaR3d"); + minDeltaR3d2_ *= std::abs(minDeltaR3d2_); + minBDTG_ = iPara.getParameter("minBDTG"); + minpT2_ = iPara.getParameter("minpT"); + minpT2_ *= minpT2_; + minP_ = iPara.getParameter("minP"); + maxDCA2_ = iPara.getParameter("maxDCA"); + maxDCA2_ *= maxDCA2_; + maxDPhi_ = iPara.getParameter("maxDPhi"); + maxDLambda_ = iPara.getParameter("maxDLambda"); + maxDdsz_ = iPara.getParameter("maxDdsz"); + maxDdxy_ = iPara.getParameter("maxDdxy"); + maxDQoP_ = iPara.getParameter("maxDQoP"); + overlapCheckMaxHits_ = iPara.getParameter("overlapCheckMaxHits"); + overlapCheckMaxMissingLayers_ = iPara.getParameter("overlapCheckMaxMissingLayers"); + overlapCheckMinCosT_ = iPara.getParameter("overlapCheckMinCosT"); + + produces>("candidates"); + produces("candidateMap"); + + forestLabel_ = iPara.getParameter("forestLabel"); + + dbFileName_ = iPara.getParameter("GBRForestFileName"); + useForestFromDB_ = dbFileName_.empty(); + + propagatorName_ = iPara.getParameter("propagatorName"); + chi2EstimatorName_ = iPara.getParameter("chi2EstimatorName"); + + /* tmvaReader_ = new TMVA::Reader("!Color:Silent"); tmvaReader_->AddVariable("ddsz",&tmva_ddsz_); tmvaReader_->AddVariable("ddxy",&tmva_ddxy_); @@ -200,230 +194,234 @@ DuplicateTrackMerger::DuplicateTrackMerger(const edm::ParameterSet& iPara) : for tmvaReader_->AddVariable("inner_nMissingOuter",&tmva_inner_nMissingOuter_); tmvaReader_->BookMVA("BDTG",mvaFilePath); */ + } - -} - -DuplicateTrackMerger::~DuplicateTrackMerger() -{ - - if(!useForestFromDB_) delete forest_; - -} - + DuplicateTrackMerger::~DuplicateTrackMerger() { + if (!useForestFromDB_) + delete forest_; + } #ifdef VI_STAT struct Stat { - Stat() : maxCos(1.1), nCand(0),nLoop0(0) {} - ~Stat() { - std::cout << "Stats " << nCand << ' ' << nLoop0 << ' ' << maxCos << std::endl; - } + Stat() : maxCos(1.1), nCand(0), nLoop0(0) {} + ~Stat() { std::cout << "Stats " << nCand << ' ' << nLoop0 << ' ' << maxCos << std::endl; } std::atomic maxCos; std::atomic nCand, nLoop0; }; Stat stat; #endif - -template -void update_maximum(std::atomic& maximum_value, T const& value) noexcept -{ + + template + void update_maximum(std::atomic &maximum_value, T const &value) noexcept { T prev_value = maximum_value; - while(prev_value < value && - !maximum_value.compare_exchange_weak(prev_value, value)) - ; -} - - template -void update_minimum(std::atomic& minimum_value, T const& value) noexcept -{ + while (prev_value < value && !maximum_value.compare_exchange_weak(prev_value, value)) + ; + } + + template + void update_minimum(std::atomic &minimum_value, T const &value) noexcept { T prev_value = minimum_value; - while(prev_value > value && - !minimum_value.compare_exchange_weak(prev_value, value)) - ; -} - - -void DuplicateTrackMerger::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) -{ - - merger_.init(iSetup); - - if(!forest_){ - if(useForestFromDB_){ - edm::ESHandle forestHandle; - iSetup.get().get(forestLabel_,forestHandle); - forest_ = forestHandle.product(); - }else{ - TFile gbrfile(dbFileName_.c_str()); - forest_ = dynamic_cast(gbrfile.Get(forestLabel_.c_str())); - } + while (prev_value > value && !minimum_value.compare_exchange_weak(prev_value, value)) + ; } - //edm::Handle >handle; - edm::Handlehandle; - iEvent.getByToken(trackSource_,handle); - auto const & tracks = *handle; - - edm::ESHandle hmagfield; - iSetup.get().get(hmagfield); - magfield_ = hmagfield.product(); + void DuplicateTrackMerger::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) { + merger_.init(iSetup); + + if (!forest_) { + if (useForestFromDB_) { + edm::ESHandle forestHandle; + iSetup.get().get(forestLabel_, forestHandle); + forest_ = forestHandle.product(); + } else { + TFile gbrfile(dbFileName_.c_str()); + forest_ = dynamic_cast(gbrfile.Get(forestLabel_.c_str())); + } + } - edm::ESHandle httopo; - iSetup.get().get(httopo); - ttopo_ = httopo.product(); + //edm::Handle >handle; + edm::Handle handle; + iEvent.getByToken(trackSource_, handle); + auto const &tracks = *handle; - edm::ESHandle hgeom; - iSetup.get().get(hgeom); - geom_ = hgeom.product(); + edm::ESHandle hmagfield; + iSetup.get().get(hmagfield); + magfield_ = hmagfield.product(); - edm::ESHandle hpropagator; - iSetup.get().get(propagatorName_, hpropagator); - propagator_ = hpropagator.product(); + edm::ESHandle httopo; + iSetup.get().get(httopo); + ttopo_ = httopo.product(); - edm::ESHandle hestimator; - iSetup.get().get(chi2EstimatorName_, hestimator); - chi2Estimator_ = hestimator.product(); + edm::ESHandle hgeom; + iSetup.get().get(hgeom); + geom_ = hgeom.product(); - TSCPBuilderNoMaterial tscpBuilder; - auto out_duplicateCandidates = std::make_unique>(); + edm::ESHandle hpropagator; + iSetup.get().get(propagatorName_, hpropagator); + propagator_ = hpropagator.product(); - auto out_candidateMap = std::make_unique(); - LogDebug("DuplicateTrackMerger") << "Number of tracks to be checked for merging: " << tracks.size(); + edm::ESHandle hestimator; + iSetup.get().get(chi2EstimatorName_, hestimator); + chi2Estimator_ = hestimator.product(); + + TSCPBuilderNoMaterial tscpBuilder; + auto out_duplicateCandidates = std::make_unique>(); + + auto out_candidateMap = std::make_unique(); + LogDebug("DuplicateTrackMerger") << "Number of tracks to be checked for merging: " << tracks.size(); #ifdef EDM_ML_DEBUG - auto test = [&](const reco::Track *a, const reco::Track *b) { - const auto ev = iEvent.id().event(); - const auto aOriAlgo = a->originalAlgo(); - const auto bOriAlgo = b->originalAlgo(); - const auto aSeed = a->seedRef().key(); - const auto bSeed = b->seedRef().key(); - return ((ev == 6903 && ((aOriAlgo == 23 && aSeed == 695 && bOriAlgo == 5 && bSeed == 652) || - (aOriAlgo == 23 && aSeed == 400 && bOriAlgo == 7 && bSeed == 156) || - (aOriAlgo == 4 && aSeed == 914 && bOriAlgo == 22 && bSeed == 503) || - (aOriAlgo == 5 && aSeed == 809 && bOriAlgo == 4 && bSeed == 1030) || - (aOriAlgo == 23 && aSeed == 749 && bOriAlgo == 5 && bSeed == 659) || - (aOriAlgo == 4 && aSeed == 1053 && bOriAlgo == 23 && bSeed == 1035) || - (aOriAlgo == 4 && aSeed == 810 && bOriAlgo == 5 && bSeed == 666) || - (aOriAlgo == 4 && aSeed == 974 && bOriAlgo == 5 && bSeed == 778))) || - (ev == 6904 && ((aOriAlgo == 23 && aSeed == 526 && bOriAlgo == 5 && bSeed == 307) || - (aOriAlgo == 4 && aSeed == 559 && bOriAlgo == 22 && bSeed == 472))) || - (ev == 6902 && ((aOriAlgo == 4 && aSeed == 750 && bOriAlgo == 22 && bSeed == 340) || - (aOriAlgo == 4 && aSeed == 906 && bOriAlgo == 5 && bSeed == 609) || - (aOriAlgo == 4 && aSeed == 724 && bOriAlgo == 5 && bSeed == 528) || - (aOriAlgo == 4 && aSeed == 943 && bOriAlgo == 23 && bSeed == 739) || - (aOriAlgo == 8 && aSeed == 2 && bOriAlgo == 9 && bSeed == 2282) || - (aOriAlgo == 23 && aSeed == 827 && bOriAlgo == 5 && bSeed == 656) || - (aOriAlgo == 22 && aSeed == 667 && bOriAlgo == 7 && bSeed == 516)))); - }; + auto test = [&](const reco::Track *a, const reco::Track *b) { + const auto ev = iEvent.id().event(); + const auto aOriAlgo = a->originalAlgo(); + const auto bOriAlgo = b->originalAlgo(); + const auto aSeed = a->seedRef().key(); + const auto bSeed = b->seedRef().key(); + return ((ev == 6903 && ((aOriAlgo == 23 && aSeed == 695 && bOriAlgo == 5 && bSeed == 652) || + (aOriAlgo == 23 && aSeed == 400 && bOriAlgo == 7 && bSeed == 156) || + (aOriAlgo == 4 && aSeed == 914 && bOriAlgo == 22 && bSeed == 503) || + (aOriAlgo == 5 && aSeed == 809 && bOriAlgo == 4 && bSeed == 1030) || + (aOriAlgo == 23 && aSeed == 749 && bOriAlgo == 5 && bSeed == 659) || + (aOriAlgo == 4 && aSeed == 1053 && bOriAlgo == 23 && bSeed == 1035) || + (aOriAlgo == 4 && aSeed == 810 && bOriAlgo == 5 && bSeed == 666) || + (aOriAlgo == 4 && aSeed == 974 && bOriAlgo == 5 && bSeed == 778))) || + (ev == 6904 && ((aOriAlgo == 23 && aSeed == 526 && bOriAlgo == 5 && bSeed == 307) || + (aOriAlgo == 4 && aSeed == 559 && bOriAlgo == 22 && bSeed == 472))) || + (ev == 6902 && ((aOriAlgo == 4 && aSeed == 750 && bOriAlgo == 22 && bSeed == 340) || + (aOriAlgo == 4 && aSeed == 906 && bOriAlgo == 5 && bSeed == 609) || + (aOriAlgo == 4 && aSeed == 724 && bOriAlgo == 5 && bSeed == 528) || + (aOriAlgo == 4 && aSeed == 943 && bOriAlgo == 23 && bSeed == 739) || + (aOriAlgo == 8 && aSeed == 2 && bOriAlgo == 9 && bSeed == 2282) || + (aOriAlgo == 23 && aSeed == 827 && bOriAlgo == 5 && bSeed == 656) || + (aOriAlgo == 22 && aSeed == 667 && bOriAlgo == 7 && bSeed == 516)))); + }; #endif - // cache few "heavy to compute quantities - int nTracks=0; - declareDynArray(const reco::Track *, tracks.size(), selTracks); - declareDynArray(unsigned int, tracks.size(), nValidHits); - declareDynArray(unsigned int, tracks.size(), oriIndex); - for(auto i = 0U; i < tracks.size(); i++){ - const reco::Track *rt1 = &tracks[i]; - if(rt1->innerMomentum().perp2() < minpT2_)continue; - selTracks[nTracks] = rt1; - nValidHits[nTracks] = rt1->numberOfValidHits(); // yes it is extremely heavy! - oriIndex[nTracks]=i; - ++nTracks; - } - + // cache few "heavy to compute quantities + int nTracks = 0; + declareDynArray(const reco::Track *, tracks.size(), selTracks); + declareDynArray(unsigned int, tracks.size(), nValidHits); + declareDynArray(unsigned int, tracks.size(), oriIndex); + for (auto i = 0U; i < tracks.size(); i++) { + const reco::Track *rt1 = &tracks[i]; + if (rt1->innerMomentum().perp2() < minpT2_) + continue; + selTracks[nTracks] = rt1; + nValidHits[nTracks] = rt1->numberOfValidHits(); // yes it is extremely heavy! + oriIndex[nTracks] = i; + ++nTracks; + } - for(int i = 0; i originalAlgo() << " seed " << rt1->seedRef().key() << " pT " << std::sqrt(rt1->innerMomentum().perp2()) << " charge " << rt1->charge() << " outerPosition2 " << rt1->outerPosition().perp2() << "\n" - << "Track2 " << j << " originalAlgo " << rt2->originalAlgo() << " seed " << rt2->seedRef().key() << " pT " << std::sqrt(rt2->innerMomentum().perp2()) << " charge " << rt2->charge() << " outerPosition2 " << rt2->outerPosition().perp2(); - } + debug_ = false; + if (test(rt1, rt2) || test(rt2, rt1)) { + debug_ = true; + LogTrace("DuplicateTrackMerger") + << "Track1 " << i << " originalAlgo " << rt1->originalAlgo() << " seed " << rt1->seedRef().key() << " pT " + << std::sqrt(rt1->innerMomentum().perp2()) << " charge " << rt1->charge() << " outerPosition2 " + << rt1->outerPosition().perp2() << "\n" + << "Track2 " << j << " originalAlgo " << rt2->originalAlgo() << " seed " << rt2->seedRef().key() << " pT " + << std::sqrt(rt2->innerMomentum().perp2()) << " charge " << rt2->charge() << " outerPosition2 " + << rt2->outerPosition().perp2(); + } #endif - if(rt1->charge() != rt2->charge())continue; - auto cosT = (*rt1).momentum().Dot((*rt2).momentum()); // not normalized! - IfLogTrace(debug_, "DuplicateTrackMerger") << " cosT " << cosT; - if (cosT<0.) continue; - cosT /= std::sqrt((*rt1).momentum().Mag2()*(*rt2).momentum().Mag2()); - - const reco::Track* t1,*t2; unsigned int nhv1, nhv2; - if(rt1->outerPosition().perp2() < rt2->outerPosition().perp2()){ - t1 = rt1; nhv1 = nValidHits[i]; - t2 = rt2; nhv2 = nValidHits[j]; - }else{ - t1 = rt2; nhv1 = nValidHits[j]; - t2 = rt1; nhv2 = nValidHits[i]; - } - auto deltaR3d2 = (t1->outerPosition() - t2->innerPosition()).mag2(); - - if(t1->outerPosition().perp2() > t2->innerPosition().perp2()) deltaR3d2 *= -1.0; - IfLogTrace(debug_, "DuplicateTrackMerger") << " deltaR3d2 " << deltaR3d2 << " t1.outerPos2 " << t1->outerPosition().perp2() << " t2.innerPos2 " << t2->innerPosition().perp2(); + if (rt1->charge() != rt2->charge()) + continue; + auto cosT = (*rt1).momentum().Dot((*rt2).momentum()); // not normalized! + IfLogTrace(debug_, "DuplicateTrackMerger") << " cosT " << cosT; + if (cosT < 0.) + continue; + cosT /= std::sqrt((*rt1).momentum().Mag2() * (*rt2).momentum().Mag2()); + + const reco::Track *t1, *t2; + unsigned int nhv1, nhv2; + if (rt1->outerPosition().perp2() < rt2->outerPosition().perp2()) { + t1 = rt1; + nhv1 = nValidHits[i]; + t2 = rt2; + nhv2 = nValidHits[j]; + } else { + t1 = rt2; + nhv1 = nValidHits[j]; + t2 = rt1; + nhv2 = nValidHits[i]; + } + auto deltaR3d2 = (t1->outerPosition() - t2->innerPosition()).mag2(); + + if (t1->outerPosition().perp2() > t2->innerPosition().perp2()) + deltaR3d2 *= -1.0; + IfLogTrace(debug_, "DuplicateTrackMerger") + << " deltaR3d2 " << deltaR3d2 << " t1.outerPos2 " << t1->outerPosition().perp2() << " t2.innerPos2 " + << t2->innerPosition().perp2(); + + bool compatible = false; + DuplicateTrackType duplType; + if (deltaR3d2 >= minDeltaR3d2_) { + compatible = checkForDisjointTracks(t1, t2, tscpBuilder); + duplType = DuplicateTrackType::Disjoint; + } else { + compatible = checkForOverlappingTracks(t1, t2, nhv1, nhv2, cosT); + duplType = DuplicateTrackType::Overlapping; + } + if (!compatible) + continue; - bool compatible = false; - DuplicateTrackType duplType; - if(deltaR3d2 >= minDeltaR3d2_) { - compatible = checkForDisjointTracks(t1, t2, tscpBuilder); - duplType = DuplicateTrackType::Disjoint; - } - else { - compatible = checkForOverlappingTracks(t1, t2, nhv1, nhv2, cosT); - duplType = DuplicateTrackType::Overlapping; - } - if(!compatible) continue; - - - IfLogTrace(debug_, "DuplicateTrackMerger") << " marking as duplicates" << oriIndex[i]<<','<push_back(merger_.merge(*t1,*t2, duplType)); - out_candidateMap->emplace_back(oriIndex[i],oriIndex[j]); + IfLogTrace(debug_, "DuplicateTrackMerger") << " marking as duplicates" << oriIndex[i] << ',' << oriIndex[j]; + out_duplicateCandidates->push_back(merger_.merge(*t1, *t2, duplType)); + out_candidateMap->emplace_back(oriIndex[i], oriIndex[j]); #ifdef VI_STAT - ++stat.nCand; - // auto cosT = float((*t1).momentum().unit().Dot((*t2).momentum().unit())); - if (cosT>0) update_minimum(stat.maxCos,float(cosT)); - else ++stat.nLoop0; + ++stat.nCand; + // auto cosT = float((*t1).momentum().unit().Dot((*t2).momentum().unit())); + if (cosT > 0) + update_minimum(stat.maxCos, float(cosT)); + else + ++stat.nLoop0; #endif - + } } + iEvent.put(std::move(out_duplicateCandidates), "candidates"); + iEvent.put(std::move(out_candidateMap), "candidateMap"); } - iEvent.put(std::move(out_duplicateCandidates),"candidates"); - iEvent.put(std::move(out_candidateMap),"candidateMap"); - - -} - - bool DuplicateTrackMerger::checkForDisjointTracks(const reco::Track *t1, const reco::Track *t2, TSCPBuilderNoMaterial& tscpBuilder) const { + bool DuplicateTrackMerger::checkForDisjointTracks(const reco::Track *t1, + const reco::Track *t2, + TSCPBuilderNoMaterial &tscpBuilder) const { IfLogTrace(debug_, "DuplicateTrackMerger") << " Checking for disjoint duplicates"; - FreeTrajectoryState fts1 = trajectoryStateTransform::outerFreeState(*t1, &*magfield_,false); - FreeTrajectoryState fts2 = trajectoryStateTransform::innerFreeState(*t2, &*magfield_,false); - GlobalPoint avgPoint((t1->outerPosition().x()+t2->innerPosition().x())*0.5, - (t1->outerPosition().y()+t2->innerPosition().y())*0.5, - (t1->outerPosition().z()+t2->innerPosition().z())*0.5); + FreeTrajectoryState fts1 = trajectoryStateTransform::outerFreeState(*t1, &*magfield_, false); + FreeTrajectoryState fts2 = trajectoryStateTransform::innerFreeState(*t2, &*magfield_, false); + GlobalPoint avgPoint((t1->outerPosition().x() + t2->innerPosition().x()) * 0.5, + (t1->outerPosition().y() + t2->innerPosition().y()) * 0.5, + (t1->outerPosition().z() + t2->innerPosition().z()) * 0.5); TrajectoryStateClosestToPoint TSCP1 = tscpBuilder(fts1, avgPoint); TrajectoryStateClosestToPoint TSCP2 = tscpBuilder(fts2, avgPoint); - IfLogTrace(debug_, "DuplicateTrackMerger") << " TSCP1.isValid " << TSCP1.isValid() << " TSCP2.isValid " << TSCP2.isValid(); - if(!TSCP1.isValid()) return false; - if(!TSCP2.isValid()) return false; + IfLogTrace(debug_, "DuplicateTrackMerger") + << " TSCP1.isValid " << TSCP1.isValid() << " TSCP2.isValid " << TSCP2.isValid(); + if (!TSCP1.isValid()) + return false; + if (!TSCP2.isValid()) + return false; - const FreeTrajectoryState& ftsn1 = TSCP1.theState(); - const FreeTrajectoryState& ftsn2 = TSCP2.theState(); - - IfLogTrace(debug_, "DuplicateTrackMerger") << " DCA2 " << (ftsn2.position()-ftsn1.position()).mag2(); - if ( (ftsn2.position()-ftsn1.position()).mag2() > maxDCA2_ ) return false; + const FreeTrajectoryState &ftsn1 = TSCP1.theState(); + const FreeTrajectoryState &ftsn2 = TSCP2.theState(); + + IfLogTrace(debug_, "DuplicateTrackMerger") << " DCA2 " << (ftsn2.position() - ftsn1.position()).mag2(); + if ((ftsn2.position() - ftsn1.position()).mag2() > maxDCA2_) + return false; auto qoverp1 = ftsn1.signedInverseMomentum(); auto qoverp2 = ftsn2.signedInverseMomentum(); - float tmva_dqoverp_ = qoverp1-qoverp2; + float tmva_dqoverp_ = qoverp1 - qoverp2; IfLogTrace(debug_, "DuplicateTrackMerger") << " dqoverp " << tmva_dqoverp_; - if ( std::abs(tmva_dqoverp_) > maxDQoP_ ) return false; - + if (std::abs(tmva_dqoverp_) > maxDQoP_) + return false; //auto pp = [&](TrajectoryStateClosestToPoint const & ts) { std::cout << ' ' << ts.perigeeParameters().vector()[0] << '/' << ts.perigeeError().transverseCurvatureError();}; //if(qoverp1*qoverp2 <0) { std::cout << "charge different " << qoverp1 <<',' << qoverp2; pp(TSCP1); pp(TSCP2); std::cout << std::endl;} @@ -431,28 +429,37 @@ void DuplicateTrackMerger::produce(edm::Event& iEvent, const edm::EventSetup& iS // lambda = pi/2 - theta.... so l1-l2 == t2-t1 float tmva_dlambda_ = ftsn2.momentum().theta() - ftsn1.momentum().theta(); IfLogTrace(debug_, "DuplicateTrackMerger") << " dlambda " << tmva_dlambda_; - if ( std::abs(tmva_dlambda_) > maxDLambda_ ) return false; + if (std::abs(tmva_dlambda_) > maxDLambda_) + return false; auto phi1 = ftsn1.momentum().phi(); auto phi2 = ftsn2.momentum().phi(); - float tmva_dphi_ = phi1-phi2; - if(std::abs(tmva_dphi_) > float(M_PI)) tmva_dphi_ = 2.f*float(M_PI) - std::abs(tmva_dphi_); + float tmva_dphi_ = phi1 - phi2; + if (std::abs(tmva_dphi_) > float(M_PI)) + tmva_dphi_ = 2.f * float(M_PI) - std::abs(tmva_dphi_); IfLogTrace(debug_, "DuplicateTrackMerger") << " dphi " << tmva_dphi_; - if (std::abs(tmva_dphi_) > maxDPhi_ ) return false; + if (std::abs(tmva_dphi_) > maxDPhi_) + return false; - auto dxy1 = (-ftsn1.position().x() * ftsn1.momentum().y() + ftsn1.position().y() * ftsn1.momentum().x())/TSCP1.pt(); - auto dxy2 = (-ftsn2.position().x() * ftsn2.momentum().y() + ftsn2.position().y() * ftsn2.momentum().x())/TSCP2.pt(); - float tmva_ddxy_ = dxy1-dxy2; + auto dxy1 = + (-ftsn1.position().x() * ftsn1.momentum().y() + ftsn1.position().y() * ftsn1.momentum().x()) / TSCP1.pt(); + auto dxy2 = + (-ftsn2.position().x() * ftsn2.momentum().y() + ftsn2.position().y() * ftsn2.momentum().x()) / TSCP2.pt(); + float tmva_ddxy_ = dxy1 - dxy2; IfLogTrace(debug_, "DuplicateTrackMerger") << " ddxy " << tmva_ddxy_; - if ( std::abs(tmva_ddxy_) > maxDdxy_ ) return false; + if (std::abs(tmva_ddxy_) > maxDdxy_) + return false; - auto dsz1 = ftsn1.position().z() * TSCP1.pt() / TSCP1.momentum().mag() - - (ftsn1.position().x() * ftsn1.momentum().y() + ftsn1.position().y() * ftsn1.momentum().x())/TSCP1.pt() * ftsn1.momentum().z()/ftsn1.momentum().mag(); - auto dsz2 = ftsn2.position().z() * TSCP2.pt() / TSCP2.momentum().mag() - - (ftsn2.position().x() * ftsn2.momentum().y() + ftsn2.position().y() * ftsn2.momentum().x())/TSCP2.pt() * ftsn2.momentum().z()/ftsn2.momentum().mag(); - float tmva_ddsz_ = dsz1-dsz2; + auto dsz1 = ftsn1.position().z() * TSCP1.pt() / TSCP1.momentum().mag() - + (ftsn1.position().x() * ftsn1.momentum().y() + ftsn1.position().y() * ftsn1.momentum().x()) / + TSCP1.pt() * ftsn1.momentum().z() / ftsn1.momentum().mag(); + auto dsz2 = ftsn2.position().z() * TSCP2.pt() / TSCP2.momentum().mag() - + (ftsn2.position().x() * ftsn2.momentum().y() + ftsn2.position().y() * ftsn2.momentum().x()) / + TSCP2.pt() * ftsn2.momentum().z() / ftsn2.momentum().mag(); + float tmva_ddsz_ = dsz1 - dsz2; IfLogTrace(debug_, "DuplicateTrackMerger") << " ddsz " << tmva_ddsz_; - if ( std::abs(tmva_ddsz_) > maxDdsz_ ) return false; + if (std::abs(tmva_ddsz_) > maxDdsz_) + return false; float tmva_d3dr_ = avgPoint.perp(); float tmva_d3dz_ = avgPoint.z(); @@ -472,22 +479,27 @@ void DuplicateTrackMerger::produce(edm::Event& iEvent, const edm::EventSetup& iS auto mvaBDTG = forest_->GetClassifier(gbrVals_); IfLogTrace(debug_, "DuplicateTrackMerger") << " mvaBDTG " << mvaBDTG; - if(mvaBDTG < minBDTG_) return false; + if (mvaBDTG < minBDTG_) + return false; // std::cout << "to merge " << mvaBDTG << ' ' << std::copysign(std::sqrt(std::abs(deltaR3d2)),deltaR3d2) << ' ' << tmva_dphi_ << ' ' << TSCP1.pt() <<'/'< overlapCheckMaxHits_) return false; + IfLogTrace(debug_, "DuplicateTrackMerger") + << " Checking for overlapping duplicates, cosT " << cosT << " t1 hits " << nvh1; + if (cosT < overlapCheckMinCosT_) + return false; + if (nvh1 > overlapCheckMaxHits_) + return false; // find the hit on the longer track on layer of the first hit of the shorter track auto findHitOnT2 = [&](const TrackingRecHit *hit1) { @@ -495,58 +507,61 @@ void DuplicateTrackMerger::produce(edm::Event& iEvent, const edm::EventSetup& iS const auto hitSubdet = hit1->geographicalId().subdetId(); const auto hitLayer = ttopo_->layer(hit1->geographicalId()); return std::find_if(t2->recHitsBegin(), t2->recHitsEnd(), [&](const TrackingRecHit *hit2) { - const auto& detId = hit2->geographicalId(); - return (detId.det() == hitDet && detId.subdetId() == hitSubdet && - ttopo_->layer(detId) == hitLayer); - }); + const auto &detId = hit2->geographicalId(); + return (detId.det() == hitDet && detId.subdetId() == hitSubdet && ttopo_->layer(detId) == hitLayer); + }); }; auto t1HitIter = t1->recHitsBegin(); - if(!(*t1HitIter)->isValid()) { + if (!(*t1HitIter)->isValid()) { IfLogTrace(debug_, "DuplicateTrackMerger") << " first t1 hit invalid"; return false; } auto t2HitIter = findHitOnT2(*t1HitIter); - if(t2HitIter == t2->recHitsEnd()) { + if (t2HitIter == t2->recHitsEnd()) { // if first hit not found, try with second // if that fails, then reject ++t1HitIter; assert(t1HitIter != t1->recHitsEnd()); - if(!(*t1HitIter)->isValid()) { + if (!(*t1HitIter)->isValid()) { IfLogTrace(debug_, "DuplicateTrackMerger") << " second t1 hit invalid"; return false; } t2HitIter = findHitOnT2(*t1HitIter); - if(t2HitIter == t2->recHitsEnd()) return false; + if (t2HitIter == t2->recHitsEnd()) + return false; } - IfLogTrace(debug_, "DuplicateTrackMerger") << " starting overlap check from t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter); + IfLogTrace(debug_, "DuplicateTrackMerger") + << " starting overlap check from t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) << " t2 hit " + << std::distance(t2->recHitsBegin(), t2HitIter); auto prevSubdet = (*t1HitIter)->geographicalId().subdetId(); const TrajectoryStateOnSurface tsosInner = trajectoryStateTransform::innerStateOnSurface(*t2, *geom_, magfield_); - ++t1HitIter; ++t2HitIter; + ++t1HitIter; + ++t2HitIter; unsigned int missedLayers = 0; - while(t1HitIter != t1->recHitsEnd() && t2HitIter != t2->recHitsEnd()) { + while (t1HitIter != t1->recHitsEnd() && t2HitIter != t2->recHitsEnd()) { // in case of invalid hits, reject immediately - if((*t1HitIter)->getType() != TrackingRecHit::valid || trackerHitRTTI::isUndef(**t1HitIter) || - (*t2HitIter)->getType() != TrackingRecHit::valid || trackerHitRTTI::isUndef(**t2HitIter)) { - IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) - << " either is invalid, types t1 " << (*t1HitIter)->getType() << " t2 " << (*t2HitIter)->getType(); + if ((*t1HitIter)->getType() != TrackingRecHit::valid || trackerHitRTTI::isUndef(**t1HitIter) || + (*t2HitIter)->getType() != TrackingRecHit::valid || trackerHitRTTI::isUndef(**t2HitIter)) { + IfLogTrace(debug_, "DuplicateTrackMerger") + << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) << " t2 hit " + << std::distance(t2->recHitsBegin(), t2HitIter) << " either is invalid, types t1 " + << (*t1HitIter)->getType() << " t2 " << (*t2HitIter)->getType(); return false; } - const auto& t1DetId = (*t1HitIter)->geographicalId(); - const auto& t2DetId = (*t2HitIter)->geographicalId(); + const auto &t1DetId = (*t1HitIter)->geographicalId(); + const auto &t2DetId = (*t2HitIter)->geographicalId(); const auto t1Det = t1DetId.det(); const auto t2Det = t2DetId.det(); - if(t1Det != DetId::Tracker || t2Det != DetId::Tracker) { - IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) - << " either not from Tracker, dets t1 " << t1Det << " t2 " << t2Det; + if (t1Det != DetId::Tracker || t2Det != DetId::Tracker) { + IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) + << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) + << " either not from Tracker, dets t1 " << t1Det << " t2 " << t2Det; return false; } @@ -554,90 +569,90 @@ void DuplicateTrackMerger::produce(edm::Event& iEvent, const edm::EventSetup& iS const auto t1Layer = ttopo_->layer(t1DetId); // reject if hits have the same DetId but are different - if(t1DetId == t2DetId) { - if(!(*t1HitIter)->sharesInput(*t2HitIter, TrackingRecHit::all)) { - IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) - << " same DetId (" << t1DetId.rawId() << ") but do not share all input"; + if (t1DetId == t2DetId) { + if (!(*t1HitIter)->sharesInput(*t2HitIter, TrackingRecHit::all)) { + IfLogTrace(debug_, "DuplicateTrackMerger") + << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) << " t2 hit " + << std::distance(t2->recHitsBegin(), t2HitIter) << " same DetId (" << t1DetId.rawId() + << ") but do not share all input"; return false; } - } - else { + } else { const auto t2Subdet = t2DetId.subdetId(); const auto t2Layer = ttopo_->layer(t2DetId); // reject if hits are on different layers - if(t1Subdet != t2Subdet || t1Layer != t2Layer) { + if (t1Subdet != t2Subdet || t1Layer != t2Layer) { bool recovered = false; // but try to recover first by checking if either one has skipped over a layer - if(t1Subdet == prevSubdet && t2Subdet != prevSubdet) { + if (t1Subdet == prevSubdet && t2Subdet != prevSubdet) { // t1 has a layer t2 doesn't ++t1HitIter; recovered = true; - } - else if(t1Subdet != prevSubdet && t2Subdet == prevSubdet) { + } else if (t1Subdet != prevSubdet && t2Subdet == prevSubdet) { // t2 has a layer t1 doesn't ++t2HitIter; recovered = true; - } - else if(t1Subdet == t2Subdet) { + } else if (t1Subdet == t2Subdet) { prevSubdet = t1Subdet; // same subdet, so layer must be different - if(t2Layer > t1Layer) { + if (t2Layer > t1Layer) { // t1 has a layer t2 doesn't ++t1HitIter; recovered = true; - } - else if(t1Layer > t2Layer) { + } else if (t1Layer > t2Layer) { // t2 has a layer t1 doesn't ++t2HitIter; recovered = true; } } - if(recovered) { + if (recovered) { ++missedLayers; - if(missedLayers > overlapCheckMaxMissingLayers_) { + if (missedLayers > overlapCheckMaxMissingLayers_) { IfLogTrace(debug_, "DuplicateTrackMerger") << " max number of missed layers exceeded"; return false; } continue; } - IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) - << " are on different layers (subdet, layer) t1 " << t1Subdet << "," << t1Layer - << " t2 " << t2Subdet << "," << t2Layer; + IfLogTrace(debug_, "DuplicateTrackMerger") + << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) << " t2 hit " + << std::distance(t2->recHitsBegin(), t2HitIter) << " are on different layers (subdet, layer) t1 " + << t1Subdet << "," << t1Layer << " t2 " << t2Subdet << "," << t2Layer; return false; } // reject if same layer (but not same hit) in non-pixel detector - else if(t1Subdet != PixelSubdetector::PixelBarrel && t1Subdet != PixelSubdetector::PixelEndcap) { - IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) - << " are on same layer, but in non-pixel detector (det " << t1Det << " subdet " << t1Subdet << " layer " << t1Layer << ")"; + else if (t1Subdet != PixelSubdetector::PixelBarrel && t1Subdet != PixelSubdetector::PixelEndcap) { + IfLogTrace(debug_, "DuplicateTrackMerger") + << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) << " t2 hit " + << std::distance(t2->recHitsBegin(), t2HitIter) << " are on same layer, but in non-pixel detector (det " + << t1Det << " subdet " << t1Subdet << " layer " << t1Layer << ")"; return false; } } // Propagate longer track to the shorter track hit surface, check compatibility TrajectoryStateOnSurface tsosPropagated = propagator_->propagate(tsosInner, (*t1HitIter)->det()->surface()); - if(!tsosPropagated.isValid()) { // reject immediately if TSOS is not valid - IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) - << " TSOS not valid"; + if (!tsosPropagated.isValid()) { // reject immediately if TSOS is not valid + IfLogTrace(debug_, "DuplicateTrackMerger") + << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) << " t2 hit " + << std::distance(t2->recHitsBegin(), t2HitIter) << " TSOS not valid"; return false; } auto passChi2Pair = chi2Estimator_->estimate(tsosPropagated, **t1HitIter); - if(!passChi2Pair.first) { - IfLogTrace(debug_, "DuplicateTrackMerger") << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) - << " t2 hit " << std::distance(t2->recHitsBegin(), t2HitIter) - << " hit chi2 compatibility failed with chi2 " << passChi2Pair.second; + if (!passChi2Pair.first) { + IfLogTrace(debug_, "DuplicateTrackMerger") + << " t1 hit " << std::distance(t1->recHitsBegin(), t1HitIter) << " t2 hit " + << std::distance(t2->recHitsBegin(), t2HitIter) << " hit chi2 compatibility failed with chi2 " + << passChi2Pair.second; return false; } prevSubdet = t1Subdet; - ++t1HitIter; ++t2HitIter; + ++t1HitIter; + ++t2HitIter; } - if(t1HitIter != t1->recHitsEnd()) { + if (t1HitIter != t1->recHitsEnd()) { IfLogTrace(debug_, "DuplicateTrackMerger") << " hits on t2 ended before hits on t1"; return false; } @@ -645,7 +660,7 @@ void DuplicateTrackMerger::produce(edm::Event& iEvent, const edm::EventSetup& iS IfLogTrace(debug_, "DuplicateTrackMerger") << " all hits on t2 are on layers whre t1 has also a hit"; return true; } -} +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackType.h b/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackType.h index 8fd5f460d34b5..6cd6a3ef7e0f9 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackType.h +++ b/RecoTracker/FinalTrackSelectors/plugins/DuplicateTrackType.h @@ -2,9 +2,9 @@ #define RecoTracker_FinalTrackSelectors_DuplicateTrackType_h enum class DuplicateTrackType { - NotDuplicate=0, // default - Disjoint, // tracks are disjoint - Overlapping, // tracks overlap + NotDuplicate = 0, // default + Disjoint, // tracks are disjoint + Overlapping, // tracks overlap }; #endif diff --git a/RecoTracker/FinalTrackSelectors/plugins/LwtnnESProducer.cc b/RecoTracker/FinalTrackSelectors/plugins/LwtnnESProducer.cc index 0d7e469d6b520..0fa63ac164f6f 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/LwtnnESProducer.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/LwtnnESProducer.cc @@ -9,7 +9,7 @@ #include "lwtnn/parse_json.hh" #include -class LwtnnESProducer: public edm::ESProducer { +class LwtnnESProducer : public edm::ESProducer { public: LwtnnESProducer(const edm::ParameterSet& iConfig); ~LwtnnESProducer() override = default; @@ -27,9 +27,8 @@ class LwtnnESProducer: public edm::ESProducer { edm::FileInPath fileName_; }; -LwtnnESProducer::LwtnnESProducer(const edm::ParameterSet& iConfig): - fileName_(iConfig.getParameter("fileName")) -{ +LwtnnESProducer::LwtnnESProducer(const edm::ParameterSet& iConfig) + : fileName_(iConfig.getParameter("fileName")) { auto componentName = iConfig.getParameter("ComponentName"); setWhatProduced(this, componentName); } diff --git a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc index a838c1a3cd556..8cdece741e801 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc @@ -4,7 +4,7 @@ #include "DataFormats/Common/interface/ValueMap.h" #include "CondFormats/DataRecord/interface/GBRWrapperRcd.h" #include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ESHandle.h" #include #include @@ -14,36 +14,35 @@ using namespace reco; -MultiTrackSelector::MultiTrackSelector() -{ - useForestFromDB_ = true; -} +MultiTrackSelector::MultiTrackSelector() { useForestFromDB_ = true; } -MultiTrackSelector::MultiTrackSelector( const edm::ParameterSet & cfg ) : - src_( consumes( cfg.getParameter( "src" ) ) ), - hSrc_(consumes( cfg.getParameter( "src" ) ) ), - beamspot_( consumes( cfg.getParameter( "beamspot" ) ) ), - useVertices_( cfg.getParameter( "useVertices" ) ), - useVtxError_( cfg.getParameter( "useVtxError" ) ) - // now get the pset for each selector +MultiTrackSelector::MultiTrackSelector(const edm::ParameterSet& cfg) + : src_(consumes(cfg.getParameter("src"))), + hSrc_(consumes(cfg.getParameter("src"))), + beamspot_(consumes(cfg.getParameter("beamspot"))), + useVertices_(cfg.getParameter("useVertices")), + useVtxError_(cfg.getParameter("useVtxError")) +// now get the pset for each selector { - if (useVertices_) vertices_ = consumes(cfg.getParameter( "vertices" )); - if(useVtxError_){ - edm::LogWarning("MultiTRackSelector") << "you are executing buggy code, if intentional please help to fix it"; + if (useVertices_) + vertices_ = consumes(cfg.getParameter("vertices")); + if (useVtxError_) { + edm::LogWarning("MultiTRackSelector") << "you are executing buggy code, if intentional please help to fix it"; } useAnyMVA_ = false; useForestFromDB_ = true; dbFileName_ = ""; - if(cfg.exists("useAnyMVA")) useAnyMVA_ = cfg.getParameter("useAnyMVA"); + if (cfg.exists("useAnyMVA")) + useAnyMVA_ = cfg.getParameter("useAnyMVA"); - if(useAnyMVA_){ - if(cfg.exists("GBRForestFileName")){ + if (useAnyMVA_) { + if (cfg.exists("GBRForestFileName")) { dbFileName_ = cfg.getParameter("GBRForestFileName"); useForestFromDB_ = false; } } - std::vector trkSelectors( cfg.getParameter >("trackSelectors") ); + std::vector trkSelectors(cfg.getParameter>("trackSelectors")); qualityToSet_.reserve(trkSelectors.size()); vtxNumber_.reserve(trkSelectors.size()); vertexCut_.reserve(trkSelectors.size()); @@ -80,26 +79,24 @@ MultiTrackSelector::MultiTrackSelector( const edm::ParameterSet & cfg ) : forestLabel_.reserve(trkSelectors.size()); forest_.reserve(trkSelectors.size()); - produces >("MVAVals"); - + produces>("MVAVals"); + //foward compatibility produces("MVAValues"); - - for ( unsigned int i=0; i("vtxNumber") : 0 ); - vertexCut_.push_back( useVertices_ ? trkSelectors[i].getParameter("vertexCut") : nullptr); + vtxNumber_.push_back(useVertices_ ? trkSelectors[i].getParameter("vtxNumber") : 0); + vertexCut_.push_back(useVertices_ ? trkSelectors[i].getParameter("vertexCut") : nullptr); // parameters for adapted optimal cuts on chi2 and primary vertex compatibility - res_par_.push_back(trkSelectors[i].getParameter< std::vector >("res_par") ); - chi2n_par_.push_back( trkSelectors[i].getParameter("chi2n_par") ); - chi2n_no1Dmod_par_.push_back( trkSelectors[i].getParameter("chi2n_no1Dmod_par") ); - d0_par1_.push_back(trkSelectors[i].getParameter< std::vector >("d0_par1")); - dz_par1_.push_back(trkSelectors[i].getParameter< std::vector >("dz_par1")); - d0_par2_.push_back(trkSelectors[i].getParameter< std::vector >("d0_par2")); - dz_par2_.push_back(trkSelectors[i].getParameter< std::vector >("dz_par2")); + res_par_.push_back(trkSelectors[i].getParameter>("res_par")); + chi2n_par_.push_back(trkSelectors[i].getParameter("chi2n_par")); + chi2n_no1Dmod_par_.push_back(trkSelectors[i].getParameter("chi2n_no1Dmod_par")); + d0_par1_.push_back(trkSelectors[i].getParameter>("d0_par1")); + dz_par1_.push_back(trkSelectors[i].getParameter>("dz_par1")); + d0_par2_.push_back(trkSelectors[i].getParameter>("d0_par2")); + dz_par2_.push_back(trkSelectors[i].getParameter>("dz_par2")); // Boolean indicating if adapted primary vertex compatibility cuts are to be applied. applyAdaptedPVCuts_.push_back(trkSelectors[i].getParameter("applyAdaptedPVCuts")); // Impact parameter absolute cuts. @@ -107,130 +104,130 @@ MultiTrackSelector::MultiTrackSelector( const edm::ParameterSet & cfg ) : max_z0_.push_back(trkSelectors[i].getParameter("max_z0")); nSigmaZ_.push_back(trkSelectors[i].getParameter("nSigmaZ")); // Cuts on numbers of layers with hits/3D hits/lost hits. - min_layers_.push_back(trkSelectors[i].getParameter("minNumberLayers") ); - min_3Dlayers_.push_back(trkSelectors[i].getParameter("minNumber3DLayers") ); + min_layers_.push_back(trkSelectors[i].getParameter("minNumberLayers")); + min_3Dlayers_.push_back(trkSelectors[i].getParameter("minNumber3DLayers")); max_lostLayers_.push_back(trkSelectors[i].getParameter("maxNumberLostLayers")); min_hits_bypass_.push_back(trkSelectors[i].getParameter("minHitsToBypassChecks")); // Flag to apply absolute cuts if no PV passes the selection applyAbsCutsIfNoPV_.push_back(trkSelectors[i].getParameter("applyAbsCutsIfNoPV")); - keepAllTracks_.push_back( trkSelectors[i].getParameter("keepAllTracks")); + keepAllTracks_.push_back(trkSelectors[i].getParameter("keepAllTracks")); max_relpterr_.push_back(trkSelectors[i].getParameter("max_relpterr")); min_nhits_.push_back(trkSelectors[i].getParameter("min_nhits")); - max_minMissHitOutOrIn_.push_back( - trkSelectors[i].existsAs("max_minMissHitOutOrIn") ? - trkSelectors[i].getParameter("max_minMissHitOutOrIn") : 99); - max_lostHitFraction_.push_back( - trkSelectors[i].existsAs("max_lostHitFraction") ? - trkSelectors[i].getParameter("max_lostHitFraction") : 1.0); - min_eta_.push_back(trkSelectors[i].existsAs("min_eta") ? - trkSelectors[i].getParameter("min_eta"):-9999); - max_eta_.push_back(trkSelectors[i].existsAs("max_eta") ? - trkSelectors[i].getParameter("max_eta"):9999); - - setQualityBit_.push_back( false ); + max_minMissHitOutOrIn_.push_back(trkSelectors[i].existsAs("max_minMissHitOutOrIn") + ? trkSelectors[i].getParameter("max_minMissHitOutOrIn") + : 99); + max_lostHitFraction_.push_back(trkSelectors[i].existsAs("max_lostHitFraction") + ? trkSelectors[i].getParameter("max_lostHitFraction") + : 1.0); + min_eta_.push_back(trkSelectors[i].existsAs("min_eta") ? trkSelectors[i].getParameter("min_eta") + : -9999); + max_eta_.push_back(trkSelectors[i].existsAs("max_eta") ? trkSelectors[i].getParameter("max_eta") + : 9999); + + setQualityBit_.push_back(false); std::string qualityStr = trkSelectors[i].getParameter("qualityBit"); if (!qualityStr.empty()) { setQualityBit_[i] = true; - qualityToSet_[i] = TrackBase::qualityByName(trkSelectors[i].getParameter("qualityBit")); + qualityToSet_[i] = TrackBase::qualityByName(trkSelectors[i].getParameter("qualityBit")); } - - if (setQualityBit_[i] && (qualityToSet_[i] == TrackBase::undefQuality)) throw cms::Exception("Configuration") << - "You can't set the quality bit " << trkSelectors[i].getParameter("qualityBit") << " as it is 'undefQuality' or unknown.\n"; + + if (setQualityBit_[i] && (qualityToSet_[i] == TrackBase::undefQuality)) + throw cms::Exception("Configuration") + << "You can't set the quality bit " << trkSelectors[i].getParameter("qualityBit") + << " as it is 'undefQuality' or unknown.\n"; if (applyAbsCutsIfNoPV_[i]) { max_d0NoPV_.push_back(trkSelectors[i].getParameter("max_d0NoPV")); max_z0NoPV_.push_back(trkSelectors[i].getParameter("max_z0NoPV")); - } - else{//dummy values + } else { //dummy values max_d0NoPV_.push_back(0.); max_z0NoPV_.push_back(0.); } - - name_.push_back( trkSelectors[i].getParameter("name") ); - preFilter_[i]=trkSelectors.size(); // no prefilter + name_.push_back(trkSelectors[i].getParameter("name")); - std::string pfName=trkSelectors[i].getParameter("preFilterName"); + preFilter_[i] = trkSelectors.size(); // no prefilter + + std::string pfName = trkSelectors[i].getParameter("preFilterName"); if (!pfName.empty()) { - bool foundPF=false; - for ( unsigned int j=0; j("preFilterName"); - + bool foundPF = false; + for (unsigned int j = 0; j < i; j++) + if (name_[j] == pfName) { + foundPF = true; + preFilter_[i] = j; + } + if (!foundPF) + throw cms::Exception("Configuration") << "Invalid prefilter name in MultiTrackSelector " + << trkSelectors[i].getParameter("preFilterName"); } // produces >(name_[i]).setBranchAlias( name_[i] + "TrackQuals"); - produces >(name_[i]).setBranchAlias( name_[i] + "TrackQuals"); - produces(name_[i]).setBranchAlias( name_[i] + "QualityMasks"); - if(useAnyMVA_){ + produces>(name_[i]).setBranchAlias(name_[i] + "TrackQuals"); + produces(name_[i]).setBranchAlias(name_[i] + "QualityMasks"); + if (useAnyMVA_) { bool thisMVA = false; - if(trkSelectors[i].exists("useMVA"))thisMVA = trkSelectors[i].getParameter("useMVA"); + if (trkSelectors[i].exists("useMVA")) + thisMVA = trkSelectors[i].getParameter("useMVA"); useMVA_.push_back(thisMVA); - if(thisMVA){ - double minVal = -1; - if(trkSelectors[i].exists("minMVA"))minVal = trkSelectors[i].getParameter("minMVA"); - min_MVA_.push_back(minVal); - mvaType_.push_back(trkSelectors[i].exists("mvaType") ? trkSelectors[i].getParameter("mvaType") : "Detached"); - forestLabel_.push_back(trkSelectors[i].exists("GBRForestLabel") ? trkSelectors[i].getParameter("GBRForestLabel") : "MVASelectorIter0"); - useMVAonly_.push_back(trkSelectors[i].exists("useMVAonly") ? trkSelectors[i].getParameter("useMVAonly") : false); - }else{ - min_MVA_.push_back(-9999.0); + if (thisMVA) { + double minVal = -1; + if (trkSelectors[i].exists("minMVA")) + minVal = trkSelectors[i].getParameter("minMVA"); + min_MVA_.push_back(minVal); + mvaType_.push_back(trkSelectors[i].exists("mvaType") ? trkSelectors[i].getParameter("mvaType") + : "Detached"); + forestLabel_.push_back(trkSelectors[i].exists("GBRForestLabel") + ? trkSelectors[i].getParameter("GBRForestLabel") + : "MVASelectorIter0"); + useMVAonly_.push_back(trkSelectors[i].exists("useMVAonly") ? trkSelectors[i].getParameter("useMVAonly") + : false); + } else { + min_MVA_.push_back(-9999.0); useMVAonly_.push_back(false); - mvaType_.push_back("Detached"); - forestLabel_.push_back("MVASelectorIter0"); + mvaType_.push_back("Detached"); + forestLabel_.push_back("MVASelectorIter0"); } - }else{ + } else { useMVA_.push_back(false); useMVAonly_.push_back(false); min_MVA_.push_back(-9999.0); mvaType_.push_back("Detached"); forestLabel_.push_back("MVASelectorIter0"); } - } } MultiTrackSelector::~MultiTrackSelector() { - for(auto forest : forest_)delete forest; + for (auto forest : forest_) + delete forest; } - void MultiTrackSelector::beginStream(edm::StreamID) { - if(!useForestFromDB_){ - TFile gbrfile(dbFileName_.c_str()); - for(int i = 0; i < (int)forestLabel_.size(); i++){ - forest_[i] = (GBRForest*)gbrfile.Get(forestLabel_[i].c_str()); - } + if (!useForestFromDB_) { + TFile gbrfile(dbFileName_.c_str()); + for (int i = 0; i < (int)forestLabel_.size(); i++) { + forest_[i] = (GBRForest*)gbrfile.Get(forestLabel_[i].c_str()); + } } - } - - -void MultiTrackSelector::run( edm::Event& evt, const edm::EventSetup& es ) const -{ - using namespace std; +void MultiTrackSelector::run(edm::Event& evt, const edm::EventSetup& es) const { + using namespace std; using namespace edm; using namespace reco; - // Get tracks + // Get tracks Handle hSrcTrack; - evt.getByToken(src_, hSrcTrack ); + evt.getByToken(src_, hSrcTrack); const TrackCollection& srcTracks(*hSrcTrack); if (hSrcTrack.failedToGet()) - edm::LogWarning("MultiTrackSelector")<<"could not get Track collection"; + edm::LogWarning("MultiTrackSelector") << "could not get Track collection"; // get hits in track.. Handle hSrcHits; - evt.getByToken(hSrc_, hSrcHits ); - const TrackingRecHitCollection & srcHits(*hSrcHits); - + evt.getByToken(hSrc_, hSrcHits); + const TrackingRecHitCollection& srcHits(*hSrcHits); // looking for the beam spot edm::Handle hBsp; @@ -239,358 +236,378 @@ void MultiTrackSelector::run( edm::Event& evt, const edm::EventSetup& es ) const // Select good primary vertices for use in subsequent track selection edm::Handle hVtx; - if (useVertices_) { - evt.getByToken(vertices_, hVtx); - if (hVtx.failedToGet()) - edm::LogWarning("MultiTrackSelector")<<"could not get Vertex collection"; + if (useVertices_) { + evt.getByToken(vertices_, hVtx); + if (hVtx.failedToGet()) + edm::LogWarning("MultiTrackSelector") << "could not get Vertex collection"; } - unsigned int trkSize=srcTracks.size(); - std::vector selTracksSave( qualityToSet_.size()*trkSize,0); + unsigned int trkSize = srcTracks.size(); + std::vector selTracksSave(qualityToSet_.size() * trkSize, 0); std::vector points; std::vector vterr, vzerr; - if (useVertices_) selectVertices(0,*hVtx, points, vterr, vzerr); + if (useVertices_) + selectVertices(0, *hVtx, points, vterr, vzerr); //auto vtxP = points.empty() ? vertexBeamSpot.position() : points[0]; // rare, very rare, still happens! - for (unsigned int i=0; i mvaVals_(srcTracks.size(),-99.f); - processMVA(evt,es,vertexBeamSpot,*(hVtx.product()), i, mvaVals_, i == 0 ? true : false); - std::vector selTracks(trkSize,0); + for (unsigned int i = 0; i < qualityToSet_.size(); i++) { + std::vector mvaVals_(srcTracks.size(), -99.f); + processMVA(evt, es, vertexBeamSpot, *(hVtx.product()), i, mvaVals_, i == 0 ? true : false); + std::vector selTracks(trkSize, 0); auto selTracksValueMap = std::make_unique>(); edm::ValueMap::Filler filler(*selTracksValueMap); - if (useVertices_) selectVertices(i,*hVtx, points, vterr, vzerr); + if (useVertices_) + selectVertices(i, *hVtx, points, vterr, vzerr); // Loop over tracks size_t current = 0; for (TrackCollection::const_iterator it = srcTracks.begin(), ed = srcTracks.end(); it != ed; ++it, ++current) { - const Track & trk = * it; + const Track& trk = *it; // Check if this track passes cuts - LogTrace("TrackSelection") << "ready to check track with pt="<< trk.pt() ; + LogTrace("TrackSelection") << "ready to check track with pt=" << trk.pt(); //already removed - bool ok=true; - if (preFilter_[i](selTracks.begin(),selTracks.end()); - evt.put(std::move(quals),name_[i]); + evt.put(std::move(selTracksValueMap), name_[i]); + for (auto& q : selTracks) + q = std::max(q, 0); + auto quals = std::make_unique(selTracks.begin(), selTracks.end()); + evt.put(std::move(quals), name_[i]); } } - - bool MultiTrackSelector::select(unsigned int tsNum, - const reco::BeamSpot &vertexBeamSpot, - const TrackingRecHitCollection & recHits, - const reco::Track &tk, - const std::vector &points, - std::vector &vterr, - std::vector &vzerr, - double mvaVal) const { +bool MultiTrackSelector::select(unsigned int tsNum, + const reco::BeamSpot& vertexBeamSpot, + const TrackingRecHitCollection& recHits, + const reco::Track& tk, + const std::vector& points, + std::vector& vterr, + std::vector& vzerr, + double mvaVal) const { // Decide if the given track passes selection cuts. - using namespace std; - + using namespace std; + //cuts on number of valid hits auto nhits = tk.numberOfValidHits(); - if(nhits>=min_hits_bypass_[tsNum]) return true; - if(nhits < min_nhits_[tsNum]) return false; - - if ( tk.ndof() < 1E-5 ) return false; + if (nhits >= min_hits_bypass_[tsNum]) + return true; + if (nhits < min_nhits_[tsNum]) + return false; + if (tk.ndof() < 1E-5) + return false; ////////////////////////////////////////////////// //Adding the MVA selection before any other cut// //////////////////////////////////////////////// - if(useAnyMVA_ && useMVA_[tsNum]){ - if (useMVAonly_[tsNum]) return mvaVal > min_MVA_[tsNum]; - if(mvaVal < min_MVA_[tsNum])return false; + if (useAnyMVA_ && useMVA_[tsNum]) { + if (useMVAonly_[tsNum]) + return mvaVal > min_MVA_[tsNum]; + if (mvaVal < min_MVA_[tsNum]) + return false; } ///////////////////////////////// //End of MVA selection section// /////////////////////////////// - // Cuts on numbers of layers with hits/3D hits/lost hits. - uint32_t nlayers = tk.hitPattern().trackerLayersWithMeasurement(); - uint32_t nlayers3D = tk.hitPattern().pixelLayersWithMeasurement() + - tk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); + uint32_t nlayers = tk.hitPattern().trackerLayersWithMeasurement(); + uint32_t nlayers3D = + tk.hitPattern().pixelLayersWithMeasurement() + tk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); uint32_t nlayersLost = tk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); - LogDebug("TrackSelection") << "cuts on nlayers: " << nlayers << " " << nlayers3D << " " << nlayersLost << " vs " - << min_layers_[tsNum] << " " << min_3Dlayers_[tsNum] << " " << max_lostLayers_[tsNum]; - if (nlayers < min_layers_[tsNum]) return false; - if (nlayers3D < min_3Dlayers_[tsNum]) return false; - if (nlayersLost > max_lostLayers_[tsNum]) return false; + LogDebug("TrackSelection") << "cuts on nlayers: " << nlayers << " " << nlayers3D << " " << nlayersLost << " vs " + << min_layers_[tsNum] << " " << min_3Dlayers_[tsNum] << " " << max_lostLayers_[tsNum]; + if (nlayers < min_layers_[tsNum]) + return false; + if (nlayers3D < min_3Dlayers_[tsNum]) + return false; + if (nlayersLost > max_lostLayers_[tsNum]) + return false; LogTrace("TrackSelection") << "cuts on nlayers passed"; - float chi2n = tk.normalizedChi2(); + float chi2n = tk.normalizedChi2(); float chi2n_no1Dmod = chi2n; int count1dhits = 0; auto ith = tk.extra()->firstRecHit(); - auto edh = ith + tk.recHitsSize(); - for (; ith 0) { float chi2 = tk.chi2(); float ndof = tk.ndof(); - chi2n = (chi2+count1dhits)/float(ndof+count1dhits); + chi2n = (chi2 + count1dhits) / float(ndof + count1dhits); } // For each 1D rechit, the chi^2 and ndof is increased by one. This is a way of retaining approximately // the same normalized chi^2 distribution as with 2D rechits. - if (chi2n > chi2n_par_[tsNum]*nlayers) return false; + if (chi2n > chi2n_par_[tsNum] * nlayers) + return false; - if (chi2n_no1Dmod > chi2n_no1Dmod_par_[tsNum]*nlayers) return false; + if (chi2n_no1Dmod > chi2n_no1Dmod_par_[tsNum] * nlayers) + return false; // Get track parameters - float pt = std::max(float(tk.pt()),0.000001f); + float pt = std::max(float(tk.pt()), 0.000001f); float eta = tk.eta(); - if (etamax_eta_[tsNum]) return false; + if (eta < min_eta_[tsNum] || eta > max_eta_[tsNum]) + return false; //cuts on relative error on pt - float relpterr = float(tk.ptError())/pt; - if(relpterr > max_relpterr_[tsNum]) return false; + float relpterr = float(tk.ptError()) / pt; + if (relpterr > max_relpterr_[tsNum]) + return false; int lostIn = tk.hitPattern().numberOfLostTrackerHits(reco::HitPattern::MISSING_INNER_HITS); int lostOut = tk.hitPattern().numberOfLostTrackerHits(reco::HitPattern::MISSING_OUTER_HITS); - int minLost = std::min(lostIn,lostOut); - if (minLost > max_minMissHitOutOrIn_[tsNum]) return false; + int minLost = std::min(lostIn, lostOut); + if (minLost > max_minMissHitOutOrIn_[tsNum]) + return false; float lostMidFrac = tk.numberOfLostHits() / (tk.numberOfValidHits() + tk.numberOfLostHits()); - if (lostMidFrac > max_lostHitFraction_[tsNum]) return false; - - + if (lostMidFrac > max_lostHitFraction_[tsNum]) + return false; //other track parameters - float d0 = -tk.dxy(vertexBeamSpot.position()), d0E = tk.d0Error(), - dz = tk.dz(vertexBeamSpot.position()), dzE = tk.dzError(); + float d0 = -tk.dxy(vertexBeamSpot.position()), d0E = tk.d0Error(), dz = tk.dz(vertexBeamSpot.position()), + dzE = tk.dzError(); // parametrized d0 resolution for the track pt - float nomd0E = sqrt(res_par_[tsNum][0]*res_par_[tsNum][0]+(res_par_[tsNum][1]/pt)*(res_par_[tsNum][1]/pt)); + float nomd0E = sqrt(res_par_[tsNum][0] * res_par_[tsNum][0] + (res_par_[tsNum][1] / pt) * (res_par_[tsNum][1] / pt)); // parametrized z0 resolution for the track pt and eta - float nomdzE = nomd0E*(std::cosh(eta)); - - float dzCut = std::min( powN(dz_par1_[tsNum][0]*nlayers,int(dz_par1_[tsNum][1]+0.5))*nomdzE, - powN(dz_par2_[tsNum][0]*nlayers,int(dz_par2_[tsNum][1]+0.5))*dzE ); - float d0Cut = std::min( powN(d0_par1_[tsNum][0]*nlayers,int(d0_par1_[tsNum][1]+0.5))*nomd0E, - powN(d0_par2_[tsNum][0]*nlayers,int(d0_par2_[tsNum][1]+0.5))*d0E ); + float nomdzE = nomd0E * (std::cosh(eta)); + float dzCut = std::min(powN(dz_par1_[tsNum][0] * nlayers, int(dz_par1_[tsNum][1] + 0.5)) * nomdzE, + powN(dz_par2_[tsNum][0] * nlayers, int(dz_par2_[tsNum][1] + 0.5)) * dzE); + float d0Cut = std::min(powN(d0_par1_[tsNum][0] * nlayers, int(d0_par1_[tsNum][1] + 0.5)) * nomd0E, + powN(d0_par2_[tsNum][0] * nlayers, int(d0_par2_[tsNum][1] + 0.5)) * d0E); // ---- PrimaryVertex compatibility cut - bool primaryVertexZCompatibility(false); - bool primaryVertexD0Compatibility(false); + bool primaryVertexZCompatibility(false); + bool primaryVertexD0Compatibility(false); - if (points.empty()) { //If not primaryVertices are reconstructed, check just the compatibility with the BS + if (points.empty()) { //If not primaryVertices are reconstructed, check just the compatibility with the BS //z0 within (n sigma + dzCut) of the beam spot z, if no good vertex is found - if ( abs(dz) < hypot(vertexBeamSpot.sigmaZ()*nSigmaZ_[tsNum],dzCut) ) primaryVertexZCompatibility = true; + if (abs(dz) < hypot(vertexBeamSpot.sigmaZ() * nSigmaZ_[tsNum], dzCut)) + primaryVertexZCompatibility = true; // d0 compatibility with beam line - if (abs(d0) < d0Cut) primaryVertexD0Compatibility = true; + if (abs(d0) < d0Cut) + primaryVertexD0Compatibility = true; } - int iv=0; + int iv = 0; for (std::vector::const_iterator point = points.begin(), end = points.end(); point != end; ++point) { LogTrace("TrackSelection") << "Test track w.r.t. vertex with z position " << point->z(); - if(primaryVertexZCompatibility && primaryVertexD0Compatibility) break; - float dzPV = tk.dz(*point); //re-evaluate the dz with respect to the vertex position - float d0PV = tk.dxy(*point); //re-evaluate the dxy with respect to the vertex position - if(useVtxError_){ - float dzErrPV = std::sqrt(dzE*dzE+vzerr[iv]*vzerr[iv]); // include vertex error in z - float d0ErrPV = std::sqrt(d0E*d0E+vterr[iv]*vterr[iv]); // include vertex error in xy - iv++; - if (abs(dzPV) < dz_par1_[tsNum][0]*pow(nlayers,dz_par1_[tsNum][1])*nomdzE && - abs(dzPV) < dz_par2_[tsNum][0]*pow(nlayers,dz_par2_[tsNum][1])*dzErrPV && - abs(dzPV) < max_z0_[tsNum]) primaryVertexZCompatibility = true; - if (abs(d0PV) < d0_par1_[tsNum][0]*pow(nlayers,d0_par1_[tsNum][1])*nomd0E && - abs(d0PV) < d0_par2_[tsNum][0]*pow(nlayers,d0_par2_[tsNum][1])*d0ErrPV && - abs(d0PV) < max_d0_[tsNum]) primaryVertexD0Compatibility = true; - }else{ - if (abs(dzPV) < dzCut) primaryVertexZCompatibility = true; - if (abs(d0PV) < d0Cut) primaryVertexD0Compatibility = true; + if (primaryVertexZCompatibility && primaryVertexD0Compatibility) + break; + float dzPV = tk.dz(*point); //re-evaluate the dz with respect to the vertex position + float d0PV = tk.dxy(*point); //re-evaluate the dxy with respect to the vertex position + if (useVtxError_) { + float dzErrPV = std::sqrt(dzE * dzE + vzerr[iv] * vzerr[iv]); // include vertex error in z + float d0ErrPV = std::sqrt(d0E * d0E + vterr[iv] * vterr[iv]); // include vertex error in xy + iv++; + if (abs(dzPV) < dz_par1_[tsNum][0] * pow(nlayers, dz_par1_[tsNum][1]) * nomdzE && + abs(dzPV) < dz_par2_[tsNum][0] * pow(nlayers, dz_par2_[tsNum][1]) * dzErrPV && abs(dzPV) < max_z0_[tsNum]) + primaryVertexZCompatibility = true; + if (abs(d0PV) < d0_par1_[tsNum][0] * pow(nlayers, d0_par1_[tsNum][1]) * nomd0E && + abs(d0PV) < d0_par2_[tsNum][0] * pow(nlayers, d0_par2_[tsNum][1]) * d0ErrPV && abs(d0PV) < max_d0_[tsNum]) + primaryVertexD0Compatibility = true; + } else { + if (abs(dzPV) < dzCut) + primaryVertexZCompatibility = true; + if (abs(d0PV) < d0Cut) + primaryVertexD0Compatibility = true; } LogTrace("TrackSelection") << "distances " << dzPV << " " << d0PV << " vs " << dzCut << " " << d0Cut; } if (points.empty() && applyAbsCutsIfNoPV_[tsNum]) { - if ( abs(dz) > max_z0NoPV_[tsNum] || abs(d0) > max_d0NoPV_[tsNum]) return false; - } else { + if (abs(dz) > max_z0NoPV_[tsNum] || abs(d0) > max_d0NoPV_[tsNum]) + return false; + } else { // Absolute cuts on all tracks impact parameters with respect to beam-spot. // If BS is not compatible, verify if at least the reco-vertex is compatible (useful for incorrect BS settings) - if (abs(d0) > max_d0_[tsNum] && !primaryVertexD0Compatibility) return false; + if (abs(d0) > max_d0_[tsNum] && !primaryVertexD0Compatibility) + return false; LogTrace("TrackSelection") << "absolute cuts on d0 passed"; - if (abs(dz) > max_z0_[tsNum] && !primaryVertexZCompatibility) return false; + if (abs(dz) > max_z0_[tsNum] && !primaryVertexZCompatibility) + return false; LogTrace("TrackSelection") << "absolute cuts on dz passed"; } - LogTrace("TrackSelection") << "cuts on PV: apply adapted PV cuts? " << applyAdaptedPVCuts_[tsNum] - << " d0 compatibility? " << primaryVertexD0Compatibility - << " z compatibility? " << primaryVertexZCompatibility ; + LogTrace("TrackSelection") << "cuts on PV: apply adapted PV cuts? " << applyAdaptedPVCuts_[tsNum] + << " d0 compatibility? " << primaryVertexD0Compatibility << " z compatibility? " + << primaryVertexZCompatibility; if (applyAdaptedPVCuts_[tsNum]) { return (primaryVertexD0Compatibility && primaryVertexZCompatibility); } else { - return true; + return true; } - } - void MultiTrackSelector::selectVertices(unsigned int tsNum, - const reco::VertexCollection &vtxs, - std::vector &points, - std::vector &vterr, - std::vector &vzerr) const { +void MultiTrackSelector::selectVertices(unsigned int tsNum, + const reco::VertexCollection& vtxs, + std::vector& points, + std::vector& vterr, + std::vector& vzerr) const { // Select good primary vertices using namespace reco; - int32_t toTake = vtxNumber_[tsNum]; + int32_t toTake = vtxNumber_[tsNum]; for (VertexCollection::const_iterator it = vtxs.begin(), ed = vtxs.end(); it != ed; ++it) { - - LogDebug("SelectVertex") << " select vertex with z position " << it->z() << " " - << it->chi2() << " " << it->ndof() << " " << TMath::Prob(it->chi2(), static_cast(it->ndof())); + LogDebug("SelectVertex") << " select vertex with z position " << it->z() << " " << it->chi2() << " " << it->ndof() + << " " << TMath::Prob(it->chi2(), static_cast(it->ndof())); Vertex vtx = *it; - bool pass = vertexCut_[tsNum]( vtx ); - if( pass ) { - points.push_back(it->position()); - vterr.push_back(sqrt(it->yError()*it->xError())); + bool pass = vertexCut_[tsNum](vtx); + if (pass) { + points.push_back(it->position()); + vterr.push_back(sqrt(it->yError() * it->xError())); vzerr.push_back(it->zError()); LogTrace("SelectVertex") << " SELECTED vertex with z position " << it->z(); - toTake--; if (toTake == 0) break; + toTake--; + if (toTake == 0) + break; } } } -void MultiTrackSelector::processMVA(edm::Event& evt, const edm::EventSetup& es, const reco::BeamSpot& beamspot,const reco::VertexCollection& vertices, int selIndex, std::vector & mvaVals_, bool writeIt) const -{ - - using namespace std; +void MultiTrackSelector::processMVA(edm::Event& evt, + const edm::EventSetup& es, + const reco::BeamSpot& beamspot, + const reco::VertexCollection& vertices, + int selIndex, + std::vector& mvaVals_, + bool writeIt) const { + using namespace std; using namespace edm; using namespace reco; - // Get tracks + // Get tracks Handle hSrcTrack; - evt.getByToken( src_, hSrcTrack ); + evt.getByToken(src_, hSrcTrack); const TrackCollection& srcTracks(*hSrcTrack); RefToBaseProd rtbpTrackCollection(hSrcTrack); - assert(mvaVals_.size()==srcTracks.size()); + assert(mvaVals_.size() == srcTracks.size()); - // get hits in track.. + // get hits in track.. Handle hSrcHits; - evt.getByToken( hSrc_, hSrcHits ); - const TrackingRecHitCollection & srcHits(*hSrcHits); - - + evt.getByToken(hSrc_, hSrcHits); + const TrackingRecHitCollection& srcHits(*hSrcHits); + auto mvaValValueMap = std::make_unique>(); edm::ValueMap::Filler mvaFiller(*mvaValValueMap); - - if(!useAnyMVA_ && writeIt){ + if (!useAnyMVA_ && writeIt) { // mvaVals_ already initalized... - mvaFiller.insert(hSrcTrack,mvaVals_.begin(),mvaVals_.end()); + mvaFiller.insert(hSrcTrack, mvaVals_.begin(), mvaVals_.end()); mvaFiller.fill(); - evt.put(std::move(mvaValValueMap),"MVAVals"); - auto mvas = std::make_unique(mvaVals_.begin(),mvaVals_.end()); - evt.put(std::move(mvas),"MVAValues"); + evt.put(std::move(mvaValValueMap), "MVAVals"); + auto mvas = std::make_unique(mvaVals_.begin(), mvaVals_.end()); + evt.put(std::move(mvas), "MVAValues"); return; } - if(!useMVA_[selIndex] && !writeIt)return; - + if (!useMVA_[selIndex] && !writeIt) + return; size_t current = 0; for (TrackCollection::const_iterator it = srcTracks.begin(), ed = srcTracks.end(); it != ed; ++it, ++current) { - const Track & trk = * it; - RefToBase trackRef(rtbpTrackCollection,current); + const Track& trk = *it; + RefToBase trackRef(rtbpTrackCollection, current); auto tmva_ndof_ = trk.ndof(); auto tmva_nlayers_ = trk.hitPattern().trackerLayersWithMeasurement(); - auto tmva_nlayers3D_ = trk.hitPattern().pixelLayersWithMeasurement() - + trk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); + auto tmva_nlayers3D_ = + trk.hitPattern().pixelLayersWithMeasurement() + trk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); auto tmva_nlayerslost_ = trk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); - float chi2n = trk.normalizedChi2(); + float chi2n = trk.normalizedChi2(); float chi2n_no1Dmod = chi2n; - + int count1dhits = 0; auto ith = trk.extra()->firstRecHit(); - auto edh = ith + trk.recHitsSize(); - for (; ith 0) { float chi2 = trk.chi2(); float ndof = trk.ndof(); - chi2n = (chi2+count1dhits)/float(ndof+count1dhits); + chi2n = (chi2 + count1dhits) / float(ndof + count1dhits); } auto tmva_chi2n_ = chi2n; auto tmva_chi2n_no1dmod_ = chi2n_no1Dmod; auto tmva_eta_ = trk.eta(); - auto tmva_relpterr_ = float(trk.ptError())/std::max(float(trk.pt()),0.000001f); + auto tmva_relpterr_ = float(trk.ptError()) / std::max(float(trk.pt()), 0.000001f); auto tmva_nhits_ = trk.numberOfValidHits(); int lostIn = trk.hitPattern().numberOfLostTrackerHits(reco::HitPattern::MISSING_INNER_HITS); int lostOut = trk.hitPattern().numberOfLostTrackerHits(reco::HitPattern::MISSING_OUTER_HITS); - auto tmva_minlost_ = std::min(lostIn,lostOut); + auto tmva_minlost_ = std::min(lostIn, lostOut); auto tmva_lostmidfrac_ = trk.numberOfLostHits() / (trk.numberOfValidHits() + trk.numberOfLostHits()); auto tmva_absd0_ = fabs(-trk.dxy(beamspot.position())); auto tmva_absdz_ = fabs(trk.dz(beamspot.position())); - Point bestVertex = getBestVertex(trackRef,vertices); + Point bestVertex = getBestVertex(trackRef, vertices); auto tmva_absd0PV_ = fabs(trk.dxy(bestVertex)); auto tmva_absdzPV_ = fabs(trk.dz(bestVertex)); auto tmva_pt_ = trk.pt(); - GBRForest const * forest = forest_[selIndex]; - if(useForestFromDB_){ + GBRForest const* forest = forest_[selIndex]; + if (useForestFromDB_) { edm::ESHandle forestHandle; - es.get().get(forestLabel_[selIndex],forestHandle); + es.get().get(forestLabel_[selIndex], forestHandle); forest = forestHandle.product(); } @@ -612,54 +629,54 @@ void MultiTrackSelector::processMVA(edm::Event& evt, const edm::EventSetup& es, gbrVals_[14] = tmva_absdz_; gbrVals_[15] = tmva_absd0_; - if (mvaType_[selIndex] == "Prompt"){ + if (mvaType_[selIndex] == "Prompt") { auto gbrVal = forest->GetClassifier(gbrVals_); mvaVals_[current] = gbrVal; - }else{ + } else { float detachedGbrVals_[12]; - for(int jjj = 0; jjj < 12; jjj++)detachedGbrVals_[jjj] = gbrVals_[jjj]; + for (int jjj = 0; jjj < 12; jjj++) + detachedGbrVals_[jjj] = gbrVals_[jjj]; auto gbrVal = forest->GetClassifier(detachedGbrVals_); mvaVals_[current] = gbrVal; } } - if(writeIt){ - mvaFiller.insert(hSrcTrack,mvaVals_.begin(),mvaVals_.end()); + if (writeIt) { + mvaFiller.insert(hSrcTrack, mvaVals_.begin(), mvaVals_.end()); mvaFiller.fill(); - evt.put(std::move(mvaValValueMap),"MVAVals"); - auto mvas = std::make_unique(mvaVals_.begin(),mvaVals_.end()); - evt.put(std::move(mvas),"MVAValues"); + evt.put(std::move(mvaValValueMap), "MVAVals"); + auto mvas = std::make_unique(mvaVals_.begin(), mvaVals_.end()); + evt.put(std::move(mvas), "MVAValues"); } - } -MultiTrackSelector::Point MultiTrackSelector::getBestVertex(TrackBaseRef track,VertexCollection vertices) const { - Point p(0,0,-99999); - Point p_dz(0,0,-99999); +MultiTrackSelector::Point MultiTrackSelector::getBestVertex(TrackBaseRef track, VertexCollection vertices) const { + Point p(0, 0, -99999); + Point p_dz(0, 0, -99999); float bestWeight = 0; float dzmin = 10000; bool weightMatch = false; - for(auto const & vertex : vertices){ + for (auto const& vertex : vertices) { float w = vertex.trackWeight(track); const Point& v_pos = vertex.position(); - if(w > bestWeight){ + if (w > bestWeight) { p = v_pos; bestWeight = w; weightMatch = true; } float dz = fabs(track.get()->dz(v_pos)); - if(dz < dzmin){ + if (dz < dzmin) { p_dz = v_pos; dzmin = dz; } } - if(weightMatch)return p; - else return p_dz; + if (weightMatch) + return p; + else + return p_dz; } - #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(MultiTrackSelector); - diff --git a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h index 5b27a8484e510..95eaf57e689ec 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h +++ b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h @@ -32,127 +32,128 @@ #include "CommonTools/Utils/interface/StringCutObjectSelector.h" #include "CondFormats/EgammaObjects/interface/GBRForest.h" - class dso_hidden MultiTrackSelector : public edm::stream::EDProducer<> { - private: - public: - /// constructor - explicit MultiTrackSelector(); - explicit MultiTrackSelector( const edm::ParameterSet & cfg ) ; - /// destructor - ~MultiTrackSelector() override ; - - using MVACollection = std::vector; - using QualityMaskCollection = std::vector; - - - protected: - void beginStream(edm::StreamID) final; - - // void streamBeginRun(edm::StreamID, edm::Run const&, edm::EventSetup const&) const final { - // init(); - //} - //void beginRun(edm::Run const&, edm::EventSetup const&) final { init(); } - // void init(edm::EventSetup const& es) const; - - typedef math::XYZPoint Point; - /// process one event - void produce(edm::Event& evt, const edm::EventSetup& es ) final { - run(evt,es); - } - virtual void run( edm::Event& evt, const edm::EventSetup& es ) const; - - /// return class, or -1 if rejected - bool select (unsigned tsNum, - const reco::BeamSpot &vertexBeamSpot, - const TrackingRecHitCollection & recHits, - const reco::Track &tk, - const std::vector &points, - std::vector &vterr, - std::vector &vzerr, - double mvaVal) const; - void selectVertices ( unsigned int tsNum, - const reco::VertexCollection &vtxs, - std::vector &points, - std::vector &vterr, - std::vector &vzerr) const; - - void processMVA(edm::Event& evt, const edm::EventSetup& es,const reco::BeamSpot& beamspot,const reco::VertexCollection& vertices, int selIndex, std::vector & mvaVals_, bool writeIt=false) const; - Point getBestVertex(const reco::TrackBaseRef,const reco::VertexCollection) const; - - /// source collection label - edm::EDGetTokenT src_; - edm::EDGetTokenT hSrc_; - edm::EDGetTokenT beamspot_; - bool useVertices_; - bool useVtxError_; - bool useAnyMVA_; - edm::EDGetTokenT vertices_; - - /// do I have to set a quality bit? - std::vector setQualityBit_; - std::vector qualityToSet_; - - /// vertex cuts - std::vector vtxNumber_; - //StringCutObjectSelector is not const thread safe - std::vector > vertexCut_; - - // parameters for adapted optimal cuts on chi2 and primary vertex compatibility - std::vector< std::vector > res_par_; - std::vector< double > chi2n_par_; - std::vector< double > chi2n_no1Dmod_par_; - std::vector< std::vector > d0_par1_; - std::vector< std::vector > dz_par1_; - std::vector< std::vector > d0_par2_; - std::vector< std::vector > dz_par2_; - // Boolean indicating if adapted primary vertex compatibility cuts are to be applied. - std::vector applyAdaptedPVCuts_; - - /// Impact parameter absolute cuts - std::vector max_d0_; - std::vector max_z0_; - std::vector nSigmaZ_; - - /// Cuts on numbers of layers with hits/3D hits/lost hits. - std::vector min_layers_; - std::vector min_3Dlayers_; - std::vector max_lostLayers_; - std::vector min_hits_bypass_; - - // pterror and nvalid hits cuts - std::vector max_relpterr_; - std::vector min_nhits_; - - std::vector max_minMissHitOutOrIn_; - std::vector max_lostHitFraction_; - - std::vector min_eta_; - std::vector max_eta_; - - // Flag and absolute cuts if no PV passes the selection - std::vector max_d0NoPV_; - std::vector max_z0NoPV_; - std::vector applyAbsCutsIfNoPV_; - //if true, selector flags but does not select - std::vector keepAllTracks_; - - // allow one of the previous psets to be used as a prefilter - std::vector preFilter_; - std::vector name_; - - //setup mva selector - std::vector useMVA_; - std::vector useMVAonly_; - - std::vector min_MVA_; - - std::vector mvaType_; - std::vector forestLabel_; - std::vector forest_; - bool useForestFromDB_; - std::string dbFileName_; - - - }; +class dso_hidden MultiTrackSelector : public edm::stream::EDProducer<> { +private: +public: + /// constructor + explicit MultiTrackSelector(); + explicit MultiTrackSelector(const edm::ParameterSet &cfg); + /// destructor + ~MultiTrackSelector() override; + + using MVACollection = std::vector; + using QualityMaskCollection = std::vector; + +protected: + void beginStream(edm::StreamID) final; + + // void streamBeginRun(edm::StreamID, edm::Run const&, edm::EventSetup const&) const final { + // init(); + //} + //void beginRun(edm::Run const&, edm::EventSetup const&) final { init(); } + // void init(edm::EventSetup const& es) const; + + typedef math::XYZPoint Point; + /// process one event + void produce(edm::Event &evt, const edm::EventSetup &es) final { run(evt, es); } + virtual void run(edm::Event &evt, const edm::EventSetup &es) const; + + /// return class, or -1 if rejected + bool select(unsigned tsNum, + const reco::BeamSpot &vertexBeamSpot, + const TrackingRecHitCollection &recHits, + const reco::Track &tk, + const std::vector &points, + std::vector &vterr, + std::vector &vzerr, + double mvaVal) const; + void selectVertices(unsigned int tsNum, + const reco::VertexCollection &vtxs, + std::vector &points, + std::vector &vterr, + std::vector &vzerr) const; + + void processMVA(edm::Event &evt, + const edm::EventSetup &es, + const reco::BeamSpot &beamspot, + const reco::VertexCollection &vertices, + int selIndex, + std::vector &mvaVals_, + bool writeIt = false) const; + Point getBestVertex(const reco::TrackBaseRef, const reco::VertexCollection) const; + + /// source collection label + edm::EDGetTokenT src_; + edm::EDGetTokenT hSrc_; + edm::EDGetTokenT beamspot_; + bool useVertices_; + bool useVtxError_; + bool useAnyMVA_; + edm::EDGetTokenT vertices_; + + /// do I have to set a quality bit? + std::vector setQualityBit_; + std::vector qualityToSet_; + + /// vertex cuts + std::vector vtxNumber_; + //StringCutObjectSelector is not const thread safe + std::vector > vertexCut_; + + // parameters for adapted optimal cuts on chi2 and primary vertex compatibility + std::vector > res_par_; + std::vector chi2n_par_; + std::vector chi2n_no1Dmod_par_; + std::vector > d0_par1_; + std::vector > dz_par1_; + std::vector > d0_par2_; + std::vector > dz_par2_; + // Boolean indicating if adapted primary vertex compatibility cuts are to be applied. + std::vector applyAdaptedPVCuts_; + + /// Impact parameter absolute cuts + std::vector max_d0_; + std::vector max_z0_; + std::vector nSigmaZ_; + + /// Cuts on numbers of layers with hits/3D hits/lost hits. + std::vector min_layers_; + std::vector min_3Dlayers_; + std::vector max_lostLayers_; + std::vector min_hits_bypass_; + + // pterror and nvalid hits cuts + std::vector max_relpterr_; + std::vector min_nhits_; + + std::vector max_minMissHitOutOrIn_; + std::vector max_lostHitFraction_; + + std::vector min_eta_; + std::vector max_eta_; + + // Flag and absolute cuts if no PV passes the selection + std::vector max_d0NoPV_; + std::vector max_z0NoPV_; + std::vector applyAbsCutsIfNoPV_; + //if true, selector flags but does not select + std::vector keepAllTracks_; + + // allow one of the previous psets to be used as a prefilter + std::vector preFilter_; + std::vector name_; + + //setup mva selector + std::vector useMVA_; + std::vector useMVAonly_; + + std::vector min_MVA_; + + std::vector mvaType_; + std::vector forestLabel_; + std::vector forest_; + bool useForestFromDB_; + std::string dbFileName_; +}; #endif diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackAlgoPriorityOrderESProducer.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackAlgoPriorityOrderESProducer.cc index 507818aafa1d7..9a0a1668627d4 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackAlgoPriorityOrderESProducer.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackAlgoPriorityOrderESProducer.cc @@ -6,7 +6,7 @@ #include "RecoTracker/Record/interface/CkfComponentsRecord.h" -class TrackAlgoPriorityOrderESProducer: public edm::ESProducer { +class TrackAlgoPriorityOrderESProducer : public edm::ESProducer { public: TrackAlgoPriorityOrderESProducer(const edm::ParameterSet& iConfig); ~TrackAlgoPriorityOrderESProducer() override = default; @@ -22,9 +22,9 @@ class TrackAlgoPriorityOrderESProducer: public edm::ESProducer { TrackAlgoPriorityOrderESProducer::TrackAlgoPriorityOrderESProducer(const edm::ParameterSet& iConfig) { const auto& algoNames = iConfig.getParameter >("algoOrder"); algoOrder_.reserve(algoNames.size()); - for(const auto& name: algoNames) { + for (const auto& name : algoNames) { auto algo = reco::TrackBase::algoByName(name); - if(algo == reco::TrackBase::undefAlgorithm && name != "undefAlgorithm") { + if (algo == reco::TrackBase::undefAlgorithm && name != "undefAlgorithm") { throw cms::Exception("Configuration") << "Incorrect track algo " << name; } algoOrder_.push_back(algo); diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackCandidateTopBottomHitFilter.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackCandidateTopBottomHitFilter.cc index 801939504a02f..e95e317a7ea1c 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackCandidateTopBottomHitFilter.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackCandidateTopBottomHitFilter.cc @@ -16,7 +16,6 @@ Description: // // - // system include files #include @@ -61,10 +60,8 @@ TrackCandidateTopBottomHitFilter::TrackCandidateTopBottomHitFilter(const edm::Pa produces(); } - TrackCandidateTopBottomHitFilter::~TrackCandidateTopBottomHitFilter() {} - // // member functions // @@ -75,22 +72,25 @@ void TrackCandidateTopBottomHitFilter::produce(edm::Event& iEvent, const edm::Ev using namespace std; Handle pIn; - iEvent.getByToken(label,pIn); + iEvent.getByToken(label, pIn); auto pOut = std::make_unique(); - for (TrackCandidateCollection::const_iterator it=pIn->begin(); it!=pIn->end();++it) { + for (TrackCandidateCollection::const_iterator it = pIn->begin(); it != pIn->end(); ++it) { PTrajectoryStateOnDet state = it->trajectoryStateOnDet(); TrackCandidate::range oldhits = it->recHits(); TrajectorySeed seed = it->seed(); TrackCandidate::RecHitContainer hits; - for (TrackCandidate::RecHitContainer::const_iterator hit=oldhits.first;hit!=oldhits.second;++hit) { + for (TrackCandidate::RecHitContainer::const_iterator hit = oldhits.first; hit != oldhits.second; ++hit) { if (hit->isValid()) { - double hitY = theBuilder->build(&*hit)->globalPosition().y(); - if (seedY*hitY>0) hits.push_back(hit->clone()); - else break; - } else hits.push_back(hit->clone()); + double hitY = theBuilder->build(&*hit)->globalPosition().y(); + if (seedY * hitY > 0) + hits.push_back(hit->clone()); + else + break; + } else + hits.push_back(hit->clone()); } - if (hits.size()>=3) { - TrackCandidate newTC(hits,seed,state); + if (hits.size() >= 3) { + TrackCandidate newTC(hits, seed, state); pOut->push_back(newTC); } } @@ -98,9 +98,8 @@ void TrackCandidateTopBottomHitFilter::produce(edm::Event& iEvent, const edm::Ev } void TrackCandidateTopBottomHitFilter::beginRun(edm::Run const& run, const edm::EventSetup& iSetup) { - iSetup.get().get(builderName,theBuilder); + iSetup.get().get(builderName, theBuilder); } - //define this as a plug-in DEFINE_FWK_MODULE(TrackCandidateTopBottomHitFilter); diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionFilterCloner.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionFilterCloner.cc index f356c455dd6f5..5c4ba4d4e00a2 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionFilterCloner.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionFilterCloner.cc @@ -1,6 +1,5 @@ #include "RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h" - #include "FWCore/Framework/interface/global/EDProducer.h" #include "FWCore/Utilities/interface/InputTag.h" @@ -22,42 +21,37 @@ using namespace reco; namespace { -class TrackCollectionFilterCloner final : public edm::global::EDProducer<> { - public: - /// constructor - explicit TrackCollectionFilterCloner(const edm::ParameterSet& iConfig); - /// destructor - ~TrackCollectionFilterCloner() override; - - /// alias for container of candidate and input tracks - using CandidateToDuplicate = std::vector>; - - using RecHitContainer = edm::OwnVector; - - using MVACollection = std::vector; - using QualityMaskCollection = std::vector; - - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - - - private: - /// produce one event - void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override; - - private: - - - TrackCollectionCloner collectionCloner; - const TrackCollectionCloner::Tokens originalTrackSource_; - - const edm::EDGetTokenT originalMVAValsToken_; - const edm::EDGetTokenT originalQualValsToken_; - - const reco::TrackBase::TrackQuality minQuality_; - -}; -} + class TrackCollectionFilterCloner final : public edm::global::EDProducer<> { + public: + /// constructor + explicit TrackCollectionFilterCloner(const edm::ParameterSet& iConfig); + /// destructor + ~TrackCollectionFilterCloner() override; + + /// alias for container of candidate and input tracks + using CandidateToDuplicate = std::vector>; + + using RecHitContainer = edm::OwnVector; + + using MVACollection = std::vector; + using QualityMaskCollection = std::vector; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + + private: + /// produce one event + void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override; + + private: + TrackCollectionCloner collectionCloner; + const TrackCollectionCloner::Tokens originalTrackSource_; + + const edm::EDGetTokenT originalMVAValsToken_; + const edm::EDGetTokenT originalQualValsToken_; + + const reco::TrackBase::TrackQuality minQuality_; + }; +} // namespace #include "TrackingTools/PatternTools/interface/Trajectory.h" #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h" @@ -67,99 +61,91 @@ class TrackCollectionFilterCloner final : public edm::global::EDProducer<> { #include "FWCore/Framework/interface/Event.h" #include "CommonTools/Statistics/interface/ChiSquaredProbability.h" -#include -#include +#include +#include #include "CommonTools/Utils/interface/DynArray.h" - namespace { -void TrackCollectionFilterCloner::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc; - desc.add("originalSource", edm::InputTag()); - desc.add("originalMVAVals", edm::InputTag()); - desc.add("originalQualVals",edm::InputTag()); - desc.add ("minQuality", "loose"); - TrackCollectionCloner::fill(desc); - descriptions.add("TrackCollectionFilterCloner", desc); -} - -TrackCollectionFilterCloner::TrackCollectionFilterCloner(const edm::ParameterSet& iConfig) : - collectionCloner(*this, iConfig, true) - , originalTrackSource_ (iConfig.getParameter("originalSource"),consumesCollector()) - , originalMVAValsToken_ (consumes (iConfig.getParameter("originalMVAVals") ) ) - , originalQualValsToken_ (consumes(iConfig.getParameter("originalQualVals")) ) - , minQuality_ (reco::TrackBase::qualityByName(iConfig.getParameter("minQuality")) ) -{ - - produces("MVAValues"); - produces("QualityMasks"); - - -} - -TrackCollectionFilterCloner::~TrackCollectionFilterCloner() -{ -} - -void TrackCollectionFilterCloner::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const -{ - - TrackCollectionCloner::Producer producer(iEvent, collectionCloner); - - // load original tracks - auto const & originalsTracks = originalTrackSource_.tracks(iEvent); - // auto const & originalIndices = originalTrackSource_.indicesInput(iEvent); - auto nTracks = originalsTracks.size(); - - edm::Handle originalMVAStore; - iEvent.getByToken(originalMVAValsToken_,originalMVAStore); - assert((*originalMVAStore).size()==nTracks); - - edm::Handle originalQualStore; - iEvent.getByToken(originalQualValsToken_,originalQualStore); - assert((*originalQualStore).size()==nTracks); - - // define minimum quality as set in the config file - unsigned char qualMask = ~0; - if (minQuality_!=reco::TrackBase::undefQuality) qualMask = 1< selId; - auto pmvas = std::make_unique(); - auto pquals = std::make_unique(); - - auto k=0U; - for (auto j=0U; jpush_back((*originalMVAStore) [j]); - pquals->push_back((*originalQualStore) [j]); - - ++k; + void TrackCollectionFilterCloner::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("originalSource", edm::InputTag()); + desc.add("originalMVAVals", edm::InputTag()); + desc.add("originalQualVals", edm::InputTag()); + desc.add("minQuality", "loose"); + TrackCollectionCloner::fill(desc); + descriptions.add("TrackCollectionFilterCloner", desc); } - // clone selected tracks... - auto nsel = k; - auto isel = 0U; - assert(producer.selTracks_->size()==isel); - producer(originalTrackSource_,selId); - assert(producer.selTracks_->size()==nsel); - - for (;iselsize()==pmvas->size() ); - assert(producer.selTracks_->size()==pquals->size()); - - iEvent.put(std::move(pmvas),"MVAValues"); - iEvent.put(std::move(pquals),"QualityMasks"); - + TrackCollectionFilterCloner::TrackCollectionFilterCloner(const edm::ParameterSet& iConfig) + : collectionCloner(*this, iConfig, true), + originalTrackSource_(iConfig.getParameter("originalSource"), consumesCollector()), + originalMVAValsToken_(consumes(iConfig.getParameter("originalMVAVals"))), + originalQualValsToken_( + consumes(iConfig.getParameter("originalQualVals"))), + minQuality_(reco::TrackBase::qualityByName(iConfig.getParameter("minQuality"))) { + produces("MVAValues"); + produces("QualityMasks"); + } -} + TrackCollectionFilterCloner::~TrackCollectionFilterCloner() {} + + void TrackCollectionFilterCloner::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + TrackCollectionCloner::Producer producer(iEvent, collectionCloner); + + // load original tracks + auto const& originalsTracks = originalTrackSource_.tracks(iEvent); + // auto const & originalIndices = originalTrackSource_.indicesInput(iEvent); + auto nTracks = originalsTracks.size(); + + edm::Handle originalMVAStore; + iEvent.getByToken(originalMVAValsToken_, originalMVAStore); + assert((*originalMVAStore).size() == nTracks); + + edm::Handle originalQualStore; + iEvent.getByToken(originalQualValsToken_, originalQualStore); + assert((*originalQualStore).size() == nTracks); + + // define minimum quality as set in the config file + unsigned char qualMask = ~0; + if (minQuality_ != reco::TrackBase::undefQuality) + qualMask = 1 << minQuality_; + + // products + std::vector selId; + auto pmvas = std::make_unique(); + auto pquals = std::make_unique(); + + auto k = 0U; + for (auto j = 0U; j < nTracks; ++j) { + if (!(qualMask & (*originalQualStore)[j])) + continue; + + selId.push_back(j); + pmvas->push_back((*originalMVAStore)[j]); + pquals->push_back((*originalQualStore)[j]); + + ++k; + } + + // clone selected tracks... + auto nsel = k; + auto isel = 0U; + assert(producer.selTracks_->size() == isel); + producer(originalTrackSource_, selId); + assert(producer.selTracks_->size() == nsel); + + for (; isel < nsel; ++isel) { + auto& otk = (*producer.selTracks_)[isel]; + otk.setQualityMask((*pquals)[isel]); + } + assert(producer.selTracks_->size() == pmvas->size()); + assert(producer.selTracks_->size() == pquals->size()); + + iEvent.put(std::move(pmvas), "MVAValues"); + iEvent.put(std::move(pquals), "QualityMasks"); + } -} +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionMerger.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionMerger.cc index 9b074d4ad1fea..b77db0f54d9f5 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionMerger.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackCollectionMerger.cc @@ -1,6 +1,5 @@ #include "RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h" - #include "FWCore/Framework/interface/Frameworkfwd.h" #include "FWCore/Framework/interface/global/EDProducer.h" @@ -22,69 +21,64 @@ #include "RecoTracker/FinalTrackSelectors/interface/TrackAlgoPriorityOrder.h" #include "RecoTracker/Record/interface/CkfComponentsRecord.h" -#include -#include -#include +#include +#include +#include namespace { class TrackCollectionMerger final : public edm::global::EDProducer<> { - public: - explicit TrackCollectionMerger(const edm::ParameterSet& conf) : - collectionCloner(*this, conf, true), - priorityName_(conf.getParameter("trackAlgoPriorityOrder")), - m_foundHitBonus(conf.getParameter("foundHitBonus")), - m_lostHitPenalty(conf.getParameter("lostHitPenalty")), - m_shareFrac(conf.getParameter("shareFrac")), - m_minShareHits(conf.getParameter("minShareHits")), - m_minQuality(reco::TrackBase::qualityByName(conf.getParameter("minQuality"))), - m_allowFirstHitShare(conf.getParameter("allowFirstHitShare")), - m_enableMerging(conf.getParameter("enableMerging")) -{ - for (auto const & it : conf.getParameter >("trackProducers") ) - srcColls.emplace_back(it,consumesCollector()); - for (auto const & it : conf.getParameter >("inputClassifiers")) { - srcMVAs.push_back(consumes(edm::InputTag(it,"MVAValues"))); - srcQuals.push_back(consumes(edm::InputTag(it,"QualityMasks"))); + public: + explicit TrackCollectionMerger(const edm::ParameterSet& conf) + : collectionCloner(*this, conf, true), + priorityName_(conf.getParameter("trackAlgoPriorityOrder")), + m_foundHitBonus(conf.getParameter("foundHitBonus")), + m_lostHitPenalty(conf.getParameter("lostHitPenalty")), + m_shareFrac(conf.getParameter("shareFrac")), + m_minShareHits(conf.getParameter("minShareHits")), + m_minQuality(reco::TrackBase::qualityByName(conf.getParameter("minQuality"))), + m_allowFirstHitShare(conf.getParameter("allowFirstHitShare")), + m_enableMerging(conf.getParameter("enableMerging")) { + for (auto const& it : conf.getParameter>("trackProducers")) + srcColls.emplace_back(it, consumesCollector()); + for (auto const& it : conf.getParameter>("inputClassifiers")) { + srcMVAs.push_back(consumes(edm::InputTag(it, "MVAValues"))); + srcQuals.push_back(consumes(edm::InputTag(it, "QualityMasks"))); } - assert(srcColls.size()==srcQuals.size()); - + assert(srcColls.size() == srcQuals.size()); produces("MVAValues"); produces("QualityMasks"); - } - + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add >("trackProducers",std::vector()); - desc.add >("inputClassifiers",std::vector()); + desc.add>("trackProducers", std::vector()); + desc.add>("inputClassifiers", std::vector()); desc.add("trackAlgoPriorityOrder", "trackAlgoPriorityOrder"); - desc.add("shareFrac",.19); - desc.add("foundHitBonus",10.); - desc.add("lostHitPenalty",5.); - desc.add("minShareHits",2); - desc.add("allowFirstHitShare",true); - desc.add("enableMerging",true); - desc.add("minQuality","loose"); + desc.add("shareFrac", .19); + desc.add("foundHitBonus", 10.); + desc.add("lostHitPenalty", 5.); + desc.add("minShareHits", 2); + desc.add("allowFirstHitShare", true); + desc.add("enableMerging", true); + desc.add("minQuality", "loose"); TrackCollectionCloner::fill(desc); descriptions.add("TrackCollectionMerger", desc); } - private: - - + private: TrackCollectionCloner collectionCloner; std::vector srcColls; using MVACollection = std::vector; using QualityMaskCollection = std::vector; - - using IHit = std::pair; + + using IHit = std::pair; using IHitV = std::vector; - + std::vector> srcMVAs; std::vector> srcQuals; - + std::string priorityName_; float m_foundHitBonus; @@ -92,259 +86,263 @@ namespace { float m_shareFrac; unsigned int m_minShareHits; reco::TrackBase::TrackQuality m_minQuality; - bool m_allowFirstHitShare; - bool m_enableMerging; - + bool m_allowFirstHitShare; + bool m_enableMerging; + void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override; - bool areDuplicate(IHitV const& rh1, IHitV const& rh2) const; - - }; -} - -#include "CommonTools/Utils/interface/DynArray.h" +} // namespace +#include "CommonTools/Utils/interface/DynArray.h" namespace { - - void TrackCollectionMerger::produce(edm::StreamID, edm::Event& evt, const edm::EventSetup& es) const { + void TrackCollectionMerger::produce(edm::StreamID, edm::Event& evt, const edm::EventSetup& es) const { TrackCollectionCloner::Producer producer(evt, collectionCloner); edm::ESHandle priorityH; es.get().get(priorityName_, priorityH); - auto const & trackAlgoPriorityOrder = *priorityH; + auto const& trackAlgoPriorityOrder = *priorityH; // load collections auto collsSize = srcColls.size(); - auto rSize=0U; - declareDynArray(reco::TrackCollection const *, collsSize, trackColls); - for (auto i=0U; i< collsSize; ++i) { + auto rSize = 0U; + declareDynArray(reco::TrackCollection const*, collsSize, trackColls); + for (auto i = 0U; i < collsSize; ++i) { trackColls[i] = &srcColls[i].tracks(evt); rSize += (*trackColls[i]).size(); } - unsigned char qualMask = ~0; - const bool acceptAll = m_minQuality==reco::TrackBase::undefQuality; - if (!acceptAll) qualMask = 1< hmva; evt.getByToken(srcMVAs[i], hmva); - assert((*hmva).size()==size); + assert((*hmva).size() == size); edm::Handle hqual; evt.getByToken(srcQuals[i], hqual); - for (auto j=0U; j selected(ntotTk,true); + auto ntotTk = k; + std::vector selected(ntotTk, true); declareDynArray(reco::TrackBase::TrackAlgorithm, ntotTk, algo); declareDynArray(reco::TrackBase::TrackAlgorithm, ntotTk, oriAlgo); - declareDynArray(reco::TrackBase::AlgoMask, ntotTk, algoMask); - + declareDynArray(reco::TrackBase::AlgoMask, ntotTk, algoMask); // merge (if more than one collection...) - auto merger = [&]()->void { - + auto merger = [&]() -> void { // load momentum, hits and score - declareDynArray(reco::TrackBase::Vector,ntotTk,mom); - declareDynArray(float,ntotTk,score); + declareDynArray(reco::TrackBase::Vector, ntotTk, mom); + declareDynArray(float, ntotTk, score); declareDynArray(IHitV, ntotTk, rh1); - - k=0U; - for (auto i=0U; i< collsSize; ++i) { - auto const & tkColl = *trackColls[i]; - for (auto j=0U; j< nGoods[i]; ++j) { - auto const & track = tkColl[tkInds[k]]; - algo[k] = track.algo(); - oriAlgo[k] = track.originalAlgo(); - algoMask[k] = track.algoMask(); - mom[k]= track.isLooper() ? reco::TrackBase::Vector() : track.momentum(); - auto validHits=track.numberOfValidHits(); - auto validPixelHits=track.hitPattern().numberOfValidPixelHits(); - auto lostHits=track.numberOfLostHits(); - score[k] = m_foundHitBonus*validPixelHits+m_foundHitBonus*validHits - m_lostHitPenalty*lostHits - track.chi2(); - - auto & rhv = rh1[k]; - rhv.reserve(validHits) ; - auto compById = [](IHit const & h1, IHit const & h2) {return h1.first < h2.first;}; - for (auto it = track.recHitsBegin(); it != track.recHitsEnd(); ++it) { - auto const & hit = *(*it); - auto id = hit.rawId() ; - if LIKELY(hit.isValid()) { rhv.emplace_back(id,&hit); std::push_heap(rhv.begin(),rhv.end(),compById); } - } - std::sort_heap(rhv.begin(),rhv.end(),compById); - - - ++k; - } + + k = 0U; + for (auto i = 0U; i < collsSize; ++i) { + auto const& tkColl = *trackColls[i]; + for (auto j = 0U; j < nGoods[i]; ++j) { + auto const& track = tkColl[tkInds[k]]; + algo[k] = track.algo(); + oriAlgo[k] = track.originalAlgo(); + algoMask[k] = track.algoMask(); + mom[k] = track.isLooper() ? reco::TrackBase::Vector() : track.momentum(); + auto validHits = track.numberOfValidHits(); + auto validPixelHits = track.hitPattern().numberOfValidPixelHits(); + auto lostHits = track.numberOfLostHits(); + score[k] = m_foundHitBonus * validPixelHits + m_foundHitBonus * validHits - m_lostHitPenalty * lostHits - + track.chi2(); + + auto& rhv = rh1[k]; + rhv.reserve(validHits); + auto compById = [](IHit const& h1, IHit const& h2) { return h1.first < h2.first; }; + for (auto it = track.recHitsBegin(); it != track.recHitsEnd(); ++it) { + auto const& hit = *(*it); + auto id = hit.rawId(); + if + LIKELY(hit.isValid()) { + rhv.emplace_back(id, &hit); + std::push_heap(rhv.begin(), rhv.end(), compById); + } + } + std::sort_heap(rhv.begin(), rhv.end(), compById); + + ++k; + } } - assert(ntotTk==k); - + assert(ntotTk == k); + auto seti = [&](unsigned int ii, unsigned int jj) { - selected[jj]=false; - selected[ii]=true; - if (trackAlgoPriorityOrder.priority(oriAlgo[jj]) < trackAlgoPriorityOrder.priority(oriAlgo[ii])) oriAlgo[ii] = oriAlgo[jj]; - algoMask[ii] |= algoMask[jj]; - quals[ii] |= (1< almostSame) { + seti(t1, t2); + } else if (score2 - score1 > almostSame) { + seti(t2, t1); + } else { // take best + constexpr unsigned int qmask = + (1 << reco::TrackBase::loose | 1 << reco::TrackBase::tight | 1 << reco::TrackBase::highPurity); + if ((quals[t1] & qmask) == (quals[t2] & qmask)) { + // take first + if (trackAlgoPriorityOrder.priority(algo[t1]) <= trackAlgoPriorityOrder.priority(algo[t2])) { + seti(t1, t2); + } else { + seti(t2, t1); + } + } else if ((quals[t1] & qmask) > (quals[t2] & qmask)) + seti(t1, t2); + else + seti(t2, t1); + } // end ifs... + + } // end t2 + } // end t1 + } // end colls + }; // end merger; + + const bool doMerging = m_enableMerging && collsSize > 1; + if (doMerging) + merger(); - - auto iStart2=0U; - for (auto i=0U; i almostSame ) { - seti(t1,t2); - } else if ( score2 - score1 > almostSame ) { - seti(t2,t1); - } else { // take best - constexpr unsigned int qmask = (1< (quals[t2]&qmask) ) - seti(t1,t2); - else - seti(t2,t1); - } // end ifs... - - } // end t2 - } // end t1 - } // end colls - }; // end merger; - - - const bool doMerging = m_enableMerging && collsSize>1; - if (doMerging) merger(); - // products auto pmvas = std::make_unique(); auto pquals = std::make_unique(); - + // clone selected tracks... - auto nsel=0U; - auto iStart2=0U; - auto isel=0U; - for (auto i=0U; i selId; - std::vector tid; - auto iStart1=iStart2; - iStart2=iStart1+nGoods[i]; - assert(producer.selTracks_->size()==isel); - for (auto t1=iStart1; t1push_back(mvas[t1]); - pquals->push_back(quals[t1]); + std::vector tid; + auto iStart1 = iStart2; + iStart2 = iStart1 + nGoods[i]; + assert(producer.selTracks_->size() == isel); + for (auto t1 = iStart1; t1 < iStart2; ++t1) { + if (!selected[t1]) + continue; + ++nsel; + tid.push_back(t1); + selId.push_back(tkInds[t1]); + pmvas->push_back(mvas[t1]); + pquals->push_back(quals[t1]); } - producer(srcColls[i],selId); - assert(producer.selTracks_->size()==nsel); - assert(tid.size()==nsel-isel); - auto k=0U; - for (;iselsize() == nsel); + assert(tid.size() == nsel - isel); + auto k = 0U; + for (; isel < nsel; ++isel) { + auto& otk = (*producer.selTracks_)[isel]; + otk.setQualityMask((*pquals)[isel]); // needed also without merging + if (doMerging) { otk.setOriginalAlgorithm(oriAlgo[tid[k]]); otk.setAlgoMask(algoMask[tid[k++]]); } } - if(doMerging) assert(tid.size()==k); + if (doMerging) + assert(tid.size() == k); } - assert(producer.selTracks_->size()==pmvas->size()); + assert(producer.selTracks_->size() == pmvas->size()); // std::cout << "TrackCollectionMerger: sel tracks " << producer.selTracks_->size() << std::endl; - evt.put(std::move(pmvas),"MVAValues"); - evt.put(std::move(pquals),"QualityMasks"); - - + evt.put(std::move(pmvas), "MVAValues"); + evt.put(std::move(pquals), "QualityMasks"); } - - bool TrackCollectionMerger::areDuplicate(IHitV const& rh1, IHitV const& rh2) const { - auto nh1=rh1.size(); - auto nh2=rh2.size(); + auto nh1 = rh1.size(); + auto nh2 = rh2.size(); - auto share = - [](const TrackingRecHit* it,const TrackingRecHit* jt)->bool { return it->sharesInput(jt,TrackingRecHit::some); }; + auto share = [](const TrackingRecHit* it, const TrackingRecHit* jt) -> bool { + return it->sharesInput(jt, TrackingRecHit::some); + }; //loop over rechits - int noverlap=0; - int firstoverlap=0; + int noverlap = 0; + int firstoverlap = 0; // check first hit (should use REAL first hit?) - if (m_allowFirstHitShare && rh1[0].first==rh2[0].first ) { - if (share( rh1[0].second, rh2[0].second)) firstoverlap=1; + if (m_allowFirstHitShare && rh1[0].first == rh2[0].first) { + if (share(rh1[0].second, rh2[0].second)) + firstoverlap = 1; } // exploit sorting - unsigned int jh=0; - unsigned int ih=0; - while (ih!=nh1 && jh!=nh2) { + unsigned int jh = 0; + unsigned int ih = 0; + while (ih != nh1 && jh != nh2) { auto const id1 = rh1[ih].first; auto const id2 = rh2[jh].first; - if (id1= int(m_minShareHits) && - (noverlap-firstoverlap) > (std::min(nh1,nh2)-firstoverlap)*m_shareFrac; - + if (share(rh1[ih].second, rh2[jh].second)) + noverlap++; + ++jh; + ++ih; + } // equal ids + } //loop over ih & jh + + return noverlap >= int(m_minShareHits) && + (noverlap - firstoverlap) > (std::min(nh1, nh2) - firstoverlap) * m_shareFrac; } - -} - +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackCutClassifier.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackCutClassifier.cc index 8b5093afacd7b..89aa16d1b0c45 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackCutClassifier.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackCutClassifier.cc @@ -1,6 +1,5 @@ #include "RecoTracker/FinalTrackSelectors/interface/TrackMVAClassifier.h" - #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h" @@ -10,339 +9,394 @@ #include "getBestVertex.h" #include "powN.h" - namespace { - void fillArrayF(float * x,const edm::ParameterSet & cfg, const char * name) { - auto v = cfg.getParameter< std::vector >(name); - assert(v.size()==3); - std::copy(std::begin(v),std::end(v),x); + void fillArrayF(float* x, const edm::ParameterSet& cfg, const char* name) { + auto v = cfg.getParameter>(name); + assert(v.size() == 3); + std::copy(std::begin(v), std::end(v), x); } - - void fillArrayI(int * x,const edm::ParameterSet & cfg, const char * name) { - auto v = cfg.getParameter< std::vector >(name); - assert(v.size()==3); - std::copy(std::begin(v),std::end(v),x); + + void fillArrayI(int* x, const edm::ParameterSet& cfg, const char* name) { + auto v = cfg.getParameter>(name); + assert(v.size() == 3); + std::copy(std::begin(v), std::end(v), x); } // fake mva value to return for loose,tight,hp - constexpr float mvaVal[3] = {-.5,.5,1.}; + constexpr float mvaVal[3] = {-.5, .5, 1.}; - template - inline float cut(T val, const T * cuts, Comp comp) { - for (int i=2; i>=0; --i) { - if ( comp(val,cuts[i]) ) return mvaVal[i]; + template + inline float cut(T val, const T* cuts, Comp comp) { + for (int i = 2; i >= 0; --i) { + if (comp(val, cuts[i])) + return mvaVal[i]; } - return -1.f; + return -1.f; } - - inline float chi2n(reco::Track const & tk) { return tk.normalizedChi2();} - inline float relPtErr(reco::Track const & tk) { - return (tk.pt() != 0. ? float(tk.ptError())/float(tk.pt()) : 9999999.); + inline float chi2n(reco::Track const& tk) { return tk.normalizedChi2(); } + + inline float relPtErr(reco::Track const& tk) { + return (tk.pt() != 0. ? float(tk.ptError()) / float(tk.pt()) : 9999999.); } - inline int lostLayers(reco::Track const & tk) { + inline int lostLayers(reco::Track const& tk) { return tk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); } - - inline int n3DLayers(reco::Track const & tk, bool isHLT) { - uint32_t nlayers3D = tk.hitPattern().pixelLayersWithMeasurement(); + + inline int n3DLayers(reco::Track const& tk, bool isHLT) { + uint32_t nlayers3D = tk.hitPattern().pixelLayersWithMeasurement(); if (!isHLT) nlayers3D += tk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); else { size_t count3D = 0; - for ( auto it = tk.recHitsBegin(), et = tk.recHitsEnd(); it!=et; ++it) { - const TrackingRecHit* hit = (*it); - if (!trackerHitRTTI::isFromDetOrFast(*hit) ) continue; - - if ( hit->dimension()==2 ) { - auto const & thit = static_cast(*hit); - if (thit.isMatched()) count3D++; - } + for (auto it = tk.recHitsBegin(), et = tk.recHitsEnd(); it != et; ++it) { + const TrackingRecHit* hit = (*it); + if (!trackerHitRTTI::isFromDetOrFast(*hit)) + continue; + + if (hit->dimension() == 2) { + auto const& thit = static_cast(*hit); + if (thit.isMatched()) + count3D++; + } } nlayers3D += count3D; } return nlayers3D; } - - inline int nHits(reco::Track const & tk) { - return tk.numberOfValidHits(); - } - - inline int nPixelHits(reco::Track const & tk) { - return tk.hitPattern().numberOfValidPixelHits(); - } - - inline float dz(reco::Track const & trk, Point const & bestVertex) { - return std::abs(trk.dz(bestVertex)); - } - inline float dr(reco::Track const & trk, Point const & bestVertex) { - return std::abs(trk.dxy(bestVertex)); - } - inline void dzCut_par1(reco::Track const & trk, int & nLayers, const float * par, const int * exp, float dzCut[]) { - float dzE = trk.dzError(); - for (int i=2; i>=0; --i) { - dzCut[i] = powN(par[i]*nLayers,exp[i])*dzE; + inline int nHits(reco::Track const& tk) { return tk.numberOfValidHits(); } + + inline int nPixelHits(reco::Track const& tk) { return tk.hitPattern().numberOfValidPixelHits(); } + + inline float dz(reco::Track const& trk, Point const& bestVertex) { return std::abs(trk.dz(bestVertex)); } + inline float dr(reco::Track const& trk, Point const& bestVertex) { return std::abs(trk.dxy(bestVertex)); } + + inline void dzCut_par1(reco::Track const& trk, int& nLayers, const float* par, const int* exp, float dzCut[]) { + float dzE = trk.dzError(); + for (int i = 2; i >= 0; --i) { + dzCut[i] = powN(par[i] * nLayers, exp[i]) * dzE; } } - inline void drCut_par1(reco::Track const & trk, int & nLayers, const float * par, const int * exp, float drCut[]) { - float drE = trk.d0Error(); - for (int i=2; i>=0; --i) { - drCut[i] = powN(par[i]*nLayers,exp[i])*drE; + inline void drCut_par1(reco::Track const& trk, int& nLayers, const float* par, const int* exp, float drCut[]) { + float drE = trk.d0Error(); + for (int i = 2; i >= 0; --i) { + drCut[i] = powN(par[i] * nLayers, exp[i]) * drE; } } - - inline void dzCut_par2(reco::Track const & trk, int & nLayers, const float * par, const int * exp, const float * d0err, const float * d0err_par, float dzCut[]) { + + inline void dzCut_par2(reco::Track const& trk, + int& nLayers, + const float* par, + const int* exp, + const float* d0err, + const float* d0err_par, + float dzCut[]) { float pt = float(trk.pt()); - float p = float(trk.p()); + float p = float(trk.p()); - for (int i=2; i>=0; --i) { + for (int i = 2; i >= 0; --i) { // parametrized d0 resolution for the track pt - float nomd0E = sqrt(d0err[i]*d0err[i]+(d0err_par[i]/pt)*(d0err_par[i]/pt)); + float nomd0E = sqrt(d0err[i] * d0err[i] + (d0err_par[i] / pt) * (d0err_par[i] / pt)); // parametrized z0 resolution for the track pt and eta - float nomdzE = nomd0E*(p/pt); // cosh(eta):=abs(p)/pt - - dzCut[i] = powN(par[i]*nLayers,exp[i])*nomdzE; + float nomdzE = nomd0E * (p / pt); // cosh(eta):=abs(p)/pt + + dzCut[i] = powN(par[i] * nLayers, exp[i]) * nomdzE; } } - inline void drCut_par2(reco::Track const & trk, int & nLayers, const float* par, const int * exp, const float * d0err, const float * d0err_par, float drCut[]) { + inline void drCut_par2(reco::Track const& trk, + int& nLayers, + const float* par, + const int* exp, + const float* d0err, + const float* d0err_par, + float drCut[]) { float pt = trk.pt(); - for (int i=2; i>=0; --i) { + for (int i = 2; i >= 0; --i) { // parametrized d0 resolution for the track pt - float nomd0E = sqrt(d0err[i]*d0err[i]+(d0err_par[i]/pt)*(d0err_par[i]/pt)); + float nomd0E = sqrt(d0err[i] * d0err[i] + (d0err_par[i] / pt) * (d0err_par[i] / pt)); - drCut[i] = powN(par[i]*nLayers,exp[i])*nomd0E; + drCut[i] = powN(par[i] * nLayers, exp[i]) * nomd0E; } } - - inline void dzCut_wPVerror_par(reco::Track const & trk, int & nLayers, const float * par, const int * exp, Point const & bestVertexError, float dzCut[]) { + + inline void dzCut_wPVerror_par(reco::Track const& trk, + int& nLayers, + const float* par, + const int* exp, + Point const& bestVertexError, + float dzCut[]) { float dzE = trk.dzError(); float zPVerr = bestVertexError.z(); - float dzErrPV = std::sqrt(dzE*dzE+zPVerr*zPVerr); - for (int i=2; i>=0; --i) { - dzCut[i] = par[i]*dzErrPV; + float dzErrPV = std::sqrt(dzE * dzE + zPVerr * zPVerr); + for (int i = 2; i >= 0; --i) { + dzCut[i] = par[i] * dzErrPV; if (exp[i] != 0) - dzCut[i] *= pow(nLayers,exp[i]); + dzCut[i] *= pow(nLayers, exp[i]); } } - inline void drCut_wPVerror_par(reco::Track const & trk, int & nLayers, const float* par, const int * exp, Point const & bestVertexError, float drCut[]) { + inline void drCut_wPVerror_par(reco::Track const& trk, + int& nLayers, + const float* par, + const int* exp, + Point const& bestVertexError, + float drCut[]) { float drE = trk.d0Error(); - float rPVerr = sqrt(bestVertexError.x()*bestVertexError.y()); // shouldn't it be bestVertex.xError()*bestVertex.xError()+bestVertex.yError()*bestVertex.yError() ?!?!? - - float drErrPV = std::sqrt(drE*drE+rPVerr*rPVerr); - for (int i=2; i>=0; --i) { - drCut[i] = par[i]*drErrPV; + float rPVerr = sqrt( + bestVertexError.x() * + bestVertexError + .y()); // shouldn't it be bestVertex.xError()*bestVertex.xError()+bestVertex.yError()*bestVertex.yError() ?!?!? + + float drErrPV = std::sqrt(drE * drE + rPVerr * rPVerr); + for (int i = 2; i >= 0; --i) { + drCut[i] = par[i] * drErrPV; if (exp[i] != 0) - drCut[i] *= pow(nLayers,exp[i]); + drCut[i] *= pow(nLayers, exp[i]); } - } - + struct Cuts { - - Cuts(const edm::ParameterSet & cfg) { + Cuts(const edm::ParameterSet& cfg) { isHLT = cfg.getParameter("isHLT"); - fillArrayF(minNdof, cfg,"minNdof"); - fillArrayF(maxChi2, cfg,"maxChi2"); - fillArrayF(maxChi2n, cfg,"maxChi2n"); - fillArrayI(minHits4pass, cfg,"minHits4pass"); - fillArrayI(minHits, cfg,"minHits"); - fillArrayI(minPixelHits, cfg,"minPixelHits"); - fillArrayI(min3DLayers, cfg,"min3DLayers"); - fillArrayI(minLayers, cfg,"minLayers"); - fillArrayI(maxLostLayers,cfg,"maxLostLayers"); - fillArrayF(maxRelPtErr, cfg,"maxRelPtErr"); + fillArrayF(minNdof, cfg, "minNdof"); + fillArrayF(maxChi2, cfg, "maxChi2"); + fillArrayF(maxChi2n, cfg, "maxChi2n"); + fillArrayI(minHits4pass, cfg, "minHits4pass"); + fillArrayI(minHits, cfg, "minHits"); + fillArrayI(minPixelHits, cfg, "minPixelHits"); + fillArrayI(min3DLayers, cfg, "min3DLayers"); + fillArrayI(minLayers, cfg, "minLayers"); + fillArrayI(maxLostLayers, cfg, "maxLostLayers"); + fillArrayF(maxRelPtErr, cfg, "maxRelPtErr"); minNVtxTrk = cfg.getParameter("minNVtxTrk"); - fillArrayF(maxDz, cfg,"maxDz"); - fillArrayF(maxDzWrtBS, cfg,"maxDzWrtBS"); - fillArrayF(maxDr, cfg,"maxDr"); + fillArrayF(maxDz, cfg, "maxDz"); + fillArrayF(maxDzWrtBS, cfg, "maxDzWrtBS"); + fillArrayF(maxDr, cfg, "maxDr"); edm::ParameterSet dz_par = cfg.getParameter("dz_par"); - fillArrayI(dz_exp, dz_par,"dz_exp"); - fillArrayF(dz_par1, dz_par,"dz_par1"); - fillArrayF(dz_par2, dz_par,"dz_par2"); - fillArrayF(dzWPVerr_par, dz_par,"dzWPVerr_par"); + fillArrayI(dz_exp, dz_par, "dz_exp"); + fillArrayF(dz_par1, dz_par, "dz_par1"); + fillArrayF(dz_par2, dz_par, "dz_par2"); + fillArrayF(dzWPVerr_par, dz_par, "dzWPVerr_par"); edm::ParameterSet dr_par = cfg.getParameter("dr_par"); - fillArrayI(dr_exp, dr_par,"dr_exp"); - fillArrayF(dr_par1, dr_par,"dr_par1"); - fillArrayF(dr_par2, dr_par,"dr_par2"); - fillArrayF(d0err, dr_par,"d0err"); - fillArrayF(d0err_par, dr_par,"d0err_par"); - fillArrayF(drWPVerr_par, dr_par,"drWPVerr_par"); + fillArrayI(dr_exp, dr_par, "dr_exp"); + fillArrayF(dr_par1, dr_par, "dr_par1"); + fillArrayF(dr_par2, dr_par, "dr_par2"); + fillArrayF(d0err, dr_par, "d0err"); + fillArrayF(d0err_par, dr_par, "d0err_par"); + fillArrayF(drWPVerr_par, dr_par, "drWPVerr_par"); } - + void beginStream() {} void initEvent(const edm::EventSetup&) {} - - float operator()(reco::Track const & trk, - reco::BeamSpot const & beamSpot, - reco::VertexCollection const & vertices) const { - + + float operator()(reco::Track const& trk, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices) const { float ret = 1.f; // minimum number of hits for by-passing the other checks - if ( minHits4pass[0] < std::numeric_limits::max() ) { - ret = std::min(ret,cut(nHits(trk),minHits4pass,std::greater_equal())); - if (ret==1.f) return ret; + if (minHits4pass[0] < std::numeric_limits::max()) { + ret = std::min(ret, cut(nHits(trk), minHits4pass, std::greater_equal())); + if (ret == 1.f) + return ret; } - if ( maxRelPtErr[2] < std::numeric_limits::max() ) { - ret = std::min(ret,cut(relPtErr(trk),maxRelPtErr,std::less_equal()) ); - if (ret==-1.f) return ret; + if (maxRelPtErr[2] < std::numeric_limits::max()) { + ret = std::min(ret, cut(relPtErr(trk), maxRelPtErr, std::less_equal())); + if (ret == -1.f) + return ret; } - ret = std::min(ret,cut(float(trk.ndof()),minNdof,std::greater_equal()) ); - if (ret==-1.f) return ret; + ret = std::min(ret, cut(float(trk.ndof()), minNdof, std::greater_equal())); + if (ret == -1.f) + return ret; - auto nLayers = trk.hitPattern().trackerLayersWithMeasurement(); - ret = std::min(ret,cut(nLayers,minLayers,std::greater_equal())); - if (ret==-1.f) return ret; + auto nLayers = trk.hitPattern().trackerLayersWithMeasurement(); + ret = std::min(ret, cut(nLayers, minLayers, std::greater_equal())); + if (ret == -1.f) + return ret; - ret = std::min(ret,cut(chi2n(trk)/float(nLayers),maxChi2n,std::less_equal())); - if (ret==-1.f) return ret; + ret = std::min(ret, cut(chi2n(trk) / float(nLayers), maxChi2n, std::less_equal())); + if (ret == -1.f) + return ret; - ret = std::min(ret,cut(chi2n(trk),maxChi2,std::less_equal())); - if (ret==-1.f) return ret; - - ret = std::min(ret,cut(n3DLayers(trk,isHLT),min3DLayers,std::greater_equal())); - if (ret==-1.f) return ret; + ret = std::min(ret, cut(chi2n(trk), maxChi2, std::less_equal())); + if (ret == -1.f) + return ret; - ret = std::min(ret,cut(nHits(trk),minHits,std::greater_equal())); - if (ret==-1.f) return ret; + ret = std::min(ret, cut(n3DLayers(trk, isHLT), min3DLayers, std::greater_equal())); + if (ret == -1.f) + return ret; - ret = std::min(ret,cut(nPixelHits(trk),minPixelHits,std::greater_equal())); - if (ret==-1.f) return ret; + ret = std::min(ret, cut(nHits(trk), minHits, std::greater_equal())); + if (ret == -1.f) + return ret; - ret = std::min(ret,cut(lostLayers(trk),maxLostLayers,std::less_equal())); - if (ret==-1.f) return ret; - - // original dz and dr cut - if (maxDz[2]::max() || maxDr[2]::max()) { - - // if not primaryVertices are reconstructed, check compatibility w.r.t. beam spot - Point bestVertex = getBestVertex(trk,vertices,minNVtxTrk); // min number of tracks [2 (=default) for offline, 3 for HLT] - float maxDzcut[3]; - std::copy(std::begin(maxDz),std::end(maxDz),std::begin(maxDzcut)); - if (bestVertex.z() < -99998.) { - bestVertex = beamSpot.position(); - std::copy(std::begin(maxDzWrtBS),std::end(maxDzWrtBS),std::begin(maxDzcut)); - } - ret = std::min(ret,cut(dr(trk,bestVertex), maxDr,std::less())); - if (ret==-1.f) return ret; - - ret = std::min(ret,cut(dz(trk,bestVertex), maxDzcut,std::less())); - if (ret==-1.f) return ret; + ret = std::min(ret, cut(nPixelHits(trk), minPixelHits, std::greater_equal())); + if (ret == -1.f) + return ret; - } + ret = std::min(ret, cut(lostLayers(trk), maxLostLayers, std::less_equal())); + if (ret == -1.f) + return ret; + // original dz and dr cut + if (maxDz[2] < std::numeric_limits::max() || maxDr[2] < std::numeric_limits::max()) { + // if not primaryVertices are reconstructed, check compatibility w.r.t. beam spot + Point bestVertex = + getBestVertex(trk, vertices, minNVtxTrk); // min number of tracks [2 (=default) for offline, 3 for HLT] + float maxDzcut[3]; + std::copy(std::begin(maxDz), std::end(maxDz), std::begin(maxDzcut)); + if (bestVertex.z() < -99998.) { + bestVertex = beamSpot.position(); + std::copy(std::begin(maxDzWrtBS), std::end(maxDzWrtBS), std::begin(maxDzcut)); + } + ret = std::min(ret, cut(dr(trk, bestVertex), maxDr, std::less())); + if (ret == -1.f) + return ret; + + ret = std::min(ret, cut(dz(trk, bestVertex), maxDzcut, std::less())); + if (ret == -1.f) + return ret; + } // parametrized dz and dr cut by using PV error - if (dzWPVerr_par[2]::max() || drWPVerr_par[2]::max()) { - - Point bestVertexError(-1.,-1.,-1.); - Point bestVertex = getBestVertex_withError(trk,vertices,bestVertexError,minNVtxTrk); // min number of tracks [2 (=default) for offline, 3 for HLT] - - float maxDz_par[3]; - float maxDr_par[3]; - dzCut_wPVerror_par(trk,nLayers,dzWPVerr_par,dz_exp,bestVertexError, maxDz_par); - drCut_wPVerror_par(trk,nLayers,drWPVerr_par,dr_exp,bestVertexError, maxDr_par); - - ret = std::min(ret,cut(dr(trk,bestVertex), maxDr_par,std::less())); - if (ret==-1.f) return ret; - - ret = std::min(ret,cut(dz(trk,bestVertex), maxDr_par,std::less())); - if (ret==-1.f) return ret; - + if (dzWPVerr_par[2] < std::numeric_limits::max() || drWPVerr_par[2] < std::numeric_limits::max()) { + Point bestVertexError(-1., -1., -1.); + Point bestVertex = getBestVertex_withError( + trk, vertices, bestVertexError, minNVtxTrk); // min number of tracks [2 (=default) for offline, 3 for HLT] + + float maxDz_par[3]; + float maxDr_par[3]; + dzCut_wPVerror_par(trk, nLayers, dzWPVerr_par, dz_exp, bestVertexError, maxDz_par); + drCut_wPVerror_par(trk, nLayers, drWPVerr_par, dr_exp, bestVertexError, maxDr_par); + + ret = std::min(ret, cut(dr(trk, bestVertex), maxDr_par, std::less())); + if (ret == -1.f) + return ret; + + ret = std::min(ret, cut(dz(trk, bestVertex), maxDr_par, std::less())); + if (ret == -1.f) + return ret; } // parametrized dz and dr cut by using their error - if (dz_par1[2]::max() || dr_par1[2]::max()) { - - float maxDz_par1[3]; - float maxDr_par1[3]; - dzCut_par1(trk,nLayers,dz_par1,dz_exp, maxDz_par1); - drCut_par1(trk,nLayers,dr_par1,dr_exp, maxDr_par1); - - float maxDz_par[3]; - float maxDr_par[3]; - std::copy(std::begin(maxDz_par1),std::end(maxDz_par1),std::begin(maxDz_par)); - std::copy(std::begin(maxDr_par1),std::end(maxDr_par1),std::begin(maxDr_par)); - - // parametrized dz and dr cut by using d0 and z0 resolution - if (dz_par2[2]::max() || dr_par2[2]::max()) { - - float maxDz_par2[3]; - float maxDr_par2[3]; - dzCut_par2(trk,nLayers,dz_par2,dz_exp,d0err,d0err_par, maxDz_par2); - drCut_par2(trk,nLayers,dr_par2,dr_exp,d0err,d0err_par, maxDr_par2); - - - for (int i=2; i>=0; --i) { - if (maxDr_par2[i]())); - if (ret==-1.f) return ret; - ret = std::min(ret,cut(dr(trk,bestVertex), maxDr_par,std::less())); - if (ret==-1.f) return ret; - - + if (dz_par1[2] < std::numeric_limits::max() || dr_par1[2] < std::numeric_limits::max()) { + float maxDz_par1[3]; + float maxDr_par1[3]; + dzCut_par1(trk, nLayers, dz_par1, dz_exp, maxDz_par1); + drCut_par1(trk, nLayers, dr_par1, dr_exp, maxDr_par1); + + float maxDz_par[3]; + float maxDr_par[3]; + std::copy(std::begin(maxDz_par1), std::end(maxDz_par1), std::begin(maxDz_par)); + std::copy(std::begin(maxDr_par1), std::end(maxDr_par1), std::begin(maxDr_par)); + + // parametrized dz and dr cut by using d0 and z0 resolution + if (dz_par2[2] < std::numeric_limits::max() || dr_par2[2] < std::numeric_limits::max()) { + float maxDz_par2[3]; + float maxDr_par2[3]; + dzCut_par2(trk, nLayers, dz_par2, dz_exp, d0err, d0err_par, maxDz_par2); + drCut_par2(trk, nLayers, dr_par2, dr_exp, d0err, d0err_par, maxDr_par2); + + for (int i = 2; i >= 0; --i) { + if (maxDr_par2[i] < maxDr_par[i]) + maxDr_par[i] = maxDr_par2[i]; + if (maxDz_par2[i] < maxDz_par[i]) + maxDz_par[i] = maxDz_par2[i]; + } + } + + Point bestVertex = getBestVertex(trk, vertices, minNVtxTrk); // min number of tracks 3 @HLT + if (bestVertex.z() < -99998.) { + bestVertex = beamSpot.position(); + } + + ret = std::min(ret, cut(dz(trk, bestVertex), maxDz_par, std::less())); + if (ret == -1.f) + return ret; + ret = std::min(ret, cut(dr(trk, bestVertex), maxDr_par, std::less())); + if (ret == -1.f) + return ret; } - if (ret==-1.f) return ret; + if (ret == -1.f) + return ret; return ret; - } - - - static const char * name() { return "TrackCutClassifier";} - - static void fillDescriptions(edm::ParameterSetDescription & desc) { - desc.add("isHLT",false); - desc.add>("minHits4pass", { std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max() } ); - desc.add>("minHits", { 0, 0, 1}); - desc.add>("minPixelHits", { 0, 0, 1}); - desc.add>("minLayers", { 3, 4, 5}); - desc.add>("min3DLayers", { 1, 2, 3}); - desc.add>("maxLostLayers",{99, 3, 3}); - desc.add>("maxRelPtErr", { std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max() } ); - desc.add>("minNdof", {-1., -1., -1.}); - desc.add>("maxChi2", {9999.,25., 16. }); - desc.add>("maxChi2n", {9999., 1.0, 0.4}); + static const char* name() { return "TrackCutClassifier"; } + + static void fillDescriptions(edm::ParameterSetDescription& desc) { + desc.add("isHLT", false); + desc.add>( + "minHits4pass", + {std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()}); + desc.add>("minHits", {0, 0, 1}); + desc.add>("minPixelHits", {0, 0, 1}); + desc.add>("minLayers", {3, 4, 5}); + desc.add>("min3DLayers", {1, 2, 3}); + desc.add>("maxLostLayers", {99, 3, 3}); + desc.add>( + "maxRelPtErr", + {std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()}); + desc.add>("minNdof", {-1., -1., -1.}); + desc.add>("maxChi2", {9999., 25., 16.}); + desc.add>("maxChi2n", {9999., 1.0, 0.4}); desc.add("minNVtxTrk", 2); - desc.add>("maxDz",{std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); - desc.add>("maxDzWrtBS",{std::numeric_limits::max(),24.,15.}); - desc.add>("maxDr",{std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); + desc.add>( + "maxDz", + {std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()}); + desc.add>("maxDzWrtBS", {std::numeric_limits::max(), 24., 15.}); + desc.add>( + "maxDr", + {std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()}); edm::ParameterSetDescription dz_par; - dz_par.add> ("dz_exp", {std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()} ); // par = 4 - dz_par.add>("dz_par1", {std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); // par = 0.4 - dz_par.add>("dz_par2", {std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); // par = 0.35 - dz_par.add>("dzWPVerr_par",{std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); // par = 3. + dz_par.add>("dz_exp", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 4 + dz_par.add>("dz_par1", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 0.4 + dz_par.add>("dz_par2", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 0.35 + dz_par.add>("dzWPVerr_par", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 3. desc.add("dz_par", dz_par); edm::ParameterSetDescription dr_par; - dr_par.add> ("dr_exp", {std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()} ); // par = 4 - dr_par.add>("dr_par1",{std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); // par = 0.4 - dr_par.add>("dr_par2",{std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); // par = 0.3 - dr_par.add>("d0err", {0.003, 0.003, 0.003}); + dr_par.add>("dr_exp", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 4 + dr_par.add>("dr_par1", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 0.4 + dr_par.add>("dr_par2", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 0.3 + dr_par.add>("d0err", {0.003, 0.003, 0.003}); dr_par.add>("d0err_par", {0.001, 0.001, 0.001}); - dr_par.add>("drWPVerr_par",{std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()}); // par = 3. + dr_par.add>("drWPVerr_par", + {std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max()}); // par = 3. desc.add("dr_par", dr_par); - } bool isHLT; @@ -360,11 +414,11 @@ namespace { float maxDz[3]; float maxDzWrtBS[3]; float maxDr[3]; - int dz_exp[3]; + int dz_exp[3]; float dz_par1[3]; float dz_par2[3]; float dzWPVerr_par[3]; - int dr_exp[3]; + int dr_exp[3]; float dr_par1[3]; float dr_par2[3]; float d0err[3]; @@ -372,13 +426,11 @@ namespace { float drWPVerr_par[3]; }; - using TrackCutClassifier = TrackMVAClassifier; - -} + +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(TrackCutClassifier); - diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackListMerger.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackListMerger.cc index 8f12a162cc876..9a0de186a9311 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackListMerger.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackListMerger.cc @@ -1,7 +1,7 @@ // // Package: RecoTracker/FinalTrackSelectors // Class: TrackListMerger -// +// // Description: Hit Dumper // // Original Author: Steve Wagner, stevew@pizero.colorado.edu @@ -28,87 +28,89 @@ #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h" #include "TrackingTools/PatternTools/interface/Trajectory.h" -class dso_hidden TrackListMerger : public edm::stream::EDProducer<> - { - public: - - explicit TrackListMerger(const edm::ParameterSet& conf); - - ~TrackListMerger() override; - - void produce(edm::Event& e, const edm::EventSetup& c) override; - - private: - - using MVACollection = std::vector; - using QualityMaskCollection = std::vector; - - std::unique_ptr outputTrks; - std::unique_ptr outputTrkExtras; - std::unique_ptr outputTrkHits; - std::unique_ptr > outputTrajs; - std::unique_ptr outputTTAss; - std::unique_ptr outputSeeds; - - reco::TrackRefProd refTrks; - reco::TrackExtraRefProd refTrkExtras; - TrackingRecHitRefProd refTrkHits; - edm::RefProd< std::vector > refTrajs; - edm::RefProd< TrajectorySeedCollection > refTrajSeeds; - - bool copyExtras_; - bool makeReKeyedSeeds_; - - struct TkEDGetTokenss { - edm::InputTag tag; - edm::EDGetTokenT tk; - edm::EDGetTokenT > traj; - edm::EDGetTokenT tass; - edm::EDGetTokenT > tsel; - edm::EDGetTokenT > tmva; - TkEDGetTokenss() {} - TkEDGetTokenss(const edm::InputTag &tag_, edm::EDGetTokenT && tk_, - edm::EDGetTokenT > && traj_, edm::EDGetTokenT && tass_, - edm::EDGetTokenT > &&tsel_, edm::EDGetTokenT > && tmva_) : - tag(tag_), tk(tk_), traj(traj_), tass(tass_), tsel(tsel_), tmva(tmva_) {} - }; - TkEDGetTokenss edTokens(const edm::InputTag &tag, const edm::InputTag &seltag, const edm::InputTag &mvatag) { - return TkEDGetTokenss(tag, consumes(tag), - consumes >(tag), consumes(tag), - consumes >(seltag), consumes >(mvatag)); - } - TkEDGetTokenss edTokens(const edm::InputTag &tag, const edm::InputTag &mvatag) { - return TkEDGetTokenss(tag, consumes(tag), - consumes >(tag), consumes(tag), - edm::EDGetTokenT >(), consumes >(mvatag)); - } - std::vector trackProducers_; - - std::string priorityName_; - - double maxNormalizedChisq_; - double minPT_; - unsigned int minFound_; - float epsilon_; - float shareFrac_; - float foundHitBonus_; - float lostHitPenalty_; - std::vector indivShareFrac_; - - std::vector< std::vector< int> > listsToMerge_; - std::vector promoteQuality_; - std::vector hasSelector_; - bool copyMVA_; - - bool allowFirstHitShare_; - reco::TrackBase::TrackQuality qualityToSet_; - bool use_sharesInput_; - bool trkQualMod_; - - +class dso_hidden TrackListMerger : public edm::stream::EDProducer<> { +public: + explicit TrackListMerger(const edm::ParameterSet& conf); + + ~TrackListMerger() override; + + void produce(edm::Event& e, const edm::EventSetup& c) override; + +private: + using MVACollection = std::vector; + using QualityMaskCollection = std::vector; + + std::unique_ptr outputTrks; + std::unique_ptr outputTrkExtras; + std::unique_ptr outputTrkHits; + std::unique_ptr> outputTrajs; + std::unique_ptr outputTTAss; + std::unique_ptr outputSeeds; + + reco::TrackRefProd refTrks; + reco::TrackExtraRefProd refTrkExtras; + TrackingRecHitRefProd refTrkHits; + edm::RefProd> refTrajs; + edm::RefProd refTrajSeeds; + + bool copyExtras_; + bool makeReKeyedSeeds_; + + struct TkEDGetTokenss { + edm::InputTag tag; + edm::EDGetTokenT tk; + edm::EDGetTokenT> traj; + edm::EDGetTokenT tass; + edm::EDGetTokenT> tsel; + edm::EDGetTokenT> tmva; + TkEDGetTokenss() {} + TkEDGetTokenss(const edm::InputTag& tag_, + edm::EDGetTokenT&& tk_, + edm::EDGetTokenT>&& traj_, + edm::EDGetTokenT&& tass_, + edm::EDGetTokenT>&& tsel_, + edm::EDGetTokenT>&& tmva_) + : tag(tag_), tk(tk_), traj(traj_), tass(tass_), tsel(tsel_), tmva(tmva_) {} }; - - + TkEDGetTokenss edTokens(const edm::InputTag& tag, const edm::InputTag& seltag, const edm::InputTag& mvatag) { + return TkEDGetTokenss(tag, + consumes(tag), + consumes>(tag), + consumes(tag), + consumes>(seltag), + consumes>(mvatag)); + } + TkEDGetTokenss edTokens(const edm::InputTag& tag, const edm::InputTag& mvatag) { + return TkEDGetTokenss(tag, + consumes(tag), + consumes>(tag), + consumes(tag), + edm::EDGetTokenT>(), + consumes>(mvatag)); + } + std::vector trackProducers_; + + std::string priorityName_; + + double maxNormalizedChisq_; + double minPT_; + unsigned int minFound_; + float epsilon_; + float shareFrac_; + float foundHitBonus_; + float lostHitPenalty_; + std::vector indivShareFrac_; + + std::vector> listsToMerge_; + std::vector promoteQuality_; + std::vector hasSelector_; + bool copyMVA_; + + bool allowFirstHitShare_; + reco::TrackBase::TrackQuality qualityToSet_; + bool use_sharesInput_; + bool trkQualMod_; +}; #include #include @@ -140,111 +142,105 @@ class dso_hidden TrackListMerger : public edm::stream::EDProducer<> namespace { #ifdef STAT_TSB -inline volatile unsigned long long rdtsc() { - return __rdtsc(); -} + inline volatile unsigned long long rdtsc() { return __rdtsc(); } struct StatCount { - float maxDP=0.; - float maxDE=0.; + float maxDP = 0.; + float maxDE = 0.; unsigned long long st; - long long totBegin=0; - long long totPre=0; - long long totEnd=0; + long long totBegin = 0; + long long totPre = 0; + long long totEnd = 0; unsigned long long timeNo; // no-overlap unsigned long long timeOv; // overlap - void begin(int tt) { - totBegin+=tt; + void begin(int tt) { totBegin += tt; } + void start() { st = rdtsc(); } + void noOverlap() { timeNo += (rdtsc() - st); } + void overlap() { timeOv += (rdtsc() - st); } + void pre(int tt) { totPre += tt; } + void end(int tt) { totEnd += tt; } + void de(float d) { + if (d > maxDE) + maxDE = d; + } + void dp(float d) { + if (d > maxDP) + maxDP = d; } - void start() { st=rdtsc(); } - void noOverlap() { timeNo += (rdtsc()-st);} - void overlap() { timeOv += (rdtsc()-st);} - void pre(int tt) { totPre+=tt;} - void end(int tt) { totEnd+=tt;} - void de(float d) { if (d>maxDE) maxDE=d;} - void dp(float d) { if (d>maxDP) maxDP=d;} - void print() const { - std::cout << "TrackListMerger stat\nBegin/Pre/End/maxDPhi/maxDEta/Overlap/NoOverlap " - << totBegin <<'/'<< totPre <<'/'<< totEnd <<'/'<< maxDP <<'/'<< maxDE - <<'/'<< timeOv/1000 <<'/'<< timeNo/1000 - << std::endl; + std::cout << "TrackListMerger stat\nBegin/Pre/End/maxDPhi/maxDEta/Overlap/NoOverlap " << totBegin << '/' << totPre + << '/' << totEnd << '/' << maxDP << '/' << maxDE << '/' << timeOv / 1000 << '/' << timeNo / 1000 + << std::endl; } StatCount() {} - ~StatCount() { print();} + ~StatCount() { print(); } }; StatCount statCount; #else struct StatCount { - void begin(int){} - void pre(int){} - void end(int){} - void start(){} - void noOverlap(){} - void overlap(){} - void de(float){} - void dp(float){} - - + void begin(int) {} + void pre(int) {} + void end(int) {} + void start() {} + void noOverlap() {} + void overlap() {} + void de(float) {} + void dp(float) {} }; CMS_THREAD_SAFE StatCount statCount; #endif - -} - - +} // namespace namespace { - edm::ProductID clusterProductB( const TrackingRecHit *hit){ - return reinterpret_cast(hit)->firstClusterRef().id(); + edm::ProductID clusterProductB(const TrackingRecHit* hit) { + return reinterpret_cast(hit)->firstClusterRef().id(); } -} - +} // namespace TrackListMerger::TrackListMerger(edm::ParameterSet const& conf) { copyExtras_ = conf.getUntrackedParameter("copyExtras", true); - - std::vector trackProducerTags(conf.getParameter >("TrackProducers")); + + std::vector trackProducerTags(conf.getParameter>("TrackProducers")); //which of these do I need to turn into vectors? - maxNormalizedChisq_ = conf.getParameter("MaxNormalizedChisq"); - minPT_ = conf.getParameter("MinPT"); + maxNormalizedChisq_ = conf.getParameter("MaxNormalizedChisq"); + minPT_ = conf.getParameter("MinPT"); minFound_ = (unsigned int)conf.getParameter("MinFound"); - epsilon_ = conf.getParameter("Epsilon"); - shareFrac_ = conf.getParameter("ShareFrac"); + epsilon_ = conf.getParameter("Epsilon"); + shareFrac_ = conf.getParameter("ShareFrac"); allowFirstHitShare_ = conf.getParameter("allowFirstHitShare"); foundHitBonus_ = conf.getParameter("FoundHitBonus"); lostHitPenalty_ = conf.getParameter("LostHitPenalty"); - indivShareFrac_=conf.getParameter >("indivShareFrac"); + indivShareFrac_ = conf.getParameter>("indivShareFrac"); std::string qualityStr = conf.getParameter("newQuality"); - + if (!qualityStr.empty()) { qualityToSet_ = reco::TrackBase::qualityByName(conf.getParameter("newQuality")); - } - else + } else qualityToSet_ = reco::TrackBase::undefQuality; - + use_sharesInput_ = true; - if ( epsilon_ > 0.0 )use_sharesInput_ = false; - - edm::VParameterSet setsToMerge=conf.getParameter("setsToMerge"); - - for ( unsigned int i=0; i >("tLists")); + if (epsilon_ > 0.0) + use_sharesInput_ = false; + + edm::VParameterSet setsToMerge = conf.getParameter("setsToMerge"); + + for (unsigned int i = 0; i < setsToMerge.size(); i++) { + listsToMerge_.push_back(setsToMerge[i].getParameter>("tLists")); promoteQuality_.push_back(setsToMerge[i].getParameter("pQual")); } - hasSelector_ = conf.getParameter > ("hasSelector"); - copyMVA_ = conf.getParameter("copyMVA"); + hasSelector_ = conf.getParameter>("hasSelector"); + copyMVA_ = conf.getParameter("copyMVA"); - std::vector selectors(conf.getParameter >("selectedTrackQuals")); + std::vector selectors(conf.getParameter>("selectedTrackQuals")); std::vector mvaStores; - if(conf.exists("mvaValueTags")){ - mvaStores = conf.getParameter >("mvaValueTags"); - }else{ - for (int i = 0; i < (int)selectors.size(); i++){ - edm::InputTag ntag(selectors[i].label(),"MVAVals"); + if (conf.exists("mvaValueTags")) { + mvaStores = conf.getParameter>("mvaValueTags"); + } else { + for (int i = 0; i < (int)selectors.size(); i++) { + edm::InputTag ntag(selectors[i].label(), "MVAVals"); mvaStores.push_back(ntag); } } @@ -259,599 +255,629 @@ TrackListMerger::TrackListMerger(edm::ParameterSet const& conf) { // edm::LogWarning("TrackListMerger") << "No indivShareFrac for " << trackProducersTags <<". Using default value of 1"; indivShareFrac_.push_back(1.0); } - - trkQualMod_=conf.getParameter("writeOnlyTrkQuals"); - if ( trkQualMod_) { - bool ok=true; - for ( unsigned int i=1; i("writeOnlyTrkQuals"); + if (trkQualMod_) { + bool ok = true; + for (unsigned int i = 1; i < numTrkColl; i++) { + if (!(trackProducerTags[i] == trackProducerTags[0])) + ok = false; } - if ( !ok) { + if (!ok) { throw cms::Exception("Bad input") << "to use writeOnlyTrkQuals=True all input InputTags must be the same"; } - produces >(); + produces>(); produces("QualityMasks"); - } - else{ + } else { produces(); - - makeReKeyedSeeds_ = conf.getUntrackedParameter("makeReKeyedSeeds",false); - if (makeReKeyedSeeds_){ - copyExtras_=true; + + makeReKeyedSeeds_ = conf.getUntrackedParameter("makeReKeyedSeeds", false); + if (makeReKeyedSeeds_) { + copyExtras_ = true; produces(); } - + if (copyExtras_) { produces(); produces(); } - produces< std::vector >(); - produces< TrajTrackAssociationCollection >(); + produces>(); + produces(); } - produces >("MVAVals"); + produces>("MVAVals"); produces("MVAValues"); // Do all the consumes trackProducers_.resize(numTrkColl); for (unsigned int i = 0; i < numTrkColl; ++i) { - trackProducers_[i] = hasSelector_[i]>0 ? edTokens(trackProducerTags[i], selectors[i], mvaStores[i]) : edTokens(trackProducerTags[i], mvaStores[i]); + trackProducers_[i] = hasSelector_[i] > 0 ? edTokens(trackProducerTags[i], selectors[i], mvaStores[i]) + : edTokens(trackProducerTags[i], mvaStores[i]); } priorityName_ = conf.getParameter("trackAlgoPriorityOrder"); } - // Virtual destructor needed. -TrackListMerger::~TrackListMerger() { } - - // Functions that gets called by framework every event - void TrackListMerger::produce(edm::Event& e, const edm::EventSetup& es) - { - // extract tracker geometry - // - //edm::ESHandle theG; - //es.get().get(theG); - - // using namespace reco; - - edm::ESHandle priorityH; - es.get().get(priorityName_, priorityH); - auto const & trackAlgoPriorityOrder = *priorityH; - - // get Inputs - // if 1 input list doesn't exist, make an empty list, issue a warning, and continue - // this allows TrackListMerger to be used as a cleaner only if handed just one list - // if both input lists don't exist, will issue 2 warnings and generate an empty output collection - // - static const reco::TrackCollection s_empty; - - std::vector trackColls; - std::vector > trackHandles(trackProducers_.size()); - for ( unsigned int i=0; i trackColl; - e.getByToken(trackProducers_[i].tk, trackHandles[i]); - if (trackHandles[i].isValid()) { - trackColls[i]= trackHandles[i].product(); - } else { - edm::LogWarning("TrackListMerger") << "TrackCollection " << trackProducers_[i].tag <<" not found"; - trackColls[i]=&s_empty; - } - } - - unsigned int collsSize =trackColls.size(); - unsigned int rSize=0; - unsigned int trackCollSizes[collsSize]; - unsigned int trackCollFirsts[collsSize]; - for (unsigned int i=0; i!=collsSize; i++) { - trackCollSizes[i]=trackColls[i]->size(); - trackCollFirsts[i]=rSize; - rSize+=trackCollSizes[i]; +TrackListMerger::~TrackListMerger() {} + +// Functions that gets called by framework every event +void TrackListMerger::produce(edm::Event& e, const edm::EventSetup& es) { + // extract tracker geometry + // + //edm::ESHandle theG; + //es.get().get(theG); + + // using namespace reco; + + edm::ESHandle priorityH; + es.get().get(priorityName_, priorityH); + auto const& trackAlgoPriorityOrder = *priorityH; + + // get Inputs + // if 1 input list doesn't exist, make an empty list, issue a warning, and continue + // this allows TrackListMerger to be used as a cleaner only if handed just one list + // if both input lists don't exist, will issue 2 warnings and generate an empty output collection + // + static const reco::TrackCollection s_empty; + + std::vector trackColls; + std::vector> trackHandles(trackProducers_.size()); + for (unsigned int i = 0; i < trackProducers_.size(); i++) { + trackColls.push_back(nullptr); + //edm::Handle trackColl; + e.getByToken(trackProducers_[i].tk, trackHandles[i]); + if (trackHandles[i].isValid()) { + trackColls[i] = trackHandles[i].product(); + } else { + edm::LogWarning("TrackListMerger") << "TrackCollection " << trackProducers_[i].tag << " not found"; + trackColls[i] = &s_empty; } + } - statCount.begin(rSize); - - // - // quality cuts first - // - int i=-1; - - int selected[rSize]; - int indexG[rSize]; - bool trkUpdated[rSize]; - int trackCollNum[rSize]; - int trackQuals[rSize]; - float trackMVAs[rSize]; - reco::TrackBase::TrackAlgorithm oriAlgo[rSize]; - std::vector algoMask(rSize); - for (unsigned int j=0; jsize(); + trackCollFirsts[i] = rSize; + rSize += trackCollSizes[i]; + } - int ngood=0; - for (unsigned int j=0; j!= collsSize; j++) { - const reco::TrackCollection *tC1=trackColls[j]; + statCount.begin(rSize); + + // + // quality cuts first + // + int i = -1; + + int selected[rSize]; + int indexG[rSize]; + bool trkUpdated[rSize]; + int trackCollNum[rSize]; + int trackQuals[rSize]; + float trackMVAs[rSize]; + reco::TrackBase::TrackAlgorithm oriAlgo[rSize]; + std::vector algoMask(rSize); + for (unsigned int j = 0; j < rSize; j++) { + indexG[j] = -1; + selected[j] = 1; + trkUpdated[j] = false; + trackCollNum[j] = 0; + trackQuals[j] = 0; + trackMVAs[j] = -998.0; + oriAlgo[j] = reco::TrackBase::undefAlgorithm; + } - edm::Handle > trackSelColl; - edm::Handle > trackMVAStore; - if ( copyMVA_ ) - e.getByToken(trackProducers_[j].tmva, trackMVAStore); - if ( hasSelector_[j]>0 ){ - e.getByToken(trackProducers_[j].tsel, trackSelColl); - } + int ngood = 0; + for (unsigned int j = 0; j != collsSize; j++) { + const reco::TrackCollection* tC1 = trackColls[j]; - if ( !tC1->empty() ){ - unsigned int iC=0; - for (reco::TrackCollection::const_iterator track=tC1->begin(); track!=tC1->end(); track++){ - i++; - trackCollNum[i]=j; - trackQuals[i]=track->qualityMask(); - oriAlgo[i]=track->originalAlgo(); - algoMask[i]=track->algoMask(); - - reco::TrackRef trkRef=reco::TrackRef(trackHandles[j],iC); - if ( copyMVA_ ) - if( (*trackMVAStore).contains(trkRef.id()) ) trackMVAs[i] = (*trackMVAStore)[trkRef]; - if ( hasSelector_[j]>0 ) { - int qual=(*trackSelColl)[trkRef]; - if ( qual < 0 ) { - selected[i]=0; - iC++; - continue; - }else{ - trackQuals[i]=qual; - } - } - iC++; - selected[i]=trackQuals[i]+10;//10 is magic number used throughout... - if ((short unsigned)track->ndof() < 1){ - selected[i]=0; - continue; - } - if (track->normalizedChi2() > maxNormalizedChisq_){ - selected[i]=0; - continue; - } - if (track->found() < minFound_){ - selected[i]=0; - continue; - } - if (track->pt() < minPT_){ - selected[i]=0; - continue; - } - // good! - indexG[i] = ngood++; - //if ( beVerb) std::cout << "inverb " << track->pt() << " " << selected[i] << std::endl; - }//end loop over tracks - }//end more than 0 track - } // loop over trackcolls - - - statCount.pre(ngood); - - //cache the id and rechits of valid hits - typedef std::pair IHit; - std::vector> rh1(ngood); // "not an array" of vectors! - //const TrackingRecHit* fh1[ngood]; // first hit... - reco::TrackBase::TrackAlgorithm algo[ngood]; - float score[ngood]; - - - for ( unsigned int j=0; j=0); - unsigned int collNum=trackCollNum[j]; - unsigned int trackNum=j-trackCollFirsts[collNum]; - const reco::Track *track=&((trackColls[collNum])->at(trackNum)); - - algo[i]=track->algo(); - int validHits=track->numberOfValidHits(); - int validPixelHits=track->hitPattern().numberOfValidPixelHits(); - int lostHits=track->numberOfLostHits(); - score[i] = foundHitBonus_*validPixelHits+foundHitBonus_*validHits - lostHitPenalty_*lostHits - track->chi2(); - - - rh1[i].reserve(validHits) ; - auto compById = [](IHit const & h1, IHit const & h2) {return h1.first < h2.first;}; - for (trackingRecHit_iterator it = track->recHitsBegin(); it != track->recHitsEnd(); ++it) { - const TrackingRecHit* hit = (*it); - unsigned int id = hit->rawId() ; - if(hit->geographicalId().subdetId()>2) id &= (~3); // mask mono/stereo in strips... - if LIKELY(hit->isValid()) { rh1[i].emplace_back(id,hit); std::push_heap(rh1[i].begin(),rh1[i].end(),compById); } - } - std::sort_heap(rh1[i].begin(),rh1[i].end(),compById); + edm::Handle> trackSelColl; + edm::Handle> trackMVAStore; + if (copyMVA_) + e.getByToken(trackProducers_[j].tmva, trackMVAStore); + if (hasSelector_[j] > 0) { + e.getByToken(trackProducers_[j].tsel, trackSelColl); } - //DL here - if LIKELY(ngood>1 && collsSize>1) - for ( unsigned int ltm=0; ltm 0.99) continue; - //check that this track is in one of the lists for this iteration - if (notActive[collNum2]) continue; - - int k2 = indexG[j]; - - int newQualityMask = -9; //avoid resetting quality mask if not desired 10+ -9 =1 - if (promoteQuality_[ltm]) { - int maskT1= saveSelected[i]>1? saveSelected[i]-10 : qualityMaskT1; - int maskT2= saveSelected[j]>1? saveSelected[j]-10 : trackQuals[j]; - newQualityMask =(maskT1 | maskT2); // take OR of trackQuality - } - unsigned int nh2=rh1[k2].size(); - int nhit2 = nh2; - - - auto share = use_sharesInput_ ? - [](const TrackingRecHit* it,const TrackingRecHit* jt, float)->bool { return it->sharesInput(jt,TrackingRecHit::some); } : - [](const TrackingRecHit* it,const TrackingRecHit* jt, float eps)->bool { - float delta = std::abs ( it->localPosition().x()-jt->localPosition().x() ); - return (it->geographicalId()==jt->geographicalId())&&(deltaempty()) { + unsigned int iC = 0; + for (reco::TrackCollection::const_iterator track = tC1->begin(); track != tC1->end(); track++) { + i++; + trackCollNum[i] = j; + trackQuals[i] = track->qualityMask(); + oriAlgo[i] = track->originalAlgo(); + algoMask[i] = track->algoMask(); + + reco::TrackRef trkRef = reco::TrackRef(trackHandles[j], iC); + if (copyMVA_) + if ((*trackMVAStore).contains(trkRef.id())) + trackMVAs[i] = (*trackMVAStore)[trkRef]; + if (hasSelector_[j] > 0) { + int qual = (*trackSelColl)[trkRef]; + if (qual < 0) { + selected[i] = 0; + iC++; + continue; + } else { + trackQuals[i] = qual; + } + } + iC++; + selected[i] = trackQuals[i] + 10; //10 is magic number used throughout... + if ((short unsigned)track->ndof() < 1) { + selected[i] = 0; + continue; + } + if (track->normalizedChi2() > maxNormalizedChisq_) { + selected[i] = 0; + continue; + } + if (track->found() < minFound_) { + selected[i] = 0; + continue; + } + if (track->pt() < minPT_) { + selected[i] = 0; + continue; + } + // good! + indexG[i] = ngood++; + //if ( beVerb) std::cout << "inverb " << track->pt() << " " << selected[i] << std::endl; + } //end loop over tracks + } //end more than 0 track + } // loop over trackcolls + + statCount.pre(ngood); + + //cache the id and rechits of valid hits + typedef std::pair IHit; + std::vector> rh1(ngood); // "not an array" of vectors! + //const TrackingRecHit* fh1[ngood]; // first hit... + reco::TrackBase::TrackAlgorithm algo[ngood]; + float score[ngood]; + + for (unsigned int j = 0; j < rSize; j++) { + if (selected[j] == 0) + continue; + int i = indexG[j]; + assert(i >= 0); + unsigned int collNum = trackCollNum[j]; + unsigned int trackNum = j - trackCollFirsts[collNum]; + const reco::Track* track = &((trackColls[collNum])->at(trackNum)); + + algo[i] = track->algo(); + int validHits = track->numberOfValidHits(); + int validPixelHits = track->hitPattern().numberOfValidPixelHits(); + int lostHits = track->numberOfLostHits(); + score[i] = + foundHitBonus_ * validPixelHits + foundHitBonus_ * validHits - lostHitPenalty_ * lostHits - track->chi2(); + + rh1[i].reserve(validHits); + auto compById = [](IHit const& h1, IHit const& h2) { return h1.first < h2.first; }; + for (trackingRecHit_iterator it = track->recHitsBegin(); it != track->recHitsEnd(); ++it) { + const TrackingRecHit* hit = (*it); + unsigned int id = hit->rawId(); + if (hit->geographicalId().subdetId() > 2) + id &= (~3); // mask mono/stereo in strips... + if + LIKELY(hit->isValid()) { + rh1[i].emplace_back(id, hit); + std::push_heap(rh1[i].begin(), rh1[i].end(), compById); + } + } + std::sort_heap(rh1[i].begin(), rh1[i].end(), compById); + } + //DL here + if + LIKELY(ngood > 1 && collsSize > 1) + for (unsigned int ltm = 0; ltm < listsToMerge_.size(); ltm++) { + int saveSelected[rSize]; + bool notActive[collsSize]; + for (unsigned int cn = 0; cn != collsSize; ++cn) + notActive[cn] = find(listsToMerge_[ltm].begin(), listsToMerge_[ltm].end(), cn) == listsToMerge_[ltm].end(); + + for (unsigned int i = 0; i < rSize; i++) + saveSelected[i] = selected[i]; + + //DL protect against 0 tracks? + for (unsigned int i = 0; i < rSize - 1; i++) { + if (selected[i] == 0) + continue; + unsigned int collNum = trackCollNum[i]; + + //check that this track is in one of the lists for this iteration + if (notActive[collNum]) + continue; + + int k1 = indexG[i]; + unsigned int nh1 = rh1[k1].size(); + int qualityMaskT1 = trackQuals[i]; + + int nhit1 = nh1; // validHits[k1]; + float score1 = score[k1]; + + // start at next collection + for (unsigned int j = i + 1; j < rSize; j++) { + if (selected[j] == 0) + continue; + unsigned int collNum2 = trackCollNum[j]; + if ((collNum == collNum2) && indivShareFrac_[collNum] > 0.99) + continue; + //check that this track is in one of the lists for this iteration + if (notActive[collNum2]) + continue; + + int k2 = indexG[j]; + + int newQualityMask = -9; //avoid resetting quality mask if not desired 10+ -9 =1 + if (promoteQuality_[ltm]) { + int maskT1 = saveSelected[i] > 1 ? saveSelected[i] - 10 : qualityMaskT1; + int maskT2 = saveSelected[j] > 1 ? saveSelected[j] - 10 : trackQuals[j]; + newQualityMask = (maskT1 | maskT2); // take OR of trackQuality + } + unsigned int nh2 = rh1[k2].size(); + int nhit2 = nh2; - // exploit sorting - unsigned int jh=0; - unsigned int ih=0; - while (ih!=nh1 && jh!=nh2) { - // break if not enough to go... - // if ( nprecut-noverlap+firstoverlap > int(nh1-ih)) break; - // if ( nprecut-noverlap+firstoverlap > int(nh2-jh)) break; - auto const id1 = rh1[k1][ih].first; - auto const id2 = rh1[k2][jh].first; - if (id1 (std::min(nhit1,nhit2)-firstoverlap)*shareFrac_ : - (noverlap-firstoverlap) > (std::min(nhit1,nhit2)-firstoverlap)*indivShareFrac_[collNum]; - - auto seti = [&](unsigned int ii, unsigned int jj) { - selected[jj]=0; - selected[ii]=10+newQualityMask; // add 10 to avoid the case where mask = 1 - trkUpdated[ii]=true; - if (trackAlgoPriorityOrder.priority(oriAlgo[jj]) < trackAlgoPriorityOrder.priority(oriAlgo[ii])) oriAlgo[ii] = oriAlgo[jj]; - algoMask[ii] |= algoMask[jj]; - algoMask[jj] = algoMask[ii]; // in case we keep discarded - }; - - if ( dupfound ) { - float score2 = score[k2]; - constexpr float almostSame = 0.01f; // difference rather than ratio due to possible negative values for score - if ( score1 - score2 > almostSame ) { - seti(i,j); - } else if ( score2 - score1 > almostSame ) { - seti(j,i); - }else{ - // If tracks from both iterations are virtually identical, choose the one with the best quality or with lower algo - if ((trackQuals[j] & (1< bool { + return it->sharesInput(jt, TrackingRecHit::some); + } + : [](const TrackingRecHit* it, const TrackingRecHit* jt, float eps) -> bool { + float delta = std::abs(it->localPosition().x() - jt->localPosition().x()); + return (it->geographicalId() == jt->geographicalId()) && (delta < eps); + }; + + statCount.start(); + + //loop over rechits + int noverlap = 0; + int firstoverlap = 0; + // check first hit (should use REAL first hit?) + if + UNLIKELY(allowFirstHitShare_ && rh1[k1][0].first == rh1[k2][0].first) { + const TrackingRecHit* it = rh1[k1][0].second; + const TrackingRecHit* jt = rh1[k2][0].second; + if (share(it, jt, epsilon_)) + firstoverlap = 1; + } + + // exploit sorting + unsigned int jh = 0; + unsigned int ih = 0; + while (ih != nh1 && jh != nh2) { + // break if not enough to go... + // if ( nprecut-noverlap+firstoverlap > int(nh1-ih)) break; + // if ( nprecut-noverlap+firstoverlap > int(nh2-jh)) break; + auto const id1 = rh1[k1][ih].first; + auto const id2 = rh1[k2][jh].first; + if (id1 < id2) + ++ih; + else if (id2 < id1) + ++jh; + else { + // in case of split-hit do full conbinatorics + auto li = ih; + while ((++li) != nh1 && id1 == rh1[k1][li].first) + ; + auto lj = jh; + while ((++lj) != nh2 && id2 == rh1[k2][lj].first) + ; + for (auto ii = ih; ii != li; ++ii) + for (auto jj = jh; jj != lj; ++jj) { + const TrackingRecHit* it = rh1[k1][ii].second; + const TrackingRecHit* jt = rh1[k2][jj].second; + if (share(it, jt, epsilon_)) + noverlap++; + } + jh = lj; + ih = li; + } // equal ids + + } //loop over ih & jh + + bool dupfound = + (collNum != collNum2) + ? (noverlap - firstoverlap) > (std::min(nhit1, nhit2) - firstoverlap) * shareFrac_ + : (noverlap - firstoverlap) > (std::min(nhit1, nhit2) - firstoverlap) * indivShareFrac_[collNum]; + + auto seti = [&](unsigned int ii, unsigned int jj) { + selected[jj] = 0; + selected[ii] = 10 + newQualityMask; // add 10 to avoid the case where mask = 1 + trkUpdated[ii] = true; + if (trackAlgoPriorityOrder.priority(oriAlgo[jj]) < trackAlgoPriorityOrder.priority(oriAlgo[ii])) + oriAlgo[ii] = oriAlgo[jj]; + algoMask[ii] |= algoMask[jj]; + algoMask[jj] = algoMask[ii]; // in case we keep discarded + }; + + if (dupfound) { + float score2 = score[k2]; + constexpr float almostSame = 0.01f; // difference rather than ratio due to possible negative values for score + if (score1 - score2 > almostSame) { + seti(i, j); + } else if (score2 - score1 > almostSame) { + seti(j, i); + } else { + // If tracks from both iterations are virtually identical, choose the one with the best quality or with lower algo + if ((trackQuals[j] & + (1 << reco::TrackBase::loose | 1 << reco::TrackBase::tight | 1 << reco::TrackBase::highPurity)) == + (trackQuals[i] & + (1 << reco::TrackBase::loose | 1 << reco::TrackBase::tight | 1 << reco::TrackBase::highPurity))) { + //same quality, pick earlier algo + if (trackAlgoPriorityOrder.priority(algo[k1]) <= trackAlgoPriorityOrder.priority(algo[k2])) { + seti(i, j); + } else { + seti(j, i); + } + } else if ((trackQuals[j] & (1 << reco::TrackBase::loose | 1 << reco::TrackBase::tight | + 1 << reco::TrackBase::highPurity)) < + (trackQuals[i] & (1 << reco::TrackBase::loose | 1 << reco::TrackBase::tight | + 1 << reco::TrackBase::highPurity))) { + seti(i, j); + } else { + seti(j, i); + } + } //end fi < fj + statCount.overlap(); + /* if (at0[k1]&&at0[k2]) { statCount.dp(dphi); if (dz<1.f) statCount.de(deta); } */ - }//end got a duplicate - else { - statCount.noOverlap(); - } - //stop if the ith track is now unselected - if (selected[i]==0) break; - }//end track2 loop - }//end track loop - } //end loop over track list sets - - - - auto vmMVA = std::make_unique>(); - edm::ValueMap::Filler fillerMVA(*vmMVA); - - - - // special case - if just doing the trkquals - if (trkQualMod_) { - unsigned int tSize=trackColls[0]->size(); - auto vm = std::make_unique>(); - edm::ValueMap::Filler filler(*vm); - - std::vector finalQuals(tSize,-1); //default is unselected - for ( unsigned int i=0; i1 ) { - finalQuals[tNum]=selected[i]-10; - if (trkUpdated[i]) - finalQuals[tNum]=(finalQuals[tNum] | (1<>(); + edm::ValueMap::Filler fillerMVA(*vmMVA); + + // special case - if just doing the trkquals + if (trkQualMod_) { + unsigned int tSize = trackColls[0]->size(); + auto vm = std::make_unique>(); + edm::ValueMap::Filler filler(*vm); + + std::vector finalQuals(tSize, -1); //default is unselected + for (unsigned int i = 0; i < rSize; i++) { + unsigned int tNum = i % tSize; + + if (selected[i] > 1) { + finalQuals[tNum] = selected[i] - 10; + if (trkUpdated[i]) + finalQuals[tNum] = (finalQuals[tNum] | (1 << qualityToSet_)); } + if (selected[i] == 1) + finalQuals[tNum] = trackQuals[i]; + } - filler.insert(trackHandles[0], finalQuals.begin(),finalQuals.end()); - filler.fill(); - - e.put(std::move(vm)); - for (auto & q : finalQuals) q=std::max(q,0); - auto quals = std::make_unique(finalQuals.begin(),finalQuals.end()); - e.put(std::move(quals),"QualityMasks"); + filler.insert(trackHandles[0], finalQuals.begin(), finalQuals.end()); + filler.fill(); - std::vector mvaVec(tSize,-99); + e.put(std::move(vm)); + for (auto& q : finalQuals) + q = std::max(q, 0); + auto quals = std::make_unique(finalQuals.begin(), finalQuals.end()); + e.put(std::move(quals), "QualityMasks"); - for(unsigned int i = 0; i < rSize; i++){ - unsigned int tNum = i % tSize; - mvaVec[tNum] = trackMVAs[tNum]; - } + std::vector mvaVec(tSize, -99); - fillerMVA.insert(trackHandles[0],mvaVec.begin(),mvaVec.end()); - fillerMVA.fill(); - if ( copyMVA_) { - e.put(std::move(vmMVA),"MVAVals"); - auto mvas = std::make_unique(mvaVec.begin(),mvaVec.end()); - e.put(std::move(mvas),"MVAValues"); - } - return; + for (unsigned int i = 0; i < rSize; i++) { + unsigned int tNum = i % tSize; + mvaVec[tNum] = trackMVAs[tNum]; } + fillerMVA.insert(trackHandles[0], mvaVec.begin(), mvaVec.end()); + fillerMVA.fill(); + if (copyMVA_) { + e.put(std::move(vmMVA), "MVAVals"); + auto mvas = std::make_unique(mvaVec.begin(), mvaVec.end()); + e.put(std::move(mvas), "MVAValues"); + } + return; + } - // - // output selected tracks - if any - // + // + // output selected tracks - if any + // + + std::vector trackRefs(rSize); + std::vector> seedsRefs(rSize); + + unsigned int nToWrite = 0; + for (unsigned int i = 0; i < rSize; i++) + if (selected[i] != 0) + nToWrite++; + + std::vector mvaVec; + + outputTrks = std::make_unique(); + outputTrks->reserve(nToWrite); + refTrks = e.getRefBeforePut(); + + if (copyExtras_) { + outputTrkExtras = std::make_unique(); + outputTrkExtras->reserve(nToWrite); + refTrkExtras = e.getRefBeforePut(); + outputTrkHits = std::make_unique(); + outputTrkHits->reserve(nToWrite * 25); + refTrkHits = e.getRefBeforePut(); + if (makeReKeyedSeeds_) { + outputSeeds = std::make_unique(); + outputSeeds->reserve(nToWrite); + refTrajSeeds = e.getRefBeforePut(); + } + } - std::vector trackRefs(rSize); - std::vector> seedsRefs(rSize); + outputTrajs = std::make_unique>(); + outputTrajs->reserve(rSize); - unsigned int nToWrite=0; - for ( unsigned int i=0; i mvaVec; + unsigned int collNum = trackCollNum[i]; + unsigned int trackNum = i - trackCollFirsts[collNum]; + const reco::Track* track = &((trackColls[collNum])->at(trackNum)); + outputTrks->push_back(reco::Track(*track)); + mvaVec.push_back(trackMVAs[i]); + if (selected[i] > 1) { + outputTrks->back().setQualityMask(selected[i] - 10); + if (trkUpdated[i]) + outputTrks->back().setQuality(qualityToSet_); + } + //might duplicate things, but doesnt hurt + if (selected[i] == 1) + outputTrks->back().setQualityMask(trackQuals[i]); + outputTrks->back().setOriginalAlgorithm(oriAlgo[i]); + outputTrks->back().setAlgoMask(algoMask[i]); - outputTrks = std::make_unique(); - outputTrks->reserve(nToWrite); - refTrks = e.getRefBeforePut(); + // if ( beVerb ) std::cout << "selected " << outputTrks->back().pt() << " " << outputTrks->back().qualityMask() << " " << selected[i] << std::endl; + //fill the TrackCollection if (copyExtras_) { - outputTrkExtras = std::make_unique(); - outputTrkExtras->reserve(nToWrite); - refTrkExtras = e.getRefBeforePut(); - outputTrkHits = std::make_unique(); - outputTrkHits->reserve(nToWrite*25); - refTrkHits = e.getRefBeforePut(); - if (makeReKeyedSeeds_){ - outputSeeds = std::make_unique(); - outputSeeds->reserve(nToWrite); - refTrajSeeds = e.getRefBeforePut(); + edm::RefToBase origSeedRef = track->seedRef(); + //creating a seed with rekeyed clusters if required + if (makeReKeyedSeeds_) { + bool doRekeyOnThisSeed = false; + + edm::InputTag clusterRemovalInfos(""); + //grab on of the hits of the seed + if (origSeedRef->nHits() != 0) { + TrajectorySeed::const_iterator firstHit = origSeedRef->recHits().first; + const TrackingRecHit* hit = &*firstHit; + if (firstHit->isValid()) { + edm::ProductID pID = clusterProductB(hit); + // the cluster collection either produced a removalInfo or mot + //get the clusterremoval info from the provenance: will rekey if this is found + edm::Handle CRIh; + edm::Provenance prov = e.getProvenance(pID); + clusterRemovalInfos = edm::InputTag(prov.moduleLabel(), prov.productInstanceName(), prov.processName()); + doRekeyOnThisSeed = e.getByLabel(clusterRemovalInfos, CRIh); + } //valid hit + } //nhit!=0 + + if (doRekeyOnThisSeed && !(clusterRemovalInfos == edm::InputTag(""))) { + ClusterRemovalRefSetter refSetter(e, clusterRemovalInfos); + TrajectorySeed::recHitContainer newRecHitContainer; + newRecHitContainer.reserve(origSeedRef->nHits()); + TrajectorySeed::const_iterator iH = origSeedRef->recHits().first; + TrajectorySeed::const_iterator iH_end = origSeedRef->recHits().second; + for (; iH != iH_end; ++iH) { + newRecHitContainer.push_back(*iH); + refSetter.reKey(&newRecHitContainer.back()); + } + outputSeeds->push_back( + TrajectorySeed(origSeedRef->startingState(), newRecHitContainer, origSeedRef->direction())); + } + //doRekeyOnThisSeed=true + else { + //just copy the one we had before + outputSeeds->push_back(TrajectorySeed(*origSeedRef)); + } + edm::Ref pureRef(refTrajSeeds, outputSeeds->size() - 1); + origSeedRef = edm::RefToBase(pureRef); + } //creating a new seed and rekeying it rechit clusters. + + // Fill TrackExtra collection + outputTrkExtras->push_back(reco::TrackExtra(track->outerPosition(), + track->outerMomentum(), + track->outerOk(), + track->innerPosition(), + track->innerMomentum(), + track->innerOk(), + track->outerStateCovariance(), + track->outerDetId(), + track->innerStateCovariance(), + track->innerDetId(), + track->seedDirection(), + origSeedRef)); + seedsRefs[i] = origSeedRef; + outputTrks->back().setExtra(reco::TrackExtraRef(refTrkExtras, outputTrkExtras->size() - 1)); + reco::TrackExtra& tx = outputTrkExtras->back(); + tx.setResiduals(track->residuals()); + + // fill TrackingRecHits + unsigned nh1 = track->recHitsSize(); + tx.setHits(refTrkHits, outputTrkHits->size(), nh1); + tx.setTrajParams(track->extra()->trajParams(), track->extra()->chi2sX5()); + assert(tx.trajParams().size() == tx.recHitsSize()); + for (auto hh = track->recHitsBegin(), eh = track->recHitsEnd(); hh != eh; ++hh) { + outputTrkHits->push_back((*hh)->clone()); } } - - - outputTrajs = std::make_unique>(); - outputTrajs->reserve(rSize); - - for ( unsigned int i=0; iat(trackNum)); - outputTrks->push_back( reco::Track( *track ) ); - mvaVec.push_back(trackMVAs[i]); - if (selected[i]>1 ) { - outputTrks->back().setQualityMask(selected[i]-10); - if (trkUpdated[i]) - outputTrks->back().setQuality(qualityToSet_); - } - //might duplicate things, but doesnt hurt - if ( selected[i]==1 ) - outputTrks->back().setQualityMask(trackQuals[i]); - outputTrks->back().setOriginalAlgorithm(oriAlgo[i]); - outputTrks->back().setAlgoMask(algoMask[i]); - - // if ( beVerb ) std::cout << "selected " << outputTrks->back().pt() << " " << outputTrks->back().qualityMask() << " " << selected[i] << std::endl; - - //fill the TrackCollection - if (copyExtras_) { - edm::RefToBase origSeedRef = track->seedRef(); - //creating a seed with rekeyed clusters if required - if (makeReKeyedSeeds_){ - bool doRekeyOnThisSeed=false; - - edm::InputTag clusterRemovalInfos(""); - //grab on of the hits of the seed - if (origSeedRef->nHits()!=0){ - TrajectorySeed::const_iterator firstHit=origSeedRef->recHits().first; - const TrackingRecHit *hit = &*firstHit; - if (firstHit->isValid()){ - edm::ProductID pID=clusterProductB(hit); - // the cluster collection either produced a removalInfo or mot - //get the clusterremoval info from the provenance: will rekey if this is found - edm::Handle CRIh; - edm::Provenance prov=e.getProvenance(pID); - clusterRemovalInfos=edm::InputTag(prov.moduleLabel(), - prov.productInstanceName(), - prov.processName()); - doRekeyOnThisSeed=e.getByLabel(clusterRemovalInfos,CRIh); - }//valid hit - }//nhit!=0 - - if (doRekeyOnThisSeed && !(clusterRemovalInfos==edm::InputTag(""))) { - ClusterRemovalRefSetter refSetter(e,clusterRemovalInfos); - TrajectorySeed::recHitContainer newRecHitContainer; - newRecHitContainer.reserve(origSeedRef->nHits()); - TrajectorySeed::const_iterator iH=origSeedRef->recHits().first; - TrajectorySeed::const_iterator iH_end=origSeedRef->recHits().second; - for (;iH!=iH_end;++iH){ - newRecHitContainer.push_back(*iH); - refSetter.reKey(&newRecHitContainer.back()); - } - outputSeeds->push_back( TrajectorySeed( origSeedRef->startingState(), - newRecHitContainer, - origSeedRef->direction())); - } - //doRekeyOnThisSeed=true - else{ - //just copy the one we had before - outputSeeds->push_back( TrajectorySeed(*origSeedRef)); - } - edm::Ref pureRef(refTrajSeeds, outputSeeds->size()-1); - origSeedRef=edm::RefToBase( pureRef); - }//creating a new seed and rekeying it rechit clusters. - - // Fill TrackExtra collection - outputTrkExtras->push_back( reco::TrackExtra( - track->outerPosition(), track->outerMomentum(), track->outerOk(), - track->innerPosition(), track->innerMomentum(), track->innerOk(), - track->outerStateCovariance(), track->outerDetId(), - track->innerStateCovariance(), track->innerDetId(), - track->seedDirection(), origSeedRef ) ); - seedsRefs[i]=origSeedRef; - outputTrks->back().setExtra( reco::TrackExtraRef( refTrkExtras, outputTrkExtras->size() - 1) ); - reco::TrackExtra & tx = outputTrkExtras->back(); - tx.setResiduals(track->residuals()); - - // fill TrackingRecHits - unsigned nh1=track->recHitsSize(); - tx.setHits(refTrkHits,outputTrkHits->size(),nh1); - tx.setTrajParams(track->extra()->trajParams(),track->extra()->chi2sX5()); - assert(tx.trajParams().size()==tx.recHitsSize()); - for (auto hh = track->recHitsBegin(), eh=track->recHitsEnd(); hh!=eh; ++hh ) { - outputTrkHits->push_back( (*hh)->clone() ); + trackRefs[i] = reco::TrackRef(refTrks, outputTrks->size() - 1); + + } //end faux loop over tracks + + //Fill the trajectories, etc. for 1st collection + refTrajs = e.getRefBeforePut>(); + + outputTTAss = std::make_unique(refTrajs, refTrks); + + for (unsigned int ti = 0; ti < trackColls.size(); ti++) { + edm::Handle> hTraj1; + edm::Handle hTTAss1; + e.getByToken(trackProducers_[ti].traj, hTraj1); + e.getByToken(trackProducers_[ti].tass, hTTAss1); + + if (hTraj1.failedToGet() || hTTAss1.failedToGet()) + continue; + + for (size_t i = 0, n = hTraj1->size(); i < n; ++i) { + edm::Ref> trajRef(hTraj1, i); + TrajTrackAssociationCollection::const_iterator match = hTTAss1->find(trajRef); + if (match != hTTAss1->end()) { + const edm::Ref& trkRef = match->val; + uint32_t oldKey = trackCollFirsts[ti] + static_cast(trkRef.key()); + if (trackRefs[oldKey].isNonnull()) { + outputTrajs->push_back(*trajRef); + //if making extras and the seeds at the same time, change the seed ref on the trajectory + if (copyExtras_ && makeReKeyedSeeds_) + outputTrajs->back().setSeedRef(seedsRefs[oldKey]); + outputTTAss->insert(edm::Ref>(refTrajs, outputTrajs->size() - 1), trackRefs[oldKey]); } } - trackRefs[i] = reco::TrackRef(refTrks, outputTrks->size() - 1); - - - }//end faux loop over tracks - - //Fill the trajectories, etc. for 1st collection - refTrajs = e.getRefBeforePut< std::vector >(); - - outputTTAss = std::make_unique(refTrajs, refTrks); - - for (unsigned int ti=0; ti > hTraj1; - edm::Handle< TrajTrackAssociationCollection > hTTAss1; - e.getByToken(trackProducers_[ti].traj, hTraj1); - e.getByToken(trackProducers_[ti].tass, hTTAss1); - - if (hTraj1.failedToGet() || hTTAss1.failedToGet()) continue; - - for (size_t i = 0, n = hTraj1->size(); i < n; ++i) { - edm::Ref< std::vector > trajRef(hTraj1, i); - TrajTrackAssociationCollection::const_iterator match = hTTAss1->find(trajRef); - if (match != hTTAss1->end()) { - const edm::Ref &trkRef = match->val; - uint32_t oldKey = trackCollFirsts[ti]+static_cast(trkRef.key()); - if (trackRefs[oldKey].isNonnull()) { - outputTrajs->push_back( *trajRef ); - //if making extras and the seeds at the same time, change the seed ref on the trajectory - if (copyExtras_ && makeReKeyedSeeds_) - outputTrajs->back().setSeedRef( seedsRefs[oldKey] ); - outputTTAss->insert ( edm::Ref< std::vector >(refTrajs, outputTrajs->size() - 1), - trackRefs[oldKey] ); - } - } - } } + } - statCount.end(outputTrks->size()); - - edm::ProductID nPID = refTrks.id(); - edm::TestHandle outHandle(outputTrks.get(),nPID); - fillerMVA.insert(outHandle,mvaVec.begin(),mvaVec.end()); - fillerMVA.fill(); + statCount.end(outputTrks->size()); - e.put(std::move(outputTrks)); - if ( copyMVA_ ) { - e.put(std::move(vmMVA),"MVAVals"); - auto mvas = std::make_unique(mvaVec.begin(),mvaVec.end()); - e.put(std::move(mvas),"MVAValues"); - } - if (copyExtras_) { - e.put(std::move(outputTrkExtras)); - e.put(std::move(outputTrkHits)); - if (makeReKeyedSeeds_) - e.put(std::move(outputSeeds)); - } - e.put(std::move(outputTrajs)); - e.put(std::move(outputTTAss)); - return; + edm::ProductID nPID = refTrks.id(); + edm::TestHandle outHandle(outputTrks.get(), nPID); + fillerMVA.insert(outHandle, mvaVec.begin(), mvaVec.end()); + fillerMVA.fill(); - }//end produce + e.put(std::move(outputTrks)); + if (copyMVA_) { + e.put(std::move(vmMVA), "MVAVals"); + auto mvas = std::make_unique(mvaVec.begin(), mvaVec.end()); + e.put(std::move(mvas), "MVAValues"); + } + if (copyExtras_) { + e.put(std::move(outputTrkExtras)); + e.put(std::move(outputTrkHits)); + if (makeReKeyedSeeds_) + e.put(std::move(outputSeeds)); + } + e.put(std::move(outputTrajs)); + e.put(std::move(outputTTAss)); + return; +} //end produce #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(TrackListMerger); - diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackLwtnnClassifier.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackLwtnnClassifier.cc index ae3273894265a..e086e5281fc1e 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackLwtnnClassifier.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackLwtnnClassifier.cc @@ -14,11 +14,9 @@ namespace { struct lwtnn { - lwtnn(const edm::ParameterSet& cfg): - lwtnnLabel_(cfg.getParameter("lwtnnLabel")) - {} + lwtnn(const edm::ParameterSet& cfg) : lwtnnLabel_(cfg.getParameter("lwtnnLabel")) {} - static const char *name() { return "TrackLwtnnClassifier"; } + static const char* name() { return "TrackLwtnnClassifier"; } static void fillDescriptions(edm::ParameterSetDescription& desc) { desc.add("lwtnnLabel", "trackSelectionLwtnn"); @@ -31,24 +29,25 @@ namespace { neuralNetwork_ = lwtnnHandle.product(); } - std::pair operator()(reco::Track const & trk, - reco::BeamSpot const & beamSpot, - reco::VertexCollection const & vertices, - lwt::ValueMap & inputs) const { + std::pair operator()(reco::Track const& trk, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices, + lwt::ValueMap& inputs) const { // lwt::ValueMap is typedef for std::map // // It is cached per event to avoid constructing the map for each // track while keeping the operator() interface const. - Point bestVertex = getBestVertex(trk,vertices); + Point bestVertex = getBestVertex(trk, vertices); inputs["trk_pt"] = trk.pt(); inputs["trk_eta"] = trk.eta(); inputs["trk_lambda"] = trk.lambda(); - inputs["trk_dxy"] = trk.dxy(beamSpot.position()); // Training done without taking absolute value - inputs["trk_dz"] = trk.dz(beamSpot.position()); // Training done without taking absolute value - inputs["trk_dxyClosestPV"] = trk.dxy(bestVertex); // Training done without taking absolute value - inputs["trk_dzClosestPVNorm"] = std::max(-0.2, std::min(trk.dz(bestVertex), 0.2)); // Training done without taking absolute value + inputs["trk_dxy"] = trk.dxy(beamSpot.position()); // Training done without taking absolute value + inputs["trk_dz"] = trk.dz(beamSpot.position()); // Training done without taking absolute value + inputs["trk_dxyClosestPV"] = trk.dxy(bestVertex); // Training done without taking absolute value + inputs["trk_dzClosestPVNorm"] = + std::max(-0.2, std::min(trk.dz(bestVertex), 0.2)); // Training done without taking absolute value inputs["trk_ptErr"] = trk.ptError(); inputs["trk_etaErr"] = trk.etaError(); inputs["trk_lambdaErr"] = trk.lambdaError(); @@ -61,44 +60,44 @@ namespace { inputs["trk_nStrip"] = trk.hitPattern().numberOfValidStripHits(); inputs["trk_nPixelLay"] = trk.hitPattern().pixelLayersWithMeasurement(); inputs["trk_nStripLay"] = trk.hitPattern().stripLayersWithMeasurement(); - inputs["trk_n3DLay"] = (trk.hitPattern().numberOfValidStripLayersWithMonoAndStereo()+trk.hitPattern().pixelLayersWithMeasurement()); + inputs["trk_n3DLay"] = (trk.hitPattern().numberOfValidStripLayersWithMonoAndStereo() + + trk.hitPattern().pixelLayersWithMeasurement()); inputs["trk_nLostLay"] = trk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); inputs["trk_algo"] = trk.algo(); auto out = neuralNetwork_->compute(inputs); // there should only one output - if(out.size() != 1) throw cms::Exception("LogicError") << "Expecting exactly one output from NN, got " << out.size(); - - float output = 2.0*out.begin()->second-1.0; + if (out.size() != 1) + throw cms::Exception("LogicError") << "Expecting exactly one output from NN, got " << out.size(); + float output = 2.0 * out.begin()->second - 1.0; //Check if the network is known to be unreliable in that part of phase space. Hard cut values //correspond to rare tracks known to be difficult for the Deep Neural Network classifier bool isReliable = true; //T1qqqq - if(std::abs(inputs["trk_dxy"])>=0.1 && inputs["trk_etaErr"]<0.003 && inputs["trk_dxyErr"]<0.03 && inputs["trk_ndof"]>3){ + if (std::abs(inputs["trk_dxy"]) >= 0.1 && inputs["trk_etaErr"] < 0.003 && inputs["trk_dxyErr"] < 0.03 && + inputs["trk_ndof"] > 3) { isReliable = false; } //T5qqqqLL - if((inputs["trk_pt"]>100.0)&&(inputs["trk_nChi2"]<4.0)&&(inputs["trk_etaErr"]<0.001)){ + if ((inputs["trk_pt"] > 100.0) && (inputs["trk_nChi2"] < 4.0) && (inputs["trk_etaErr"] < 0.001)) { isReliable = false; } - std::pair return_ (output, isReliable); + std::pair return_(output, isReliable); return return_; } - std::string lwtnnLabel_; - const lwt::LightweightNeuralNetwork *neuralNetwork_; + const lwt::LightweightNeuralNetwork* neuralNetwork_; }; using TrackLwtnnClassifier = TrackMVAClassifier; -} +} // namespace #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(TrackLwtnnClassifier); - diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.cc index 27644f513019e..5bbd17fbf2abb 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.cc @@ -2,23 +2,20 @@ #include "TrackingTools/Records/interface/TransientRecHitRecord.h" #include "Geometry/Records/interface/IdealGeometryRecord.h" - #include "DataFormats/TrackerCommon/interface/TrackerTopology.h" #include "Geometry/Records/interface/TrackerTopologyRcd.h" #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h" #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h" -#define TRACK_SORT 1 // just use all hits from inner track, then append from outer outside it -#define DET_SORT 0 // sort hits using global position of detector -#define HIT_SORT 0 // sort hits using global position of hit - +#define TRACK_SORT 1 // just use all hits from inner track, then append from outer outside it +#define DET_SORT 0 // sort hits using global position of detector +#define HIT_SORT 0 // sort hits using global position of hit #include "FWCore/MessageLogger/interface/MessageLogger.h" +// #define VI_DEBUG - // #define VI_DEBUG - #ifdef VI_DEBUG #define DPRINT(x) std::cout << x << ": " #define PRINT std::cout @@ -27,176 +24,190 @@ #define PRINT LogTrace("") #endif +TrackMerger::TrackMerger(const edm::ParameterSet &iConfig) + : useInnermostState_(iConfig.getParameter("useInnermostState")), + theBuilderName(iConfig.getParameter("ttrhBuilderName")) {} -TrackMerger::TrackMerger(const edm::ParameterSet &iConfig) : - useInnermostState_(iConfig.getParameter("useInnermostState")), - theBuilderName(iConfig.getParameter("ttrhBuilderName")) -{ -} - -TrackMerger::~TrackMerger() -{ -} +TrackMerger::~TrackMerger() {} -void TrackMerger::init(const edm::EventSetup &iSetup) -{ - iSetup.get().get(theGeometry); - iSetup.get().get(theMagField); - iSetup.get().get(theBuilderName,theBuilder); - iSetup.get().get(theTrkTopo); +void TrackMerger::init(const edm::EventSetup &iSetup) { + iSetup.get().get(theGeometry); + iSetup.get().get(theMagField); + iSetup.get().get(theBuilderName, theBuilder); + iSetup.get().get(theTrkTopo); } -TrackCandidate TrackMerger::merge(const reco::Track &inner, const reco::Track &outer, DuplicateTrackType duplicateType) const -{ - DPRINT("TrackMerger") << std::abs(inner.eta()) << " merging " << inner.algo() << '/' << outer.algo() << ' ' << inner.eta() << '/' << outer.eta()<< std::endl; +TrackCandidate TrackMerger::merge(const reco::Track &inner, + const reco::Track &outer, + DuplicateTrackType duplicateType) const { + DPRINT("TrackMerger") << std::abs(inner.eta()) << " merging " << inner.algo() << '/' << outer.algo() << ' ' + << inner.eta() << '/' << outer.eta() << std::endl; std::vector hits; - hits.reserve(inner.recHitsSize() + outer.recHitsSize()); - DPRINT("TrackMerger") << "Inner track hits: " << std::endl; - for (auto it = inner.recHitsBegin(), ed = inner.recHitsEnd(); it != ed; ++it) { - hits.push_back(&**it); - if (debug_) { - DetId id(hits.back()->geographicalId()); - PRINT << " subdet " << id.subdetId() << " layer " << theTrkTopo->layer(id) << " valid " << hits.back()->isValid() << " detid: " << id() << std::endl; - } + hits.reserve(inner.recHitsSize() + outer.recHitsSize()); + DPRINT("TrackMerger") << "Inner track hits: " << std::endl; + for (auto it = inner.recHitsBegin(), ed = inner.recHitsEnd(); it != ed; ++it) { + hits.push_back(&**it); + if (debug_) { + DetId id(hits.back()->geographicalId()); + PRINT << " subdet " << id.subdetId() << " layer " << theTrkTopo->layer(id) << " valid " + << hits.back()->isValid() << " detid: " << id() << std::endl; } - DPRINT("TrackMerger") << "Outer track hits: " << std::endl; + } + DPRINT("TrackMerger") << "Outer track hits: " << std::endl; - if(duplicateType == DuplicateTrackType::Disjoint) { + if (duplicateType == DuplicateTrackType::Disjoint) { #if TRACK_SORT - DetId lastId(hits.back()->geographicalId()); - int lastSubdet = lastId.subdetId(); - unsigned int lastLayer = theTrkTopo->layer(lastId); - for (auto it = outer.recHitsBegin(), ed = outer.recHitsEnd(); it != ed; ++it) { - const TrackingRecHit *hit = &**it; - DetId id(hit->geographicalId()); - int thisSubdet = id.subdetId(); - if (thisSubdet > lastSubdet || (thisSubdet == lastSubdet && theTrkTopo->layer(id) > lastLayer)) { - hits.push_back(hit); - PRINT << " adding subdet " << id.subdetId() << " layer " << theTrkTopo->layer(id) << " valid " << hit->isValid() << " detid: " << id() << std::endl; - } else { - PRINT << " skipping subdet " << thisSubdet << " layer " << theTrkTopo->layer(id) << " valid " << hit->isValid() << " detid: " << id() << std::endl; - } + DetId lastId(hits.back()->geographicalId()); + int lastSubdet = lastId.subdetId(); + unsigned int lastLayer = theTrkTopo->layer(lastId); + for (auto it = outer.recHitsBegin(), ed = outer.recHitsEnd(); it != ed; ++it) { + const TrackingRecHit *hit = &**it; + DetId id(hit->geographicalId()); + int thisSubdet = id.subdetId(); + if (thisSubdet > lastSubdet || (thisSubdet == lastSubdet && theTrkTopo->layer(id) > lastLayer)) { + hits.push_back(hit); + PRINT << " adding subdet " << id.subdetId() << " layer " << theTrkTopo->layer(id) << " valid " + << hit->isValid() << " detid: " << id() << std::endl; + } else { + PRINT << " skipping subdet " << thisSubdet << " layer " << theTrkTopo->layer(id) << " valid " + << hit->isValid() << " detid: " << id() << std::endl; } + } #else - addSecondTrackHits(hits, outer); + addSecondTrackHits(hits, outer); #endif - } - else if(duplicateType == DuplicateTrackType::Overlapping) { - addSecondTrackHits(hits, outer); - } - - math::XYZVector p = (inner.innerMomentum() + outer.outerMomentum()); - GlobalVector v(p.x(), p.y(), p.z()); - if (!useInnermostState_) v *= -1; + } else if (duplicateType == DuplicateTrackType::Overlapping) { + addSecondTrackHits(hits, outer); + } - TrackCandidate::RecHitContainer ownHits; - unsigned int nhits = hits.size(); - ownHits.reserve(nhits); + math::XYZVector p = (inner.innerMomentum() + outer.outerMomentum()); + GlobalVector v(p.x(), p.y(), p.z()); + if (!useInnermostState_) + v *= -1; - if(duplicateType == DuplicateTrackType::Disjoint) { + TrackCandidate::RecHitContainer ownHits; + unsigned int nhits = hits.size(); + ownHits.reserve(nhits); + + if (duplicateType == DuplicateTrackType::Disjoint) { #if TRACK_SORT - if (!useInnermostState_) std::reverse(hits.begin(), hits.end()); - for(auto hit : hits) ownHits.push_back(*hit); + if (!useInnermostState_) + std::reverse(hits.begin(), hits.end()); + for (auto hit : hits) + ownHits.push_back(*hit); #elif DET_SORT - // OLD METHOD, sometimes fails - std::sort(hits.begin(), hits.end(), MomentumSort(v, &*theGeometry)); - for(auto hit : hits) ownHits.push_back(*hit); + // OLD METHOD, sometimes fails + std::sort(hits.begin(), hits.end(), MomentumSort(v, &*theGeometry)); + for (auto hit : hits) + ownHits.push_back(*hit); #else - sortByHitPosition(v, hits, ownHits); + sortByHitPosition(v, hits, ownHits); #endif + } else if (duplicateType == DuplicateTrackType::Overlapping) { + sortByHitPosition(v, hits, ownHits); + } + + PTrajectoryStateOnDet state; + PropagationDirection pdir; + if (useInnermostState_) { + pdir = alongMomentum; + if ((inner.outerPosition() - inner.innerPosition()).Dot(inner.momentum()) >= 0) { + // use inner state + TrajectoryStateOnSurface originalTsosIn( + trajectoryStateTransform::innerStateOnSurface(inner, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosIn, DetId(inner.innerDetId())); + } else { + // use outer state + TrajectoryStateOnSurface originalTsosOut( + trajectoryStateTransform::outerStateOnSurface(inner, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosOut, DetId(inner.outerDetId())); } - else if(duplicateType == DuplicateTrackType::Overlapping) { - sortByHitPosition(v, hits, ownHits); - } - - PTrajectoryStateOnDet state; - PropagationDirection pdir; - if (useInnermostState_) { - pdir = alongMomentum; - if ((inner.outerPosition()-inner.innerPosition()).Dot(inner.momentum()) >= 0) { - // use inner state - TrajectoryStateOnSurface originalTsosIn(trajectoryStateTransform::innerStateOnSurface(inner, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosIn, DetId(inner.innerDetId()) ); - } else { - // use outer state - TrajectoryStateOnSurface originalTsosOut(trajectoryStateTransform::outerStateOnSurface(inner, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosOut, DetId(inner.outerDetId()) ); - } + } else { + pdir = oppositeToMomentum; + if ((outer.outerPosition() - inner.innerPosition()).Dot(inner.momentum()) >= 0) { + // use outer state + TrajectoryStateOnSurface originalTsosOut( + trajectoryStateTransform::outerStateOnSurface(outer, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosOut, DetId(outer.outerDetId())); } else { - pdir = oppositeToMomentum; - if ((outer.outerPosition()-inner.innerPosition()).Dot(inner.momentum()) >= 0) { - // use outer state - TrajectoryStateOnSurface originalTsosOut(trajectoryStateTransform::outerStateOnSurface(outer, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosOut, DetId(outer.outerDetId()) ); - } else { - // use inner state - TrajectoryStateOnSurface originalTsosIn(trajectoryStateTransform::innerStateOnSurface(outer, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosIn, DetId(outer.innerDetId()) ); - } - + // use inner state + TrajectoryStateOnSurface originalTsosIn( + trajectoryStateTransform::innerStateOnSurface(outer, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosIn, DetId(outer.innerDetId())); } - TrajectorySeed seed(state, TrackCandidate::RecHitContainer(), pdir); - TrackCandidate ret(ownHits, seed, state, (useInnermostState_ ? inner : outer).seedRef()); - ret.setStopReason((uint8_t)(useInnermostState_ ? inner : outer).stopReason()); - return ret; + } + TrajectorySeed seed(state, TrackCandidate::RecHitContainer(), pdir); + TrackCandidate ret(ownHits, seed, state, (useInnermostState_ ? inner : outer).seedRef()); + ret.setStopReason((uint8_t)(useInnermostState_ ? inner : outer).stopReason()); + return ret; } -void TrackMerger::addSecondTrackHits(std::vector& hits, - const reco::Track& outer) const { - size_t nHitsFirstTrack = hits.size(); - for (auto it = outer.recHitsBegin(), ed = outer.recHitsEnd(); it != ed; ++it) { - const TrackingRecHit *hit = &**it; - DetId id(hit->geographicalId()); - const auto lay = theTrkTopo->layer(id); - bool shared = false; - bool valid = hit->isValid(); - PRINT << " subdet " << id.subdetId() << " layer " << theTrkTopo->layer(id) << " valid " << valid << " detid: " << id() << std::endl; - size_t iHit = 0; - for ( auto hit2 : hits) { - ++iHit; if (iHit > nHitsFirstTrack) break; - DetId id2 = hit2->geographicalId(); - if (id.subdetId() != id2.subdetId()) continue; - if (theTrkTopo->layer(id2) != lay) continue; - if (hit->sharesInput(hit2, TrackingRecHit::all)) { - PRINT << " discared as duplicate of other hit" << id() << std::endl; - shared = true; break; - } - if (hit2->isValid() && !valid) { - PRINT << " replacing old invalid hit on detid " << id2() << std::endl; - hit = hit2; shared = true; break; - } - PRINT << " discared as additional hit on layer that already contains hit with detid " << id() << std::endl; - shared = true; break; - } - if (shared) continue; - hits.push_back(hit); +void TrackMerger::addSecondTrackHits(std::vector &hits, const reco::Track &outer) const { + size_t nHitsFirstTrack = hits.size(); + for (auto it = outer.recHitsBegin(), ed = outer.recHitsEnd(); it != ed; ++it) { + const TrackingRecHit *hit = &**it; + DetId id(hit->geographicalId()); + const auto lay = theTrkTopo->layer(id); + bool shared = false; + bool valid = hit->isValid(); + PRINT << " subdet " << id.subdetId() << " layer " << theTrkTopo->layer(id) << " valid " << valid + << " detid: " << id() << std::endl; + size_t iHit = 0; + for (auto hit2 : hits) { + ++iHit; + if (iHit > nHitsFirstTrack) + break; + DetId id2 = hit2->geographicalId(); + if (id.subdetId() != id2.subdetId()) + continue; + if (theTrkTopo->layer(id2) != lay) + continue; + if (hit->sharesInput(hit2, TrackingRecHit::all)) { + PRINT << " discared as duplicate of other hit" << id() << std::endl; + shared = true; + break; + } + if (hit2->isValid() && !valid) { + PRINT << " replacing old invalid hit on detid " << id2() << std::endl; + hit = hit2; + shared = true; + break; + } + PRINT << " discared as additional hit on layer that already contains hit with detid " << id() << std::endl; + shared = true; + break; } + if (shared) + continue; + hits.push_back(hit); + } } -void TrackMerger::sortByHitPosition(const GlobalVector& v, - const std::vector& hits, - TrackCandidate::RecHitContainer& ownHits) const { +void TrackMerger::sortByHitPosition(const GlobalVector &v, + const std::vector &hits, + TrackCandidate::RecHitContainer &ownHits) const { // NEW sort, more accurate unsigned int nhits = hits.size(); std::vector ttrh(nhits); - for (unsigned int i = 0; i < nhits; ++i) ttrh[i] = theBuilder->build(hits[i]); + for (unsigned int i = 0; i < nhits; ++i) + ttrh[i] = theBuilder->build(hits[i]); std::sort(ttrh.begin(), ttrh.end(), GlobalMomentumSort(v)); - for(auto hit : ttrh) ownHits.push_back(*hit); + for (auto hit : ttrh) + ownHits.push_back(*hit); } -bool TrackMerger::MomentumSort::operator()(const TrackingRecHit *hit1, const TrackingRecHit *hit2) const -{ - const GeomDet *det1 = geom_->idToDet(hit1->geographicalId()); - const GeomDet *det2 = geom_->idToDet(hit2->geographicalId()); - GlobalPoint p1 = det1->toGlobal(LocalPoint(0,0,0)); - GlobalPoint p2 = det2->toGlobal(LocalPoint(0,0,0)); - return (p2 - p1).dot(dir_) > 0; +bool TrackMerger::MomentumSort::operator()(const TrackingRecHit *hit1, const TrackingRecHit *hit2) const { + const GeomDet *det1 = geom_->idToDet(hit1->geographicalId()); + const GeomDet *det2 = geom_->idToDet(hit2->geographicalId()); + GlobalPoint p1 = det1->toGlobal(LocalPoint(0, 0, 0)); + GlobalPoint p2 = det2->toGlobal(LocalPoint(0, 0, 0)); + return (p2 - p1).dot(dir_) > 0; } -bool TrackMerger::GlobalMomentumSort::operator()(const TransientTrackingRecHit::RecHitPointer &hit1, const TransientTrackingRecHit::RecHitPointer &hit2) const -{ - GlobalPoint p1 = hit1->isValid() ? hit1->globalPosition() : hit1->det()->position(); - GlobalPoint p2 = hit2->isValid() ? hit2->globalPosition() : hit2->det()->position(); - return (p2 - p1).dot(dir_) > 0; +bool TrackMerger::GlobalMomentumSort::operator()(const TransientTrackingRecHit::RecHitPointer &hit1, + const TransientTrackingRecHit::RecHitPointer &hit2) const { + GlobalPoint p1 = hit1->isValid() ? hit1->globalPosition() : hit1->det()->position(); + GlobalPoint p2 = hit2->isValid() ? hit2->globalPosition() : hit2->det()->position(); + return (p2 - p1).dot(dir_) > 0; } diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.h b/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.h index 14a6fbbc2a80a..1e08814218dbc 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.h +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackMerger.h @@ -12,38 +12,44 @@ #include "DuplicateTrackType.h" class dso_hidden TrackMerger { - public: - TrackMerger(const edm::ParameterSet &iConfig) ; - ~TrackMerger(); - - void init(const edm::EventSetup &iSetup) ; - - TrackCandidate merge(const reco::Track &inner, const reco::Track &outer, DuplicateTrackType duplicateType) const; - private: - edm::ESHandle theGeometry; - edm::ESHandle theMagField; - bool useInnermostState_; - bool debug_; - std::string theBuilderName; - edm::ESHandle theBuilder; - edm::ESHandle theTrkTopo; - - void addSecondTrackHits(std::vector& hits, const reco::Track& outer) const; - void sortByHitPosition(const GlobalVector& v, const std::vector& hits, TrackCandidate::RecHitContainer& ownHits) const; - - class GlobalMomentumSort { - public: - GlobalMomentumSort(const GlobalVector &dir) : dir_(dir) {} - bool operator()(const TransientTrackingRecHit::RecHitPointer &hit1, const TransientTrackingRecHit::RecHitPointer &hit2) const ; - private: - GlobalVector dir_; - }; - class MomentumSort { - public: - MomentumSort(const GlobalVector &dir, const TrackerGeometry *geometry) : dir_(dir), geom_(geometry) {} - bool operator()(const TrackingRecHit *hit1, const TrackingRecHit *hit2) const ; - private: - GlobalVector dir_; - const TrackerGeometry *geom_; - }; +public: + TrackMerger(const edm::ParameterSet &iConfig); + ~TrackMerger(); + + void init(const edm::EventSetup &iSetup); + + TrackCandidate merge(const reco::Track &inner, const reco::Track &outer, DuplicateTrackType duplicateType) const; + +private: + edm::ESHandle theGeometry; + edm::ESHandle theMagField; + bool useInnermostState_; + bool debug_; + std::string theBuilderName; + edm::ESHandle theBuilder; + edm::ESHandle theTrkTopo; + + void addSecondTrackHits(std::vector &hits, const reco::Track &outer) const; + void sortByHitPosition(const GlobalVector &v, + const std::vector &hits, + TrackCandidate::RecHitContainer &ownHits) const; + + class GlobalMomentumSort { + public: + GlobalMomentumSort(const GlobalVector &dir) : dir_(dir) {} + bool operator()(const TransientTrackingRecHit::RecHitPointer &hit1, + const TransientTrackingRecHit::RecHitPointer &hit2) const; + + private: + GlobalVector dir_; + }; + class MomentumSort { + public: + MomentumSort(const GlobalVector &dir, const TrackerGeometry *geometry) : dir_(dir), geom_(geometry) {} + bool operator()(const TrackingRecHit *hit1, const TrackingRecHit *hit2) const; + + private: + GlobalVector dir_; + const TrackerGeometry *geom_; + }; }; diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackerTrackHitFilter.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackerTrackHitFilter.cc index ffd6c1dc10d96..eeb835ff95f6a 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/TrackerTrackHitFilter.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackerTrackHitFilter.cc @@ -72,390 +72,408 @@ */ namespace reco { - namespace modules { - class TrackerTrackHitFilter : public edm::stream::EDProducer<> { - public: - TrackerTrackHitFilter(const edm::ParameterSet &iConfig) ; - void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; - int checkHit(const edm::EventSetup &iSetup,const DetId &detid, const TrackingRecHit * hit); - void produceFromTrajectory( const edm::EventSetup &iSetup, const Trajectory *itt, std::vector&hits); - void produceFromTrack( const edm::EventSetup &iSetup, const Track *itt, std::vector&hits); - private: - class Rule { + namespace modules { + class TrackerTrackHitFilter : public edm::stream::EDProducer<> { public: - // parse a rule from a string - Rule(const std::string &str) ; - // check this DetId, update the verdict if the rule has anything to say about it - void apply(DetId detid, const TrackerTopology *tTopo, bool & verdict) const { - // check detector - if (detid.subdetId() == subdet_) { - // check layer - if ( (layer_ == 0) || (layer_ == layer(detid, tTopo)) ) { - // override verdict - verdict = keep_; - // std::cout<<"Verdict is "< subdetStoN_;//(6); //,std::bool(false)); - std::vector subdetStoNlowcut_;//(6,-1.0); - std::vector subdetStoNhighcut_;//(6,-1.0); - bool checkStoN( const edm::EventSetup &iSetup,const DetId &id, const TrackingRecHit* therechit); - void parseStoN(const std::string &str); - - std::vector detsToIgnore_; - std::vector rules_; - - bool useTrajectories_; - bool rejectLowAngleHits_; - double TrackAngleCut_; - bool checkHitAngle(const TrajectoryMeasurement &meas); - bool checkPXLQuality_; - double pxlTPLProbXY_; - double pxlTPLProbXYQ_; - std::vector pxlTPLqBin_; - - bool checkPXLCorrClustCharge(const TrajectoryMeasurement &meas); - double PXLcorrClusChargeCut_; - - edm::ESHandle theGeometry; - edm::ESHandle theMagField; - - edm::ESHandle theBuilder; - - edm::EDGetTokenT tokenTracks; - edm::EDGetTokenT tokenTrajTrack; - - bool tagOverlaps_; - int nOverlaps; - int layerFromId (const DetId& id, const TrackerTopology *tTopo) const; - int sideFromId (const DetId& id, const TrackerTopology *tTopo) const; - // bool checkOverlapHit(); - - TrackCandidate makeCandidate(const reco::Track &tk, std::vector::iterator hitsBegin, std::vector::iterator hitsEnd) ; - //const TransientTrackingRecHitBuilder *RHBuilder; - }; // class - - + TrackerTrackHitFilter(const edm::ParameterSet &iConfig); + void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override; + int checkHit(const edm::EventSetup &iSetup, const DetId &detid, const TrackingRecHit *hit); + void produceFromTrajectory(const edm::EventSetup &iSetup, + const Trajectory *itt, + std::vector &hits); + void produceFromTrack(const edm::EventSetup &iSetup, const Track *itt, std::vector &hits); -TrackerTrackHitFilter::Rule::Rule(const std::string &str) { - static const boost::regex rule("(keep|drop)\\s+([A-Z]+)(\\s+(\\d+))?"); - boost::cmatch match; - std::string match_1; - std::string match_2; - std::string match_3; - // match and check it works - if (!regex_match(str.c_str(), match, rule)) { + private: + class Rule { + public: + // parse a rule from a string + Rule(const std::string &str); + // check this DetId, update the verdict if the rule has anything to say about it + void apply(DetId detid, const TrackerTopology *tTopo, bool &verdict) const { + // check detector + if (detid.subdetId() == subdet_) { + // check layer + if ((layer_ == 0) || (layer_ == layer(detid, tTopo))) { + // override verdict + verdict = keep_; + // std::cout<<"Verdict is "< subdetStoN_; //(6); //,std::bool(false)); + std::vector subdetStoNlowcut_; //(6,-1.0); + std::vector subdetStoNhighcut_; //(6,-1.0); + bool checkStoN(const edm::EventSetup &iSetup, const DetId &id, const TrackingRecHit *therechit); + void parseStoN(const std::string &str); + + std::vector detsToIgnore_; + std::vector rules_; + + bool useTrajectories_; + bool rejectLowAngleHits_; + double TrackAngleCut_; + bool checkHitAngle(const TrajectoryMeasurement &meas); + bool checkPXLQuality_; + double pxlTPLProbXY_; + double pxlTPLProbXYQ_; + std::vector pxlTPLqBin_; + + bool checkPXLCorrClustCharge(const TrajectoryMeasurement &meas); + double PXLcorrClusChargeCut_; + + edm::ESHandle theGeometry; + edm::ESHandle theMagField; + + edm::ESHandle theBuilder; + + edm::EDGetTokenT tokenTracks; + edm::EDGetTokenT tokenTrajTrack; + + bool tagOverlaps_; + int nOverlaps; + int layerFromId(const DetId &id, const TrackerTopology *tTopo) const; + int sideFromId(const DetId &id, const TrackerTopology *tTopo) const; + // bool checkOverlapHit(); + + TrackCandidate makeCandidate(const reco::Track &tk, + std::vector::iterator hitsBegin, + std::vector::iterator hitsEnd); + //const TransientTrackingRecHitBuilder *RHBuilder; + }; // class + + TrackerTrackHitFilter::Rule::Rule(const std::string &str) { + static const boost::regex rule("(keep|drop)\\s+([A-Z]+)(\\s+(\\d+))?"); + boost::cmatch match; + std::string match_1; + std::string match_2; + std::string match_3; + // match and check it works + if (!regex_match(str.c_str(), match, rule)) { throw cms::Exception("Configuration") << "Rule '" << str << "' not understood.\n"; - } - else{ - edm::LogInfo("TrackerTrackHitFilter") << "*** Rule Command given to TrackerTrackHitFilter:\t"<layer(detid); -} - -void TrackerTrackHitFilter::parseStoN(const std::string &str) { - // match a set of capital case chars (preceded by an arbitrary number of leading blanks), - //followed b an arbitrary number of blanks, one or more digits (not necessary, they cannot also be, - // another set of blank spaces and, again another *eventual* digit - // static boost::regex rule("\\s+([A-Z]+)(\\s+(\\d+)(\\.)?(\\d+))?(\\s+(\\d+)(\\.)?(\\d+))?"); - static const boost::regex rule("([A-Z]+)" - "\\s*(\\d+\\.*\\d*)?" - "\\s*(\\d+\\.*\\d*)?"); - - - boost::cmatch match; - std::string match_1; - std::string match_2; - std::string match_3; - // match and check it works - if (!regex_match(str.c_str(), match, rule)) { - throw cms::Exception("Configuration") << "Rule for S to N cut '" << str << "' not understood.\n"; - } - else{ - std::string match_0=match[0].second; - match_1=match[1].second; - match_2=match[2].second; - match_3=match[3].second; - - } - - int cnt=0; - float subdet_ind[6]; - for(cnt=0;cnt<6;cnt++ ){ - subdet_ind[cnt]=-1.0; - } - - - bool doALL=false; - std::string match_1a(match[1].first,match[1].second); - if (strncmp(match[1].first, "ALL", 3) == 0) doALL=true; - if (doALL || strncmp(match[1].first, "PXB", 3) == 0) subdet_ind[0] = +1.0; - if (doALL || strncmp(match[1].first, "PXE", 3) == 0) subdet_ind[1] = +1.0; - if (doALL || strncmp(match[1].first, "TIB", 3) == 0) subdet_ind[2] = +1.0; - if (doALL || strncmp(match[1].first, "TID", 3) == 0) subdet_ind[3] = +1.0; - if (doALL || strncmp(match[1].first, "TOB", 3) == 0) subdet_ind[4] = +1.0; - if (doALL || strncmp(match[1].first, "TEC", 3) == 0) subdet_ind[5] = +1.0; - - for(cnt=0;cnt<6;cnt++ ){//loop on subdets - if(subdet_ind[cnt]>0.0){ - subdetStoN_[cnt]=true; - if (match[2].first != match[2].second) { - subdetStoNlowcut_[cnt] = atof(match[2].first); - } - if (match[3].first != match[3].second ) { - subdetStoNhighcut_[cnt] = atof(match[3].first); } - edm::LogInfo("TrackerTrackHitFilter") <<"Setting thresholds*&^ for subdet #"<("src")), - minimumHits_(iConfig.getParameter("minimumHits")), - replaceWithInactiveHits_(iConfig.getParameter("replaceWithInactiveHits")), - stripFrontInvalidHits_(iConfig.getParameter("stripFrontInvalidHits")), - stripBackInvalidHits_( iConfig.getParameter("stripBackInvalidHits") ), - stripAllInvalidHits_( iConfig.getParameter("stripAllInvalidHits") ), - rejectBadStoNHits_( iConfig.getParameter("rejectBadStoNHits") ), - CMNSubtractionMode_( iConfig.getParameter("CMNSubtractionMode") ), - detsToIgnore_( iConfig.getParameter >("detsToIgnore") ), - useTrajectories_( iConfig.getParameter("useTrajectories") ), - rejectLowAngleHits_( iConfig.getParameter("rejectLowAngleHits") ), - TrackAngleCut_( iConfig.getParameter("TrackAngleCut") ), - checkPXLQuality_(iConfig.getParameter("usePixelQualityFlag") ), - pxlTPLProbXY_(iConfig.getParameter("PxlTemplateProbXYCut")), - pxlTPLProbXYQ_(iConfig.getParameter("PxlTemplateProbXYChargeCut")), - pxlTPLqBin_(iConfig.getParameter >("PxlTemplateqBinCut")), - PXLcorrClusChargeCut_(iConfig.getParameter("PxlCorrClusterChargeCut")), - tagOverlaps_( iConfig.getParameter("tagOverlaps") ) -{ - - if(useTrajectories_) tokenTrajTrack = consumes(src_); - else tokenTracks = consumes(src_); - - // sanity check - if (stripAllInvalidHits_ && replaceWithInactiveHits_) { - throw cms::Exception("Configuration") << "Inconsistent Configuration: you can't set both 'stripAllInvalidHits' and 'replaceWithInactiveHits' to true\n"; - } - if(rejectLowAngleHits_ && !useTrajectories_){ - throw cms::Exception("Configuration") << "Wrong configuration of TrackerTrackHitFilter. You cannot apply the cut on the track angle without using Trajectories!\n"; - } - if (!useTrajectories_ && PXLcorrClusChargeCut_>0){ - throw cms::Exception("Configuration") << "Wrong configuration of TrackerTrackHitFilter. You cannot apply the cut on the corrected pixel cluster charge without using Trajectories!\n"; - } - - if(pxlTPLqBin_.size()>2){ - edm::LogInfo("TrackerTrackHitFIlter")<<"Warning from TrackerTrackHitFilter: vector with qBin cuts has size > 2. Additional items will be ignored."; - } - - + } //end Rule::Rule - // read and parse commands - std::vector str_rules = iConfig.getParameter >("commands"); - rules_.reserve(str_rules.size()); - for (std::vector::const_iterator it = str_rules.begin(), ed = str_rules.end(); it != ed; ++it) { - rules_.push_back(Rule(*it)); + int TrackerTrackHitFilter::Rule::layer(DetId detid, const TrackerTopology *tTopo) const { + return tTopo->layer(detid); } - if(rejectBadStoNHits_){//commands for S/N cut - - subdetStoN_.reserve(6); - subdetStoNlowcut_.reserve(6); - subdetStoNhighcut_.reserve(6); - int cnt=0; - for(cnt=0;cnt<6;cnt++ ){ - subdetStoN_[cnt]=false; - subdetStoNlowcut_[cnt]=-1.0; - subdetStoNhighcut_[cnt]=-1.0; + void TrackerTrackHitFilter::parseStoN(const std::string &str) { + // match a set of capital case chars (preceded by an arbitrary number of leading blanks), + //followed b an arbitrary number of blanks, one or more digits (not necessary, they cannot also be, + // another set of blank spaces and, again another *eventual* digit + // static boost::regex rule("\\s+([A-Z]+)(\\s+(\\d+)(\\.)?(\\d+))?(\\s+(\\d+)(\\.)?(\\d+))?"); + static const boost::regex rule( + "([A-Z]+)" + "\\s*(\\d+\\.*\\d*)?" + "\\s*(\\d+\\.*\\d*)?"); + + boost::cmatch match; + std::string match_1; + std::string match_2; + std::string match_3; + // match and check it works + if (!regex_match(str.c_str(), match, rule)) { + throw cms::Exception("Configuration") << "Rule for S to N cut '" << str << "' not understood.\n"; + } else { + std::string match_0 = match[0].second; + match_1 = match[1].second; + match_2 = match[2].second; + match_3 = match[3].second; } - std::vector str_StoNrules = iConfig.getParameter >("StoNcommands"); - for (std::vector::const_iterator str_StoN = str_StoNrules.begin(); str_StoN != str_StoNrules.end(); ++str_StoN) { - parseStoN(*str_StoN); - } - ////edm::LogDebug("TrackerTrackHitFilter") - edm::LogInfo("TrackerTrackHitFilter")<<"Finished parsing S/N. Applying following cuts to subdets:"; - for(cnt=0;cnt<6;cnt++ ){ - ////edm::LogDebug("TrackerTrackHitFilter") - edm::LogVerbatim("TrackerTrackHitFilter")<<"Subdet #"< "<size(); - else candcollsize=tracks->size(); - auto output = std::make_unique(); - - output->reserve(candcollsize); - - // working area and tools - std::vector hits; - if(useTrajectories_){ - for (TrajTrackAssociationCollection::const_iterator itass = assoMap->begin(); itass != assoMap->end(); ++itass){ - - const edm::Ref >traj = itass->key;//trajectory in the collection - const reco::TrackRef tkref = itass->val;//associated track track in the collection - //std::cout<<"The hit collection has size "<recHitsEnd() - tkref->recHitsBegin()<::iterator begin = hits.begin(), end = hits.end(); + bool doALL = false; + std::string match_1a(match[1].first, match[1].second); + if (strncmp(match[1].first, "ALL", 3) == 0) + doALL = true; + if (doALL || strncmp(match[1].first, "PXB", 3) == 0) + subdet_ind[0] = +1.0; + if (doALL || strncmp(match[1].first, "PXE", 3) == 0) + subdet_ind[1] = +1.0; + if (doALL || strncmp(match[1].first, "TIB", 3) == 0) + subdet_ind[2] = +1.0; + if (doALL || strncmp(match[1].first, "TID", 3) == 0) + subdet_ind[3] = +1.0; + if (doALL || strncmp(match[1].first, "TOB", 3) == 0) + subdet_ind[4] = +1.0; + if (doALL || strncmp(match[1].first, "TEC", 3) == 0) + subdet_ind[5] = +1.0; + + for (cnt = 0; cnt < 6; cnt++) { //loop on subdets + if (subdet_ind[cnt] > 0.0) { + subdetStoN_[cnt] = true; + if (match[2].first != match[2].second) { + subdetStoNlowcut_[cnt] = atof(match[2].first); + } + if (match[3].first != match[3].second) { + subdetStoNhighcut_[cnt] = atof(match[3].first); + } + edm::LogInfo("TrackerTrackHitFilter") << "Setting thresholds*&^ for subdet #" << cnt + 1 << " = " + << subdetStoNlowcut_[cnt] << " - " << subdetStoNhighcut_[cnt]; + } + } - // strip invalid hits at the beginning - if (stripFrontInvalidHits_) { - while ( (begin != end) && ( (*begin)->isValid() == false ) ) ++begin; + bool correct_regex = false; + for (cnt = 0; cnt < 6; cnt++) { //check that the regex was correct + if (subdetStoN_[cnt]) + correct_regex = true; } - // strip invalid hits at the end - if (stripBackInvalidHits_ && (begin != end)) { - --end; - while ( (begin != end) && ( (*end)->isValid() == false ) ) --end; - ++end; + + if (!correct_regex) { + throw cms::Exception("Configuration") + << "Detector '" << match_1a << "' not understood in parseStoN. Should be PXB, PXE, TIB, TID, TOB, TEC.\n"; } - // if we still have some hits build the track candidate - if(replaceWithInactiveHits_){ - int nvalidhits=0; - for( std::vector::iterator ithit=begin;ithit!=end;++ithit){ - if( (*ithit)->isValid())nvalidhits++; - } - if(nvalidhits >= int(minimumHits_)){ - output->push_back( makeCandidate ( *trk, begin, end ) ); - } + //std::cout<<"Reached end of parseStoN"<("src")), + minimumHits_(iConfig.getParameter("minimumHits")), + replaceWithInactiveHits_(iConfig.getParameter("replaceWithInactiveHits")), + stripFrontInvalidHits_(iConfig.getParameter("stripFrontInvalidHits")), + stripBackInvalidHits_(iConfig.getParameter("stripBackInvalidHits")), + stripAllInvalidHits_(iConfig.getParameter("stripAllInvalidHits")), + rejectBadStoNHits_(iConfig.getParameter("rejectBadStoNHits")), + CMNSubtractionMode_(iConfig.getParameter("CMNSubtractionMode")), + detsToIgnore_(iConfig.getParameter >("detsToIgnore")), + useTrajectories_(iConfig.getParameter("useTrajectories")), + rejectLowAngleHits_(iConfig.getParameter("rejectLowAngleHits")), + TrackAngleCut_(iConfig.getParameter("TrackAngleCut")), + checkPXLQuality_(iConfig.getParameter("usePixelQualityFlag")), + pxlTPLProbXY_(iConfig.getParameter("PxlTemplateProbXYCut")), + pxlTPLProbXYQ_(iConfig.getParameter("PxlTemplateProbXYChargeCut")), + pxlTPLqBin_(iConfig.getParameter >("PxlTemplateqBinCut")), + PXLcorrClusChargeCut_(iConfig.getParameter("PxlCorrClusterChargeCut")), + tagOverlaps_(iConfig.getParameter("tagOverlaps")) { + if (useTrajectories_) + tokenTrajTrack = consumes(src_); + else + tokenTracks = consumes(src_); + + // sanity check + if (stripAllInvalidHits_ && replaceWithInactiveHits_) { + throw cms::Exception("Configuration") << "Inconsistent Configuration: you can't set both 'stripAllInvalidHits' " + "and 'replaceWithInactiveHits' to true\n"; } - else{//all invalid hits have been already kicked out - if ((end - begin) >= int(minimumHits_)) { - output->push_back( makeCandidate ( *trk, begin, end ) ); - } + if (rejectLowAngleHits_ && !useTrajectories_) { + throw cms::Exception("Configuration") << "Wrong configuration of TrackerTrackHitFilter. You cannot apply the " + "cut on the track angle without using Trajectories!\n"; } - - - // if we still have some hits build the track candidate - //if ((end - begin) >= int(minimumHits_)) { - // output->push_back( makeCandidate ( *trk, begin, end ) ); - //} - - - // now delete the hits not used by the candidate - for (begin = hits.begin(), end = hits.end(); begin != end; ++begin) { - if (*begin) delete *begin; + if (!useTrajectories_ && PXLcorrClusChargeCut_ > 0) { + throw cms::Exception("Configuration") + << "Wrong configuration of TrackerTrackHitFilter. You cannot apply the cut on the corrected pixel cluster " + "charge without using Trajectories!\n"; } - hits.clear(); - } // loop on trajectories + if (pxlTPLqBin_.size() > 2) { + edm::LogInfo("TrackerTrackHitFIlter") << "Warning from TrackerTrackHitFilter: vector with qBin cuts has size > " + "2. Additional items will be ignored."; + } - } - else{ //use plain tracks - - // loop on tracks - for (std::vector::const_iterator ittrk = tracks->begin(), edtrk = tracks->end(); ittrk != edtrk; ++ittrk) { - - // std::cout<<"The hit collection has size "<recHitsEnd() - ittrk->recHitsBegin()< str_rules = iConfig.getParameter >("commands"); + rules_.reserve(str_rules.size()); + for (std::vector::const_iterator it = str_rules.begin(), ed = str_rules.end(); it != ed; ++it) { + rules_.push_back(Rule(*it)); + } - const Track *trk = &(*ittrk); + if (rejectBadStoNHits_) { //commands for S/N cut + + subdetStoN_.reserve(6); + subdetStoNlowcut_.reserve(6); + subdetStoNhighcut_.reserve(6); + int cnt = 0; + for (cnt = 0; cnt < 6; cnt++) { + subdetStoN_[cnt] = false; + subdetStoNlowcut_[cnt] = -1.0; + subdetStoNhighcut_[cnt] = -1.0; + } + + std::vector str_StoNrules = iConfig.getParameter >("StoNcommands"); + for (std::vector::const_iterator str_StoN = str_StoNrules.begin(); str_StoN != str_StoNrules.end(); + ++str_StoN) { + parseStoN(*str_StoN); + } + ////edm::LogDebug("TrackerTrackHitFilter") + edm::LogInfo("TrackerTrackHitFilter") << "Finished parsing S/N. Applying following cuts to subdets:"; + for (cnt = 0; cnt < 6; cnt++) { + ////edm::LogDebug("TrackerTrackHitFilter") + edm::LogVerbatim("TrackerTrackHitFilter") + << "Subdet #" << cnt + 1 << " -> " << subdetStoNlowcut_[cnt] << " , " << subdetStoNhighcut_[cnt]; + } + } //end if rejectBadStoNHits_ + + if (rejectLowAngleHits_) + edm::LogInfo("TrackerTrackHitFilter") << "\nApplying cut on angle track = " << TrackAngleCut_; + + // sort detids to ignore + std::sort(detsToIgnore_.begin(), detsToIgnore_.end()); + + // issue the produce<> + produces(); + } - produceFromTrack(iSetup,trk,hits); - //----------------------- - /* + void TrackerTrackHitFilter::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) { + //Dump Run and Event + iRun = iEvent.id().run(); + iEvt = iEvent.id().event(); + + // read with View, so we can read also a TrackRefVector + edm::Handle > tracks; + edm::Handle assoMap; + + if (useTrajectories_) + iEvent.getByToken(tokenTrajTrack, assoMap); + else + iEvent.getByToken(tokenTracks, tracks); + + // read from EventSetup + iSetup.get().get(theGeometry); + iSetup.get().get(theMagField); + //iSetup.get().get("WithTrackAngle",theBuilder); + // RHBuilder= theBuilder.product(); + + // prepare output collection + size_t candcollsize; + if (useTrajectories_) + candcollsize = assoMap->size(); + else + candcollsize = tracks->size(); + auto output = std::make_unique(); + + output->reserve(candcollsize); + + // working area and tools + std::vector hits; + + if (useTrajectories_) { + for (TrajTrackAssociationCollection::const_iterator itass = assoMap->begin(); itass != assoMap->end(); + ++itass) { + const edm::Ref > traj = itass->key; //trajectory in the collection + const reco::TrackRef tkref = itass->val; //associated track track in the collection + //std::cout<<"The hit collection has size "<recHitsEnd() - tkref->recHitsBegin()<::iterator begin = hits.begin(), end = hits.end(); + + // strip invalid hits at the beginning + if (stripFrontInvalidHits_) { + while ((begin != end) && ((*begin)->isValid() == false)) + ++begin; + } + // strip invalid hits at the end + if (stripBackInvalidHits_ && (begin != end)) { + --end; + while ((begin != end) && ((*end)->isValid() == false)) + --end; + ++end; + } + + // if we still have some hits build the track candidate + if (replaceWithInactiveHits_) { + int nvalidhits = 0; + for (std::vector::iterator ithit = begin; ithit != end; ++ithit) { + if ((*ithit)->isValid()) + nvalidhits++; + } + if (nvalidhits >= int(minimumHits_)) { + output->push_back(makeCandidate(*trk, begin, end)); + } + } else { //all invalid hits have been already kicked out + if ((end - begin) >= int(minimumHits_)) { + output->push_back(makeCandidate(*trk, begin, end)); + } + } + + // if we still have some hits build the track candidate + //if ((end - begin) >= int(minimumHits_)) { + // output->push_back( makeCandidate ( *trk, begin, end ) ); + //} + + // now delete the hits not used by the candidate + for (begin = hits.begin(), end = hits.end(); begin != end; ++begin) { + if (*begin) + delete *begin; + } + hits.clear(); + } // loop on trajectories + + } else { //use plain tracks + + // loop on tracks + for (std::vector::const_iterator ittrk = tracks->begin(), edtrk = tracks->end(); ittrk != edtrk; + ++ittrk) { + // std::cout<<"The hit collection has size "<recHitsEnd() - ittrk->recHitsBegin()<::iterator ith = hits.begin(), edh = hits.end(); ith != edh; ++ith) { const TrackingRecHit *myhit = *(ith); @@ -474,157 +492,166 @@ TrackerTrackHitFilter::produce(edm::Event &iEvent, const edm::EventSetup &iSetup std::cout<<"-$-$ OUTPUT Hit position: ( "<isValid() == false ) ) ++begin; - } - // strip invalid hits at the end - if (stripBackInvalidHits_ && (begin != end)) { - --end; - while ( (begin != end) && ( (*end)->isValid() == false ) ) --end; - ++end; - } - - // if we still have some hits build the track candidate - if(replaceWithInactiveHits_){ - int nvalidhits=0; - for( std::vector::iterator ithit=begin;ithit!=end;++ithit){ - if( (*ithit)->isValid())nvalidhits++; - } - if(nvalidhits >= int(minimumHits_)){ - output->push_back( makeCandidate ( *ittrk, begin, end ) ); - } - - } - else{//all invalid hits have been already kicked out - if ((end - begin) >= int(minimumHits_)) { - output->push_back( makeCandidate ( *ittrk, begin, end ) ); - } - } - - // now delete the hits not used by the candidate - for (begin = hits.begin(), end = hits.end(); begin != end; ++begin) { - if (*begin) delete *begin; - } - hits.clear(); - } // loop on tracks - }//end else useTracks - - // std::cout<<"OUTPUT SIZE: "<size()<::iterator hitsBegin, std::vector::iterator hitsEnd) { - + //----------------------- + + std::vector::iterator begin = hits.begin(), end = hits.end(); + // std::cout << "Back in the main producer (TRK), the final hit collection has size " << hits.size() << std::endl; + // strip invalid hits at the beginning + if (stripFrontInvalidHits_) { + while ((begin != end) && ((*begin)->isValid() == false)) + ++begin; + } + // strip invalid hits at the end + if (stripBackInvalidHits_ && (begin != end)) { + --end; + while ((begin != end) && ((*end)->isValid() == false)) + --end; + ++end; + } + + // if we still have some hits build the track candidate + if (replaceWithInactiveHits_) { + int nvalidhits = 0; + for (std::vector::iterator ithit = begin; ithit != end; ++ithit) { + if ((*ithit)->isValid()) + nvalidhits++; + } + if (nvalidhits >= int(minimumHits_)) { + output->push_back(makeCandidate(*ittrk, begin, end)); + } + + } else { //all invalid hits have been already kicked out + if ((end - begin) >= int(minimumHits_)) { + output->push_back(makeCandidate(*ittrk, begin, end)); + } + } + + // now delete the hits not used by the candidate + for (begin = hits.begin(), end = hits.end(); begin != end; ++begin) { + if (*begin) + delete *begin; + } + hits.clear(); + } // loop on tracks + } //end else useTracks + + // std::cout<<"OUTPUT SIZE: "<size()<::iterator hitsBegin, + std::vector::iterator hitsEnd) { + PropagationDirection pdir = tk.seedDirection(); + PTrajectoryStateOnDet state; + if (pdir == anyDirection) + throw cms::Exception("UnimplementedFeature") << "Cannot work with tracks that have 'anyDirecton' \n"; - // double innerP=sqrt( pow(tk.innerMomentum().X(),2)+pow(tk.innerMomentum().Y(),2)+pow(tk.innerMomentum().Z(),2) ); - // if ( (pdir == alongMomentum) == ( innerP >= tk.outerP() ) ) { + // double innerP=sqrt( pow(tk.innerMomentum().X(),2)+pow(tk.innerMomentum().Y(),2)+pow(tk.innerMomentum().Z(),2) ); + // if ( (pdir == alongMomentum) == ( innerP >= tk.outerP() ) ) { - if ( (pdir == alongMomentum) == ( (tk.outerPosition()-tk.innerPosition()).Dot(tk.momentum()) >= 0 ) ) { + if ((pdir == alongMomentum) == ((tk.outerPosition() - tk.innerPosition()).Dot(tk.momentum()) >= 0)) { // use inner state - TrajectoryStateOnSurface originalTsosIn(trajectoryStateTransform::innerStateOnSurface(tk, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosIn, DetId(tk.innerDetId()) ); - } else { + TrajectoryStateOnSurface originalTsosIn( + trajectoryStateTransform::innerStateOnSurface(tk, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosIn, DetId(tk.innerDetId())); + } else { // use outer state - TrajectoryStateOnSurface originalTsosOut(trajectoryStateTransform::outerStateOnSurface(tk, *theGeometry, &*theMagField)); - state = trajectoryStateTransform::persistentState( originalTsosOut, DetId(tk.outerDetId()) ); - } - TrajectorySeed seed(state, TrackCandidate::RecHitContainer(), pdir); - TrackCandidate::RecHitContainer ownHits; - ownHits.reserve(hitsEnd - hitsBegin); - for ( ; hitsBegin != hitsEnd; ++hitsBegin) { - //if(! (*hitsBegin)->isValid() ) std::cout<<"Putting in the trackcandidate an INVALID HIT !"<&hits){ - - // loop on tracks - hits.clear(); // extra safety - - for (trackingRecHit_iterator ith = itt->recHitsBegin(), edh = itt->recHitsEnd(); ith != edh; ++ith) { - const TrackingRecHit * hit = (*ith); // ith is an iterator on edm::Ref to rechit - - DetId detid = hit->geographicalId(); - - //check that the hit is a real hit and not a constraint - if(hit->isValid() && hit==nullptr && detid.rawId()==0) continue; - - int verdict=checkHit(iSetup,detid,hit); - if (verdict == 0) { - // just copy the hit - hits.push_back(hit->clone()); - } - else if(verdict<-2){//hit rejected because did not pass the selections - // still, if replaceWithInactiveHits is true we have to put a new hit - if (replaceWithInactiveHits_) { - hits.push_back(new InvalidTrackingRecHit(*(hit->det()), TrackingRecHit::inactive)); - } - } - else if(verdict==-2) hits.push_back(hit->clone());//hit not in the tracker - else if(verdict==-1){ //hit not valid - if (!stripAllInvalidHits_) { - hits.push_back(hit->clone()); - } - } - } // loop on hits - -}//end TrackerTrackHitFilter::produceFromTrack - - -void TrackerTrackHitFilter::produceFromTrajectory(const edm::EventSetup &iSetup, const Trajectory *itt, std::vector&hits){ - hits.clear(); // extra safety - nOverlaps=0; - - //Retrieve tracker topology from geometry - edm::ESHandle tTopoHand; - iSetup.get().get(tTopoHand); - const TrackerTopology *tTopo=tTopoHand.product(); - - - std::vector tmColl =itt->measurements(); - - //---OverlapBegin needed eventually for overlaps, but I must create them here in any case - const TrajectoryMeasurement* previousTM(nullptr); - DetId previousId(0); - //int previousLayer(-1); - ///---OverlapEnd - - int constrhits=0; - - for(std::vector::const_iterator itTrajMeas = tmColl.begin(); itTrajMeas!=tmColl.end(); itTrajMeas++){ - TransientTrackingRecHit::ConstRecHitPointer hitpointer = itTrajMeas->recHit(); - - //check that the hit is a real hit and not a constraint - if(hitpointer->isValid() && hitpointer->hit()==nullptr){constrhits++; continue;} + TrajectoryStateOnSurface originalTsosOut( + trajectoryStateTransform::outerStateOnSurface(tk, *theGeometry, &*theMagField)); + state = trajectoryStateTransform::persistentState(originalTsosOut, DetId(tk.outerDetId())); + } + TrajectorySeed seed(state, TrackCandidate::RecHitContainer(), pdir); + TrackCandidate::RecHitContainer ownHits; + ownHits.reserve(hitsEnd - hitsBegin); + for (; hitsBegin != hitsEnd; ++hitsBegin) { + //if(! (*hitsBegin)->isValid() ) std::cout<<"Putting in the trackcandidate an INVALID HIT !"<geographicalId(); - int verdict=checkHit(iSetup,detid,hit); + TrackCandidate cand(ownHits, seed, state, tk.seedRef()); - if (verdict == 0) { - if( rejectLowAngleHits_ && !checkHitAngle(*itTrajMeas) ){//check angle of track on module if requested - verdict=-6;//override previous verdicts - } + return cand; } - /* + void TrackerTrackHitFilter::produceFromTrack(const edm::EventSetup &iSetup, + const Track *itt, + std::vector &hits) { + // loop on tracks + hits.clear(); // extra safety + + for (trackingRecHit_iterator ith = itt->recHitsBegin(), edh = itt->recHitsEnd(); ith != edh; ++ith) { + const TrackingRecHit *hit = (*ith); // ith is an iterator on edm::Ref to rechit + + DetId detid = hit->geographicalId(); + + //check that the hit is a real hit and not a constraint + if (hit->isValid() && hit == nullptr && detid.rawId() == 0) + continue; + + int verdict = checkHit(iSetup, detid, hit); + if (verdict == 0) { + // just copy the hit + hits.push_back(hit->clone()); + } else if (verdict < -2) { //hit rejected because did not pass the selections + // still, if replaceWithInactiveHits is true we have to put a new hit + if (replaceWithInactiveHits_) { + hits.push_back(new InvalidTrackingRecHit(*(hit->det()), TrackingRecHit::inactive)); + } + } else if (verdict == -2) + hits.push_back(hit->clone()); //hit not in the tracker + else if (verdict == -1) { //hit not valid + if (!stripAllInvalidHits_) { + hits.push_back(hit->clone()); + } + } + } // loop on hits + + } //end TrackerTrackHitFilter::produceFromTrack + + void TrackerTrackHitFilter::produceFromTrajectory(const edm::EventSetup &iSetup, + const Trajectory *itt, + std::vector &hits) { + hits.clear(); // extra safety + nOverlaps = 0; + + //Retrieve tracker topology from geometry + edm::ESHandle tTopoHand; + iSetup.get().get(tTopoHand); + const TrackerTopology *tTopo = tTopoHand.product(); + + std::vector tmColl = itt->measurements(); + + //---OverlapBegin needed eventually for overlaps, but I must create them here in any case + const TrajectoryMeasurement *previousTM(nullptr); + DetId previousId(0); + //int previousLayer(-1); + ///---OverlapEnd + + int constrhits = 0; + + for (std::vector::const_iterator itTrajMeas = tmColl.begin(); itTrajMeas != tmColl.end(); + itTrajMeas++) { + TransientTrackingRecHit::ConstRecHitPointer hitpointer = itTrajMeas->recHit(); + + //check that the hit is a real hit and not a constraint + if (hitpointer->isValid() && hitpointer->hit() == nullptr) { + constrhits++; + continue; + } + + const TrackingRecHit *hit = ((*hitpointer).hit()); + DetId detid = hit->geographicalId(); + int verdict = checkHit(iSetup, detid, hit); + + if (verdict == 0) { + if (rejectLowAngleHits_ && !checkHitAngle(*itTrajMeas)) { //check angle of track on module if requested + verdict = -6; //override previous verdicts + } + } + + /* //this has been included in checkHitAngle(*itTrajMeas) if (verdict == 0) { if( PXLcorrClusChargeCut_>0.0 && !checkPXLCorrClustCharge(*itTrajMeas) ){//check angle of track on module if requested @@ -633,315 +660,320 @@ void TrackerTrackHitFilter::produceFromTrajectory(const edm::EventSetup &iSetup, } */ - - if(verdict==0){// Hit TAKEN !!!! - - if(tagOverlaps_){ ///---OverlapBegin - //std::cout<<"Looking for overlaps in Run="< 2)?(SiStripDetId(detid).stereo()):2); - - if ( ( previousTM!=nullptr )&& (layer!=-1 )) { - //std::cout<<"A previous TM exists! "<::const_iterator itmCompare =itTrajMeas-1;itmCompare >= tmColl.begin() && itmCompare > itTrajMeas - 4;--itmCompare){ - - DetId compareId = itmCompare->recHit()->geographicalId(); - if ( subDet != compareId.subdetId() || - side != sideFromId(compareId,tTopo) || - layer != layerFromId(compareId,tTopo)) break; - if (!itmCompare->recHit()->isValid()) continue; - if(GeomDetEnumerators::isTrackerPixel(theGeometry->geomDetSubDetector(detid.subdetId())) || - (GeomDetEnumerators::isTrackerStrip(theGeometry->geomDetSubDetector(detid.subdetId())) && - SiStripDetId(detid).stereo()==SiStripDetId(compareId).stereo())) - {//if either pixel or strip stereo module - // overlapHits.push_back(std::make_pair(&(*itmCompare),&(*itm))); - //std::cout<< "Adding pair "<< ((subDet >2)?(SiStripDetId(detid).stereo()):2) - // << " from SubDet = "<clone()); //just copy it - }//end if HIT TAKEN - else if(verdict<-2){//hit rejected because did not pass the selections - // still, if replaceWithInactiveHits is true we have to put a new hit - if (replaceWithInactiveHits_) { - hits.push_back(new InvalidTrackingRecHit(*hit->det(), TrackingRecHit::inactive)); - } - } - else if(verdict==-2) hits.push_back(hit->clone());//hit not in the tracker - else if(verdict==-1){ //hit not valid - if (!stripAllInvalidHits_) { - hits.push_back(hit->clone()); - } - } - } // loop on hits - - std::reverse(hits.begin(),hits.end()); - // std::cout<<"Finished producefromTrajecotries. Nhits in final coll"<(therechit); - if (hit!=nullptr) cluster = &*(hit->cluster()); - else{ - edm::LogError("TrackerTrackHitFilter")<< "TrackerTrackHitFilter::checkStoN : Unknown valid tracker hit in subdet " << id.subdetId()<< "(detID="< 2_0_X because of hit splitting in stereo modules - //const SiStripMatchedRecHit2D* matchedhit = dynamic_cast(therechit); - //const ProjectedSiStripRecHit2D* unmatchedhit = dynamic_cast(therechit); - else{ - throw cms::Exception("Unknown RecHit Type") << "RecHit of type " << type.name() << - " not supported. (use c++filt to demangle the name)"; - } - - if(keepthishit){ - SiStripClusterInfo clusterInfo = SiStripClusterInfo( *cluster, iSetup, id.rawId()); - if ( (subdetStoNlowcut_[subdet_cnt-1]>0) && (clusterInfo.signalOverNoise() < subdetStoNlowcut_[subdet_cnt-1]) ) keepthishit = false; - if ( (subdetStoNhighcut_[subdet_cnt-1]>0) && (clusterInfo.signalOverNoise() > subdetStoNhighcut_[subdet_cnt-1]) ) keepthishit = false; - //if(!keepthishit)std::cout<<"Hit rejected because of bad S/N: "<2 - else if (GeomDetEnumerators::isTrackerPixel(theGeometry->geomDetSubDetector(id.subdetId()))){//pixel - //pixels have naturally a very low noise (because of their low capacitance). So the S/N cut is - //irrelevant in this case. Leave it dummy - keepthishit = true; - - /************** + if (verdict == 0) { // Hit TAKEN !!!! + + if (tagOverlaps_) { ///---OverlapBegin + //std::cout<<"Looking for overlaps in Run="< 2)?(SiStripDetId(detid).stereo()):2); + + if ((previousTM != nullptr) && (layer != -1)) { + //std::cout<<"A previous TM exists! "<::const_iterator itmCompare = itTrajMeas - 1; + itmCompare >= tmColl.begin() && itmCompare > itTrajMeas - 4; + --itmCompare) { + DetId compareId = itmCompare->recHit()->geographicalId(); + if (subDet != compareId.subdetId() || side != sideFromId(compareId, tTopo) || + layer != layerFromId(compareId, tTopo)) + break; + if (!itmCompare->recHit()->isValid()) + continue; + if (GeomDetEnumerators::isTrackerPixel(theGeometry->geomDetSubDetector(detid.subdetId())) || + (GeomDetEnumerators::isTrackerStrip(theGeometry->geomDetSubDetector(detid.subdetId())) && + SiStripDetId(detid).stereo() == + SiStripDetId(compareId).stereo())) { //if either pixel or strip stereo module + // overlapHits.push_back(std::make_pair(&(*itmCompare),&(*itm))); + //std::cout<< "Adding pair "<< ((subDet >2)?(SiStripDetId(detid).stereo()):2) + // << " from SubDet = "<clone()); //just copy it + } //end if HIT TAKEN + else if (verdict < -2) { //hit rejected because did not pass the selections + // still, if replaceWithInactiveHits is true we have to put a new hit + if (replaceWithInactiveHits_) { + hits.push_back(new InvalidTrackingRecHit(*hit->det(), TrackingRecHit::inactive)); + } + } else if (verdict == -2) + hits.push_back(hit->clone()); //hit not in the tracker + else if (verdict == -1) { //hit not valid + if (!stripAllInvalidHits_) { + hits.push_back(hit->clone()); + } + } + } // loop on hits + + std::reverse(hits.begin(), hits.end()); + // std::cout<<"Finished producefromTrajecotries. Nhits in final coll"<(therechit); + if (hit != nullptr) + cluster = &*(hit->cluster()); + else { + edm::LogError("TrackerTrackHitFilter") + << "TrackerTrackHitFilter::checkStoN : Unknown valid tracker hit in subdet " << id.subdetId() + << "(detID=" << id.rawId() << ")\n "; + keepthishit = false; + } + } + //the following two cases should not happen anymore since CMSSW > 2_0_X because of hit splitting in stereo modules + //const SiStripMatchedRecHit2D* matchedhit = dynamic_cast(therechit); + //const ProjectedSiStripRecHit2D* unmatchedhit = dynamic_cast(therechit); + else { + throw cms::Exception("Unknown RecHit Type") + << "RecHit of type " << type.name() << " not supported. (use c++filt to demangle the name)"; + } + + if (keepthishit) { + SiStripClusterInfo clusterInfo = SiStripClusterInfo(*cluster, iSetup, id.rawId()); + if ((subdetStoNlowcut_[subdet_cnt - 1] > 0) && + (clusterInfo.signalOverNoise() < subdetStoNlowcut_[subdet_cnt - 1])) + keepthishit = false; + if ((subdetStoNhighcut_[subdet_cnt - 1] > 0) && + (clusterInfo.signalOverNoise() > subdetStoNhighcut_[subdet_cnt - 1])) + keepthishit = false; + //if(!keepthishit)std::cout<<"Hit rejected because of bad S/N: "<2 + else if (GeomDetEnumerators::isTrackerPixel(theGeometry->geomDetSubDetector(id.subdetId()))) { //pixel + //pixels have naturally a very low noise (because of their low capacitance). So the S/N cut is + //irrelevant in this case. Leave it dummy + keepthishit = true; + + /************** * Cut on cluster charge corr by angle embedded in the checkHitAngle() function * *************/ - if(checkPXLQuality_){ - const SiPixelRecHit* pixelhit = dynamic_cast(therechit); - if(pixelhit!=nullptr){ - //std::cout << "ClusterCharge=" <cluster()->charge() << std::flush; - float xyprob=pixelhit->clusterProbability(0);//x-y combined log_e probability of the pixel cluster - //singl x- and y-prob not stored sicne CMSSW 3_9_0 - float xychargeprob =pixelhit->clusterProbability(1);//xy-prob * charge prob - // float chargeprob =pixelhit->clusterProbability(2);//charge prob - bool haspassed_tplreco= pixelhit->hasFilledProb(); //the cluster was associted to a template - int qbin =pixelhit->qBin(); //R==meas_charge/pred_charge: Qbin=0 ->R>1.5 , =1->10.850.95*Qminpred, =5->meas_charge<0.95*Qminpred - - // if(haspassed_tplreco) std::cout<<" CLUSTPROB=\t"<pxlTPLProbXY_ && xychargeprob>pxlTPLProbXYQ_ && qbin>pxlTPLqBin_[0] && qbin<=pxlTPLqBin_[1] )keepthishit = true; - + if (checkPXLQuality_) { + const SiPixelRecHit *pixelhit = dynamic_cast(therechit); + if (pixelhit != nullptr) { + //std::cout << "ClusterCharge=" <cluster()->charge() << std::flush; + float xyprob = pixelhit->clusterProbability(0); //x-y combined log_e probability of the pixel cluster + //singl x- and y-prob not stored sicne CMSSW 3_9_0 + float xychargeprob = pixelhit->clusterProbability(1); //xy-prob * charge prob + // float chargeprob =pixelhit->clusterProbability(2);//charge prob + bool haspassed_tplreco = pixelhit->hasFilledProb(); //the cluster was associted to a template + int qbin = pixelhit->qBin(); //R==meas_charge/pred_charge: Qbin=0 ->R>1.5 , =1->10.850.95*Qminpred, =5->meas_charge<0.95*Qminpred + + // if(haspassed_tplreco) std::cout<<" CLUSTPROB=\t"< pxlTPLProbXY_ && xychargeprob > pxlTPLProbXYQ_ && qbin > pxlTPLqBin_[0] && + qbin <= pxlTPLqBin_[1]) + keepthishit = true; + + } else { + edm::LogInfo("TrackerTrackHitFilter") << "HIT IN PIXEL (" << subdet_cnt << ") but PixelRecHit is EMPTY!!!"; + } + } //end if check pixel quality flag } - else {edm::LogInfo("TrackerTrackHitFilter")<<"HIT IN PIXEL ("<=TrackAngleCut_) angle_ok=true;// keep this hit - // else std::cout<<"Hit rejected because angle is "<< angle<<" ( <"<0.0){ - // - //get the hit from the TM and check that it is in the pixel - const TransientTrackingRecHit::ConstRecHitPointer& hitpointer = meas.recHit(); - if(hitpointer->isValid()){ - const TrackingRecHit *hit=(*hitpointer).hit(); - if(GeomDetEnumerators::isTrackerPixel(theGeometry->geomDetSubDetector(hit->geographicalId().subdetId()))) {//do it only for pixel hits - corrcharge_ok=false; - float clust_alpha= atan2( mom_z, mom_x ); - float clust_beta= atan2( mom_z, mom_y ); - - //Now get the cluster charge - - const SiPixelRecHit* pixelhit = dynamic_cast(hit); - float clust_charge=pixelhit->cluster()->charge(); - float corr_clust_charge=clust_charge * sqrt( 1.0 / ( 1.0/pow( tan(clust_alpha), 2 ) + - 1.0/pow( tan(clust_beta ), 2 ) + - 1.0 ) - ); - //std::cout<<"xxxxx "<qBin()<<" "<clusterProbability(1)<<" "<clusterProbability(2)<< std::endl; - if(corr_clust_charge>PXLcorrClusChargeCut_){ - corrcharge_ok=true; - } - } //end if hit is in pixel - }//end if hit is valid - - }//check corr cluster charge for pixel hits - - }//end if TSOS is valid - else{ - edm::LogWarning("TrackerTrackHitFilter") <<"TSOS not valid ! Impossible to calculate track angle."; - } - - return angle_ok&&corrcharge_ok; -}//end TrackerTrackHitFilter::checkHitAngle - - -bool TrackerTrackHitFilter::checkPXLCorrClustCharge(const TrajectoryMeasurement &meas){ - /* - Code taken from DPGAnalysis/SiPixelTools/plugins/PixelNtuplizer_RealData.cc - */ - - bool corrcharge_ok=false; - //get the hit from the TM and check that it is in the pixel - const TransientTrackingRecHit::ConstRecHitPointer& hitpointer = meas.recHit(); - if(!hitpointer->isValid()) return corrcharge_ok; - const TrackingRecHit *hit=(*hitpointer).hit(); - if(GeomDetEnumerators::isTrackerStrip(theGeometry->geomDetSubDetector(hit->geographicalId().subdetId()))) {//SiStrip hit, skip - return corrcharge_ok; - } + if (tsos.isValid()) { + //check the angle of this tsos + float mom_x = tsos.localDirection().x(); + float mom_y = tsos.localDirection().y(); + float mom_z = tsos.localDirection().z(); + //we took LOCAL momentum, i.e. respect to surface. Thus the plane is z=0 + float angle = TMath::ASin(TMath::Abs(mom_z) / sqrt(pow(mom_x, 2) + pow(mom_y, 2) + pow(mom_z, 2))); + if (!rejectLowAngleHits_ || angle >= TrackAngleCut_) + angle_ok = true; // keep this hit + // else std::cout<<"Hit rejected because angle is "<< angle<<" ( <"< 0.0) { + // + //get the hit from the TM and check that it is in the pixel + const TransientTrackingRecHit::ConstRecHitPointer &hitpointer = meas.recHit(); + if (hitpointer->isValid()) { + const TrackingRecHit *hit = (*hitpointer).hit(); + if (GeomDetEnumerators::isTrackerPixel( + theGeometry->geomDetSubDetector(hit->geographicalId().subdetId()))) { //do it only for pixel hits + corrcharge_ok = false; + float clust_alpha = atan2(mom_z, mom_x); + float clust_beta = atan2(mom_z, mom_y); + + //Now get the cluster charge + + const SiPixelRecHit *pixelhit = dynamic_cast(hit); + float clust_charge = pixelhit->cluster()->charge(); + float corr_clust_charge = + clust_charge * sqrt(1.0 / (1.0 / pow(tan(clust_alpha), 2) + 1.0 / pow(tan(clust_beta), 2) + 1.0)); + //std::cout<<"xxxxx "<qBin()<<" "<clusterProbability(1)<<" "<clusterProbability(2)<< std::endl; + if (corr_clust_charge > PXLcorrClusChargeCut_) { + corrcharge_ok = true; + } + } //end if hit is in pixel + } //end if hit is valid + + } //check corr cluster charge for pixel hits + + } //end if TSOS is valid + else { + edm::LogWarning("TrackerTrackHitFilter") << "TSOS not valid ! Impossible to calculate track angle."; + } - const TrajectoryStateOnSurface& tsos = meas.updatedState(); - if(tsos.isValid()){ - float mom_x=tsos.localDirection().x(); - float mom_y=tsos.localDirection().y(); - float mom_z=tsos.localDirection().z(); - float clust_alpha= atan2( mom_z, mom_x ); - float clust_beta= atan2( mom_z, mom_y ); + return angle_ok && corrcharge_ok; + } //end TrackerTrackHitFilter::checkHitAngle - //Now get the cluster charge + bool TrackerTrackHitFilter::checkPXLCorrClustCharge(const TrajectoryMeasurement &meas) { + /* + Code taken from DPGAnalysis/SiPixelTools/plugins/PixelNtuplizer_RealData.cc + */ - const SiPixelRecHit* pixelhit = dynamic_cast(hit); - float clust_charge=pixelhit->cluster()->charge(); - float corr_clust_charge=clust_charge * sqrt( 1.0 / ( 1.0/pow( tan(clust_alpha), 2 ) + - 1.0/pow( tan(clust_beta ), 2 ) + - 1.0 ) - ); - if(corr_clust_charge>PXLcorrClusChargeCut_)corrcharge_ok=true; + bool corrcharge_ok = false; + //get the hit from the TM and check that it is in the pixel + const TransientTrackingRecHit::ConstRecHitPointer &hitpointer = meas.recHit(); + if (!hitpointer->isValid()) + return corrcharge_ok; + const TrackingRecHit *hit = (*hitpointer).hit(); + if (GeomDetEnumerators::isTrackerStrip( + theGeometry->geomDetSubDetector(hit->geographicalId().subdetId()))) { //SiStrip hit, skip + return corrcharge_ok; + } - }//end if TSOS is valid - return corrcharge_ok; + const TrajectoryStateOnSurface &tsos = meas.updatedState(); + if (tsos.isValid()) { + float mom_x = tsos.localDirection().x(); + float mom_y = tsos.localDirection().y(); + float mom_z = tsos.localDirection().z(); + float clust_alpha = atan2(mom_z, mom_x); + float clust_beta = atan2(mom_z, mom_y); -}//end TrackerTrackHitFilter::checkPXLCorrClustCharge + //Now get the cluster charge + const SiPixelRecHit *pixelhit = dynamic_cast(hit); + float clust_charge = pixelhit->cluster()->charge(); + float corr_clust_charge = + clust_charge * sqrt(1.0 / (1.0 / pow(tan(clust_alpha), 2) + 1.0 / pow(tan(clust_beta), 2) + 1.0)); + if (corr_clust_charge > PXLcorrClusChargeCut_) + corrcharge_ok = true; + } //end if TSOS is valid + return corrcharge_ok; -int TrackerTrackHitFilter::layerFromId (const DetId& id, const TrackerTopology *tTopo) const -{ - return tTopo->layer(id); -} + } //end TrackerTrackHitFilter::checkPXLCorrClustCharge -int TrackerTrackHitFilter::sideFromId (const DetId& id, const TrackerTopology *tTopo) const -{ - return tTopo->side(id); -} + int TrackerTrackHitFilter::layerFromId(const DetId &id, const TrackerTopology *tTopo) const { + return tTopo->layer(id); + } -}} //namespaces + int TrackerTrackHitFilter::sideFromId(const DetId &id, const TrackerTopology *tTopo) const { + return tTopo->side(id); + } + } // namespace modules +} // namespace reco // ========= MODULE DEF ============== #include "FWCore/PluginManager/interface/ModuleDef.h" diff --git a/RecoTracker/FinalTrackSelectors/plugins/getBestVertex.h b/RecoTracker/FinalTrackSelectors/plugins/getBestVertex.h index 7d7ac6cc80bbf..2bf8f4f04db5a 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/getBestVertex.h +++ b/RecoTracker/FinalTrackSelectors/plugins/getBestVertex.h @@ -3,47 +3,46 @@ #include "DataFormats/VertexReco/interface/VertexFwd.h" #include - using Point = math::XYZPoint; - - inline - Point getBestVertex(reco::Track const & trk, reco::VertexCollection const & vertices, const size_t minNtracks = 2) { - - Point p_dz(0,0,-99999); - float dzmin = std::numeric_limits::max(); - for(auto const & vertex : vertices) { - size_t tracks = vertex.tracksSize(); - if (tracks < minNtracks) { +using Point = math::XYZPoint; + +inline Point getBestVertex(reco::Track const& trk, + reco::VertexCollection const& vertices, + const size_t minNtracks = 2) { + Point p_dz(0, 0, -99999); + float dzmin = std::numeric_limits::max(); + for (auto const& vertex : vertices) { + size_t tracks = vertex.tracksSize(); + if (tracks < minNtracks) { continue; } - float dz = std::abs(trk.dz(vertex.position())); - if(dz < dzmin){ - p_dz = vertex.position(); - dzmin = dz; - } + float dz = std::abs(trk.dz(vertex.position())); + if (dz < dzmin) { + p_dz = vertex.position(); + dzmin = dz; } - - return p_dz; - } - inline - Point getBestVertex_withError(reco::Track const & trk, reco::VertexCollection const & vertices, Point& error, const size_t minNtracks = 2) { - - Point p_dz(0,0,-99999); - float dzmin = std::numeric_limits::max(); - for(auto const & vertex : vertices) { - size_t tracks = vertex.tracksSize(); - if (tracks < minNtracks) { + return p_dz; +} + +inline Point getBestVertex_withError(reco::Track const& trk, + reco::VertexCollection const& vertices, + Point& error, + const size_t minNtracks = 2) { + Point p_dz(0, 0, -99999); + float dzmin = std::numeric_limits::max(); + for (auto const& vertex : vertices) { + size_t tracks = vertex.tracksSize(); + if (tracks < minNtracks) { continue; } - float dz = std::abs(trk.dz(vertex.position())); - if(dz < dzmin){ - p_dz = vertex.position(); - error.SetXYZ(vertex.xError(),vertex.yError(),vertex.zError()); - dzmin = dz; - } + float dz = std::abs(trk.dz(vertex.position())); + if (dz < dzmin) { + p_dz = vertex.position(); + error.SetXYZ(vertex.xError(), vertex.yError(), vertex.zError()); + dzmin = dz; } - - return p_dz; - } + + return p_dz; +} diff --git a/RecoTracker/FinalTrackSelectors/plugins/powN.h b/RecoTracker/FinalTrackSelectors/plugins/powN.h index 90d99281031db..150f193f3a2f7 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/powN.h +++ b/RecoTracker/FinalTrackSelectors/plugins/powN.h @@ -1,41 +1,58 @@ #include namespace { - // not a generic solution (wrong for N negative for instance) - template - struct PowN { - template - static T op(T t) { return PowN::op(t)*PowN<(N+1)/2>::op(t);} - }; - template<> - struct PowN<0> { - template - static T op(T t) { return T(1);} + // not a generic solution (wrong for N negative for instance) + template + struct PowN { + template + static T op(T t) { + return PowN::op(t) * PowN<(N + 1) / 2>::op(t); + } }; - template<> - struct PowN<1> { - template - static T op(T t) { return t;} + template <> + struct PowN<0> { + template + static T op(T t) { + return T(1); + } }; - template<> - struct PowN<2> { - template - static T op(T t) { return t*t;} + template <> + struct PowN<1> { + template + static T op(T t) { + return t; + } }; - - template - T powN(T t, int n) { - switch(n) { - case 4: return PowN<4>::op(t); // the only one that matters - case 3: return PowN<3>::op(t); // and this - case 8: return PowN<8>::op(t); // used in conversion???? - case 2: return PowN<2>::op(t); - case 5: return PowN<5>::op(t); - case 6: return PowN<6>::op(t); - case 7: return PowN<7>::op(t); - case 0: return PowN<0>::op(t); - case 1: return PowN<1>::op(t); - default : return std::pow(t,T(n)); + template <> + struct PowN<2> { + template + static T op(T t) { + return t * t; } - } -} + }; + template + T powN(T t, int n) { + switch (n) { + case 4: + return PowN<4>::op(t); // the only one that matters + case 3: + return PowN<3>::op(t); // and this + case 8: + return PowN<8>::op(t); // used in conversion???? + case 2: + return PowN<2>::op(t); + case 5: + return PowN<5>::op(t); + case 6: + return PowN<6>::op(t); + case 7: + return PowN<7>::op(t); + case 0: + return PowN<0>::op(t); + case 1: + return PowN<1>::op(t); + default: + return std::pow(t, T(n)); + } + } +} // namespace diff --git a/RecoTracker/FinalTrackSelectors/src/TrackAlgoPriorityOrder.cc b/RecoTracker/FinalTrackSelectors/src/TrackAlgoPriorityOrder.cc index 719fe67e46505..7f99990f8019c 100644 --- a/RecoTracker/FinalTrackSelectors/src/TrackAlgoPriorityOrder.cc +++ b/RecoTracker/FinalTrackSelectors/src/TrackAlgoPriorityOrder.cc @@ -5,11 +5,10 @@ #include "trackAlgoPriorityOrder.h" - -TrackAlgoPriorityOrder::TrackAlgoPriorityOrder(const std::vector& algoOrder): - priority_(trackAlgoPriorityOrder) { +TrackAlgoPriorityOrder::TrackAlgoPriorityOrder(const std::vector& algoOrder) + : priority_(trackAlgoPriorityOrder) { // with less than 1 element there is nothing to do - if(algoOrder.size() <= 1) + if (algoOrder.size() <= 1) return; // Reordering the algo priorities is just a matter of taking the @@ -20,13 +19,13 @@ TrackAlgoPriorityOrder::TrackAlgoPriorityOrder(const std::vector priorities; priorities.reserve(algoOrder.size()); - for(const auto algo: algoOrder) { + for (const auto algo : algoOrder) { priorities.push_back(trackAlgoPriorityOrder[algo]); } std::sort(priorities.begin(), priorities.end()); - for(size_t i=0, end=priorities.size(); i!=end; ++i) { + for (size_t i = 0, end = priorities.size(); i != end; ++i) { priority_[algoOrder[i]] = priorities[i]; } } diff --git a/RecoTracker/FinalTrackSelectors/src/TrackCollectionCloner.cc b/RecoTracker/FinalTrackSelectors/src/TrackCollectionCloner.cc index 439f79bacad0e..7d9d12ee069c9 100644 --- a/RecoTracker/FinalTrackSelectors/src/TrackCollectionCloner.cc +++ b/RecoTracker/FinalTrackSelectors/src/TrackCollectionCloner.cc @@ -1,82 +1,84 @@ #include "RecoTracker/FinalTrackSelectors/interface/TrackCollectionCloner.h" -void -TrackCollectionCloner::fill(edm::ParameterSetDescription& desc) { - desc.addUntracked("copyExtras", true); - desc.addUntracked("copyTrajectories",false); +void TrackCollectionCloner::fill(edm::ParameterSetDescription& desc) { + desc.addUntracked("copyExtras", true); + desc.addUntracked("copyTrajectories", false); } -TrackCollectionCloner::Producer::Producer(edm::Event& ievt, TrackCollectionCloner const & cloner) : - copyExtras_(cloner.copyExtras_), copyTrajectories_(cloner.copyTrajectories_), evt(ievt) { +TrackCollectionCloner::Producer::Producer(edm::Event& ievt, TrackCollectionCloner const& cloner) + : copyExtras_(cloner.copyExtras_), copyTrajectories_(cloner.copyTrajectories_), evt(ievt) { selTracks_ = std::make_unique(); if (copyExtras_) { selTrackExtras_ = std::make_unique(); selHits_ = std::make_unique(); } - if ( copyTrajectories_ ) { - selTrajs_ = std::make_unique< std::vector >(); - selTTAss_ = std::make_unique< TrajTrackAssociationCollection >(evt.getRefBeforePut< std::vector >(), evt.getRefBeforePut()); + if (copyTrajectories_) { + selTrajs_ = std::make_unique >(); + selTTAss_ = std::make_unique(evt.getRefBeforePut >(), + evt.getRefBeforePut()); } - } - /// process one event -void TrackCollectionCloner::Producer::operator()(Tokens const & tokens, std::vector const & selected) { - +void TrackCollectionCloner::Producer::operator()(Tokens const& tokens, std::vector const& selected) { auto rTracks = evt.getRefBeforePut(); - + TrackingRecHitRefProd rHits; reco::TrackExtraRefProd rTrackExtras; if (copyExtras_) { rHits = evt.getRefBeforePut(); rTrackExtras = evt.getRefBeforePut(); } - - edm::RefProd< std::vector > trajRefProd; - if ( copyTrajectories_ ) { - trajRefProd = evt.getRefBeforePut< std::vector >(); + + edm::RefProd > trajRefProd; + if (copyTrajectories_) { + trajRefProd = evt.getRefBeforePut >(); } std::vector dummy; - auto const & trajIn = copyTrajectories_ ? tokens.trajectories(evt) : dummy; - - auto const & tracksIn = tokens.tracks(evt); + auto const& trajIn = copyTrajectories_ ? tokens.trajectories(evt) : dummy; + + auto const& tracksIn = tokens.tracks(evt); for (auto k : selected) { - auto const & trk = tracksIn[k]; - selTracks_->emplace_back( trk ); // clone and store + auto const& trk = tracksIn[k]; + selTracks_->emplace_back(trk); // clone and store if (copyTrajectories_) { - // we assume tracks and trajectories are one-to-one and the assocMap is useless + // we assume tracks and trajectories are one-to-one and the assocMap is useless selTrajs_->emplace_back(trajIn[k]); - assert(selTrajs_->back().measurements().size()==trk.recHitsSize()); - selTTAss_->insert ( edm::Ref< std::vector >(trajRefProd, selTrajs_->size() - 1), - reco::TrackRef(rTracks, selTracks_->size() - 1) - ); + assert(selTrajs_->back().measurements().size() == trk.recHitsSize()); + selTTAss_->insert(edm::Ref >(trajRefProd, selTrajs_->size() - 1), + reco::TrackRef(rTracks, selTracks_->size() - 1)); } - - if (!copyExtras_) continue; - + + if (!copyExtras_) + continue; + // TrackExtras - selTrackExtras_->emplace_back( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(), - trk.innerPosition(), trk.innerMomentum(), trk.innerOk(), - trk.outerStateCovariance(), trk.outerDetId(), - trk.innerStateCovariance(), trk.innerDetId(), - trk.seedDirection(), trk.seedRef() - ); - selTracks_->back().setExtra( reco::TrackExtraRef( rTrackExtras, selTrackExtras_->size() - 1) ); - auto & tx = selTrackExtras_->back(); + selTrackExtras_->emplace_back(trk.outerPosition(), + trk.outerMomentum(), + trk.outerOk(), + trk.innerPosition(), + trk.innerMomentum(), + trk.innerOk(), + trk.outerStateCovariance(), + trk.outerDetId(), + trk.innerStateCovariance(), + trk.innerDetId(), + trk.seedDirection(), + trk.seedRef()); + selTracks_->back().setExtra(reco::TrackExtraRef(rTrackExtras, selTrackExtras_->size() - 1)); + auto& tx = selTrackExtras_->back(); tx.setResiduals(trk.residuals()); - auto nh1=trk.recHitsSize(); - tx.setHits(rHits,selHits_->size(),nh1); - tx.setTrajParams(trk.extra()->trajParams(),trk.extra()->chi2sX5()); - assert(tx.trajParams().size()==tx.recHitsSize()); + auto nh1 = trk.recHitsSize(); + tx.setHits(rHits, selHits_->size(), nh1); + tx.setTrajParams(trk.extra()->trajParams(), trk.extra()->chi2sX5()); + assert(tx.trajParams().size() == tx.recHitsSize()); // TrackingRecHits - for( auto hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit ) { - selHits_->push_back( (*hit)->clone() ); + for (auto hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++hit) { + selHits_->push_back((*hit)->clone()); } } - } TrackCollectionCloner::Producer::~Producer() { @@ -85,17 +87,16 @@ TrackCollectionCloner::Producer::~Producer() { evt.put(std::move(selTracks_)); if (copyExtras_) { selTrackExtras_->shrink_to_fit(); - assert(selTrackExtras_->size()==tsize); + assert(selTrackExtras_->size() == tsize); selHits_->shrink_to_fit(); evt.put(std::move(selTrackExtras_)); evt.put(std::move(selHits_)); } - if ( copyTrajectories_ ) { + if (copyTrajectories_) { selTrajs_->shrink_to_fit(); - assert(selTrajs_->size()==tsize); - assert(selTTAss_->size()==tsize); + assert(selTrajs_->size() == tsize); + assert(selTTAss_->size() == tsize); evt.put(std::move(selTrajs_)); evt.put(std::move(selTTAss_)); - } } diff --git a/RecoTracker/FinalTrackSelectors/src/TrackMVAClassifierBase.cc b/RecoTracker/FinalTrackSelectors/src/TrackMVAClassifierBase.cc index fd1eb7dcaee78..1d715e62aa9e2 100644 --- a/RecoTracker/FinalTrackSelectors/src/TrackMVAClassifierBase.cc +++ b/RecoTracker/FinalTrackSelectors/src/TrackMVAClassifierBase.cc @@ -5,43 +5,38 @@ #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/VertexReco/interface/Vertex.h" -#include +#include - -void TrackMVAClassifierBase::fill( edm::ParameterSetDescription& desc) { - desc.add("src",edm::InputTag()); - desc.add("beamspot",edm::InputTag("offlineBeamSpot")); - desc.add("vertices",edm::InputTag("firstStepPrimaryVertices")); - desc.add("ignoreVertices",false); +void TrackMVAClassifierBase::fill(edm::ParameterSetDescription& desc) { + desc.add("src", edm::InputTag()); + desc.add("beamspot", edm::InputTag("offlineBeamSpot")); + desc.add("vertices", edm::InputTag("firstStepPrimaryVertices")); + desc.add("ignoreVertices", false); // default cuts for "cut based classification" std::vector cuts = {-.7, 0.1, .7}; desc.add>("qualityCuts", cuts); } +TrackMVAClassifierBase::~TrackMVAClassifierBase() {} -TrackMVAClassifierBase::~TrackMVAClassifierBase(){} - -TrackMVAClassifierBase::TrackMVAClassifierBase( const edm::ParameterSet & cfg ) : - src_ ( consumes (cfg.getParameter( "src" )) ), - beamspot_( consumes (cfg.getParameter( "beamspot" )) ), - vertices_( mayConsume(cfg.getParameter( "vertices" )) ), - ignoreVertices_( cfg.getParameter( "ignoreVertices" ) ) { +TrackMVAClassifierBase::TrackMVAClassifierBase(const edm::ParameterSet& cfg) + : src_(consumes(cfg.getParameter("src"))), + beamspot_(consumes(cfg.getParameter("beamspot"))), + vertices_(mayConsume(cfg.getParameter("vertices"))), + ignoreVertices_(cfg.getParameter("ignoreVertices")) { + auto const& qv = cfg.getParameter>("qualityCuts"); + assert(qv.size() == 3); + std::copy(std::begin(qv), std::end(qv), std::begin(qualityCuts)); - auto const & qv = cfg.getParameter>("qualityCuts"); - assert(qv.size()==3); - std::copy(std::begin(qv),std::end(qv),std::begin(qualityCuts)); - produces("MVAValues"); produces("QualityMasks"); - } -void TrackMVAClassifierBase::produce(edm::Event& evt, const edm::EventSetup& es ) { - - // Get tracks +void TrackMVAClassifierBase::produce(edm::Event& evt, const edm::EventSetup& es) { + // Get tracks edm::Handle hSrcTrack; - evt.getByToken(src_, hSrcTrack ); - auto const & tracks(*hSrcTrack); + evt.getByToken(src_, hSrcTrack); + auto const& tracks(*hSrcTrack); // looking for the beam spot edm::Handle hBsp; @@ -54,38 +49,35 @@ void TrackMVAClassifierBase::produce(edm::Event& evt, const edm::EventSetup& es initEvent(es); // products - auto mvaPairs = std::make_unique(tracks.size(),std::make_pair(-99.f,true)); - auto mvas = std::make_unique(tracks.size(),-99.f); - auto quals = std::make_unique(tracks.size(),0); + auto mvaPairs = std::make_unique(tracks.size(), std::make_pair(-99.f, true)); + auto mvas = std::make_unique(tracks.size(), -99.f); + auto quals = std::make_unique(tracks.size(), 0); - if ( hVtx.isValid() && !ignoreVertices_ ) { - computeMVA(tracks,*hBsp,*hVtx,*mvaPairs); + if (hVtx.isValid() && !ignoreVertices_) { + computeMVA(tracks, *hBsp, *hVtx, *mvaPairs); } else { - if ( !ignoreVertices_ ) - edm::LogWarning("TrackMVAClassifierBase") << "ignoreVertices is set to False in the configuration, but the vertex collection is not valid"; + if (!ignoreVertices_) + edm::LogWarning("TrackMVAClassifierBase") + << "ignoreVertices is set to False in the configuration, but the vertex collection is not valid"; std::vector vertices; - computeMVA(tracks,*hBsp,vertices,*mvaPairs); - } - assert((*mvaPairs).size()==tracks.size()); + computeMVA(tracks, *hBsp, vertices, *mvaPairs); + } + assert((*mvaPairs).size() == tracks.size()); - unsigned int k=0; + unsigned int k = 0; for (auto const& output : *mvaPairs) { - if(output.second){ + if (output.second) { (*mvas)[k] = output.first; - }else{ + } else { // If the MVA value is known to be unreliable, force into generalTracks collection - (*mvas)[k] = std::max(output.first, float(qualityCuts[0]+0.001)); + (*mvas)[k] = std::max(output.first, float(qualityCuts[0] + 0.001)); } float mva = (*mvas)[k]; - (*quals)[k++] - = (mva>qualityCuts[0]) << reco::TrackBase::loose - | (mva>qualityCuts[1]) << reco::TrackBase::tight - | (mva>qualityCuts[2]) << reco::TrackBase::highPurity - ; + (*quals)[k++] = (mva > qualityCuts[0]) << reco::TrackBase::loose | + (mva > qualityCuts[1]) << reco::TrackBase::tight | + (mva > qualityCuts[2]) << reco::TrackBase::highPurity; } - - evt.put(std::move(mvas),"MVAValues"); - evt.put(std::move(quals),"QualityMasks"); - + evt.put(std::move(mvas), "MVAValues"); + evt.put(std::move(quals), "QualityMasks"); } diff --git a/RecoTracker/FinalTrackSelectors/src/trackAlgoPriorityOrder.h b/RecoTracker/FinalTrackSelectors/src/trackAlgoPriorityOrder.h index 96fa6d2dc9e48..699be7d912c72 100644 --- a/RecoTracker/FinalTrackSelectors/src/trackAlgoPriorityOrder.h +++ b/RecoTracker/FinalTrackSelectors/src/trackAlgoPriorityOrder.h @@ -25,56 +25,55 @@ namespace impl { * each reco::TrackBase::TrackAlgorithm enumerator should be in the * array exactly once (checked below in findIndex() function). */ - constexpr reco::TrackBase::TrackAlgorithm algoPriorityOrder[] ={ - reco::TrackBase::undefAlgorithm, - reco::TrackBase::ctf, - reco::TrackBase::cosmics, - reco::TrackBase::duplicateMerge, - reco::TrackBase::initialStep, - reco::TrackBase::highPtTripletStep, - reco::TrackBase::detachedQuadStep, - reco::TrackBase::detachedTripletStep, - reco::TrackBase::lowPtQuadStep, - reco::TrackBase::lowPtTripletStep, - reco::TrackBase::pixelPairStep, - reco::TrackBase::mixedTripletStep, - reco::TrackBase::pixelLessStep, - reco::TrackBase::tobTecStep, - reco::TrackBase::jetCoreRegionalStep, - reco::TrackBase::conversionStep, - reco::TrackBase::muonSeededStepInOut, - reco::TrackBase::muonSeededStepOutIn, - reco::TrackBase::outInEcalSeededConv, - reco::TrackBase::inOutEcalSeededConv, - reco::TrackBase::nuclInter, - reco::TrackBase::standAloneMuon, - reco::TrackBase::globalMuon, - reco::TrackBase::cosmicStandAloneMuon, - reco::TrackBase::cosmicGlobalMuon, - reco::TrackBase::reservedForUpgrades1, - reco::TrackBase::reservedForUpgrades2, - reco::TrackBase::bTagGhostTracks, - reco::TrackBase::beamhalo, - reco::TrackBase::gsf, - reco::TrackBase::hltPixel, - reco::TrackBase::hltIter0, - reco::TrackBase::hltIter1, - reco::TrackBase::hltIter2, - reco::TrackBase::hltIter3, - reco::TrackBase::hltIter4, - reco::TrackBase::hltIterX, - reco::TrackBase::hiRegitMuInitialStep, - reco::TrackBase::hiRegitMuPixelPairStep, - reco::TrackBase::hiRegitMuMixedTripletStep, - reco::TrackBase::hiRegitMuPixelLessStep, - reco::TrackBase::hiRegitMuDetachedTripletStep, - reco::TrackBase::hiRegitMuMuonSeededStepInOut, - reco::TrackBase::hiRegitMuMuonSeededStepOutIn, - reco::TrackBase::hiRegitMuLowPtTripletStep, - reco::TrackBase::hiRegitMuTobTecStep - }; - - static_assert(reco::TrackBase::algoSize == sizeof(algoPriorityOrder)/sizeof(unsigned int), "Please update me too after adding new enumerators to reco::TrackBase::TrackAlgorithm"); + constexpr reco::TrackBase::TrackAlgorithm algoPriorityOrder[] = {reco::TrackBase::undefAlgorithm, + reco::TrackBase::ctf, + reco::TrackBase::cosmics, + reco::TrackBase::duplicateMerge, + reco::TrackBase::initialStep, + reco::TrackBase::highPtTripletStep, + reco::TrackBase::detachedQuadStep, + reco::TrackBase::detachedTripletStep, + reco::TrackBase::lowPtQuadStep, + reco::TrackBase::lowPtTripletStep, + reco::TrackBase::pixelPairStep, + reco::TrackBase::mixedTripletStep, + reco::TrackBase::pixelLessStep, + reco::TrackBase::tobTecStep, + reco::TrackBase::jetCoreRegionalStep, + reco::TrackBase::conversionStep, + reco::TrackBase::muonSeededStepInOut, + reco::TrackBase::muonSeededStepOutIn, + reco::TrackBase::outInEcalSeededConv, + reco::TrackBase::inOutEcalSeededConv, + reco::TrackBase::nuclInter, + reco::TrackBase::standAloneMuon, + reco::TrackBase::globalMuon, + reco::TrackBase::cosmicStandAloneMuon, + reco::TrackBase::cosmicGlobalMuon, + reco::TrackBase::reservedForUpgrades1, + reco::TrackBase::reservedForUpgrades2, + reco::TrackBase::bTagGhostTracks, + reco::TrackBase::beamhalo, + reco::TrackBase::gsf, + reco::TrackBase::hltPixel, + reco::TrackBase::hltIter0, + reco::TrackBase::hltIter1, + reco::TrackBase::hltIter2, + reco::TrackBase::hltIter3, + reco::TrackBase::hltIter4, + reco::TrackBase::hltIterX, + reco::TrackBase::hiRegitMuInitialStep, + reco::TrackBase::hiRegitMuPixelPairStep, + reco::TrackBase::hiRegitMuMixedTripletStep, + reco::TrackBase::hiRegitMuPixelLessStep, + reco::TrackBase::hiRegitMuDetachedTripletStep, + reco::TrackBase::hiRegitMuMuonSeededStepInOut, + reco::TrackBase::hiRegitMuMuonSeededStepOutIn, + reco::TrackBase::hiRegitMuLowPtTripletStep, + reco::TrackBase::hiRegitMuTobTecStep}; + + static_assert(reco::TrackBase::algoSize == sizeof(algoPriorityOrder) / sizeof(unsigned int), + "Please update me too after adding new enumerators to reco::TrackBase::TrackAlgorithm"); /** * Recursive implementation of searching the index of an algorithm in the algoPriorityOrder @@ -99,10 +98,7 @@ namespace impl { * * @see findIndex() */ - constexpr unsigned int priorityForAlgo(const reco::TrackBase::TrackAlgorithm algo) { - return findIndex(algo, 0); - } - + constexpr unsigned int priorityForAlgo(const reco::TrackBase::TrackAlgorithm algo) { return findIndex(algo, 0); } /** * Helper template to initialize std::array compile-time. @@ -121,10 +117,10 @@ namespace impl { */ template struct MakeArray { - template - constexpr static - std::array value(Args&&... args) { - return MakeArray::value(priorityForAlgo(static_cast(I-1)), std::forward(args)...); + template + constexpr static std::array value(Args&&... args) { + return MakeArray::value(priorityForAlgo(static_cast(I - 1)), + std::forward(args)...); } }; @@ -133,14 +129,12 @@ namespace impl { */ template struct MakeArray { - template - constexpr static - std::array value(Args&&... args) { + template + constexpr static std::array value(Args&&... args) { return std::array{{std::forward(args)...}}; } }; - /** * Create compile-time an std::array mapping * reco::TrackBase::TrackAlgorithm enumerators to their order @@ -150,19 +144,17 @@ namespace impl { * @tparam N Size of the std::array */ template - constexpr - std::array makeArray() { + constexpr std::array makeArray() { return MakeArray::value(); } -} +} // namespace impl /** * Array mapping reco::TrackBase::TrackAlgorithm enumerators to their * order priorities in track list merging. */ -constexpr std::array trackAlgoPriorityOrder = impl::makeArray(); - - -#endif // DataFormats_TrackReco_trackAlgoPriorityOrder_h +constexpr std::array trackAlgoPriorityOrder = + impl::makeArray(); +#endif // DataFormats_TrackReco_trackAlgoPriorityOrder_h diff --git a/RecoTracker/FinalTrackSelectors/test/trackAlgoPriorityOrder_t.cpp b/RecoTracker/FinalTrackSelectors/test/trackAlgoPriorityOrder_t.cpp index 09eb476592a81..81b93290a8e27 100644 --- a/RecoTracker/FinalTrackSelectors/test/trackAlgoPriorityOrder_t.cpp +++ b/RecoTracker/FinalTrackSelectors/test/trackAlgoPriorityOrder_t.cpp @@ -3,14 +3,16 @@ #include int main(void) { - for(unsigned int ialgo = 0; ialgo < reco::TrackBase::algoSize; ++ialgo) { + for (unsigned int ialgo = 0; ialgo < reco::TrackBase::algoSize; ++ialgo) { reco::TrackBase::TrackAlgorithm algo = static_cast(ialgo); const unsigned int priority = trackAlgoPriorityOrder[algo]; std::cout << "Algorithm " << reco::TrackBase::algoName(algo) << " has priority " << priority << std::endl; - if(impl::algoPriorityOrder[priority] != algo) { - std::cout << "Priority for algo " << reco::TrackBase::algoName(algo) << " is inconsistent: algo " << algo << " has priority " << priority << ", which maps back to algo " << impl::algoPriorityOrder[priority] << std::endl; + if (impl::algoPriorityOrder[priority] != algo) { + std::cout << "Priority for algo " << reco::TrackBase::algoName(algo) << " is inconsistent: algo " << algo + << " has priority " << priority << ", which maps back to algo " << impl::algoPriorityOrder[priority] + << std::endl; return 1; } }