1 ////////////////////////////////////////////////////////////////////////////
3 // Trend Value Manager //
5 // Mediates interaction with DB (OCDB ?!) // // //
7 // Alexandru Bercuci <A.Bercuci@gsi.de> //
9 ////////////////////////////////////////////////////////////////////////////
11 #include "TObjArray.h"
13 #include "AliCDBRunRange.h"
14 #include "AliCDBManager.h"
15 #include "AliCDBMetaData.h"
16 #include "AliCDBStorage.h"
17 #include "AliTRDcalibDB.h"
18 #include "AliTRDtrendingManager.h"
20 ClassImp(AliTRDtrendingManager)
22 AliTRDtrendingManager* AliTRDtrendingManager::fgInstance=NULL;
23 Bool_t AliTRDtrendingManager::fgTerminated = kFALSE;
25 //____________________________________________
26 AliTRDtrendingManager* AliTRDtrendingManager::Instance()
29 // Singleton implementation
30 // Returns an instance of this class, it is created if neccessary
32 if (fgTerminated != kFALSE) return NULL;
35 fgInstance = new AliTRDtrendingManager();
36 AliTRDcalibDB *trd(AliTRDcalibDB::Instance());
38 AliWarningGeneral("AliTRDtrendingManager", "TRD OCDB manager not initialized. No trending DB available.");
40 /* const TObjArray *trendMap(trd->GetTrendMap());
42 AliWarningGeneral("AliTRDtrendingManager", "No TRD trending DB available for TRD.");
43 } else fgInstance->fEntries=(TObjArray*)trendMap->Clone();*/
50 //____________________________________________
51 void AliTRDtrendingManager::Terminate()
54 // Singleton implementation
55 // Deletes the instance of this class and sets the terminated flag,
56 // instances cannot be requested anymore
57 // This function can be called several times.
62 if (fgInstance != NULL) {
68 //____________________________________________
69 AliTRDtrendingManager::AliTRDtrendingManager()
75 fRunRange[0] = 0; fRunRange[1] = AliCDBRunRange::Infinity();
78 //____________________________________________
79 AliTRDtrendingManager::~AliTRDtrendingManager()
82 if(fValue) delete fValue;
83 if(fEntries) delete fEntries;
86 //____________________________________________
87 void AliTRDtrendingManager::AddValue(
91 ,Double_t limits[2*(AliTRDtrendValue::kNlevels+1)]
92 ,Char_t *messages[AliTRDtrendValue::kNlevels]
93 ,const Char_t *responsible
94 ,const Char_t *notifiables
97 // Expert Function !!!
98 // Add a trend value to the map already loaded
99 // If no map loaded create a new one from scratch
101 // class_name : name of the performance task
102 // name : name of the value to be trended
103 // title : description of the value to be trended
104 // limits : array of acceptance limits for this value. The array is organized as follows :
105 // - field 0 and 1 normal limits
106 // - field 2 and 3 first level of alarm
108 // - field 8 and 9 fourth level of alarm
109 // messages : array of alarm messages for each alarm level
110 // responsible: name and email of the responsible person. Format "name/email"
111 // notifiables: name and email of the notifiable persons. Format "name1/email1, name2/email2, etc"
113 AliWarning("*** EXPERT FUNCTION *** This function is adding one trending value to the current DB. Continue if you know what yout do!");
115 // create new trending value`
116 if(!fValue) fValue = new AliTRDtrendValue(Form("%s_%s", class_name, name), title);
117 else new(fValue) AliTRDtrendValue(Form("%s_%s", class_name, name), title);
118 fValue->SetLimits(limits);
119 for(Int_t ilevel(AliTRDtrendValue::kNlevels); ilevel--;) fValue->SetAlarm(ilevel, messages[ilevel]);
120 TString s(responsible);
121 TObjArray *r=s.Tokenize("/");
122 if(r->GetEntriesFast()!=2){
123 AliWarning("Responsible name/email incorrectly formated.");
125 fValue->SetResponsible(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
129 TObjArray *n=s.Tokenize(",");
130 for(Int_t in(0); in<TMath::Min(AliTRDtrendValue::kNnotifiable, n->GetEntriesFast()); in++){
131 TString ss(((TObjString*)n->At(in))->String());
133 if(r->GetEntriesFast()!=2){
134 AliWarning(Form("Notifiable person name/email incorrectly formated for [%s].", ss.Data()));
136 fValue->SetNotifiable(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
140 // if no trending map defined create one
142 AliInfo("No trending map loaded. Create one from scratch.");
143 fEntries = new TObjArray(50);
144 fEntries->SetOwner();
147 fEntries->AddLast(new AliTRDtrendValue(*fValue));
150 //____________________________________________
151 AliTRDtrendValue* AliTRDtrendingManager::GetValue(Char_t *class_name, Char_t *value_name)
153 // Search trend value list by value "value_name" and class responsible "class_name"
155 AliError("No trending map defined.");
158 AliTRDtrendValue *val((AliTRDtrendValue*)fEntries->FindObject(Form("%s_%s", class_name, value_name)));
160 AliError(Form("Missing trending value %s [%s]", value_name, class_name));
166 //____________________________________________
167 Bool_t AliTRDtrendingManager::ModifyValue(
173 ,const Char_t *responsible
174 ,const Char_t *notifiables
177 // Expert Function !!!
178 // Modify a trend value in the map already loaded
179 // see function AddValue() for explanation of input format.
182 AliError("No trending map loaded.");
185 AliWarning("*** EXPERT FUNCTION *** This function is modifying one trending value to the current DB. Continue if you know what yout do!");
187 AliTRDtrendValue *val((AliTRDtrendValue*)fEntries->FindObject(Form("%s_%s", class_name, name)));
189 AliError(Form("Missing trending value %s [%s]", name, class_name));
193 val->SetTitle(title);
194 if(limits) val->SetLimits(limits);
196 for(Int_t ilevel(AliTRDtrendValue::kNlevels); ilevel--;) val->SetAlarm(ilevel, messages[ilevel]);
203 if(r->GetEntriesFast()!=2){
204 AliWarning("Responsible name/email incorrectly formated.");
206 val->SetResponsible(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
211 TObjArray *n=s.Tokenize(",");
212 for(Int_t in(0); in<TMath::Min(AliTRDtrendValue::kNnotifiable, n->GetEntriesFast()); in++){
213 TString ss(((TObjString*)n->At(in))->String());
215 if(r->GetEntriesFast()!=2){
216 AliWarning(Form("Notifiable person name/email incorrectly formated for [%s].", ss.Data()));
218 val->SetNotifiable(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
225 //____________________________________________
226 void AliTRDtrendingManager::Print(Option_t *o) const
228 // Dump trend value list
230 AliError("No trending map available.");
234 for(Int_t iv(0); iv<fEntries->GetEntriesFast(); iv++){
235 ((AliTRDtrendValue*)fEntries->At(iv))->Print(o);
239 //____________________________________________
240 void AliTRDtrendingManager::Save()
242 // Saving TRD trending DB to $ALICE_ROOT/OCDB.
244 AliWarning("Saving TRD trending DB to $ALICE_ROOT/OCDB.");
246 AliCDBMetaData *metaData= new AliCDBMetaData();
247 metaData->SetObjectClassName("TObjArray");
248 metaData->SetResponsible("Alexander Wilk");
249 metaData->SetBeamPeriod(1);
250 metaData->SetAliRootVersion("05-21-01"); //root version
251 metaData->SetComment("TRD trending ");
253 AliCDBId id("TRD/Calib/Trend", fRunRange[0], fRunRange[1]);
254 AliCDBManager *man = AliCDBManager::Instance();
255 AliCDBStorage *gStorLoc = man->GetStorage("local://$ALICE_ROOT/OCDB");
259 gStorLoc->Put(fEntries, id, metaData);