/[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.2 by kusanagi, Thu Aug 19 15:24:58 2004 UTC revision 2.5 by kusanagi, Thu Dec 9 13:17:26 2004 UTC
# Line 1  Line 1 
1  /** @file  /** @file
2   * $Source: /home/cvsmanager/yoda/techmodel/physics/CalorimeterReader.cpp,v $   * $Source: /home/cvsmanager/yoda/techmodel/physics/CalorimeterReader.cpp,v $
3   * $Id: CalorimeterReader.cpp,v 1.1 2004/07/17 20:03:48 kusanagi Exp $   * $Id: CalorimeterReader.cpp,v 2.4 2004/12/03 22:08:12 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 stwerr;          int     stwerr[4];
21          int perror;          float   perror[4];
22          int dexy[2][22][96];          float   dexy[2][22][96];
23          int dexyc[2][22][96];          float   dexyc[2][22][96];
24          int base[2][22][96];          float   base[2][22][6];
25          int calselftrig[4][7];          float   calselftrig[4][7];
26          int calIItrig[4];          float   calIItrig[4];
27          int calstripshift[4];          float   calstriphit[4];
28          int calDSPtaberr[4];          float   calDSPtaberr[4];
29          int calevnum[4];          float   calevnum[4];
30      } evento_;      } evento_;
31    
32      void calunpack_(short[], long int*, int*);      void calunpack_(unsigned char[], long int*, int*);
33        //void calunpack_(char[], long int*, int*);
34      //Struct per il passaggio di dati da e verso la chiamata fortran      //Struct per il passaggio di dati da e verso la chiamata fortran
35  }  }
36    
37  using namespace pamela;  using namespace pamela;
38  using namespace pamela::calorimeter;  using namespace pamela::calorimeter;
39    
40  static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.techmodel.calorimeter.CalorimeterReader");    static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.calorimeter.CalorimeterReader"));
41    
42  /**  /**
43   * Constructor.       * Constructor.    
44   */   */
45  CalorimeterReader::CalorimeterReader(void):  CalorimeterReader::CalorimeterReader(void):
46    TechmodelAlgorithm(PacketType::Physics, "TechmodelCalorimeterReader") {    TechmodelAlgorithm(PacketType::Physics, "TechmodelCalorimeterReader") {
47    cat.debug("Constructor");    logger->debug(_T("Construnctor"));
48    calorimeter = new CalorimeterEvent();    calorimeter = new CalorimeterEvent();
49  }  }
50    
# Line 49  CalorimeterReader::CalorimeterReader(voi Line 53  CalorimeterReader::CalorimeterReader(voi
53   */   */
54  std::string CalorimeterReader::GetVersionInfo(void) const {  std::string CalorimeterReader::GetVersionInfo(void) const {
55    return    return
56      "$Header: /home/cvsmanager/yoda/techmodel/physics/CalorimeterReader.cpp,v 1.1 2004/07/17 20:03:48 kusanagi Exp $";      "$Header: /home/cvsmanager/yoda/techmodel/physics/CalorimeterReader.cpp,v 2.4 2004/12/03 22:08:12 kusanagi Exp $";
57  }  }
58    
59  /**  /**
# Line 57  std::string CalorimeterReader::GetVersio Line 61  std::string CalorimeterReader::GetVersio
61   * event reader routines for all packet types.   * event reader routines for all packet types.
62   */   */
63  void CalorimeterReader::Init(PamelaRun *run) {  void CalorimeterReader::Init(PamelaRun *run) {
64      logger->debug(_T("Initialize"));
65    SetInputStream(run);    SetInputStream(run);
66    run->WriteSubPacket(this, &calorimeter, calorimeter->Class());    run->WriteSubPacket(this, &calorimeter, calorimeter->Class());
67  }  }
# Line 72  void CalorimeterReader::RunEvent(int Eve Line 77  void CalorimeterReader::RunEvent(int Eve
77   * Unpack the Calorimeter data event from the physical packet.   * Unpack the Calorimeter data event from the physical packet.
78   */   */
79  void CalorimeterReader::RunEvent(int EventNumber, const char subData[], long int length) {  void CalorimeterReader::RunEvent(int EventNumber, const char subData[], long int length) {
80      char data[length];      std::stringstream oss;      
81        char *data = new char[length];
82      memcpy(data, subData, length);      memcpy(data, subData, length);
83      int  ERROR = 0;      int  ERROR = 0;
84            
85      unsigned short convdata[length];      /*unsigned short convdata[length];
86      for (int i = 0; i<length; i++){      for (int i = 0; i<length; i++){
87          convdata[i] = (unsigned short)((unsigned char)subData[i]&0xFF);          convdata[i] = (unsigned short)((unsigned char)subData[i]&0xFF);
     }  
           
     //Call to the routine that unpack calorimeter events  
     calunpack_((short*)convdata, &length, &ERROR);  
       
     /*switch (ERROR){  
         case:  
88      }*/      }*/
89                
90      calorimeter->IEV2   = evento_.IEV2;      //Call to the routine that unpack calorimeter events
91      calorimeter->stwerr = evento_.stwerr;      calunpack_((unsigned char*)data, &length, &ERROR);
92      calorimeter->perror = evento_.perror;      //calunpack_((char*)data, &length, &ERROR);
93    
94  //--------have to invert array because of FORTRAN <-> C different management of the indexes      if (ERROR != 0) {
95      int tempDexy[96][22][2];          char *errmsg;
96      int tempDexyc[96][22][2];          switch (ERROR){
97      int tempBase[96][22][2];              case 1: errmsg = "CALORIMETER NOT FOUND";
     int tempCalselftrig[7][4];  
     memcpy(tempDexy,           evento_.dexy,           sizeof(tempDexy));  
     memcpy(tempDexyc,          evento_.dexyc,          sizeof(tempDexyc));  
     memcpy(tempBase,           evento_.base,           sizeof(tempBase));  
     memcpy(tempCalselftrig,    evento_.calselftrig,    sizeof(tempCalselftrig));  
   
     for (int i = 0; i < 4; i++){  
         for (int j = 0; j < 7; j++){  
             calorimeter->calselftrig[i][j] = tempCalselftrig[j][i];  
98          }          }
99            oss.str("");
100            oss << "Fortran77 function calunpack: " <<  errmsg;
101            logger->warn(oss.str().c_str());
102      }      }
103        //  In case of "ERROR != 0" the calunpack will take care to set all
104      for (int i = 0; i < 2; i++){      //  parameters to zero
105          for (int j = 0; j < 22; j++){      //} else {
106              for (int z = 0; z < 96; z++){          calorimeter->IEV   = evento_.IEV;
107                  calorimeter->dexy[i][j][z] = tempDexy[z][j][i];          memcpy(calorimeter->stwerr, evento_.stwerr, sizeof(calorimeter->stwerr));
108                  calorimeter->dexyc[i][j][z] = tempDexyc[z][j][i];          memcpy(calorimeter->perror, evento_.perror, sizeof(calorimeter->perror));
109                  calorimeter->base[i][j][z] = tempBase[z][j][i];      //--------have to invert array because of FORTRAN <-> C different management of the indexes
110            float tempDexy[96][22][2];
111            float tempDexyc[96][22][2];
112            float tempBase[6][22][2];
113            float tempCalselftrig[7][4];
114            memcpy(tempDexy,           evento_.dexy,           sizeof(tempDexy));
115            memcpy(tempDexyc,          evento_.dexyc,          sizeof(tempDexyc));
116            memcpy(tempBase,           evento_.base,           sizeof(tempBase));
117            memcpy(tempCalselftrig,    evento_.calselftrig,    sizeof(tempCalselftrig));
118    
119            for (int i = 0; i < 4; i++){
120                for (int j = 0; j < 7; j++){
121                    calorimeter->calselftrig[i][j] = tempCalselftrig[j][i];
122              }              }
123          }          }
     }  
 //-----------------------------------------------------------------------------------------  
124    
125                for (int i = 0; i < 2; i++){
126      memcpy(calorimeter->calIItrig,      evento_.calIItrig,      sizeof(calorimeter->calIItrig));              for (int j = 0; j < 22; j++){
127      memcpy(calorimeter->calstripshift,  evento_.calstripshift,  sizeof(calorimeter->calstripshift));                  for (int z = 0; z < 96; z++){
128      memcpy(calorimeter->calDSPtaberr,   evento_.calDSPtaberr,   sizeof(calorimeter->calDSPtaberr));                      calorimeter->dexy[i][j][z] = tempDexy[z][j][i];
129      memcpy(calorimeter->calevnum,       evento_.calevnum,       sizeof(calorimeter->calevnum));                      calorimeter->dexyc[i][j][z] = tempDexyc[z][j][i];
130                    }
131      cat <<  log4cpp::Priority::ERROR                  for (int z = 0; z < 6; z++){
132          <<  "Fortran77 function calunpack error code = " << ERROR                      calorimeter->base[i][j][z] = tempBase[z][j][i];
133          <<  "\n " << log4cpp::CategoryStream::ENDLINE;                  }
134                }
135            }
136        //-----------------------------------------------------------------------------------------
137            memcpy(calorimeter->calIItrig,      evento_.calIItrig,      sizeof(calorimeter->calIItrig));
138            memcpy(calorimeter->calstriphit,    evento_.calstriphit,    sizeof(calorimeter->calstriphit));
139            memcpy(calorimeter->calDSPtaberr,   evento_.calDSPtaberr,   sizeof(calorimeter->calDSPtaberr));
140            memcpy(calorimeter->calevnum,       evento_.calevnum,       sizeof(calorimeter->calevnum));
141        //}
142        delete[] data;
143  }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.2.5

  ViewVC Help
Powered by ViewVC 1.1.23