KaliVeda
Toolkit for HIC analysis
Loading...
Searching...
No Matches
KVDatime.cpp
1/*******************************************************************************
2$Id: KVDatime.cpp,v 1.7 2009/01/15 16:10:13 franklan Exp $
3$Revision: 1.7 $
4$Date: 2009/01/15 16:10:13 $
5$Author: franklan $
6*******************************************************************************/
7
8#include "KVDatime.h"
9#include "KVList.h"
10#include "KVString.h"
11#include "TObjArray.h"
12#include "TObjString.h"
13#include "KVError.h"
14
16
19
20
24
26{
27 //called by all ctors
28 //sets up static list of months' names if not already done
29 if (!fmonths) {
30 fmonths = new KVList;
31 fmonths->Add(new TObjString("JAN"));
32 fmonths->Add(new TObjString("FEB"));
33 fmonths->Add(new TObjString("MAR"));
34 fmonths->Add(new TObjString("APR"));
35 fmonths->Add(new TObjString("MAY"));
36 fmonths->Add(new TObjString("JUN"));
37 fmonths->Add(new TObjString("JUL"));
38 fmonths->Add(new TObjString("AUG"));
39 fmonths->Add(new TObjString("SEP"));
40 fmonths->Add(new TObjString("OCT"));
41 fmonths->Add(new TObjString("NOV"));
42 fmonths->Add(new TObjString("DEC"));
43 }
44 ndatime++;
45 fStr = "";
46}
47
48
49
51
53 : TDatime()
54{
55 init();
56}
57
58
59
101
103 : TDatime()
104{
105 //if f = KVDatime::kGANACQ:
106 //
107 //Decodes GANIL acquisition (INDRA) run-sheet format date into a TDatime
108 //
109 //Format of date string is: `29-SEP-2005 09:42:17.00`
110 //
111 //if f = KVDatime::kGANACQ2010:
112 //
113 //Decodes GANIL acquisition runfile format date into a TDatime
114 //
115 //Format of date string is: `27Nov10_02h07m40s`
116 //
117 //if f = KVDatime::kGANACQNarval:
118 //
119 //Decodes GANIL Narval acquisition runfile format date into a TDatime
120 //
121 //Format of date string is: `12-04-18_17h09m41s`
122 //
123 //if f = KVDatime::kSQL:
124 //
125 //Decodes SQL format date into a TDatime (i.e. same format as returned
126 //by TDatime::AsSQLString(): `2007-05-02 14:52:18`)
127 //
128 //if f = KVDatime::kSRB:
129 //
130 //Decodes SRB format date into a TDatime
131 //
132 //Format of date string is: `2008-12-19-15.21`
133 //
134 //if f = KVDatime::kIRODS:
135 //
136 //Decodes IRODS format date into a TDatime
137 //
138 //Format of date string is: `2008-12-19.15:21`
139 //
140 //if f = KVDatime::kDMY:
141 //
142 //Decodes DMY format date into a TDatime
143 //
144 //Format of date string is: `19/12/2008`
145
146 init();
147 switch (f) {
148 case kGANACQ:
149 SetGanacqDate(DateString);
150 break;
151 case kGANACQ2010:
152 SetGanacq2010Date(DateString);
153 break;
154 case kGANACQNarval:
155 SetGanacqNarvalDate(DateString);
156 break;
157 case kSQL:
158 SetSQLDate(DateString);
159 break;
160 case kSRB:
161 SetSRBDate(DateString);
162 break;
163 case kIRODS:
164 SetIRODSDate(DateString);
165 break;
166 case kDMY:
167 SetDMYDate(DateString);
168 break;
169 default:
170 Error(KV__ERROR(KVDatime), "Unknown date format");
171 }
172}
173
174
175
178
180{
181 // copy assignment operator
182 return dynamic_cast<KVDatime&>(TDatime::operator=(d));
183}
184
185
186
188
190{
191 ndatime--;
192 if (!ndatime) {
193 delete fmonths;
194 fmonths = 0;
195 }
196}
197
198
199
203
204void KVDatime::SetSQLDate(const Char_t* DateString)
205{
206 //Decodes SQL format date into a TDatime (i.e. same format as returned
207 //by TDatime::AsSQLString(): "2007-05-02 14:52:18")
208 Int_t Y, M, D, h, m, s;
209 sscanf(DateString, "%4d-%02d-%02d %02d:%02d:%02d",
210 &Y, &M, &D, &h, &m, &s);
211 Set(Y, M, D, h, m, s);
212}
213
214
215
220
221void KVDatime::SetSRBDate(const Char_t* DateString)
222{
223 //Decodes SRB format date into a TDatime
224 //Format of date string is:
225 // 2008-12-19-15.21
226
227 Int_t Y, M, D, h, m, s;
228 sscanf(DateString, "%4d-%02d-%02d-%02d.%02d",
229 &Y, &M, &D, &h, &m);
230 s = 0;
231 Set(Y, M, D, h, m, s);
232}
233
234
235
240
241void KVDatime::SetIRODSDate(const Char_t* DateString)
242{
243 //Decodes IRODS format date into a TDatime
244 //Format of date string is:
245 // 2008-12-19.15:21
246
247 Int_t Y, M, D, h, m, s;
248 sscanf(DateString, "%4d-%02d-%02d.%02d:%02d",
249 &Y, &M, &D, &h, &m);
250 s = 0;
251 Set(Y, M, D, h, m, s);
252}
253
254
255
258
259void KVDatime::SetDMYDate(const Char_t* DMYString)
260{
261 // Set date from string in format "DD/MM/YYYY"
262 Int_t Y, M, D;
263 sscanf(DMYString, "%2d/%2d/%4d", &D, &M, &Y);
264 Set(Y, M, D, 0, 0, 0);
265}
266
267
268
272
273void KVDatime::SetGanacq2010Date(const Char_t* GanacqDateString)
274{
275 // Decodes dates in new (2010) format of GANIL acquisition
276 // run files, e.g. run_0058.dat.27Nov10_02h07m40s
277 Int_t Y, D, H, M, S;
278 Char_t Month[5];
279 TString tmp(GanacqDateString);
280 tmp.ToUpper();
281 tmp.ReplaceAll("_", " ");
282 if (sscanf(tmp.Data(), "%02d%3s%02d %02dH%02dM%02dS", &D, Month, &Y, &H, &M, &S) == 6) {
284 Int_t month = 0;
285 if (mm) month = fmonths->IndexOf(mm) + 1;
286 Y += 2000;
287 Set(Y, month, D, H, M, S);
288 }
289}
290
291
292
296
297void KVDatime::SetGanacqNarvalDate(const Char_t* GanacqDateString)
298{
299 // Decodes dates in format of GANIL Narval acquisition
300 // run files, e.g. run_0058.dat.27-11-10_02h07m40s
301 Int_t Y, D, H, M, S, Month;
302 TString tmp(GanacqDateString);
303 tmp.ToUpper();
304 tmp.ReplaceAll("_", " ");
305 if (sscanf(tmp.Data(), "%02d-%02d-%02d %02dH%02dM%02dS", &D, &Month, &Y, &H, &M, &S) == 6) {
306 Y += 2000;
307 Set(Y, Month, D, H, M, S);
308 }
309}
310
311
312
322
323void KVDatime::SetGanacqDate(const Char_t* GanacqDateString)
324{
325 //Decodes GANIL acquisition (INDRA) run-sheet format date into a TDatime
326 //Format of date string is:
327 // 29-SEP-2005 09:42:17.00
328 // or 29-SEP-2005 09:42:17
329 // or 29-SEP-05 09:42:17.00
330 // or 29-SEP-05 09:42:17
331 //
332 //If format is not respected, we set to current time & date
333
334 KVString tmp(GanacqDateString);
335 TObjArray* toks = tmp.Tokenize("-:. ");
336 if (toks->GetEntries() < 6 || toks->GetEntries() > 7) {
337 // if format is correct, there should be 6 or 7 elements in toks
338 delete toks;
339 Error("SetGanacqDate", "Format is incorrect: %s (should be like \"29-SEP-2005 09:42:17.00\" or \"29-SEP-05 09:42:17\")",
340 GanacqDateString);
341 Set();
342 return;
343 }
344 KV__TOBJSTRING_TO_INT(toks, 0, day)
345 TObject* mm =
346 fmonths->FindObject(((TObjString*) toks->At(1))->String().Data());
347 Int_t month = 0;
348 if (mm)
349 month = fmonths->IndexOf(mm) + 1;
350 KV__TOBJSTRING_TO_INT(toks, 2, year)
351 // year may be written in shortened form: 97 instead of 1997
352 if (year < 100) {
353// Warning("SetGanacqDate",
354// "Ambiguous value for year: %d. Assuming this means: %d",
355// year, (year < 82 ? year + 2000 : year + 1900));
356 (year < 82 ? year += 2000 : year += 1900);
357 }
358 KV__TOBJSTRING_TO_INT(toks, 3, hour)
359 KV__TOBJSTRING_TO_INT(toks, 4, min)
360 KV__TOBJSTRING_TO_INT(toks, 5, sec)
361 delete toks;
362 Set(year, month, day, hour, min, sec);
363}
364
365
366
370
372{
373 //Return date and time string with format "29-SEP-2005 09:42:17.00"
374 //Copy the string immediately if you want to reuse/keep it
375 return Form("%d-%s-%4d %02d:%02d:%02d.00",
376 GetDay(),
377 ((TObjString*) fmonths->At(GetMonth() - 1))->String().
378 Data(), GetYear(), GetHour(), GetMinute(), GetSecond());
379}
380
381
382
384
386{
387 return Form("%02d/%02d/%4d",
388 GetDay(),
389 GetMonth(), GetYear());
390}
391
392
393
400
402{
403 // Returns date & time as a string in required format:
404 // fmt = kCTIME (default) : ctime format e.g. Thu Apr 10 10:48:34 2008
405 // fmt = kSQL : SQL format e.g. 1997-01-15 20:16:28
406 // fmt = kGANACQ : GANIL acquisition format e.g. 29-SEP-2005 09:42:17.00
407 // fmt = kDMY : DD/MM/YYYY
408 switch (fmt) {
409 case kCTIME:
410 fStr = AsString();
411 break;
412 case kSQL:
413 fStr = AsSQLString();
414 break;
415 case kGANACQ:
417 break;
418 case kDMY:
420 break;
421 default:
422 fStr = "";
423 }
424 return fStr.Data();
425}
426
427
428
432
434{
435 // Static method, returns kTRUE if 'date' is in format of GANIL acquisition
436 // e.g. 29-SEP-2005 09:42:17.00
437
438 KVString tmp(date);
439 TObjArray* toks = tmp.Tokenize("-:. ");
440 if (toks->GetEntries() < 6 || toks->GetEntries() > 7) {
441 // if format is correct, there should be 6 or 7 elements in toks
442 delete toks;
443 return kFALSE;
444 }
445 delete toks;
446 return kTRUE;
447}
448
449
450
454
456{
457 // Static method, returns kTRUE if 'date' is in new (2010) format of GANIL acquisition
458 // run files, e.g. run_0058.dat.27Nov10_02h07m40s
459
460 Int_t Y, D, H, M, S;
461 Char_t Month[5];
462 TString tmp(date);
463 tmp.ToUpper();
464 tmp.ReplaceAll("_", " ");
465 if (sscanf(tmp.Data(), "%02d%3s%02d %02dH%02dM%02dS", &D, Month, &Y, &H, &M, &S) == 6)
466 return kTRUE;
467 return kFALSE;
468}
469
470
471
475
477{
478 // Static method, returns kTRUE if 'date' is in format of GANIL Narval acquisition
479 // run files, e.g. run_0058.dat.27-11-10_02h07m40s
480
481 Int_t Y, D, H, M, S, Month;
482 TString tmp(date);
483 tmp.ToUpper();
484 tmp.ReplaceAll("_", " ");
485 if (sscanf(tmp.Data(), "%02d-%02d-%02d %02dH%02dM%02dS", &D, &Month, &Y, &H, &M, &S) == 6)
486 return kTRUE;
487 return kFALSE;
488}
489
490
491
495
497{
498 // Static method, returns kTRUE if 'date' is in SQL format
499 // e.g. 2007-05-02 14:52:18
500
501 Int_t Y, M, D, h, m, s;
502 if (sscanf(date, "%4d-%02d-%02d %02d:%02d:%02d",
503 &Y, &M, &D, &h, &m, &s) != 6) return kFALSE;
504 return kTRUE;
505}
506
507
508
512
514{
515 // Static method, returns kTRUE if 'date' is in SRB format
516 // e.g. 2008-12-19-15.21
517
518 Int_t Y, M, D, h, m;
519 if (sscanf(date, "%4d-%02d-%02d-%02d.%02d",
520 &Y, &M, &D, &h, &m) != 5) return kFALSE;
521 return kTRUE;
522}
523
524
525
529
531{
532 // Static method, returns kTRUE if 'date' is in IRODS format
533 // e.g. 2008-12-19.15:21
534
535 Int_t Y, M, D, h, m;
536 if (sscanf(date, "%4d-%02d-%02d.%02d:%02d",
537 &Y, &M, &D, &h, &m) != 5) return kFALSE;
538 return kTRUE;
539}
540
541
542
544
546{
547 return ((TObjString*) fmonths->At(m - 1))->String().Data();
548}
549
550
551
553
555{
556
557 Double_t total_ins = 0;
558
559 Double_t year_ins = GetYear();
560 year_ins -= ref_year;
561
562 year_ins *= 365.25; //1y=365.25 d
563 year_ins *= 24; //1d=24 h
564 year_ins *= 3660; //1h=60x60=3660 s
565
566 total_ins += year_ins;
567
568 //nombre de jours depuis le debut de l annee
569 Double_t month_ins = GetMonth() - 1;
570 month_ins *= 365.25 / 12; //1month = 30.437d (365.25/12) approximatif
571 month_ins += GetDay(); //-> nombre de jours
572 month_ins *= 24; //1d=24 h
573 month_ins *= 3660; //1h=60x60=3660 s
574
575 total_ins += month_ins; //nombre de jours totals en second
576
577 total_ins += GetHour() * 3600;
578 total_ins += GetMinute() * 60;
579 total_ins += GetSecond();
580
581 return total_ins;
582
583
584}
585
586
587
589
591{
592 Int_t year_ref = from.GetYear();
593 if (year_ref > this->GetYear()) year_ref = this->GetYear();
594
595 Double_t sum = from.GetNumberOfSeconds(year_ref);
596 return this->GetNumberOfSeconds(year_ref) - sum;
597}
598
599
int Int_t
#define d(i)
#define f(i)
bool Bool_t
char Char_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
char * Form(const char *fmt,...)
Extension of TDatime to handle various useful date formats.
Definition KVDatime.h:33
static const Char_t * Month(Int_t m)
Definition KVDatime.cpp:545
Double_t GetNumberOfSeconds(Int_t ref_year=0)
Definition KVDatime.cpp:554
void SetDMYDate(const Char_t *DMYString)
Set date from string in format "DD/MM/YYYY".
Definition KVDatime.cpp:259
void SetIRODSDate(const Char_t *IRODSDateString)
Definition KVDatime.cpp:241
EKVDateFormat
Definition KVDatime.h:41
@ kGANACQ2010
Definition KVDatime.h:48
@ kGANACQ
Definition KVDatime.h:43
@ kGANACQNarval
Definition KVDatime.h:49
static Bool_t IsGANACQFormat(const Char_t *date)
Definition KVDatime.cpp:433
static Bool_t IsSRBFormat(const Char_t *date)
Definition KVDatime.cpp:513
TString fStr
internal buffer used by String method
Definition KVDatime.h:37
virtual ~KVDatime()
Definition KVDatime.cpp:189
const Char_t * String(EKVDateFormat fmt=kCTIME)
Definition KVDatime.cpp:401
static Bool_t IsSQLFormat(const Char_t *date)
Definition KVDatime.cpp:496
static Bool_t IsGANACQ2010Format(const Char_t *date)
Definition KVDatime.cpp:455
void init()
Definition KVDatime.cpp:25
void SetSQLDate(const Char_t *SQLDateString)
Definition KVDatime.cpp:204
void SetGanacqNarvalDate(const Char_t *GanacqDateString)
Definition KVDatime.cpp:297
const Char_t * AsDMYDateString() const
Definition KVDatime.cpp:385
KVDatime & operator=(const KVDatime &)
copy assignment operator
Definition KVDatime.cpp:179
const Char_t * AsGanacqDateString() const
Definition KVDatime.cpp:371
void SetSRBDate(const Char_t *SRBDateString)
Definition KVDatime.cpp:221
static Int_t ndatime
counter
Definition KVDatime.h:35
static Bool_t IsGANACQNarvalFormat(const Char_t *date)
Definition KVDatime.cpp:476
static KVList * fmonths
list of months
Definition KVDatime.h:34
static Bool_t IsIRODSFormat(const Char_t *date)
Definition KVDatime.cpp:530
void SetGanacq2010Date(const Char_t *GanacqDateString)
Definition KVDatime.cpp:273
Double_t GetDureeInSeconds(KVDatime from)
Definition KVDatime.cpp:590
void SetGanacqDate(const Char_t *GanacqDateString)
Definition KVDatime.cpp:323
Extended TList class which owns its objects by default.
Definition KVList.h:28
virtual TObject * FindObject(const char *name) const
virtual TObject * At(Int_t idx) const
virtual void Add(TObject *obj)
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition KVString.h:73
Int_t GetMonth() const
Int_t GetDay() const
Int_t GetHour() const
Int_t GetSecond() const
const char * AsSQLString() const
Int_t GetYear() const
Int_t GetMinute() const
void Set()
TDatime & operator=(const TDatime &d)
const char * AsString() const
Int_t GetEntries() const override
TObject * At(Int_t idx) const override
virtual Int_t IndexOf(const TObject *obj) const
const char * Data() const
void ToUpper()
TObjArray * Tokenize(const TString &delim) const
TString & ReplaceAll(const char *s1, const char *s2)
TH1 * h
void Error(const char *location, const char *fmt,...)
RooArgSet S(Args_t &&... args)
double min(double x, double y)
constexpr Double_t H()
TMarker m
ClassImp(TPyArg)