RangeDefinitionBuilder.java

  1. /**
  2.  * Copyright (c) 2018 European Organisation for Nuclear Research (CERN), All Rights Reserved.
  3.  */

  4. package cern.accsoft.steering.jmad.tools.modeldefs.creating.lang;

  5. import static java.util.Objects.requireNonNull;

  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.Optional;

  9. import cern.accsoft.steering.jmad.domain.file.ModelFile;
  10. import cern.accsoft.steering.jmad.domain.machine.MadxRange;
  11. import cern.accsoft.steering.jmad.domain.machine.RangeDefinition;
  12. import cern.accsoft.steering.jmad.domain.machine.RangeDefinitionImpl;
  13. import cern.accsoft.steering.jmad.domain.machine.SequenceDefinition;
  14. import cern.accsoft.steering.jmad.domain.machine.filter.NameFilter;
  15. import cern.accsoft.steering.jmad.domain.twiss.TwissInitialConditionsImpl;

  16. public class RangeDefinitionBuilder {

  17.     private final SequenceDefinition sequenceDefinition;
  18.     private final String rangeName;
  19.     private TwissInitialConditionsImpl twissInitialConditions;
  20.     private String startElementName;
  21.     private String endElementName;

  22.     private List<NameFilter> monitorInvertFilters = new ArrayList<>();
  23.     private List<NameFilter> correctorInvertFilters = new ArrayList<>();
  24.     private List<ModelFile> postUseFiles = new ArrayList<>();
  25.     private String rotateStartElementName;

  26.     public RangeDefinitionBuilder(String rangeName, SequenceDefinition sequenceDefinition) {
  27.         this.rangeName = requireNonNull(rangeName, "rangeName must not be null");
  28.         this.sequenceDefinition = requireNonNull(sequenceDefinition, "sequenceDefinition must not be null");
  29.         this.twissInitialConditions = new TwissInitialConditionsImpl(
  30.                 sequenceDefinition.getName() + "-" + rangeName + "-twiss");
  31.     }

  32.     public RangeDefinition build() {
  33.         if (twissInitialConditions == null) {
  34.             throw new IllegalStateException(
  35.                     "Twiss initial conditions not defined for range '" + rangeName + "'. This is not allowed!");
  36.         }
  37.         RangeDefinitionImpl rangeDefinition = new RangeDefinitionImpl(sequenceDefinition, rangeName, madxRange(),
  38.                 twissInitialConditions);
  39.         monitorInvertFilters.stream().forEachOrdered(rangeDefinition::addMonitorInvertFilter);
  40.         correctorInvertFilters.stream().forEachOrdered(rangeDefinition::addCorrectorInvertFilter);
  41.         postUseFiles.stream().forEachOrdered(rangeDefinition::addPostUseFile);
  42.         if (this.rotateStartElementName != null) {
  43.             rangeDefinition.setStartElementName(rotateStartElementName);
  44.         }
  45.         return rangeDefinition;

  46.     }

  47.     private MadxRange madxRange() {
  48.         MadxRange defaultRange = new MadxRange();
  49.         String first = Optional.ofNullable(getStartElementName()).orElse(defaultRange.getFirstElementName());
  50.         String last = Optional.ofNullable(getEndElementName()).orElse(defaultRange.getLastElementName());
  51.         return new MadxRange(first, last);
  52.     }

  53.     public TwissInitialConditionsImpl getTwissInitialConditions() {
  54.         return twissInitialConditions;
  55.     }

  56.     public void setTwissInitialConditions(TwissInitialConditionsImpl twissInitialConditions) {
  57.         this.twissInitialConditions = twissInitialConditions;
  58.     }

  59.     public String getStartElementName() {
  60.         return startElementName;
  61.     }

  62.     public void setStartElementName(String startElementName) {
  63.         this.startElementName = startElementName;
  64.     }

  65.     public String getEndElementName() {
  66.         return endElementName;
  67.     }

  68.     public void setEndElementName(String endElementName) {
  69.         this.endElementName = endElementName;
  70.     }

  71.     public String getRangeName() {
  72.         return rangeName;
  73.     }

  74.     public void addMonitorInvertFilter(NameFilter filter) {
  75.         this.monitorInvertFilters.add(filter);
  76.     }

  77.     public void addCorrectorInvertFilter(NameFilter filter) {
  78.         this.correctorInvertFilters.add(filter);
  79.     }

  80.     public void addPostUseFile(ModelFile modelFile) {
  81.         this.postUseFiles.add(modelFile);
  82.     }

  83.     public void setRotateStartElementName(String elementName) {
  84.         this.rotateStartElementName = elementName;
  85.     }

  86.     public String getRotateStartElementName() {
  87.         return this.rotateStartElementName;
  88.     }
  89. }