19#include "BDSOutputROOTEventModel.hh"
22#include "BDSAcceleratorModel.hh"
23#include "BDSBeamline.hh"
24#include "BDSBeamlineElement.hh"
25#include "BDSBeamPipeInfo.hh"
26#include "BDSMagnet.hh"
27#include "BDSMagnetStrength.hh"
28#include "BDSSamplerRegistry.hh"
30#include "G4RotationMatrix.hh"
45 storeCollimatorInfo(false),
60 std::vector<std::pair<float, int> > distanceAndIndex;
61 distanceAndIndex.reserve(midRefPos.size());
62 for (
int i = 0; i < (int)midRefPos.size(); i++)
63 {distanceAndIndex.emplace_back(std::make_pair((midRefPos[i]-point).Mag(), i));}
66 {
bool operator()(std::pair<float, int>& a, std::pair<float, int>& b)
const {
return a.first < b.first;};};
67 std::sort(distanceAndIndex.begin(), distanceAndIndex.end(), customLess());
68 return distanceAndIndex[0].second;
74 componentName.clear();
75 placementName.clear();
76 componentType.clear();
98 beamPipeAper1.clear();
99 beamPipeAper2.clear();
100 beamPipeAper3.clear();
101 beamPipeAper4.clear();
145 scoringMeshTranslation.clear();
146 scoringMeshRotation.clear();
147 scoringMeshName.clear();
149 materialIDToName.clear();
150 materialNameToID.clear();
152 samplerNamesUnique.clear();
153 samplerSPosition.clear();
154 samplerCNamesUnique.clear();
155 samplerSNamesUnique.clear();
156 samplerCRadius.clear();
157 samplerSRadius.clear();
163 storeCollimatorInfo(storeCollimatorInfoIn),
169 TRotation rr = TRotation();
175 CLHEP::Hep3Vector axis;
177 rm->getAngleAxis(rotAngle, axis);
178 rr.Rotate(rotAngle, TVector3(axis.x(), axis.y(), axis.z()));
189 return TVector3(v.x() / CLHEP::m, v.y() / CLHEP::m, v.z() / CLHEP::m);
193 const std::map<G4String, G4int>& collimatorIndicesByNameIn,
194 const std::vector<BDSOutputROOTEventCollimatorInfo>& collimatorInfoIn,
195 const std::vector<G4String>& collimatorBranchNamesIn,
196 const std::map<G4String, G4Transform3D>* scorerMeshPlacements,
197 const std::map<short int, G4String>* materialIDToNameUnique,
198 G4bool storeTrajectory)
201 for (
const auto& nameSPos : sr->GetUniquePlaneNamesAndSPosition())
203 samplerNamesUnique.push_back(std::string(nameSPos.first) +
".");
204 samplerSPosition.push_back((
double) nameSPos.second / CLHEP::m);
206 for (
const auto& name : sr->GetUniqueNamesCylinder())
207 {samplerCNamesUnique.push_back(std::string(name) +
".");}
208 for (
const auto& name : sr->GetUniqueNamesSphere())
209 {samplerSNamesUnique.push_back(std::string(name) +
".");}
210 samplerCRadius = sr->GetUniqueNameToRadiusCylinder();
211 samplerSRadius = sr->GetUniqueNameToRadiusSphere();
213 for (
const auto& name : collimatorBranchNamesIn)
216 if (scorerMeshPlacements)
218 for (
const auto& kv : *scorerMeshPlacements)
220 const G4String& name = kv.first;
221 scoringMeshTranslation[name] =
ConvertToROOT(kv.second.getTranslation());
222 scoringMeshRotation[name] =
ConvertToROOT(kv.second.getRotation());
223 scoringMeshName.emplace_back(name);
233 for (
const auto value : collimatorIndicesIn)
238 for (
const auto& kv : collimatorIndicesByNameIn)
244 if (materialIDToNameUnique && storeTrajectory)
246 for (
const auto& kv : *materialIDToNameUnique)
248 materialIDToName[kv.first] = (std::string)kv.second;
249 materialNameToID[(std::string)kv.second] = kv.first;
253 n = (int)beamline->
size();
255 for (
auto i = beamline->
begin(); i != beamline->
end(); ++i)
257 componentName.push_back((*i)->GetName());
258 placementName.push_back((*i)->GetPlacementName());
259 componentType.push_back((*i)->GetType());
260 length.push_back((
float)((*i)->GetAcceleratorComponent()->GetArcLength() / CLHEP::m));
261 angle.push_back((
float)((*i)->GetAcceleratorComponent()->GetAngle() / CLHEP::radian));
268 staRefPos.emplace_back(
ConvertToROOT((*i)->GetReferencePositionStart()));
269 midRefPos.emplace_back(
ConvertToROOT((*i)->GetReferencePositionMiddle()));
270 endRefPos.emplace_back(
ConvertToROOT((*i)->GetReferencePositionEnd()));
271 staRefRot.push_back(
ConvertToROOT((*i)->GetReferenceRotationStart()));
272 midRefRot.push_back(
ConvertToROOT((*i)->GetReferenceRotationMiddle()));
273 endRefRot.push_back(
ConvertToROOT((*i)->GetReferenceRotationEnd()));
279 tilt.push_back((
float)(to->
GetTilt() / CLHEP::rad));
280 offsetX.push_back((
float)(to->
GetXOffset() / CLHEP::m));
281 offsetY.push_back((
float)(to->
GetYOffset() / CLHEP::m));
286 offsetX.push_back(0);
287 offsetY.push_back(0);
291 staS.push_back((
float)((*i)->GetSPositionStart() / CLHEP::m));
292 midS.push_back((
float)((*i)->GetSPositionMiddle() / CLHEP::m));
293 endS.push_back((
float)((*i)->GetSPositionEnd() / CLHEP::m));
297 beamPipeType.push_back(beampipeinfo ? beampipeinfo->
beamPipeType.ToString() :
"");
298 beamPipeAper1.push_back(beampipeinfo ? beampipeinfo->
aper1 / CLHEP::m : 0);
299 beamPipeAper2.push_back(beampipeinfo ? beampipeinfo->
aper2 / CLHEP::m : 0);
300 beamPipeAper3.push_back(beampipeinfo ? beampipeinfo->
aper3 / CLHEP::m : 0);
301 beamPipeAper4.push_back(beampipeinfo ? beampipeinfo->
aper4 / CLHEP::m : 0);
304 const auto accComp = (*i)->GetAcceleratorComponent();
305 material.push_back(accComp->Material());
308 std::vector<std::vector<float>*> localNorm = {&k1,&k2,&k3,&k4,&k5,&k6,&k7,&k8,&k9,&k10,&k11,&k12};
309 std::vector<std::vector<float>*> localSkew = {&k1s,&k2s,&k3s,&k4s,&k5s,&k6s,&k7s,&k8s,&k9s,&k10s,&k11s,&k12s};
314 for (
int j = 0; j < (int)localNorm.size(); j++)
315 {localNorm[j]->push_back(0);}
316 for (
int j = 0; j < (int)localSkew.size(); j++)
317 {localSkew[j]->push_back(0);}
329 fintxk2.push_back(0);
343 for (
int j = 0; j < (int)localNorm.size(); j++)
344 {localNorm[j]->push_back((
float)normComponents[j]);}
346 for (
int j = 0; j < (int)localSkew.size(); j++)
347 {localSkew[j]->push_back((
float)skewComponents[j]);}
357 fint.push_back((
float)(*ms)[
"fint"]);
358 fintx.push_back((
float)(*ms)[
"fintx"]);
359 fintk2.push_back((
float)(*ms)[
"fintk2"]);
360 fintxk2.push_back((
float)(*ms)[
"fintxk2"]);
const BDSBeamline * BeamlineMain() const
Accessor.
Holder class for all information required to describe a beam pipe model.
G4double aper3
Public member for direct access.
G4double aper1
Public member for direct access.
G4double aper4
Public member for direct access.
G4double aper2
Public member for direct access.
BDSBeamPipeType beamPipeType
Public member for direct access.
A vector of BDSBeamlineElement instances - a beamline.
BeamlineVector::size_type size() const
Get the number of elements.
iterator begin()
Iterator mechanics.
iterator end()
Iterator mechanics.
Efficient storage of magnet strengths.
std::vector< G4double > NormalComponents() const
Accessor for all normal components - k1 - k12.
std::vector< G4double > SkewComponents() const
Accessor for all skew components - k1 - k12.
static G4double Unit(const G4String &key)
Access a unit factor for a given key.
Abstract base class that implements features common to all magnets.
Information stored per model representing accelerator.
std::vector< BDSOutputROOTEventCollimatorInfo > collimatorInfo
Collimator information explicitly.
bool storeCollimatorInfo
Whether optional collimator information was stored.
std::vector< float > vkick
Vertical fractional momentum kick.
std::vector< float > eField
E field in V/m.
std::vector< std::string > collimatorBranchNamesUnique
Vector of all collimator branch names in event tree used to load data.
int nCollimators
Number of collimators in beam line.
virtual ~BDSOutputROOTEventModel()
Destructor.
int findNearestElement(const TVector3 &point) const
Find element index closest to point.
std::vector< float > bField
B field in T.
std::vector< float > hkick
Horizontal fractional momentum kick.
std::vector< int > collimatorIndices
std::vector< std::string > material
Material associated with element if any.
virtual void Fill(const std::vector< G4int > &collimatorIndicesIn={}, const std::map< G4String, G4int > &collimatorIndicesByNameIn={}, const std::vector< BDSOutputROOTEventCollimatorInfo > &collimatorInfoIn={}, const std::vector< G4String > &collimatorBranchNamesIn={}, const std::map< G4String, G4Transform3D > *scorerMeshPlacements=nullptr, const std::map< short int, G4String > *materialIDToNameUnique=nullptr, G4bool storeTrajectory=false)
Fill root output.
void Flush()
Initialise all members.
BDSOutputROOTEventModel()
Default constructor.
std::map< std::string, int > collimatorIndicesByName
Similar cache but by name of collimator as built by BDSIM.
std::vector< float > ks
Solenoid strength.
TRotation ConvertToROOT(const G4RotationMatrix *rm) const
Utility function.
static BDSSamplerRegistry * Instance()
Accessor for registry.
A holder for any placement offsets and rotations for a BDSAcceleratorComponent.
G4double GetYOffset() const
Accessor.
G4double GetXOffset() const
Accessor.
G4double GetTilt() const
Accessor.