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

Я создал скрипт для извлечения данных из текстового файла и отображения его в 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);
}
}

0

Решение

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

потому что у вас нет оператора возврата в int threshold_all(), Исправление этого макроса кажется мне подходящим. (запускает, открывает холст, выводит некоторые данные. Так как у меня нет ваших входных значений, я просто создал текстовый файл с несколькими выдуманными числами и уменьшил количество порогов и значений до 5×6. Именно поэтому я не обеспокоен ненормальным завершением посадки, которое я получаю.).

Также загрузка макроса с компиляцией .L macro.C+ выглядит хорошо для меня, как только добавив оператор возврата.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]