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
Raw File
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
back to top