/[PAMELA software]/chewbacca/PamOffLineSW/techmodel/EventReader.cpp
ViewVC logotype

Contents of /chewbacca/PamOffLineSW/techmodel/EventReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Tue Sep 23 07:20:24 2008 UTC (16 years, 2 months ago) by mocchiut
Branch: MAIN
Branch point for: v0r00
Initial revision

1 /** @file
2 * $Author: messineo $
3 * $Date: 2008-03-12 13:48:30 $
4 * $Revision: 1.21 $
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 "EventReader.h"
11 #include "ReaderAlgorithms.h"
12
13 extern "C" {
14 #include "CRC.h"
15 }
16
17 using namespace pamela;
18 using namespace pamela::techmodel;
19
20 EventReader::~EventReader(){
21 if(Header){delete Header; Header=NULL;}
22 }
23
24 /**
25 * Constructor.
26 */
27
28 EventReader::EventReader():
29 TechmodelAlgorithm(0, "TechmodelEventReader"){
30 Header = new EventHeader();
31
32 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::PhysEndRun, new PhysEndRunReader));
33 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse1, new CalibCalPulse1Reader));
34 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse2, new CalibCalPulse2Reader));
35 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Physics, new PhysicsReader));
36 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrkBoth, new CalibTrkBothReader));
37 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk1, new CalibTrk1Reader));
38 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk2, new CalibTrk2Reader));
39 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTof, new CalibTofReader));
40 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibS4, new CalibS4Reader));
41 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPed, new CalibCalPedReader));
42 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac1, new Calib1_Ac1Reader));
43 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac1, new Calib2_Ac1Reader));
44 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac2, new Calib1_Ac2Reader));
45 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2, new Calib2_Ac2Reader));
46 //TODO: marco maybe a bug?: due volte Calib2_Ac2. ??
47 // TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2, new CalibCalReader));
48 //TODO: marco maybe a bug?
49 // questa dovrebbe essere cosi ma poi c'e' un errore in Pamela Run: in WriteHeaders non ho CalibCal
50 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCal, new CalibCalReader));
51 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunHeader, new RunHeaderReader));
52 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunTrailer, new RunTrailerReader));
53 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibHeader, new CalibHeaderReader));
54 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrailer, new CalibTrailerReader));
55 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitHeader, new InitHeaderReader));
56 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitTrailer, new InitTrailerReader));
57 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::EventTrk, new EventTrkReader));
58 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Log, new LogReader));
59 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::VarDump, new VarDumpReader));
60 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ArrDump, new ArrDumpReader));
61 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TabDump, new TabDumpReader));
62 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Tmtc, new TmtcReader));
63 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Mcmd, new McmdReader));
64 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ForcedFECmd, new ForcedFECmdReader));
65 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init, new Ac1InitReader));
66 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalInit, new CalInitReader));
67 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkInit, new TrkInitReader));
68 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofInit, new TofInitReader));
69 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgInit, new TrgInitReader));
70 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::NdInit, new NdInitReader));
71 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Init, new S4InitReader));
72 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init, new Ac2InitReader));
73 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalAlarm, new CalAlarmReader));
74 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Alarm, new Ac1AlarmReader));
75 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkAlarm, new TrkAlarmReader));
76 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgAlarm, new TrgAlarmReader));
77 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofAlarm, new TofAlarmReader));
78 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Alarm, new S4AlarmReader));
79 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Alarm, new Ac2AlarmReader));
80 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT, new TsbTReader));
81 TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB, new TsbBReader));
82 }
83
84 /**
85 * Initialize the algorithm with a special run. This will initialize the
86 * event reader routines for all packet types.
87 */
88 void EventReader::Init(PamelaRun *run) {
89 //Create the structure of directories and create xxx.Header.root files
90 run->WriteHeaders(this, &Header);
91 //Create the xxx.root in it's specific directory
92 for (AlgorithmMap::iterator i = TechmodelAlgorithmMap.begin();
93 i != TechmodelAlgorithmMap.end(); i++) {
94 // cout << " Initializing algo " << i->second->GetAlgorithmName()<<endl;
95 i->second->Init(run);
96 }
97
98 if ( Header ) { delete Header; Header = new EventHeader(); }; // EMILIANO, reset Counter when opening a new file
99
100 Run=run;
101 }
102
103
104 /**
105 * Read the next event header, call the reader algorithms that
106 * correspond to its packet type, and read the event trailer.
107 * if the packet is saved return 0.
108 *
109 * return values: meaning:
110 0 packet good
111 1 exception but used //never happen
112 2 CRC exception but used
113 3 CALIBRATION PACKET with error but used
114 -1 CRC exception packet DISCARDED
115 -2 FATAL exception packet DISCARDED //never happen
116 -3 No way to read events of this type. packet DISCARDED( es CalibCal)
117 //in PacketUser I will put ret = 10
118 ret = 10 if the packet is good but comes from a cadre with VRL problems
119
120 *
121 */
122 int EventReader::PKT_RunEvent(char* headerPkt, char* pamPkt, long int length, const PacketType* type){
123 stringstream oss;
124 string msg;
125 int ret=0;
126 PKT_UnpackPscuHeader(headerPkt);
127 AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type);
128 if (i != TechmodelAlgorithmMap.end())
129 {
130 TechmodelAlgorithm* EventAlgorithm(i->second);
131 try{
132 EventAlgorithm->PKT_RunEvent(pamPkt, length);
133 }
134 catch (WrongCRCException_PKTUsed &exc){
135 //questo tipo di eccezione NON mi preoccupa,
136 //il pacchetto e' stato utilizzato e salvato ugualmente
137 ret=2;
138 oss.str("");
139 oss << exc.print();
140 oss << " Return "<<ret;
141 msg=oss.str();
142 PamOffLineSW::mainLogUtil->logWarning(msg);
143 }
144 catch (CalibException &exc){
145 //questo tipo di eccezione mi preoccupa un pochino,
146 //il pacchetto e' stato utilizzato e salvato ugualmente
147 ret=3;
148 oss.str("");
149 oss << exc.print();
150 oss << " Return "<<ret;
151 msg=oss.str();
152 PamOffLineSW::mainLogUtil->logWarning(msg);
153 }
154 catch (WrongCRCException &exc){
155 //questo tipo di eccezione mi preoccupa,
156 //il pacchetto non e' stato utilizzato ne salvato
157 ret=-1;
158 oss.str("");
159 oss << exc.print();
160 oss << " The Packet is Discarded ";
161 oss << " Return "<<ret;
162 msg=oss.str();
163 PamOffLineSW::mainLogUtil->logError(msg);
164 return ret;
165 }
166 catch (FatalException &exc){
167 ret=-2;
168 oss.str("");
169 oss << exc.print();
170 oss << " The Packet is Discarded ";
171 oss << " Return "<<ret;
172 msg=oss.str();
173 PamOffLineSW::mainLogUtil->logError(msg);
174 return ret;
175 }
176 catch (Exception &exc){
177 ret=1;
178 oss.str("");
179 oss << exc.print();
180 oss << " Return "<<ret;
181 msg=oss.str();
182 PamOffLineSW::mainLogUtil->logWarning(msg);
183 }
184 // catch (NotExistingAlgorithmException exc) {}
185
186 Run->FillTrees(type);
187 Header->GetCounter()->Increment(type);
188 }
189 else
190 {
191 ret=-3;
192 oss.str("");
193 oss << " No way to read events of type " << type->GetName().c_str()<<". The Packet is skipped ";
194 oss << " Return "<<ret;
195 msg=oss.str();
196 PamOffLineSW::mainLogUtil->logWarning(msg);
197 return ret;
198 }
199 return ret;
200 }
201
202 /**
203 * Unpack the PSCU header from the pkt into the structure.
204 */
205 //fill the header structure,
206 void EventReader::PKT_UnpackPscuHeader(char* buff)
207 {
208 unsigned char PacketId1 = buff[3];
209 unsigned char PacketId2 = buff[4];
210 unsigned int Counter = (((UINT32)buff[5]<<16)&0x00FF0000) + (((UINT32)buff[6]<<8)&0x0000FF00) + (((UINT32)buff[7])&0x000000FF);
211 unsigned int OrbitalTime = (((UINT32)buff[8]<<24)&0xFF000000) + (((UINT32)buff[9]<<16)&0x00FF0000) + (((UINT32)buff[10]<<8)&0x0000FF00) + (((UINT32)buff[11])&0x000000FF);
212 unsigned int PacketLenght = (((UINT32)buff[12]<<16)&0x00FF0000) + (((UINT32)buff[13]<<8)&0x0000FF00) + (((UINT32)buff[14])&0x000000FF);
213 unsigned char CRC = buff[15];
214 unsigned char FileOffset = 0;// ??
215
216 Header->GetPscuHeader()->SetPacketId(PacketId1, PacketId2);
217 Header->GetPscuHeader()->SetCounter(Counter);
218 Header->GetPscuHeader()->SetOrbitalTime(OrbitalTime);
219 //PacketLength is the length of the whole DATApacket starting from the first byte after the header
220 //plus the CRC legth (which varies for each type of packet)
221 Header->GetPscuHeader()->SetPacketLenght(PacketLenght);
222
223 Header->GetPscuHeader()->SetCRC(CRC);
224 Header->GetPscuHeader()->SetFileOffset(0);//I don't need this !!
225 }
226
227
228
229 /**
230 * Get a string with the version info of the algorithm.
231 */
232 std::string EventReader::GetVersionInfo(void) const {
233 return
234 "$Header: /repository/PamOffLineSW/techmodel/EventReader.cpp,v 1.21 2008-03-12 13:48:30 messineo Exp $\n";
235 }
236
237
238 ClassImp(EventReader)

  ViewVC Help
Powered by ViewVC 1.1.23