/[PAMELA software]/chewbacca/PamOffLineSW/physics/CalorimeterReader.cpp
ViewVC logotype

Contents of /chewbacca/PamOffLineSW/physics/CalorimeterReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations) (download)
Wed Aug 5 18:48:40 2009 UTC (15 years, 4 months ago) by pam-fi
Branch: MAIN
CVS Tags: v10RED, v9r00, v9r01, HEAD
Changes since 1.1: +5 -5 lines
Various minor modifications for compatibility with gcc 4.4, removal of warnings due to mismatch between char* and const char*, bug fix.

1 /** @file
2 * $Source: /afs/ba.infn.it/user/pamela/src/CVS/chewbacca/PamOffLineSW/physics/CalorimeterReader.cpp,v $
3 * $Id: CalorimeterReader.cpp,v 1.1.1.1 2008-09-23 07:20:23 mocchiut Exp $
4 * $Author: mocchiut $
5 *
6 * Implementation of the CalorimeterReader class.
7 */
8
9
10 #include <iostream>
11 #include <string>
12 #include "CalorimeterReader.h"
13
14 extern "C" {
15
16
17 extern struct {
18 int iev;
19 int stwerr[4];
20 float perror[4];
21 float dexy[2][22][96];
22 float dexyc[2][22][96];
23 float base[2][22][6];
24 float calselftrig[4][7];
25 float calIItrig[4];
26 float calstriphit[4];
27 float calDSPtaberr[4];
28 float calevnum[4];
29 } evento_;
30
31 void calunpack_(unsigned char[], long int*, int*);
32 //Struct per il passaggio di dati da e verso la chiamata fortran
33 }
34
35 using namespace pamela;
36 using namespace pamela::calorimeter;
37
38
39 /**
40 * Constructor.
41 */
42 CalorimeterReader::CalorimeterReader(void):
43 TechmodelAlgorithm(PacketType::Physics, "TechmodelCalorimeterReader") {
44 calorimeter = new CalorimeterEvent();
45 }
46
47 /**
48 * Get a string with the version info of the algorithm.
49 */
50 std::string CalorimeterReader::GetVersionInfo(void) const {
51 return
52 "$Header: /afs/ba.infn.it/user/pamela/src/CVS/chewbacca/PamOffLineSW/physics/CalorimeterReader.cpp,v 1.1.1.1 2008-09-23 07:20:23 mocchiut Exp $";
53 }
54
55 /**
56 * Initialize the algorithm with a special run. This will initialize the
57 * event reader routines for all packet types.
58 */
59 void CalorimeterReader::Init(PamelaRun *run) {
60 run->WriteSubPacket(this, &calorimeter, calorimeter->Class());
61 }
62
63 /**
64 * Unpack the calorimeter event from an input file.
65 */
66 void CalorimeterReader::RunEvent(int EventNumber) {
67
68 }
69
70 /**
71 * Unpack the Calorimeter data event from the physical packet.
72 */
73 void CalorimeterReader::RunEvent(int EventNumber, const char subData[], long int length) {
74 std::stringstream oss;
75 string msg;
76
77 char *data = new char[length];
78 memcpy(data, subData, length);
79 int ERROR = 0;
80
81 /*unsigned short convdata[length];
82 for (int i = 0; i<length; i++){
83 convdata[i] = (unsigned short)((unsigned char)subData[i]&0xFF);
84 }*/
85
86 //Call to the routine that unpack calorimeter events
87 calunpack_((unsigned char*)data, &length, &ERROR);
88
89 if (ERROR != 0) {
90 const char *errmsg;
91 switch (ERROR){
92 case 1: errmsg = "CALORIMETER NOT FOUND";
93 break;
94 default: errmsg = "CALORIMETER ERRROR CODE UNIDENTIFIED";
95 }
96 oss.str("");
97 oss << "Calorimeter: Fortran77 function calunpack: " << errmsg;
98 msg=oss.str();
99 PamOffLineSW::mainLogUtil->logWarning(msg);
100 }
101 //
102 ERROR = 0;
103 Int_t cmask = 119;
104 for (int i=0; i<4 ; i++){
105 if ( evento_.perror[i] ){
106 ERROR = 1;
107 break;
108 };
109 if ( evento_.stwerr[i] & cmask ){
110 ERROR = 1;
111 break;
112 };
113 };
114 //
115 calorimeter->unpackError = ERROR;
116 // In case of "ERROR != 0" the calunpack will take care to set all
117 // parameters to zero
118 //} else {
119 calorimeter->iev = evento_.iev;
120 memcpy(calorimeter->stwerr, evento_.stwerr, sizeof(calorimeter->stwerr));
121 memcpy(calorimeter->perror, evento_.perror, sizeof(calorimeter->perror));
122 //--------have to invert array because of FORTRAN <-> C different management of the indexes
123 float tempDexy[96][22][2];
124 float tempDexyc[96][22][2];
125 float tempBase[6][22][2];
126 float tempCalselftrig[7][4];
127 memcpy(tempDexy, evento_.dexy, sizeof(tempDexy));
128 memcpy(tempDexyc, evento_.dexyc, sizeof(tempDexyc));
129 memcpy(tempBase, evento_.base, sizeof(tempBase));
130 memcpy(tempCalselftrig, evento_.calselftrig, sizeof(tempCalselftrig));
131
132 for (int i = 0; i < 4; i++){
133 for (int j = 0; j < 7; j++){
134 calorimeter->calselftrig[i][j] = tempCalselftrig[j][i];
135 }
136 }
137
138 for (int i = 0; i < 2; i++){
139 for (int j = 0; j < 22; j++){
140 for (int z = 0; z < 96; z++){
141 calorimeter->dexy[i][j][z] = tempDexy[z][j][i];
142 calorimeter->dexyc[i][j][z] = tempDexyc[z][j][i];
143 }
144 for (int z = 0; z < 6; z++){
145 calorimeter->base[i][j][z] = tempBase[z][j][i];
146 }
147 }
148 }
149 //-----------------------------------------------------------------------------------------
150 memcpy(calorimeter->calIItrig, evento_.calIItrig, sizeof(calorimeter->calIItrig));
151 memcpy(calorimeter->calstriphit, evento_.calstriphit, sizeof(calorimeter->calstriphit));
152 memcpy(calorimeter->calDSPtaberr, evento_.calDSPtaberr, sizeof(calorimeter->calDSPtaberr));
153 memcpy(calorimeter->calevnum, evento_.calevnum, sizeof(calorimeter->calevnum));
154 //}
155 delete [] data;
156 }

  ViewVC Help
Powered by ViewVC 1.1.23