class AbstractStimulus:

    def value_at_time_in_ms(self, time_point):
        return self.value_at_time_in_s(time_point / 1000)

    def value_at_time_in_s(self, time_point):
        raise NotImplementedError("This is an abstract class!")

    def get_stimulus_start_ms(self):
        raise NotImplementedError("This is an abstract class!")

    def get_stimulus_start_s(self):
        return self.get_stimulus_start_ms() / 1000

    def get_stimulus_duration_ms(self):
        raise NotImplementedError("This is an abstract class!")

    def get_stimulus_duration_s(self):
        return self.get_stimulus_duration_ms() / 1000

    def get_stimulus_end_ms(self):
        return self.get_stimulus_start_ms() + self.get_stimulus_duration_ms()

    def get_stimulus_end_s(self):
        return self.get_stimulus_end_ms() / 1000

    def get_amplitude(self):
        raise NotImplementedError("This is an abstract class!")