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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by kusanagi, Sat Jul 17 20:03:48 2004 UTC revision 6.1 by mocchiut, Tue Sep 12 08:56:30 2006 UTC
# Line 1  Line 1 
1  /** @file  /** @file
2   * $Source: /home/cvsmanager/yoda/techmodel/physics/AnticounterReader.cpp,v $   * $Source: /afs/ba.infn.it/user/pamela/src/CVS/yoda/techmodel/physics/CalorimeterReader.cpp,v $
3   * $Id: TrackerReader.cpp,v 1.1.1.1 2004/07/06 12:20:23 kusanagi Exp $   * $Id: CalorimeterReader.cpp,v 6.0 2006/02/07 17:11:11 kusanagi Exp $
4   * $Author: kusanagi $   * $Author: kusanagi $
5   *   *
6   * Implementation of the CalorimeterReader class.   * Implementation of the CalorimeterReader class.
7   */   */
8    
9    
10    #include <iostream>
11  #include <string>  #include <string>
12  #include <log4cpp/Category.hh>  #include <log4cxx/logger.h>
13  #include "CalorimeterReader.h"  #include "CalorimeterReader.h"
14    
15  extern "C" {  extern "C" {
16        
17    
18   extern struct {   extern struct {
19          int IEV2;          int     iev;
20          int dexy[96][22][2];          int     stwerr[4];
21          int dexyc[96][22][2];          float   perror[4];
22          int base[96][22][2];          float   dexy[2][22][96];
23          int calselftrig[7][4];          float   dexyc[2][22][96];
24          int calIItrig[4];          float   base[2][22][6];
25          int calstripshift[4];          float   calselftrig[4][7];
26          int calDSPtaberr[4];          float   calIItrig[4];
27          int calevnum[4];          float   calstriphit[4];
28            float   calDSPtaberr[4];
29            float   calevnum[4];
30      } evento_;      } evento_;
31    
32      int calunpack_(unsigned short[], long int*, int*);      void calunpack_(unsigned char[], long int*, int*);
33      //Struct per il passaggio di dati da e verso la chiamata fortran      //Struct per il passaggio di dati da e verso la chiamata fortran
34  }  }
35    
36  using namespace pamela;  using namespace pamela;
37  using namespace pamela::calorimeter;  using namespace pamela::calorimeter;
38    
39  static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.techmodel.calorimeter.CalorimeterReader");    static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.calorimeter.CalorimeterReader"));
40    
41  /**  /**
42   * Constructor.       * Constructor.    
43   */   */
44  CalorimeterReader::CalorimeterReader(void):  CalorimeterReader::CalorimeterReader(void):
45    TechmodelAlgorithm(PacketType::Physics, "TechmodelCalorimeterReader") {    TechmodelAlgorithm(PacketType::Physics, "TechmodelCalorimeterReader") {
46    cat.debug("Constructor");    logger->debug(_T("Construnctor"));
47    calorimeter = new CalorimeterEvent();    calorimeter = new CalorimeterEvent();
48  }  }
49    
# Line 47  CalorimeterReader::CalorimeterReader(voi Line 52  CalorimeterReader::CalorimeterReader(voi
52   */   */
53  std::string CalorimeterReader::GetVersionInfo(void) const {  std::string CalorimeterReader::GetVersionInfo(void) const {
54    return    return
55      "$Header: /home/cvsmanager/yoda/techmodel/physics/CalorimeterReader.cpp,v 1.1.1.1 2004/07/06 12:20:23 kusanagi Exp $";      "$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  /**  /**
# Line 55  std::string CalorimeterReader::GetVersio Line 60  std::string CalorimeterReader::GetVersio
60   * event reader routines for all packet types.   * event reader routines for all packet types.
61   */   */
62  void CalorimeterReader::Init(PamelaRun *run) {  void CalorimeterReader::Init(PamelaRun *run) {
63      logger->debug(_T("Initialize"));
64    SetInputStream(run);    SetInputStream(run);
65    run->WriteSubPacket(this, &calorimeter, calorimeter->Class());    run->WriteSubPacket(this, &calorimeter, calorimeter->Class());
66  }  }
# Line 70  void CalorimeterReader::RunEvent(int Eve Line 76  void CalorimeterReader::RunEvent(int Eve
76   * Unpack the Calorimeter data event from the physical packet.   * Unpack the Calorimeter data event from the physical packet.
77   */   */
78  void CalorimeterReader::RunEvent(int EventNumber, const char subData[], long int length) {  void CalorimeterReader::RunEvent(int EventNumber, const char subData[], long int length) {
79      char data[length];      std::stringstream oss;      
80        char *data = new char[length];
81      memcpy(data, subData, length);      memcpy(data, subData, length);
82      int  ERROR = 0;      int  ERROR = 0;
83            
84      unsigned short convdata[length];      /*unsigned short convdata[length];
85      for (int i = 0; i<length; i++){      for (int i = 0; i<length; i++){
86          convdata[i] = (unsigned short)((unsigned char)subData[i]&0xFF);          convdata[i] = (unsigned short)((unsigned char)subData[i]&0xFF);
87      }      }*/
       
88            
89      //Call to the routine that unpack calorimeter events      //Call to the routine that unpack calorimeter events
90      ERROR = calunpack_(convdata, &length, &ERROR);      calunpack_((unsigned char*)data, &length, &ERROR);
91            
92      calorimeter->IEV2 = evento_.IEV2;      if (ERROR != 0) {
93      memcpy(calorimeter->dexy,           evento_.dexy,           sizeof(calorimeter->dexy));          char *errmsg;
94      memcpy(calorimeter->dexyc,          evento_.dexyc,          sizeof(calorimeter->dexyc));          switch (ERROR){
95      memcpy(calorimeter->base,           evento_.base,           sizeof(calorimeter->base));              case 1: errmsg = "CALORIMETER NOT FOUND";
96      memcpy(calorimeter->calselftrig,    evento_.calselftrig,    sizeof(calorimeter->calselftrig));              break;
97      memcpy(calorimeter->calIItrig,      evento_.calIItrig,      sizeof(calorimeter->calIItrig));              default: errmsg = "CALORIMETER ERRROR CODE UNIDENTIFIED";
98      memcpy(calorimeter->calstripshift,  evento_.calstripshift,  sizeof(calorimeter->calstripshift));          }
99      memcpy(calorimeter->calDSPtaberr,   evento_.calDSPtaberr,   sizeof(calorimeter->calDSPtaberr));          oss.str("");
100      memcpy(calorimeter->calevnum,       evento_.calevnum,       sizeof(calorimeter->calevnum));          oss << "Fortran77 function calunpack: " <<  errmsg;
101            logger->warn(oss.str().c_str());
102      cat <<  log4cpp::Priority::ERROR      }
103          <<  "Fortran77 function calunpack error code = " << ERROR      //
104          <<  "\n " << log4cpp::CategoryStream::ENDLINE;      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  }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.6.1

  ViewVC Help
Powered by ViewVC 1.1.23