2012-10-04 42 views
1

我不确定如何正确说出这个问题,但这是我正在尝试做的。根据不同变量名称在ROOT中绘制直方图

单个直方图可以使用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"); 
} 

我在做什么错?

在此先感谢。

回答

3

你需要一个额外的步骤。作为@twalberg说,你有一个字符串,而不是一个对象指针。对于根本你可以做的只是改变你的代码,以便我增加一条额外的线。

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时,这种情况在后台神奇地发生。

+0

这是正确的答案。尽管完全遵循ROOT的风格,但可以用'std :: string'和'boost :: lexical_cast'完成相同的功能,这是一个更具意义的C++,但对大多数ROOT用户来说也可能更令人困惑,因为它不起作用在CINT宏中也是如此。 –

+0

谢谢你。正如你可能知道的Root根本不认为C++ :) –

+0

很快所有的事情肯定会随着root-6的发布而改变,在这里root的替换cint。每个人都会为现代C++典型的高级功能级别的程序。 ROOT宏一次用于绘制20k行代码以创建并填充不同的直方图将在几行将算法映射到数据容器中完成。是的,我确信一旦允许我们在ROOT分析宏中编写适当的C++,我们就能够做到。 –

2

创建一个字符串,上面写着“electron0”,铸造char *指向字符串的开头为TH1F *,并提领仿佛字符串实际上是一个struct TH1F *(或class TH1F *)是最有可能只是要崩溃该程序与引用名为electron0的变量不同。

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