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

Annotation of /yoda/techmodel/PhysEndRunReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3.0 - (hide annotations) (download)
Fri Mar 4 15:54:11 2005 UTC (19 years, 9 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 kusanagi 1.1
2     // Implementation of the PhysEndRunReader class.
3    
4    
5     #define UINT unsigned int
6     #define BYTE unsigned char
7     #include <string>
8 kusanagi 1.2 #include <log4cxx/logger.h>
9 kusanagi 1.1 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 kusanagi 1.2 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.PhysEndRunReader"));
22 kusanagi 1.1
23     /**
24     * Constructor.
25     */
26     PhysEndRunReader::PhysEndRunReader(void):
27     TechmodelAlgorithm(PacketType::PhysEndRun, "TechmodelPhysEndRunReader") {
28 kusanagi 1.2 logger->debug(_T("Constructor"));
29 kusanagi 1.1 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 kusanagi 3.0 "$Header: /home/cvsmanager/yoda/techmodel/PhysEndRunReader.cpp,v 2.3 2005/03/03 13:06:20 kusanagi Exp $\n";
38 kusanagi 1.1 }
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 kusanagi 1.2 logger->debug(_T("Initialize"));
48 kusanagi 1.1 }
49    
50     /**
51     * Unpack the PhysEndRun event from an input file.
52     */
53 kusanagi 2.3
54 kusanagi 2.1 void PhysEndRunReader::RunEvent(int EventNumber, long int length) throw (WrongCRCException){
55 kusanagi 2.3 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 kusanagi 1.1
67 kusanagi 2.3 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 kusanagi 1.1
104 kusanagi 2.3 //--------------- 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 kusanagi 1.1 }
120    

  ViewVC Help
Powered by ViewVC 1.1.23