CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTSpyReader.cc
Go to the documentation of this file.
1 
10 
14 
17 
19 
21 
22 #include <string>
23 #include <iosfwd>
24 #include <iostream>
25 #include <algorithm>
26 #include <stdio.h>
27 
28 
29 using namespace std;
30 using namespace edm;
31 
32 
34  runNumber(1), eventNumber(0) {
35 
36  // instatiating Sandro's spy (My name is Bond, Sandro Bond)
37  mySpy = new DTSpy();
38 
40  string connectionParameters = pset.getUntrackedParameter<string>("connectionParameters");
41  mySpy->Connect(connectionParameters.c_str(),10000);
42 
43  cout<<endl;
44  cout<<"DT Local DAQ online spy. Connected to IP "<<connectionParameters.c_str()
45  <<". Waiting for the data to be flushed"<<endl;
46  cout<<endl;
47 
48  debug = pset.getUntrackedParameter<bool>("debug",false);
49  dduID = pset.getUntrackedParameter<int32_t>("dduID",770); // NOT needed
50 }
51 
52 
54  delete mySpy;
55 }
56 
57 
59 
60  // ask for a new buffer
62 
63  // get the pointer to the beginning of the buffer
64  const char * rawDTData = mySpy->getEventPointer();
65 
66  const uint32_t * rawDTData32 = reinterpret_cast<const uint32_t*>(rawDTData);
67 
68  // instantiate the FEDRawDataCollection
69  data = new FEDRawDataCollection();
70 
71  vector<uint64_t> eventData; uint64_t word = 0;
72  int wordCount = 0; int wordCountCheck = 0;
73 
74  bool headerTag = false; bool dataTag = true;
75 
76  // Advance at long-word steps until the trailer is reached.
77  // Skipped whatever else is in the buffer (e.g. another event..)
78  while ( !isTrailer(word, dataTag, wordCount) ) {
79 
80  // dma gets 4 32-bits words and create a 64 bit one
81  word = dmaUnpack(rawDTData32, dataTag);
82 
83  // look for the DDU header
84  if (isHeader(word,dataTag)) headerTag=true;
85 
86  // check whether the first word is a DDU header
87  if ( wordCountCheck > 0 && !headerTag && debug)
88  cout<<"[DTSpyReader]: WARNING: header still not found!!"<<endl;
89 
90  // from now on fill the eventData with the ROS data
91  if (headerTag) {
92 
93  // swapping only the 32 bits words
94  if (dataTag) swap(word);
95  // WARNING also the ddu status words have been swapped!
96  // Control the correct interpretation in DDUUnpacker
97 
98  eventData.push_back(word);
99  wordCount++;
100  }
101 
102  // advancing by 4 32-bits words
103  rawDTData32 += 4;
104 
105  // counting the total number of group of 128 bits (=4*32) in the buffer
106  wordCountCheck++;
107  }
108 
109  // Setting the Event ID
110  runNumber = mySpy->getRunNo();
111  eID = EventID( runNumber, 1U, eventNumber);
112 
113  // eventDataSize = (Number Of Words)* (Word Size)
114  int eventDataSize = eventData.size()*dduWordLength;
115 
116  if (debug) cout<<" DDU ID = "<<dduID<<endl;
117 
118  FEDRawData& fedRawData = data->FEDData( dduID );
119  fedRawData.resize(eventDataSize);
120 
121  copy(reinterpret_cast<unsigned char*>(&eventData[0]),
122  reinterpret_cast<unsigned char*>(&eventData[0]) + eventDataSize, fedRawData.data());
123 
124 
125  mySpy->setlastPointer( (char*) rawDTData32 );
126 
127  return true;
128 
129 }
130 
132 
133  twoNibble64* newWorld = reinterpret_cast<twoNibble64*>(&word);
134 
135  uint32_t msBits_tmp = newWorld->msBits;
136  newWorld->msBits = newWorld->lsBits;
137  newWorld->lsBits = msBits_tmp;
138 }
139 
140 
141 uint64_t DTSpyReader::dmaUnpack(const uint32_t* dmaData, bool & isData) {
142 
143  uint32_t unpackedData[2] = {0, 0};
144  // adjust 4 32-bits words into 2 32-bits words
145  unpackedData[0] |= dmaData[3] & 0x3ffff;
146  unpackedData[0] |= (dmaData[2] << 18 ) & 0xfffc0000;
147  unpackedData[1] |= (dmaData[2] >> 14 ) & 0x0f;
148  unpackedData[1] |= (dmaData[1] << 4 ) & 0x3ffff0;
149  unpackedData[1] |= (dmaData[0] << 22 ) & 0xffc00000;
150 
151  isData = ( dmaData[0] >> 10 ) & 0x01;
152 
153  //printf ("Lower part: %x \n", unpackedData[0]);
154  //printf ("Upper part: %x \n", unpackedData[1]);
155 
156  // push_back to a 64 word
157  uint64_t dduWord = ( uint64_t(unpackedData[1]) << 32 ) | unpackedData[0];
158 
159  return dduWord;
160 }
161 
162 bool DTSpyReader::isHeader(uint64_t word, bool dataTag) {
163 
164  bool it_is = false;
165  FEDHeader candidate(reinterpret_cast<const unsigned char*>(&word));
166  if ( candidate.check() ) {
167  // if ( candidate.check() && !dataTag) {
168  it_is = true;
169  dduID = candidate.sourceID();
170  eventNumber++;
171  }
172  return it_is;
173 }
174 
175 
176 bool DTSpyReader::isTrailer(uint64_t word, bool dataTag, int wordCount) {
177 
178  bool it_is = false;
179  FEDTrailer candidate(reinterpret_cast<const unsigned char*>(&word));
180  if ( candidate.check() ) {
181  // if ( candidate.check() && !dataTag) {
182  if ( wordCount == candidate.lenght())
183  it_is = true;
184  }
185  return it_is;
186 }
187 
188 
189 
190 
191 
192 
T getUntrackedParameter(std::string const &, T const &) const
bool check()
Definition: FEDTrailer.cc:66
static const int dduWordLength
Definition: DTSpyReader.h:61
void Connect(const char *hostaddr, int port)
Definition: DTSpyHelper.cc:162
edm::EventNumber_t eventNumber
Definition: DTSpyReader.h:56
const char * getEventPointer()
Definition: DTSpy.cc:83
int sourceID()
Identifier of the FED.
Definition: FEDHeader.cc:30
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
DTSpyReader(const edm::ParameterSet &pset)
Constructor.
Definition: DTSpyReader.cc:33
void resize(size_t newsize)
Definition: FEDRawData.cc:33
void swap(uint64_t &word)
swapping the lsBits with the msBits
Definition: DTSpyReader.cc:131
Definition: DTSpy.h:17
bool isTrailer(uint64_t word, bool dataTag, int wordCount)
check for a 64 bits word to be a DDU trailer
Definition: DTSpyReader.cc:176
virtual ~DTSpyReader()
Destructor.
Definition: DTSpyReader.cc:53
virtual int fillRawData(edm::EventID &eID, edm::Timestamp &tstamp, FEDRawDataCollection *&data)
Generate and fill FED raw data for a full event.
Definition: DTSpyReader.cc:58
bool check()
Check that the header is OK.
Definition: FEDHeader.cc:66
unsigned long long uint64_t
Definition: Time.h:15
int lenght()
The length of the event fragment counted in 64-bit words including header and trailer.
Definition: FEDTrailer.cc:19
void setlastPointer(char *data)
Definition: DTSpy.cc:92
int getNextBuffer()
Definition: DTSpy.cc:39
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
DTSpy * mySpy
Definition: DTSpyReader.h:53
edm::RunNumber_t runNumber
Definition: DTSpyReader.h:55
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:29
bool isHeader(uint64_t word, bool dataTag)
check for a 64 bits word to be a DDU header
Definition: DTSpyReader.cc:162
tuple cout
Definition: gather_cfg.py:121
uint64_t dmaUnpack(const uint32_t *dmaData, bool &isData)
pre-unpack the data if read via DMA
Definition: DTSpyReader.cc:141
int getRunNo()
Definition: DTSpy.cc:76