diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/01_introduction/index.html b/01_introduction/index.html new file mode 100644 index 0000000000..8d55d8acff --- /dev/null +++ b/01_introduction/index.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + + + + + + + + + Introduction - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Introduction

+
+Tl;DR - Advantages of the current schema representation +
    +
  • Rich contexts for a questionnaire with JSON-LD rather than a "flat" csv file.
  • +
  • A single source of curated assessments from ReproSchema Library
  • +
  • Each item (i.e question), activity (i.e questionnaire), and protocol +(i.e set of questionnaires) provides unique and persistent identifiers.
  • +
  • Versions of a given questionnaire can be tracked (e.g., PHQ-9, PHQ-8).
  • +
  • Allows, supports, and tracks internationalization (e.g. ABCD requires Spanish +and English forms).
  • +
  • Implementation agnostic – the schema can be used by several different software packages
  • +
  • Uses a linked data graph that can be validated using SHACL.
  • +
+
+

The problem

+

Cognitive and clinical questionnaires and assessments are used throughout +neuroscience. There is little consistency in assessment data acquisition or response +representation across studies or laboratories. Each project tends to use its own +format and data collection tool (e.g., paper, survey tools, RedCap, LORIS). In the +long run, this can be a source of a lot inefficiencies not only in terms data +curation but also by diminishing the value of the data less interoperable and +reusable. Imagine for example a researcher wanting to run a meta or mega-analysis +across several studies. To do this each one would not only need to know which +specific assessments were collected, but also how to relate different column names in +data spreadsheets to these assessments and across projects.

+

Several efforts have focused on linking the assessments themselves +through consistent terminologies and relationships that map to human cognition +(e.g., Cognitive Atlas, +Cognitive Paradigm Ontology). Other efforts such as the +National Institute for Mental Health (NIMH) Data Archive (NDA) and the National +Library of Medicine (NLM) Common Data Elements +have curated data elements corresponding to the items and calculated scores from +these questionnaires. However, these resources are often used to make data +consistent and reusable after, rather than during data collection. However, +harmonizing data after acquisition is resource intensive and this approach can +create a mismatch between collected and submitted data due to human error during +the harmonization process. To faciliate tedious harmonization efforts, several +projects, over the last two decades, have developed technologies to automatically +or interactively align and harmonize data elements (e.g., BIRN mediator, OpenRefine).

+

Given the dynamic and evolving nature of scientific investigation, many +questionnaires are altered when used to suit the requirements of a particular +study (e.g., different language, selective and new questions). This information +linking the specific information used when asking a question is often decoupled +from the data element representing the response to the question. When questions +are changed, researchers often shoehorn the response into an existing data +element, thus creating additional noise. Another drawback to these data elements +is that there is often no way to find out which version of a questionnaire was +used or how exactly it was scored.

+

Our solution

+

Our simpler solution is to enforce consistency directly at the data acquisition +stage by relying on a common schema that encodes how the different elements of +the data and / or the metadata relate to one another. This way, all this relational +information between these elements is captured from the very start as it is already +embedded in the formal description of the assessment. This solution was inspired +by the work of CEDAR Metadata Model.

+

In this project we provide a comprehensive set of tools to create and use the +schemas, while tracking the source of the schema, and changes to it over time. +The ReproSchema project covers:

+
    +
  1. a schema that can be found in the present repository +that describes the content and relations of the different elements of a +questionnaire or set of assessment tools,
  2. +
  3. an associated curated library of reusable common assessments and questionnaires,
  4. +
  5. a python package to help create +and validate the schemas of new assessments,
  6. +
  7. a user interface to visualize +questionnaire and collect data locally,
  8. +
  9. a backend server to capture the +data remotely.
  10. +
+

In brief, ReproSchema offers a way to standardize the underlying representation +of assessment tools. It comes with an open and accessible library of questionnaires +with appropriate conversion (e.g., from/to RedCap) +and data collection tools (e.g., MindLogger, +RedCap, LORIS - future work) +to enable a more consistent acquisition across projects, with data being +harmonized by design.

+

General description

+

With this schema we can represent:

+
    +
  • at the item level, the elements of an individual assessment, like the questions +in a questionnaire
  • +
  • at the activity level, an individual assessment that contains a set of items, +like for example a whole questionnaire with a several questions.
  • +
  • at the protocols level, a collection of activities performed by a participant, + e.g a set of questionnaires used in a study.
  • +
+

All those elements are specified text files in a JSON-LD format (JavaScript +Object Notation for Linked Data) and each item, activity, and protocol provides +unique and persistent identifiers.

+

Below we show an example of one of the possible ways a questionnaire with 3 questions +for a study could be organized with a protocol for that study, one activity +and 3 items.

+
├── activities
+│   └── activity1
+│       ├── activity1_schema.jsonld
+│       └── items
+│           ├── item1.jsonld
+│           ├── item2.jsonld
+│           └── item3.jsonld
+└── protocol
+    └── protocol1_schema.jsonld
+
+

The ReproSchema can also easily and flexibly specify details how the schema +for an assessment should be used. Independently of what solution is chosen in the +end by a researcher, a lab, or an institute to display the assessment to their +participants or patients (for example whether using an Web-app written in javascript +or a mobile app written in React-native), the schema can already specify:

+
    +
  • the input type to choose among several user-interface rendering options e.g., + a Likert scale, a dropdown menu, a multiple choice...
  • +
  • the visibility to decide whether a given item or activity should be +displayed to the user and under which conditions,
  • +
  • the compute logic of how the total score to the responses on a questionnaire +should be computed
  • +
+

The ReproSchema also allows for internationalization and multiple languages support +by making it very easy to keep everything the same +except the language displayed by the user interface.

+

Finally ReproSchema allows tracking of variations and version of different assessments +tools (e.g., PHQ-9, PHQ-8).

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/100_about_this_doc/index.html b/100_about_this_doc/index.html new file mode 100644 index 0000000000..c9e2b6f069 --- /dev/null +++ b/100_about_this_doc/index.html @@ -0,0 +1,583 @@ + + + + + + + + + + + + + + + + + + + + About this doc - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

About this documentation

+

This documentation is a work in progress and we wellcome any input: if something is missing or unclear, let us know by [opening an issue on our repository] (???).

+

Serving the doc locally

+

This project uses MkDocs tool with Material theme +and extra plugins to generate the website.

+

To test locally, you will need to install the Python dependencies. To do that, type the following commands:

+
git clone https://github.com/ReproNim/reproschema.git
+cd reproschema
+pip install -r requirements.txt
+
+

If you are working on your fork, simply replace https://github.com/ReproNim/reproschema.git +by git clone git@github.com/<username>/reproschema.git where <username> is your GitHub username

+

Once done, you need to run MkDocs. Simply type:

+
mkdocs serve
+
+

Finally, open up http://127.0.0.1:8000/ in your browser, and you +should see the default home page of the being displayed.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/20_project_structure/index.html b/20_project_structure/index.html new file mode 100644 index 0000000000..b97ea30576 --- /dev/null +++ b/20_project_structure/index.html @@ -0,0 +1,758 @@ + + + + + + + + + + + + + + + + + + + + + + Project structure - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Project structure

+

The ReproSchema project is organized around several github repositories. The +main ones are the following.

+ +

A brief description of how they all interact could be along the following lines:

+
+

If you're gearing up to launch a research project that requires standardized questionnaires, starting with reproschema-protocol-cookiecutter is your best first step. This tool sets you up with a custom protocol for your study, integrating handy features for a smooth setup right from the get-go. You'll have two main paths for adding questionnaires, or activities, to your study:

+

Option 1: Dive into reproschema-library where we've got a stash of ready-made questionnaires. Pick what fits your study, and you're good to go.

+

Option 2: Feeling creative? Craft your own activities with reproschema-py. This tool not only lets you design new activities but also checks that they meet all the ReproSchema standards.

+

Once your protocol is packed with all the activities you need, reproschema-ui automatically steps in. This part of the toolkit lets you see your study in action before you even start, making sure everything's set up just right for gathering data.

+
+

reproschema

+

GPT

+

The ReproSchema is like a blueprint for research projects, ensuring everyone collects data in a consistent way, which makes it easier to compare results from different studies. Here’s a simpler breakdown of what’s inside:

+
    +
  • Key Terms: These are the building blocks, like common types of answers and data formats, that help everyone understand and use data the same way.
  • +
  • How Data is Organized: ReproSchema sorts information into three main layers to keep things neat:
  • +
  • +
      +
    • Item Level: This is where individual questions or parts of a survey are detailed, allowing for close examination of each element.
    • +
    +
  • +
  • +
      +
    • Activity Level: At this stage, an entire survey or tool, made up of many items, is grouped together as an "Activity." It gives a complete overview of what the survey involves.
    • +
    +
  • +
  • +
      +
    • Protocols Level: The highest level, a "Protocol," bundles together all the activities a participant will do in a study, providing a comprehensive plan.
    • +
    +
  • +
  • Validation: The schema uses special standards (like SHACL files) to make sure the data and forms are up to standard and consistent.
  • +
  • Context Files: These files (contextsand terms) specify user-interface details and enhance schema flexibility. They define elements like input types, visibility conditions, and response options, supporting a tailored user experience. Additionally, they enable internationalization and multiple language support for broad applicability.
  • +
+

There is also an example +schema that can help give you a quick overview of what the protocol and activity +for a study might look like. For more details see the schema section.

+

reproschema-library

+

This repository hosts all the +community curated assessments and questionnaires that support the ReproSchema +standard.

+

Imagine this as curated library of reusable assessments and questionnaires, from +where you can easily pull a copy from rather than having to photocopy a new +questionnaire for your next participant or patient. Also you can mix and match +items from this library, knowing that the information is tracked in your protocol.

+

All assessments are listed in the activity folder +and are served here if you want to visualize +them.

+
    +
  • Standard Alignment: Each element in the library aligns with the ReproSchema framework, ensuring uniformity in terms and structure and upholding validation protocols for consistency across the ecosystem.
  • +
  • Research Protocol Integration: Researchers can utilize these assessments in various combinations to align with specific protocol needs, customizing their application per study objectives. This process can be integrated using the reproschema-protocol-cookiecutter for constructing user interfaces.
  • +
  • Collaborative Expansion: The library supports expansion through researcher contributions, allowing adding new, relevant assessments. These contributions are automatically validated using reproschema-py, maintaining the library’s standardization and relevance to evolving research demands.
  • +
+

reproschema-py

+

This is the ReproSchema python library. This is a python Command Line Interface (CLI) +that allows you to help create and validate the schemas of new assessments.

+
    +
  • Schema Development and Validation: This tool streamlines the creation and validation of new assessment schemas, verifying their alignment with ReproSchema's standards. It rigorously tests protocols, activities, and items to meet predefined specifications.
  • +
  • Consistency Assurance: Integrated with the ReproSchema-library and ReproSchema-Protocol-Cookiecutter, reproschema-py validates library assessments for quality and uniformity. It also automatically ensures the consistency of research protocols generated through the ReproSchema-Protocol-Cookiecutter.
  • +
  • Interoperability with REDCap: Its capability to convert between REDCap and ReproSchema formats exemplifies its role in harmonizing diverse data collection methods in complex, multi-faceted research environments.
  • +
+

reproschema-ui

+

This repository contains the code for the user-interface for the ReproSchema to +visualize questionnaires and collect data.

+

You can see it in action here

+

reproschema-protocol-cookiecutter

+

The reproschema-protocol-cookiecutter is a straightforward tool that helps you quickly set up a research study. It offers a ready-to-use template for organizing your study's structure and surveys, ensuring everything meets standard guidelines. Think of it as a quick-start guide to get your research project up and running smoothly. A step-by-step guide see here.

+

Other repositories

+

Demo-protocol

+

This repository contain a full fledge protocol that can be used as demonstration.

+

Reprolib-server

+

This contains some additional information on how the activities are served on +https://schema.repronim.org/rl/.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/30_schema/index.html b/30_schema/index.html new file mode 100644 index 0000000000..6374fb5e04 --- /dev/null +++ b/30_schema/index.html @@ -0,0 +1,1577 @@ + + + + + + + + + + + + + + + + + + + + + + Schema - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

The schema

+

The core model of ReproSchema was initially derived from the CEDAR Metadata Model. +To accommodate the needs of neuroimaging and other clinical and behavioral +protocols and assessments the schema has evolved significantly. These changes +include:

+
    +
  1. Alignment with schema.org and NIDM. +We have used schema.org classes and properties where it maps on to the needs of +the model and extended the model with NIDM elements to harmonize across ReproNim +projects.
  2. +
  3. +

    Allowing for structued nested elements in a schema +Protocol > Activity > [Activity | Field > ResponseOption]. This nested +structure provides a flexible schema to represent nested activities, which are +common in biomedical and other domains.

    +
    Protocol
    +├── Activity
    +│   ├── Field
    +│   │   └── ResponseOption
    +│   └── Field
    +│   │   └── ResponseOption
    +│   ├── Activity
    +│   │   ├── Field
    +│   │   │   └── ResponseOption
    +│   │   ...
    +│   ...
    +├── Activity
    +│   ...
    +...
    +
    +
  4. +
  5. +

    Interaction with git/Github or another Web service to deliver a new Protocol, +Activity or Field with a persistent URI, while tracking changes associated with +any of these elements. By making every Field represented through a persistent URI, +a data collection instrument can link the responses to the exact Field that was +used.

    +
  6. +
  7. Addition of computable elements that are derived from the values entered by a +participant.
  8. +
  9. Allowing for user interface (UI) elements that allow interaction between the schema +and any implementation that allows collecting data using the schema. By providing +some additional UI elements the provider can guide an implementor to allow for +more complex data collection behavior.
  10. +
+

The ReproSchema-UI is a prototype implementation of an UI that leverages these +different elements of the schema.

+

Properties of ReproSchema objects

+

This section lists the core ReproSchema objects and their allowed properties.

+ + + +

Protocol

+

A representation of a study which comprises one or more assessments.

+

URI: http://schema.repronim.org/Protocol

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
addPropertiesAn array of objects to describe the various properties added to assessments and fields.http://schema.repronim.org/addProperties
allowAn array of items indicating properties allowed on an activity or protocolhttp://schema.repronim.org/allow
computeAn array of objects indicating computations in an activity or protocol and maps it to the corresponding Field item. scoring logic is a subset of all computations that could be performed and not all computations will be scoring. For example, one may want to do conversion from one unit to another.http://schema.repronim.org/compute
landingPageAn element (by URL) to point to the protocol readme or landing page.http://schema.repronim.org/landingPage
messagesAn array of objects to define conditional messages in an activity or protocol.http://schema.repronim.org/messages
orderAn ordered list to describe the order in which the items of an assessment or protocol appear in the user interface.http://schema.repronim.org/order
overridePropertiesAn array of objects to override the various properties added to assessments and fields.http://schema.repronim.org/overrideProperties
preambleThe preamble for an assessmenthttp://schema.repronim.org/preamble
shuffleAn element (bool) to determine if the list of items is shuffled or in order.http://schema.repronim.org/shuffle
aboutThe subject matter of the Field.http://schema.org/about
audioAn embedded audio object.http://schema.org/audio
descriptionA description of the item.http://schema.org/description
imageAn image of the item. This can be a URL or a fully described ImageObject.http://schema.org/image
schemaVersionIndicates (by URL or string) a particular version of a schema used in some CreativeWork. For example, a document could declare a schemaVersion using an URL such as http://schema.org/version/2.0/ if precise indication of schema version was required by some application.http://schema.org/schemaVersion
versionThe version of the CreativeWork embodied by a specified resource.http://schema.org/version
videoAn embedded video object.http://schema.org/video
altLabelThe alternate label.http://www.w3.org/2004/02/skos/core#altLabel
prefLabelThe preferred label.http://www.w3.org/2004/02/skos/core#prefLabel
+

Activity

+

An assessment in a protocol.

+

URI: http://schema.repronim.org/Activity

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
addPropertiesAn array of objects to describe the various properties added to assessments and fields.http://schema.repronim.org/addProperties
allowAn array of items indicating properties allowed on an activity or protocolhttp://schema.repronim.org/allow
computeAn array of objects indicating computations in an activity or protocol and maps it to the corresponding Field item. scoring logic is a subset of all computations that could be performed and not all computations will be scoring. For example, one may want to do conversion from one unit to another.http://schema.repronim.org/compute
cronTableNonehttp://schema.repronim.org/cronTable
messagesAn array of objects to define conditional messages in an activity or protocol.http://schema.repronim.org/messages
orderAn ordered list to describe the order in which the items of an assessment or protocol appear in the user interface.http://schema.repronim.org/order
overridePropertiesAn array of objects to override the various properties added to assessments and fields.http://schema.repronim.org/overrideProperties
preambleThe preamble for an assessmenthttp://schema.repronim.org/preamble
shuffleAn element (bool) to determine if the list of items is shuffled or in order.http://schema.repronim.org/shuffle
aboutThe subject matter of the Field.http://schema.org/about
audioAn embedded audio object.http://schema.org/audio
citationA citation or reference to another creative work, such as another publication, web page, scholarly article, etc.http://schema.org/citation
descriptionA description of the item.http://schema.org/description
imageAn image of the item. This can be a URL or a fully described ImageObject.http://schema.org/image
schemaVersionIndicates (by URL or string) a particular version of a schema used in some CreativeWork. For example, a document could declare a schemaVersion using an URL such as http://schema.org/version/2.0/ if precise indication of schema version was required by some application.http://schema.org/schemaVersion
versionThe version of the CreativeWork embodied by a specified resource.http://schema.org/version
videoAn embedded video object.http://schema.org/video
altLabelThe alternate label.http://www.w3.org/2004/02/skos/core#altLabel
prefLabelThe preferred label.http://www.w3.org/2004/02/skos/core#prefLabel
+

Field

+

An item in an assessment.

+

URI: http://schema.repronim.org/Field

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
additionalNotesObjA set of objects to define notes in a field. For example, most Redcap and NDA data dictionaries have notes for each item which needs to be captured in reproschema.http://schema.repronim.org/additionalNotesObj
inputTypeAn element to describe the input type of a Field item.http://schema.repronim.org/inputType
preambleThe preamble for an assessmenthttp://schema.repronim.org/preamble
responseOptionsAn element (object or by URL)to describe the properties of response of the Field item.http://schema.repronim.org/responseOptions
aboutThe subject matter of the Field.http://schema.org/about
audioAn embedded audio object.http://schema.org/audio
descriptionA description of the item.http://schema.org/description
imageAn image of the item. This can be a URL or a fully described ImageObject.http://schema.org/image
isPartOfIndicates an item or CreativeWork that this item, or CreativeWork (in some sense), is part of.http://schema.org/isPartOf
questionA sub property of object. A question.http://schema.org/question
readonlyValueWhether or not a property is mutable. Default is false. Specifying this for a property that also has a value makes it act similar to a "hidden" input in an HTML form.http://schema.org/readonlyValue
schemaVersionIndicates (by URL or string) a particular version of a schema used in some CreativeWork. For example, a document could declare a schemaVersion using an URL such as http://schema.org/version/2.0/ if precise indication of schema version was required by some application.http://schema.org/schemaVersion
versionThe version of the CreativeWork embodied by a specified resource.http://schema.org/version
videoAn embedded video object.http://schema.org/video
altLabelThe alternate label.http://www.w3.org/2004/02/skos/core#altLabel
prefLabelThe preferred label.http://www.w3.org/2004/02/skos/core#prefLabel
+

AdditionalProperty

+

An object to describe the various properties added to assessments and fields.

+

URI: http://schema.repronim.org/AdditionalProperty

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
allowAn array of items indicating properties allowed on an activity or protocolhttp://schema.repronim.org/allow
isAboutA pointer to the node describing the item.http://schema.repronim.org/isAbout
isVisAn element to describe (by boolean or conditional statement) visibility conditions of items in an assessment.http://schema.repronim.org/isVis
limitAn element to limit the duration (uses ISO 8601) this activity is allowed to be completed by once activity is available.http://schema.repronim.org/limit
maxRetakesDefines number of times the item is allowed to be redone.http://schema.repronim.org/maxRetakes
randomMaxDelayPresent activity/item within some random offset of activity available time up to the maximum specified by this ISO 8601 durationhttp://schema.repronim.org/randomMaxDelay
scheduleAn element to set make activity available/repeat info using ISO 8601 repeating interval format.http://schema.repronim.org/schedule
variableNameThe name used to represent an item.http://schema.repronim.org/variableName
valueRequiredWhether the property must be filled in to complete the action. Default is false.http://schema.org/valueRequired
prefLabelThe preferred label.http://www.w3.org/2004/02/skos/core#prefLabel
+

OverrideProperty

+

An object to override the various properties added to assessments and fields.

+

URI: http://schema.repronim.org/OverrideProperty

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
isAboutA pointer to the node describing the item.http://schema.repronim.org/isAbout
isVisAn element to describe (by boolean or conditional statement) visibility conditions of items in an assessment.http://schema.repronim.org/isVis
limitAn element to limit the duration (uses ISO 8601) this activity is allowed to be completed by once activity is available.http://schema.repronim.org/limit
maxRetakesDefines number of times the item is allowed to be redone.http://schema.repronim.org/maxRetakes
randomMaxDelayPresent activity/item within some random offset of activity available time up to the maximum specified by this ISO 8601 durationhttp://schema.repronim.org/randomMaxDelay
scheduleAn element to set make activity available/repeat info using ISO 8601 repeating interval format.http://schema.repronim.org/schedule
variableNameThe name used to represent an item.http://schema.repronim.org/variableName
valueRequiredWhether the property must be filled in to complete the action. Default is false.http://schema.org/valueRequired
prefLabelThe preferred label.http://www.w3.org/2004/02/skos/core#prefLabel
+

UnitOption

+

An object to represent a human displayable name alongside the more formal value for units.

+

URI: http://schema.repronim.org/UnitOption

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
valueThe value for each option in choices or in additionalNotesObjhttp://schema.repronim.org/value
prefLabelThe preferred label.http://www.w3.org/2004/02/skos/core#prefLabel
+

ResponseOption

+

An element (object or by URL)to describe the properties of response of the Field item.

+

URI: http://schema.repronim.org/ResponseOption

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
choicesAn array to list the available options for response of the Field item.http://schema.repronim.org/choices
datumTypeIndicates what type of datum the response is (e.g. range,count,scalar etc.) for the Field item.http://schema.repronim.org/datumType
multipleChoiceIndicates (by bool) if response for the Field item has one or more answer.http://schema.repronim.org/multipleChoice
unitOptionsA list of objects to represent a human displayable name alongside the more formal value for units.http://schema.repronim.org/unitOptions
valueTypeThe type of the response of an item. For example, string, integer, etc.http://schema.repronim.org/valueType
maxValueThe upper value of some characteristic or property.http://schema.org/maxValue
minValueThe lower value of some characteristic or property.http://schema.org/minValue
unitCodeThe unit of measurement given using the UN/CEFACT Common Code (3 characters) or a URL. Other codes than the UN/CEFACT Common Code may be used with a prefix followed by a colon.http://schema.org/unitCode
+

Choice

+

An object to describe a response option.

+

URI: http://schema.repronim.org/Choice

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
valueThe value for each option in choices or in additionalNotesObjhttp://schema.repronim.org/value
imageAn image of the item. This can be a URL or a fully described ImageObject.http://schema.org/image
nameThe name of the item.http://schema.org/name
+

ComputeSpecification

+

An object to define computations in an activity or protocol.

+

URI: http://schema.repronim.org/ComputeSpecification

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
jsExpressionA JavaScript expression to compute a score from other variables.http://schema.repronim.org/jsExpression
variableNameThe name used to represent an item.http://schema.repronim.org/variableName
+

MessageSpecification

+

An object to define messages in an activity or protocol.

+

URI: http://schema.repronim.org/MessageSpecification

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
jsExpressionA JavaScript expression to compute a score from other variables.http://schema.repronim.org/jsExpression
messageThe message to be conditionally displayed for an item.http://schema.repronim.org/message
+

AdditionalNoteObj

+

A set of objects to define notes in a field. For example, most Redcap and NDA data dictionaries have notes for each item which needs to be captured in reproschema

+

URI: http://schema.repronim.org/AdditionalNoteObj

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
columnAn element to define the column name where the note was taken from.http://schema.repronim.org/column
sourceAn element to define the source (eg. RedCap, NDA) where the note was taken from.http://schema.repronim.org/source
valueThe value for each option in choices or in additionalNotesObjhttp://schema.repronim.org/value
+

ResponseActivity

+

Captures information about some action that took place. It also links to information (entities) that were used during the activity

+

URI: http://schema.repronim.org/ResponseActivity

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
endedAtTimeNonehttp://www.w3.org/ns/prov#endedAtTime
generatedNonehttp://www.w3.org/ns/prov#generated
startedAtTimeNonehttp://www.w3.org/ns/prov#startedAtTime
usedNonehttp://www.w3.org/ns/prov#used
wasAssociatedWithNonehttp://www.w3.org/ns/prov#wasAssociatedWith
inLanguageThe language of the content or performance or used in an action. Please use one of the language codes from the IETF BCP 47 standard. See also [[availableLanguage]].http://schema.org/inLanguage
+

Response

+

Describes the response of an item.

+

URI: http://schema.repronim.org/Response

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
wasAttributedToNonehttp://www.w3.org/ns/prov#wasAttributedTo
isAboutA pointer to the node describing the item.http://schema.repronim.org/isAbout
valueThe value for each option in choices or in additionalNotesObjhttp://schema.repronim.org/value
+

Participant

+

An Agent describing characteristics associated with a participant.

+

URI: http://schema.repronim.org/Participant

+ + + + + + + + + + + + + + + +
NameDescriptionURI
subject_idThe identifier of a participanthttp://purl.org/nidash/nidm#subject_id
+

SoftwareAgent

+

Captures information about some action that took place. It also links to information (entities) that were used during the activity

+

URI: http://schema.repronim.org/SoftwareAgent

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionURI
urlURL of the item.http://schema.org/url
versionThe version of the CreativeWork embodied by a specified resource.http://schema.org/version
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000000..043ac1cbd5 --- /dev/null +++ b/404.html @@ -0,0 +1,490 @@ + + + + + + + + + + + + + + + + + + ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/41_create_new_protocol/index.html b/41_create_new_protocol/index.html new file mode 100644 index 0000000000..32744e107f --- /dev/null +++ b/41_create_new_protocol/index.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + + + + + + + + + Create a research protocol - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Creating a Research Protocol Using Cookiecutter

+

Ready for your first ReproSchema project?! We are going to use the Reproschema Protocol Cookiecutter to create a demo protocol.

+

Getting Started

+
    +
  1. Prerequisite: Ensure you have Git and Cookiecutter installed on your system. If not, please refer to the installation guides for Git and Cookiecutter.
  2. +
  3. Generate Your Repository: Use the Reproschema Protocol Cookiecutter to create a new repository for your research protocol. Run the following command in your terminal:
  4. +
+
cookiecutter gh:ReproNim/reproschema-protocol-cookiecutter
+
+
    +
  1. Follow the prompts to customize your new protocol, more details see here
  2. +
+

Customizing Your Protocol

+

Once you run the Cookiecutter command, you will be prompted to make choices for your protocol, ranging from 1-5. These choices generate corresponding activities in your repository. Here's what you can do with these activities:

+
    +
  1. Use as Templates: The activities created based on your choices serve as templates. You can use these to understand the structure and elements within the activities folder. This is particularly useful if you're new to ReproSchema. By exploring these templates, you'll get a clearer picture of how activities are structured and what kind of information they contain.
  2. +
  3. Delete and Start Fresh: Alternatively, if you already have a clear idea of what your protocol needs, you can delete these generated activities. This allows you to start from scratch, creating activities that are tailored specifically to your research needs.
  4. +
+

The inclusion of activity choices aims to provide users with a practical understanding of how activities are structured within ReproSchema protocols. Whether you use these as a starting point or prefer to create your own from the ground up, these templates are there to guide you in structuring your research protocol effectively.

+

We provide more detailed instructions for customizing your protocol in the following pages using reproschema-demo-protocol as an example.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/42_adopt_assessments/index.html b/42_adopt_assessments/index.html new file mode 100644 index 0000000000..3ce3ae4900 --- /dev/null +++ b/42_adopt_assessments/index.html @@ -0,0 +1,729 @@ + + + + + + + + + + + + + + + + + + + + + + Adopt assessments from the library - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + +

Adopting Assessments from the reproschema-library

+

This part focuses on how to select and integrate assessments from the reproschema-library into your research protocol, an essential step in crafting a comprehensive study. The chosen assessments are to be placed in the activities folder within your repository. This folder serves as the central hub for various assessments or activities that collectively form your research protocol.

+

Each activity or assessment within this activities folder is typically structured around a file named with a suffix _schema. This file defines the overall framework of the assessment. Accompanying this, if an assessment comprises specific questions, these are organized in a subfolder titled items within the respective activity's directory. It's important to note that if an assessment is directly taken from the ReproSchema-library without any customization, the creation of an items subfolder is not necessary, as the itemized questions are predefined in the library.

+

To illustrate this process, we will use two specific types of assessments from reproschema-library: demographics and psychological questions. The latter represents a composite assessment created from multiple pre-existing assessments within the library. This example demonstrates how to combine different elements from the library to construct a bespoke assessment tailored to the unique demands of your research protocol.

+

Step 1: Understand the structure of a *_schema file throught this exemplar file

+
    +
  1. Context (@context): This field provides references to the context definitions. In this schema, it links to the generic context of ReproSchema and the specific context for the items in the repository, defined by the URL with the "rl" key. This context helps to interpret the terms used within the schema.
  2. +
  3. Type (@type): Defined as "reproschema:Activity," this indicates the nature of the document, specifying that it is an activity within the ReproSchema framework.
  4. +
  5. Identifier (@id): The unique identifier for this specific schema is "activity1_schema." This ID uniquely distinguishes this activity from others in the repository.
  6. +
  7. PrefLabel: This is the human-readable name of the activity, here given as "Screening." It serves as a clear and concise title for the activity.
  8. +
  9. Description: Provides a brief overview of the activity, in this case, "example of an activity."
  10. +
  11. SchemaVersion and Version: These fields indicate the versions of the ReproSchema being used ("1.0.0-rc2" means “1.0.0 Release Candidate 2”) and the version of this particular activity schema ("0.0.1"), respectively.
  12. +
  13. UI Configuration: This section specifies how the activity will be presented to users. It includes:
      +
    • addProperties: Lists the variables and corresponding items collected in the activity. For example, the variable document_upload_item is about the item items/document_upload_item and is always visible (isVis: true). It allows for the item to be skipped (reproschema:Skipped).
    • +
    • order: Dictates the sequence in which items will appear in the UI. Here, it specifies that "items/document_upload_item" will be the first (and only) item.
    • +
    • shuffle: Indicates whether the order of items should be randomized. In this example, it is set to false, meaning the order is fixed.
    • +
    • allow: Defines additional UI functionalities. Here, it includes reproschema:AutoAdvance for automatic progression and reproschema:AllowExport to enable data export.
    • +
    +
  14. +
+

Step 2: Customizing the schema file for demographics using existing assessments from reproschema-library

+

This step involves precise modifications, particularly in the @context and addProperties sections, to ensure the schema accurately reflects the demographic data you aim to collect.

+
    +
  1. +

    Adjusting the @context for Demographics:

    +

    In addition to the standard ReproSchema context, we've added a specific link in the "@context" section for demographics:

    +

    "demo": "https://raw.githubusercontent.com/ReproNim/reproschema-library/[commitID]/demographics_and_background_information_v1/items/"

    +

    Labeling this link as "demo" directs the schema to the location in the ReproSchema-library where items for demographics and background information are defined. We use the link with a specific commit ID to ensure the consistency of the assessment version. This contextual link allows the schema to access the detailed structures and definitions needed for each demographic item.

    +
  2. +
  3. +

    Customizing "addProperties" for Demographic Variables:

    +

    In the "addProperties" section, we define each variable that corresponds to a demographic question. For example:

    +

    { +"variableName": "year_of_birth", +"isAbout": "demo:year_of_birth" +}

    +

    The "variableName": "year_of_birth" is where you specify the variable as the participant's year of birth. +The "isAbout": "demo:year_of_birth" part establishes a link to the detailed structure of this item in the ReproSchema-library. The "demo:" prefix references the additional context you've added, guiding the schema to the correct location for the structure and details of the "year_of_birth" item.

    +

    See the outcome file here

    +
  4. +
+

Step 3: Integrating multiple assessments

+

Different from demograpgics, psychological_questionnaire_schema combines assessments, such as PHQ-9, GAD7, PC-PTSD-5, and demographics from reproschema-library.

+
    +
  1. +

    Contextual setup (@context):

    +

    The @context section is expanded to include not only the generic ReproSchema context but also specific links to the ReproSchema-library. This enables the schema to access a broader range of predefined items and assessments. For the psychological questionnaire, two context links are established:

    +

    "@context": [ +"https://raw.githubusercontent.com/ReproNim/reproschema/1.0.0-rc4/contexts/generic", + { + "activities": "https://raw.githubusercontent.com/ReproNim/reproschema-library/[commitID]/activities/", + "demo": "https://raw.githubusercontent.com/ReproNim/reproschema-library/[commitID]/activities/demographics_and_background_information_v1/items/" + } + ]

    +

    A link to the activities in the reproschema-library (activities: ) and a link for demographics items (demo: ), both are commit-specific. This indicates that we will combine different assessments from those two parts.

    +
  2. +
  3. +

    Defining the activity (@type, @id, prefLabel, etc.):

    +

    The standard fields like @type, @id, prefLabel, description, preamble, schemaVersion, and version define the nature and purpose of the psychological questionnaire.

    +
  4. +
  5. +

    UI configuration and integration of multiple assessments (ui):

    +

    "ui": { + "addProperties": [ + { + "variableName": "phq-9", + "isAbout": "activities:PHQ-9/PHQ9_schema" + }, + { + "variableName": "gad-7", + "isAbout": "activities:GAD7/GAD7_schema" + }, + { + "variableName": "pc-ptsd-5", + "isAbout": "activities:PC-PTSD-5/PC-PTSD-5_schema" + }, + { + "variableName": "clinical_history_psychiatry", + "isAbout": "demo:clinical_history_psychiatry" + }, + { + "variableName": "clinical_history_psychiatry_other", + "isAbout": "demo:clinical_history_psychiatry_other" + }, + { + "variableName": "clinical_history_psychiatry_current", + "isAbout": "demo:clinical_history_psychiatry_current" + }, + { + "variableName": "clinical_history_psychiatry_current_only_some", + "isAbout": "demo:clinical_history_psychiatry_current_only_some" + }, + { + "variableName": "clinical_history_psychiatry_current_only_some_other", + "isAbout": "demo:clinical_history_psychiatry_current_only_some_other" + } + ], + "order": [ + "activities:PHQ-9/PHQ9_schema", + "activities:GAD7/GAD7_schema", + "activities:PC-PTSD-5/PC-PTSD-5_schema", + "demo:clinical_history_psychiatry", + "demo:clinical_history_psychiatry_other", + "demo:clinical_history_psychiatry_current", + "demo:clinical_history_psychiatry_current_only_some", + "demo:clinical_history_psychiatry_current_only_some_other" + ], + "shuffle": false, + "allow": [ + "reproschema:AutoAdvance", + "reproschema:AllowExport" + ] +}

    +

    In the addProperties section, we define each variable that corresponds to a specific assessment. For instance: +- "variableName": "phq-9" is linked to "isAbout": "activities:PHQ-9/PHQ9_schema". This implies that the PHQ-9 schema (an assessment for depressive symptoms) from the reproschema-library is used in the current psychological questionnaire schema. +- Similarly, other assessments like GAD-7 and PC-PTSD-5 are included using their respective variable names and links to their schemas in the activities context. +- Additional variables related to clinical history in psychiatry are linked using the demo context, pointing to specific items within the demographics and background information section of the reproschema-library.

    +
    ```
    +{
    +    "variableName": "clinical_history_psychiatry",
    +    "isAbout": "demo:clinical_history_psychiatry"
    +}
    +```
    +
    +
      +
    • The order array specifies the sequence in which these assessments will appear in the questionnaire, ensuring a logical flow for participants.
    • +
    • The shuffle setting is false, maintaining the defined order, and allow includes functionalities like auto-advance between assessments and data export.
    • +
    +
  6. +
+

See the outcome here

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/43_create_new_assess/index.html b/43_create_new_assess/index.html new file mode 100644 index 0000000000..855b2c9061 --- /dev/null +++ b/43_create_new_assess/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + + + + + + + + + + Create new assessments for a protocol - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + +

Creating New Assessments for Unique Research Needs

+

This section provides the customized new assessments tailored to specific research needs. Our focus is on creating three distinct types of activities that are not readily available in the reproschema-library. These include: (1) clinical questions to gather clinical background information, (2) a speech task designed to collect audio data, and (3) an audio check to facilitate the speech task.

+

For each of these new assessments, the folder structure within the repository will differ slightly from those directly adopted from the reproschema-library. Specifically, each activity has its own dedicated folder within the activities directory. For instance, the speech task resides in activities/4_speech. Within this folder, besides the primary schema file (e.g., speech_schema), there is an additional subfolder named items. This items folder contains individual questions or tasks pertaining to that specific activity.

+

In the case of the speech task, the items folder might include a single task designed to prompt the participant to provide a speech sample. Similarly, for the clinical questions, their respective folders will contain items subfolders with corresponding questions tailored to elicit the required information.

+

The structure of an item within the items folder of a ReproSchema activity is similar to the schema template, but with key differences that cater to the specifics of individual data collection elements. Here's an explanation of the provided template for a country item:

+
    +
  1. Context and type (@context, @type): The @context remains the same, pointing to the generic context of ReproSchema. The @type is now "reproschema:Field" instead of "reproschema:Activity". This change signifies that this template defines a single data collection field or question within an activity, as opposed to the overall structure of an activity.
  2. +
  3. Identifier and descriptive fields (@id, prefLabel, description, etc.): @id serves as a unique identifier for the item, here named "country_item". prefLabel and description provide a human-readable name and a brief description of the item, similar to their use in the schema template.
  4. +
  5. Question field (question): This field contains the actual question or prompt that will be presented to the participant. In this template, it reads: "This is an item where the user can select a country."
  6. +
  7. UI configuration (ui): The ui section in the item template differs from the schema template. It specifies how the question will be presented to the user. The inputType is set to "selectCountry", indicating that the user interface will provide a country selection method.
  8. +
  9. Response options (responseOptions): This section defines the nature and structure of the responses allowed for the item. In this example, it specifies the valueType as "xsd:string" and a maxLength of 50 characters. It also provides a URL to a list of choices, in this case, a JSON file containing country names. This link allows the questionnaire to dynamically fetch and display a list of countries as response options.
  10. +
+
"responseOptions": {
+    "valueType": "xsd:string",
+    "maxLength": 50,
+    "choices": "https://raw.githubusercontent.com/samayo/country-json/master/src/country-by-name.json"
+}
+
+

Step 1: Specifying inputType and responseOption to gather precise data

+

We have crafted ten items in the 'items' folder for the clinical questions assessment. Each item, such as alcohol_consumption, height, weight, etc., has its ui inputType and responseOptions specifically defined to suit the nature of the question.

+

Take 'alcohol_consumption' as an example. The UI configuration and response options for this question are tailored to capture a straightforward piece of information:

+
"question": {
+    "en": "Have you drunk alcohol today?",
+    "es": "¿Has bebido alcohol hoy?"
+    },
+"ui": {
+    "inputType": "radio"
+    },
+"responseOptions": {
+    "valueType": "xsd:string",
+    "multipleChoice": false,
+    "choices": [
+        {
+            "name": {
+                "en": "Yes",
+                "es": "Sí"
+                },
+            "value": 1
+         },
+         {
+            "name": {
+                "en": "No",
+                 "es": "No"
+                 },
+            "value": 2
+        }
+    ]
+}
+
+
    +
  • The ui section sets the inputType to "radio". This choice indicates that the question will be presented to the participant as a radio button selection, providing a simple and clear interface for response selection.
  • +
  • In the responseOptions, the valueType is defined as "xsd:string", signifying that the expected type of response is a string. The multipleChoice field is set to false, indicating that participants can only select one of the provided options.
  • +
  • +

    The choices array lists the possible responses. In this case, there are two: "Yes" and "No", each with a corresponding value (1 for Yes, 2 for No) and translations provided for English ("en") and Spanish ("es").

    +
  • +
  • +

    For the speech task in our demo project, the configuration of ui inputType and responseOptions is distinctively tailored to facilitate audio data collection:

    +
  • +
+
"ui": {
+    "inputType": "audioPassageRecord"
+},
+"responseOptions": {
+    "valueType": "schema:AudioObject",
+    "minValue": 0,
+    "maxValue": 60000
+}
+
+
    +
  • In the ui section, the inputType is set to "audioPassageRecord". This specific input type is designed to enable participants to record an audio passage directly within the questionnaire interface.
  • +
  • The responseOptions are configured to accommodate the nature of audio data.
  • +
  • The valueType is specified as "schema:AudioObject", indicating that the response will be an audio file.
  • +
  • The fields minValue and maxValue define the allowable duration of the audio recording in milliseconds. In this case, the maximum duration is set to 60,000 milliseconds (or 1 minute).
  • +
+

Step 2: Integrating additional components for activity-specific needs

+

We can integrate additional components tailored to the unique requirements of specific activities. For instance, considering the unique needs of our speech task, we add an 'audio check' component to confirm the functionality of the audio recording feature.

+
    +
  1. +

    Setting up an audio check for the speech task

    +

    To ensure the effectiveness of our speech task, we create an activity for audio verification within the activities folder, naming it 0_audio. +This folder contains the audio_check_schema, a schema specifically designed to test and confirm that the audio recording system is operational and effective for participants.

    +
  2. +
  3. +

    Contextual and properties configuration for audio check

    +
  4. +
+
    "@context": [
+    "https://raw.githubusercontent.com/ReproNim/reproschema/1.0.0-rc4/contexts/generic",
+    {
+        "voice": "https://raw.githubusercontent.com/ReproNim/reproschema-library/43e7afab312596708c0ad4dfd45b69c8904088ae/activities/VoiceTask/items/"
+    }
+]
+
+
The @context section includes a specific context link under "voice", pointing to the repository with items relevant to voice and audio tasks: "<https://raw.githubusercontent.com/ReproNim/reproschema-library/.../VoiceTask/items/>" This targeted link ensures that the audio check activity aligns with the specific requirements of voice-related tasks.
+
+The ui's `addProperties` array is tailored for the audio check. We define a property `"variableName": "audio_check"` linked to `"isAbout": "voice:audio_check"`.
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/44_setup_feedback/index.html b/44_setup_feedback/index.html new file mode 100644 index 0000000000..5318cea3d8 --- /dev/null +++ b/44_setup_feedback/index.html @@ -0,0 +1,552 @@ + + + + + + + + + + + + + + + + + + + + + + Add a feedback section - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Adding a customized feedback section

+

To conclude our protocol, we integrate a customized feedback activity. This choice of ending with participant feedback is just one of many possibilities, demonstrating the adaptability of ReproSchema to diverse research needs.

+
{
+    "@context": "https://raw.githubusercontent.com/ReproNim/reproschema/1.0.0-rc4/contexts/generic",
+    "@type": "reproschema:Field",
+    "@id": "feedback",
+    "prefLabel": "Feedback",
+    "description": "schema to record text response of overall feedback of the protocol",
+    "schemaVersion": "1.0.0-rc4",
+    "version": "0.0.1",
+    "question": {
+        "en": "Please leave any comments or suggestions on the study so we can improve it (or skip):",
+        "es": "Deje cualquier comentario o sugerencia sobre el estudio para que podamos mejorarlo (u omitir):"
+    },
+    "ui": {
+        "inputType": "textarea"
+    },
+    "responseOptions": {
+        "valueType": "xsd:string"
+    }
+}
+
+

The feedback item in this activity (5_feedback) is specifically designed to gather open-ended responses, allowing participants to share their thoughts and suggestions:

+
    +
  • Item Structure: The item feedback is set up with an identification and purpose, indicated by its '@id' and descriptive fields.
  • +
  • Question Prompt: The question is presented in both English and Spanish, encouraging participants to provide comments on their study experience. It’s formatted to be inclusive, giving participants the option to skip if they choose.
  • +
  • UI Configuration for Open Responses: The choice of textarea as the inputType in the ui configuration facilitates extended text input, enabling participants to express detailed feedback comfortably. Accordingly, valueType in the responseOptions has been set as "xsd:string".
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/45_finalize_protocol/index.html b/45_finalize_protocol/index.html new file mode 100644 index 0000000000..333c6ef122 --- /dev/null +++ b/45_finalize_protocol/index.html @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + Finalize the protocol - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Finalizing the Protocol

+

After setting up individual activities, we return to the main protocol schema to organize everything cohesively. This step involves structuring the 'DemoProtocol_schema' to include all the activities we have developed, defining their sequence and presentation within the overall research protocol. In the 'DemoProtocol_schema', located in the 'DemoProtocol' folder, we integrate each activity schema using the following approach:

+
    +
  1. +

    Context and protocol definition

    +

    The @context, @type, @id, and descriptive fields (prefLabel, description, etc.) provide the foundational information about the protocol.

    +
  2. +
  3. +

    Inclusion of activities

    +

    The ui section's addProperties array is crucial. Here, each activity schema we've created is referenced under isAbout, with its respective variableName and prefLabel. For example, the audio activity is linked as

    +
  4. +
+
{
+    "isAbout": "../activities/0_audio/audio_check_schema",
+    "variableName": "audio_check_schema",
+    "prefLabel": {"en": "Audio Check"}
+}
+
+
This structure is repeated for each activity, including audio check, demographics, psychological questions, clinical questions, speech task, and feedback.
+
+
    +
  1. +

    Order of presentation

    +

    The order array within ui specifies the sequence in which these activities will appear in the protocol. It's arranged to flow logically from consent, through various assessments, to the final feedback, ensuring a structured participant experience. For instance, the order starts with ../activities/0_audio/audio_check_schema and progresses through to ../activities/5_feedback/feedback_schema.

    +
  2. +
  3. +

    Additional UI settings

    +
      +
    • 'shuffle' is set to false to maintain the specified order.
    • +
    • 'allow' includes functionalities such as 'reproschema:AllowExport' for data exporting options.
    • +
    +
  4. +
  5. +

    Update README.md

    +

    Give clear and concise instructions on what this protocol is about and how participants should use it.

    +
  6. +
+

Upon finalizing our protocol with the integrated activities, the end result is a fully interactive research tool hosted on our GitHub repository. For data collection, this tool can be linked to a backend server, or participants can be given the option to export their data directly.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/46_tools/index.html b/46_tools/index.html new file mode 100644 index 0000000000..736df3d5fa --- /dev/null +++ b/46_tools/index.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + + + + + + + + + + Toolkit - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Toolkit

+

In the world of research data management, flexibility and compatibility are key. Understanding this, we provide specialized tools designed to create, validata schemas, and convert data between ReproSchema format and REDCap CSV format. Whether you're transitioning from REDCap to ReproSchema or vice versa, these tools ensure a smooth and efficient conversion process, preserving the integrity and structure of your data.

+

Install reproschema-py

+
pip install reproschema
+
+

CLI usage

+

reproschema-py can be used as a Commend-Line Interface.

+
$ reproschema
+Usage: reproschema [OPTIONS] COMMAND [ARGS]...
+
+  A client to support interactions with ReproSchema
+
+  To see help for a specific command, run
+
+  reproschema COMMAND --help     e.g. reproschema validate --help
+
+Options:
+  --version
+  -l, --log-level [DEBUG|INFO|WARNING|ERROR|CRITICAL]
+                                  Log level name  [default: INFO]
+  --help                          Show this message and exit.
+
+Commands:
+  convert
+  create
+  redcap2reproschema  Convert REDCap CSV files to Reproschema format.
+  reproschema2redcap  Convert reproschema protocol to REDCap CSV format.
+  serve
+  validate
+
+

reproschema2redcap Usage

+

To convert ReproSchema protocol to REDCap CSV format, use the following command

+
reproschema reproschema2redcap <input_dir_path> <output_csv_filename>
+
+
    +
  • <input_dir_path>: The path to the root folder of a protocol. For example, to convert the reproschema-demo-protocol provided by ReproNim, you can use the following commands:
  • +
+

bash + git clone https://github.com/ReproNim/reproschema-demo-protocol.git + cd reproschema-demo-protocol + pwd

+

In this case, the output from pwd (which shows your current directory path)should be your <input_dir_path>. +- <output_csv_filename>: The name of the output CSV file where the converted data will be saved.

+

redcap2reproschema Usage

+

The redcap2reproschema function is designed to process a given REDCap CSV file and YAML configuration to generate the output in the reproschema format.

+

Prerequisites

+

Before the conversion, ensure you have the following:

+

YAML Configuration File:

+ +

YAML File Configuration

+

In the templates/redcap2rs.yaml file, provide the following information:

+
    +
  • protocol_name: This is a unique identifier for your protocol. Use underscores for spaces and avoid special characters.
  • +
  • protocol_display_name: The name that will appear in the application.
  • +
  • protocol_description: A brief description of your protocol.
  • +
+

Example:

+
protocol_name: "My_Protocol"
+protocol_display_name: "Assessment Protocol"
+protocol_description: "This protocol is for assessing cognitive skills."
+
+

The redcap2reproschema function has been integrated into a CLI tool, use the following command:

+
reproschema redcap2reproschema path/to/your_redcap_data_dic.csv path/to/your_redcap2rs.yaml
+
+

Those tools can also be used as Python functions. For detailed instructions, please visit reproschema-py.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/98_FAQ/index.html b/98_FAQ/index.html new file mode 100644 index 0000000000..fcfd04098a --- /dev/null +++ b/98_FAQ/index.html @@ -0,0 +1,987 @@ + + + + + + + + + + + + + + + + + + + + + + FAQ - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + +

FAQ

+

What is the semantic web?

+

When you request access to a certain document by clicking on a hyperlink, the computer will give a visual rendering of the html code of this document. But computer used to do that in pretty "silly" fashion: it would give you a human-readable version of the content, but the computer would not make the distinction if a certain element in the webpage (for example a paragraph) was referring to a person or a place or a song.

+

What the semantic wed allows is to "inject" additional information into a webpage so that a machine can know what certain elements are about (e.g "this image is about a cat.") or how they are linked to other elements (on the same page or somewhere else on the web). The tagged content of a webpage thus acquires "meaning" from the point of view of the computer, making the semantic content of the code machine-readable.

+

More info

+ + + +

What is linked data?

+

The theory

+

The same way that an element in webpage could be given "meaning" by tagging with extra information about the nature of this element, the same can be done with data. Hence a given row on a spreadsheet stored somewhere on the web can be tagged and linked to another piece of data on another website.

+

"Linked data is a way to create a network of standards-based machine interpretable data across different documents and Web sites. It allows an application to start at one piece of Linked Data, and follow embedded links to other pieces of Linked Data that are hosted on different sites across the Web." [source]

+

Linked data has some basic principles behind it (adapted from wikipedia):

+
    +
  • Use Unique Resources identifiers (URI) to name (identify) things.
  • +
  • Use HTTP URIs so that these things can be looked up.
  • +
  • Provide useful information about what a name identifies when it's looked up.
  • +
  • Refer to other things using their HTTP URI-based names when publishing data on the Web.
  • +
+

A more concrete example

+

As things might be be quite abstract, here is a simple example of linked data to help make things more concrete:

+
{
+  "@context": "http://schema.org",
+  "name": "Barack Obama",
+  "givenName": "Barack",
+  "familyName": "Obama",
+  "jobTitle": "44th President of the United States"
+}
+
+

You can see that the file is organised in pairs of "key": "value". The @context gives you the base URL of the website where you can find more information about the different properties of this piece of data.

+

What follows (name, givenNAme, familyName, ...) are the actual properties about this data and in front of it the values that this data takes for each property (in this case: "Barack Obama", "Barack", "Obama").

+

Now go and look up what is hiding behind one of those property by going to the URL made of the base URL + the property name, for example https://schema.org/familyName. This is the HTTP URI of familyName and this gives you a description of the familyName property.

+

Well "So what?" you might say. Well it also tells you which type of data this property it can be applied to: in this case, the Person type (see its description here). So even though, we never wrote anywhere explicitly that this data describes a person, a computer able to parse that piece of linked data above would "know" this.

+

More info

+
    +
  • Here is a TED talk by Tim Berners-Lee on linked data.
  • +
  • A short video intro to linked data by Manu Sporny:
  • +
+ + +

What is JSON-LD?

+

What is JSON?

+

OK before we go for JSON-LD, let's start with JSON. JSON stands for JavaScript Object Notation and is just a specific format for a text file. This type of text file is very often used by website when they need to transmit information to one another.

+

If you want to see an example of how this works, here is dummy example of the response to a request made by one website to another about a list of employees. By default the output of this dummy example is presented in a way that is more pleasing to the human eye, but if you click on Raw Data, you will see the raw unformatted JSON file that was returned by the website. Copy-paste in a text editor, it should like the big ugly and scary one-liner below that we, mere mortals, have no idea what to do with, but that a computer has no problem making sense of.

+

Insert image ???

+

+{"status":"success","data":[{"id":"1","employee_name":"Tiger Nixon","employee_salary":"320800","employee_age":"61","profile_image":""},{"id":"2","employee_name":"Garrett Winters","employee_salary":"170750","employee_age":"63","profile_image":""},{"id":"3","employee_name":"Ashton Cox","employee_salary":"86000","employee_age":"66","profile_image":""},{"id":"4","employee_name":"Cedric Kelly","employee_salary":"433060","employee_age":"22","profile_image":""},{"id":"5","employee_name":"Airi Satou","employee_salary":"162700","employee_age":"33","profile_image":""},{"id":"6","employee_name":"Brielle Williamson","employee_salary":"372000","employee_age":"61","profile_image":""},{"id":"7","employee_name":"Herrod Chandler","employee_salary":"137500","employee_age":"59","profile_image":""},{"id":"8","employee_name":"Rhona Davidson","employee_salary":"327900","employee_age":"55","profile_image":""},{"id":"9","employee_name":"Colleen Hurst","employee_salary":"205500","employee_age":"39","profile_image":""},{"id":"10","employee_name":"Sonya Frost","employee_salary":"103600","employee_age":"23","profile_image":""},{"id":"11","employee_name":"Jena Gaines","employee_salary":"90560","employee_age":"30","profile_image":""},{"id":"12","employee_name":"Quinn Flynn","employee_salary":"342000","employee_age":"22","profile_image":""},{"id":"13","employee_name":"Charde Marshall","employee_salary":"470600","employee_age":"36","profile_image":""},{"id":"14","employee_name":"Haley Kennedy","employee_salary":"313500","employee_age":"43","profile_image":""},{"id":"15","employee_name":"Tatyana Fitzpatrick","employee_salary":"385750","employee_age":"19","profile_image":""},{"id":"16","employee_name":"Michael Silva","employee_salary":"198500","employee_age":"66","profile_image":""},{"id":"17","employee_name":"Paul Byrd","employee_salary":"725000","employee_age":"64","profile_image":""},{"id":"18","employee_name":"Gloria Little","employee_salary":"237500","employee_age":"59","profile_image":""},{"id":"19","employee_name":"Bradley Greer","employee_salary":"132000","employee_age":"41","profile_image":""},{"id":"20","employee_name":"Dai Rios","employee_salary":"217500","employee_age":"35","profile_image":""},{"id":"21","employee_name":"Jenette Caldwell","employee_salary":"345000","employee_age":"30","profile_image":""},{"id":"22","employee_name":"Yuri Berry","employee_salary":"675000","employee_age":"40","profile_image":""},{"id":"23","employee_name":"Caesar Vance","employee_salary":"106450","employee_age":"21","profile_image":""},{"id":"24","employee_name":"Doris Wilder","employee_salary":"85600","employee_age":"23","profile_image":""}]}
+
+
+

By the way, if you ever come across such monstrosity and you want to turn into something you as a human being can understand (or least read), you can copy-paste it in a validator-formatter like jsonformatter or jsonlint. This will quickly tell you a) whether this is a valid JSON format (eaning if it respects the rules of how a JSON file should be formatted) and b) it will highlight and help you navigate the nested and hierarchical nature of the JSON file.

+

Insert image ???

+

OK but let's start with a much simpler example of a JSON file, like the one below which could be the content of JSON file returned by a website when asked about a certain person.

+
{
+  "name": "Barack Obama",
+  "givenName": "Barack",
+  "familyName": "Obama",
+  "jobTitle": "44th President of the United States"
+}
+
+

Looks familiar? It is very close to the one we had at the end of the previous FAQ section.

+

From JSON to JSON-LD

+

Now say you would like to use this JSON file to represent a piece of linked-data. The only thing you would need to do in this specific case is to provide the @context line we saw before that will give a precise and unambiguous meaning to the following lines.

+
{
+  "@context": "http://schema.org",
+  "name": "Barack Obama",
+  "givenName": "Barack",
+  "familyName": "Obama",
+  "jobTitle": "44th President of the United States"
+}
+
+

🎉 Congratulations! 🎉

+

You now have a valid JSON-LD. If you want to make sure it is valid, you can copy-paste that into the JSON-LD playground. If you to to visualize the "linked" aspect of that data, you can click on the Visualized tab and this will give you a graph where that connects the different nodes (piece of information to one another).

+

If you want to visualize a more complex graph, we can try that with one of the JSON-LD file that describe one of the protocols of the reproschema like the one here. Actually if you want to test get the raw content of the file you should click on Raw. You can then either use the raw content of the file or the URL of this raw file which should be something like:

+
https://raw.githubusercontent.com/ReproNim/reproschema/master/protocols/VoicePilot/VoicePilot_schema
+
+

directly into the JSON-LD playground to see whether it is a valid JSON-LD and how the different elements are connected.

+

More info

+
    +
  • It would be a stretch to say that the JSON-LD specifications make for a fascinating read that will keep you up at night (although they might but mostly out of frustration) but it is good to know that it is out there in case you eventually need to look something up
  • +
  • Two short videos by Manu Sporny about JSON-LD and core mark up features JSON-LD:
  • +
+ + + + +

Why is linked data important for the ReproSchema ?

+

Which assessments tools will/are supporting this standard?

+

At the moment, all the assessments that support this standard are listed in this folder or the reproschema-library repository.

+

If you want to see those different tools in action using our user interface, you can explore them on schema.repronim.org/.

+

The ReproSchema is also used to develop a checklist to improve methods and results reporting in neuroimaging.

+

🛠 Work in progress 🛠

+

Why should I use ReproSchema?

+

🛠 Work in progress 🛠

+

Who is ReproSchema for?

+

🛠 Work in progress 🛠

+

How can I know if a certain property is supported by ReproSchema?

+

🛠 Work in progress 🛠

+

How can I add a property to my schema?

+

🛠 Work in progress 🛠

+

How are these assessments licensed?

+

🛠 Work in progress 🛠

+

How can I contribute to the project?

+

🛠 Work in progress 🛠

+

An assessment tool I regularly use is not supported by ReproSchema: how can I add it?

+

🛠 Work in progress 🛠

+

How can I visualize the schema for a protocol or an activity?

+

If you want to see what the assessment that are already supported by the ReproSchema would look like using our ReproSchema user-interface, you can visualize them directly on schema.repronim.org.

+

If you just want to view a protocol or activity you are developing using the reproschema-ui, you can pass the URL of the schema to the url query parameter like this:

+

https://schema.repronim.org/ui/#/?url=url-to-your-schema

+

If you are hosting a schema on github, make sure that you are passing the URL of the raw content of the schema. For example, our demo protocol can be accessed at this URL:

+

https://github.com/ReproNim/demo-protocol/blob/master/VoicePilot/VoicePilot_schema

+

But to get access to the raw content of that file you must click on the Raw button once you have opened that page on github that will open this URL:

+

https://raw.githubusercontent.com/ReproNim/demo-protocol/master/VoicePilot/VoicePilot_schema.

+

If you want to visualize the graph represented by the JSON-LD file, we explain how to do this in From JSON to JSON-LD.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/99_glossary/index.html b/99_glossary/index.html new file mode 100644 index 0000000000..fe5b49d093 --- /dev/null +++ b/99_glossary/index.html @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + Glossary - ReproSchema documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Glossary

+
    +
  • activity
  • +
  • compute specification
  • +
  • input type
  • +
  • item
  • +
  • JSON
  • +
  • JSON-LD
  • +
  • protocol
  • +
  • SHACL
  • +
  • visibility
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000..1cf13b9f9d Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.51d95adb.min.js b/assets/javascripts/bundle.51d95adb.min.js new file mode 100644 index 0000000000..b20ec6835b --- /dev/null +++ b/assets/javascripts/bundle.51d95adb.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Hi=Object.create;var xr=Object.defineProperty;var Pi=Object.getOwnPropertyDescriptor;var $i=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Ii=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,an=Object.prototype.propertyIsEnumerable;var on=(e,t,r)=>t in e?xr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&on(e,r,t[r]);if(kt)for(var r of kt(t))an.call(t,r)&&on(e,r,t[r]);return e};var sn=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&an.call(e,n)&&(r[n]=e[n]);return r};var Ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Fi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $i(t))!Er.call(e,o)&&o!==r&&xr(e,o,{get:()=>t[o],enumerable:!(n=Pi(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Hi(Ii(e)):{},Fi(t||!e||!e.__esModule?xr(r,"default",{value:e,enumerable:!0}):r,e));var fn=Ht((wr,cn)=>{(function(e,t){typeof wr=="object"&&typeof cn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(wr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(T){return!!(T&&T!==document&&T.nodeName!=="HTML"&&T.nodeName!=="BODY"&&"classList"in T&&"contains"in T.classList)}function f(T){var Ke=T.type,We=T.tagName;return!!(We==="INPUT"&&a[Ke]&&!T.readOnly||We==="TEXTAREA"&&!T.readOnly||T.isContentEditable)}function c(T){T.classList.contains("focus-visible")||(T.classList.add("focus-visible"),T.setAttribute("data-focus-visible-added",""))}function u(T){T.hasAttribute("data-focus-visible-added")&&(T.classList.remove("focus-visible"),T.removeAttribute("data-focus-visible-added"))}function p(T){T.metaKey||T.altKey||T.ctrlKey||(s(r.activeElement)&&c(r.activeElement),n=!0)}function m(T){n=!1}function d(T){s(T.target)&&(n||f(T.target))&&c(T.target)}function h(T){s(T.target)&&(T.target.classList.contains("focus-visible")||T.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(T.target))}function v(T){document.visibilityState==="hidden"&&(o&&(n=!0),B())}function B(){document.addEventListener("mousemove",z),document.addEventListener("mousedown",z),document.addEventListener("mouseup",z),document.addEventListener("pointermove",z),document.addEventListener("pointerdown",z),document.addEventListener("pointerup",z),document.addEventListener("touchmove",z),document.addEventListener("touchstart",z),document.addEventListener("touchend",z)}function re(){document.removeEventListener("mousemove",z),document.removeEventListener("mousedown",z),document.removeEventListener("mouseup",z),document.removeEventListener("pointermove",z),document.removeEventListener("pointerdown",z),document.removeEventListener("pointerup",z),document.removeEventListener("touchmove",z),document.removeEventListener("touchstart",z),document.removeEventListener("touchend",z)}function z(T){T.target.nodeName&&T.target.nodeName.toLowerCase()==="html"||(n=!1,re())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),B(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var un=Ht(Sr=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},a=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(re,z){d.append(z,re)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(T){throw new Error("URL unable to set base "+c+" due to "+T)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,B=!0,re=this;["append","delete","set"].forEach(function(T){var Ke=h[T];h[T]=function(){Ke.apply(h,arguments),v&&(B=!1,re.search=h.toString(),B=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var z=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==z&&(z=this.search,B&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},a=i.prototype,s=function(f){Object.defineProperty(a,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){s(f)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr)});var Qr=Ht((Lt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Lt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Lt=="object"?Lt.ClipboardJS=r():t.ClipboardJS=r()})(Lt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ki}});var a=i(279),s=i.n(a),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(O){return!1}}var d=function(O){var w=p()(O);return m("cut"),w},h=d;function v(j){var O=document.documentElement.getAttribute("dir")==="rtl",w=document.createElement("textarea");w.style.fontSize="12pt",w.style.border="0",w.style.padding="0",w.style.margin="0",w.style.position="absolute",w.style[O?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return w.style.top="".concat(k,"px"),w.setAttribute("readonly",""),w.value=j,w}var B=function(O,w){var k=v(O);w.container.appendChild(k);var F=p()(k);return m("copy"),k.remove(),F},re=function(O){var w=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof O=="string"?k=B(O,w):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?k=B(O.value,w):(k=p()(O),m("copy")),k},z=re;function T(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?T=function(w){return typeof w}:T=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},T(j)}var Ke=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=O.action,k=w===void 0?"copy":w,F=O.container,q=O.target,Le=O.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&T(q)==="object"&&q.nodeType===1){if(k==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Le)return z(Le,{container:F});if(q)return k==="cut"?h(q):z(q,{container:F})},We=Ke;function Ie(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(w){return typeof w}:Ie=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},Ie(j)}function Ti(j,O){if(!(j instanceof O))throw new TypeError("Cannot call a class as a function")}function nn(j,O){for(var w=0;w0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof F.action=="function"?F.action:this.defaultAction,this.target=typeof F.target=="function"?F.target:this.defaultTarget,this.text=typeof F.text=="function"?F.text:this.defaultText,this.container=Ie(F.container)==="object"?F.container:document.body}},{key:"listenClick",value:function(F){var q=this;this.listener=c()(F,"click",function(Le){return q.onClick(Le)})}},{key:"onClick",value:function(F){var q=F.delegateTarget||F.currentTarget,Le=this.action(q)||"copy",Rt=We({action:Le,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Rt?"success":"error",{action:Le,text:Rt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(F){return yr("action",F)}},{key:"defaultTarget",value:function(F){var q=yr("target",F);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(F){return yr("text",F)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(F){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return z(F,q)}},{key:"cut",value:function(F){return h(F)}},{key:"isSupported",value:function(){var F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof F=="string"?[F]:F,Le=!!document.queryCommandSupported;return q.forEach(function(Rt){Le=Le&&!!document.queryCommandSupported(Rt)}),Le}}]),w}(s()),ki=Ri},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,f){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(f))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?s.apply(null,arguments):typeof m=="function"?s.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return s(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=a(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(m))return c(m,d,h);if(a.nodeList(m))return u(m,d,h);if(a.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return s(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),a=f.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var f=this;function c(){f.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=s.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var is=/["'&<>]/;Jo.exports=as;function as(e){var t=""+e,r=is.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||s(m,d)})})}function s(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof Xe?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){s("next",m)}function u(m){s("throw",m)}function p(m,d){m(d),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof xe=="function"?xe(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(a){return new Promise(function(s,f){a=e[i](a),o(s,f,a.done,a.value)})}}function o(i,a,s,f){Promise.resolve(f).then(function(c){i({value:c,done:s})},a)}}function A(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var $t=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=xe(a),f=s.next();!f.done;f=s.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var u=this.initialTeardown;if(A(u))try{u()}catch(v){i=v instanceof $t?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=xe(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{dn(h)}catch(v){i=i!=null?i:[],v instanceof $t?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new $t(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)dn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Or=Fe.EMPTY;function It(e){return e instanceof Fe||e&&"closed"in e&&A(e.remove)&&A(e.add)&&A(e.unsubscribe)}function dn(e){A(e)?e():e.unsubscribe()}var Ae={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,a=o.isStopped,s=o.observers;return i||a?Or:(this.currentObservers=null,s.push(r),new Fe(function(){n.currentObservers=null,De(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,a=n.isStopped;o?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new U;return r.source=this,r},t.create=function(r,n){return new wn(r,n)},t}(U);var wn=function(e){ne(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Or},t}(E);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ne(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,a=n._infiniteTimeWindow,s=n._timestampProvider,f=n._windowTime;o||(i.push(r),!a&&i.push(s.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,a=o._buffer,s=a.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var a=r.actions;n!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Ut);var On=function(e){ne(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Wt);var we=new On(Tn);var R=new U(function(e){return e.complete()});function Dt(e){return e&&A(e.schedule)}function kr(e){return e[e.length-1]}function Qe(e){return A(kr(e))?e.pop():void 0}function Se(e){return Dt(kr(e))?e.pop():void 0}function Vt(e,t){return typeof kr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function zt(e){return A(e==null?void 0:e.then)}function Nt(e){return A(e[ft])}function qt(e){return Symbol.asyncIterator&&A(e==null?void 0:e[Symbol.asyncIterator])}function Kt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ki(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Qt=Ki();function Yt(e){return A(e==null?void 0:e[Qt])}function Gt(e){return ln(this,arguments,function(){var r,n,o,i;return Pt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,Xe(r.read())];case 3:return n=a.sent(),o=n.value,i=n.done,i?[4,Xe(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,Xe(o)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return A(e==null?void 0:e.getReader)}function $(e){if(e instanceof U)return e;if(e!=null){if(Nt(e))return Qi(e);if(pt(e))return Yi(e);if(zt(e))return Gi(e);if(qt(e))return _n(e);if(Yt(e))return Bi(e);if(Bt(e))return Ji(e)}throw Kt(e)}function Qi(e){return new U(function(t){var r=e[ft]();if(A(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Yi(e){return new U(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?_(function(o,i){return e(o,i,n)}):me,Oe(1),r?He(t):zn(function(){return new Xt}))}}function Nn(){for(var e=[],t=0;t=2,!0))}function fe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new E}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,f=s===void 0?!0:s;return function(c){var u,p,m,d=0,h=!1,v=!1,B=function(){p==null||p.unsubscribe(),p=void 0},re=function(){B(),u=m=void 0,h=v=!1},z=function(){var T=u;re(),T==null||T.unsubscribe()};return g(function(T,Ke){d++,!v&&!h&&B();var We=m=m!=null?m:r();Ke.add(function(){d--,d===0&&!v&&!h&&(p=jr(z,f))}),We.subscribe(Ke),!u&&d>0&&(u=new et({next:function(Ie){return We.next(Ie)},error:function(Ie){v=!0,B(),p=jr(re,o,Ie),We.error(Ie)},complete:function(){h=!0,B(),p=jr(re,a),We.complete()}}),$(T).subscribe(u))})(c)}}function jr(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function V(e,t=document){let r=se(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function se(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),N(e===_e()),Y())}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function Yn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,we),l(()=>Be(e)),N(Be(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,we),l(()=>rr(e)),N(rr(e)))}var Bn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!zr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),xa?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!zr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ya.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Jn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Zn=typeof WeakMap!="undefined"?new WeakMap:new Bn,eo=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Ea.getInstance(),n=new Ra(t,r,this);Zn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){eo.prototype[e]=function(){var t;return(t=Zn.get(this))[e].apply(t,arguments)}});var ka=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:eo}(),to=ka;var ro=new E,Ha=I(()=>H(new to(e=>{for(let t of e)ro.next(t)}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){return Ha.pipe(S(t=>t.observe(e)),x(t=>ro.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(()=>de(e)))),N(de(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var no=new E,Pa=I(()=>H(new IntersectionObserver(e=>{for(let t of e)no.next(t)},{threshold:0}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function sr(e){return Pa.pipe(S(t=>t.observe(e)),x(t=>no.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function oo(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=de(e),o=bt(e);return r>=o.height-n.height-t}),Y())}var cr={drawer:V("[data-md-toggle=drawer]"),search:V("[data-md-toggle=search]")};function io(e){return cr[e].checked}function qe(e,t){cr[e].checked!==t&&cr[e].click()}function je(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),N(t.checked))}function $a(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ia(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(N(!1))}function ao(){let e=b(window,"keydown").pipe(_(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:io("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),_(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!$a(n,r)}return!0}),fe());return Ia().pipe(x(t=>t?R:e))}function Me(){return new URL(location.href)}function ot(e){location.href=e.href}function so(){return new E}function co(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)co(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)co(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function fo(){return location.hash.substring(1)}function uo(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Fa(){return b(window,"hashchange").pipe(l(fo),N(fo()),_(e=>e.length>0),J(1))}function po(){return Fa().pipe(l(e=>se(`[id="${e}"]`)),_(e=>typeof e!="undefined"))}function Nr(e){let t=matchMedia(e);return Zt(r=>t.addListener(()=>r(t.matches))).pipe(N(t.matches))}function lo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(N(e.matches))}function qr(e,t){return e.pipe(x(r=>r?t():R))}function ur(e,t={credentials:"same-origin"}){return ve(fetch(`${e}`,t)).pipe(ce(()=>R),x(r=>r.status!==200?Tt(()=>new Error(r.statusText)):H(r)))}function Ue(e,t){return ur(e,t).pipe(x(r=>r.json()),J(1))}function mo(e,t){let r=new DOMParser;return ur(e,t).pipe(x(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),J(1))}function pr(e){let t=M("script",{src:e});return I(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(x(()=>Tt(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),C(()=>document.head.removeChild(t)),Oe(1))))}function ho(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function bo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(ho),N(ho()))}function vo(){return{width:innerWidth,height:innerHeight}}function go(){return b(window,"resize",{passive:!0}).pipe(l(vo),N(vo()))}function yo(){return Q([bo(),go()]).pipe(l(([e,t])=>({offset:e,size:t})),J(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(X("size")),o=Q([n,r]).pipe(l(()=>Be(e)));return Q([r,t,o]).pipe(l(([{height:i},{offset:a,size:s},{x:f,y:c}])=>({offset:{x:a.x-f,y:a.y-c+i},size:s})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(a=>{let s=document.createElement("script");s.src=i,s.onload=a,document.body.appendChild(s)})),Promise.resolve())}var r=class{constructor(n){this.url=n,this.onerror=null,this.onmessage=null,this.onmessageerror=null,this.m=a=>{a.source===this.w&&(a.stopImmediatePropagation(),this.dispatchEvent(new MessageEvent("message",{data:a.data})),this.onmessage&&this.onmessage(a))},this.e=(a,s,f,c,u)=>{if(s===this.url.toString()){let p=new ErrorEvent("error",{message:a,filename:s,lineno:f,colno:c,error:u});this.dispatchEvent(p),this.onerror&&this.onerror(p)}};let o=new EventTarget;this.addEventListener=o.addEventListener.bind(o),this.removeEventListener=o.removeEventListener.bind(o),this.dispatchEvent=o.dispatchEvent.bind(o);let i=document.createElement("iframe");i.width=i.height=i.frameBorder="0",document.body.appendChild(this.iframe=i),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Welcome to the ReproSchema documentation

+

+

How to use this documentation

+
    +
  • +

    If you want to know more about the ReproSchema project, its goals and the problems +it tries to solve: check out our introduction.

    +
  • +
  • +

    The ReproSchema is related to the Semantic Web and relies on linked data +and the JSON-LD format. If you are unfamiliar with such things, head over to +our FAQ. You do not need an in depth understanding of what those +things are to use the ReproSchema but some "big picture" conceptual understanding +could save you from a lot of confusion. 😉

    +
  • +
  • +

    Not sure how the project is organized? Check out the project structure +page.

    +
  • +
+

How to cite

+

If you need to cite ReproSchema, you can use this DOI:

+ +

Licence

+

Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.

+

Contributing and feedback

+

We are looking for people to give us feedback on this documentation if anything +is unclear by opening an issue on our repository.

+

You can also get in touch on our channel on the mattermost Brainhack.

+

If you want to get started right away and contribute directly to this +documentation,you can find references and how-to in the about section.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000000..af3c5f2868 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to the ReproSchema documentation","text":""},{"location":"#how-to-use-this-documentation","title":"How to use this documentation","text":"
  • If you want to know more about the ReproSchema project, its goals and the problems it tries to solve: check out our introduction.

  • The ReproSchema is related to the Semantic Web and relies on linked data and the JSON-LD format. If you are unfamiliar with such things, head over to our FAQ. You do not need an in depth understanding of what those things are to use the ReproSchema but some \"big picture\" conceptual understanding could save you from a lot of confusion. \ud83d\ude09

  • Not sure how the project is organized? Check out the project structure page.

"},{"location":"#how-to-cite","title":"How to cite","text":"

If you need to cite ReproSchema, you can use this DOI:

  • doi:10.5281/zenodo.4064940.
"},{"location":"#licence","title":"Licence","text":"

This work is licensed under a Creative Commons Attribution 4.0 International License.

"},{"location":"#contributing-and-feedback","title":"Contributing and feedback","text":"

We are looking for people to give us feedback on this documentation if anything is unclear by opening an issue on our repository.

You can also get in touch on our channel on the mattermost Brainhack.

If you want to get started right away and contribute directly to this documentation,you can find references and how-to in the about section.

"},{"location":"01_introduction/","title":"Introduction","text":"Tl;DR - Advantages of the current schema representation
  • Rich contexts for a questionnaire with JSON-LD rather than a \"flat\" csv file.
  • A single source of curated assessments from ReproSchema Library
  • Each item (i.e question), activity (i.e questionnaire), and protocol (i.e set of questionnaires) provides unique and persistent identifiers.
  • Versions of a given questionnaire can be tracked (e.g., PHQ-9, PHQ-8).
  • Allows, supports, and tracks internationalization (e.g. ABCD requires Spanish and English forms).
  • Implementation agnostic \u2013 the schema can be used by several different software packages
  • Uses a linked data graph that can be validated using SHACL.
"},{"location":"01_introduction/#the-problem","title":"The problem","text":"

Cognitive and clinical questionnaires and assessments are used throughout neuroscience. There is little consistency in assessment data acquisition or response representation across studies or laboratories. Each project tends to use its own format and data collection tool (e.g., paper, survey tools, RedCap, LORIS). In the long run, this can be a source of a lot inefficiencies not only in terms data curation but also by diminishing the value of the data less interoperable and reusable. Imagine for example a researcher wanting to run a meta or mega-analysis across several studies. To do this each one would not only need to know which specific assessments were collected, but also how to relate different column names in data spreadsheets to these assessments and across projects.

Several efforts have focused on linking the assessments themselves through consistent terminologies and relationships that map to human cognition (e.g., Cognitive Atlas, Cognitive Paradigm Ontology). Other efforts such as the National Institute for Mental Health (NIMH) Data Archive (NDA) and the National Library of Medicine (NLM) Common Data Elements have curated data elements corresponding to the items and calculated scores from these questionnaires. However, these resources are often used to make data consistent and reusable after, rather than during data collection. However, harmonizing data after acquisition is resource intensive and this approach can create a mismatch between collected and submitted data due to human error during the harmonization process. To faciliate tedious harmonization efforts, several projects, over the last two decades, have developed technologies to automatically or interactively align and harmonize data elements (e.g., BIRN mediator, OpenRefine).

Given the dynamic and evolving nature of scientific investigation, many questionnaires are altered when used to suit the requirements of a particular study (e.g., different language, selective and new questions). This information linking the specific information used when asking a question is often decoupled from the data element representing the response to the question. When questions are changed, researchers often shoehorn the response into an existing data element, thus creating additional noise. Another drawback to these data elements is that there is often no way to find out which version of a questionnaire was used or how exactly it was scored.

"},{"location":"01_introduction/#our-solution","title":"Our solution","text":"

Our simpler solution is to enforce consistency directly at the data acquisition stage by relying on a common schema that encodes how the different elements of the data and / or the metadata relate to one another. This way, all this relational information between these elements is captured from the very start as it is already embedded in the formal description of the assessment. This solution was inspired by the work of CEDAR Metadata Model.

In this project we provide a comprehensive set of tools to create and use the schemas, while tracking the source of the schema, and changes to it over time. The ReproSchema project covers:

  1. a schema that can be found in the present repository that describes the content and relations of the different elements of a questionnaire or set of assessment tools,
  2. an associated curated library of reusable common assessments and questionnaires,
  3. a python package to help create and validate the schemas of new assessments,
  4. a user interface to visualize questionnaire and collect data locally,
  5. a backend server to capture the data remotely.

In brief, ReproSchema offers a way to standardize the underlying representation of assessment tools. It comes with an open and accessible library of questionnaires with appropriate conversion (e.g., from/to RedCap) and data collection tools (e.g., MindLogger, RedCap, LORIS - future work) to enable a more consistent acquisition across projects, with data being harmonized by design.

"},{"location":"01_introduction/#general-description","title":"General description","text":"

With this schema we can represent:

  • at the item level, the elements of an individual assessment, like the questions in a questionnaire
  • at the activity level, an individual assessment that contains a set of items, like for example a whole questionnaire with a several questions.
  • at the protocols level, a collection of activities performed by a participant, e.g a set of questionnaires used in a study.

All those elements are specified text files in a JSON-LD format (JavaScript Object Notation for Linked Data) and each item, activity, and protocol provides unique and persistent identifiers.

Below we show an example of one of the possible ways a questionnaire with 3 questions for a study could be organized with a protocol for that study, one activity and 3 items.

\u251c\u2500\u2500 activities\n\u2502   \u2514\u2500\u2500 activity1\n\u2502       \u251c\u2500\u2500 activity1_schema.jsonld\n\u2502       \u2514\u2500\u2500 items\n\u2502           \u251c\u2500\u2500 item1.jsonld\n\u2502           \u251c\u2500\u2500 item2.jsonld\n\u2502           \u2514\u2500\u2500 item3.jsonld\n\u2514\u2500\u2500 protocol\n    \u2514\u2500\u2500 protocol1_schema.jsonld\n

The ReproSchema can also easily and flexibly specify details how the schema for an assessment should be used. Independently of what solution is chosen in the end by a researcher, a lab, or an institute to display the assessment to their participants or patients (for example whether using an Web-app written in javascript or a mobile app written in React-native), the schema can already specify:

  • the input type to choose among several user-interface rendering options e.g., a Likert scale, a dropdown menu, a multiple choice...
  • the visibility to decide whether a given item or activity should be displayed to the user and under which conditions,
  • the compute logic of how the total score to the responses on a questionnaire should be computed

The ReproSchema also allows for internationalization and multiple languages support by making it very easy to keep everything the same except the language displayed by the user interface.

Finally ReproSchema allows tracking of variations and version of different assessments tools (e.g., PHQ-9, PHQ-8).

"},{"location":"100_about_this_doc/","title":"About this documentation","text":"

This documentation is a work in progress and we wellcome any input: if something is missing or unclear, let us know by [opening an issue on our repository] (???).

"},{"location":"100_about_this_doc/#serving-the-doc-locally","title":"Serving the doc locally","text":"

This project uses MkDocs tool with Material theme and extra plugins to generate the website.

To test locally, you will need to install the Python dependencies. To do that, type the following commands:

git clone https://github.com/ReproNim/reproschema.git\ncd reproschema\npip install -r requirements.txt\n

If you are working on your fork, simply replace https://github.com/ReproNim/reproschema.git by git clone git@github.com/<username>/reproschema.git where <username> is your GitHub username

Once done, you need to run MkDocs. Simply type:

mkdocs serve\n

Finally, open up http://127.0.0.1:8000/ in your browser, and you should see the default home page of the being displayed.

"},{"location":"20_project_structure/","title":"Project structure","text":"

The ReproSchema project is organized around several github repositories. The main ones are the following.

  • reproschema
  • reproschema-library
  • reproschema-py
  • reproschema-ui
  • reproschema-protocol-cookiecutter

A brief description of how they all interact could be along the following lines:

If you're gearing up to launch a research project that requires standardized questionnaires, starting with reproschema-protocol-cookiecutter is your best first step. This tool sets you up with a custom protocol for your study, integrating handy features for a smooth setup right from the get-go. You'll have two main paths for adding questionnaires, or activities, to your study:

Option 1: Dive into reproschema-library where we've got a stash of ready-made questionnaires. Pick what fits your study, and you're good to go.

Option 2: Feeling creative? Craft your own activities with reproschema-py. This tool not only lets you design new activities but also checks that they meet all the ReproSchema standards.

Once your protocol is packed with all the activities you need, reproschema-ui automatically steps in. This part of the toolkit lets you see your study in action before you even start, making sure everything's set up just right for gathering data.

"},{"location":"20_project_structure/#reproschema","title":"reproschema","text":"

GPT

The ReproSchema is like a blueprint for research projects, ensuring everyone collects data in a consistent way, which makes it easier to compare results from different studies. Here\u2019s a simpler breakdown of what\u2019s inside:

  • Key Terms: These are the building blocks, like common types of answers and data formats, that help everyone understand and use data the same way.
  • How Data is Organized: ReproSchema sorts information into three main layers to keep things neat:
    • Item Level: This is where individual questions or parts of a survey are detailed, allowing for close examination of each element.
    • Activity Level: At this stage, an entire survey or tool, made up of many items, is grouped together as an \"Activity.\" It gives a complete overview of what the survey involves.
    • Protocols Level: The highest level, a \"Protocol,\" bundles together all the activities a participant will do in a study, providing a comprehensive plan.
  • Validation: The schema uses special standards (like SHACL files) to make sure the data and forms are up to standard and consistent.
  • Context Files: These files (contextsand terms) specify user-interface details and enhance schema flexibility. They define elements like input types, visibility conditions, and response options, supporting a tailored user experience. Additionally, they enable internationalization and multiple language support for broad applicability.

There is also an example schema that can help give you a quick overview of what the protocol and activity for a study might look like. For more details see the schema section.

"},{"location":"20_project_structure/#reproschema-library","title":"reproschema-library","text":"

This repository hosts all the community curated assessments and questionnaires that support the ReproSchema standard.

Imagine this as curated library of reusable assessments and questionnaires, from where you can easily pull a copy from rather than having to photocopy a new questionnaire for your next participant or patient. Also you can mix and match items from this library, knowing that the information is tracked in your protocol.

All assessments are listed in the activity folder and are served here if you want to visualize them.

  • Standard Alignment: Each element in the library aligns with the ReproSchema framework, ensuring uniformity in terms and structure and upholding validation protocols for consistency across the ecosystem.
  • Research Protocol Integration: Researchers can utilize these assessments in various combinations to align with specific protocol needs, customizing their application per study objectives. This process can be integrated using the reproschema-protocol-cookiecutter for constructing user interfaces.
  • Collaborative Expansion: The library supports expansion through researcher contributions, allowing adding new, relevant assessments. These contributions are automatically validated using reproschema-py, maintaining the library\u2019s standardization and relevance to evolving research demands.
"},{"location":"20_project_structure/#reproschema-py","title":"reproschema-py","text":"

This is the ReproSchema python library. This is a python Command Line Interface (CLI) that allows you to help create and validate the schemas of new assessments.

  • Schema Development and Validation: This tool streamlines the creation and validation of new assessment schemas, verifying their alignment with ReproSchema's standards. It rigorously tests protocols, activities, and items to meet predefined specifications.
  • Consistency Assurance: Integrated with the ReproSchema-library and ReproSchema-Protocol-Cookiecutter, reproschema-py validates library assessments for quality and uniformity. It also automatically ensures the consistency of research protocols generated through the ReproSchema-Protocol-Cookiecutter.
  • Interoperability with REDCap: Its capability to convert between REDCap and ReproSchema formats exemplifies its role in harmonizing diverse data collection methods in complex, multi-faceted research environments.
"},{"location":"20_project_structure/#reproschema-ui","title":"reproschema-ui","text":"

This repository contains the code for the user-interface for the ReproSchema to visualize questionnaires and collect data.

You can see it in action here

"},{"location":"20_project_structure/#reproschema-protocol-cookiecutter","title":"reproschema-protocol-cookiecutter","text":"

The reproschema-protocol-cookiecutter is a straightforward tool that helps you quickly set up a research study. It offers a ready-to-use template for organizing your study's structure and surveys, ensuring everything meets standard guidelines. Think of it as a quick-start guide to get your research project up and running smoothly. A step-by-step guide see here.

"},{"location":"20_project_structure/#other-repositories","title":"Other repositories","text":""},{"location":"20_project_structure/#demo-protocol","title":"Demo-protocol","text":"

This repository contain a full fledge protocol that can be used as demonstration.

"},{"location":"20_project_structure/#reprolib-server","title":"Reprolib-server","text":"

This contains some additional information on how the activities are served on https://schema.repronim.org/rl/.

"},{"location":"30_schema/","title":"The schema","text":"

The core model of ReproSchema was initially derived from the CEDAR Metadata Model. To accommodate the needs of neuroimaging and other clinical and behavioral protocols and assessments the schema has evolved significantly. These changes include:

  1. Alignment with schema.org and NIDM. We have used schema.org classes and properties where it maps on to the needs of the model and extended the model with NIDM elements to harmonize across ReproNim projects.
  2. Allowing for structued nested elements in a schema Protocol > Activity > [Activity | Field > ResponseOption]. This nested structure provides a flexible schema to represent nested activities, which are common in biomedical and other domains.

    Protocol\n\u251c\u2500\u2500 Activity\n\u2502   \u251c\u2500\u2500 Field\n\u2502   \u2502   \u2514\u2500\u2500 ResponseOption\n\u2502   \u2514\u2500\u2500 Field\n\u2502   \u2502   \u2514\u2500\u2500 ResponseOption\n\u2502   \u251c\u2500\u2500 Activity\n\u2502   \u2502   \u251c\u2500\u2500 Field\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 ResponseOption\n\u2502   \u2502   ...\n\u2502   ...\n\u251c\u2500\u2500 Activity\n\u2502   ...\n...\n
  3. Interaction with git/Github or another Web service to deliver a new Protocol, Activity or Field with a persistent URI, while tracking changes associated with any of these elements. By making every Field represented through a persistent URI, a data collection instrument can link the responses to the exact Field that was used.

  4. Addition of computable elements that are derived from the values entered by a participant.
  5. Allowing for user interface (UI) elements that allow interaction between the schema and any implementation that allows collecting data using the schema. By providing some additional UI elements the provider can guide an implementor to allow for more complex data collection behavior.

The ReproSchema-UI is a prototype implementation of an UI that leverages these different elements of the schema.

"},{"location":"30_schema/#properties-of-reproschema-objects","title":"Properties of ReproSchema objects","text":"

This section lists the core ReproSchema objects and their allowed properties.

"},{"location":"30_schema/#protocol","title":"Protocol","text":"

A representation of a study which comprises one or more assessments.

URI: http://schema.repronim.org/Protocol

Name Description URI addProperties An array of objects to describe the various properties added to assessments and fields. http://schema.repronim.org/addProperties allow An array of items indicating properties allowed on an activity or protocol http://schema.repronim.org/allow compute An array of objects indicating computations in an activity or protocol and maps it to the corresponding Field item. scoring logic is a subset of all computations that could be performed and not all computations will be scoring. For example, one may want to do conversion from one unit to another. http://schema.repronim.org/compute landingPage An element (by URL) to point to the protocol readme or landing page. http://schema.repronim.org/landingPage messages An array of objects to define conditional messages in an activity or protocol. http://schema.repronim.org/messages order An ordered list to describe the order in which the items of an assessment or protocol appear in the user interface. http://schema.repronim.org/order overrideProperties An array of objects to override the various properties added to assessments and fields. http://schema.repronim.org/overrideProperties preamble The preamble for an assessment http://schema.repronim.org/preamble shuffle An element (bool) to determine if the list of items is shuffled or in order. http://schema.repronim.org/shuffle about The subject matter of the Field. http://schema.org/about audio An embedded audio object. http://schema.org/audio description A description of the item. http://schema.org/description image An image of the item. This can be a URL or a fully described ImageObject. http://schema.org/image schemaVersion Indicates (by URL or string) a particular version of a schema used in some CreativeWork. For example, a document could declare a schemaVersion using an URL such as http://schema.org/version/2.0/ if precise indication of schema version was required by some application. http://schema.org/schemaVersion version The version of the CreativeWork embodied by a specified resource. http://schema.org/version video An embedded video object. http://schema.org/video altLabel The alternate label. http://www.w3.org/2004/02/skos/core#altLabel prefLabel The preferred label. http://www.w3.org/2004/02/skos/core#prefLabel"},{"location":"30_schema/#activity","title":"Activity","text":"

An assessment in a protocol.

URI: http://schema.repronim.org/Activity

Name Description URI addProperties An array of objects to describe the various properties added to assessments and fields. http://schema.repronim.org/addProperties allow An array of items indicating properties allowed on an activity or protocol http://schema.repronim.org/allow compute An array of objects indicating computations in an activity or protocol and maps it to the corresponding Field item. scoring logic is a subset of all computations that could be performed and not all computations will be scoring. For example, one may want to do conversion from one unit to another. http://schema.repronim.org/compute cronTable None http://schema.repronim.org/cronTable messages An array of objects to define conditional messages in an activity or protocol. http://schema.repronim.org/messages order An ordered list to describe the order in which the items of an assessment or protocol appear in the user interface. http://schema.repronim.org/order overrideProperties An array of objects to override the various properties added to assessments and fields. http://schema.repronim.org/overrideProperties preamble The preamble for an assessment http://schema.repronim.org/preamble shuffle An element (bool) to determine if the list of items is shuffled or in order. http://schema.repronim.org/shuffle about The subject matter of the Field. http://schema.org/about audio An embedded audio object. http://schema.org/audio citation A citation or reference to another creative work, such as another publication, web page, scholarly article, etc. http://schema.org/citation description A description of the item. http://schema.org/description image An image of the item. This can be a URL or a fully described ImageObject. http://schema.org/image schemaVersion Indicates (by URL or string) a particular version of a schema used in some CreativeWork. For example, a document could declare a schemaVersion using an URL such as http://schema.org/version/2.0/ if precise indication of schema version was required by some application. http://schema.org/schemaVersion version The version of the CreativeWork embodied by a specified resource. http://schema.org/version video An embedded video object. http://schema.org/video altLabel The alternate label. http://www.w3.org/2004/02/skos/core#altLabel prefLabel The preferred label. http://www.w3.org/2004/02/skos/core#prefLabel"},{"location":"30_schema/#field","title":"Field","text":"

An item in an assessment.

URI: http://schema.repronim.org/Field

Name Description URI additionalNotesObj A set of objects to define notes in a field. For example, most Redcap and NDA data dictionaries have notes for each item which needs to be captured in reproschema. http://schema.repronim.org/additionalNotesObj inputType An element to describe the input type of a Field item. http://schema.repronim.org/inputType preamble The preamble for an assessment http://schema.repronim.org/preamble responseOptions An element (object or by URL)to describe the properties of response of the Field item. http://schema.repronim.org/responseOptions about The subject matter of the Field. http://schema.org/about audio An embedded audio object. http://schema.org/audio description A description of the item. http://schema.org/description image An image of the item. This can be a URL or a fully described ImageObject. http://schema.org/image isPartOf Indicates an item or CreativeWork that this item, or CreativeWork (in some sense), is part of. http://schema.org/isPartOf question A sub property of object. A question. http://schema.org/question readonlyValue Whether or not a property is mutable. Default is false. Specifying this for a property that also has a value makes it act similar to a \"hidden\" input in an HTML form. http://schema.org/readonlyValue schemaVersion Indicates (by URL or string) a particular version of a schema used in some CreativeWork. For example, a document could declare a schemaVersion using an URL such as http://schema.org/version/2.0/ if precise indication of schema version was required by some application. http://schema.org/schemaVersion version The version of the CreativeWork embodied by a specified resource. http://schema.org/version video An embedded video object. http://schema.org/video altLabel The alternate label. http://www.w3.org/2004/02/skos/core#altLabel prefLabel The preferred label. http://www.w3.org/2004/02/skos/core#prefLabel"},{"location":"30_schema/#additionalproperty","title":"AdditionalProperty","text":"

An object to describe the various properties added to assessments and fields.

URI: http://schema.repronim.org/AdditionalProperty

Name Description URI allow An array of items indicating properties allowed on an activity or protocol http://schema.repronim.org/allow isAbout A pointer to the node describing the item. http://schema.repronim.org/isAbout isVis An element to describe (by boolean or conditional statement) visibility conditions of items in an assessment. http://schema.repronim.org/isVis limit An element to limit the duration (uses ISO 8601) this activity is allowed to be completed by once activity is available. http://schema.repronim.org/limit maxRetakes Defines number of times the item is allowed to be redone. http://schema.repronim.org/maxRetakes randomMaxDelay Present activity/item within some random offset of activity available time up to the maximum specified by this ISO 8601 duration http://schema.repronim.org/randomMaxDelay schedule An element to set make activity available/repeat info using ISO 8601 repeating interval format. http://schema.repronim.org/schedule variableName The name used to represent an item. http://schema.repronim.org/variableName valueRequired Whether the property must be filled in to complete the action. Default is false. http://schema.org/valueRequired prefLabel The preferred label. http://www.w3.org/2004/02/skos/core#prefLabel"},{"location":"30_schema/#overrideproperty","title":"OverrideProperty","text":"

An object to override the various properties added to assessments and fields.

URI: http://schema.repronim.org/OverrideProperty

Name Description URI isAbout A pointer to the node describing the item. http://schema.repronim.org/isAbout isVis An element to describe (by boolean or conditional statement) visibility conditions of items in an assessment. http://schema.repronim.org/isVis limit An element to limit the duration (uses ISO 8601) this activity is allowed to be completed by once activity is available. http://schema.repronim.org/limit maxRetakes Defines number of times the item is allowed to be redone. http://schema.repronim.org/maxRetakes randomMaxDelay Present activity/item within some random offset of activity available time up to the maximum specified by this ISO 8601 duration http://schema.repronim.org/randomMaxDelay schedule An element to set make activity available/repeat info using ISO 8601 repeating interval format. http://schema.repronim.org/schedule variableName The name used to represent an item. http://schema.repronim.org/variableName valueRequired Whether the property must be filled in to complete the action. Default is false. http://schema.org/valueRequired prefLabel The preferred label. http://www.w3.org/2004/02/skos/core#prefLabel"},{"location":"30_schema/#unitoption","title":"UnitOption","text":"

An object to represent a human displayable name alongside the more formal value for units.

URI: http://schema.repronim.org/UnitOption

Name Description URI value The value for each option in choices or in additionalNotesObj http://schema.repronim.org/value prefLabel The preferred label. http://www.w3.org/2004/02/skos/core#prefLabel"},{"location":"30_schema/#responseoption","title":"ResponseOption","text":"

An element (object or by URL)to describe the properties of response of the Field item.

URI: http://schema.repronim.org/ResponseOption

Name Description URI choices An array to list the available options for response of the Field item. http://schema.repronim.org/choices datumType Indicates what type of datum the response is (e.g. range,count,scalar etc.) for the Field item. http://schema.repronim.org/datumType multipleChoice Indicates (by bool) if response for the Field item has one or more answer. http://schema.repronim.org/multipleChoice unitOptions A list of objects to represent a human displayable name alongside the more formal value for units. http://schema.repronim.org/unitOptions valueType The type of the response of an item. For example, string, integer, etc. http://schema.repronim.org/valueType maxValue The upper value of some characteristic or property. http://schema.org/maxValue minValue The lower value of some characteristic or property. http://schema.org/minValue unitCode The unit of measurement given using the UN/CEFACT Common Code (3 characters) or a URL. Other codes than the UN/CEFACT Common Code may be used with a prefix followed by a colon. http://schema.org/unitCode"},{"location":"30_schema/#choice","title":"Choice","text":"

An object to describe a response option.

URI: http://schema.repronim.org/Choice

Name Description URI value The value for each option in choices or in additionalNotesObj http://schema.repronim.org/value image An image of the item. This can be a URL or a fully described ImageObject. http://schema.org/image name The name of the item. http://schema.org/name"},{"location":"30_schema/#computespecification","title":"ComputeSpecification","text":"

An object to define computations in an activity or protocol.

URI: http://schema.repronim.org/ComputeSpecification

Name Description URI jsExpression A JavaScript expression to compute a score from other variables. http://schema.repronim.org/jsExpression variableName The name used to represent an item. http://schema.repronim.org/variableName"},{"location":"30_schema/#messagespecification","title":"MessageSpecification","text":"

An object to define messages in an activity or protocol.

URI: http://schema.repronim.org/MessageSpecification

Name Description URI jsExpression A JavaScript expression to compute a score from other variables. http://schema.repronim.org/jsExpression message The message to be conditionally displayed for an item. http://schema.repronim.org/message"},{"location":"30_schema/#additionalnoteobj","title":"AdditionalNoteObj","text":"

A set of objects to define notes in a field. For example, most Redcap and NDA data dictionaries have notes for each item which needs to be captured in reproschema

URI: http://schema.repronim.org/AdditionalNoteObj

Name Description URI column An element to define the column name where the note was taken from. http://schema.repronim.org/column source An element to define the source (eg. RedCap, NDA) where the note was taken from. http://schema.repronim.org/source value The value for each option in choices or in additionalNotesObj http://schema.repronim.org/value"},{"location":"30_schema/#responseactivity","title":"ResponseActivity","text":"

Captures information about some action that took place. It also links to information (entities) that were used during the activity

URI: http://schema.repronim.org/ResponseActivity

Name Description URI endedAtTime None http://www.w3.org/ns/prov#endedAtTime generated None http://www.w3.org/ns/prov#generated startedAtTime None http://www.w3.org/ns/prov#startedAtTime used None http://www.w3.org/ns/prov#used wasAssociatedWith None http://www.w3.org/ns/prov#wasAssociatedWith inLanguage The language of the content or performance or used in an action. Please use one of the language codes from the IETF BCP 47 standard. See also [[availableLanguage]]. http://schema.org/inLanguage"},{"location":"30_schema/#response","title":"Response","text":"

Describes the response of an item.

URI: http://schema.repronim.org/Response

Name Description URI wasAttributedTo None http://www.w3.org/ns/prov#wasAttributedTo isAbout A pointer to the node describing the item. http://schema.repronim.org/isAbout value The value for each option in choices or in additionalNotesObj http://schema.repronim.org/value"},{"location":"30_schema/#participant","title":"Participant","text":"

An Agent describing characteristics associated with a participant.

URI: http://schema.repronim.org/Participant

Name Description URI subject_id The identifier of a participant http://purl.org/nidash/nidm#subject_id"},{"location":"30_schema/#softwareagent","title":"SoftwareAgent","text":"

Captures information about some action that took place. It also links to information (entities) that were used during the activity

URI: http://schema.repronim.org/SoftwareAgent

Name Description URI url URL of the item. http://schema.org/url version The version of the CreativeWork embodied by a specified resource. http://schema.org/version"},{"location":"41_create_new_protocol/","title":"Creating a Research Protocol Using Cookiecutter","text":"

Ready for your first ReproSchema project?! We are going to use the Reproschema Protocol Cookiecutter to create a demo protocol.

"},{"location":"41_create_new_protocol/#getting-started","title":"Getting Started","text":"
  1. Prerequisite: Ensure you have Git and Cookiecutter installed on your system. If not, please refer to the installation guides for Git and Cookiecutter.
  2. Generate Your Repository: Use the Reproschema Protocol Cookiecutter to create a new repository for your research protocol. Run the following command in your terminal:
cookiecutter gh:ReproNim/reproschema-protocol-cookiecutter\n
  1. Follow the prompts to customize your new protocol, more details see here
"},{"location":"41_create_new_protocol/#customizing-your-protocol","title":"Customizing Your Protocol","text":"

Once you run the Cookiecutter command, you will be prompted to make choices for your protocol, ranging from 1-5. These choices generate corresponding activities in your repository. Here's what you can do with these activities:

  1. Use as Templates: The activities created based on your choices serve as templates. You can use these to understand the structure and elements within the activities folder. This is particularly useful if you're new to ReproSchema. By exploring these templates, you'll get a clearer picture of how activities are structured and what kind of information they contain.
  2. Delete and Start Fresh: Alternatively, if you already have a clear idea of what your protocol needs, you can delete these generated activities. This allows you to start from scratch, creating activities that are tailored specifically to your research needs.

The inclusion of activity choices aims to provide users with a practical understanding of how activities are structured within ReproSchema protocols. Whether you use these as a starting point or prefer to create your own from the ground up, these templates are there to guide you in structuring your research protocol effectively.

We provide more detailed instructions for customizing your protocol in the following pages using reproschema-demo-protocol as an example.

"},{"location":"42_adopt_assessments/","title":"Adopting Assessments from the reproschema-library","text":"

This part focuses on how to select and integrate assessments from the reproschema-library into your research protocol, an essential step in crafting a comprehensive study. The chosen assessments are to be placed in the activities folder within your repository. This folder serves as the central hub for various assessments or activities that collectively form your research protocol.

Each activity or assessment within this activities folder is typically structured around a file named with a suffix _schema. This file defines the overall framework of the assessment. Accompanying this, if an assessment comprises specific questions, these are organized in a subfolder titled items within the respective activity's directory. It's important to note that if an assessment is directly taken from the ReproSchema-library without any customization, the creation of an items subfolder is not necessary, as the itemized questions are predefined in the library.

To illustrate this process, we will use two specific types of assessments from reproschema-library: demographics and psychological questions. The latter represents a composite assessment created from multiple pre-existing assessments within the library. This example demonstrates how to combine different elements from the library to construct a bespoke assessment tailored to the unique demands of your research protocol.

"},{"location":"42_adopt_assessments/#step-1-understand-the-structure-of-a-_schema-file-throught-this-exemplar-file","title":"Step 1: Understand the structure of a *_schema file throught this exemplar file","text":"
  1. Context (@context): This field provides references to the context definitions. In this schema, it links to the generic context of ReproSchema and the specific context for the items in the repository, defined by the URL with the \"rl\" key. This context helps to interpret the terms used within the schema.
  2. Type (@type): Defined as \"reproschema:Activity,\" this indicates the nature of the document, specifying that it is an activity within the ReproSchema framework.
  3. Identifier (@id): The unique identifier for this specific schema is \"activity1_schema.\" This ID uniquely distinguishes this activity from others in the repository.
  4. PrefLabel: This is the human-readable name of the activity, here given as \"Screening.\" It serves as a clear and concise title for the activity.
  5. Description: Provides a brief overview of the activity, in this case, \"example of an activity.\"
  6. SchemaVersion and Version: These fields indicate the versions of the ReproSchema being used (\"1.0.0-rc2\" means \u201c1.0.0 Release Candidate 2\u201d) and the version of this particular activity schema (\"0.0.1\"), respectively.
  7. UI Configuration: This section specifies how the activity will be presented to users. It includes:
    • addProperties: Lists the variables and corresponding items collected in the activity. For example, the variable document_upload_item is about the item items/document_upload_item and is always visible (isVis: true). It allows for the item to be skipped (reproschema:Skipped).
    • order: Dictates the sequence in which items will appear in the UI. Here, it specifies that \"items/document_upload_item\" will be the first (and only) item.
    • shuffle: Indicates whether the order of items should be randomized. In this example, it is set to false, meaning the order is fixed.
    • allow: Defines additional UI functionalities. Here, it includes reproschema:AutoAdvance for automatic progression and reproschema:AllowExport to enable data export.
"},{"location":"42_adopt_assessments/#step-2-customizing-the-schema-file-for-demographics-using-existing-assessments-from-reproschema-library","title":"Step 2: Customizing the schema file for demographics using existing assessments from reproschema-library","text":"

This step involves precise modifications, particularly in the @context and addProperties sections, to ensure the schema accurately reflects the demographic data you aim to collect.

  1. Adjusting the @context for Demographics:

    In addition to the standard ReproSchema context, we've added a specific link in the \"@context\" section for demographics:

    \"demo\": \"https://raw.githubusercontent.com/ReproNim/reproschema-library/[commitID]/demographics_and_background_information_v1/items/\"

    Labeling this link as \"demo\" directs the schema to the location in the ReproSchema-library where items for demographics and background information are defined. We use the link with a specific commit ID to ensure the consistency of the assessment version. This contextual link allows the schema to access the detailed structures and definitions needed for each demographic item.

  2. Customizing \"addProperties\" for Demographic Variables:

    In the \"addProperties\" section, we define each variable that corresponds to a demographic question. For example:

    { \"variableName\": \"year_of_birth\", \"isAbout\": \"demo:year_of_birth\" }

    The \"variableName\": \"year_of_birth\" is where you specify the variable as the participant's year of birth. The \"isAbout\": \"demo:year_of_birth\" part establishes a link to the detailed structure of this item in the ReproSchema-library. The \"demo:\" prefix references the additional context you've added, guiding the schema to the correct location for the structure and details of the \"year_of_birth\" item.

    See the outcome file here

"},{"location":"42_adopt_assessments/#step-3-integrating-multiple-assessments","title":"Step 3: Integrating multiple assessments","text":"

Different from demograpgics, psychological_questionnaire_schema combines assessments, such as PHQ-9, GAD7, PC-PTSD-5, and demographics from reproschema-library.

  1. Contextual setup (@context):

    The @context section is expanded to include not only the generic ReproSchema context but also specific links to the ReproSchema-library. This enables the schema to access a broader range of predefined items and assessments. For the psychological questionnaire, two context links are established:

    \"@context\": [ \"https://raw.githubusercontent.com/ReproNim/reproschema/1.0.0-rc4/contexts/generic\", { \"activities\": \"https://raw.githubusercontent.com/ReproNim/reproschema-library/[commitID]/activities/\", \"demo\": \"https://raw.githubusercontent.com/ReproNim/reproschema-library/[commitID]/activities/demographics_and_background_information_v1/items/\" } ]

    A link to the activities in the reproschema-library (activities: ) and a link for demographics items (demo: ), both are commit-specific. This indicates that we will combine different assessments from those two parts.

  2. Defining the activity (@type, @id, prefLabel, etc.):

    The standard fields like @type, @id, prefLabel, description, preamble, schemaVersion, and version define the nature and purpose of the psychological questionnaire.

  3. UI configuration and integration of multiple assessments (ui):

    \"ui\": { \"addProperties\": [ { \"variableName\": \"phq-9\", \"isAbout\": \"activities:PHQ-9/PHQ9_schema\" }, { \"variableName\": \"gad-7\", \"isAbout\": \"activities:GAD7/GAD7_schema\" }, { \"variableName\": \"pc-ptsd-5\", \"isAbout\": \"activities:PC-PTSD-5/PC-PTSD-5_schema\" }, { \"variableName\": \"clinical_history_psychiatry\", \"isAbout\": \"demo:clinical_history_psychiatry\" }, { \"variableName\": \"clinical_history_psychiatry_other\", \"isAbout\": \"demo:clinical_history_psychiatry_other\" }, { \"variableName\": \"clinical_history_psychiatry_current\", \"isAbout\": \"demo:clinical_history_psychiatry_current\" }, { \"variableName\": \"clinical_history_psychiatry_current_only_some\", \"isAbout\": \"demo:clinical_history_psychiatry_current_only_some\" }, { \"variableName\": \"clinical_history_psychiatry_current_only_some_other\", \"isAbout\": \"demo:clinical_history_psychiatry_current_only_some_other\" } ], \"order\": [ \"activities:PHQ-9/PHQ9_schema\", \"activities:GAD7/GAD7_schema\", \"activities:PC-PTSD-5/PC-PTSD-5_schema\", \"demo:clinical_history_psychiatry\", \"demo:clinical_history_psychiatry_other\", \"demo:clinical_history_psychiatry_current\", \"demo:clinical_history_psychiatry_current_only_some\", \"demo:clinical_history_psychiatry_current_only_some_other\" ], \"shuffle\": false, \"allow\": [ \"reproschema:AutoAdvance\", \"reproschema:AllowExport\" ] }

    In the addProperties section, we define each variable that corresponds to a specific assessment. For instance: - \"variableName\": \"phq-9\" is linked to \"isAbout\": \"activities:PHQ-9/PHQ9_schema\". This implies that the PHQ-9 schema (an assessment for depressive symptoms) from the reproschema-library is used in the current psychological questionnaire schema. - Similarly, other assessments like GAD-7 and PC-PTSD-5 are included using their respective variable names and links to their schemas in the activities context. - Additional variables related to clinical history in psychiatry are linked using the demo context, pointing to specific items within the demographics and background information section of the reproschema-library.

    ```\n{\n    \"variableName\": \"clinical_history_psychiatry\",\n    \"isAbout\": \"demo:clinical_history_psychiatry\"\n}\n```\n
    • The order array specifies the sequence in which these assessments will appear in the questionnaire, ensuring a logical flow for participants.
    • The shuffle setting is false, maintaining the defined order, and allow includes functionalities like auto-advance between assessments and data export.

See the outcome here

"},{"location":"43_create_new_assess/","title":"Creating New Assessments for Unique Research Needs","text":"

This section provides the customized new assessments tailored to specific research needs. Our focus is on creating three distinct types of activities that are not readily available in the reproschema-library. These include: (1) clinical questions to gather clinical background information, (2) a speech task designed to collect audio data, and (3) an audio check to facilitate the speech task.

For each of these new assessments, the folder structure within the repository will differ slightly from those directly adopted from the reproschema-library. Specifically, each activity has its own dedicated folder within the activities directory. For instance, the speech task resides in activities/4_speech. Within this folder, besides the primary schema file (e.g., speech_schema), there is an additional subfolder named items. This items folder contains individual questions or tasks pertaining to that specific activity.

In the case of the speech task, the items folder might include a single task designed to prompt the participant to provide a speech sample. Similarly, for the clinical questions, their respective folders will contain items subfolders with corresponding questions tailored to elicit the required information.

The structure of an item within the items folder of a ReproSchema activity is similar to the schema template, but with key differences that cater to the specifics of individual data collection elements. Here's an explanation of the provided template for a country item:

  1. Context and type (@context, @type): The @context remains the same, pointing to the generic context of ReproSchema. The @type is now \"reproschema:Field\" instead of \"reproschema:Activity\". This change signifies that this template defines a single data collection field or question within an activity, as opposed to the overall structure of an activity.
  2. Identifier and descriptive fields (@id, prefLabel, description, etc.): @id serves as a unique identifier for the item, here named \"country_item\". prefLabel and description provide a human-readable name and a brief description of the item, similar to their use in the schema template.
  3. Question field (question): This field contains the actual question or prompt that will be presented to the participant. In this template, it reads: \"This is an item where the user can select a country.\"
  4. UI configuration (ui): The ui section in the item template differs from the schema template. It specifies how the question will be presented to the user. The inputType is set to \"selectCountry\", indicating that the user interface will provide a country selection method.
  5. Response options (responseOptions): This section defines the nature and structure of the responses allowed for the item. In this example, it specifies the valueType as \"xsd:string\" and a maxLength of 50 characters. It also provides a URL to a list of choices, in this case, a JSON file containing country names. This link allows the questionnaire to dynamically fetch and display a list of countries as response options.
\"responseOptions\": {\n    \"valueType\": \"xsd:string\",\n    \"maxLength\": 50,\n    \"choices\": \"https://raw.githubusercontent.com/samayo/country-json/master/src/country-by-name.json\"\n}\n
"},{"location":"43_create_new_assess/#step-1-specifying-inputtype-and-responseoption-to-gather-precise-data","title":"Step 1: Specifying inputType and responseOption to gather precise data","text":"

We have crafted ten items in the 'items' folder for the clinical questions assessment. Each item, such as alcohol_consumption, height, weight, etc., has its ui inputType and responseOptions specifically defined to suit the nature of the question.

Take 'alcohol_consumption' as an example. The UI configuration and response options for this question are tailored to capture a straightforward piece of information:

\"question\": {\n    \"en\": \"Have you drunk alcohol today?\",\n    \"es\": \"\u00bfHas bebido alcohol hoy?\"\n    },\n\"ui\": {\n    \"inputType\": \"radio\"\n    },\n\"responseOptions\": {\n    \"valueType\": \"xsd:string\",\n    \"multipleChoice\": false,\n    \"choices\": [\n        {\n            \"name\": {\n                \"en\": \"Yes\",\n                \"es\": \"S\u00ed\"\n                },\n            \"value\": 1\n         },\n         {\n            \"name\": {\n                \"en\": \"No\",\n                 \"es\": \"No\"\n                 },\n            \"value\": 2\n        }\n    ]\n}\n
  • The ui section sets the inputType to \"radio\". This choice indicates that the question will be presented to the participant as a radio button selection, providing a simple and clear interface for response selection.
  • In the responseOptions, the valueType is defined as \"xsd:string\", signifying that the expected type of response is a string. The multipleChoice field is set to false, indicating that participants can only select one of the provided options.
  • The choices array lists the possible responses. In this case, there are two: \"Yes\" and \"No\", each with a corresponding value (1 for Yes, 2 for No) and translations provided for English (\"en\") and Spanish (\"es\").

  • For the speech task in our demo project, the configuration of ui inputType and responseOptions is distinctively tailored to facilitate audio data collection:

\"ui\": {\n    \"inputType\": \"audioPassageRecord\"\n},\n\"responseOptions\": {\n    \"valueType\": \"schema:AudioObject\",\n    \"minValue\": 0,\n    \"maxValue\": 60000\n}\n
  • In the ui section, the inputType is set to \"audioPassageRecord\". This specific input type is designed to enable participants to record an audio passage directly within the questionnaire interface.
  • The responseOptions are configured to accommodate the nature of audio data.
  • The valueType is specified as \"schema:AudioObject\", indicating that the response will be an audio file.
  • The fields minValue and maxValue define the allowable duration of the audio recording in milliseconds. In this case, the maximum duration is set to 60,000 milliseconds (or 1 minute).
"},{"location":"43_create_new_assess/#step-2-integrating-additional-components-for-activity-specific-needs","title":"Step 2: Integrating additional components for activity-specific needs","text":"

We can integrate additional components tailored to the unique requirements of specific activities. For instance, considering the unique needs of our speech task, we add an 'audio check' component to confirm the functionality of the audio recording feature.

  1. Setting up an audio check for the speech task

    To ensure the effectiveness of our speech task, we create an activity for audio verification within the activities folder, naming it 0_audio. This folder contains the audio_check_schema, a schema specifically designed to test and confirm that the audio recording system is operational and effective for participants.

  2. Contextual and properties configuration for audio check

    \"@context\": [\n    \"https://raw.githubusercontent.com/ReproNim/reproschema/1.0.0-rc4/contexts/generic\",\n    {\n        \"voice\": \"https://raw.githubusercontent.com/ReproNim/reproschema-library/43e7afab312596708c0ad4dfd45b69c8904088ae/activities/VoiceTask/items/\"\n    }\n]\n
The @context section includes a specific context link under \"voice\", pointing to the repository with items relevant to voice and audio tasks: \"<https://raw.githubusercontent.com/ReproNim/reproschema-library/.../VoiceTask/items/>\" This targeted link ensures that the audio check activity aligns with the specific requirements of voice-related tasks.\n\nThe ui's `addProperties` array is tailored for the audio check. We define a property `\"variableName\": \"audio_check\"` linked to `\"isAbout\": \"voice:audio_check\"`.\n
"},{"location":"44_setup_feedback/","title":"Adding a customized feedback section","text":"

To conclude our protocol, we integrate a customized feedback activity. This choice of ending with participant feedback is just one of many possibilities, demonstrating the adaptability of ReproSchema to diverse research needs.

{\n    \"@context\": \"https://raw.githubusercontent.com/ReproNim/reproschema/1.0.0-rc4/contexts/generic\",\n    \"@type\": \"reproschema:Field\",\n    \"@id\": \"feedback\",\n    \"prefLabel\": \"Feedback\",\n    \"description\": \"schema to record text response of overall feedback of the protocol\",\n    \"schemaVersion\": \"1.0.0-rc4\",\n    \"version\": \"0.0.1\",\n    \"question\": {\n        \"en\": \"Please leave any comments or suggestions on the study so we can improve it (or skip):\",\n        \"es\": \"Deje cualquier comentario o sugerencia sobre el estudio para que podamos mejorarlo (u omitir):\"\n    },\n    \"ui\": {\n        \"inputType\": \"textarea\"\n    },\n    \"responseOptions\": {\n        \"valueType\": \"xsd:string\"\n    }\n}\n

The feedback item in this activity (5_feedback) is specifically designed to gather open-ended responses, allowing participants to share their thoughts and suggestions:

  • Item Structure: The item feedback is set up with an identification and purpose, indicated by its '@id' and descriptive fields.
  • Question Prompt: The question is presented in both English and Spanish, encouraging participants to provide comments on their study experience. It\u2019s formatted to be inclusive, giving participants the option to skip if they choose.
  • UI Configuration for Open Responses: The choice of textarea as the inputType in the ui configuration facilitates extended text input, enabling participants to express detailed feedback comfortably. Accordingly, valueType in the responseOptions has been set as \"xsd:string\".
"},{"location":"45_finalize_protocol/","title":"Finalizing the Protocol","text":"

After setting up individual activities, we return to the main protocol schema to organize everything cohesively. This step involves structuring the 'DemoProtocol_schema' to include all the activities we have developed, defining their sequence and presentation within the overall research protocol. In the 'DemoProtocol_schema', located in the 'DemoProtocol' folder, we integrate each activity schema using the following approach:

  1. Context and protocol definition

    The @context, @type, @id, and descriptive fields (prefLabel, description, etc.) provide the foundational information about the protocol.

  2. Inclusion of activities

    The ui section's addProperties array is crucial. Here, each activity schema we've created is referenced under isAbout, with its respective variableName and prefLabel. For example, the audio activity is linked as

{\n    \"isAbout\": \"../activities/0_audio/audio_check_schema\",\n    \"variableName\": \"audio_check_schema\",\n    \"prefLabel\": {\"en\": \"Audio Check\"}\n}\n
This structure is repeated for each activity, including audio check, demographics, psychological questions, clinical questions, speech task, and feedback.\n
  1. Order of presentation

    The order array within ui specifies the sequence in which these activities will appear in the protocol. It's arranged to flow logically from consent, through various assessments, to the final feedback, ensuring a structured participant experience. For instance, the order starts with ../activities/0_audio/audio_check_schema and progresses through to ../activities/5_feedback/feedback_schema.

  2. Additional UI settings

    • 'shuffle' is set to false to maintain the specified order.
    • 'allow' includes functionalities such as 'reproschema:AllowExport' for data exporting options.
  3. Update README.md

    Give clear and concise instructions on what this protocol is about and how participants should use it.

Upon finalizing our protocol with the integrated activities, the end result is a fully interactive research tool hosted on our GitHub repository. For data collection, this tool can be linked to a backend server, or participants can be given the option to export their data directly.

"},{"location":"46_tools/","title":"Toolkit","text":"

In the world of research data management, flexibility and compatibility are key. Understanding this, we provide specialized tools designed to create, validata schemas, and convert data between ReproSchema format and REDCap CSV format. Whether you're transitioning from REDCap to ReproSchema or vice versa, these tools ensure a smooth and efficient conversion process, preserving the integrity and structure of your data.

"},{"location":"46_tools/#install-reproschema-py","title":"Install reproschema-py","text":"
pip install reproschema\n
"},{"location":"46_tools/#cli-usage","title":"CLI usage","text":"

reproschema-py can be used as a Commend-Line Interface.

$ reproschema\nUsage: reproschema [OPTIONS] COMMAND [ARGS]...\n\n  A client to support interactions with ReproSchema\n\n  To see help for a specific command, run\n\n  reproschema COMMAND --help     e.g. reproschema validate --help\n\nOptions:\n  --version\n  -l, --log-level [DEBUG|INFO|WARNING|ERROR|CRITICAL]\n                                  Log level name  [default: INFO]\n  --help                          Show this message and exit.\n\nCommands:\n  convert\n  create\n  redcap2reproschema  Convert REDCap CSV files to Reproschema format.\n  reproschema2redcap  Convert reproschema protocol to REDCap CSV format.\n  serve\n  validate\n
"},{"location":"46_tools/#reproschema2redcap-usage","title":"reproschema2redcap Usage","text":"

To convert ReproSchema protocol to REDCap CSV format, use the following command

reproschema reproschema2redcap <input_dir_path> <output_csv_filename>\n
  • <input_dir_path>: The path to the root folder of a protocol. For example, to convert the reproschema-demo-protocol provided by ReproNim, you can use the following commands:

bash git clone https://github.com/ReproNim/reproschema-demo-protocol.git cd reproschema-demo-protocol pwd

In this case, the output from pwd (which shows your current directory path)should be your <input_dir_path>. - <output_csv_filename>: The name of the output CSV file where the converted data will be saved.

"},{"location":"46_tools/#redcap2reproschema-usage","title":"redcap2reproschema Usage","text":"

The redcap2reproschema function is designed to process a given REDCap CSV file and YAML configuration to generate the output in the reproschema format.

"},{"location":"46_tools/#prerequisites","title":"Prerequisites","text":"

Before the conversion, ensure you have the following:

YAML Configuration File:

  • Download templates/redcap2rs.yaml and fill it out with your protocol details.
"},{"location":"46_tools/#yaml-file-configuration","title":"YAML File Configuration","text":"

In the templates/redcap2rs.yaml file, provide the following information:

  • protocol_name: This is a unique identifier for your protocol. Use underscores for spaces and avoid special characters.
  • protocol_display_name: The name that will appear in the application.
  • protocol_description: A brief description of your protocol.

Example:

protocol_name: \"My_Protocol\"\nprotocol_display_name: \"Assessment Protocol\"\nprotocol_description: \"This protocol is for assessing cognitive skills.\"\n

The redcap2reproschema function has been integrated into a CLI tool, use the following command:

reproschema redcap2reproschema path/to/your_redcap_data_dic.csv path/to/your_redcap2rs.yaml\n

Those tools can also be used as Python functions. For detailed instructions, please visit reproschema-py.

"},{"location":"98_FAQ/","title":"FAQ","text":""},{"location":"98_FAQ/#what-is-the-semantic-web","title":"What is the semantic web?","text":"

When you request access to a certain document by clicking on a hyperlink, the computer will give a visual rendering of the html code of this document. But computer used to do that in pretty \"silly\" fashion: it would give you a human-readable version of the content, but the computer would not make the distinction if a certain element in the webpage (for example a paragraph) was referring to a person or a place or a song.

What the semantic wed allows is to \"inject\" additional information into a webpage so that a machine can know what certain elements are about (e.g \"this image is about a cat.\") or how they are linked to other elements (on the same page or somewhere else on the web). The tagged content of a webpage thus acquires \"meaning\" from the point of view of the computer, making the semantic content of the code machine-readable.

"},{"location":"98_FAQ/#more-info","title":"More info","text":"
  • wikipedia article on the semantic web
  • A short video intro to the semantic web by Manu Sporny:
"},{"location":"98_FAQ/#what-is-linked-data","title":"What is linked data?","text":""},{"location":"98_FAQ/#the-theory","title":"The theory","text":"

The same way that an element in webpage could be given \"meaning\" by tagging with extra information about the nature of this element, the same can be done with data. Hence a given row on a spreadsheet stored somewhere on the web can be tagged and linked to another piece of data on another website.

\"Linked data is a way to create a network of standards-based machine interpretable data across different documents and Web sites. It allows an application to start at one piece of Linked Data, and follow embedded links to other pieces of Linked Data that are hosted on different sites across the Web.\" [source]

Linked data has some basic principles behind it (adapted from wikipedia):

  • Use Unique Resources identifiers (URI) to name (identify) things.
  • Use HTTP URIs so that these things can be looked up.
  • Provide useful information about what a name identifies when it's looked up.
  • Refer to other things using their HTTP URI-based names when publishing data on the Web.
"},{"location":"98_FAQ/#a-more-concrete-example","title":"A more concrete example","text":"

As things might be be quite abstract, here is a simple example of linked data to help make things more concrete:

{\n  \"@context\": \"http://schema.org\",\n  \"name\": \"Barack Obama\",\n  \"givenName\": \"Barack\",\n  \"familyName\": \"Obama\",\n  \"jobTitle\": \"44th President of the United States\"\n}\n

You can see that the file is organised in pairs of \"key\": \"value\". The @context gives you the base URL of the website where you can find more information about the different properties of this piece of data.

What follows (name, givenNAme, familyName, ...) are the actual properties about this data and in front of it the values that this data takes for each property (in this case: \"Barack Obama\", \"Barack\", \"Obama\").

Now go and look up what is hiding behind one of those property by going to the URL made of the base URL + the property name, for example https://schema.org/familyName. This is the HTTP URI of familyName and this gives you a description of the familyName property.

Well \"So what?\" you might say. Well it also tells you which type of data this property it can be applied to: in this case, the Person type (see its description here). So even though, we never wrote anywhere explicitly that this data describes a person, a computer able to parse that piece of linked data above would \"know\" this.

"},{"location":"98_FAQ/#more-info_1","title":"More info","text":"
  • Here is a TED talk by Tim Berners-Lee on linked data.
  • A short video intro to linked data by Manu Sporny:
"},{"location":"98_FAQ/#what-is-json-ld","title":"What is JSON-LD?","text":""},{"location":"98_FAQ/#what-is-json","title":"What is JSON?","text":"

OK before we go for JSON-LD, let's start with JSON. JSON stands for JavaScript Object Notation and is just a specific format for a text file. This type of text file is very often used by website when they need to transmit information to one another.

If you want to see an example of how this works, here is dummy example of the response to a request made by one website to another about a list of employees. By default the output of this dummy example is presented in a way that is more pleasing to the human eye, but if you click on Raw Data, you will see the raw unformatted JSON file that was returned by the website. Copy-paste in a text editor, it should like the big ugly and scary one-liner below that we, mere mortals, have no idea what to do with, but that a computer has no problem making sense of.

Insert image ???

\n{\"status\":\"success\",\"data\":[{\"id\":\"1\",\"employee_name\":\"Tiger Nixon\",\"employee_salary\":\"320800\",\"employee_age\":\"61\",\"profile_image\":\"\"},{\"id\":\"2\",\"employee_name\":\"Garrett Winters\",\"employee_salary\":\"170750\",\"employee_age\":\"63\",\"profile_image\":\"\"},{\"id\":\"3\",\"employee_name\":\"Ashton Cox\",\"employee_salary\":\"86000\",\"employee_age\":\"66\",\"profile_image\":\"\"},{\"id\":\"4\",\"employee_name\":\"Cedric Kelly\",\"employee_salary\":\"433060\",\"employee_age\":\"22\",\"profile_image\":\"\"},{\"id\":\"5\",\"employee_name\":\"Airi Satou\",\"employee_salary\":\"162700\",\"employee_age\":\"33\",\"profile_image\":\"\"},{\"id\":\"6\",\"employee_name\":\"Brielle Williamson\",\"employee_salary\":\"372000\",\"employee_age\":\"61\",\"profile_image\":\"\"},{\"id\":\"7\",\"employee_name\":\"Herrod Chandler\",\"employee_salary\":\"137500\",\"employee_age\":\"59\",\"profile_image\":\"\"},{\"id\":\"8\",\"employee_name\":\"Rhona Davidson\",\"employee_salary\":\"327900\",\"employee_age\":\"55\",\"profile_image\":\"\"},{\"id\":\"9\",\"employee_name\":\"Colleen Hurst\",\"employee_salary\":\"205500\",\"employee_age\":\"39\",\"profile_image\":\"\"},{\"id\":\"10\",\"employee_name\":\"Sonya Frost\",\"employee_salary\":\"103600\",\"employee_age\":\"23\",\"profile_image\":\"\"},{\"id\":\"11\",\"employee_name\":\"Jena Gaines\",\"employee_salary\":\"90560\",\"employee_age\":\"30\",\"profile_image\":\"\"},{\"id\":\"12\",\"employee_name\":\"Quinn Flynn\",\"employee_salary\":\"342000\",\"employee_age\":\"22\",\"profile_image\":\"\"},{\"id\":\"13\",\"employee_name\":\"Charde Marshall\",\"employee_salary\":\"470600\",\"employee_age\":\"36\",\"profile_image\":\"\"},{\"id\":\"14\",\"employee_name\":\"Haley Kennedy\",\"employee_salary\":\"313500\",\"employee_age\":\"43\",\"profile_image\":\"\"},{\"id\":\"15\",\"employee_name\":\"Tatyana Fitzpatrick\",\"employee_salary\":\"385750\",\"employee_age\":\"19\",\"profile_image\":\"\"},{\"id\":\"16\",\"employee_name\":\"Michael Silva\",\"employee_salary\":\"198500\",\"employee_age\":\"66\",\"profile_image\":\"\"},{\"id\":\"17\",\"employee_name\":\"Paul Byrd\",\"employee_salary\":\"725000\",\"employee_age\":\"64\",\"profile_image\":\"\"},{\"id\":\"18\",\"employee_name\":\"Gloria Little\",\"employee_salary\":\"237500\",\"employee_age\":\"59\",\"profile_image\":\"\"},{\"id\":\"19\",\"employee_name\":\"Bradley Greer\",\"employee_salary\":\"132000\",\"employee_age\":\"41\",\"profile_image\":\"\"},{\"id\":\"20\",\"employee_name\":\"Dai Rios\",\"employee_salary\":\"217500\",\"employee_age\":\"35\",\"profile_image\":\"\"},{\"id\":\"21\",\"employee_name\":\"Jenette Caldwell\",\"employee_salary\":\"345000\",\"employee_age\":\"30\",\"profile_image\":\"\"},{\"id\":\"22\",\"employee_name\":\"Yuri Berry\",\"employee_salary\":\"675000\",\"employee_age\":\"40\",\"profile_image\":\"\"},{\"id\":\"23\",\"employee_name\":\"Caesar Vance\",\"employee_salary\":\"106450\",\"employee_age\":\"21\",\"profile_image\":\"\"},{\"id\":\"24\",\"employee_name\":\"Doris Wilder\",\"employee_salary\":\"85600\",\"employee_age\":\"23\",\"profile_image\":\"\"}]}\n\n

By the way, if you ever come across such monstrosity and you want to turn into something you as a human being can understand (or least read), you can copy-paste it in a validator-formatter like jsonformatter or jsonlint. This will quickly tell you a) whether this is a valid JSON format (eaning if it respects the rules of how a JSON file should be formatted) and b) it will highlight and help you navigate the nested and hierarchical nature of the JSON file.

Insert image ???

OK but let's start with a much simpler example of a JSON file, like the one below which could be the content of JSON file returned by a website when asked about a certain person.

{\n  \"name\": \"Barack Obama\",\n  \"givenName\": \"Barack\",\n  \"familyName\": \"Obama\",\n  \"jobTitle\": \"44th President of the United States\"\n}\n

Looks familiar? It is very close to the one we had at the end of the previous FAQ section.

"},{"location":"98_FAQ/#from-json-to-json-ld","title":"From JSON to JSON-LD","text":"

Now say you would like to use this JSON file to represent a piece of linked-data. The only thing you would need to do in this specific case is to provide the @context line we saw before that will give a precise and unambiguous meaning to the following lines.

{\n  \"@context\": \"http://schema.org\",\n  \"name\": \"Barack Obama\",\n  \"givenName\": \"Barack\",\n  \"familyName\": \"Obama\",\n  \"jobTitle\": \"44th President of the United States\"\n}\n

\ud83c\udf89 Congratulations! \ud83c\udf89

You now have a valid JSON-LD. If you want to make sure it is valid, you can copy-paste that into the JSON-LD playground. If you to to visualize the \"linked\" aspect of that data, you can click on the Visualized tab and this will give you a graph where that connects the different nodes (piece of information to one another).

If you want to visualize a more complex graph, we can try that with one of the JSON-LD file that describe one of the protocols of the reproschema like the one here. Actually if you want to test get the raw content of the file you should click on Raw. You can then either use the raw content of the file or the URL of this raw file which should be something like:

https://raw.githubusercontent.com/ReproNim/reproschema/master/protocols/VoicePilot/VoicePilot_schema\n

directly into the JSON-LD playground to see whether it is a valid JSON-LD and how the different elements are connected.

"},{"location":"98_FAQ/#more-info_2","title":"More info","text":"
  • It would be a stretch to say that the JSON-LD specifications make for a fascinating read that will keep you up at night (although they might but mostly out of frustration) but it is good to know that it is out there in case you eventually need to look something up
  • Two short videos by Manu Sporny about JSON-LD and core mark up features JSON-LD:
"},{"location":"98_FAQ/#why-is-linked-data-important-for-the-reproschema","title":"Why is linked data important for the ReproSchema ?","text":""},{"location":"98_FAQ/#which-assessments-tools-willare-supporting-this-standard","title":"Which assessments tools will/are supporting this standard?","text":"

At the moment, all the assessments that support this standard are listed in this folder or the reproschema-library repository.

If you want to see those different tools in action using our user interface, you can explore them on schema.repronim.org/.

The ReproSchema is also used to develop a checklist to improve methods and results reporting in neuroimaging.

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#why-should-i-use-reproschema","title":"Why should I use ReproSchema?","text":"

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#who-is-reproschema-for","title":"Who is ReproSchema for?","text":"

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#how-can-i-know-if-a-certain-property-is-supported-by-reproschema","title":"How can I know if a certain property is supported by ReproSchema?","text":"

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#how-can-i-add-a-property-to-my-schema","title":"How can I add a property to my schema?","text":"

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#how-are-these-assessments-licensed","title":"How are these assessments licensed?","text":"

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#how-can-i-contribute-to-the-project","title":"How can I contribute to the project?","text":"

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#an-assessment-tool-i-regularly-use-is-not-supported-by-reproschema-how-can-i-add-it","title":"An assessment tool I regularly use is not supported by ReproSchema: how can I add it?","text":"

\ud83d\udee0 Work in progress \ud83d\udee0

"},{"location":"98_FAQ/#how-can-i-visualize-the-schema-for-a-protocol-or-an-activity","title":"How can I visualize the schema for a protocol or an activity?","text":"

If you want to see what the assessment that are already supported by the ReproSchema would look like using our ReproSchema user-interface, you can visualize them directly on schema.repronim.org.

If you just want to view a protocol or activity you are developing using the reproschema-ui, you can pass the URL of the schema to the url query parameter like this:

https://schema.repronim.org/ui/#/?url=url-to-your-schema

If you are hosting a schema on github, make sure that you are passing the URL of the raw content of the schema. For example, our demo protocol can be accessed at this URL:

https://github.com/ReproNim/demo-protocol/blob/master/VoicePilot/VoicePilot_schema

But to get access to the raw content of that file you must click on the Raw button once you have opened that page on github that will open this URL:

https://raw.githubusercontent.com/ReproNim/demo-protocol/master/VoicePilot/VoicePilot_schema.

If you want to visualize the graph represented by the JSON-LD file, we explain how to do this in From JSON to JSON-LD.

"},{"location":"99_glossary/","title":"Glossary","text":"
  • activity
  • compute specification
  • input type
  • item
  • JSON
  • JSON-LD
  • protocol
  • SHACL
  • visibility
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000000..6517c2ae65 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,68 @@ + + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + + None + 2024-02-14 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000..cd3466e0b8 Binary files /dev/null and b/sitemap.xml.gz differ