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

Annotation of /chewbacca/PamOffLineSW/techmodel/CalibCalPulse1Reader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations) (download)
Thu Oct 2 14:37:17 2008 UTC (16 years, 2 months ago) by mocchiut
Branch: MAIN
CVS Tags: v1r02, v1r00, v1r01
Changes since 1.1: +73 -29 lines
CalibCal, CaliCalPulse1/2 classes changed and new readers implemented, PhysEndRun CRC problem fixed

1 mocchiut 1.1
2     // Implementation of the CalibCalPulse1Reader class.
3    
4    
5     extern "C" {
6     #include "CRC.h"
7     //Struct per il passaggio di dati da e verso la chiamata fortran
8     extern struct {
9     int iev;
10     int pstwerr[4];
11     float pperror[4];
12     float calpuls[4][11][96];
13     } calpul_;
14    
15     //external declaration of the Fortran function
16     void calpulse_(char*, long int*, int*);
17     }
18    
19     #include "ReaderAlgorithms.h"
20    
21     using namespace pamela::techmodel;
22    
23    
24     /**
25     * Constructor.
26     */
27     CalibCalPulse1Reader::CalibCalPulse1Reader(void):
28     TechmodelAlgorithm(PacketType::CalibCalPulse1, "TechmodelCalibCalPulse1Reader") {
29     calibCalPulse1 = new CalibCalPulse1Event();
30     }
31    
32     /**
33     * Get a string with the version info of the algorithm.
34     */
35     std::string CalibCalPulse1Reader::GetVersionInfo(void) const {
36     return
37 mocchiut 1.2 "$Header: /afs/ba.infn.it/user/pamela/src/CVS/chewbacca/PamOffLineSW/techmodel/CalibCalPulse1Reader.cpp,v 1.1.1.1 2008/09/23 07:20:26 mocchiut Exp $\n";
38 mocchiut 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 CalibCalPulse1Reader::Init(PamelaRun *run) {
45     run->WriteSubPacket(this, &calibCalPulse1, calibCalPulse1->Class());
46     }
47    
48     /**
49     * Unpack the CalibCalPulse1 event
50     */
51     void CalibCalPulse1Reader::PKT_RunEvent(char* packetData, long int dataLength) throw (Exception){
52 mocchiut 1.2
53     string msg;
54     std::stringstream oss;
55     int ERROR;
56    
57     //
58     // FAFEDE0808 is used to store two different data set: when length = 6 we store the calorimeter answer to commands CAL_RESET, WRITE_FPGA_REG_CH, WRITE_FPGA_REG_VCAL
59     // else when length > 6 we store calpulse1 data
60     //
61     if ( dataLength == 6 ){
62     if ( calpul_.iev != calpul_.iev || calpul_.iev < 0 || calpul_.iev > 9000000 ) calpul_.iev = 0;
63     calpul_.iev++;
64     calibCalPulse1->iev = calpul_.iev;
65     //
66     calibCalPulse1->pstwerr[0] = 0;
67     calibCalPulse1->pstwerr[1] = 0;
68     calibCalPulse1->pstwerr[2] = 0;
69     calibCalPulse1->pstwerr[3] = 0;
70     //
71     calibCalPulse1->pperror[0] = 129.;
72     calibCalPulse1->pperror[1] = 129.;
73     calibCalPulse1->pperror[2] = 129.;
74     calibCalPulse1->pperror[3] = 129.;
75     //
76     float tempCalpuls[96][11][4];
77     memset(calpul_.calpuls,0,sizeof(tempCalpuls));
78     memcpy(tempCalpuls, calpul_.calpuls, sizeof(tempCalpuls));
79     for (int i = 0; i < 4; i++){
80     for (int j = 0; j <11; j++){
81     for (int z = 0; z < 96; z++){
82     calibCalPulse1->calpuls[i][j][z] = tempCalpuls[z][j][i];
83     }
84     }
85     }
86     //
87     calibCalPulse1->CAL_RESET = (((UINT16)(packetData[0]<<8))&0xFF00) + (((UINT16)(packetData[1]))&0x00FF);
88     calibCalPulse1->WRITE_FPGA_REG_CH = (((UINT16)(packetData[2]<<8))&0xFF00) + (((UINT16)(packetData[3]))&0x00FF);
89     calibCalPulse1->WRITE_FPGA_REG_VCAL = (((UINT16)(packetData[4]<<8))&0xFF00) + (((UINT16)(packetData[5]))&0x00FF);
90     calibCalPulse1->unpackError = 1;
91     //
92     } else {
93     //
94 mocchiut 1.1 calpulse_(packetData, &dataLength, &ERROR);
95    
96     calibCalPulse1->unpackError = ERROR;
97     oss.str("");
98     if (ERROR != 0) {
99 mocchiut 1.2 char *errmsg;
100     switch (ERROR){
101     case 1: errmsg = "CALORIMETER NOT FOUND";
102     }
103     oss << "CalibCalPulse1: Fortran77 function calpulse error code = " << ERROR
104     << " " << errmsg;
105     msg=oss.str();
106     if ( dataLength > 6 ) PamOffLineSW::mainLogUtil->logWarning(msg);
107     } //else {
108     //Store the unpacked data
109     calibCalPulse1->iev = calpul_.iev;
110     memcpy(calibCalPulse1->pstwerr, calpul_.pstwerr, sizeof(calibCalPulse1->pstwerr));
111     memcpy(calibCalPulse1->pperror, calpul_.pperror, sizeof(calibCalPulse1->pperror));
112 mocchiut 1.1 //--------have to invert array because of FORTRAN <-> C different management of the indexes
113 mocchiut 1.2 float tempCalpuls[96][11][4];
114     memcpy(tempCalpuls, calpul_.calpuls, sizeof(tempCalpuls));
115     for (int i = 0; i < 4; i++){
116     for (int j = 0; j <11; j++){
117     for (int z = 0; z < 96; z++){
118     calibCalPulse1->calpuls[i][j][z] = tempCalpuls[z][j][i];
119     }
120     }
121     }
122     //
123     calibCalPulse1->CAL_RESET = 0;
124     calibCalPulse1->WRITE_FPGA_REG_CH = 0;
125     calibCalPulse1->WRITE_FPGA_REG_VCAL = 0;
126     //
127     };
128     //-----------------------------------------------------------------------------------------
129     //}
130 mocchiut 1.1 }

  ViewVC Help
Powered by ViewVC 1.1.23