Skip to content

Commit 78bab8f

Browse files
committed
fixed bug in last commit (fixing issue labscript-suite#46) where we included truncation in the duration calculation used to determine the duration used as a parameter of the function.
This was incorrect, since the function should be defined over the original duration, but evaluated over the truncated duration. The fix was also applied to all ramping functions of AnalogQuantity.
1 parent 9c176b7 commit 78bab8f

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

labscript.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -1304,35 +1304,35 @@ def ramp(self, t, duration, initial, final, samplerate, units=None, truncation=1
13041304
message = ''.join(['WARNING: AnalogOutput \'%s\' has the same initial and final value at time t=%.10fs with duration %.10fs. In order to save samples and clock ticks this instruction is replaced with a constant output. '%(self.name, t, duration)])
13051305
sys.stderr.write(message + '\n')
13061306
else:
1307-
self.add_instruction(t, {'function': functions.ramp(round(t + truncation * duration, 10) - round(t, 10), initial, final), 'description': 'linear ramp',
1307+
self.add_instruction(t, {'function': functions.ramp(round(t + duration, 10) - round(t, 10), initial, final), 'description': 'linear ramp',
13081308
'initial time': t, 'end time': t + truncation * duration, 'clock rate': samplerate, 'units': units})
13091309
return truncation * duration
13101310

13111311
def sine(self, t, duration, amplitude, angfreq, phase, dc_offset, samplerate, units=None, truncation=1.):
13121312
self._check_truncation(truncation)
13131313
if truncation > 0:
1314-
self.add_instruction(t, {'function': functions.sine(duration, amplitude, angfreq, phase, dc_offset), 'description': 'sine wave',
1314+
self.add_instruction(t, {'function': functions.sine(round(t + duration, 10) - round(t, 10), amplitude, angfreq, phase, dc_offset), 'description': 'sine wave',
13151315
'initial time': t, 'end time': t + truncation*duration, 'clock rate': samplerate, 'units': units})
13161316
return truncation*duration
13171317

13181318
def sine_ramp(self, t, duration, initial, final, samplerate, units=None, truncation=1.):
13191319
self._check_truncation(truncation)
13201320
if truncation > 0:
1321-
self.add_instruction(t, {'function': functions.sine_ramp(duration, initial, final), 'description': 'sinusoidal ramp',
1321+
self.add_instruction(t, {'function': functions.sine_ramp(round(t + duration, 10) - round(t, 10), initial, final), 'description': 'sinusoidal ramp',
13221322
'initial time': t, 'end time': t + truncation*duration, 'clock rate': samplerate, 'units': units})
13231323
return truncation*duration
13241324

13251325
def sine4_ramp(self, t, duration, initial, final, samplerate, units=None, truncation=1.):
13261326
self._check_truncation(truncation)
13271327
if truncation > 0:
1328-
self.add_instruction(t, {'function': functions.sine4_ramp(duration, initial, final), 'description': 'sinusoidal ramp',
1328+
self.add_instruction(t, {'function': functions.sine4_ramp(round(t + duration, 10) - round(t, 10), initial, final), 'description': 'sinusoidal ramp',
13291329
'initial time': t, 'end time': t + truncation*duration, 'clock rate': samplerate, 'units': units})
13301330
return truncation*duration
13311331

13321332
def sine4_reverse_ramp(self, t, duration, initial, final, samplerate, units=None, truncation=1.):
13331333
self._check_truncation(truncation)
13341334
if truncation > 0:
1335-
self.add_instruction(t, {'function': functions.sine4_reverse_ramp(duration, initial, final), 'description': 'sinusoidal ramp',
1335+
self.add_instruction(t, {'function': functions.sine4_reverse_ramp(round(t + duration, 10) - round(t, 10), initial, final), 'description': 'sinusoidal ramp',
13361336
'initial time': t, 'end time': t + truncation*duration, 'clock rate': samplerate, 'units': units})
13371337
return truncation*duration
13381338

@@ -1373,7 +1373,7 @@ def exp_ramp(self, t, duration, initial, final, samplerate, zero=0, units=None,
13731373
raise LabscriptError(
13741374
'Truncation type for exp_ramp not supported. Must be either linear or exponential.')
13751375
if trunc_duration > 0:
1376-
self.add_instruction(t, {'function': functions.exp_ramp(duration, initial, final, zero), 'description': 'exponential ramp',
1376+
self.add_instruction(t, {'function': functions.exp_ramp(round(t + duration, 10) - round(t, 10), initial, final, zero), 'description': 'exponential ramp',
13771377
'initial time': t, 'end time': t + trunc_duration, 'clock rate': samplerate, 'units': units})
13781378
return trunc_duration
13791379

@@ -1412,14 +1412,14 @@ def exp_ramp_t(self, t, duration, initial, final, time_constant, samplerate, uni
14121412
raise LabscriptError(
14131413
'Truncation type for exp_ramp_t not supported. Must be either linear or exponential.')
14141414
if trunc_duration > 0:
1415-
self.add_instruction(t, {'function': functions.exp_ramp_t(duration, initial, final, time_constant), 'description': 'exponential ramp with time consntant',
1415+
self.add_instruction(t, {'function': functions.exp_ramp_t(round(t + duration, 10) - round(t, 10), initial, final, time_constant), 'description': 'exponential ramp with time consntant',
14161416
'initial time': t, 'end time': t + trunc_duration, 'clock rate': samplerate, 'units': units})
14171417
return trunc_duration
14181418

14191419
def piecewise_accel_ramp(self, t, duration, initial, final, samplerate, units=None, truncation=1.):
14201420
self._check_truncation(truncation)
14211421
if truncation > 0:
1422-
self.add_instruction(t, {'function': functions.piecewise_accel(duration, initial, final), 'description': 'piecewise linear accelleration ramp',
1422+
self.add_instruction(t, {'function': functions.piecewise_accel(round(t + duration, 10) - round(t, 10), initial, final), 'description': 'piecewise linear accelleration ramp',
14231423
'initial time': t, 'end time': t + truncation*duration, 'clock rate': samplerate, 'units': units})
14241424
return truncation*duration
14251425

@@ -1432,7 +1432,7 @@ def customramp(self, t, duration, function, *args, **kwargs):
14321432
def custom_ramp_func(t_rel):
14331433
"""The function that will return the result of the user's function,
14341434
evaluated at relative times t_rel from 0 to duration"""
1435-
return function(t_rel, duration, *args, **kwargs)
1435+
return function(t_rel, round(t + duration, 10) - round(t, 10), *args, **kwargs)
14361436

14371437
if truncation > 0:
14381438
self.add_instruction(t, {'function': custom_ramp_func, 'description': 'custom ramp: %s' % function.__name__,

0 commit comments

Comments
 (0)