#!/usr/bin/env python

# ** What is this code? **
#
# This is an example script for using new biopython modules for
# generating NOE crosspeak peaklists from diagonal peaklist within
# the framework of nmrview.  
# nmrview is not required to run this script, only an installed 
# version of python.


# ** What's important? **
#
# The xpktools.py and NOEtools.py modules are what I'm trying to
# demonstrate.  They provide methods and a data class for performing
# some general analysis on NMR data taken directly from peaklist.
# The code in this script will demonstrate how they are used.


# ** Who wrote this code? **
# Robert Bussell, Jr.
# rgb2003@med.cornell.edu


# ** Running this script **
#
# To run this script on a UNIX/Linux system, make it executable and
# modify the first line of this script to point to python if necessary.
# First try running the code with the peaklist that I provide to get
# the feel of how things work, then you can use your own peaklist if you
# modify the variables under the "INITS" code block to make it work
# with your data.  The modules xpktools and NOEtools can be called from
# your own scripts when you have them in place on your computer.
# NOTE: It is very important to have an intact peaklist.  If you copy and
# paste mine into a file be prepared to remove inappropriate line breaks.


# ** Output of this script **
# 
# This script generates a human readable standard output version of the
# NOE coordinates as well as an nmrview peaklist out_example.xpk.






# ***********************************************************************

# ***** LOAD MODULES *****
import getopt
import string
import sys

# -- don't need to modify sys.path with the *tools in Biopython
# -- just need Biopython installed somewhere in the PYTHONPATH
#sys.path=[sys.path,"./"]
#sys.path=[sys.path,"/usr/people/robert/development/xpktools"]
from Bio.NMR import xpktools	# Contains data classes and functions for .xpk files
from Bio.NMR import NOEtools	# A module specific for generate NOE predictions 

# * * * * * * * * * * MAIN * * * * * * * * * *

# ***** INITS *****

inc=1		# The NOE increment (n where i->i+n and i->i-n are noes)
infn="./noed.xpk"		# Input peaklist
outfn="./out_example.xpk"	# Output peaklist
detectatom="H1"			# Directly detected atom
relayatom="N15"			# J-coupling from here to detected atom
fromatom="15N2"			# The other labelled nucleus 




# *-*-*  First the peaklist is read into a data class from xpktools
# *-*-*  that contains methods for easily extracting information from
# *-*-*  the peaklist file

peaklist=xpktools.Peaklist(infn)	# infn is the name of the xpk file 




# *-*-* The class attribute residue_dict allows the data lines
# *-*-* to be separated from the header and returned here to
# *-*-* the dictionary <dict> as a list indexed by the assignment
# *-*-* of any of the nuclei in the file -- here, the detected atom
# *-*-* is used 

dict=peaklist.residue_dict(detectatom)




# *-*-* As well as the data, the dictionary contains two other entries,
# *-*-* corresponding to the maximum and minimum residues indexed 

MAXRES=dict["maxres"]
MINRES=dict["minres"]



#****** CALCULATE AND WRITE CROSSPEAK PEAKLIST *****



# *-*-* The peaklist class has a method for writing out the header
# *-*-* information in a format recognizable by nmrview

peaklist.write_header(outfn) # Write the header to the output file



# *-*-* Predict the i->i+inc and i->i-inc noe positions if possible
# *-*-* Write each one to the output file as they are calculated

count=0		# A counter that number the output data lines in order
res=MINRES	# minimum residue number in the set 
outlist=[]	# Holds the output data


while (res<=MAXRES):



# *-*-* Predicting the NOE positions based on peak assignment data
# *-*-* is done by supplying the peaklist to and specifying the label
# *-*-* of the origin and detected atom in the NOE transfer as well as
# *-*-* the residues between which the NOE transfer takes places.
 
  noe1=NOEtools.predictNOE(peaklist,"15N2","H1",res,res+inc)
  noe2=NOEtools.predictNOE(peaklist,"15N2","H1",res,res-inc)



# *-*-* The output of predictNOE is in the form of an xpk entry line
# *-*-* suitable for printing to an output file
# *-*-* Additionally, it is possible to extract information easily from
# *-*-* these output lines by using the xpktools.XpkEntry class

  entry1=xpktools.XpkEntry(noe1,peaklist.datalabels)

  if noe1!="":

  # *-*-* Here I'm using the XpkEntry class to gain access to
  # *-*-* specific fields in the that make the information
  # *-*-* more readable and suitable for creating data tables
  # *-*-* This output will be printed to the screen.
  # *-*-* The data table contains the assignment, coordinates and
  # *-*-* intensity of the resonance.

    print string.split(entry1.fields["15N2.L"],".")[0], "-->", string.split(entry1.fields["N15.L"],".")[0], "\t", entry1.fields["H1.P"], entry1.fields["N15.P"], entry1.fields["15N2.P"],entry1.fields["int"]


    noe1=noe1+"\012"
    noe1=xpktools.replace_entry(noe1,1,count)
    outlist.append(noe1); count=count+1

    if noe2!="":
      noe2=noe2+"\012"
      noe2=xpktools.replace_entry(noe2,1,count)
      outlist.append(noe2); count=count+1
  res=res+1

# Open the output file and write the data
outfile=open(outfn,'a')
outfile.writelines(outlist) 	# Write the output lines to the file
outfile.close()
