1 #include "AliOADBPhysicsSelection.h"
4 #include "TObjString.h"
13 ClassImp(AliOADBPhysicsSelection)
16 AliOADBPhysicsSelection::AliOADBPhysicsSelection() :
17 TNamed("AliOADBPhysicsSelection", "OADB object for the physics selection"), fNtriggerBits(NTRIGGERBITS), fNtriggerLogics(NTRIGGERLOGICS),fCollTrigClasses(0),fBGTrigClasses(0),fHardwareTrigger(0),fOfflineTrigger(0),fBeamSide(0)
22 AliOADBPhysicsSelection::AliOADBPhysicsSelection(const char* name) :
23 TNamed(name, "OADB object for the physics selection"), fNtriggerBits(NTRIGGERBITS), fNtriggerLogics(NTRIGGERLOGICS),fCollTrigClasses(0),fBGTrigClasses(0),fHardwareTrigger(0),fOfflineTrigger(0),fBeamSide(0)
25 // ctor, better use this one
29 void AliOADBPhysicsSelection::Init() {
30 //Initialization of pointers
32 if(fCollTrigClasses) {
33 AliInfo("Already initialized");
37 fNtriggerBits = NTRIGGERBITS;
38 fCollTrigClasses = new TList*[fNtriggerBits];
39 fBGTrigClasses = new TList*[fNtriggerBits];
40 fHardwareTrigger = new TObjString[fNtriggerLogics];
41 fOfflineTrigger = new TObjString[fNtriggerLogics];
43 for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
44 fCollTrigClasses[ibit] = new TList;
45 fBGTrigClasses [ibit] = new TList;
47 for(UInt_t ilogic = 0; ilogic < fNtriggerLogics; ilogic++){
48 fHardwareTrigger[ilogic] = "";
49 fOfflineTrigger [ilogic] = "";
55 AliOADBPhysicsSelection::~AliOADBPhysicsSelection(){
58 if(fHardwareTrigger) delete [] fHardwareTrigger;
59 if(fOfflineTrigger) delete [] fOfflineTrigger ;
61 for(Int_t ibit = 0; ibit < NTRIGGERBITS; ibit++){
64 if(fCollTrigClasses[ibit]) delete fCollTrigClasses[ibit];
66 if(fBGTrigClasses [ibit]) delete fBGTrigClasses [ibit];
71 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) {
73 fCollTrigClasses = cont.fCollTrigClasses;
74 fBGTrigClasses = cont.fBGTrigClasses;
75 fHardwareTrigger = cont.fHardwareTrigger;
76 fOfflineTrigger = cont.fOfflineTrigger;
77 fBeamSide = cont.fBeamSide;
81 AliOADBPhysicsSelection& AliOADBPhysicsSelection::operator=(const AliOADBPhysicsSelection& other) {
83 TNamed::operator=(other);
85 fCollTrigClasses = other.fCollTrigClasses;
86 fBGTrigClasses = other.fBGTrigClasses;
87 fHardwareTrigger = other.fHardwareTrigger;
88 fOfflineTrigger = other.fOfflineTrigger;
89 fBeamSide = other.fBeamSide;
95 void AliOADBPhysicsSelection::AddCollisionTriggerClass(AliVEvent::EOfflineTriggerTypes triggerMask, const char* className,const char * beamSide, UInt_t triggerLogic) {
96 // add collision trigger class
97 TObjString * tclass = new TObjString(Form("%s &%u *%u",className,triggerMask, triggerLogic));
98 fCollTrigClasses[GetActiveBit(triggerMask)]->Add(tclass);
99 SetBeamSide(tclass->String().Data(),beamSide);
101 void AliOADBPhysicsSelection::AddBGTriggerClass (AliVEvent::EOfflineTriggerTypes triggerMask, const char* className,const char * beamSide, UInt_t triggerLogic)
103 // add bg gtrigger class
104 TObjString * tclass = new TObjString(Form("%s &%u *%u",className,triggerMask, triggerLogic));
105 fBGTrigClasses [GetActiveBit(triggerMask)]->Add(tclass);
106 SetBeamSide(tclass->String().Data(),beamSide);
109 const TString AliOADBPhysicsSelection::GetBeamSide (const char * trigger) {
110 // Associate beam site to trigger class name
111 TObjString * cname = new TObjString(trigger);
112 CleanKey(cname->String());
113 static TString retValue="";
114 retValue = ((TObjString*)fBeamSide->GetValue(cname->String().Data())) ?
115 ((TObjString*)fBeamSide->GetValue(cname->String().Data()))->String() : "" ;
119 void AliOADBPhysicsSelection::SetBeamSide (const char * className, const char * side)
122 TObjString * cname = new TObjString(className);
123 CleanKey(cname->String());
124 fBeamSide->Add(new TObjString(cname->String().Data()), new TObjString(side));
128 void AliOADBPhysicsSelection::CleanKey(TString & str) {
130 // Remove all wite spacese and "goodies" of the trigger class string (bx ids, trigger logic...)
132 str.Remove(str.Index("*")); // keep only the class name (no bx, offline trigger...)
134 str.Remove(str.Index("#")); // keep only the class name (no bx, offline trigger...)
136 str.Remove(str.Index("&")); // keep only the class name (no bx, offline trigger...)
137 str.ReplaceAll(" ","");
143 // FIXME: decide about these getters
144 // TList * AliOADBPhysicsSelection::GetCollTrigClass(AliVEvent::EOfflineTriggerTypes trig) const {
145 // // Returns list of collision trigger classes for the requested bits
146 // return GetTrigClass(trig,fCollTrigClasses);
149 // TList * AliOADBPhysicsSelection::GetBGTrigClass(AliVEvent::EOfflineTriggerTypes trig) const {
150 // // Returns list of background trigger classes for the requested bits
151 // return GetTrigClass(trig,fBGTrigClasses);
154 // TList * AliOADBPhysicsSelection::GetTrigClass(AliVEvent::EOfflineTriggerTypes trig, TList ** listClasses) const {
155 // // Returns list of trigger classes for the requested bits
157 // TList * list= new TList;
158 // // Check which bits are on and build the final list
159 // for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
160 // if ((trig&(0x1<<ibit))) {
161 // if(listClasses[ibit]) list->AddAll(listClasses[ibit]);
162 // else AliError(Form("List %d not initialized?",ibit));
169 void AliOADBPhysicsSelection::Print(Option_t* option) const {
171 for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
172 cout << "Bit " << ibit << endl;
174 fCollTrigClasses[ibit]->Print(option);
175 fBGTrigClasses[ibit]->Print(option);
176 cout << "HW trig " << fHardwareTrigger[ibit].String().Data() << endl;
177 cout << "Offline trig " << fHardwareTrigger[ibit].String().Data() << endl;
180 cout << "Beams: " << endl;
186 void AliOADBPhysicsSelection::Browse(TBrowser *b)
188 // Browse this object.
189 // If b=0, there is no Browse call TObject::Browse(0) instead.
190 // This means TObject::Inspect() will be invoked indirectly
191 static TFolder ** bitFolders = 0;
193 bitFolders = new TFolder*[fNtriggerBits];
194 for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
195 bitFolders[ibit] = 0;
201 for(UInt_t ibit = 0; ibit < fNtriggerBits; ibit++){
202 if(bitFolders[ibit]) delete bitFolders[ibit];
203 bitFolders[ibit] = new TFolder (Form("Bit %2.2d", ibit), "Trigger bit folder");
204 bitFolders[ibit]->SetOwner(); // Delete also the TObjString when deleting the folder
205 for(UInt_t ilogic = 0; ilogic < fNtriggerLogics; ilogic++){
206 if(GetHardwareTrigger(ilogic) != "" || GetOfflineTrigger(ilogic) != "") {
207 bitFolders[ibit]->Add(new TObjString(Form("Hardware Trig [*%d][%s]",ilogic,GetHardwareTrigger(ilogic).Data())));
208 bitFolders[ibit]->Add(new TObjString(Form("Offline Trig [*%d][%s]",ilogic,GetOfflineTrigger(ilogic).Data())));
212 TIterator *itColl = fCollTrigClasses[ibit]->MakeIterator();
213 TObjString * coll = 0;
215 while ((coll = (TObjString*)itColl->Next())) {
216 bitFolders[ibit]->Add(new TObjString(Form("Collision Class [%s] [%s]", coll->String().Data(),
217 GetBeamSide(coll->String().Data()).Data())));
221 TIterator *itBG = fBGTrigClasses[ibit]->MakeIterator();
223 while ((bg = (TObjString*)itBG->Next())) {
224 bitFolders[ibit]->Add(new TObjString(Form("Background Class [%s] [%s]", bg->String().Data(),
225 GetBeamSide(bg->String().Data()).Data())));
229 b->Add(bitFolders[ibit]);
237 UInt_t AliOADBPhysicsSelection::GetActiveBit(UInt_t mask) {
238 // Returns the active bit index in the mask
239 // Assumes only one bit is on.
240 // If more than one bit is lit, prints an error and returns the first.
241 // If no bit is on, prints an error and returns 0
243 const Int_t kNBitsToCheck = 28;
245 // Int_t nbit = sizeof(mask)*8;
246 Int_t nbit = kNBitsToCheck;
247 Int_t activeBit = -1;
248 for(Int_t ibit = 0; ibit < nbit; ibit++){
249 if ( mask & (0x1 << ibit) ) {
250 if (activeBit == -1) activeBit = ibit;
251 else Printf("ERROR (AliTriggerAnalysis::GetActiveBit): More than one bit is on in this mask 0x%x", mask);
254 if (activeBit == -1) {
255 Printf("ERROR (AliTriggerAnalysis::GetActiveBit): No bit is on");