CERN ROOT: Заполнение TBranches/TTree в цикле

Предполагается, что код считывает уже созданное дерево, копирует имена его ветвей и записывает 0 для записей, меньших или равных 0, и 1 для всех остальных записей. Код отлично копирует ветки, но при заполнении их информацией, которую он заполняет, каждая ветка будет содержать всю информацию обо всех ветках перед ней. Таким образом, если дерево имеет 10 записей и десять ветвей, то десятая ветвь будет иметь 100 записей, 9-я — 90 и т. д. Ниже приведен полный код, заполнение выполняется в последнем цикле.

#include <vector>
binaryTree()
{
//Creation and naming scheme
TString fileName = "binaryTree2.root";//name of file wishing to create.
TString treeName = "Binary Tree 2";//name of tree wishing to create.
TFile *file = new TFile(fileName, "RECREATE");
TTree *bTree = new TTree(treeName,"Binary Tree");

//Connection scheme
TString fileNameCopy = "hodoscopehittree7.root";//name of file you will be accessing.
TString treeNameCopy = "tree";//Name of tree within file you are accessing.
TFile *filePtr = new TFile(fileNameCopy);//points to file with previously created tree
TTree *treePtr = (TTree *) filePtr->Get(treeNameCopy);//Ptr to tree within accessed file.
TObjArray *obj = treePtr->GetListOfBranches();//Ptr to branches.
int branchNum = obj->GetEntries();//Number of branches in accessed tree.

//Vector to hold all of the information from the tree.  
vector<vector<int>> dataHolder;

int* inHist;//Ptr to become the entry.
int inVal;
vector <int> entryVec;//Vector of ints that the branches will rely on.
entryVec.resize(branchNum);
TString branchName;
const int entryNum = treePtr->GetEntries();//Number of entries in each branch.

//This loop creates a branch in the binary tree with the same name as the 
//branch in the tree being accessed and fills the dataHolder vector with 
//vectors.
for (int i = 0; i < branchNum; i++)
{
  TString temp;
  temp = "entryVec[";
  temp += (i);
  temp += "]/I";
  branchName = obj -> At(i)-> GetName();
  bTree -> Branch(branchName, &entryVec[i],temp);
  vector <int> tempVec;
  dataHolder.push_back(tempVec); 
}

//This loop reads the entries of each branch within the accessed tree. If the 
//value is less than or equal to zero, 0 is added to the dataHolder and  if 
//not 1 is added to the dataHolder.
for (int i = 0; i < branchNum; i++)
{
    branchName = obj-> At(i)-> GetName(); //Gets name of branch at index i
    treePtr -> SetBranchAddress(branchName, &inHist);

    for (int j = 0; j < entryNum; j++)
    {
      treePtr -> GetEntry(j);
      inVal = inHist;

      if (inVal <= 0)
      {
        dataHolder[i].push_back(0);
      }

      else
      {
        dataHolder[i].push_back(1);
      }
   }

}

//This loop fills the tree. Each inner loop reads the jth element of the 
//datHolder and inputs that information int the entryVec. The outer loop fills 
//the tree and then loops over all of the entries. 
for (int i = 0; i < entryNum; i++)
{
  for (int j = 0; j < branchNum; j++)
  {
    entryVec[j] = dataHolder[j][i];
  }  
  bTree -> Fill();
}

file -> Write();
cout << "Your program has finished; " << treeName << " has been created."; 
cout << endl;
filePtr-> Close();
new TBrowser();
}

person Marshall Scott    schedule 02.06.2016    source источник
comment
Вы можете переписать в одной строке TString temp = Form("entryVec[%d]/I",i);. Функция Form использует тот же синтаксис, что и printf из C. (Чтобы погуглить его использование)   -  person pseyfert    schedule 07.06.2016


Ответы (1)


Решение было решено кем-то другим, с которым я работаю. Последней частью временного файла создания ветки должно быть имя_ветви/I, поэтому при изменении на:

темп = имя_ветки; темп += "/I";

Код работает идеально.

person Marshall Scott    schedule 02.06.2016