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
TGeoBoolNode.h
// @(#):$Id$
// Author: Andrei Gheata 30/05/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. *
*************************************************************************/
#ifndef ROOT_TGeoBoolNode
#define ROOT_TGeoBoolNode
#include "TObject.h"
#include <mutex>
#include <vector>
// forward declarations
class TGeoShape;
class TGeoMatrix;
class TGeoHMatrix;
class TGeoBoolNode : public TObject {
public:
enum EGeoBoolType { kGeoUnion, kGeoIntersection, kGeoSubtraction };
struct ThreadData_t {
Int_t fSelected; // ! selected branch
ThreadData_t();
~ThreadData_t();
};
ThreadData_t &GetThreadData() const;
void ClearThreadData() const;
void CreateThreadData(Int_t nthreads);
private:
TGeoBoolNode(const TGeoBoolNode &) = delete;
TGeoBoolNode &operator=(const TGeoBoolNode &) = delete;
protected:
TGeoShape *fLeft{nullptr}; // shape on the left branch
TGeoShape *fRight{nullptr}; // shape on the right branch
TGeoMatrix *fLeftMat{nullptr}; // transformation that applies to the left branch
TGeoMatrix *fRightMat{nullptr}; // transformation that applies to the right branch
Int_t fNpoints{0}; //! number of points on the mesh
Double_t *fPoints{nullptr}; //! array of mesh points
mutable std::vector<ThreadData_t *> fThreadData; //! Navigation data per thread
mutable Int_t fThreadSize{0}; //! Size for the navigation data array
mutable std::mutex fMutex; //! Mutex for thread data access
// methods
Bool_t MakeBranch(const char *expr, Bool_t left);
void AssignPoints(Int_t npoints, Double_t *points);
public:
// constructors
TGeoBoolNode();
TGeoBoolNode(const char *expr1, const char *expr2);
TGeoBoolNode(TGeoShape *left, TGeoShape *right, TGeoMatrix *lmat = nullptr, TGeoMatrix *rmat = nullptr);
// destructor
~TGeoBoolNode() override;
// methods
virtual void ComputeBBox(Double_t &dx, Double_t &dy, Double_t &dz, Double_t *origin) = 0;
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) = 0;
virtual Bool_t Contains(const Double_t *point) const = 0;
virtual Int_t DistanceToPrimitive(Int_t px, Int_t py) = 0;
virtual Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const = 0;
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const = 0;
virtual EGeoBoolType GetBooleanOperator() const = 0;
virtual Int_t GetNpoints() = 0;
TGeoMatrix *GetLeftMatrix() const { return fLeftMat; }
TGeoMatrix *GetRightMatrix() const { return fRightMat; }
TGeoShape *GetLeftShape() const { return fLeft; }
TGeoShape *GetRightShape() const { return fRight; }
virtual TGeoBoolNode *MakeClone() const = 0;
void Paint(Option_t *option) override;
void RegisterMatrices();
Bool_t ReplaceMatrix(TGeoMatrix *mat, TGeoMatrix *newmat);
virtual Double_t Safety(const Double_t *point, Bool_t in = kTRUE) const = 0;
void SavePrimitive(std::ostream &out, Option_t *option = "") override;
virtual void SetPoints(Double_t *points) const;
virtual void SetPoints(Float_t *points) const;
void SetSelected(Int_t sel);
virtual void Sizeof3D() const;
ClassDefOverride(TGeoBoolNode, 1) // a boolean node
};
//////////////////////////////////////////////////////////////////////////////
// //
// TGeoUnion - Boolean node representing a union between two components. //
// //
//////////////////////////////////////////////////////////////////////////////
class TGeoUnion : public TGeoBoolNode {
public:
// constructors
TGeoUnion();
TGeoUnion(const char *expr1, const char *expr2);
TGeoUnion(TGeoShape *left, TGeoShape *right, TGeoMatrix *lmat = nullptr, TGeoMatrix *rmat = nullptr);
// destructor
~TGeoUnion() override;
// methods
void ComputeBBox(Double_t &dx, Double_t &dy, Double_t &dz, Double_t *origin) override;
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) override;
Bool_t Contains(const Double_t *point) const override;
Int_t DistanceToPrimitive(Int_t px, Int_t py) override;
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const override;
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const override;
EGeoBoolType GetBooleanOperator() const override { return kGeoUnion; }
Int_t GetNpoints() override;
Double_t Safety(const Double_t *point, Bool_t in = kTRUE) const override;
void SavePrimitive(std::ostream &out, Option_t *option = "") override;
void Sizeof3D() const override;
// CS specific
TGeoBoolNode *MakeClone() const override;
void Paint(Option_t *option) override;
ClassDefOverride(TGeoUnion, 1) // union node
};
//////////////////////////////////////////////////////////////////////////////
// //
// TGeoIntersection - Boolean node representing an intersection between two //
// components. //
// //
//////////////////////////////////////////////////////////////////////////////
class TGeoIntersection : public TGeoBoolNode {
public:
// constructors
TGeoIntersection();
TGeoIntersection(const char *expr1, const char *expr2);
TGeoIntersection(TGeoShape *left, TGeoShape *right, TGeoMatrix *lmat = nullptr, TGeoMatrix *rmat = nullptr);
// destructor
~TGeoIntersection() override;
// methods
void ComputeBBox(Double_t &dx, Double_t &dy, Double_t &dz, Double_t *origin) override;
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) override;
Bool_t Contains(const Double_t *point) const override;
Int_t DistanceToPrimitive(Int_t px, Int_t py) override;
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const override;
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const override;
EGeoBoolType GetBooleanOperator() const override { return kGeoIntersection; }
Int_t GetNpoints() override;
Double_t Safety(const Double_t *point, Bool_t in = kTRUE) const override;
void SavePrimitive(std::ostream &out, Option_t *option = "") override;
void Sizeof3D() const override;
// CS specific
TGeoBoolNode *MakeClone() const override;
void Paint(Option_t *option) override;
ClassDefOverride(TGeoIntersection, 1) // intersection node
};
//////////////////////////////////////////////////////////////////////////////
// //
// TGeoSubtraction - Boolean node representing a subtraction. //
// //
//////////////////////////////////////////////////////////////////////////////
class TGeoSubtraction : public TGeoBoolNode {
public:
// constructors
TGeoSubtraction();
TGeoSubtraction(const char *expr1, const char *expr2);
TGeoSubtraction(TGeoShape *left, TGeoShape *right, TGeoMatrix *lmat = nullptr, TGeoMatrix *rmat = nullptr);
// destructor
~TGeoSubtraction() override;
// methods
void ComputeBBox(Double_t &dx, Double_t &dy, Double_t &dz, Double_t *origin) override;
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) override;
Bool_t Contains(const Double_t *point) const override;
Int_t DistanceToPrimitive(Int_t px, Int_t py) override;
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const override;
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = 0,
Double_t *safe = nullptr) const override;
EGeoBoolType GetBooleanOperator() const override { return kGeoSubtraction; }
Int_t GetNpoints() override;
Double_t Safety(const Double_t *point, Bool_t in = kTRUE) const override;
void SavePrimitive(std::ostream &out, Option_t *option = "") override;
void Sizeof3D() const override;
// CS specific
TGeoBoolNode *MakeClone() const override;
void Paint(Option_t *option) override;
ClassDefOverride(TGeoSubtraction, 1) // subtraction node
};
#endif
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...