Newer
Older
TB_Chris / TbUT / src / mamba / .svn / text-base / mamba_decoder.cpp.svn-base
  1. #pragma GCC diagnostic ignored "-Wvla"
  2. #pragma GCC diagnostic ignored "-Wparentheses"
  3.  
  4. #include <iostream>
  5. #include <fstream>
  6.  
  7. #include <assert.h>
  8. #include <stdint.h>
  9. #include <cmath>
  10. #include <vector>
  11.  
  12. #include "mamba_decoder.h"
  13.  
  14. using namespace std;
  15.  
  16.  
  17. mamba_decoder::mamba_decoder( bool& isAType):
  18. m_isAType(isAType)
  19. {
  20. nBeetles=4; //Don't change
  21. nSubsets=4; //Don't change
  22. nCH=32; //Don't change
  23. startADC = 6; //This value must be changed according to the settings of the MAMBA GUI -> startADC <=8 in order not to cut the beetle header
  24.  
  25. stopADC = 30; //This value must be changed according to the settings of the MAMBA GUI -> minium value for stopADC is defined according to the definition of nADCs (below)
  26. nADCs = (stopADC-startADC - 1 )*2;
  27. assert( nADCs >= nCH + 6 );
  28. }
  29.  
  30. mamba_decoder::~mamba_decoder(){
  31.  
  32. if(ifile)
  33. ifile->close();
  34. }
  35.  
  36. bool mamba_decoder::open( const char* filename ){
  37. cout<<"new decoder"<<endl;
  38. cout<<"with A and D sensor"<<endl;
  39.  
  40. ifile = new std::ifstream( filename, std::ios::in | std::ios::binary );
  41. if (!(*ifile))
  42. {
  43. std::cout<<"Can not open data file:\t" << filename << std::endl;
  44. delete ifile;
  45. ifile = 0;
  46. return false;
  47. }
  48. return true;
  49. }
  50.  
  51.  
  52. void mamba_decoder::close()
  53. {
  54. if (ifile)
  55. {
  56. ifile->close();
  57. delete ifile;
  58. ifile = 0;
  59. }
  60. }
  61.  
  62. bool mamba_decoder::find_mamba_header(){
  63. bool found = 0;
  64. uint32_t temp_header[4];
  65. while(!found){
  66. ifile->read((char*)temp_header, 4*sizeof(uint32_t));
  67. if(ifile->eof()) return 0;
  68. if( temp_header[0] == 0xF1CA600D && temp_header[1] == 0x00000000 && temp_header[2] == 0xFFFFFFFF && temp_header[3] == 0xABBAFFFF ){
  69. found = 1 ;
  70. }
  71. else{
  72. ifile->seekg(-( 4 * sizeof(uint32_t) ) + 1, std::ios::cur); //torno indietro e avanzo di un byte
  73. }
  74. }
  75. return found;
  76. }
  77.  
  78. bool mamba_decoder::check_mamba_footer(){
  79. bool checked = 0;
  80. uint32_t temp_footer[4];
  81.  
  82. ifile->seekg( (12 + nBeetles*nSubsets*nADCs/2) * sizeof(uint32_t) , std::ios::cur ); //skip the coincidence,pack_id, trig_id ...infos and ADC values
  83. ifile->read( (char*)temp_footer, 4 * sizeof(uint32_t) );
  84. if(ifile->eof()) return 0;
  85. ifile->seekg( - (12 + (nBeetles*nSubsets*nADCs)/2 + 4) * sizeof(uint32_t) , std::ios::cur);
  86.  
  87. if( temp_footer[0] == 0xFFFFFFFF && temp_footer[1] == 0xFFFFFFFF && temp_footer[2] == 0xFFFFFFFF && temp_footer[3] == 0xFFFFFFFF){
  88. checked = 1;
  89. }
  90.  
  91. return checked;
  92. }
  93.  
  94. int mamba_decoder::find_beetle_header( int * subsADCs, int thr ){
  95.  
  96. int pos=-1;
  97. for( int iADC = 0; iADC < nADCs-4 ; iADC++ ){
  98. if(
  99. abs(subsADCs[iADC+1]-subsADCs[0]) > thr &&
  100. abs(subsADCs[iADC+2]-subsADCs[0]) > thr &&
  101. abs(subsADCs[iADC+3]-subsADCs[0]) > thr &&
  102. abs(subsADCs[iADC+4]-subsADCs[0]) > thr ){
  103. pos = iADC+1; //returns the position of the last baseline ADC;
  104. break;
  105. }
  106. }
  107. return pos;
  108. }
  109.  
  110. bool mamba_decoder::read_event(){
  111.  
  112. if(! find_mamba_header() ) return 0; //eof()
  113. if(! check_mamba_footer() ) return 0;
  114. uint64_t temp1, temp2;
  115.  
  116. ifile->read((char*) &temp1 , sizeof(uint32_t));
  117. ifile->read((char*) &temp2 , sizeof(uint32_t));
  118. _pack_id = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32);
  119.  
  120. ifile->read((char*) &temp1 , sizeof(uint32_t));
  121. ifile->read((char*) &temp2 , sizeof(uint32_t));
  122. _trig_id = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32);
  123.  
  124. ifile->read((char*) &temp1 , sizeof(uint32_t));
  125. ifile->read((char*) &temp2 , sizeof(uint32_t));
  126. _timestamp = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32);
  127.  
  128. ifile->read((char*) &temp1 , sizeof(uint32_t));
  129. ifile->read((char*) &temp2 , sizeof(uint32_t));
  130. _ts_timestamp = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32);
  131. ifile->read((char*) &temp1 , sizeof(uint32_t));
  132. ifile->read((char*) &temp2 , sizeof(uint32_t));
  133. _coincidence_id = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32);
  134. ifile->read((char*) &temp1 , sizeof(uint32_t));
  135. ifile->read((char*) &temp2 , sizeof(uint32_t));
  136. _padding = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32);
  137. const int nChannels=nBeetles*nSubsets*nADCs;
  138. uint16_t temp_adc[nChannels];
  139. ifile->read((char*) temp_adc, sizeof(uint16_t)* nBeetles*nSubsets*nADCs );
  140.  
  141. int temp_adc2[nBeetles][nSubsets][nADCs];
  142. _ADC.clear();
  143. _bHeader0.clear();
  144. _bHeader1.clear();
  145. _bHeader2.clear();
  146. _bHeader3.clear();
  147. _bHeader3P1.clear();
  148. _bHeader3P2.clear();
  149.  
  150.  
  151. for(int iBeetle = 0; iBeetle < nBeetles; iBeetle++){
  152. for(int iSubset = 0; iSubset < nSubsets; iSubset++){
  153. int tempsubset = (iSubset/2)*2 + ((iSubset%2)+1)%2 ;
  154. for (int iADC=0; iADC < nADCs; iADC++){ // "A only" mode
  155. temp_adc2[iBeetle][iSubset][iADC] = ( ( (temp_adc[iADC*nBeetles*nSubsets+nSubsets*iBeetle+tempsubset] ) & 0xFFFF )-2048 ) ;
  156. }
  157. if(m_isAType && (iBeetle==0 || iBeetle==2) ){
  158. _bHeader0.push_back(0);
  159. _bHeader1.push_back(0);
  160. _bHeader2.push_back(0);
  161. _bHeader3.push_back(0);
  162. _bHeader3P1.push_back(0);
  163. _bHeader3P2.push_back(0);
  164. for(int iADC=0; iADC<nCH; iADC++){
  165. _ADC.push_back( 0 );
  166. }
  167. }
  168. else {
  169. int thr = 100;
  170. int pos_beetle_header = find_beetle_header( temp_adc2[iBeetle][iSubset], thr );
  171. //cout<<pos_beetle_header<<endl;
  172. //if( pos_beetle_header == -1 || pos_beetle_header >= (nADCs - nCH) ) return 0; //can't find the header in the expected place
  173. _baseline = 0;
  174. for( int iADC=0; iADC < pos_beetle_header; iADC++){
  175. _baseline += temp_adc2[iBeetle][iSubset][iADC];
  176. }
  177. _baseline = _baseline/pos_beetle_header;
  178. for(int iCH = pos_beetle_header+4 ; iCH < nCH + pos_beetle_header+4 ; iCH++ ){
  179. _ADC.push_back( temp_adc2[iBeetle][iSubset][iCH] );
  180. //if(iCH==31) cout << "channel: " << iCH << ", ADC: " << temp_adc2[iBeetle][iSubset][iCH] << endl;
  181. //if(iCH==pos_beetle_header+10) cout << "beetle: " << iBeetle << ", subset: " << iSubset << ", channel: " << iCH << ", ADC: " << temp_adc2[iBeetle][iSubset][iCH] << endl;
  182. }
  183. _bHeader0.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header] );
  184. _bHeader1.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+1] );
  185. _bHeader2.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+2] );
  186. _bHeader3.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+3] );
  187. _bHeader3P1.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+4] );
  188. _bHeader3P2.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+5] );
  189. //cout << "beetle: "<< iBeetle<<", subset: " <<iSubset<<"beetlepos: "<<pos_beetle_header+3<<", ADC: " << temp_adc2[iBeetle][iSubset][pos_beetle_header+3] << endl;
  190. }
  191. }
  192. }
  193. //cout << endl;
  194. /*_ADC.clear();
  195. for(int iBeetle = 0; iBeetle < nBeetles; iBeetle++){
  196. for(int iSubset = 0; iSubset < nSubsets; iSubset++){
  197. for(int iADC = 0 ; iADC < nADCs ; iADC++ ){
  198. _ADC.push_back( temp_adc2[iBeetle][iSubset][iADC] );
  199. }
  200. }
  201. }*/
  202.  
  203. uint32_t temp_footer[4];
  204. ifile->read((char*) temp_footer, sizeof(uint32_t)* 4 );
  205. uint32_t temp_TDC[4];
  206. ifile->read((char*) temp_TDC, sizeof(uint32_t)* 4 );
  207. _TDC = ( ((temp_TDC[3]) & 0xFF) - (temp_TDC[3]>>8) & 0xFF ) % 0xFF;
  208. if(ifile->eof()){
  209. return 0;
  210. }
  211. return 1;
  212. }