/* 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 "MDpartEventV1290.h"
#include "MDexception.h"
MDpartEventV1290::MDpartEventV1290(void *d):MDdataContainer(d),_wordCount(0),_geo(0),_triggerTimeTag(0){
Init();
}
void MDpartEventV1290::Init(){
unsigned int * ptr = Get32bWordPtr(0);
unsigned int unit(0);
MDdataWordV1290 dw(ptr);
UnValidate();
_wordCount = 0 ;
for (int ich=0 ; ich < V1290_NCHANNELS ; ich++) {
_nLeadingEdgeHits[ich]=0;
_nTrailingEdgeHits[ich]=0;
_leadingEdgeHit[ich].clear();
_trailingEdgeHit[ich].clear();
}
_nLeadingEdgeHits[V1290_NCHANNELS]=0;
_nTrailingEdgeHits[V1290_NCHANNELS]=0;
if ( dw.IsValid() ) {
if ( dw.GetDataType() == DWV1290_GlobalHeader ) {
_geo = dw.GetGeo();
_wordCount++;
dw.SetDataPtr(++ptr);
while ( dw.GetDataType() != DWV1290_GlobalTrailer) {
switch ( dw.GetDataType() ) {
case DWV1290_Measurement:
{ // Normal case
// Fill the hit vectors, depending on the measurement type
int theCh = dw.GetChannel();
_unitWordCount++;
switch( dw.GetMeasurementType() ){
case DWV1290_TrailingMeas:
{
_nTrailingEdgeHits[V1290_NCHANNELS]++;
_nTrailingEdgeHits[theCh]++;
_trailingEdgeHit[theCh].push_back(dw.GetMeasurement());
break;
}
case DWV1290_LeadingMeas:
{
_nLeadingEdgeHits[V1290_NCHANNELS]++;
_nLeadingEdgeHits[theCh]++;
_leadingEdgeHit[theCh].push_back(dw.GetMeasurement());
if( _testCallBack )
_testCallBack( dw.GetMeasurement() );
break;
}
default:
{
stringstream ss;
ss << "ERROR in MDpartEventV1290::Init(): ";
ss << "Unknown V1290 Measurement Type. ";
throw MDexception( ss.str() );
}
}
break;
}
case DWV1290_TdcHeader:
{
unit = dw.GetTdc();
_bunchID[unit]= dw.GetBunchID();
_eventID[unit]= dw.GetEventID();
_unitWordCount = 1;
break;
}
case DWV1290_TdcTrailer:
{
_unitWordCount++;
//if ( _unitWordCount != dw.GetWordCount() ||
// It happens sometimes that the TDC error comes after the trailer
// but is still counted as a word
if ( _eventID[unit] != dw.GetEventID()
|| unit != dw.GetTdc() ) {
stringstream ss;
ss << "ERROR in MDpartEventV1290::Init(): ";
ss << "TDC trailer is not consistent.";
throw MDexception( ss.str() );
/*
cout << "ERROR in MDpartEventV1290::Init: "
<< "TDC trailer is not consistent" << endl;
cout << _unitWordCount << " != " << dw.GetWordCount()
<< " || " << _eventID[unit] << " != " << dw.GetEventID()
<< " || " << unit << " != " << dw.GetTdc() << endl;
*/
}
break;
}
case DWV1290_TdcError:
{
_unitWordCount++;
stringstream ss;
ss << "ERROR in MDpartEventV1290::Init(): ";
ss << "Unexpected TDC Error";
throw MDexception( ss.str() );
}
case DWV1290_TriggerTimeTag:
{
_unitWordCount++;
_triggerTimeTag = dw.GetTriggerTimeTag();
break;
}
case DWV1290_Filler:
{
stringstream ss;
ss << "ERROR in MDpartEventV1290::Init(): ";
ss << "Unexpected Data Filler";
throw MDexception( ss.str() );
}
default:
{
stringstream ss;
ss << "ERROR in MDpartEventV1290::Init(): ";
ss << "Unknown data Type !";
throw MDexception( ss.str() );
/*
cout << " ERROR in MDpartEventV1290::Init: "
<< "Unknown data Type !" << endl
<< " Data value : " << hex << showbase << *ptr << dec << noshowbase << endl
<< " It looks like there is a global trailer missing " << endl
<< " That is serious error. Call the expert" << endl;
*/
}
}
_wordCount++;
dw.SetDataPtr(++ptr);
}
if ( dw.GetDataType() == DWV1290_GlobalTrailer ) {
_wordCount++;
if ( _wordCount == dw.GetWordCount() && _geo == dw.GetGeo()) {
Validate();
SetSize( _wordCount*4 );
_tdcStatus = dw.GetStatus();
} else throw MDexception("ERROR in MDpartEventV1290::Init: Word count not consistent");
}
} else throw MDexception("ERROR in MDpartEventV1290::Init: 1st word is not global header");
}
}
unsigned int MDpartEventV1290::GetBunchID(unsigned int unit)
{
if (unit<4) {
return _bunchID[unit];
} else {
return (_bunchID[0]+_bunchID[1]+_bunchID[2]+_bunchID[3])/4;
}
}
void MDpartEventV1290::SetDataPtr( void *d )
{
MDdataContainer::SetDataPtr(d);
Init();
}
unsigned int MDpartEventV1290::GetEventCount()
{
if (IsValid()) {
MDdataWordV1290 dw( Get32bWordPtr(0) );
return dw.GetEventCount();
} else {
return 0;
}
}
unsigned int MDpartEventV1290::GetWordCount(){
if (IsValid()) {
return _size/4;
} else {
return 0;
}
}
unsigned int MDpartEventV1290::GetStatus(){
if (IsValid()) {
return _tdcStatus;
} else {
return 0;
}
}
unsigned int MDpartEventV1290::GetNHits(unsigned int ich,char t){
unsigned int nh(0);
if ( ich>V1290_NCHANNELS ) {
stringstream ss;
ss << "ERROR in MDpartEventV1290::GetNHits(): ";
ss << "Wrong argument: ch = " << ich;
throw MDexception( ss.str() );
}
switch(t){
case 'a':
{
nh = _nLeadingEdgeHits[ich] + _nTrailingEdgeHits[ich] ;
break;
}
case 'l':
{
nh = _nLeadingEdgeHits[ich];
break;
}
case 't':
{
nh = _nTrailingEdgeHits[ich];
break;
}
default:
{
stringstream ss;
ss << "ERROR in MDpartEventV1290::GetNHits(): ";
ss << "Wrong argument: t = " << t;
throw MDexception( ss.str() );
}
}
return nh;
}
unsigned int MDpartEventV1290::GetHitMeasurement(unsigned int ih, unsigned int ich, char t){
int rv = 0xFFFFFFFF ;
if ( ich>V1290_NCHANNELS-1 ) {
stringstream ss;
ss << "ERROR in MDpartEventV1290::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 MDpartEventV1290::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 MDpartEventV1290::GetHitMeasurement() case t : ";
ss << "Wrong argument: ih = " << ih;
throw MDexception( ss.str() );
}
break;
}
default:
{
stringstream ss;
ss << "ERROR in MDpartEventV1290::GetHitMeasurement() : ";
ss << "Wrong argument: t = " << t;
throw MDexception( ss.str() );
}
}
return rv;
}
void MDpartEventV1290::Dump(int atTheTime){
if (IsValid()) {
unsigned int wc(0);
unsigned int * ptr = Get32bWordPtr( 0 );
MDdataWordV1290 dw(ptr) ;
while (wc < GetWordCount() ) {
cout << dw;
dw.SetDataPtr( ++ptr );
wc++;
}
// Alternative method follows (more appropriate example for unpacking applications)
// (TDC errors are not printed out)
/*
cout << " TDC V1290 Particle Event: Event Count: " << dec << GetEventCount()
<< " Geo Address: " << GetGeo() << " Word Count: " << GetWordCount() <