/[PAMELA software]/yoda/techmodel/EventReader.cpp
ViewVC logotype

Contents of /yoda/techmodel/EventReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3.0 - (show annotations) (download)
Fri Mar 4 15:54:11 2005 UTC (19 years, 9 months ago) by kusanagi
Branch: MAIN
Changes since 2.11: +3 -3 lines
Error proof version.
Implemented all detectors packets plus all the main telemetries packets.
Missing all the Init and Alarm packets.
Disabled CRC control on VarDump, ArrDump, TabDump for CPU debugging needs
(the data formats seems correct even if CRC get wrong)

1 /** @file
2 * $Author: kusanagi $
3 * $Date: 2005/03/03 13:10:25 $
4 * $Revision: 2.11 $
5 *
6 * Implementation of the functions of a sample Algorithm class.
7 * This file can be used as a templace to develop your own algorithm.
8 */
9
10 #include <log4cxx/logger.h>
11 #include <fstream>
12 #include "EventReader.h"
13 #include "ReaderAlgorithms.h"
14
15
16 extern "C" {
17 #include "CRC.h"
18 }
19
20 using namespace pamela;
21 using namespace pamela::techmodel;
22
23 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.EventReader"));
24
25 unsigned int EventReader::maxPackets = 0;
26 unsigned int EventReader::prevPckCounter = 0;
27 unsigned int EventReader::prevPckOBT = 0;
28
29
30 /**
31 * Constructor.
32 */
33 EventReader::EventReader(int packetsLimit = -1):
34 TechmodelAlgorithm(0, "TechmodelEventReader"){
35 EventReader::maxPackets = packetsLimit;
36 logger->debug(_T("Constructor"));
37 Header = new EventHeader();
38
39 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::PhysEndRun, new PhysEndRunReader));
40 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse1, new CalibCalPulse1Reader));
41 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse2, new CalibCalPulse2Reader));
42 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Physics, new PhysicsReader));
43 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrkBoth, new CalibTrkBothReader));
44 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk1, new CalibTrk1Reader));
45 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk2, new CalibTrk2Reader));
46 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrd, new CalibTrdReader));
47 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTof, new CalibTofReader));
48 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibS4, new CalibS4Reader));
49 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPed, new CalibCalPedReader));
50 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac1, new Calib1_Ac1Reader));
51 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac1, new Calib2_Ac1Reader));
52 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac2, new Calib1_Ac2Reader));
53 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2, new Calib2_Ac2Reader));
54 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunHeader, new RunHeaderReader));
55 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunTrailer, new RunTrailerReader));
56 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibHeader, new CalibHeaderReader));
57 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrailer, new CalibTrailerReader));
58 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitHeader, new InitHeaderReader));
59 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitTrailer, new InitTrailerReader));
60 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::EventTrk, new EventTrkReader));
61 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TestTrk, new TestTrkReader));
62 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TestTof, new TestTofReader));
63 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Log, new LogReader));
64 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::VarDump, new VarDumpReader));
65 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ArrDump, new ArrDumpReader));
66 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TabDump, new TabDumpReader));
67 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Tmtc, new TmtcReader));
68 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Mcmd, new McmdReader));
69 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ForcedFECmd, new ForcedFECmdReader));
70 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init, new Ac1InitReader));
71 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalInit, new CalInitReader));
72 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkInit, new TrkInitReader));
73 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofInit, new TofInitReader));
74 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgInit, new TrgInitReader));
75 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::NdInit, new NdInitReader));
76 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Init, new S4InitReader));
77 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init, new Ac2InitReader));
78 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalAlarm, new CalAlarmReader));
79 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::AcAlarm, new AcAlarmReader));
80 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkAlarm, new TrkAlarmReader));
81 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgAlarm, new TrgAlarmReader));
82 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofAlarm, new TofAlarmReader));
83 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Alarm, new S4AlarmReader));
84 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT, new TsbTReader));
85 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB, new TsbBReader));
86 }
87
88 /**
89 * Get a string with the version info of the algorithm.
90 */
91 std::string EventReader::GetVersionInfo(void) const {
92 return
93 "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 2.11 2005/03/03 13:10:25 kusanagi Exp $\n";
94 }
95
96 /**
97 * Initialize the algorithm with a special run. This will initialize the
98 * event reader routines for all packet types.
99 */
100 void EventReader::Init(PamelaRun *run) {
101 SetInputStream(run);
102
103 //Create the structure of directories and create xxx.Header.root files
104 run->WriteHeaders(this, &Header);
105
106 //Create the xxx.root in it's specific directory
107 for (AlgorithmMap::iterator i = TechmodelAlgorithmMap.begin();
108 i != TechmodelAlgorithmMap.end(); i++) {
109 oss.str("");
110 oss << "Initializing algo " << i->second->GetAlgorithmName();
111 logger->debug(oss.str().c_str());
112 i->second->Init(run);
113 }
114 Run = dynamic_cast<TechmodelPamelaRun*>(run);
115 }
116
117 static void SkipToNextHeader(ifstream *);
118
119 /**
120 * Read the next event header, call the reader algorithms that
121 * correspond to its packet type, and read the event trailer.
122 */
123
124 // 15 June 2004 ---note------------------
125 // A nice refacoring would require to not read again the packet data (which is
126 // read in the UnpackPscuHeader() and put directly in the
127 // EventAlgorithm->RunEvent(....) directly the data inside the packet.... will see later....
128 // 15 June 2004 ---note------------------
129 void EventReader::RunEvent(int EventNumber) {
130 //for now i'll suppose that the raw file starts immediately with the right bytes
131 //to insert a GetPacketStart()
132 stringstream oss;
133 int step = 0;
134 const PacketType* type;
135 while (!InputFile->eof() && ((step++ < maxPackets) || (maxPackets == 0))){
136 try {
137 if (FindStart()) {
138 UnpackPscuHeader();
139 type = Header->GetPscuHeader()->GetPacketType();
140 AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type);
141 if (i != TechmodelAlgorithmMap.end()) {
142 TechmodelAlgorithm *EventAlgorithm(i->second);
143 EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght());
144 Run->FillTrees(type);
145 Header->GetCounter()->Increment(type);
146 logger->info(Header->GetPscuHeader()->Print());
147 } else {
148 oss.str("");
149 oss << "\n No way to read events of type " << type->GetName().c_str() << Header->GetPscuHeader()->Print();
150 throw NotExistingAlgorithmException(oss.str().c_str()); //to exctract to an higher level and delete the logger!
151 }
152 }
153 // In case of exception have to save the packet in a specific root file??
154 } catch (NotExistingAlgorithmException exc) {
155 oss.str("");
156 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
157 logger->error(oss.str().c_str());
158 } catch (WrongCRCHeaderException exc) {
159 oss.str("");
160 oss << exc.print();
161 logger->error(oss.str().c_str());
162 } catch (WrongCRCException exc) {
163 oss.str("");
164 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
165 logger->error(oss.str().c_str());
166 } catch (UnidentifiedPacketException exc) {
167 oss.str("");
168 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
169 logger->error(oss.str().c_str());
170 } catch (NotExistingCounterException exc) {
171 oss.str("");
172 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
173 logger->error(oss.str().c_str());
174 } catch (LengthException exc) {
175 oss.str("");
176 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
177 logger->error(oss.str().c_str());
178 } catch (...) {
179 logger->error("Couldn't read the event. Skipping to the next header. \n");
180 }
181 if ((step%1000) == 0) std::cout << step/1000 << "K \n";
182 oss.str("");
183 oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n";
184 logger->info(oss.str().c_str());
185 }
186 Header->GetCounter()->PrintCounters();
187 }
188
189 static void SkipToNextHeader(ifstream* TechmodelFile) {
190 // yeah.
191 }
192
193
194
195 /**
196 * Unpack the PSCU header from a file into the structure.
197 */
198 void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException) {
199 stringstream oss;
200 int response = false;
201 char buff[16];
202 InputFile->read(buff, sizeof(buff));
203
204
205 unsigned char PacketId1 = buff[3];
206 unsigned char PacketId2 = buff[4];
207 unsigned int Counter = (((UINT32)buff[5]<<16)&0x00FF0000) + (((UINT32)buff[6]<<8)&0x0000FF00) + (((UINT32)buff[7])&0x000000FF);
208 unsigned int OrbitalTime = (((UINT32)buff[8]<<24)&0xFF000000) + (((UINT32)buff[9]<<16)&0x00FF0000) + (((UINT32)buff[10]<<8)&0x0000FF00) + (((UINT32)buff[11])&0x000000FF);
209 unsigned int PacketLenght = (((UINT32)buff[12]<<16)&0x00FF0000) + (((UINT32)buff[13]<<8)&0x0000FF00) + (((UINT32)buff[14])&0x000000FF);
210 unsigned char CRC = buff[15];
211 unsigned char FileOffset = buff[15];
212
213 if (Counter < prevPckCounter){
214 oss.str("");
215 oss << "Packet counter is less than before of " << (prevPckCounter - Counter);
216 logger->error(oss.str().c_str());
217 }
218
219 if (Counter > prevPckCounter + 1){
220 oss.str("");
221 oss << "Packet counter is greater than before of " << (Counter - prevPckCounter);
222 logger->error(oss.str().c_str());
223 }
224
225 if (OrbitalTime < prevPckOBT){
226 oss.str("");
227 oss << " Onboard Time is less than before of " << (prevPckOBT - OrbitalTime);
228 logger->error(oss.str().c_str());
229 }
230
231 if (((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]) && (PacketId1 == PacketId2)){
232 prevPckCounter = Counter;
233 prevPckOBT = OrbitalTime;
234 long int initPos = InputFile->tellg();
235 long int finalPos;
236 Header->GetPscuHeader()->SetPacketId(PacketId1, PacketId2);
237 Header->GetPscuHeader()->SetCounter(Counter);
238 Header->GetPscuHeader()->SetOrbitalTime(OrbitalTime);
239 //PacketLength is the length of the whole DATApacket starting from the first byte after the header
240 //plus the CRC legth (which varies for each type of packet)
241 Header->GetPscuHeader()->SetPacketLenght(PacketLenght);
242 Header->GetPscuHeader()->SetCRC(CRC);
243 Header->GetPscuHeader()->SetFileOffset(((long int)(InputFile->tellg()) - 16));
244
245 //commented out because of the above test code
246 InputFile->seekg(Header->GetPscuHeader()->GetPacketLenght(), std::ios::cur);
247 if (FindStart()) {
248 finalPos = (long int)InputFile->tellg() - (initPos + (long int)(Header->GetPscuHeader()->GetPacketLenght()));
249 if(finalPos == 0){
250 logger->debug(_T(" Correct packet length"));
251 }
252 if (finalPos > 0 && finalPos < 64) {
253 oss.str("");
254 oss << "Correct packet length: Padded of " << finalPos << " bytes";
255 logger->debug(oss.str().c_str());
256 }
257 if (finalPos > 64){
258 oss.str("");
259 oss << "\n The begin of the next packet is far more than 64 byte from the end of the previous."
260 << "\n Below the is the now unpacking packet";
261 logger->error(oss.str().c_str());
262 logger->error(Header->GetPscuHeader()->Print());
263 //throw LengthException("The begin of the next packet is far more than 64 byte from the end of the previous.");
264 }
265 }
266 else {
267 logger->debug(_T(" END OF FILE"));
268 }
269
270 InputFile->seekg(initPos, std::ios::beg);
271 } else {
272 /*Here i should extract the block of Data for later analysis */
273 InputFile->seekg(-(13), std::ios::cur);
274 oss.str("");
275 oss << "CRC Header Error on packet:" << PscuHeader::Print(buff);
276 throw WrongCRCHeaderException(oss.str().c_str());
277 }
278
279 /* char tmpId1[4];
280 char tmpId2[4];
281 char tmpLength[12];
282 char tmpStart[100];
283 char tmpCRC[4];
284 sprintf(tmpId1, "%02X", PacketId1);
285 sprintf(tmpId2, "%02X", PacketId2);
286 sprintf(tmpLength, "%06X", Header->GetPscuHeader()->GetPacketLenght());
287 sprintf(tmpStart, "%X", Header->GetPscuHeader()->GetFileOffset());
288 sprintf(tmpCRC, "%02X", CRC);
289 oss.flush();
290 oss << "\n Packet Counter (decimal) : " << Counter
291 << "\n Id1 - Id2 : " << tmpId1 << " - " << tmpId2
292 << "\n Orbital Time (decimal) : " << OrbitalTime
293 << "\n Lenght : " << tmpLength
294 << "\n CRC : " << tmpCRC
295 << "\n Header Start Position : " << tmpStart;
296 logger->info(oss.str().c_str());
297 */
298 }
299
300 /**
301 * Unpack the trailer of a PSCU event into the structure.
302 */
303 void EventReader::UnpackPscuTrailer(void) throw (std::exception) {
304
305 }
306
307 /**
308 * Find the next starting poin for the PSCU event looking for a {0xFA, 0xFE, 0xDE} sequence
309 */
310 bool EventReader::FindStart(void) throw (std::exception) {
311 //search an hexadecimal sequence in a file
312 //subSign ------> pointer to the sequence buffer
313 //subSignDim ------> dimension of the buffer
314 // at exit
315 // return true if founds a match (else false)
316 // subF point rigth after the match, if found. Else EOF.
317 //Maurizio 15/11/2002-----------------------
318 const int subSignDim = 3;
319 const unsigned char subSign[subSignDim]={0xFA, 0xFE, 0xDE};
320 //------------------------------------------
321 int subIndex = 0;
322 char dataByte;
323
324 int buffSize = 100;
325 int index = 0;
326 int loop = -1;
327 char buffer[buffSize];
328
329 while (!InputFile->eof()) {
330 InputFile->read(buffer, sizeof(buffer));
331 index = 0;
332 loop++;
333 while (index < buffSize){
334 dataByte = buffer[index++];
335 if (dataByte == (char)(*(subSign+subIndex))){
336 if (subIndex++ == (subSignDim-1)) {
337 InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur);
338 return true;
339 }
340 } else {
341 index = index - (subIndex);
342 subIndex = 0;
343 }
344 }
345 //Needs to guarantee the overap of the buffer(s) in several loop
346 InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur);
347 }
348 return false;
349 }
350
351 ClassImp(EventReader)

  ViewVC Help
Powered by ViewVC 1.1.23