18 void insertFlags(std::vector<double> &flags, std::shared_ptr<Component> element);
24 totalPathLength_m(0.0)
31 out << std::fixed << std::setprecision(6);
38 for (; mapIti != mapItf; mapIti++) {
39 const auto key = (*mapIti).first;
40 const auto val = (*mapIti).second;
42 << std::setw(numDigits + 7) << std::right << key.first
44 << std::setw(numDigits + 7) << std::right << key.second
45 <<
") number of overlapping elements " << val.size() <<
"\n";
47 for (
auto element: val) {
48 out << std::setw(25 + 2 * numDigits) <<
" " << element->getName() <<
"\n";
54 const double lowerLimit = s - ds;
60 throw OutOfBounds(
"IndexMap::query",
"out of bounds");
66 for (; it != end; ++ it) {
67 const double low = (*it).first.first;
68 const double high = (*it).first.second;
70 if (lowerLimit < high && upperLimit >= low)
break;
73 if (it == end)
return elementSet;
76 for (; last != end; ++ last) {
77 const double low = (*last).first.first;
79 if (upperLimit < low)
break;
82 for (; it != last; ++ it) {
83 const value_t &a = (*it).second;
84 elementSet.insert(a.cbegin(), a.cend());
91 if (initialS > finalS) {
92 std::swap(initialS, finalS);
102 for (; setIt != setEnd; ++ setIt) {
108 bool extendedExisting =
false;
109 for (
auto it = itpair.first; it != itpair.second; ++ it) {
110 key_t ¤tRange = it->second;
112 if (
almostEqual(key.first, currentRange.second / oneMinusEpsilon_m)) {
113 currentRange.second = key.second;
114 extendedExisting =
true;
118 if (!extendedExisting) {
129 (*rit).second.size() == 0 &&
130 zstop > (*rit).first.first &&
131 zstop < (*rit).first.second) {
133 key_t key((*rit).first.first, zstop);
158 std::vector<std::tuple<double, std::vector<double>, std::string> > sectors;
170 for (; mapIti != mapItf; mapIti++) {
171 const auto §orElements = (*mapIti).second;
172 if (sectorElements.size() == 0)
175 const auto §orRange = (*mapIti).first;
177 double sectorBegin = sectorRange.first;
178 double sectorEnd = sectorRange.second;
180 std::vector<std::tuple<double, std::vector<double>, std::string> > currentSector(4);
181 std::get<0>(currentSector[0]) = sectorBegin;
182 std::get<0>(currentSector[1]) = sectorBegin;
183 std::get<0>(currentSector[2]) = sectorEnd;
184 std::get<0>(currentSector[3]) = sectorEnd;
186 for (
unsigned short i = 0; i < 4; ++ i) {
187 auto &flags = std::get<1>(currentSector[i]);
188 flags.resize(
SIZE, 0);
191 for (
auto element: sectorElements) {
193 auto passage = elementPassages.first;
194 auto end = elementPassages.second;
195 for (; passage != end; ++ passage) {
196 const auto &elementRange = (*passage).second;
197 double elementBegin = elementRange.first;
198 double elementEnd = elementRange.second;
200 if (elementBegin <= sectorBegin &&
201 elementEnd >= sectorEnd) {
206 const auto &elementRange = (*passage).second;
207 if (elementRange.first < sectorBegin) {
208 ::insertFlags(std::get<1>(currentSector[0]), element);
209 std::get<2>(currentSector[0]) += element->getName() +
", ";
212 ::insertFlags(std::get<1>(currentSector[1]), element);
213 std::get<2>(currentSector[1]) += element->getName() +
", ";
215 ::insertFlags(std::get<1>(currentSector[2]), element);
216 std::get<2>(currentSector[2]) += element->getName() +
", ";
218 if (elementRange.second > sectorEnd) {
219 ::insertFlags(std::get<1>(currentSector[3]), element);
220 std::get<2>(currentSector[3]) += element->getName() +
", ";
224 for (
unsigned short i = 0; i < 4; ++ i) {
225 sectors.push_back(currentSector[i]);
230 const unsigned int numEntries = sectors.size();
233 for (; it != end; ++ it) {
234 auto element = (*it).first;
235 auto name = element->getName();
236 auto type = element->getType();
242 auto range = (*it).second;
245 for (; i < numEntries; ++ i) {
246 if (std::get<0>(sectors[i]) >= range.first) {
251 if (i == numEntries)
continue;
253 unsigned int j = ++ i;
254 while (std::get<0>(sectors[j]) < range.second) {
258 double length = range.second - range.first;
259 for (; i <= j; ++ i) {
260 double pos = std::get<0>(sectors[i]);
261 auto &items = std::get<1>(sectors[i]);
263 items[
RFCAVITY] = 1.0 - 2 * (pos - range.first) / length;
268 if (sectors.size() > 0 &&
269 std::get<0>(sectors[0]) > initialPathLength) {
271 sectors = std::vector<std::tuple<double, std::vector<double>, std::string> >(1);
272 std::get<0>(sectors[0]) = initialPathLength;
273 std::get<1>(sectors[0]).resize(
SIZE, 0.0);
275 sectors.insert(sectors.end(), tmp.begin(), tmp.end());
278 std::string fileName(
"data/" +
OpalData::getInstance()->getInputBasename() +
"_ElementPositions.sdds");
281 for (
auto sector: sectors) {
282 std::string names = std::get<2>(sector);
284 names = names.substr(0, names.length() - 2);
286 names =
"\"" + names +
"\"";
287 writer.
addRow(std::get<0>(sector),
294 void insertFlags(std::vector<double> &flags, std::shared_ptr<Component> element) {
295 switch (element->getType()) {
299 const Bend2D* bend =
static_cast<const Bend2D*
>(element.get());
351 double position)
const {
353 std::pair<double, double> range(0.0, 0.0);
354 const std::pair<invertedMap_t::const_iterator, invertedMap_t::const_iterator> its =
mapElement2Range_m.equal_range(element);
355 if (std::distance(its.first, its.second) == 0)
357 "Element \"" + element->getName() +
"\" not registered");
359 for (invertedMap_t::const_iterator it = its.first; it != its.second; ++ it) {
361 std::abs((*it).second.second - position));
362 if (distance < minDistance) {
363 minDistance = distance;
364 range = (*it).second;
376 for (; it != end; ++ it) {
379 touchingElements.insert((it->second).begin(), (it->second).end());
382 return touchingElements;
386 return (
std::abs(x - y) < std::numeric_limits<double>::epsilon() *
std::abs(x + y) * 2 ||
std::pair< double, double > key_t
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
value_t query(key_t::first_type s, key_t::second_type ds)
bool isFocusing(unsigned int component) const
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
The base class for all OPAL exceptions.
Tps< T > log(const Tps< T > &x)
Natural logarithm.
Interface for general multipole.
static OpalData * getInstance()
void add(key_t::first_type initialStep, key_t::second_type finalStep, const value_t &val)
constexpr double pi
The value of .
void saveSDDS(double startS) const
T * value_type(const SliceIterator< T > &)
void print(std::ostream &) const
void addRow(double spos, const std::vector< double > &row, const std::string &elements)
std::pair< double, double > getRange(const IndexMap::value_t::value_type &element, double position) const
double getRotationAboutZ() const
static bool almostEqual(double, double)
std::string::iterator iterator
invertedMap_t mapElement2Range_m
static const double oneMinusEpsilon_m
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
size_t getMaxNormalComponentIndex() const
void tidyUp(double zstop)
IndexMap::value_t getTouchingElements(const std::pair< double, double > &range)
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Inform & endl(Inform &inf)
std::set< std::shared_ptr< Component > > value_t