File indexing completed on 2026-11-07 10:25:37
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <memory>
0010 #include <string>
0011
0012 #include "corecel/Types.hh"
0013 #include "corecel/cont/LabelIdMultiMap.hh"
0014 #include "corecel/data/ParamsDataInterface.hh"
0015 #include "corecel/data/ParamsDataStore.hh"
0016 #include "geocel/BoundingBox.hh"
0017 #include "geocel/GeoParamsInterface.hh"
0018 #include "geocel/inp/Model.hh"
0019
0020 #include "OrangeData.hh"
0021 #include "OrangeTypes.hh"
0022
0023 class G4VPhysicalVolume;
0024
0025 namespace celeritas
0026 {
0027 struct OrangeInput;
0028 class GeantGeoParams;
0029 class VolumeParams;
0030
0031
0032
0033
0034
0035
0036
0037
0038 class OrangeParams final : public GeoParamsInterface,
0039 public ParamsDataInterface<OrangeParamsData>
0040 {
0041 public:
0042
0043
0044 using SurfaceMap = LabelIdMultiMap<ImplSurfaceId>;
0045 using UniverseMap = LabelIdMultiMap<UnivId>;
0046 using SPConstVolumes = std::shared_ptr<VolumeParams const>;
0047
0048
0049 public:
0050
0051
0052
0053
0054 static std::shared_ptr<OrangeParams> from_gdml(std::string const& filename);
0055
0056
0057 static std::shared_ptr<OrangeParams> from_geant(
0058 std::shared_ptr<GeantGeoParams const> const& geo,
0059 SPConstVolumes volumes);
0060
0061
0062 static std::shared_ptr<OrangeParams> from_geant(
0063 std::shared_ptr<GeantGeoParams const> const& geo);
0064
0065
0066 static std::shared_ptr<OrangeParams> from_json(std::string const& filename);
0067
0068
0069
0070
0071 OrangeParams(OrangeInput&& input);
0072
0073
0074 OrangeParams(OrangeInput&& input, SPConstVolumes&& volumes);
0075
0076
0077 ~OrangeParams() final;
0078
0079
0080 CELER_DELETE_COPY_MOVE(OrangeParams);
0081
0082
0083 bool supports_safety() const final { return supports_safety_; }
0084
0085
0086 BBox const& bbox() const final { return bbox_; }
0087
0088
0089 inline UnivLevelId::size_type num_univ_levels() const;
0090
0091
0092 inp::Model make_model_input() const final;
0093
0094
0095
0096
0097 inline SurfaceMap const& surfaces() const;
0098
0099
0100 inline UniverseMap const& universes() const;
0101
0102
0103 inline ImplVolumeMap const& impl_volumes() const final;
0104
0105
0106 SPConstVolumeParams const& volumes() const final { return volumes_; }
0107
0108
0109 inline VolumeId volume_id(ImplVolumeId) const final;
0110
0111
0112
0113 inline VolumeInstanceId volume_instance_id(ImplVolumeId) const;
0114
0115
0116 VolumeInstanceId find_volume_instance_at(Real3 const&) const final;
0117
0118
0119
0120
0121 HostRef const& host_ref() const final { return data_.host_ref(); }
0122
0123
0124 DeviceRef const& device_ref() const final { return data_.device_ref(); }
0125
0126 private:
0127
0128 SurfaceMap impl_surf_labels_;
0129 UniverseMap univ_labels_;
0130 ImplVolumeMap impl_vol_labels_;
0131 BBox bbox_;
0132 bool supports_safety_{};
0133
0134
0135 SPConstVolumes volumes_;
0136
0137
0138 ParamsDataStore<OrangeParamsData> data_;
0139 };
0140
0141
0142
0143 extern template class ParamsDataStore<OrangeParamsData>;
0144 extern template class ParamsDataInterface<OrangeParamsData>;
0145
0146
0147
0148
0149
0150
0151
0152 UnivLevelId::size_type OrangeParams::num_univ_levels() const
0153 {
0154 return this->host_ref().scalars.num_univ_levels;
0155 }
0156
0157
0158
0159
0160
0161 auto OrangeParams::surfaces() const -> SurfaceMap const&
0162 {
0163 return impl_surf_labels_;
0164 }
0165
0166
0167
0168
0169
0170 auto OrangeParams::universes() const -> UniverseMap const&
0171 {
0172 return univ_labels_;
0173 }
0174
0175
0176
0177
0178
0179 auto OrangeParams::impl_volumes() const -> ImplVolumeMap const&
0180 {
0181 return impl_vol_labels_;
0182 }
0183
0184
0185
0186
0187
0188 VolumeId OrangeParams::volume_id(ImplVolumeId iv_id) const
0189 {
0190 auto const& volume_id_map = this->host_ref().volume_ids;
0191 CELER_EXPECT(iv_id < volume_id_map.size());
0192 return volume_id_map[iv_id];
0193 }
0194
0195
0196
0197
0198
0199
0200
0201
0202 VolumeInstanceId OrangeParams::volume_instance_id(ImplVolumeId iv_id) const
0203 {
0204 auto const& volume_inst_id_map = this->host_ref().volume_instance_ids;
0205 CELER_EXPECT(iv_id < volume_inst_id_map.size());
0206 return volume_inst_id_map[iv_id];
0207 }
0208
0209
0210 }