def save_metadata(self): trial_name = 'trial_{0:04d}'.format(self.trial_counter) file_list = [f for f in os.listdir(self.data_dir) if f.startswith(trial_name)] """ create a document """ doc = odml.Document() """ create dataset section """ ds = odml.Section('datasets', 'dataset') p = odml.Property('files', None) ds.append(p) for f in file_list: p.append('{0:s}/{1:s}'.format(self.data_dir, f)) doc.append(ds) for t in list(self.metadata_tabs.values()): m = t.metadata() if m.type == 'recording': v = odml.Value(self.record_timestamp, dtype='datetime') m.append(odml.Property('StartTime', v)) doc.append(m) for cam_name, cam in list(self.cameras.items()): s = odml.Section(cam_name,'hardware/camera') if not cam.is_raspicam(): v = odml.Value(frames_per_second, unit="Hz") s.append(odml.Property('Framerate', v)) for p, v in list(cam.get_properties().items()): prop = odml.Property(p, v) s.append(prop) doc.append(s) doc.append(self.event_list) print(self.event_list) from odml.tools.xmlparser import XMLWriter writer = XMLWriter(doc) writer.write_file('{0}/{1}.xml'.format(self.data_dir, trial_name))
def test_int(self): v = odml.Value(value="123456789012345678901", dtype="int") self.assertEqual(v.data, 123456789012345678901) self.assertEqual(v.value, "123456789012345678901") v = odml.Value(value="-123456789012345678901", dtype="int") self.assertEqual(v.data, -123456789012345678901) v = odml.Value(value="123.45", dtype="int") self.assertEqual(v.data, 123)
def get_location(location): if location == 'old': loc = odml.Value(data='Inst. de Neurosciences Cognitives de la ' 'Mediterranee (INCM), GLM, CNRS - Aix Marseille ' 'Univ., Marseille, France', dtype=odml.DType.string) elif location == 'new': loc = odml.Value(data='Inst. de Neurosciences de la Timone (INT), ' 'UMR 7289, CNRS - Aix Marseille Univ., ' 'Marseille, France', dtype=odml.DType.string) else: loc = default_value(odml.DType.url) return loc
def clicked_tag(self): ts = str(datetime.now()).split('.')[0] text, ok = QtWidgets.QInputDialog.getText(self, 'Tag data with Event', 'Enter tag comment:') """ write tags into .xml (odML) file """ if ok: tag_name = 'event_{0:02d}'.format(len(self.event_list)) e = odml.Section(tag_name, 'event') e.append(odml.Property('timestamp', odml.Value(ts, dtype='datetime'))) e.append(odml.Property('comment', odml.Value(text, dtype='string'))) self.event_list.append(e) """ write tags into the .dat file as pure text """ trial_info_filename = '{0:s}/trial_{1:04d}_info.dat'.format(self.data_dir, self.trial_counter) with open(trial_info_filename, 'a') as f: timestamp = datetime.now().strftime(("tag-time:" + "\t" + "%Y-%m-%d %H:%M:%S:%f")[:-3] + "\t" + text) f.write(timestamp + '\n')
def test_dependence(self): a = self.p b = self.p self.assertEqual(a, b) a.value = odml.Value(5) self.assertEqual(a, b) self.assertEqual(a.value, b.value)
def test_8bit_binary(self): data = ''.join([chr(i) for i in xrange(256)]) v = odml.Value(data, dtype="binary") v.encoder = "base64" b64_data = 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==' self.assertEqual(v.value, b64_data) v.value = b64_data self.assertEqual(v.data, data) self.assertEqual(v.value, b64_data) v.encoder = "quoted-printable" qp_data = '=00=01=02=03=04=05=06=07=08=09\n=0B=0C\r=0E=0F=10=11=12=13=14=15=16=17=18=19=1A=1B=1C=1D=1E=1F !"#$%&\'()*+,-=\n./0123456789:;<=3D>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv=\nwxyz{|}~=7F=80=81=82=83=84=85=86=87=88=89=8A=8B=8C=8D=8E=8F=90=91=92=93=94=\n=95=96=97=98=99=9A=9B=9C=9D=9E=9F=A0=A1=A2=A3=A4=A5=A6=A7=A8=A9=AA=AB=AC=AD=\n=AE=AF=B0=B1=B2=B3=B4=B5=B6=B7=B8=B9=BA=BB=BC=BD=BE=BF=C0=C1=C2=C3=C4=C5=C6=\n=C7=C8=C9=CA=CB=CC=CD=CE=CF=D0=D1=D2=D3=D4=D5=D6=D7=D8=D9=DA=DB=DC=DD=DE=DF=\n=E0=E1=E2=E3=E4=E5=E6=E7=E8=E9=EA=EB=EC=ED=EE=EF=F0=F1=F2=F3=F4=F5=F6=F7=F8=\n=F9=FA=FB=FC=FD=FE=FF' self.assertEqual(v.value, qp_data) v.value = qp_data self.assertEqual(v.data, data) self.assertEqual(v.value, qp_data) v.encoder = "hexadecimal" hex_data = '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff' self.assertEqual(v.value, hex_data) v.value = hex_data self.assertEqual(v.data, data) self.assertEqual(v.value, hex_data) self.assertEqual(v.checksum, 'crc32$29058c73') v.checksum = "md5" self.assertEqual(v.checksum, 'md5$e2c865db4162bed963bfaa9ef6ac18f0') v.encoder = '' v.data = v.data[:127] # chrs > 128 cannot be converted to ascii v.dtype = "string" self.assertIsNone(v.encoder) self.assertIsNone(v.checksum) self.assertEqual(v.value, data[:127])
def test_pre_post_change(self): res = [] func = lambda context: res.append( (context.preChange, context.postChange)) odml.getImplementation().Value._Changed += func a = odml.Value(1) a.value = 2 odml.getImplementation().Value._Changed -= func self.assertEqual(res, [(True, False), (False, True)])
def test_event_passing(self): s = odml.Section(name="section") v = odml.Value(1) p = odml.Property(name="prop", value=v) s.append(p) v.data = 4 self.assertEqual(v._modified, [v]) self.assertEqual(p._modified, [v, p]) self.assertEqual(s._modified, [v, p, s]) self.assertEqual(v.data, 4)
def test_empty_binary(self): v = odml.Value("", dtype="string") v.dtype = "binary" v.encoding = "base64" self.assertIsNone(v.value) v.encoding = "quoted-printable" self.assertIsNone(v.value) v.encoding = "hexadecimal" self.assertIsNone(v.value) self.assertEqual(v.checksum, 'crc32$00000000') v.checksum = "md5" self.assertEqual(v.checksum, 'md5$d41d8cd98f00b204e9800998ecf8427e')
def test_simple_events(self): a = odml.Value(1) a._value = 2 self.assertEqual(a.data, 2) # modifying a protected attribute should not make a call, # thus the _modified property won't be set self.assertRaises(AttributeError, lambda: a._modified) a.data = 3 self.assertEqual(a.data, 3) self.assertIs(a._modified[0], a) self.assertEqual(a._context.val, ("data", 3)) self.assertTrue(a._context.postChange)
def append(self, value): """ adds a value to the list of values If *value* is not an odml.Value instance, such an instance will be created given the addition function arguments (see :ref:`__init__` for their description). If *value* is not an odml.Value instance and *unit*, *dtype* or *uncertainty* are missing, the values will be copied from the last value in this properties value-list if *copy_attributes* is True. If there is no value present to be copied from, an IndexError will be raised. """ if not isinstance(value, odml_value.Value): value = odml.Value(value) self._values.append(value) value._property = self
def __init__(self, name, value, definition=None, dependency=None, dependency_value=None, mapping=None): """ Create a new Property with one single or multiple values. If something is passed as value that is not a Value object, the method will try to infer the values dtype from the type of the parameter. Example for a property with a single value >>> Property("property1", odml.Value(2)) #or >>> Property("property1", 2) Example for a property with multiple values >>> Property("property2", [odml.Value(data=1), odml.Value(data=2)]) #or >>> Property("property2", [1, 2]) :param name: The mane of the property :param value: Either a Value or some type a Value can be created from or a list of values. :param definition: The definition of the property. :param dependency: Another property this property depends on. :param dependency_value: Dependency on a certain value. :param mapping: Mapping information of the property. """ #TODO doc description for arguments #TODO validate arguments self._name = name self._section = None self._reset_values() self.definition = definition self.dependency = dependency self.dependency_value = dependency_value self._mapping = mapping if isinstance(value, list): for v in value: if not isinstance(v, odml_value.Value): v = odml.Value(v) self.append(v) elif value is not None: self.append(value)
def fill_odml_with_xls(doc, xls, source_filename): """ """ for d in xls: prop_path = ':'.join([d['Path'], d['Property Name']]) prop = doc.get_property_by_path(prop_path) if len(d['Value']) == 1 and len(prop.values) == 1: prop.value.data = d['Value'][0] prop.value.dtype = d['odML Data Type'][0] prop.value.filename = source_filename if len(d['Data Unit']) > 0: prop.value.unit = d['Data Unit'][0] if len(d['Data Uncertainty']) > 0: prop.value.uncertainty = d['Data Uncertainty'][0] elif len(d['Value']) > 1 and len(prop.values) == 1: for i, v in enumerate(d['Value']): if i == 0: prop.value.data = v prop.value.filename = source_filename if len(d['Data Unit']) > 0: prop.value.unit = d['Data Unit'][i] if len(d['Data Uncertainty']) > 0: prop.value.uncertainty = d['Data Uncertainty'][i] else: prop.values.append( odml.Value(data=v, dtype=d['odML Data Type'][i], unit=d['Data Unit'][i] if len(d['Data Unit']) > 0 else '', uncertainty=d['Data Uncertainty'] if len(d['Data Uncertainty']) > 0 else '', filename=source_filename)) elif len(prop.values) == len(d['Value']): for i, v in enumerate(d['Value']): prop.values[i].data = d['Value'][i] prop.values[i].dtype = d['odML Data Type'][i] prop.values[i].filename = source_filename if len(d['Data Unit']) > 0: prop.values[i].unit = d['Data Unit'][i] if len(d['Data Uncertainty']) > 0: prop.values[i].uncertainty = d['Data Uncertainty'][i]
def propcsv2odmltree(load_from, document): """ Writing odml properties within an csv to an odml tree. """ pdict = propcsv2dict(load_from) for pname in pdict.keys(): values = [] for i in range(len(pdict[pname]['Value'])): values.append( odml.Value(data=pdict[pname]['Value'][i], dtype=pdict[pname]['odML Data Type'][i], unit=pdict[pname]['Data Unit'], uncertainty=pdict[pname]['Data Uncertainty'], definition=pdict[pname]['Value Definition'])) prop = document.get_property_by_path(pdict[pname]['Path 2 Property']) prop.definition = pdict[pname]['Property Definition'] prop.values = values
def default_value(dtype, unit=None): """ Returns an odML Value with default data of the given DType Args: dtype (odml.DType): DType of the default data unit (string, optional): Unit of the default data Returns: (odml.value.BaseValue): odML Value with default data, dtype and unit Note: Valid DTypes: odml.DType.text, odml.DType.string, odml.DType.person, odml.DType.url, odml.DType.binary, odml.DType.boolean, odml.DType.int, odml.DType.date, odml.DType.datetime """ if dtype in [ odml.DType.text, odml.DType.string, odml.DType.person, odml.DType.binary ]: data = '-' elif dtype == odml.DType.url: data = 'file://-' elif dtype == odml.DType.boolean: data = False elif dtype == odml.DType.int: data = -1 elif dtype == odml.DType.float: data = -1.0 elif dtype == odml.DType.date: data = datetime.date(1111, 11, 11) elif dtype == odml.DType.datetime: data = datetime.datetime(1111, 11, 11, 11, 11, 11) elif dtype == odml.DType.time: data = datetime.time(11, 11, 11) else: raise TypeError('Unknown DType') return odml.Value(data=data, dtype=dtype, unit=unit)
def create_value(self, content): return odml.Value(content)
def test_independence(self): a = self.p.clone() b = self.p.clone() self.assertEqual(a, b) a.value = odml.Value(5) self.assertNotEqual(a, b)
def test_value_float(self): v = odml.Value(value="1.5", dtype="float") self.assertEqual(v.data, 1.5)
def test_conversion_float_to_int(self): v = odml.Value(value="1.5", dtype="float") v.dtype = "int" self.assertEqual(v.dtype, "int") self.assertEqual(v.data, 1)
def test_conversion_int_to_float(self): v = odml.Value(value="1", dtype="int") v.dtype = "float" # change dtype self.assertEqual(v.dtype, "float") self.assertEqual(v.data, 1.0) self.assertEqual(v.value, "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'
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 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
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=[ odml.Value(data="Arthur Philip Dent", dtype=odml.DType.person), odml.Value(data="Zaphod Beeblebrox", dtype=odml.DType.person), odml.Value(data="Tricia Marie McMillan", dtype=odml.DType.person), odml.Value(data="Ford Prefect", dtype=odml.DType.person) ], definition="List of crew members names")) parent.append( odml.Property(name="NoCrewMembers", value=odml.Value(data=4, dtype=odml.DType.int), definition="Number of crew members")) # SET NEW PARENT NODE parent = doc['TheCrew']['Arthur Philip Dent']
def test_value_int(self): v = odml.Value(value="1", dtype="int") self.assertEqual(v.data, 1)
""" popup menu action: reset property """ dst = prop.get_merged_equivalent().clone() cmd = commands.ReplaceObject(obj=prop, repl=dst) self.execute(cmd) def set_value(self, widget, (prop, val)): """ popup menu action: set value set the curr """ model, path, obj = self.popup_data if val is None: val = odml.Value("") else: val = val.clone() if obj is prop: obj = prop.values[0] prop = obj._property # first append, then remove to keep the constraint that a property # will always hold at least one value cmd = commands.Multiple(cmds=[ commands.AppendValue(obj=prop, val=val), commands.DeleteObject(obj=obj) ]) self.execute(cmd)
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