Hi Mike,
I have forwarded your mail to Masa concerning your question 1.
Concerning your second question, this problem is solved in 3.02.
In the development version, I have introduced a few optimizations
when generating the code for classes containing templates or STL members.
Rene Brun
Mike Kordosky wrote:
>
> Hi,
>
> I am trying to read and write an stl vector in a tree. I find that the
> writing proccess seems to work ok, but reading the vector back in works in
> a rather funny way. Perhaps someone can comment and enlighten me a
> little.
>
> Specifically, I find:
>
> (1) The branch holding the vector does appear when I do a TTree::Print().
> It is not empty.
>
> (2) The Show command looks as follows:
>
> root [3] CalTree->Show(1);
> ======> EVENT:1
> fEventSummary.fTrigger = 4
> fEventSummary.fSnarl = 2
> fEventSummary.fTimeFrame = 1
> fEventSummary.fFirstTimeStamp = 4606481
> fEventSummary.fLastTimeStamp = 4606503
> fEventSummary.fTimeSinceLastEvent = 4053579
> fEventSummary.fNHits = 18
> fEventSummary.fAdcSum = 6297
> fEventSummary.fPlanesHit = 5
> fEventSummary.fErrorFlags = 0
> fCerenkovHit.fValid = 0
> fCerenkovHit.fTimeStamp = 0
> fCerenkovHit.fAdc = 0
> fTofHit.fValid = 0
> fTofHit.fTimeStamp = 0
> fTofHit.fTdc0 = 0
> fTofHit.fTdc1 = 0
> fTofHit.fTdc2 = 0
> fCosmicSummary.fNHits = 0
> fCosmicSummary.fAdcSum = 0
> fTriggerPmt.fAdc = 0
> fHits = printing kStreamer case (500)
>
> Here, fHits is vector<CalHit>. CalHit is a rootified class (eg,
> ClassDef(CalHit, 1), and so on).
>
> (3) If I do tree->MakeClass("TestClass") I find that the generated class
> does not have an fHits member. It is completely omitted. I attempted to
> add it in by hand:
> eg..
>
> vector<CalHit> fHits;
> TBranch* b_fHits;
>
> root [0] gSystem->Load("libMapping.so");
> root [1] gSystem->Load("TestClass_C.so");
> root [2] TFile f("ByEvent11267.root");
>
> WARNING, class:CalEvent StreamerInfo read from file:ByEvent11267.root
> has the same version:1 than the active class
> but a different checksum.
> You should update the version to ClassDef(CalEvent,2).
> Do not try to write objects with the current class definition,
> the files will not be readable.
>
> (4) I then had a look at the TStreamerInfo for CalEvent:
>
> root [5] TStreamerInfo* info = (CalEvent::Class())->GetStreamerInfo(1);
> root [6] info->ls();
>
> StreamerInfo for class: CalEvent, version=1
> CalEventSummaryfEventSummary offset= 0 type=62
> CalCerenkovHitfCerenkovHit offset= 44 type=62
> CalTofHit fTofHit offset= 60 type=62
> CalCosmicSummaryfCosmicSummary offset= 84 type=62
> CalTriggerPmt fTriggerPmt offset= 96 type=62
> vector<CalHit,__malloc_alloc_template<0> >fHits offset=104
> type=500 ,stl=1, ctype=61, ||
> i= 0, fEventSummary type= 62, offset= 0, len=1, method=1091183484
> i= 1, fCerenkovHit type= 62, offset= 44, len=1, method=1091183528
> i= 2, fTofHit type= 62, offset= 60, len=1, method=1091183572
> i= 3, fCosmicSummary type= 62, offset= 84, len=1, method=1091183616
> i= 4, fTriggerPmt type= 62, offset= 96, len=1, method=1091183660
> i= 5, fHits type=500, offset=104, len=1, method=1091183704
> root [7]
>
> (5) This offers the solution:
>
> I must declare:
>
> vector<CalHit, __malloc_alloc_template<0> > fHits;
> and so on..
>
> (6) Question 1:
>
> I do not explicitly use __malloc_alloc_template<0> anywhere. A look at
> stl_vector.h on my system shows:
>
> template <class T, class Alloc = alloc>
> class vector {...}
>
> I gather that ROOT inserts __malloc_alloc_template<0> at some point in the
> dictionary making proccess. Must it do this? I would like to use the
> standard allocator if possible (SGI claims it is faster, for one thing).
>
> If it must do this, could someone tell me why? I am curious and am having
> trouble finding comprehensive documentation.
>
> (7) Question 2:
>
> Any clue why fHits does not appear in the generated code?
>
> Additional Info:
>
> Root-v3.01.06, egcs 1.1.2, Linux 2.4.6, x86
>
> Thanks for wading through this morass!
>
> Mike Kordosky
>
> --
> Graduate Research Assistant // High Energy Physics Lab
> kordosky@hep.utexas.edu // University of Texas at Austin
> kordosky@fnal.gov //
> ph: (512) 471-8426 (RLM Lab, Office)
> (512) 475-8673 (ENS Lab)
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:03 MET