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

Annotation of /yoda/techmodel/EventReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.4 - (hide annotations) (download)
Tue May 30 19:10:02 2006 UTC (18 years, 6 months ago) by kusanagi
Branch: MAIN
Changes since 6.3: +7 -4 lines
Major update.
All the packet officially produced by PAMELA are implemented and unpacked.
The RegistryEvent Packet has been removed and put into another library.
New version, releasd by D.Campana, of tofunpack.

1 kusanagi 1.1 /** @file
2 kusanagi 6.0 * $Author: kusanagi $
3 kusanagi 6.4 * $Date: 2006/04/25 16:51:03 $
4     * $Revision: 6.3 $
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 "EventReader.h"
12     #include "ReaderAlgorithms.h"
13 kusanagi 2.4
14 kusanagi 1.1 extern "C" {
15 kusanagi 2.4 #include "CRC.h"
16 kusanagi 1.1 }
17    
18     using namespace pamela;
19     using namespace pamela::techmodel;
20    
21 kusanagi 1.10 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.EventReader"));
22    
23     unsigned int EventReader::maxPackets = 0;
24 kusanagi 1.7 unsigned int EventReader::prevPckCounter = 0;
25     unsigned int EventReader::prevPckOBT = 0;
26 kusanagi 1.10
27    
28 kusanagi 1.1 /**
29     * Constructor.
30     */
31 kusanagi 1.10 EventReader::EventReader(int packetsLimit = -1):
32     TechmodelAlgorithm(0, "TechmodelEventReader"){
33     EventReader::maxPackets = packetsLimit;
34     logger->debug(_T("Constructor"));
35 kusanagi 1.1 Header = new EventHeader();
36 kusanagi 1.5
37 kusanagi 2.5 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::PhysEndRun, new PhysEndRunReader));
38     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse1, new CalibCalPulse1Reader));
39     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse2, new CalibCalPulse2Reader));
40     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Physics, new PhysicsReader));
41 kusanagi 6.4 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrkBoth, new CalibTrkBothReader));
42 kusanagi 2.5 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk1, new CalibTrk1Reader));
43     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk2, new CalibTrk2Reader));
44     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTof, new CalibTofReader));
45     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibS4, new CalibS4Reader));
46     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPed, new CalibCalPedReader));
47 kusanagi 2.6 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac1, new Calib1_Ac1Reader));
48     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac1, new Calib2_Ac1Reader));
49     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac2, new Calib1_Ac2Reader));
50     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2, new Calib2_Ac2Reader));
51 kusanagi 6.4 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2, new CalibCalReader));
52 kusanagi 2.5 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunHeader, new RunHeaderReader));
53     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunTrailer, new RunTrailerReader));
54     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibHeader, new CalibHeaderReader));
55     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrailer, new CalibTrailerReader));
56     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitHeader, new InitHeaderReader));
57     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitTrailer, new InitTrailerReader));
58 kusanagi 6.1 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::EventTrk, new EventTrkReader));
59 kusanagi 2.5 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Log, new LogReader));
60     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::VarDump, new VarDumpReader));
61     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ArrDump, new ArrDumpReader));
62     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TabDump, new TabDumpReader));
63     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Tmtc, new TmtcReader));
64     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Mcmd, new McmdReader));
65     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ForcedFECmd, new ForcedFECmdReader));
66 kusanagi 2.6 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init, new Ac1InitReader));
67 kusanagi 2.5 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalInit, new CalInitReader));
68     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkInit, new TrkInitReader));
69     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofInit, new TofInitReader));
70     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgInit, new TrgInitReader));
71     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::NdInit, new NdInitReader));
72     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Init, new S4InitReader));
73 kusanagi 2.6 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init, new Ac2InitReader));
74 kusanagi 2.5 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalAlarm, new CalAlarmReader));
75 kusanagi 6.4 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Alarm, new Ac1AlarmReader));
76 kusanagi 2.5 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkAlarm, new TrkAlarmReader));
77     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgAlarm, new TrgAlarmReader));
78     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofAlarm, new TofAlarmReader));
79     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Alarm, new S4AlarmReader));
80 kusanagi 6.4 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Alarm, new Ac2AlarmReader));
81 kusanagi 2.11 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT, new TsbTReader));
82     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB, new TsbBReader));
83 kusanagi 1.1 }
84    
85     /**
86     * Get a string with the version info of the algorithm.
87     */
88     std::string EventReader::GetVersionInfo(void) const {
89     return
90 kusanagi 6.4 "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 6.3 2006/04/25 16:51:03 kusanagi Exp $\n";
91 kusanagi 1.1 }
92    
93     /**
94     * Initialize the algorithm with a special run. This will initialize the
95     * event reader routines for all packet types.
96     */
97     void EventReader::Init(PamelaRun *run) {
98     SetInputStream(run);
99     //Create the structure of directories and create xxx.Header.root files
100     run->WriteHeaders(this, &Header);
101    
102     //Create the xxx.root in it's specific directory
103     for (AlgorithmMap::iterator i = TechmodelAlgorithmMap.begin();
104     i != TechmodelAlgorithmMap.end(); i++) {
105 kusanagi 2.4 oss.str("");
106 kusanagi 1.10 oss << "Initializing algo " << i->second->GetAlgorithmName();
107     logger->debug(oss.str().c_str());
108 kusanagi 1.1 i->second->Init(run);
109     }
110     Run = dynamic_cast<TechmodelPamelaRun*>(run);
111     }
112    
113     static void SkipToNextHeader(ifstream *);
114    
115     /**
116     * Read the next event header, call the reader algorithms that
117     * correspond to its packet type, and read the event trailer.
118     */
119     void EventReader::RunEvent(int EventNumber) {
120 kusanagi 1.10 stringstream oss;
121     int step = 0;
122 kusanagi 2.5 const PacketType* type;
123 kusanagi 1.10 while (!InputFile->eof() && ((step++ < maxPackets) || (maxPackets == 0))){
124 kusanagi 1.1 try {
125     if (FindStart()) {
126 kusanagi 2.4 UnpackPscuHeader();
127 kusanagi 2.5 type = Header->GetPscuHeader()->GetPacketType();
128 kusanagi 1.1 AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type);
129     if (i != TechmodelAlgorithmMap.end()) {
130 kusanagi 2.5 TechmodelAlgorithm *EventAlgorithm(i->second);
131 kusanagi 1.1 EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght());
132     Run->FillTrees(type);
133     Header->GetCounter()->Increment(type);
134 kusanagi 2.4 logger->info(Header->GetPscuHeader()->Print());
135 kusanagi 1.1 } else {
136 kusanagi 2.8 oss.str("");
137     oss << "\n No way to read events of type " << type->GetName().c_str() << Header->GetPscuHeader()->Print();
138     throw NotExistingAlgorithmException(oss.str().c_str()); //to exctract to an higher level and delete the logger!
139 kusanagi 2.3 }
140     }
141 kusanagi 2.4 // In case of exception have to save the packet in a specific root file??
142     } catch (NotExistingAlgorithmException exc) {
143 kusanagi 2.5 oss.str("");
144     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
145     logger->error(oss.str().c_str());
146 kusanagi 2.4 } catch (WrongCRCHeaderException exc) {
147 kusanagi 2.5 oss.str("");
148 kusanagi 2.8 oss << exc.print();
149 kusanagi 2.5 logger->error(oss.str().c_str());
150 kusanagi 2.4 } catch (WrongCRCException exc) {
151 kusanagi 2.5 oss.str("");
152     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
153     logger->error(oss.str().c_str());
154 kusanagi 6.3 //archiveCorruptedPacket(Header->GetPscuHeader()->FileOffset, Header->GetPscuHeader()->PacketLenght);
155 kusanagi 6.2 //InputFile->seekg( (-1)*(Header->GetPscuHeader()->GetPacketLenght() + 14) , std::ios::cur);
156    
157 kusanagi 2.4 } catch (UnidentifiedPacketException exc) {
158 kusanagi 2.5 oss.str("");
159     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
160     logger->error(oss.str().c_str());
161 kusanagi 2.4 } catch (NotExistingCounterException exc) {
162 kusanagi 2.5 oss.str("");
163     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
164     logger->error(oss.str().c_str());
165 kusanagi 2.4 } catch (LengthException exc) {
166 kusanagi 2.5 oss.str("");
167     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
168     logger->error(oss.str().c_str());
169 kusanagi 4.5 } catch (BackwardCounterException exc) {
170     oss.str("");
171     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
172     logger->error(oss.str().c_str());
173 kusanagi 1.1 } catch (...) {
174 kusanagi 2.4 logger->error("Couldn't read the event. Skipping to the next header. \n");
175 kusanagi 1.1 }
176 kusanagi 2.1 if ((step%1000) == 0) std::cout << step/1000 << "K \n";
177 kusanagi 2.10 oss.str("");
178     oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n";
179     logger->info(oss.str().c_str());
180 kusanagi 1.1 }
181 kusanagi 1.10 Header->GetCounter()->PrintCounters();
182 kusanagi 6.3 //if (corruptedPacketFile.is_open()) corruptedPacketFile.close();
183 kusanagi 1.1 }
184    
185     /**
186     * Unpack the PSCU header from a file into the structure.
187     */
188 kusanagi 6.3 void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException) {
189 kusanagi 1.10 stringstream oss;
190 kusanagi 4.5 int response = 0;
191 kusanagi 1.1 char buff[16];
192     InputFile->read(buff, sizeof(buff));
193    
194    
195     unsigned char PacketId1 = buff[3];
196     unsigned char PacketId2 = buff[4];
197     unsigned int Counter = (((UINT32)buff[5]<<16)&0x00FF0000) + (((UINT32)buff[6]<<8)&0x0000FF00) + (((UINT32)buff[7])&0x000000FF);
198     unsigned int OrbitalTime = (((UINT32)buff[8]<<24)&0xFF000000) + (((UINT32)buff[9]<<16)&0x00FF0000) + (((UINT32)buff[10]<<8)&0x0000FF00) + (((UINT32)buff[11])&0x000000FF);
199     unsigned int PacketLenght = (((UINT32)buff[12]<<16)&0x00FF0000) + (((UINT32)buff[13]<<8)&0x0000FF00) + (((UINT32)buff[14])&0x000000FF);
200     unsigned char CRC = buff[15];
201 kusanagi 1.9 unsigned char FileOffset = buff[15];
202 kusanagi 1.1
203 kusanagi 4.5
204 kusanagi 1.1 if (Counter < prevPckCounter){
205 kusanagi 4.5 response = prevPckCounter - Counter;
206     //oss.str("");
207     //oss << "Packet counter is less than before of " << (prevPckCounter - Counter);
208     //throw BackwardCounterException(oss.str().c_str());
209     //logger->error(oss.str().c_str());
210 kusanagi 2.10 }
211    
212     if (Counter > prevPckCounter + 1){
213     oss.str("");
214     oss << "Packet counter is greater than before of " << (Counter - prevPckCounter);
215     logger->error(oss.str().c_str());
216 kusanagi 1.1 }
217 kusanagi 3.1
218     if ((OrbitalTime == prevPckOBT) & (PacketId1 == 0x10)){
219     oss.str("");
220     oss << "Onboard Time of this packet is equal to the previous packet OBT";
221     logger->error(oss.str().c_str());
222     logger->error(Header->GetPscuHeader()->Print());
223     }
224 kusanagi 1.1
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 } else {
245 kusanagi 2.8 /*Here i should extract the block of Data for later analysis */
246 kusanagi 1.8 InputFile->seekg(-(13), std::ios::cur);
247 kusanagi 2.8 oss.str("");
248     oss << "CRC Header Error on packet:" << PscuHeader::Print(buff);
249     throw WrongCRCHeaderException(oss.str().c_str());
250 kusanagi 1.1 }
251 kusanagi 2.4
252 kusanagi 4.5 if (response > 0){
253     oss.str("");
254     oss << "Packet counter is less than before of " << response;
255     throw BackwardCounterException(oss.str().c_str());
256     }
257 kusanagi 1.1 }
258    
259     /**
260     * Unpack the trailer of a PSCU event into the structure.
261     */
262     void EventReader::UnpackPscuTrailer(void) throw (std::exception) {
263    
264     }
265    
266     /**
267     * Find the next starting poin for the PSCU event looking for a {0xFA, 0xFE, 0xDE} sequence
268     */
269 kusanagi 2.7 bool EventReader::FindStart(void) throw (std::exception) {
270 kusanagi 1.1 //search an hexadecimal sequence in a file
271     //subSign ------> pointer to the sequence buffer
272     //subSignDim ------> dimension of the buffer
273     // at exit
274     // return true if founds a match (else false)
275     // subF point rigth after the match, if found. Else EOF.
276     //Maurizio 15/11/2002-----------------------
277 kusanagi 2.4 const int subSignDim = 3;
278     const unsigned char subSign[subSignDim]={0xFA, 0xFE, 0xDE};
279 kusanagi 1.1 //------------------------------------------
280     int subIndex = 0;
281     char dataByte;
282 kusanagi 4.1
283     int buffSize = 64;
284 kusanagi 1.10 int index = 0;
285 kusanagi 2.4 int loop = -1;
286 kusanagi 1.10 char buffer[buffSize];
287 kusanagi 4.1 bool flagOverPad = false;
288 kusanagi 1.10
289     while (!InputFile->eof()) {
290     InputFile->read(buffer, sizeof(buffer));
291     index = 0;
292 kusanagi 2.4 loop++;
293 kusanagi 1.10 while (index < buffSize){
294     dataByte = buffer[index++];
295     if (dataByte == (char)(*(subSign+subIndex))){
296     if (subIndex++ == (subSignDim-1)) {
297 kusanagi 2.4 InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur);
298 kusanagi 4.1 if (flagOverPad){
299     oss.str("");
300     oss << "\n This packet beginning is farther than 64 byte from the end of the previous."
301 kusanagi 4.2 << "\n Below the is the last already unpacked packet";
302 kusanagi 4.1 logger->error(oss.str().c_str());
303     logger->error(Header->GetPscuHeader()->Print());
304     }
305 kusanagi 2.7 return true;
306 kusanagi 2.4 }
307 kusanagi 1.10 } else {
308 kusanagi 2.4 index = index - (subIndex);
309 kusanagi 1.10 subIndex = 0;
310     }
311     }
312 kusanagi 2.4 //Needs to guarantee the overap of the buffer(s) in several loop
313 kusanagi 4.1 flagOverPad = true;
314 kusanagi 2.4 InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur);
315 kusanagi 2.7 }
316     return false;
317 kusanagi 1.1 }
318    
319 kusanagi 6.3 /*
320 kusanagi 6.2 int EventReader::archiveCorruptedPacket(long int offset, long int length) {
321     if (!corruptedPacketFile.is_open()) {
322     oss.str("");
323     oss << Run->GetUnpackPath().c_str() << "Corrupted.dat";
324     cout << oss.str().c_str() << "\n";
325     cout << dec << offset << "\n";
326     cout << dec << length << "\n";
327     corruptedPacketFile.open(oss.str().c_str(), ios::out);
328     }
329     char *buffer = new char[length];
330     InputFile->seekg(offset, ios_base::beg );
331     InputFile->read(buffer, length);
332     corruptedPacketFile.write(buffer, length);
333     InputFile->seekg(offset + 1, ios_base::beg );
334     }
335 kusanagi 6.3 */
336 kusanagi 1.1 ClassImp(EventReader)

  ViewVC Help
Powered by ViewVC 1.1.23