1

以前、公式ルート (CERN) フォーラムでこの質問をしましたが、今のところ問題は解決されていません。私の間違いを指摘するか、別の方法を提案することで、ここにいる誰かが助けてくれるでしょうか?

イベントのある TTree があります。TTree には、各イベントの UNIX 時間を持つ 1 つのブランチと、その他のいくつかのブランチがあります。これらを個別に分析できるように、時間間隔に基づいてイベントのサブセットを選択したいと考えています。選択を行うために、別のツリーを作成し、適切な時間間隔内ですべてのエントリをコピーします。

次のコードは問題なく動作し、すべてのイベントをツリーからサブツリーにコピーします。

void tree_time_filter(TTree* tree, TTree** subtree, Int_t time_i, Int_t time_f){
     *subtree = tree->CloneTree(0);
     Int_t t;
     tree->SetBranchAddress("UNIX time", &t);
     for(Long64_t i = 0; i<tree->GetEntries(); i++){
        tree->GetEntry(i);
        if (true)
        {
            (*subtree)->Fill();
        }
     }
     cout<<"Tree filtered. "<<(*subtree)->GetEntries()<< " entries were selected.\n";
     return;
}

if(true) を実際の条件に置き換えると、問題が発生します。

void tree_time_filter(TTree* tree, TTree** subtree, Int_t time_i, Int_t time_f){
     *subtree = tree->CloneTree(0);
     Int_t t;
     tree->SetBranchAddress("UNIX time", &t);
     for(Long64_t i = 0; i<tree->GetEntries(); i++){
        tree->GetEntry(i);
        if (t > time_i && t < time_f) //-> the condition
        {
            (*subtree)->Fill(); //-> this line now gives an error
        }
     }
     cout<<"Tree filtered. "<<(*subtree)->GetEntries()<< " entries were selected.\n";
     return;
}

次のエラーが表示されます

エラー行は (*subtree) -> Fill() を参照しています。これは、最初の例で完全に正常に機能したのと同じコードです。t を含まない条件、またはサブツリーを参照していない if-body の場合、コードは機能します。ここで何がうまくいかないのか誰でも説明できますか?

ありがとうございました!

(参考までに、元の質問へのリンク: http://root.cern.ch/phpBB3/posting.php?mode=edit&f=3&p=79722 )

4

2 に答える 2

2

これはインタプリタの問題だと思います。私の意見ではバグです。

マクロが初めて通過したときに(*subtree)->Fill();何も満たされない場合、エラーを再現できます。そこに入らないので不思議ですが・・・。

最初のループは、カットを通過する最初のイベントが見つかるまでループし、その後停止します。2 番目の(*subtree)->Fill();イベントは、このイベントで開始され、処理された最初のイベントがカットを通過し、それが満たされるようにします。

于 2014-10-13T09:27:26.650 に答える
0

Asen Christov のおかげで、関数の動作バージョンがここにあります。イベントが時系列順に並んでいない場合に備えて、2 つの for ループを while ループに入れました。これは機能するはずですが、広範囲にテストされていません。これがそのような一般的なタスクを実行するための最良の方法であるとは本当に信じられないので、これを行うための「標準的な」方法は引き続き歓迎されます。

void tree_time_filter(TTree* tree, TTree** subtree, Int_t time_i, Int_t time_f){
     *subtree = tree->CloneTree(0);
     Int_t t;
     tree->SetBranchAddress("UNIX time", &t);
     Long64_t i = 0;
     while (i < tree->GetEntries())
     {
         for(i; i<tree->GetEntries(); i++){
            tree->GetEntry(i);
            if (t > time_i && t < time_f) break;
         }
         for (i; i<tree->GetEntries(); i++){
            tree->GetEntry(i);
            (*subtree)->Fill();
            if (!(t > time_i && t < time_f)) break;
         }
     }
     cout<<"Tree filtered. "<<(*subtree)->GetEntries()<< " entries were selected.\n";
     return;
}
于 2014-10-13T12:51:47.557 に答える