using namespace std;
#include <stdio.h>
#include "hades.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hldsubevt.h"
#include "hevent.h"
#include "hmdcraw.h"
#include "hmdcrawstruct.h"
#include "hmdcraweventheader.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hruntimedb.h"
#include "heventheader.h"
#include <iostream> 
#include <iomanip>
#include <fstream>
#include "TROOT.h"
#include "hmdcdataword.h"
#include "hmdcunpacker.h"
Bool_t HMdcDataWord::noComment=kFALSE;
ClassImp(HMdcDataWord)
HMdcDataWord::HMdcDataWord()
{
    clearAll();
    noComment=HMdcUnpacker::getQuietMode();
}
 
Bool_t HMdcDataWord::decode( const UInt_t data, UInt_t version, Bool_t consistencyCheck)
{
  
  
  
  switch(version)
    {
    case 0:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      sam   = ((data & m31) >> 26 & m5)-1; 
      samP  =  (data & m31) >> 25 & m1;
      roc   = ((data & m31) >> 22 & m3);  
      rocP  =  (data & m31) >> 21 & m1;
      mboNb = ((data & m31) >> 19 & m2); 
      tdcNb = ((data & m31) >> 15 & m4)-1;
      chan  =  (data & m31) >> 12 & m3;
      hit   =  (data & m31) >> 11 & m1; 
      time  =  (data & m31) & m11;   
      break;
    case 1:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      sam   = ((data & m31) >> 26 & m5); 
      samP  =  (data & m31) >> 25 & m1;
      roc   = ((data & m31) >> 22 & m3);  
      rocP  =  (data & m31) >> 21 & m1;
      mboNb = ((data & m31) >> 19 & m2); 
      tdcNb = ((data & m31) >> 15 & m4)-1;
      chan  =  (data & m31) >> 12 & m3;
      hit   =  (data & m31) >> 11 & m1; 
      time  =  (data & m31) & m11;   
      break;
    default:
      if(!noComment) Error("decode","decoding version %i not a valid number",version);
      return kFALSE;
    }
  
  if (consistencyCheck) return checkConsistency(version, data);
  return kTRUE;
}
 
UInt_t HMdcDataWord::getCodedDataWord( UInt_t version )
{
  
  
  UInt_t code = 0;
  switch(version)
    {
    case 0:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      code |= ((sam+1)   & m5 ) << 26;
      code |= ( samP     & m1 ) << 25;
      code |= ( roc      & m3 ) << 22;
      code |= ( rocP     & m1 ) << 21;
      code |= ( mboNb    & m2 ) << 19;
      code |= ((tdcNb+1) & m4 ) << 15;
      code |= ( chan     & m3 ) << 12;
      code |= ( hit      & m1 ) << 11;
      code |= ( time     & m11);
      break;
    case 1:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      code |= ( sam      & m5 ) << 26;  
      code |= ( samP     & m1 ) << 25;
      code |= ( roc      & m3 ) << 22;
      code |= ( rocP     & m1 ) << 21;
      code |= ( mboNb    & m2 ) << 19;
      code |= ((tdcNb+1) & m4 ) << 15;
      code |= ( chan     & m3 ) << 12;
      code |= ( hit      & m1 ) << 11;
      code |= ( time     & m11);
      break;
    default:
      if(!noComment) Error("getCodedDataWord","decoding version %i not a valid number",version);
      return 0;
    }
  return code;
}
 
void HMdcDataWord::dump(UInt_t version)
{ 
    
  Info(" dump()","----------------------------------------");
  if (gHades) Info(" dump()","--- EvtSeqNr: %i\n", ((HEventHeader*)((HEvent*)(gHades->getCurrentEvent())->getHeader()))->getEventSeqNumber());
  print(version);
  Info(" dump()","----------------------------------------");
}
 
Bool_t HMdcDataWord::subHeader( const UInt_t* data, UInt_t version, Bool_t consistencyCheck)
{
    
    
    
  if (version==1) version--; 
  switch(version)
    {
    case 0:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      evNb       = *data            & m16;  
      subevtSize = *(data+1)        & m16;
      trigType   = *(data+2)        & m4;
      rocNb      = *(data+2) >> 8   & m4;
      errorFlag  = *(data+2) >> 12  & m4; 
      break;
    default:
      if(!noComment)Error("subHeader","decoding version %i not a valid number",version);
      return kFALSE;
    }
  if (consistencyCheck) return checkConsistencyRocHeader(version);
  return kTRUE;
}
 
Bool_t HMdcDataWord::checkConsistency(UInt_t version, UInt_t data)
{
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  if (version==1) version--; 
  
  switch(version)
    {
    case 0:
      {
	
	
	
	
	
	
	
	
	
	
	Int_t samMin   = 0;
	Int_t samMax   = 31;
	Int_t samPMin  = 0;
	Int_t samPMax  = 1;
	Int_t rocMin   = 1;
	Int_t rocMax   = 5;
	Int_t rocPMin  = 0;
	Int_t rocPMax  = 1;
	Int_t mboNbMin = 1;
	Int_t mboNbMax = 3;
	Int_t tdcNbMin = 1;
	Int_t tdcNbMax = 12;
	tdcNbMin --; 
	tdcNbMax --; 
	Int_t chanMin  = 0;
	Int_t chanMax  = 7;
	Int_t hitMin   = 0;
	Int_t hitMax   = 1;
	Int_t timeMin  = 0;
	Int_t timeMax  = 0x7ff;
	
	if (sam < samMin || sam > samMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "SAM number", sam, samMin, samMax, data );
	    return kFALSE; 
	  }
	if (samP < samPMin || samP > samPMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "SAM Position", samP, samPMin, samPMax, data  );
	    return kFALSE;
	  }
	if (roc < rocMin || roc > rocMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "ROC Number", roc, rocMin, rocMax, data  );
	    return kFALSE; 
	  }
	if (rocP < rocPMin || rocP > rocPMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "LVL1 Slot", rocP, rocPMin, rocPMax, data  );
	    return kFALSE; 
	  }
	if (mboNb < mboNbMin || mboNb > mboNbMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "MBO Position", mboNb, mboNbMin, mboNbMax, data  );
	    return kFALSE; 
	  }
	if (tdcNb < tdcNbMin || tdcNb > tdcNbMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "TDC Number", tdcNb, tdcNbMin, tdcNbMax, data  );
	    return kFALSE; 
	  }
	if (chan < chanMin || chan > chanMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "Channel Number", chan, chanMin, chanMax, data  );
	    return kFALSE; 
	  }
	if (hit < hitMin || hit > hitMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "Hit Number (modulo 2)", hit, hitMin, hitMax, data  );
	    return kFALSE; 
	  }
	if (time < timeMin || time > timeMax ) 
	  {
	    if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%x] while decoding: 0x%08x", "Time", time, timeMin, timeMax, data  );
	    return kFALSE; 
	  }
      }
      break;
    default:
      if(!noComment)Error("checkConsistency()","decoding version %i not valid",version);
      return kFALSE;
    }
  return kTRUE;
};
 
Bool_t HMdcDataWord::checkConsistencyRocHeader(UInt_t version)
{
  
  
  
  
  
  
  
  
  
  
  
  
  
	if (version==1) version--; 
	
  switch(version)
    {
    case 0:
      {
	
	
	
	
	
      
	Int_t evNbMin       = 0;
	Int_t evNbMax       = 0xffff;
	Int_t subevtSizeMin = 0;
	Int_t subevtSizeMax = 0xffff;
	Int_t trigTypeMin   = 0;
	Int_t trigTypeMax   = 0xf;
	Int_t rocNbMin      = 1;
	Int_t rocNbMax      = 0x5;
	Int_t errorFlagMin  = 0;
	Int_t errorFlagMax  = 0xf;
      
	if (evNb < evNbMin || evNb > evNbMax ) 
	  {
	    if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Event Number number", evNb, evNbMin, evNbMax );
	    return kFALSE; 
	  }
	if (subevtSize < subevtSizeMin || subevtSize > subevtSizeMax ) 
	  {
	    if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Subevent size number", subevtSize, subevtSizeMin, subevtSizeMax );
	    return kFALSE; 
	  }
	if (trigType < trigTypeMin || trigType > trigTypeMax ) 
	  {
	    if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Trigger Type", trigType, trigTypeMin, trigTypeMax );
	    return kFALSE; 
	  }
	if (rocNb < rocNbMin || rocNb > rocNbMax ) 
	  {
	    if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%i]", "ROC Number", rocNb, rocNbMin, rocNbMax );
	    return kFALSE; 
	  }
	if (errorFlag < errorFlagMin || errorFlag > errorFlagMax ) 
	  {
	    if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Error Flag", errorFlag, errorFlagMin, errorFlagMax );
	    return kFALSE; 
	  }
      }
      break;
    default:
      if(!noComment)Error("checkConsistency()","decoding version %i not valid",version);
      return kFALSE;
    }
  return kTRUE;
};
 
void HMdcDataWord::print(UInt_t version)
{
  switch(version)
    {
    case 0:
      printf("\t%s: ",ClassName());
      printf("\n\t>>>>> DataWord   : ");    
      printf("%s: %2i | ","sam" ,sam);    
      printf("%s: %2i | ","samP",samP);   
      printf("%s: %2i | ","roc" ,roc);    
      printf("%s: %2i | ","rocP",rocP);   
      printf("%s: %2i | ","mboNb" ,mboNb);    
      printf("%s: %2i | ","tdcNb" ,tdcNb);    
      printf("%s: %2i | ","chan",chan);   
      printf("%s: %2i | ","hit" ,hit);    
      printf("%s: %4i   ","time",time);   
      printf("\n\t  >>> ROC-Header : ");    
      printf("%s: %4i | ","event number" ,evNb);      
      printf("%s: %2i | ","roc number"   ,rocNb);     
      printf("%s: %2i | ","trigger type" ,trigType);  
      printf("%s: %2i | ","error flag"   ,errorFlag); 
      printf("%s: %4i   ","subevent size",subevtSize);
      printf("\n\t  >>> RAW-Address: ");    
      printf("%s: %2i | ","sector" ,sector);
      printf("%s: %2i | ","module" ,module);   
      printf("%s: %2i | ","mbo"    ,mbo);
      printf("%s: %2i | ","tdc"    ,tdc);
      printf("%s: %2i   ","entry# ",entry);
      printf("\n");
      break;
    case 1:
      printf("\t%s: ",ClassName());
      printf("\n\t>>>>> DataWord   : ");    
      printf("%s: %2i | ","virtualSamNr" ,getVirtualSamNr());    
      printf("%s: %2i | ","sam" ,sam);    
      printf("%s: %2i | ","samP",samP);   
      printf("%s: %2i | ","roc" ,roc);    
      printf("%s: %2i | ","rocP",rocP);   
      printf("%s: %2i | ","mboNb" ,mboNb);    
      printf("%s: %2i | ","tdcNb" ,tdcNb);    
      printf("%s: %2i | ","chan",chan);   
      printf("%s: %2i | ","hit" ,hit);    
      printf("%s: %4i   ","time",time);   
      printf("\n\t  >>> ROC-Header : ");    
      printf("%s: %4i | ","event number" ,evNb);      
      printf("%s: %2i | ","roc number"   ,rocNb);     
      printf("%s: %2i | ","trigger type" ,trigType);  
      printf("%s: %2i | ","error flag"   ,errorFlag); 
      printf("%s: %4i   ","subevent size",subevtSize);
      printf("\n\t  >>> RAW-Address: ");    
      printf("%s: %2i | ","sector" ,sector);
      printf("%s: %2i | ","module" ,module);   
      printf("%s: %2i | ","mbo"    ,mbo);
      printf("%s: %2i | ","tdc"    ,tdc);
      printf("%s: %2i   ","entry# ",entry);
      printf("\n");
      break;
    default:
      Error("print()","decoding version %i not valid",version);
    }
}
Last change: Sat May 22 13:01:21 2010
Last generated: 2010-05-22 13:01
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.