//========================================== // // TrigSummaryMaker -- filter module for selecting events by Trigger // // Authors: LSK modified from Prereq(Kevin McFarland, Kirsten Tollefson) // //========================================== #include "Level3Mods/TrigSummaryMaker.hh" #include "Level3Mods/TriggerMap.hh" #include "Level3Objects/TriggerSummary.hh" #include "Edm/EventRecord.hh" #include "Edm/Handle.hh" #include "Edm/ConstHandle.hh" #include "AbsEnv/AbsEnv.hh" TrigSummaryMaker::TrigSummaryMaker( const char* const theName, const char* const theDescription ) : AppModule( theName, theDescription ), _databaseTriggerMap( 0 ), _GetL1TriggerBitsFromTFRD("GetL1TriggerBitsFromTFRD",this,true), _GetL1TriggerBitsFromTL2D("GetL1TriggerBitsFromTL2D",this,false), _GetL3TriggerBitsFromTL3D("GetL3TriggerBitsFromTL3D",this,true), _UseUnprescaledBits("UseUnprescaledBits",this,false), _databaseForTrigger("databaseForTrigger",this,"ofotl_prd_read") { // Define parameters for talk-to // ----------------------------- _GetL1TriggerBitsFromTFRD.addDescription( "\tGet Level-1 Trigger Bits from TFRD Bank (default true)"); _GetL1TriggerBitsFromTL2D.addDescription( "\tGet Level-1 Trigger Bits from TL2D Bank (default false)"); _GetL3TriggerBitsFromTL3D.addDescription( "\tGet Level-3 Trigger Bits from TL3D Bank instead of Level3ModuleResults object (default true -- for now)"); _UseUnprescaledBits.addDescription( "\tUse L1 trigger bits from FRED before prescale \n\t\t(default for seeded triggering is false; \n\t\t setting true is meaningless without setting GetL1TriggerBitsFromTFRD also)"); commands()->append(&_GetL1TriggerBitsFromTFRD); commands()->append(&_GetL1TriggerBitsFromTL2D); commands()->append(&_GetL3TriggerBitsFromTL3D); commands()->append(&_UseUnprescaledBits); commands()->append(&_databaseForTrigger); } TrigSummaryMaker::~TrigSummaryMaker() { delete _databaseTriggerMap; } AppResult TrigSummaryMaker::beginJob( AbsEvent* aJob ) { // Initialize the trigger source _triggerSource.L1 = RawTriggerQuery::noSource; _triggerSource.L2 = RawTriggerQuery::noSource; _triggerSource.L3 = RawTriggerQuery::noSource; if ( _GetL1TriggerBitsFromTFRD.value()){ if ( _UseUnprescaledBits.value()) _triggerSource.L1=RawTriggerQuery::fromTFRDunprescaled; else _triggerSource.L1=RawTriggerQuery::fromTFRD; } else if ( _GetL1TriggerBitsFromTL2D.value()) _triggerSource.L1=RawTriggerQuery::fromTL2D; _triggerSource.L2=RawTriggerQuery::fromTL2D; // Some day we may query the database for all trigger ID's here... return AppResult::OK; } AppResult TrigSummaryMaker::beginRun( AbsEvent* aRun ) { // Get rid of the one from the last run delete _databaseTriggerMap; // (this database access code takes some time) _databaseTriggerMap = new TriggerMap(_databaseForTrigger.value()); return AppResult::OK; } AppResult TrigSummaryMaker::event( AbsEvent* anEvent ) { // // Now Examine Trigger Masks // int4 L1TrigMask[L1_BITMASK_WORDS*BITMASK_BITS/8/sizeof(int4)]; for (int iw=0; iw hTS (new TriggerSummary); // Now push back the id's of the passed triggers for (int ibit = 0; ibit < L1_BITMASK_WORDS*BITMASK_BITS; ibit++) { if (L1TrigMask[ibit/(sizeof(int4)*8)] & static_cast(1<<(ibit%(sizeof(int4)*8))) ) { // This bit is set get it's ID and store in TriggerSummary object int id = _databaseTriggerMap->getId(ibit, 1); hTS->push_back(id); } } for (int ibit = 0; ibit < L2_BITMASK_WORDS*BITMASK_BITS; ibit++) { if (L2TrigMask[ibit/(sizeof(int4)*8)] & static_cast(1<<(ibit%(sizeof(int4)*8))) ) { // This bit is set get it's ID and store in TriggerSummary object int id = _databaseTriggerMap->getId(ibit, 2); hTS->push_back(id); } } ConstHandle chTS = anEvent->append(hTS); } else { errlog(ELsevere,"Err:1") << "@SUB=event" << "Failed to make TriggerSummary object;" << "input data not avaiable in the event." << endmsg; } return AppResult::OK; } AppModule* TrigSummaryMaker::clone(const char* cloneName) { return new TrigSummaryMaker(cloneName,"this module is a clone of TrigSummaryMaker"); }