2012-04-07 9 views
2

Innerhalb PyROOT ist es einfach genug, um in Werten von einem Baum zu lesen, dh das Blatt zu drucken val:Zugang verschachtelt Behälter in einem Ttree mit PyROOT

file = TFile('file.root') 
tree = file.Get('tree') 
for entry in tree: 
    print entry.val 

auch leicht vector<float> Werte aus einer stl zu lesen, vec:

for entry in tree: 
    print entry.vec[1] 

Aber was ist verschachtelt Vektoren, dh nested vom Typ vector<vector<float> >? Running

for entry in tree: 
    print entry.nested[0][0] 

wird eine TypeError: 'vector<vector<float> >' object is unindexable werfen.

Was ist der beste Weg, damit umzugehen? (besser, wenn es nicht in ein ROOT-Wörterbuch geladen werden muss)

+1

Sie können versuchen, diese nach der Anwendung sein kann: http : //steve.cooleysekula.net/goingupalleys/2011/07/29/python-and-root-tricks-vectors-of-vectors/ –

+0

nice intro, neue Art von "Beantworten einer Frage mit einer Frage" – IljaBek

Antwort

3

Das funktioniert für mich mit Indexierung in Python.

>>>from ROOT import * 
    >>>vec1 = std.vector('double')() 
    >>>vec2 = std.vector('double')() 
    >>>vec_vec = std.vector(std.vector('double'))() 

    >>>for i in range(3): 
    >>> vec1.push_back(i) 
    >>>for i in range(5): 
    >>> vec2.push_back(i) 
    >>>vec_vec.push_back(vec1) 
    >>>vec_vec.push_back(vec2) 

    >>>len(vec_vec) 
    2 
    >>>len(vec_vec[0]) 
    3 
    >>>len(vec_vec[1]) 
    5 
    >>>vec_vec[1][2] 
    2.0 

In Ihrem Beispiel der Fehler sagt:

TypeError: 'vector<vector<float> >' object is unindexable 

Nach dem Konstruktor std.vector Aufruf (Typ)() Sie verschiedene Typen haben, die anzeigen, dass ein Allocator für Speicherplatz arbeitet.

>>>type(vec1) 
    <class 'ROOT.vector<double,allocator<double> >'> 
    >>>type(vec_vec) 
    <class 'ROOT.vector<vector<double,allocator<double> >,allocator<vector<double,allocator<double> > > >'> 

Um solche Vektoren, die von einem Ttree Verwendung setBranchAddress wie in diesem Beispiel zu importieren:

>>>tree = file.Get('tree') 
    >>>tree.SetBranchAddress("nested",vec_vec) 
    >>>N = tree.GetEntries() 
    >>>for i in range(N): 
    >>> vec_vec.clear() 
    >>> tree.GetEntry(i) 
    >>> print vec_vec[0][0] 

Beachten Sie auch, dass dies schneller deutlich

>>>tree.setBranchStatus('*',0) 
    >>>tree.setBranchStatus('nested',1) 
+0

Ihre Linie '>>> vec_vec = std.vector (std.vector ('double'))()' bringt meinen Interpreter zum Ausdruck 'Segmentation fault' und beendet. Ich benutze Python 2.6 und ROOT 5.28 zum Vergleich. – Shep

+0

Erneut getestet, funktioniert mit Python 2.7.2 + und ROOT 5.31 auf Ubuntu 11.10 – Schuh

+0

Dies muss auf SLC5 und Python 2.6 (leider) ausgeführt werden. Da diese Lösung erfordert, dass ich die Variable außerhalb der Schleife deklariere, setze die Verzweigungsadresse und rufe 'GetEntry' für jede Schleifeniteration auf. Ich bin mir nicht sicher, ob es sauberer ist als ein Wörterbuch (wie in dem angegebenen Link vorgeschlagen) von @wiso). – Shep

Verwandte Themen