#pragma GCC diagnostic ignored "-Wvla" #pragma GCC diagnostic ignored "-Wparentheses" #include <iostream> #include <fstream> #include <assert.h> #include <stdint.h> #include <cmath> #include <vector> #include "mamba_decoder.h" using namespace std; mamba_decoder::mamba_decoder( bool& isAType): m_isAType(isAType) { nBeetles=4; //Don't change nSubsets=4; //Don't change nCH=32; //Don't change 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 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) nADCs = (stopADC-startADC - 1 )*2; assert( nADCs >= nCH + 6 ); } mamba_decoder::~mamba_decoder(){ if(ifile) ifile->close(); } bool mamba_decoder::open( const char* filename ){ cout<<"new decoder"<<endl; cout<<"with A and D sensor"<<endl; ifile = new std::ifstream( filename, std::ios::in | std::ios::binary ); if (!(*ifile)) { std::cout<<"Can not open data file:\t" << filename << std::endl; delete ifile; ifile = 0; return false; } return true; } void mamba_decoder::close() { if (ifile) { ifile->close(); delete ifile; ifile = 0; } } bool mamba_decoder::find_mamba_header(){ bool found = 0; uint32_t temp_header[4]; while(!found){ ifile->read((char*)temp_header, 4*sizeof(uint32_t)); if(ifile->eof()) return 0; if( temp_header[0] == 0xF1CA600D && temp_header[1] == 0x00000000 && temp_header[2] == 0xFFFFFFFF && temp_header[3] == 0xABBAFFFF ){ found = 1 ; } else{ ifile->seekg(-( 4 * sizeof(uint32_t) ) + 1, std::ios::cur); //torno indietro e avanzo di un byte } } return found; } bool mamba_decoder::check_mamba_footer(){ bool checked = 0; uint32_t temp_footer[4]; ifile->seekg( (12 + nBeetles*nSubsets*nADCs/2) * sizeof(uint32_t) , std::ios::cur ); //skip the coincidence,pack_id, trig_id ...infos and ADC values ifile->read( (char*)temp_footer, 4 * sizeof(uint32_t) ); if(ifile->eof()) return 0; ifile->seekg( - (12 + (nBeetles*nSubsets*nADCs)/2 + 4) * sizeof(uint32_t) , std::ios::cur); if( temp_footer[0] == 0xFFFFFFFF && temp_footer[1] == 0xFFFFFFFF && temp_footer[2] == 0xFFFFFFFF && temp_footer[3] == 0xFFFFFFFF){ checked = 1; } return checked; } int mamba_decoder::find_beetle_header( int * subsADCs, int thr ){ int pos=-1; for( int iADC = 0; iADC < nADCs-4 ; iADC++ ){ if( abs(subsADCs[iADC+1]-subsADCs[0]) > thr && abs(subsADCs[iADC+2]-subsADCs[0]) > thr && abs(subsADCs[iADC+3]-subsADCs[0]) > thr && abs(subsADCs[iADC+4]-subsADCs[0]) > thr ){ pos = iADC+1; //returns the position of the last baseline ADC; break; } } return pos; } bool mamba_decoder::read_event(){ if(! find_mamba_header() ) return 0; //eof() if(! check_mamba_footer() ) return 0; uint64_t temp1, temp2; ifile->read((char*) &temp1 , sizeof(uint32_t)); ifile->read((char*) &temp2 , sizeof(uint32_t)); _pack_id = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32); ifile->read((char*) &temp1 , sizeof(uint32_t)); ifile->read((char*) &temp2 , sizeof(uint32_t)); _trig_id = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32); ifile->read((char*) &temp1 , sizeof(uint32_t)); ifile->read((char*) &temp2 , sizeof(uint32_t)); _timestamp = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32); ifile->read((char*) &temp1 , sizeof(uint32_t)); ifile->read((char*) &temp2 , sizeof(uint32_t)); _ts_timestamp = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32); ifile->read((char*) &temp1 , sizeof(uint32_t)); ifile->read((char*) &temp2 , sizeof(uint32_t)); _coincidence_id = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32); ifile->read((char*) &temp1 , sizeof(uint32_t)); ifile->read((char*) &temp2 , sizeof(uint32_t)); _padding = (temp2 & 0xFFFFFFFF) + ((temp1 & 0xFFFFFFFF) << 32); const int nChannels=nBeetles*nSubsets*nADCs; uint16_t temp_adc[nChannels]; ifile->read((char*) temp_adc, sizeof(uint16_t)* nBeetles*nSubsets*nADCs ); int temp_adc2[nBeetles][nSubsets][nADCs]; _ADC.clear(); _bHeader0.clear(); _bHeader1.clear(); _bHeader2.clear(); _bHeader3.clear(); _bHeader3P1.clear(); _bHeader3P2.clear(); for(int iBeetle = 0; iBeetle < nBeetles; iBeetle++){ for(int iSubset = 0; iSubset < nSubsets; iSubset++){ int tempsubset = (iSubset/2)*2 + ((iSubset%2)+1)%2 ; for (int iADC=0; iADC < nADCs; iADC++){ // "A only" mode temp_adc2[iBeetle][iSubset][iADC] = ( ( (temp_adc[iADC*nBeetles*nSubsets+nSubsets*iBeetle+tempsubset] ) & 0xFFFF )-2048 ) ; } if(m_isAType && (iBeetle==0 || iBeetle==2) ){ _bHeader0.push_back(0); _bHeader1.push_back(0); _bHeader2.push_back(0); _bHeader3.push_back(0); _bHeader3P1.push_back(0); _bHeader3P2.push_back(0); for(int iADC=0; iADC<nCH; iADC++){ _ADC.push_back( 0 ); } } else { int thr = 100; int pos_beetle_header = find_beetle_header( temp_adc2[iBeetle][iSubset], thr ); //cout<<pos_beetle_header<<endl; //if( pos_beetle_header == -1 || pos_beetle_header >= (nADCs - nCH) ) return 0; //can't find the header in the expected place _baseline = 0; for( int iADC=0; iADC < pos_beetle_header; iADC++){ _baseline += temp_adc2[iBeetle][iSubset][iADC]; } _baseline = _baseline/pos_beetle_header; for(int iCH = pos_beetle_header+4 ; iCH < nCH + pos_beetle_header+4 ; iCH++ ){ _ADC.push_back( temp_adc2[iBeetle][iSubset][iCH] ); //if(iCH==31) cout << "channel: " << iCH << ", ADC: " << temp_adc2[iBeetle][iSubset][iCH] << endl; //if(iCH==pos_beetle_header+10) cout << "beetle: " << iBeetle << ", subset: " << iSubset << ", channel: " << iCH << ", ADC: " << temp_adc2[iBeetle][iSubset][iCH] << endl; } _bHeader0.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header] ); _bHeader1.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+1] ); _bHeader2.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+2] ); _bHeader3.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+3] ); _bHeader3P1.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+4] ); _bHeader3P2.push_back( temp_adc2[iBeetle][iSubset][pos_beetle_header+5] ); //cout << "beetle: "<< iBeetle<<", subset: " <<iSubset<<"beetlepos: "<<pos_beetle_header+3<<", ADC: " << temp_adc2[iBeetle][iSubset][pos_beetle_header+3] << endl; } } } //cout << endl; /*_ADC.clear(); for(int iBeetle = 0; iBeetle < nBeetles; iBeetle++){ for(int iSubset = 0; iSubset < nSubsets; iSubset++){ for(int iADC = 0 ; iADC < nADCs ; iADC++ ){ _ADC.push_back( temp_adc2[iBeetle][iSubset][iADC] ); } } }*/ uint32_t temp_footer[4]; ifile->read((char*) temp_footer, sizeof(uint32_t)* 4 ); uint32_t temp_TDC[4]; ifile->read((char*) temp_TDC, sizeof(uint32_t)* 4 ); _TDC = ( ((temp_TDC[3]) & 0xFF) - (temp_TDC[3]>>8) & 0xFF ) % 0xFF; if(ifile->eof()){ return 0; } return 1; }