/[PAMELA software]/yoda/techmodel/physics/CalorimeterReader.cpp
ViewVC logotype

Contents of /yoda/techmodel/physics/CalorimeterReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.1 - (show annotations) (download)
Tue Sep 12 08:56:30 2006 UTC (18 years, 2 months ago) by mocchiut
Branch: MAIN
CVS Tags: YODA6_3/19, YODA6_3/18, YODA6_3/13, YODA6_3/12, YODA6_3/11, YODA6_3/10, YODA6_3/17, YODA6_3/16, YODA6_3/15, YODA6_3/14, YODA6_3/20, YODA6_3/08, YODA6_3/09, HEAD
Changes since 6.0: +18 -4 lines
Added unpackError flag to trigger and tof, small change in the calo unpackError flag

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

  ViewVC Help
Powered by ViewVC 1.1.23