[Tutor] map one file and print it out following the sequence

Dave Angel d at davea.name
Wed Oct 12 16:55:10 CEST 2011


On 10/12/2011 09:57 AM, lina wrote:
>
> I do have problems to write each blocks (differentiated by chainID)  back
> one by one, but this will leave it at the end. at present I still have
> following problems
> Q1: why the D E F G H I stopped being processed.
>
In what sense do you mean stopped?  There are no records in pdbone.pdb 
that have column 4 equal to any of the remaining CID values, D, E, F, etc.

So they don't print anything.  You can see that 3 of them matched cID of "C"

>>     for line in temp: print(line[1])
> Thanks.
>
> $ python3 map-to-itp.py
> {'O4': '2', 'C19': '3', 'C21': '1'}
> C
> ATOM    832  C21 CUR C  85      32.823  27.366   0.801  1.00
> 0.00
> ATOM    831  O4  CUR C  85      31.865  28.248   0.183  1.00
> 0.00
> ATOM    827  C19 CUR C  85      31.891  29.624   0.280  1.00
> 0.00
>
> D
> E
> F
> G
> H
> I
>
>
>
>
> #!/usr/bin/python3
>
> import os.path
>
> LINESTOSKIP=0
> CHAINID="CDEFGHI"
> INFILENAME="pdbone.pdb"
> DICTIONARYFILE="itpone.itp"
> mapping={}
> valuefromdict={}
>
> def sortfile():
>      for chainid in CHAINID:
>          print(chainid)
>          sortoneblock(chainid)
>
>
>
> def sortoneblock(cID):
>      text=fetchonefiledata(INFILENAME) ## Q2: How to avoid read this file
> every time. actually it only need read once.
Simple.  Move this line into sortfile (before the for loop), and pass 
text as an argument when it calls sortoneblock(cID, text)
Naturally, you'd then add the parameter to sortoneblock(cID, text).  
Once you try to create the output file, you'll also be adding the open() 
call for that into sortfile(), and passing its file object into 
sortoneblock(cID, text, outfile)
>      temp = []
>      for line in text:
>          blocks=line.strip().split()
>          if len(blocks)== 11 and  blocks[3] == "CUR" and blocks[4] == cID and
> blocks[2] in mapping.keys():
>              temp.append((mapping[blocks[2]],line))
>      temp.sort()
>      for line in temp:
>          print(line[1].strip())
>
>
> def generatedictionary(dictfilename):
>      text=fetchonefiledata(DICTIONARYFILE)
>      for line in text:
>          parts=line.strip().split()
>          if len(parts)==8:
>              mapping[parts[4]]=parts[0]
>      print(mapping)
>
>
>
> def fetchonefiledata(infilename):
>      text=open(infilename).readlines()
>      if os.path.splitext(infilename)[1]==".itp":
>          return text
>      if os.path.splitext(infilename)[1]==".pdb":
>          return text[LINESTOSKIP:]
>
>
> if __name__=="__main__":
>      generatedictionary(DICTIONARYFILE)
>      sortfile()
>
>   Thanks.
>
>
I think your final version of sortfile() might look something like:

def sortfile(infilename=INFILENAME, outfilename=OUTFILENAME):
     infile = open(infilename, "r")
     intext = infile.readlines()
     outfile = open(OUTFILENAME, "w")
     for chainid in CHAINID:
         print("chain id = ",chainid)
          sortoneblock(chainid, intext, outfile)
     infile.close()
     outfile.close()


--

DaveA



More information about the Tutor mailing list