PEBL 2.2
Psychology Experiment Building Language - Cross-platform psychological experiment development system
Study.h
Go to the documentation of this file.
1// Study.h - PEBL Study data model
2// Copyright (c) 2026 Shane T. Mueller
3// Licensed under GPL
4
5#ifndef STUDY_H
6#define STUDY_H
7
8#include <string>
9#include <vector>
10#include <map>
11#include <memory>
12
13// Parameter variant definition
15 std::string description;
16 std::string file; // Path to .par.json, empty for default
17
18 ParameterVariant() = default;
19 ParameterVariant(const std::string& desc, const std::string& f)
20 : description(desc), file(f) {}
21};
22
23// Test definition within a study
24struct Test {
25 std::string testName; // Test ID (e.g., "spatialgrid")
26 std::string displayName; // Display name (e.g., "Spatial Grid Memory")
27 std::string testPath;
29 std::map<std::string, ParameterVariant> parameterVariants;
30
31 Test() : included(true) {}
32
33 // Check if test directory exists
34 bool Exists(const std::string& studyPath) const;
35
36 // Get available languages (from translations/)
37 std::vector<std::string> GetAvailableLanguages(const std::string& studyPath) const;
38
39 // Get parameter variant or nullptr if not found
40 const ParameterVariant* GetVariant(const std::string& variantName) const;
41};
42
43// Study data model
44class Study {
45public:
46 Study();
47 ~Study();
48
49 // Load study from directory
50 static std::shared_ptr<Study> LoadFromDirectory(const std::string& path);
51
52 // Save study-info.json
53 bool Save();
54
55 // Create new empty study
56 static std::shared_ptr<Study> CreateNew(const std::string& path,
57 const std::string& name,
58 const std::string& author = "");
59
60 // Getters
61 const std::string& GetName() const { return mName; }
62 const std::string& GetDescription() const { return mDescription; }
63 int GetVersion() const { return mVersion; }
64 const std::string& GetAuthor() const { return mAuthor; }
65 const std::string& GetStudyToken() const { return mStudyToken; }
66 const std::string& GetUploadServerURL() const { return mUploadServerURL; }
67 bool GetUploadEnabled() const { return mUploadEnabled; }
68 const std::string& GetCreatedDate() const { return mCreatedDate; }
69 const std::string& GetModifiedDate() const { return mModifiedDate; }
70 const std::string& GetPath() const { return mPath; }
71 const std::vector<Test>& GetTests() const { return mTests; }
72
73 // Get 4-character study code from study name (alphanumeric only)
74 std::string GetStudyCode() const;
75
76 // Setters
77 void SetName(const std::string& name) { mName = name; UpdateModifiedDate(); }
78 void SetDescription(const std::string& desc) { mDescription = desc; UpdateModifiedDate(); }
79 void SetAuthor(const std::string& author) { mAuthor = author; UpdateModifiedDate(); }
80 void SetStudyToken(const std::string& token) { mStudyToken = token; UpdateModifiedDate(); }
81 void SetUploadServerURL(const std::string& url) { mUploadServerURL = url; UpdateModifiedDate(); }
82 void SetUploadEnabled(bool enabled) { mUploadEnabled = enabled; UpdateModifiedDate(); }
83 void IncrementVersion() { mVersion++; UpdateModifiedDate(); }
84
85 // Test management
86 bool AddTest(const Test& test);
87 bool RemoveTest(const std::string& testName);
88 Test* GetTest(const std::string& testName);
89 const Test* GetTest(const std::string& testName) const;
90
91 // Chain management
92 std::vector<std::string> GetChainFiles() const;
93 int GetChainCount() const;
94
95 // Upload configuration management
96 // Create or update upload.json for a specific test
97 bool CreateUploadConfigForTest(const std::string& testName);
98
99 // Get path to upload.json for a test (tests/testname/upload.json)
100 std::string GetUploadConfigPath(const std::string& testName) const;
101
102 // Check if test has upload.json
103 bool TestHasUploadConfig(const std::string& testName) const;
104
105 // Validation
107 std::vector<std::string> errors;
108 std::vector<std::string> warnings;
109 bool IsValid() const { return errors.empty(); }
110 };
111 ValidationResult Validate() const;
112
113private:
114 bool LoadFromJSON(const std::string& jsonPath);
115 bool SaveToJSON(const std::string& jsonPath);
116 void UpdateModifiedDate();
117 std::string GetCurrentISO8601Time() const;
118
119 std::string mPath; // Filesystem path to study directory
120 std::string mName;
121 std::string mDescription;
122 int mVersion;
123 std::string mAuthor;
124 std::string mStudyToken; // Study token from PEBLOnlinePlatform
125 std::string mUploadServerURL; // Server URL for uploading (e.g., https://pebl.example.com)
126 std::string mCreatedDate; // ISO 8601
127 std::string mModifiedDate; // ISO 8601
128 bool mUploadEnabled;
129 std::vector<Test> mTests;
130};
131
132#endif // STUDY_H
Definition Study.h:44
const std::string & GetUploadServerURL() const
Definition Study.h:66
Study()
Definition Study.cpp:92
bool TestHasUploadConfig(const std::string &testName) const
Definition Study.cpp:452
void SetAuthor(const std::string &author)
Definition Study.h:79
void SetDescription(const std::string &desc)
Definition Study.h:78
const std::vector< Test > & GetTests() const
Definition Study.h:71
const std::string & GetAuthor() const
Definition Study.h:64
Test * GetTest(const std::string &testName)
Definition Study.cpp:187
const std::string & GetName() const
Definition Study.h:61
bool Save()
Definition Study.cpp:124
void SetStudyToken(const std::string &token)
Definition Study.h:80
bool CreateUploadConfigForTest(const std::string &testName)
Definition Study.cpp:458
void SetName(const std::string &name)
Definition Study.h:77
std::string GetStudyCode() const
Definition Study.cpp:422
const std::string & GetCreatedDate() const
Definition Study.h:68
static std::shared_ptr< Study > CreateNew(const std::string &path, const std::string &name, const std::string &author="")
Definition Study.cpp:129
bool RemoveTest(const std::string &testName)
Definition Study.cpp:174
const std::string & GetModifiedDate() const
Definition Study.h:69
void IncrementVersion()
Definition Study.h:83
const std::string & GetStudyToken() const
Definition Study.h:65
bool GetUploadEnabled() const
Definition Study.h:67
std::vector< std::string > GetChainFiles() const
Definition Study.cpp:209
ValidationResult Validate() const
Definition Study.cpp:239
bool AddTest(const Test &test)
Definition Study.cpp:161
int GetVersion() const
Definition Study.h:63
int GetChainCount() const
Definition Study.cpp:235
void SetUploadServerURL(const std::string &url)
Definition Study.h:81
void SetUploadEnabled(bool enabled)
Definition Study.h:82
static std::shared_ptr< Study > LoadFromDirectory(const std::string &path)
Definition Study.cpp:100
std::string GetUploadConfigPath(const std::string &testName) const
Definition Study.cpp:448
const std::string & GetPath() const
Definition Study.h:70
const std::string & GetDescription() const
Definition Study.h:62
~Study()
Definition Study.cpp:97
std::string file
Definition Study.h:16
ParameterVariant(const std::string &desc, const std::string &f)
Definition Study.h:19
std::string description
Definition Study.h:15
ParameterVariant()=default
std::vector< std::string > warnings
Definition Study.h:108
std::vector< std::string > errors
Definition Study.h:107
bool IsValid() const
Definition Study.h:109
Definition Study.h:24
std::vector< std::string > GetAvailableLanguages(const std::string &studyPath) const
Definition Study.cpp:48
bool Exists(const std::string &studyPath) const
Definition Study.cpp:42
std::string displayName
Definition Study.h:26
std::string testPath
Definition Study.h:27
std::string testName
Definition Study.h:25
Test()
Definition Study.h:31
std::map< std::string, ParameterVariant > parameterVariants
Definition Study.h:29
const ParameterVariant * GetVariant(const std::string &variantName) const
Definition Study.cpp:80
bool included
Definition Study.h:28