用变量名称绘制ROOT中的直方图

时间:2012-10-04 15:10:56

标签: c++ root-framework

我不确定如何正确地表达这个问题,但这正是我想要做的。

可以使用cern ROOT使用以下命令

绘制单个直方图
(TH1F*)electron->Draw();

但是我在序列中命名了数十个直方图,例如electron1,elecron2,electron3等,我想写一个简单的循环来绘制它们。我尝试使用sprintf和一个简单的for循环,但ROOT不喜欢它。

char name[20];
(TH1F*)electron->Draw();
for(int j=0;j<5;j++){
            sprintf(name, "%s%d","electron",j);
            (TH1F*)name->Draw("same");
 }

我做错了什么?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您还需要一个额外的步骤。正如@twalberg所说,你有一个字符串,而不是一个对象指针。对于root,你可以做的只是更改代码,以便我添加一行。

char name[20];
electron->Draw();
for(int j=0;j<5;j++){
   sprintf(name, "%s%d","electron",j);
   TH1F *h = (TH1F*)gDirectory->Get(name); // THIS IS THE MISSING LINE
   if ( h ) h->Draw("same"); // make sure the Get succeeded 
 }

额外的行从本地TDirectory按名称获取引用的对象。强制转换必须使gDirectory转换为正确的对象。

当您以交互方式使用root时,这会在幕后神奇地发生。

答案 1 :(得分:2)

创建一个名为“electron0”的字符串,将指向字符串开头的char *强制转换为TH1F *,并将其解除引用,就像字符串实际上是struct TH1F *一样(或class TH1F *)很可能只会导致程序崩溃,与引用名为electron0的变量不同。

可能你最好的选择是,而不是命名一堆变量electron0electron1等......,在TH1F electron[NELECTRONS];中创建一个数组,然后将它们引用为{ {1}},electron[0]等(或者,如果对象是动态分配的,请使用electron[1]并存储指针(具有适当的间接值以引用它们(TH1F *electron[NELECTRONS];或{{ 1}})。