RangeDefinitionBuilder.java
/**
* Copyright (c) 2018 European Organisation for Nuclear Research (CERN), All Rights Reserved.
*/
package cern.accsoft.steering.jmad.tools.modeldefs.creating.lang;
import static java.util.Objects.requireNonNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import cern.accsoft.steering.jmad.domain.file.ModelFile;
import cern.accsoft.steering.jmad.domain.machine.MadxRange;
import cern.accsoft.steering.jmad.domain.machine.RangeDefinition;
import cern.accsoft.steering.jmad.domain.machine.RangeDefinitionImpl;
import cern.accsoft.steering.jmad.domain.machine.SequenceDefinition;
import cern.accsoft.steering.jmad.domain.machine.filter.NameFilter;
import cern.accsoft.steering.jmad.domain.twiss.TwissInitialConditionsImpl;
public class RangeDefinitionBuilder {
private final SequenceDefinition sequenceDefinition;
private final String rangeName;
private TwissInitialConditionsImpl twissInitialConditions;
private String startElementName;
private String endElementName;
private List<NameFilter> monitorInvertFilters = new ArrayList<>();
private List<NameFilter> correctorInvertFilters = new ArrayList<>();
private List<ModelFile> postUseFiles = new ArrayList<>();
private String rotateStartElementName;
public RangeDefinitionBuilder(String rangeName, SequenceDefinition sequenceDefinition) {
this.rangeName = requireNonNull(rangeName, "rangeName must not be null");
this.sequenceDefinition = requireNonNull(sequenceDefinition, "sequenceDefinition must not be null");
this.twissInitialConditions = new TwissInitialConditionsImpl(
sequenceDefinition.getName() + "-" + rangeName + "-twiss");
}
public RangeDefinition build() {
if (twissInitialConditions == null) {
throw new IllegalStateException(
"Twiss initial conditions not defined for range '" + rangeName + "'. This is not allowed!");
}
RangeDefinitionImpl rangeDefinition = new RangeDefinitionImpl(sequenceDefinition, rangeName, madxRange(),
twissInitialConditions);
monitorInvertFilters.stream().forEachOrdered(rangeDefinition::addMonitorInvertFilter);
correctorInvertFilters.stream().forEachOrdered(rangeDefinition::addCorrectorInvertFilter);
postUseFiles.stream().forEachOrdered(rangeDefinition::addPostUseFile);
if (this.rotateStartElementName != null) {
rangeDefinition.setStartElementName(rotateStartElementName);
}
return rangeDefinition;
}
private MadxRange madxRange() {
MadxRange defaultRange = new MadxRange();
String first = Optional.ofNullable(getStartElementName()).orElse(defaultRange.getFirstElementName());
String last = Optional.ofNullable(getEndElementName()).orElse(defaultRange.getLastElementName());
return new MadxRange(first, last);
}
public TwissInitialConditionsImpl getTwissInitialConditions() {
return twissInitialConditions;
}
public void setTwissInitialConditions(TwissInitialConditionsImpl twissInitialConditions) {
this.twissInitialConditions = twissInitialConditions;
}
public String getStartElementName() {
return startElementName;
}
public void setStartElementName(String startElementName) {
this.startElementName = startElementName;
}
public String getEndElementName() {
return endElementName;
}
public void setEndElementName(String endElementName) {
this.endElementName = endElementName;
}
public String getRangeName() {
return rangeName;
}
public void addMonitorInvertFilter(NameFilter filter) {
this.monitorInvertFilters.add(filter);
}
public void addCorrectorInvertFilter(NameFilter filter) {
this.correctorInvertFilters.add(filter);
}
public void addPostUseFile(ModelFile modelFile) {
this.postUseFiles.add(modelFile);
}
public void setRotateStartElementName(String elementName) {
this.rotateStartElementName = elementName;
}
public String getRotateStartElementName() {
return this.rotateStartElementName;
}
}