112 if (initialS > finalS) {
113 std::swap(initialS, finalS);
121 value_t::iterator setIt = val.begin();
122 const value_t::iterator setEnd = val.end();
124 for (; setIt != setEnd; ++setIt) {
130 bool extendedExisting =
false;
131 for (
auto it = itpair.first; it != itpair.second; ++it) {
132 key_t& currentRange = it->second;
135 currentRange.
end = key.end;
136 extendedExisting =
true;
140 if (!extendedExisting) {
185 std::vector<std::tuple<double, std::vector<double>, std::string> > sectors;
196 const auto& sectorElements = segment.getActiveElements();
197 if (sectorElements.empty())
continue;
199 double sectorBegin = segment.getBegin();
200 double sectorEnd = segment.getEnd();
202 std::vector<std::tuple<double, std::vector<double>, std::string> > currentSector(4);
203 std::get<0>(currentSector[0]) = sectorBegin;
204 std::get<0>(currentSector[1]) = sectorBegin;
205 std::get<0>(currentSector[2]) = sectorEnd;
206 std::get<0>(currentSector[3]) = sectorEnd;
208 for (
unsigned short i = 0; i < 4; ++i) {
209 auto& flags = std::get<1>(currentSector[i]);
210 flags.resize(
SIZE, 0);
213 for (
auto element : sectorElements) {
215 auto passage = elementPassages.first;
216 auto end = elementPassages.second;
217 for (; passage != end; ++passage) {
218 const auto& elementRange = (*passage).second;
219 double elementBegin = elementRange.begin;
220 double elementEnd = elementRange.end;
222 if (elementBegin <= sectorBegin && elementEnd >= sectorEnd) {
227 const auto& elementRange = (*passage).second;
228 if (elementRange.begin < sectorBegin) {
229 ::insertFlags(std::get<1>(currentSector[0]), element);
230 std::get<2>(currentSector[0]) += element->getName() +
", ";
233 ::insertFlags(std::get<1>(currentSector[1]), element);
234 std::get<2>(currentSector[1]) += element->getName() +
", ";
236 ::insertFlags(std::get<1>(currentSector[2]), element);
237 std::get<2>(currentSector[2]) += element->getName() +
", ";
239 if (elementRange.end > sectorEnd) {
240 ::insertFlags(std::get<1>(currentSector[3]), element);
241 std::get<2>(currentSector[3]) += element->getName() +
", ";
245 for (
unsigned short i = 0; i < 4; ++i) {
246 sectors.push_back(currentSector[i]);
251 const unsigned int numEntries = sectors.size();
254 for (; it != end; ++it) {
255 auto element = (*it).first;
256 auto name = element->getName();
257 auto type = element->getType();
262 auto range = (*it).second;
265 for (; i < numEntries; ++i) {
266 if (std::get<0>(sectors[i]) >= range.begin) {
271 if (i == numEntries)
continue;
273 unsigned int j = ++i;
274 while (std::get<0>(sectors[j]) < range.end) {
278 double length = range.end - range.begin;
279 for (; i <= j; ++i) {
280 double pos = std::get<0>(sectors[i]);
281 auto& items = std::get<1>(sectors[i]);
283 items[
RFCAVITY] = 1.0 - 2 * (pos - range.begin) / length;
288 if (!sectors.empty() && std::get<0>(sectors[0]) > initialPathLength) {
290 sectors = std::vector<std::tuple<double, std::vector<double>, std::string> >(1);
291 std::get<0>(sectors[0]) = initialPathLength;
292 std::get<1>(sectors[0]).resize(
SIZE, 0.0);
294 sectors.insert(sectors.end(), tmp.begin(), tmp.end());
302 for (
auto sector : sectors) {
303 std::string names = std::get<2>(sector);
304 if (!names.empty()) {
305 names = names.substr(0, names.length() - 2);
307 names =
"\"" + names +
"\"";
308 writer.addRow(std::get<0>(sector), std::get<1>(sector), names);
355 const IndexMap::value_t::value_type& element,
double position)
const {
356 double minDistance = std::numeric_limits<double>::max();
357 key_t range{0.0, 0.0};
358 const std::pair<invertedMap_t::const_iterator, invertedMap_t::const_iterator> its =
360 if (std::distance(its.first, its.second) == 0)
362 "IndexMap::getRange()",
"Element \"" + element->getName() +
"\" not registered");
364 for (invertedMap_t::const_iterator it = its.first; it != its.second; ++it) {
365 double distance = std::min(
366 std::abs((*it).second.begin - position), std::abs((*it).second.end - position));
367 if (distance < minDistance) {
368 minDistance = distance;
369 range = (*it).second;