CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Member Functions | Private Attributes
DTClusterer Class Reference

#include <DTClusterer.h>

Inheritance diagram for DTClusterer:
edm::global::EDProducer<> edm::global::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Classes

struct  sortClusterByX
 

Public Member Functions

 DTClusterer (const edm::ParameterSet &)
 
void produce (edm::StreamID, edm::Event &event, const edm::EventSetup &setup) const override
 
 ~DTClusterer () override
 
- Public Member Functions inherited from edm::global::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
EDProduceroperator= (const EDProducer &)=delete
 
bool wantsGlobalLuminosityBlocks () const final
 
bool wantsGlobalRuns () const final
 
bool wantsInputProcessBlocks () const final
 
bool wantsProcessBlocks () const final
 
bool wantsStreamLuminosityBlocks () const final
 
bool wantsStreamRuns () const final
 
- Public Member Functions inherited from edm::global::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
 ~EDProducerBase () override
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
std::vector< edm::ProductResolverIndex > const & putTokenIndexToProductResolverIndex () const
 
std::vector< bool > const & recordProvenanceList () const
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, ModuleToResolverIndicies const &iIndicies, std::string const &moduleLabel)
 
TypeLabelList const & typeLabelList () const
 used by the fwk to register the list of products of this module More...
 
 ~ProducerBase () noexcept(false) override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ESProxyIndex const * esGetTokenIndices (edm::Transition iTrans) const
 
std::vector< ESProxyIndex > const & esGetTokenIndicesVector (edm::Transition iTrans) const
 
std::vector< ESRecordIndex > const & esGetTokenRecordIndicesVector (edm::Transition iTrans) const
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::array< std::vector< ModuleDescription const *> *, NumBranchTypes > &modulesAll, std::vector< ModuleProcessName > &modulesInPreviousProcesses, ProductRegistry const &preg, std::map< std::string, ModuleDescription const *> const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void selectInputProcessBlocks (ProductRegistry const &productRegistry, ProcessBlockHelperBase const &processBlockHelperBase)
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
void updateLookup (eventsetup::ESRecordsToProxyIndices const &)
 
virtual ~EDConsumerBase () noexcept(false)
 

Private Member Functions

std::vector< DTSLRecClusterbuildClusters (const DTSuperLayer *sl, std::vector< DTRecHit1DPair > &pairs) const
 
unsigned int differentLayers (std::vector< DTRecHit1DPair > &hits) const
 
std::vector< std::pair< float, DTRecHit1DPair > > initHits (const DTSuperLayer *sl, std::vector< DTRecHit1DPair > &pairs) const
 

Private Attributes

bool debug
 
edm::ESGetToken< DTGeometry, MuonGeometryRecorddtGeomToken_
 
edm::EDGetTokenT< DTRecHitCollectionrecHits1DToken_
 
unsigned int theMinHits
 
unsigned int theMinLayers
 

Additional Inherited Members

- Public Types inherited from edm::global::EDProducerBase
typedef EDProducerBase ModuleType
 
- Public Types inherited from edm::ProducerBase
template<typename T >
using BranchAliasSetterT = ProductRegistryHelper::BranchAliasSetterT< T >
 
using ModuleToResolverIndicies = std::unordered_multimap< std::string, std::tuple< edm::TypeID const *, const char *, edm::ProductResolverIndex > >
 
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Static Public Member Functions inherited from edm::global::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Member Functions inherited from edm::ProducerBase
template<Transition Tr = Transition::Event>
auto produces (std::string instanceName) noexcept
 declare what type of product will make and with which optional label More...
 
template<Transition B>
BranchAliasSetter produces (const TypeID &id, std::string instanceName=std::string(), bool recordProvenance=true)
 
template<BranchType B>
BranchAliasSetter produces (const TypeID &id, std::string instanceName=std::string(), bool recordProvenance=true)
 
BranchAliasSetter produces (const TypeID &id, std::string instanceName=std::string(), bool recordProvenance=true)
 
template<typename ProductType , Transition B>
BranchAliasSetterT< ProductType > produces (std::string instanceName)
 
template<class ProductType >
BranchAliasSetterT< ProductType > produces ()
 
template<typename ProductType , BranchType B>
BranchAliasSetterT< ProductType > produces (std::string instanceName)
 
template<typename ProductType , BranchType B>
BranchAliasSetterT< ProductType > produces ()
 
template<class ProductType >
BranchAliasSetterT< ProductType > produces (std::string instanceName)
 
template<typename ProductType , Transition B>
BranchAliasSetterT< ProductType > produces ()
 
template<Transition Tr = Transition::Event>
auto produces () noexcept
 
ProducesCollector producesCollector ()
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
template<BranchType B = InEvent>
EDConsumerBaseAdaptor< Bconsumes (edm::InputTag tag) noexcept
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes ()
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes (ESInputTag const &tag)
 
template<Transition Tr = Transition::Event>
constexpr auto esConsumes ()
 
template<Transition Tr = Transition::Event>
auto esConsumes (ESInputTag tag)
 
template<Transition Tr = Transition::Event>
ESGetTokenGeneric esConsumes (eventsetup::EventSetupRecordKey const &iRecord, eventsetup::DataKey const &iKey)
 Used with EventSetupRecord::doGet. More...
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
void resetItemsToGetFrom (BranchType iType)
 

Detailed Description

Description:

detailed description

Author
: Stefano Lacaprara - INFN LNL stefa.nosp@m.no.l.nosp@m.acapr.nosp@m.ara@.nosp@m.pd.in.nosp@m.fn.i.nosp@m.t

Modification:

Definition at line 42 of file DTClusterer.h.

Constructor & Destructor Documentation

◆ DTClusterer()

DTClusterer::DTClusterer ( const edm::ParameterSet pset)

Definition at line 39 of file DTClusterer.cc.

References gather_cfg::cout, debug, deDxTools::esConsumes(), and muonDTDigis_cfi::pset.

39  {
40  // Set verbose output
41  debug = pset.getUntrackedParameter<bool>("debug");
42 
43  // the name of the 1D rec hits collection
44  recHits1DToken_ = consumes<DTRecHitCollection>(pset.getParameter<InputTag>("recHits1DLabel"));
45  // min number of hits to build a cluster
46  theMinHits = pset.getParameter<unsigned int>("minHits");
47  // min number of hits to build a cluster
48  theMinLayers = pset.getParameter<unsigned int>("minLayers");
49 
51  if (debug)
52  cout << "[DTClusterer] Constructor called" << endl;
53 
54  produces<DTRecClusterCollection>();
55 }
unsigned int theMinLayers
Definition: DTClusterer.h:75
edm::EDGetTokenT< DTRecHitCollection > recHits1DToken_
Definition: DTClusterer.h:76
unsigned int theMinHits
Definition: DTClusterer.h:74
edm::ESGetToken< DTGeometry, MuonGeometryRecord > dtGeomToken_
Definition: DTClusterer.h:77

◆ ~DTClusterer()

DTClusterer::~DTClusterer ( )
override

Definition at line 58 of file DTClusterer.cc.

58 {}

Member Function Documentation

◆ buildClusters()

vector< DTSLRecCluster > DTClusterer::buildClusters ( const DTSuperLayer sl,
std::vector< DTRecHit1DPair > &  pairs 
) const
private

Definition at line 106 of file DTClusterer.cc.

References funct::abs(), gather_cfg::cout, debug, hfClusterShapes_cfi::hits, DTSuperLayer::id(), SiStripPI::mean, mps_fire::result, and trackerHitRTTI::vector.

106  {
107  // create a vector of hits with wire position in SL frame
108  vector<pair<float, DTRecHit1DPair> > hits = initHits(sl, pairs);
109 
110  vector<DTSLRecCluster> result;
111  // loop over pairs
112  vector<DTRecHit1DPair> adiacentPairs;
113  float lastPos = hits.front().first;
114  const float cellWidth = 4.2; // cm
115  float sum = 0.;
116  float sum2 = 0.;
117 
118  for (vector<pair<float, DTRecHit1DPair> >::const_iterator hit = hits.begin(); hit != hits.end(); ++hit) {
119  if (debug)
120  cout << "Hit: " << (*hit).first << " lastPos: " << lastPos << endl;
121  // start from first hits
122  // two cells are adiacente if their position is closer than cell width
123  if (abs((*hit).first - lastPos) > cellWidth) {
124  if (adiacentPairs.size() >= theMinHits && differentLayers(adiacentPairs) >= theMinLayers) {
125  // if not, build the cluster with so far collection hits and go on
126  float mean = sum / adiacentPairs.size();
127  float err2 = sum2 / adiacentPairs.size() - mean * mean;
128  DTSLRecCluster cluster(sl->id(), LocalPoint(mean, 0., 0.), LocalError(err2, 0., 0.), adiacentPairs);
129  if (debug)
130  cout << "Cluster " << cluster << endl;
131  result.push_back(cluster);
132  }
133  // clean the vector
134  adiacentPairs.clear();
135  sum = 0.;
136  sum2 = 0.;
137  }
138  // if adiacente, add them to a vector
139  adiacentPairs.push_back((*hit).second);
140  if (debug)
141  cout << "adiacentPairs " << adiacentPairs.size() << endl;
142  sum += (*hit).first;
143  sum2 += (*hit).first * (*hit).first;
144 
145  lastPos = (*hit).first;
146  }
147  // build the last cluster
148  if (adiacentPairs.size() >= theMinHits && differentLayers(adiacentPairs) >= theMinLayers) {
149  float mean = sum / adiacentPairs.size();
150  float err2 = sum2 / adiacentPairs.size() - mean * mean;
151  DTSLRecCluster cluster(sl->id(), LocalPoint(mean, 0., 0.), LocalError(err2, 0., 0.), adiacentPairs);
152  if (debug)
153  cout << "Cluster " << cluster << endl;
154  result.push_back(cluster);
155  }
156 
157  return result;
158 }
unsigned int theMinLayers
Definition: DTClusterer.h:75
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
unsigned int differentLayers(std::vector< DTRecHit1DPair > &hits) const
Definition: DTClusterer.cc:180
unsigned int theMinHits
Definition: DTClusterer.h:74
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< std::pair< float, DTRecHit1DPair > > initHits(const DTSuperLayer *sl, std::vector< DTRecHit1DPair > &pairs) const
Definition: DTClusterer.cc:160
DTSuperLayerId id() const
Return the DetId of this SL.
Definition: DTSuperLayer.cc:34

◆ differentLayers()

unsigned int DTClusterer::differentLayers ( std::vector< DTRecHit1DPair > &  hits) const
private

Definition at line 180 of file DTClusterer.cc.

References hfClusterShapes_cfi::hits, hgcalTopologyTester_cfi::layers, and mps_fire::result.

180  {
181  // Count the number of different layers
182  int layers = 0;
183  unsigned int result = 0;
184  for (vector<DTRecHit1DPair>::const_iterator hit = hits.begin(); hit != hits.end(); ++hit) {
185  int pos = (1 << ((*hit).wireId().layer() - 1));
186  if (!(pos & layers)) {
187  result++;
188  layers |= pos;
189  }
190  }
191  return result;
192 }

◆ initHits()

vector< pair< float, DTRecHit1DPair > > DTClusterer::initHits ( const DTSuperLayer sl,
std::vector< DTRecHit1DPair > &  pairs 
) const
private

Definition at line 160 of file DTClusterer.cc.

References DTLayerId::layer(), DTSuperLayer::layer(), mps_fire::result, jetsAK4_CHS_cff::sort, DTLayer::specificTopology(), GeomDet::toGlobal(), GeomDet::toLocal(), DTWireId::wire(), DTTopology::wirePosition(), and PV3DBase< T, PVType, FrameType >::x().

161  {
162  vector<pair<float, DTRecHit1DPair> > result;
163  for (vector<DTRecHit1DPair>::const_iterator pair = pairs.begin(); pair != pairs.end(); ++pair) {
164  // get wire
165  DTWireId wid = (*pair).wireId();
166  // get Layer
167  const DTLayer* lay = sl->layer(wid.layer());
168  // get wire position in SL (only x)
169  LocalPoint posInLayer(lay->specificTopology().wirePosition(wid.wire()), 0., 0.);
170  LocalPoint posInSL = sl->toLocal(lay->toGlobal(posInLayer));
171  // put the pair into result
172  result.push_back(make_pair(posInSL.x(), *pair));
173  }
174  // sorted by x
175  sort(result.begin(), result.end(), sortClusterByX());
176 
177  return result;
178 }
int wire() const
Return the wire number.
Definition: DTWireId.h:42
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:58
T x() const
Definition: PV3DBase.h:59
const DTLayer * layer(const DTLayerId &id) const
Return the layer corresponding to the given id.
Definition: DTSuperLayer.cc:54
const DTTopology & specificTopology() const
Definition: DTLayer.cc:37
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
int layer() const
Return the layer number.
Definition: DTLayerId.h:42
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:59

◆ produce()

void DTClusterer::produce ( edm::StreamID  ,
edm::Event event,
const edm::EventSetup setup 
) const
overridevirtual

Implements edm::global::EDProducerBase.

Definition at line 61 of file DTClusterer.cc.

References bsc_activity_cfg::clusters, gather_cfg::cout, debug, DTSuperLayer::id(), DTRangeMapAccessor::layersBySuperLayer(), eostools::move(), FastTimerService_cff::range, singleTopDQM_cfi::setup, DTGeometry::superLayer(), and DTLayerId::superlayerId().

61  {
62  if (debug)
63  cout << "[DTClusterer] produce called" << endl;
64  // Get the DT Geometry
65  ESHandle<DTGeometry> dtGeom = setup.getHandle(dtGeomToken_);
66 
67  // Get the 1D rechits from the event
69  event.getByToken(recHits1DToken_, allHits);
70 
71  // Create the pointer to the collection which will store the rechits
72  auto clusters = std::make_unique<DTRecClusterCollection>();
73 
74  // Iterate through all hit collections ordered by LayerId
76  DTSuperLayerId oldSlId;
77  for (dtLayerIt = allHits->id_begin(); dtLayerIt != allHits->id_end(); ++dtLayerIt) {
78  // The layerId
79  DTLayerId layerId = (*dtLayerIt);
80  const DTSuperLayerId SLId = layerId.superlayerId();
81  if (SLId == oldSlId)
82  continue; // I'm on the same SL as before
83  oldSlId = SLId;
84 
85  if (debug)
86  cout << "Reconstructing the clusters in " << SLId << endl;
87 
88  const DTSuperLayer* sl = dtGeom->superLayer(SLId);
89 
90  // Get all the rec hit in the same superLayer in which layerId relies
92 
93  // Fill the vector with the 1D RecHit
94  vector<DTRecHit1DPair> pairs(range.first, range.second);
95  if (debug)
96  cout << "Number of 1D-RecHit pairs " << pairs.size() << endl;
97  vector<DTSLRecCluster> clus = buildClusters(sl, pairs);
98  if (debug)
99  cout << "Number of clusters build " << clus.size() << endl;
100  if (!clus.empty())
101  clusters->put(sl->id(), clus.begin(), clus.end());
102  }
103  event.put(std::move(clusters));
104 }
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
edm::EDGetTokenT< DTRecHitCollection > recHits1DToken_
Definition: DTClusterer.h:76
static std::pair< DTLayerId, DTSuperLayerIdComparator > layersBySuperLayer(DTSuperLayerId slId)
Access by SL objects written into a RangeMap by layer.
identifier iterator
Definition: RangeMap.h:130
const DTSuperLayer * superLayer(const DTSuperLayerId &id) const
Return a DTSuperLayer given its id.
Definition: DTGeometry.cc:92
edm::ESGetToken< DTGeometry, MuonGeometryRecord > dtGeomToken_
Definition: DTClusterer.h:77
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:45
std::vector< DTSLRecCluster > buildClusters(const DTSuperLayer *sl, std::vector< DTRecHit1DPair > &pairs) const
Definition: DTClusterer.cc:106
def move(src, dest)
Definition: eostools.py:511
DTSuperLayerId id() const
Return the DetId of this SL.
Definition: DTSuperLayer.cc:34

Member Data Documentation

◆ debug

bool DTClusterer::debug
private

◆ dtGeomToken_

edm::ESGetToken<DTGeometry, MuonGeometryRecord> DTClusterer::dtGeomToken_
private

Definition at line 77 of file DTClusterer.h.

◆ recHits1DToken_

edm::EDGetTokenT<DTRecHitCollection> DTClusterer::recHits1DToken_
private

Definition at line 76 of file DTClusterer.h.

◆ theMinHits

unsigned int DTClusterer::theMinHits
private

Definition at line 74 of file DTClusterer.h.

◆ theMinLayers

unsigned int DTClusterer::theMinLayers
private

Definition at line 75 of file DTClusterer.h.