1

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

可以使用 cern ROOT 和以下命令绘制单个直方图,

(TH1F*)electron->Draw();

但是我有几十个按顺序命名的直方图,比如电子1、电子2、电子3等,我想写一个简单的循环来绘制它们。我尝试使用 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");
 }

我究竟做错了什么?

提前致谢。

4

2 回答 2

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 时,这会在幕后神奇地发生。

于 2012-10-19T20:52:27.853 回答
2

创建一个显示“electron0”的字符串,将char *指向字符串开头的指针转换为 a TH1F *,并将其取消引用,就好像字符串实际上是 a struct TH1F *(或class TH1F *)很可能只会使程序崩溃,并且不一样作为引用一个名为electron0.

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

于 2012-10-04T19:17:56.973 回答