Hi,
I have included the some code as text below in this message. One can
also get the source as a tar file from my web page:
http://www.hepl.harvard.edu/~rlee/roottest.tar
Do a 'gmake' in the roottest directory, and run the binary Event without
any arguments. This will produce the output file Event.root.
There is 1 event which contains 2 TClonesArrays, one for Tracks and one
for Hits. There is 1 Track in this event which has 10 even plane Hits,
and a total of 20 Hits (half even planes, half odd planes). Here is some
sample output which illustrates the problem:
[rlee@heplminos6 roottest]$ root Event.root
*******************************************
* *
* W E L C O M E to R O O T *
* *
* Version 3.03/06 28 July 2002 *
* *
* You are welcome to visit our Web site *
* http://root.cern.ch *
* *
*******************************************
Compiled for linux with thread support.
CINT/ROOT C/C++ Interpreter version 5.15.49, July 2 2002
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0]
Attaching file Event.root...
Warning in <TClass::TClass>: no dictionary for class Event is available
Warning in <TClass::TClass>: no dictionary for class Hit is available
Warning in <TClass::TClass>: no dictionary for class Track is available
root [1] T->Scan("hit[track[0].hit[5]].plane:track[0].plane[5]")
************************************
* Row * hit[track * track[0]. *
************************************
* 0 * 10 * 10 *
************************************
(Int_t)1
root [2] T->Scan("hit[track[0].hit[5]].plane-track[0].plane[5]")
************************
* Row * hit[track *
************************
* 0 * -10 *
************************
(Int_t)1
As you can see, when I do a Scan with two expressions separated by :, you
get the expected answer. When you try to combine the expressions (such as
with the - above) you get something nonsensible (similarly if you try a
Draw).
Roy
Event.cxx:
#include <cassert>
#include <iostream>
#include "Event.h"
ClassImp(Event)
ClassImp(Track)
ClassImp(Hit)
Event::Event()
{
nhit = 0;
ntrack = 0;
hit = 0;
track = 0;
}
Event::~Event()
{
if (hit) {
hit->Delete();
delete hit;
}
if (track) {
track->Delete();
delete track;
}
}
Track::Track()
{
nhit = 0;
hit = 0;
plane = 0;
}
Track::~Track()
{
if (hit) {
delete hit;
}
if (plane) {
delete plane;
}
}
Hit::Hit()
{
plane = 0;
}
Hit::~Hit()
{
}
Event.h:
#ifndef EVENT_H
#define EVENT_H
#include "TClonesArray.h"
#include "TObject.h"
class Hit : public TObject
{
public:
Hit();
~Hit();
Int_t plane;
ClassDef(Hit,1) // Hit version 1
};
class Track : public TObject
{
public:
Track();
~Track();
Int_t nhit;
Int_t *hit; //[nhit]
Int_t *plane; //[nhit]
ClassDef(Track,1) // Track version 1
};
class Event : public TObject
{
public:
Event();
~Event();
Int_t nhit;
Int_t ntrack;
TClonesArray *hit;
TClonesArray *track;
ClassDef(Event,1) // Event version 1
};
#endif // EVENT_H
MainEvent.cxx:
#include <stdlib.h>
#include "Riostream.h"
#include "TROOT.h"
#include "TFile.h"
#include "TRandom.h"
#include "TTree.h"
#include "TBranch.h"
#include "TClonesArray.h"
#include "Event.h"
//______________________________________________________________________________
int main(int argc, char **argv)
{
TFile *hfile;
TTree *tree;
Event *event = 0;
hfile = new TFile("Event.root","RECREATE","TTree benchmark ROOT file");
tree = new TTree("T","An example of a ROOT tree");
Int_t bufsize = 16000;
event = new Event();
event->track = new TClonesArray("Track");
event->hit = new TClonesArray("Hit");
TBranch *branch = tree->Branch("event", "Event", &event, bufsize,99);
branch->SetAutoDelete(kFALSE);
for (Int_t ev = 0; ev < 1; ev++) {
event->ntrack = 1;
event->nhit = 20;
TClonesArray &tracklist = *(event->track);
new(tracklist[0]) Track();
Track *track = (Track*)(tracklist[0]);
track->nhit = 10;
track->hit = new Int_t[track->nhit];
track->plane = new Int_t[track->nhit];
for (Int_t i=0; i<track->nhit; i++) {
track->hit[i] = i*2;
track->plane[i] = i*2;
}
for (int i=0; i<event->nhit; i++) {
TClonesArray &hitlist = *(event->hit);
new(hitlist[i]) Hit();
Hit *hit = (Hit*)(hitlist[i]);
hit->plane = i;
}
tree->Fill();
}
hfile->Write();
hfile->Close();
return 0;
}
EventLinkDef.h:
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class Event+;
#pragma link C++ class Hit+;
#pragma link C++ class Track+;
#endif
On Wed, 31 Jul 2002, Philippe Canal wrote:
> Hi Roy,
>
> This ought to work as you expect. Could you please send a little test
> program reproducing the problem?
>
> Thanks,
> Philippe
>
------------------------------------------------------------------------------
Roy Lee / rlee@physics.harvard.edu / Department of Physics, Harvard University
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:02 MET