【问题标题】:Reading multipile files independently独立读取多个文件
【发布时间】:2012-06-21 15:50:39
【问题描述】:

我有一个用于数据分析软件 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() );

【问题讨论】:

  • 你为什么不把它改成只处理一个文件并退出,然后为目录中的每个文件启动这些进程之一?
  • 当你在标记为“C++”的问题中使用macro这个词时,人们会认为你的意思是你有一个C++宏,但我怀疑情况并非如此你。你有什么样的宏?你现在如何运行它?
  • @ Rob 我有一个名为 AlgoCompSelector.C 的文件,然后在我编译第一个文件后由程序 runAlgoCompSelector.C 运行该文件。 @m0skit0 我可以这样做,但我只想写一些运行并退出所有这些的东西,而不需要手动选择案例。高能物理世界有很多数据...
  • 你想要你的 C++ 解决方案吗?我怀疑您的任务有更好的语言(例如使用bashcmd 脚本)如果您想要C++,请发布一些现有代码以更清楚您拥有什么以及您需要什么。
  • 我的代码必须在 C++ 中运行,数据分析软件才能读取它:这是我的数据如何读入我的程序的一点:gSystem->Load("AlgoCompSelector_C.so") ; // 制作链 std::string filekey; TChain tree1 = new TChain("tree"); filekey = std::string("data/run715604.EEmcTree_Part1.root"); tree1->Add(filekey.data());

标签: c++ root-framework


【解决方案1】:

要在单个根宏中执行此操作,您可以尝试以下代码 sn-p 之类的操作。在这里,我将文件添加到 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 建议每次启动一个较小的脚本比执行您上面建议的操作更好。 Root 是挑剔的,拥有较小的工作更好。

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多