Example #1
0
class Mappability(object):
    def __init__(self, fasta_name, fileAccess="file"):
        self._lowFN = fasta_name + ".bin/map.low.bin"
        self._highFN = fasta_name + ".bin/map.high.bin"
        if os.path.getsize(self._lowFN) != os.path.getsize(self._highFN):
            raise Error(
                "The low and high Mappability files should be the same size")

        self._lowF = BinaryFile(self._lowFN, fileAccess)
        self._highF = BinaryFile(self._highFN, fileAccess)
        self.fasta = fasta_name

    def low(self, pos):
        return struct.unpack("B", self._lowF.readIndex(pos))

    def high(self, pos):
        return struct.unpack("B", self._highF.readIndex(pos))

    @staticmethod
    def createFromMumdexDir(mumdexDir, fileAccess="file"):
        fasta_name = ""
        with open(os.path.join(mumdexDir, "ref.txt")) as refF:
            fasta_name = refF.readline().strip()

        return Mappability(fasta_name, fileAccess)
Example #2
0
    def __init__(self, fasta_name, fileAccess="file"):
        self._lowFN = fasta_name + ".bin/map.low.bin"
        self._highFN = fasta_name + ".bin/map.high.bin"
        if os.path.getsize(self._lowFN) != os.path.getsize(self._highFN):
            raise Error(
                "The low and high Mappability files should be the same size")

        self._lowF = BinaryFile(self._lowFN, fileAccess)
        self._highF = BinaryFile(self._highFN, fileAccess)
        self.fasta = fasta_name
Example #3
0
class Reference(object):
    def __init__(self, fasta_name, fileAccess="file"):
        self._seqFN = fasta_name + ".bin/ref.seq.bin"
        self._seqF = BinaryFile(self._seqFN, fileAccess)
        self._chrLenFN = fasta_name + ".bin/ref.chr_len.bin"
        self._chrNameFN = fasta_name + ".bin/ref.chr_name.bin"
        self.chrLen = array.array("I")
        with open(self._chrLenFN) as chrLenF:
            self.chrLen.fromstring(chrLenF.read())

        self.chrAbsPos = []
        pos = 0
        for length in self.chrLen:
            self.chrAbsPos.append(pos)
            pos += length

        self.chrName = []
        with open(self._chrNameFN) as chrNameF:
            for line in chrNameF:
                self.chrName.append(line.strip())

        self.fasta = fasta_name

    @staticmethod
    def createFromMumdexDir(mumdexDir, fileAccess="file"):
        fasta_name = ""
        with open(os.path.join(mumdexDir, "ref.txt")) as refF:
            fasta_name = refF.readline().strip()

        return Reference(fasta_name, fileAccess)

    def name(self, chromIndex):
        return self.chrName[chromIndex]

    def chromToIndex(self, chromName):
        return self.chrName.index(chromName)

    def CP2APos(self, chrom, pos):
        chromIndex = self.chromToIndex(chrom)
        return self.chrAbsPos[chromIndex] + pos

    def getSeqChrom(self, chrom, beg, end):
        absBeg = self.CP2APos(chrom, beg)
        absEnd = self.CP2APos(chrom, end)
        return self._seqF.readRange(absBeg, absEnd)

    def getSeqAbs(self, absBeg, absEnd):
        return self._seqF.readRange(absBeg, absEnd)
Example #4
0
 def parse(self, obj = True, anim = False):
     if self.filename == None:
         print "No file\n"
         return False
     if ".3ds" not in self.filename:
         print "Invalid source file extension\nExtension must be .3ds\n"
         return False
     if anim == True:
         self.keyframe = Chunks.KeyframeChunk()
     if obj == False:
         self.object = None
     self.file = BinaryFile(self.filename, "rb")
     header = Chunks.ChunkHeader()
     self.readChunkHeader(header)
     if header.chunk_id != _3DS.MAIN_CHUNK:
         print "Invalid 3DS file\n"
         self.file.close()
         return False
     print "Main Chunk"
     self.readMainChunk(header.chunk_length - 6)
     end_position = self.file.tell()
     self.file.seek(0, os.SEEK_END)
     eof = self.file.tell()
     self.file.close()
     if eof != end_position:
         return False
     return True
Example #5
0
    def __init__(self, fasta_name, fileAccess="file"):
        self._seqFN = fasta_name + ".bin/ref.seq.bin"
        self._seqF = BinaryFile(self._seqFN, fileAccess)
        self._chrLenFN = fasta_name + ".bin/ref.chr_len.bin"
        self._chrNameFN = fasta_name + ".bin/ref.chr_name.bin"
        self.chrLen = array.array("I")
        with open(self._chrLenFN) as chrLenF:
            self.chrLen.fromstring(chrLenF.read())

        self.chrAbsPos = []
        pos = 0
        for length in self.chrLen:
            self.chrAbsPos.append(pos)
            pos += length

        self.chrName = []
        with open(self._chrNameFN) as chrNameF:
            for line in chrNameF:
                self.chrName.append(line.strip())

        self.fasta = fasta_name
Example #6
0
class MaxParser:

    def __init__(self, filename = None):
        self.keyframe = None
        self.object = Chunks.ObjectChunk()
        self.filename = filename
        
    def readChunkHeader(self, header):
        header.start_position = self.file.tell()
        header.chunk_id = self.file.readShort()
        header.chunk_length = self.file.readInt()
       # print "------------\n%d" %(header.start_position)
       # print "%X" %(header.chunk_id)
       # print "%d\n---------------" %(header.chunk_length)

    def parseFile(self, filename):
        self.filename = filename
        return self.parse()

    def parse(self, obj = True, anim = False):
        if self.filename == None:
            print "No file\n"
            return False
        if ".3ds" not in self.filename:
            print "Invalid source file extension\nExtension must be .3ds\n"
            return False
        if anim == True:
            self.keyframe = Chunks.KeyframeChunk()
        if obj == False:
            self.object = None
        self.file = BinaryFile(self.filename, "rb")
        header = Chunks.ChunkHeader()
        self.readChunkHeader(header)
        if header.chunk_id != _3DS.MAIN_CHUNK:
            print "Invalid 3DS file\n"
            self.file.close()
            return False
        print "Main Chunk"
        self.readMainChunk(header.chunk_length - 6)
        end_position = self.file.tell()
        self.file.seek(0, os.SEEK_END)
        eof = self.file.tell()
        self.file.close()
        if eof != end_position:
            return False
        return True

    def readMainChunk(self, bytes):
        header = Chunks.ChunkHeader()
        while bytes > 0:
            self.readChunkHeader(header)
            for case in switch(header.chunk_id):
                if case(_3DS.M3D_VERSION):
                    self.version = self.file.readInt()
                    print 'Version: %d' %(self.version)
                    break
                if case(_3DS.EDITOR_CHUNK):
                    if self.object == None:
                        break
                    self.object.materials = []
                    self.object.meshes = []
                    print " Editor Chunk"
                    self.readObjectChunk(header.chunk_length - 6)
                    break
                if case(_3DS.KEYFRAME_CHUNK):
                    if self.keyframe == None:
                        break
                    print " Key Frame"
                    self.readKeyframeChunk(header.chunk_length - 6)
                    break
                if case():
                    print ' Skip unknown %X subchunk' %(header.chunk_id)
            self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
            bytes = self.updateBytesToRead(bytes, header.chunk_length)

    def readObjectChunk(self, bytes):
        header = Chunks.ChunkHeader()
        while bytes > 0:
            self.readChunkHeader(header)
            for case in switch(header.chunk_id):
                if case(_3DS.MESH_VERSION):
                    self.object.version = self.file.readInt()
                    print "  Mesh Version: %d" %(self.object.version)
                    break
                if case(_3DS.MATERIAL_BLOCK):
                    print "  Material"
                    self.readMaterialChunk(header.chunk_length - 6)
                    break
                if case(_3DS.MASTER_SCALE):
                    self.object.masterScale = self.file.readFloat()
                    print "  Master scale: %.2f" %(self.object.masterScale)
                    break
                if case(_3DS.AMBIENT_LIGHT):
                    print "  Ambient light: "
                    self.object.ambientLight = self.readFloatColor()
                    break;
                if case(_3DS.MESH):
                    print "  Mesh"
                    self.readMeshChunk(header.chunk_length - 6)
                    break
                if case():
                    print "  Skip unknown %X subchunk" %(header.chunk_id)
            self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
            bytes = self.updateBytesToRead(bytes, header.chunk_length)

    def readMaterialChunk(self, bytes):
        header = Chunks.ChunkHeader()
        material = Chunks.MaterialChunk()
        material.textures = []
        while bytes > 0:
            self.readChunkHeader(header)
            for case in switch(header.chunk_id):
                if case(_3DS.MATERIAL_NAME):
                    material.name = self.readName()
                    print "   Name: %s" %(material.name)
                    break
                if case(_3DS.AMBIENT_COLOR):
                    os.write(1,"   Ambient color: ")
                    material.ambientColor = self.readColor()
                    break
                if case(_3DS.DIFFUSE_COLOR):
                    os.write(1, "   Diffuse color: ")
                    material.diffuseColor = self.readColor()
                    break
                if case(_3DS.SPECULAR_COLOR):
                    os.write(1, "   Specular color: ")
                    material.specularColor = self.readColor()
                    break
                if case(_3DS.SHININESS_PERCENT):
                    os.write(1, "   Shininess percent: ")
                    material.shininess = self.readPercent()
                    break
                if case(_3DS.SHIN2PCT_PERCENT):
                    os.write(1, "   Shininess sterngth: ")
                    material.shininessSterngth = self.readPercent()
                    break
                if case(_3DS.SHIN3PCT_PERCENT):
                    os.write(1, "   Shininess secoind sterngth: ")
                    material.secondShininessSterength = self.readPercent()
                    break
                if case(_3DS.TRANSPARENCY_PERCENT):
                    os.write(1, "   Transparency percent: ")
                    material.transparency = self.readPercent()
                    break
                if case(_3DS.TRANSP_FALLOF_PERCENT):
                    os.write(1, "   Transparency fallof percent: ")
                    material.transparencyFallof = self.readPercent()
                    break
                if case(_3DS.REFLECTION_BLUR_PERCENT):
                    os.write(1, "   Reflection Blur percent: ")
                    material.reflectionBlur = self.readPercent()
                    break
                if case(_3DS.SELF_ILLUM):
                    print "   Self illuminted"
                    material.isSelfIlluminated = True
                    break
                if case(_3DS.TWO_SIDE):
                    print "   Two-sided lighting"
                    material.twoSided = True
                    break
                if case(_3DS.ADDITIVE):
                    print "   Additive blend"
                    material.aditive = True
                    break
                if case(_3DS.WIREFRAME):
                    print "   Wireframe"
                    material.wireframe = True
                    break
                if case(_3DS.WIRESIZE):
                    material.wireSize = self.file.readFloat()
                    print "   Wire size: %.2f" %(material.wireSize)
                    break
                if case(_3DS.SHADING):
                    material.shadingType = self.file.readShort()
                    print "   Shading: %d" %(material.shadingType)
                    break
                if case(_3DS.TEXTURE_MAP_1):
                    print "   Texture Map 1"
                    os.write(1, "    Percentage: ")
                    material.textureMap1 = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.textureMap1)
                    break
                if case(_3DS.TEXTURE_MAP_2):
                    print "   Texture Map 2"
                    os.write(1, "    Percentage: ")
                    material.textureMap2 = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.textureMap2)
                    break
                if case(_3DS.BUMP_MAP):
                    print "   Bump Map"
                    os.write(1, "    Percentage: ")
                    material.bumpMap = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.bumpMap)
                    break
                if case(_3DS.SPECULAR_MAP):
                    print "   Specular Map"
                    os.write(1, "    Percentage: ")
                    material.specularMap = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.specularMap)
                    break
                if case(_3DS.REFLECTION_MAP):
                    print "   Reflection Map"
                    os.write(1, "    Percentage: ")
                    material.reflectionMap = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.reflectionMap)
                    break
                if case(_3DS.OPACITY_MAP):
                    print "   Opacity Map"
                    os.write(1, "    Percentage: ")
                    material.opacityMap = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.opacityMap)
                    break
                if case(_3DS.SHININESS_MAP):
                    print "   Shininess Map"
                    os.write(1, "    Percentage: ")
                    material.shininessMap = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.shininessMap)
                    break
                if case(_3DS.TEXTURE_1_MASK):
                    print "   Texture 1 mask"
                    material.textureMask1 = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.textureMask1)
                    break
                if case(_3DS.TEXTURE_2_MASK):
                    print "   Texture 2 mask"
                    material.textureMask2 = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.textureMask2)
                    break
                if case(_3DS.OPACITY_MASK):
                    print "   Opacity mask"
                    material.opacityMask = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.opacityMask)
                    break
                if case(_3DS.BUMP_MASK):
                    print "   Bump mask"
                    material.bumpMask = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.bumpMask)
                    break
                if case(_3DS.SHININESS_MASK):
                    print "   Shininess mask"
                    material.shininessMask = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.shininessMask)
                    break
                if case(_3DS.SPECULAR_MASK):
                    print "   Specular mask"
                    material.specularMask = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.specularMask)
                    break
                if case(_3DS.REFLECTION_MASK):
                    print "   Reflection mask"
                    material.reflectionMask = self.readTextureChunk(header.chunk_length - 6)
                    material.textures.append(material.reflectionMask)
                    break
                if case():
                    print "   Skip unknown %X subchunk" %(header.chunk_id)
            self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
            bytes = self.updateBytesToRead(bytes, header.chunk_length)
        self.object.materials.append(material)

    def readMeshChunk(self, bytes):
        mesh = Chunks.MeshChunk()
        mesh.name = self.readName()
        print "   Name: %s" %(mesh.name)
        bytes = bytes - (len(mesh.name) - 1)
        header = Chunks.ChunkHeader()
        while bytes > 0:
            self.readChunkHeader(header)
            for case in switch(header.chunk_id):
                if case(_3DS.MESH_DATA):
                    mesh.type = 1
                    print "   Mesh data"
                    mesh.data = self.readMeshData(header.chunk_length - 6)
                    break
                if case(_3DS.LIGHT):
                    mesh.type = 2
                    print "   Light"
                    mesh.light = self.readLightChunk(header.chunk_length - 6)
                    break
                if case(_3DS.CAMERA):
                    mesh.type = 3
                    print "   Camera"
                    mesh.camera = self.readCameraChunk(header.chunk_length - 6)
                    break
                if case():
                    print "   Skip unknown %X subchunk" %(header.chunk_id)
            self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
            bytes = self.updateBytesToRead(bytes, header.chunk_length)
        self.object.meshes.append(mesh)

    def readTextureChunk(self, bytes):
        texture = Chunks.TextureChunk()
        header = Chunks.ChunkHeader()
        while bytes > 0:
            self.readChunkHeader(header)
            for case in switch(header.chunk_id):
                if case(_3DS.INT_PERCENTAGE):
                    texture.percentage = self.file.readShort()
                    print texture.percentage
                    break
                if case(_3DS.MAPPING_FILENAME):
                    texture.name = self.readName()
                    print "    Filename: %s" %(texture.name)
                    break
                if case(_3DS.MAP_TEXBLUR):
                    texture.blur = self.file.readFloat()
                    print "    Texture blur: %.2f" %(texture.blur)
                    break
                if case(_3DS.MAP_TILING):
                    texture.tiling = self.file.readShort()
                    print "    Texture tiling: %d" %(texture.tiling)
                    break
                if case(_3DS.MAP_ANGLE):
                    texture.rotationAngle = self.file.readFloat()
                    print "    Rotation angle: %.2f" %(texture.rotationAngle)
                    break
                if case(_3DS.MAP_U_SCALE):
                    texture.uScale = self.file.readFloat()
                    print "    U Scale: %.2f" %(texture.uScale)
                    break
                if case(_3DS.MAP_V_SCALE):
                    texture.vScale = self.file.readFloat()
                    print "    V Scale: %.2f" %(texture.vScale)
                    break
                if case(_3DS.MAP_U_OFFSET):
                    texture.uOffset = self.file.readFloat()
                    print "    U Offset: %.2f" %(texture.uOffest)
                    break
                if case(_3DS.MAP_V_OFFSET):
                    texture.vOffset = self.file.readFloat()
                    print "    V Offset: %.2f" %(texture.vOffset)
                    break
                if case(_3DS.MAP_COL1):
                    os.write(1, "    Color 1: ")
                    texture.firstBlendColor = self.readColor()
                    break
                if case(_3DS.MAP_COL2):
                    os.write(1, "    Color 2: ")
                    texture.secondBlendColor = self.readColor()
                    break
                if case(_3DS.MAP_R_COL):
                    os.write(1, "    R_Color: ")
                    texture.redBlendColor = self.readColor()
                    break
                if case(_3DS.MAP_G_COL):
                    os.write(1, "    G_Color: ")
                    texture.greenBlendColor = self.readColor()
                    break
                if case(_3DS.MAP_B_COL):
                    os.write(1, "    B_Color: ")
                    texture.blueBlendColor = self.readColor()
                    break
                if case(_3DS.MAT_BUMP_PERCENT):
                    texture.bumpPercentage = self.file.readShort()
                    print "    Bump percent: %d" %(texture.bumpPercentage)
                    break
                if case():
                    print "   Skip unknown %X subchunk" %(header.chunk_id)
            self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
            bytes = self.updateBytesToRead(bytes, header.chunk_length)
        return texture

    def readMeshData(self, bytes):
        data = Chunks.MeshData()
        header = Chunks.ChunkHeader()
        while bytes > 0:
            self.readChunkHeader(header)
            for case in switch(header.chunk_id):
                if case(_3DS.VERTICES_LIST):
                    data.vertices = []
                    data.nrOfVertices = self.file.readShort()
                    for i in range(0, data.nrOfVertices):
                        data.vertices.append(self.file.readArray(3, 'f'))
                    print "    Number of vertices: %d" %(data.nrOfVertices)
                    break
                if case(_3DS.MAPPING_COORDINATES_LIST):
                    data.nrOfCoordinates = self.file.readShort()
                    data.coordinates = []
                    for i in range(0, data.nrOfCoordinates):
                        data.coordinates.append(self.file.readArray(2, 'f'))
                    print "    Number of map coordinates: %d" %(data.nrOfCoordinates)
                    break
                if case(_3DS.FACES_DESCRIPTION):
                    data.faces = self.readFacesChunk(header.chunk_length - 6)
                    break
                if case(_3DS.LOCAL_COORDINATES_SYSTEM):
                    print "    Mesh Matrix: "
                    data.matrix = self.file.readArray(12, 'f')
                    for i in range(0, 4):
                        print "     %.2f %.2f %.2f" %(data.matrix[i*3], data.matrix[i*3+1], data.matrix[i*3+2])
                    break
                if case(_3DS.MESH_COLOR):
                    data.color = self.file.readByte()
                    print "    Mesh color: %d" %(data.color)
                    break
                if case(_3DS.MESH_TEXTURE_INFO):
                    data.textureInfo = Chunks.TextureInfoChunk()
                    data.textureInfo.mapType = self.file.readShort()
                    data.textureInfo.tiling = self.file.readFloat()
                    data.textureInfo.icon = self.file.readFloat()
                    data.textureInfo.matrix = self.file.readArray(12, 'f')
                    data.textureInfo.planIconW = self.file.readFloat()
                    data.textureInfo.planIconH = self.file.readFloat()
                    data.textureInfo.cylIconH = self.file.readFloat()
                    print "    Mesh Texture info"
                    break
                if case(_3DS.BOX_MAP):
                    print "    Box Map"
                    data.mapMaterials = []
                    for i in range(0, 6):
                        data.mapMaterials.append(self.readName())
                        print "     %s" %(data.mapMaterials[i])
                    break
                if case():
                    print "    Skip unknown %X subchunk" %(header.chunk_id)
            self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
            bytes = self.updateBytesToRead(bytes, header.chunk_length)
        return data

    def readFacesChunk(self, bytes):
        faces = Chunks.FacesChunk()
        faces.nrOfFaces = self.file.readShort()
        faces.flags = []
        faces.faces = []
        faces.materialGroups = []
        for i in range(0, faces.nrOfFaces):
            faces.faces.append(self.file.readArray(3, 'H'))
            faces.flags.append(self.file.readShort())
        print "    Number of faces: %d" %(faces.nrOfFaces)
        bytes = bytes - faces.nrOfFaces*8 + 2
        header = Chunks.ChunkHeader()
        while bytes > 0:
            self.readChunkHeader(header)
            for case in switch(header.chunk_id):
                if case(_3DS.MESH_MATERIAL_GROUP):
                    group = Chunks.MaterialGroupChunk()
                    group.materialName = self.readName()
                    group.nrOfFaces = self.file.readShort()
                    group.faces = self.file.readArray(group.nrOfFaces, 'H')
                    print "    Mesh Group"
                    print "     Material name: %s" %(group.materialName)
                    print "     Number of faces: %d" %(group.nrOfFaces)
                    faces.materialGroups.append(group)
                    break
                if case(_3DS.SMOOTHING_GROUP_LIST):
                    faces.smoothingList = self.file.readArray(faces.nrOfFaces, 'l')
                    print "    Face Smoothing Group"
                    break
                if case():
                    print "    Skip unknown %X subchunk" %(header.chunk_id)
            self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
            bytes = self.updateBytesToRead(bytes, header.chunk_length)
        return faces

    def readLightChunk(self, bytes):
        pass

    def readCameraChunk(self, bytes):
        pass

    def readKeyFrameChunk(self, bytes):
        pass

    def readName(self):
        name = ""
        while True:
            c = self.file.readChar()
            if c == '\0':
                break
            else:
                name = name + c
        return name

    def readColor(self):
        header = Chunks.ChunkHeader()
        self.readChunkHeader(header)
        for case in switch(header.chunk_id):
            if case(_3DS.COLOR_24) or case(_3DS.LIN_COLOR_24):
                color = self.file.readArray(3, 'B')
                print color
                break
            if case():
                print "    Skip unknown %X subchunk" %(header.chunk_id)
        self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
        return color

    def readFloatColor(self):
        color = []
        header = Chunks.ChunkHeader()
        self.readChunkHeader(header)
        for case in switch(header.chunk_id):
            if case(_3DS.LIN_COLOR_F) or case(_3DS.COLOR_F):
                color = self.file.readArray(3, 'f')
                print color
                break
            if case():
                print "    Skip unknown %X subchunk" %(header.chunk_id)
        self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
        return color

    def readPercent(self):
        percent = 0
        header = Chunks.ChunkHeader()
        self.readChunkHeader(header)
        for case in switch(header.chunk_id):
            if case(_3DS.INT_PERCENTAGE):
                percent = self.file.readShort()
                print percent
                break
            if case():
                print "    Skip unknown %X subchunk" %(header.chunk_id)
        self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
        return percent
         
    def readFloatColor(self):
        percent = 0
        header = Chunks.ChunkHeader()
        self.readChunkHeader(header)
        for case in switch(header.chunk_id):
            if case(_3DS.FLOAT_PERCENTAGE):
                percent = self.file.readFloat()
                print percent
                break
            if case():
                print "    Skip unknown %X subchunk" %(header.chunk_id)
        self.file.seek(header.start_position + header.chunk_length, os.SEEK_SET)
        return percent

    def updateBytesToRead(self, bytes, length):
        if length == 0:
            return 0
        bytes = bytes - length
        if bytes < 0:
            self.file.seek(bytes, os.SEEK_CUR)
            return 0
        return bytes