35 spectrum.
valid =
true;
37 spectrum.
x.resize(81u);
38 for (std::size_t i = 0; i < spectrum.
x.size(); ++i) {
39 spectrum.
x[i] = (
static_cast<double>(i) - 40.0) * spectrum.
dx;
46 ground.
amplitude.resize(spectrum.
x.size(), 0.0);
47 excited.
amplitude.resize(spectrum.
x.size(), 0.0);
48 for (std::size_t i = 0; i < spectrum.
x.size(); ++i) {
49 const double x = spectrum.
x[i];
50 ground.
amplitude[i] = std::exp(-0.5 * x * x);
51 excited.
amplitude[i] = x * std::exp(-0.5 * x * x);
53 auto normalize = [&spectrum](std::vector<float> &v) {
55 for (
float q : v) n += q * q * spectrum.
dx;
57 for (
float &q : v) q =
static_cast<float>(
static_cast<double>(q) / n);
61 spectrum.
states.push_back(ground);
62 spectrum.
states.push_back(excited);
82 errorMessage =
"Ramsey theory analysis is inconsistent";
86 const std::vector<RamseyFringeSample2D> fringe =
88 if (fringe.size() != 61u) {
89 errorMessage =
"Ramsey fringe scan has wrong sample count";
95 minP2 = std::min(minP2, sample.populationB);
96 maxP2 = std::max(maxP2, sample.populationB);
97 if (sample.populationA < -1.0e-8 || sample.populationB < -1.0e-8 ||
98 sample.populationA > 1.0001 || sample.populationB > 1.0001) {
99 errorMessage =
"Ramsey fringe population is out of range";
103 if (!(maxP2 - minP2 > 0.20)) {
104 errorMessage =
"Ramsey fringe contrast is unexpectedly small";
117 errorMessage =
"Hahn-echo theory timing is invalid";
120 const std::vector<RamseyFringeSample2D> echoFringe =
122 if (echoFringe.size() != 61u) {
123 errorMessage =
"Hahn-echo fringe scan has wrong sample count";
135 errorMessage =
"valid Ramsey ensemble config was rejected";
140 spectrum, sequence, ensemble, 0, 1, 1.0);
145 errorMessage =
"Ramsey static-detuning ensemble result is inconsistent";
148 const std::vector<RamseyEnsembleFringeSample2D> ensembleFringe =
150 spectrum, sequence, ensemble, 0.0, 30.0, 61, 0, 1, 1.0);
151 if (ensembleFringe.size() != 61u) {
152 errorMessage =
"Ramsey ensemble fringe scan has wrong sample count";
156 if (sample.meanPopulationA < -1.0e-8 || sample.meanPopulationB < -1.0e-8 ||
157 sample.meanPopulationA > 1.0001 || sample.meanPopulationB > 1.0001 ||
158 std::abs((sample.meanPopulationA + sample.meanPopulationB) - 1.0) > 3.0e-4) {
159 errorMessage =
"Ramsey ensemble fringe population is inconsistent";
168 spectrum, sequence, zeroWidth, 0, 1, 1.0);
172 errorMessage =
"zero-width Ramsey ensemble does not reduce to the nominal system";
179 errorMessage =
"invalid Ramsey ensemble config was accepted";
static RamseyEnsembleResult2D analyzeStaticDetuningEnsemble(const BoundStateSpectrum1D &spectrum, const RamseyPulseSequence2DConfig &sequence, const RamseyEnsemble2DConfig &ensemble, int stateA=0, int stateB=1, double hbar=1.0)
Performs analyze static detuning ensemble.
static std::vector< RamseyFringeSample2D > scanFreeEvolution(const BoundStateSpectrum1D &spectrum, const RamseyPulseSequence2DConfig &sequence, double minimumFreeTime, double maximumFreeTime, int sampleCount, int stateA=0, int stateB=1, double hbar=1.0)
Performs scan free evolution.
static std::vector< RamseyEnsembleFringeSample2D > scanFreeEvolutionEnsemble(const BoundStateSpectrum1D &spectrum, const RamseyPulseSequence2DConfig &sequence, const RamseyEnsemble2DConfig &ensemble, double minimumFreeTime, double maximumFreeTime, int sampleCount, int stateA=0, int stateB=1, double hbar=1.0)
Performs scan free evolution ensemble.