Гистограмма с ntuple с использованием CERN ROOT

Невозможно получить / заполнить гистограмму, начиная с ntuple, используя ROOT.

Я искал предыдущие ответы, и все они используют ttree, включая корневую документацию. У меня его нет. Не новичок в использовании root, но мне очень трудно его использовать. Ни один из найденных методов не работает с моим кодом (или я не знаю, как их реализовать).

Это примерно то, что я нашел повсюду:

https://root.cern.ch/root/roottalk/roottalk03/2620.html

но нет, я использую TH1F и у меня нет дерева (см. код ниже)

{    
   gROOT->Reset();

#include "Riostream.h"
#include <iostream>
#include <fstream>

  in.open( "somefile.dat");

TNtuple *ntuple = new TNtuple("ntuple","some data from ascii file","index1:index2:index3");

//declare variables, create histograms   
   Double_t x,y,Price[215000],Diff[215000],Ret[215000],trend, Data[215000];
   TFile *f = new TFile("TrendsCountBove.root","RECREATE");
   TH1F *h1 = new TH1F("h1","Retornos",100,-0.3,0.3);
   TH1F *histo = new TH1F ("hist_from_ntuple", "some title", nbins, min,max);

//do some stuff (didn't paste all calculations i do, but that works fine)

for (Int_t i = 0; i+1 < nlines-1; i++) {
     Diff[i] = Price[i+1]-Price[i];
     Ret[i] = TMath::Log(Price[i+1])-TMath::Log(Price[i]);
     h1->Fill(Ret[i]);
     ntuple->Fill(i*1.0,Ret[i],Price[i+1]);
  }

Итак, все работает нормально, никаких проблем. Но опять же, пожалуйста, кто-нибудь мог бы объяснить мне как можно подробнее, как я могу заполнить histo, скажем, index1, или 2, или 3. Я отстой в C ++, и мне это не очень нравится, и я не понимаю его.

Я ожидаю красивой гистограммы, где я могу установить все вещи, такие как заголовок, максимум и минимум, поле статистики и т. Д. По умолчанию root делает это через ntuple, но это не то, что мне нужно.

Большое спасибо заранее.


person John Doe    schedule 25.03.2019    source источник
comment
TNtuple наследуется от TTree, поэтому то, что вы можете делать с TTree, также можно сделать с TNtuple. Так что, если вы видели примеры с деревом, вы сможете просто использовать их. Т.е. ntuple->Draw("branchname>>histname");.   -  person pseyfert    schedule 26.03.2019
comment
Если вам не нравится C ++, почему бы не попробовать использовать Python с PyROOT - root.cern.ch/pyroot . Или даже полностью отказаться от ROOT и попробовать что-нибудь вроде NumPy / MatPlotlib matplotlib.org?   -  person Nick Edwards    schedule 27.03.2019
comment
Другие приятные интерфейсы Python: root_numpy и root_pandas. Это ограничено, но отлично подходит для загрузки ROOT-деревьев в массивы Numpy или фреймы данных Pandas и после этого работает в основном без ROOT.   -  person Keldorn    schedule 03.04.2019


Ответы (1)


Большое спасибо, ребята, первый ответ сработал как надо. Теперь я бы хотел использовать python вместо ROOT. Проблема в том, что мои научные руководители (оба физики, работающие с частицами) никогда не хотели этого. В итоге мучился около полугода с c ++ и ROOT. Такая тягость.

Спасибо еще раз!

person John Doe    schedule 27.03.2019
comment
хм, все же комментарий Ника Эдвардса правильно указал, что python и ROOT не исключают друг друга, root можно использовать из C ++ и из python, так что пока ваши директора настаивают только на root, а не на C ++, вы можете использовать python API, и они все равно смогут читать ваши файлы .root. в любом случае предоставив им самим решать, что они от вас хотят. - person pseyfert; 01.04.2019