// ----------------------------------------------------------------------------- // ----- TMbsUnpackTofPar source file ----- // ----- ----- // ----- created by C. Simon on 2014-03-18 ----- // ----- ----- // ----- based on TMbsUnpackTofPar by P.-A. Loizeau ----- // ----- https://subversion.gsi.de/fairroot/cbmroot/development/ploizeau/ ----- // ----- main/unpack/tof/TMbsUnpackTofPar.cxx ----- // ----- revision 21645, 2013-09-06 ----- // ----------------------------------------------------------------------------- #include "TMbsUnpackTofPar.h" // TOF headers #include "TofDef.h" // FAIR headers #include "FairLogger.h" #include "FairParamList.h" // ROOT headers ClassImp(TMbsUnpackTofPar) TMbsUnpackTofPar::TMbsUnpackTofPar() : FairParGenericSet("TMbsUnpackTofPar","Mbs Unpack parameters for the ToF","TestDefaultContext"), fiMbsSourceMode(0), fuCbmOutOn(0), fuVftxDebug(0), fuNbVmeBoards(0), fiMbsVmeMapping(), fuNbNonVmeBoards(0), fiNonVmeMapping(), fuNbScalerB(0), fuNbScalerActiveB(0), fuNbTriglog(0), fuNbTriglogActive(0), fuNbScalOrMu(0), fuNbScalOrMuActive(0), fuNbTdc(0), fuNbTdcActive(0), fuNbV1290(0), fuNbVftx(0), fuNbGet4(0), fuTrbSebNb(0), fuTrbTdcNb(0), fuTrbHubNb(0), fMapFpgaAddrToInDataFlag(), fMapFpgaAddrToTrbSebAddr(), fMapTrbSebAddrToFpgaNb(), fMapTrbSebAddrToFpgaInDataNb(), fMapTrbSebAddrToUnpackTdcNb(), fMapTrbSebAddrToTrbSebIndex(), fMapTrbSebIndexToTrbSebAddr(), fMapFpgaAddrToActiveTdcIndex(), fMapActiveTdcIndexToFpgaAddr(), fiTriggerRejection(0), fuNbCtsTrigChs(0), fiCtsTriggerMap(), fiTrbTdcBitMode(0) { } TMbsUnpackTofPar::TMbsUnpackTofPar(const char* name, const char* title, const char* context, Int_t iMode ) : FairParGenericSet(name,title,context), fiMbsSourceMode(iMode), fuCbmOutOn(0), fuVftxDebug(0), fuNbVmeBoards(0), fiMbsVmeMapping(), fuNbNonVmeBoards(0), fiNonVmeMapping(), fuNbScalerB(0), fuNbScalerActiveB(0), fuNbTriglog(0), fuNbTriglogActive(0), fuNbScalOrMu(0), fuNbScalOrMuActive(0), fuNbTdc(0), fuNbTdcActive(0), fuNbV1290(0), fuNbVftx(0), fuNbGet4(0), fuTrbSebNb(0), fuTrbTdcNb(0), fuTrbHubNb(0), fMapFpgaAddrToInDataFlag(), fMapFpgaAddrToTrbSebAddr(), fMapTrbSebAddrToFpgaNb(), fMapTrbSebAddrToFpgaInDataNb(), fMapTrbSebAddrToUnpackTdcNb(), fMapTrbSebAddrToTrbSebIndex(), fMapTrbSebIndexToTrbSebAddr(), fMapFpgaAddrToActiveTdcIndex(), fMapActiveTdcIndexToFpgaAddr(), fiTriggerRejection(0), fuNbCtsTrigChs(0), fiCtsTriggerMap(), fiTrbTdcBitMode(0) { } TMbsUnpackTofPar::~TMbsUnpackTofPar() { } void TMbsUnpackTofPar::clear(void) { status = kFALSE; resetInputVersions(); fiMbsSourceMode = 0; fuCbmOutOn = 0; fuVftxDebug = 0; fuNbVmeBoards = 0; fuNbNonVmeBoards = 0; fuNbScalerB = 0; fuNbScalerActiveB = 0; fuNbTriglog = 0; fuNbTriglogActive = 0; fuNbScalOrMu = 0; fuNbScalOrMuActive = 0; fuNbTdc = 0; fuNbTdcActive = 0; fuNbV1290 = 0; fuNbVftx = 0; fuNbGet4 = 0; fuTrbSebNb = 0; fuTrbTdcNb = 0; fuTrbHubNb = 0; fuNbCtsTrigChs = 0; fiTrbTdcBitMode = 0; fMapFpgaAddrToInDataFlag.clear(); fMapFpgaAddrToTrbSebAddr.clear(); fMapTrbSebAddrToFpgaNb.clear(); fMapTrbSebAddrToFpgaInDataNb.clear(); fMapTrbSebAddrToUnpackTdcNb.clear(); fMapTrbSebAddrToTrbSebIndex.clear(); fMapTrbSebIndexToTrbSebAddr.clear(); fMapFpgaAddrToActiveTdcIndex.clear(); fMapActiveTdcIndexToFpgaAddr.clear(); } void TMbsUnpackTofPar::putParams(FairParamList* l) { if (!l) { return; } l->add("MbsSourceMode", fiMbsSourceMode); l->add("WriteDataInCbmOut", (Int_t)fuCbmOutOn); l->add("VftxDebug", (Int_t)fuVftxDebug); l->add("MbsNbVmeBoards", (Int_t)fuNbVmeBoards); l->add("MbsVmeMapping", fiMbsVmeMapping); l->add("NbNonVmeBoards", (Int_t)fuNbNonVmeBoards); l->add("NonVmeMapping", fiNonVmeMapping); l->add("TriggerRejection", fiTriggerRejection); l->add("NbCtsTrigChs", (Int_t)fuNbCtsTrigChs); l->add("CtsTriggerMap", fiCtsTriggerMap); l->add("TrbTdcBitMode", fiTrbTdcBitMode); } Bool_t TMbsUnpackTofPar::getParams(FairParamList* l) { if (!l) { return kFALSE; } clear(); LOG(DEBUG2)<<"Get the MBS unpack parameters."<fill("MbsSourceMode", &fiMbsSourceMode) ) return kFALSE; Int_t iTempCaster = 0; if ( ! l->fill("WriteDataInCbmOut", &iTempCaster) ) return kFALSE; fuCbmOutOn = (UInt_t)iTempCaster; iTempCaster = 0; if ( ! l->fill("VftxDebug", &iTempCaster) ) return kFALSE; fuVftxDebug = (UInt_t)iTempCaster; iTempCaster = 0; if ( ! l->fill("MbsNbVmeBoards", &iTempCaster) ) return kFALSE; fuNbVmeBoards = (UInt_t)iTempCaster; if( 0 < fuNbVmeBoards ) { fiMbsVmeMapping.Set( fuNbVmeBoards * tofMbs::kuNbFieldsMapping ); if ( ! l->fill("MbsVmeMapping", &fiMbsVmeMapping) ) return kFALSE; } iTempCaster = 0; if ( ! l->fill("NbNonVmeBoards", &iTempCaster) ) return kFALSE; fuNbNonVmeBoards = (UInt_t)iTempCaster; if( 0 < fuNbNonVmeBoards ) { fiNonVmeMapping.Set( fuNbNonVmeBoards * tofMbs::kuNbFieldsMapping ); if ( ! l->fill("NonVmeMapping", &fiNonVmeMapping) ) return kFALSE; } // if( 0 < fuNbNonVmeBoards ) if ( ! l->fill("TriggerRejection", &fiTriggerRejection) ) return kFALSE; iTempCaster = 0; if ( ! l->fill("NbCtsTrigChs", &iTempCaster) ) { LOG(WARNING)<<"Field 'NbCtsTrigChs' not existing in the unpack parameter file!"<fill("CtsTriggerMap", &fiCtsTriggerMap) ) { LOG(WARNING)<<"Field 'CtsTriggerMap' not existing in the unpack parameter file!"<fill("TrbTdcBitMode", &fiTrbTdcBitMode) ) { LOG(WARNING)<<"Field 'TrbTdcBitMode' not existing in the unpack parameter file!"< Index "<(fuNbVmeBoards*tofMbs::kuNbFieldsMapping) == fiMbsVmeMapping.GetSize() ) { if( uBoard < fuNbVmeBoards && uField < tofMbs::kuNbFieldsMapping ) return fiMbsVmeMapping[ uBoard*tofMbs::kuNbFieldsMapping + uField ]; else { LOG(WARNING)<<"TMbsUnpackTofPar::GetMappingField: wrong Board/field combination (" <(fuNbVmeBoards*tofMbs::kuNbFieldsMapping) == fiMbsVmeMapping.GetSize() ) { if( uBoard < fuNbVmeBoards ) { ULong64_t uFullTag = ( ( (ULong64_t)GetMappingField( uBoard, tofMbs::TokenB ) )<< 32 ) | (ULong64_t)GetMappingField( uBoard, tofMbs::TokenA ); // LOG(INFO)<>32, (uFullTag&0xFFFFFFFF) )<(fuNbVmeBoards*tofMbs::kuNbFieldsMapping) == fiMbsVmeMapping.GetSize() ) { if( uBoard < fuNbVmeBoards ) return (1 == GetMappingField( uBoard, tofMbs::Active ) )? kTRUE: kFALSE; else { LOG(WARNING)<<"TMbsUnpackTofPar::IsActive: wrong Board (" <(uType) == GetBoardType( uBoard ) ) { uIndBoardSameType++; // Count active boards of same type as target if( kTRUE == IsActive( uBoard ) ) uIndActiveSameBoard++; } } // for( UInt_t uBoard = 0; uBoard < fuNbVmeBoards; uBoard++) // If the boad was not found: // return total number of boards as it will be rejected by other functions! return fuNbVmeBoards; } //*******************************************************************************/ //*********** Not VME boards ****************************************************/ Int_t TMbsUnpackTofPar::GetActiveNotVmeBoardsNumber() { UInt_t uNbActive = 0; // Count all active Non-VME boards of all types for( UInt_t uBoard = 0; uBoard < fuNbNonVmeBoards; uBoard++ ) if( kTRUE == IsActiveNotVme( uBoard ) ) uNbActive++; return uNbActive; } Int_t TMbsUnpackTofPar::GetNotVmeMappingField( UInt_t uBoard, UInt_t uField) { LOG(DEBUG3)<<"TMbsUnpackTofPar::GetNotVmeMappingField: Trying to get combination (" < Index "<(fuNbNonVmeBoards*tofMbs::kuNbFieldsMapping) == fiNonVmeMapping.GetSize() ) { if( uBoard < fuNbNonVmeBoards && uField < tofMbs::kuNbFieldsMapping ) return fiNonVmeMapping[ uBoard*tofMbs::kuNbFieldsMapping + uField ]; else { LOG(WARNING)<<"TMbsUnpackTofPar::GetNotVmeMappingField: wrong Board/field combination (" <(fuNbNonVmeBoards*tofMbs::kuNbFieldsMapping) == fiNonVmeMapping.GetSize() ) { if( uBoard < fuNbNonVmeBoards ) { ULong64_t uFullTag = ( ( (ULong64_t)GetNotVmeMappingField( uBoard, tofMbs::TokenB ) )<< 32 ) | (ULong64_t)GetNotVmeMappingField( uBoard, tofMbs::TokenA ); return uFullTag; } // if( uBoard < fuNbVmeBoards ) else { LOG(WARNING)<<"TMbsUnpackTofPar::GetNotVmeBoardTag: wrong Board (" <(fuNbNonVmeBoards*tofMbs::kuNbFieldsMapping) == fiNonVmeMapping.GetSize() ) { if( uBoard < fuNbNonVmeBoards ) return (1 == GetNotVmeMappingField( uBoard, tofMbs::Active ) )? kTRUE: kFALSE; else { LOG(WARNING)<<"TMbsUnpackTofPar::IsActiveNotVme: wrong Board (" <(uType) == GetNotVmeBoardType( uBoard ) ) { uIndBoardSameType++; // Count active boards of same type as target if( kTRUE == IsActiveNotVme( uBoard ) ) uIndActiveSameBoard++; } } // for( UInt_t uBoard = 0; uBoard < fuNbNonVmeBoards; uBoard++) // If the boad was not found: // return total number of boards as it will be rejected by other functions! return fuNbNonVmeBoards; } //*******************************************************************************/ //*************** All boards ****************************************************/ UInt_t TMbsUnpackTofPar::GetNbActiveBoards() { UInt_t uNbActiveBoards = 0; uNbActiveBoards += GetActiveBoardsNumber(); uNbActiveBoards += GetActiveNotVmeBoardsNumber(); return uNbActiveBoards; } UInt_t TMbsUnpackTofPar::GetNbActiveBoards( UInt_t uType ) { UInt_t uNbActiveSameBoard = 0; if( tofMbs::trb == uType) uType = tofMbs::trbtdc; // Count active boards of asked type for( UInt_t uBoard = 0; uBoard < fuNbVmeBoards; uBoard++) if( static_cast(uType) == GetBoardType( uBoard ) && kTRUE == IsActive( uBoard ) ) uNbActiveSameBoard++; // Count active boards of asked type for( UInt_t uBoard = 0; uBoard < fuNbNonVmeBoards; uBoard++) if( static_cast(uType) == GetNotVmeBoardType( uBoard ) && kTRUE == IsActiveNotVme( uBoard ) ) uNbActiveSameBoard++; return uNbActiveSameBoard; } UInt_t TMbsUnpackTofPar::GetNbTdcs( ) { // If 0 recheck if it was simply not filled from params if( 0 == fuNbTdc ) FillBoardsNbPerType(); return fuNbTdc; } UInt_t TMbsUnpackTofPar::GetNbActiveTdcs( ) { // If 0 recheck if it was simply not filled from params if( 0 == fuNbTdcActive ) FillActiveBoardsNbPerType(); return fuNbTdcActive; } UInt_t TMbsUnpackTofPar::GetNbScalersB( ) { // If 0 recheck if it was simply not filled from params if( 0 == fuNbScalerB ) FillBoardsNbPerType(); return fuNbScalerB; } UInt_t TMbsUnpackTofPar::GetNbActiveScalersB( ) { // If 0 recheck if it was simply not filled from params if( 0 == fuNbScalerActiveB ) FillActiveBoardsNbPerType(); return fuNbScalerActiveB; } Bool_t TMbsUnpackTofPar::WithActiveTriglog( ) { if( 0 == fuNbTriglogActive ) FillActiveBoardsNbPerType(); if( 0 == fuNbTriglogActive ) return kFALSE; else return kTRUE; } void TMbsUnpackTofPar::FillBoardsNbPerType() { // Scaler boards fuNbScalerB = 0; fuNbTriglog = 0; fuNbScalOrMu = 0; // TDC boards fuNbTdc = 0; fuNbV1290 = 0; fuNbVftx = 0; fuTrbTdcNb = 0; fuNbGet4 = 0; for( UInt_t uBoard = 0; uBoard < fuNbVmeBoards; uBoard++) switch( GetBoardType( uBoard ) ) { case tofMbs::caenV1290: fuNbTdc++; fuNbV1290++; break; case tofMbs::vftx: fuNbTdc++; fuNbVftx++; break; case tofMbs::get4: fuNbTdc++; fuNbGet4++; break; case tofMbs::triglog: fuNbScalerB++; fuNbTriglog++; break; case tofMbs::scalormu: fuNbScalerB++; fuNbScalOrMu++; break; case tofMbs::scaler2014: fuNbScalerB++; break; case tofMbs::triglogscal: fuNbScalerB++; break; case tofMbs::caenv965: case tofMbs::lecroy1182: case tofMbs::vulqfwread: break; case tofMbs::undef: default: LOG(WARNING)<<"TMbsUnpackTofPar::FillBoardsNbPerType => Unknown board type " < Unknown board type " < Unknown board type " < Unknown board type " <(fuNbNonVmeBoards*tofMbs::kuNbFieldsMapping) == fiNonVmeMapping.GetSize() ) { Int_t iActiveTrbTdcIndex = 0; Int_t iTrbSebIndex = 0; for( UInt_t uBoard = 0; uBoard < fuNbNonVmeBoards; uBoard++ ) { Int_t iBoardType = fiNonVmeMapping[ uBoard*tofMbs::kuNbFieldsMapping + tofMbs::Type ]; if( tofMbs::trb == iBoardType/10 ) { Bool_t bUnpackTdc = (Bool_t)fiNonVmeMapping[ uBoard*tofMbs::kuNbFieldsMapping + tofMbs::Active ]; UInt_t uFpgaAddr = (UInt_t)fiNonVmeMapping[ uBoard*tofMbs::kuNbFieldsMapping + tofMbs::Address ]; UInt_t uSebAddr = (UInt_t)fiNonVmeMapping[ uBoard*tofMbs::kuNbFieldsMapping + tofMbs::TokenA ]; Bool_t bFpgaInData = (Bool_t)fiNonVmeMapping[ uBoard*tofMbs::kuNbFieldsMapping + tofMbs::TokenB ]; if( 0 < fMapFpgaAddrToInDataFlag.count(uFpgaAddr) ) { LOG(FATAL)< Index "<(fuNbCtsTrigChs*tofMbs::kuNbFieldsCtsMapping) == fiCtsTriggerMap.GetSize() ) { if( uChannel < fuNbCtsTrigChs && uField < tofMbs::kuNbFieldsCtsMapping ) return fiCtsTriggerMap[ uChannel*tofMbs::kuNbFieldsCtsMapping + uField ]; else { LOG(WARNING)<<"TMbsUnpackTofPar::GetCtsTrigMappingField: wrong channel/field combination (" <> uChannel) & 0x1); } } return bUnpack; } UInt_t TMbsUnpackTofPar::GetFirstTrbTrigger(UChar_t cTriggerType, UInt_t uTriggerPattern) { UInt_t uFirstPattern = uTriggerPattern; for( UInt_t uChannel = 0; uChannel < fuNbCtsTrigChs; uChannel++) { if( (uFirstPattern >> uChannel) & 0x1 ) { if( (UChar_t)GetCtsTrigMappingField(uChannel,tofMbs::TriggerType) != cTriggerType) { uFirstPattern = uFirstPattern ^ (0x1 << uChannel); } } } return uFirstPattern; }