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

Annotation of /yoda/techmodel/EventReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.0 - (hide annotations) (download)
Tue Feb 7 17:11:09 2006 UTC (18 years, 9 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 kusanagi 1.1 /** @file
2 kusanagi 6.0 * $Author: kusanagi $
3     * $Date: 2006/02/04 12:37:45 $
4     * $Revision: 5.2 $
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     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 kusanagi 2.6 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 kusanagi 2.5 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 kusanagi 2.6 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init, new Ac1InitReader));
64 kusanagi 2.5 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 kusanagi 2.6 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init, new Ac2InitReader));
71 kusanagi 2.5 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 kusanagi 2.11 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT, new TsbTReader));
78     TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB, new TsbBReader));
79 kusanagi 1.1 }
80    
81     /**
82     * Get a string with the version info of the algorithm.
83     */
84     std::string EventReader::GetVersionInfo(void) const {
85     return
86 kusanagi 6.0 "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 5.2 2006/02/04 12:37:45 kusanagi Exp $\n";
87 kusanagi 1.1 }
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 kusanagi 2.4 oss.str("");
103 kusanagi 1.10 oss << "Initializing algo " << i->second->GetAlgorithmName();
104     logger->debug(oss.str().c_str());
105 kusanagi 1.1 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 kusanagi 1.10 stringstream oss;
118     int step = 0;
119 kusanagi 2.5 const PacketType* type;
120 kusanagi 1.10 while (!InputFile->eof() && ((step++ < maxPackets) || (maxPackets == 0))){
121 kusanagi 1.1 try {
122     if (FindStart()) {
123 kusanagi 2.4 UnpackPscuHeader();
124 kusanagi 2.5 type = Header->GetPscuHeader()->GetPacketType();
125 kusanagi 1.1 AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type);
126     if (i != TechmodelAlgorithmMap.end()) {
127 kusanagi 2.5 TechmodelAlgorithm *EventAlgorithm(i->second);
128 kusanagi 1.1 EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght());
129     Run->FillTrees(type);
130     Header->GetCounter()->Increment(type);
131 kusanagi 2.4 logger->info(Header->GetPscuHeader()->Print());
132 kusanagi 1.1 } else {
133 kusanagi 2.8 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 kusanagi 2.3 }
137     }
138 kusanagi 2.4 // In case of exception have to save the packet in a specific root file??
139     } catch (NotExistingAlgorithmException exc) {
140 kusanagi 2.5 oss.str("");
141     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
142     logger->error(oss.str().c_str());
143 kusanagi 2.4 } catch (WrongCRCHeaderException exc) {
144 kusanagi 2.5 oss.str("");
145 kusanagi 2.8 oss << exc.print();
146 kusanagi 2.5 logger->error(oss.str().c_str());
147 kusanagi 2.4 } catch (WrongCRCException exc) {
148 kusanagi 2.5 oss.str("");
149     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
150     logger->error(oss.str().c_str());
151 kusanagi 4.5 InputFile->seekg( (-1)*(Header->GetPscuHeader()->GetPacketLenght() + 15) , std::ios::cur);
152 kusanagi 2.4 } catch (UnidentifiedPacketException exc) {
153 kusanagi 2.5 oss.str("");
154     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
155     logger->error(oss.str().c_str());
156 kusanagi 2.4 } catch (NotExistingCounterException exc) {
157 kusanagi 2.5 oss.str("");
158     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
159     logger->error(oss.str().c_str());
160 kusanagi 2.4 } catch (LengthException exc) {
161 kusanagi 2.5 oss.str("");
162     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
163     logger->error(oss.str().c_str());
164 kusanagi 4.5 } catch (BackwardCounterException exc) {
165     oss.str("");
166     oss << exc.print() << " " << Header->GetPscuHeader()->Print();
167     logger->error(oss.str().c_str());
168 kusanagi 1.1 } catch (...) {
169 kusanagi 2.4 logger->error("Couldn't read the event. Skipping to the next header. \n");
170 kusanagi 1.1 }
171 kusanagi 2.1 if ((step%1000) == 0) std::cout << step/1000 << "K \n";
172 kusanagi 2.10 oss.str("");
173     oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n";
174     logger->info(oss.str().c_str());
175 kusanagi 1.1 }
176 kusanagi 1.10 Header->GetCounter()->PrintCounters();
177 kusanagi 1.1 }
178    
179     /**
180     * Unpack the PSCU header from a file into the structure.
181     */
182 kusanagi 4.5 void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException, BackwardCounterException) {
183 kusanagi 1.10 stringstream oss;
184 kusanagi 4.5 int response = 0;
185 kusanagi 1.1 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 kusanagi 1.9 unsigned char FileOffset = buff[15];
196 kusanagi 1.1
197 kusanagi 4.5
198 kusanagi 1.1 if (Counter < prevPckCounter){
199 kusanagi 4.5 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 kusanagi 2.10 }
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 kusanagi 1.1 }
211 kusanagi 3.1
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 kusanagi 1.1
219     if (OrbitalTime < prevPckOBT){
220 kusanagi 2.4 oss.str("");
221     oss << " Onboard Time is less than before of " << (prevPckOBT - OrbitalTime);
222 kusanagi 2.10 logger->error(oss.str().c_str());
223 kusanagi 1.1 }
224    
225 kusanagi 1.7 if (((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]) && (PacketId1 == PacketId2)){
226     prevPckCounter = Counter;
227     prevPckOBT = OrbitalTime;
228 kusanagi 1.1 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 kusanagi 1.9 Header->GetPscuHeader()->SetFileOffset(((long int)(InputFile->tellg()) - 16));
238 kusanagi 1.1 } else {
239 kusanagi 2.8 /*Here i should extract the block of Data for later analysis */
240 kusanagi 1.8 InputFile->seekg(-(13), std::ios::cur);
241 kusanagi 2.8 oss.str("");
242     oss << "CRC Header Error on packet:" << PscuHeader::Print(buff);
243     throw WrongCRCHeaderException(oss.str().c_str());
244 kusanagi 1.1 }
245 kusanagi 2.4
246 kusanagi 4.5 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 kusanagi 1.1 }
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 kusanagi 2.7 bool EventReader::FindStart(void) throw (std::exception) {
264 kusanagi 1.1 //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 kusanagi 2.4 const int subSignDim = 3;
272     const unsigned char subSign[subSignDim]={0xFA, 0xFE, 0xDE};
273 kusanagi 1.1 //------------------------------------------
274     int subIndex = 0;
275     char dataByte;
276 kusanagi 4.1
277     int buffSize = 64;
278 kusanagi 1.10 int index = 0;
279 kusanagi 2.4 int loop = -1;
280 kusanagi 1.10 char buffer[buffSize];
281 kusanagi 4.1 bool flagOverPad = false;
282 kusanagi 1.10
283     while (!InputFile->eof()) {
284     InputFile->read(buffer, sizeof(buffer));
285     index = 0;
286 kusanagi 2.4 loop++;
287 kusanagi 1.10 while (index < buffSize){
288     dataByte = buffer[index++];
289     if (dataByte == (char)(*(subSign+subIndex))){
290     if (subIndex++ == (subSignDim-1)) {
291 kusanagi 2.4 InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur);
292 kusanagi 4.1 if (flagOverPad){
293     oss.str("");
294     oss << "\n This packet beginning is farther than 64 byte from the end of the previous."
295 kusanagi 4.2 << "\n Below the is the last already unpacked packet";
296 kusanagi 4.1 logger->error(oss.str().c_str());
297     logger->error(Header->GetPscuHeader()->Print());
298     }
299 kusanagi 2.7 return true;
300 kusanagi 2.4 }
301 kusanagi 1.10 } else {
302 kusanagi 2.4 index = index - (subIndex);
303 kusanagi 1.10 subIndex = 0;
304     }
305     }
306 kusanagi 2.4 //Needs to guarantee the overap of the buffer(s) in several loop
307 kusanagi 4.1 flagOverPad = true;
308 kusanagi 2.4 InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur);
309 kusanagi 2.7 }
310     return false;
311 kusanagi 1.1 }
312    
313     ClassImp(EventReader)

  ViewVC Help
Powered by ViewVC 1.1.23