public int ShotSequence(int startTime, int numberOfOnOffShots, int padShots, int flashlampPulseInterval,
                                int valvePulseLength, int valveToQ, int flashToQ, int delayToDetectorTrigger,
                                int delayToDeceleration, TimingSequence decelSequence, string modulationMode, int decelOnStart, int decelOnDuration, bool modulation)
        {
            int time = startTime;

            for (int i = 0; i < numberOfOnOffShots; i++)
            {
                if (modulationMode == "BurstAndOff" || modulationMode == "BurstAndOn")
                {
                    // first with decelerator on
                    Shot(time, valvePulseLength, valveToQ, flashToQ, delayToDetectorTrigger, delayToDeceleration, "detector",
                         decelSequence, modulationMode, decelOnStart, decelOnDuration);
                    time += flashlampPulseInterval;
                    // then with the decelerator off if modulation is true (otherwise another on shot)
                    if (modulation)
                    {
                        Shot(time, valvePulseLength, valveToQ, flashToQ, delayToDetectorTrigger, delayToDeceleration, "detectorprime",
                             null, modulationMode, decelOnStart, decelOnDuration);
                    }
                    else
                    {
                        Shot(time, valvePulseLength, valveToQ, flashToQ, delayToDetectorTrigger, delayToDeceleration, "detector",
                             decelSequence, modulationMode, decelOnStart, decelOnDuration);
                    }
                    time += flashlampPulseInterval;
                }
                if (modulationMode == "OffAndBurst" || modulationMode == "OnAndBurst")
                {
                    // first with decelerator off
                    Shot(time, valvePulseLength, valveToQ, flashToQ, delayToDetectorTrigger, delayToDeceleration, "detector",
                         null, modulationMode, decelOnStart, decelOnDuration);
                    time += flashlampPulseInterval;
                    // then with the decelerator on if modulation is true (otherwise another off shot)
                    if (modulation)
                    {
                        Shot(time, valvePulseLength, valveToQ, flashToQ, delayToDetectorTrigger, delayToDeceleration, "detectorprime",
                             decelSequence, modulationMode, decelOnStart, decelOnDuration);
                    }
                    else
                    {
                        Shot(time, valvePulseLength, valveToQ, flashToQ, delayToDetectorTrigger, delayToDeceleration, "detector",
                             null, modulationMode, decelOnStart, decelOnDuration);
                    }
                    time += flashlampPulseInterval;
                }
                for (int p = 0; p < padShots; p++)
                {
                    FlashlampPulse(time, valveToQ, flashToQ);
                    time += flashlampPulseInterval;
                }
            }

            return(time);
        }
        public int Shot(int startTime, int valvePulseLength, int valveToQ, int flashToQ,
                        int delayToDetectorTrigger, int delayToDeceleration, string detectorTriggerSource, TimingSequence decelSequence,
                        string modulationMode, int decelOnStart, int decelOnDuration)
        {
            int time     = 0;
            int tempTime = 0;

            // valve pulse
            tempTime = Pulse(startTime, 0, valvePulseLength,
                             ((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["valve"]).BitNumber);
            if (tempTime > time)
            {
                time = tempTime;
            }
            // Flash pulse
            tempTime = Pulse(startTime, valveToQ - flashToQ, FLASH_PULSE_LENGTH,
                             ((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["flash"]).BitNumber);
            if (tempTime > time)
            {
                time = tempTime;
            }
            // Q pulse
            tempTime = Pulse(startTime, valveToQ, Q_PULSE_LENGTH,
                             ((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["q"]).BitNumber);
            if (tempTime > time)
            {
                time = tempTime;
            }
            // Detector trigger
            tempTime = Pulse(startTime, delayToDetectorTrigger + valveToQ, DETECTOR_TRIGGER_LENGTH,
                             ((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels[detectorTriggerSource]).BitNumber);
            if (tempTime > time)
            {
                time = tempTime;
            }

            // Deceleration sequence
            if (decelSequence != null)
            {
                foreach (TimingSequence.Edge edge in decelSequence.Sequence)
                {
                    tempTime = startTime + valveToQ + delayToDeceleration + edge.Time;
                    AddEdge(
                        ((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels[edge.Channel]).BitNumber,
                        tempTime,
                        edge.Sense
                        );
                }
            }
            else
            {
                if (modulationMode == "BurstAndOn" || modulationMode == "OnAndBurst") // long on pulse every other shot; otherwise, the decelerator stays off on every other shot
                {
                    tempTime = startTime + valveToQ + decelOnStart;
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelhplus"]).BitNumber, tempTime, true);
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelhminus"]).BitNumber, tempTime, true);
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelvplus"]).BitNumber, tempTime, true);
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelvminus"]).BitNumber, tempTime, true);
                    tempTime = startTime + valveToQ + decelOnStart + decelOnDuration;
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelhplus"]).BitNumber, tempTime, false);
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelhminus"]).BitNumber, tempTime, false);
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelvplus"]).BitNumber, tempTime, false);
                    AddEdge(((DigitalOutputChannel)Environs.Hardware.DigitalOutputChannels["decelvminus"]).BitNumber, tempTime, false);
                }
            }
            return(time);
        }
Example #3
0
        private void buildDecelerationSequence()
        {
            //get the settings we need
            double voltage        = (double)settings["voltage"];
            int    initspeed      = (int)settings["initspeed"];
            double onposition     = (double)settings["onposition"] / 1000;
            double offposition    = (double)settings["offposition"] / 1000;
            int    numberOfStages = (int)settings["numberOfStages"];
            int    resonanceOrder = (int)settings["resonanceOrder"];
            int    jState         = (int)settings["jState"];
            int    mState         = (int)settings["mState"];

            // make the FieldMap
            FieldMap map = new FieldMap((string)Environs.FileSystem.Paths["decelerationUtilitiesPath"] +
                                        (string)Environs.Hardware.GetInfo("deceleratorFieldMap"),
                                        (int)Environs.Hardware.GetInfo("mapPoints"),
                                        (double)Environs.Hardware.GetInfo("mapStartPoint"),
                                        (double)Environs.Hardware.GetInfo("mapResolution"));
            //make the molecule
            Molecule mol = new Molecule((string)Environs.Hardware.GetInfo("moleculeName"),
                                        (double)Environs.Hardware.GetInfo("moleculeMass"),
                                        (double)Environs.Hardware.GetInfo("moleculeRotationalConstant"),
                                        (double)Environs.Hardware.GetInfo("moleculeDipoleMoment"));
            //make the decelerator and the experiment
            Decelerator            decel      = new Decelerator();
            DecelerationExperiment experiment = new DecelerationExperiment();

            //assign a map and a lens spacing to the decelerator
            decel.Map         = map;
            decel.LensSpacing = (double)Environs.Hardware.GetInfo("deceleratorLensSpacing");
            //assign decelerator, molecule, quantum state and switch structure to the experiment
            experiment.Decelerator  = decel;
            experiment.Molecule     = mol;
            experiment.QuantumState = new int[] { jState, mState };
            experiment.Structure    = (DecelerationExperiment.SwitchStructure)Environs.Hardware.GetInfo("deceleratorStructure");
            //get the timing sequence
            double[] timesdouble = experiment.GetTimingSequence(voltage, onposition, offposition, initspeed, numberOfStages, resonanceOrder);

            // The list of times is in seconds and is measured from the moment when the synchronous molecule
            // reaches the decelerator. Add on the amount of time it takes to reach this point.
            // Then convert to the units of the clockFrequency and round to the nearest unit.
            double nominalTimeToDecelerator = (double)Environs.Hardware.GetInfo("sourceToSoftwareDecelerator") / initspeed;

            int[] times = new int[timesdouble.Length];
            for (int i = 0; i < timesdouble.Length; i++)
            {
                times[i] = (int)Math.Round((int)settings["clockFrequency"] * (nominalTimeToDecelerator + timesdouble[i]));
            }

            int[] structure = new int[times.Length];

            // the last switch must send all electrodes to ground
            structure[structure.Length - 1] = 0;
            // build the rest of the structure
            int k = 0;

            switch (experiment.Structure)
            {
            case DecelerationExperiment.SwitchStructure.H_Off_V_Off:
                while (k < structure.Length - 1)
                {
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 2; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 0; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 1; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 0; k++;
                    }
                }
                break;

            case DecelerationExperiment.SwitchStructure.V_Off_H_Off:
                while (k < structure.Length - 1)
                {
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 1; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 0; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 2; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 0; k++;
                    }
                }
                break;

            case DecelerationExperiment.SwitchStructure.H_V:
                while (k < structure.Length - 1)
                {
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 2; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 1; k++;
                    }
                }
                break;

            case DecelerationExperiment.SwitchStructure.V_H:
                while (k < structure.Length - 1)
                {
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 1; k++;
                    }
                    if (k < structure.Length - 1)
                    {
                        structure[k] = 2; k++;
                    }
                }
                break;
            }
            // keep track of the state of the horizontal and vertical electrodes
            bool[] states = { false, false }; //{horizontal, vertical}
            decelSequence = new TimingSequence();
            // The timing sequence is built within this for loop. The structure of the decelerator is encoded
            // as follows: 0 means everything off, 1 means V on, H off, 2 means H on V off and 3 means both on.
            for (int i = 0; i < times.Length && i < structure.Length; i++)
            {
                if (structure[i] == 0) //horizontal = false, vertical = false
                {
                    if (states[0] != false)
                    {
                        decelSequence.Add("decelhplus", times[i], false);
                        decelSequence.Add("decelhminus", times[i], false);
                        states[0] = false;
                    }
                    if (states[1] != false)
                    {
                        decelSequence.Add("decelvplus", times[i], false);
                        decelSequence.Add("decelvminus", times[i], false);
                        states[1] = false;
                    }
                }

                if (structure[i] == 1) //horizontal = false, vertical = true
                {
                    if (states[0] != false)
                    {
                        decelSequence.Add("decelhplus", times[i], false);
                        decelSequence.Add("decelhminus", times[i], false);
                        states[0] = false;
                    }
                    if (states[1] != true)
                    {
                        decelSequence.Add("decelvplus", times[i], true);
                        decelSequence.Add("decelvminus", times[i], true);
                        states[1] = true;
                    }
                }

                if (structure[i] == 2) //horizontal = true, vertical = false
                {
                    if (states[0] != true)
                    {
                        decelSequence.Add("decelhplus", times[i], true);
                        decelSequence.Add("decelhminus", times[i], true);
                        states[0] = true;
                    }
                    if (states[1] != false)
                    {
                        decelSequence.Add("decelvplus", times[i], false);
                        decelSequence.Add("decelvminus", times[i], false);
                        states[1] = false;
                    }
                }

                if (structure[i] == 3) //horizontal = true, vertical = true
                {
                    if (states[0] != true)
                    {
                        decelSequence.Add("decelhplus", times[i], true);
                        decelSequence.Add("decelhminus", times[i], true);
                        states[0] = true;
                    }
                    if (states[1] != true)
                    {
                        decelSequence.Add("decelvplus", times[i], true);
                        decelSequence.Add("decelvminus", times[i], true);
                        states[1] = true;
                    }
                }
            }
            Console.WriteLine(decelSequence.ToString());
        }