void Output::fixLeafOffsets( TBranch * b) { // recalculates the addresses for all the leaves. // // when constructing a branch with containing a variable length array with the index // variable in the same branch it is not possible to specify the span of the index variable // This span defaults to zero. When the addresses are asigned to the various leaves in the branch // it calculates the size of the particular leaf (variable length array) in the buffer by looking // at the span of the index variable - 0 in this case! using the method TLeaf::GetLen(). // The following code shoudl be applied to the branch after the spans of the index variables have been // specified manually using the TLeaf::SetMaximum method. This time the GetLen method calculates the correct offset. TObjArray * leaves = b->GetListOfLeaves(); char * addr = b->GetAddress(); int offset = 0; int nleaves = leaves->GetEntriesFast(); // loop over the leaves: for( int i =0; i < nleaves; ++i) { TLeaf * leaf = (TLeaf *)leaves->UncheckedAt(i); leaf->SetAddress( addr + offset ); int oldOffset = leaf->GetOffset(); leaf->SetOffset( offset ); //std::cout << " offset changed from : " << oldOffset << " to " << offset << std::endl; TLeaf * index = leaf->GetLeafCount(); int nelements = 1; if( index ) { nelements = index->GetMaximum(); // deal with variable length arrays } else { nelements = leaf->GetLenStatic(); // deal with single variables and fixed length arrays } offset += leaf->GetLenType() * nelements; } }
void getlist(ostream& out, TBranch* branch, int depth=0) { TObjArray* array = branch->GetListOfBranches(); if ( ! array ) return; if ( depth > 10 ) return; string name; int nitems = array->GetEntries(); for (int i = 0; i < nitems; i++) { TBranch* b = (TBranch*)((*array)[i]); if ( ! b ) continue; string branchname(b->GetName()); out << SPACE.substr(0,4*depth) << branchname << endl; TObjArray* a = b->GetListOfLeaves(); if ( a ) { int n = a->GetEntries(); { for (int j = 0; j < n; j++) { TLeaf* leaf = (TLeaf*)((*a)[j]); int count = 0; int ndata = 0; TLeaf* leafc = leaf->GetLeafCounter(count); if ( ! leafc) ndata = leaf->GetLen(); else ndata = leafc->GetMaximum(); string leafname(leaf->GetName()); out << SPACE.substr(0,4*(depth+1)) << ndata << " " << leafname << endl; } } // else if ( n == 1 ) // { // TBranch* bc = (TBranch*)((*a)[j]); // string leafname(bc->GetName()); // if ( leafname != branchname ) // out << SPACE.substr(0,4*(depth+1)) << leafname << endl; // } } getlist(out, b, depth+1); } }
bool TreeReader::Initialize(vector <string> br, string opt) { if(!init) { if( !fChain ) { cout << endl; cout << "No tree to initialize" << endl; cout << endl; return false; } TObjArray *fileElements = fChain->GetListOfFiles(); if( !fileElements || ( fileElements->GetEntries() == 0 )) { cout << endl; cout << "No file(s) to initialize" << endl; cout << endl; return false; } } varList.clear(); TObjArray* branches = fChain->GetListOfBranches(); int nBranches = branches->GetEntries(); for (int i = 0; i < nBranches; ++i) { TBranch* branch = (TBranch*)branches->At(i); string brname = branch->GetName(); TLeaf* leaf = branch->GetLeaf(branch->GetName()); if ( leaf == 0 ) // leaf name is different from branch name { TObjArray* leafs = branch->GetListOfLeaves(); leaf = (TLeaf*)leafs->At(0); } string curtype = leaf->GetTypeName(); int id = TypeDB::getType(curtype.c_str()); int arreysize = 1; string title = leaf->GetTitle(); //cout << curtype << " " << title << endl; // Find out whether we have array by inspecting leaf title if ( title.find("[")!=std::string::npos ) { TLeaf * nelem = leaf->GetLeafCounter(arreysize); if(arreysize == 1 && nelem != NULL) arreysize = nelem->GetMaximum() + 1; //search for maximum value of the lenght } if(id >= 0) { bool addVar = true; if(br.size()>0) { addVar = false; for(unsigned b = 0; b < br.size(); b++) { if(opt == "names" || opt == "except") { if(br[b] == brname) { addVar = true; break;} } else if(opt.find("contains")!=string::npos) { if((string(brname)).find(br[b])!=string::npos) { addVar = true; break;} } else if(opt.find("except")==string::npos) cout << "Option " << opt << " not found" << endl; } if(opt.find("except")!=string::npos) addVar = !addVar; } if(addVar) { variable * tmpVar = new variable(id,arreysize); tmpVar->name = leaf->GetName(); tmpVar->bname = branch->GetName(); tmpVar->title = title; varList.push_back(tmpVar); fChain->SetBranchAddress(tmpVar->bname,tmpVar->value.address); } } else { cout << curtype << ": type not found" << endl; exit(1); return false; } } init = true; continueSorting = true; if(pmode=="v") cout << endl << "Set up " << varList.size() << " / " << nBranches << " branches" << endl; return true; }