1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from re import split
24
27 """Class containing functions for handelling peak intensities."""
28
29 self.relax = relax
30
31
33 """Function for returning relevant data from the peak intensity line.
34
35 The residue number, heteronucleus and proton names, and peak intensity will be returned.
36 """
37
38
39 if self.format == 'sparky':
40
41 assignment = split('([A-Z]+)', line[0])
42 assignment = assignment[1:-1]
43
44
45 try:
46 res_num = int(assignment[1])
47 except:
48 raise RelaxError, "Improperly formatted Sparky file."
49
50
51 x_name = assignment[2]
52 h_name = assignment[4]
53
54
55 intensity = line[self.int_col]
56
57
58 elif self.format == 'xeasy':
59
60 if line[4] == 'inv.':
61 return None, None, None, 0.0
62
63
64 try:
65 res_num = int(line[5])
66 except:
67 raise RelaxError, "Improperly formatted XEasy file."
68
69
70 x_name = line[7]
71 h_name = line[4]
72
73
74 intensity = line[self.int_col]
75
76
77 try:
78 intensity = float(intensity)
79 except ValueError:
80 raise RelaxError, "The peak height value " + `intensity` + " from the line " + `line` + " is invalid."
81
82 return res_num, x_name, h_name, intensity
83
84
85 - def read(self, run=None, file=None, dir=None, format=None, heteronuc=None, proton=None, int_col=None, assign_func=None):
86 """Function for reading peak intensity data."""
87
88
89 self.run = run
90 self.format = format
91 self.heteronuc = heteronuc
92 self.proton = proton
93 self.int_col = int_col
94 self.assign_func = assign_func
95
96
97 format_list = ['sparky', 'xeasy']
98 if self.format not in format_list:
99 raise RelaxArgNotInListError, ('format', self.format, format_list)
100 if self.format == 'sparky':
101 print "Sparky formatted data file.\n"
102 elif self.format == 'xeasy':
103 print "XEasy formatted data file.\n"
104
105
106 if not self.run in self.relax.data.run_names:
107 raise RelaxNoRunError, self.run
108
109
110 if not self.relax.data.res.has_key(self.run):
111 raise RelaxNoSequenceError, self.run
112
113
114 file_data = self.relax.IO.extract_data(file, dir)
115
116
117 file_data = file_data[2:]
118
119
120 file_data = self.relax.IO.strip(file_data)
121
122
123 if self.format == 'sparky':
124 if int_col:
125 self.int_col = int_col
126 else:
127 self.int_col = 3
128 elif self.format == 'xeasy':
129 self.int_col = 10
130
131
132 for i in xrange(len(file_data)):
133
134 res_num, X_name, H_name, intensity = self.extract_int_data(file_data[i])
135
136
137 if X_name != self.heteronuc or H_name != self.proton:
138 print "Skipping the data: " + `file_data[i]`
139 continue
140
141
142 index = None
143 for j in xrange(len(self.relax.data.res[self.run])):
144 if self.relax.data.res[self.run][j].num == res_num:
145 index = j
146 break
147 if index == None:
148 print "Skipping the data: " + `file_data[i]`
149 continue
150
151
152 data = self.relax.data.res[self.run][index]
153
154
155 if not data.select:
156 continue
157
158
159 self.assign_func(run=self.run, i=index, intensity=intensity)
160