]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/TRD/info/AliTRDtrendingManager.cxx
fix coverity
[u/mrichter/AliRoot.git] / PWG1 / TRD / info / AliTRDtrendingManager.cxx
1 ////////////////////////////////////////////////////////////////////////////
2 //                                                                        //
3 //  Trend Value Manager                                                   //
4 //                                                                        //
5 //  Mediates interaction with DB (OCDB ?!)                                //                                                                      //                                                                        //
6 //  Authors:                                                              //
7 //    Alexandru Bercuci <A.Bercuci@gsi.de>                                //
8 //                                                                        //
9 ////////////////////////////////////////////////////////////////////////////
10
11 #include "TObjArray.h"
12 #include "AliLog.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"
19
20 ClassImp(AliTRDtrendingManager)
21
22 AliTRDtrendingManager* AliTRDtrendingManager::fgInstance=NULL;
23 Bool_t AliTRDtrendingManager::fgTerminated = kFALSE;
24
25 //____________________________________________
26 AliTRDtrendingManager* AliTRDtrendingManager::Instance()
27 {
28   //
29   // Singleton implementation
30   // Returns an instance of this class, it is created if neccessary
31   //
32   if (fgTerminated != kFALSE) return NULL;
33
34   if (!fgInstance) {
35     fgInstance = new AliTRDtrendingManager();
36     AliTRDcalibDB *trd(AliTRDcalibDB::Instance());
37     if(!trd){ 
38       AliWarningGeneral("AliTRDtrendingManager", "TRD OCDB manager not initialized. No trending DB available.");
39     } else {
40 /*      const TObjArray *trendMap(trd->GetTrendMap());
41       if(!trendMap){
42         AliWarningGeneral("AliTRDtrendingManager", "No TRD trending DB available  for TRD.");
43       } else fgInstance->fEntries=(TObjArray*)trendMap->Clone();*/
44     }
45   }
46
47   return fgInstance;
48 }
49
50 //____________________________________________
51 void AliTRDtrendingManager::Terminate()
52 {
53   //
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.
58   //
59   
60   fgTerminated = kTRUE;
61   
62   if (fgInstance != NULL) {
63     delete fgInstance;
64     fgInstance = NULL;
65   }
66 }
67
68 //____________________________________________
69 AliTRDtrendingManager::AliTRDtrendingManager() 
70   : TObject()
71   ,fEntries(NULL)
72   ,fValue(NULL)
73 {
74 // Constructor
75   fRunRange[0] = 0; fRunRange[1] = AliCDBRunRange::Infinity();
76 }
77
78 //____________________________________________
79 AliTRDtrendingManager::~AliTRDtrendingManager()
80 {
81 // Destructor
82   if(fValue) delete fValue;
83   if(fEntries) delete fEntries;
84 }
85
86 //____________________________________________
87 void AliTRDtrendingManager::AddValue(
88   Char_t *class_name
89   ,Char_t *name
90   ,Char_t *title
91   ,Double_t limits[2*(AliTRDtrendValue::kNlevels+1)]
92   ,Char_t *messages[AliTRDtrendValue::kNlevels]
93   ,const Char_t *responsible
94   ,const Char_t *notifiables
95   )
96 {
97 // Expert Function !!!
98 // Add a trend value to the map already loaded
99 // If no map loaded create a new one from scratch
100 //
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
107 //               - ....
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"
112 //
113   AliWarning("*** EXPERT FUNCTION *** This function is adding one trending value to the current DB. Continue if you know what yout do!");
114
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.");
124   } else { 
125     fValue->SetResponsible(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
126   }
127   if(notifiables){
128     s=notifiables;
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());
132       r=ss.Tokenize("/");
133       if(r->GetEntriesFast()!=2){ 
134         AliWarning(Form("Notifiable person name/email incorrectly formated for [%s].", ss.Data()));
135       } else { 
136         fValue->SetNotifiable(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
137       }
138     }
139   }
140   // if no trending map defined create one
141   if(!fEntries){
142     AliInfo("No trending map loaded. Create one from scratch.");
143     fEntries = new TObjArray(50);
144     fEntries->SetOwner();
145   }
146
147   fEntries->AddLast(new AliTRDtrendValue(*fValue));
148 }
149
150 //____________________________________________
151 AliTRDtrendValue* AliTRDtrendingManager::GetValue(Char_t *class_name, Char_t *value_name)
152 {
153 // Search trend value list by value "value_name" and class responsible "class_name" 
154   if(!fEntries){
155     AliError("No trending map defined.");
156     return NULL;
157   }
158   AliTRDtrendValue *val((AliTRDtrendValue*)fEntries->FindObject(Form("%s_%s", class_name, value_name)));
159   if(!val){ 
160     AliError(Form("Missing trending value %s [%s]", value_name, class_name));
161     fEntries->ls();
162   }
163   return val;
164 }
165
166 //____________________________________________
167 Bool_t AliTRDtrendingManager::ModifyValue(
168   Char_t *class_name
169   ,Char_t *name
170   ,Char_t *title
171   ,Double_t *limits
172   ,Char_t **messages
173   ,const Char_t *responsible
174   ,const Char_t *notifiables
175   )
176 {
177 // Expert Function !!!
178 // Modify a trend value in the map already loaded
179 // see function AddValue() for explanation of input format. 
180
181   if(!fEntries){
182     AliError("No trending map loaded.");
183     return kFALSE;
184   }
185   AliWarning("*** EXPERT FUNCTION *** This function is modifying one trending value to the current DB. Continue if you know what yout do!");
186
187   AliTRDtrendValue *val((AliTRDtrendValue*)fEntries->FindObject(Form("%s_%s", class_name, name)));
188   if(!val){ 
189     AliError(Form("Missing trending value %s [%s]", name, class_name));
190     return kFALSE;
191   }  
192   
193   val->SetTitle(title);
194   if(limits) val->SetLimits(limits);
195   if(messages){ 
196     for(Int_t ilevel(AliTRDtrendValue::kNlevels); ilevel--;) val->SetAlarm(ilevel, messages[ilevel]);
197   }
198   TString s;
199   TObjArray *r(NULL);
200   if(responsible){ 
201     s=responsible;
202     r=s.Tokenize("/");
203     if(r->GetEntriesFast()!=2){ 
204       AliWarning("Responsible name/email incorrectly formated.");
205     } else { 
206       val->SetResponsible(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
207     }
208   }
209   if(notifiables){
210     s=notifiables;
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());
214       r=ss.Tokenize("/");
215       if(r->GetEntriesFast()!=2){ 
216         AliWarning(Form("Notifiable person name/email incorrectly formated for [%s].", ss.Data()));
217       } else { 
218         val->SetNotifiable(((TObjString*)r->At(0))->String().Data(), ((TObjString*)r->At(1))->String().Data());
219       }
220     }
221   }
222   return kTRUE;
223 }
224
225 //____________________________________________
226 void AliTRDtrendingManager::Print(Option_t *o) const
227 {
228 // Dump trend value list
229   if(!fEntries){
230     AliError("No trending map available.");
231     return;
232   }
233
234   for(Int_t iv(0); iv<fEntries->GetEntriesFast(); iv++){
235     ((AliTRDtrendValue*)fEntries->At(iv))->Print(o);
236   }
237 }
238
239 //____________________________________________
240 void AliTRDtrendingManager::Save()
241 {
242 // Saving TRD trending DB to $ALICE_ROOT/OCDB.
243
244   AliWarning("Saving TRD trending DB to $ALICE_ROOT/OCDB.");
245
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 ");
252   
253   AliCDBId id("TRD/Calib/Trend", fRunRange[0], fRunRange[1]); 
254   AliCDBManager *man = AliCDBManager::Instance();
255   AliCDBStorage *gStorLoc = man->GetStorage("local://$ALICE_ROOT/OCDB");
256   if (!gStorLoc) {
257     return;
258   }
259   gStorLoc->Put(fEntries, id, metaData); 
260 }