--- /dev/null
+//-------------------------------------------------------------------------
+// OADB container for filling scheme information (BX ids, name ...)
+// Author: Michele Floris, CERN
+//-------------------------------------------------------------------------
+
+#include "AliOADBFillingScheme.h"
+#include "TMap.h"
+#include "AliLog.h"
+#include "TBrowser.h"
+#include "TFolder.h"
+#include <iostream>
+
+using namespace std;
+
+ClassImp(AliOADBFillingScheme)
+
+
+AliOADBFillingScheme::AliOADBFillingScheme() : TNamed("AliOADBFillingScheme", "OADB object storing filling scheme infos"), fFSName(""), fBXIds(0){
+ // default ctor
+
+
+}
+AliOADBFillingScheme::AliOADBFillingScheme(char* name) : TNamed(name, "OADB object storing filling scheme infos"), fFSName(""), fBXIds(0){
+ // ctor
+ Init();
+}
+
+void AliOADBFillingScheme::Init() {
+ // initialize pointers
+ fBXIds = new TMap();
+ fFSName = "";
+
+}
+
+AliOADBFillingScheme::~AliOADBFillingScheme(){
+ // dtor
+
+ if(fBXIds) delete fBXIds;
+
+}
+
+AliOADBFillingScheme::AliOADBFillingScheme(const AliOADBFillingScheme& cont) {
+ // Copy ctor
+ AliError("To be implemented");
+}
+
+AliOADBFillingScheme& AliOADBFillingScheme::operator=(const AliOADBFillingScheme& cont) {
+ //Assignment operator
+ AliError("To be implemented");
+}
+
+// Getters
+
+const char * AliOADBFillingScheme::GetBXIDs(const char * beamSide) const
+{
+ // Returns the bunch crossing numbers for the different beam classes. By default this is empty
+
+ if (!strcmp(beamSide, "AC")) {
+
+ TString bxa = ((TObjString*)fBXIds->GetValue("A"))->String();
+ TString bxc = ((TObjString*)fBXIds->GetValue("C"))->String();
+ if(!bxa && !bxc) return "";
+ if(!bxc) return bxa.Data();
+ if(!bxa) return bxa.Data();
+ TString bxBoth = bxa.Data();
+ bxBoth += bxc.Data();
+ return bxBoth.Data();
+
+ }
+
+ TString bx = ((TObjString*)fBXIds->GetValue(beamSide))->String();
+ if(!bx) return "";
+ return bx.Data();
+
+}
+
+void AliOADBFillingScheme::Browse(TBrowser *b)
+{
+ // Browse this object.
+ // If b=0, there is no Browse call TObject::Browse(0) instead.
+ // This means TObject::Inspect() will be invoked indirectly
+
+
+ if (b) {
+ // Creates a folder for each beam type containing the list of corresponding bx ids
+ b->Add(new TObjString(Form("Filling Scheme %s",GetFillingSchemeName())));
+ TIterator * mapIter = fBXIds->MakeIterator();
+ TObjString * key = 0;
+ while ((key = (TObjString*) mapIter->Next())) {
+ TFolder * folder = new TFolder(key->String().Data(), "beam side");
+ TObjString * value = (TObjString*) fBXIds->GetValue(key);
+ TObjArray * tokens = value->String().Tokenize(" ");
+ TIterator * tokIter = tokens->MakeIterator();
+ TObjString * bxNum = 0;
+ while ((bxNum = (TObjString*) tokIter->Next())){
+ folder->Add(bxNum);
+ }
+ b->Add(folder);
+ delete tokIter;
+ }
+ delete mapIter;
+ }
+ else
+ TObject::Browse(b);
+}
+
+void AliOADBFillingScheme::Print(Option_t* option) const {
+ // Print Class contents
+ // Option is passed to TMap::Print
+ cout << "Filling scheme Name " << fFSName.Data() << endl;
+ fBXIds->Print(option);
+}
--- /dev/null
+#include "AliOADBPhysicsSelection.h"
+#include "TList.h"
+#include "TString.h"
+#include "TObjString.h"
+#include "AliLog.h"
+#include "TBrowser.h"
+#include "TFolder.h"
+#include "TIterator.h"
+#include <iostream>
+
+using namespace std;
+
+ClassImp(AliOADBPhysicsSelection)
+
+
+AliOADBPhysicsSelection::AliOADBPhysicsSelection() :
+TNamed("AliOADBPhysicsSelection", "OADB object for the physics selection"), fNtriggerBits(NTRIGGERBITS), fNtriggerLogics(NTRIGGERLOGICS),fCollTrigClasses(0),fBGTrigClasses(0),fHardwareTrigger(0),fOfflineTrigger(0),fBeamSide(0)
+{
+ // default ctor
+
+}
+AliOADBPhysicsSelection::AliOADBPhysicsSelection(char* name) :
+ TNamed(name, "OADB object for the physics selection"), fNtriggerBits(NTRIGGERBITS), fNtriggerLogics(NTRIGGERLOGICS),fCollTrigClasses(0),fBGTrigClasses(0),fHardwareTrigger(0),fOfflineTrigger(0),fBeamSide(0)
+{
+ // ctor, better use this one
+ Init();
+}
+
+void AliOADBPhysicsSelection::Init() {
+ //Initialization of pointers
+
+ if(fCollTrigClasses) {
+ AliInfo("Already initialized");
+ return;
+ }
+
+ fNtriggerBits = NTRIGGERBITS;
+ fCollTrigClasses = new TList*[fNtriggerBits];
+ fBGTrigClasses = new TList*[fNtriggerBits];
+ fHardwareTrigger = new TObjString[fNtriggerLogics];
+ fOfflineTrigger = new TObjString[fNtriggerLogics];
+ fBeamSide = new TMap;
+ for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
+ fCollTrigClasses[ibit] = new TList;
+ fBGTrigClasses [ibit] = new TList;
+ }
+ for(UInt_t ilogic = 0; ilogic < fNtriggerLogics; ilogic++){
+ fHardwareTrigger[ilogic] = "";
+ fOfflineTrigger [ilogic] = "";
+ }
+
+
+}
+
+AliOADBPhysicsSelection::~AliOADBPhysicsSelection(){
+ // dtor
+
+ if(fHardwareTrigger) delete [] fHardwareTrigger;
+ if(fOfflineTrigger) delete [] fOfflineTrigger ;
+
+ for(Int_t ibit = 0; ibit < NTRIGGERBITS; ibit++){
+
+ if(fCollTrigClasses)
+ if(fCollTrigClasses[ibit]) delete fCollTrigClasses[ibit];
+ if(fBGTrigClasses)
+ if(fBGTrigClasses [ibit]) delete fBGTrigClasses [ibit];
+ }
+
+}
+
+AliOADBPhysicsSelection::AliOADBPhysicsSelection(const AliOADBPhysicsSelection& cont) :TNamed("AliOADBPhysicsSelection", "OADB object for the physics selection"), fNtriggerBits(NTRIGGERBITS), fNtriggerLogics(NTRIGGERLOGICS),fCollTrigClasses(0),fBGTrigClasses(0),fHardwareTrigger(0),fOfflineTrigger(0),fBeamSide(0) {
+ // Copy ctor
+ fCollTrigClasses = cont.fCollTrigClasses;
+ fBGTrigClasses = cont.fBGTrigClasses;
+ fHardwareTrigger = cont.fHardwareTrigger;
+ fOfflineTrigger = cont.fOfflineTrigger;
+ fBeamSide = cont.fBeamSide;
+
+}
+
+AliOADBPhysicsSelection& AliOADBPhysicsSelection::operator=(const AliOADBPhysicsSelection& other) {
+ //Assignment operator
+ TNamed::operator=(other);
+
+ fCollTrigClasses = other.fCollTrigClasses;
+ fBGTrigClasses = other.fBGTrigClasses;
+ fHardwareTrigger = other.fHardwareTrigger;
+ fOfflineTrigger = other.fOfflineTrigger;
+ fBeamSide = other.fBeamSide;
+
+
+ return *this;
+}
+
+void AliOADBPhysicsSelection::AddCollisionTriggerClass(AliVEvent::EOfflineTriggerTypes triggerMask, const char* className,const char * beamSide, UInt_t triggerLogic) {
+ // add collision trigger class
+ TObjString * tclass = new TObjString(Form("%s &%u *%u",className,triggerMask, triggerLogic));
+ fCollTrigClasses[GetActiveBit(triggerMask)]->Add(tclass);
+ SetBeamSide(tclass->String().Data(),beamSide);
+}
+void AliOADBPhysicsSelection::AddBGTriggerClass (AliVEvent::EOfflineTriggerTypes triggerMask, const char* className,const char * beamSide, UInt_t triggerLogic)
+{
+ // add bg gtrigger class
+ TObjString * tclass = new TObjString(Form("%s &%u *%u",className,triggerMask, triggerLogic));
+ fBGTrigClasses [GetActiveBit(triggerMask)]->Add(tclass);
+ SetBeamSide(tclass->String().Data(),beamSide);
+}
+
+const TString AliOADBPhysicsSelection::GetBeamSide (const char * trigger) {
+ // Associate beam site to trigger class name
+ TObjString * cname = new TObjString(trigger);
+ CleanKey(cname->String());
+ static TString retValue="";
+ retValue = ((TObjString*)fBeamSide->GetValue(cname->String().Data())) ?
+ ((TObjString*)fBeamSide->GetValue(cname->String().Data()))->String() : "" ;
+ delete cname;
+ return retValue;
+}
+void AliOADBPhysicsSelection::SetBeamSide (const char * className, const char * side)
+{
+ // return beam side
+ TObjString * cname = new TObjString(className);
+ CleanKey(cname->String());
+ fBeamSide->Add(new TObjString(cname->String().Data()), new TObjString(side));
+ delete cname;
+}
+
+void AliOADBPhysicsSelection::CleanKey(TString & str) {
+
+ // Remove all wite spacese and "goodies" of the trigger class string (bx ids, trigger logic...)
+ if(str.Index("*")>0)
+ str.Remove(str.Index("*")); // keep only the class name (no bx, offline trigger...)
+ if(str.Index("#")>0)
+ str.Remove(str.Index("#")); // keep only the class name (no bx, offline trigger...)
+ if(str.Index("&")>0)
+ str.Remove(str.Index("&")); // keep only the class name (no bx, offline trigger...)
+ str.ReplaceAll(" ","");
+
+}
+
+// Getters
+
+// FIXME: decide about these getters
+// TList * AliOADBPhysicsSelection::GetCollTrigClass(AliVEvent::EOfflineTriggerTypes trig) const {
+// // Returns list of collision trigger classes for the requested bits
+// return GetTrigClass(trig,fCollTrigClasses);
+// }
+
+// TList * AliOADBPhysicsSelection::GetBGTrigClass(AliVEvent::EOfflineTriggerTypes trig) const {
+// // Returns list of background trigger classes for the requested bits
+// return GetTrigClass(trig,fBGTrigClasses);
+// }
+
+// TList * AliOADBPhysicsSelection::GetTrigClass(AliVEvent::EOfflineTriggerTypes trig, TList ** listClasses) const {
+// // Returns list of trigger classes for the requested bits
+
+// TList * list= new TList;
+// // Check which bits are on and build the final list
+// for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
+// if ((trig&(0x1<<ibit))) {
+// if(listClasses[ibit]) list->AddAll(listClasses[ibit]);
+// else AliError(Form("List %d not initialized?",ibit));
+// }
+// }
+
+// return list;
+// }
+
+void AliOADBPhysicsSelection::Print(Option_t* option) const {
+
+ for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
+ cout << "Bit " << ibit << endl;
+
+ fCollTrigClasses[ibit]->Print(option);
+ fBGTrigClasses[ibit]->Print(option);
+ cout << "HW trig " << fHardwareTrigger[ibit].String().Data() << endl;
+ cout << "Offline trig " << fHardwareTrigger[ibit].String().Data() << endl;
+
+ }
+ cout << "Beams: " << endl;
+ fBeamSide->Print();
+
+}
+
+
+void AliOADBPhysicsSelection::Browse(TBrowser *b)
+{
+ // Browse this object.
+ // If b=0, there is no Browse call TObject::Browse(0) instead.
+ // This means TObject::Inspect() will be invoked indirectly
+
+ TFolder ** bitFolders = new TFolder*[fNtriggerBits];
+
+ if (b) {
+ for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
+ // if(bitFolders[ibit]) delete bitFolders[ibit];
+ bitFolders[ibit] = new TFolder (Form("Bit %2.2d", ibit), "Trigger bit folder");
+ for(UInt_t ilogic = 0; ilogic < fNtriggerLogics; ilogic++){
+ if(GetHardwareTrigger(ilogic) != "" || GetOfflineTrigger(ilogic) != "") {
+ bitFolders[ibit]->Add(new TObjString(Form("Hardware Trig [*%d][%s]",ilogic,GetHardwareTrigger(ilogic).Data())));
+ bitFolders[ibit]->Add(new TObjString(Form("Offline Trig [*%d][%s]",ilogic,GetOfflineTrigger(ilogic).Data())));
+ }
+ }
+
+ TIterator *itColl = fCollTrigClasses[ibit]->MakeIterator();
+ TObjString * coll = 0;
+
+ while ((coll = (TObjString*)itColl->Next())) {
+ bitFolders[ibit]->Add(new TObjString(Form("Collision Class [%s] [%s]", coll->String().Data(),
+ GetBeamSide(coll->String().Data()).Data())));
+ }
+
+ TIterator *itBG = fBGTrigClasses[ibit]->MakeIterator();
+ TObjString * bg = 0;
+ while ((bg = (TObjString*)itBG->Next())) {
+ bitFolders[ibit]->Add(new TObjString(Form("Background Class [%s] [%s]", bg->String().Data(),
+ GetBeamSide(bg->String().Data()).Data())));
+ }
+
+
+ b->Add(bitFolders[ibit]);
+
+ }
+ }
+ else
+ TObject::Browse(b);
+}
+
+const UInt_t AliOADBPhysicsSelection::GetActiveBit(UInt_t mask) {
+ // Returns the active bit index in the mask
+ // Assumes only one bit is on.
+ // If more than one bit is lit, prints an error and returns the first.
+ // If no bit is on, prints an error and returns 0
+
+ Int_t nbit = sizeof(mask)*8;
+ Int_t activeBit = -1;
+ for(Int_t ibit = 0; ibit < nbit; ibit++){
+ if ( mask & (0x1 << ibit) ) {
+ if (activeBit == -1) activeBit = ibit;
+ else Printf("ERROR (AliTriggerAnalysis::GetActiveBit): More than one bit is on in this mask 0x%x", mask);
+ }
+ }
+ if (activeBit == -1) {
+ Printf("ERROR (AliTriggerAnalysis::GetActiveBit): No bit is on");
+ activeBit=0;
+ }
+
+ return activeBit;
+
+}
--- /dev/null
+#ifndef AliOADBPhysicsSelection_H
+#define AliOADBPhysicsSelection_H
+/* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id$ */
+
+//-------------------------------------------------------------------------
+// OADB interface for the physics selection
+// Author: Michele Floris, CERN
+//
+// This class contains the parameters needed to configure the physics
+// selection. The online trigger class must be associated to an
+// offline trigger mask, as defined in
+// AliVEvent::EOfflineTriggerTypes. The offline condition, even for
+// the same trigger mask, can be different for every different online
+// trigger, so it must be given as a parameter in the Add...Class
+// methods. It's up to the user to set the appropriate offline
+// conditions when filling the class.
+// -------------------------------------------------------------------------
+
+#include <TNamed.h>
+#include "AliVEvent.h"
+#include "TList.h"
+#include "TMap.h"
+
+class TObjArray;
+class TArrayI;
+
+
+#define NTRIGGERBITS 32
+#define NTRIGGERLOGICS 64
+
+class AliOADBPhysicsSelection : public TNamed {
+
+ public :
+ AliOADBPhysicsSelection();
+ AliOADBPhysicsSelection(char* name);
+ virtual ~AliOADBPhysicsSelection();
+ AliOADBPhysicsSelection(const AliOADBPhysicsSelection& cont);
+ AliOADBPhysicsSelection& operator=(const AliOADBPhysicsSelection& cont);
+ void Init();
+ // Getters
+ // These take a mask of trigger bits, because you can activate several triggers at once
+ // TList * GetCollTrigClass(AliVEvent::EOfflineTriggerTypes trig) const;
+ // TList * GetBGTrigClass(AliVEvent::EOfflineTriggerTypes trig) const;
+ // TList * GetTrigClass(AliVEvent::EOfflineTriggerTypes trig, TList ** listClasses) const ;
+
+ TList * GetCollTrigClass(UInt_t triggerBit) { return fCollTrigClasses[triggerBit];}
+ TList * GetBGTrigClass(UInt_t triggerBit) { return fBGTrigClasses[triggerBit]; }
+ const TString GetBeamSide (const char * trigger) ;
+ TMap * Debug() { return fBeamSide; }
+ // Thess take a single trigger bit, as the HW/offline conditions are mapped 1 <-> 1 to a single EOfflineTriggerTypes bit
+ const TString GetHardwareTrigger(UInt_t triggerLogic) const { return triggerLogic >= NTRIGGERLOGICS ? "" : fHardwareTrigger[triggerLogic].String(); }
+ const TString GetOfflineTrigger (UInt_t triggerLogic) const { return triggerLogic >= NTRIGGERLOGICS ? "" : fOfflineTrigger [triggerLogic].String(); }
+ const UInt_t GetNTriggerBits() const { return fNtriggerBits; }
+ // Setters
+ void AddCollisionTriggerClass(AliVEvent::EOfflineTriggerTypes triggerMask, const char* className,const char * beamSide, UInt_t triggerLogic);
+ void AddBGTriggerClass (AliVEvent::EOfflineTriggerTypes triggerMask, const char* className,const char * beamSide, UInt_t triggerLogic);
+
+
+ void SetHardwareTrigger (UInt_t triggerLogic, const char * trigger) { fHardwareTrigger [triggerLogic].SetString(trigger); }
+ void SetOfflineTrigger (UInt_t triggerLogic, const char * trigger) { fOfflineTrigger [triggerLogic].SetString(trigger); }
+ void SetBeamSide (const char * className, const char * side);
+ // MISC
+ virtual Bool_t IsFolder() const { return kTRUE; }
+ void Browse(TBrowser *b);
+ virtual void Print(Option_t* option = "") const;
+
+protected:
+ void CleanKey(TString & str) ;
+ static const UInt_t GetActiveBit(UInt_t mask) ;
+ private :
+
+ UInt_t fNtriggerBits; // Size of the arrays below. Initialized using NTRIGGERBITS
+ UInt_t fNtriggerLogics; // number of possible trigger logics, initialized using NTRIGGERLOGICS. To be increased if needed.
+
+ TList ** fCollTrigClasses ; //[fNtriggerBits] Array of collision trigger classes, corresponding to the different trigger bits defined in AliVEvent
+ TList ** fBGTrigClasses ; //[fNtriggerBits] Array of background trigger classes, corresponding to the different trigger bits defined in AliVEvent
+ TObjString * fHardwareTrigger ; //[fNtriggerLogics] Array of online trigger condition, corresponding to the different trigger logics set in Add...TriggerClass
+ TObjString * fOfflineTrigger ; //[fNtriggerLogics] Array of offline trigger condition, corresponding to the different trigger logics set in Add...TriggerClass
+ TMap * fBeamSide; // Map from the trigger classname to the beam side ("B", "A", "C", "E", "AC")
+ ClassDef(AliOADBPhysicsSelection, 1);
+};
+
+#endif