#ifndef ATLAS_AtlTriggerConf
#include <AtlTriggerConf.h>
#endif
#include <THashTable.h>
#include <TDirectory.h>
#include <TClonesArray.h>
#include <iostream>
using namespace std;
#ifndef __CINT__
ClassImp(AtlTriggerConf);
#endif
AtlTriggerConf *AtlTriggerConf::fgInstance = 0;
const Int_t AtlTriggerConf::fgL1MaxBits = 256;
const Int_t AtlTriggerConf::fgHLTMaxBits = 512;
const char* AtlTriggerConf::fgTreeName = "t_trig_config";
const char* AtlTriggerConf::fgTreeTitle = "Trigger Configuration Dbase";
AtlTriggerConf::AtlTriggerConf() {
if ( fgInstance != 0 ) {
Error("AtlTriggerConf", "Multiple instances of this object not allowed. Use AtlTriggerConf::Instance() instead!");
gSystem->Abort(0);
}
fgInstance = this;
fL1TriggerItemsCA = new TClonesArray("AtlTriggerConfItem", fgL1MaxBits);
fHLTTriggerItemsCA = new TClonesArray("AtlTriggerConfItem", fgHLTMaxBits);
fL1TriggerItemsHT = new THashTable(fgL1MaxBits);
fHLTTriggerItemsHT = new THashTable(fgHLTMaxBits);
fRunStart = 0;
fRunEnd = 0;
fConfigTree = 0;
fN_L1TriggerItems = 0;
fN_HLTTriggerItems = 0;
}
AtlTriggerConf::~AtlTriggerConf() {
if ( fL1TriggerItemsCA != 0 ) {
fL1TriggerItemsCA->Delete();
delete fL1TriggerItemsCA;
}
if ( fHLTTriggerItemsCA != 0 ) {
fHLTTriggerItemsCA->Delete();
delete fHLTTriggerItemsCA;
}
if ( fL1TriggerItemsHT != 0 ) {
fL1TriggerItemsHT->Delete();
delete fL1TriggerItemsHT;
}
if ( fHLTTriggerItemsHT != 0 ) {
fHLTTriggerItemsHT->Delete();
delete fHLTTriggerItemsHT;
}
if ( fConfigTree != 0 ) delete fConfigTree;
fgInstance = 0;
}
AtlTriggerConf* AtlTriggerConf::Instance() {
return ( fgInstance != 0 ) ? fgInstance : new AtlTriggerConf();
}
void AtlTriggerConf::Clear(Option_t *option) {
fL1TriggerItemsHT->Clear();
fHLTTriggerItemsHT->Clear();
fL1TriggerItemsCA->Clear("C");
fHLTTriggerItemsCA->Clear("C");
fN_L1TriggerItems = 0;
fN_HLTTriggerItems = 0;
}
AtlTriggerConf* AtlTriggerConf::LoadTree(TDirectory *dir) {
fConfigTree = (TTree*)dir->Get(fgTreeName);
if ( fConfigTree == 0 ) {
Error("LoadTree",
"Trigger configuration tree \"%s\" not found in directory \"%s\".",
fgTreeName, dir->GetName());
return 0;
}
fConfigTree->SetBranchAddress("L1TriggerItems", &fL1TriggerItemsCA);
fConfigTree->SetBranchAddress("HLTTriggerItems", &fHLTTriggerItemsCA);
fConfigTree->SetBranchAddress("N_L1TriggerItems", &fN_L1TriggerItems);
fConfigTree->SetBranchAddress("N_HLTTriggerItems", &fN_HLTTriggerItems);
fConfigTree->SetBranchAddress("RunRangeStart", &fRunStart);
fConfigTree->SetBranchAddress("RunRangeEnd", &fRunEnd);
fRunStart = 0; fRunEnd = 0;
Info("LoadTree",
"Trigger configuration tree \"%s\" successfully loaded from directory \"%s\".",
fgTreeName, dir->GetName());
fgInstance->Print("LIST");
fConfigTree->GetEntry(0);
ReadConfiguration(fRunStart);
return fgInstance;
}
TTree* AtlTriggerConf::CreateTree() {
fConfigTree = new TTree(fgTreeName, fgTreeTitle);
fConfigTree->Branch("L1TriggerItems", "TClonesArray", &fL1TriggerItemsCA);
fConfigTree->Branch("HLTTriggerItems", "TClonesArray", &fHLTTriggerItemsCA);
fConfigTree->Branch("N_L1TriggerItems", &fN_L1TriggerItems, "N_L1TriggerItems/I");
fConfigTree->Branch("N_HLTTriggerItems", &fN_HLTTriggerItems, "N_HLTTriggerItems/I");
fConfigTree->Branch("RunRangeStart", &fRunStart, "RunRangeStart/I");
fConfigTree->Branch("RunRangeEnd", &fRunEnd, "RunRangeEnd/I");
return fConfigTree;
}
AtlTriggerConfItem* AtlTriggerConf::GetTriggerItem(ETrigger trigger,
const char* name,
Int_t RunNr) {
if ( RunNr < fRunStart || RunNr > fRunEnd )
ReadConfiguration(RunNr);
return GetTriggerItem(trigger, name);
}
AtlTriggerConfItem* AtlTriggerConf::GetTriggerItem(ETrigger trigger,
const char* name,
Bool_t CheckValidity) {
AtlTriggerConfItem *item = (AtlTriggerConfItem*)GetTriggerItemsHT(trigger)
->FindObject(name);
if ( CheckValidity && item == 0 ) {
if ( trigger == kL1 ) {
Error("GetTriggerItem", "Trigger item %s not found in L1 list", name);
} else if ( trigger == kHLT ) {
Error("GetTriggerItem", "Trigger item %s not found in HLT list", name);
}
gSystem->Abort(0);
}
return item;
}
AtlTriggerConfItem* AtlTriggerConf::AddTriggerItem(ETrigger trigger,
const char* name,
const char* title,
Int_t bit) {
TClonesArray &items = *GetTriggerItemsCA(trigger);
Int_t NItems = GetN_TriggerItems(trigger);
AtlTriggerConfItem *item = new(items[NItems])
AtlTriggerConfItem(name, title, bit);
SetN_TriggerItems(trigger, NItems+1);
return item;
}
void AtlTriggerConf::ReadConfiguration(Int_t RunNr) {
Clear();
if ( fConfigTree == 0 ) {
Error("ReadConfiguration", "No configuration tree loaded. Abort!");
gSystem->Abort(0);
}
for ( Int_t i = 0; i < fConfigTree->GetEntries(); i++ ) {
fConfigTree->GetEntry(i);
if ( (RunNr >= fRunStart) && (RunNr <= fRunEnd) ) {
fL1TriggerItemsHT->AddAll(fL1TriggerItemsCA);
fHLTTriggerItemsHT->AddAll(fHLTTriggerItemsCA);
cout << "<AtlTriggerConf::ReadConfiguration> Read trigger config for run range "
<< fRunStart << " -> " << fRunEnd << " from dbase." << endl;
return;
}
}
Error("ReadConfiguration",
"Could not find a valid configuration for run %d. Abort!",
RunNr);
gSystem->Abort(0);
}
void AtlTriggerConf::WriteConfiguration() {
Info("WriteConfiguration", "Write trigger config to dbase for run range %d -> %d .",
fRunStart, fRunEnd);
fConfigTree->Fill();
}
void AtlTriggerConf::Rehash() {
fL1TriggerItemsHT->Clear();
fHLTTriggerItemsHT->Clear();
fL1TriggerItemsHT->AddAll(fL1TriggerItemsCA);
fHLTTriggerItemsHT->AddAll(fHLTTriggerItemsCA);
}
void AtlTriggerConf::Print(Option_t *option) {
TString opt = option;
opt.ToUpper();
if ( opt.Contains("ALL") || opt.Contains("CUR") ) {
cout << endl
<< "====================================================" << endl
<< " Trigger Configuration (current)" << endl
<< "====================================================" << endl
<< "Valid run range: Run " << fRunStart << " -> Run " << fRunEnd
<< endl
<< endl
<< "Level 1 Trigger (" << fN_L1TriggerItems << " items)" << endl
<< "-----------------------------------------------------" << endl;
for ( Int_t i = 0; i < fN_L1TriggerItems; i++ )
((AtlTriggerConfItem*)fL1TriggerItemsCA->At(i))->Print();
cout << "-----------------------------------------------------" << endl
<< endl
<< "Higher Level Trigger (" << fN_HLTTriggerItems << " items)" << endl
<< "-----------------------------------------------------" << endl;
for ( Int_t i = 0; i < fN_HLTTriggerItems; i++ )
((AtlTriggerConfItem*)fHLTTriggerItemsCA->At(i))->Print();
cout << "-----------------------------------------------------" << endl
<< "End of trigger configuration for run range "
<< fRunStart << " -> " << fRunEnd << endl
<< endl;
}
if ( opt.Contains("ALL") || opt.Contains("LIST") ) {
if ( fConfigTree == 0 ) {
Error("Print", "No configuration tree loaded. Abort!");
gSystem->Abort(0);
}
Int_t RunStart = fRunStart;
cout << endl
<< "==============================================" << endl
<< " List of Trigger Configurations" << endl
<< "==============================================" << endl
<< endl
<< " # Run Range #L1_Items #HLT_Items" << endl
<< "----------------------------------------------" << endl;
for ( Int_t i = 0; i < fConfigTree->GetEntries(); i++ ) {
fConfigTree->GetEntry(i);
cout.width(4); cout << i+1;
cout << " ";
cout.width(6); cout << fRunStart;
cout << " -> ";
cout.width(6); cout << fRunEnd;
cout << " ";
cout.width(9); cout << fN_L1TriggerItems; cout << " ";
cout.width(9); cout << fN_HLTTriggerItems; cout << endl;
}
cout << "----------------------------------------------"
<< endl << endl;
if ( RunStart != 0 ) ReadConfiguration(RunStart);
}
}
TClonesArray* AtlTriggerConf::GetTriggerItemsCA(ETrigger trigger) const {
switch ( trigger ) {
case kL1:
return fL1TriggerItemsCA;
case kHLT:
return fHLTTriggerItemsCA;
}
return 0;
}
THashTable* AtlTriggerConf::GetTriggerItemsHT(ETrigger trigger) const {
switch ( trigger ) {
case kL1:
return fL1TriggerItemsHT;
case kHLT:
return fHLTTriggerItemsHT;
}
return 0;
}
Int_t AtlTriggerConf::GetN_TriggerItems(ETrigger trigger, Int_t RunNr) {
if ( RunNr < fRunStart || RunNr > fRunEnd )
ReadConfiguration(RunNr);
return GetN_TriggerItems(trigger);
}
Int_t AtlTriggerConf::GetN_TriggerItems(ETrigger trigger) const {
switch ( trigger ) {
case kL1:
return fN_L1TriggerItems;
case kHLT:
return fN_HLTTriggerItems;
}
return 0;
}
void AtlTriggerConf::SetN_TriggerItems(ETrigger trigger,
Int_t NItems) {
switch ( trigger ) {
case kL1:
fN_L1TriggerItems = NItems; break;
case kHLT:
fN_HLTTriggerItems = NItems; break;
}
}
const char* AtlTriggerConf::GetL1ItemName(Int_t Bit, Int_t RunNr) {
if ( RunNr < fRunStart || RunNr > fRunEnd )
ReadConfiguration(RunNr);
return GetL1ItemName(Bit);
}
const char* AtlTriggerConf::GetHLTItemName(Int_t Bit, Int_t RunNr) {
if ( RunNr < fRunStart || RunNr > fRunEnd )
ReadConfiguration(RunNr);
return GetHLTItemName(Bit);
}
const char* AtlTriggerConf::GetL1ItemName(Int_t Bit) {
return ((AtlTriggerConfItem*)fL1TriggerItemsCA->At(Bit))->GetName();
}
const char* AtlTriggerConf::GetHLTItemName(Int_t Bit) {
return ((AtlTriggerConfItem*)fHLTTriggerItemsCA->At(Bit))->GetName();
}