чтение файла данных для построения графика root cern

Я создал скрипт, чтобы брать данные из текстового файла и отображать их в Root (CERN), но не использовал root около года, обновил до текущей версии Root, и теперь он получает ошибку «Ошибка: функция readprn () не определен в текущей области :0: * Исправлена ​​ошибка интерпретатора *", когда я пытаюсь использовать его с Root.

Он запускает файл данных Excel, который я сохранил как текстовый файл. Первый столбец — это значение x, соответствующее каждому значению y в последующих 768 столбцах. В конце он рисует, подходит и зацикливается на паре графиков.

Мне в основном интересно, есть ли что-нибудь в новых версиях, из-за чего это не сможет быть прочитано пользователем 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);
    }
}

person Steven    schedule 24.09.2015    source источник
comment
Я думаю, вам нужен тег С++.   -  person Michi    schedule 24.09.2015
comment
Полученная ошибка интерпретатора может означать, что вы просто запускаете этот скрипт без его компиляции. Вы его уже скомпилировали? Если нет, скомпилируйте его вне ROOT. Совсем недавно ROOT перешел с v5 на v6, а интерпретатор CINT был заменен на cling (нет, не clang), что гораздо более ограничивает его возможности. Тем не менее, скомпилируйте его с помощью gcc или clang и запустите вне ROOT. Он должен сказать вам, что происходит.   -  person KyleKnoepfel    schedule 25.09.2015


Ответы (1)


при загрузке вашего макроса в root 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.

person pseyfert    schedule 06.04.2016