通过跳过 CERN ROOT 中的第 1 47 行从文本文件绘制图形

Drawing graph from a text file by skipping 1st 47 rows in CERN ROOT

我是 root 新手。很抱歉,如果有什么很容易的话。 我无法在 root V 5.34 中调用我的文本文件 ("Image.txt")。此文本文件包含 9 列和 250 行。我想读取第 2、3、4、5 和 7(用“,”分隔并具有第 47 行的值)列作为 x、y、a、b、z。然后我想将图形绘制为 y Vs x、b vs a 和直方图作为 count/bin Vs z。在此之前,我需要从第 47 行中获取这些列的值。我该如何解决这个问题?在此先感谢您的帮助。文件 (Image.txt) 作为附件: http://www.filedropper.com/image_9

我希望您不是在寻找提供完整解决方案的人...让我在这里简要概述一个基本概念,以帮助您入门。

  1. 打开文件进行阅读
  2. 遍历文件中的行并将行保存为字符串。您可以添加一个计数器并跳过您不想解析的行。
  3. 分析各个列中值的字符串。有很多方法可以做到这一点...只需搜索此网站即可。
  4. 使用提取的值将点添加到 TGraph 或填充 TH1

在 C++ 中,代码可能如下所示:

std::ifstream myfile("Image.txt");
std::string myline;

while ( std::getline(myfile, myline) )
{
  // Parse the string... E.g.:
  //int d1, d2; float f1;
  //sscanf(line.c_str(), "%d,%f,%d", &d1, &f1, &d2);

  // Use d1, d2, f1 to fill a histogram or whatever...
}
FILE *f = fopen("Image.nap","r");
if (!f) {
  printf("Could not open Image.nap\n");
  return;
}
char line[300];
float v1,v2,v3,v4,v5,v6,v7,v8;
Int_t i = 0;
TGraph *g = new TGraph();
TGraph *g1 = new TGraph();
TCanvas *c1 = new TCanvas("c1","c1",800,1000);
TH1F *h1=new TH1F ("h1","Elpsarea Histo",100,-400,400);

while (fgets(line,160,f)) {
  if (i>49) {
     sscanf(&line[0]  ,"%g,%g,%g,%g,%g,%g,%g,%g",&v1,&v2,&v3,&v4,&v5,&v6,&v7,&v8);
     g->SetPoint(i,v2,v3);
     g1->SetPoint(i,v5,v6);
     printf ("%g\t", v8);
     h1.Fill(v8);
     }
  i++;
 }
 fclose(f);
 c1->Divide(1,2);
 c1->cd(1);
 g->Draw("AP");

c1.cd(2)
g1.Draw("AP");

TCanvas *c2 = new TCanvas("c2","Histo for Elps area",600,400);
h1->GetXaxis()->SetTitle("Elepse Area Imicron)");
h1->GetYaxis()->SetTitle("Count/bin");
h1->GetXaxis()->CenterTitle();
h1->GetYaxis()->CenterTitle();
h1.Draw();