diff --git a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx index 01662a38be5c91e05f80070da024fb4626b1dd8a..c1fb5e04b1dce7fc0ed5bbe1296cc7c3dae3df61 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx +++ b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx @@ -344,6 +344,9 @@ void CbmMcbm2018EventBuilder::BuildEvents() } // default: } //? system + if( fFillHistos ) + fDiffTime->Fill( time - fPrevTime ); + fPrevTime = time; } fCurrentEvent->SetEndTime(fPrevTime); @@ -363,28 +366,50 @@ Bool_t CbmMcbm2018EventBuilder::IsDigiInEvent(Double_t time) Bool_t CbmMcbm2018EventBuilder::HasTrigger(CbmEvent* event) { Bool_t hasTrigger{kTRUE}; - if ( (fT0DigiVec || fT0DigiArr) && fTriggerMinT0Digis > 0) { + if ( hasTrigger && (fT0DigiVec || fT0DigiArr) && fTriggerMinT0Digis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kT0Digi) >= fTriggerMinT0Digis); } - if (fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMinStsDigis > 0) { + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMinStsDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kStsDigi) >= fTriggerMinStsDigis); } - if (fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMinMuchDigis > 0) { + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMinMuchDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kMuchDigi) >= fTriggerMinMuchDigis); } - if (fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMinTrdDigis > 0) { + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMinTrdDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTrdDigi) >= fTriggerMinTrdDigis); } - if (fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMinTofDigis > 0) { + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMinTofDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTofDigi) >= fTriggerMinTofDigis); } - if (fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMinRichDigis > 0) { + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMinRichDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kRichDigi) >= fTriggerMinRichDigis); } - if (fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMinPsdDigis > 0) { + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMinPsdDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kPsdDigi) >= fTriggerMinPsdDigis); } + if (hasTrigger && (fT0DigiVec || fT0DigiArr) && fTriggerMaxT0Digis >= 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kT0Digi) < fTriggerMaxT0Digis); + } + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMaxStsDigis >= 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kStsDigi) < fTriggerMaxStsDigis); + } + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMaxMuchDigis >= 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kMuchDigi) < fTriggerMaxMuchDigis); + } + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMaxTrdDigis >= 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTrdDigi) < fTriggerMaxTrdDigis); + } + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMaxTofDigis >= 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTofDigi) < fTriggerMaxTofDigis); + } + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMaxRichDigis >= 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kRichDigi) < fTriggerMaxRichDigis); + } + if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMaxPsdDigis >= 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kPsdDigi) < fTriggerMaxPsdDigis); + } + return hasTrigger; } diff --git a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h index 675f1526e3f74549aa90545f9502914b6331311a..e473ae880785b0603c42bd3e759e4030c5adc25d 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h +++ b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h @@ -87,14 +87,36 @@ class CbmMcbm2018EventBuilder : public FairTask void SetFixedTimeWindow(Double_t val) {fFixedTimeWindow = val;} void SetMaximumTimeGap(Double_t val) {fMaximumTimeGap = val;} + /** Minimum number of T0 digis needed to generate a trigger, 0 means don't use T0 for trigger generation **/ void SetTriggerMinNumberT0(Int_t val) {fTriggerMinT0Digis = val;} + /** Minimum number of Sts digis needed to generate a trigger, 0 means don't use Sts for trigger generation **/ void SetTriggerMinNumberSts(Int_t val) {fTriggerMinStsDigis = val;} + /** Minimum number of Much digis needed to generate a trigger, 0 means don't use Much for trigger generation **/ void SetTriggerMinNumberMuch(Int_t val) {fTriggerMinMuchDigis = val;} + /** Minimum number of Trd digis needed to generate a trigger, 0 means don't use Trd for trigger generation **/ void SetTriggerMinNumberTrd(Int_t val) {fTriggerMinTrdDigis = val;} + /** Minimum number of Tof digis needed to generate a trigger, 0 means don't use Tof for trigger generation **/ void SetTriggerMinNumberTof(Int_t val) {fTriggerMinTofDigis = val;} + /** Minimum number of Rich digis needed to generate a trigger, 0 means don't use Rich for trigger generation **/ void SetTriggerMinNumberRich(Int_t val) {fTriggerMinRichDigis = val;} + /** Minimum number of Psd digis needed to generate a trigger, 0 means don't use Psd for trigger generation **/ void SetTriggerMinNumberPsd(Int_t val) {fTriggerMinPsdDigis = val;} + /** Maximum number of T0 digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + void SetTriggerMaxNumberT0(Int_t val) {fTriggerMaxT0Digis = val;} + /** Maximum number of Sts digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + void SetTriggerMaxNumberSts(Int_t val) {fTriggerMaxStsDigis = val;} + /** Maximum number of Much digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + void SetTriggerMaxNumberMuch(Int_t val) {fTriggerMaxMuchDigis = val;} + /** Maximum number of Trd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + void SetTriggerMaxNumberTrd(Int_t val) {fTriggerMaxTrdDigis = val;} + /** Maximum number of Tof digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + void SetTriggerMaxNumberTof(Int_t val) {fTriggerMaxTofDigis = val;} + /** Maximum number of Rich digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + void SetTriggerMaxNumberRich(Int_t val) {fTriggerMaxRichDigis = val;} + /** Maximum number of Psd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + void SetTriggerMaxNumberPsd(Int_t val) {fTriggerMaxPsdDigis = val;} + void SetUseBaseMuchDigi( Bool_t bFlag = kTRUE ) { fbUseBaseMuchDigi = bFlag; } private: @@ -168,6 +190,20 @@ class CbmMcbm2018EventBuilder : public FairTask Int_t fTriggerMinRichDigis{0}; /** Minimum number of Psd digis needed to generate a trigger, 0 means don't use Psd for trigger generation **/ Int_t fTriggerMinPsdDigis{0}; + /** Maximum number of T0 digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + Int_t fTriggerMaxT0Digis = -1; + /** Maximum number of Sts digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + Int_t fTriggerMaxStsDigis = -1; + /** Maximum number of Much digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + Int_t fTriggerMaxMuchDigis = -1; + /** Maximum number of Trd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + Int_t fTriggerMaxTrdDigis = -1; + /** Maximum number of Tof digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + Int_t fTriggerMaxTofDigis = -1; + /** Maximum number of Rich digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + Int_t fTriggerMaxRichDigis = -1; + /** Maximum number of Psd digis needed to generate a trigger, -1 means no cut, 0 means anti-coinc trigger **/ + Int_t fTriggerMaxPsdDigis = -1; /** Name of the histogram output file **/ TString fOutFileName{"HistosEventBuilder.root"}; diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx index 020d3710ea2bd19f1d5e826195bca2b4b317f94f..d3e03da7c3b24c6dd608b409cc0a52e587b30542 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx @@ -816,86 +816,145 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::AddDigiToEvent( ECbmModuleId _system, I Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::HasTrigger(CbmEvent* event) { - Bool_t hasTrigger{ kTRUE }; - if ( (fT0DigiVec ) && fuTriggerMinT0Digis > 0) { - Int_t iNbDigis = event->GetNofData( ECbmDataType::kT0Digi ); - hasTrigger = hasTrigger && ( -1 != iNbDigis ) && - ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinT0Digis ); - if( !hasTrigger ) - { - LOG( debug2 ) << "Event does not have enough T0 digis: " << iNbDigis - << " vs " << fuTriggerMinT0Digis; - return hasTrigger; - } // if( !hasTrigger ) - } - if (fDigiMan->IsPresent(ECbmModuleId::kSts) && fuTriggerMinStsDigis > 0) { - Int_t iNbDigis = event->GetNofData( ECbmDataType::kStsDigi ); - hasTrigger = hasTrigger && ( -1 != iNbDigis ) && - ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinStsDigis ); - if( !hasTrigger ) - { - LOG( debug2 ) << "Event does not have enough STS digis: " << iNbDigis - << " vs " << fuTriggerMinStsDigis; - return hasTrigger; - } // if( !hasTrigger ) - } - if (fDigiMan->IsPresent(ECbmModuleId::kMuch) && fuTriggerMinMuchDigis > 0) { - Int_t iNbDigis = event->GetNofData( ECbmDataType::kMuchDigi ); - hasTrigger = hasTrigger && ( -1 != iNbDigis ) && - ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinMuchDigis ); - if( !hasTrigger ) - { - LOG( debug2 ) << "Event does not have enough MUCH digis: " << iNbDigis - << " vs " << fuTriggerMinMuchDigis; - return hasTrigger; - } // if( !hasTrigger ) - } - if (fDigiMan->IsPresent(ECbmModuleId::kTrd) && fuTriggerMinTrdDigis > 0) { - Int_t iNbDigis = event->GetNofData( ECbmDataType::kTrdDigi ); - hasTrigger = hasTrigger && ( -1 != iNbDigis ) && - ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinTrdDigis ); - if( !hasTrigger ) - { - LOG( debug2 ) << "Event does not have enough TRD digis: " << iNbDigis - << " vs " << fuTriggerMinTrdDigis; - return hasTrigger; - } // if( !hasTrigger ) - } - if (fDigiMan->IsPresent(ECbmModuleId::kTof) && fuTriggerMinTofDigis > 0) { - Int_t iNbDigis = event->GetNofData( ECbmDataType::kTofDigi ); - hasTrigger = hasTrigger && ( -1 != iNbDigis ) && - ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinTofDigis); - if( !hasTrigger ) - { - LOG( debug2 ) << "Event does not have enough TOF digis: " << iNbDigis - << " vs " << fuTriggerMinTofDigis; - return hasTrigger; - } // if( !hasTrigger ) - } - if (fDigiMan->IsPresent(ECbmModuleId::kRich) && fuTriggerMinRichDigis > 0) { - Int_t iNbDigis = event->GetNofData( ECbmDataType::kRichDigi ); - hasTrigger = hasTrigger && ( -1 != iNbDigis ) && - ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinRichDigis ); - if( !hasTrigger ) - { - LOG( debug2 ) << "Event does not have enough RICH digis: " << iNbDigis - << " vs " << fuTriggerMinRichDigis; - return hasTrigger; - } // if( !hasTrigger ) - } - if (fDigiMan->IsPresent(ECbmModuleId::kPsd) && fuTriggerMinPsdDigis > 0) { - Int_t iNbDigis = event->GetNofData( ECbmDataType::kPsdDigi ); - hasTrigger = hasTrigger && ( -1 != iNbDigis ) && - ( static_cast< UInt_t >( iNbDigis ) >= fuTriggerMinPsdDigis ); - if( !hasTrigger ) - { - LOG( debug2 ) << "Event does not have enough PSD digis: " << iNbDigis - << " vs " << fuTriggerMinPsdDigis; - return hasTrigger; - } // if( !hasTrigger ) - } + /// Check multiplicity trigger conditions + if( CheckTriggerConditions( event, ECbmModuleId::kT0, ECbmDataType::kT0Digi ) && + CheckTriggerConditions( event, ECbmModuleId::kSts, ECbmDataType::kStsDigi ) && + CheckTriggerConditions( event, ECbmModuleId::kMuch, ECbmDataType::kMuchDigi ) && + CheckTriggerConditions( event, ECbmModuleId::kTrd, ECbmDataType::kTrdDigi ) && + CheckTriggerConditions( event, ECbmModuleId::kTof, ECbmDataType::kTofDigi ) && + CheckTriggerConditions( event, ECbmModuleId::kRich, ECbmDataType::kRichDigi ) && + CheckTriggerConditions( event, ECbmModuleId::kPsd, ECbmDataType::kPsdDigi ) + ) + { + return kTRUE; + } // if all trigger conditions fullfilled + else + { + return kFALSE; + } // if at least one trigger condition failed +} - return hasTrigger; +Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::CheckTriggerConditions( CbmEvent* event, ECbmModuleId det, ECbmDataType dataType ) +{ + UInt_t uTrigMin = 0; + Int_t iTrigMax = -1; + std::string sDet = ""; + switch( det ) + { + case ECbmModuleId::kSts: + { + uTrigMin = fuTriggerMinStsDigis; + iTrigMax = fiTriggerMaxStsDigis; + sDet = "STS"; + break; + } + case ECbmModuleId::kRich: + { + uTrigMin = fuTriggerMinRichDigis; + iTrigMax = fiTriggerMaxRichDigis; + sDet = "RICH"; + break; + } + case ECbmModuleId::kMuch: + { + uTrigMin = fuTriggerMinMuchDigis; + iTrigMax = fiTriggerMaxMuchDigis; + sDet = "MUCH"; + break; + } + case ECbmModuleId::kTrd: + { + uTrigMin = fuTriggerMinTrdDigis; + iTrigMax = fiTriggerMaxTrdDigis; + sDet = "TRD"; + break; + } + case ECbmModuleId::kTof: + { + uTrigMin = fuTriggerMinTofDigis; + iTrigMax = fiTriggerMaxTofDigis; + sDet = "TOF"; + break; + } + case ECbmModuleId::kPsd: + { + uTrigMin = fuTriggerMinPsdDigis; + iTrigMax = fiTriggerMaxPsdDigis; + sDet = "PSD"; + break; + } + case ECbmModuleId::kT0: + { + uTrigMin = fuTriggerMinT0Digis; + iTrigMax = fiTriggerMaxT0Digis; + sDet = "T0"; + break; + } + default: + { + LOG( fatal ) << "CbmMcbm2019TimeWinEventBuilderAlgo::CheckTriggerConditions => " + << "Unsupported or unknow detector enum"; + break; + } + } // switch( det ) + + /// Check if both Trigger conditions disabled for this detector + if( 0 == uTrigMin && iTrigMax < 0 ) + { + return kTRUE; + } // if( 0 == uTrigMin && iTrigMax < 0 ) + + /// Check if detector present + if( ECbmModuleId::kT0 == det ) + { + /// FIXME: special case to be removed once T0 supported by DigiManager + if( !(fT0DigiVec) ) + { + LOG( warning ) << "Event does not have digis storage for T0" + << " while the following trigger minimum is defined: " + << uTrigMin; + return kFALSE; + } // if( !(fT0DigiVec) ) + } // if( ECbmDataType::kT0Digi == det ) + else + { + if( !fDigiMan->IsPresent( det ) ) + { + LOG( warning ) << "Event does not have digis storage for " << sDet + << " while the following trigger minimum is defined: " + << uTrigMin; + return kFALSE; + } // if( !fDigiMan->IsPresent( det ) ) + } // else of if( ECbmDataType::kT0Digi == det ) + + /// Check Minimal trigger acceptance by minimal number + Int_t iNbDigis = event->GetNofData( dataType ); + if( ( -1 != iNbDigis ) && + ( uTrigMin <= static_cast< UInt_t >( iNbDigis ) ) + ) + { + return kTRUE; + } // if( ( -1 != iNbDigis ) && ( uTrigMin <= static_cast< UInt_t >( iNbDigis ) ) + else + { + LOG( debug2 ) << "Event does not have enough digis: " << iNbDigis + << " vs " << uTrigMin + << " for " << sDet; + return kFALSE; + } // else of if( ( -1 != iNbDigis ) && ( uTrigMin <= static_cast< UInt_t >( iNbDigis ) ) + + /// Check trigger rejection by maximal number + if( iNbDigis < iTrigMax ) + { + return kTRUE; + } // if( iNbDigis < iTrigMax ) + else + { + LOG( debug2 ) << "Event Has too many digis: " << iNbDigis + << " vs " << iTrigMax + << " for " << sDet; + return kFALSE; + } // else of if( iNbDigis < iTrigMax ) } //---------------------------------------------------------------------- @@ -1001,6 +1060,31 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::ResetHistograms( Bool_t /*bResetTime*/ */ } //---------------------------------------------------------------------- +void CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector( ECbmModuleId refDet ) +{ + for( std::vector< ECbmModuleId >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + { + if( *det == refDet ) + { + LOG( warning ) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => Doing nothing, reference detector already in selection detector list!" + << refDet; + LOG( warning ) << " => You may want to use RemoveDetector before this command to remove it?"; + return; + } // if( *det == selDet ) + } // for( std::vector< ECbmModuleId >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + + if( fRefDet == refDet ) + { + LOG( warning ) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => Doing nothing, identical reference detector already in use"; + } // if( fRefDet == refDet ) + else + { + LOG( info ) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => Replacing " << fRefDet << " with " << refDet << " as reference detector"; + LOG( warning ) << " => You may want to use AddDetector after this command to add in selection " << fRefDet; + LOG( warning ) << " => Please also remember to update the selection windows!"; + fRefDet = refDet; + } // else of if( fRefDet == refDet ) +} void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector( ECbmModuleId selDet ) { /// FIXME: This is not true in case TOF is used as reference !!!!! @@ -1090,6 +1174,64 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMinNumber( ECbmModuleId selDe LOG( debug ) << "Set Trigger min limit for " << sDet << " to " << uVal; } +void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal ) +{ + /// Store in corresponding members + std::string sDet = ""; + switch( selDet ) + { + case ECbmModuleId::kSts: + { + fiTriggerMaxStsDigis = iVal; + sDet = "STS"; + break; + } + case ECbmModuleId::kRich: + { + fiTriggerMaxRichDigis = iVal; + sDet = "RICH"; + break; + } + case ECbmModuleId::kMuch: + { + fiTriggerMaxMuchDigis = iVal; + sDet = "MUCH"; + break; + } + case ECbmModuleId::kTrd: + { + fiTriggerMaxTrdDigis = iVal; + sDet = "TRD"; + break; + } + case ECbmModuleId::kTof: + { + fiTriggerMaxTofDigis = iVal; + sDet = "TOF"; + break; + } + case ECbmModuleId::kPsd: + { + fiTriggerMaxPsdDigis = iVal; + sDet = "PSD"; + break; + } + case ECbmModuleId::kT0: + { + fiTriggerMaxT0Digis = iVal; + sDet = "T0"; + break; + } + default: + { + LOG( fatal ) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMaxNumber => " + << "Unsupported or unknow detector enum"; + break; + } + } // switch( det ) + + LOG( debug ) << "Set Trigger nax limit for " << sDet << " to " << iVal; +} void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd ) { /// Check if valid time window: end strictly after beginning diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h index b9d5fe3fe8fe8e77acae74b55b9901ddb082464d..da70664485a4ab32c3deb4ad2e0c8a4d0d8e838c 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h @@ -59,18 +59,12 @@ class CbmMcbm2019TimeWinEventBuilderAlgo void SetFillHistos( Bool_t var ) { fbFillHistos = var; } void ResetHistograms( Bool_t bResetTime = kTRUE ); - void SetReferenceDetector( ECbmModuleId refDet ) { fRefDet = refDet; } + void SetReferenceDetector( ECbmModuleId refDet ); void AddDetector( ECbmModuleId selDet ); void RemoveDetector( ECbmModuleId selDet ); void SetTriggerMinNumber( ECbmModuleId selDet, UInt_t uVal ); - void SetTriggerMinNumberT0( UInt_t uVal ) { fuTriggerMinT0Digis = uVal;} - void SetTriggerMinNumberSts( UInt_t uVal ) { fuTriggerMinStsDigis = uVal;} - void SetTriggerMinNumberMuch( UInt_t uVal ) { fuTriggerMinMuchDigis = uVal;} - void SetTriggerMinNumberTrd( UInt_t uVal ) { fuTriggerMinTrdDigis = uVal;} - void SetTriggerMinNumberTof( UInt_t uVal ) { fuTriggerMinTofDigis = uVal;} - void SetTriggerMinNumberRich( UInt_t uVal ) { fuTriggerMinRichDigis = uVal;} - void SetTriggerMinNumberPsd( UInt_t uVal ) { fuTriggerMinPsdDigis = uVal;} + void SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal ); void SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd ); @@ -103,6 +97,7 @@ class CbmMcbm2019TimeWinEventBuilderAlgo template< class DigiCheck > void SearchMatches( Double_t dSeedTime, ECbmModuleId detMatch, UInt_t & uStartIndex ); void AddDigiToEvent( ECbmModuleId det, Int_t uIdx ); Bool_t HasTrigger(CbmEvent*); + Bool_t CheckTriggerConditions( CbmEvent* event, ECbmModuleId det, ECbmDataType dataType ); void UpdateTimeWinBoundariesExtrema(); void UpdateWidestTimeWinRange(); @@ -135,6 +130,14 @@ class CbmMcbm2019TimeWinEventBuilderAlgo UInt_t fuTriggerMinRichDigis{0}; /** Minimum number of Psd digis needed to generate a trigger, 0 means don't use Psd for trigger generation **/ UInt_t fuTriggerMinPsdDigis{0}; + /// Maximum number of digis per detector to generate an event, -1 means no cut, 0 means anti-coinc trigger + Int_t fiTriggerMaxT0Digis = -1; + Int_t fiTriggerMaxStsDigis = -1; + Int_t fiTriggerMaxMuchDigis = -1; + Int_t fiTriggerMaxTrdDigis = -1; + Int_t fiTriggerMaxTofDigis = -1; + Int_t fiTriggerMaxRichDigis = -1; + Int_t fiTriggerMaxPsdDigis = -1; /// Trigger Window Double_t fdRefTimeWinBeg = 0.0; Double_t fdT0TimeWinBeg = 0.0; diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx index 9fb0c767c9fc04da36eba5adad89104fd559614d..9f406dd74353961a6017c5d67ee60a725fcf03d3 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx @@ -172,40 +172,15 @@ void CbmMcbm2019TimeWinEventBuilderTask::RemoveDetector( ECbmModuleId selDet ) fpAlgo->RemoveDetector( selDet ); } -void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberT0( UInt_t uVal ) +void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumber( ECbmModuleId selDet, UInt_t uVal ) { if( nullptr != fpAlgo ) - fpAlgo->SetTriggerMinNumberT0( uVal ); + fpAlgo->SetTriggerMinNumber( selDet, uVal ); } -void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberSts( UInt_t uVal ) +void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal ) { if( nullptr != fpAlgo ) - fpAlgo->SetTriggerMinNumberSts( uVal ); -} -void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberMuch( UInt_t uVal ) -{ - if( nullptr != fpAlgo ) - fpAlgo->SetTriggerMinNumberMuch( uVal ); -} -void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberTrd( UInt_t uVal ) -{ - if( nullptr != fpAlgo ) - fpAlgo->SetTriggerMinNumberTrd( uVal ); -} -void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberTof( UInt_t uVal ) -{ - if( nullptr != fpAlgo ) - fpAlgo->SetTriggerMinNumberTof( uVal ); -} -void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberRich( UInt_t uVal ) -{ - if( nullptr != fpAlgo ) - fpAlgo->SetTriggerMinNumberRich( uVal ); -} -void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumberPsd( UInt_t uVal ) -{ - if( nullptr != fpAlgo ) - fpAlgo->SetTriggerMinNumberPsd( uVal ); + fpAlgo->SetTriggerMaxNumber( selDet, iVal ); } void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd ) diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h index c2b6b98170ca16dd578349d8eaf0f56ffb245ae3..c7f10a36cd8f58bdd86963ddca7cb323be723f8f 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h @@ -67,13 +67,8 @@ class CbmMcbm2019TimeWinEventBuilderTask : public FairTask void AddDetector( ECbmModuleId selDet ); void RemoveDetector( ECbmModuleId selDet ); - void SetTriggerMinNumberT0( UInt_t uVal ); - void SetTriggerMinNumberSts( UInt_t uVal ); - void SetTriggerMinNumberMuch( UInt_t uVal ); - void SetTriggerMinNumberTrd( UInt_t uVal ); - void SetTriggerMinNumberTof( UInt_t uVal ); - void SetTriggerMinNumberRich( UInt_t uVal ); - void SetTriggerMinNumberPsd( UInt_t uVal ); + void SetTriggerMinNumber( ECbmModuleId selDet, UInt_t uVal ); + void SetTriggerMaxNumber( ECbmModuleId selDet, Int_t iVal ); void SetTriggerWindow( ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd ); diff --git a/macro/beamtime/mcbm2020/build_event_win.C b/macro/beamtime/mcbm2020/build_event_win.C index f7bf55c9eafc771332a31b0fa2ec29f4c6b7b9fb..ec90bbae4318eba136037fa2667f0c08894b174f 100644 --- a/macro/beamtime/mcbm2020/build_event_win.C +++ b/macro/beamtime/mcbm2020/build_event_win.C @@ -61,13 +61,13 @@ void build_event_win( UInt_t uRunId = 0, Int_t nEvents = 0, TString outDir="data eventBuilder->SetTriggerWindow( ECbmModuleId::kRich, -150, 20 ); eventBuilder->SetTriggerWindow( ECbmModuleId::kPsd, -50, 10 ); // eventBuilder->SetT0PulserTotLimits( 185, 191 ); - eventBuilder->SetTriggerMinNumberT0(1); - eventBuilder->SetTriggerMinNumberSts(0); - eventBuilder->SetTriggerMinNumberMuch(0); - eventBuilder->SetTriggerMinNumberTrd(0); - eventBuilder->SetTriggerMinNumberTof(10); - eventBuilder->SetTriggerMinNumberRich(0); - eventBuilder->SetTriggerMinNumberPsd(0); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kT0, 1 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kSts, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kMuch, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTrd, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTof, 10 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kRich, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kPsd, 0 ); if( 0 < uRunId ) eventBuilder->SetOutFilename( Form( "%sHistosEvtWin_%03u.root", outDir.Data(), uRunId ) ); diff --git a/macro/beamtime/mcbm2020/build_event_win_kronos.C b/macro/beamtime/mcbm2020/build_event_win_kronos.C index 1b436c4082ab7f309ec32027f8e46210bb6ed9fb..34f113fa57c159c19119173d4a374fc87cd1fd63 100644 --- a/macro/beamtime/mcbm2020/build_event_win_kronos.C +++ b/macro/beamtime/mcbm2020/build_event_win_kronos.C @@ -88,13 +88,13 @@ void build_event_win_kronos( UInt_t uRunIdx = 0, Int_t nEvents = 0, TString outD eventBuilder->SetTriggerWindow( ECbmModuleId::kRich, -150, 20 ); eventBuilder->SetTriggerWindow( ECbmModuleId::kPsd, -50, 10 ); // eventBuilder->SetT0PulserTotLimits( 185, 191 ); - eventBuilder->SetTriggerMinNumberT0(1); - eventBuilder->SetTriggerMinNumberSts(0); - eventBuilder->SetTriggerMinNumberMuch(0); - eventBuilder->SetTriggerMinNumberTrd(0); - eventBuilder->SetTriggerMinNumberTof(10); - eventBuilder->SetTriggerMinNumberRich(0); - eventBuilder->SetTriggerMinNumberPsd(0); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kT0, 1 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kSts, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kMuch, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTrd, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kTof, 10 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kRich, 0 ); + eventBuilder->SetTriggerMinNumber( ECbmModuleId::kPsd, 0 ); if( 0 < uRunId ) eventBuilder->SetOutFilename( Form( "%sHistosEvtWin_%03u.root", outDir.Data(), uRunId ) );