Beispiel #1
0
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p           = new PatternBuilder32();
        int patternStartBeforeQ      = (int)Parameters["TCLBlockStart"];
        int molassesStartTime        = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int molassesRampTime         = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"];
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int secondMicrowavePulseTime = blowAwayTime + (int)Parameters["PokeDuration"];
        int offsetFieldTurnOnTime    = secondMicrowavePulseTime + (int)Parameters["SecondMicrowavePulseDuration"];
        int firstRamseyPulseTime     = offsetFieldTurnOnTime + (int)Parameters["OffsetFieldWait"];
        int secondRamseyPulseTime    = firstRamseyPulseTime + (int)Parameters["RamseyWaitTime"] + (int)Parameters["RamseyPulseDuration"];
        int offsetFieldTurnOffTime   = secondRamseyPulseTime + (int)Parameters["RamseyPulseDuration"];
        int magTrapStartTime         = offsetFieldTurnOffTime + (int)Parameters["OffsetFieldWait"];
        int motRecaptureTime         = magTrapStartTime + (int)Parameters["MagTrapDuration"];
        int imageTime = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);  // This is how you load "preset" patterns.

        p.Pulse(patternStartBeforeQ, microwavePulseTime, (int)Parameters["MicrowavePulseDuration"], "microwaveA");
        p.Pulse(patternStartBeforeQ, secondMicrowavePulseTime, (int)Parameters["SecondMicrowavePulseDuration"], "microwaveB");
        p.Pulse(patternStartBeforeQ, firstRamseyPulseTime, (int)Parameters["RamseyPulseDuration"], "microwaveC");
        p.Pulse(patternStartBeforeQ, secondRamseyPulseTime, (int)Parameters["RamseyPulseDuration"], "microwaveC");


        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTSwitchOffTime"], (int)Parameters["MolassesDelay"], "v00MOTAOM");                                     // pulse off the MOT light whilst MOT fields are turning off
        p.Pulse(patternStartBeforeQ, microwavePulseTime, motRecaptureTime - microwavePulseTime, "v00MOTAOM");                                                 // turn off the MOT light for microwave pulse

        p.Pulse(patternStartBeforeQ, blowAwayTime, (int)Parameters["PokeDuration"], "bXSlowingAOM");                                                          // Blow away
        p.AddEdge("bXSlowingAOM", patternStartBeforeQ + (int)Parameters["slowingAOMOffStart"] + (int)Parameters["slowingAOMOffDuration"], true);              // send slowing aom high and hold it high
        p.AddEdge("v10SlowingAOM", patternStartBeforeQ + (int)Parameters["slowingRepumpAOMOffStart"] + (int)Parameters["slowingRepumpAOMOffDuration"], true); // send slowing repump aom high and hold it high

        p.Pulse(patternStartBeforeQ, secondMicrowavePulseTime - 1400, (int)Parameters["MagTrapDuration"] + 3000, "bXSlowingShutter");                         //Takes 14ms to start closing
        p.Pulse(patternStartBeforeQ, microwavePulseTime - 1600, motRecaptureTime - microwavePulseTime + 1600 - 1080, "v00MOTShutter");

        p.Pulse(patternStartBeforeQ, molassesRampTime, offsetFieldTurnOffTime + (int)Parameters["OffsetFieldWait"] / 2 - molassesRampTime, "bottomCoilDirection");

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTPictureTriggerTime"], (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); // camera trigger for picture of initial MOT
        p.Pulse(patternStartBeforeQ, imageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");                                // camera trigger

        return(p);
    }
Beispiel #2
0
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        // Add Analog Channels

        p.AddChannel("v0IntensityRamp");
        p.AddChannel("v0FrequencyRamp");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("zShimCoilCurrent");


        // B Field
        // For the delta electronica box (bottom MOT coil)
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTCoilsSwitchOn"], (double)Parameters["MOTCoilsCurrentRampStartValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTCoilsSwitchOff"], 0);

        // For BOP
        p.AddAnalogValue("MOTBOPCoilsCurrent", (int)Parameters["MOTCoilsSwitchOn"], (double)Parameters["MOTBOPCoilsCurrentStartValue"]);
        p.AddAnalogValue("MOTBOPCoilsCurrent", (int)Parameters["MOTCoilsSwitchOff"], (double)Parameters["MOTBOPCoilsCurrentMolassesValue"]);


        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);

        // v0 Intensity Ramp
        p.AddAnalogValue("v0IntensityRamp", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v0IntensityRamp", (int)Parameters["v0IntensityRampStartTime"], (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityRampEndValue"]);

        p.AddAnalogValue("v0IntensityRamp", (int)Parameters["PokeStartTime"] + (int)Parameters["PokeDuration"] + (int)Parameters["FreeFlightTime"], (double)Parameters["v0IntensityRampStartValue"]);


        // v0 Frequency Ramp
        p.AddAnalogValue("v0FrequencyRamp", 0, (double)Parameters["v0FrequencyRampStartValue"]);



        p.SwitchAllOffAtEndOfPattern();
        return(p);
    }
Beispiel #3
0
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p           = new PatternBuilder32();
        int patternStartBeforeQ      = (int)Parameters["TCLBlockStart"];
        int molassesStartTime        = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int molassesRampTime         = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"];
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int secondMicrowavePulseTime = blowAwayTime + (int)Parameters["PokeDuration"];
        int magTrapStartTime         = secondMicrowavePulseTime + (int)Parameters["SecondMicrowavePulseDuration"];
        int motRecaptureTime         = magTrapStartTime + (int)Parameters["MagTrapDuration"];
        int imageTime = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);  // This is how you load "preset" patterns.

        for (int t = 50000; t < (int)Parameters["PatternLength"]; t += 50000)
        {
            p.Pulse(patternStartBeforeQ + t, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
            p.Pulse(patternStartBeforeQ + t, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch");                              //trigger the Q switch
        }

        p.Pulse(patternStartBeforeQ, microwavePulseTime, (int)Parameters["MicrowavePulseDuration"], "microwaveA");
        //  p.Pulse(patternStartBeforeQ, microwavePulseTime, (int)Parameters["MicrowavePulseDuration"], "microwaveB");
        p.Pulse(patternStartBeforeQ, secondMicrowavePulseTime, (int)Parameters["SecondMicrowavePulseDuration"], "microwaveB");                                // now linked to A channel

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTSwitchOffTime"], (int)Parameters["MolassesDelay"], "v00MOTAOM");                                     // pulse off the MOT light whilst MOT fields are turning off
        p.Pulse(patternStartBeforeQ, microwavePulseTime, motRecaptureTime - microwavePulseTime, "v00MOTAOM");                                                 // turn off the MOT light for microwave pulse

        p.Pulse(patternStartBeforeQ, blowAwayTime, (int)Parameters["PokeDuration"], "bXSlowingAOM");                                                          // Blow away
        p.AddEdge("bXSlowingAOM", patternStartBeforeQ + (int)Parameters["slowingAOMOffStart"] + (int)Parameters["slowingAOMOffDuration"], true);              // send slowing aom high and hold it high
        p.AddEdge("v10SlowingAOM", patternStartBeforeQ + (int)Parameters["slowingRepumpAOMOffStart"] + (int)Parameters["slowingRepumpAOMOffDuration"], true); // send slowing repump aom high and hold it high

        p.Pulse(patternStartBeforeQ, secondMicrowavePulseTime - 1400, (int)Parameters["MagTrapDuration"] + 3000, "bXSlowingShutter");                         //Takes 14ms to start closing
        p.Pulse(patternStartBeforeQ, microwavePulseTime - 1500, motRecaptureTime - microwavePulseTime + 1500 - 1100, "v00MOTShutter");

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTPictureTriggerTime"], (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); // camera trigger for picture of initial MOT
        p.Pulse(patternStartBeforeQ, imageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");                                // camera trigger

        return(p);
    }
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p           = new PatternBuilder32();
        int patternStartBeforeQ      = (int)Parameters["TCLBlockStart"];
        int molassesStartTime        = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int molassesRampTime         = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"] + 80;
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int secondMicrowavePulseTime = blowAwayTime + (int)Parameters["PokeDuration"];
        int magTrapStartTime         = secondMicrowavePulseTime + (int)Parameters["SecondMicrowavePulseDuration"];
        int thirdMicrowavePulseTime  = magTrapStartTime + (int)Parameters["MagTrapDuration"] - (int)Parameters["ThirdMicrowavePulseDuration"];
        int motRecaptureTime         = magTrapStartTime + (int)Parameters["MagTrapDuration"] + (int)Parameters["WaitBeforeRecapture"];
        int imageTime = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);  // This is how you load "preset" patterns.

        p.Pulse(patternStartBeforeQ, microwavePulseTime, (int)Parameters["MicrowavePulseDuration"], "microwaveB");
        p.Pulse(patternStartBeforeQ, secondMicrowavePulseTime, (int)Parameters["SecondMicrowavePulseDuration"], "microwaveA");
        //p.Pulse(patternStartBeforeQ, thirdMicrowavePulseTime, (int)Parameters["ThirdMicrowavePulseDuration"], "microwaveA");

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTSwitchOffTime"], (int)Parameters["MolassesDelay"], "v00MOTAOM");                                     // pulse off the MOT light whilst MOT fields are turning off
        p.Pulse(patternStartBeforeQ, microwavePulseTime, motRecaptureTime - microwavePulseTime, "v00MOTAOM");                                                 // turn off the MOT light for microwave pulse

        p.Pulse(patternStartBeforeQ, blowAwayTime, (int)Parameters["PokeDuration"], "bXSlowingAOM");                                                          // Blow away

        p.AddEdge("bXSlowingAOM", patternStartBeforeQ + (int)Parameters["slowingAOMOffStart"] + (int)Parameters["slowingAOMOffDuration"], true);              // send slowing aom high and hold it high
        p.AddEdge("v10SlowingAOM", patternStartBeforeQ + (int)Parameters["slowingRepumpAOMOffStart"] + (int)Parameters["slowingRepumpAOMOffDuration"], true); // send slowing repump aom high and hold it high


        p.AddEdge("bXSlowingShutter", patternStartBeforeQ + secondMicrowavePulseTime - 1500, true);
        p.AddEdge("bXSlowingShutter", patternStartBeforeQ + motRecaptureTime + 5000, false);
        p.AddEdge("v00MOTShutter", patternStartBeforeQ + magTrapStartTime - 2060, true);
        p.AddEdge("v00MOTShutter", patternStartBeforeQ + motRecaptureTime - 950, false);


        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTPictureTriggerTime"], (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); // camera trigger for picture of initial MOT
        p.Pulse(patternStartBeforeQ, imageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");                                // camera trigger

        return(p);
    }
Beispiel #5
0
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p           = new PatternBuilder32();
        int patternStartBeforeQ      = (int)Parameters["TCLBlockStart"];
        int molassesStartTime        = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int molassesRampTime         = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"];
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int secondMicrowavePulseTime = blowAwayTime + (int)Parameters["PokeDuration"];
        int releaseTime            = secondMicrowavePulseTime + (int)Parameters["SecondMicrowavePulseDuration"];
        int levitationGradientTime = releaseTime + (int)Parameters["LevitateWait"];
        int imageTime = releaseTime + (int)Parameters["ExpansionTime"];

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);  // This is how you load "preset" patterns.

        p.Pulse(patternStartBeforeQ, microwavePulseTime, (int)Parameters["MicrowavePulseDuration"], "microwaveB");
        p.Pulse(patternStartBeforeQ, secondMicrowavePulseTime, (int)Parameters["SecondMicrowavePulseDuration"], "microwaveA");                                // now linked to A channel

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTSwitchOffTime"], (int)Parameters["MolassesDelay"], "v00MOTAOM");                                     // pulse off the MOT light whilst MOT fields are turning off
        p.Pulse(patternStartBeforeQ, microwavePulseTime, imageTime - microwavePulseTime, "v00MOTAOM");                                                        // turn off the MOT light for microwave pulse

        p.Pulse(patternStartBeforeQ, blowAwayTime, (int)Parameters["PokeDuration"], "bXSlowingAOM");                                                          // Blow away
        p.AddEdge("bXSlowingAOM", patternStartBeforeQ + (int)Parameters["slowingAOMOffStart"] + (int)Parameters["slowingAOMOffDuration"], true);              // send slowing aom high and hold it high
        p.AddEdge("v10SlowingAOM", patternStartBeforeQ + (int)Parameters["slowingRepumpAOMOffStart"] + (int)Parameters["slowingRepumpAOMOffDuration"], true); // send slowing repump aom high and hold it high

        p.Pulse(patternStartBeforeQ, secondMicrowavePulseTime - 1400, imageTime - secondMicrowavePulseTime + 1400 + 3000, "bXSlowingShutter");                //Takes 14ms to start closing
        //p.Pulse(patternStartBeforeQ, microwavePulseTime - 1500, motRecaptureTime - microwavePulseTime + 1500 - 1100, "v00MOTShutter");

        p.Pulse(patternStartBeforeQ, microwavePulseTime, imageTime - microwavePulseTime + 3000, "topCoilDirection");
        p.Pulse(patternStartBeforeQ, microwavePulseTime, imageTime - microwavePulseTime + 3000, "bottomCoilDirection");

        //p.Pulse(patternStartBeforeQ, (int)Parameters["MOTPictureTriggerTime"], (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); // camera trigger for picture of initial MOT
        p.Pulse(patternStartBeforeQ, imageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); // camera trigger

        return(p);
    }
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p              = new PatternBuilder32();
        int patternStartBeforeQ         = (int)Parameters["TCLBlockStart"];
        int molassesStartTime           = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int molassesRampTime            = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int v00ChirpTime                = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int singleFrequencyMolassesTime = v00ChirpTime + (int)Parameters["v00ChirpDuration"] + (int)Parameters["v00ChirpWait"];
        int v00ChirpBackTime            = singleFrequencyMolassesTime + (int)Parameters["SingleFreqMolassesDuration"];
        int v0F0PumpStartTime           = v00ChirpBackTime + (int)Parameters["v00ChirpDuration"] + (int)Parameters["v00ChirpWait"] + (int)Parameters["WaitBeforeOpticalPumping"];
        int microwavePulseTime          = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"];
        int motRecaptureTime            = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int imageTime = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);  // This is how you load "preset" patterns.

        p.Pulse(patternStartBeforeQ, microwavePulseTime, (int)Parameters["MicrowavePulseDuration"], "microwaveA");

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTSwitchOffTime"], (int)Parameters["MolassesDelay"], "v00MOTAOM"); // pulse off the MOT light whilst MOT fields are turning off
        p.Pulse(patternStartBeforeQ, v00ChirpTime, (int)Parameters["v00ChirpDuration"] + (int)Parameters["v00ChirpWait"], "v00MOTAOM");
        p.Pulse(patternStartBeforeQ, v00ChirpBackTime, v0F0PumpStartTime - v00ChirpBackTime, "v00MOTAOM");
        p.Pulse(patternStartBeforeQ, microwavePulseTime, motRecaptureTime - microwavePulseTime, "v00MOTAOM"); // turn off the MOT light for microwave pulse

        p.Pulse(patternStartBeforeQ, v00ChirpTime, (int)Parameters["v00ChirpDuration"] + (int)Parameters["v00ChirpWait"] + (int)Parameters["SingleFreqMolassesDuration"], "v00Sidebands");
        p.Pulse(patternStartBeforeQ, v00ChirpTime, 2 * (int)Parameters["v00ChirpDuration"] + (int)Parameters["v00ChirpWait"] + (int)Parameters["SingleFreqMolassesDuration"] + 200, "v00LockBlock");

        p.AddEdge("bXSlowingAOM", patternStartBeforeQ + (int)Parameters["slowingAOMOffStart"] + (int)Parameters["slowingAOMOffDuration"], true);              // send slowing aom high and hold it high
        p.AddEdge("v10SlowingAOM", patternStartBeforeQ + (int)Parameters["slowingRepumpAOMOffStart"] + (int)Parameters["slowingRepumpAOMOffDuration"], true); // send slowing repump aom high and hold it high

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTSwitchOffTime"] - 1400, (int)Parameters["MagTrapDuration"] + 3000, "bXSlowingShutter");              //Takes 14ms to start closing
        //p.Pulse(patternStartBeforeQ, microwavePulseTime - 1675, motRecaptureTime - microwavePulseTime + 1675 - 1000, "v00MOTShutter");

        p.Pulse(patternStartBeforeQ, (int)Parameters["MOTPictureTriggerTime"], (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); // camera trigger for picture of initial MOT
        p.Pulse(patternStartBeforeQ, imageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");                                // camera trigger

        return(p);
    }
Beispiel #7
0
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        int patternStartBeforeQ      = (int)Parameters["TCLBlockStart"];
        int molassesStartTime        = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int molassesRampTime         = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"];
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int secondMicrowavePulseTime = blowAwayTime + (int)Parameters["PokeDuration"];
        int firstRamseyPulseTime     = secondMicrowavePulseTime + (int)Parameters["SecondMicrowavePulseDuration"];
        int ramseyPiPulseTime        = firstRamseyPulseTime + (int)Parameters["FirstRamseyWaitTime"] + (int)Parameters["RamseyPulseDuration"];
        int secondRamseyPulseTime    = ramseyPiPulseTime + (int)Parameters["SecondRamseyWaitTime"] + (int)Parameters["RamseyPiPulseDuration"];
        int magTrapStartTime         = secondRamseyPulseTime + (int)Parameters["RamseyPulseDuration"];
        int motRecaptureTime         = magTrapStartTime + (int)Parameters["MagTrapDuration"];
        int imageTime = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        // Add Analog Channels
        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("zShimCoilCurrent");

        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", 0, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTCoilsSwitchOn"], (double)Parameters["MOTCoilsCurrentRampStartValue"]);
        p.AddLinearRamp("MOTCoilsCurrent", (int)Parameters["MOTCoilsCurrentRampStartTime"], (int)Parameters["MOTCoilsCurrentRampDuration"], (double)Parameters["MOTCoilsCurrentRampEndValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTSwitchOffTime"], (double)Parameters["MOTCoilsCurrentMolassesValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", magTrapStartTime, (double)Parameters["MOTCoilsCurrentMagTrapValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", motRecaptureTime, (double)Parameters["MOTCoilsCurrentRampStartValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["CoilsSwitchOffTime"], -0.01);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        p.AddAnalogValue("yShimCoilCurrent", 0, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);

        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", (int)Parameters["v0IntensityRampStartTime"], (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityRampEndValue"]);
        p.AddAnalogValue("v00Intensity", molassesStartTime, (double)Parameters["v0IntensityMolassesValue"]);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 50, 7.4);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 100, 7.83);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 150, 8.09);
        p.AddAnalogValue("v00Intensity", v0F0PumpStartTime, (double)Parameters["v0IntensityF0PumpValue"]);
        p.AddAnalogValue("v00Intensity", motRecaptureTime, (double)Parameters["v0IntensityImageValue"]);

        // v0 EOM
        p.AddAnalogValue("v00EOMAmp", 0, (double)Parameters["v0EOMMOTValue"]);
        p.AddAnalogValue("v00EOMAmp", v0F0PumpStartTime, (double)Parameters["v0EOMPumpValue"]);
        p.AddAnalogValue("v00EOMAmp", motRecaptureTime, (double)Parameters["v0EOMMOTValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]);
        p.AddAnalogValue(
            "v00Frequency",
            molassesStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMolassesValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            v0F0PumpStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyF0PumpValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            motRecaptureTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        return(p);
    }
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p = new PatternBuilder32();

        int patternStartBeforeQ         = (int)Parameters["TCLBlockStart"];
        int rbMOTLoadingStartTime       = patternStartBeforeQ;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + (int)Parameters["loadingTime"];
        int firstImageTime = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"];
        int lastImageTime  = firstImageTime + (int)Parameters["TimeBetweenTriggers"] * (int)Parameters["NoOfTriggers"];


        for (int t = 0; t < (int)Parameters["RbMOTLoadTime"]; t += 50000)
        {
            p.Pulse(patternStartBeforeQ + t, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
            p.Pulse(patternStartBeforeQ + t, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch");                              //trigger the Q switch
        }


        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        for (int t = firstImageTime; t < lastImageTime; t += (int)Parameters["TimeBetweenTriggers"])
        {
            p.Pulse(0, t, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        }



        //Rb:

        p.AddEdge("rb3DCooling", 0, true);                          //3D MOT never loads

        p.AddEdge("rb2DCooling", 0, true);                          // 2D MOT off while CaF MOT loads
        p.AddEdge("rb2DCooling", moleculeMOTLoadingEndTime, false); // 2D MOT ON when CaF MOT loaded
        p.AddEdge("rb2DCooling", lastImageTime, true);              // 2D MOT stays on for lifetime measurement

        p.AddEdge("rbPushBeam", 0, true);
        p.AddEdge("rbPushBeam", moleculeMOTLoadingEndTime, false);
        p.AddEdge("rbPushBeam", lastImageTime, true);


        //Turn everything back on at end of sequence:

        //p.Pulse(0, firstImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); //camera trigger for first frame


        p.AddEdge("rbAbsImagingBeam", 0, true); //Absorption imaging probe

        p.AddEdge("rbAbsImagingBeam", lastImageTime + 1100, false);
        p.AddEdge("rbAbsImagingBeam", lastImageTime + 1100 + 15, true);
        p.AddEdge("rbAbsImagingBeam", lastImageTime + 12200, false);
        p.AddEdge("rbAbsImagingBeam", lastImageTime + 12200 + 15, true);


        p.Pulse(0, lastImageTime + 1100, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig");  //trigger camera to take image of cloud
        p.Pulse(0, lastImageTime + 12200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of probe
        p.Pulse(0, lastImageTime + 21200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of background

        //p.AddEdge("rb3DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rb2DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rbPushBeam", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);

        return(p);
    }
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        int rbMOTLoadingStartTime       = 0;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + (int)Parameters["loadingTime"];
        int firstImageTime = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"] + 2500;
        int lastImageTime  = firstImageTime + (int)Parameters["TimeBetweenTriggers"] * (int)Parameters["NoOfTriggers"];


        // Add Analog Channels

        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("zShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("v00Chirp");

        // Add Rb Analog channels
        p.AddChannel("rb3DCoolingFrequency");
        p.AddChannel("rb3DCoolingAttenuation");
        p.AddChannel("rbRepumpFrequency");
        p.AddChannel("rbRepumpAttenuation");
        p.AddChannel("rbAbsImagingFrequency");


        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime + (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", rbMOTLoadingStartTime, (double)Parameters["MOTCoilsCurrentValueRb"]);
        p.AddAnalogValue("MOTCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["MOTCoilsCurrentValueCaF"]);
        p.AddAnalogValue("MOTCoilsCurrent", lastImageTime + 1000, 0.0);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        p.AddAnalogValue("yShimCoilCurrent", 0, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);

        // trigger delay
        // p.AddAnalogValue("triggerDelay", 0, (double)Parameters["triggerDelay"]);

        // F=0
        p.AddAnalogValue("v00EOMAmp", 0, 4.1);

        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", moleculeMOTLoadingEndTime, (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityEndValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, (double)Parameters["v0FrequencyStartValue"]);
        p.AddAnalogValue("v00Frequency", moleculeMOTLoadingEndTime, (double)Parameters["v0FrequencyNewValue"]);

        //v0 chirp
        p.AddAnalogValue("v00Chirp", 0, 0.0);

        //Rb Laser detunings
        p.AddAnalogValue("rb3DCoolingFrequency", 0, (double)Parameters["MOTCoolingLoadingFrequency"]);
        p.AddAnalogValue("rbRepumpFrequency", 0, (double)Parameters["MOTRepumpLoadingFrequency"]);
        p.AddAnalogValue("rbAbsImagingFrequency", 0, (double)Parameters["ImagingFrequency"]);


        /////////Switch Rb cooling detuning to the blue to heat out the atoms from the trap:
        //p.AddAnalogValue("rb3DCoolingFrequency", seventhImageTime + 1000, 7.0);
        ////////

        //Switch Rb repump:
        p.AddAnalogValue("rbRepumpAttenuation", 0, (double)Parameters["RbRepumpSwitch"]);
        //p.AddAnalogValue("rbRepumpAttenuation", 0, 10.0);
        //p.AddAnalogValue("rbRepumpAttenuation", seventhImageTime + 2000, 10.0);

        return(p);
    }
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        int rbMOTLoadingStartTime       = 0;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + 5000;
        int firstImageTime   = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"] + 2500;
        int secondImageTime  = firstImageTime + (int)Parameters["TimeBetweenTriggers"];
        int thridImageTime   = secondImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fourthImageTime  = thridImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fithImageTime    = fourthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int sixthImageTime   = fithImageTime + (int)Parameters["TimeBetweenTriggers"];
        int seventhImageTime = sixthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int eightImageTime   = seventhImageTime + (int)Parameters["TimeBetweenTriggers"];
        int ninethImageTime  = eightImageTime + (int)Parameters["TimeBetweenTriggers"];
        int tenthImageTime   = ninethImageTime + (int)Parameters["TimeBetweenTriggers"];

        // Add Analog Channels

        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("zShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("v00Chirp");

        //v00 AOM switching on and off continuously
        //p.AddChannel("transferCoils");

        // Add Rb Analog channels
        p.AddChannel("rb3DCoolingFrequency");
        p.AddChannel("rb3DCoolingAttenuation");
        p.AddChannel("rbRepumpFrequency");
        p.AddChannel("rbRepumpAttenuation");
        p.AddChannel("rbAbsImagingFrequency");


        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime + (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", rbMOTLoadingStartTime, (double)Parameters["MOTCoilsCurrentValueRb"]);
        p.AddAnalogValue("MOTCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["MOTCoilsCurrentValueCaF"]);
        p.AddAnalogValue("MOTCoilsCurrent", tenthImageTime + 1000, 0.0);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        p.AddAnalogValue("yShimCoilCurrent", 0, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);

        // trigger delay
        // p.AddAnalogValue("triggerDelay", 0, (double)Parameters["triggerDelay"]);

        // F=0
        p.AddAnalogValue("v00EOMAmp", 0, 4.7);

        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", moleculeMOTLoadingEndTime, (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityEndValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, (double)Parameters["v0FrequencyStartValue"]);

        //v0 chirp
        p.AddAnalogValue("v00Chirp", 0, 0.0);

        //Rb Laser detunings
        p.AddAnalogValue("rb3DCoolingFrequency", 0, (double)Parameters["MOTCoolingLoadingFrequency"]);
        p.AddAnalogValue("rbRepumpFrequency", 0, (double)Parameters["MOTRepumpLoadingFrequency"]);
        p.AddAnalogValue("rbAbsImagingFrequency", 0, (double)Parameters["ImagingFrequency"]);


        //Switch Rb repump:
        p.AddAnalogValue("rbRepumpAttenuation", 0, (double)Parameters["RbRepumpSwitch"]);



        //p.AddAnalogValue("transferCoils", 0, 0.8);



        // New stuff to modulate the CaF light

        /*
         * for (int t = moleculeMOTLoadingEndTime; t < tenthImageTime + 1000; t += (int)Parameters["CaFCycleLength"])
         * {
         *  p.AddAnalogValue("transferCoils", t, 0.3);
         *  p.AddAnalogValue("transferCoils", t + (int)Parameters["CaFHalfCycleLength"], 0.7);
         * }
         */

        return(p);
    }
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        int molassesStartTime  = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int v0F0PumpStartTime  = molassesStartTime + (int)Parameters["MolassesDuration"];
        int microwavePulseTime = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"];

        int magTrapStartTime         = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int magTrapStopTime          = magTrapStartTime + (int)Parameters["MagTrapDuration"];
        int microwavePulseTimeSecond = magTrapStopTime + (int)Parameters["MicrowaveDelay"];
        int motRecaptureTime         = microwavePulseTimeSecond + (int)Parameters["MicrowavePulseDuration2"];

        int imageTime = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        // Add Analog Channels
        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("zShimCoilCurrent");
        p.AddChannel("slowingCoilsCurrent");

        //dodgy way of checking frequency after second microwave pulse
        p.AddAnalogValue("yShimCoilCurrent", 0, 0.0);
        p.AddAnalogValue("yShimCoilCurrent", motRecaptureTime, 5.0);

        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", 0, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTCoilsSwitchOn"], (double)Parameters["MOTCoilsCurrentRampStartValue"]);
        p.AddLinearRamp("MOTCoilsCurrent", (int)Parameters["MOTCoilsCurrentRampStartTime"], (int)Parameters["MOTCoilsCurrentRampDuration"], (double)Parameters["MOTCoilsCurrentRampEndValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTSwitchOffTime"], (double)Parameters["MOTCoilsCurrentMolassesValue"]);

        p.AddAnalogValue("MOTCoilsCurrent", magTrapStartTime, (double)Parameters["MagTrapCoilsCurrentValue"]);
        // p.AddLinearRamp("MOTCoilsCurrent", magTrapStartTime, (int)Parameters["MOTCoilsCurrentRampDuration"], (double)Parameters["MagTrapCoilsCurrentValue"]);
        // p.AddLinearRamp("MOTCoilsCurrent", magTrapStopTime, (int)Parameters["MOTCoilsCurrentRampDuration"], 0.0);
        p.AddAnalogValue("MOTCoilsCurrent", magTrapStopTime, (double)Parameters["MOTCoilsCurrentMolassesValue"]);

        p.AddAnalogValue("MOTCoilsCurrent", motRecaptureTime, (double)Parameters["MOTCoilsCurrentRampStartValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["CoilsSwitchOffTime"], 0.0);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        // p.AddAnalogValue("yShimCoilCurrent", 0, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);
        //p.AddLinearRamp("zShimCoilCurrent", v0F0PumpStartTime, 50, (double)Parameters["zShimZeemanSplitValue"]);
        // p.AddAnalogValue("zShimCoilCurrent", motRecaptureTime, (double)Parameters["zShimLoadCurrent"]);
        // p.AddAnalogValue("xShimCoilCurrent", v0F0PumpStartTime, 10.0);
        // p.AddAnalogValue("xShimCoilCurrent", magTrapStartTime, (double)Parameters["xShimLoadCurrent"]);
        //  p.AddAnalogValue("xShimCoilCurrent", magTrapStopTime + 100, 10.0);
        //  p.AddAnalogValue("xShimCoilCurrent", motRecaptureTime, (double)Parameters["xShimLoadCurrent"]);



        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", (int)Parameters["v0IntensityRampStartTime"], (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityRampEndValue"]);
        p.AddAnalogValue("v00Intensity", molassesStartTime, (double)Parameters["v0IntensityMolassesValue"]);
        p.AddAnalogValue("v00Intensity", molassesStartTime + 50, 6.76);
        p.AddAnalogValue("v00Intensity", molassesStartTime + 100, 7.24);
        p.AddAnalogValue("v00Intensity", molassesStartTime + 150, 7.54);
        p.AddAnalogValue("v00Intensity", v0F0PumpStartTime, (double)Parameters["v0IntensityF0PumpValue"]);
        p.AddAnalogValue("v00Intensity", motRecaptureTime, (double)Parameters["v0IntensityImageValue"]);

        // v0 EOM
        p.AddAnalogValue("v00EOMAmp", 0, (double)Parameters["v0EOMMOTValue"]);
        p.AddAnalogValue("v00EOMAmp", v0F0PumpStartTime, (double)Parameters["v0EOMPumpValue"]);
        p.AddAnalogValue("v00EOMAmp", motRecaptureTime, (double)Parameters["v0EOMMOTValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]);
        p.AddAnalogValue(
            "v00Frequency",
            molassesStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMolassesValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            v0F0PumpStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyF0PumpValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            motRecaptureTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        return(p);
    }
Beispiel #12
0
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);


        int atomMOTLoadingStartTime     = 0;
        int atomMOTLoadingEndTime       = atomMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = atomMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + (int)Parameters["CaFMOTLoadingDuration"];
        int cMOTEndTime      = moleculeMOTLoadingEndTime + (int)Parameters["MOTCoilsCurrentRampDuration"] + (int)Parameters["CMOTHoldTime"];
        int motSwitchOffTime = cMOTEndTime + (int)Parameters["v0IntensityRampDuration"] + (int)Parameters["LowIntensityMOTHoldTime"];

        int molassesStartTime = motSwitchOffTime + (int)Parameters["MolassesDelay"];
        int molassesRampTime  = molassesStartTime + (int)Parameters["MolassesHoldTime"];

        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"] + 80;
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int secondMicrowavePulseTime = blowAwayTime + (int)Parameters["PokeDuration"];

        int magTrapStartTime = secondMicrowavePulseTime + (int)Parameters["SecondMicrowavePulseDuration"];
        int motRecaptureTime = magTrapStartTime + (int)Parameters["MagTrapDuration"] + (int)Parameters["WaitBeforeRecapture"];
        int imageTime        = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        // Add Analog Channels
        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("zShimCoilCurrent");

        // Add Rb Analog channels
        p.AddChannel("rb3DCoolingFrequency");
        p.AddChannel("rb3DCoolingAttenuation");
        p.AddChannel("rbRepumpFrequency");
        p.AddChannel("rbRepumpAttenuation");
        p.AddChannel("rbAbsImagingFrequency");
        p.AddChannel("rbOffsetLock");

        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", atomMOTLoadingEndTime, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", atomMOTLoadingEndTime + (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", 0, (double)Parameters["MOTCoilsCurrentRbMOTLoadingValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["CaFMOTLoadGradient"]);
        p.AddLinearRamp("MOTCoilsCurrent", moleculeMOTLoadingEndTime, (int)Parameters["MOTCoilsCurrentRampDuration"], (double)Parameters["MOTCoilsCurrentRampEndValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", motSwitchOffTime, (double)Parameters["MOTCoilsCurrentMolassesValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", magTrapStartTime, (double)Parameters["MOTCoilsCurrentMagTrapValue"]);
        //p.AddAnalogValue("MOTCoilsCurrent", magTrapStartTime + (int)Parameters["MagTrapDuration"], 0.0); // switching off field earlier to measure Rb mag trap life time
        p.AddAnalogValue("MOTCoilsCurrent", motRecaptureTime, (double)Parameters["CaFMOTLoadGradient"]);
        p.AddAnalogValue("MOTCoilsCurrent", imageTime + 3000, 0.0);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", atomMOTLoadingStartTime, (double)Parameters["xShimLoadCurrent"]);
        p.AddAnalogValue("yShimCoilCurrent", atomMOTLoadingStartTime, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", atomMOTLoadingStartTime, (double)Parameters["zShimLoadCurrent"]);

        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", atomMOTLoadingStartTime, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", cMOTEndTime, (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityRampEndValue"]);
        p.AddAnalogValue("v00Intensity", molassesStartTime, (double)Parameters["v0IntensityMolassesValue"]);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 50, 7.4);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 100, 7.83);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 150, 8.09);
        p.AddAnalogValue("v00Intensity", v0F0PumpStartTime, (double)Parameters["v0IntensityF0PumpValue"]);
        p.AddAnalogValue("v00Intensity", motRecaptureTime, (double)Parameters["v0IntensityImageValue"]);

        // v0 EOM
        p.AddAnalogValue("v00EOMAmp", 0, (double)Parameters["v0EOMMOTValue"]);
        p.AddAnalogValue("v00EOMAmp", v0F0PumpStartTime, (double)Parameters["v0EOMPumpValue"]);
        p.AddAnalogValue("v00EOMAmp", secondMicrowavePulseTime, (double)Parameters["v0EOMMOTValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]);
        p.AddAnalogValue(
            "v00Frequency",
            molassesStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMolassesValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            v0F0PumpStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyF0PumpValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            motRecaptureTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );

        //Rb:
        p.AddAnalogValue("rb3DCoolingFrequency", atomMOTLoadingStartTime, (double)Parameters["MOTCoolingLoadingFrequency"]);//Rb MOT loading
        p.AddAnalogValue("rbRepumpFrequency", atomMOTLoadingStartTime, (double)Parameters["MOTRepumpLoadingFrequency"]);
        p.AddAnalogValue("rbAbsImagingFrequency", atomMOTLoadingStartTime, (double)Parameters["ImagingFrequency"]);

        p.AddAnalogValue("rb3DCoolingFrequency", moleculeMOTLoadingEndTime, (double)Parameters["RbCoolingFrequencyCMOT"]);//Rb CMOT
        p.AddAnalogValue("rbRepumpFrequency", moleculeMOTLoadingEndTime, (double)Parameters["RbRepumpFrequencyCMOT"]);

        p.AddLinearRamp("rb3DCoolingFrequency", molassesStartTime, (int)Parameters["RbMolassesDuration"], (double)Parameters["RbMolassesEndDetuning"]);                                              //Rb molasses
        p.AddLinearRamp("rb3DCoolingFrequency", molassesStartTime + (int)Parameters["RbMolassesDuration"], (int)Parameters["RbMolassesDuration"], (double)Parameters["MOTCoolingLoadingFrequency"]); //Jump back frequency to MOT loading value after molasses

        p.AddAnalogValue("rbOffsetLock", 0, 1.1);

        return(p);
    }
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        int patternStartBeforeQ      = (int)Parameters["TCLBlockStart"];
        int molassesStartTime        = (int)Parameters["MOTSwitchOffTime"] + (int)Parameters["MolassesDelay"];
        int molassesRampTime         = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"];
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int magTrapStartTime         = blowAwayTime + (int)Parameters["PokeDuration"] + (int)Parameters["MicrowaveSecondPulseDuration"]; //Empty space same length as second microwave pulse to make as similar as possible to N=1 script
        int microwaveSecondPulseTime = magTrapStartTime + (int)Parameters["MagneticTrapDuration"];
        int motRecaptureTime         = microwaveSecondPulseTime + (int)Parameters["MicrowaveSecondPulseDuration"];
        int imageTime = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        // Add Analog Channels
        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("zShimCoilCurrent");

        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", 0, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTCoilsSwitchOn"], (double)Parameters["MOTCoilsCurrentRampStartValue"]);
        p.AddLinearRamp("MOTCoilsCurrent", (int)Parameters["MOTCoilsCurrentRampStartTime"], (int)Parameters["MOTCoilsCurrentRampDuration"], (double)Parameters["MOTCoilsCurrentRampEndValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["MOTSwitchOffTime"], (double)Parameters["MOTCoilsCurrentMolassesValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", magTrapStartTime, (double)Parameters["MOTCoilsCurrentRampStartValue"]);
        p.AddAnalogValue("MOTCoilsCurrent", (int)Parameters["CoilsSwitchOffTime"], 0.0);



        //dodgy way of checking frequency after second microwave pulse
        //p.AddAnalogValue("yShimCoilCurrent", 0, 0.0);
        // p.AddAnalogValue("yShimCoilCurrent", motRecaptureTime, 5.0);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        //  p.AddAnalogValue("yShimCoilCurrent", 0, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);
        //p.AddLinearRamp("zShimCoilCurrent",v0F0PumpStartTime,50,(double)Parameters["zShimZeemanSplitValue"]);
        //p.AddAnalogValue("xShimCoilCurrent", v0F0PumpStartTime, (double)Parameters["xShimZeemanSplitValue"]);//used to be at v0f0pump time
        //p.AddAnalogValue("zShimCoilCurrent", motRecaptureTime, (double)Parameters["zShimLoadCurrent"]);

        //p.AddAnalogValue("xShimCoilCurrent", v0F0PumpStartTime, 5.0);
        //p.AddAnalogValue("xShimCoilCurrent", motRecaptureTime, (double)Parameters["xShimLoadCurrent"]);

        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", (int)Parameters["v0IntensityRampStartTime"], (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityRampEndValue"]);
        p.AddAnalogValue("v00Intensity", molassesStartTime, (double)Parameters["v0IntensityMolassesValue"]);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 50, 7.4);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 200, 7.83);
        p.AddAnalogValue("v00Intensity", molassesRampTime + 150, 8.09);
        p.AddAnalogValue("v00Intensity", v0F0PumpStartTime, (double)Parameters["v0IntensityF0PumpValue"]);
        p.AddAnalogValue("v00Intensity", motRecaptureTime, (double)Parameters["v0IntensityImageValue"]);

        // v0 EOM
        p.AddAnalogValue("v00EOMAmp", 0, (double)Parameters["v0EOMMOTValue"]);
        p.AddAnalogValue("v00EOMAmp", v0F0PumpStartTime, (double)Parameters["v0EOMPumpValue"]);
        p.AddAnalogValue("v00EOMAmp", motRecaptureTime, (double)Parameters["v0EOMMOTValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]);
        p.AddAnalogValue(
            "v00Frequency",
            molassesStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMolassesValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            v0F0PumpStartTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyF0PumpValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        p.AddAnalogValue(
            "v00Frequency",
            motRecaptureTime,
            ((double)Parameters["lockAomFrequency"] - (double)Parameters["v0FrequencyMOTValue"] / 2 - (double)Parameters["calibOffset"]) / (double)Parameters["calibGradient"]
            );
        return(p);
    }
Beispiel #14
0
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        int rbMOTLoadingStartTime       = 0;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + 5000 + (int)Parameters["v0IntensityRampDuration"] + (int)Parameters["MOTHoldTime"];
        int firstImageTime = moleculeMOTLoadingEndTime + (int)Parameters["FieldDecayTime"] + (int)Parameters["FreeExpansionTime"];

        // Add Analog Channels

        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("zShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("v00Chirp");

        // Add Rb Analog channels
        p.AddChannel("rb3DCoolingFrequency");
        p.AddChannel("rb3DCoolingAttenuation");
        p.AddChannel("rbRepumpFrequency");
        p.AddChannel("rbRepumpAttenuation");
        p.AddChannel("rbAbsImagingFrequency");


        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime + (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", rbMOTLoadingStartTime, (double)Parameters["MOTCoilsCurrentValueRb"]);
        p.AddAnalogValue("MOTCoilsCurrent", moleculeMOTLoadingEndTime, 0.0);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        p.AddAnalogValue("yShimCoilCurrent", 0, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);

        // trigger delay
        // p.AddAnalogValue("triggerDelay", 0, (double)Parameters["triggerDelay"]);

        // F=0
        p.AddAnalogValue("v00EOMAmp", 0, 4.1);

        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", moleculeMOTLoadingStartTime + 5000, (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityEndValue"]);
        p.AddAnalogValue("v00Intensity", moleculeMOTLoadingEndTime + (int)Parameters["FieldDecayTime"], (double)Parameters["v0IntensityRampStartValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, (double)Parameters["v0FrequencyStartValue"]);

        //v0 chirp
        p.AddAnalogValue("v00Chirp", 0, 0.0);


        return(p);
    }
Beispiel #15
0
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p = new PatternBuilder32();

        int patternStartBeforeQ = (int)Parameters["TCLBlockStart"];

        int atomMOTLoadingStartTime     = patternStartBeforeQ;
        int atomMOTLoadingEndTime       = atomMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = atomMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + (int)Parameters["CaFMOTLoadingDuration"];
        int cMOTEndTime      = moleculeMOTLoadingEndTime + (int)Parameters["MOTCoilsCurrentRampDuration"] + (int)Parameters["CMOTHoldTime"];
        int motSwitchOffTime = cMOTEndTime + (int)Parameters["v0IntensityRampDuration"] + (int)Parameters["LowIntensityMOTHoldTime"];

        int molassesStartTime = motSwitchOffTime + (int)Parameters["MolassesDelay"];
        int molassesRampTime  = molassesStartTime + (int)Parameters["MolassesHoldTime"];
        int rbMolassesEndTime = molassesStartTime + (int)Parameters["RbMolassesDuration"];

        int v0F0PumpStartTime        = molassesRampTime + (int)Parameters["MolassesRampDuration"];
        int microwavePulseTime       = v0F0PumpStartTime + (int)Parameters["v0F0PumpDuration"] + 80;
        int blowAwayTime             = microwavePulseTime + (int)Parameters["MicrowavePulseDuration"];
        int secondMicrowavePulseTime = blowAwayTime + (int)Parameters["PokeDuration"];

        int magTrapStartTime = secondMicrowavePulseTime + (int)Parameters["SecondMicrowavePulseDuration"];
        int motRecaptureTime = magTrapStartTime + (int)Parameters["MagTrapDuration"] + (int)Parameters["WaitBeforeRecapture"];
        int imageTime        = motRecaptureTime + (int)Parameters["MOTWaitBeforeImage"];

        int cameraTrigger1 = imageTime + 3100;
        int cameraTrigger2 = cameraTrigger1 + (int)Parameters["CameraTriggerDelayAfterFirstImage"]; //probe image
        int cameraTrigger3 = cameraTrigger2 + (int)Parameters["CameraTriggerDelayAfterFirstImage"]; //bg

        /*
         * int cameraTrigger1 = motRecaptureTime + (int)Parameters["WaitBeforeImage"] + (int)Parameters["FreeExpansionTime"];
         * int cameraTrigger2 = cameraTrigger1 + (int)Parameters["CameraTriggerDelayAfterFirstImage"]; //probe image
         * int cameraTrigger3 = cameraTrigger2 + (int)Parameters["CameraTriggerDelayAfterFirstImage"]; //bg
         */
        int swtichAllOn = cameraTrigger3 + 5000;


        p.Pulse(patternStartBeforeQ, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp");         //trigger the flashlamp
        p.Pulse(patternStartBeforeQ, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch");                                      //trigger the Q switch
        p.Pulse(patternStartBeforeQ + 50000, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
        p.Pulse(patternStartBeforeQ + 50000, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch");                              //trigger the Q switch

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);                                              // This is how you load "preset" patterns.


        /*
         * for (int t = 150000; t < (int)Parameters["PatternLength"]; t += 50000)
         * {
         *  p.Pulse(patternStartBeforeQ + t, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
         *  p.Pulse(patternStartBeforeQ + t, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch"); //trigger the Q switch
         * }
         */


        p.Pulse(0, microwavePulseTime, (int)Parameters["MicrowavePulseDuration"], "microwaveB");
        p.Pulse(0, secondMicrowavePulseTime, (int)Parameters["SecondMicrowavePulseDuration"], "microwaveA");
        //p.Pulse(patternStartBeforeQ, thirdMicrowavePulseTime, (int)Parameters["ThirdMicrowavePulseDuration"], "microwaveA");

        p.Pulse(0, motSwitchOffTime, (int)Parameters["MolassesDelay"], "v00MOTAOM");                                                                            // pulse off the MOT light whilst MOT fields are turning off
        p.Pulse(0, microwavePulseTime, magTrapStartTime - microwavePulseTime + 2000, "v00MOTAOM");                                                              // turn off the MOT light for microwave pulse and leav it off until loading mag trap. Trun back on once light is shuttered mechanically

        p.Pulse(0, blowAwayTime, (int)Parameters["PokeDuration"], "bXSlowingAOM");                                                                              // Blow away

        p.AddEdge("bXSlowingAOM", atomMOTLoadingEndTime + (int)Parameters["slowingAOMOffStart"] + (int)Parameters["slowingAOMOffDuration"], true);              // send slowing aom high and hold it high
        p.AddEdge("v10SlowingAOM", atomMOTLoadingEndTime + (int)Parameters["slowingRepumpAOMOffStart"] + (int)Parameters["slowingRepumpAOMOffDuration"], true); // send slowing repump aom high and hold it high


        p.AddEdge("bXSlowingShutter", secondMicrowavePulseTime - 1500, true);
        p.AddEdge("bXSlowingShutter", motRecaptureTime + 5000, false);
        p.AddEdge("v00MOTShutter", magTrapStartTime - 2060, true);
        p.AddEdge("v00MOTShutter", motRecaptureTime - 950, false);


        p.Pulse(0, moleculeMOTLoadingEndTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); // camera trigger for picture of initial MOT
        p.Pulse(0, imageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");                 // camera trigger

        //Rb:
        p.AddEdge("rb3DCooling", 0, false);
        p.AddEdge("rb3DCooling", rbMolassesEndTime, true);

        ////////////////////////

        //p.AddEdge("rbRepump", 0, true);

        p.AddEdge("rbRepump", 0, false);
        p.AddEdge("rbRepump", rbMolassesEndTime + (int)Parameters["RbOpticalPumpingDuration"], true);

        ////////////////////////

        p.AddEdge("rbOpticalPumpingAOM", 0, true);
        p.AddEdge("rbOpticalPumpingAOM", rbMolassesEndTime, false); // turn on to pump atoms
        p.AddEdge("rbOpticalPumpingAOM", rbMolassesEndTime + (int)Parameters["RbOpticalPumpingDuration"], true);

        p.AddEdge("rb2DCooling", 0, false);
        p.AddEdge("rb2DCooling", atomMOTLoadingEndTime, true);
        p.AddEdge("rbPushBeam", 0, false);
        p.AddEdge("rbPushBeam", atomMOTLoadingEndTime, true);

        p.AddEdge("rbAbsImagingBeam", 0, true); //Absorption imaging probe
        p.AddEdge("rbAbsImagingBeam", cameraTrigger1, false);
        p.AddEdge("rbAbsImagingBeam", cameraTrigger1 + 15, true);
        p.AddEdge("rbAbsImagingBeam", cameraTrigger2, false);
        p.AddEdge("rbAbsImagingBeam", cameraTrigger2 + 15, true);
        //p.AddEdge("rbAbsImagingBeam", cameraTrigger2, false);
        //p.AddEdge("rbAbsImagingBeam", cameraTrigger2 + 15, true);

        //Rb mechanical shutters:
        p.AddEdge("rb2DMOTShutter", 0, true);
        //p.AddEdge("rb2DMOTShutter", atomMOTLoadingEndTime, true); //turn on probe beam to image cloud after holding in mag trap for some time
        p.AddEdge("rb2DMOTShutter", swtichAllOn, false);

        p.AddEdge("rbPushBamAbsorptionShutter", 0, false);
        p.AddEdge("rbPushBamAbsorptionShutter", atomMOTLoadingEndTime - (int)Parameters["rbAbsorptionShutterClosingTime"], true);
        p.AddEdge("rbPushBamAbsorptionShutter", imageTime + 3100 - (int)Parameters["rbAbsorptionShutterOpeningTime"], false);

        p.AddEdge("rb3DMOTShutter", 0, false);
        p.AddEdge("rb3DMOTShutter", rbMolassesEndTime - (int)Parameters["coolingShutterClosingTime"], true);
        //p.AddEdge("rb3DMOTShutter", swtichAllOn, false);

        p.AddEdge("rbOPShutter", 0, false); //this shutter now shutters only the optical pumping light
        p.AddEdge("rbOPShutter", rbMolassesEndTime + (int)Parameters["RbOpticalPumpingDuration"] - (int)Parameters["repumpShutterClosingTime"], true);
        //p.AddEdge("rbOPShutter", swtichAllOn, false);

        //Rb camera:
        p.Pulse(0, cameraTrigger1, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //1st camera frame
        //p.Pulse(0, cameraTrigger2, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //2nd camera frame
        //p.Pulse(0, cameraTrigger3, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //3rd camera frame

        return(p);
    }
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p = new PatternBuilder32();

        int patternStartBeforeQ         = (int)Parameters["TCLBlockStart"];
        int rbMOTLoadingStartTime       = patternStartBeforeQ;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + 5000;
        int firstImageTime   = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"] + 2500;
        int secondImageTime  = firstImageTime + (int)Parameters["TimeBetweenTriggers"];
        int thridImageTime   = secondImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fourthImageTime  = thridImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fithImageTime    = fourthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int sixthImageTime   = fithImageTime + (int)Parameters["TimeBetweenTriggers"];
        int seventhImageTime = sixthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int eightImageTime   = seventhImageTime + (int)Parameters["TimeBetweenTriggers"];
        int ninethImageTime  = eightImageTime + (int)Parameters["TimeBetweenTriggers"];
        int tenthImageTime   = ninethImageTime + (int)Parameters["TimeBetweenTriggers"];


        /*
         * for (int t = 0; t < (int)Parameters["RbMOTLoadTime"]; t += 50000)
         * {
         *  p.Pulse(patternStartBeforeQ + t, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
         *  p.Pulse(patternStartBeforeQ + t, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch"); //trigger the Q switch
         * }
         */

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);


        p.Pulse(0, firstImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); //camera trigger for first frame
        p.Pulse(0, secondImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, thridImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, fourthImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, fithImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, sixthImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, seventhImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, eightImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, ninethImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, tenthImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");



        //p.Pulse(0, tenthImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        //Rb:

        p.AddEdge("rb3DCooling", 0, false);
        p.AddEdge("rb3DCooling", tenthImageTime + 900, true);
        p.AddEdge("rb2DCooling", 0, false);
        p.AddEdge("rb2DCooling", rbMOTLoadingEndTime, true);
        p.AddEdge("rbPushBeam", 0, false);
        p.AddEdge("rbPushBeam", rbMOTLoadingEndTime, true);

        p.AddEdge("v00MOTAOM", 0, false);

        /*
         * for (int t = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"]; t < tenthImageTime + 1000; t += (int)Parameters["CaFCycleLength"])
         * {
         *  p.AddEdge("v00MOTAOM", t, true);
         *  p.AddEdge("v00MOTAOM", t + (int)Parameters["CaFHalfCycleLength"], false);
         * }
         */


        //Turn everything back on at end of sequence:

        //p.Pulse(0, moleculeMOTLoadingEndTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); //camera trigger for first frame

        /*
         * p.AddEdge("rbAbsImagingBeam", 0, true); //Absorption imaging probe
         *
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 1100, false);
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 1100 + 15, true);
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 12200, false);
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 12200 + 15, true);
         *
         *
         * p.Pulse(0, tenthImageTime + 1100, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of cloud
         * p.Pulse(0, tenthImageTime + 17200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of probe
         * p.Pulse(0, tenthImageTime + 32200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of background
         */



        //p.Pulse(0, moleculeMOTLoadingEndTime, 100, "rbAbsImgCamTrig");


        //p.AddEdge("rb3DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rb2DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rbPushBeam", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);

        return(p);
    }
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p = new PatternBuilder32();

        int patternStartBeforeQ         = (int)Parameters["TCLBlockStart"];
        int rbMOTLoadingStartTime       = patternStartBeforeQ;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + 3000;
        int firstImageTime  = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"];
        int secondImageTime = firstImageTime + (int)Parameters["TimeBetweenTriggers"];



        for (int t = 0; t < (int)Parameters["RbMOTLoadTime"]; t += 50000)
        {
            p.Pulse(patternStartBeforeQ + t, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
            p.Pulse(patternStartBeforeQ + t, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch");                              //trigger the Q switch
        }


        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);


        p.Pulse(0, firstImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); //camera trigger for first frame
        //p.Pulse(0, secondImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");

        //Rb:

        p.AddEdge("rb3DCooling", 0, false);
        //p.AddEdge("rb3DCooling", eightImageTime + 3000, true);
        p.AddEdge("rb2DCooling", 0, false);
        p.AddEdge("rb2DCooling", rbMOTLoadingEndTime, true);
        p.AddEdge("rbPushBeam", 0, false);
        p.AddEdge("rbPushBeam", rbMOTLoadingEndTime, true);

        //Rb cooling light PWM
        p.AddEdge("rb3DCooling", rbMOTLoadingEndTime - 1, true);

        for (int t = rbMOTLoadingEndTime; t < secondImageTime + (int)Parameters["TimeBetweenTriggers"]; t += (int)Parameters["RbCycleLength"])
        {
            p.AddEdge("rb3DCooling", t, false);
            p.AddEdge("rb3DCooling", t + (int)Parameters["RbHalfCycleLength"], true);
        }
        p.Pulse(0, rbMOTLoadingEndTime, 5000, "rbAbsImgCamTrig"); //this is for testing the PWM

        //Turn everything back on at end of sequence:

        //p.Pulse(0, firstImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); //camera trigger for first frame


        p.AddEdge("rbAbsImagingBeam", 0, true); //Absorption imaging probe

        /*
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 3200, false);
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 3200 + 15, true);
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 12200, false);
         * p.AddEdge("rbAbsImagingBeam", tenthImageTime + 12200 + 15, true);
         *
         *
         * p.Pulse(0, tenthImageTime + 3200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of cloud
         * p.Pulse(0, tenthImageTime + 12200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of probe
         * p.Pulse(0, tenthImageTime + 21200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of background
         *
         */

        //p.AddEdge("rb3DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rb2DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rbPushBeam", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);

        return(p);
    }
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p = new PatternBuilder32();

        int patternStartBeforeQ         = (int)Parameters["TCLBlockStart"];
        int rbMOTLoadingStartTime       = patternStartBeforeQ;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + (int)Parameters["loadingTime"];
        int firstImageTime = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"];
        int lastImageTime  = firstImageTime + (int)Parameters["TimeBetweenTriggers"] * (int)Parameters["NoOfTriggers"];

        for (int t = 0; t < (int)Parameters["RbMOTLoadTime"]; t += 50000)
        {
            p.Pulse(patternStartBeforeQ + t, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
            p.Pulse(patternStartBeforeQ + t, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch");                              //trigger the Q switch
        }


        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);


        //Rb:
        p.AddEdge("rb3DCooling", 0, false);
        p.AddEdge("rb3DCooling", lastImageTime + 1100, true);
        p.AddEdge("rb2DCooling", 0, false);
        p.AddEdge("rb2DCooling", rbMOTLoadingEndTime, true);
        p.AddEdge("rbPushBeam", 0, false);
        p.AddEdge("rbPushBeam", rbMOTLoadingEndTime, true);

        p.AddEdge("v00MOTAOM", 0, false);


        // modulation of CaF MOT light
        for (int t = firstImageTime; t < lastImageTime; t += (int)Parameters["CycleLength"])
        {
            p.AddEdge("v00MOTAOM", t, true);
            p.AddEdge("v00MOTAOM", t + (int)Parameters["HalfCycleLength"], false);
        }



        /*
         * // modulation of Rb MOT light
         * for (int t = rbMOTLoadingEndTime + 1; t < lastImageTime; t += (int)Parameters["CycleLength"])
         * {
         *  p.AddEdge("rb3DCooling", t, false);
         *  p.AddEdge("rb3DCooling", t + (int)Parameters["HalfCycleLength"], true);
         * }
         *
         * p.AddEdge("rb3DCooling", lastImageTime, false);
         * p.AddEdge("rb3DCooling", lastImageTime + 1000, true);
         */

        // consequtive camera triggers
        for (int t = firstImageTime; t < lastImageTime; t += (int)Parameters["TimeBetweenTriggers"])
        {
            p.Pulse(0, t, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        }

        //Turn everything back on at end of sequence:
        p.AddEdge("rbAbsImagingBeam", 0, true); //Absorption imaging probe

        p.AddEdge("rbAbsImagingBeam", lastImageTime + 1100, false);
        p.AddEdge("rbAbsImagingBeam", lastImageTime + 1100 + 15, true);
        p.AddEdge("rbAbsImagingBeam", lastImageTime + 12200, false);
        p.AddEdge("rbAbsImagingBeam", lastImageTime + 12200 + 15, true);


        p.Pulse(0, lastImageTime + 1100, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig");  //trigger camera to take image of cloud
        p.Pulse(0, lastImageTime + 12200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of probe
        p.Pulse(0, lastImageTime + 21200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of background

        //p.AddEdge("rb3DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rb2DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rbPushBeam", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);

        return(p);
    }
    public override AnalogPatternBuilder GetAnalogPattern()
    {
        AnalogPatternBuilder p = new AnalogPatternBuilder((int)Parameters["PatternLength"]);

        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        int rbMOTLoadingStartTime       = 0;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + 5000;
        int firstImageTime   = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"];
        int secondImageTime  = firstImageTime + (int)Parameters["TimeBetweenTriggers"];
        int thridImageTime   = secondImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fourthImageTime  = thridImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fithImageTime    = fourthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int sixthImageTime   = fithImageTime + (int)Parameters["TimeBetweenTriggers"];
        int seventhImageTime = sixthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int eightImageTime   = seventhImageTime + (int)Parameters["TimeBetweenTriggers"];
        int ninethImageTime  = eightImageTime + (int)Parameters["TimeBetweenTriggers"];
        int tenthImageTime   = ninethImageTime + (int)Parameters["TimeBetweenTriggers"];

        // Add Analog Channels

        p.AddChannel("v00Intensity");
        p.AddChannel("v00Frequency");
        p.AddChannel("xShimCoilCurrent");
        p.AddChannel("yShimCoilCurrent");
        p.AddChannel("zShimCoilCurrent");
        p.AddChannel("v00EOMAmp");
        p.AddChannel("v00Chirp");

        // Add Rb Analog channels
        p.AddChannel("rb3DCoolingFrequency");
        p.AddChannel("rb3DCoolingAttenuation");
        p.AddChannel("rbRepumpFrequency");
        p.AddChannel("rbRepumpAttenuation");
        p.AddChannel("rbAbsImagingFrequency");


        // Slowing field
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["slowingCoilsValue"]);
        p.AddAnalogValue("slowingCoilsCurrent", moleculeMOTLoadingStartTime + (int)Parameters["slowingCoilsOffTime"], 0.0);

        // B Field
        p.AddAnalogValue("MOTCoilsCurrent", rbMOTLoadingStartTime, (double)Parameters["MOTCoilsCurrentValueRb"]);
        p.AddAnalogValue("MOTCoilsCurrent", moleculeMOTLoadingStartTime, (double)Parameters["MOTCoilsCurrentValueCaF"]);
        p.AddAnalogValue("MOTCoilsCurrent", tenthImageTime + 1000, 0.0);

        // Shim Fields
        p.AddAnalogValue("xShimCoilCurrent", 0, (double)Parameters["xShimLoadCurrent"]);
        p.AddAnalogValue("yShimCoilCurrent", 0, (double)Parameters["yShimLoadCurrent"]);
        p.AddAnalogValue("zShimCoilCurrent", 0, (double)Parameters["zShimLoadCurrent"]);

        // trigger delay
        // p.AddAnalogValue("triggerDelay", 0, (double)Parameters["triggerDelay"]);

        // F=0
        p.AddAnalogValue("v00EOMAmp", 0, 4.7);

        // v0 Intensity Ramp
        p.AddAnalogValue("v00Intensity", 0, (double)Parameters["v0IntensityRampStartValue"]);
        p.AddLinearRamp("v00Intensity", moleculeMOTLoadingEndTime, (int)Parameters["v0IntensityRampDuration"], (double)Parameters["v0IntensityEndValue"]);

        // v0 Frequency Ramp
        p.AddAnalogValue("v00Frequency", 0, (double)Parameters["v0FrequencyStartValue"]);

        //v0 chirp
        p.AddAnalogValue("v00Chirp", 0, 0.0);

        //Rb Laser detunings
        p.AddAnalogValue("rb3DCoolingFrequency", 0, (double)Parameters["MOTCoolingLoadingFrequency"]);
        p.AddAnalogValue("rbRepumpFrequency", 0, (double)Parameters["MOTRepumpLoadingFrequency"]);
        p.AddAnalogValue("rbAbsImagingFrequency", 0, (double)Parameters["ImagingFrequency"]);

        //Rb Laser intensities
        p.AddAnalogValue("rb3DCoolingAttenuation", 0, 0.0);

        //Rb DARK MOT repump detuning
        p.AddAnalogValue("rbRepumpAttenuation", 0, 6.5); //This channel is now used for controlling DARK MOT repump detuning (6.5 V normal value 109.5 MHz)

        return(p);
    }
    public override PatternBuilder32 GetDigitalPattern()
    {
        PatternBuilder32 p = new PatternBuilder32();

        int patternStartBeforeQ         = (int)Parameters["TCLBlockStart"];
        int rbMOTLoadingStartTime       = patternStartBeforeQ;
        int rbMOTLoadingEndTime         = rbMOTLoadingStartTime + (int)Parameters["RbMOTLoadTime"];
        int moleculeMOTLoadingStartTime = rbMOTLoadingEndTime;
        int moleculeMOTLoadingEndTime   = moleculeMOTLoadingStartTime + 5000;
        int firstImageTime   = moleculeMOTLoadingEndTime + (int)Parameters["v0IntensityRampDuration"];
        int secondImageTime  = firstImageTime + (int)Parameters["TimeBetweenTriggers"];
        int thridImageTime   = secondImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fourthImageTime  = thridImageTime + (int)Parameters["TimeBetweenTriggers"];
        int fithImageTime    = fourthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int sixthImageTime   = fithImageTime + (int)Parameters["TimeBetweenTriggers"];
        int seventhImageTime = sixthImageTime + (int)Parameters["TimeBetweenTriggers"];
        int eightImageTime   = seventhImageTime + (int)Parameters["TimeBetweenTriggers"];
        int ninethImageTime  = eightImageTime + (int)Parameters["TimeBetweenTriggers"];
        int tenthImageTime   = ninethImageTime + (int)Parameters["TimeBetweenTriggers"];


        for (int t = 0; t < (int)Parameters["RbMOTLoadTime"]; t += 50000)
        {
            p.Pulse(patternStartBeforeQ + t, -(int)Parameters["FlashToQ"], (int)Parameters["QSwitchPulseDuration"], "flashLamp"); //trigger the flashlamp
            p.Pulse(patternStartBeforeQ + t, 0, (int)Parameters["QSwitchPulseDuration"], "qSwitch");                              //trigger the Q switch
        }


        MOTMasterScriptSnippet lm = new LoadMoleculeMOTNoSlowingEdge(p, Parameters);

        p.Pulse(0, firstImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); //camera trigger for first frame
        p.Pulse(0, secondImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, thridImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, fourthImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, fithImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, sixthImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, seventhImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, eightImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, ninethImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");
        p.Pulse(0, tenthImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger");

        //Rb:

        p.AddEdge("rb3DCooling", 0, false);
        p.AddEdge("rb3DCooling", tenthImageTime + 1000, true);
        p.AddEdge("rb2DCooling", 0, false);
        p.AddEdge("rb2DCooling", rbMOTLoadingEndTime, true);
        p.AddEdge("rbPushBeam", 0, false);
        p.AddEdge("rbPushBeam", rbMOTLoadingEndTime, true);

        //Turn everything back on at end of sequence:

        //p.Pulse(0, firstImageTime, (int)Parameters["Frame0TriggerDuration"], "cameraTrigger"); //camera trigger for first frame

        //DARK MOT:
        p.AddEdge("rbOpticalPumpingAOM", 0, false); //Using thic channel for controlling DARK SPOT repump AOM
        p.AddEdge("rbOpticalPumpingAOM", tenthImageTime + 1100, true);
        p.AddEdge("rbRepump", 0, false);
        p.AddEdge("rbRepump", rbMOTLoadingEndTime, true);
        p.AddEdge("rbRepump", tenthImageTime + 1000, false);



        p.AddEdge("rbAbsImagingBeam", 0, true); //Absorption imaging probe

        p.AddEdge("rbAbsImagingBeam", tenthImageTime + 1100, false);
        p.AddEdge("rbAbsImagingBeam", tenthImageTime + 1100 + 15, true);
        p.AddEdge("rbAbsImagingBeam", tenthImageTime + 12200, false);
        p.AddEdge("rbAbsImagingBeam", tenthImageTime + 12200 + 15, true);


        p.Pulse(0, tenthImageTime + 1100, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig");  //trigger camera to take image of cloud
        p.Pulse(0, tenthImageTime + 12200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of probe
        p.Pulse(0, tenthImageTime + 21200, (int)Parameters["Frame0TriggerDuration"], "rbAbsImgCamTrig"); //trigger camera to take image of background

        //p.AddEdge("rb3DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rb2DCooling", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);
        //p.AddEdge("rbPushBeam", (int)Parameters["PatternLength"] - (int)Parameters["TurnAllLightOn"], false);

        return(p);
    }