文字列したい(TString

 1#include <TString.h>
 2
 3// 文字列の初期化
 4TString str = "ROOT string";
 5
 6// フォーマット文字列を作成
 7TString name;
 8name.Form("histogram_%d", i);
 9
10// 文字列データを取得
11const char* cstr = name.Data();

TStringはROOTの文字列クラスです。 TStringを使うことで、C文字列ポインターのメモリ管理の煩雑さを排除でき、printfと同じようなフォーマット指定子で柔軟に文字列を生成できます。 C/C++の文字や文字列の扱いの面倒くささを解消してくれます。

さらにTH1TTreeなどのROOTオブジェクトと直接連携可能なため、データ分析のワークフローで非常に便利です。

 1from ROOT import TString
 2
 3# 文字列の初期化
 4str_obj = TString("ROOT string")
 5
 6# フォーマット文字列を作成
 7name = TString()
 8name.Form("histogram_%d", i)
 9
10# 文字列データを取得
11cstr = name.Data()

参考

C++標準ライブラリを使う場合

 1#include <string>
 2#include <cstdio>
 3
 4// 文字列の初期化
 5std::string str = "ROOT string";
 6
 7// フォーマット文字列を作成(C++20以降)
 8std::string name = std::format("histogram_{}", i);
 9
10// または snprintf を使う場合
11char buffer[256];
12snprintf(buffer, sizeof(buffer), "histogram_%d", i);
13std::string name(buffer);
14
15// 文字列データを取得
16const char* cstr = name.c_str();

C++標準ライブラリでも同様のことができますが、 TStringの方が記述が簡潔で、ROOTオブジェクトとの連携がスムーズです。

フォーマット文字列したい(TString::Form

1#include <TString.h>
2
3TString str;
4str.Form("Hist%d", 5);
5// 結果: "Hist5"
6
7TString name;
8name.Form("h_%02d_%s", 3, "data");
9// 結果: "h_03_data"

TString::Formメソッドで、printfと同じようにフォーマット指定子を使って文字列を作成できます。 ループ処理中にファイル名やオブジェクト名を自動生成する場合に便利です。

文字列を取得したい(TString::Data

1#include <TString.h>
2
3TString name;
4name.Form("histogram_%d", 10);
5
6// C文字列として取得
7const char* cstr = name.Data();
8printf("Name: %s\n", cstr);

TString::Dataメソッドで、TStringオブジェクトをC文字列(const char*)として取得できます。 TH1TTreeなどのコンストラクターに渡す場合に使います。

実践例:ループ処理で複数のヒストグラムを作成したい

 1#include <TString.h>
 2#include <TH1D.h>
 3
 4const Int_t nhist = 10;
 5TString hname, htitle;
 6
 7for (Int_t i = 0; i < nhist; i++) {
 8    // オブジェクト名を生成
 9    hname.Form("h%02d", i);
10
11    // タイトルを生成
12    htitle.Form("%s;%s;%s", hname.Data(), "x axis", "y axis");
13
14    // ヒストグラムを作成
15    h[i] = new TH1D(hname.Data(), htitle.Data(), xbin, xmin, xmax);
16}

このサンプルでは、 TStringを使って異なるオブジェクト名を自動生成して、複数のヒストグラムを作成しています。

  • Formで毎回新しい文字列を生成できるため、異なるオブジェクト名を作成可能

  • 同じのオブジェクト名のヒストグラムは作成できないため、ループ番号を含ませる工夫が必要

関連メソッド

参考資料