ROOT logo
#ifndef ALILHCDIPVALT_H
#define ALILHCDIPVALT_H

#include <typeinfo>
#include <TString.h>
#include <TObjString.h>
#include <TObject.h>
#include "AliLog.h"


/////////////////////////////////////////////////////////////////////////////////
//                                                                             //
//  AliLHCDipValT: templated class to store the array from processed           //
//  LHC DIP data. Associated with the time stamp either of the value           //
//  acquisition or the last sample timestamp if many samples were processed    //
//                                                                             //
//  Author: ruben.shahoyan@cern.ch                                             //
//                                                                             //
/////////////////////////////////////////////////////////////////////////////////

//_______________________________________________________________________________________
template<class Element> class AliLHCDipValT : public TObject
{
 public:
  //
  enum {
    kLastSpecial=BIT(14),         // last element of array is special (e.g. assigned error etc) 
    kProcessed1 =BIT(15),         // last element of array is special (e.g. assigned error etc) 
    kChar=BIT(22),
    kFloat=BIT(23)
  };
  //
  AliLHCDipValT(Int_t size=0, Double_t t=0);
  AliLHCDipValT(const AliLHCDipValT<Element> &src);
  virtual ~AliLHCDipValT() {delete[] fArray;}
  AliLHCDipValT& operator=(const AliLHCDipValT<Element> &src);
  virtual Element&       operator[](Int_t i);
  virtual Element        operator[](Int_t i)                          const;
  //
  virtual void        SetSize(Int_t size);
  virtual void        SetValue(Int_t i,Element v);
  virtual void        SetValues(const Element *v, Int_t n);
  void                SetTimeStamp(Double_t v)                      {fTimeStamp = v;}
  // 
  Int_t               GetSizeTotal()                          const {return fSizeTot;}
  virtual Element     GetValue(Int_t i=0)                     const;
  virtual Element*    GetValues()                             const {return (Element*)fArray;}
  Double_t            GetTimeStamp()                          const {return fTimeStamp;}
  Char_t*             GetTimeAsString(Bool_t utc=kTRUE)       const {return TimeAsString(fTimeStamp,utc);}
  //
  void                SetProcessed1(Bool_t v=kTRUE)                 {SetBit(kProcessed1,v);}
  void                SetLastSpecial(Bool_t v=kTRUE)                {SetBit(kLastSpecial,v);}
  Bool_t              IsProcessed1()                          const {return TestBit(kProcessed1);}
  Bool_t              IsLastSpecial()                         const {return TestBit(kLastSpecial);}
  Int_t               GetSize()                               const {return IsLastSpecial() ? GetSizeTotal()-1:GetSizeTotal();}
  Bool_t              IsTypeC()                               const {return TestBit(kChar);}
  Bool_t              IsTypeF()                               const {return TestBit(kFloat);}
  Bool_t              IsTypeI()                               const {return !TestBit(kFloat|kChar);}
  //
  virtual void Clear(const Option_t *opt="");
  virtual void Print(const Option_t *opt="")                  const;
  //
  static Char_t*      TimeAsString(double t,Bool_t utc=kTRUE);
  //
 protected:
  //
  Double_t            fTimeStamp;        // timestamp of the entry
  Int_t               fSizeTot;          // vector total size (including special slots, like for errors)
  Element*            fArray;            //[fSizeTot] array of entries
  //
  ClassDef(AliLHCDipValT,1)
};


//__________________________________________________________________________
template<class Element>
AliLHCDipValT<Element>::AliLHCDipValT(Int_t size,Double_t t) 
: fTimeStamp(t),fSizeTot(0),fArray(0)
{
  //def. constructor
  SetSize(size);
  if      (!strcmp(typeid(fArray).name(),typeid(Char_t*).name())) SetBit(kChar);
  else if (!strcmp(typeid(fArray).name(),typeid(Double_t*).name()) ||
	   !strcmp(typeid(fArray).name(),typeid(Float_t*).name() )) SetBit(kFloat);
  //
}

//__________________________________________________________________________
template<class Element>
AliLHCDipValT<Element>::AliLHCDipValT(const AliLHCDipValT<Element> &src)
: TObject(src),fTimeStamp(src.fTimeStamp),fSizeTot(0),fArray(0)
{
  //copy constructor
  SetSize(src.GetSizeTotal());
  memcpy(fArray,src.fArray,GetSizeTotal()*sizeof(Element));
}

//__________________________________________________________________________
template<class Element>
AliLHCDipValT<Element>& AliLHCDipValT<Element>::operator=(const AliLHCDipValT<Element> &src)
{
  //assingment
  if (this != &src) {
    ((TObject*)this)->operator=(src);
    if (GetSizeTotal()!=src.GetSizeTotal()) SetSize(src.GetSizeTotal());
    SetTimeStamp(src.GetTimeStamp());
    memcpy(fArray,src.fArray,GetSizeTotal()*sizeof(Element));    
  }
  return *this;
}

//__________________________________________________________________________
template<class Element>
Char_t* AliLHCDipValT<Element>::TimeAsString(double t, Bool_t utc)
{
  // time as string in UTC or local format
  static char buff[22];
  time_t tt = (time_t) t;
  struct tm *time = utc ? gmtime(&tt) : localtime(&tt);
  snprintf(buff,21,"%02d:%02d:%02d %02d/%02d/%04d",time->tm_hour,time->tm_min,time->tm_sec,
	  time->tm_mday,time->tm_mon+1,time->tm_year+1900);
  return (char*)buff;
}

//__________________________________________________________________________
template<class Element>
void AliLHCDipValT<Element>::SetValue(Int_t i,Element v)
{
  //assign value
  if (i>=GetSizeTotal() || i<0) {
    AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
    return;
  }
  fArray[i] = v;
}

//__________________________________________________________________________
template<class Element>
void AliLHCDipValT<Element>::SetValues(const Element* v, Int_t n)
{
  //assign value
  if (n!=GetSizeTotal()) SetSize(n);
  memcpy(fArray,v,n*sizeof(Element));
}

//__________________________________________________________________________
template<class Element>
Element& AliLHCDipValT<Element>::operator[](Int_t i)
{
  //obtain value refeterence
  if (i>=GetSizeTotal() || i<0) {
    AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
    return fArray[0];
  }
  return (Element&)fArray[i];
}

//__________________________________________________________________________
template<class Element>
Element AliLHCDipValT<Element>::operator[](Int_t i) const
{
  //obtain value
  if (i>=GetSizeTotal() || i<0) {
    AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
    return 0;
  }
  return (Element)fArray[i];
}

//__________________________________________________________________________
template<class Element>
Element AliLHCDipValT<Element>::GetValue(Int_t i) const
{
  //obtain value
  if (i>=GetSizeTotal() || i<0) {
    AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
    return 0;
  }
  return (Element)fArray[i];
}

//__________________________________________________________________________
template<class Element>
void AliLHCDipValT<Element>::SetSize(Int_t sz)
{
  //resize
  Element* arr = 0;
  if (sz>0) {
    arr = new Element[sz];
    int nc = GetSizeTotal() > sz ? sz:GetSizeTotal(); // n elems to copy
    if (nc && fArray) memcpy(arr, fArray, nc*sizeof(Element));
    if (nc<sz) memset(arr+nc, 0, (sz-nc)*sizeof(Element));
    if (fArray) delete[] fArray;
    fArray = arr;
    fSizeTot = sz;
  }
  else {
    delete[] fArray;
    fArray = 0;
    fSizeTot = 0;
  }
}

//__________________________________________________________________________
template<class Element>
void AliLHCDipValT<Element>::Print(const Option_t *opt) const
{
  // print time and value
  TString str = opt; 
  str.ToLower();
  if (str.Contains("raw")) printf("%.1f ",GetTimeStamp());
  else printf("[%s] ",GetTimeAsString(!str.Contains("loc")));
  //
  TString tp = typeid(fArray).name();
  if ( tp==typeid(Char_t*).name() ) printf(": %s\n",(Char_t*)fArray);
  else {
    int sz = GetSize();
    if (sz>1) printf("\n");
    Bool_t eolOK = kFALSE;
    for (int i=0;i<sz;i++) {
      if      (tp == typeid(Int_t*).name()    || tp == typeid(UInt_t*).name() ) {
	if (!str.Contains("bit")) printf(" %6d |" ,(Int_t)fArray[i]);
	else {
	  printf(" ");
	  int val = (int)fArray[i];
	  for (int j=sizeof(int)*8;j--;) printf("%d",(val>>j)&0x1);
	  printf(" |");
	}

      }
      else if (tp == typeid(Double_t*).name() || tp == typeid(Float_t*).name()) printf(" %+.3e |",(Double_t)fArray[i]);
      else printf(" ");
      eolOK = kFALSE;
      if ( (i+1)%5 == 0) {printf("\n"); eolOK = kTRUE;}
    }
    if (IsLastSpecial()) {
      if (sz>1 && !eolOK) {printf("\n"); eolOK = kTRUE;}
      if (tp == typeid(Double_t*).name() || tp == typeid(Double_t*).name()) {
	printf(" Error: %+e\n",(Double_t)fArray[sz]);
	eolOK = kTRUE;
      }
    }
    if (!eolOK) printf("\n");
  }
  //
}

//__________________________________________________________________________
template<class Element>
void AliLHCDipValT<Element>::Clear(const Option_t *)
{
  // reset to 0 everything
  SetTimeStamp(0);
  memset(fArray,0,GetSizeTotal()*sizeof(Element));
}


typedef AliLHCDipValT<Double_t> AliLHCDipValD;
typedef AliLHCDipValT<Float_t>  AliLHCDipValF;
typedef AliLHCDipValT<Int_t>    AliLHCDipValI;
typedef AliLHCDipValT<Char_t>   AliLHCDipValC;



#endif
 AliLHCDipValT.h:1
 AliLHCDipValT.h:2
 AliLHCDipValT.h:3
 AliLHCDipValT.h:4
 AliLHCDipValT.h:5
 AliLHCDipValT.h:6
 AliLHCDipValT.h:7
 AliLHCDipValT.h:8
 AliLHCDipValT.h:9
 AliLHCDipValT.h:10
 AliLHCDipValT.h:11
 AliLHCDipValT.h:12
 AliLHCDipValT.h:13
 AliLHCDipValT.h:14
 AliLHCDipValT.h:15
 AliLHCDipValT.h:16
 AliLHCDipValT.h:17
 AliLHCDipValT.h:18
 AliLHCDipValT.h:19
 AliLHCDipValT.h:20
 AliLHCDipValT.h:21
 AliLHCDipValT.h:22
 AliLHCDipValT.h:23
 AliLHCDipValT.h:24
 AliLHCDipValT.h:25
 AliLHCDipValT.h:26
 AliLHCDipValT.h:27
 AliLHCDipValT.h:28
 AliLHCDipValT.h:29
 AliLHCDipValT.h:30
 AliLHCDipValT.h:31
 AliLHCDipValT.h:32
 AliLHCDipValT.h:33
 AliLHCDipValT.h:34
 AliLHCDipValT.h:35
 AliLHCDipValT.h:36
 AliLHCDipValT.h:37
 AliLHCDipValT.h:38
 AliLHCDipValT.h:39
 AliLHCDipValT.h:40
 AliLHCDipValT.h:41
 AliLHCDipValT.h:42
 AliLHCDipValT.h:43
 AliLHCDipValT.h:44
 AliLHCDipValT.h:45
 AliLHCDipValT.h:46
 AliLHCDipValT.h:47
 AliLHCDipValT.h:48
 AliLHCDipValT.h:49
 AliLHCDipValT.h:50
 AliLHCDipValT.h:51
 AliLHCDipValT.h:52
 AliLHCDipValT.h:53
 AliLHCDipValT.h:54
 AliLHCDipValT.h:55
 AliLHCDipValT.h:56
 AliLHCDipValT.h:57
 AliLHCDipValT.h:58
 AliLHCDipValT.h:59
 AliLHCDipValT.h:60
 AliLHCDipValT.h:61
 AliLHCDipValT.h:62
 AliLHCDipValT.h:63
 AliLHCDipValT.h:64
 AliLHCDipValT.h:65
 AliLHCDipValT.h:66
 AliLHCDipValT.h:67
 AliLHCDipValT.h:68
 AliLHCDipValT.h:69
 AliLHCDipValT.h:70
 AliLHCDipValT.h:71
 AliLHCDipValT.h:72
 AliLHCDipValT.h:73
 AliLHCDipValT.h:74
 AliLHCDipValT.h:75
 AliLHCDipValT.h:76
 AliLHCDipValT.h:77
 AliLHCDipValT.h:78
 AliLHCDipValT.h:79
 AliLHCDipValT.h:80
 AliLHCDipValT.h:81
 AliLHCDipValT.h:82
 AliLHCDipValT.h:83
 AliLHCDipValT.h:84
 AliLHCDipValT.h:85
 AliLHCDipValT.h:86
 AliLHCDipValT.h:87
 AliLHCDipValT.h:88
 AliLHCDipValT.h:89
 AliLHCDipValT.h:90
 AliLHCDipValT.h:91
 AliLHCDipValT.h:92
 AliLHCDipValT.h:93
 AliLHCDipValT.h:94
 AliLHCDipValT.h:95
 AliLHCDipValT.h:96
 AliLHCDipValT.h:97
 AliLHCDipValT.h:98
 AliLHCDipValT.h:99
 AliLHCDipValT.h:100
 AliLHCDipValT.h:101
 AliLHCDipValT.h:102
 AliLHCDipValT.h:103
 AliLHCDipValT.h:104
 AliLHCDipValT.h:105
 AliLHCDipValT.h:106
 AliLHCDipValT.h:107
 AliLHCDipValT.h:108
 AliLHCDipValT.h:109
 AliLHCDipValT.h:110
 AliLHCDipValT.h:111
 AliLHCDipValT.h:112
 AliLHCDipValT.h:113
 AliLHCDipValT.h:114
 AliLHCDipValT.h:115
 AliLHCDipValT.h:116
 AliLHCDipValT.h:117
 AliLHCDipValT.h:118
 AliLHCDipValT.h:119
 AliLHCDipValT.h:120
 AliLHCDipValT.h:121
 AliLHCDipValT.h:122
 AliLHCDipValT.h:123
 AliLHCDipValT.h:124
 AliLHCDipValT.h:125
 AliLHCDipValT.h:126
 AliLHCDipValT.h:127
 AliLHCDipValT.h:128
 AliLHCDipValT.h:129
 AliLHCDipValT.h:130
 AliLHCDipValT.h:131
 AliLHCDipValT.h:132
 AliLHCDipValT.h:133
 AliLHCDipValT.h:134
 AliLHCDipValT.h:135
 AliLHCDipValT.h:136
 AliLHCDipValT.h:137
 AliLHCDipValT.h:138
 AliLHCDipValT.h:139
 AliLHCDipValT.h:140
 AliLHCDipValT.h:141
 AliLHCDipValT.h:142
 AliLHCDipValT.h:143
 AliLHCDipValT.h:144
 AliLHCDipValT.h:145
 AliLHCDipValT.h:146
 AliLHCDipValT.h:147
 AliLHCDipValT.h:148
 AliLHCDipValT.h:149
 AliLHCDipValT.h:150
 AliLHCDipValT.h:151
 AliLHCDipValT.h:152
 AliLHCDipValT.h:153
 AliLHCDipValT.h:154
 AliLHCDipValT.h:155
 AliLHCDipValT.h:156
 AliLHCDipValT.h:157
 AliLHCDipValT.h:158
 AliLHCDipValT.h:159
 AliLHCDipValT.h:160
 AliLHCDipValT.h:161
 AliLHCDipValT.h:162
 AliLHCDipValT.h:163
 AliLHCDipValT.h:164
 AliLHCDipValT.h:165
 AliLHCDipValT.h:166
 AliLHCDipValT.h:167
 AliLHCDipValT.h:168
 AliLHCDipValT.h:169
 AliLHCDipValT.h:170
 AliLHCDipValT.h:171
 AliLHCDipValT.h:172
 AliLHCDipValT.h:173
 AliLHCDipValT.h:174
 AliLHCDipValT.h:175
 AliLHCDipValT.h:176
 AliLHCDipValT.h:177
 AliLHCDipValT.h:178
 AliLHCDipValT.h:179
 AliLHCDipValT.h:180
 AliLHCDipValT.h:181
 AliLHCDipValT.h:182
 AliLHCDipValT.h:183
 AliLHCDipValT.h:184
 AliLHCDipValT.h:185
 AliLHCDipValT.h:186
 AliLHCDipValT.h:187
 AliLHCDipValT.h:188
 AliLHCDipValT.h:189
 AliLHCDipValT.h:190
 AliLHCDipValT.h:191
 AliLHCDipValT.h:192
 AliLHCDipValT.h:193
 AliLHCDipValT.h:194
 AliLHCDipValT.h:195
 AliLHCDipValT.h:196
 AliLHCDipValT.h:197
 AliLHCDipValT.h:198
 AliLHCDipValT.h:199
 AliLHCDipValT.h:200
 AliLHCDipValT.h:201
 AliLHCDipValT.h:202
 AliLHCDipValT.h:203
 AliLHCDipValT.h:204
 AliLHCDipValT.h:205
 AliLHCDipValT.h:206
 AliLHCDipValT.h:207
 AliLHCDipValT.h:208
 AliLHCDipValT.h:209
 AliLHCDipValT.h:210
 AliLHCDipValT.h:211
 AliLHCDipValT.h:212
 AliLHCDipValT.h:213
 AliLHCDipValT.h:214
 AliLHCDipValT.h:215
 AliLHCDipValT.h:216
 AliLHCDipValT.h:217
 AliLHCDipValT.h:218
 AliLHCDipValT.h:219
 AliLHCDipValT.h:220
 AliLHCDipValT.h:221
 AliLHCDipValT.h:222
 AliLHCDipValT.h:223
 AliLHCDipValT.h:224
 AliLHCDipValT.h:225
 AliLHCDipValT.h:226
 AliLHCDipValT.h:227
 AliLHCDipValT.h:228
 AliLHCDipValT.h:229
 AliLHCDipValT.h:230
 AliLHCDipValT.h:231
 AliLHCDipValT.h:232
 AliLHCDipValT.h:233
 AliLHCDipValT.h:234
 AliLHCDipValT.h:235
 AliLHCDipValT.h:236
 AliLHCDipValT.h:237
 AliLHCDipValT.h:238
 AliLHCDipValT.h:239
 AliLHCDipValT.h:240
 AliLHCDipValT.h:241
 AliLHCDipValT.h:242
 AliLHCDipValT.h:243
 AliLHCDipValT.h:244
 AliLHCDipValT.h:245
 AliLHCDipValT.h:246
 AliLHCDipValT.h:247
 AliLHCDipValT.h:248
 AliLHCDipValT.h:249
 AliLHCDipValT.h:250
 AliLHCDipValT.h:251
 AliLHCDipValT.h:252
 AliLHCDipValT.h:253
 AliLHCDipValT.h:254
 AliLHCDipValT.h:255
 AliLHCDipValT.h:256
 AliLHCDipValT.h:257
 AliLHCDipValT.h:258
 AliLHCDipValT.h:259
 AliLHCDipValT.h:260
 AliLHCDipValT.h:261
 AliLHCDipValT.h:262
 AliLHCDipValT.h:263
 AliLHCDipValT.h:264
 AliLHCDipValT.h:265