Skip to content
Snippets Groups Projects
Commit 10adc950 authored by Ehret's avatar Ehret
Browse files

add possibility to randomize phases

parent 3bd31dab
No related branches found
No related tags found
No related merge requests found
...@@ -125,6 +125,20 @@ bool ASFStudySetup::CheckPhases() const ...@@ -125,6 +125,20 @@ bool ASFStudySetup::CheckPhases() const
} }
} }
for(FString PhaseName : PhasesToOrderRandomize)
{
bool bPhaseExists = false;
for(int i=0; i<Phases.Num(); ++i)
{
if (Phases[i]->PhaseName == PhaseName) bPhaseExists = true;
}
if(!bPhaseExists)
{
FSFUtils::OpenMessageBox("Phase " + PhaseName + " cannot be randomized in order, since it does not exist!", true);
return false;
}
}
return true; return true;
} }
...@@ -173,10 +187,28 @@ TArray<USFCondition*> ASFStudySetup::GetAllConditionsForRun(int RunningParticipa ...@@ -173,10 +187,28 @@ TArray<USFCondition*> ASFStudySetup::GetAllConditionsForRun(int RunningParticipa
return TArray<USFCondition*>(); return TArray<USFCondition*>();
} }
//so we have to potentially swap some phases
TArray<int> PhasesToShuffleIndices;
for(int i=0; i<Phases.Num(); ++i)
{
if (PhasesToOrderRandomize.Contains(Phases[i]->PhaseName))
{
PhasesToShuffleIndices.Add(i);
}
}
TArray<int> LatinSquare = USFStudyFactor::GenerateLatinSquareOrder(RunningParticipantNumber, PhasesToShuffleIndices.Num());
TArray<USFCondition*> Conditions; TArray<USFCondition*> Conditions;
for (int i=0; i<Phases.Num(); ++i) for (int i=0; i<Phases.Num(); ++i)
{ {
Conditions.Append(Phases[i]->GenerateConditions(RunningParticipantNumber, i)); int ActualIndex = i;
if(PhasesToShuffleIndices.Contains(i))
{
//this one needs to be shuffled
const int IndexInShuffleArray = PhasesToShuffleIndices.Find(i);
ActualIndex = PhasesToShuffleIndices[LatinSquare[IndexInShuffleArray]];
}
Conditions.Append(Phases[ActualIndex]->GenerateConditions(RunningParticipantNumber, ActualIndex));
} }
return Conditions; return Conditions;
} }
...@@ -207,6 +239,14 @@ TSharedPtr<FJsonObject> ASFStudySetup::GetAsJson() const ...@@ -207,6 +239,14 @@ TSharedPtr<FJsonObject> ASFStudySetup::GetAsJson() const
} }
Json->SetArrayField("Phases", PhasesArray); Json->SetArrayField("Phases", PhasesArray);
TArray<TSharedPtr<FJsonValue>> PhasesToRandomize;
for (FString Phase : PhasesToOrderRandomize)
{
TSharedRef<FJsonValueString> JsonValue = MakeShared<FJsonValueString>(Phase);
PhasesToRandomize.Add(JsonValue);
}
Json->SetArrayField("PhasesToOrderRandomize", PhasesToRandomize);
Json->SetObjectField("FadeConfig", FadeConfig.GetAsJson()); Json->SetObjectField("FadeConfig", FadeConfig.GetAsJson());
Json->SetObjectField("ExperimenterViewConfig", ExperimenterViewConfig.GetAsJson()); Json->SetObjectField("ExperimenterViewConfig", ExperimenterViewConfig.GetAsJson());
if(UseGazeTracker == EGazeTrackerMode::NotTracking) Json->SetStringField("UseGazeTracker", "NotTracking"); if(UseGazeTracker == EGazeTrackerMode::NotTracking) Json->SetStringField("UseGazeTracker", "NotTracking");
...@@ -227,9 +267,16 @@ void ASFStudySetup::FromJson(TSharedPtr<FJsonObject> Json) ...@@ -227,9 +267,16 @@ void ASFStudySetup::FromJson(TSharedPtr<FJsonObject> Json)
Phase->FromJson(PhaseJson->AsObject()); Phase->FromJson(PhaseJson->AsObject());
Phases.Add(Phase); Phases.Add(Phase);
} }
PhasesToOrderRandomize.Empty();
TArray<TSharedPtr<FJsonValue>> PhasesToRandomize = Json->GetArrayField("PhasesToOrderRandomize");
for (TSharedPtr<FJsonValue> PhaseJson : PhasesToRandomize)
{
PhasesToOrderRandomize.Add(PhaseJson->AsString());
}
FadeConfig.FromJson(Json->GetObjectField("FadeConfig")); FadeConfig.FromJson(Json->GetObjectField("FadeConfig"));
ExperimenterViewConfig.FromJson(Json->GetObjectField("ExperimenterViewConfig")); ExperimenterViewConfig.FromJson(Json->GetObjectField("ExperimenterViewConfig"));
if(Json->GetStringField("UseGazeTracker") == "NotTracking") UseGazeTracker = EGazeTrackerMode::NotTracking; if(Json->GetStringField("UseGazeTracker") == "NotTracking") UseGazeTracker = EGazeTrackerMode::NotTracking;
if(Json->GetStringField("UseGazeTracker") == "HeadRotationOnly") UseGazeTracker = EGazeTrackerMode::HeadRotationOnly; if(Json->GetStringField("UseGazeTracker") == "HeadRotationOnly") UseGazeTracker = EGazeTrackerMode::HeadRotationOnly;
if(Json->GetStringField("UseGazeTracker") == "EyeTracking") UseGazeTracker = EGazeTrackerMode::EyeTracking; if(Json->GetStringField("UseGazeTracker") == "EyeTracking") UseGazeTracker = EGazeTrackerMode::EyeTracking;
......
...@@ -66,6 +66,10 @@ public: ...@@ -66,6 +66,10 @@ public:
UPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (Category = "Study Setup")) UPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (Category = "Study Setup"))
EGazeTrackerMode UseGazeTracker = EGazeTrackerMode::NotTracking; EGazeTrackerMode UseGazeTracker = EGazeTrackerMode::NotTracking;
//give names of phases wich should be randomized in their order between participants
UPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (Category = "Study Setup"))
TArray<FString> PhasesToOrderRandomize;
// ****************************************************************** // // ****************************************************************** //
// ******* Getters ************************************************** // // ******* Getters ************************************************** //
// ****************************************************************** // // ****************************************************************** //
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment