CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CSCDigiToRaw.cc
Go to the documentation of this file.
1 
15 #include "boost/dynamic_bitset.hpp"
16 #include "boost/foreach.hpp"
25 #include <algorithm>
26 
27 using namespace edm;
28 using namespace std;
29 
31 : requirePreTrigger_(pset.getParameter<bool>("requirePreTrigger")),
32  requireCLCTForComparators_(pset.getParameter<bool>("requireCLCTForComparators"))
33 {}
34 
35 void CSCDigiToRaw::beginEvent(const CSCChamberMap* electronicsMap)
36 {
37  theChamberDataMap.clear();
38  theElectronicsMap = electronicsMap;
39 }
40 
41 
43 {
44  CSCDetId chamberId = chamberID(cscDetId);
45 
46  //std::cout<<"wire id"<<cscDetId<<std::endl;
47  // find the entry into the map
48  map<CSCDetId, CSCEventData>::iterator chamberMapItr = theChamberDataMap.find(chamberId);
49  if(chamberMapItr == theChamberDataMap.end())
50  {
51  // make an entry, telling it the correct chamberType
52  int chamberType = chamberId.iChamberType();
53  chamberMapItr = theChamberDataMap.insert(pair<CSCDetId, CSCEventData>(chamberId, CSCEventData(chamberType))).first;
54  }
55  CSCEventData & cscData = chamberMapItr->second;
56  cscData.dmbHeader()->setCrateAddress(theElectronicsMap->crate(cscDetId), theElectronicsMap->dmb(cscDetId));
57  return cscData;
58 }
59 
60 
61 
62 void CSCDigiToRaw::add(const CSCStripDigiCollection& stripDigis,
63  const CSCCLCTPreTriggerCollection & preTriggers)
64 { //iterate over chambers with strip digis in them
65  for (CSCStripDigiCollection::DigiRangeIterator j=stripDigis.begin(); j!=stripDigis.end(); ++j)
66  {
67  CSCDetId cscDetId=(*j).first;
68  CSCDetId chamberId = chamberID(cscDetId);
69 
70  // only digitize if there are pre-triggers
71  CSCCLCTPreTriggerCollection::Range preTriggerRange = preTriggers.get(chamberId);
72  if(!requirePreTrigger_ || preTriggerRange.first != preTriggerRange.second)
73  {
74  bool me1a = (cscDetId.station()==1) && (cscDetId.ring()==4);
75  bool zplus = (cscDetId.endcap() == 1);
76  bool me1b = (cscDetId.station()==1) && (cscDetId.ring()==1);
77 
78  CSCEventData & cscData = findEventData(cscDetId);
79 
80  std::vector<CSCStripDigi>::const_iterator digiItr = (*j).second.first;
81  std::vector<CSCStripDigi>::const_iterator last = (*j).second.second;
82  for( ; digiItr != last; ++digiItr)
83  {
84  CSCStripDigi digi = *digiItr;
85  int strip = digi.getStrip();
86  if ( me1a && zplus ) { digi.setStrip(17-strip); } // 1-16 -> 16-1
87  if ( me1b && !zplus) { digi.setStrip(65-strip);} // 1-64 -> 64-1
88  if ( me1a ) { strip = digi.getStrip(); digi.setStrip(strip+64);} // reset back 1-16 to 65-80 digi
89  cscData.add(digi, cscDetId.layer() );
90  }
91  }
92  }
93 }
94 
95 
97 {
98  for (CSCWireDigiCollection::DigiRangeIterator j=wireDigis.begin(); j!=wireDigis.end(); ++j)
99  {
100  CSCDetId cscDetId=(*j).first;
101  CSCEventData & cscData = findEventData(cscDetId);
102 
103  std::vector<CSCWireDigi>::const_iterator digiItr = (*j).second.first;
104  std::vector<CSCWireDigi>::const_iterator last = (*j).second.second;
105  for( ; digiItr != last; ++digiItr)
106  {
107  cscData.add(*digiItr, cscDetId.layer() );
108  }
109  }
110 
111 }
112 
113 void CSCDigiToRaw::add(const CSCComparatorDigiCollection & comparatorDigis,
114  const CSCCLCTDigiCollection & clctDigis)
115 {
116  for (CSCComparatorDigiCollection::DigiRangeIterator j=comparatorDigis.begin(); j!=comparatorDigis.end(); ++j)
117  {
118  CSCDetId cscDetId=(*j).first;
119  CSCEventData & cscData = findEventData(cscDetId);
120 
121  CSCDetId chamberId = chamberID(cscDetId);
122  CSCCLCTDigiCollection::Range chamberClcts = clctDigis.get(chamberId);
123  if(!requireCLCTForComparators_ || chamberClcts.first != chamberClcts.second)
124  {
125  bool me1a = (cscDetId.station()==1) && (cscDetId.ring()==4);
126 
127  BOOST_FOREACH(CSCComparatorDigi digi, (*j).second)
128  {
129  // Move ME1/A comparators from CFEB=0 to CFEB=4 if this has not
130  // been done already.
131  if (me1a && digi.getStrip() <= 16) {
132  CSCComparatorDigi digi_corr(64+digi.getStrip(),
133  digi.getComparator(),
134  digi.getTimeBinWord());
135  cscData.add(digi_corr, cscDetId.layer());
136  }
137  else {
138  cscData.add(digi, cscDetId.layer());
139  }
140  }
141  }
142  }
143 }
144 
146 {
147  for (CSCALCTDigiCollection::DigiRangeIterator j=alctDigis.begin(); j!=alctDigis.end(); ++j)
148  {
149  CSCDetId cscDetId=(*j).first;
150  CSCEventData & cscData = findEventData(cscDetId);
151 
152  cscData.add(std::vector<CSCALCTDigi>((*j).second.first, (*j).second.second));
153  }
154 }
155 
157 {
158  for (CSCCLCTDigiCollection::DigiRangeIterator j=clctDigis.begin(); j!=clctDigis.end(); ++j)
159  {
160  CSCDetId cscDetId=(*j).first;
161  CSCEventData & cscData = findEventData(cscDetId);
162 
163  cscData.add(std::vector<CSCCLCTDigi>((*j).second.first, (*j).second.second));
164  }
165 }
166 
168 {
169  for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator j=corrLCTDigis.begin(); j!=corrLCTDigis.end(); ++j)
170  {
171  CSCDetId cscDetId=(*j).first;
172  CSCEventData & cscData = findEventData(cscDetId);
173 
174  cscData.add(std::vector<CSCCorrelatedLCTDigi>((*j).second.first, (*j).second.second));
175  }
176 
177 }
178 
179 
180 CSCDetId CSCDigiToRaw::chamberID(const CSCDetId & cscDetId) const {
181  CSCDetId chamberId = cscDetId.chamberId();
182  if(chamberId.ring() ==4)
183  {
184  chamberId = CSCDetId(chamberId.endcap(), chamberId.station(), 1, chamberId.chamber(), 0);
185  }
186  return chamberId;
187 }
188 
189 
191  const CSCWireDigiCollection& wireDigis,
192  const CSCComparatorDigiCollection& comparatorDigis,
193  const CSCALCTDigiCollection& alctDigis,
194  const CSCCLCTDigiCollection& clctDigis,
195  const CSCCLCTPreTriggerCollection & preTriggers,
196  const CSCCorrelatedLCTDigiCollection& correlatedLCTDigis,
197  FEDRawDataCollection& fed_buffers,
198  const CSCChamberMap* mapping,
199  Event & e)
200 {
201 
202  //bits of code from ORCA/Muon/METBFormatter - thanks, Rick:)!
203 
204  //get fed object from fed_buffers
205  // make a map from the index of a chamber to the event data from it
206  beginEvent(mapping);
207  add(stripDigis, preTriggers);
208  add(wireDigis);
209  add(comparatorDigis, clctDigis);
210  add(alctDigis);
211  add(clctDigis);
212  add(correlatedLCTDigis);
213 
214  int l1a=e.id().event(); //need to add increments or get it from lct digis
215  int bx = 0;//same as above
216  //int startingFED = FEDNumbering::MINCSCFEDID;
217 
218  std::map<int, CSCDCCEventData> dccMap;
219  for (int idcc=FEDNumbering::MINCSCFEDID;
220  idcc<=FEDNumbering::MAXCSCFEDID;++idcc)
221  {
222  //idcc goes from startingFed to startingFED+7
223  // @@ if ReadoutMapping changes, this'll have to change
224  // DCCs 1,2,4,5 have 5 DDUs. Otherwise, 4
225  //int nDDUs = (idcc < 2) || (idcc ==4) || (idcc ==5)
226  // ? 5 : 4;
227  //@@ WARNING some DCCs only have 4 DDUs, but I'm giving them all 5, for now
228  int nDDUs = 5;
229  dccMap.insert(std::pair<int, CSCDCCEventData>(idcc, CSCDCCEventData(idcc, nDDUs, bx, l1a) ) );
230 
231  // for every chamber with data, add to a DDU in this DCC Event
232  for(map<CSCDetId, CSCEventData>::iterator chamberItr = theChamberDataMap.begin();
233  chamberItr != theChamberDataMap.end(); ++chamberItr)
234  {
235  //std::cout<<"inside the pack loop" <<std::endl;
236  int indexDCC = mapping->slink(chamberItr->first);
237  if(indexDCC == idcc)
238  {
239  //FIXME (What does this mean? Is something wrong?)
240  std::map<int, CSCDCCEventData>::iterator dccMapItr = dccMap.find(indexDCC);
241  if(dccMapItr == dccMap.end())
242  {
243  throw cms::Exception("CSCDigiToRaw") << "Bad DCC number:" << indexDCC;
244  }
245  // get id's based on ChamberId from mapping
246 
247  int dduId = mapping->ddu(chamberItr->first);
248  int dduSlot = mapping->dduSlot(chamberItr->first);
249  int dduInput = mapping->dduInput(chamberItr->first);
250  int dmbId = mapping->dmb(chamberItr->first);
251  dccMapItr->second.addChamber(chamberItr->second, dduId, dduSlot, dduInput, dmbId);
252  }
253  }
254  }
255 
256  // FIXME: FEDRawData size set to 2*64 to add FED header and trailer
257  for(std::map<int, CSCDCCEventData>::iterator dccMapItr = dccMap.begin();
258  dccMapItr != dccMap.end(); ++dccMapItr)
259  {
260  boost::dynamic_bitset<> dccBits = dccMapItr->second.pack();
261  FEDRawData & fedRawData = fed_buffers.FEDData(dccMapItr->first);
262  fedRawData.resize(dccBits.size());
263  //fill data with dccEvent
264  bitset_utilities::bitsetToChar(dccBits, fedRawData.data());
265  FEDTrailer cscFEDTrailer(fedRawData.data()+(fedRawData.size()-8));
266  cscFEDTrailer.set(fedRawData.data()+(fedRawData.size()-8),
267  fedRawData.size()/8,
268  evf::compute_crc(fedRawData.data(),fedRawData.size()), 0, 0);
269  }
270 }
271 
272 
273 
01/20/05 A.Tumanov
int chamber() const
Definition: CSCDetId.h:70
EventNumber_t event() const
Definition: EventID.h:44
void add(const CSCStripDigiCollection &stripDigis, const CSCCLCTPreTriggerCollection &preTriggers)
Definition: CSCDigiToRaw.cc:62
int getStrip() const
Get the strip number.
void strip(std::string &input, const std::string &blanks=" \n\t")
Definition: stringTools.cc:16
void createFedBuffers(const CSCStripDigiCollection &stripDigis, const CSCWireDigiCollection &wireDigis, const CSCComparatorDigiCollection &comparatorDigis, const CSCALCTDigiCollection &alctDigis, const CSCCLCTDigiCollection &clctDigis, const CSCCLCTPreTriggerCollection &preTriggers, const CSCCorrelatedLCTDigiCollection &correlatedLCTDigis, FEDRawDataCollection &fed_buffers, const CSCChamberMap *theMapping, edm::Event &e)
Take a vector of digis and fill the FEDRawDataCollection.
int ddu(const CSCDetId &) const
ddu id for given DetId
int dmb(const CSCDetId &) const
dmb id for given DetId
bool requireCLCTForComparators_
Definition: CSCDigiToRaw.h:66
int getComparator() const
Get Comparator readings.
int layer() const
Definition: CSCDetId.h:63
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
int getStrip() const
Definition: CSCStripDigi.h:39
int endcap() const
Definition: CSCDetId.h:95
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
void setStrip(int istrip)
Definition: CSCStripDigi.h:53
const CSCChamberMap * theElectronicsMap
Definition: CSCDigiToRaw.h:63
void resize(size_t newsize)
Definition: FEDRawData.cc:33
int slink(const CSCDetId &) const
slink id for given DetId
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
Definition: CRC16.h:67
int dduInput(const CSCDetId &) const
ddu input for given DetId
bool requirePreTrigger_
Definition: CSCDigiToRaw.h:65
int j
Definition: DBlmapReader.cc:9
CSCDetId chamberId() const
Definition: CSCDetId.h:55
tuple pset
Definition: CrabTask.py:85
CSCDigiToRaw(const edm::ParameterSet &pset)
Constructor.
Definition: CSCDigiToRaw.cc:30
int getTimeBinWord() const
Return the word with each bit corresponding to a time bin.
void beginEvent(const CSCChamberMap *electronicsMap)
Definition: CSCDigiToRaw.cc:35
void setCrateAddress(int crate, int dmbId)
Definition: CSCDMBHeader.cc:91
unsigned short iChamberType()
Definition: CSCDetId.h:109
int ring() const
Definition: CSCDetId.h:77
std::map< CSCDetId, CSCEventData > theChamberDataMap
Definition: CSCDigiToRaw.h:62
void bitsetToChar(const boost::dynamic_bitset<> &bs, unsigned char *result)
this method takes bitset obj and returns char * array
int crate(const CSCDetId &) const
Interface required use in digi-to-raw.
int dduSlot(const CSCDetId &) const
ddu slot for given DetId
CSCEventData & findEventData(const CSCDetId &cscDetId)
pick out the correct data object for this chamber
Definition: CSCDigiToRaw.cc:42
void add(const CSCStripDigi &, int layer)
routines to add digis to the data
edm::EventID id() const
Definition: EventBase.h:56
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:29
CSCDetId chamberID(const CSCDetId &cscDetId) const
takes layer ID, converts to chamber ID, switching ME1A to ME11
int station() const
Definition: CSCDetId.h:88
std::pair< const_iterator, const_iterator > Range
const CSCDMBHeader * dmbHeader() const
the DAQ motherboard header. A good place for event and chamber info
Definition: CSCEventData.h:90