2015-09-24 74 views
0

我創建了一個腳本,從文本文件中獲取數據並將其繪製在根(CERN)中,但在大約一年時間內沒有使用root,更新爲當前版本的Root,現在它獲取錯誤「錯誤:函數readprn()沒有在當前範圍中定義:0: *解釋器錯誤恢復*」當我嘗試使用它與根。閱讀數據文件的根cern圖

它運行一個excel數據文件,我保存爲一個txt文件。第一列是後續768列中每個y值對應的x值。最後,它繪製並擬合併在幾張圖上循環。

我最想知道的是,如果在新版本中有任何東西會導致它無法被root讀取。

#include <TGraph.h> 
#include <TCanvas.h> 
#include <TF1.h> 
#include <TMath.h> 
#include <TStyle.h> 

#include <iostream> 
#include <fstream> 
#include <string> 

using std::cout; using std::endl; 

int threshold1(Int_t channel=0) 
{ 
    const char* ifname = "thresholdScanRun110FPGA4.txt"; 

    cout<< "processing file " << ifname <<endl; 
    std::ifstream ifile(ifname); 
    if (!ifile) { 
     cout<< "Could not find file " << ifname <<endl; 
     return 0; 
    } 

    //std::string line; 
    // discard the first two lines 
    //std::getline(ifile, line); 
    //cout<< line <<endl; 
    //std::getline(ifile, line); 
    //cout<< line <<endl; 

    std::string str; 
    double number; 

    // read the first row (in sense of Exel's row) 
    ifile >> str; 
    //cout<< str <<endl; 
    for (int i=0; i<768; ++i) { 
     ifile >> number; 
     //cout<< number << " "; 
    } 
    //cout<<endl; 
    // read the second "row" 
    ifile >> str; 
    //cout<< str <<endl; 
    for (int i=0; i<768; ++i) { 
     ifile >> number; 
     //cout<< number << " "; 
    } 
    //cout<<endl; 

    double thres[60]; 
    double prob[60][768]; 
    int nthres_max = 60; 

    for (int ithres=0; ithres<nthres_max; ++ithres) { 
     ifile >> thres[ithres]; 
     for (int iprob=0; iprob<768; ++iprob) ifile >> prob[ithres][iprob]; 
    } 

    cout<< "The channel " << channel <<endl; 
    for (int ithres=0; ithres<60; ++ithres) { 
     cout<< thres[ithres] << " " << prob[ithres][channel] <<endl; 
    } 

    Double_t probability[60]; 
    for (int ithres=0; ithres<60; ++ithres) probability[ithres] = prob[ithres][channel]; 
    TGraph* gr = new TGraph(60, thres, probability); 
    gr->SetMarkerStyle(29); 
    gr->SetMarkerColor(4); 
    gr->SetTitle("Threshold Scan ChipX, ChanY"); 

    TF1* ferfc = new TF1("ferfc", "0.5*TMath::Erfc((x-[0])/[1])", 0, 767); 
    ferfc->SetParameters(100,10); 

    new TCanvas; 
    gStyle->SetOptFit(1); 
    gr->Draw("apl"); 
    gr->Fit("ferfc"); 

    return 0; 
} 

int threshold_all() 
{ 
    for (Int_t channel=0; channel<2; ++channel) { 
     threshold1(channel); 
    } 
} 
+0

我認爲你需要C++標籤。 – Michi

+0

「收到解釋器錯誤」可能意味着您只是在不編譯它的情況下運行此腳本。你編譯過了嗎?如果沒有,請在ROOT外編譯。 ROOT最近從v5變成了v6,而CINT解釋器已經被替換爲保持(no,not clang),這對於它允許的限制更多。也就是說,用gcc或clang編譯它並在ROOT之外運行。它應該告訴你發生了什麼事。 – KyleKnoepfel

回答

0
加載根6.07/04宏時

,與.L macro.C我收到以下警告:

/tmp/tmp.rQTNVdlydv/macro.C:88:1: error: control reaches end of non-void function [-Werror,-Wreturn-type] 

這是因爲你沒有return語句中int threshold_all()。解決這個宏對我來說似乎很好。 (運行,打開一個畫布,輸出一些適合的輸出,因爲我沒有輸入值,所以我創建了一個帶有幾個發明數字的文本文件,並將閾值和值減少到5x6,這就是爲什麼我不是關注我收到的異常終止合約)。

同時加載宏與編譯.L macro.C+一旦添加return語句看起來很好。