def ReadC3d(_filename='07_01.c3d', verbose=False): """ read c3d file Parameters ---------- _filename : string verbose : boolean Returns ------- Subjects Point frames dinfo """ #check if local or global path if ('/' or '\\') in _filename: FullFileName = _filename else: FullFileName = pyu.getlong(_filename, os.path.join('body', 'c3d')) Markers = [] VideoFrameRate = 0 AnalogSignals = [] AnalogFrameRate = 0 Event = [] ParameterGroups = [] CameraInfo = [] ResidualError = [] if verbose: print("FileName = ", FullFileName) fid = io.open(FullFileName, 'rb') content = fid.read() content_memory = content NrecordFirstParameterblock, content = getNumber(content, 1) # Reading record number of parameter section key, content = getNumber(content, 1) if key != 80: print('File: ', FullFileName, ' does not comply to the C3D format') fid.close() content = content[512 * (NrecordFirstParameterblock - 1) + 1:] proctype, content = getNumber(content, 1) proctype = proctype - 83 # proctype: 1(INTEL-PC); 2(DEC-VAX); 3(MIPS-SUN/SGI) dinfo = {} # print( "*************************" print("**** Processor coding :", ) # print "************************" if proctype == 1: print("Intel-PC") dinfo['Encoding'] = "Intel-PC" elif proctype == 2: print("DEC-VAX") dinfo['Encoding'] = "DEC-VAX" elif proctype == 3: print("MIPS-SUN/SGI") dinfo['Encoding'] = "MIPS-SUN/SGI" else: print("unknown processor type") content = content_memory content = content[2:] Nmarkers, content = getNumber(content, 2) NanalogSamplesPerVideoFrame, content = getNumber(content, 2) StartFrame, content = getNumber(content, 2) EndFrame, content = getNumber(content, 2) MaxInterpolationGap, content = getNumber(content, 2) Scale, content = getFloat(content, proctype) NrecordDataBlock, content = getNumber(content, 2) NanalogFramesPerVideoFrame, content = getNumber(content, 2) if NanalogFramesPerVideoFrame > 0: NanalogChannels = NanalogSamplesPerVideoFrame / \ NanalogFramesPerVideoFrame else: NanalogChannels = 0 VideoFrameRate, content = getFloat(content, proctype) AnalogFrameRate = VideoFrameRate * NanalogFramesPerVideoFrame dinfo['NanalogFramesPerVideoFRame'] = NanalogFramesPerVideoFrame dinfo['AnalogFrameRate'] = AnalogFrameRate dinfo['VideoFrameRate'] = VideoFrameRate dinfo['Scale'] = Scale dinfo['Nmarkers'] = Nmarkers dinfo['StartFrame'] = StartFrame dinfo['EndFrame'] = EndFrame if verbose: print("NanalogFramesPerVideoFrame= ", NanalogFramesPerVideoFrame) print("AnalogFrameRate= ", AnalogFrameRate) print("VideoFrameRate= ", VideoFrameRate) print("Scale= ", Scale) print("Nmarkers= ", Nmarkers) print("StartFrame= ", StartFrame) print("EndFrame= ", EndFrame) print("***********************") print("**** Reading Events ...") print("***********************") content = content_memory content = content[298:] # bizarre .. ce devrait etre 150 selon la doc EventIndicator, content = getNumber(content, 2) EventTime = [] EventValue = [] EventName = [] if verbose: print("EventIndicator = ", EventIndicator) if EventIndicator == 12345: Nevents, content = getNumber(content, 2) #print "Nevents= ", Nevents content = content[2:] if Nevents > 0: for i in range(Nevents): letime, content = getFloat(content, proctype) EventTime.append(letime) content = content_memory content = content[188 * 2:] for i in range(Nevents): lavalue, content = getNumber(content, 1) EventValue.append(lavalue) content = content_memory content = content[198 * 2:] for i in range(Nevents): lenom = content[0:4] content = content[4:] EventName.append(lenom) if verbose: print("***************************") print("**** Reading Parameters ...") print("***************************") content = content_memory content = content[512 * (NrecordFirstParameterblock - 1):] ParameterGroups = [] ParameterNumberIndex = [] # dat1, content = getNumber(content, 1) key2, content = getNumber(content, 1) NparameterRecords, content = getNumber(content, 1) if verbose: print("NparameterRecords=", NparameterRecords) proctype, content = getNumber(content, 1) proctype = proctype - 83 # proctype: 1(INTEL-PC); 2(DEC-VAX); 3(MIPS-SUN/SGI) for i in range(NparameterRecords): leparam = ParameterGroup(None, None, []) ParameterGroups.append(leparam) ParameterNumberIndex.append(0) # # Ncharacters, content = getNumber(content, 1) if Ncharacters >= 128: Ncharacters = -(2**8) + (Ncharacters) GroupNumber, content = getNumber(content, 1) if GroupNumber >= 128: GroupNumber = -(2**8) + (GroupNumber) #print "GroupNumber = ", GroupNumber while Ncharacters > 0: if GroupNumber < 0: GroupNumber = abs(GroupNumber) GroupName = content[0:Ncharacters] content = content[Ncharacters:] #print "Group Number = ", GroupNumber ParameterGroups[GroupNumber].name = GroupName #print "ParameterGroupName =", GroupName offset, content = getNumber(content, 2) deschars, content = getNumber(content, 1) GroupDescription = content[0:deschars] content = content[deschars:] ParameterGroups[GroupNumber].description = GroupDescription # ParameterNumberIndex[GroupNumber] = 0 content = content[offset - 3 - deschars:] else: ParameterNumberIndex[ GroupNumber] = ParameterNumberIndex[GroupNumber] + 1 ParameterNumber = ParameterNumberIndex[GroupNumber] #print "ParameterNumber=", ParameterNumber ParameterGroups[GroupNumber].parameter.append( Parameter(None, None, [], [], None)) ParameterName = content[0:Ncharacters] content = content[Ncharacters:] #print "ParameterName = ",ParameterName if len(ParameterName) > 0: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].name = ParameterName offset, content = getNumber(content, 2) filepos = len(content_memory) - len(content) nextrec = filepos + offset - 2 typ, content = getNumber(content, 1) if typ >= 128: typ = -(2**8) + typ ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].type = type dimnum, content = getNumber(content, 1) if dimnum == 0: datalength = abs(typ) else: mult = 1 dimension = [] for j in range(dimnum): ladim, content = getNumber(content, 1) dimension.append(ladim) mult = mult * dimension[j] ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].dim.append( dimension[j]) datalength = abs(typ) * mult #print "ParameterNumber = ", ParameterNumber, " Group Number = ", GroupNumber if typ == -1: data = "" wordlength = dimension[0] if dimnum == 2 and datalength > 0: for j in range(dimension[1]): #data = string.rstrip(content[0:wordlength]) data = content[0:wordlength].rstrip() content = content[wordlength:] ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].data.append(data) elif dimnum == 1 and datalength > 0: data = content[0:wordlength] ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data.append(data) #if string.rstrip(ParameterName) == "LABELS" and string.rstrip(GroupName) == "POINT": if (ParameterName.rstrip().decode("utf-8") == "LABELS" and GroupName.rstrip().decode("utf-8") == "POINT"): if verbose: print( "POINT = ", ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].data) Point = ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].data #elif string.rstrip(ParameterName) == "LABEL_PREFIXES" and string.rstrip(GroupName) == "SUBJECTS": elif (ParameterName.rstrip().decode("utf-8") == "LABEL_PREFIXES" and GroupName.rstrip().decode("utf-8") == "SUBJECTS"): if verbose: print( "SUBJECTS = ", ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].data) Subjects = ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].data else: #print ParameterGroups[GroupNumber].parameter[ParameterNumber-1].data pass elif typ == 1: data = [] Nparameters = int(datalength / abs(typ)) if verbose: print("Nparameters=", Nparameters) for i in range(Nparameters): ladata, content = getNumber(content, 1) data.append(ladata) ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data elif typ == 2 and datalength > 0: data = [] Nparameters = int(datalength / abs(typ)) for i in range(Nparameters): ladata, content = getNumber(content, 2) data.append(ladata) if dimnum > 1: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data else: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data elif typ == 4 and datalength > 0: data = [] Nparameters = int(datalength / abs(typ)) for i in range(Nparameters): ladata, content = getFloat(content, proctype) data.append(ladata) if dimnum > 1: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data else: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data else: pass deschars, content = getNumber(content, 1) if deschars > 0: description = content[0:deschars] content = content[deschars:] ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].description = description content = content_memory content = content[nextrec:] Ncharacters, content = getNumber(content, 1) if Ncharacters >= 128: Ncharacters = -(2**8) + (Ncharacters) GroupNumber, content = getNumber(content, 1) if GroupNumber >= 128: GroupNumber = -(2**8) + (GroupNumber) #buff = content_memory #buff = content[(NrecordDataBlock - 1) * 512:] fd = io.open(FullFileName, 'rb') buff = fd.read() fd.close() offset = (NrecordDataBlock - 1) * 512 nframe = EndFrame - StartFrame + 1 npoints = Nmarkers nbytes = nframe * npoints * 16 nfloat = nframe * npoints * 4 if sys.version_info.major == 2: frame1 = StringIO(buff[offset:offset + nbytes]) else: frame1 = np.frombuffer(buff[offset:offset + nbytes], dtype='int8') if sys.version_info.major == 2: forma = str(nbytes) + 'S1' frames = np.array(frame1.read(nbytes)) y = frames.view(forma).reshape((nframe * npoints, 16)) else: y = frame1.reshape((nframe * npoints, 16)) # # reorganize floating point representation # if proctype > 1: z = np.empty(shape=y.shape, dtype=y.dtype) z[:, 0:2] = y[:, 2:4] z[:, 2:4] = y[:, 0:2] z[:, 4:6] = y[:, 6:8] z[:, 6:8] = y[:, 4:6] z[:, 8:10] = y[:, 10:12] z[:, 10:12] = y[:, 8:10] z[:, 12:14] = y[:, 14:16] z[:, 14:16] = y[:, 12:14] else: z = y if sys.version_info.major == 2: sfloat = str(nfloat) + 'f' frames = np.array(struct.unpack(sfloat, z)).reshape(nframe, npoints, 4) else: frames = np.frombuffer(z, dtype='float32').reshape(nframe, npoints, 4) frames = frames[:, :, 0:3] return Subjects, Point, frames, dinfo
def ReadC3d(_filename='07_01.c3d', verbose=False): """ read c3d file Parameters ---------- _filename : string verbose : boolean Returns ------- Subjects Point frames dinfo """ #check if local or global path if ('/' or '\\') in _filename: FullFileName=_filename else: FullFileName = pyu.getlong(_filename, os.path.join('body','c3d')) Markers = [] VideoFrameRate = 0 AnalogSignals = [] AnalogFrameRate = 0 Event = [] ParameterGroups = [] CameraInfo = [] ResidualError = [] if verbose: print( "FileName = ", FullFileName) fid = io.open(FullFileName,'rb') content = fid.read() content_memory = content NrecordFirstParameterblock, content = getNumber(content, 1) # Reading record number of parameter section key, content = getNumber(content, 1) if key != 80: print( 'File: ', FullFileName, ' does not comply to the C3D format') fid.close() content = content[512 * (NrecordFirstParameterblock - 1) + 1:] proctype, content = getNumber(content, 1) proctype = proctype - 83 # proctype: 1(INTEL-PC); 2(DEC-VAX); 3(MIPS-SUN/SGI) dinfo = {} # print( "*************************" print( "**** Processor coding :",) # print "************************" if proctype == 1: print( "Intel-PC") dinfo['Encoding']="Intel-PC" elif proctype == 2: print( "DEC-VAX") dinfo['Encoding']="DEC-VAX" elif proctype == 3: print( "MIPS-SUN/SGI") dinfo['Encoding']="MIPS-SUN/SGI" else: print( "unknown processor type") content = content_memory content = content[2:] Nmarkers, content = getNumber(content, 2) NanalogSamplesPerVideoFrame, content = getNumber(content, 2) StartFrame, content = getNumber(content, 2) EndFrame, content = getNumber(content, 2) MaxInterpolationGap, content = getNumber(content, 2) Scale, content = getFloat(content,proctype) NrecordDataBlock, content = getNumber(content, 2) NanalogFramesPerVideoFrame, content = getNumber(content, 2) if NanalogFramesPerVideoFrame > 0: NanalogChannels = NanalogSamplesPerVideoFrame / \ NanalogFramesPerVideoFrame else: NanalogChannels = 0 VideoFrameRate, content = getFloat(content,proctype) AnalogFrameRate = VideoFrameRate * NanalogFramesPerVideoFrame dinfo['NanalogFramesPerVideoFRame']=NanalogFramesPerVideoFrame dinfo['AnalogFrameRate']= AnalogFrameRate dinfo['VideoFrameRate']= VideoFrameRate dinfo['Scale'] = Scale dinfo['Nmarkers'] = Nmarkers dinfo['StartFrame'] = StartFrame dinfo['EndFrame'] = EndFrame if verbose: print( "NanalogFramesPerVideoFrame= ", NanalogFramesPerVideoFrame) print( "AnalogFrameRate= ", AnalogFrameRate) print("VideoFrameRate= ", VideoFrameRate) print( "Scale= ", Scale) print( "Nmarkers= ", Nmarkers) print( "StartFrame= ", StartFrame) print( "EndFrame= ", EndFrame) print( "***********************") print( "**** Reading Events ...") print( "***********************") content = content_memory content = content[298:] # bizarre .. ce devrait etre 150 selon la doc EventIndicator, content = getNumber(content, 2) EventTime = [] EventValue = [] EventName = [] if verbose: print( "EventIndicator = ", EventIndicator) if EventIndicator == 12345: Nevents, content = getNumber(content, 2) #print "Nevents= ", Nevents content = content[2:] if Nevents > 0: for i in range(Nevents): letime, content = getFloat(content,proctype) EventTime.append(letime) content = content_memory content = content[188 * 2:] for i in range(Nevents): lavalue, content = getNumber(content, 1) EventValue.append(lavalue) content = content_memory content = content[198 * 2:] for i in range(Nevents): lenom = content[0:4] content = content[4:] EventName.append(lenom) if verbose: print( "***************************") print( "**** Reading Parameters ...") print( "***************************") content = content_memory content = content[512 * (NrecordFirstParameterblock - 1):] ParameterGroups = [] ParameterNumberIndex = [] # dat1, content = getNumber(content, 1) key2, content = getNumber(content, 1) NparameterRecords, content = getNumber(content, 1) if verbose: print( "NparameterRecords=", NparameterRecords) proctype, content = getNumber(content, 1) proctype = proctype - 83 # proctype: 1(INTEL-PC); 2(DEC-VAX); 3(MIPS-SUN/SGI) for i in range(NparameterRecords): leparam = ParameterGroup(None, None, []) ParameterGroups.append(leparam) ParameterNumberIndex.append(0) # # Ncharacters, content = getNumber(content, 1) if Ncharacters >= 128: Ncharacters = -(2 ** 8) + (Ncharacters) GroupNumber, content = getNumber(content, 1) if GroupNumber >= 128: GroupNumber = -(2 ** 8) + (GroupNumber) #print "GroupNumber = ", GroupNumber while Ncharacters > 0: if GroupNumber < 0: GroupNumber = abs(GroupNumber) GroupName = content[0:Ncharacters] content = content[Ncharacters:] #print "Group Number = ", GroupNumber ParameterGroups[GroupNumber].name = GroupName #print "ParameterGroupName =", GroupName offset, content = getNumber(content, 2) deschars, content = getNumber(content, 1) GroupDescription = content[0:deschars] content = content[deschars:] ParameterGroups[GroupNumber].description = GroupDescription # ParameterNumberIndex[GroupNumber] = 0 content = content[offset - 3 - deschars:] else: ParameterNumberIndex[GroupNumber] = ParameterNumberIndex[GroupNumber] + 1 ParameterNumber = ParameterNumberIndex[GroupNumber] #print "ParameterNumber=", ParameterNumber ParameterGroups[GroupNumber].parameter.append(Parameter(None, None, [], [], None)) ParameterName = content[0:Ncharacters] content = content[Ncharacters:] #print "ParameterName = ",ParameterName if len(ParameterName) > 0: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].name = ParameterName offset, content = getNumber(content, 2) filepos = len(content_memory) - len(content) nextrec = filepos + offset - 2 typ, content = getNumber(content, 1) if typ >= 128: typ = -(2 ** 8) + typ ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].type = type dimnum, content = getNumber(content, 1) if dimnum == 0: datalength = abs(typ) else: mult = 1 dimension = [] for j in range(dimnum): ladim, content = getNumber(content, 1) dimension.append(ladim) mult = mult * dimension[j] ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].dim.append(dimension[j]) datalength = abs(typ) * mult #print "ParameterNumber = ", ParameterNumber, " Group Number = ", GroupNumber if typ == -1: data = "" wordlength = dimension[0] if dimnum == 2 and datalength > 0: for j in range(dimension[1]): #data = string.rstrip(content[0:wordlength]) data = content[0:wordlength].rstrip() content = content[wordlength:] ParameterGroups[GroupNumber].parameter[ ParameterNumber - 1].data.append(data) elif dimnum == 1 and datalength > 0: data = content[0:wordlength] ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data.append(data) #if string.rstrip(ParameterName) == "LABELS" and string.rstrip(GroupName) == "POINT": if ( ParameterName.rstrip().decode("utf-8") == "LABELS" and GroupName.rstrip().decode("utf-8") == "POINT"): if verbose: print( "POINT = ", ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data) Point = ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data #elif string.rstrip(ParameterName) == "LABEL_PREFIXES" and string.rstrip(GroupName) == "SUBJECTS": elif (ParameterName.rstrip().decode("utf-8") == "LABEL_PREFIXES" and GroupName.rstrip().decode("utf-8") == "SUBJECTS"): if verbose: print( "SUBJECTS = ", ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data) Subjects = ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data else: #print ParameterGroups[GroupNumber].parameter[ParameterNumber-1].data pass elif typ == 1: data = [] Nparameters = int(datalength / abs(typ)) if verbose: print( "Nparameters=", Nparameters) for i in range(Nparameters): ladata, content = getNumber(content, 1) data.append(ladata) ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data elif typ == 2 and datalength > 0: data = [] Nparameters = int(datalength / abs(typ)) for i in range(Nparameters): ladata, content = getNumber(content, 2) data.append(ladata) if dimnum > 1: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data else: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data elif typ == 4 and datalength > 0: data = [] Nparameters = int(datalength / abs(typ)) for i in range(Nparameters): ladata, content = getFloat(content,proctype) data.append(ladata) if dimnum > 1: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data else: ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].data = data else: pass deschars, content = getNumber(content, 1) if deschars > 0: description = content[0:deschars] content = content[deschars:] ParameterGroups[GroupNumber].parameter[ParameterNumber - 1].description = description content = content_memory content = content[nextrec:] Ncharacters, content = getNumber(content, 1) if Ncharacters >= 128: Ncharacters = -(2 ** 8) + (Ncharacters) GroupNumber, content = getNumber(content, 1) if GroupNumber >= 128: GroupNumber = -(2 ** 8) + (GroupNumber) #buff = content_memory #buff = content[(NrecordDataBlock - 1) * 512:] fd = io.open(FullFileName,'rb') buff = fd.read() fd.close() offset = (NrecordDataBlock -1)*512 nframe = EndFrame - StartFrame + 1 npoints = Nmarkers nbytes = nframe*npoints*16 nfloat = nframe*npoints*4 if sys.version_info.major==2: frame1 = StringIO(buff[offset:offset+nbytes]) else: frame1 = np.frombuffer(buff[offset:offset+nbytes],dtype='int8') if sys.version_info.major==2: forma = str(nbytes)+'S1' frames = np.array(frame1.read(nbytes)) y = frames.view(forma).reshape((nframe*npoints,16)) else: y = frame1.reshape((nframe*npoints,16)) # # reorganize floating point representation # if proctype>1: z = np.empty(shape=y.shape,dtype=y.dtype) z[:,0:2] = y[:,2:4] z[:,2:4] = y[:,0:2] z[:,4:6] = y[:,6:8] z[:,6:8] = y[:,4:6] z[:,8:10] = y[:,10:12] z[:,10:12] = y[:,8:10] z[:,12:14] = y[:,14:16] z[:,14:16] = y[:,12:14] else: z = y if sys.version_info.major==2: sfloat = str(nfloat)+'f' frames = np.array(struct.unpack(sfloat,z)).reshape(nframe,npoints,4) else: frames = np.frombuffer(z,dtype='float32').reshape(nframe,npoints,4) frames = frames[:,:,0:3] return Subjects,Point,frames,dinfo