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

Contents of /yoda/techmodel/EventReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.4 - (show 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 /** @file
2 * $Author: kusanagi $
3 * $Date: 2006/04/25 16:51:03 $
4 * $Revision: 6.3 $
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 "EventReader.h"
12 #include "ReaderAlgorithms.h"
13
14 extern "C" {
15 #include "CRC.h"
16 }
17
18 using namespace pamela;
19 using namespace pamela::techmodel;
20
21 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.EventReader"));
22
23 unsigned int EventReader::maxPackets = 0;
24 unsigned int EventReader::prevPckCounter = 0;
25 unsigned int EventReader::prevPckOBT = 0;
26
27
28 /**
29 * Constructor.
30 */
31 EventReader::EventReader(int packetsLimit = -1):
32 TechmodelAlgorithm(0, "TechmodelEventReader"){
33 EventReader::maxPackets = packetsLimit;
34 logger->debug(_T("Constructor"));
35 Header = new EventHeader();
36
37 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 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrkBoth, new CalibTrkBothReader));
42 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 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 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2, new CalibCalReader));
52 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 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::EventTrk, new EventTrkReader));
59 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 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init, new Ac1InitReader));
67 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 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init, new Ac2InitReader));
74 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalAlarm, new CalAlarmReader));
75 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Alarm, new Ac1AlarmReader));
76 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 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Alarm, new Ac2AlarmReader));
81 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT, new TsbTReader));
82 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB, new TsbBReader));
83 }
84
85 /**
86 * Get a string with the version info of the algorithm.
87 */
88 std::string EventReader::GetVersionInfo(void) const {
89 return
90 "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 6.3 2006/04/25 16:51:03 kusanagi Exp $\n";
91 }
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 oss.str("");
106 oss << "Initializing algo " << i->second->GetAlgorithmName();
107 logger->debug(oss.str().c_str());
108 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 stringstream oss;
121 int step = 0;
122 const PacketType* type;
123 while (!InputFile->eof() && ((step++ < maxPackets) || (maxPackets == 0))){
124 try {
125 if (FindStart()) {
126 UnpackPscuHeader();
127 type = Header->GetPscuHeader()->GetPacketType();
128 AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type);
129 if (i != TechmodelAlgorithmMap.end()) {
130 TechmodelAlgorithm *EventAlgorithm(i->second);
131 EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght());
132 Run->FillTrees(type);
133 Header->GetCounter()->Increment(type);
134 logger->info(Header->GetPscuHeader()->Print());
135 } else {
136 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 }
140 }
141 // In case of exception have to save the packet in a specific root file??
142 } catch (NotExistingAlgorithmException exc) {
143 oss.str("");
144 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
145 logger->error(oss.str().c_str());
146 } catch (WrongCRCHeaderException exc) {
147 oss.str("");
148 oss << exc.print();
149 logger->error(oss.str().c_str());
150 } catch (WrongCRCException exc) {
151 oss.str("");
152 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
153 logger->error(oss.str().c_str());
154 //archiveCorruptedPacket(Header->GetPscuHeader()->FileOffset, Header->GetPscuHeader()->PacketLenght);
155 //InputFile->seekg( (-1)*(Header->GetPscuHeader()->GetPacketLenght() + 14) , std::ios::cur);
156
157 } catch (UnidentifiedPacketException exc) {
158 oss.str("");
159 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
160 logger->error(oss.str().c_str());
161 } catch (NotExistingCounterException exc) {
162 oss.str("");
163 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
164 logger->error(oss.str().c_str());
165 } catch (LengthException exc) {
166 oss.str("");
167 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
168 logger->error(oss.str().c_str());
169 } catch (BackwardCounterException exc) {
170 oss.str("");
171 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
172 logger->error(oss.str().c_str());
173 } catch (...) {
174 logger->error("Couldn't read the event. Skipping to the next header. \n");
175 }
176 if ((step%1000) == 0) std::cout << step/1000 << "K \n";
177 oss.str("");
178 oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n";
179 logger->info(oss.str().c_str());
180 }
181 Header->GetCounter()->PrintCounters();
182 //if (corruptedPacketFile.is_open()) corruptedPacketFile.close();
183 }
184
185 /**
186 * Unpack the PSCU header from a file into the structure.
187 */
188 void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException) {
189 stringstream oss;
190 int response = 0;
191 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 unsigned char FileOffset = buff[15];
202
203
204 if (Counter < prevPckCounter){
205 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 }
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 }
217
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
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 } else {
245 /*Here i should extract the block of Data for later analysis */
246 InputFile->seekg(-(13), std::ios::cur);
247 oss.str("");
248 oss << "CRC Header Error on packet:" << PscuHeader::Print(buff);
249 throw WrongCRCHeaderException(oss.str().c_str());
250 }
251
252 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 }
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 bool EventReader::FindStart(void) throw (std::exception) {
270 //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 const int subSignDim = 3;
278 const unsigned char subSign[subSignDim]={0xFA, 0xFE, 0xDE};
279 //------------------------------------------
280 int subIndex = 0;
281 char dataByte;
282
283 int buffSize = 64;
284 int index = 0;
285 int loop = -1;
286 char buffer[buffSize];
287 bool flagOverPad = false;
288
289 while (!InputFile->eof()) {
290 InputFile->read(buffer, sizeof(buffer));
291 index = 0;
292 loop++;
293 while (index < buffSize){
294 dataByte = buffer[index++];
295 if (dataByte == (char)(*(subSign+subIndex))){
296 if (subIndex++ == (subSignDim-1)) {
297 InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur);
298 if (flagOverPad){
299 oss.str("");
300 oss << "\n This packet beginning is farther than 64 byte from the end of the previous."
301 << "\n Below the is the last already unpacked packet";
302 logger->error(oss.str().c_str());
303 logger->error(Header->GetPscuHeader()->Print());
304 }
305 return true;
306 }
307 } else {
308 index = index - (subIndex);
309 subIndex = 0;
310 }
311 }
312 //Needs to guarantee the overap of the buffer(s) in several loop
313 flagOverPad = true;
314 InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur);
315 }
316 return false;
317 }
318
319 /*
320 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 */
336 ClassImp(EventReader)

  ViewVC Help
Powered by ViewVC 1.1.23