CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PixelSLinkDataInputSource.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelInputSources
4 // Class: PixelSLinkDataInputSource
5 //
13 //
14 // Original Author: Freya Blekman
15 // Created: Fri Sep 7 15:46:34 CEST 2007
16 //
17 //
18 
19 #include <memory>
28 #include <iostream>
29 
30 using namespace edm;
31 
32 // function to get the trigger number from fill words
33 int PixelSLinkDataInputSource::getEventNumberFromFillWords(const std::vector<uint64_t>& buffer, uint32_t & totword ){
34  // buffer validity, should already be pretty clean as this is exactly what goes into the FEDRawDataobject.
35 
36  // code copied directly from A. Ryd's fill word checker in PixelFEDInterface::PwordSlink64
37 
38  int fif2cnt=0;
39  int dumcnt=0;
40  int gapcnt=0;
41  uint32_t gap[9];
42  uint32_t dum[9];
43  uint32_t word[2]={0,0};
44  uint32_t chan=0;
45  uint32_t roc=0;
46 
47  const uint32_t rocmsk = 0x3e00000;
48  const uint32_t chnlmsk = 0xfc000000;
49 
50  for(int jk=1;jk<9;jk++)gap[jk]=0;
51  for(int jk=1;jk<9;jk++)dum[jk]=0;
52 
53  int fifcnt=1;
54  for(size_t kk=0; kk<buffer.size(); ++kk)
55  {
56 
57  word[0] = (uint32_t) buffer[kk];
58  word[1] = (uint32_t) (buffer[kk]>>32);
59 
60  for(size_t iw=0; iw<2; iw++)
61  {
62  chan= ((word[iw]&chnlmsk)>>26);
63  roc= ((word[iw]&rocmsk)>>21);
64 
65  //count non-error words
66  if(roc<25){
67  if((chan>4)&&(chan<10)&&(fifcnt!=2)) {fif2cnt=0;fifcnt=2;}
68  if((chan>9)&&(chan<14)&&(fifcnt!=3)) {fif2cnt=0;fifcnt=3;}
69  if((chan>13)&&(chan<19)&&(fifcnt!=4)){fif2cnt=0;fifcnt=4;}
70  if((chan>18)&&(chan<23)&&(fifcnt!=5)){fif2cnt=0;fifcnt=5;}
71  if((chan>22)&&(chan<28)&&(fifcnt!=6)){fif2cnt=0;fifcnt=6;}
72  if((chan>27)&&(chan<32)&&(fifcnt!=7)){fif2cnt=0;fifcnt=7;}
73  if((chan>31)&&(fifcnt!=8)){fif2cnt=0;fifcnt=8;}
74  fif2cnt++;
75  }
76  if(roc==26){gap[fifcnt]=(0x1000+(word[iw]&0xff));gapcnt++;}
77 
78  if((roc==27)&&((fif2cnt+dumcnt)<6)){dumcnt++;dum[fifcnt]=(0x1000+(word[iw]&0xff));}
79  else if((roc==27)&&((fif2cnt+dumcnt)>6)){dumcnt=1;fif2cnt=0;fifcnt++;}
80  }
81 
82  //word check complete
83  if(((fif2cnt+dumcnt)==6)&&(dumcnt>0)) //done with this fifo
84  {dumcnt=0;fif2cnt=0;fifcnt++;}
85  if((gapcnt>0)&&((dumcnt+fif2cnt)>5))//done with this fifo
86  {gapcnt=0;fifcnt++;fif2cnt=0;dumcnt=0;}
87  else if((gapcnt>0)&&((dumcnt+fif2cnt)<6)) gapcnt=0;
88 
89  }//end of fifo-3 word loop-see what we got!
90 
91  int status=0;
92 
93  if(gap[1]>0) {totword=(gap[1]&0xff);status=1;}
94  else if(gap[2]>0){totword=(gap[2]&0xff);status=1;}
95  else if(dum[1]>0){totword=(dum[1]&0xff);status=1;}
96  else if(dum[2]>0){totword=(dum[2]&0xff);status=1;}
97 
98  if(gap[3]>0) {totword=totword|((gap[3]&0xff)<<8);status=status|0x2;}
99  else if(gap[4]>0){totword=totword|((gap[4]&0xff)<<8);status=status|0x2;}
100  else if(dum[3]>0){totword=totword|((dum[3]&0xff)<<8);status=status|0x2;}
101  else if(dum[4]>0){totword=totword|((dum[4]&0xff)<<8);status=status|0x2;}
102 
103  if(gap[5]>0) {totword=totword|((gap[5]&0xff)<<16);status=status|0x4;}
104  else if(gap[6]>0){totword=totword|((gap[6]&0xff)<<16);status=status|0x4;}
105  else if(dum[5]>0){totword=totword|((dum[5]&0xff)<<16);status=status|0x4;}
106  else if(dum[6]>0){totword=totword|((dum[6]&0xff)<<16);status=status|0x4;}
107 
108  if(gap[7]>0){totword=totword|((gap[7]&0xff)<<24);status=status|0x8;}
109  else if(gap[8]>0){totword=totword|((gap[8]&0xff)<<24);status=status|0x8;}
110  else if(dum[7]>0){totword=totword|((dum[7]&0xff)<<24);status=status|0x8;}
111  else if(dum[8]>0){totword=totword|((dum[8]&0xff)<<24);status=status|0x8;}
112  return(status);
113 
114 }
115 
116 // constructor
118  const edm::InputSourceDescription& desc) :
119  ProducerSourceFromFiles(pset,desc,true),
120  m_fedid(pset.getUntrackedParameter<int>("fedid")),
121  m_fileindex(0),
122  m_runnumber(pset.getUntrackedParameter<int>("runNumber",-1)),
123  m_currenteventnumber(0),
124  m_currenttriggernumber(0),
125  m_eventnumber_shift(0)
126 {
127  produces<FEDRawDataCollection>();
128 
129  if (m_fileindex>=fileNames().size()) {
130  edm::LogInfo("") << "no more file to read " << std::endl;
131  return;// ???
132  }
133  std::string currentfilename = fileNames()[m_fileindex];
134  edm::LogInfo("") << "now examining file "<< currentfilename ;
135  m_fileindex++;
136  // reading both castor and other ('normal'/dcap) files.
137  IOOffset size = -1;
139 
140  edm::LogInfo("PixelSLinkDataInputSource") << " unsigned long int size = " << sizeof(unsigned long int) <<"\n unsigned long size = " << sizeof(unsigned long)<<"\n unsigned long long size = " << sizeof(unsigned long long) << "\n uint32_t size = " << sizeof(uint32_t) << "\n uint64_t size = " << sizeof(uint64_t) << std::endl;
141 
142  bool exists = StorageFactory::get() -> check(currentfilename.c_str(), &size);
143 
144  edm::LogInfo("PixelSLinkDataInputSource") << "file size " << size << std::endl;
145 
146  if(!exists){
147  edm::LogInfo("") << "file " << currentfilename << " cannot be found.";
148  return;
149  }
150  // now open the file stream:
151  storage.reset(StorageFactory::get()->open(currentfilename.c_str()));
152  // (throw if storage is 0)
153 
154  // check run number by opening up data file...
155 
156  Storage & temp_file = *storage;
157  // IOSize n =
158  temp_file.read((char*)&m_data,8);
159  if((m_data >> 60) != 0x5){
160  uint32_t runnum = m_data;
161  if(m_runnumber!=-1)
162  edm::LogInfo("") << "WARNING: observed run number encoded in S-Link dump. Overwriting run number as defined in .cfg file!!! Run number now set to " << runnum << " (was " << m_runnumber << ")";
163  m_runnumber=runnum;
164  }
165  temp_file.read((char*)&m_data,8);
166  m_currenteventnumber = (m_data >> 32)&0x00ffffff ;
167 }
168 
169 // destructor
171 
172 
173 }
174 
176  Storage & m_file = *storage;
177 
178  // create product (raw data)
179  buffers.reset( new FEDRawDataCollection );
180 
181  // uint32_t currenteventnumber = (m_data >> 32)&0x00ffffff;
182  uint32_t eventnumber =(m_data >> 32)&0x00ffffff ;
183 
184  do{
185  std::vector<uint64_t> buffer;
186 
187 
188 
189  uint16_t count=0;
190  eventnumber = (m_data >> 32)&0x00ffffff ;
191  if(m_currenteventnumber==0)
192  m_currenteventnumber=eventnumber;
193  edm::LogInfo("PixelSLinkDataInputSource::produce()") << "**** event number = " << eventnumber << " global event number " << m_currenteventnumber << " data " << std::hex << m_data << std::dec << std::endl;
194  while ((m_data >> 60) != 0x5){
195  // std::cout << std::hex << m_data << std::dec << std::endl;
196  if (count==0){
197  edm::LogWarning("") << "DATA CORRUPTION!" ;
198  edm::LogWarning("") << "Expected to find header, but read: 0x"
199  << std::hex<<m_data<<std::dec ;
200  }
201 
202  count++;
203  int n=m_file.read((char*)&m_data,8);
204  edm::LogWarning("") << "next data " << std::hex << m_data << std::dec << std::endl;
205 
206  if (n!=8) {
207  edm::LogInfo("") << "End of input file" ;
208  return false;
209  }
210  }
211 
212 
213  if (count>0) {
214  edm::LogWarning("")<<"Had to read "<<count<<" words before finding header!"<<std::endl;
215  }
216 
217  if (m_fedid>-1) {
218  m_data=(m_data&0xfffffffffff000ffLL)|((m_fedid&0xfff)<<8);
219  }
220 
221  uint16_t fed_id=(m_data>>8)&0xfff;
222  // std::cout << "fed id = " << fed_id << std::endl;
223  buffer.push_back(m_data);
224 
225  do{
226  m_file.read((char*)&m_data,8);
227  buffer.push_back(m_data);
228  }
229  while((m_data >> 60) != 0xa);
230  // std::cout << "read " << buffer.size() << " long words" << std::endl;
231 
232  std::auto_ptr<FEDRawData> rawData(new FEDRawData(8*buffer.size()));
233  // FEDRawData * rawData = new FEDRawData(8*buffer.size());
234  unsigned char* dataptr=rawData->data();
235 
236  for (uint16_t i=0;i<buffer.size();i++){
237  ((uint64_t *)dataptr)[i]=buffer[i];
238  }
239  uint32_t thetriggernumber=0;
240  int nfillwords = 0;//getEventNumberFromFillWords(buffer,thetriggernumber);
241 
242  if(nfillwords>0){
243  LogInfo("") << "n fill words = " << nfillwords << ", trigger numbers: " << thetriggernumber << "," << m_currenttriggernumber << std::endl;
244  m_eventnumber_shift = thetriggernumber - m_currenttriggernumber;
245  }
246  m_currenttriggernumber = thetriggernumber;
247  FEDRawData& fedRawData = buffers->FEDData( fed_id );
248  fedRawData=*rawData;
249 
250  // read the first data member of the next blob to check on event number
251  int n =m_file.read((char*)&m_data,8);
252  if (n==0) {
253  edm::LogInfo("") << "End of input file" ;
254  }
255  m_currenteventnumber = (m_data >> 32)&0x00ffffff ;
256  if(m_currenteventnumber<eventnumber)
257  LogError("PixelSLinkDataInputSource") << " error, the previous event number (" << eventnumber << ") is LARGER than the next event number (" << m_currenteventnumber << ")" << std::endl;
258 
259  }
260  while( eventnumber == m_currenteventnumber);
261 
262  uint32_t realeventno = synchronizeEvents();
263  if(m_runnumber!=0)
264  id = edm::EventID(m_runnumber, id.luminosityBlock(), realeventno);
265  else
266  id = edm::EventID(id.run(), id.luminosityBlock(), realeventno);
267  return true;
268 }
269 
270 // produce() method. This is the worker method that is called every event.
272  event.put(buffers);
273  buffers.reset();
274 }
275 
276 // this function sets the m_globaleventnumber quantity. It uses the m_currenteventnumber and m_currenttriggernumber values as input
278  int32_t result= m_currenteventnumber -1;
279 
280  return(uint32_t) result;
281 }
int i
Definition: DBlmapReader.cc:9
bool enableAccounting(bool enabled)
virtual bool setRunAndEventInfo(edm::EventID &id, edm::TimeValue_t &time, edm::EventAuxiliary::ExperimentType &)
virtual IOSize read(void *into, IOSize n, IOOffset pos)
Definition: Storage.cc:17
RunNumber_t run() const
virtual void produce(edm::Event &event)
std::vector< std::string > const & fileNames() const
Definition: FromFiles.h:22
static StorageFactory * get(void)
PixelSLinkDataInputSource(const edm::ParameterSet &pset, const edm::InputSourceDescription &desc)
bool check(const std::string &)
tuple result
Definition: query.py:137
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
unsigned long long TimeValue_t
Definition: Timestamp.h:28
unsigned long long uint64_t
Definition: Time.h:15
int getEventNumberFromFillWords(const std::vector< uint64_t > &data, uint32_t &totword)
int64_t IOOffset
Definition: IOTypes.h:19
std::auto_ptr< FEDRawDataCollection > buffers
LuminosityBlockNumber_t luminosityBlock() const
tuple runnum
Definition: summaryLumi.py:210
tuple status
Definition: ntuplemaker.py:245
std::unique_ptr< Storage > storage
tuple size
Write out results.