Esempio n. 1
0
    def uploadToGNode(self):

        self.csvData = extractCSVMetaData(self.csvFile, self.expName)

        self.dataBlockToUpload = Block(name=self.blockName, file_origin=self.expName)

        raw_seg = Segment(name='rawData', index=0)

        self.vibrationSignal.name = 'Vibration Stimulus'
        self.vibrationSignal.description = 'Vibration Stimulus applied to the honey bee antenna'
        self.voltageSignal.name = 'Membrane Potential'
        self.voltageSignal.description = 'Vibration Sensitive inter-neuron membrane potential'
        self.vibrationSignal.segment = raw_seg
        self.voltageSignal.segment = raw_seg

        raw_seg.analogsignals.append(self.vibrationSignal)
        raw_seg.analogsignals.append(self.voltageSignal)

        if len(self.dataBlock.segments[0].analogsignals) > 2:

            self.currentSignal.name = 'Current Signal'
            self.currentSignal.description = 'Indicates whether a current is being injected or not. The magnitudes ' \
                                             'are given in an event array'

            self.currentSignal.segment = raw_seg
            raw_seg.analogsignals.append(self.currentSignal)

            if len(self.dataBlock.segments[0].eventarrays) == 2:
                raw_seg.eventarrays.append(self.dataBlock.segments[0].eventarrays[1])
                self.dataBlock.segments[0].eventarrays[1].segment = raw_seg

        raw_seg.block = self.dataBlockToUpload
        self.dataBlockToUpload.segments.append(raw_seg)

        self.doc = odml.Document(author="Ajayrama K.", version="1.0")

        self.mainSec = odml.Section(name=self.expName, type='experiment')
        self.doc.append(self.mainSec)

        expSummary = odml.Section(name='VibrationStimulus', type='experiment/electrophysiology')

        quantity_parser = lambda lst: [odml.Value(data=float(x), unit=x.dimensionality.string) for x in lst]

        frequencies = quantity_parser(self.csvData['freqs'])
        if frequencies:
            expSummary.append(odml.Property(name='FrequenciesUsed', value=frequencies))

        durations = quantity_parser(self.csvData['pulse'][0])
        if durations:
            expSummary.append(odml.Property(name='PulseInputDurations', value=durations))

        intervals = quantity_parser(self.csvData['pulse'][1])
        if intervals:
            expSummary.append(odml.Property(name='PulseInputIntervals', value=intervals))

        expSummary.append(odml.Property(name='SpontaneousActivityPresence', value=self.csvData['spont']))

        if not self.csvData['resp'] == '':
            expSummary.append(odml.Property(name='NatureOfResponse', value=self.csvData['resp']))

        self.mainSec.append(expSummary)

        print asctime() + ' : Uploading metadata'
        doc = self.session.set_all(self.doc)
        print asctime() + ' : Uploading metadata Done'

        print asctime() + ' : Refreshing metadata'
        mainSec = self.session.get(doc.sections[0].location, refresh=True, recursive=True)
        print asctime() + ' : Refreshing metadata Done'

        self.dataBlockToUpload.section = mainSec

        print asctime() + ' : Uploading Data'
        blkLoc = self.session.set_all(self.dataBlockToUpload)
        print asctime() + ' : Uploading Data Done'
Esempio n. 2
0
    def test_section_proxy(self):
        s = odml.Section("sec1")
        p = odml.Property(name="p", value="1")
        s.append(p)

        ps = proxy.MappedSection(s)

        # forward attributes
        ps.name = "sec2"
        self.assertEqual(s.name, "sec2")

        p2 = odml.Property(name="p2", value="2")

        # append to proxy section, creates a proxy in ps
        # and the original object in s
        ps.append(p2)

        self.assertIn(p2, s)
        self.assertIn(p2, ps)
        self.assertIs(s.contains(p2), p2)
        self.assertIsInstance(ps.contains(p2), proxy.Proxy)

        # removing from proxy section, removes both
        ps.remove(p2)
        self.assertNotIn(p2, s)
        self.assertNotIn(p2, ps)

        # appending to section, creates a proxy in ps
        s.append(p2)
        self.assertIn(p2, s)
        self.assertIn(p2, ps)
        self.assertIs(s.contains(p2), p2)
        self.assertIsInstance(ps.contains(p2), proxy.Proxy)

        # removing removes from ps too
        s.remove(p2)
        self.assertNotIn(p2, s)
        self.assertNotIn(p2, ps)

        # appending creates in both, removing in ps removes in both
        s.append(p2)
        ps.remove(p2)
        self.assertNotIn(p2, s)
        self.assertNotIn(p2, ps)

        # append a proxy to ps, both original and proxy compare to
        # be 'in' ps
        pp = proxy.PropertyProxy(p)
        # you can use proxy_append to add an explicit proxy obj (without affecting
        # the original section) or you can append the object to the original section
        # so that the proxy object is created in the proxy section, too
        ps.proxy_append(pp) # this one is only in ps
        self.assertIn(pp, ps)
        self.assertIn(p, ps) # as p == pp, this also holds true

        # even if the name is changed
        ps.name = "p3"
        self.assertEqual(p.name, "p") # does not change the name of p
        self.assertEqual(ps.name, "p3") # but the one of ps

        self.assertIn(pp, ps) # both are in ps though
        self.assertIn(p, ps)

        # and we can remove it again
        ps.remove(p)
        self.assertNotIn(p, ps)
        self.assertNotIn(pp, ps)
        self.assertNotIn(p, s)

        s2 = odml.Section("sec3")
        # a mapped section added to another mapped section
        # will only appear there
        ps2 = proxy.MappedSection(s2)
        ps.proxy_append(ps2)

        self.assertIn(ps2, ps)
        self.assertIn(s2, ps)
        self.assertNotIn(s2, s)

        # and we can remove it again
        ps.remove(s2)
        self.assertNotIn(ps2, ps)
Esempio n. 3
0
def get_odml_doc(dtypes):
    # CREATE A DOCUMENT
    doc = odml.Document(version='0.0.1')
    doc.author = 'Author1'
    doc.date = datetime.date.today()
    doc.version = '0.0.1'
    doc.repository = ''

    # APPEND MAIN SECTIONS
    doc.append(
        odml.Section(name='Animal',
                     definition='Information about the animal used'))

    parent = doc['Animal']
    parent.append(
        odml.Section(
            'Development',
            definition='Information about the development of the animal'))

    parent = doc['Animal']['Development']
    parent.append(
        odml.Section('dev_measures_template',
                     type='template',
                     definition='Developmental data of a single day'))

    parent = doc['Animal']
    parent.append(
        odml.Property(name='AnimalID',
                      definition='ID of the animal used for this experiment'))
    parent.append(
        odml.Property(name='Species', definition='Species of the animal'))
    parent.append(
        odml.Property(name='Strain', definition='Strain of the animal'))
    parent.append(odml.Property(name='Sex', definition='Sex of the animal'))
    parent.append(
        odml.Property(name='Birthdate', definition='Birthdate of the animal'))
    parent.append(
        odml.Property(name='BirthAge',
                      unit='days',
                      definition='Time of birth after conception'))
    parent.append(
        odml.Property(name='MotherID', definition='AnimalID of the mother'))

    parent = doc['Animal']['Development']
    parent.append(
        odml.Property(name='EyeOpening',
                      definition='Date of first eye opening'))
    parent.append(
        odml.Property(
            name='GraspingReflex',
            definition='Date of first observation of grasping reflex'))

    parent = doc['Animal']['Development']['dev_measures_template']
    parent.append(
        odml.Property(name='Weight',
                      unit='g',
                      definition='Weight of the animal'))
    parent.append(
        odml.Property(name='BodyLength',
                      unit='cm',
                      definition='Distance from nose to tail tip [cm]'))
    parent.append(
        odml.Property(name='TailLength',
                      unit='cm',
                      definition='Length of the tail'))
    parent.append(
        odml.Property(
            name='Date',
            definition='Date of recording of this set of developmental measures'
        ))
    parent.append(
        odml.Property(
            name='CliffAvoidance',
            unit='s',
            definition='Time after which cliff aversion reflex is observed'))
    parent.append(
        odml.Property(
            name='DevelopmentalAge',
            definition=
            'Developmental age of the animal in days after birth (P_)'))

    return doc
Esempio n. 4
0
parent.append(
    odml.Section(name="Tricia Marie McMillan",
                 type="crew/person",
                 definition="Information on Trillian Astra"))

parent.append(
    odml.Section(name="Ford Prefect",
                 type="crew/person",
                 definition="Information on Ford Prefect"))

# APPEND PROPERTIES WITH VALUES
parent.append(
    odml.Property(name="NameCrewMembers",
                  value=[
                      "Arthur Philip Dent", "Zaphod Beeblebrox",
                      "Tricia Marie McMillan", "Ford Prefect"
                  ],
                  dtype=odml.DType.person,
                  definition="List of crew members names"))

parent.append(
    odml.Property(name="NoCrewMembers",
                  value=4,
                  dtype=odml.DType.int,
                  definition="Number of crew members",
                  uncertainty=1,
                  reference="The Hitchhiker's guide to the Galaxy (novel)"))

# SET NEW PARENT NODE
parent = doc['TheCrew']['Arthur Philip Dent']
Esempio n. 5
0
def setup_tutorodml():
    doc = odml.Document(version='0.0.x')
    doc.author = 'FirstName LastName'
    doc.date = datetime.date.today()
    doc.version = '0.0.x'
    doc.repository = '/myserver/myrepo'

    # APPEND MAIN SECTIONS
    doc.append(odml.Section(name='MySection',
                            type='<Enter the type of data this section is'
                                 ' associated with, e.g. hardware>',
                            definition='<Describe the purpose of sections '
                                       'in short statements in this '
                                       'column.>'))
    doc.append(odml.Section(name='OneMoreSection',
                            type='<Enter the type of data this section is'
                                 ' associated with, e.g. software>',
                            definition='<Use only the first cell in this '
                                       'column to for the section '
                                       'description.>'))

    parent = doc['OneMoreSection']
    parent.append(odml.Section('MySubsection',
                               type='<Enter the type of data this section'
                                    ' is associated with, e.g. settings>',
                               definition='<Describe the purpose of this '
                                          'section here (eg. everything '
                                          'concerning the amplifier '
                                          'used...)'))

    # ADDING PROPERTIES
    parent = doc['MySection']
    parent.append(odml.Property(name='MyFirstProperty',
                                values='MyFirstValue',
                                dtype='str',
                                unit=None,
                                uncertainty=None,
                                definition='<Enter a short definition of '
                                           'the property and the associated '
                                           'value described here>'))
    parent.append(odml.Property(name='MultiValuedProperty',
                                values=[2.001, 4],
                                dtype='float',
                                unit='mm',
                                uncertainty=0.02,
                                definition='A section can have multiple properties attached and '
                                           'a property can contain multiple values.'))

    parent = doc['OneMoreSection']
    parent.append(odml.Property(name='MyEmptyProperty',
                                values=None,
                                dtype='int',
                                unit='mV',
                                uncertainty=None,
                                definition='This property contains an empty value.'
                                           'Empty values can be highlighted using odmltables.'))

    parent = doc['OneMoreSection']['MySubsection']
    parent.append(odml.Property(name='MyLastProperty',
                                values=datetime.datetime.today().date(),
                                dtype='date',
                                unit='AD',
                                uncertainty=None,
                                definition='You can define the hierarchical'
                                           ' location of a section via the'
                                           ' "path to section" column.'
                                           'The value contains todays date.'))
    return doc
def create_datatype_test_odml():
    """
    create an odml-document using every odml datatype at least once
    """

    # data that will be written in the odml-document
    int_values = [-10, 0, 10]

    float_values = [-1.234, 0.0, 1.234]

    bool_values = ['true', 'false', 'True', 'False', 't', 'f', 'T', 'F', 1, 0]

    text_value = "this is a text. It is longer than a string and contains " + \
                 "punctuation marks!"
    datetime_value = datetime.datetime(2014, 12, 11, 15, 2, 0)
    date_value = datetime.date(2014, 12, 11)
    time_value = datetime.time(15, 2, 0)

    # create a new odml document
    doc = odml.Document(version='0.1')

    # create sections
    doc.append(odml.Section(name='numbers'))
    doc.append(odml.Section(name='texts'))
    doc.append(odml.Section(name='other'))

    # add subsections and properties
    parent = doc['numbers']

    parent.append(
        odml.Property(name='Integer',
                      values=int_values,
                      definition='contains different int-values'))

    parent.append(
        odml.Property(name='Float',
                      values=float_values,
                      definition='contains different float-values'))

    parent = doc['texts']

    parent.append(odml.Section(name='datetime'))
    parent.append(odml.Section(name='string-like'))

    parent = doc['texts']['datetime']
    parent.append(
        odml.Property(name='Datetime',
                      values=datetime_value,
                      dtype=odml.DType.datetime))
    parent.append(
        odml.Property(name='Date', values=date_value, dtype=odml.DType.date))

    parent.append(
        odml.Property(name='Time', values=time_value, dtype=odml.DType.time))

    parent = doc['texts']['string-like']

    parent.append(
        odml.Property(name='String',
                      values='this is a string',
                      dtype=odml.DType.string))
    parent.append(
        odml.Property(name='Text', values=text_value, dtype=odml.DType.text))

    parent.append(
        odml.Property(name='Person',
                      values='Jana Pick',
                      dtype=odml.DType.person))

    parent = doc['other']

    parent.append(
        odml.Property(name='Boolean',
                      values=bool_values,
                      dtype=odml.DType.boolean))
    return doc
    def test_children(self):
        """
        This test checks the correct saving and loading of Section children of a Document.
        """
        s_type = "type"
        # Lvl 1 child Sections
        sec_lvl_11 = odml.Section(name="sec_11", type=s_type, parent=self.doc)
        _ = odml.Section(name="sec_12", type=s_type, parent=self.doc)

        # Lvl 2 child Sections
        sec_lvl_21 = odml.Section(name="sec_21",
                                  type=s_type,
                                  parent=sec_lvl_11)
        _ = odml.Section(name="sec_22", type=s_type, parent=sec_lvl_11)
        _ = odml.Section(name="sec_23", type=s_type, parent=sec_lvl_11)

        # Lvl 2 child Properties
        _ = odml.Property(name="prop_21", parent=sec_lvl_11)
        _ = odml.Property(name="prop_22", parent=sec_lvl_11)
        _ = odml.Property(name="prop_23", parent=sec_lvl_11)

        # Lvl 3 child Sections
        _ = odml.Section(name="sec_31", type=s_type, parent=sec_lvl_21)
        _ = odml.Section(name="sec_32", type=s_type, parent=sec_lvl_21)
        _ = odml.Section(name="sec_33", type=s_type, parent=sec_lvl_21)
        _ = odml.Section(name="sec_34", type=s_type, parent=sec_lvl_21)

        # Lvl 3 child Properties
        _ = odml.Property(name="prop_31", parent=sec_lvl_21)
        _ = odml.Property(name="prop_32", parent=sec_lvl_21)
        _ = odml.Property(name="prop_33", parent=sec_lvl_21)
        _ = odml.Property(name="prop_34", parent=sec_lvl_21)

        jdoc, xdoc, ydoc = self.save_load()

        # Test correct JSON save and load.
        self.assertEqual(len(jdoc.sections), 2)

        jsec_lvl_1 = jdoc[sec_lvl_11.name]
        self.assertEqual(len(jsec_lvl_1.sections), 3)
        self.assertEqual(len(jsec_lvl_1.properties), 3)

        jsec_lvl_2 = jsec_lvl_1[sec_lvl_21.name]
        self.assertEqual(len(jsec_lvl_2.sections), 4)
        self.assertEqual(len(jsec_lvl_2.properties), 4)

        # Test correct XML save and load.
        self.assertEqual(len(xdoc.sections), 2)

        xsec_lvl_1 = xdoc[sec_lvl_11.name]
        self.assertEqual(len(xsec_lvl_1.sections), 3)
        self.assertEqual(len(xsec_lvl_1.properties), 3)

        xsec_lvl_2 = xsec_lvl_1[sec_lvl_21.name]
        self.assertEqual(len(xsec_lvl_2.sections), 4)
        self.assertEqual(len(xsec_lvl_2.properties), 4)

        # Test correct YAML save and load.
        self.assertEqual(len(ydoc.sections), 2)

        ysec_lvl_1 = ydoc[sec_lvl_11.name]
        self.assertEqual(len(ysec_lvl_1.sections), 3)
        self.assertEqual(len(ysec_lvl_1.properties), 3)

        ysec_lvl_2 = ysec_lvl_1[sec_lvl_21.name]
        self.assertEqual(len(ysec_lvl_2.sections), 4)
        self.assertEqual(len(ysec_lvl_2.properties), 4)
 def test_value_float(self):
     p = odml.Property("test", value="1.5", dtype="float")
     self.assertEqual(p.values[0], 1.5)
 def setUp(self):
     self.p = odml.Property(name="test", value=1)
 def test_value_int(self):
     p = odml.Property("test", 1, dtype="int")
     self.assertEqual(p.values[0], 1)
 def test_conversion_float_to_int(self):
     p = odml.Property("test", "1.5", dtype="float")
     self.assertEqual(p.dtype, "float")
     p.dtype = "int"
     self.assertEqual(p.dtype, "int")
     self.assertEqual(p.values[0], 1)
Esempio n. 12
0
def rg_subsession_tree(tasktype=None, trialids=[]):
    """
    Builds an odML Document for reach-to-grasp subsession metadata

    Returns:
        (odml.doc.BaseDocument)
            odML Document with default reach-to-grasp subsession metadata
    """

    # CREATE A DOCUMENT
    doc = odml.Document(version='0.1')

    # APPEND MAIN SECTION
    doc.append(
        odml.Section(name='Subsession',
                     type='subsession',
                     definition='Information on the subsession'))

    # SET PARENT NODE
    parent = doc['Subsession']

    # APPEND SUBSECTIONS
    if tasktype:
        parent.append(get_task_subsection(tasktype=tasktype,
                                          trialids=trialids))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Session',
                      value=default_value(odml.DType.string),
                      definition='Session name'))

    parent.append(
        odml.Property(name='Subsession',
                      value=default_value(odml.DType.string),
                      definition='Subsession name'))

    parent.append(
        odml.Property(name='Date',
                      value=default_value(odml.DType.date),
                      definition='Date of session'))

    parent.append(
        odml.Property(name='Weekday',
                      value=default_value(odml.DType.string),
                      definition='Weekday of session'))

    parent.append(
        odml.Property(name='Time',
                      value=default_value(odml.DType.time),
                      definition='Time of subsession'))

    parent.append(
        odml.Property(name='Duration',
                      value=default_value(odml.DType.int, unit='sec'),
                      definition='Duration of subsession'))

    parent.append(
        odml.Property(name='IsSpikeSorted',
                      value=default_value(odml.DType.boolean),
                      definition='States if a spike sorting was '
                      'performed for this subsession '))

    value = default_value(odml.DType.string)
    if tasktype:
        value.data = tasktype
    parent.append(
        odml.Property(name='TaskType',
                      value=value,
                      definition='Performed task type'))

    parent.append(
        odml.Property(name='Noisy',
                      value=default_value(odml.DType.boolean),
                      definition='States if subsession is noisy'))

    parent.append(
        odml.Property(name='Comment',
                      value=default_value(odml.DType.string),
                      definition='Comment about the subsession'))

    return doc
Esempio n. 13
0
def get_task_subsection(tasktype, trialids=[]):
    """
    Constructs a Section describing the given task type including Properties,
    Values and (possibly default) data

    Args:
        tasktype (string):
            Type of performed task (OneCue, TwoCues, Observation, Sleep, or
            Mapping)
        trialids (list of int):
            trial ids (only possible for OneCue, TwoCues, Observation)

    Returns:
        (odml.section.BaseSection)
            Section describing the specified task type

    Note:
        Valid task types: OneCue, TwoCues, Observation, Sleep, Mapping
    """
    # CREATE MAIN SECTION
    main = odml.Section(name='TaskSettings',
                        type='subsession/task',
                        definition='Information on task settings')

    if tasktype in ['OneCue', 'TwoCues', 'Observation']:
        # APPEND SUBSECTIONS
        main.append(
            odml.Section(name='TrialTypeSettings',
                         type='subsession/task/trial',
                         definition='Information on trial type '
                         'parameters'))

        trial_section_names = get_trial_section_names(trialids)
        for sname in trial_section_names:
            main.append(
                odml.Section(name=sname,
                             type='subsession/task/trial',
                             definition='Information on trial '
                             'parameters'))

        # APPEND PROPERTIES WITH DEFAULT VALUES
        main.append(
            odml.Property(name='TotalTrialCount',
                          value=default_value(odml.DType.int),
                          definition='Total number of trials'))

        main.append(
            odml.Property(name='CorrectTrialCount',
                          value=default_value(odml.DType.int),
                          definition='Number of correctly performed '
                          'trials'))

        main.append(
            odml.Property(name='GripErrorTrialCount',
                          value=default_value(odml.DType.int),
                          definition='Number of error trials'))

        main.append(
            odml.Property(name='StandardSettings',
                          value=default_value(odml.DType.boolean),
                          definition='States if subsession was '
                          'performed under standard '
                          'settings'))
        # SET PARENT NODE
        parent = main['TrialTypeSettings']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='Condition',
                          value=default_value(odml.DType.int),
                          definition='Trial type combination of '
                          'subsession was condition'))

        parent.append(
            odml.Property(name='OrderForce',
                          value=default_value(odml.DType.string),
                          definition='Trial order of force '
                          'conditions (random or block)'))

        parent.append(
            odml.Property(name='OrderGrip',
                          value=default_value(odml.DType.string),
                          definition='Trial order of grip '
                          'conditions (random or block)'))

        parent.append(
            odml.Property(name='BlockSize',
                          value=default_value(odml.DType.int),
                          definition='Order of trial type '
                          'combination was of block '
                          'size'))

        # SET PARENT NODE
        for sname in trial_section_names:
            parent = main[sname]

            # APPEND SUBSECTIONS
            parent.append(
                odml.Section(name='DigitalEvents',
                             type='subsession/task/trial/events',
                             definition='Information on digital '
                             'trial events'))

            parent.append(
                odml.Section(name='AnalogEvents',
                             type='subsession/task/trial/events',
                             definition='Information on analogue '
                             'trial events'))

            parent.append(
                odml.Section(name='Periods',
                             type='subsession/task/trial/periods',
                             definition='Information on trial '
                             'periods'))

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='ID',
                              value=default_value(odml.DType.int),
                              definition='Trial ID'))

            parent.append(
                odml.Property(name='PerformanceCode',
                              value=default_value(odml.DType.int),
                              definition='States if this was an '
                              'error or a correct trial'))

            parent.append(
                odml.Property(name='TrialType',
                              value=default_value(odml.DType.int),
                              definition='Trial type of trial'))

            parent.append(
                odml.Property(name='ForceType',
                              value=default_value(odml.DType.string),
                              definition='Force type measured in '
                              'trial'))

            # SET PARENT NODE
            parent = main[sname]['DigitalEvents']

            # APPEND SUBSECTIONS

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='TS',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when trial start is '
                              'activated'))

            parent.append(
                odml.Property(name='FP-ON',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when fixation point '
                              'is activated'))

            parent.append(
                odml.Property(name='CUE-ON',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when (first) CUE is '
                              'activated '))

            parent.append(
                odml.Property(name='CUE-OFF',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when (first) CUE is '
                              'deactivated '))

            parent.append(
                odml.Property(name='GO-ON',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when (second cue) GO '
                              'is activated '))

            parent.append(
                odml.Property(name='SR',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when switch is '
                              'released'))

            parent.append(
                odml.Property(name='GO-OFF',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when (second cue) GO '
                              'is deactivated '))

            parent.append(
                odml.Property(name='RW',
                              value=default_value(odml.DType.int,
                                                  unit='1./30000*s'),
                              definition='Time when reward is '
                              'given'))

            # SET PARENT NODE
            parent = main[sname]['AnalogEvents']

            # APPEND SUBSECTIONS
            parent.append(
                odml.Section(name='GripForceSignals',
                             type='subsession/task/trial/events',
                             definition='Information on analogue '
                             'events detected with grip '
                             'force signals'))

            parent.append(
                odml.Section(name='DisplacementSignal',
                             type='subsession/task/trial/events',
                             definition='Information on analogue '
                             'events detected with '
                             'object displacement '
                             'signal'))

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='UsedForceSensor',
                              value=default_value(odml.DType.int),
                              definition='Channel ID index of force '
                              'sensor used in grip force '
                              'detection'))

            parent.append(
                odml.Property(name='ManuallyControlled',
                              value=default_value(odml.DType.boolean),
                              definition='States if analogue event '
                              'detection of this trial '
                              'was manually controlled'))

            # SET PARENT NODE
            parent = main[sname]['AnalogEvents']['GripForceSignals']

            # APPEND SUBSECTIONS

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='OT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when target object '
                              'is touched'))

            parent.append(
                odml.Property(name='HS',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when holding '
                              'position of target object '
                              'is reached and holding '
                              'period starts'))

            parent.append(
                odml.Property(name='OR',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when target object '
                              'is released'))

            parent.append(
                odml.Property(name='BTB',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when object moved '
                              'back to its baseline'))

            # SET PARENT NODE
            parent = main[sname]['AnalogEvents']['DisplacementSignal']

            # APPEND SUBSECTIONS

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='OT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when target object '
                              'is touched'))

            parent.append(
                odml.Property(name='HS',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when holding '
                              'position of target object '
                              'is reached and holding '
                              'period starts'))

            parent.append(
                odml.Property(name='OR',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when target object '
                              'is released'))

            parent.append(
                odml.Property(name='BTB',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time when object moved '
                              'back to its baseline'))

            # SET PARENT NODE
            parent = main[sname]['Periods']

            # APPEND SUBSECTIONS
            parent.append(
                odml.Section(name='GripForceSignals',
                             type='subsession/task/trial/events',
                             definition='Information on periods '
                             'calculated with analogue '
                             'events detected with grip '
                             'force signals'))

            parent.append(
                odml.Section(name='DisplacementSignal',
                             type='subsession/task/trial/events',
                             definition='Information on periods '
                             'calculated with analogue '
                             'events detected with '
                             'object displacement '
                             'signal'))

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='RT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Reaction time (period '
                              'between GO and SR)'))

            parent.append(
                odml.Property(name='ITI',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Inter-trial-interval '
                              '(period until next '
                              'trial)'))

            # SET PARENT NODE
            parent = main[sname]['Periods']['GripForceSignals']

            # APPEND SUBSECTIONS

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='RGT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Reach-to-grasp time '
                              '(period between SR and '
                              'OT)'))

            parent.append(
                odml.Property(name='PT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Pull time (period between '
                              'OT and HS)'))

            parent.append(
                odml.Property(name='MT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Movement time (period '
                              'between GO-ON and HS)'))

            parent.append(
                odml.Property(name='HT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Hold time (period between '
                              'HS and RW)'))

            parent.append(
                odml.Property(name='ORT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time until object is '
                              'released (period between '
                              'RW an OR '))

            # SET PARENT NODE
            parent = main[sname]['Periods']['DisplacementSignal']

            # APPEND SUBSECTIONS

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='RGT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Reach-to-grasp time '
                              '(period between SR and '
                              'OT)'))

            parent.append(
                odml.Property(name='PT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Pull time (period between '
                              'OT and HS)'))

            parent.append(
                odml.Property(name='MT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Movement time (period '
                              'between GO-ON and HS)'))

            parent.append(
                odml.Property(name='HT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Hold time (period between '
                              'HS and RW)'))

            parent.append(
                odml.Property(name='ORT',
                              value=default_value(odml.DType.int, unit='ms'),
                              definition='Time until object is '
                              'released (period between '
                              'RW an OR '))

    elif tasktype == 'Sleep':
        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        main.append(
            odml.Property(name='SleepStart',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Start time(s) of sleep '
                          'interval(s)'))

        main.append(
            odml.Property(name='SleepEnd',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='End time(s) of sleep '
                          'interval(s)'))

    elif tasktype == 'Mapping':
        # APPEND SUBSECTIONS
        main.append(
            odml.Section(name='Shoulder',
                         type='subsession/task/RF',
                         definition='Information on shoulder mapping'))

        main.append(
            odml.Section(name='Elbow',
                         type='subsession/task/RF',
                         definition='Information on elbow mapping'))

        main.append(
            odml.Section(name='Wrist',
                         type='subsession/task/RF',
                         definition='Information on wrist mapping'))

        main.append(
            odml.Section(name='Thumb',
                         type='subsession/task/RF',
                         definition='Information on wrist mapping'))

        main.append(
            odml.Section(name='Index',
                         type='subsession/task/RF',
                         definition='Information on wrist mapping'))

        main.append(
            odml.Section(name='Digit2to5',
                         type='subsession/task/RF',
                         definition='Information on wrist mapping'))

        main.append(
            odml.Section(name='Digit5',
                         type='subsession/task/RF',
                         definition='Information on wrist mapping'))

        # APPEND PROPERTIES WITH DEFAULT VALUES
        main.append(
            odml.Property(name='PassivePG',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval where a '
                          'passively precision grip was '
                          'mimicked'))

        main.append(
            odml.Property(name='UlnarDeviation',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval where Ulnar was '
                          'deviated'))

        main.append(
            odml.Property(name='Digit2to3Extension',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval where digits 2 '
                          'and 3 were extended'))

        main.append(
            odml.Property(name='TouchPalm',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval where palm was '
                          'touched'))

        main.append(
            odml.Property(name='TouchCheek',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval where cheek was '
                          'touched'))

        # SET PARENT NODE
        parent = main['Shoulder']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='MoveForward',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was moved forward'))

        parent.append(
            odml.Property(name='Lowering',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was lowered down'))

        # SET PARENT NODE
        parent = main['Elbow']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='Flexion',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was flexed'))

        parent.append(
            odml.Property(name='Extension',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was extended'))

        # SET PARENT NODE
        parent = main['Wrist']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='Flexion',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was flexed'))

        parent.append(
            odml.Property(name='Pronation',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was pronated'))

        # SET PARENT NODE
        parent = main['Thumb']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='Abduction',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was abducted'))

        parent.append(
            odml.Property(name='Adduction',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was adducted'))

        parent.append(
            odml.Property(name='Extension',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body '
                          'part was extended'))

        parent.append(
            odml.Property(name='TouchEnd',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which end of '
                          'body part was touched'))

        parent.append(
            odml.Property(name='TouchInterior',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which '
                          'interior body part was '
                          'touched'))

        # SET PARENT NODE
        parent = main['Index']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='Abduction',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body part was '
                          'abducted'))

        parent.append(
            odml.Property(name='Flexion',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body part was '
                          'flexed'))

        parent.append(
            odml.Property(name='Extension',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body part was '
                          'extended'))

        parent.append(
            odml.Property(
                name='TouchInteriorFace',
                value=default_value(odml.DType.int, unit='samples'),
                definition='Time interval in which interior body part '
                'was touched'))

        # SET PARENT NODE
        parent = main['Digit2to5']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='Flexion',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body part was '
                          'flexed'))

        parent.append(
            odml.Property(
                name='TouchInteriorFace',
                value=default_value(odml.DType.int, unit='samples'),
                definition='Time interval in which interior body part '
                'was touched'))

        # SET PARENT NODE
        parent = main['Digit5']

        # APPEND SUBSECTIONS

        # APPEND PROPERTIES WITH DEFAULT VALUES
        parent.append(
            odml.Property(name='Flexion',
                          value=default_value(odml.DType.int, unit='samples'),
                          definition='Time interval in which body part was '
                          'flexed'))

        parent.append(
            odml.Property(
                name='TouchLateralFace',
                value=default_value(odml.DType.int, unit='samples'),
                definition='Time interval in which lateral body part '
                'was touched'))

    return main
Esempio n. 14
0
def rg_project_tree(tasktype='TwoCues'):
    """
    Builds an odML Document for reach-to-grasp project metadata

    Args:
        used_taskdesign (string, optional):
            States the task design used in this subsession

    Returns:
        (odml.doc.BaseDocument)
            odML Document with default reach-to-grasp project metadata

    Note:
        Valid used_taskdesign: OneCue, TwoCues, Observation, Sleep, Mapping
    """

    # CREATE A DOCUMENT
    doc = odml.Document(version='0.1')

    # CREATE A MAIN SECTION
    doc.append(odml.Section(name='Project',
                            type='project',
                            definition='Information on the experimental '
                                       'project'))

    # SET PARENT NODE
    parent = doc['Project']

    # APPEND SUBSECTIONS
    parent.append(odml.Section(name='TaskDesigns',
                               type='project',
                               definition='Information on tasks'))

    parent.append(odml.Section(name='TrialTypeCodes',
                               type='codes',
                               definition='Information on trial type codes'))

    parent.append(odml.Section(name='ConditionCodes',
                               type='codes',
                               definition='Information on condition codes '
                                          '(trial type combination codes)'))

    parent.append(odml.Section(name='PerformanceCodes',
                               type='codes',
                               definition='Information on trial performance '
                                          'codes'))

    parent.append(odml.Section(name='TrialSettings',
                               type='setup/control',
                               definition='Information on the programmed '
                                          'trial settings'))

    parent.append(odml.Section(name='TargetObjectSettings',
                               type='setup/control',
                               definition='Information on the settings of the '
                                          'target object'))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(odml.Property(name='Name',
                                value=odml.Value(data='reach-to-grasp',
                                                 dtype=odml.DType.string),
                                definition='Name of project'))

    parent.append(odml.Property(name='Type',
                                value=odml.Value(data='electrophysiology',
                                                 dtype=odml.DType.string),
                                definition='Type of project'))

    parent.append(odml.Property(name='Subtype',
                                value=odml.Value(data='motor behavior',
                                                 dtype=odml.DType.string),
                                definition='Name of the project'))

    parent.append(odml.Property(name='Description',
                                value=default_value(odml.DType.url),
                                definition='Project description URL'))

    parent.append(odml.Property(name='Collaborators',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in rg_collaborators()],
                                definition='Affilitations of involved '
                                           'collaborators'))

    # SET PARENT NODE
    parent = doc['Project']['TaskDesigns']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(odml.Property(name='Designs',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['OneCue', 'TwoCues',
                                                    'Observation', 'Sleep',
                                                    'Mapping']],
                                definition='Names of possible task designs'))

    parent.append(odml.Property(name='UsedDesign',
                                value=odml.Value(data=tasktype,
                                                 dtype=odml.DType.string)
                                if tasktype
                                else default_value(odml.DType.string),
                                definition='Name of used task design'))

    parent.append(odml.Property(name='Description',
                                value=default_value(odml.DType.url),
                                definition='Task designs descriptions URL'))

    # SET PARENT NODE
    parent = doc['Project']['TrialTypeCodes']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(odml.Property(name='SGLF',
                                value=odml.Value(data=89,
                                                 dtype=odml.DType.int),
                                definition='Side grip / low force code'))

    parent.append(odml.Property(name='SGHF',
                                value=odml.Value(data=86,
                                                 dtype=odml.DType.int),
                                definition='Side grip / high force code'))

    parent.append(odml.Property(name='PGLF',
                                value=odml.Value(data=169,
                                                 dtype=odml.DType.int),
                                definition='Precision grip / low force code'))

    parent.append(odml.Property(name='PGHF',
                                value=odml.Value(data=166,
                                                 dtype=odml.DType.int),
                                definition='Precision grip / high force code'))

    parent.append(odml.Property(name='LFSG',
                                value=odml.Value(data=149,
                                                 dtype=odml.DType.int),
                                definition='Low force / side grip code'))

    parent.append(odml.Property(name='LFPG',
                                value=odml.Value(data=154,
                                                 dtype=odml.DType.int),
                                definition='Low force / precision grip code'))

    parent.append(odml.Property(name='HFSG',
                                value=odml.Value(data=101,
                                                 dtype=odml.DType.int),
                                definition='High force / side grip code'))

    parent.append(odml.Property(name='HFPG',
                                value=odml.Value(data=106,
                                                 dtype=odml.DType.int),
                                definition='High force / precision grip code'))

    parent.append(odml.Property(name='SGSG',
                                value=odml.Value(data=85,
                                                 dtype=odml.DType.int),
                                definition='Side grip / side grip code'))

    parent.append(odml.Property(name='PGPG',
                                value=odml.Value(data=170,
                                                 dtype=odml.DType.int),
                                definition='Precision grip / precision grip '
                                           'code'))

    parent.append(odml.Property(name='n.d.',
                                value=odml.Value(data=0,
                                                 dtype=odml.DType.int),
                                definition='Code for not detectable trial '
                                           'type'))

    # SET PARENT NODE
    parent = doc['Project']['ConditionCodes']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(odml.Property(name='cnd_1',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGLF', 'SGHF',
                                                    'PGLF', 'PGHF']],
                                definition='Grip first trials, all grip and '
                                           'force types'))

    parent.append(odml.Property(name='cnd_2',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGLF', 'SGHF',
                                                    'PGLF', 'PGHF']],
                                definition='Force first trials, all force and '
                                           'grip types'))

    parent.append(odml.Property(name='cnd_11',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGLF', 'PGLF']],
                                definition='Grip first trials, all grip '
                                           'types, but only low force'))

    parent.append(odml.Property(name='cnd_12',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGHF', 'PGHF']],
                                definition='Grip first trials, all grip '
                                           'types, but only high force'))

    parent.append(odml.Property(name='cnd_13',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGHF', 'SGLF']],
                                definition='Grip first trials, only side '
                                           'grip, but all force types'))

    parent.append(odml.Property(name='cnd_14',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['PGHF', 'PGLF']],
                                definition='Grip first trials, only precision '
                                           'grip, but all force types'))

    parent.append(odml.Property(name='cnd_21',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['LFSG', 'LFPG']],
                                definition='Force first trials, only low '
                                           'force, but all grip types'))

    parent.append(odml.Property(name='cnd_22',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['HFSG', 'HFPG']],
                                definition='Force first trials, only high '
                                           'force, but all grip types'))

    parent.append(odml.Property(name='cnd_23',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['HFSG', 'LFSG']],
                                definition='Force first trials, all force '
                                           'types, but only side grip'))

    parent.append(odml.Property(name='cnd_24',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['HFPG', 'LFPG']],
                                definition='Force first trials, all force '
                                           'types, but only side grip'))

    parent.append(odml.Property(name='cnd_131',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGLF']],
                                definition='Grip first trials, only side '
                                           'grip, only low force'))

    parent.append(odml.Property(name='cnd_132',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGHF']],
                                definition='Grip first trials, only side '
                                           'grip, only high force'))

    parent.append(odml.Property(name='cnd_133',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['SGSG']],
                                definition='Grip first trials, only side '
                                           'grip, force needs to be guessed'))

    parent.append(odml.Property(name='cnd_141',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['PGLF']],
                                definition='Grip first trials, only precision '
                                           'grip, only low force'))

    parent.append(odml.Property(name='cnd_142',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['PGHF']],
                                definition='Grip first trials, only precision '
                                           'grip, only high force'))

    parent.append(odml.Property(name='cnd_144',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['PGPG']],
                                definition='Grip first trials, only precision '
                                           'grip, force needs to be guessed'))

    parent.append(odml.Property(name='cnd_213',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['LFSG']],
                                definition='Force first trials, only low '
                                           'force, only side grip'))

    parent.append(odml.Property(name='cnd_214',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['LFPG']],
                                definition='Force first trials, only low '
                                           'force, only precision grip'))

    parent.append(odml.Property(name='cnd_223',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['HFSG']],
                                definition='Force first trials, only high '
                                           'force, only side grip'))

    parent.append(odml.Property(name='cnd_224',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['HFPG']],
                                definition='Force first trials, only high '
                                           'force, only precision grip'))

    # SET PARENT NODE
    parent = doc['Project']['PerformanceCodes']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(odml.Property(name='pc_127',
                                value=odml.Value(data='correct trial',
                                                 dtype=odml.DType.string),
                                definition='Performance code of a correctly '
                                           'completed trial'))

    parent.append(odml.Property(name='pc_64',
                                value=odml.Value(data='SR < FP-ON',
                                                 dtype=odml.DType.string),
                                definition='Performance code of a trial where '
                                           'switch is released too early '
                                           '(before fixation point)'))

    parent.append(odml.Property(name='pc_96',
                                value=odml.Value(data='SR < CUE-ON',
                                                 dtype=odml.DType.string),
                                definition='Performance code of a trial where '
                                           'switch is released too early '
                                           '(before delay cue is turned on)'))

    parent.append(odml.Property(name='pc_112',
                                value=odml.Value(data='SR < CUE-OFF',
                                                 dtype=odml.DType.string),
                                definition='Performance code of a trial where '
                                           'switch is released too early '
                                           '(before delay cue is turned off)'))

    parent.append(odml.Property(name='pc_120',
                                value=odml.Value(data='SR < GO-ON',
                                                 dtype=odml.DType.string),
                                definition='Performance code of a trial where '
                                           'switch is released too early '
                                           '(before GO cue turns on)'))

    parent.append(odml.Property(name='pc_124',
                                value=odml.Value(data='no SR',
                                                 dtype=odml.DType.string),
                                definition='Performance code of a trial where '
                                           'switch is not released'))

    parent.append(odml.Property(name='pc_126',
                                value=odml.Value(data='grip error',
                                                 dtype=odml.DType.string),
                                definition='Performance code of a trial where '
                                           'the wrong grip type is used'))

    # SET PARENT NODE
    parent = doc['Project']['TrialSettings']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(odml.Property(name='DigitalEvents',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['TS', 'FP-ON', 'CUE-ON',
                                                    'CUE-OFF', 'GO-ON', 'SR',
                                                    'RW', 'GO-OFF']],
                                definition='Digital recorded trial events'))

    parent.append(odml.Property(name='AnalogEvents',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.string)
                                       for data in ['OT', 'HS', 'OR', 'BTB']],
                                definition='Analog recorded trial events'))

    parent.append(odml.Property(name='TSP',
                                value=odml.Value(data=400.0,
                                                 dtype=odml.DType.float,
                                                 unit='ms'),
                                definition='Duration of trial start period '
                                           '(period between TS and FP)'))

    parent.append(odml.Property(name='FPP',
                                value=odml.Value(data=400.0,
                                                 dtype=odml.DType.float,
                                                 unit='ms'),
                                definition='Duration of fixation point period '
                                           '(period between FP and CUE-ON)'))

    parent.append(odml.Property(name='CUE',
                                value=odml.Value(data=300.0,
                                                 dtype=odml.DType.float,
                                                 unit='ms'),
                                definition='Duration of CUE period (period '
                                           'between CUE-ON and CUE-OFF'))

    parent.append(odml.Property(name='DELAY',
                                value=odml.Value(data=1000.0,
                                                 dtype=odml.DType.float,
                                                 unit='ms'),
                                definition='Duration of delay period (period '
                                           'between CUE-OFF and GO)'))

    parent.append(odml.Property(name='HT',
                                value=odml.Value(data=500.0,
                                                 dtype=odml.DType.float,
                                                 unit='ms'),
                                definition='Duration of holding time (period '
                                           'between HS and RW)'))

    parent.append(odml.Property(name='MTLimit',
                                value=odml.Value(data=700.0,
                                                 dtype=odml.DType.float,
                                                 unit='ms'),
                                definition='Time limit for movement (period '
                                           'between GO-ON and HS)'))

    parent.append(odml.Property(name='RTLimit',
                                value=odml.Value(data=1000.0,
                                                 dtype=odml.DType.float,
                                                 unit='ms'),
                                definition='Time limit for reaction time '
                                           '(period between GO-ON and SR)'))

    parent.append(odml.Property(name='PTLimits',
                                value=default_value(odml.DType.float,
                                                    unit='ms'),
                                definition='Min and max time to pull the '
                                           'object into the holding position '
                                           '(period between OT and HS)'))

    # SET PARENT NODE
    parent = doc['Project']['TargetObjectSettings']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(odml.Property(name='HoldPosRange',
                                value=[odml.Value(data=data,
                                                  dtype=odml.DType.int,
                                                  unit='mm')
                                       for data in [4.0, 14.0]],
                                definition='Distance window for holding the '
                                           'object in place'))

    parent.append(odml.Property(name='LowForceWeight',
                                value=odml.Value(data=100.0,
                                                 dtype=odml.DType.float,
                                                 unit='g'),
                                definition='Weight of object in low force '
                                           'modus'))

    parent.append(odml.Property(name='HighForceWeight',
                                value=odml.Value(data=200.0,
                                                 dtype=odml.DType.float,
                                                 unit='g'),
                                definition='Weight of object in high force '
                                           'modus'))

    return doc
Esempio n. 15
0
def rej_tree(rej_names=[]):
    """
    Builds an odML Document for reach-to-grasp preprocessing metadata

    Returns:
        (odml.doc.BaseDocument)
            odML Document with default reach-to-grasp preprocessing metadata
    """

    # CREATE A DOCUMENT
    doc = odml.Document(version='0.1')

    # APPEND MAIN SECTION
    doc.append(
        odml.Section(name='RejectionsLFP',
                     type='preprocessing',
                     definition='Information on rejection of '
                     'experimental LFP signals'))

    # SET PARENT NODE
    parent = doc['RejectionsLFP']

    # APPEND SUBSECTIONS
    for rejn in rej_names:
        parent.append(
            odml.Section(name=rejn,
                         type='subject/preparation',
                         definition='Information on rejection '
                         'performed on this LFP band'))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(
            name='LFPBands',
            value=[
                odml.Value(data=data, dtype=odml.DType.string)
                for data in rej_names
            ] if len(rej_names) > 0 else default_value(odml.DType.string),
            definition='Information on which LFP bands '
            'the rejection was performed'))

    if len(rej_names) > 0:
        for rejn in rej_names:
            # SET PARENT NODE
            parent = doc['RejectionsLFP'][rejn]

            # APPEND SUBSECTIONS

            # APPEND PROPERTIES WITH DEFAULT VALUES
            parent.append(
                odml.Property(name='Highcut',
                              value=default_value(odml.DType.float),
                              definition='High cut frequency of '
                              'rejection filter'))

            parent.append(
                odml.Property(name='Lowcut',
                              value=default_value(odml.DType.float),
                              definition='Low cut frequency of '
                              'rejection filter'))

            parent.append(
                odml.Property(name='Order',
                              value=default_value(odml.DType.int),
                              definition='Order of rejection filter'))

            parent.append(
                odml.Property(name='RejElectrodes',
                              value=default_value(odml.DType.int),
                              definition='ID list of rejected '
                              'electrodes'))

            parent.append(
                odml.Property(name='RejTrials',
                              value=default_value(odml.DType.int),
                              definition='ID list of rejected '
                              'trials'))

    return doc
 def create_property(self, name):
     return odml.Property(name=name.replace("sec", "prop"),
                          value=name.replace("sec", "val"))
Esempio n. 17
0
def rg_setup_tree(location='-'):
    """
    Builds an odML Document for reach-to-grasp setup metadata

    Returns:
        (odml.doc.BaseDocument)
            odML Document with default reach-to-grasp setup metadata
    """
    # CREATE A DOCUMENT
    doc = odml.Document(version='0.1')

    # APPEND MAIN SECTION
    doc.append(
        odml.Section(name='Setup',
                     type='setup',
                     definition='Information on the experimental '
                     'setup'))

    # SET PARENT NODE
    parent = doc['Setup']

    # APPEND SUBSECTIONS
    parent.append(
        odml.Section(name='Apparatus',
                     type='setup',
                     definition='Information on the experimental '
                     'apparatus'))

    parent.append(
        odml.Section(name='ControlComputer',
                     type='setup/software',
                     definition='Information on the experimental '
                     'control'))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Location',
                      value=get_location(location),
                      definition='Location of the setup'))

    parent.append(
        odml.Property(name='Description',
                      value=default_value(odml.DType.url),
                      definition='Setup description URL'))

    parent.append(
        odml.Property(name='DAQSystem',
                      value=odml.Value(data='Cerebus',
                                       dtype=odml.DType.string),
                      definition='DAQ system used'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']

    # APPEND SUBSECTIONS
    parent.append(
        odml.Section(name='StartSwitch',
                     type='setup',
                     definition='Information on the start switch'))

    parent.append(
        odml.Section(name='TargetObject',
                     type='setup',
                     definition='Information on the target object'))

    parent.append(
        odml.Section(name='CueSystem',
                     type='setup',
                     definition='Information on the cue system'))

    parent.append(
        odml.Section(name='RewardSystem',
                     type='setup',
                     definition='Information on the reward system'))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Manufacturer',
                      value=odml.Value(data='NI A/D Card (ref?)',
                                       dtype=odml.DType.string),
                      definition='Owner of the setup'))

    parent.append(
        odml.Property(name='Creator',
                      value=odml.Value(data='Thomas Brochier',
                                       dtype=odml.DType.string),
                      definition='Full name of person who created '
                      'the setup'))

    parent.append(
        odml.Property(name='Maintainer',
                      value=odml.Value(data='Thomas Brochier',
                                       dtype=odml.DType.string),
                      definition='Full name of person who maintains '
                      'the setup'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['StartSwitch']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Function',
                      value=odml.Value(data='activates start trial',
                                       dtype=odml.DType.string),
                      definition='Function of apparatus'))

    parent.append(
        odml.Property(name='Type',
                      value=odml.Value(data='table switch',
                                       dtype=odml.DType.string),
                      definition='Type of apparatus'))

    parent.append(
        odml.Property(name='SignalType',
                      value=odml.Value(data='analog', dtype=odml.DType.string),
                      definition='Signal type of apparatus (digital '
                      'or analog)'))

    parent.append(
        odml.Property(name='Events',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.string)
                          for data in ['TS', 'SR']
                      ],
                      definition='Names of events extracted from '
                      'this signal'))

    parent.append(
        odml.Property(name='SamplingRate',
                      value=odml.Value(data=30000,
                                       dtype=odml.DType.int,
                                       unit='samples/sec'),
                      definition='Sampling rate of data'))

    parent.append(
        odml.Property(name='ConnectedTo',
                      value=odml.Value(data='NeuralSignalProcessor',
                                       dtype=odml.DType.string),
                      definition='Target device of apparatus'))

    parent.append(
        odml.Property(name='MonitoredBy',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Control software of apparatus'))

    parent.append(
        odml.Property(name='SavedIn',
                      value=odml.Value(data='nev', dtype=odml.DType.string),
                      definition='File in which apparatus signals '
                      'are saved'))

    parent.append(
        odml.Property(name='Length',
                      value=default_value(odml.DType.float, unit='cm'),
                      definition='Length of apparatus'))

    parent.append(
        odml.Property(name='Width',
                      value=default_value(odml.DType.float, unit='cm'),
                      definition='Length of apparatus'))

    parent.append(
        odml.Property(name='Height',
                      value=default_value(odml.DType.float, unit='mm'),
                      definition='Length of apparatus'))

    parent.append(
        odml.Property(name='PosX',
                      value=odml.Value(data=5.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='X position of apparatus'))

    parent.append(
        odml.Property(name='PosY',
                      value=odml.Value(data=0.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='Y position of apparatus'))

    parent.append(
        odml.Property(name='PosZ',
                      value=odml.Value(data=0.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='Z position of apparatus'))

    parent.append(
        odml.Property(name='PosOrigin',
                      value=odml.Value(data='midline, waist-level',
                                       dtype=odml.DType.string),
                      definition='Origin for xyz position of '
                      'apparatus'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['TargetObject']

    # APPEND SUBSECTIONS
    parent.append(
        odml.Section(name='FSRSensor',
                     type='setup/daq',
                     definition='Information on the FSR sensors'))

    parent.append(
        odml.Section(name='HESensor',
                     type='setup/daq',
                     definition='Information on the hall-effect '
                     'sensor'))

    parent.append(
        odml.Section(name='LoadForce',
                     type='setup/daq',
                     definition='Information on the load force '
                     'signal'))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Function',
                      value=odml.Value(data='object to grasp, pull '
                                       'and hold',
                                       dtype=odml.DType.string),
                      definition='Function of apparatus'))

    parent.append(
        odml.Property(name='Type',
                      value=odml.Value(data='stainless steel '
                                       'parallelpiped',
                                       dtype=odml.DType.string),
                      definition='Type of apparatus'))

    parent.append(
        odml.Property(name='Length',
                      value=odml.Value(data=40.0,
                                       dtype=odml.DType.float,
                                       unit='mm'),
                      definition='Length of apparatus'))

    parent.append(
        odml.Property(name='Width',
                      value=odml.Value(data=16.0,
                                       dtype=odml.DType.float,
                                       unit='mm'),
                      definition='Width of apparatus'))

    parent.append(
        odml.Property(name='Height',
                      value=odml.Value(data=10.0,
                                       dtype=odml.DType.float,
                                       unit='mm'),
                      definition='Height of apparatus'))

    parent.append(
        odml.Property(name='AttachedTo',
                      value=odml.Value(data='anterior end of a low- '
                                       'friction horizontal '
                                       'shuttle',
                                       dtype=odml.DType.string),
                      definition='Device apparatus is attached to'))

    parent.append(
        odml.Property(name='Rotation',
                      value=odml.Value(data=45.0,
                                       dtype=odml.DType.float,
                                       unit='degree'),
                      definition='Rotation of apparatus from '
                      'vertical axis'))

    parent.append(
        odml.Property(name='PosX',
                      value=odml.Value(data=5.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='X position of apparatus'))

    parent.append(
        odml.Property(name='PosY',
                      value=odml.Value(data=13.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='Y position of apparatus'))

    parent.append(
        odml.Property(name='PosZ',
                      value=odml.Value(data=14.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='Z position of apparatus'))

    parent.append(
        odml.Property(name='PosOrigin',
                      value=odml.Value(data='midline, waist-level',
                                       dtype=odml.DType.string),
                      definition='Origin for xyz position of '
                      'apparatus'))

    parent.append(
        odml.Property(name='PullRange',
                      value=[
                          odml.Value(data=data,
                                     dtype=odml.DType.float,
                                     unit='mm') for data in [0.0, 15.0]
                      ],
                      definition='Minimum and maximum pull range '
                      'of target object'))

    parent.append(
        odml.Property(name='WeightRange',
                      value=[
                          odml.Value(data=data,
                                     dtype=odml.DType.float,
                                     unit='g') for data in [0.0, 800.0]
                      ],
                      definition='Minimum and maximum weight range '
                      'of target object'))

    parent.append(
        odml.Property(name='WeightSwitch',
                      value=odml.Value(data='activation of magnet',
                                       dtype=odml.DType.string),
                      definition='Mechanism to switch weight '
                      'configuration'))

    parent.append(
        odml.Property(name='Sensors',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.string)
                          for data in ['FSRSensor', 'HESensor', 'LoadForce']
                      ],
                      definition='Sensors providing additional '
                      'analogue signals to monitor '
                      'task and behavior'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['TargetObject']['FSRSensor']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Function',
                      value=odml.Value(data='measures grip and '
                                       'pulling load forces by '
                                       'means of force '
                                       'sensitive resistances '
                                       '(FSR)',
                                       dtype=odml.DType.string),
                      definition='Function of apparatus'))

    parent.append(
        odml.Property(name='SGChannelIDs',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.int)
                          for data in [138, 140]
                      ],
                      definition='Channel IDs of FSR sensors to '
                      'measure load forces of side grip'))

    parent.append(
        odml.Property(name='PGChannelIDs',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.int)
                          for data in [137, 139]
                      ],
                      definition='Channel IDs of FSR sensors to '
                      'measure load forces of precision '
                      'grip'))

    parent.append(
        odml.Property(name='SignalType',
                      value=odml.Value(data='analog', dtype=odml.DType.string),
                      definition='Signal type of apparatus (digital '
                      'or analog)'))

    parent.append(
        odml.Property(name='Events',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.string)
                          for data in ['OT', 'OR', 'HS', 'BTB']
                      ],
                      definition='Names of events extracted from '
                      'this signal'))

    parent.append(
        odml.Property(name='SamplingRate',
                      value=odml.Value(data=1000,
                                       dtype=odml.DType.int,
                                       unit='samples/sec'),
                      definition='Sampling rate of data'))

    parent.append(
        odml.Property(name='ConnectedTo',
                      value=odml.Value(data='NeuralSignalProcessor',
                                       dtype=odml.DType.string),
                      definition='Target device of apparatus'))

    parent.append(
        odml.Property(name='MonitoredBy',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Control software of apparatus'))

    parent.append(
        odml.Property(name='ControlledBy',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Control software of apparatus'))

    parent.append(
        odml.Property(name='SavedIn',
                      value=odml.Value(data='ns2', dtype=odml.DType.string),
                      definition='File in which apparatus signals '
                      'are saved'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['TargetObject']['HESensor']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Function',
                      value=odml.Value(data='hall effect (HE) sensor'
                                       ' measures horizontal '
                                       'displacement',
                                       dtype=odml.DType.string),
                      definition='Function of apparatus'))

    parent.append(
        odml.Property(name='Count',
                      value=odml.Value(data=1, dtype=odml.DType.int),
                      definition='Number of hall-effect sensors'))

    parent.append(
        odml.Property(name='ChannelID',
                      value=odml.Value(data=143, dtype=odml.DType.int),
                      definition='Channel ID of HESensor to '
                      'measure horizontal object '
                      'displacement'))

    parent.append(
        odml.Property(name='Events',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.string)
                          for data in ['OT', 'OR', 'HS', 'BTB']
                      ],
                      definition='Names of events extracted from '
                      'this signal'))

    parent.append(
        odml.Property(name='SignalType',
                      value=odml.Value(data='analog', dtype=odml.DType.string),
                      definition='Signal type of apparatus (digital '
                      'or analog)'))

    parent.append(
        odml.Property(name='SavedIn',
                      value=odml.Value(data='ns2', dtype=odml.DType.string),
                      definition='File in which apparatus signals '
                      'are saved'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['TargetObject']['LoadForce']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Function',
                      value=odml.Value(data='used to detect load '
                                       'force of the target '
                                       'object',
                                       dtype=odml.DType.string),
                      definition='Function of apparatus'))

    parent.append(
        odml.Property(name='Count',
                      value=odml.Value(data=1, dtype=odml.DType.int),
                      definition='Number of load force signals'))

    parent.append(
        odml.Property(name='ChannelID',
                      value=odml.Value(data=141, dtype=odml.DType.int),
                      definition='Channel ID of load force signal'))

    parent.append(
        odml.Property(name='SignalType',
                      value=odml.Value(data='analog', dtype=odml.DType.string),
                      definition='Signal type of apparatus (digital '
                      'or analog)'))

    parent.append(
        odml.Property(name='SavedIn',
                      value=odml.Value(data='ns2', dtype=odml.DType.string),
                      definition='File in which apparatus signals '
                      'are saved'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['CueSystem']

    # APPEND SUBSECTIONS
    parent.append(
        odml.Section(name='CueCodes',
                     type='setup/daq',
                     definition='Information on cue codes'))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Function',
                      value=odml.Value(data='instructing movement '
                                       'configurations of each '
                                       'trial',
                                       dtype=odml.DType.string),
                      definition='Function of apparatus'))

    parent.append(
        odml.Property(name='Type',
                      value=odml.Value(data='visual, LED cube',
                                       dtype=odml.DType.string),
                      definition='Type of apparatus'))

    parent.append(
        odml.Property(name='SignalType',
                      value=odml.Value(data='digital',
                                       dtype=odml.DType.string),
                      definition='Signal type of apparatus (digital '
                      'or analog)'))

    parent.append(
        odml.Property(name='EventNames',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.string)
                          for data in [
                              'FP-ON', 'CUE-ON', 'CUE-OFF', 'GO-ON', 'GO-OFF',
                              'ERROR-FLASH', 'VALIDATION-FLASH'
                          ]
                      ],
                      definition='Names of events extracted from '
                      'this signal'))

    parent.append(
        odml.Property(name='Length',
                      value=default_value(odml.DType.float, unit='mm'),
                      definition='Length of apparatus'))

    parent.append(
        odml.Property(name='Width',
                      value=default_value(odml.DType.float, unit='mm'),
                      definition='Width of apparatus'))

    parent.append(
        odml.Property(name='Height',
                      value=default_value(odml.DType.float, unit='mm'),
                      definition='Height of apparatus'))

    parent.append(
        odml.Property(name='PosX',
                      value=odml.Value(data=5.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='X position of apparatus'))

    parent.append(
        odml.Property(name='PosY',
                      value=odml.Value(data=13.0,
                                       dtype=odml.DType.float,
                                       unit='cm'),
                      definition='Y position of apparatus'))

    parent.append(
        odml.Property(name='PosZ',
                      value=default_value(odml.DType.float, unit='cm'),
                      definition='Z position of apparatus'))

    parent.append(
        odml.Property(name='PosOrigin',
                      value=odml.Value(data='midline, waist-level',
                                       dtype=odml.DType.string),
                      definition='Origin for xyz position of '
                      'apparatus'))

    parent.append(
        odml.Property(name='LEDCount',
                      value=odml.Value(data=5, dtype=odml.DType.int),
                      definition='Number of LEDs'))

    parent.append(
        odml.Property(name='LEDConfiguration',
                      value=odml.Value(data='2-1-2', dtype=odml.DType.string),
                      definition='Arrangement of LEDs'))

    parent.append(
        odml.Property(name='CornerLEDColor',
                      value=odml.Value(data='red', dtype=odml.DType.string),
                      definition='Color of the corner LEDs'))

    parent.append(
        odml.Property(name='CenterLEDColor',
                      value=odml.Value(data='yellow', dtype=odml.DType.string),
                      definition='Color of the center LEDs'))

    parent.append(
        odml.Property(name='SamplingRate',
                      value=odml.Value(data=30000,
                                       dtype=odml.DType.int,
                                       unit='samples/sec'),
                      definition='Sampling rate of data'))

    parent.append(
        odml.Property(name='ConnectedTo',
                      value=odml.Value(data='NeuralSignalProcessor',
                                       dtype=odml.DType.string),
                      definition='Target device of apparatus'))

    parent.append(
        odml.Property(name='MonitoredBy',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Control software of apparatus'))

    parent.append(
        odml.Property(name='ControlledBy',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Control software of apparatus'))

    parent.append(
        odml.Property(name='SavedIn',
                      value=odml.Value(data='nev', dtype=odml.DType.string),
                      definition='File in which apparatus signals '
                      'are saved'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['CueSystem']['CueCodes']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='LeftLEDs',
                      value=odml.Value(data='side grip',
                                       dtype=odml.DType.string),
                      definition='LEDs coding this trial '
                      'instruction'))

    parent.append(
        odml.Property(name='RightLEDs',
                      value=odml.Value(data='precision grip',
                                       dtype=odml.DType.string),
                      definition='LEDs coding this trial '
                      'instruction'))

    parent.append(
        odml.Property(name='BottomLEDs',
                      value=odml.Value(data='low force',
                                       dtype=odml.DType.string),
                      definition='LEDs coding this trial '
                      'instruction'))

    parent.append(
        odml.Property(name='TopLEDs',
                      value=odml.Value(data='high force',
                                       dtype=odml.DType.string),
                      definition='LEDs coding this trial '
                      'instruction'))

    parent.append(
        odml.Property(name='CenterLED',
                      value=odml.Value(data='fixation point',
                                       dtype=odml.DType.string),
                      definition='LEDs coding this trial '
                      'instruction'))

    parent.append(
        odml.Property(name='CornerLEDs',
                      value=odml.Value(data='grip error',
                                       dtype=odml.DType.string),
                      definition='LEDs coding this trial '
                      'instruction'))

    # SET PARENT NODE
    parent = doc['Setup']['Apparatus']['RewardSystem']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Function',
                      value=odml.Value(data='rewards subject if '
                                       'trial was performed '
                                       'correctly',
                                       dtype=odml.DType.string),
                      definition='Function of apparatus'))

    parent.append(
        odml.Property(name='Type',
                      value=odml.Value(data='reward pipe',
                                       dtype=odml.DType.string),
                      definition='Type of apparatus'))

    parent.append(
        odml.Property(name='SignalType',
                      value=odml.Value(data='digital',
                                       dtype=odml.DType.string),
                      definition='Signal type of apparatus (digital '
                      'or analog)'))

    parent.append(
        odml.Property(name='EventNames',
                      value=[
                          odml.Value(data=data, dtype=odml.DType.string)
                          for data in ['RW']
                      ],
                      definition='Names of events extracted from '
                      'this signal'))

    parent.append(
        odml.Property(name='RewardFood',
                      value=odml.Value(data='apple sauce',
                                       dtype=odml.DType.string),
                      definition='Food used for reward'))

    parent.append(
        odml.Property(name='RewardAmount',
                      value=odml.Value(data=0.5,
                                       dtype=odml.DType.float,
                                       unit='ml/200ms'),
                      definition='Food amount used for reward per '
                      'trial'))

    parent.append(
        odml.Property(name='SamplingRate',
                      value=odml.Value(data=30000,
                                       dtype=odml.DType.int,
                                       unit='samples/sec'),
                      definition='Sampling rate of data'))

    parent.append(
        odml.Property(name='ConnectedTo',
                      value=odml.Value(data='NeuralSignalProcessor',
                                       dtype=odml.DType.string),
                      definition='Target device of apparatus'))

    parent.append(
        odml.Property(name='MonitoredBy',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Control software of apparatus'))

    parent.append(
        odml.Property(name='ControlledBy',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Control software of apparatus'))

    parent.append(
        odml.Property(name='SavedIn',
                      value=odml.Value(data='nev', dtype=odml.DType.string),
                      definition='File in which apparatus signals '
                      'are saved'))

    # SET PARENT NODE
    parent = doc['Setup']['ControlComputer']

    # APPEND SUBSECTIONS
    parent.append(
        odml.Section(name='ControlSoftware',
                     type='setup/daq',
                     definition='Information on the control software'
                     ' of the Cerebus^TM system'))

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='CPU',
                      value=default_value(odml.DType.string),
                      definition='CPU model'))

    parent.append(
        odml.Property(name='RAM',
                      value=default_value(odml.DType.float, unit='GB'),
                      definition='Amount of RAM'))

    parent.append(
        odml.Property(name='Mainboard',
                      value=default_value(odml.DType.string),
                      definition='Mainboard type'))

    parent.append(
        odml.Property(name='HarddiskCapacity',
                      value=default_value(odml.DType.float, unit='GB'),
                      definition='Disk capacity of data storage'))

    parent.append(
        odml.Property(name='OSType',
                      value=default_value(odml.DType.string),
                      definition='Type of operating system'))

    parent.append(
        odml.Property(name='OSVersion',
                      value=default_value(odml.DType.string),
                      definition='Version of operating system'))

    # SET PARENT NODE
    parent = doc['Setup']['ControlComputer']['ControlSoftware']

    # APPEND SUBSECTIONS

    # APPEND PROPERTIES WITH DEFAULT VALUES
    parent.append(
        odml.Property(name='Name',
                      value=odml.Value(data='LabVIEW',
                                       dtype=odml.DType.string),
                      definition='Name of software'))

    parent.append(
        odml.Property(name='Manufacturer',
                      value=odml.Value(data='National Instruments',
                                       dtype=odml.DType.string),
                      definition='Manufacturer of software'))

    parent.append(
        odml.Property(name='Version',
                      value=default_value(odml.DType.string),
                      definition='Software version'))

    return doc
Esempio n. 18
0
    def test_property_values_cardinality(self):
        # -- Test assignment validation warnings
        doc = odml.Document()
        sec = odml.Section(name="sec", type="sec_type", parent=doc)

        # Making sure only the required warnings are tested
        self._clear_output()

        # -- Test cardinality validation warnings on Property init
        # Test warning when setting invalid minimum
        _ = odml.Property(name="prop_card_min",
                          values=[1],
                          val_cardinality=(2, None),
                          parent=sec)
        output = self._get_captured_output()
        test_msg = "%s (minimum %s values, %s found)" % (self.msg_base, 2, 1)
        self.assertEqual(len(output), 1)
        self.assertIn(test_msg, output[0])

        # Test warning when setting invalid maximum
        _ = odml.Property(name="prop_card_max",
                          values=[1, 2, 3],
                          val_cardinality=2,
                          parent=sec)
        output = self._get_captured_output()
        test_msg = "%s (maximum %s values, %s found)" % (self.msg_base, 2, 3)
        self.assertEqual(len(output), 1)
        self.assertIn(test_msg, output[0])

        # Test no warning on valid init
        prop_card = odml.Property(name="prop_card",
                                  values=[1, 2],
                                  val_cardinality=(1, 5),
                                  parent=sec)
        output = self._get_captured_output()
        self.assertEqual(output, [])

        # -- Test cardinality validation warnings on cardinality updates
        # Test warning when setting minimally required values cardinality
        prop_card.val_cardinality = (3, None)
        output = self._get_captured_output()
        test_msg = "%s (minimum %s values, %s found)" % (self.msg_base, 3, 2)
        self.assertEqual(len(output), 1)
        self.assertIn(test_msg, output[0])

        # Test warning when setting maximally required values cardinality
        prop_card.values = [1, 2, 3]
        prop_card.val_cardinality = 2
        output = self._get_captured_output()
        test_msg = "%s (maximum %s values, %s found)" % (self.msg_base, 2, 3)
        self.assertEqual(len(output), 1)
        self.assertIn(test_msg, output[0])

        # Test no warning on valid cardinality
        prop_card.val_cardinality = (1, 10)
        output = self._get_captured_output()
        self.assertEqual(output, [])

        # Test no warning when setting cardinality to None
        prop_card.val_cardinality = None
        output = self._get_captured_output()
        self.assertEqual(output, [])

        # -- Test cardinality validation warnings on values updates
        # Test warning when violating minimally required values cardinality
        prop_card.val_cardinality = (3, None)
        prop_card.values = [1, 2]
        output = self._get_captured_output()
        test_msg = "%s (minimum %s values, %s found)" % (self.msg_base, 3, 2)
        self.assertEqual(len(output), 1)
        self.assertIn(test_msg, output[0])

        # Test warning when violating maximally required values cardinality
        prop_card.val_cardinality = (None, 2)
        prop_card.values = [1, 2, 3]
        output = self._get_captured_output()
        test_msg = "%s (maximum %s values, %s found)" % (self.msg_base, 2, 3)
        self.assertEqual(len(output), 1)
        self.assertIn(test_msg, output[0])

        # Test no warning when setting correct number of values
        prop_card.values = [1, 2]
        output = self._get_captured_output()
        self.assertEqual(output, [])

        # Test no warning when setting values to None
        prop_card.values = None
        output = self._get_captured_output()
        self.assertEqual(output, [])