2012-06-19 3 views
1

У меня есть довольно большой код для программного обеспечения для анализа данных Root (CERN), и у меня есть пробег данных, которые я хочу просмотреть для неудачных прогонов. Я имею их все в одном каталоге, но хочу написать сегмент кода, чтобы за один раз извлечь один файл из этой папки, запустить код, вывести полученные графики, затем взять следующий файл и т. Д. Я использую макрос для запуска этого кода, как и сейчас. Я надеюсь добавить что-то к этому макросу. Я немного новичок в программировании.Считывание многоуровневых файлов независимо

gSystem->Load("AlgoCompSelector_C.so"); 
// make the chains 
std::string filekey; 
TChain tree1 = new TChain("tree"); 
filekey = std::string("data/run715604.EEmcTree_Part1.root"); 
tree1->Add(filekey.data()); 
+2

Почему бы вам просто не изменить это, чтобы обработать только один файл и выйти, и запустить один из этих процессов для каждого файла в каталоге? – m0skit0

+1

Когда вы используете слово * macro * в вопросительном теге «C++», люди предполагают, что вы имеете в виду макрос C++, но я подозреваю, что это не так с вами. Какой у вас макрос? Как вы его запускаете сейчас? –

+0

@ Rob У меня есть файл AlgoCompSelector.C, который затем запускается программой runAlgoCompSelector.C после того, как я скомпилирую первый. @ m0skit0 Я мог бы это сделать, но я хочу просто написать что-то, что работает и выходит из них, без ручного выбора случаев. есть много данных в мире физики высоких энергий ... – wpochron

ответ

1

Чтобы сделать это в одном корневом макросе, вы можете попробовать что-то вроде фрагмента кода ниже. здесь я добавляю файлы в TChain, но вы, конечно, можете заменить TChain::Add тем, что хотите.

int addfiles(TChain *ch, const char *dirname=".", const char *ext=".root") 
{ 
    int added = 0; 
    TSystemDirectory dir(dirname, dirname); 
    TList *files = dir.GetListOfFiles(); 
    if (files) { 
     TSystemFile *file; 
     TString fname; 
     TIter next(files); 
     while ((file=(TSystemFile*)next())) { 
     fname = file->GetName(); 
     if (!file->IsDirectory() && fname.EndsWith(ext)) { 
     ch->Add(fname); // or call your function on this one file 
     ++added; 
     } 
    } 
    } 
    return added; 
} 

(адаптировано из этого корня ток пост: http://root.cern.ch/phpBB3/viewtopic.php?f=3&t=13666)

Сказав, что я думаю, что предложение от @ m0skit0 запустить меньший скрипт каждый раз, когда это лучше один, чем делать то, что вы предлагаете делать выше. Корень кропотливый и более мелкие работы лучше.

 Смежные вопросы

  • Нет связанных вопросов^_^