Changes for Brian 1 users ========================= .. contents:: :local: :depth: 1 .. note:: If you need to run existing Brian 1 simulations, have a look at :doc:`brian1_to_2/container`. In most cases, Brian 2 works in a very similar way to Brian 1 but there are some important differences to be aware of. The major distinction is that in Brian 2 you need to be more explicit about the definition of your simulation in order to avoid inadvertent errors. In some cases, you will now get a warning in other even an error -- often the error/warning message describes a way to resolve the issue. Specific examples how to convert code from Brian 1 can be found in the document :doc:`brian1_to_2/index`. Physical units -------------- The unit system now extends to arrays, e.g. ``np.arange(5) * mV`` will retain the units of volts and not discard them as Brian 1 did. Brian 2 is therefore also more strict in checking the units. For example, if the state variable ``v`` uses the unit of volt, the statement ``G.v = np.rand(len(G)) / 1000.`` will now raise an error. For consistency, units are returned everywhere, e.g. in monitors. If ``mon`` records a state variable v, ``mon.t`` will return a time in seconds and ``mon.v`` the stored values of ``v`` in units of volts. If you need a pure numpy array without units for further processing, there are several options: if it is a state variable or a recorded variable in a monitor, appending an underscore will refer to the variable values without units, e.g. ``mon.t_`` returns pure floating point values. Alternatively, you can remove units by diving by the unit (e.g. ``mon.t / second``) or by explicitly converting it (``np.asarray(mon.t)``). Here's an overview showing a few expressions and their respective values in Brian 1 and Brian 2: ================================ ================================ ================================= Expression Brian 1 Brian 2 ================================ ================================ ================================= 1 * mV 1.0 * mvolt 1.0 * mvolt np.array(1) * mV 0.001 1.0 * mvolt np.array([1]) * mV array([ 0.001]) array([1.]) * mvolt np.mean(np.arange(5) * mV) 0.002 2.0 * mvolt np.arange(2) * mV array([ 0. , 0.001]) array([ 0., 1.]) * mvolt (np.arange(2) * mV) >= 1 * mV array([False, True], dtype=bool) array([False, True], dtype=bool) (np.arange(2) * mV)[0] >= 1 * mV False False (np.arange(2) * mV)[1] >= 1 * mV DimensionMismatchError True ================================ ================================ ================================= Unported packages ----------------- The following packages have not (yet) been ported to Brian 2. If your simulation critically depends on them, you should consider staying with Brian 1 for now. * ``brian.tools`` * ``brian.library.modelfitting`` * ``brian.library.electrophysiology`` Replacement packages -------------------- The following packages that were included in Brian 1 have now been split into separate packages. * ``brian.hears`` has been updated to `brian2hears `_. Note that there is a legacy package ``brian2.hears`` included in ``brian2``, but this is now deprecated and will be removed in a future release. For now, see :ref:`brian_hears` for details. Removed classes/functions and their replacements ------------------------------------------------ In Brian 2, we have tried to keep the number of classes/functions to a minimum, but make each of them flexible enough to encompass a large number of use cases. A lot of the classes and functions that existed in Brian 1 have therefore been removed. The following table lists (most of) the classes that existed in Brian 1 but do no longer exist in Brian 2. You can consult it when you get a ``NameError`` while converting an existing script from Brian 1. The third column links to a document with further explanation and the second column gives either: 1. the equivalent class in Brian 2 (e.g. `StateMonitor` can record multiple variables now and therefore replaces ``MultiStateMonitor``); 2. the name of a Brian 2 class in square brackets (e.g. [`Synapses`] for ``STDP``), this means that the class can be used as a replacement but needs some additional code (e.g. explicitly specified STDP equations). The "More details" document should help you in making the necessary changes; 3. "string expression", if the functionality of a previously existing class can be expressed using the general string expression framework (e.g. `threshold=VariableThreshold('Vt', 'V')` can be replaced by `threshold='V > Vt'`); 4. a link to the relevant github issue if no equivalent class/function does exist so far in Brian 2; 5. a remark such as "obsolete" if the particular class/function is no longer needed. =============================== ================================= ================================================================ Brian 1 Brian 2 More details =============================== ================================= ================================================================ ``AdEx`` [`Equations`] :doc:`brian1_to_2/library` ``aEIF`` [`Equations`] :doc:`brian1_to_2/library` ``AERSpikeMonitor`` :issue:`298` :doc:`brian1_to_2/monitors` ``alpha_conductance`` [`Equations`] :doc:`brian1_to_2/library` ``alpha_current`` [`Equations`] :doc:`brian1_to_2/library` ``alpha_synapse`` [`Equations`] :doc:`brian1_to_2/library` ``AutoCorrelogram`` [`SpikeMonitor`] :doc:`brian1_to_2/monitors` ``biexpr_conductance`` [`Equations`] :doc:`brian1_to_2/library` ``biexpr_current`` [`Equations`] :doc:`brian1_to_2/library` ``biexpr_synapse`` [`Equations`] :doc:`brian1_to_2/library` ``Brette_Gerstner`` [`Equations`] :doc:`brian1_to_2/library` ``CoincidenceCounter`` [`SpikeMonitor`] :doc:`brian1_to_2/monitors` ``CoincidenceMatrixCounter`` [`SpikeMonitor`] :doc:`brian1_to_2/monitors` ``Compartments`` :issue:`443` :doc:`brian1_to_2/multicompartmental` ``Connection`` `Synapses` :doc:`brian1_to_2/synapses` ``Current`` :issue:`443` :doc:`brian1_to_2/multicompartmental` ``CustomRefractoriness`` [string expression] :doc:`brian1_to_2/neurongroup` ``DefaultClock`` `Clock` :doc:`brian1_to_2/networks_and_clocks` ``EmpiricalThreshold`` string expression :doc:`brian1_to_2/neurongroup` ``EventClock`` `Clock` :doc:`brian1_to_2/networks_and_clocks` ``exp_conductance`` [`Equations`] :doc:`brian1_to_2/library` ``exp_current`` [`Equations`] :doc:`brian1_to_2/library` ``exp_IF`` [`Equations`] :doc:`brian1_to_2/library` ``exp_synapse`` [`Equations`] :doc:`brian1_to_2/library` ``FileSpikeMonitor`` :issue:`298` :doc:`brian1_to_2/monitors` ``FloatClock`` `Clock` :doc:`brian1_to_2/networks_and_clocks` ``FunReset`` [string expression] :doc:`brian1_to_2/neurongroup` ``FunThreshold`` [string expression] :doc:`brian1_to_2/neurongroup` ``hist_plot`` no equivalent -- ``HomogeneousPoissonThreshold`` string expression :doc:`brian1_to_2/neurongroup` ``IdentityConnection`` `Synapses` :doc:`brian1_to_2/synapses` ``IonicCurrent`` :issue:`443` :doc:`brian1_to_2/multicompartmental` ``ISIHistogramMonitor`` [`SpikeMonitor`] :doc:`brian1_to_2/monitors` ``Izhikevich`` [`Equations`] :doc:`brian1_to_2/library` ``K_current_HH`` [`Equations`] :doc:`brian1_to_2/library` ``leak_current`` [`Equations`] :doc:`brian1_to_2/library` ``leaky_IF`` [`Equations`] :doc:`brian1_to_2/library` ``MembraneEquation`` :issue:`443` :doc:`brian1_to_2/multicompartmental` ``MultiStateMonitor`` `StateMonitor` :doc:`brian1_to_2/monitors` ``Na_current_HH`` [`Equations`] :doc:`brian1_to_2/library` ``NaiveClock`` `Clock` :doc:`brian1_to_2/networks_and_clocks` ``NoReset`` obsolete :doc:`brian1_to_2/neurongroup` ``NoThreshold`` obsolete :doc:`brian1_to_2/neurongroup` ``OfflinePoissonGroup`` [`SpikeGeneratorGroup`] :doc:`brian1_to_2/inputs` ``OrnsteinUhlenbeck`` [`Equations`] :doc:`brian1_to_2/library` ``perfect_IF`` [`Equations`] :doc:`brian1_to_2/library` ``PoissonThreshold`` string expression :doc:`brian1_to_2/neurongroup` ``PopulationSpikeCounter`` `SpikeMonitor` :doc:`brian1_to_2/monitors` ``PulsePacket`` [`SpikeGeneratorGroup`] :doc:`brian1_to_2/inputs` ``quadratic_IF`` [`Equations`] :doc:`brian1_to_2/library` ``raster_plot`` ``plot_raster`` (``brian2tools``) `brian2tools documentation `_ ``RecentStateMonitor`` no direct equivalent :doc:`brian1_to_2/monitors` ``Refractoriness`` string expression :doc:`brian1_to_2/neurongroup` ``RegularClock`` `Clock` :doc:`brian1_to_2/networks_and_clocks` ``Reset`` string expression :doc:`brian1_to_2/neurongroup` ``SimpleCustomRefractoriness`` [string expression] :doc:`brian1_to_2/neurongroup` ``SimpleFunThreshold`` [string expression] :doc:`brian1_to_2/neurongroup` ``SpikeCounter`` `SpikeMonitor` :doc:`brian1_to_2/monitors` ``StateHistogramMonitor`` [`StateMonitor`] :doc:`brian1_to_2/monitors` ``StateSpikeMonitor`` `SpikeMonitor` :doc:`brian1_to_2/monitors` ``STDP`` [`Synapses`] :doc:`brian1_to_2/synapses` ``STP`` [`Synapses`] :doc:`brian1_to_2/synapses` ``StringReset`` string expression :doc:`brian1_to_2/neurongroup` ``StringThreshold`` string expression :doc:`brian1_to_2/neurongroup` ``Threshold`` string expression :doc:`brian1_to_2/neurongroup` ``VanRossumMetric`` [`SpikeMonitor`] :doc:`brian1_to_2/monitors` ``VariableReset`` string expression :doc:`brian1_to_2/neurongroup` ``VariableThreshold`` string expression :doc:`brian1_to_2/neurongroup` =============================== ================================= ================================================================ List of detailed instructions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. toctree:: :maxdepth: 2 brian1_to_2/index