2009/11/15

ROOTの時間

ROOTで時間を扱うためには、UNIX timeに変換する必要がある。
例えば2009年11月15日00時00分00秒なら、

TDatime T0(2009, 11, 15, 00, 00, 00);

と書いてやると、T0という構造体に時間を入れることが出来る。
ただしこれをROOTの時間に直そうとすると、2009年11月15日にはならない。
これはなぜかというと、UNIX時間が1970年1月1日00時00分00秒からの経過秒数であるのに対し、ROOT時間は1995年1月1日00時00分00秒からの経過秒数になっているためだ。
従ってROOTで時間を使うときは、この点に注意する必要がある。

ROOTのUsers Guideの9章Graphics and Graphical User InterfaceのAxis with Time Unitsにtime offsetの3つの解決策が示されている。
1つ目は構造体にSetTimeOffsetを使うという方法。
gStyleのSetTimeOffsetを使って時間の構造体を変換すれば、このオフセット込みで計算してくれる。
2つ目はSetTimeOffsetを軸に適用すればいいというもの。
3つ目はSetTimeFormatを軸に適用するというもの。

もっと簡単にやるには、UNIX timeに変換した後で、788918400秒を引いてやればいい。
これは1995年1月1日00時00分00秒のUNIX timeで、実際には同じ結果になる。
上の例だと、

Int_t x0 = T0.Convert() - 788918400;

と書くと、x0にROOT時間の秒が入る。
グラフに使うための軸は、

TH1F *frame = new TH1F("frame", "", 9, x0, x1);
frame->GetXaxis()->SetTimeDisplay(1);
frame->GetXaxis()->SetTimeFormat("%y\/%m\/%d");

としてやればいい。

0 件のコメント: