File data_analysis/@entanglement_evaluation/calculatePulsedQuadratures.m changed (mode: 100644) (index 3585604..a674c8c) |
... |
... |
function [get_raw_data, close_raw_data] = get_raw_data_fct(obj, tracepair_ind) |
106 |
106 |
else |
else |
107 |
107 |
raw_data = complex( ampli_tr.fread(obj.samples_per_pulse),... |
raw_data = complex( ampli_tr.fread(obj.samples_per_pulse),... |
108 |
108 |
phase_tr.fread(obj.samples_per_pulse)); |
phase_tr.fread(obj.samples_per_pulse)); |
109 |
|
if (obj.pulse_pairs_coverage<1) && (~mod(pulse_count,2)) |
|
|
109 |
|
if (obj.deadtime_samples>0) && mod(pulse_count,2) % in between entangling and readout pulse |
|
110 |
|
% moves file pointer forward by deadtime_samples samples |
|
111 |
|
ampli_tr.fread(obj.deadtime_samples); |
|
112 |
|
phase_tr.fread(obj.deadtime_samples); |
|
113 |
|
end |
|
114 |
|
if (obj.pulse_pairs_coverage<1) && (~mod(pulse_count,2)) % after each pulse pair |
110 |
115 |
pp = pulse_count/2; |
pp = pulse_count/2; |
111 |
116 |
dead_time_ratio = floor(obj.samples_per_pulse/obj.pulse_pairs_coverage); |
dead_time_ratio = floor(obj.samples_per_pulse/obj.pulse_pairs_coverage); |
112 |
117 |
% moves file pointer to the next pp according to chosen covering |
% moves file pointer to the next pp according to chosen covering |
File data_analysis/@entanglement_evaluation/entanglement_evaluation.m changed (mode: 100644) (index daba0d9..ba1395a) |
... |
... |
classdef entanglement_evaluation < class_conveniences & entanglement_evaluation_ |
15 |
15 |
pulse_widths % for the future: a better version of pulse_gammas |
pulse_widths % for the future: a better version of pulse_gammas |
16 |
16 |
|
|
17 |
17 |
mech_frequencies@double vector % for each mode, in non-angular units |
mech_frequencies@double vector % for each mode, in non-angular units |
|
18 |
|
|
|
19 |
|
%% DEFINING WHICH RAW DATA TO USE |
|
20 |
|
deadtime = 0 % in sec |
|
21 |
|
% deadtime = 0: entangling and readout pulse are directly adjacent |
|
22 |
|
% deadtime > 0: entangling and readout pulse are directly adjacent |
|
23 |
|
|
18 |
24 |
pulse_pairs_coverage = 1 |
pulse_pairs_coverage = 1 |
19 |
25 |
% pulse_pair_coverage = 1: pulse pairs are "back to back", i.e. all raw data is used |
% pulse_pair_coverage = 1: pulse pairs are "back to back", i.e. all raw data is used |
20 |
26 |
% pulse_pair_coverage = 0.1: after one pulse pairs, we skip nine potential pulse pairs |
% pulse_pair_coverage = 0.1: after one pulse pairs, we skip nine potential pulse pairs |
|
... |
... |
classdef entanglement_evaluation < class_conveniences & entanglement_evaluation_ |
70 |
76 |
quad_order@double matrix |
quad_order@double matrix |
71 |
77 |
quad_labels@cell matrix |
quad_labels@cell matrix |
72 |
78 |
|
|
73 |
|
|
|
74 |
79 |
samples_per_pulse % @double scalar |
samples_per_pulse % @double scalar |
|
80 |
|
deadtime_samples@double scalar |
75 |
81 |
|
|
76 |
82 |
%% FROM MEASUREMENT OBJECT |
%% FROM MEASUREMENT OBJECT |
77 |
83 |
tracepairs_no@double scalar |
tracepairs_no@double scalar |
|
... |
... |
classdef entanglement_evaluation < class_conveniences & entanglement_evaluation_ |
192 |
198 |
samples_per_trace = obj.measurement.samples_per_trace; |
samples_per_trace = obj.measurement.samples_per_trace; |
193 |
199 |
end |
end |
194 |
200 |
|
|
|
201 |
|
function deadtime_samples = get.deadtime_samples(obj) |
|
202 |
|
deadtime_samples = ceil(obj.deadtime*obj.samplingrate); |
|
203 |
|
end |
|
204 |
|
|
195 |
205 |
function pulse_pairs_per_trace = get.pulse_pairs_per_trace(obj) |
function pulse_pairs_per_trace = get.pulse_pairs_per_trace(obj) |
196 |
|
pulse_pairs_per_trace = floor(floor(obj.samples_per_trace/(2*obj.samples_per_pulse))... |
|
197 |
|
*obj.pulse_pairs_coverage); |
|
|
206 |
|
samples_per_pulsepair = 2*obj.samples_per_pulse + obj.deadtime_samples; |
|
207 |
|
pulse_pairs_raw = floor(obj.samples_per_trace/samples_per_pulsepair); |
|
208 |
|
pulse_pairs_per_trace = floor(pulse_pairs_raw*obj.pulse_pairs_coverage); |
198 |
209 |
end |
end |
199 |
210 |
|
|
200 |
211 |
function shotnoise_theory = get.shotnoise_theory(obj) |
function shotnoise_theory = get.shotnoise_theory(obj) |
File data_analysis/unittests/entanglement_evaluation_test.m changed (mode: 100644) (index a44c3f2..50c1437) |
... |
... |
function run_inverted_test(shared) |
333 |
333 |
[-0.321838837984714, -0.040175061783999, 0.094340702342072, -0.236002490360790, -0.367180133703403, -0.050515242330064, 0.151784942728085, -0.358414152751479];... |
[-0.321838837984714, -0.040175061783999, 0.094340702342072, -0.236002490360790, -0.367180133703403, -0.050515242330064, 0.151784942728085, -0.358414152751479];... |
334 |
334 |
[0.783722707358365, 0.098497215865329, -0.236007779549885, 0.587370230126137, 0.880340233793472, 0.120530651668499, -0.358414152751479, 0.848215057271915]]); |
[0.783722707358365, 0.098497215865329, -0.236007779549885, 0.587370230126137, 0.880340233793472, 0.120530651668499, -0.358414152751479, 0.848215057271915]]); |
335 |
335 |
|
|
|
336 |
|
function deadtime_test(shared) |
|
337 |
|
ev = ev_setup_test(shared); |
|
338 |
|
ev.mech_frequencies = shared.mech_freqs; |
|
339 |
|
ev.opt_pulse_widths = 1e2*[1, 1]; |
|
340 |
|
ev.pulse_gammas = logspace(-1,1,10); |
|
341 |
|
pulse_pairs_per_trace = ev.pulse_pairs_per_trace; |
|
342 |
|
|
|
343 |
|
%% check that pulse_pairs_per_trace depends on deadtime as expected |
|
344 |
|
% trivial test |
|
345 |
|
ev.deadtime = 0; |
|
346 |
|
assertEqual(ev.pulse_pairs_per_trace, pulse_pairs_per_trace) |
|
347 |
|
% if the deadtime is the full duration of the trace, we do not get any pulse pairs |
|
348 |
|
ev.deadtime = ev.samples_per_trace/ev.samplingrate; |
|
349 |
|
assertEqual(ev.pulse_pairs_per_trace, 0) |
|
350 |
|
% if the deadtime is the full duration of the trace - 2*pulse_duration_samples, |
|
351 |
|
% we expect a single pulse pair |
|
352 |
|
ev.deadtime = (ev.samples_per_trace - 2*ev.samples_per_pulse)/ev.samplingrate; |
|
353 |
|
assertEqual(ev.pulse_pairs_per_trace, 1) |
|
354 |
|
|
|
355 |
|
%% check that the samples are skipped correctly |
|
356 |
|
ev.deadtime = 0.1; |
|
357 |
|
ev.deadtime_samples; |
|
358 |
|
empty_pulse = zeros(ev.samples_per_pulse,1); |
|
359 |
|
filled_void = 1E10*randn(ev.deadtime_samples, 1); |
|
360 |
|
fake_data = [empty_pulse; filled_void; empty_pulse; empty_pulse; filled_void; empty_pulse]; |
|
361 |
|
|
|
362 |
|
xfile = '.dummy_x_data.dat'; |
|
363 |
|
yfile = '.dummy_y_data.dat'; |
|
364 |
|
xfid = fopen(xfile, 'w'); |
|
365 |
|
yfid = fopen(yfile, 'w'); |
|
366 |
|
fwrite(xfid, fake_data, shared.precision); |
|
367 |
|
fwrite(yfid, fake_data, shared.precision); |
|
368 |
|
fclose(xfid); |
|
369 |
|
fclose(yfid); |
|
370 |
|
|
|
371 |
|
ev.measurement.add_trace_pair(... |
|
372 |
|
xfile, yfile,... |
|
373 |
|
'precision',shared.precision,... |
|
374 |
|
'DAQrange', 0,... |
|
375 |
|
'amplification', 1,... |
|
376 |
|
'signal_power_muW', 0); |
|
377 |
|
|
|
378 |
|
% should have two pulse pairs now |
|
379 |
|
assertEqual(ev.pulse_pairs_per_trace, 2); |
|
380 |
|
|
|
381 |
|
% should get 0 for the pulse quadratures |
|
382 |
|
% ev.deadtime_samples |
|
383 |
|
[T,ev] = evalc('ev.calculateModeVectors;'); |
|
384 |
|
[T,ev] = evalc('ev.calculatePulsedQuadratures(3);'); |
|
385 |
|
pulse_quads = [ev.pulse_trace{3}{:}]; |
|
386 |
|
assertEqual(pulse_quads, zeros(size(pulse_quads))) |
|
387 |
|
|
|
388 |
|
% should not get 0 for the pulse quadratures |
|
389 |
|
% if we slightly modify the interpulse deadtime |
|
390 |
|
ev.deadtime = 0.8*ev.deadtime; |
|
391 |
|
% ev.deadtime_samples |
|
392 |
|
[T,ev] = evalc('ev.calculatePulsedQuadratures(3);'); |
|
393 |
|
pulse_quads = [ev.pulse_trace{3}{:}]; |
|
394 |
|
assert(~isequal(pulse_quads, zeros(size(pulse_quads)))) |
|
395 |
|
|
|
396 |
|
delete(xfile); |
|
397 |
|
delete(yfile); |
|
398 |
|
|
336 |
399 |
function pulse_pairs_coverage_test(shared) |
function pulse_pairs_coverage_test(shared) |
337 |
400 |
ev = ev_setup_test(shared); |
ev = ev_setup_test(shared); |
338 |
401 |
ev.mech_frequencies = shared.mech_freqs; |
ev.mech_frequencies = shared.mech_freqs; |