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, std::vector< edm::EventID > &eventInfoList, 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 49 of file SiPixelDigitizer.h.

Member Typedef Documentation

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

Definition at line 92 of file SiPixelDigitizer.h.

Constructor & Destructor Documentation

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

Definition at line 94 of file SiPixelDigitizer.cc.

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

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

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

Member Function Documentation

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

Implements DigiAccumulatorMixMod.

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

205  {
206  // Step A: Get Inputs
207  for(vstring::const_iterator i = trackerContainers.begin(), iEnd = trackerContainers.end(); i != iEnd; ++i) {
210 
211  iEvent.getByLabel(tag, simHits);
212  unsigned int tofBin = PixelDigiSimLink::LowTof;
213  if ((*i).find(std::string("HighTof")) != std::string::npos) tofBin = PixelDigiSimLink::HighTof;
214  accumulatePixelHits(simHits, crossingSimHitIndexOffset_[tag.encode()], tofBin, randomEngine(iEvent.streamID()), iSetup);
215  // Now that the hits have been processed, I'll add the amount of hits in this crossing on to
216  // the global counter. Next time accumulateStripHits() is called it will count the sim hits
217  // as though they were on the end of this collection.
218  // Note that this is only used for creating digi-sim links (if configured to do so).
219 // std::cout << "index offset, current hit count = " << crossingSimHitIndexOffset_[tag.encode()] << ", " << simHits->size() << std::endl;
220  if( simHits.isValid() ) crossingSimHitIndexOffset_[tag.encode()]+=simHits->size();
221  }
222  }
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:75
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 225 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.

225  {
226  // Step A: Get Inputs
227  for(vstring::const_iterator i = trackerContainers.begin(), iEnd = trackerContainers.end(); i != iEnd; ++i) {
230 
231  iEvent.getByLabel(tag, simHits);
232  unsigned int tofBin = PixelDigiSimLink::LowTof;
233  if ((*i).find(std::string("HighTof")) != std::string::npos) tofBin = PixelDigiSimLink::HighTof;
234  accumulatePixelHits(simHits, crossingSimHitIndexOffset_[tag.encode()], tofBin, randomEngine(streamID), iSetup);
235  // Now that the hits have been processed, I'll add the amount of hits in this crossing on to
236  // the global counter. Next time accumulateStripHits() is called it will count the sim hits
237  // as though they were on the end of this collection.
238  // Note that this is only used for creating digi-sim links (if configured to do so).
239 // std::cout << "index offset, current hit count = " << crossingSimHitIndexOffset_[tag.encode()] << ", " << simHits->size() << std::endl;
240  if( simHits.isValid() ) crossingSimHitIndexOffset_[tag.encode()]+=simHits->size();
241  }
242  }
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:75
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 134 of file SiPixelDigitizer.cc.

References _pixeldigialgo, assert(), detectorUnits, edm::EventSetup::get(), GeomDetEnumerators::isTrackerPixel(), LogDebug, edm::ESHandle< class >::product(), pSetup, and trackerHits::simHits.

Referenced by accumulate().

138  {
139  if(hSimHits.isValid()) {
140  std::set<unsigned int> detIds;
141  std::vector<PSimHit> const& simHits = *hSimHits.product();
143  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
144  const TrackerTopology *tTopo=tTopoHand.product();
145  for(std::vector<PSimHit>::const_iterator it = simHits.begin(), itEnd = simHits.end(); it != itEnd; ++it, ++globalSimHitIndex) {
146  unsigned int detId = (*it).detUnitId();
147  if(detIds.insert(detId).second) {
148  // The insert succeeded, so this detector element has not yet been processed.
149  assert(detectorUnits[detId]);
150  if(detectorUnits[detId] && detectorUnits[detId]->type().isTrackerPixel()) { // this test could be avoided and changed into a check of pixdet!=0
151  std::map<unsigned int, PixelGeomDetUnit const *>::iterator itDet = detectorUnits.find(detId);
152  if (itDet == detectorUnits.end()) continue;
153  auto pixdet = itDet->second;
154  assert(pixdet !=0);
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)
type
Definition: HCALResponse.h:21
assert(m_qm.get())
std::map< unsigned int, PixelGeomDetUnit const * > detectorUnits
edm::ESHandle< MagneticField > pSetup
bool isValid() const
Definition: HandleBase.h:75
std::unique_ptr< SiPixelDigitizerAlgorithm > _pixeldigialgo
T const * product() const
Definition: Handle.h:81
T const * product() const
Definition: ESHandle.h:86
tuple simHits
Definition: trackerHits.py:16
bool isTrackerPixel(const GeomDetEnumerators::SubDetector m)
virtual void cms::SiPixelDigitizer::beginJob ( void  )
inlinevirtual

Definition at line 61 of file SiPixelDigitizer.h.

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

Implements DigiAccumulatorMixMod.

Definition at line 246 of file SiPixelDigitizer.cc.

References _pixeldigialgo, edm::EventSetup::get(), edm::RandomNumberGenerator::getEngine(), getEventPileupInfo(), eostools::move(), convertSQLitetoXML_cfg::output, pDD, PileupInfo_, edm::ESHandle< class >::product(), edm::Event::put(), and edm::Event::streamID().

246  {
247 
249  CLHEP::HepRandomEngine* engine = &rng->getEngine(iEvent.streamID());
250 
252  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
253  const TrackerTopology *tTopo=tTopoHand.product();
254 
255  std::vector<edm::DetSet<PixelDigi> > theDigiVector;
256  std::vector<edm::DetSet<PixelDigiSimLink> > theDigiLinkVector;
257 
259  _pixeldigialgo->calculateInstlumiFactor(PileupInfo_);
260 
261  for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){
262 
263  if((*iu)->type().isTrackerPixel()) {
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
def move
Definition: eostools.py:508
edm::ESHandle< TrackerGeometry > pDD
std::unique_ptr< SiPixelDigitizerAlgorithm > _pixeldigialgo
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 70 of file SiPixelDigitizer.h.

References PileupInfo_.

Referenced by finalizeEvent().

70 { 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, assert(), crossingSimHitIndexOffset_, detectorUnits, first, geometryType, edm::EventSetup::get(), TrackerTopology::layer(), NumberOfEndcapDisks, pDD, pilotBlades, GeomDetEnumerators::PixelEndcap, edm::ESHandle< class >::product(), and pSetup.

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  if((*iu)->type().isTrackerPixel()) {
191  auto pixdet = dynamic_cast<const PixelGeomDetUnit*>((*iu));
192  assert(pixdet != 0);
193  if ((*iu)->subDetector()==GeomDetEnumerators::SubDetector::PixelEndcap) { // true ONLY for the phase 0 pixel deetctor
194  unsigned int disk = tTopo->layer(detId); // using the generic layer method
195  //if using pilot blades, then allowing it for current detector only
196  if ((disk == 3)&&((!pilotBlades)&&(NumberOfEndcapDisks == 2))) continue;
197  }
198  detectorUnits.insert(std::make_pair(detId, pixdet));
199  }
200  }
201  }
202  }
assert(m_qm.get())
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
std::unique_ptr< SiPixelDigitizerAlgorithm > _pixeldigialgo
T const * product() const
Definition: ESHandle.h:86
const std::string geometryType
unsigned int layer(const DetId &id) const
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,
std::vector< edm::EventID > &  eventInfoList,
int  bunchSpacing 
)
inlinevirtual

Reimplemented from DigiAccumulatorMixMod.

Definition at line 63 of file SiPixelDigitizer.h.

References PileupInfo_.

66  {
67  PileupInfo_ = new PileupMixingContent(numInteractionList, bunchCrossingList, TrueInteractionList, eventInfoList, bunchSpacing);
68  }
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 90 of file SiPixelDigitizer.h.

Referenced by accumulate(), and initializeEvent().

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

Definition at line 98 of file SiPixelDigitizer.h.

Referenced by accumulatePixelHits(), and initializeEvent().

bool cms::SiPixelDigitizer::first
private

Definition at line 80 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 95 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 93 of file SiPixelDigitizer.h.

Referenced by accumulate(), and SiPixelDigitizer().

const int cms::SiPixelDigitizer::NumberOfEndcapDisks
private

Definition at line 104 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 96 of file SiPixelDigitizer.h.

Referenced by finalizeEvent(), and initializeEvent().

PileupMixingContent* cms::SiPixelDigitizer::PileupInfo_
private

Definition at line 101 of file SiPixelDigitizer.h.

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

const bool cms::SiPixelDigitizer::pilotBlades
private

Definition at line 103 of file SiPixelDigitizer.h.

Referenced by initializeEvent().

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

Definition at line 97 of file SiPixelDigitizer.h.

Referenced by accumulatePixelHits(), and initializeEvent().

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

Definition at line 99 of file SiPixelDigitizer.h.

Referenced by randomEngine().

const vstring cms::SiPixelDigitizer::trackerContainers
private

Definition at line 94 of file SiPixelDigitizer.h.

Referenced by accumulate(), and SiPixelDigitizer().