Example #1
0
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
Example #2
0
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