On Mon, 16 Sep 2002, Colin Bernet wrote:
>
> Hi all,
>
> I created a large number of TFiles containing a tree with splitlevel =
> 99. The tree was generated using a mother event class MEvent :
>
> class MEvent : public TObject {
>
> public:
> enum ETypes {INCLUS, D0, DStar, UNKNOWN};
>
> static const int MAXNTRA;
> static const int MAXNVER;
> static const int MAXNK0;
> static const int MAXND0;
>
> int number;
> int run;
> int type;
> int trmsk;
>
> double mD0;
>
> double thetakmin;
>
> int nver;
> TClonesArray *vertex;
> int ntra;
> TClonesArray *track;
> int nk0;
> TClonesArray *k0s;
> int nd0;
> TClonesArray *d0s;
> int npi;
> TClonesArray *pis;
> int nk;
> TClonesArray *ks;
> int ndstar;
> TClonesArray *dstars;
> ...
>
> each TClonesArray contains instances of a class that has only basic data
> types as attributes.
>
>
> I now face 2 problems, which are kind of related :
>
> - MakeClass seems to understand this structure, and one branch is
> created for
> each variable, which gets the address of a basic variable (unsigned, int,
> float, double, or arrays of these data types). The generated code does not
> depend anymore on the classes used to create the tree.
>
> Therefore, I was assuming that I had all I need to read this tree again,
> using the generated code. Yet when trying, I get these error messages :
>
> Warning in <TClass::TClass>: no dictionary for class MEvent is available
> Warning in <TClass::TClass>: no dictionary for class MVertex is available
> Warning in <TClass::TClass>: no dictionary for class MTrack is available
> Warning in <TClass::TClass>: no dictionary for class MK0 is available
> Warning in <TClass::TClass>: no dictionary for class MParticle is
> available
> Warning in <TClass::TClass>: no dictionary for class MD0 is available
> Warning in <TClass::TClass>: no dictionary for class MPi is available
> Warning in <TClass::TClass>: no dictionary for class MK is available
> Warning in <TClass::TClass>: no dictionary for class MDStar is available
>
Dear Colin,
about this error message you could try to create your own
dictionary and load it like:
f.MakeProject("demo","*","recreate++");
where f is your TFile
See if it works...
Cheers
Davide
> These are classes which should not be necessary anymore, cause split = 99
> creates one branch in the tree for each data type contained in these
> classes.
>
> With root 3.00, this leads to a segmentation violation, but with root
> 3.03/07 there is no problem... so I upgraded the reading part (the
> trees are still created by root 3.00/06 - tell me if this is a
> problem... I could try to update the writing part)
>
>
>
> - Now the number of TFiles gets really large (~ 3000), and I would like to
> merge them together in about 10 files, in order to speed up looping a
> bit, and to handle them more easily. To do that I used
> TChain::Merge.
>
> Thinking my tree is containing only simple data types I first didn't set
> the branch addresses before merging. As a result, I only the very
> simple branches are filled in the output tree (basic data types of the
> event
> class, data stored in TClonesArrrays has disappeared)
>
> Then I tried to set the branch address of the mother class "event". This
> seems to work : the tree can be drawn, and some cuts can be applied. But
> now, when I chain these 10 output files together, the following messages
> are printed when going to a new file :
>
> Warning in <TBranchClones::Streamer>: Unknow class: MVertex. Cannot read
> BranchClones: vertex
> Warning in <TBranchClones::Streamer>: Unknow class: MTrack. Cannot read
> BranchClones: track
> Warning in <TBranchClones::Streamer>: Unknow class: MK0. Cannot read
> BranchClones: k0s
> Warning in <TBranchClones::Streamer>: Unknow class: MD0. Cannot read
> BranchClones: d0s
> Warning in <TBranchClones::Streamer>: Unknow class: MPi. Cannot read
> BranchClones: pis
> Warning in <TBranchClones::Streamer>: Unknow class: MK. Cannot read
> BranchClones: ks
> Warning in <TBranchClones::Streamer>: Unknow class: MDStar. Cannot read
> BranchClones: dstars
>
> Despite that I can use the chain interactively.
>
> Now, unlike the first one, this chain cannot be read by the MakeClass
> generated macro !
>
> root [14] mdst.Loop()
> Warning in <TBranchObject::GetEntry>: Cannot get class: MEvent
>
> *** Break *** segmentation violation
>
>
> I've been stuck on that for a while. Split 99 is really what fits my
> needs, and it would be nice to be able to merge the trees together
> easily. I obviously miss something crucial about how split mode works.
> Why are the classes used to generate the tree still necessary for reading
> ?
>
> Really sorry for this long email...
> cheers,
>
> Colin
>
>
>
**********************************************************************
$ Davide Grandi %
$ INFN Milano e-mail Davide.Grandi@mib.infn.it %
$ P.zza delle Scienze 3 phone +39 02 6448 2306 %
$ 20126 MILANO fax +39 02 6448 2367 %
$ ITALY %
$ %
$ at CERN e-mail Davide.Grandi@cern.ch %
$ CH-1211 Geneve CH phone +41 22 767 9403 %
$ Bldg. 506 room R018 %
$ or phone +41 22 767 7560 %
$ Bldg. 576 room R002 %
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:10 MET