> > > However I notice something strange with the second approach: your > > > macro only works if I do *not* load the shared library with the class > > > info (amsmc.sl in the files I sent). If I load the lib, GetEntry > > > reads nothing for the sub-branch. > > > > > > > You must have an incompatibility between your shared lib and Root. > > Could you recompile your shared lib in particular the CINT dictionary? > > > > I think some shared lib incompatibility is basically my problem. The > library is compiled with up-to-date dictionary, but I am now looking > carefully at the classes (which I did not write) and noticing some > things which may not be kosher with respect to the examples in the > docs (for instance, they don't seem to have default constructors). > Next I'll try simplifying/modifying some of these classes to see if I > can get this to work. Hi, I've returned to working on this after a break... Now I am not so sure that the problem is with my shared lib. I've tried to replicate the behavior using the Event class in the $ROOTSYS/test directory (for Root 2.25 and 3.01, on Linux and OSF). Accessing the sub-branch directly still doesn't work (in this case, it doesn't seem to matter if I load the lib or not). I made only one change to Event.h, which was to make the Event class data members public. Then I compiled the shared lib, and ran the Event executable with default arguments to make Event.root. The following macro works fine: ------------------------------------------------------------ void testread() { // Set top-level branch address and navigate object -- works gROOT->Reset(); gSystem.Load("libEvent"); TFile file("Event.root"); TTree *evtree = (TTree*)file->Get("T"); int nevent = evtree->GetEntries(); Event* event = new Event; evtree->SetBranchAddress("event", &event); nevent = 3; for(int i=0;i<nevent;i++) { evtree->GetEvent(i); printf("%d fNtrack, top level branch address set %d\n",i,event->fNtrack); } } ------------------------------------------------------------ However, this isn't what I want to do. I want to avoid setting the top-level branch address, and instead go to the fNtrack sub-branch directly. Your suggested macro of July 6 is adapted below for this class: ------------------------------------------------------------ void testread2() { // Attempt to access sub-branch directly gROOT->Reset(); gSystem.Load("libEvent"); TFile file("Event.root"); TTree *evtree = (TTree*)file->Get("T"); int nevent = evtree->GetEntries(); printf("nevent %d\n",nevent); int ntr = 0; evtree->SetBranchStatus("*",0); evtree->SetBranchStatus("fNtrack",1); evtree->SetBranchAddress("fNtrack", &ntr); nevent = 3; for(int i=0;i<nevent;i++) { evtree->GetEntry(i); printf("i %d, ntr=%d\n",i,ntr); } } ------------------------------------------------------------ .. but this just returns zeroes (no error messages). Your first suggestion of July 6 is implemented in: ------------------------------------------------------------ void testread3() { // Attempt to access sub-branch directly gROOT->Reset(); gSystem.Load("libEvent"); TFile file("Event.root"); TTree *evtree = (TTree*)file->Get("T"); int nevent = evtree->GetEntries(); printf("nevent %d\n",nevent); int ntr=0; TBranch *branch = T->GetBranch("fNtrack"); branch->SetAddress(&ntr); nevent = 3; for(int i=0;i<nevent;i++) { branch->GetEntry(i); printf("i %d, ntr=%d\n",i,ntr); } } ------------------------------------------------------------ But this doesn't work either. (Strangely, for my original classes/libs, these solutions work under some conditions but not others.) Any ideas? Thanks for any help, Kate Scholberg schol@mit.edu
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:53 MET