def simulate(self, current_base, current_rebound):

        sim = self.env.Simulation(**self.sim_kwargs)
        cell = self.cell_functor(sim=sim)

        soma_loc = cell.get_location('soma')

        cc1 = sim.create_currentclamp(name="cclamp",
                                      amp=current_base,
                                      dur="100:ms",
                                      delay="50:ms",
                                      cell_location=soma_loc)
        cc2 = sim.create_currentclamp(name="cclamp2",
                                      amp=-1 * current_rebound,
                                      dur="5:ms",
                                      delay="80:ms",
                                      cell_location=soma_loc)
        cc3 = sim.create_currentclamp(name="cclamp3",
                                      amp=-1 * current_rebound,
                                      dur="5:ms",
                                      delay="120:ms",
                                      cell_location=soma_loc)

        sim.record(cc1,
                   name="Current1",
                   what=CurrentClamp.Recordables.Current,
                   description="CurrentClampCurrent")
        sim.record(cc2,
                   name="Current2",
                   what=CurrentClamp.Recordables.Current,
                   description="CurrentClampCurrent")
        sim.record(cc3,
                   name="Current3",
                   what=CurrentClamp.Recordables.Current,
                   description="CurrentClampCurrent")

        sim.record(cell,
                   name="SomaVoltage",
                   cell_location=soma_loc,
                   what=Cell.Recordables.MembraneVoltage,
                   description="Response to iInj1=%s iInj2=%s" %
                   (current_base, current_rebound))

        res = sim.run()

        #SimulationSummariser(res, "/home/michael/Desktop/ForRoman.pdf")

        i = res.get_trace('Current1').convert_to_fixed(
            unit("0.5:ms")) + res.get_trace('Current2').convert_to_fixed(
                unit("0.5:ms")) + res.get_trace('Current3').convert_to_fixed(
                    unit("0.5:ms"))

        i = TraceConverter.rebase_to_fixed_dt(res.get_trace('Current1'
               ), dt=unit('0.5:ms')) \
            + TraceConverter.rebase_to_fixed_dt(res.get_trace('Current2'
               ), dt=unit('0.5:ms')) \
            + TraceConverter.rebase_to_fixed_dt(res.get_trace('Current3'
               ), dt=unit('0.5:ms'))
        i.tags = [StandardTags.Current]
        return (res.get_trace('SomaVoltage'), i)
    def simulate(self, current_base, current_rebound):

        sim = self.env.Simulation(**self.sim_kwargs)
        cell = self.cell_functor(sim=sim)

        soma_loc = cell.get_location('soma')

        cc1 = sim.create_currentclamp(name="cclamp", amp=current_base, dur="100:ms", delay="50:ms", cell_location=soma_loc)
        cc2 = sim.create_currentclamp(name="cclamp2", amp=-1*current_rebound, dur="5:ms", delay="80:ms", cell_location=soma_loc)
        cc3 = sim.create_currentclamp(name="cclamp3", amp=-1*current_rebound, dur="5:ms", delay="120:ms", cell_location=soma_loc)

        sim.record(cc1, name="Current1",      what=CurrentClamp.Recordables.Current,  description="CurrentClampCurrent")
        sim.record(cc2, name="Current2",      what=CurrentClamp.Recordables.Current,  description="CurrentClampCurrent")
        sim.record(cc3, name="Current3",      what=CurrentClamp.Recordables.Current,  description="CurrentClampCurrent")

        sim.record(cell, name="SomaVoltage", cell_location=soma_loc,  what=Cell.Recordables.MembraneVoltage,  description="Response to iInj1=%s iInj2=%s"%(current_base, current_rebound))

        res = sim.run()


        #SimulationSummariser(res, "/home/michael/Desktop/ForRoman.pdf")

        i = res.get_trace('Current1').convert_to_fixed(unit("0.5:ms")) + res.get_trace('Current2').convert_to_fixed(unit("0.5:ms")) + res.get_trace('Current3').convert_to_fixed(unit("0.5:ms"))

        i = TraceConverter.rebase_to_fixed_dt(res.get_trace('Current1'
               ), dt=unit('0.5:ms')) \
            + TraceConverter.rebase_to_fixed_dt(res.get_trace('Current2'
               ), dt=unit('0.5:ms')) \
            + TraceConverter.rebase_to_fixed_dt(res.get_trace('Current3'
               ), dt=unit('0.5:ms'))
        i.tags = [StandardTags.Current]
        return (res.get_trace('SomaVoltage'), i)
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# ----------------------------------------------------------------------

from morphforge.traces.traceobjpluginctrl import copy_trace_attrs
from morphforge.traces.traceobjpluginctrl import TraceMethodCtrl
from morphforge.traces import TraceFixedDT
from morphforge.traces import TraceVariableDT
from morphforge.traces import TracePiecewise
from morphforge.traces.methods.MMtrace_conversion import TraceConverter, TraceApproximator

# Conversion to: FixedDT:
#########################
TraceMethodCtrl.register(TraceFixedDT, 'convert_to_fixed', lambda tr, dt: copy_trace_attrs(tr_old=tr, tr_new=TraceConverter.rebase_to_fixed_dt(tr, dt)))
TraceMethodCtrl.register(TraceVariableDT, 'convert_to_fixed', lambda tr, dt: copy_trace_attrs(tr_old=tr, tr_new=TraceConverter.rebase_to_fixed_dt(tr, dt)))
TraceMethodCtrl.register(TracePiecewise, 'convert_to_fixed', lambda tr, dt: copy_trace_attrs(tr_old=tr, tr_new=TraceConverter.rebase_to_fixed_dt(tr, dt)))




# Conversion to VariableDT:
###########################
TraceMethodCtrl.register(
        TraceFixedDT,
        'convert_to_variable', 
        lambda tr, eps: copy_trace_attrs(tr_old=tr, tr_new=TraceConverter.reduce_to_variable_dt_trace(original_trace=tr, epsilon=eps)))

TraceMethodCtrl.register(
        TraceVariableDT,
 def wrapped_func(self, *args, **kwargs):
     tr_new = TraceConverter.rebase_to_fixed_dt(self, dt=fixed_trace_dt)
     return func(tr_new, *args, **kwargs)
 def wrapped_func(self, *args, **kwargs):
     tr_new = TraceConverter.rebase_to_fixed_dt(self, dt=fixed_trace_dt)
     return func(tr_new, *args, **kwargs)