Misalignment.java

// @formatter:off
 /*******************************************************************************
 *
 * This file is part of JMad.
 * 
 * Copyright (c) 2008-2011, CERN. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 ******************************************************************************/
// @formatter:on

/*
 * $Id: Misalignment.java,v 1.2 2009-01-20 19:43:10 kfuchsbe Exp $
 * 
 * $Date: 2009-01-20 19:43:10 $ $Revision: 1.2 $ $Author: kfuchsbe $
 * 
 * Copyright CERN, All Rights Reserved.
 */
package cern.accsoft.steering.jmad.domain.misalign;

import java.util.ArrayList;
import java.util.List;

import cern.accsoft.steering.jmad.util.bean.NamedBean;

/**
 * this class defines values, which describe a misalignment of one or more elements. When communicating with MadX this
 * always results in a set of <a href="http://mad.web.cern.ch/mad/error/error_align.html">EALIGN</a> commands.
 * 
 * @author Kajetan Fuchsberger (kajetan.fuchsberger at cern.ch)
 */
public class Misalignment implements NamedBean {

    /** the listeners */
    private final List<MisalignmentListener> listeners = new ArrayList<MisalignmentListener>();

    /**
     * DX: The misalignment in the x-direction for the entry of the beam element (default: 0 m). DX>0 displaces the
     * element in the positive x-direction
     */
    private Double deltaX = null;

    /**
     * DY: The misalignment in the y-direction for the entry of the beam element (default: 0 m). DY>0 displaces the
     * element in the positive y-direction
     */
    private Double deltaY = null;

    /**
     * DS: The misalignment in the s-direction for the entry of the beam element (default: 0 m). DS>0 displaces the
     * element in the positive s-direction
     */
    private Double deltaS = null;

    /**
     * DPHI: The rotation around the x-axis. A positive angle gives a greater x-coordinate for the exit than for the
     * entry (default: 0 rad).
     */
    private Double deltaPhi = null;

    /**
     * DTHETA: The rotation around the y-axis according to the right hand rule (default: 0 rad).
     */
    private Double deltaTheta = null;

    /**
     * DPSI: The rotation around the s-axis according to the right hand rule (default: 0 rad).
     */
    private Double deltaPsi = null;

    //
    // the following values only apply to monitors
    //

    /**
     * MREX: The horizontal read error for a monitor. This is ignored if the element is not a monitor If MREX>0 the
     * reading for x is too high (default: 0 m).
     */
    private Double monitorReadErrorX = null;

    /**
     * MREY: The vertical read error for a monitor. This is ignored if the element is not a monitor If MREY>0, the
     * reading for y is too high (default: 0 m).
     */
    private Double monitorReadErrorY = null;

    /**
     * MSCALX: The relative horizontal scaling error for a monitor. This is ignored if the element is not a monitor. If
     * MSCALX>0 the reading for x is too high (default: 0). A value of 0.5 implies the actual reading is multiplied by
     * 1.5.
     */
    private Double monitorScalingErrorX = null;

    /**
     * MSCALY: The relative vertical scaling error for a monitor. This is ignored if the element is not a monitor. If
     * MSCALY>0 the reading for y is too high (default: 0). A value of -0.3 implies the actual reading is multiplied by
     * 0.7.
     */
    private Double monitorScalingErrorY = null;

    /**
     * AREX: The misalignment in the x-direction for the entry of an aperture limit (default: 0 m). AREX>0 displaces the
     * element in the positive x-direction
     */
    private Double apertureErrorX = null;

    /**
     * AREY: The misalignment in the y-direction for the entry of an aperture limit (default: 0 m). AREY>0 displaces the
     * element in the positive y-direction
     */
    private Double apertureErrorY = null;

    /**
     * the name of the misalignment
     */
    private final String name;

    /**
     * the constructor-which needs a name
     * 
     * @param name the name
     */
    public Misalignment(String name) {
        this.name = name;
    }

    /*
     * Getters and setters
     */

    /**
     * @return the deltaX
     */
    public final Double getDeltaX() {
        return deltaX;
    }

    /**
     * @param deltaX the deltaX to set
     */
    public final void setDeltaX(Double deltaX) {
        this.deltaX = deltaX;
        fireChangedValues();
    }

    /**
     * @return the deltaY
     */
    public final Double getDeltaY() {
        return deltaY;
    }

    /**
     * @param deltaY the deltaY to set
     */
    public final void setDeltaY(Double deltaY) {
        this.deltaY = deltaY;
        fireChangedValues();
    }

    /**
     * @return the deltaS
     */
    public final Double getDeltaS() {
        return deltaS;
    }

    /**
     * @param deltaS the deltaS to set
     */
    public final void setDeltaS(Double deltaS) {
        this.deltaS = deltaS;
        fireChangedValues();
    }

    /**
     * @return the deltaPhi
     */
    public final Double getDeltaPhi() {
        return deltaPhi;
    }

    /**
     * @param deltaPhi the deltaPhi to set
     */
    public final void setDeltaPhi(Double deltaPhi) {
        this.deltaPhi = deltaPhi;
        fireChangedValues();
    }

    /**
     * @return the deltaTheta
     */
    public final Double getDeltaTheta() {
        return deltaTheta;
    }

    /**
     * @param deltaTheta the deltaTheta to set
     */
    public final void setDeltaTheta(Double deltaTheta) {
        this.deltaTheta = deltaTheta;
        fireChangedValues();
    }

    /**
     * @return the deltaPsi
     */
    public final Double getDeltaPsi() {
        return deltaPsi;
    }

    /**
     * @param deltaPsi the deltaPsi to set
     */
    public final void setDeltaPsi(Double deltaPsi) {
        this.deltaPsi = deltaPsi;
        fireChangedValues();
    }

    /**
     * @return the monitorReadErrorX
     */
    public final Double getMonitorReadErrorX() {
        return monitorReadErrorX;
    }

    /**
     * @param monitorReadErrorX the monitorReadErrorX to set
     */
    public final void setMonitorReadErrorX(Double monitorReadErrorX) {
        this.monitorReadErrorX = monitorReadErrorX;
        fireChangedValues();
    }

    /**
     * @return the monitorReadErrorY
     */
    public final Double getMonitorReadErrorY() {
        return monitorReadErrorY;
    }

    /**
     * @param monitorReadErrorY the monitorReadErrorY to set
     */
    public final void setMonitorReadErrorY(Double monitorReadErrorY) {
        this.monitorReadErrorY = monitorReadErrorY;
        fireChangedValues();
    }

    /**
     * @return the monitorScalingErrorX
     */
    public final Double getMonitorScalingErrorX() {
        return monitorScalingErrorX;
    }

    /**
     * @param monitorScalingErrorX the monitorScalingErrorX to set
     */
    public final void setMonitorScalingErrorX(Double monitorScalingErrorX) {
        this.monitorScalingErrorX = monitorScalingErrorX;
        fireChangedValues();
    }

    /**
     * @return the monitorScalingErrorY
     */
    public final Double getMonitorScalingErrorY() {
        return monitorScalingErrorY;
    }

    /**
     * @param monitorScalingErrorY the monitorScalingErrorY to set
     */
    public final void setMonitorScalingErrorY(Double monitorScalingErrorY) {
        this.monitorScalingErrorY = monitorScalingErrorY;
        fireChangedValues();
    }

    /**
     * @return the apertureErrorX
     */
    public final Double getApertureErrorX() {
        return apertureErrorX;
    }

    /**
     * @param apertureErrorX the apertureErrorX to set
     */
    public final void setApertureErrorX(Double apertureErrorX) {
        this.apertureErrorX = apertureErrorX;
        fireChangedValues();
    }

    /**
     * @return the apertureErrorY
     */
    public final Double getApertureErrorY() {
        return apertureErrorY;
    }

    /**
     * @param apertureErrorY the apertureErrorY to set
     */
    public final void setApertureErrorY(Double apertureErrorY) {
        this.apertureErrorY = apertureErrorY;
        fireChangedValues();
    }

    /*
     * methods concerning listeners
     */

    /**
     * notify the listeners, that values have changed
     */
    private void fireChangedValues() {
        for (MisalignmentListener listener : this.listeners) {
            listener.changedValues(this);
        }
    }

    /**
     * @param listener the listener to add
     */
    public void addListener(MisalignmentListener listener) {
        this.listeners.add(listener);
    }

    /**
     * @param listener the listener to remove
     */
    public void removeListener(MisalignmentListener listener) {
        this.listeners.remove(listener);
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public String toString() {
        return "Misalignment [deltaX=" + deltaX + ", deltaY=" + deltaY + ", deltaS=" + deltaS + ", monitorReadErrorX="
                + monitorReadErrorX + ", monitorReadErrorY=" + monitorReadErrorY + ", name=" + name + "]";
    }

}