- suspend saving chamber geometry/status until a mergable object can be
[u/mrichter/AliRoot.git] / PWGPP / TRD / info / AliTRDtrendValue.cxx
1 ////////////////////////////////////////////////////////////////////////////
2 //                                                                        //
3 //  Trend Value Incapsulation                                             //
4 //                                                                        //
5 //  Authors:                                                              //
6 //    Alexandru Bercuci <A.Bercuci@gsi.de>                                //
7 //                                                                        //
8 ////////////////////////////////////////////////////////////////////////////
9
10 #include "TString.h"
11 #include "TObjString.h"
12 #include "TObjArray.h"
13
14 #include "AliLog.h"
15 #include "AliTRDtrendValue.h"
16
17 ClassImp(AliTRDtrendValue)
18
19
20 //____________________________________________
21 AliTRDtrendValue::AliTRDtrendValue() 
22   : TNamed("none", "none")
23   ,fValue(0.)
24   ,fSigma(1.)
25   ,fResponsible(NULL)
26 {
27 //  Constructor. Reset all fields.
28   //memset(fAlarmMessage, 0, kNlevels*sizeof(Char_t*));
29   memset(fNotifiable, 0, kNnotifiable*sizeof(TNamed*));
30 }
31
32 //____________________________________________
33 AliTRDtrendValue::AliTRDtrendValue(const Char_t *n, const Char_t *t) 
34   : TNamed("none", t)
35   ,fValue(0.)
36   ,fSigma(1.)
37   ,fResponsible(NULL)
38 {
39 //  Constructor. Define name and title for trend variable.
40   TString s(n);
41   TObjArray *names(s.Tokenize("_"));
42   if(names->GetEntriesFast()!=2){
43     AliError(Form("Wrong trend value name format. Trend value name should be of the form \"trendClass_trendValue\" with only one \"_\" character."));
44   } else SetName(n);
45
46   //memset(fAlarmMessage, 0, kNlevels*sizeof(Char_t*));
47   memset(fNotifiable, 0, kNnotifiable*sizeof(TNamed*));
48 }
49
50 //____________________________________________
51 AliTRDtrendValue::AliTRDtrendValue(const AliTRDtrendValue &ref)
52   : TNamed(ref)
53   ,fValue(ref.fValue)
54   ,fSigma(ref.fSigma)
55   ,fResponsible(NULL)
56 {
57 // Copy constructor
58
59   if(ref.fResponsible) fResponsible = new TNamed(*ref.fResponsible);
60   //memset(fAlarmMessage, 0, kNlevels*sizeof(Char_t*));
61   //for(Int_t ia(0); ia<kNlevels; ia++) SetAlarm(ia, ref.fAlarmMessage[ia]);
62   memset(fNotifiable, 0, kNnotifiable*sizeof(TNamed*));
63   Int_t in(0);
64   while(ref.fNotifiable[in]){
65     fNotifiable[in] = new TNamed(*(ref.fNotifiable[in]));
66     in++;
67   }
68 }
69
70 //____________________________________________
71 AliTRDtrendValue& AliTRDtrendValue::operator/=(const AliTRDtrendValue &n)
72 {
73   fValue-=n.fValue;
74   if(n.fSigma>0.) fValue/=n.fSigma;
75   return *this;
76 }
77
78 //____________________________________________
79 const char* AliTRDtrendValue::GetAlarmMessage(Int_t ns) const
80 {
81 // Check if value triggered alarm
82   if(ns<0 || ns>kNlevels) return NULL;
83   else return "not defined";//fAlarmMessage[ns];
84 }
85
86 //____________________________________________
87 const char* AliTRDtrendValue::GetClassName() const
88 {
89 // Check task to which value belong
90   TString s(TNamed::GetName());
91   TObjArray *names(s.Tokenize("_"));
92   if(names->GetEntriesFast()!=2){
93     AliError(Form("Wrong trend value name format."));
94     return NULL;
95   }
96
97   return ((TObjString*)names->At(0))->String().Data();
98 }
99
100 //____________________________________________
101 const char* AliTRDtrendValue::GetValueName() const
102 {
103 // value name
104   TString s(TNamed::GetName());
105   TObjArray *names(s.Tokenize("_"));
106   if(names->GetEntriesFast()!=2){
107     AliError(Form("Wrong trend value name format."));
108     return NULL;
109   }
110   return ((TObjString*)names->At(1))->String().Data();
111 }
112
113 //____________________________________________
114 const char* AliTRDtrendValue::GetResponsible() const
115 {
116 // Get responsible with name and mail
117   if(!fResponsible) return NULL;
118   return Form("%s <%s>", fResponsible->GetName(), fResponsible->GetTitle());
119 }
120
121 //____________________________________________
122 const char* AliTRDtrendValue::GetNotifiable(Int_t in) const
123 {
124 // Get noticible person "in" with name and mail
125   if(in<0||in>=kNnotifiable) return NULL;
126   if(!fNotifiable[in]) return NULL;
127   return Form("%s <%s>", fNotifiable[in]->GetName(), fNotifiable[in]->GetTitle());
128 }
129
130 //____________________________________________
131 void AliTRDtrendValue::SetAlarm(Int_t level, Char_t */*m*/)
132 {
133 // define alarm message for "level"
134   if(level<0||level>=kNlevels){
135     AliWarning(Form("Alarm level[%d] out of range [0 %d]", level, kNlevels-1));
136     return;
137   }
138   //fAlarmMessage[level] = StrDup(m);
139 }
140
141 //____________________________________________
142 void AliTRDtrendValue::SetNotifiable(const Char_t *name, const Char_t *mail)
143 {
144 // add noticible person to DB
145   Int_t n(0); while(GetNotifiable(n)) n++;
146   if(n>=kNnotifiable-1){
147     AliWarning(Form("Could not add %s for notification. There are already %d persons registered for notification.", name, kNnotifiable-1));
148     return;
149   }
150   fNotifiable[n] = new TNamed(name, mail);
151 }
152
153 //____________________________________________
154 void AliTRDtrendValue::SetResponsible(const Char_t *name, const Char_t *mail, Option_t *opt) 
155 {
156 // set responsible person for trend
157   if(fResponsible){
158     if(strcmp(opt, "u")!=0){
159       AliWarning(Form("Responsible already set %s <%s>", fResponsible->GetName(), fResponsible->GetTitle()));
160       return;
161     }else{
162       AliWarning(Form("Old responsible %s <%s> replaced by %s <%s>", fResponsible->GetName(), fResponsible->GetTitle(), name, mail));
163       new(fResponsible) TNamed(name, mail);
164     }
165   } else fResponsible = new TNamed(name, mail);
166 }
167
168 //____________________________________________
169 void AliTRDtrendValue::Print(Option_t */*o*/) const
170 {
171 //   name - title
172 //   value - limits
173 //   alarm level, message
174 //   responsible
175
176   printf("    %s [%s] - %s\n", GetValueName(), GetClassName(), GetTitle());
177   printf("*** %f +- %f\n", fValue, fSigma);
178   printf("*** Responsible %s <%s>\n", fResponsible?fResponsible->GetName():"", fResponsible?fResponsible->GetTitle():"");
179   printf("*** Notifiable person(s) ***\n");
180   Int_t in(0);
181   while(fNotifiable[in]){
182     printf("        %s <%s>\n", fNotifiable[in]->GetName(), fNotifiable[in]->GetTitle());
183     in++;
184   }
185 /*  printf("*** Alarm messages \n");
186   for(in=0; in<kNlevels; in++) printf("*** Alarm [%d] : %s\n", in, fAlarmMessage[in]?fAlarmMessage[in]:"not defined");*/
187 }