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;
    }
}