ROOT logo
////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  Trend Value Incapsulation                                             //
//                                                                        //
//  Authors:                                                              //
//    Alexandru Bercuci <A.Bercuci@gsi.de>                                //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#include "TString.h"
#include "TObjString.h"
#include "TObjArray.h"

#include "AliLog.h"
#include "AliTRDtrendValue.h"

ClassImp(AliTRDtrendValue)


//____________________________________________
AliTRDtrendValue::AliTRDtrendValue() 
  : TNamed("none", "none")
  ,fValue(0.)
  ,fSigma(1.)
  ,fResponsible(NULL)
{
//  Constructor. Reset all fields.
  //memset(fAlarmMessage, 0, kNlevels*sizeof(Char_t*));
  memset(fNotifiable, 0, kNnotifiable*sizeof(TNamed*));
}

//____________________________________________
AliTRDtrendValue::AliTRDtrendValue(const Char_t *n, const Char_t *t) 
  : TNamed("none", t)
  ,fValue(0.)
  ,fSigma(1.)
  ,fResponsible(NULL)
{
//  Constructor. Define name and title for trend variable.
  if(strchr(GetName(),'_')!=strrchr(GetName(), '_')){
    AliError(Form("Wrong trend value name format. Trend value name should be of the form \"trendClass_trendValue\" with only one \"_\" character."));
  } else SetName(n);

  //memset(fAlarmMessage, 0, kNlevels*sizeof(Char_t*));
  memset(fNotifiable, 0, kNnotifiable*sizeof(TNamed*));
}

//____________________________________________
AliTRDtrendValue::AliTRDtrendValue(const AliTRDtrendValue &ref)
  : TNamed(ref)
  ,fValue(ref.fValue)
  ,fSigma(ref.fSigma)
  ,fResponsible(NULL)
{
// Copy constructor

  if(ref.fResponsible) fResponsible = new TNamed(*ref.fResponsible);
  //memset(fAlarmMessage, 0, kNlevels*sizeof(Char_t*));
  //for(Int_t ia(0); ia<kNlevels; ia++) SetAlarm(ia, ref.fAlarmMessage[ia]);
  memset(fNotifiable, 0, kNnotifiable*sizeof(TNamed*));
  Int_t in(0);
  while(ref.fNotifiable[in]){
    fNotifiable[in] = new TNamed(*(ref.fNotifiable[in]));
    in++;
  }
}

//____________________________________________
AliTRDtrendValue::~AliTRDtrendValue()
{
// destructor
  if(fResponsible) delete fResponsible;
  for(Int_t in(0); in<kNnotifiable; in++)
    if(fNotifiable[in]) delete fNotifiable[in];
}

//____________________________________________
AliTRDtrendValue& AliTRDtrendValue::operator/=(const AliTRDtrendValue &n)
{
  fValue-=n.fValue;
  if(n.fSigma>0.) fValue/=n.fSigma;
  return *this;
}

//____________________________________________
const char* AliTRDtrendValue::GetAlarmMessage(Int_t ns) const
{
// Check if value triggered alarm
  if(ns<0 || ns>kNlevels) return NULL;
  else return "not defined";//fAlarmMessage[ns];
}

//____________________________________________
const char* AliTRDtrendValue::GetResponsible() const
{
// Get responsible with name and mail
  if(!fResponsible) return NULL;
  return Form("%s <%s>", fResponsible->GetName(), fResponsible->GetTitle());
}

//____________________________________________
const char* AliTRDtrendValue::GetNotifiable(Int_t in) const
{
// Get noticible person "in" with name and mail
  if(in<0||in>=kNnotifiable) return NULL;
  if(!fNotifiable[in]) return NULL;
  return Form("%s <%s>", fNotifiable[in]->GetName(), fNotifiable[in]->GetTitle());
}

//____________________________________________
void AliTRDtrendValue::SetAlarm(Int_t level, Char_t */*m*/)
{
// define alarm message for "level"
  if(level<0||level>=kNlevels){
    AliWarning(Form("Alarm level[%d] out of range [0 %d]", level, kNlevels-1));
    return;
  }
  //fAlarmMessage[level] = StrDup(m);
}

//____________________________________________
void AliTRDtrendValue::SetNotifiable(const Char_t *name, const Char_t *mail)
{
// add noticible person to DB
  Int_t n(0); while(GetNotifiable(n)) n++;
  if(n>=kNnotifiable-1){
    AliWarning(Form("Could not add %s for notification. There are already %d persons registered for notification.", name, kNnotifiable-1));
    return;
  }
  fNotifiable[n] = new TNamed(name, mail);
}

//____________________________________________
void AliTRDtrendValue::SetResponsible(const Char_t *name, const Char_t *mail, Option_t *opt) 
{
// set responsible person for trend
  if(fResponsible){
    if(strcmp(opt, "u")!=0){
      AliWarning(Form("Responsible already set %s <%s>", fResponsible->GetName(), fResponsible->GetTitle()));
      return;
    }else{
      AliWarning(Form("Old responsible %s <%s> replaced by %s <%s>", fResponsible->GetName(), fResponsible->GetTitle(), name, mail));
      new(fResponsible) TNamed(name, mail);
    }
  } else fResponsible = new TNamed(name, mail);
}

//____________________________________________
void AliTRDtrendValue::Print(Option_t */*o*/) const
{
//   name - title
//   value - limits
//   alarm level, message
//   responsible

  const char* vn = strchr(GetName(), '_')+1;
  Int_t cnLength = vn-GetName();
  char *cn = new char[cnLength]; memcpy(cn, GetName(), (cnLength-1)*sizeof(char)); cn[cnLength-1]=0;
  printf("    %s [%s] - %s\n", vn, cn, GetTitle());
  printf("*** %f +- %f\n", fValue, fSigma);
  printf("*** Responsible %s <%s>\n", fResponsible?fResponsible->GetName():"", fResponsible?fResponsible->GetTitle():"");
  printf("*** Notifiable person(s) ***\n");
  Int_t in(0);
  while(fNotifiable[in]){
    printf("        %s <%s>\n", fNotifiable[in]->GetName(), fNotifiable[in]->GetTitle());
    in++;
  }
/*  printf("*** Alarm messages \n");
  for(in=0; in<kNlevels; in++) printf("*** Alarm [%d] : %s\n", in, fAlarmMessage[in]?fAlarmMessage[in]:"not defined");*/
  delete [] cn;
}
 AliTRDtrendValue.cxx:1
 AliTRDtrendValue.cxx:2
 AliTRDtrendValue.cxx:3
 AliTRDtrendValue.cxx:4
 AliTRDtrendValue.cxx:5
 AliTRDtrendValue.cxx:6
 AliTRDtrendValue.cxx:7
 AliTRDtrendValue.cxx:8
 AliTRDtrendValue.cxx:9
 AliTRDtrendValue.cxx:10
 AliTRDtrendValue.cxx:11
 AliTRDtrendValue.cxx:12
 AliTRDtrendValue.cxx:13
 AliTRDtrendValue.cxx:14
 AliTRDtrendValue.cxx:15
 AliTRDtrendValue.cxx:16
 AliTRDtrendValue.cxx:17
 AliTRDtrendValue.cxx:18
 AliTRDtrendValue.cxx:19
 AliTRDtrendValue.cxx:20
 AliTRDtrendValue.cxx:21
 AliTRDtrendValue.cxx:22
 AliTRDtrendValue.cxx:23
 AliTRDtrendValue.cxx:24
 AliTRDtrendValue.cxx:25
 AliTRDtrendValue.cxx:26
 AliTRDtrendValue.cxx:27
 AliTRDtrendValue.cxx:28
 AliTRDtrendValue.cxx:29
 AliTRDtrendValue.cxx:30
 AliTRDtrendValue.cxx:31
 AliTRDtrendValue.cxx:32
 AliTRDtrendValue.cxx:33
 AliTRDtrendValue.cxx:34
 AliTRDtrendValue.cxx:35
 AliTRDtrendValue.cxx:36
 AliTRDtrendValue.cxx:37
 AliTRDtrendValue.cxx:38
 AliTRDtrendValue.cxx:39
 AliTRDtrendValue.cxx:40
 AliTRDtrendValue.cxx:41
 AliTRDtrendValue.cxx:42
 AliTRDtrendValue.cxx:43
 AliTRDtrendValue.cxx:44
 AliTRDtrendValue.cxx:45
 AliTRDtrendValue.cxx:46
 AliTRDtrendValue.cxx:47
 AliTRDtrendValue.cxx:48
 AliTRDtrendValue.cxx:49
 AliTRDtrendValue.cxx:50
 AliTRDtrendValue.cxx:51
 AliTRDtrendValue.cxx:52
 AliTRDtrendValue.cxx:53
 AliTRDtrendValue.cxx:54
 AliTRDtrendValue.cxx:55
 AliTRDtrendValue.cxx:56
 AliTRDtrendValue.cxx:57
 AliTRDtrendValue.cxx:58
 AliTRDtrendValue.cxx:59
 AliTRDtrendValue.cxx:60
 AliTRDtrendValue.cxx:61
 AliTRDtrendValue.cxx:62
 AliTRDtrendValue.cxx:63
 AliTRDtrendValue.cxx:64
 AliTRDtrendValue.cxx:65
 AliTRDtrendValue.cxx:66
 AliTRDtrendValue.cxx:67
 AliTRDtrendValue.cxx:68
 AliTRDtrendValue.cxx:69
 AliTRDtrendValue.cxx:70
 AliTRDtrendValue.cxx:71
 AliTRDtrendValue.cxx:72
 AliTRDtrendValue.cxx:73
 AliTRDtrendValue.cxx:74
 AliTRDtrendValue.cxx:75
 AliTRDtrendValue.cxx:76
 AliTRDtrendValue.cxx:77
 AliTRDtrendValue.cxx:78
 AliTRDtrendValue.cxx:79
 AliTRDtrendValue.cxx:80
 AliTRDtrendValue.cxx:81
 AliTRDtrendValue.cxx:82
 AliTRDtrendValue.cxx:83
 AliTRDtrendValue.cxx:84
 AliTRDtrendValue.cxx:85
 AliTRDtrendValue.cxx:86
 AliTRDtrendValue.cxx:87
 AliTRDtrendValue.cxx:88
 AliTRDtrendValue.cxx:89
 AliTRDtrendValue.cxx:90
 AliTRDtrendValue.cxx:91
 AliTRDtrendValue.cxx:92
 AliTRDtrendValue.cxx:93
 AliTRDtrendValue.cxx:94
 AliTRDtrendValue.cxx:95
 AliTRDtrendValue.cxx:96
 AliTRDtrendValue.cxx:97
 AliTRDtrendValue.cxx:98
 AliTRDtrendValue.cxx:99
 AliTRDtrendValue.cxx:100
 AliTRDtrendValue.cxx:101
 AliTRDtrendValue.cxx:102
 AliTRDtrendValue.cxx:103
 AliTRDtrendValue.cxx:104
 AliTRDtrendValue.cxx:105
 AliTRDtrendValue.cxx:106
 AliTRDtrendValue.cxx:107
 AliTRDtrendValue.cxx:108
 AliTRDtrendValue.cxx:109
 AliTRDtrendValue.cxx:110
 AliTRDtrendValue.cxx:111
 AliTRDtrendValue.cxx:112
 AliTRDtrendValue.cxx:113
 AliTRDtrendValue.cxx:114
 AliTRDtrendValue.cxx:115
 AliTRDtrendValue.cxx:116
 AliTRDtrendValue.cxx:117
 AliTRDtrendValue.cxx:118
 AliTRDtrendValue.cxx:119
 AliTRDtrendValue.cxx:120
 AliTRDtrendValue.cxx:121
 AliTRDtrendValue.cxx:122
 AliTRDtrendValue.cxx:123
 AliTRDtrendValue.cxx:124
 AliTRDtrendValue.cxx:125
 AliTRDtrendValue.cxx:126
 AliTRDtrendValue.cxx:127
 AliTRDtrendValue.cxx:128
 AliTRDtrendValue.cxx:129
 AliTRDtrendValue.cxx:130
 AliTRDtrendValue.cxx:131
 AliTRDtrendValue.cxx:132
 AliTRDtrendValue.cxx:133
 AliTRDtrendValue.cxx:134
 AliTRDtrendValue.cxx:135
 AliTRDtrendValue.cxx:136
 AliTRDtrendValue.cxx:137
 AliTRDtrendValue.cxx:138
 AliTRDtrendValue.cxx:139
 AliTRDtrendValue.cxx:140
 AliTRDtrendValue.cxx:141
 AliTRDtrendValue.cxx:142
 AliTRDtrendValue.cxx:143
 AliTRDtrendValue.cxx:144
 AliTRDtrendValue.cxx:145
 AliTRDtrendValue.cxx:146
 AliTRDtrendValue.cxx:147
 AliTRDtrendValue.cxx:148
 AliTRDtrendValue.cxx:149
 AliTRDtrendValue.cxx:150
 AliTRDtrendValue.cxx:151
 AliTRDtrendValue.cxx:152
 AliTRDtrendValue.cxx:153
 AliTRDtrendValue.cxx:154
 AliTRDtrendValue.cxx:155
 AliTRDtrendValue.cxx:156
 AliTRDtrendValue.cxx:157
 AliTRDtrendValue.cxx:158
 AliTRDtrendValue.cxx:159
 AliTRDtrendValue.cxx:160
 AliTRDtrendValue.cxx:161
 AliTRDtrendValue.cxx:162
 AliTRDtrendValue.cxx:163
 AliTRDtrendValue.cxx:164
 AliTRDtrendValue.cxx:165
 AliTRDtrendValue.cxx:166
 AliTRDtrendValue.cxx:167
 AliTRDtrendValue.cxx:168
 AliTRDtrendValue.cxx:169
 AliTRDtrendValue.cxx:170
 AliTRDtrendValue.cxx:171