/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #include "MDfragmentDBB.h" using namespace std; void MDfragmentDBB::SetDataPtr( void *d, uint32_t aSize=0 ) { MDfragment::SetDataPtr(d, aSize); } void MDfragmentDBB::Init() { UnValidate(); if (this->GetSize() == 0) return; uint32_t* ptr = Get32bWordPtr(0); MDdataWordDBB dw(ptr); // cout << " Calling MDfragmentDBB::Init() " << endl; for (int ich=0 ; ich < DBB_NCHANNELS ; ich++) { _nLeadingEdgeHits[ich]=0; _nTrailingEdgeHits[ich]=0; _leadingEdgeHit[ich].clear(); _trailingEdgeHit[ich].clear(); } _madeOfParticles = false; if ( dw.IsValid() ) { // this->dumpEventVRB(Get32bWordPtr(0), GetSize()); // Check the reliability of the header and decode the header information. if (dw.GetDataType() != MDdataWordDBB::Header ){ // The data doesn't start with a header throw MDexception("ERROR in MDframentDBB::Init() : 1st word is not a header") ; } else { _headerSize = DBB_HEADER_WORDS*WORD_SIZE; _trailerSize = DBB_TRAILER_WORDS*WORD_SIZE; _payLoadSize = GetSize() - _headerSize - _trailerSize; _header = ptr; _boardID = dw.GetGeo(); _spillNum = dw.GetSpillNumber(); dw.SetDataPtr( ++ptr ); _triggerCount = dw.GetTriggerCount(); _hitCount = dw.GetHitCount() ; /* if ( (_hitCount*WORD_SIZE*2 - _payLoadSize) > 1 ) { // May not be always false, we can miss some trailing ege hits... cout << "ERROR in MDfragmentDBB()::Init(): Number of words : "; cout << _payLoadSize/WORD_SIZE << " expected : " << _hitCount*2 << endl; } */ _payLoad = _header + _headerSize/WORD_SIZE; _trailer = _payLoad + _payLoadSize/WORD_SIZE; } // Check the reliability of the trailer and decode the trailer information. ptr = _trailer; dw.SetDataPtr( ptr ); if ( dw.IsValid() ) { if (dw.GetDataType() != MDdataWordDBB::Trailer || dw.GetGeo() != _boardID || //temporary disable this for debugging dw.GetSpillNumber() != _spillNum || dw.GetStatus() ) {// The data doesn't end with a proper trailer // this->dumpEventVRB(Get32bWordPtr(0), GetSize()); throw MDexception("ERROR in MDframentDBB::Init() : DBB trailer is not consistent") ; } else { dw.SetDataPtr( ++ptr ); _spillWidth = dw.GetSpillWidth(); } } else { throw MDexception("ERROR in MDframentDBB::Init() : DBB trailer is not valid") ; } // Decode the payload. ptr = _payLoad; while(ptr != _trailer) { dw.SetDataPtr( ptr++ ); // don't need to check that the word is valid here since we know the trailer is valid unsigned int theCh = dw.GetChannelId(); unsigned int theTime = dw.GetHitTime(); switch( dw.GetDataType() ) { case MDdataWordDBB::TrailingMeas: { _nTrailingEdgeHits[ DBB_NCHANNELS ]++; _nTrailingEdgeHits[ theCh ]++; _trailingEdgeHit[ theCh ].push_back( theTime ); break; } case MDdataWordDBB::LeadingMeas: { _nLeadingEdgeHits[ DBB_NCHANNELS ]++; _nLeadingEdgeHits[ theCh ]++; _leadingEdgeHit[ theCh ].push_back( theTime ); //if( _testCallBack ) //_testCallBack( dw.GetMeasurement() ); break; } default: { throw MDexception("ERROR in MDframentDBB::Init() : Unexpected identifier") ; } } } Validate(); } } unsigned int MDfragmentDBB::GetHitMeasurement(unsigned int ih, unsigned int ich, char t){ int rv = 0xFFFFFFFF ; if ( ich>DBB_NCHANNELS-1 ) { stringstream ss; ss << "ERROR in MDfragmentDBB::GetHitMeasurement() : "; ss << "Wrong argument: ch = " << ich; throw MDexception( ss.str() ); } switch(t){ case 'l': { if (ih<_nLeadingEdgeHits[ich]) { rv = _leadingEdgeHit[ich][ih]; } else { stringstream ss; ss << "ERROR in MDfragmentDBB::GetHitMeasurement() case l : "; ss << "Wrong argument: ih = " << ih; throw MDexception( ss.str() ); } break; } case 't': { if (ih<_nTrailingEdgeHits[ich]) rv = _trailingEdgeHit[ich][ih]; else { stringstream ss; ss << "ERROR in MDfragmentDBB::GetHitMeasurement() case t : "; ss << "Wrong argument: ih = " << ih; throw MDexception( ss.str() ); } break; } default: { stringstream ss; ss << "ERROR in MDfragmentDBB::GetHitMeasurement() : "; ss << "Wrong argument: t = " << t; throw MDexception( ss.str() ); } } return rv; } void MDfragmentDBB::Dump( int atTheTime ) { if (IsValid()) { cout << "**** DBB ****" << endl; cout << "Board Id : " << _boardID << endl; cout << "Spill Num : " << _spillNum << endl; cout << "Trigger Count : " << _triggerCount << endl; cout << "Hit Count : " << _hitCount << endl; //cout << "Payload Size : " << _payLoadSize << endl; cout << "Spill Width : " << _spillWidth << endl; uint32_t* ptr = _payLoad; while(ptr != _trailer) { MDdataWordDBB dw( ptr++ ); long32 dt= dw.GetDataType(); switch(dt){ case MDdataWordDBB::LeadingMeas: cout << "Leading edge Measurement : "; break; case MDdataWordDBB::TrailingMeas: cout << "Trailing edge Measurement : "; break; default: cout << "Invalid Measurement!"; return; break; } cout<< dw.GetHitTime() <<" ; channel : "<< dw.GetChannelId() <> 28; int id = (*data & 0x0fc00000) >> 22; int hit = *data & 0x1fff; // int zero = (*data & 0x3f0000) >> 16; int status; cout << "----------------------------------------------------------------" << endl; cout << "header type: "<< hex << type << dec << " board id: " << id << " spill number: " << hit << endl; // cout << "zeros: " << zero << endl; data++; int tr_count = (*data & 0x3ff0000) >> 16; int h_count = *data & 0xffff; int hc = (nbr/4) - 4; cout << "trigger count: "<< tr_count << " hit count:" << h_count << " (" << hc << ")" << endl; cout << "ndw: " << h_count*2 + 4 << " / " << (nbr/4) << endl; cout << " ----------------------------------------------------------------" << endl; data++; // for (int i=0; i<(h_count*2); i++) { for (int i=0; i> 28; id = (*data & 0x0fc00000) >> 22; hit = *data & 0x3fffff; status = (*data & 0x3f0000) >> 16; cout << " " << i << " hit type: " << hex << type << dec << " ch id: " << id << " hit time: " << hit; if(type==0xe) cout << " status: " << status; cout << endl; data++; } type = (*data & 0xf0000000) >> 28; id = (*data & 0x0fc00000) >> 22; status = (*data & 0x3f0000) >> 16; hit = *data & 0xffff; cout << "----------------------------------------------------------------" << endl; cout << "trailer type: "<< hex << type << dec << " board id: " << id << " status: " << hex << status << dec << " spill number: " << hit << endl; data++; cout << "spill width: " << *data << endl; cout << "----------------------------------------------------------------" << endl << endl; }