CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalDCC07UnpackingModule.cc
Go to the documentation of this file.
1 /* \file EcalDCCTB07UnpackingModule.h
2  *
3  * $Date: 2012/09/12 18:18:44 $
4  * $Revision: 1.13 $
5  * \author Y. Maravin
6  * \author G. Franzoni
7  * \author G. Della Ricca
8  */
9 
27 
28 
29 #include <iostream>
30 #include <iomanip>
31 
32 // in full CMS this range cannot be used (allocated to pixel, see DataFormats/ FEDRawData/ src/ FEDNumbering.cc)
33 #define BEG_DCC_FED_ID 0
34 #define END_DCC_FED_ID 0
35 #define BEG_DCC_FED_ID_GLOBAL 0
36 #define END_DCC_FED_ID_GLOBAL 0
37 
38 #define ECAL_SUPERVISOR_FED_ID 40
39 #define TBCAMAC_FED_ID 41
40 #define TABLE_FED_ID 42
41 #define MATACQ_FED_ID 43
42 
44  fedRawDataCollectionTag_(pset.getParameter<edm::InputTag>("fedRawDataCollectionTag")) {
45 
46  std::string tbName = pset.getUntrackedParameter<std::string >("tbName", std::string("h2") );
47 
48  ProduceEEDigis_ = pset.getUntrackedParameter<bool >("produceEEdigi", true );
49  ProduceEBDigis_ = pset.getUntrackedParameter<bool >("produceEBdigi", false );
50 
51  // index of crystal <-> tower ID (DQM plots) position <-> stripIDs <-> channelIDs for the test beam (2007)
52  std::vector<int> ics = pset.getUntrackedParameter<std::vector<int> >("ics", std::vector<int>());
53  std::vector<int> towerIDs = pset.getUntrackedParameter<std::vector<int> >("towerIDs", std::vector<int>());
54  std::vector<int> stripIDs = pset.getUntrackedParameter<std::vector<int> >("stripIDs", std::vector<int>());
55  std::vector<int> channelIDs = pset.getUntrackedParameter<std::vector<int> >("channelIDs", std::vector<int>());
56 
57  // status id <-> tower CCU ID <-> DQM plots position mapping for the test beam (2007)
58  std::vector<int> statusIDs = pset.getUntrackedParameter<std::vector<int> >("statusIDs", std::vector<int>());
59  std::vector<int> ccuIDs = pset.getUntrackedParameter<std::vector<int> >("ccuIDs", std::vector<int>());
60  std::vector<int> positionIDs = pset.getUntrackedParameter<std::vector<int> >("positionIDs", std::vector<int>());
61 
62  // check if vectors are filled
63  if ( ics.size() == 0 || towerIDs.size() == 0 || stripIDs.size() == 0 || channelIDs.size() == 0 ){
64  edm::LogError("EcalDCCTB07UnpackingModule") << "Some of the mapping info is missing! Check config files! " <<
65  " Size of IC vector is " << ics.size() <<
66  " Size of Tower ID vector is " << towerIDs.size() <<
67  " Size of Strip ID vector is " << stripIDs.size() <<
68  " Size of Channel ID vector is " << channelIDs.size();
69  }
70  if ( statusIDs.size() == 0 || ccuIDs.size() == 0 || positionIDs.size() == 0 ) {
71  edm::LogError("EcalDCCTB07UnpackingModule") << "Some of the mapping info is missing! Check config files! " <<
72  " Size of status ID vector is " << statusIDs.size() <<
73  " Size of ccu ID vector is " << ccuIDs.size() <<
74  " positionIDs size is " << positionIDs.size();
75  }
76 
77  // check if vectors have the same size
78  if ( ics.size() != towerIDs.size() || ics.size() != stripIDs.size() || ics.size() != channelIDs.size() ||
79  towerIDs.size() != stripIDs.size() || towerIDs.size() != channelIDs.size() ||
80  stripIDs.size() != channelIDs.size() )
81  edm::LogError("EcalDCCTB07UnpackingModule") << "Mapping information is corrupted. " <<
82  "Tower/DQM position/strip/channel vectors are of different size! Check cfi files! \n" <<
83  " Size of IC vector is " << ics.size() <<
84  " Size of Tower ID vector is " << towerIDs.size() <<
85  " Size of Strip ID vector is " << stripIDs.size() <<
86  " Size of Channel ID vector is " << channelIDs.size();
87 
88  if ( statusIDs.size() != ccuIDs.size() || statusIDs.size() != positionIDs.size() ||
89  ccuIDs.size() != positionIDs.size() )
90  edm::LogError("EcalDCCTB07UnpackingModule") << "Mapping information is corrupted. " <<
91  "Status/CCU ID/DQM position vectors are of different size! Check cfi files! \n" <<
92  " Size of status ID vector is " << statusIDs.size() <<
93  " Size of ccu ID vector is " << ccuIDs.size() <<
94  " positionIDs size is " << positionIDs.size();
95 
96  int cryIcMap[68][5][5];
97  int tbStatusToLocation[71];
98  int tbTowerIDToLocation[201];
99  for (unsigned it=1; it <= 68; ++it )
100  for (unsigned is=1; is <=5; ++is )
101  for (unsigned ic=1; ic <=5; ++ic)
102  cryIcMap[it-1][is-1][ic-1] = 1700;
103 
104  for (unsigned it=1; it <=71; ++it)
105  tbStatusToLocation[it-1] = it - 1;
106 
107  for (unsigned it=1; it <= 201; ++it)
108  tbTowerIDToLocation[it-1] = it - 1;
109 
110  // Fill the cry IC map
111  for(unsigned int i=0; i < ics.size(); ++i) {
112  int tower = towerIDs[i];
113  int strip = stripIDs[i];
114  int channel = channelIDs[i];
115  int ic = ics[i];
116  cryIcMap[tower-1][strip-1][channel-1] = ic;
117  }
118  for(unsigned int i = 0; i < statusIDs.size(); ++i) {
119  int is = statusIDs[i];
120  int it = ccuIDs[i];
121  int itEB = positionIDs[i];
122 
123  tbStatusToLocation[is] = itEB;
124  tbTowerIDToLocation[it] = itEB;
125  }
126 
127  formatter_ = new EcalTB07DaqFormatter(tbName, cryIcMap, tbStatusToLocation, tbTowerIDToLocation);
132 
133 
134  // digis
135  produces<EBDigiCollection>("ebDigis");
136  produces<EEDigiCollection>("eeDigis");
137  produces<EcalMatacqDigiCollection>();
138  produces<EcalPnDiodeDigiCollection>();
139  produces<EcalRawDataCollection>();
140  produces<EcalTrigPrimDigiCollection>("EBTT");
141 
142  //TB specifics data
143  produces<EcalTBHodoscopeRawInfo>();
144  produces<EcalTBTDCRawInfo>();
145  produces<EcalTBEventHeader>();
146 
147  // crystals' integrity
148  produces<EBDetIdCollection>("EcalIntegrityDCCSizeErrors");
149  produces<EcalElectronicsIdCollection>("EcalIntegrityTTIdErrors");
150  produces<EcalElectronicsIdCollection>("EcalIntegrityBlockSizeErrors");
151  produces<EBDetIdCollection>("EcalIntegrityChIdErrors");
152  produces<EBDetIdCollection>("EcalIntegrityGainErrors");
153  produces<EBDetIdCollection>("EcalIntegrityGainSwitchErrors");
154 
155  // mem channels' integrity
156  produces<EcalElectronicsIdCollection>("EcalIntegrityMemTtIdErrors");
157  produces<EcalElectronicsIdCollection>("EcalIntegrityMemBlockSize");
158  produces<EcalElectronicsIdCollection>("EcalIntegrityMemChIdErrors");
159  produces<EcalElectronicsIdCollection>("EcalIntegrityMemGainErrors");
160 }
161 
162 
164 
165  delete formatter_;
166 
167 }
168 
170 
171 }
172 
174 
175 }
176 
178 
181 
182 
183  // create the collection of Ecal Digis
184  std::auto_ptr<EBDigiCollection> productEb(new EBDigiCollection);
185 
186  // YM create the collection of Ecal Endcap Digis
187  std::auto_ptr<EEDigiCollection> productEe(new EEDigiCollection);
188 
189  // create the collection of Matacq Digi
190  std::auto_ptr<EcalMatacqDigiCollection> productMatacq(new EcalMatacqDigiCollection());
191 
192  // create the collection of Ecal PN's
193  std::auto_ptr<EcalPnDiodeDigiCollection> productPN(new EcalPnDiodeDigiCollection);
194 
195  //create the collection of Ecal DCC Header
196  std::auto_ptr<EcalRawDataCollection> productDCCHeader(new EcalRawDataCollection);
197 
198  // create the collection with trigger primitives, bits and flags
199  std::auto_ptr<EcalTrigPrimDigiCollection> productTriggerPrimitives(new EcalTrigPrimDigiCollection);
200 
201  // create the collection of Ecal Integrity DCC Size
202  std::auto_ptr<EBDetIdCollection> productDCCSize(new EBDetIdCollection);
203 
204  // create the collection of Ecal Integrity TT Id
205  std::auto_ptr<EcalElectronicsIdCollection> productTTId(new EcalElectronicsIdCollection);
206 
207  // create the collection of Ecal Integrity TT Block Size
208  std::auto_ptr<EcalElectronicsIdCollection> productBlockSize(new EcalElectronicsIdCollection);
209 
210  // create the collection of Ecal Integrity Ch Id
211  std::auto_ptr<EBDetIdCollection> productChId(new EBDetIdCollection);
212 
213  // create the collection of Ecal Integrity Gain
214  std::auto_ptr<EBDetIdCollection> productGain(new EBDetIdCollection);
215 
216  // create the collection of Ecal Integrity Gain Switch
217  std::auto_ptr<EBDetIdCollection> productGainSwitch(new EBDetIdCollection);
218 
219  // create the collection of Ecal Integrity Mem towerBlock_id errors
220  std::auto_ptr<EcalElectronicsIdCollection> productMemTtId(new EcalElectronicsIdCollection);
221 
222  // create the collection of Ecal Integrity Mem gain errors
223  std::auto_ptr< EcalElectronicsIdCollection> productMemBlockSize(new EcalElectronicsIdCollection);
224 
225  // create the collection of Ecal Integrity Mem gain errors
226  std::auto_ptr< EcalElectronicsIdCollection> productMemGain(new EcalElectronicsIdCollection);
227 
228  // create the collection of Ecal Integrity Mem ch_id errors
229  std::auto_ptr<EcalElectronicsIdCollection> productMemChIdErrors(new EcalElectronicsIdCollection);
230 
231  // create the collection of TB specifics data
232  std::auto_ptr<EcalTBHodoscopeRawInfo> productHodo(new EcalTBHodoscopeRawInfo());
233  std::auto_ptr<EcalTBTDCRawInfo> productTdc(new EcalTBTDCRawInfo());
234  std::auto_ptr<EcalTBEventHeader> productHeader(new EcalTBEventHeader());
235 
236 
237  try {
238 
239  for (int id= 0; id<=FEDNumbering::MAXFEDID; ++id){
240 
241  // edm::LogInfo("EcalDCCTB07UnpackingModule") << "EcalDCCTB07UnpackingModule::Got FED ID "<< id <<" ";
242  const FEDRawData& data = rawdata->FEDData(id);
243  // edm::LogInfo("EcalDCCTB07UnpackingModule") << " Fed data size " << data.size() ;
244 
245  //std::cout <<"1 Fed id: "<<dec<<id<< " Fed data size: " <<data.size() << std::endl;
246 // const unsigned char * pData = data.data();
247 // int length = data.size();
248 // if(length >0 ){
249 // if(length >= 40){length = 40;}
250 // std::cout<<"##############################################################"<<std::endl;
251 // for( int i=0; i<length; i++ ) {
252 // std::cout << std::hex << std::setw(8) << int(pData[i]) << " ";
253 // if( (i+1)%8 == 0 ) std::cout << std::endl;
254 // }
255 // std::cout<<"##############################################################"<<std::endl;
256 // }
257  if (data.size()>16){
258 
259  if ( (id >= BEG_DCC_FED_ID && id <= END_DCC_FED_ID) ||
261  )
262  { // do the DCC data unpacking and fill the collections
263 
264  (*productHeader).setSmInBeam(id);
265  // YM add productEe to the list of arguments of the formatter
266  formatter_->interpretRawData(data, *productEb, *productEe, *productPN,
267  *productDCCHeader,
268  *productDCCSize,
269  *productTTId, *productBlockSize,
270  *productChId, *productGain, *productGainSwitch,
271  *productMemTtId, *productMemBlockSize,
272  *productMemGain, *productMemChIdErrors,
273  *productTriggerPrimitives);
274  int runType = (*productDCCHeader)[0].getRunType();
275  if ( runType == EcalDCCHeaderBlock::COSMIC || runType == EcalDCCHeaderBlock::BEAMH4 )
276  (*productHeader).setTriggerMask(0x1);
277  else if ( runType == 4 || runType == 5 || runType == 6 ) //laser runs
278  (*productHeader).setTriggerMask(0x2000);
279  else if ( runType == 9 || runType == 10 || runType == 11 ) //pedestal runs
280  (*productHeader).setTriggerMask(0x800);
281  LogDebug("EcalDCCTB07UnpackingModule") << "Event type is " << (*productHeader).eventType() << " dbEventType " << (*productHeader).dbEventType();
282  }
283  else if ( id == ECAL_SUPERVISOR_FED_ID )
284  ecalSupervisorFormatter_->interpretRawData(data, *productHeader);
285  else if ( id == TBCAMAC_FED_ID )
286  camacTBformatter_->interpretRawData(data, *productHeader,*productHodo, *productTdc );
287  else if ( id == TABLE_FED_ID )
288  tableFormatter_->interpretRawData(data, *productHeader);
289  else if ( id == MATACQ_FED_ID )
290  matacqFormatter_->interpretRawData(data, *productMatacq);
291  }// endif
292  }//endfor
293 
294 
295  // commit to the event
296  e.put(productPN);
297  if (ProduceEBDigis_) e.put(productEb,"ebDigis");
298  if (ProduceEEDigis_) e.put(productEe,"eeDigis");
299  e.put(productMatacq);
300  e.put(productDCCHeader);
301  e.put(productTriggerPrimitives, "EBTT");
302 
303  if (ProduceEBDigis_) e.put(productDCCSize,"EcalIntegrityDCCSizeErrors");
304  if (ProduceEBDigis_) e.put(productTTId,"EcalIntegrityTTIdErrors");
305  if (ProduceEBDigis_) e.put(productBlockSize,"EcalIntegrityBlockSizeErrors");
306  if (ProduceEBDigis_) e.put(productChId,"EcalIntegrityChIdErrors");
307  if (ProduceEBDigis_) e.put(productGain,"EcalIntegrityGainErrors");
308  if (ProduceEBDigis_) e.put(productGainSwitch,"EcalIntegrityGainSwitchErrors");
309 
310  if (ProduceEBDigis_) e.put(productMemTtId,"EcalIntegrityMemTtIdErrors");
311  if (ProduceEBDigis_) e.put(productMemBlockSize,"EcalIntegrityMemBlockSize");
312  if (ProduceEBDigis_) e.put(productMemChIdErrors,"EcalIntegrityMemChIdErrors");
313  if (ProduceEBDigis_) e.put(productMemGain,"EcalIntegrityMemGainErrors");
314 
315  e.put(productHodo);
316  e.put(productTdc);
317  e.put(productHeader);
318 
319  } catch (ECALTBParserException &e) {
320  std::cout << "[EcalDCCTB07UnpackingModule] " << e.what() << std::endl;
321  } catch (ECALTBParserBlockException &e) {
322  std::cout << "[EcalDCCTB07UnpackingModule] " << e.what() << std::endl;
323  } catch (cms::Exception &e) {
324  std::cout << "[EcalDCCTB07UnpackingModule] " << e.what() << std::endl;
325  } catch (...) {
326  std::cout << "[EcalDCCTB07UnpackingModule] Unknown exception ..." << std::endl;
327  }
328 
329 }
#define LogDebug(id)
virtual char const * what() const
Definition: Exception.cc:141
T getUntrackedParameter(std::string const &, T const &) const
TableDataFormatter * tableFormatter_
int i
Definition: DBlmapReader.cc:9
edm::SortedCollection< EcalMatacqDigi > EcalMatacqDigiCollection
#define BEG_DCC_FED_ID
#define END_DCC_FED_ID_GLOBAL
EcalTB07DaqFormatter * formatter_
#define END_DCC_FED_ID
#define MATACQ_FED_ID
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:49
void interpretRawData(const FEDRawData &data, EcalMatacqDigiCollection &matacqDigiCollection)
void produce(edm::Event &e, const edm::EventSetup &c)
Produce digis out of raw data.
CamacTBDataFormatter * camacTBformatter_
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:94
virtual ~EcalDCCTB07UnpackingModule()
Destructor.
MatacqTBDataFormatter * matacqFormatter_
EcalSupervisorTBDataFormatter * ecalSupervisorFormatter_
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:361
void interpretRawData(const FEDRawData &data, EcalTBEventHeader &tbEventHeader)
void interpretRawData(const FEDRawData &data, EcalTBEventHeader &tbEventHeader)
void interpretRawData(const FEDRawData &data, EBDigiCollection &digicollection, EEDigiCollection &eeDigiCollection, EcalPnDiodeDigiCollection &pndigicollection, EcalRawDataCollection &DCCheaderCollection, EBDetIdCollection &dccsizecollection, EcalElectronicsIdCollection &ttidcollection, EcalElectronicsIdCollection &blocksizecollection, EBDetIdCollection &chidcollection, EBDetIdCollection &gaincollection, EBDetIdCollection &gainswitchcollection, EcalElectronicsIdCollection &memttidcollection, EcalElectronicsIdCollection &memblocksizecollection, EcalElectronicsIdCollection &memgaincollection, EcalElectronicsIdCollection &memchidcollection, EcalTrigPrimDigiCollection &tpcollection)
#define ECAL_SUPERVISOR_FED_ID
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
const char * what() const
tuple cout
Definition: gather_cfg.py:121
dictionary rawdata
Definition: lumiPlot.py:393
#define BEG_DCC_FED_ID_GLOBAL
#define TBCAMAC_FED_ID
EcalDCCTB07UnpackingModule(const edm::ParameterSet &pset)
Constructor.
#define TABLE_FED_ID
void interpretRawData(const FEDRawData &data, EcalTBEventHeader &tbEventHeader, EcalTBHodoscopeRawInfo &hodoRaw, EcalTBTDCRawInfo &tdcRawInfo)