def __init__(self, PERMISSIVE=1, get_header=0, LayoutDatabase=False):
     self._PERMISSIVE = PERMISSIVE
     #If LayoutDatabase, I'll load the classes about database. Otherwise, I'll not load them.
     self._pdbFileLayout = PDBFileLayout()
     self._dicResidue = {} 
     self._dicSeqRes = {}
             
     #self._structure_builder=StructureBuilder()
     self._structure_builder = FcfrpStructureBuilder()        
class FcfrpPDBParser():
    
    def __init__(self, PERMISSIVE=1, get_header=0, LayoutDatabase=False):
        self._PERMISSIVE = PERMISSIVE
        #If LayoutDatabase, I'll load the classes about database. Otherwise, I'll not load them.
        self._pdbFileLayout = PDBFileLayout()
        self._dicResidue = {} 
        self._dicSeqRes = {}
                
        #self._structure_builder=StructureBuilder()
        self._structure_builder = FcfrpStructureBuilder()        
        
    
    def _loadAtomsfromFile(self, id, dicAtom):
        i_a = 0 #atom index
        #Create reference variables
        reference_chain = None
        reference_residue = None
        reference_resName = None
        reference_model = None
        inserted_model0 = False
        while i_a < dicAtom.__len__():
            resname = dicAtom[i_a].getResName()
            resseq = dicAtom[i_a].getResSeq()
            icode = dicAtom[i_a].getIcode()
            residueId = ("", resseq, icode)    
            #Model
            if reference_model != dicAtom[i_a].getModel() or dicAtom[i_a].getModel() == None:
                if dicAtom[i_a].getModel() == None: #Cristalografy
                    reference_model = 0
                    if inserted_model0 == False: 
                        self._structure_builder.init_model(reference_model)
                    inserted_model0 = True    
                else:    
                    reference_model = dicAtom[i_a].getModel()
                    self._structure_builder.init_model(reference_model)
                    reference_chain = None
                    reference_residue = None
                    reference_resName = None
            #Segid
            self._structure_builder.init_seg("")
            #Chain and Residue
            if reference_chain != dicAtom[i_a].getChainId():
                reference_chain = dicAtom[i_a].getChainId()
                self._structure_builder.init_chain(reference_chain)
                #Because changed chain, it's necessary start a new residue in structure
                reference_residue = residueId
                reference_resName = resname
                self._structure_builder.init_residue(resname, "", resseq, icode)
            elif reference_resName != resname or reference_residue != residueId:
                reference_resName = resname
                reference_residue = residueId
                self._structure_builder.init_residue(resname, "", resseq, icode)
            #Atom    
            self._structure_builder.init_atom(dicAtom[i_a].get_id(), dicAtom[i_a].get_coord(), dicAtom[i_a].get_bfactor(), dicAtom[i_a].get_occupancy() , dicAtom[i_a].get_altloc(), dicAtom[i_a].get_fullname(), dicAtom[i_a].get_serial_number())
            i_a = i_a + 1
        
    def _loadSeqResfromFile(self, id):
        self._structure_builder.init_SeqRes(id)
        self._structure_builder.structure.add_SeqRes(self._pdbFileLayout.getSeqRes(), self._pdbFileLayout.getRes())
        
    def _loadSSBondsfromfile(self,id):
        self._structure_builder.init_SSBonds(id)
        self._structure_builder.structure.add_SSBonds(self._pdbFileLayout.getSSBonds())

    def _loadErrorsfromFile(self, id, structure, pathfileName, chainId ):
        self._structure_builder.init_ErrorStructure(id)
        errors, vs = hasErrorFileStructure(structure,pathfileName , chainId)
        if len(errors) > 0:
            standard = FcfrpStandardizationPDBErrorDetails()
            self._pdbFileLayout.setStructureErrors(errors, vs, standard)
            self._structure_builder.structure.add_StructureErrors(self._pdbFileLayout.getStructureErrors()) 

    def loadStructureFromFile(self, id, pathfileName, chainId=None):
        dir, fileName = os.path.split(pathfileName)
        filePDB = FcfrpFile(dir, fileName)
        #Define Model value
        currentModel = None
        #Start the Structure
        self._structure_builder.init_structure(id)
        #Here the PDB file will read and separate in dictionaries. 
        for line in filePDB.readLines():
            record = line.split()
            if record[0] == "SEQRES":
                if self.checkChain(record[2], chainId) == True:
                    self._pdbFileLayout.setRes(record)
                    self._pdbFileLayout.setSeqRes(record)
            elif record[0] == "SSBOND":
                if self.checkChain(line[15:16], chainId) == True:
                    self._pdbFileLayout.setSSBonds(line)
            elif record[0] == "MODEL":
                #The MODEL line is MODEL        1                                                                  
                # So, when split command is used, the result'll be ['MODEL', '1']
                #Therefore, the currentModel represents the Model. If there isn't model, its value'll be always zero.
                currentModel = int(record[1]) 
            elif record[0] == "ATOM":
                if self.checkChain(line[21:22], chainId) == True:
                    self._pdbFileLayout.setAtom(currentModel,line)
        #Here the dictionaries have been created by for command above, they will be used in specific methods. These methods
        # represent each PDB file section.
        self._loadSeqResfromFile(id)
        self._loadSSBondsfromfile(id)
        self._loadAtomsfromFile(id, self._pdbFileLayout.getAtoms())
        structure = self._structure_builder.get_structure()
        
        self._loadErrorsfromFile(id, structure, pathfileName, chainId)
        #print "Comentado checagem de erro qdo arquvivo PDB"
        
        return structure
    
    def checkChain(self, chainIdFile, chainIdSelected):
        cont = False
        if chainIdSelected == None:
            cont = True
        elif chainIdFile == chainIdSelected:
            cont = True
        else:
            cont = False
        return cont