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"