diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index bf09d030..c934ff18 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -3013,11 +3013,17 @@ "type": "boolean" }, "stop_duration": { - "default": 0, - "description": "Duration (s) the animal must stop for to lock its choice", - "minimum": 0, - "title": "Stop Duration", - "type": "number" + "$ref": "#/$defs/Distribution", + "default": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "description": "Duration (s) the animal must stop for to lock its choice" }, "time_to_collect_reward": { "default": 100000, diff --git a/src/Extensions/AddRewardSite.bonsai b/src/Extensions/AddRewardSite.bonsai index 31a4345d..68529ff8 100644 --- a/src/Extensions/AddRewardSite.bonsai +++ b/src/Extensions/AddRewardSite.bonsai @@ -121,64 +121,11 @@ ActivePatch - - RewardSpecification - - - - - - - - ActivePatch - - - RewardSpecification - - - OperantLogic - - - - - - - - - - ActivePatch - - - RewardSpecification.OperantLogic.StopDuration - - - StopDurationOffset - - - - - - - 1 - - - - - - - - - - - true - 0 - 100000 - 10 - - - + + + @@ -198,24 +145,10 @@ - - - + + + - - - - - - - - - - - - - - diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 617a6be2..34f127f6 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -8336,7 +8336,7 @@ public partial class OperantLogic private bool _isOperant; - private double _stopDuration; + private Distribution _stopDuration; private double _timeToCollectReward; @@ -8345,7 +8345,7 @@ public partial class OperantLogic public OperantLogic() { _isOperant = true; - _stopDuration = 0D; + _stopDuration = new Distribution(); _timeToCollectReward = 100000D; _graceDistanceThreshold = 10D; } @@ -8378,9 +8378,10 @@ public bool IsOperant /// /// Duration (s) the animal must stop for to lock its choice /// + [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("stop_duration")] [System.ComponentModel.DescriptionAttribute("Duration (s) the animal must stop for to lock its choice")] - public double StopDuration + public Distribution StopDuration { get { @@ -15277,6 +15278,51 @@ public override string ToString() } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Delay + { + + public Delay() + { + } + + protected Delay(Delay other) + { + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Delay(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Delay(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] @@ -16217,6 +16263,45 @@ private static System.IObservable Process(System.IObservable arguments) + { + var typeMapping = Type; + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Delay); + return System.Linq.Expressions.Expression.Call( + typeof(MatchDelay), + "Process", + new System.Type[] { returnType }, + System.Linq.Enumerable.Single(arguments)); + } + + + private static System.IObservable Process(System.IObservable source) + where TResult : Delay + { + return System.Reactive.Linq.Observable.Create(observer => + { + var sourceObserver = System.Reactive.Observer.Create( + value => + { + var match = value as TResult; + if (match != null) observer.OnNext(match); + }, + observer.OnError, + observer.OnCompleted); + return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); + }); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] @@ -17093,6 +17178,11 @@ public System.IObservable Process(System.IObservable(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -17264,6 +17354,7 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] diff --git a/src/Extensions/InstantiateSite.bonsai b/src/Extensions/InstantiateSite.bonsai index 6b82502b..e76d82d1 100644 --- a/src/Extensions/InstantiateSite.bonsai +++ b/src/Extensions/InstantiateSite.bonsai @@ -3,11 +3,11 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" + xmlns:p2="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" + xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" xmlns:dsp="clr-namespace:Bonsai.Dsp;assembly=Bonsai.Dsp" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" - xmlns:p2="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:p3="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" xmlns:bv="clr-namespace:BonVision;assembly=BonVision" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -151,8 +151,25 @@ OperantLogic.StopDuration + + + + + StopDurationOffset + + + + + + + + - TimeSpan.FromSeconds(it) + Math.Max(0, it) + Math.Max(0, it) + + + @@ -161,7 +178,7 @@ - PT0.0000001S + PT0S @@ -178,12 +195,18 @@ - + - - + + + + + + + + diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index b09276c6..25b90bf2 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -228,8 +228,10 @@ class OperantLogic(BaseModel): """ is_operant: bool = Field(default=True, description="Will the trial implement operant logic") - stop_duration: float = Field( - default=0, ge=0, description="Duration (s) the animal must stop for to lock its choice" + stop_duration: distributions.Distribution = Field( + default=scalar_value(0), + validate_default=True, + description="Duration (s) the animal must stop for to lock its choice", ) time_to_collect_reward: float = Field( default=100000, ge=0, description="Time(s) the animal has to collect the reward"