CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
cms::SiPixelDigitizer Class Reference

#include <SiPixelDigitizer.h>

Inheritance diagram for cms::SiPixelDigitizer:
DigiAccumulatorMixMod

Public Member Functions

virtual void accumulate (edm::Event const &e, edm::EventSetup const &c) override
 
virtual void accumulate (PileUpEventPrincipal const &e, edm::EventSetup const &c, edm::StreamID const &) override
 
virtual void beginJob ()
 
virtual void finalizeEvent (edm::Event &e, edm::EventSetup const &c) override
 
virtual PileupMixingContentgetEventPileupInfo ()
 
virtual void initializeEvent (edm::Event const &e, edm::EventSetup const &c) override
 
 SiPixelDigitizer (const edm::ParameterSet &conf, edm::one::EDProducerBase &mixMod, edm::ConsumesCollector &iC)
 
virtual void StorePileupInformation (std::vector< int > &numInteractionList, std::vector< int > &bunchCrossingList, std::vector< float > &TrueInteractionList)
 
virtual ~SiPixelDigitizer ()
 
- Public Member Functions inherited from DigiAccumulatorMixMod
virtual void beginLuminosityBlock (edm::LuminosityBlock const &lumi, edm::EventSetup const &setup)
 
virtual void beginRun (edm::Run const &run, edm::EventSetup const &setup)
 
 DigiAccumulatorMixMod ()
 
virtual void endLuminosityBlock (edm::LuminosityBlock const &lumi, edm::EventSetup const &setup)
 
virtual void endRun (edm::Run const &run, edm::EventSetup const &setup)
 
virtual void finalizeBunchCrossing (edm::Event &event, edm::EventSetup const &setup, int bunchCrossing)
 
virtual void initializeBunchCrossing (edm::Event const &event, edm::EventSetup const &setup, int bunchCrossing)
 
virtual ~DigiAccumulatorMixMod ()
 

Private Types

typedef std::vector< std::string > vstring
 

Private Member Functions

void accumulatePixelHits (edm::Handle< std::vector< PSimHit > >, size_t globalSimHitIndex, const unsigned int tofBin, CLHEP::HepRandomEngine *)
 
CLHEP::HepRandomEngine * randomEngine (edm::StreamID const &streamID)
 

Private Attributes

std::unique_ptr
< SiPixelDigitizerAlgorithm
_pixeldigialgo
 
std::map< std::string, size_t > crossingSimHitIndexOffset_
 Offset to add to the index of each sim hit to account for which crossing it's in. More...
 
std::map< unsigned int,
PixelGeomDetUnit const * > 
detectorUnits
 
bool first
 
const std::string geometryType
 
const std::string hitsProducer
 
const int NumberOfEndcapDisks
 
edm::ESHandle< TrackerGeometrypDD
 
PileupMixingContentPileupInfo_
 
const bool pilotBlades
 
edm::ESHandle< MagneticFieldpSetup
 
std::vector
< CLHEP::HepRandomEngine * > 
randomEngines_
 
const vstring trackerContainers
 

Detailed Description

Definition at line 48 of file SiPixelDigitizer.h.

Member Typedef Documentation

typedef std::vector<std::string> cms::SiPixelDigitizer::vstring
private

Definition at line 89 of file SiPixelDigitizer.h.

Constructor & Destructor Documentation

SiPixelDigitizer::SiPixelDigitizer ( const edm::ParameterSet conf,
edm::one::EDProducerBase mixMod,
edm::ConsumesCollector iC 
)
explicit

Definition at line 95 of file SiPixelDigitizer.cc.

References _pixeldigialgo, edm::ConsumesCollector::consumes(), edm::hlt::Exception, hitsProducer, edm::Service< T >::isAvailable(), AlCaHLTBitMon_QueryRunRegistry::string, GlobalPosition_Frontier_DevDB_cff::tag, and trackerContainers.

95  :
96  first(true),
98  hitsProducer(iConfig.getParameter<std::string>("hitsProducer")),
99  trackerContainers(iConfig.getParameter<std::vector<std::string> >("ROUList")),
100  geometryType(iConfig.getParameter<std::string>("GeometryType")),
101  pilotBlades(iConfig.exists("enablePilotBlades")?iConfig.getParameter<bool>("enablePilotBlades"):false),
102  NumberOfEndcapDisks(iConfig.exists("NumPixelEndcap")?iConfig.getParameter<int>("NumPixelEndcap"):2)
103  {
104  edm::LogInfo ("PixelDigitizer ") <<"Enter the Pixel Digitizer";
105 
106  const std::string alias ("simSiPixelDigis");
107 
108  mixMod.produces<edm::DetSetVector<PixelDigi> >().setBranchAlias(alias);
109  mixMod.produces<edm::DetSetVector<PixelDigiSimLink> >().setBranchAlias(alias + "siPixelDigiSimLink");
110  for(auto const& trackerContainer : trackerContainers) {
111  edm::InputTag tag(hitsProducer, trackerContainer);
112  iC.consumes<std::vector<PSimHit> >(edm::InputTag(hitsProducer, trackerContainer));
113  }
115  if ( ! rng.isAvailable()) {
116  throw cms::Exception("Configuration")
117  << "SiPixelDigitizer requires the RandomNumberGeneratorService\n"
118  "which is not present in the configuration file. You must add the service\n"
119  "in the configuration file or remove the modules that require it.";
120  }
121 
122  _pixeldigialgo.reset(new SiPixelDigitizerAlgorithm(iConfig));
123  }
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
const std::string hitsProducer
bool isAvailable() const
Definition: Service.h:46
std::unique_ptr< SiPixelDigitizerAlgorithm > _pixeldigialgo
const std::string geometryType
const vstring trackerContainers
SiPixelDigitizer::~SiPixelDigitizer ( )
virtual

Definition at line 125 of file SiPixelDigitizer.cc.

125  {
126  edm::LogInfo ("PixelDigitizer ") <<"Destruct the Pixel Digitizer";
127  }

Member Function Documentation

void SiPixelDigitizer::accumulate ( edm::Event const &  e,
edm::EventSetup const &  c 
)
overridevirtual

Implements DigiAccumulatorMixMod.

Definition at line 203 of file SiPixelDigitizer.cc.

References accumulatePixelHits(), crossingSimHitIndexOffset_, edm::InputTag::encode(), edm::Event::getByLabel(), PixelDigiSimLink::HighTof, hitsProducer, i, edm::HandleBase::isValid(), PixelDigiSimLink::LowTof, randomEngine(), trackerHits::simHits, edm::Event::streamID(), AlCaHLTBitMon_QueryRunRegistry::string, GlobalPosition_Frontier_DevDB_cff::tag, and trackerContainers.

203  {
204  // Step A: Get Inputs
205  for(vstring::const_iterator i = trackerContainers.begin(), iEnd = trackerContainers.end(); i != iEnd; ++i) {
208 
209  iEvent.getByLabel(tag, simHits);
210  unsigned int tofBin = PixelDigiSimLink::LowTof;
211  if ((*i).find(std::string("HighTof")) != std::string::npos) tofBin = PixelDigiSimLink::HighTof;
212  accumulatePixelHits(simHits, crossingSimHitIndexOffset_[tag.encode()], tofBin, randomEngine(iEvent.streamID()));
213  // Now that the hits have been processed, I'll add the amount of hits in this crossing on to
214  // the global counter. Next time accumulateStripHits() is called it will count the sim hits
215  // as though they were on the end of this collection.
216  // Note that this is only used for creating digi-sim links (if configured to do so).
217 // std::cout << "index offset, current hit count = " << crossingSimHitIndexOffset_[tag.encode()] << ", " << simHits->size() << std::endl;
218  if( simHits.isValid() ) crossingSimHitIndexOffset_[tag.encode()]+=simHits->size();
219  }
220  }
int i
Definition: DBlmapReader.cc:9
CLHEP::HepRandomEngine * randomEngine(edm::StreamID const &streamID)
const std::string hitsProducer
int iEvent
Definition: GenABIO.cc:230
std::map< std::string, size_t > crossingSimHitIndexOffset_
Offset to add to the index of each sim hit to account for which crossing it&#39;s in. ...
bool isValid() const
Definition: HandleBase.h:76
tuple simHits
Definition: trackerHits.py:16
const vstring trackerContainers
void accumulatePixelHits(edm::Handle< std::vector< PSimHit > >, size_t globalSimHitIndex, const unsigned int tofBin, CLHEP::HepRandomEngine *)
void SiPixelDigitizer::accumulate ( PileUpEventPrincipal const &  e,
edm::EventSetup const &  c,
edm::StreamID const &  streamID 
)
overridevirtual

Implements DigiAccumulatorMixMod.

Definition at line 223 of file SiPixelDigitizer.cc.

References accumulatePixelHits(), crossingSimHitIndexOffset_, edm::InputTag::encode(), PileUpEventPrincipal::getByLabel(), PixelDigiSimLink::HighTof, hitsProducer, i, edm::HandleBase::isValid(), PixelDigiSimLink::LowTof, randomEngine(), trackerHits::simHits, AlCaHLTBitMon_QueryRunRegistry::string, GlobalPosition_Frontier_DevDB_cff::tag, and trackerContainers.

223  {
224  // Step A: Get Inputs
225  for(vstring::const_iterator i = trackerContainers.begin(), iEnd = trackerContainers.end(); i != iEnd; ++i) {
228 
229  iEvent.getByLabel(tag, simHits);
230  unsigned int tofBin = PixelDigiSimLink::LowTof;
231  if ((*i).find(std::string("HighTof")) != std::string::npos) tofBin = PixelDigiSimLink::HighTof;
232  accumulatePixelHits(simHits, crossingSimHitIndexOffset_[tag.encode()], tofBin, randomEngine(streamID));
233  // Now that the hits have been processed, I'll add the amount of hits in this crossing on to
234  // the global counter. Next time accumulateStripHits() is called it will count the sim hits
235  // as though they were on the end of this collection.
236  // Note that this is only used for creating digi-sim links (if configured to do so).
237 // std::cout << "index offset, current hit count = " << crossingSimHitIndexOffset_[tag.encode()] << ", " << simHits->size() << std::endl;
238  if( simHits.isValid() ) crossingSimHitIndexOffset_[tag.encode()]+=simHits->size();
239  }
240  }
int i
Definition: DBlmapReader.cc:9
CLHEP::HepRandomEngine * randomEngine(edm::StreamID const &streamID)
const std::string hitsProducer
int iEvent
Definition: GenABIO.cc:230
std::map< std::string, size_t > crossingSimHitIndexOffset_
Offset to add to the index of each sim hit to account for which crossing it&#39;s in. ...
bool isValid() const
Definition: HandleBase.h:76
tuple simHits
Definition: trackerHits.py:16
const vstring trackerContainers
void accumulatePixelHits(edm::Handle< std::vector< PSimHit > >, size_t globalSimHitIndex, const unsigned int tofBin, CLHEP::HepRandomEngine *)
void SiPixelDigitizer::accumulatePixelHits ( edm::Handle< std::vector< PSimHit > >  hSimHits,
size_t  globalSimHitIndex,
const unsigned int  tofBin,
CLHEP::HepRandomEngine *  engine 
)
private

Definition at line 135 of file SiPixelDigitizer.cc.

References _pixeldigialgo, detectorUnits, LogDebug, PixelSubdetector::PixelBarrel, PixelSubdetector::PixelEndcap, pSetup, trackerHits::simHits, and DetId::subdetId().

Referenced by accumulate().

138  {
139  if(hSimHits.isValid()) {
140  std::set<unsigned int> detIds;
141  std::vector<PSimHit> const& simHits = *hSimHits.product();
142  for(std::vector<PSimHit>::const_iterator it = simHits.begin(), itEnd = simHits.end(); it != itEnd; ++it, ++globalSimHitIndex) {
143  unsigned int detId = (*it).detUnitId();
144  if(detIds.insert(detId).second) {
145  // The insert succeeded, so this detector element has not yet been processed.
146  unsigned int isub = DetId(detId).subdetId();
148  std::map<unsigned int, PixelGeomDetUnit const *>::iterator itDet = detectorUnits.find(detId);
149  if (itDet == detectorUnits.end()) continue;
150  auto pixdet = itDet->second;
151  //access to magnetic field in global coordinates
152  GlobalVector bfield = pSetup->inTesla(pixdet->surface().position());
153  LogDebug ("PixelDigitizer ") << "B-field(T) at " << pixdet->surface().position() << "(cm): "
154  << pSetup->inTesla(pixdet->surface().position());
155  _pixeldigialgo->accumulateSimHits(it, itEnd, globalSimHitIndex, tofBin, pixdet, bfield, engine);
156  }
157  }
158  }
159  }
160  }
#define LogDebug(id)
std::map< unsigned int, PixelGeomDetUnit const * > detectorUnits
edm::ESHandle< MagneticField > pSetup
bool isValid() const
Definition: HandleBase.h:76
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
std::unique_ptr< SiPixelDigitizerAlgorithm > _pixeldigialgo
Definition: DetId.h:18
T const * product() const
Definition: Handle.h:81
tuple simHits
Definition: trackerHits.py:16
virtual void cms::SiPixelDigitizer::beginJob ( void  )
inlinevirtual

Definition at line 60 of file SiPixelDigitizer.h.

60 {}
void SiPixelDigitizer::finalizeEvent ( edm::Event e,
edm::EventSetup const &  c 
)
overridevirtual

Implements DigiAccumulatorMixMod.

Definition at line 244 of file SiPixelDigitizer.cc.

References _pixeldigialgo, edm::EventSetup::get(), edm::RandomNumberGenerator::getEngine(), getEventPileupInfo(), convertSQLitetoXML_cfg::output, pDD, PileupInfo_, PixelSubdetector::PixelBarrel, PixelSubdetector::PixelEndcap, edm::ESHandle< class >::product(), edm::Event::put(), edm::Event::streamID(), and DetId::subdetId().

244  {
245 
247  CLHEP::HepRandomEngine* engine = &rng->getEngine(iEvent.streamID());
248 
250  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
251  const TrackerTopology *tTopo=tTopoHand.product();
252 
253  std::vector<edm::DetSet<PixelDigi> > theDigiVector;
254  std::vector<edm::DetSet<PixelDigiSimLink> > theDigiLinkVector;
255 
257  _pixeldigialgo->calculateInstlumiFactor(PileupInfo_);
258 
259  for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){
260  DetId idet=DetId((*iu)->geographicalId().rawId());
261  unsigned int isub=idet.subdetId();
262 
264 
265  //
266 
267  edm::DetSet<PixelDigi> collector((*iu)->geographicalId().rawId());
268  edm::DetSet<PixelDigiSimLink> linkcollector((*iu)->geographicalId().rawId());
269 
270 
271  _pixeldigialgo->digitize(dynamic_cast<const PixelGeomDetUnit*>((*iu)),
272  collector.data,
273  linkcollector.data,
274  tTopo,
275  engine);
276  if(collector.data.size() > 0) {
277  theDigiVector.push_back(std::move(collector));
278  }
279  if(linkcollector.data.size() > 0) {
280  theDigiLinkVector.push_back(std::move(linkcollector));
281  }
282  }
283  }
284 
285  // Step C: create collection with the cache vector of DetSet
286  std::auto_ptr<edm::DetSetVector<PixelDigi> >
287  output(new edm::DetSetVector<PixelDigi>(theDigiVector) );
288  std::auto_ptr<edm::DetSetVector<PixelDigiSimLink> >
289  outputlink(new edm::DetSetVector<PixelDigiSimLink>(theDigiLinkVector) );
290 
291  // Step D: write output to file
292  iEvent.put(output);
293  iEvent.put(outputlink);
294  }
int iEvent
Definition: GenABIO.cc:230
edm::ESHandle< TrackerGeometry > pDD
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
std::unique_ptr< SiPixelDigitizerAlgorithm > _pixeldigialgo
Definition: DetId.h:18
T const * product() const
Definition: ESHandle.h:86
PileupMixingContent * PileupInfo_
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &) const =0
Use this engine in event methods.
virtual PileupMixingContent * getEventPileupInfo()
virtual PileupMixingContent* cms::SiPixelDigitizer::getEventPileupInfo ( )
inlinevirtual

Reimplemented from DigiAccumulatorMixMod.

Definition at line 68 of file SiPixelDigitizer.h.

References PileupInfo_.

Referenced by finalizeEvent().

68 { return PileupInfo_; }
PileupMixingContent * PileupInfo_
void SiPixelDigitizer::initializeEvent ( edm::Event const &  e,
edm::EventSetup const &  c 
)
overridevirtual

Implements DigiAccumulatorMixMod.

Definition at line 163 of file SiPixelDigitizer.cc.

References _pixeldigialgo, crossingSimHitIndexOffset_, detectorUnits, first, geometryType, edm::EventSetup::get(), NumberOfEndcapDisks, pDD, pilotBlades, PixelSubdetector::PixelBarrel, PixelSubdetector::PixelEndcap, edm::ESHandle< class >::product(), pSetup, TrackerTopology::pxfDisk(), and DetId::subdetId().

163  {
164  if(first){
165  _pixeldigialgo->init(iSetup);
166  first = false;
167  }
168  // Make sure that the first crossing processed starts indexing the sim hits from zero.
169  // This variable is used so that the sim hits from all crossing frames have sequential
170  // indices used to create the digi-sim link (if configured to do so) rather than starting
171  // from zero for each crossing.
173 
174  _pixeldigialgo->initializeEvent();
175  iSetup.get<TrackerDigiGeometryRecord>().get(geometryType, pDD);
176  iSetup.get<IdealMagneticFieldRecord>().get(pSetup);
178  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
179  const TrackerTopology *tTopo=tTopoHand.product();
180 
181  // FIX THIS! We only need to clear and (re)fill this map when the geometry type IOV changes. Use ESWatcher to determine this.
182  if(true) { // Replace with ESWatcher
183  detectorUnits.clear();
184  for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); ++iu) {
185  unsigned int detId = (*iu)->geographicalId().rawId();
186  DetId idet=DetId(detId);
187  unsigned int isub=idet.subdetId();
189  auto pixdet = dynamic_cast<const PixelGeomDetUnit*>((*iu));
190  assert(pixdet != 0);
191  if (isub==PixelSubdetector::PixelEndcap) {
192  unsigned int disk = tTopo->pxfDisk(detId);
193  //if using pilot blades, then allowing it for current detector only
194  if ((disk == 3)&&((!pilotBlades)&&(NumberOfEndcapDisks == 2))) continue;
195  }
196  detectorUnits.insert(std::make_pair(detId, pixdet));
197  }
198  }
199  }
200  }
unsigned int pxfDisk(const DetId &id) const
std::map< unsigned int, PixelGeomDetUnit const * > detectorUnits
edm::ESHandle< MagneticField > pSetup
std::map< std::string, size_t > crossingSimHitIndexOffset_
Offset to add to the index of each sim hit to account for which crossing it&#39;s in. ...
edm::ESHandle< TrackerGeometry > pDD
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
std::unique_ptr< SiPixelDigitizerAlgorithm > _pixeldigialgo
Definition: DetId.h:18
T const * product() const
Definition: ESHandle.h:86
const std::string geometryType
CLHEP::HepRandomEngine * SiPixelDigitizer::randomEngine ( edm::StreamID const &  streamID)
private

Definition at line 296 of file SiPixelDigitizer.cc.

References edm::RandomNumberGenerator::getEngine(), cmsHarvester::index, randomEngines_, and edm::StreamID::value().

Referenced by accumulate().

296  {
297  unsigned int index = streamID.value();
298  if(index >= randomEngines_.size()) {
299  randomEngines_.resize(index + 1, nullptr);
300  }
301  CLHEP::HepRandomEngine* ptr = randomEngines_[index];
302  if(!ptr) {
304  ptr = &rng->getEngine(streamID);
305  randomEngines_[index] = ptr;
306  }
307  return ptr;
308  }
std::vector< CLHEP::HepRandomEngine * > randomEngines_
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &) const =0
Use this engine in event methods.
virtual void cms::SiPixelDigitizer::StorePileupInformation ( std::vector< int > &  numInteractionList,
std::vector< int > &  bunchCrossingList,
std::vector< float > &  TrueInteractionList 
)
inlinevirtual

Reimplemented from DigiAccumulatorMixMod.

Definition at line 62 of file SiPixelDigitizer.h.

References PileupInfo_.

64  {
65  PileupInfo_ = new PileupMixingContent(numInteractionList, bunchCrossingList, TrueInteractionList);
66  }
PileupMixingContent * PileupInfo_

Member Data Documentation

std::unique_ptr<SiPixelDigitizerAlgorithm> cms::SiPixelDigitizer::_pixeldigialgo
private
std::map<std::string,size_t> cms::SiPixelDigitizer::crossingSimHitIndexOffset_
private

Offset to add to the index of each sim hit to account for which crossing it's in.

I need to know what each sim hit index will be when the hits from all crossing frames are merged into one collection (assuming the MixingModule is configured to create the crossing frame for all sim hits). To do this I'll record how many hits were in each crossing, and then add that on to the index for a given hit in a given crossing. This assumes that the crossings are processed in the same order here as they are put into the crossing frame, which I'm pretty sure is true.
The key is the name of the sim hit collection.

Definition at line 87 of file SiPixelDigitizer.h.

Referenced by accumulate(), and initializeEvent().

std::map<unsigned int, PixelGeomDetUnit const *> cms::SiPixelDigitizer::detectorUnits
private

Definition at line 95 of file SiPixelDigitizer.h.

Referenced by accumulatePixelHits(), and initializeEvent().

bool cms::SiPixelDigitizer::first
private

Definition at line 77 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

const std::string cms::SiPixelDigitizer::geometryType
private

Definition at line 92 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

const std::string cms::SiPixelDigitizer::hitsProducer
private

Definition at line 90 of file SiPixelDigitizer.h.

Referenced by accumulate(), and SiPixelDigitizer().

const int cms::SiPixelDigitizer::NumberOfEndcapDisks
private

Definition at line 101 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

edm::ESHandle<TrackerGeometry> cms::SiPixelDigitizer::pDD
private

Definition at line 93 of file SiPixelDigitizer.h.

Referenced by finalizeEvent(), and initializeEvent().

PileupMixingContent* cms::SiPixelDigitizer::PileupInfo_
private

Definition at line 98 of file SiPixelDigitizer.h.

Referenced by finalizeEvent(), getEventPileupInfo(), and StorePileupInformation().

const bool cms::SiPixelDigitizer::pilotBlades
private

Definition at line 100 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

edm::ESHandle<MagneticField> cms::SiPixelDigitizer::pSetup
private

Definition at line 94 of file SiPixelDigitizer.h.

Referenced by accumulatePixelHits(), and initializeEvent().

std::vector<CLHEP::HepRandomEngine*> cms::SiPixelDigitizer::randomEngines_
private

Definition at line 96 of file SiPixelDigitizer.h.

Referenced by randomEngine().

const vstring cms::SiPixelDigitizer::trackerContainers
private

Definition at line 91 of file SiPixelDigitizer.h.

Referenced by accumulate(), and SiPixelDigitizer().