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

Contents of /yoda/techmodel/EventReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.0 - (show annotations) (download)
Tue Feb 7 17:11:09 2006 UTC (18 years, 10 months ago) by kusanagi
Branch: MAIN
CVS Tags: YODA6_0/00
Changes since 5.2: +4 -4 lines
Several new features in this revision:
a) all the packets are conform to the Mass Memory Format specifications (http://people.roma2.infn.it/~cpu/Mass_Memory_Format.html)
b) unpacking either using the old files structure OR the new one file unpacking.
c) parametrized root files compression factor
d) deleting of the following packet: TofTest, TrkTest, TrkEvent.
e) the Tracker routines now work without the use of temp files.

The point a) allow Yoda to unpack in the root file all the packets generated by the CPU. According to the MassMemoryFormat; that is three possible data are available:

1) almost explicit structure of the packet (like for Log, Tracker, Mcmd, etc....);
2) dummy data collection structure (InitHeader, InitTrailer, CalibHeader, CalibTrailer);
3) just the data of the packet (almost all Alarm and Init procedures). The class regarding this packets have only one parameters, a TArrayC class, which contain the data-block included in the packet (tat is the data below the packet Header).

The point b) has been implemented as a consequence of an agreement about a more compact structure of the unpacked data. Up to now the structure of each unpacked data consisted of a folder, named after the packet type, and three files: xxx.Header.root, xxx.NamePacket.root, xxx.Registry.root.
Starting from this release YODA, by default will unpack the data in a unique root file. The structure of this file will consist of:
- several TTree(s) named after the packet type;
- into each TTree are foreseen three TBranche(s):
    - 'Header'  (the old xxx.Header.root file)
    - 'NameOfThePacket' (the old xxx.Event.root file or the xxx.Event.DETECTOR.root)
    - 'Registry' (the old xxx.Registry.root file)

Anyway is still possible, but deprecated, to unpack using the old structure, passing to the "yoda" command the optional parameter "-multifile"

The point c) has been implemented because is well know that writing time in a TTree is as much fast as much lower is the compression factor for the root file; anyway for a PAMELA dat file, a compression equal to 0 will generate a root file which will be more than two times the original size. To modify the compression parameter just add the optional parameter "-c [0-9]" to the yoda command line.

1 /** @file
2 * $Author: kusanagi $
3 * $Date: 2006/02/04 12:37:45 $
4 * $Revision: 5.2 $
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::CalibTrk1, new CalibTrk1Reader));
42 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk2, new CalibTrk2Reader));
43 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTof, new CalibTofReader));
44 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibS4, new CalibS4Reader));
45 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPed, new CalibCalPedReader));
46 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac1, new Calib1_Ac1Reader));
47 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac1, new Calib2_Ac1Reader));
48 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac2, new Calib1_Ac2Reader));
49 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2, new Calib2_Ac2Reader));
50 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunHeader, new RunHeaderReader));
51 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunTrailer, new RunTrailerReader));
52 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibHeader, new CalibHeaderReader));
53 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrailer, new CalibTrailerReader));
54 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitHeader, new InitHeaderReader));
55 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitTrailer, new InitTrailerReader));
56 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Log, new LogReader));
57 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::VarDump, new VarDumpReader));
58 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ArrDump, new ArrDumpReader));
59 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TabDump, new TabDumpReader));
60 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Tmtc, new TmtcReader));
61 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Mcmd, new McmdReader));
62 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ForcedFECmd, new ForcedFECmdReader));
63 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init, new Ac1InitReader));
64 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalInit, new CalInitReader));
65 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkInit, new TrkInitReader));
66 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofInit, new TofInitReader));
67 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgInit, new TrgInitReader));
68 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::NdInit, new NdInitReader));
69 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Init, new S4InitReader));
70 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init, new Ac2InitReader));
71 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalAlarm, new CalAlarmReader));
72 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::AcAlarm, new AcAlarmReader));
73 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkAlarm, new TrkAlarmReader));
74 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgAlarm, new TrgAlarmReader));
75 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofAlarm, new TofAlarmReader));
76 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Alarm, new S4AlarmReader));
77 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT, new TsbTReader));
78 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB, new TsbBReader));
79 }
80
81 /**
82 * Get a string with the version info of the algorithm.
83 */
84 std::string EventReader::GetVersionInfo(void) const {
85 return
86 "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 5.2 2006/02/04 12:37:45 kusanagi Exp $\n";
87 }
88
89 /**
90 * Initialize the algorithm with a special run. This will initialize the
91 * event reader routines for all packet types.
92 */
93 void EventReader::Init(PamelaRun *run) {
94 SetInputStream(run);
95
96 //Create the structure of directories and create xxx.Header.root files
97 run->WriteHeaders(this, &Header);
98
99 //Create the xxx.root in it's specific directory
100 for (AlgorithmMap::iterator i = TechmodelAlgorithmMap.begin();
101 i != TechmodelAlgorithmMap.end(); i++) {
102 oss.str("");
103 oss << "Initializing algo " << i->second->GetAlgorithmName();
104 logger->debug(oss.str().c_str());
105 i->second->Init(run);
106 }
107 Run = dynamic_cast<TechmodelPamelaRun*>(run);
108 }
109
110 static void SkipToNextHeader(ifstream *);
111
112 /**
113 * Read the next event header, call the reader algorithms that
114 * correspond to its packet type, and read the event trailer.
115 */
116 void EventReader::RunEvent(int EventNumber) {
117 stringstream oss;
118 int step = 0;
119 const PacketType* type;
120 while (!InputFile->eof() && ((step++ < maxPackets) || (maxPackets == 0))){
121 try {
122 if (FindStart()) {
123 UnpackPscuHeader();
124 type = Header->GetPscuHeader()->GetPacketType();
125 AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type);
126 if (i != TechmodelAlgorithmMap.end()) {
127 TechmodelAlgorithm *EventAlgorithm(i->second);
128 EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght());
129 Run->FillTrees(type);
130 Header->GetCounter()->Increment(type);
131 logger->info(Header->GetPscuHeader()->Print());
132 } else {
133 oss.str("");
134 oss << "\n No way to read events of type " << type->GetName().c_str() << Header->GetPscuHeader()->Print();
135 throw NotExistingAlgorithmException(oss.str().c_str()); //to exctract to an higher level and delete the logger!
136 }
137 }
138 // In case of exception have to save the packet in a specific root file??
139 } catch (NotExistingAlgorithmException exc) {
140 oss.str("");
141 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
142 logger->error(oss.str().c_str());
143 } catch (WrongCRCHeaderException exc) {
144 oss.str("");
145 oss << exc.print();
146 logger->error(oss.str().c_str());
147 } catch (WrongCRCException exc) {
148 oss.str("");
149 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
150 logger->error(oss.str().c_str());
151 InputFile->seekg( (-1)*(Header->GetPscuHeader()->GetPacketLenght() + 15) , std::ios::cur);
152 } catch (UnidentifiedPacketException exc) {
153 oss.str("");
154 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
155 logger->error(oss.str().c_str());
156 } catch (NotExistingCounterException exc) {
157 oss.str("");
158 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
159 logger->error(oss.str().c_str());
160 } catch (LengthException exc) {
161 oss.str("");
162 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
163 logger->error(oss.str().c_str());
164 } catch (BackwardCounterException exc) {
165 oss.str("");
166 oss << exc.print() << " " << Header->GetPscuHeader()->Print();
167 logger->error(oss.str().c_str());
168 } catch (...) {
169 logger->error("Couldn't read the event. Skipping to the next header. \n");
170 }
171 if ((step%1000) == 0) std::cout << step/1000 << "K \n";
172 oss.str("");
173 oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n";
174 logger->info(oss.str().c_str());
175 }
176 Header->GetCounter()->PrintCounters();
177 }
178
179 /**
180 * Unpack the PSCU header from a file into the structure.
181 */
182 void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException, BackwardCounterException) {
183 stringstream oss;
184 int response = 0;
185 char buff[16];
186 InputFile->read(buff, sizeof(buff));
187
188
189 unsigned char PacketId1 = buff[3];
190 unsigned char PacketId2 = buff[4];
191 unsigned int Counter = (((UINT32)buff[5]<<16)&0x00FF0000) + (((UINT32)buff[6]<<8)&0x0000FF00) + (((UINT32)buff[7])&0x000000FF);
192 unsigned int OrbitalTime = (((UINT32)buff[8]<<24)&0xFF000000) + (((UINT32)buff[9]<<16)&0x00FF0000) + (((UINT32)buff[10]<<8)&0x0000FF00) + (((UINT32)buff[11])&0x000000FF);
193 unsigned int PacketLenght = (((UINT32)buff[12]<<16)&0x00FF0000) + (((UINT32)buff[13]<<8)&0x0000FF00) + (((UINT32)buff[14])&0x000000FF);
194 unsigned char CRC = buff[15];
195 unsigned char FileOffset = buff[15];
196
197
198 if (Counter < prevPckCounter){
199 response = prevPckCounter - Counter;
200 //oss.str("");
201 //oss << "Packet counter is less than before of " << (prevPckCounter - Counter);
202 //throw BackwardCounterException(oss.str().c_str());
203 //logger->error(oss.str().c_str());
204 }
205
206 if (Counter > prevPckCounter + 1){
207 oss.str("");
208 oss << "Packet counter is greater than before of " << (Counter - prevPckCounter);
209 logger->error(oss.str().c_str());
210 }
211
212 if ((OrbitalTime == prevPckOBT) & (PacketId1 == 0x10)){
213 oss.str("");
214 oss << "Onboard Time of this packet is equal to the previous packet OBT";
215 logger->error(oss.str().c_str());
216 logger->error(Header->GetPscuHeader()->Print());
217 }
218
219 if (OrbitalTime < prevPckOBT){
220 oss.str("");
221 oss << " Onboard Time is less than before of " << (prevPckOBT - OrbitalTime);
222 logger->error(oss.str().c_str());
223 }
224
225 if (((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]) && (PacketId1 == PacketId2)){
226 prevPckCounter = Counter;
227 prevPckOBT = OrbitalTime;
228 long int initPos = InputFile->tellg();
229 long int finalPos;
230 Header->GetPscuHeader()->SetPacketId(PacketId1, PacketId2);
231 Header->GetPscuHeader()->SetCounter(Counter);
232 Header->GetPscuHeader()->SetOrbitalTime(OrbitalTime);
233 //PacketLength is the length of the whole DATApacket starting from the first byte after the header
234 //plus the CRC legth (which varies for each type of packet)
235 Header->GetPscuHeader()->SetPacketLenght(PacketLenght);
236 Header->GetPscuHeader()->SetCRC(CRC);
237 Header->GetPscuHeader()->SetFileOffset(((long int)(InputFile->tellg()) - 16));
238 } else {
239 /*Here i should extract the block of Data for later analysis */
240 InputFile->seekg(-(13), std::ios::cur);
241 oss.str("");
242 oss << "CRC Header Error on packet:" << PscuHeader::Print(buff);
243 throw WrongCRCHeaderException(oss.str().c_str());
244 }
245
246 if (response > 0){
247 oss.str("");
248 oss << "Packet counter is less than before of " << response;
249 throw BackwardCounterException(oss.str().c_str());
250 }
251 }
252
253 /**
254 * Unpack the trailer of a PSCU event into the structure.
255 */
256 void EventReader::UnpackPscuTrailer(void) throw (std::exception) {
257
258 }
259
260 /**
261 * Find the next starting poin for the PSCU event looking for a {0xFA, 0xFE, 0xDE} sequence
262 */
263 bool EventReader::FindStart(void) throw (std::exception) {
264 //search an hexadecimal sequence in a file
265 //subSign ------> pointer to the sequence buffer
266 //subSignDim ------> dimension of the buffer
267 // at exit
268 // return true if founds a match (else false)
269 // subF point rigth after the match, if found. Else EOF.
270 //Maurizio 15/11/2002-----------------------
271 const int subSignDim = 3;
272 const unsigned char subSign[subSignDim]={0xFA, 0xFE, 0xDE};
273 //------------------------------------------
274 int subIndex = 0;
275 char dataByte;
276
277 int buffSize = 64;
278 int index = 0;
279 int loop = -1;
280 char buffer[buffSize];
281 bool flagOverPad = false;
282
283 while (!InputFile->eof()) {
284 InputFile->read(buffer, sizeof(buffer));
285 index = 0;
286 loop++;
287 while (index < buffSize){
288 dataByte = buffer[index++];
289 if (dataByte == (char)(*(subSign+subIndex))){
290 if (subIndex++ == (subSignDim-1)) {
291 InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur);
292 if (flagOverPad){
293 oss.str("");
294 oss << "\n This packet beginning is farther than 64 byte from the end of the previous."
295 << "\n Below the is the last already unpacked packet";
296 logger->error(oss.str().c_str());
297 logger->error(Header->GetPscuHeader()->Print());
298 }
299 return true;
300 }
301 } else {
302 index = index - (subIndex);
303 subIndex = 0;
304 }
305 }
306 //Needs to guarantee the overap of the buffer(s) in several loop
307 flagOverPad = true;
308 InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur);
309 }
310 return false;
311 }
312
313 ClassImp(EventReader)

  ViewVC Help
Powered by ViewVC 1.1.23