1 #ifndef ALILHCDIPVALT_H
2 #define ALILHCDIPVALT_H
6 #include <TObjString.h>
11 /////////////////////////////////////////////////////////////////////////////////
13 // AliLHCDipValT: templated class to store the array from processed //
14 // LHC DIP data. Associated with the time stamp either of the value //
15 // acquisition or the last sample timestamp if many samples were processed //
17 // Author: ruben.shahoyan@cern.ch //
19 /////////////////////////////////////////////////////////////////////////////////
21 //_______________________________________________________________________________________
22 template<class Element> class AliLHCDipValT : public TObject
27 kLastSpecial=BIT(14), // last element of array is special (e.g. assigned error etc)
28 kProcessed1 =BIT(15), // last element of array is special (e.g. assigned error etc)
33 AliLHCDipValT(Int_t size=0, Double_t t=0);
34 AliLHCDipValT(const AliLHCDipValT<Element> &src);
35 virtual ~AliLHCDipValT() {delete[] fArray;}
36 AliLHCDipValT& operator=(const AliLHCDipValT<Element> &src);
37 Element& operator[](Int_t i);
38 Element operator[](Int_t i) const;
40 void SetSize(Int_t size);
41 void SetValue(Int_t i,Element v);
42 void SetValues(const Element *v, Int_t n);
43 void SetTimeStamp(Double_t v) {fTimeStamp = v;}
45 Int_t GetSizeTotal() const {return fSizeTot;}
46 Element GetValue(Int_t i=0) const;
47 Element* GetValues() const {return (Element*)fArray;}
48 Double_t GetTimeStamp() const {return fTimeStamp;}
49 Char_t* GetTimeAsString(Bool_t utc=kTRUE) const {return TimeAsString(fTimeStamp,utc);}
51 void SetProcessed1(Bool_t v=kTRUE) {SetBit(kProcessed1,v);}
52 void SetLastSpecial(Bool_t v=kTRUE) {SetBit(kLastSpecial,v);}
53 Bool_t IsProcessed1() const {return TestBit(kProcessed1);}
54 Bool_t IsLastSpecial() const {return TestBit(kLastSpecial);}
55 Int_t GetSize() const {return IsLastSpecial() ? GetSizeTotal()-1:GetSizeTotal();}
56 Bool_t IsTypeC() const {return TestBit(kChar);}
57 Bool_t IsTypeF() const {return TestBit(kFloat);}
58 Bool_t IsTypeI() const {return !TestBit(kFloat|kChar);}
60 virtual void Clear(const Option_t *opt="");
61 virtual void Print(const Option_t *opt="") const;
63 static Char_t* TimeAsString(double t,Bool_t utc=kTRUE);
67 Double_t fTimeStamp; // timestamp of the entry
68 Int_t fSizeTot; // vector total size (including special slots, like for errors)
69 Element* fArray; //[fSizeTot] array of entries
71 ClassDef(AliLHCDipValT,1)
75 //__________________________________________________________________________
76 template<class Element>
77 AliLHCDipValT<Element>::AliLHCDipValT(Int_t size,Double_t t)
78 : fTimeStamp(t),fSizeTot(0),fArray(0)
82 if (!strcmp(typeid(fArray).name(),typeid(Char_t*).name())) SetBit(kChar);
83 else if (!strcmp(typeid(fArray).name(),typeid(Double_t*).name()) ||
84 !strcmp(typeid(fArray).name(),typeid(Float_t*).name() )) SetBit(kFloat);
88 //__________________________________________________________________________
89 template<class Element>
90 AliLHCDipValT<Element>::AliLHCDipValT(const AliLHCDipValT<Element> &src)
91 : TObject(src),fTimeStamp(src.fTimeStamp),fSizeTot(0),fArray(0)
94 SetSize(src.GetSizeTotal());
95 memcpy(fArray,src.fArray,GetSizeTotal()*sizeof(Element));
98 //__________________________________________________________________________
99 template<class Element>
100 AliLHCDipValT<Element>& AliLHCDipValT<Element>::operator=(const AliLHCDipValT<Element> &src)
104 ((TObject*)this)->operator=(src);
105 if (GetSizeTotal()!=src.GetSizeTotal()) SetSize(src.GetSizeTotal());
106 SetTimeStamp(src.GetTimeStamp());
107 memcpy(fArray,src.fArray,GetSizeTotal()*sizeof(Element));
112 //__________________________________________________________________________
113 template<class Element>
114 Char_t* AliLHCDipValT<Element>::TimeAsString(double t, Bool_t utc)
116 // time as string in UTC or local format
117 time_t tt = (time_t) t;
118 char* st = utc ? asctime(gmtime(&tt)) : ctime(&tt);
119 *(strchr(st,'\n')) = 0;
123 //__________________________________________________________________________
124 template<class Element>
125 void AliLHCDipValT<Element>::SetValue(Int_t i,Element v)
128 if (i>=GetSizeTotal() || i<0) {
129 AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
135 //__________________________________________________________________________
136 template<class Element>
137 void AliLHCDipValT<Element>::SetValues(const Element* v, Int_t n)
140 if (n!=GetSizeTotal()) SetSize(n);
141 memcpy(fArray,v,n*sizeof(Element));
144 //__________________________________________________________________________
145 template<class Element>
146 Element& AliLHCDipValT<Element>::operator[](Int_t i)
148 //obtain value refeterence
149 if (i>=GetSizeTotal() || i<0) {
150 AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
156 //__________________________________________________________________________
157 template<class Element>
158 Element AliLHCDipValT<Element>::operator[](Int_t i) const
161 if (i>=GetSizeTotal() || i<0) {
162 AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
168 //__________________________________________________________________________
169 template<class Element>
170 Element AliLHCDipValT<Element>::GetValue(Int_t i) const
173 if (i>=GetSizeTotal() || i<0) {
174 AliError(Form("Index %d is out of range 0:%d",i,GetSizeTotal()-1));
180 //__________________________________________________________________________
181 template<class Element>
182 void AliLHCDipValT<Element>::SetSize(Int_t sz)
187 arr = new Element[sz];
188 int nc = GetSizeTotal() > sz ? sz:GetSizeTotal(); // n elems to copy
189 if (nc) memcpy(arr, fArray, nc*sizeof(Element));
190 if (nc<sz) memset(arr+nc, 0, (sz-nc)*sizeof(Element));
191 if (GetSizeTotal()) delete[] fArray;
202 //__________________________________________________________________________
203 template<class Element>
204 void AliLHCDipValT<Element>::Print(const Option_t *opt) const
206 // print time and value
209 if (str.Contains("raw")) printf("%.1f ",GetTimeStamp());
210 else printf("[%s] ",GetTimeAsString(!str.Contains("loc")));
212 TString tp = typeid(fArray).name();
213 if ( tp==typeid(Char_t*).name() ) printf(": %s\n",(Char_t*)fArray);
216 if (sz>1) printf("\n");
217 Bool_t eolOK = kFALSE;
218 for (int i=0;i<sz;i++) {
219 if (tp == typeid(Int_t*).name() || tp == typeid(UInt_t*).name() ) {
220 if (!str.Contains("bit")) printf(" %6d |" ,(Int_t)fArray[i]);
223 int val = (int)fArray[i];
224 for (int j=sizeof(int)*8;j--;) printf("%d",(val>>j)&0x1);
229 else if (tp == typeid(Double_t*).name() || tp == typeid(Float_t*).name()) printf(" %+.3e |",(Float_t)fArray[i]);
232 if ( (i+1)%5 == 0) {printf("\n"); eolOK = kTRUE;}
234 if (IsLastSpecial()) {
235 if (sz>1 && !eolOK) {printf("\n"); eolOK = kTRUE;}
236 if (tp == typeid(Double_t*).name() || tp == typeid(Float_t*).name()) {
237 printf(" Error: %+e\n",(Float_t)fArray[sz]);
241 if (!eolOK) printf("\n");
246 //__________________________________________________________________________
247 template<class Element>
248 void AliLHCDipValT<Element>::Clear(const Option_t *)
250 // reset to 0 everything
252 memset(fArray,0,GetSizeTotal()*sizeof(Element));
256 typedef AliLHCDipValT<Double_t> AliLHCDipValD;
257 typedef AliLHCDipValT<Float_t> AliLHCDipValF;
258 typedef AliLHCDipValT<Int_t> AliLHCDipValI;
259 typedef AliLHCDipValT<Char_t> AliLHCDipValC;