Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:18:13

0001 // Tell emacs that this is a C++ source
0002 // -*- C++ -*-.
0003 #ifndef G4MVTX_PHG4EICMVTXDETECTOR_H
0004 #define G4MVTX_PHG4EICMVTXDETECTOR_H
0005 
0006 #include <g4main/PHG4Detector.h>
0007 
0008 #include <array>
0009 #include <cmath>  // for M_PI
0010 #include <map>
0011 #include <set>
0012 #include <string>
0013 #include <tuple>  // for tuple
0014 
0015 class G4AssemblyVolume;
0016 class G4LogicalVolume;
0017 class G4VPhysicalVolume;
0018 class PHCompositeNode;
0019 class PHG4MvtxDisplayAction;
0020 class PHG4Subsystem;
0021 class PHParametersContainer;
0022 
0023 class PHG4EICMvtxDetector : public PHG4Detector
0024 {
0025  public:
0026   //! constructor
0027   PHG4EICMvtxDetector(PHG4Subsystem* subsys, PHCompositeNode* Node, const PHParametersContainer* _paramsContainer, const std::string& dnam);
0028 
0029   //! destructor
0030   ~PHG4EICMvtxDetector() override = default;
0031 
0032   //! construct
0033   void ConstructMe(G4LogicalVolume* world) override;
0034 
0035   //!@name volume accessors
0036   //@{
0037   int IsInMvtx(G4VPhysicalVolume*, int& layer, int& stave) const;
0038   int IsSensor(G4VPhysicalVolume*) const;
0039   //@}
0040 
0041   int IsActive(int lyr) const { return m_IsLayerActive[lyr]; }
0042   int IsAbsorberActive(int lyr) const { return m_IsLayerAbsorberActive[lyr]; }
0043   int IsBlackHole(int lyr) const { return m_IsBlackHole[lyr]; }
0044   void SuperDetector(const std::string& name) { m_SuperDetector = name; }
0045   const std::string &SuperDetector() const { return m_SuperDetector; }
0046   void Detector(const std::string& name) { m_Detector = name; }
0047   const std::string &Detector() const { return m_Detector; }
0048 
0049   int get_layer(int stv_index) const;
0050   int get_stave(int stv_index) const;
0051 
0052  private:
0053   void AddGeometryNode();
0054   int ConstructMvtx(G4LogicalVolume* sandwich);
0055   int ConstructMvtx_Layer(int layer, G4AssemblyVolume* stave, G4LogicalVolume*& trackerenvelope);
0056   void SetDisplayProperty(G4AssemblyVolume* av);
0057   void SetDisplayProperty(G4LogicalVolume* lv);
0058   void FillPVArray(G4AssemblyVolume* av);
0059   void FindSensor(G4LogicalVolume* lv);
0060   // calculated quantities
0061   double get_phistep(int lay) const { return 2.0 * M_PI / m_N_staves[lay]; }
0062 
0063   static constexpr int n_Layers = 3;
0064   PHG4MvtxDisplayAction* m_DisplayAction;
0065   const PHParametersContainer* m_ParamsContainer;
0066 
0067   // map of sensor physical volume pointers
0068   std::set<G4VPhysicalVolume*> m_SensorPV;
0069   std::map<G4VPhysicalVolume*, std::tuple<int, int>> m_StavePV;
0070 
0071   // setup parameters
0072   std::array<int, n_Layers> m_IsLayerActive{};
0073   std::array<int, n_Layers> m_IsLayerAbsorberActive{};
0074   std::array<int, n_Layers> m_IsBlackHole{};
0075   std::array<int, n_Layers> m_N_staves{};
0076   std::array<double, n_Layers> m_nominal_radius{};
0077   std::array<double, n_Layers> m_nominal_phitilt{};
0078   std::array<double, n_Layers> m_nominal_phi0{};
0079 
0080   std::string m_Detector;
0081   std::string m_SuperDetector;
0082   std::string m_StaveGeometryFile;
0083 };
0084 
0085 #endif