I am trying to fill a branch with an array of TVector3, however it appears that the branch containing TVector3 has entries either 0 or some absurd values.
To reproduce the problem I have attached a simple macro.
Can anyone suggest how to do this ?
Thanks in advance,
tree_with_vector.C (484 Bytes)
The first problem is that if you define a:
t.Branch(“vector”, &vPosition, “vposition”);
then ROOT thinks that this branch is a:
*Br 1 :vector : Float_t vposition *
Note the “Float_t” instead of the desired “TVector3”. See the “==> Case A” in the TTree class description.
root  TFile *f = TFile::Open(“test.root”, “read”)
root  tree->Print()
I guess you would need a single branch with a std::vector ("==> Case E") or a TClonesArray(“TVector3”) ("==> Case D"), or you would need to create 5 different branches, one branch per each “vposition[i]” (5 * “==> Case C”). You should probably also make sure that “splitlevel = 0”.
Another problem is that you create your tree on the stack “TTree t(…);”, but you’d better create it on the heap “TTree *t = new TTree(…);” (note: do NOT delete your “t” tree manually, it will be automatically deleted when your ROOT file “f” is deleted).
Well, maybe Philippe has any better ideas.
According to your suggestion I changed the file. I want to have a TVcetor3 (e.g., position) for each trajectory and I was thinking to create only one branch (“vector”) for each track.
I know if I create a branch with “double position[trajno]”, I can access those positions for each track. Is not it possible to have one TVector3 corresponding to one track …same like the “number” branch is doing ? So that if I do
tree->Scan(“vector”); it will give information for trajectory number 2.
Another thing, evenif the sub-branches created under TVector3, say fX, I can not access the values for the tracks except 1st one. Now fX is same as fX ??
tree_with_vector.C (657 Bytes)
means that you will store a SINGLE object pointed by “vPosition” (i.e. ONLY the “vPosition”, see the “==> Case C” in the TTree class description).
A related question to your second reply, when should I mention the “splitlevel=0” in the branch specifically to avoid memory problem ?
This is not clear to me.
Thanks in advance,
What “memory problem” do you mean?
In my code there are several TTree branches with “std::vector<vector>” and 2D arrays for each track and while creating the branches “splitlevel=0” is not mentioned.
And there is memory leak and it seems to me that the source is not pointer.
Those branches can be a reason for memory leak ??
In general, the “splitlevel” should not create memory leaks (it’s related to the way the objects are stored in the ROOT file).
Setting “splitlevel=0” prevents sometimes problems related to “subbranches with identical names” (another way is to add a “.” character at the ends of the names of their master branches).
See ROOT User’s Guide - Chapter 12. Trees - Adding a TBranch to Hold an Object and TTree::Branch.