2016-06-02 3 views
1

Der Code soll durch eine bereits erstellte Struktur lesen, kopieren Sie seine Zweig-Namen und notieren Sie eine 0 für Einträge kleiner oder gleich 0 und eine 1 für alle anderen Einträge. Der Code kopiert die Zweige in Ordnung, aber wenn sie mit den Informationen gefüllt werden, die sie füllen, werden alle Informationen aller Zweige vor ihr verzweigt. Wenn also ein Baum 10 Einträge und zehn Zweige hat, würde der zehnte Zweig 100 Einträge haben, der 9. 90 usw. Unten ist der vollständige Code, die Füllung erfolgt in der letzten Schleife.CERN ROOT: Füllen TBranches/TTree in einer Schleife Problem

#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

Sie möchten vielleicht in einer Zeile 'TString temp = Form ("entryVec [% d]/I", i); '. Die 'Form'-Funktion verwendet die gleiche Syntax wie' printf' von 'C'. (Um seine Nutzung zu googlen) – pseyfert

Antwort

0

Lösung wurde von jemand anderem gelöst, mit dem ich arbeite. Der letzte Teil der Branch-Erstellungstemp sollte BranchName/I sein, wenn geändert zu:

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

Der Code funktioniert einwandfrei.

Verwandte Themen