| 1 | 
 /** @file | 
 /** @file | 
| 2 | 
  * $Source: /home/cvsmanager/yoda/techmodel/CalibTrk1Reader.cpp,v $ | 
  * $Source: /home/cvsmanager/yoda/techmodel/CalibTrk1Reader.cpp,v $ | 
| 3 | 
  * $Id: CalibTrk1Reader.cpp,v 1.5 2004/08/24 16:01:57 kusanagi Exp $ | 
  * $Id: CalibTrk1Reader.cpp,v 4.2 2005/03/16 22:49:51 kusanagi Exp $ | 
| 4 | 
  * $Author: kusanagi $ | 
  * $Author: kusanagi $ | 
| 5 | 
  *  | 
  *  | 
| 6 | 
  * Implementation of the LogReader class. | 
  * Implementation of the LogReader class. | 
| 34 | 
       int   nbad_l2[6]; | 
       int   nbad_l2[6]; | 
| 35 | 
       int   nbad_l3[6]; | 
       int   nbad_l3[6]; | 
| 36 | 
       int   cal_flag[6]; | 
       int   cal_flag[6]; | 
| 37 | 
       int   DSPped_par[6][3072]; | 
       float DSPped_par[6][3072]; | 
| 38 | 
       float DSPsig_par[6][3072]; | 
       float DSPsig_par[6][3072]; | 
| 39 | 
       float DSPbad_par[6][3072]; | 
       int   DSPbad_par[6][3072]; | 
| 40 | 
     } trkcalib_; | 
     } trkcalib_; | 
 | 
  | 
  | 
| 41 | 
 #include <dirent.h> | 
 #include <dirent.h> | 
| 42 | 
 } | 
 } | 
| 43 | 
  | 
  | 
| 67 | 
  */ | 
  */ | 
| 68 | 
 std::string CalibTrk1Reader::GetVersionInfo(void) const { | 
 std::string CalibTrk1Reader::GetVersionInfo(void) const { | 
| 69 | 
   return  | 
   return  | 
| 70 | 
     "$Header: /home/cvsmanager/yoda/techmodel/CalibTrk1Reader.cpp,v 1.5 2004/08/24 16:01:57 kusanagi Exp $\n"; | 
     "$Header: /home/cvsmanager/yoda/techmodel/CalibTrk1Reader.cpp,v 4.2 2005/03/16 22:49:51 kusanagi Exp $\n"; | 
| 71 | 
 } | 
 } | 
| 72 | 
  | 
  | 
| 73 | 
 /** | 
 /** | 
| 84 | 
  * Unpack the CalibTrk event from an input file. | 
  * Unpack the CalibTrk event from an input file. | 
| 85 | 
  */ | 
  */ | 
| 86 | 
 //void CalibTrkReader::RunEvent(int EventNumber, long int length, char *subData) { | 
 //void CalibTrkReader::RunEvent(int EventNumber, long int length, char *subData) { | 
| 87 | 
 void CalibTrk1Reader::RunEvent(int EventNumber, long int length) { | 
 void CalibTrk1Reader::RunEvent(int EventNumber, long int dataLength) throw (Exception){ | 
| 88 | 
     std::stringstream oss;     | 
     std::stringstream oss;     | 
| 89 | 
     char     *subData; | 
     char     subData[dataLength]; | 
| 90 | 
     char      eventCRC[2]; | 
     int       ERROR; | 
 | 
     UINT16    subCRC;      //CRC of the data | 
  | 
 | 
     UINT16    readCRC;     //CRC read from the end of the subpacket | 
  | 
 | 
     long int  dataLength; | 
  | 
 | 
   | 
  | 
 | 
     //the 2 bytes subtracted belong to the final event CRC bytes | 
  | 
 | 
     dataLength = length - (long int)2; | 
  | 
 | 
  | 
  | 
 | 
     subData = new char[dataLength]; | 
  | 
| 91 | 
     InputFile->read(subData, sizeof(unsigned char)*dataLength); | 
     InputFile->read(subData, sizeof(unsigned char)*dataLength); | 
| 92 | 
     subCRC = CM_Compute_CRC16(0, (BYTE*)subData, dataLength); | 
    | 
| 93 | 
  | 
     //Scrivo un file temporaneo per passarlo alla routine | 
| 94 | 
  | 
     //Speriamo di cambiare la routine per passargli un buffer..... | 
| 95 | 
  | 
     oss.str(""); | 
| 96 | 
  | 
     oss << getenv("YODA_DATA") << "/" << time(NULL) << "trc1.dat"; | 
| 97 | 
  | 
     FILE *pfile; | 
| 98 | 
  | 
     pfile = fopen(oss.str().c_str(), "wb"); | 
| 99 | 
  | 
     fwrite(subData, 1, dataLength, pfile); | 
| 100 | 
  | 
     fclose(pfile); | 
| 101 | 
  | 
  | 
| 102 | 
  | 
     //Call to the FORTRAN routin that unpack tracker events | 
| 103 | 
  | 
     trkcalibpkt_(&ERROR, (char*)oss.str().c_str()); | 
| 104 | 
  | 
  | 
| 105 | 
  | 
     calibTrk1->unpackError = ERROR; | 
| 106 | 
  | 
     remove(oss.str().c_str()); | 
| 107 | 
  | 
     if (ERROR != 0) { | 
| 108 | 
  | 
         oss.str(""); | 
| 109 | 
  | 
         oss <<  "Fortran77 function trkcalibpkt error code = " << ERROR; | 
| 110 | 
  | 
         logger->warn(oss.str().c_str()); | 
| 111 | 
  | 
     } | 
| 112 | 
  | 
  | 
| 113 | 
     //took the final CRC to compare it with the previous calculated CRC of the data | 
     remove((char*)oss.str().c_str()); | 
 | 
     InputFile->read(eventCRC, sizeof(eventCRC)); | 
  | 
 | 
     readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF); | 
  | 
 | 
      | 
  | 
 | 
     if (subCRC == readCRC){ | 
  | 
 | 
         int       ERROR; | 
  | 
 | 
         //Scrivo un file temporaneo per passarlo alla routine | 
  | 
 | 
         //Speriamo di cambiare la routine per passargli un buffer..... | 
  | 
 | 
         DIR *dirp; | 
  | 
 | 
         std::string pathDir((char*)getenv("YODA_DATA")); | 
  | 
 | 
         pathDir = pathDir + "/todatemp.dat";; | 
  | 
 | 
         FILE *pfile; | 
  | 
 | 
         pfile = fopen((char*)pathDir.c_str(), "wb"); | 
  | 
 | 
         fwrite(subData, 1, dataLength, pfile); | 
  | 
 | 
         fclose(pfile); | 
  | 
 | 
  | 
  | 
 | 
         //Call to the FORTRAN routin that unpack tracker events | 
  | 
 | 
         trkcalibpkt_(&ERROR, (char*)pathDir.c_str()); | 
  | 
 | 
      | 
  | 
 | 
         remove((char*)pathDir.c_str()); | 
  | 
 | 
      | 
  | 
 | 
         //Store the unpacked data | 
  | 
 | 
         memcpy(calibTrk1->DAQmode,     trkcalib_.DAQmode,     sizeof(calibTrk1->DAQmode)); | 
  | 
 | 
         memcpy(calibTrk1->DSPnumber,   trkcalib_.DSPnumber,   sizeof(calibTrk1->DSPnumber)); | 
  | 
 | 
         memcpy(calibTrk1->calibnumber, trkcalib_.calibnumber, sizeof(calibTrk1->calibnumber)); | 
  | 
 | 
         memcpy(calibTrk1->DSPnumber, trkcalib_.ncalib_event,  sizeof(calibTrk1->ncalib_event)); | 
  | 
 | 
         memcpy(calibTrk1->ped_l1,    trkcalib_.ped_l1,     sizeof(calibTrk1->ped_l1)); | 
  | 
 | 
         memcpy(calibTrk1->ped_l2,    trkcalib_.ped_l2,     sizeof(calibTrk1->ped_l2)); | 
  | 
 | 
         memcpy(calibTrk1->ped_l3,    trkcalib_.ped_l3,     sizeof(calibTrk1->ped_l3)); | 
  | 
 | 
         memcpy(calibTrk1->sig_l1,    trkcalib_.sig_l1,     sizeof(calibTrk1->sig_l1)); | 
  | 
 | 
         memcpy(calibTrk1->sig_l2,    trkcalib_.sig_l2,     sizeof(calibTrk1->sig_l2)); | 
  | 
 | 
         memcpy(calibTrk1->sig_l3,    trkcalib_.sig_l3,     sizeof(calibTrk1->sig_l3)); | 
  | 
 | 
         memcpy(calibTrk1->nbad_l1,   trkcalib_.nbad_l1,    sizeof(calibTrk1->nbad_l1)); | 
  | 
 | 
         memcpy(calibTrk1->nbad_l2,   trkcalib_.nbad_l2,    sizeof(calibTrk1->nbad_l2)); | 
  | 
 | 
         memcpy(calibTrk1->nbad_l3,   trkcalib_.nbad_l3,    sizeof(calibTrk1->nbad_l3)); | 
  | 
 | 
         memcpy(calibTrk1->cal_flag,  trkcalib_.cal_flag,   sizeof(calibTrk1->cal_flag));       | 
  | 
| 114 | 
  | 
  | 
| 115 | 
  | 
     //Store the unpacked data | 
| 116 | 
  | 
     memcpy(calibTrk1->DAQmode,      trkcalib_.DAQmode,      sizeof(calibTrk1->DAQmode)); | 
| 117 | 
  | 
     memcpy(calibTrk1->DSPnumber,    trkcalib_.DSPnumber,    sizeof(calibTrk1->DSPnumber)); | 
| 118 | 
  | 
     memcpy(calibTrk1->calibnumber,  trkcalib_.calibnumber,  sizeof(calibTrk1->calibnumber)); | 
| 119 | 
  | 
     memcpy(calibTrk1->DSPnumber,    trkcalib_.ncalib_event, sizeof(calibTrk1->ncalib_event)); | 
| 120 | 
  | 
     memcpy(calibTrk1->ped_l1,       trkcalib_.ped_l1,       sizeof(calibTrk1->ped_l1)); | 
| 121 | 
  | 
     memcpy(calibTrk1->ped_l2,       trkcalib_.ped_l2,       sizeof(calibTrk1->ped_l2)); | 
| 122 | 
  | 
     memcpy(calibTrk1->ped_l3,       trkcalib_.ped_l3,       sizeof(calibTrk1->ped_l3)); | 
| 123 | 
  | 
     memcpy(calibTrk1->sig_l1,       trkcalib_.sig_l1,       sizeof(calibTrk1->sig_l1)); | 
| 124 | 
  | 
     memcpy(calibTrk1->sig_l2,       trkcalib_.sig_l2,       sizeof(calibTrk1->sig_l2)); | 
| 125 | 
  | 
     memcpy(calibTrk1->sig_l3,       trkcalib_.sig_l3,       sizeof(calibTrk1->sig_l3)); | 
| 126 | 
  | 
     memcpy(calibTrk1->nbad_l1,      trkcalib_.nbad_l1,      sizeof(calibTrk1->nbad_l1)); | 
| 127 | 
  | 
     memcpy(calibTrk1->nbad_l2,      trkcalib_.nbad_l2,      sizeof(calibTrk1->nbad_l2)); | 
| 128 | 
  | 
     memcpy(calibTrk1->nbad_l3,      trkcalib_.nbad_l3,      sizeof(calibTrk1->nbad_l3)); | 
| 129 | 
  | 
     memcpy(calibTrk1->cal_flag,     trkcalib_.cal_flag,     sizeof(calibTrk1->cal_flag));       | 
| 130 | 
  | 
 //        memcpy(calibTrk1->DSPbad_par,   trkcalib_.DSPbad_par,   sizeof(calibTrk1->DSPbad_par));       | 
| 131 | 
  | 
 //        memcpy(calibTrk1->DSPped_par,   trkcalib_.DSPped_par,   sizeof(calibTrk1->DSPped_par));       | 
| 132 | 
  | 
 //        memcpy(calibTrk1->DSPsig_par,   trkcalib_.DSPsig_par,   sizeof(calibTrk1->DSPsig_par));       | 
| 133 | 
 //--------have to invert array because of FORTRAN <-> C different management of the indexes | 
 //--------have to invert array because of FORTRAN <-> C different management of the indexes | 
| 134 | 
         int tempBad_par[3072][6]; | 
     int     tempBad_par[3072][6]; | 
| 135 | 
         int tempPed_par[3072][6]; | 
     float   tempPed_par[3072][6]; | 
| 136 | 
         int tempSig_par[3072][6]; | 
     float   tempSig_par[3072][6]; | 
| 137 | 
         memcpy(calibTrk1->DSPbad_par,trkcalib_.DSPbad_par, sizeof(calibTrk1->DSPbad_par));       | 
     memcpy(tempBad_par,trkcalib_.DSPbad_par, sizeof(tempBad_par));       | 
| 138 | 
         memcpy(calibTrk1->DSPped_par,trkcalib_.DSPped_par, sizeof(calibTrk1->DSPped_par));       | 
     memcpy(tempPed_par,trkcalib_.DSPped_par, sizeof(tempPed_par));       | 
| 139 | 
         memcpy(calibTrk1->DSPsig_par,trkcalib_.DSPsig_par, sizeof(calibTrk1->DSPsig_par));       | 
     memcpy(tempSig_par,trkcalib_.DSPsig_par, sizeof(tempSig_par));       | 
| 140 | 
  | 
  | 
| 141 | 
         for (int i = 0; i < 6; i++){ | 
     for (int i = 0; i < 6; i++){ | 
| 142 | 
             for (int j = 0; j < 3072; j++){ | 
         for (int j = 0; j < 3072; j++){ | 
| 143 | 
                 calibTrk1->DSPbad_par[i][j] = tempBad_par[j][i]; | 
             calibTrk1->DSPbad_par[i][j] = tempBad_par[j][i]; | 
| 144 | 
                 calibTrk1->DSPped_par[i][j] = tempPed_par[j][i]; | 
             calibTrk1->DSPped_par[i][j] = tempPed_par[j][i]; | 
| 145 | 
                 calibTrk1->DSPsig_par[i][j] = tempSig_par[j][i]; | 
             calibTrk1->DSPsig_par[i][j] = tempSig_par[j][i]; | 
 | 
             } | 
  | 
| 146 | 
         } | 
         } | 
 | 
 //----------------------------------------------------------------------------------------- | 
  | 
 | 
         oss.flush(); | 
  | 
 | 
         oss <<  "Fortran77 function trkcalibpkt error code = " << ERROR; | 
  | 
 | 
         logger->warn(oss.str().c_str()); | 
  | 
 | 
     } else { | 
  | 
 | 
         logger->debug(_T("Wrong CRC for CalibTrk1 Packet ")); | 
  | 
| 147 | 
     } | 
     } | 
| 148 | 
     delete [] subData; | 
 //----------------------------------------------------------------------------------------- | 
| 149 | 
  | 
  | 
| 150 | 
 } | 
 } | 
| 151 | 
  | 
  | 
| 152 | 
  | 
  |