public static GatedDetectorData ExtractFromBlock(Block b, GatedDetectorExtractSpec gate) { GatedDetectorData gd = new GatedDetectorData(); GatedDetectorExtractFunction f; if (gate.Integrate) { f = new GatedDetectorExtractFunction(b.GetTOFIntegralArray); } else { f = new GatedDetectorExtractFunction(b.GetTOFMeanArray); } double[] rawData = f(gate.Index, gate.GateLow, gate.GateHigh); //if (gate.BackgroundSubtract) //{ //TOFFitResults results = (new TOFFitter()).FitTOF(b.GetAverageTOF(gate.Index)); //double bg = results.Background * (gate.GateHigh - gate.GateLow); //double[] bgSubData = new double[rawData.Length]; //for (int i = 0; i < rawData.Length; i++) bgSubData[i] = rawData[i] - bg; //gd.PointValues.AddRange(bgSubData); //gd.SubtractedBackground = bg; //} //else //{ gd.PointValues.AddRange(rawData); //} gd.Gate = gate; return(gd); }
//public void FitToTOF(TOF t) //{ // TOFFitter fitter = new TOFFitter(); // TOFFitResults results = fitter.FitTOF(t); // GateLow = (int)(results.Centre - (0.5 * WidthFWHM * results.Width) + (OffsetFWHM * results.Width)); // GateHigh = (int)(results.Centre + (0.5 * WidthFWHM * results.Width) + (OffsetFWHM * results.Width)); // Background = results.Background; //} //public static GatedDetectorExtractSpec MakeGateFWHM(Block b, int detector, double offset, double width) //{ // GatedDetectorExtractSpec dg = new GatedDetectorExtractSpec(); // dg.Index = detector; // dg.OffsetFWHM = offset; // dg.WidthFWHM = width; // dg.FitToTOF(b.GetAverageTOF(detector)); // return dg; //} public static GatedDetectorExtractSpec MakeWideGate(int detector) { GatedDetectorExtractSpec dg = new GatedDetectorExtractSpec(); dg.Index = detector; dg.GateLow = 0; dg.GateHigh = 100000000; return(dg); }
static DemodulationConfig() { // here we stock the class' static library of configs up with some standard configs // a wide gate - integrate everything DemodulationConfigBuilder wide = delegate(Block b) { DemodulationConfig dc; GatedDetectorExtractSpec dg0, dg1, dg2, dg3, dg4, dg5, dg6, dg7; dc = new DemodulationConfig(); dc.AnalysisTag = "wide"; dg0 = GatedDetectorExtractSpec.MakeWideGate(0); dg0.Name = "bottomProbe"; dg1 = GatedDetectorExtractSpec.MakeWideGate(1); dg1.Name = "topProbe"; dg2 = GatedDetectorExtractSpec.MakeWideGate(2); dg2.Name = "magnetometer"; dg2.Integrate = false; dg3 = GatedDetectorExtractSpec.MakeWideGate(3); dg3.Name = "gnd"; dg3.Integrate = false; dg4 = GatedDetectorExtractSpec.MakeWideGate(4); dg4.Name = "battery"; dg5 = GatedDetectorExtractSpec.MakeWideGate(5); dg5.Name = "rfCurrent"; dg5.Integrate = false; dg6 = GatedDetectorExtractSpec.MakeWideGate(6); dg6.Name = "reflectedrf1Amplitude"; dg7 = GatedDetectorExtractSpec.MakeWideGate(7); dg7.Name = "reflectedrf2Amplitude"; dc.GatedDetectorExtractSpecs.Add(dg0.Name, dg0); dc.GatedDetectorExtractSpecs.Add(dg1.Name, dg1); dc.GatedDetectorExtractSpecs.Add(dg2.Name, dg2); dc.GatedDetectorExtractSpecs.Add(dg3.Name, dg3); dc.GatedDetectorExtractSpecs.Add(dg4.Name, dg4); dc.GatedDetectorExtractSpecs.Add(dg5.Name, dg5); dc.GatedDetectorExtractSpecs.Add(dg6.Name, dg6); dc.GatedDetectorExtractSpecs.Add(dg7.Name, dg7); dc.PointDetectorChannels.Add("MiniFlux1"); dc.PointDetectorChannels.Add("MiniFlux2"); dc.PointDetectorChannels.Add("MiniFlux3"); dc.PointDetectorChannels.Add("NorthCurrent"); dc.PointDetectorChannels.Add("SouthCurrent"); dc.PointDetectorChannels.Add("PumpPD"); dc.PointDetectorChannels.Add("ProbePD"); return(dc); }; standardConfigs.Add("wide", wide); //// fwhm of the tof pulse for top and norm, wide gates for everything else. //AddSliceConfig("fwhm", 0, 1); //// narrower than fwhm, takes only the center hwhm //AddSliceConfig("hwhm", 0, 0.5); //// only the fast half of the fwhm (NOT TRUE - 01Jul08JH) //AddSliceConfig("fast", -0.5, 0.5); //// the slow half of the fwhm (NOT TRUE - 01Jul08 JH) //AddSliceConfig("slow", 0.5, 0.5); //// the fastest and slowest molecules, used for estimating any tof related systematic. //// these gates don't overlap with the usual centred analysis gates (fwhm and cgate11). //AddSliceConfig("vfast", -0.85, 0.5); //AddSliceConfig("vslow", 0.85, 0.5); // for testing out different centred-gate widths for (int i = 1; i < 10; i++) { AddFixedSliceConfig("wgate" + i, 2440, i * 20); } for (int i = 1; i < 14; i++) { AddFixedSliceConfig("shiftgate" + i, 1850 + i * 50, 65); } for (int i = 1; i < 7; i++) { AddFixedSliceConfig("slicegate" + i, 2050 + i * 50, 25); } for (int i = 1; i < 30; i++) { AddFixedSliceConfig("pgate" + i, 2090 + i * 10, 10); } //// testing different gate centres. "slide0" is centred at -0.7 fwhm, "slide14" //// is centred and +0.7 fwhm. //for (int i = 0; i < 15; i++) // AddSliceConfig("slide" + i, (((double)i) / 10.0) - 0.7, 1); //// now some finer slices //double d = -1.4; //for (int i = 0; i < 15; i++) //{ // AddSliceConfig("slice" + i, d, 0.2); // d += 0.2; //} //// optimised gates for spring 2009 run //AddSliceConfig("optimum1", 0.3, 1.1); //AddSliceConfig("optimum2", 0.2, 1.1); // "background" gate DemodulationConfigBuilder background = delegate(Block b) { DemodulationConfig dc; GatedDetectorExtractSpec dg0, dg1; dc = new DemodulationConfig(); dc.AnalysisTag = "background"; dg0 = GatedDetectorExtractSpec.MakeWideGate(0); dg0.GateLow = 2550; dg0.GateHigh = 2600; dg0.Name = "top"; dg1 = GatedDetectorExtractSpec.MakeWideGate(1); dg1.Name = "norm"; dg1.GateLow = 750; dg1.GateHigh = 800; dc.GatedDetectorExtractSpecs.Add(dg0.Name, dg0); dc.GatedDetectorExtractSpecs.Add(dg1.Name, dg1); return(dc); }; standardConfigs.Add("background", background); // add some fixed gate slices - the first three are the 1.1 sigma centre portion and two // non-overlapping portions either side. AddFixedSliceConfig("cgate11Fixed", 2156, 90); // This is normally ("cgate11Fixed", 2156, 90) AddFixedSliceConfig("vfastFixed", 2025, 41); AddFixedSliceConfig("vslowFixed", 2286, 41); // these "nudge" gates are chosen to, hopefully, tweak the 09_10 dataset so that the // RF1F channel, DB-normed in the non-linear way, is reduced to near zero AddFixedSliceConfig("nudgeGate1", 2161, 90); AddFixedSliceConfig("nudgeGate2", 2169, 90); AddFixedSliceConfig("nudgeGate3", 2176, 90); AddFixedSliceConfig("nudgeGate4", 2174, 90); AddFixedSliceConfig("nudgeGate5", 2188, 90); AddFixedSliceConfig("nudgeGate6", 2198, 90); AddFixedSliceConfig("nudgeGate7", 2208, 90); AddFixedSliceConfig("nudgeGate8", 2228, 90); AddFixedSliceConfig("wideNudgeGate1", 2198, 100); AddFixedSliceConfig("narrowNudgeGate1", 2198, 75); AddFixedSliceConfig("narrowNudgeGate2", 2198, 65); AddFixedSliceConfig("narrowNudgeGate3", 2198, 55); AddFixedSliceConfig("narrowNudgeGate4", 2198, 45); // these two are the fast and slow halves of the 1.1 sigma central gate. AddFixedSliceConfig("fastFixed", 2110, 45); AddFixedSliceConfig("slowFixed", 2201, 45); // two fairly wide gates that take in most of the slow and fast molecules. // They've been chosed to try and capture the wiggliness of our fast-slow // wiggles. AddFixedSliceConfig("widefastFixed", 1950, 150); AddFixedSliceConfig("wideslowFixed", 2330, 150); // A narrow centre gate for correlation analysis AddFixedSliceConfig("cgateNarrowFixed", 2175, 25); // A gate containing no molecules to look for edms caused by rf pickup AddFixedSliceConfig("preMolecularBackground", 1850, 50); // A demodulation config for Kr AddFixedSliceConfig("centreFixedKr", 2950, 90); }
//private static void AddSliceConfig(string name, double offset, double width) //{ // // the slow half of the fwhm // DemodulationConfigBuilder dcb = delegate(Block b) // { // DemodulationConfig dc; // GatedDetectorExtractSpec dg0, dg1, dg2, dg3, dg4; // dc = new DemodulationConfig(); // dc.AnalysisTag = name; // dg0 = GatedDetectorExtractSpec.MakeGateFWHM(b, 0, offset, width); // dg0.Name = "top"; // dg0.BackgroundSubtract = true; // dg1 = GatedDetectorExtractSpec.MakeGateFWHM(b, 1, offset, width); // dg1.Name = "norm"; // dg1.BackgroundSubtract = true; // dg2 = GatedDetectorExtractSpec.MakeWideGate(2); // dg2.Name = "mag1"; // dg2.Integrate = false; // dg3 = GatedDetectorExtractSpec.MakeWideGate(3); // dg3.Name = "short"; // dg3.Integrate = false; // dg4 = GatedDetectorExtractSpec.MakeWideGate(4); // dg4.Name = "battery"; // dc.GatedDetectorExtractSpecs.Add(dg0.Name, dg0); // dc.GatedDetectorExtractSpecs.Add(dg1.Name, dg1); // dc.GatedDetectorExtractSpecs.Add(dg2.Name, dg2); // dc.GatedDetectorExtractSpecs.Add(dg3.Name, dg3); // dc.GatedDetectorExtractSpecs.Add(dg4.Name, dg4); // dc.PointDetectorChannels.Add("MiniFlux1"); // dc.PointDetectorChannels.Add("MiniFlux2"); // dc.PointDetectorChannels.Add("MiniFlux3"); // dc.PointDetectorChannels.Add("NorthCurrent"); // dc.PointDetectorChannels.Add("SouthCurrent"); // dc.PointDetectorChannels.Add("PumpPD"); // dc.PointDetectorChannels.Add("ProbePD"); // return dc; // }; // standardConfigs.Add(name, dcb); //} private static void AddFixedSliceConfig(string name, double centre, double width) { // the slow half of the fwhm DemodulationConfigBuilder dcb = delegate(Block b) { DemodulationConfig dc; GatedDetectorExtractSpec dg0, dg1, dg2, dg3, dg4, dg5, dg6, dg7; //This dodgy bit of code is to make sure that the reflected rf power meters // only select a single point in the centre of the rf pulse. It won't work // if either of the rf pulses is centred at a time not divisible w/o rem. by 10us int rf1CT = (int)b.Config.Settings["rf1CentreTime"]; int rf2CT = (int)b.Config.Settings["rf2CentreTime"]; int clock = (int)b.Config.Settings["clockFrequency"]; int conFac = clock / 1000000; dc = new DemodulationConfig(); dc.AnalysisTag = name; dg0 = new GatedDetectorExtractSpec(); dg0.Index = 0; dg0.Name = "bottomProbe"; dg0.BackgroundSubtract = false; dg0.GateLow = (int)(centre - width); dg0.GateHigh = (int)(centre + width); dg1 = new GatedDetectorExtractSpec(); dg1.Index = 1; dg1.Name = "topProbe"; dg1.BackgroundSubtract = false; dg1.GateLow = (int)((centre - width) * kDetectorDistanceRatio); dg1.GateHigh = (int)((centre + width) * kDetectorDistanceRatio); dg2 = GatedDetectorExtractSpec.MakeWideGate(2); dg2.Name = "magnetometer"; dg2.Integrate = false; dg3 = GatedDetectorExtractSpec.MakeWideGate(3); dg3.Name = "gnd"; dg3.Integrate = false; dg4 = GatedDetectorExtractSpec.MakeWideGate(4); dg4.Name = "battery"; dg4.Integrate = false; //Add this in to analyse By in 3 axis internal magnetometer tests dg5 = GatedDetectorExtractSpec.MakeWideGate(5); dg5.Name = "rfCurrent"; dg5.Integrate = false; dg6 = new GatedDetectorExtractSpec(); dg6.Index = 6; dg6.Name = "reflectedrf1Amplitude"; dg6.BackgroundSubtract = false; dg6.GateLow = 800; dg6.GateHigh = 1800; //dg6.GateLow = (rf1CT / conFac) - 1; //dg6.GateHigh = (rf1CT / conFac) + 1; dg7 = new GatedDetectorExtractSpec(); dg7.Index = 7; dg7.Name = "reflectedrf2Amplitude"; dg7.BackgroundSubtract = false; //dg7.GateLow = (rf2CT / conFac) - 1; //dg7.GateHigh = (rf2CT / conFac) + 1; dg7.GateLow = 800; dg7.GateHigh = 1800; dc.GatedDetectorExtractSpecs.Add(dg0.Name, dg0); dc.GatedDetectorExtractSpecs.Add(dg1.Name, dg1); dc.GatedDetectorExtractSpecs.Add(dg2.Name, dg2); dc.GatedDetectorExtractSpecs.Add(dg3.Name, dg3); dc.GatedDetectorExtractSpecs.Add(dg4.Name, dg4); dc.GatedDetectorExtractSpecs.Add(dg5.Name, dg5); dc.GatedDetectorExtractSpecs.Add(dg6.Name, dg6); dc.GatedDetectorExtractSpecs.Add(dg7.Name, dg7); dc.PointDetectorChannels.Add("MiniFlux1"); dc.PointDetectorChannels.Add("MiniFlux2"); dc.PointDetectorChannels.Add("MiniFlux3"); dc.PointDetectorChannels.Add("NorthCurrent"); dc.PointDetectorChannels.Add("SouthCurrent"); dc.PointDetectorChannels.Add("PumpPD"); dc.PointDetectorChannels.Add("ProbePD"); dc.PointDetectorChannels.Add("PhaseLockFrequency"); //dc.PointDetectorChannels.Add("CplusV"); //dc.PointDetectorChannels.Add("CminusV"); return(dc); }; standardConfigs.Add(name, dcb); }
// DemodulateBlockNL augments the channel values returned by DemodulateBlock // with several non-linear combinations of channels (E.B/DB, the correction, etc). // These non-linear channels are calculated point-by-point for the TOF and then // integrated according to the Demodulation config. This is calculated for top and // topNormed detectors only for speed. // public DemodulatedBlock DemodulateBlockNL(Block b, DemodulationConfig config) { // we start with the standard demodulated block DemodulatedBlock dblock = DemodulateBlock(b, config); // First do everything for the un-normalised top detector int tdi = dblock.DetectorIndices["top"]; // TOF demodulate the block to get the channel wiggles // the BlockTOFDemodulator only demodulates the PMT detector BlockTOFDemodulator btdt = new BlockTOFDemodulator(); TOFChannelSet tcst = btdt.TOFDemodulateBlock(b, tdi, false); // now repeat having normed the block // normalise the PMT signal b.Normalise(config.GatedDetectorExtractSpecs["norm"]); int tndi = dblock.DetectorIndices["topNormed"]; // TOF demodulate the block to get the channel wiggles // the BlockTOFDemodulator only demodulates the PMT detector BlockTOFDemodulator btd = new BlockTOFDemodulator(); TOFChannelSet tcs = btd.TOFDemodulateBlock(b, tndi, false); // get hold of the gating data GatedDetectorExtractSpec gate = config.GatedDetectorExtractSpecs["top"]; // gate the special channels TOFChannel edmDB = (TOFChannel)tcs.GetChannel("EDMDB"); double edmDBG = edmDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel corrDB = (TOFChannel)tcs.GetChannel("CORRDB"); double corrDBG = corrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel edmCorrDB = (TOFChannel)tcs.GetChannel("EDMCORRDB"); double edmCorrDBG = edmCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel corrDB_old = (TOFChannel)tcs.GetChannel("CORRDB_OLD"); double corrDBG_old = corrDB_old.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel edmCorrDB_old = (TOFChannel)tcs.GetChannel("EDMCORRDB_OLD"); double edmCorrDBG_old = edmCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1fDB = (TOFChannel)tcs.GetChannel("RF1FDB"); double rf1fDBG = rf1fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2fDB = (TOFChannel)tcs.GetChannel("RF2FDB"); double rf2fDBG = rf2fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1fDBDB = (TOFChannel)tcs.GetChannel("RF1FDBDB"); double rf1fDBDBG = rf1fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2fDBDB = (TOFChannel)tcs.GetChannel("RF2FDBDB"); double rf2fDBDBG = rf2fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1aDB = (TOFChannel)tcs.GetChannel("RF1ADB"); double rf1aDBG = rf1aDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2aDB = (TOFChannel)tcs.GetChannel("RF2ADB"); double rf2aDBG = rf2aDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1aDBDB = (TOFChannel)tcs.GetChannel("RF1ADBDB"); double rf1aDBDBG = rf1aDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2aDBDB = (TOFChannel)tcs.GetChannel("RF2ADBDB"); double rf2aDBDBG = rf2aDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf1DB = (TOFChannel)tcs.GetChannel("LF1DB"); double lf1DBG = lf1DB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf1DBDB = (TOFChannel)tcs.GetChannel("LF1DBDB"); double lf1DBDBG = lf1DBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf2DB = (TOFChannel)tcs.GetChannel("LF2DB"); double lf2DBG = lf2DB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf2DBDB = (TOFChannel)tcs.GetChannel("LF2DBDB"); double lf2DBDBG = lf2DBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel BDB = (TOFChannel)tcs.GetChannel("BDB"); double BDBG = BDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf1fDB = (TOFChannel)tcs.GetChannel("ERF1FDB"); double erf1fDBG = erf1fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf2fDB = (TOFChannel)tcs.GetChannel("ERF2FDB"); double erf2fDBG = erf2fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf1fDBDB = (TOFChannel)tcs.GetChannel("ERF1FDBDB"); double erf1fDBDBG = erf1fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf2fDBDB = (TOFChannel)tcs.GetChannel("ERF2FDBDB"); double erf2fDBDBG = erf2fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel brf1fCorrDB = (TOFChannel)tcs.GetChannel("BRF1FCORRDB"); double brf1fCorrDBG = brf1fCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel brf2fCorrDB = (TOFChannel)tcs.GetChannel("BRF2FCORRDB"); double brf2fCorrDBG = brf2fCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); //Repeat for top TOFChannel edmDBtop = (TOFChannel)tcst.GetChannel("EDMDB"); double edmDBGtop = edmDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel corrDBtop = (TOFChannel)tcst.GetChannel("CORRDB"); double corrDBGtop = corrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel edmCorrDBtop = (TOFChannel)tcst.GetChannel("EDMCORRDB"); double edmCorrDBGtop = edmCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel corrDB_oldtop = (TOFChannel)tcst.GetChannel("CORRDB_OLD"); double corrDBG_oldtop = corrDB_old.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel edmCorrDB_oldtop = (TOFChannel)tcst.GetChannel("EDMCORRDB_OLD"); double edmCorrDBG_oldtop = edmCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1fDBtop = (TOFChannel)tcst.GetChannel("RF1FDB"); double rf1fDBGtop = rf1fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2fDBtop = (TOFChannel)tcst.GetChannel("RF2FDB"); double rf2fDBGtop = rf2fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1fDBDBtop = (TOFChannel)tcst.GetChannel("RF1FDBDB"); double rf1fDBDBGtop = rf1fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2fDBDBtop = (TOFChannel)tcst.GetChannel("RF2FDBDB"); double rf2fDBDBGtop = rf2fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1aDBtop = (TOFChannel)tcst.GetChannel("RF1ADB"); double rf1aDBGtop = rf1aDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2aDBtop = (TOFChannel)tcst.GetChannel("RF2ADB"); double rf2aDBGtop = rf2aDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf1aDBDBtop = (TOFChannel)tcst.GetChannel("RF1ADBDB"); double rf1aDBDBGtop = rf1aDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel rf2aDBDBtop = (TOFChannel)tcst.GetChannel("RF2ADBDB"); double rf2aDBDBGtop = rf2aDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf1DBtop = (TOFChannel)tcst.GetChannel("LF1DB"); double lf1DBGtop = lf1DB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf1DBDBtop = (TOFChannel)tcst.GetChannel("LF1DBDB"); double lf1DBDBGtop = lf1DBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf2DBtop = (TOFChannel)tcst.GetChannel("LF2DB"); double lf2DBGtop = lf2DB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel lf2DBDBtop = (TOFChannel)tcst.GetChannel("LF2DBDB"); double lf2DBDBGtop = lf2DBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel BDBtop = (TOFChannel)tcst.GetChannel("BDB"); double BDBGtop = BDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf1fDBtop = (TOFChannel)tcst.GetChannel("ERF1FDB"); double erf1fDBGtop = erf1fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf2fDBtop = (TOFChannel)tcst.GetChannel("ERF2FDB"); double erf2fDBGtop = erf2fDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf1fDBDBtop = (TOFChannel)tcst.GetChannel("ERF1FDBDB"); double erf1fDBDBGtop = erf1fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel erf2fDBDBtop = (TOFChannel)tcst.GetChannel("ERF2FDBDB"); double erf2fDBDBGtop = erf2fDBDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel brf1fCorrDBtop = (TOFChannel)tcst.GetChannel("BRF1FCORRDB"); double brf1fCorrDBGtop = brf1fCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); TOFChannel brf2fCorrDBtop = (TOFChannel)tcst.GetChannel("BRF2FCORRDB"); double brf2fCorrDBGtop = brf2fCorrDB.Difference.GatedMean(gate.GateLow, gate.GateHigh); // we bodge the errors, which aren't really used for much anyway // by just using the error from the normal dblock. I ignore the error in DB. // I use the simple correction error for the full correction. Doesn't much matter. DetectorChannelValues dcv = dblock.ChannelValues[tndi]; double edmDBE = dcv.GetError(new string[] { "E", "B" }) / dcv.GetValue(new string[] { "DB" }); double corrDBE = Math.Sqrt( Math.Pow(dcv.GetValue(new string[] { "E", "DB" }) * dcv.GetError(new string[] { "B" }), 2) + Math.Pow(dcv.GetValue(new string[] { "B" }) * dcv.GetError(new string[] { "E", "DB" }), 2)) / Math.Pow(dcv.GetValue(new string[] { "DB" }), 2); double edmCorrDBE = Math.Sqrt(Math.Pow(edmDBE, 2) + Math.Pow(corrDBE, 2)); double rf1fDBE = dcv.GetError(new string[] { "RF1F" }) / dcv.GetValue(new string[] { "DB" }); double rf2fDBE = dcv.GetError(new string[] { "RF2F" }) / dcv.GetValue(new string[] { "DB" }); double rf1fDBDBE = dcv.GetError(new string[] { "DB", "RF1F" }) / dcv.GetValue(new string[] { "DB" }); double rf2fDBDBE = dcv.GetError(new string[] { "DB", "RF2F" }) / dcv.GetValue(new string[] { "DB" }); double rf1aDBE = dcv.GetError(new string[] { "RF1A" }) / dcv.GetValue(new string[] { "DB" }); double rf2aDBE = dcv.GetError(new string[] { "RF2A" }) / dcv.GetValue(new string[] { "DB" }); double rf1aDBDBE = dcv.GetError(new string[] { "DB", "RF1A" }) / dcv.GetValue(new string[] { "DB" }); double rf2aDBDBE = dcv.GetError(new string[] { "DB", "RF2A" }) / dcv.GetValue(new string[] { "DB" }); double lf1DBE = dcv.GetError(new string[] { "LF1" }) / dcv.GetValue(new string[] { "DB" }); double lf1DBDBE = dcv.GetError(new string[] { "DB", "LF1" }) / dcv.GetValue(new string[] { "DB" }); double lf2DBE = dcv.GetError(new string[] { "LF2" }) / dcv.GetValue(new string[] { "DB" }); double lf2DBDBE = dcv.GetError(new string[] { "DB", "LF2" }) / dcv.GetValue(new string[] { "DB" }); double brf1fDBE = dcv.GetError(new string[] { "B", "RF1F" }) / dcv.GetValue(new string[] { "DB" }); double brf2fDBE = dcv.GetError(new string[] { "B", "RF2F" }) / dcv.GetValue(new string[] { "DB" }); double erf1fDBE = dcv.GetError(new string[] { "E", "RF1F" }) / dcv.GetValue(new string[] { "DB" }); double erf2fDBE = dcv.GetError(new string[] { "E", "RF2F" }) / dcv.GetValue(new string[] { "DB" }); double erf1fDBDBE = dcv.GetError(new string[] { "E", "DB", "RF1F" }) / dcv.GetValue(new string[] { "DB" }); double erf2fDBDBE = dcv.GetError(new string[] { "E", "DB", "RF2F" }) / dcv.GetValue(new string[] { "DB" }); double BDBE = dcv.GetError(new string[] { "B" }) / dcv.GetValue(new string[] { "DB" }); //repeat for top DetectorChannelValues dcvt = dblock.ChannelValues[tdi]; double lf2DBEtop = dcvt.GetError(new string[] { "LF2" }) / dcvt.GetValue(new string[] { "DB" }); //Change the db channel back to topNormed double lf2DBDBEtop = dcvt.GetError(new string[] { "DB", "LF2" }) / dcvt.GetValue(new string[] { "DB" }); //Change the db channel back to topNormed double edmDBEtop = dcvt.GetError(new string[] { "E", "B" }) / dcvt.GetValue(new string[] { "DB" }); double corrDBEtop = Math.Sqrt( Math.Pow(dcvt.GetValue(new string[] { "E", "DB" }) * dcvt.GetError(new string[] { "B" }), 2) + Math.Pow(dcvt.GetValue(new string[] { "B" }) * dcvt.GetError(new string[] { "E", "DB" }), 2)) / Math.Pow(dcvt.GetValue(new string[] { "DB" }), 2); double edmCorrDBEtop = Math.Sqrt(Math.Pow(edmDBEtop, 2) + Math.Pow(corrDBEtop, 2)); double rf1fDBEtop = dcvt.GetError(new string[] { "RF1F" }) / dcvt.GetValue(new string[] { "DB" }); double rf2fDBEtop = dcvt.GetError(new string[] { "RF2F" }) / dcvt.GetValue(new string[] { "DB" }); double rf1fDBDBEtop = dcvt.GetError(new string[] { "DB", "RF1F" }) / dcvt.GetValue(new string[] { "DB" }); double rf2fDBDBEtop = dcvt.GetError(new string[] { "DB", "RF2F" }) / dcvt.GetValue(new string[] { "DB" }); double rf1aDBEtop = dcvt.GetError(new string[] { "RF1A" }) / dcvt.GetValue(new string[] { "DB" }); double rf2aDBEtop = dcvt.GetError(new string[] { "RF2A" }) / dcvt.GetValue(new string[] { "DB" }); double rf1aDBDBEtop = dcvt.GetError(new string[] { "DB", "RF1A" }) / dcvt.GetValue(new string[] { "DB" }); double rf2aDBDBEtop = dcvt.GetError(new string[] { "DB", "RF2A" }) / dcvt.GetValue(new string[] { "DB" }); double lf1DBEtop = dcvt.GetError(new string[] { "LF1" }) / dcvt.GetValue(new string[] { "DB" }); double lf1DBDBEtop = dcvt.GetError(new string[] { "DB", "LF1" }) / dcvt.GetValue(new string[] { "DB" }); double brf1fDBEtop = dcvt.GetError(new string[] { "B", "RF1F" }) / dcvt.GetValue(new string[] { "DB" }); double brf2fDBEtop = dcvt.GetError(new string[] { "B", "RF2F" }) / dcvt.GetValue(new string[] { "DB" }); double erf1fDBEtop = dcvt.GetError(new string[] { "E", "RF1F" }) / dcvt.GetValue(new string[] { "DB" }); double erf2fDBEtop = dcvt.GetError(new string[] { "E", "RF2F" }) / dcvt.GetValue(new string[] { "DB" }); double erf1fDBDBEtop = dcvt.GetError(new string[] { "E", "DB", "RF1F" }) / dcvt.GetValue(new string[] { "DB" }); double erf2fDBDBEtop = dcvt.GetError(new string[] { "E", "DB", "RF2F" }) / dcvt.GetValue(new string[] { "DB" }); double BDBEtop = dcvt.GetError(new string[] { "B" }) / dcvt.GetValue(new string[] { "DB" }); // stuff the data into the dblock dblock.ChannelValues[tndi].SpecialValues["EDMDB"] = new double[] { edmDBG, edmDBE }; dblock.ChannelValues[tndi].SpecialValues["CORRDB"] = new double[] { corrDBG, corrDBE }; dblock.ChannelValues[tndi].SpecialValues["EDMCORRDB"] = new double[] { edmCorrDBG, edmCorrDBE }; dblock.ChannelValues[tndi].SpecialValues["CORRDB_OLD"] = new double[] { corrDBG_old, corrDBE }; dblock.ChannelValues[tndi].SpecialValues["EDMCORRDB_OLD"] = new double[] { edmCorrDBG_old, edmCorrDBE }; dblock.ChannelValues[tndi].SpecialValues["RF1FDB"] = new double[] { rf1fDBG, rf1fDBE }; dblock.ChannelValues[tndi].SpecialValues["RF2FDB"] = new double[] { rf2fDBG, rf2fDBE }; dblock.ChannelValues[tndi].SpecialValues["RF1FDBDB"] = new double[] { rf1fDBDBG, rf1fDBDBE }; dblock.ChannelValues[tndi].SpecialValues["RF2FDBDB"] = new double[] { rf2fDBDBG, rf2fDBDBE }; dblock.ChannelValues[tndi].SpecialValues["RF1ADB"] = new double[] { rf1aDBG, rf1aDBE }; dblock.ChannelValues[tndi].SpecialValues["RF2ADB"] = new double[] { rf2aDBG, rf2aDBE }; dblock.ChannelValues[tndi].SpecialValues["RF1ADBDB"] = new double[] { rf1aDBDBG, rf1aDBDBE }; dblock.ChannelValues[tndi].SpecialValues["RF2ADBDB"] = new double[] { rf2aDBDBG, rf2aDBDBE }; dblock.ChannelValues[tndi].SpecialValues["BRF1FCORRDB"] = new double[] { brf1fCorrDBG, brf1fDBE }; dblock.ChannelValues[tndi].SpecialValues["BRF2FCORRDB"] = new double[] { brf2fCorrDBG, brf2fDBE }; dblock.ChannelValues[tndi].SpecialValues["ERF1FDB"] = new double[] { erf1fDBG, erf1fDBE }; dblock.ChannelValues[tndi].SpecialValues["ERF2FDB"] = new double[] { erf2fDBG, erf2fDBE }; dblock.ChannelValues[tndi].SpecialValues["ERF1FDBDB"] = new double[] { erf1fDBDBG, erf1fDBDBE }; dblock.ChannelValues[tndi].SpecialValues["ERF2FDBDB"] = new double[] { erf2fDBDBG, erf2fDBDBE }; dblock.ChannelValues[tndi].SpecialValues["LF1DB"] = new double[] { lf1DBG, lf1DBE }; dblock.ChannelValues[tndi].SpecialValues["LF1DBDB"] = new double[] { lf1DBDBG, lf1DBDBE }; dblock.ChannelValues[tndi].SpecialValues["LF2DB"] = new double[] { lf2DBG, lf2DBE }; dblock.ChannelValues[tndi].SpecialValues["LF2DBDB"] = new double[] { lf2DBDBG, lf2DBDBE }; dblock.ChannelValues[tndi].SpecialValues["BDB"] = new double[] { BDBG, BDBE }; dblock.ChannelValues[tdi].SpecialValues["EDMDB"] = new double[] { edmDBGtop, edmDBEtop }; dblock.ChannelValues[tdi].SpecialValues["CORRDB"] = new double[] { corrDBGtop, corrDBEtop }; dblock.ChannelValues[tdi].SpecialValues["EDMCORRDB"] = new double[] { edmCorrDBGtop, edmCorrDBEtop }; dblock.ChannelValues[tdi].SpecialValues["CORRDB_OLD"] = new double[] { corrDBG_oldtop, corrDBEtop }; dblock.ChannelValues[tdi].SpecialValues["EDMCORRDB_OLD"] = new double[] { edmCorrDBG_oldtop, edmCorrDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF1FDB"] = new double[] { rf1fDBGtop, rf1fDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF2FDB"] = new double[] { rf2fDBGtop, rf2fDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF1FDBDB"] = new double[] { rf1fDBDBGtop, rf1fDBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF2FDBDB"] = new double[] { rf2fDBDBGtop, rf2fDBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF1ADB"] = new double[] { rf1aDBGtop, rf1aDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF2ADB"] = new double[] { rf2aDBGtop, rf2aDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF1ADBDB"] = new double[] { rf1aDBDBGtop, rf1aDBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["RF2ADBDB"] = new double[] { rf2aDBDBGtop, rf2aDBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["BRF1FCORRDB"] = new double[] { brf1fCorrDBGtop, brf1fDBEtop }; dblock.ChannelValues[tdi].SpecialValues["BRF2FCORRDB"] = new double[] { brf2fCorrDBGtop, brf2fDBEtop }; dblock.ChannelValues[tdi].SpecialValues["ERF1FDB"] = new double[] { erf1fDBGtop, erf1fDBEtop }; dblock.ChannelValues[tdi].SpecialValues["ERF2FDB"] = new double[] { erf2fDBGtop, erf2fDBEtop }; dblock.ChannelValues[tdi].SpecialValues["ERF1FDBDB"] = new double[] { erf1fDBDBGtop, erf1fDBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["ERF2FDBDB"] = new double[] { erf2fDBDBGtop, erf2fDBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["LF1DB"] = new double[] { lf1DBGtop, lf1DBEtop }; dblock.ChannelValues[tdi].SpecialValues["LF1DBDB"] = new double[] { lf1DBDBGtop, lf1DBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["LF2DB"] = new double[] { lf2DBGtop, lf2DBEtop }; dblock.ChannelValues[tdi].SpecialValues["LF2DBDB"] = new double[] { lf2DBDBGtop, lf2DBDBEtop }; dblock.ChannelValues[tdi].SpecialValues["BDB"] = new double[] { BDBGtop, BDBEtop }; return(dblock); }
//private static void AddSliceConfig(string name, double offset, double width) //{ // // the slow half of the fwhm // DemodulationConfigBuilder dcb = delegate(Block b) // { // DemodulationConfig dc; // GatedDetectorExtractSpec dg0, dg1, dg2, dg3, dg4; // dc = new DemodulationConfig(); // dc.AnalysisTag = name; // dg0 = GatedDetectorExtractSpec.MakeGateFWHM(b, 0, offset, width); // dg0.Name = "top"; // dg0.BackgroundSubtract = true; // dg1 = GatedDetectorExtractSpec.MakeGateFWHM(b, 1, offset, width); // dg1.Name = "norm"; // dg1.BackgroundSubtract = true; // dg2 = GatedDetectorExtractSpec.MakeWideGate(2); // dg2.Name = "mag1"; // dg2.Integrate = false; // dg3 = GatedDetectorExtractSpec.MakeWideGate(3); // dg3.Name = "short"; // dg3.Integrate = false; // dg4 = GatedDetectorExtractSpec.MakeWideGate(4); // dg4.Name = "battery"; // dc.GatedDetectorExtractSpecs.Add(dg0.Name, dg0); // dc.GatedDetectorExtractSpecs.Add(dg1.Name, dg1); // dc.GatedDetectorExtractSpecs.Add(dg2.Name, dg2); // dc.GatedDetectorExtractSpecs.Add(dg3.Name, dg3); // dc.GatedDetectorExtractSpecs.Add(dg4.Name, dg4); // dc.PointDetectorChannels.Add("MiniFlux1"); // dc.PointDetectorChannels.Add("MiniFlux2"); // dc.PointDetectorChannels.Add("MiniFlux3"); // dc.PointDetectorChannels.Add("NorthCurrent"); // dc.PointDetectorChannels.Add("SouthCurrent"); // dc.PointDetectorChannels.Add("PumpPD"); // dc.PointDetectorChannels.Add("ProbePD"); // return dc; // }; // standardConfigs.Add(name, dcb); //} private static void AddFixedSliceConfig(string name, double centre, double width) { // the slow half of the fwhm DemodulationConfigBuilder dcb = delegate(Block b) { DemodulationConfig dc; GatedDetectorExtractSpec dg0, dg1, dg2, dg3, dg4, dg5, dg6, dg7; dc = new DemodulationConfig(); dc.AnalysisTag = name; dg0 = new GatedDetectorExtractSpec(); dg0.Index = 0; dg0.Name = "top"; dg0.BackgroundSubtract = false; dg0.GateLow = (int)(centre - width); dg0.GateHigh = (int)(centre + width); dg1 = new GatedDetectorExtractSpec(); dg1.Index = 1; dg1.Name = "norm"; dg1.BackgroundSubtract = false; dg1.GateLow = (int)((centre - width) / kDetectorDistanceRatio); dg1.GateHigh = (int)((centre + width) / kDetectorDistanceRatio); dg2 = GatedDetectorExtractSpec.MakeWideGate(2); dg2.Name = "magnetometer"; dg2.Integrate = false; dg3 = GatedDetectorExtractSpec.MakeWideGate(3); dg3.Name = "gnd"; dg3.Integrate = false; dg4 = GatedDetectorExtractSpec.MakeWideGate(4); dg4.Name = "battery"; dg5 = GatedDetectorExtractSpec.MakeWideGate(5); dg5.Name = "rfCurrent"; dg5.Integrate = false; dg6 = new GatedDetectorExtractSpec(); dg6.Index = 6; dg6.Name = "reflectedrf1Amplitude"; dg6.BackgroundSubtract = false; dg6.GateLow = 819; dg6.GateHigh = 821; dg7 = new GatedDetectorExtractSpec(); dg7.Index = 7; dg7.Name = "reflectedrf2Amplitude"; dg7.BackgroundSubtract = false; dg7.GateLow = 1799; dg7.GateHigh = 1801; dc.GatedDetectorExtractSpecs.Add(dg0.Name, dg0); dc.GatedDetectorExtractSpecs.Add(dg1.Name, dg1); dc.GatedDetectorExtractSpecs.Add(dg2.Name, dg2); dc.GatedDetectorExtractSpecs.Add(dg3.Name, dg3); dc.GatedDetectorExtractSpecs.Add(dg4.Name, dg4); dc.GatedDetectorExtractSpecs.Add(dg5.Name, dg5); dc.GatedDetectorExtractSpecs.Add(dg6.Name, dg6); dc.GatedDetectorExtractSpecs.Add(dg7.Name, dg7); dc.PointDetectorChannels.Add("MiniFlux1"); dc.PointDetectorChannels.Add("MiniFlux2"); dc.PointDetectorChannels.Add("MiniFlux3"); dc.PointDetectorChannels.Add("NorthCurrent"); dc.PointDetectorChannels.Add("SouthCurrent"); dc.PointDetectorChannels.Add("PumpPD"); dc.PointDetectorChannels.Add("ProbePD"); return(dc); }; standardConfigs.Add(name, dcb); }