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

Annotation of /yoda/techmodel/EventReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3.0 - (hide 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 kusanagi 1.1 /** @file
2 kusanagi 1.2 * $Author: kusanagi $
3 kusanagi 3.0 * $Date: 2005/03/03 13:10:25 $
4     * $Revision: 2.11 $
5 kusanagi 1.1 *
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 kusanagi 1.10 #include <log4cxx/logger.h>
11 kusanagi 1.1 #include <fstream>
12     #include "EventReader.h"
13     #include "ReaderAlgorithms.h"
14 kusanagi 2.4
15    
16 kusanagi 1.1 extern "C" {
17 kusanagi 2.4 #include "CRC.h"
18 kusanagi 1.1 }
19    
20     using namespace pamela;
21     using namespace pamela::techmodel;
22    
23 kusanagi 1.10 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.EventReader"));
24    
25     unsigned int EventReader::maxPackets = 0;
26 kusanagi 1.7 unsigned int EventReader::prevPckCounter = 0;
27     unsigned int EventReader::prevPckOBT = 0;
28 kusanagi 1.10
29    
30 kusanagi 1.1 /**
31     * Constructor.
32     */
33 kusanagi 1.10 EventReader::EventReader(int packetsLimit = -1):
34     TechmodelAlgorithm(0, "TechmodelEventReader"){
35     EventReader::maxPackets = packetsLimit;
36     logger->debug(_T("Constructor"));
37 kusanagi 1.1 Header = new EventHeader();
38 kusanagi 1.5
39 kusanagi 2.5 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 kusanagi 2.6 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 kusanagi 2.5 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 kusanagi 2.6 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init, new Ac1InitReader));
71 kusanagi 2.5 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 kusanagi 2.6 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init, new Ac2InitReader));
78 kusanagi 2.5 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 kusanagi 2.11 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT, new TsbTReader));
85     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB, new TsbBReader));
86 kusanagi 1.1 }
87    
88     /**
89     * Get a string with the version info of the algorithm.
90     */
91     std::string EventReader::GetVersionInfo(void) const {
92     return
93 kusanagi 3.0 "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 2.11 2005/03/03 13:10:25 kusanagi Exp $\n";
94 kusanagi 1.1 }
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 kusanagi 2.4 oss.str("");
110 kusanagi 1.10 oss << "Initializing algo " << i->second->GetAlgorithmName();
111     logger->debug(oss.str().c_str());
112 kusanagi 1.1 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 kusanagi 2.4 // read in the UnpackPscuHeader() and put directly in the
127 kusanagi 1.1 // 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 kusanagi 1.10 stringstream oss;
133     int step = 0;
134 kusanagi 2.5 const PacketType* type;
135 kusanagi 1.10 while (!InputFile->eof() && ((step++ < maxPackets) || (maxPackets == 0))){
136 kusanagi 1.1 try {
137     if (FindStart()) {
138 kusanagi 2.4 UnpackPscuHeader();
139 kusanagi 2.5 type = Header->GetPscuHeader()->GetPacketType();
140 kusanagi 1.1 AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type);
141     if (i != TechmodelAlgorithmMap.end()) {
142 kusanagi 2.5 TechmodelAlgorithm *EventAlgorithm(i->second);
143 kusanagi 1.1 EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght());
144     Run->FillTrees(type);
145     Header->GetCounter()->Increment(type);
146 kusanagi 2.4 logger->info(Header->GetPscuHeader()->Print());
147 kusanagi 1.1 } else {
148 kusanagi 2.8 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 kusanagi 2.3 }
152     }
153 kusanagi 2.4 // In case of exception have to save the packet in a specific root file??
154     } catch (NotExistingAlgorithmException exc) {
155 kusanagi 2.5 oss.str("");
156     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
157     logger->error(oss.str().c_str());
158 kusanagi 2.4 } catch (WrongCRCHeaderException exc) {
159 kusanagi 2.5 oss.str("");
160 kusanagi 2.8 oss << exc.print();
161 kusanagi 2.5 logger->error(oss.str().c_str());
162 kusanagi 2.4 } catch (WrongCRCException exc) {
163 kusanagi 2.5 oss.str("");
164     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
165     logger->error(oss.str().c_str());
166 kusanagi 2.4 } catch (UnidentifiedPacketException exc) {
167 kusanagi 2.5 oss.str("");
168     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
169     logger->error(oss.str().c_str());
170 kusanagi 2.4 } catch (NotExistingCounterException exc) {
171 kusanagi 2.5 oss.str("");
172     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
173     logger->error(oss.str().c_str());
174 kusanagi 2.4 } catch (LengthException exc) {
175 kusanagi 2.5 oss.str("");
176     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
177     logger->error(oss.str().c_str());
178 kusanagi 1.1 } catch (...) {
179 kusanagi 2.4 logger->error("Couldn't read the event. Skipping to the next header. \n");
180 kusanagi 1.1 }
181 kusanagi 2.1 if ((step%1000) == 0) std::cout << step/1000 << "K \n";
182 kusanagi 2.10 oss.str("");
183     oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n";
184     logger->info(oss.str().c_str());
185 kusanagi 1.1 }
186 kusanagi 1.10 Header->GetCounter()->PrintCounters();
187 kusanagi 1.1 }
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 kusanagi 2.8 void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException) {
199 kusanagi 1.10 stringstream oss;
200 kusanagi 2.4 int response = false;
201 kusanagi 1.1 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 kusanagi 1.9 unsigned char FileOffset = buff[15];
212 kusanagi 1.1
213     if (Counter < prevPckCounter){
214 kusanagi 2.4 oss.str("");
215 kusanagi 1.10 oss << "Packet counter is less than before of " << (prevPckCounter - Counter);
216 kusanagi 2.10 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 kusanagi 1.1 }
224    
225     if (OrbitalTime < prevPckOBT){
226 kusanagi 2.4 oss.str("");
227     oss << " Onboard Time is less than before of " << (prevPckOBT - OrbitalTime);
228 kusanagi 2.10 logger->error(oss.str().c_str());
229 kusanagi 1.1 }
230    
231 kusanagi 1.7 if (((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]) && (PacketId1 == PacketId2)){
232     prevPckCounter = Counter;
233     prevPckOBT = OrbitalTime;
234 kusanagi 1.1 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 kusanagi 1.9 Header->GetPscuHeader()->SetFileOffset(((long int)(InputFile->tellg()) - 16));
244 kusanagi 1.1
245     //commented out because of the above test code
246     InputFile->seekg(Header->GetPscuHeader()->GetPacketLenght(), std::ios::cur);
247 kusanagi 2.7 if (FindStart()) {
248     finalPos = (long int)InputFile->tellg() - (initPos + (long int)(Header->GetPscuHeader()->GetPacketLenght()));
249 kusanagi 1.1 if(finalPos == 0){
250 kusanagi 2.7 logger->debug(_T(" Correct packet length"));
251 kusanagi 1.1 }
252     if (finalPos > 0 && finalPos < 64) {
253 kusanagi 2.4 oss.str("");
254 kusanagi 2.10 oss << "Correct packet length: Padded of " << finalPos << " bytes";
255 kusanagi 2.4 logger->debug(oss.str().c_str());
256 kusanagi 1.1 }
257     if (finalPos > 64){
258 kusanagi 2.4 oss.str("");
259 kusanagi 2.10 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 kusanagi 2.5 logger->error(oss.str().c_str());
262 kusanagi 2.10 logger->error(Header->GetPscuHeader()->Print());
263 kusanagi 2.4 //throw LengthException("The begin of the next packet is far more than 64 byte from the end of the previous.");
264 kusanagi 1.1 }
265 kusanagi 2.7 }
266     else {
267     logger->debug(_T(" END OF FILE"));
268     }
269    
270 kusanagi 1.1 InputFile->seekg(initPos, std::ios::beg);
271     } else {
272 kusanagi 2.8 /*Here i should extract the block of Data for later analysis */
273 kusanagi 1.8 InputFile->seekg(-(13), std::ios::cur);
274 kusanagi 2.8 oss.str("");
275     oss << "CRC Header Error on packet:" << PscuHeader::Print(buff);
276     throw WrongCRCHeaderException(oss.str().c_str());
277 kusanagi 1.1 }
278 kusanagi 2.4
279     /* char tmpId1[4];
280 kusanagi 1.1 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 kusanagi 1.4 sprintf(tmpLength, "%06X", Header->GetPscuHeader()->GetPacketLenght());
287 kusanagi 1.9 sprintf(tmpStart, "%X", Header->GetPscuHeader()->GetFileOffset());
288 kusanagi 1.1 sprintf(tmpCRC, "%02X", CRC);
289 kusanagi 1.10 oss.flush();
290     oss << "\n Packet Counter (decimal) : " << Counter
291 kusanagi 1.1 << "\n Id1 - Id2 : " << tmpId1 << " - " << tmpId2
292     << "\n Orbital Time (decimal) : " << OrbitalTime
293     << "\n Lenght : " << tmpLength
294     << "\n CRC : " << tmpCRC
295 kusanagi 1.10 << "\n Header Start Position : " << tmpStart;
296     logger->info(oss.str().c_str());
297 kusanagi 2.4 */
298 kusanagi 1.1 }
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 kusanagi 2.7 bool EventReader::FindStart(void) throw (std::exception) {
311 kusanagi 1.1 //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 kusanagi 2.4 const int subSignDim = 3;
319     const unsigned char subSign[subSignDim]={0xFA, 0xFE, 0xDE};
320 kusanagi 1.1 //------------------------------------------
321     int subIndex = 0;
322     char dataByte;
323 kusanagi 1.10
324     int buffSize = 100;
325     int index = 0;
326 kusanagi 2.4 int loop = -1;
327 kusanagi 1.10 char buffer[buffSize];
328    
329     while (!InputFile->eof()) {
330     InputFile->read(buffer, sizeof(buffer));
331     index = 0;
332 kusanagi 2.4 loop++;
333 kusanagi 1.10 while (index < buffSize){
334     dataByte = buffer[index++];
335     if (dataByte == (char)(*(subSign+subIndex))){
336     if (subIndex++ == (subSignDim-1)) {
337 kusanagi 2.4 InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur);
338 kusanagi 2.7 return true;
339 kusanagi 2.4 }
340 kusanagi 1.10 } else {
341 kusanagi 2.4 index = index - (subIndex);
342 kusanagi 1.10 subIndex = 0;
343     }
344     }
345 kusanagi 2.4 //Needs to guarantee the overap of the buffer(s) in several loop
346     InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur);
347 kusanagi 2.7 }
348     return false;
349 kusanagi 1.1 }
350    
351     ClassImp(EventReader)

  ViewVC Help
Powered by ViewVC 1.1.23