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

时间:2016-10-26 02:46:10

标签: text graph root-framework

我是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

2 个答案:

答案 0 :(得分:1)

我希望你不是在找人提供完整的解决方案......让我简单地概述一下让你入门的基本想法。

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

答案 1 :(得分:0)

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();