Suggestion for change of BrMultRdo (and BrTofRdo?)

From: Christian Holm Christensen (cholm@hehi03.nbi.dk)
Date: Tue Jul 31 2001 - 13:52:29 EDT

  • Next message: Hironori Ito: "Re: Are brag and brat2 compatible?"

    Hi all, 
    
    Ok, after some long analysis of the a serious memory leak in a program
    of Eriks, it's become apparent to us that the members
    BrMultRdo::fSingles and BrMultRdo::fRings are at the root (no pun
    intended) of this.  The problem is, if you store BrMultRdo objects on
    a TBranch in a TTree, and then later read it back with 
    
      BrMultRdo* tmaRdo = 0; 
      tree->SetBranchAddress("TMA", &Rdo); 
    
      Ssiz_t n = tree->GetEntries(); 
      for (Int_t i = 0; i < n; i++) { 
        tree->GetEntry(i); 
    
        ...
    
        tmaRdo->Clear(); 
      }
    
    the TTree will not see the members BrMultRdo::fSingles and
    BrMultRdo::fRings as TClonesArrays, but rather as the contained
    TObjArray.  Therefore, the TTree will allocate new memory for the
    BrMultRdo::BrSingle and BrMultRdo::BrRing contained in these
    collections, which leads to a very serious memory leak.  
    
    We tried a quick work around this problem, by introduceing the method 
    BrMultRdo::Delete like: 
    
      void BrMultRdo::Delete(Option_t* option) 
      { 
        fSingles.Draw(); 
        fRings.Draw(); 
      }
    
    and then loop over the TTree like: 
    
      BrMultRdo* tmaRdo = 0; 
      tree->SetBranchAddress("TMA", &Rdo); 
    
      Ssiz_t n = tree->GetEntries(); 
      for (Int_t i = 0; i < n; i++) { 
        tree->GetEntry(i); 
    
        ...
    
        tmaRdo->Delete(); 
      }
    
    However, this not only doesn't work, but it also defies the purpose of
    having TClonesArray all together.  
    
    So the way to fix this, is to make the internal TClonesArray objects
    of BrMultRdo to pointers to TClonesArray objects.  Then the TTree will 
    see these as TClonesArray and will not allocate more memory than
    needed. 
    
    However, this will cause some reading of data files generated with
    BRAT upto version 2.0.18 to be impossible.  It seems that using a
    TClonesArray object in the way that I did is not as well supported as
    I initially believed.  This problem really came as a huge surprise to
    me, 'cause I did all sorts of experiment with BrMultRdo before
    settleing on the current design, including I/O tests and reading loads of
    documentation, non of which indicated a problem in this respect tough,
    I  just didn't see this problem. 
    
    Because the proposed change to BrMultRdo (and BrTofRdo) will
    explicitly break backward compatiblity I'm giving you a heads up on
    this.  We'd really like to make this change, but if someone objects
    loudly we must discuss this.   
    
    I should say though, that I don't think this will be a major
    showstopper since not that there are probably not that many files
    around made with BRAT 2 and containing BrMultRdo and BrTofRdo objects,
    and after all, BRAT 2 is not our production version yet.  
    
    Having said that, I must stress that if we are to make this change,
    it most be within a week or so, since the sooner we do it, the less
    hassle. 
    
    The ROOT people seems to be willing to make changes to support
    TClonesArray object members rather than pointer to TClonesArray object 
    members, but since I last stumbled across this problem,  I've seen
    nothing to indicate any development in this field.  The problem I
    orginally saw is not this, but I believe related, see 
    
        http://root.cern.ch/root/roottalk/roottalk01/2567.html
    
    and follow-ups.  I wrote an email to Philippe Canal today requesting
    this feature ASAP. I'm yet to hear anything from him.  I'll keep you
    posted. 
    
    So in conclussion, the sitaution is this: 
    
    * BrMultRdo is ok for normal I/O via BrEventIO 
    
    * BrMultRdo can not be browsed if put as a branch in a TTree 
    
    * Looping over a TTree containing BrMultRdo objects as a branch will
      cause a severe memory leak. 
    
    * Both problems can be fixed here and now by turning the TClonesArray
      object members in to pointers to TClonesArray object members,
      however at the cost of making it harder to read older files (not
      impossible - but harder). 
    
    * ROOT will fix this "in the near future" which may mean anything from
      days to weeks to months.
    
    Therefore, the questions are these: 
    
    * Do we wait for ROOT?, 
    
    * If not, can we live with the cost of making it impossible to read
      some (probably not that many) old files? 
    
    Eagerly awaiting your response. 
    
    Yours, 
    
    Christian  -----------------------------------------------------------
    Holm Christensen                             Phone:  (+45) 35 35 96 91 
      Sankt Hansgade 23, 1. th.                  Office: (+45) 353  25 305 
      DK-2200 Copenhagen N                       Web:    www.nbi.dk/~cholm    
      Denmark                                    Email:       cholm@nbi.dk
    



    This archive was generated by hypermail 2b30 : Tue Jul 31 2001 - 13:53:51 EDT