CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DataMixingSiPixelWorker.cc
Go to the documentation of this file.
1 // File: DataMixingSiPixelWorker.cc
2 // Description: see DataMixingSiPixelWorker.h
3 // Author: Mike Hildreth, University of Notre Dame
4 //
5 //--------------------------------------------
6 
7 #include <map>
15 //
16 //
18 
19 
20 using namespace std;
21 
22 namespace edm
23 {
24 
25  // Virtual constructor
26 
27  DataMixingSiPixelWorker::DataMixingSiPixelWorker() { sel_=0;}
28 
29  // Constructor
30  DataMixingSiPixelWorker::DataMixingSiPixelWorker(const edm::ParameterSet& ps) :
31  label_(ps.getParameter<std::string>("Label"))
32 
33  {
34 
35  // get the subdetector names
36  // this->getSubdetectorNames(); //something like this may be useful to check what we are supposed to do...
37 
38  // create input selector
39  if (label_.size()>0){
41  }
42  else {
44  }
45 
46  // declare the products to produce
47 
48  pixeldigi_collectionSig_ = ps.getParameter<edm::InputTag>("pixeldigiCollectionSig");
49  pixeldigi_collectionPile_ = ps.getParameter<edm::InputTag>("pixeldigiCollectionPile");
50  PixelDigiCollectionDM_ = ps.getParameter<std::string>("PixelDigiCollectionDM");
51 
52  // clear local storage for this event
53  SiHitStorage_.clear();
54 
55  }
56 
57 
58  // Virtual destructor needed.
60  delete sel_;
61  sel_=0;
62  }
63 
64 
65 
67  // fill in maps of hits
68 
69  LogDebug("DataMixingSiPixelWorker")<<"===============> adding MC signals for "<<e.id();
70 
72 
73  if( e.getByLabel(pixeldigi_collectionSig_,input) ) {
74 
75  //loop on all detsets (detectorIDs) inside the input collection
76  edm::DetSetVector<PixelDigi>::const_iterator DSViter=input->begin();
77  for (; DSViter!=input->end();DSViter++){
78 
79 #ifdef DEBUG
80  LogDebug("DataMixingSiPixelWorker") << "Processing DetID " << DSViter->id;
81 #endif
82 
83  uint32_t detID = DSViter->id;
87 
88  OneDetectorMap LocalMap;
89 
90  for (icopy=begin; icopy!=end; icopy++) {
91  LocalMap.insert(OneDetectorMap::value_type( (icopy->channel()), *icopy ));
92  }
93 
94  SiHitStorage_.insert( SiGlobalIndex::value_type( detID, LocalMap ) );
95  }
96 
97  }
98  } // end of addSiPixelSignals
99 
100 
101 
102  void DataMixingSiPixelWorker::addSiPixelPileups(const int bcr, const EventPrincipal *ep, unsigned int eventNr) {
103 
104  LogDebug("DataMixingSiPixelWorker") <<"\n===============> adding pileups from event "<<ep->id()<<" for bunchcrossing "<<bcr;
105 
106  // fill in maps of hits; same code as addSignals, except now applied to the pileup events
107 
108  boost::shared_ptr<Wrapper<edm::DetSetVector<PixelDigi> > const> inputPTR =
109  getProductByTag<edm::DetSetVector<PixelDigi> >(*ep, pixeldigi_collectionPile_ );
110 
111  if(inputPTR ) {
112 
113  const edm::DetSetVector<PixelDigi> *input = const_cast< edm::DetSetVector<PixelDigi> * >(inputPTR->product());
114 
115 
116 
117  // Handle< edm::DetSetVector<PixelDigi> > input;
118 
119  // if( e->getByLabel(pixeldigi_collectionPile_,input) ) {
120 
121  //loop on all detsets (detectorIDs) inside the input collection
123  for (; DSViter!=input->end();DSViter++){
124 
125 #ifdef DEBUG
126  LogDebug("DataMixingSiPixelWorker") << "Pileups: Processing DetID " << DSViter->id;
127 #endif
128 
129  uint32_t detID = DSViter->id;
133 
134  // find correct local map (or new one) for this detector ID
135 
136  SiGlobalIndex::const_iterator itest;
137 
138  itest = SiHitStorage_.find(detID);
139 
140  if(itest!=SiHitStorage_.end()) { // this detID already has hits, add to existing map
141 
142  OneDetectorMap LocalMap = itest->second;
143 
144  // fill in local map with extra channels
145  for (icopy=begin; icopy!=end; icopy++) {
146  LocalMap.insert(OneDetectorMap::value_type( (icopy->channel()), *icopy ));
147  }
148 
149  SiHitStorage_[detID]=LocalMap;
150 
151  }
152  else{ // fill local storage with this information, put in global collection
153 
154  OneDetectorMap LocalMap;
155 
156  for (icopy=begin; icopy!=end; icopy++) {
157  LocalMap.insert(OneDetectorMap::value_type( (icopy->channel()), *icopy ));
158  }
159 
160  SiHitStorage_.insert( SiGlobalIndex::value_type( detID, LocalMap ) );
161  }
162 
163  }
164  }
165  }
166 
167 
168 
170 
171  // collection of Digis to put in the event
172 
173  std::vector< edm::DetSet<PixelDigi> > vPixelDigi;
174 
175  // loop through our collection of detectors, merging hits and putting new ones in the output
176 
177  // big loop over Detector IDs:
178 
179  for(SiGlobalIndex::const_iterator IDet = SiHitStorage_.begin();
180  IDet != SiHitStorage_.end(); IDet++) {
181 
182  edm::DetSet<PixelDigi> SPD(IDet->first); // Make empty collection with this detector ID
183 
184  OneDetectorMap LocalMap = IDet->second;
185 
186  //counter variables
187  int formerPixel = -1;
188  int currentPixel;
189  int ADCSum = 0;
190 
191 
192  OneDetectorMap::const_iterator iLocalchk;
193 
194  for(OneDetectorMap::const_iterator iLocal = LocalMap.begin();
195  iLocal != LocalMap.end(); ++iLocal) {
196 
197  currentPixel = iLocal->first;
198 
199  if (currentPixel == formerPixel) { // we have to add these digis together
200  ADCSum+=(iLocal->second).adc();
201  }
202  else{
203  if(formerPixel!=-1){ // ADC info stolen from SiStrips...
204  if (ADCSum > 511) ADCSum = 255;
205  else if (ADCSum > 253 && ADCSum < 512) ADCSum = 254;
206  PixelDigi aHit(formerPixel, ADCSum);
207  SPD.push_back( aHit );
208  }
209  // save pointers for next iteration
210  formerPixel = currentPixel;
211  ADCSum = (iLocal->second).adc();
212  }
213 
214  iLocalchk = iLocal;
215  if((++iLocalchk) == LocalMap.end()) { //make sure not to lose the last one
216  if (ADCSum > 511) ADCSum = 255;
217  else if (ADCSum > 253 && ADCSum < 512) ADCSum = 254;
218  SPD.push_back( PixelDigi(formerPixel, ADCSum) );
219  }
220 
221  }// end of loop over one detector
222 
223  // stick this into the global vector of detector info
224  vPixelDigi.push_back(SPD);
225 
226  } // end of big loop over all detector IDs
227 
228  // put the collection of digis in the event
229  LogInfo("DataMixingSiPixelWorker") << "total # Merged Pixels: " << vPixelDigi.size() ;
230 
231  // make new digi collection
232 
233  std::auto_ptr< edm::DetSetVector<PixelDigi> > MyPixelDigis(new edm::DetSetVector<PixelDigi>(vPixelDigi) );
234 
235  // put collection
236 
237  e.put( MyPixelDigis, PixelDigiCollectionDM_ );
238 
239  // clear local storage for this event
240  SiHitStorage_.clear();
241  }
242 
243 } //edm
int adc(sample_type sample)
get the ADC sample (12 bits)
#define LogDebug(id)
T getParameter(std::string const &) const
void push_back(const T &t)
Definition: DetSet.h:69
void addSiPixelPileups(const int bcr, const edm::EventPrincipal *, unsigned int EventId)
EventID const & id() const
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
#define end
Definition: vmac.h:38
Container::value_type value_type
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:356
std::multimap< int, PixelDigi > OneDetectorMap
edm::EventID id() const
Definition: EventBase.h:56
#define begin
Definition: vmac.h:31
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:341
collection_type::const_iterator const_iterator
Definition: DetSet.h:34
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:106
void addSiPixelSignals(const edm::Event &e)