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

Contents of /yoda/techmodel/PhysEndRunReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3.0 - (show annotations) (download)
Fri Mar 4 15:54:11 2005 UTC (19 years, 11 months ago) by kusanagi
Branch: MAIN
Changes since 2.3: +1 -1 lines
Error proof version.
Implemented all detectors packets plus all the main telemetries packets.
Missing all the Init and Alarm packets.
Disabled CRC control on VarDump, ArrDump, TabDump for CPU debugging needs
(the data formats seems correct even if CRC get wrong)

1
2 // Implementation of the PhysEndRunReader class.
3
4
5 #define UINT unsigned int
6 #define BYTE unsigned char
7 #include <string>
8 #include <log4cxx/logger.h>
9 extern "C" {
10 #include <sys/time.h>
11 #include "CRC.h"
12 }
13
14 #include <fstream>
15 #include "stdio.h"
16 #include "ReaderAlgorithms.h"
17
18 using namespace pamela;
19 using namespace pamela::techmodel;
20
21 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.PhysEndRunReader"));
22
23 /**
24 * Constructor.
25 */
26 PhysEndRunReader::PhysEndRunReader(void):
27 TechmodelAlgorithm(PacketType::PhysEndRun, "TechmodelPhysEndRunReader") {
28 logger->debug(_T("Constructor"));
29 physEndRun = new PhysEndRunEvent();
30 }
31
32 /**
33 * Get a string with the version info of the algorithm.
34 */
35 std::string PhysEndRunReader::GetVersionInfo(void) const {
36 return
37 "$Header: /home/cvsmanager/yoda/techmodel/PhysEndRunReader.cpp,v 2.3 2005/03/03 13:06:20 kusanagi Exp $\n";
38 }
39
40 /**
41 * Initialize the algorithm with a special run. This will initialize the
42 * event reader routines for all packet types.
43 */
44 void PhysEndRunReader::Init(PamelaRun *run) {
45 SetInputStream(run);
46 run->WriteSubPacket(this, &physEndRun, physEndRun->Class());
47 logger->debug(_T("Initialize"));
48 }
49
50 /**
51 * Unpack the PhysEndRun event from an input file.
52 */
53
54 void PhysEndRunReader::RunEvent(int EventNumber, long int length) throw (WrongCRCException){
55 char subData[length];
56 UINT16 subCRC; //CRC of the data
57 UINT16 readCRC; //CRC read from the end of the subpacket
58 long int dataLength;
59 long int tbInitPos;
60
61 //int numRecords = ((length - 2)/6);
62 dataLength = length - (long int)2;
63 tbInitPos = dataLength - 19; // 19 is the length of th TB
64 //physEndRun->CALO_ENDRUN[];
65 //physEndRun->TB_ENDRUN;
66
67 InputFile->read(subData, sizeof(unsigned char)*length);
68 subCRC = CM_Compute_CRC16(0, (UINT8*)subData, dataLength);
69 readCRC = (((UINT16)(subData[length - 2]<<8))&0xFF00) + (((UINT16)subData[length - 1])&0x00FF);
70
71 //if (subCRC != readCRC) throw WrongCRCException(" Wrong CRC for PhysEndRun Packet ");
72 if (subCRC != readCRC) {
73 logger->error(" Wrong CRC for PhysEndRun Packet but I process it anyway");
74 }
75 //--------------- CALO SECTION------------------------------------
76 long int offset = 0;
77 int j = 0;
78 //physEndRun->CALO_ENDRUN.
79 while(offset < tbInitPos){
80 physEndRun->CALO_ENDRUN[j].CALO_BOARD_ID_HK = (((UINT8)subData[offset])&0x1F);
81 physEndRun->CALO_ENDRUN[j].CALO_BOARD_STATUS_HK = ((UINT8)subData[offset+1]);
82 //subData[offset+2--->3] is a fixed word = 0x23
83 //If this bit is ? the subsequent CALO_HK are not valid
84 if (!(physEndRun->CALO_ENDRUN[j].CALO_BOARD_STATUS_HK & 0x02)) {
85 for(int k = 0; k < 11 ; k++){
86 physEndRun->CALO_ENDRUN[j].CALO_HK0[k] = (((UINT16)(subData[offset+3+k]<<8))&0xFF00) + (((UINT16)subData[offset+4+k])&0x00FF);
87 physEndRun->CALO_ENDRUN[j].CALO_HK1[k] = (((UINT16)(subData[offset+14+k]<<8))&0xFF00) + (((UINT16)subData[offset+15+k])&0x00FF);
88 }
89 offset = offset + 50; //CALO_BOARD_ID_HK + CALO_BOARD_STATUS_HK + 2*CALO_HKx + CRC (2Bytes)
90 } else offset = offset + 4; //CALO_BOARD_ID_HK + CALO_BOARD_STATUS_HK + CRC (2Bytes)
91 //subData[offset+(3+k)--->(15+k)] have a CRC(what?) in subData[offset+ 23--->24]
92
93 for(int k = 0; k < 7 ; k++){
94 physEndRun->CALO_ENDRUN[j].CALO_BOARD_ID_REG = ((UINT8)(subData[offset])&0x1F);
95 physEndRun->CALO_ENDRUN[j].CALO_BOARD_STATUS_REG = (UINT8)(subData[offset+1]);
96 //subData[offset+2--->3] is a fixed word = 0x2
97 physEndRun->CALO_ENDRUN[j].CALO_REG[k] = (((UINT16)(subData[offset+4]<<8))&0xFF00) + (((UINT16)subData[offset+5])&0x00FF);
98 //subData[offset+ 0--->5] have a CRC(what?) in subData[offset+ 6--->7]
99 offset = offset + 8; //CALO_BOARD_ID_REG + CALO_BOARD_STATUS_REG + CALO_REG + CRC(2Byte)
100 }
101 j++;
102 }
103
104 //--------------- TB SECTION------------------------------------
105 physEndRun->TB_ENDRUN.TB_ALARM_MASK = (((UINT16)(subData[offset]<<8))&0xFF00) + (((UINT16)subData[offset + 1])&0x00FF);
106 //subData[offset+ 0--->1] have a CRC(what?) in subData[offset+2]
107 //Here are missing the TB_PMT_MASK;
108 //subData[offset+ 3--->8] have a CRC(what?) in subData[offset+9]
109 physEndRun->TB_ENDRUN.TB_S4_MASK = ((UINT8)subData[offset+10])>>5;
110 physEndRun->TB_ENDRUN.TB_CALO_MASK = (((UINT8)subData[offset+10])>>1)&0x0F;
111 //subData[tbInitPos+9] have a CRC(what?) in subData[tbInitPos+11]
112 physEndRun->TB_ENDRUN.TB_BUSY_MASK = (((UINT32)subData[offset+12]<<16)&0x00FF0000) + (((UINT32)subData[offset+13]<<8)&0x0000FF00) + (((UINT32)subData[offset+14])&0x000000FF);
113 //subData[tbInitPos+ 12--->14] have a CRC(what?) in subData[tbInitPos+15]
114 physEndRun->TB_ENDRUN.TB_CALIB_FLAG = ((UINT8)subData[offset+16])>>7;
115 physEndRun->TB_ENDRUN.TB_S4_TRIG = ((UINT8)subData[offset+16])>>6;
116 physEndRun->TB_ENDRUN.TB_CALO_TRIG = ((UINT8)subData[offset+16])>>5;
117 physEndRun->TB_ENDRUN.TB_TOF_TRIG = (UINT8)(subData[offset+16]<<3) + (UINT8)(subData[offset+17]>>5);
118 //subData[tbInitPos+ 16--->17] have a CRC(what?) in subData[tbInitPos+18]
119 }
120

  ViewVC Help
Powered by ViewVC 1.1.23