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