Revision d7a041971d224681ae21de6feeb5fcf82f71a631 authored by Carsten Burgard on 15 December 2023, 15:25:58 UTC, committed by Jonas Rembser on 19 December 2023, 22:02:43 UTC
In the current implementation, shapesys with no valid data (all constraints constant) are written out in an invalid way, making it impossible for the reader to then instantiate the correct number of parameters. This PR fixes this by forcing the write-out of data with all-zeros for such invalid shapesys. Alternatively, one could imagine dropping these shapesys completely, but that's maybe something of a policy decision that I don't want to make in a bugfix patch :)
1 parent 8f21f0b
TGeoCache.h
// @(#)root/geom:$Id$
// Author: Andrei Gheata 18/03/02
/*************************************************************************
* Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
// Author : Andrei Gheata - date Wed 12 Dec 2001 09:45:08 AM CET
#ifndef ROOT_TGeoCache
#define ROOT_TGeoCache
#include "TGeoNode.h"
#ifdef R__LESS_INCLUDES
struct TGeoStateInfo;
#else
#include "TGeoStateInfo.h"
#endif
// forward declarations
class TGeoManager;
class TGeoHMatrix;
class TGeoCacheState : public TObject {
protected:
Int_t fCapacity; // maximum level stored
Int_t fLevel; // level in the current branch
Int_t fNmany; // number of overlapping nodes on current branch
Int_t fStart; // start level
Int_t fIdBranch[30]; // ID branch
Double_t fPoint[3]; // last point in master frame
Bool_t fOverlapping; // overlap flag
TGeoNode **fNodeBranch; // last node branch stored
TGeoHMatrix **fMatrixBranch; // global matrices for last branch
TGeoHMatrix **fMatPtr; // array of matrix pointers
TGeoCacheState(const TGeoCacheState &);
TGeoCacheState &operator=(const TGeoCacheState &);
public:
TGeoCacheState();
TGeoCacheState(Int_t capacity);
~TGeoCacheState() override;
void SetState(Int_t level, Int_t startlevel, Int_t nmany, Bool_t ovlp, Double_t *point = nullptr);
Bool_t GetState(Int_t &level, Int_t &nmany, Double_t *point) const;
ClassDefOverride(TGeoCacheState, 0) // class storing the cache state
};
class TGeoNodeCache : public TObject {
private:
Int_t fGeoCacheMaxLevels; // maximum supported number of levels
Int_t fGeoCacheStackSize; // maximum size of the stack
Int_t fGeoInfoStackSize; // maximum size of the stack of info states
Int_t fLevel; // level in the current branch
Int_t fStackLevel; // current level in the stack
Int_t fInfoLevel; // current level in the stack
Int_t fCurrentID; // unique ID of current node
Int_t fIndex; // index in array of ID's
Int_t fIdBranch[100]; // current branch of indices
TString fPath; // path for current branch
TGeoNode *fTop; // top node
TGeoNode *fNode; //! current node
TGeoHMatrix *fMatrix; //! current matrix
TObjArray *fStack; // stack of cache states
TGeoHMatrix **fMatrixBranch; // current branch of global matrices
TGeoHMatrix **fMPB; // pre-built matrices
TGeoNode **fNodeBranch; // current branch of nodes
TGeoStateInfo **fInfoBranch; // current branch of nodes
TGeoStateInfo *fPWInfo; //! State info for the parallel world
Int_t *fNodeIdArray; //! array of node id's
TGeoNodeCache(const TGeoNodeCache &) = delete;
TGeoNodeCache &operator=(const TGeoNodeCache &) = delete;
public:
TGeoNodeCache();
TGeoNodeCache(TGeoNode *top, Bool_t nodeid = kFALSE, Int_t capacity = 30);
~TGeoNodeCache() override;
void BuildIdArray();
void BuildInfoBranch();
void CdNode(Int_t nodeid);
Bool_t CdDown(Int_t index);
Bool_t CdDown(TGeoNode *node);
void CdTop()
{
fLevel = 1;
CdUp();
}
void CdUp();
void FillIdBranch(const Int_t *br, Int_t startlevel = 0)
{
memcpy(fIdBranch + startlevel, br, (fLevel + 1 - startlevel) * sizeof(Int_t));
fIndex = fIdBranch[fLevel];
}
const Int_t *GetIdBranch() const { return fIdBranch; }
void *GetBranch() const { return fNodeBranch; }
void GetBranchNames(Int_t *names) const;
void GetBranchNumbers(Int_t *copyNumbers, Int_t *volumeNumbers) const;
void GetBranchOnlys(Int_t *isonly) const;
void *GetMatrices() const { return fMatrixBranch; }
TGeoHMatrix *GetCurrentMatrix() const { return fMatrix; }
Int_t GetCurrentNodeId() const;
TGeoNode *GetMother(Int_t up = 1) const { return ((fLevel - up) >= 0) ? fNodeBranch[fLevel - up] : nullptr; }
TGeoHMatrix *GetMotherMatrix(Int_t up = 1) const
{
return ((fLevel - up) >= 0) ? fMatrixBranch[fLevel - up] : nullptr;
}
TGeoNode *GetNode() const { return fNode; }
TGeoNode *GetTopNode() const { return fTop; }
TGeoStateInfo *GetInfo();
TGeoStateInfo *GetMakePWInfo(Int_t nd);
void ReleaseInfo();
Int_t GetLevel() const { return fLevel; }
const char *GetPath();
Int_t GetStackLevel() const { return fStackLevel; }
Int_t GetNodeId() const;
Bool_t HasIdArray() const { return fNodeIdArray ? kTRUE : kFALSE; }
Bool_t IsDummy() const { return kTRUE; }
void LocalToMaster(const Double_t *local, Double_t *master) const;
void MasterToLocal(const Double_t *master, Double_t *local) const;
void LocalToMasterVect(const Double_t *local, Double_t *master) const;
void MasterToLocalVect(const Double_t *master, Double_t *local) const;
void LocalToMasterBomb(const Double_t *local, Double_t *master) const;
void MasterToLocalBomb(const Double_t *master, Double_t *local) const;
Int_t PushState(Bool_t ovlp, Int_t ntmany = 0, Int_t startlevel = 0, Double_t *point = nullptr);
Bool_t PopState(Int_t &nmany, Double_t *point = nullptr);
Bool_t PopState(Int_t &nmany, Int_t level, Double_t *point = nullptr);
void PopDummy(Int_t ipop = 9999) { fStackLevel = (ipop > fStackLevel) ? (fStackLevel - 1) : (ipop - 1); }
void Refresh()
{
fNode = fNodeBranch[fLevel];
fMatrix = fMatrixBranch[fLevel];
}
Bool_t RestoreState(Int_t &nmany, TGeoCacheState *state, Double_t *point = nullptr);
ClassDefOverride(TGeoNodeCache, 0) // cache of reusable physical nodes
};
#endif
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...