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, int bunchSpacing)
 
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 *, edm::EventSetup const &c)
 
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 90 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 207 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.

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

Implements DigiAccumulatorMixMod.

Definition at line 227 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.

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

Definition at line 135 of file SiPixelDigitizer.cc.

References _pixeldigialgo, detectorUnits, edm::EventSetup::get(), LogDebug, PixelSubdetector::PixelBarrel, PixelSubdetector::PixelEndcap, edm::ESHandle< class >::product(), pSetup, trackerHits::simHits, and DetId::subdetId().

Referenced by accumulate().

139  {
140  if(hSimHits.isValid()) {
141  std::set<unsigned int> detIds;
142  std::vector<PSimHit> const& simHits = *hSimHits.product();
144  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
145  const TrackerTopology *tTopo=tTopoHand.product();
146  for(std::vector<PSimHit>::const_iterator it = simHits.begin(), itEnd = simHits.end(); it != itEnd; ++it, ++globalSimHitIndex) {
147  unsigned int detId = (*it).detUnitId();
148  if(detIds.insert(detId).second) {
149  // The insert succeeded, so this detector element has not yet been processed.
150  unsigned int isub = DetId(detId).subdetId();
152  std::map<unsigned int, PixelGeomDetUnit const *>::iterator itDet = detectorUnits.find(detId);
153  if (itDet == detectorUnits.end()) continue;
154  auto pixdet = itDet->second;
155  //access to magnetic field in global coordinates
156  GlobalVector bfield = pSetup->inTesla(pixdet->surface().position());
157  LogDebug ("PixelDigitizer ") << "B-field(T) at " << pixdet->surface().position() << "(cm): "
158  << pSetup->inTesla(pixdet->surface().position());
159  _pixeldigialgo->accumulateSimHits(it, itEnd, globalSimHitIndex, tofBin, pixdet, bfield, tTopo, engine);
160  }
161  }
162  }
163  }
164  }
#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
T const * product() const
Definition: ESHandle.h:86
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 248 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().

248  {
249 
251  CLHEP::HepRandomEngine* engine = &rng->getEngine(iEvent.streamID());
252 
254  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
255  const TrackerTopology *tTopo=tTopoHand.product();
256 
257  std::vector<edm::DetSet<PixelDigi> > theDigiVector;
258  std::vector<edm::DetSet<PixelDigiSimLink> > theDigiLinkVector;
259 
261  _pixeldigialgo->calculateInstlumiFactor(PileupInfo_);
262 
263  for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){
264  DetId idet=DetId((*iu)->geographicalId().rawId());
265  unsigned int isub=idet.subdetId();
266 
268 
269  //
270 
271  edm::DetSet<PixelDigi> collector((*iu)->geographicalId().rawId());
272  edm::DetSet<PixelDigiSimLink> linkcollector((*iu)->geographicalId().rawId());
273 
274 
275  _pixeldigialgo->digitize(dynamic_cast<const PixelGeomDetUnit*>((*iu)),
276  collector.data,
277  linkcollector.data,
278  tTopo,
279  engine);
280  if(collector.data.size() > 0) {
281  theDigiVector.push_back(std::move(collector));
282  }
283  if(linkcollector.data.size() > 0) {
284  theDigiLinkVector.push_back(std::move(linkcollector));
285  }
286  }
287  }
288 
289  // Step C: create collection with the cache vector of DetSet
290  std::auto_ptr<edm::DetSetVector<PixelDigi> >
291  output(new edm::DetSetVector<PixelDigi>(theDigiVector) );
292  std::auto_ptr<edm::DetSetVector<PixelDigiSimLink> >
293  outputlink(new edm::DetSetVector<PixelDigiSimLink>(theDigiLinkVector) );
294 
295  // Step D: write output to file
296  iEvent.put(output);
297  iEvent.put(outputlink);
298  }
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 167 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().

167  {
168  if(first){
169  _pixeldigialgo->init(iSetup);
170  first = false;
171  }
172  // Make sure that the first crossing processed starts indexing the sim hits from zero.
173  // This variable is used so that the sim hits from all crossing frames have sequential
174  // indices used to create the digi-sim link (if configured to do so) rather than starting
175  // from zero for each crossing.
177 
178  _pixeldigialgo->initializeEvent();
179  iSetup.get<TrackerDigiGeometryRecord>().get(geometryType, pDD);
180  iSetup.get<IdealMagneticFieldRecord>().get(pSetup);
182  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
183  const TrackerTopology *tTopo=tTopoHand.product();
184 
185  // FIX THIS! We only need to clear and (re)fill this map when the geometry type IOV changes. Use ESWatcher to determine this.
186  if(true) { // Replace with ESWatcher
187  detectorUnits.clear();
188  for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); ++iu) {
189  unsigned int detId = (*iu)->geographicalId().rawId();
190  DetId idet=DetId(detId);
191  unsigned int isub=idet.subdetId();
193  auto pixdet = dynamic_cast<const PixelGeomDetUnit*>((*iu));
194  assert(pixdet != 0);
195  if (isub==PixelSubdetector::PixelEndcap) {
196  unsigned int disk = tTopo->pxfDisk(detId);
197  //if using pilot blades, then allowing it for current detector only
198  if ((disk == 3)&&((!pilotBlades)&&(NumberOfEndcapDisks == 2))) continue;
199  }
200  detectorUnits.insert(std::make_pair(detId, pixdet));
201  }
202  }
203  }
204  }
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 300 of file SiPixelDigitizer.cc.

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

Referenced by accumulate().

300  {
301  unsigned int index = streamID.value();
302  if(index >= randomEngines_.size()) {
303  randomEngines_.resize(index + 1, nullptr);
304  }
305  CLHEP::HepRandomEngine* ptr = randomEngines_[index];
306  if(!ptr) {
308  ptr = &rng->getEngine(streamID);
309  randomEngines_[index] = ptr;
310  }
311  return ptr;
312  }
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,
int  bunchSpacing 
)
inlinevirtual

Reimplemented from DigiAccumulatorMixMod.

Definition at line 62 of file SiPixelDigitizer.h.

References PileupInfo_.

64  {
65  PileupInfo_ = new PileupMixingContent(numInteractionList, bunchCrossingList, TrueInteractionList, bunchSpacing);
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 88 of file SiPixelDigitizer.h.

Referenced by accumulate(), and initializeEvent().

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

Definition at line 96 of file SiPixelDigitizer.h.

Referenced by accumulatePixelHits(), and initializeEvent().

bool cms::SiPixelDigitizer::first
private

Definition at line 78 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 93 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 91 of file SiPixelDigitizer.h.

Referenced by accumulate(), and SiPixelDigitizer().

const int cms::SiPixelDigitizer::NumberOfEndcapDisks
private

Definition at line 102 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 94 of file SiPixelDigitizer.h.

Referenced by finalizeEvent(), and initializeEvent().

PileupMixingContent* cms::SiPixelDigitizer::PileupInfo_
private

Definition at line 99 of file SiPixelDigitizer.h.

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

const bool cms::SiPixelDigitizer::pilotBlades
private

Definition at line 101 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 95 of file SiPixelDigitizer.h.

Referenced by accumulatePixelHits(), and initializeEvent().

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

Definition at line 97 of file SiPixelDigitizer.h.

Referenced by randomEngine().

const vstring cms::SiPixelDigitizer::trackerContainers
private

Definition at line 92 of file SiPixelDigitizer.h.

Referenced by accumulate(), and SiPixelDigitizer().