MORK is an extension of Apple ResearchKit that facilitates easy serialization of ResearchKit data into the form required by the Patient Cloud Gateway.
Contact us at [email protected]
MORK adds a method to the ResearchKit ORKCollectionResult
class via a
category:
Returns an NSArray
containing the data, identifier, and date-entered for each
ORKStepResult
(if retrieving result data from an instance of ORKTaskResult
)
or ORKQuestionResult
(if retrieving result data from an instance of
ORKStepResult
) in the ORKCollectionResult
subclass:
@[
@{
@"data_value" : @"<value>",
@"item_oid" : @"<step identifier>",
@"date_time_entered" : @"<date entered>"
},
@{
@"data_value" : @"<value>",
@"item_oid" : @"<step identifier>",
@"date_time_entered" : @"<date entered>"
},
...
]
The NSArray
returned from the mork_getFieldDataFromResults
method can be
converted to JSON and sent to the Patient Cloud Gateway to create an entry in
Rave. An example JSON payload is as follows:
{
"form_data": {
"subject_name": "aabb99",
"log_line": 1,
"study_uuid": "a2c0da8c-4dfd-4ffd-b3d5-94c762086c2f",
"signature_date_time_entered": "2015-27-10T17:04:35",
"folder_oid": "SUBJECT",
"form_oid": "MYFORM",
"field_data": [
{
"data_value": "M",
"item_oid": "GENDER",
"date_time_entered": "2015-27-10T17:03:24"
},
{
"data_value": "1990-12-04T20:10:30",
"item_oid": "DOB",
"date_time_entered": "2015-27-10T17:03:37"
},
{
"data_value": "Sometimes",
"item_oid": "EXERCISE_FREQUENCY",
"date_time_entered": "2015-27-10T17:03:48"
},
{
"data_value": "7",
"item_oid": "PAIN_LEVEL",
"date_time_entered": "2015-27-10T17:03:56"
}
],
"site_oid": "Site",
"version": "1.0",
"device_id": "DFEBA156-C012-4AD2-957C-9995829BC3A7",
"signature_oid": "ACK_FIELD",
"rave_url": "http://rave-url.example.com",
"study_name": "MyStudy",
"record_oid": "PCFORM_LOG_LINE",
"subject_uuid": "bfe72729-ab34-4f97-bf03-18ea61fdc92e"
}
}
Most Rave fields can be represented by an ORKQuestionStep
. Special fields such as consent forms and form submission can be represented by
other subclasses of ORKStep
(ORKVisualConsentStep
, ORKCompletionStep
).
If multiple questions should be shown on a single, scrollable page, an ORKFormStep
can be used to encapsulate multiple ORKSteps
Fields shared by all Rave Architect Fields:
Rave Architect Field | ResearchKit Field |
---|---|
FieldOID | ORKStep.identifer |
Header Text | ORKStep.title |
Field Label (?) | ORKStep.text |
VariableFormat | See Formatting Section |
Many Rave and Patient Cloud Fields can be supported through configuration of existing ResearchKit Objects. For some Fields additional customization would be required (e.g. subclassing ORKQuestion).
Rave Control | ResearchKit Control |
---|---|
Text | ORKTextAnswerFormat, ORKNumericAnswerFormat |
Date Time | ORKDateAnswerFormat, ORKTimeIntervalAnswerFormat, ORKTimeOfDayAnswerFormat |
Drop Down List | ORKTextChoiceAnswerFormat |
Radio Button | ORKTextChoiceAnswerFormat |
Signature | ORKConsentReviewStep + ORKConsentSignature |
Patient Cloud Control | ResearchKit Control |
---|---|
Calendar Control | ORKDateAnswerFormat |
Timestamp | ORKTimeOfDayAnswerFormat |
Acknowledgement | ORKConsentReviewStep + ORKConsentSignature |
NoCloudDisplay | N/A |
Wong Baker | ORKImageChoiceAnswerFormat |
Bristol | ORKImageChoiceAnswerFormat can be subclassed to add support for vertical images |
VAS / VAS with Box | ORKScaleAnswerFormat |
NRS | ORKScaleAnswerFormat |
ResearchKit Object: ORKTextAnswerFormat
or ORKNumericAnswerFormat
Depending on the nature of the data, either text or a numeric value can be captured.
ResearchKit Object: ORKDateAnswerFormat
or ORKTimeIntervalAnswerFormat
or ORKTimeOfDayAnswerFormat
While technically the DateTime control could be represented by an ORKTextAnswerFormat
control, using an ORKDateAnswerFormat
will avoid the need to implement complicated Date validations.
Used to produce a sequence of Radio Buttons or a Drop Down
ResearchKit Object: ORKTextChoiceAnswerFormat
or ORKValuePickerAnswerFormat
An ORKTextChoiceAnswerFormat
will list all options at once, whereas a ORKValuePickerAnswerFormat
provides
a scrollable list that shows only a view items at once.
Rave Architect Field | ResearchKit Field |
---|---|
Data Dictionary | NSArray of ORKTextChoice |
User Data String | ORKTextChoice.text |
Coded Data | ORKTextChoice.value |
ResearchKit Object: ORKConsentReviewStep
+ ORKConsentSignature
The ORKConsentReviewStep
can be used to ask a subject for their consent and can produce an ORKConstentSignature
instance containing the relevant data.
ResearchKit provides Active Tasks for collecting data under "partial controlled conditions." Such tasks may include walking for a period of time, tapping the screen repeatedly, or completing a task to test memory.
Active Tasks return a hierarchy of ORKResult
objects containing the collected data. If the data is too large, it will be saved to a file and an ORKFileResult
object will be returned. Additionally, a ORKRecorderConfiguration
can be attached to an Active Step to process data while it is being collected.
The following Answer Formats provide basic input validation:
ResearchKit Object | Validation properties |
---|---|
ORKNumericAnserFormat |
minimum , maximum |
ORKScaleAnswerFormat |
minimum , maximum , step |
ORKContinuousScaleAnswerFormat |
minimum , maximum , maximumFractionDigits |
ORKTextAnswerFormat |
maximumLength , multipleLines |
ORKDateAnswerFormat |
minimumDate , maximumDate |
Basic Rave Formatting and Validation can be implemented in ResearchKit using the following:
Rave Formatting | ResearchKit Equivalent |
---|---|
$x | ORKTextAnswerFormat.maximumLength = x |
n | ORKNumericAnswerFormat.maximum = pow(10, n) - 1 |
n+ | ORKNumericAnswerFormat.minimum = pow(10, n-1) ORKNumericAnswerFormat.maximum = pow(10,n) - 1 |
For more advanced validations, the didFinishWithNavigationDirection
and stepViewControllerResultDidChange
methods from the ORKStepViewControllerDelegate may be implemented for finer-grained control over step navigation. Additionally the shouldPresentStep
method from the ORKTaskViewControllerDelegate may also be suitable for disallowing navigation after the user submits invalid data.
While Edit Check execution is not yet supported, dynamic Field visibility based on results can be accomplished by subclassing ORKOrderedTask
, overriding the stepAfterStep
and stepBeforeStep
methods. An example can be found in the ResearchKit Documentation.