2016-06-02 6 views
1

Код должен прочитывать уже созданное дерево, копировать его имена ветвей и записывать 0 для записей, которые меньше или равны 0, и 1 для всех других записей. Код копирует ветви в порядке, но когда вы заполняете их информацией, заполняющей каждую ветвь, будет вся информация обо всех ветвях перед ней. Так что, если у дерева было 10 записей и десять ветвей, то десятая ветвь имела бы 100 записей, 9-й и т. Д. Ниже приведен полный код, заполнение выполняется в последнем цикле.CERN ROOT: Заполнение TBranches/TTree в выпуске цикла

#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(); 
} 
+0

Возможно, вам захочется переписать в одной строке 'TString temp = Form (" entryVec [% d]/I ", i);'. Функция 'Form' использует тот же синтаксис, что и' printf', из 'C'. (Чтобы использовать его Google) – pseyfert

ответ

0

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

temp = branchName; temp + = "/ I";

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

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