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'
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)
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
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']
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)
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
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
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
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"))
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
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, [])