Vector Читать из TTREE пустое [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Vector Читать из TTREE пустое [закрыто]

Сообщение Anonymous »

Я пытаюсь прочитать ttree из корневого файла и скопировать некоторые переменные в плоское дерево.
И это работает очень хорошо для многих переменных (как и для Ntracks в примере ниже), но когда дело доходит до вектора какого -то пользовательского класса, я в конечном итоге с пустыми векторами, что у корне. То же поведение: < /p>

Код: Выделить всё

#include 
#include 
#include 

#include 
#include 

#include "caf__SRTrack.h"

TFile *outFile = nullptr;

TTree *inTree = nullptr, *outTree = nullptr;

int main(int argc, const char *const argv[]){

outFile = new TFile("/home/raphael/Bureau/travail/stage_apc/code/mini_flatTree.root","recreate");
TFile infile("/home/raphael/Bureau/travail/stage_apc/code/caf_new_sum_weighted.root");

inTree = (TTree*) infile.Get("cafTree");
outTree = new TTree("flatTree","flatTree");

outTree->SetDirectory(outFile);

std::vector tracks;
inTree->SetBranchAddress("fd.hd.pandora.tracks",&tracks);
outTree->Branch("tracks",&tracks);

unsigned long ntracks;
inTree->SetBranchAddress("fd.hd.pandora.ntracks",&ntracks);
outTree->Branch("ntracks",&ntracks);

for (int i = 0, cafEntries = 20; i < cafEntries; i++){
inTree->GetEntry(i);

std::cout 
И результат, который я получаю, это: < /p>
Warning in : No streamer element for branch: nd.trkmatch.extrap subbranch: nd.trkmatch.extrap.minervaid.ixn
Warning in : No streamer element for branch: nd.trkmatch.extrap subbranch: nd.trkmatch.extrap.minervaid.idx
Warning in : No streamer element for branch: nd.shwmatch.extrap subbranch: nd.shwmatch.extrap.minervaid.ixn
Warning in : No streamer element for branch: nd.shwmatch.extrap subbranch: nd.shwmatch.extrap.minervaid.idx
size of vector `tracks` : 0 ; ntracks : 2
size of vector `tracks` : 0 ; ntracks : 3
size of vector `tracks` : 0 ; ntracks : 1
size of vector `tracks` : 0 ; ntracks : 1
size of vector `tracks` : 0 ; ntracks : 4
size of vector `tracks` : 0 ; ntracks : 4
size of vector `tracks` : 0 ; ntracks : 4
size of vector `tracks` : 0 ; ntracks : 1
size of vector `tracks` : 0 ; ntracks : 1
size of vector `tracks` : 0 ; ntracks : 3
size of vector `tracks` : 0 ; ntracks : 3
size of vector `tracks` : 0 ; ntracks : 1
size of vector `tracks` : 0 ; ntracks : 3
size of vector `tracks` : 0 ; ntracks : 8
size of vector `tracks` : 0 ; ntracks : 8
size of vector `tracks` : 0 ; ntracks : 8
size of vector `tracks` : 0 ; ntracks : 8
size of vector `tracks` : 0 ; ntracks : 3
size of vector `tracks` : 0 ; ntracks : 1
size of vector `tracks` : 0 ; ntracks : 1
Переменная ntracks должна ссылаться на количество треков, записанных в каждом событии, что должно быть размером с векторных треков . Но, как вы можете видеть, даже когда есть, по крайней мере, один трек, вектор отчаянно пуст. Классы, которые мне нужны (включая CAF :: Srtrack ) из корневого файла и создают соответствующие DictionNary, используя это в интерактивном корне:

Код: Выделить всё

TFile f("caf_new_sum_weighted.root")
f.MakeProject("includesCAF","*","update+")
< /code>
У вас есть представление о том, в чем проблема?#pragma link C++ class std::vector+;
В заголовке Linkdef, а затем восстановите Dickinnaries, выполняя ./makep в терминале, чтобы включить Dickitednary, специально для STD :: Vector , но это не имело эффекта. /> vector tracks = {caf::SRTrack(), caf::SRTrack()};
< /code>
Но в результате я получаю постоянный вектор размера 2, а атрибуты 2 треков, которые он содержит, являются постоянными (независимыми от события) случайными значениями. Корень, кажется, просто не может переписать вектор. g ++



Подробнее здесь: https://stackoverflow.com/questions/797 ... e-is-empty
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»