00001 
00002 
00003 #include "parser/Centaure.hh"
00004 #include "parser/AcquisitionParser.hh"
00005 
00006 #include "event/Event.hh"
00007 
00008 #include "geometry/Detector.hh"
00009 #include "geometry/Chamber.hh"
00010 
00011 #include "tools/MicroException.hh"
00012 #include "tools/Toolbox.hh"
00013 #include "tools/SteerDesc.hh"
00014 #include "tools/Log.hh"
00015 
00016 #include <cstdio>
00017 #include <iostream>
00018 #include <iomanip>
00019 
00020 
00021 
00022 #define bigTolittle Toolbox::bigTolittle
00023 
00024 
00025 using namespace std;
00026 
00027 
00028 Centaure::Centaure(Run& aRun, FILE *aFile, ui32 lastEventId) : AcquisitionParser(aRun, aFile, lastEventId)
00029 {
00030   
00031     newConfig =true;
00032                 globalTriggerCounter = 1;
00033 }
00034 
00035 
00036 Centaure::~Centaure()
00037 {
00038   
00039 }
00040 
00041 int  Centaure::getNextEvent(Event& event)
00042 {
00043   if ( newConfig == true)
00044   {
00045       newConfig = false;
00046       return NEW_CONFIG;
00047   }
00048   Detector& aDet = run.getDetector();
00049 
00050 
00051 ui32 totalGassiplex96 = 0;
00052 
00053 
00054 totalGassiplex96 = aDet.getNumberOfGaziplex96();
00055 
00056 
00057 
00058 
00059 
00060 ui16 readValue = 0;          
00061 ui16 eventLength = 0;
00062 ui32 centaureEvtId =0;     
00063 ui64  value = 0;        
00064 
00065 ui64  timestamp = 0;        
00066 
00067 
00068 i32 eventId = 0;
00069 
00070 ui32 nbHiChannels[totalGassiplex96]; 
00071 i32 nEvents  = lastEventId ;    
00072 double GoodRate = 0.0;  
00073 ui32 checklength=0;        
00074 
00075 
00076 
00077   
00078 bool finish = false;
00079 
00080   checklength=0;
00081   
00082   fread(&readValue,sizeof(i16),1,inputFile);  
00083   centaureEvtId = bigTolittle(readValue);
00084   nEvents++;
00085   
00086   eventId = nEvents;
00087   
00088   fread(&readValue,sizeof(i16),1,inputFile);
00089   eventLength =  bigTolittle(readValue);
00090 
00091   if ( centaureEvtId == 0 && eventLength == 0 ) 
00092   {
00093     return LAST_FILE_EVENT;
00094   }
00095 
00096   else  
00097     {
00098         
00099         
00100         
00101         
00102         
00103 
00104 
00105 
00106     const ChamberMap_t &chambers = aDet.getChambers();
00107     for (ChamberMap_t::const_iterator iter=chambers.begin(); iter!=chambers.end(); iter++)
00108     {
00109          Chamber& chamber = *(*iter).second;
00110 
00111          
00112          for ( ui32 jj = 0; jj < chamber.getNumberOfGassiplexBoards(); jj++ )
00113             {
00114                 
00115                 fread(&readValue,sizeof(i16),1,inputFile);  
00116                 nbHiChannels[jj] = 1023 & bigTolittle(readValue); 
00117                 checklength += nbHiChannels[jj];
00118 
00119                  
00120 
00121 
00122                 
00123                 for ( ui32 j = 0 ; j < nbHiChannels[jj] ; j++  )
00124                 {
00125                   
00126                   
00127                   fread(&readValue,sizeof(i16),1,inputFile);
00128                   readValue = bigTolittle(readValue);
00129                   
00130                   value = ( readValue << 16)  ;
00131                   
00132                   fread(&readValue,sizeof(i16),1,inputFile);
00133                   readValue = bigTolittle(readValue);
00134 
00135                   
00136                   value = value + readValue;
00137 
00138                   ui16 channelData = value & Toolbox::MASK_CHANNEL_DATA;
00139                   ui16 channelNumber = ( ( value & Toolbox::MASK_CHANNEL_NUMBER) >> 12 ) & Toolbox::MASK_12BIT;
00140 
00141                 
00142                 if ( chamber.getType() == GASSIPLEXCHAMBER4 )
00143                 {
00144                   channelNumber = channelNumber + 96*jj ;
00145                 }
00146 
00147             i16 channelValue = channelData;  
00148               if (channelValue>2000)
00149                 {
00150                   channelValue=channelValue-4096;
00151                 }
00152               
00153               i16 channelNumber2 = channelNumber ;
00154 
00155   
00156 
00157                     try
00158                     {
00159                         const Channel&  channel = chamber.getChannelById(channelNumber);
00160  
00161   
00162    
00163 
00164                         i32 digitalValue = 0;
00165                                                                                                 ChannelHit *chHit =new ChannelHit(channel,digitalValue, channelValue) ;
00166                         event.insertHit(chamber,chHit);
00167                     }
00168                       catch ( MicroException &e)
00169                     {
00170                         FILE_LOG(logERROR) << "---------------" << "Chamber->id=["<< chamber.getId() << "], channelNuber[" << channelNumber << "]"  << e.getMessage() << endl;
00171                     }
00172 
00173                 }
00174             } 
00175     } 
00176 
00177 
00178     checklength=checklength*2+3+4+totalGassiplex96;
00179     FILE_LOG(logDEBUG) <<"  checklength: " << checklength<< endl;
00180     FILE_LOG(logDEBUG) <<"  eventLength: " << eventLength<< endl;
00181     FILE_LOG(logDEBUG) <<"  totalGassiplex96: " << totalGassiplex96<< endl;
00182     
00183     if (checklength != eventLength)
00184           {
00185             FILE_LOG(logERROR) << "CRAP EVENT checklength != eventLength: NOTHING CAN BE DONE!" << endl;
00186             FILE_LOG(logERROR) << "totalGassiplex96[" << totalGassiplex96 << "]" << endl;
00187           }
00188           else
00189           {
00190           
00191             fread(&readValue,sizeof(i16),1,inputFile);
00192             readValue = bigTolittle(readValue);
00193             timestamp = ((i64) readValue<<48);
00194             fread(&readValue,sizeof(i16),1,inputFile);
00195             readValue = bigTolittle(readValue);
00196             timestamp =timestamp+ ((i64) readValue<<32);
00197             fread(&readValue,sizeof(i16),1,inputFile);
00198             readValue = bigTolittle(readValue);
00199             timestamp =timestamp+ ((i64) readValue<<16);
00200             fread(&readValue,sizeof(i16),1,inputFile);
00201             readValue = bigTolittle(readValue);
00202             timestamp =timestamp+(i64) readValue;
00203             timestamp = timestamp - TIMEREF_OFFSET  ;  
00204 
00205           }
00206 
00207           
00208           fread(&readValue,sizeof(i16),1,inputFile);
00209           if ( readValue != 0xffff )
00210           {
00211               FILE_LOG(logDEBUG) << "ERROR last code event != 0xffff: "<< readValue << endl;
00212               return EVENT_ERROR;
00213           }
00214           else
00215           {
00216               FILE_LOG(logDEBUG) <<   "last code event == 0xffff -> reconstruction successfull"<< endl;
00217               
00218               event.setTimeStamp(timestamp);
00219               event.setId(eventId);
00220                                                         event.setGlobalTriggerCounter(globalTriggerCounter);
00221                                                         event.setDifTriggerCounter(globalTriggerCounter++);
00222 
00223 
00224           }
00225      } 
00226      lastEventId = eventId;
00227      return EVENT_CORRECT;
00228 }