api.task_logic

_images/AindIsoForceTaskLogic.svg
class aind_behavior_iso_force.task_logic.Action(value)[source]

Bases: IntFlag

Defines the action types

LEFT = 1[source]
NONE = 0[source]
PULL = 8[source]
PUSH = 4[source]
PUSH_PULL = 12[source]
RIGHT = 2[source]
RIGHT_LEFT = 3[source]
class aind_behavior_iso_force.task_logic.AindIsoForceTaskLogic(*, name: Literal['AindIsoForce'] = 'AindIsoForce', description: str = '', task_parameters: AindIsoForceTaskParameters, version: Literal['0.1.0-rc0'] = '0.1.0-rc0', stage_name: str | None = None)[source]

Bases: Task

model_config = {'extra': 'forbid', 'str_strip_whitespace': True, 'strict': True, 'validate_assignment': True, 'validate_default': True}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Literal['AindIsoForce'][source]
task_parameters: AindIsoForceTaskParameters[source]
version: Literal['0.1.0-rc0'][source]
class aind_behavior_iso_force.task_logic.AindIsoForceTaskParameters(*, rng_seed: float | None = None, aind_behavior_services_pkg_version: Annotated[Literal['0.13.5'], _PydanticGeneralMetadata(pattern='^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$')] = '0.13.5', environment: Environment, operation_control: OperationControl = OperationControl(force=ForceOperationControl(left=LoadCellInput(channel=0, is_inverted=False), right=LoadCellInput(channel=0, is_inverted=True), push=LoadCellInput(channel=1, is_inverted=False), pull=LoadCellInput(channel=1, is_inverted=True))), **extra_data: Any)[source]

Bases: TaskParameters

environment: Environment[source]
model_config = {'extra': 'allow', 'str_strip_whitespace': True, 'strict': True, 'validate_assignment': True, 'validate_default': True}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

operation_control: OperationControl[source]
class aind_behavior_iso_force.task_logic.Block(*, mode: Literal[BlockStatisticsMode.BLOCK] = BlockStatisticsMode.BLOCK, trials: List[Trial] = [], shuffle: bool = False, repeat_count: int | None = 0)[source]

Bases: BaseModel

mode: Literal[BlockStatisticsMode.BLOCK][source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

repeat_count: int | None[source]
shuffle: bool[source]
trials: List[Trial][source]
class aind_behavior_iso_force.task_logic.BlockGenerator(*, mode: Literal[BlockStatisticsMode.BLOCK_GENERATOR] = BlockStatisticsMode.BLOCK_GENERATOR, block_size: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=UniformDistribution(family=<DistributionFamily.UNIFORM: 'Uniform'>, distribution_parameters=UniformDistributionParameters(family=<DistributionFamily.UNIFORM: 'Uniform'>, min=50.0, max=60.0), truncation_parameters=None, scaling_parameters=None), trial_template: Trial)[source]

Bases: BaseModel

block_size: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
mode: Literal[BlockStatisticsMode.BLOCK_GENERATOR][source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

trial_template: Trial[source]
type aind_behavior_iso_force.task_logic.BlockStatistics = Annotated[Block | BlockGenerator, FieldInfo(annotation=NoneType, required=True, discriminator='mode')][source]
class aind_behavior_iso_force.task_logic.BlockStatisticsMode(value)[source]

Bases: str, Enum

Defines the mode of the environment

BLOCK = 'Block'[source]
BLOCK_GENERATOR = 'BlockGenerator'[source]
class aind_behavior_iso_force.task_logic.CrossingOutcome(*, action: Action, duration: float, start: Timestamped[ThresholdedJoystickForce], end: Timestamped[ThresholdedJoystickForce], is_valid_duration: bool, is_reward_action: bool)[source]

Bases: BaseModel

action: Action[source]
duration: float[source]
end: Timestamped[ThresholdedJoystickForce][source]
is_reward_action: bool[source]
is_valid_duration: bool[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

start: Timestamped[ThresholdedJoystickForce][source]
class aind_behavior_iso_force.task_logic.Environment(*, block_statistics: List[BlockStatistics], shuffle: bool = False, repeat_count: int | None = 0)[source]

Bases: BaseModel

block_statistics: List[BlockStatistics][source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

repeat_count: int | None[source]
shuffle: bool[source]
class aind_behavior_iso_force.task_logic.ForceOperationControl(*, left: LoadCellInput = LoadCellInput(channel=0, is_inverted=False), right: LoadCellInput = LoadCellInput(channel=0, is_inverted=True), push: LoadCellInput = LoadCellInput(channel=1, is_inverted=False), pull: LoadCellInput = LoadCellInput(channel=1, is_inverted=True))[source]

Bases: BaseModel

left: LoadCellInput[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

pull: LoadCellInput[source]
push: LoadCellInput[source]
right: LoadCellInput[source]
class aind_behavior_iso_force.task_logic.ForceThreshold(*, left: float | None = None, right: float | None = None, push: float | None = None, pull: float | None = None)[source]

Bases: BaseModel

from_action(action: Action) float | None[source]

Returns the force threshold for the given action.

Parameters:

action (Action) – The action to get the force threshold for.

Returns:

The force threshold for the action, or None if no threshold is set.

Return type:

Optional[float]

left: float | None[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

pull: float | None[source]
push: float | None[source]
right: float | None[source]
class aind_behavior_iso_force.task_logic.JoystickForce(*, left: float, right: float, push: float, pull: float, right_left: float, push_pull: float)[source]

Bases: BaseModel

left: float[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

pull: float[source]
push: float[source]
push_pull: float[source]
right: float[source]
right_left: float[source]
class aind_behavior_iso_force.task_logic.LoadCellInput(*, channel: Annotated[int, Ge(ge=0), Le(le=7)], is_inverted: bool = False)[source]

Bases: BaseModel

channel: Annotated[int, FieldInfo(annotation=NoneType, required=True, description='Load cell channel number available', metadata=[Ge(ge=0), Le(le=7)])][source]
is_inverted: bool[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class aind_behavior_iso_force.task_logic.OperantReward(*, reward_type: Literal['Operant'] = 'Operant', amount: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=1.0), truncation_parameters=None, scaling_parameters=None), delay: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.0), truncation_parameters=None, scaling_parameters=None), time_to_collect: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.5), truncation_parameters=None, scaling_parameters=None))[source]

Bases: Reward

model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

reward_type: Literal['Operant'][source]
time_to_collect: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
class aind_behavior_iso_force.task_logic.OperationControl(*, force: ForceOperationControl = ForceOperationControl(left=LoadCellInput(channel=0, is_inverted=False), right=LoadCellInput(channel=0, is_inverted=True), push=LoadCellInput(channel=1, is_inverted=False), pull=LoadCellInput(channel=1, is_inverted=True)))[source]

Bases: BaseModel

force: ForceOperationControl[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class aind_behavior_iso_force.task_logic.QuiescencePeriod(*, duration: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.5), truncation_parameters=None, scaling_parameters=None), force_threshold: ForceThreshold = ForceThreshold(left=None, right=None, push=None, pull=None))[source]

Bases: BaseModel

Defines a quiescence settings

duration: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
force_threshold: ForceThreshold[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class aind_behavior_iso_force.task_logic.ResponsePeriod(*, duration: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.5), truncation_parameters=None, scaling_parameters=None), force_threshold: ForceThreshold = ForceThreshold(left=None, right=None, push=None, pull=None), rewarded_action: Action = <Action.NONE: 0>, force_duration: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.05), truncation_parameters=None, scaling_parameters=None))[source]

Bases: BaseModel

Defines a response period

duration: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
force_duration: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
force_threshold: ForceThreshold[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

rewarded_action: Action[source]
class aind_behavior_iso_force.task_logic.Reward(*, reward_type: Literal['Pavlovian'] = 'Pavlovian', amount: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=1.0), truncation_parameters=None, scaling_parameters=None), delay: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.0), truncation_parameters=None, scaling_parameters=None))[source]

Bases: BaseModel

amount: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
delay: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

reward_type: Literal['Pavlovian'][source]
type aind_behavior_iso_force.task_logic.RewardPeriod = Annotated[Reward | OperantReward, FieldInfo(annotation=NoneType, required=True, discriminator='reward_type')][source]
class aind_behavior_iso_force.task_logic.ThresholdedJoystickForce(*, left: bool, right: bool, push: bool, pull: bool, joystick_force: JoystickForce)[source]

Bases: BaseModel

joystick_force: JoystickForce[source]
left: bool[source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

pull: bool[source]
push: bool[source]
right: bool[source]
class aind_behavior_iso_force.task_logic.Timestamped(*, seconds: float, value: T)[source]

Bases: BaseModel, Generic[T]

model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

seconds: float[source]
value: T[source]
class aind_behavior_iso_force.task_logic.Trial(*, inter_trial_interval: Distribution, <aind_behavior_services.schema._SgenTypenameAnnotation object at 0x7f8d1f41b050>]=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.5), truncation_parameters=None, scaling_parameters=None), quiescence_period: QuiescencePeriod | None = None, response_period: ResponsePeriod = ResponsePeriod(duration=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.5), truncation_parameters=None, scaling_parameters=None), force_threshold=ForceThreshold(left=None, right=None, push=None, pull=None), rewarded_action=<Action.NONE: 0>, force_duration=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.05), truncation_parameters=None, scaling_parameters=None)), reward_period: RewardPeriod = Reward(reward_type='Pavlovian', amount=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=1.0), truncation_parameters=None, scaling_parameters=None), delay=Scalar(family=<DistributionFamily.SCALAR: 'Scalar'>, distribution_parameters=ScalarDistributionParameter(family=<DistributionFamily.SCALAR: 'Scalar'>, value=0.0), truncation_parameters=None, scaling_parameters=None)))[source]

Bases: BaseModel

Defines a trial

inter_trial_interval: _SgenTypenameAnnotation object at 0x7f8d1f41b050>][source]
model_config = {}[source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

quiescence_period: QuiescencePeriod | None[source]
response_period: ResponsePeriod[source]
reward_period: RewardPeriod[source]
aind_behavior_iso_force.task_logic.normal_distribution_value(mean: float, std: float) NormalDistribution[source]

Helper function to create a normal distribution for a given range.

Parameters:
  • mean (float) – The mean value of the normal distribution.

  • std (float) – The standard deviation of the normal distribution.

Returns:

The normal distribution type.

Return type:

distributions.Normal

aind_behavior_iso_force.task_logic.scalar_value(value: float) Scalar[source]

Helper function to create a scalar value distribution for a given value.

Parameters:

value (float) – The value of the scalar distribution.

Returns:

The scalar distribution type.

Return type:

distributions.Scalar

aind_behavior_iso_force.task_logic.uniform_distribution_value(min: float, max: float) UniformDistribution[source]

Helper function to create a uniform distribution for a given range.

Parameters:
  • min (float) – The minimum value of the uniform distribution.

  • max (float) – The maximum value of the uniform distribution.

Returns:

The uniform distribution type.

Return type:

distributions.Uniform