ATLAS Offline Software
Loading...
Searching...
No Matches
MagnetSet.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
12
13#include <fstream>
14#include <algorithm>
15
16namespace ForwardTracker {
17
18 Magnet::Container_t MagnetSet(const ConfigData& cData, const Side& side) {
19
20 Magnet::Container_t magnets; // (x, y, z) = (left, up, forward)
21
22 std::shared_ptr<std::ifstream> twissFile = TwissFile(cData, side);
23
24 std::ifstream& pfile = *twissFile;
25
26 double beamEnergy = ForwardTracker::GetBeamEnergy(pfile);
27
28 std::cout << "beamEnergy[GeV] = " << beamEnergy << std::endl;
29
30 while (pfile.peek() == '@' || pfile.peek() == '*' || pfile.peek() == '$') pfile.ignore(1000, '\n');
31
32 std::ios::fmtflags cout_flags = std::cout.flags();
33
34 std::cout << std::left
35 << std::setw(15) << "magName"
36 << std::setw(15) << "magSort"
37 << std::right
38 << std::setw(10) << "magType"
39 << std::setw(15) << "magEndPos"
40 << std::setw(15) << "magLength"
41 << std::setw(15) << "magStrength"
42 << std::setw(15) << "magAperType"
43 << std::setw(10) << "magAper1"
44 << std::setw(10) << "magAper2"
45 << std::setw(10) << "magAper3"
46 << std::setw(10) << "magAper4"
47 << std::endl;
48
49 while (true) { // Read the magnet data from twiss_b1.txt for beam 1 (side 1) and twiss_b2.txt for beam 2 (side 0).
50
51 std::string magName, magSort, magBasic;
52 double magEndPos, magLength;
53 double HKICK, VKICK;
54 double K0L, K1L, K2L, K3L;
55 double X, PX, BETX, ALFX, MUX, DX, DPX;
56 double Y, PY, BETY, ALFY, MUY, DY, DPY;
57 std::string magAperType;
58 double magAper1, magAper2, magAper3, magAper4;
59
60 pfile >> magName >> magSort >> magBasic >> magEndPos >> magLength
61 >> HKICK >> VKICK
62 >> K0L >> K1L >> K2L >> K3L
63 >> X >> Y >> PX >> PY
64 >> BETX >> BETY >> ALFX >> ALFY >> MUX >> MUY
65 >> DX >> DY >> DPX >> DPY
66 >> magAperType
67 >> magAper1 >> magAper2 >> magAper3 >> magAper4;
68
69 if (magEndPos < 0) throw std::runtime_error("Magnet End Position cannot be negative.");
70 else if (magEndPos > cData.endMarker) break;
71
73 double magStrength = 0;
74
75 if (K0L != 0) { magType = Magnet::hbDipole; magStrength = K0L; }
76 else if (K1L != 0) { magType = (K1L > 0) ? Magnet::hfQuadrupole : Magnet::vfQuadrupole; magStrength = K1L; }
77 else if (HKICK != 0) { magType = Magnet::hbDipole; magStrength = -HKICK; }
78 else if (VKICK != 0) { magType = Magnet::vbDipole; magStrength = +VKICK; }
79
80 if (magType == Magnet::notAMagnet) continue;
81
82 std::cout.precision(6);
83 if (magName.find("DRIFT") != 1)
84 std::cout << std::fixed
85 << std::left
86 << std::setw(15) << magName
87 << std::setw(15) << magSort
88 << std::right
89 << std::setw(10) << magType
90 << std::setw(15) << magEndPos
91 << std::setw(15) << magLength
92 << std::setw(15) << magStrength
93 << std::setw(15) << magAperType
94 << std::setw(10) << magAper1
95 << std::setw(10) << magAper2
96 << std::setw(10) << magAper3
97 << std::setw(10) << magAper4
98 << std::endl;
99
100 if (magLength < 0) throw std::runtime_error("magLength must be positive.");
101 else if (magLength == 0) {
102 if (magType == Magnet::hfQuadrupole) throw std::runtime_error("magLength cannot be zero for hfQuadrupole.");
103 if (magType == Magnet::vfQuadrupole) throw std::runtime_error("magLength cannot be zero for vfQuadrupole.");
104 }
105
106 double z = (magEndPos - 0.5*magLength)*ForwardTrackerConstants::aside[side];
107
108 Magnet::ConstPtr_t mptr = MagnetFactory(TransverseShift(z)[0], // account of beam splitting around 155 m
109 TransverseShift(z)[1],
110 z,
111 magStrength,
112 magLength,
113 magAperType,
114 magAper1,
115 magAper2,
116 magAper3,
117 magAper4,
118 beamEnergy,
119 side,
120 magType);
121
122 magnets.push_back(std::move(mptr));
123 }
124
125 std::sort(magnets.begin(), magnets.end(), absZGreater<Magnet::ConstPtr_t>);
126
127 std::cout.flags(cout_flags);
128
129 return magnets;
130 }
131}
static const int K0L
Definition AtlasPID.h:112
#define z
std::shared_ptr< const Magnet > ConstPtr_t
TransversePoint TransverseShift(double z)
bool absZGreater(const PtrType rhs, const PtrType lhs)
Magnet::ConstPtr_t MagnetFactory(double x, double y, double z, double strength, double length, const std::string &aperType, double A1, double A2, double A3, double A4, double beamEnergy, Side side, Magnet::Type type)
Magnet::Container_t MagnetSet(const ConfigData &, const Side &)
Definition MagnetSet.cxx:18
double GetBeamEnergy(std::ifstream &)
std::shared_ptr< std::ifstream > TwissFile(const ConfigData &, const Side &)
Definition TwissFile.cxx:14
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.