Hi Fred,
This problem had already been solved with the early versions 3.00.
When I run your macro, I get now:
root [0] .L fred.C
root [1] record()
1 12 5 1 2 0 10 3 3 15 4 2 7 0 0 9 5 5 17 2
(int)1
root [2] play()
numEntries = 20
1 12 5 1 2 0 10 3 3 15 4 2 7 0 0 9 5 5 17 2
(int)1
Rene Brun
On Sat, 27 Jan 2001, Fred Gray wrote:
> Hi, fellow ROOTers,
>
> The macros below are a simplified testcase representing a problem that has
> made some real trouble for our group lately.
>
> The record() macro generates a file containing a tree with one branch,
> a TClonesArray of TLine objects. The arrays are of varying length, and the
> length in each entry is printed out as the tree is written. The play() macro
> reads the file back in, printing out the length of the array in each entry.
> In principle, the two counts ought to agree. In fact, they don't:
>
> In record():
> 1 12 5 1 2 0 10 3 3 15 4 2 7 0 0 9 5 5 17 2
>
> In play():
> 1 12 5 1 2 2 10 3 3 15 4 2 7 7 7 9 5 5 17 2
>
> For entries where the initial length was nonzero, things are fine. However,
> notice that, wherever the initial length was zero, the length played back is
> equal to the length in the previous entry. In our real application, you can
> also see that the content of the array is the same as in the previous entry,
> so this can lead to multiple inclusion of a set of events.
>
> The problem occurs with (at least) ROOT versions 2.23/12 and 2.25/03. I
> haven't tried the 3.0 series, but I would much prefer to make this work with a
> stable version since we're about to begin a long event processing run.
>
> Am I doing something fundamentally wrong here? Otherwise, does anyone know
> of a good solution/workaround?
>
> Thank you all very much for your help,
>
> -- Fred Gray
>
> record()
> {
> // write file
> TFile *outFile = new TFile("testclones.root", "RECREATE");
> tree = new TTree("tree", "tree", 16*1024*1024);
> TClonesArray *array = new TClonesArray("TLine", 128);
> tree->Branch("b", &array, 1024, 1);
>
> TRandom *random = new TRandom3(1234);
>
> for(Int_t i = 0; i < 20; i++)
> {
> Int_t numHits = random->Gaus(5,5);
> if(numHits < 0)
> {
> numHits = 0;
> }
>
> array->Clear();
> for(Int_t j = 0; j < numHits; j++)
> {
> TLine *line = new TLine(1,2,3,4);
> new((*array)[j]) TLine(*line);
> delete line;
> }
> printf("%d ", numHits);
> tree->Fill();
> }
> tree->Write();
> outFile->Write();
> outFile->Close();
> delete outFile;
> printf("\n");
> }
>
> play()
> {
> // read it back
> TFile *inFile = new TFile("testclones.root");
> TTree *treeIn = inFile->Get("tree");
> TClonesArray *arrayIn = new TClonesArray("TLine", 128);
>
> treeIn->SetBranchAddress("b", &arrayIn);
> Int_t numEntries = tree->GetEntries();
> printf("numEntries = %d\n", numEntries);
> for(Int_t i = 0; i < numEntries; i++)
> {
> treeIn->GetEntry(i);
> printf("%d ", arrayIn->GetLast() + 1);
> }
> printf("\n");
> }
>
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:34 MET