#if !defined(__CINT__) || defined(__MAKECINT__)
// ROOT includes
#include "Riostream.h"
#include "TString.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "THashList.h"
#include "TArrayI.h"
#include "TMath.h"
// STEER includes
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#include "AliTriggerConfiguration.h"
#include "AliTriggerInput.h"
#endif
/// This macro reads the CTP configuration in the OCDB
/// and returns the trigger inputs for the requested run list.
/// The output is in a format that suits the AliMuonEventCuts class
///
/// The file with the input run list must contain one run number per line
/// If the user is interested only in a subset of inputs,
/// he/she can specify them in selectedInputs, separated by commas
/// e.g "0MSL,0MSH,0MUL,0MLL"
///
/// author: Diego Stocco, Subatech, Nantes
void TriggerInputsForMuonEventCuts ( TString runListFilename, TString selectedInputs="", TString defaultStorage = "raw://" )
{
AliCDBManager::Instance()->SetDefaultStorage(defaultStorage.Data());
TObjArray inputsList;
inputsList.SetOwner();
TObjArray* selectedInputsList = selectedInputs.Tokenize(",");
// Read input run list
ifstream inFile(runListFilename.Data());
TString srun = "";
if ( inFile.is_open() ) {
while ( ! inFile.eof() ) {
srun.ReadLine(inFile,kFALSE);
if ( ! srun.IsDigit() ) continue;
// For each run, read trigger inputs from OCDB
Int_t runNumber = srun.Atoi();
AliCDBManager::Instance()->SetRun(runNumber);
// Get trigger class configuration
AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Config");
if ( ! entry ) continue;
THashList* runInputs = new THashList();
runInputs->SetOwner();
runInputs->SetUniqueID((UInt_t)runNumber);
AliTriggerConfiguration* trigConf = (AliTriggerConfiguration*)entry->GetObject();
const TObjArray& trigInputsArray = trigConf->GetInputs();
AliTriggerInput* trigInput = 0x0;
TIter next(&trigInputsArray);
while ( ( trigInput = static_cast<AliTriggerInput*>(next()) ) ) {
if ( selectedInputsList->GetEntriesFast() > 0 && ! selectedInputsList->FindObject(trigInput->GetName()) ) continue;
Int_t inputId = (Int_t)TMath::Log2(trigInput->GetMask());
TObjString* currInput = new TObjString(trigInput->GetName());
currInput->SetUniqueID(inputId);
runInputs->Add(currInput);
}
inputsList.Add(runInputs);
}
inFile.close();
}
delete selectedInputsList;
// Loop on the trigger inputs
// and group runs with an equal list of inputs
Int_t nentries = inputsList.GetEntries();
TArrayI checkMask(nentries);
checkMask.Reset(1);
for ( Int_t irun=0; irun<nentries; irun++ ) {
if ( checkMask[irun] == 0 ) continue;
THashList* currList = static_cast<THashList*>(inputsList.At(irun));
TString runRange = Form("Run range: %u", currList->GetUniqueID());
for ( Int_t jrun=irun+1; jrun<nentries; jrun++ ) {
if ( checkMask[jrun] == 0 ) continue;
THashList* checkList = static_cast<THashList*>(inputsList.At(jrun));
Bool_t isDifferent = kFALSE;
for ( Int_t itrig=0; itrig<currList->GetEntries(); itrig++ ) {
TObjString* currInput = static_cast<TObjString*>(currList->At(itrig));
TObject* checkInput = checkList->FindObject(currInput->GetName());
if ( ! checkInput || checkInput->GetUniqueID() != currInput->GetUniqueID() ) {
isDifferent = kTRUE;
break;
}
} // loop on trigger inputs
if ( isDifferent ) continue;
checkMask[jrun] = 0;
runRange += Form(",%u", checkList->GetUniqueID());
} // loop on runs
TString outString = "\nSetTrigInputsMap(\"";
for ( Int_t itrig=0; itrig<currList->GetEntries(); itrig++ ) {
TObjString* currInput = static_cast<TObjString*>(currList->At(itrig));
outString += Form("%s:%u,",currInput->GetString().Data(), currInput->GetUniqueID());
}
outString.Append("\");\n");
outString.ReplaceAll(",\"","\"");
outString += runRange;
printf("%s\n", outString.Data());
} // loop on runs
}
TriggerInputsForMuonEventCuts.C:1 TriggerInputsForMuonEventCuts.C:2 TriggerInputsForMuonEventCuts.C:3 TriggerInputsForMuonEventCuts.C:4 TriggerInputsForMuonEventCuts.C:5 TriggerInputsForMuonEventCuts.C:6 TriggerInputsForMuonEventCuts.C:7 TriggerInputsForMuonEventCuts.C:8 TriggerInputsForMuonEventCuts.C:9 TriggerInputsForMuonEventCuts.C:10 TriggerInputsForMuonEventCuts.C:11 TriggerInputsForMuonEventCuts.C:12 TriggerInputsForMuonEventCuts.C:13 TriggerInputsForMuonEventCuts.C:14 TriggerInputsForMuonEventCuts.C:15 TriggerInputsForMuonEventCuts.C:16 TriggerInputsForMuonEventCuts.C:17 TriggerInputsForMuonEventCuts.C:18 TriggerInputsForMuonEventCuts.C:19 TriggerInputsForMuonEventCuts.C:20 TriggerInputsForMuonEventCuts.C:21 TriggerInputsForMuonEventCuts.C:22 TriggerInputsForMuonEventCuts.C:23 TriggerInputsForMuonEventCuts.C:24 TriggerInputsForMuonEventCuts.C:25 TriggerInputsForMuonEventCuts.C:26 TriggerInputsForMuonEventCuts.C:27 TriggerInputsForMuonEventCuts.C:28 TriggerInputsForMuonEventCuts.C:29 TriggerInputsForMuonEventCuts.C:30 TriggerInputsForMuonEventCuts.C:31 TriggerInputsForMuonEventCuts.C:32 TriggerInputsForMuonEventCuts.C:33 TriggerInputsForMuonEventCuts.C:34 TriggerInputsForMuonEventCuts.C:35 TriggerInputsForMuonEventCuts.C:36 TriggerInputsForMuonEventCuts.C:37 TriggerInputsForMuonEventCuts.C:38 TriggerInputsForMuonEventCuts.C:39 TriggerInputsForMuonEventCuts.C:40 TriggerInputsForMuonEventCuts.C:41 TriggerInputsForMuonEventCuts.C:42 TriggerInputsForMuonEventCuts.C:43 TriggerInputsForMuonEventCuts.C:44 TriggerInputsForMuonEventCuts.C:45 TriggerInputsForMuonEventCuts.C:46 TriggerInputsForMuonEventCuts.C:47 TriggerInputsForMuonEventCuts.C:48 TriggerInputsForMuonEventCuts.C:49 TriggerInputsForMuonEventCuts.C:50 TriggerInputsForMuonEventCuts.C:51 TriggerInputsForMuonEventCuts.C:52 TriggerInputsForMuonEventCuts.C:53 TriggerInputsForMuonEventCuts.C:54 TriggerInputsForMuonEventCuts.C:55 TriggerInputsForMuonEventCuts.C:56 TriggerInputsForMuonEventCuts.C:57 TriggerInputsForMuonEventCuts.C:58 TriggerInputsForMuonEventCuts.C:59 TriggerInputsForMuonEventCuts.C:60 TriggerInputsForMuonEventCuts.C:61 TriggerInputsForMuonEventCuts.C:62 TriggerInputsForMuonEventCuts.C:63 TriggerInputsForMuonEventCuts.C:64 TriggerInputsForMuonEventCuts.C:65 TriggerInputsForMuonEventCuts.C:66 TriggerInputsForMuonEventCuts.C:67 TriggerInputsForMuonEventCuts.C:68 TriggerInputsForMuonEventCuts.C:69 TriggerInputsForMuonEventCuts.C:70 TriggerInputsForMuonEventCuts.C:71 TriggerInputsForMuonEventCuts.C:72 TriggerInputsForMuonEventCuts.C:73 TriggerInputsForMuonEventCuts.C:74 TriggerInputsForMuonEventCuts.C:75 TriggerInputsForMuonEventCuts.C:76 TriggerInputsForMuonEventCuts.C:77 TriggerInputsForMuonEventCuts.C:78 TriggerInputsForMuonEventCuts.C:79 TriggerInputsForMuonEventCuts.C:80 TriggerInputsForMuonEventCuts.C:81 TriggerInputsForMuonEventCuts.C:82 TriggerInputsForMuonEventCuts.C:83 TriggerInputsForMuonEventCuts.C:84 TriggerInputsForMuonEventCuts.C:85 TriggerInputsForMuonEventCuts.C:86 TriggerInputsForMuonEventCuts.C:87 TriggerInputsForMuonEventCuts.C:88 TriggerInputsForMuonEventCuts.C:89 TriggerInputsForMuonEventCuts.C:90 TriggerInputsForMuonEventCuts.C:91 TriggerInputsForMuonEventCuts.C:92 TriggerInputsForMuonEventCuts.C:93 TriggerInputsForMuonEventCuts.C:94 TriggerInputsForMuonEventCuts.C:95 TriggerInputsForMuonEventCuts.C:96 TriggerInputsForMuonEventCuts.C:97 TriggerInputsForMuonEventCuts.C:98 TriggerInputsForMuonEventCuts.C:99 TriggerInputsForMuonEventCuts.C:100 TriggerInputsForMuonEventCuts.C:101 TriggerInputsForMuonEventCuts.C:102 TriggerInputsForMuonEventCuts.C:103 TriggerInputsForMuonEventCuts.C:104 TriggerInputsForMuonEventCuts.C:105 TriggerInputsForMuonEventCuts.C:106 TriggerInputsForMuonEventCuts.C:107 TriggerInputsForMuonEventCuts.C:108 TriggerInputsForMuonEventCuts.C:109 TriggerInputsForMuonEventCuts.C:110 TriggerInputsForMuonEventCuts.C:111