ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/pymsxml/PyMsXML.html
Revision: 1.8
Committed: Wed Jul 25 14:14:16 2007 UTC (9 years ago) by nje01
Branch: MAIN
CVS Tags: HEAD
Changes since 1.7: +13 -4 lines
Log Message:
*** empty log message ***

Line File contents
1 <html>
2
3 <head>
4 <title>PyMsXML: Research: Nathan Edwards</title>
5 <link rel="stylesheet" type="text/css" href="../templates/global.css">
6 </head>
7
8 <body bgcolor="#ffffff" marginwidth=0 marginheight=0 leftmargin=0 rightmargin=0 topmargin=0 bottommargin=0>
9
10 <table border=0 cellspacing=0 cellpadding=0 bgcolor="#C62931" width="100%">
11 <tr>
12 <td rowspan=3 width="120"><a href="http://www.umd.edu"><img src="../images/informal1.gif" alt="University of Maryland" border=0 height=108 width=108></a></td>
13 <td height=50 valign="bottom" align="left"><a href=".."><font color="#ffffff" size=+2><u>Nathan Edwards</u></font></a></td>
14 </tr>
15 <tr>
16 <td height=1 valign="top" align="left"><a href="http://www.cbcb.umd.edu/"><font size=+0 color="#ffffff"><b>Center for Bioinformatics and Computational Biology</b></a></font></td>
17 </tr>
18 <tr valign="bottom">
19 <td align="left" colspan=3><table border=0 cellspacing=0 cellpadding=0 width="100%">
20 <tr>
21 <td align="right" class="tabs">
22
23 <table border=0 cellspacing=0 cellpadding=0>
24 <tr>
25
26 <td><img src="../images/tab_left_off.gif"></td><td background="../images/tab_background_off.gif" nowrap><a class="tabs" href="..">Home</a></td>
27 <td><img src="../images/tab_middle_right.gif"></td>
28 <td background="../images/tab_background_on.gif" nowrap><a class="tabs" href="../research">Research</a></td><td><img src="../images/tab_middle_left.gif"></td>
29 <td background="../images/tab_background_off.gif" nowrap><a class="tabs" href="../teaching">Teaching</a></td><td><img src="../images/tab_middle.gif"></td>
30 <td background="../images/tab_background_off.gif" nowrap><a class="tabs" href="../publications">Publications</a></td><td><img src="../images/tab_right_off.gif"></td> </tr>
31 </table>
32
33 </td>
34 <td width=10><img src="../images/blank.gif" width=10 height=20></td>
35 </tr>
36 </table></td>
37 </tr>
38 </table>
39
40 <table border=0 cellspacing=0 cellpadding=0 bgcolor="#FFC621" width="100%">
41 <tr>
42 <td><img src="../images/blank.gif" width=1 height=4></td>
43 </tr>
44 </table>
45
46 <table border=0 cellspacing=0 cellpadding=0 bgcolor="#FFFFFF" width="100%">
47 <tr>
48 <td bgcolor="#FFC621" width=10><img src="../images/blank.gif" width=10 height=1></td>
49 <td bgcolor="#FFC621" width=100 valign="top" align="center">
50 <img src="../images/blank.gif" height=5 width=100><br>
51
52 <table width="100" border=0 cellspacing=0 cellpadding=0>
53 <tr>
54 <td valign="top"><a class="navlinks" href="../research"><b>Research</b></a></td>
55 </tr>
56 <tr>
57 <td bgcolor="#000000"><img src="../images/blank.gif" width=1 height=1></td>
58 </tr>
59 <tr>
60 <td><img src="../images/blank.gif" width=1 height=2></td>
61 </tr>
62 <tr>
63 <td><img src="images/blank.gif" width=1 height=2></td>
64 </tr>
65 <tr>
66 <td><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td valign="top"><a class="navlinks" href="index.html#proteomics">Proteomics</a></td></tr></table></td>
67 </tr>
68 <tr>
69 <td><img src="images/blank.gif" width=1 height=2></td>
70 </tr>
71 <tr>
72 <td><img src="images/blank.gif" width=1 height=2></td>
73 </tr>
74 <tr>
75 <td><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td valign="top"><a class="navlinks" href="index.html#tools">Tools</a></td></tr></table></td>
76 </tr>
77 <tr>
78 <td><img src="images/blank.gif" width=1 height=2></td>
79 </tr>
80 <tr>
81 <td><img src="images/blank.gif" width=1 height=2></td>
82 </tr>
83 <tr>
84 <td><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td valign="top"><a class="navlinks" href="index.html#data">Data</a></td></tr></table></td>
85 </tr>
86 <tr>
87 <td><img src="images/blank.gif" width=1 height=2></td>
88 </tr>
89 <tr>
90 <td><img src="images/blank.gif" width=1 height=2></td>
91 </tr>
92 <tr>
93 <td><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td valign="top"><a class="navlinks" href="index.html#statements">Research Statements</a></td></tr></table></td>
94 </tr>
95 <tr>
96 <td><img src="images/blank.gif" width=1 height=2></td>
97 </tr>
98
99 <!--
100 <tr>
101 <td><img src="../images/blank.gif" width=1 height=10></td>
102 </tr>
103 <tr>
104 <td valign="top"><a class="navlinks" href="/help/search/">Search</a></td>
105 </tr>
106 <tr>
107 <td valign="top">
108 -- Search Google --
109 <FORM method=GET action=http://www.google.com/u/serine>
110 <INPUT TYPE=text name=q size=14 maxlength=255 value="" class="leftbar" style="width: 100px">
111 <INPUT type=hidden name=sa VALUE="Google Search">
112 <input type=hidden name=domains value="serine.umiacs.umd.edu">
113 <input type=hidden name=sitesearch value="serine.umiacs.umd.edu">
114 </FORM>
115 -- Search Google --
116 </td>
117 </tr>
118 -->
119 </table>
120
121
122 </td>
123 <td bgcolor="#FFC621" width=10><img src="../images/blank.gif" width=10 height=1></td>
124 <td bgcolor="#FFFFFF" width=10 valign="top" background="../images/left_shadow.gif"><table border=0 cellspacing=0 cellpadding=0 background="../images/left_shadow.gif" width="10">
125 <tr>
126 <td valign="top"><img src="../images/corner_corner.gif" width=10 height=10><br><img src="../images/corner_bottom.gif" width=10 height=13><br><img src="../images/left_shadow.gif" width=10 height=400></td>
127 </tr>
128 </table></td>
129 <td valign="top"><table border=0 cellspacing=0 cellpadding=0 width="100%">
130 <tr>
131 <td bgcolor="#FFFFFF" valign="top" colspan=2><table border=0 cellspacing=0 cellpadding=0 background="../images/top_shadow.gif" width="100%">
132 <tr>
133 <td align="left"><img src="../images/corner_right.gif" width=10 height=10></td>
134 </tr>
135 </table></td>
136 </tr>
137 <tr>
138 <td bgcolor="#FFFFFF" valign="top">
139
140 <div align="right" class="breadcrumbs">
141
142 <a class="breadcrumbs" href="..">Home</a> &raquo; <a class="breadcrumbs" href="../research">Research</a> &raquo; <a class="breadcrumbs" href="../research/PyMsXML.html">PyMsXML</a>
143 </div>
144
145 <table border=0 cellspacing=0 cellpadding=0 align="left">
146 <tr>
147 <td><font size=5>PyMsXML</font></td>
148 </tr>
149 <tr>
150 <td bgcolor="#C62931"><img src="../images/blank.gif" height=1 width=1></td>
151 </tr>
152 <tr>
153 <td><img src="../images/blank.gif" height=10 width=1></td>
154 </tr>
155 </table>
156
157 <br clear=all>
158
159 <!-- CONTENT STARTS HERE -->
160
161 <h3>Introduction</h3>
162 <P>
163 <b>PyMsXML</b> is a python script for converting vendor specific mass
164 spectrometry data files for Applied Biosystems' Q-Star, 4700, Mariner,
165 and Voyager mass spectrometers from their raw binary form, to either
166 of the emerging XML file formats for mass spectra: mzXML, from the
167 Sashimi Glossolalia project of the Institute for Systems Biology (ISB);
168 and mzData, from the Proteome Standardization Initiative (PSI) project
169 of the Human Proteome Organization (HUPO).
170 <P>
171 <b>PyMsXML</b> uses installed vendor software under Windows to access the
172 proprietary raw mass spectra file format, interfacing to the vendor
173 supplied libraries via the supplied COM interface. Unlike other
174 software solutions that use this approach, <b>PyMsXML</b> is written in a
175 free, open-source language called Python. As such, no installation of
176 Microsoft Visual C++ or Visual Basic is necessary to use, alter, or
177 improve the <b>PyMsXML</b> script.
178 <P>
179 <b>PyMsXML</b> is easily extended for new instruments and vendor software,
180 and for new, or changed, XML file formats. The code that interfaces to
181 the vendor software is decomposed from the code that formats the data
182 as XML, as such, the addition of new instrument capability need not
183 re-write the XML data format code. Similarly, as new XML file formats
184 emerge, the code that interfaces with the instrument software need not
185 change.
186 <P>
187 <b>PyMsXML</b> is hosted at <a href="http://bioinformatics.org/project/?group_id=701">bioinformatics.org</a>.
188 <P>
189 <quote>
190 <b>NOTE!</b>
191 <P>
192 The vendor software (Analyst for .wiff
193 files, Data Explorer for .t2d files) be installed on the same computer
194 as <b>PyMsXML</b>. These binary formats cannot be read without the
195 vendor support libraries.
196 </quote>
197 <P>
198 <h3>Installation</h3>
199 <P>
200 <ol>
201 <li> Download and install the latest version of <A href="http://www.activestate.com/Products/ActivePython/">ActiveState ActivePython</A> for Windows.
202 <P>
203 <li> Start the Pythonwin IDE (All Programs -> ActiveState ActivePython
204 2.4 -> Pythonwin IDE). From the Tools menu, select the "COM Makepy
205 utility" entry. In the popup window, select "ExploreDataObjects 1.0
206 Type Library (1.0)" to build a python interface to Analyst's COM
207 libraries for reading .wiff files, select "IDAExplorer 1.0 Type
208 Library (1.0)" to build a python interface to Data Explorer's COM
209 libraries for reading ".dat" and ".t2d" files. If you have both pieces
210 of software, repeat this step for each software package. Click OK.
211 <P>
212 <li> Check the installation of COM library interfaces. If any of these
213 tests are unsuccessful, then <b>PyMsXML</b> will be unable to read the
214 corresponding raw datafiles.
215 <P>
216 For Analyst, these commands at the Pythonwin IDE command-line
217 (copy-and-paste!) should elicit similar responses:<br>
218 <code>
219 >>> from win32com.client import Dispatch<br>
220 >>> Dispatch('Analyst.FMANSpecData')<br>
221 &lt;win32com.gen_py.ExploreDataObjects 1.0 Type Library.IFMANSpecData instance at 0x14421558> <br>
222 >>> Dispatch('Analyst.FMANChromData')<br>
223 &lt;win32com.gen_py.ExploreDataObjects 1.0 Type Library.IFMANChromData instance at 0x14418408>
224 </code>
225 <P>
226 For Data Explorer, these commands at the Pythonwin IDE command-line (copy-and-paste!) should elicit similar responses:<br>
227 <code>
228 >>> from win32com.client import Dispatch, gencache<br>
229 >>> Dispatch('DataExplorer.Application',resultCLSID='{3FED40F1-D409-11D1-8B56-0060971CB54B}')<br>
230 &lt;COMObject DataExplorer.Application><br>
231 >>> gencache.EnsureModule('{06972F50-13F6-11D3-A5CB-0060971CB54B}',0,4,2)<br>
232 &lt;module 'win32com.gen_py.06972F50-13F6-11D3-A5CB-0060971CB54Bx0x4x2' from 'C:\Python24\lib\site-packages\win32com\gen_py \06972F50-13F6-11D3-A5CB-0060971CB54Bx0x4x2.py'>
233 </code>
234 <P>
235 <li> Download and unpack the <b>PyMsXML</b> scripts and examples. <A
236 href="http://bioinformatics.org/project/filelist.php?group_id=701">Download
237 <b>PyMsXML</b></A>. After unzipping <b>PyMsXML</b>, edit the file pymsxml.cmd to
238 point to your Python installation (usually C:\Python24\python.exe)
239 and your <b>PyMsXML</b> installation.
240 </ol>
241 <P>
242 <h3>Usage</h3>
243 <P>
244 <b>PyMsXML</b> consists of a single python script. A windows cmd file wrapper is provided, to take care of calling the python interpretor appropriately.
245 <dl>
246 <dt><b>pymsxml</b> [ options ] <i>raw-spectra-data-file</i></dt>
247 <P>
248 <dt>
249 Options:<P>
250 </dt>
251 <dd>
252 <dl>
253 <dt>-R <i>raw-format</i>, --rawdata <i>raw-format</i></dt>
254 <dd>Valid <i>raw-format</i> values: <tt>wiff</tt>, <tt>qstar</tt>, <tt>t2d</tt>, <tt>ab4700</tt>, <tt>voyager</tt>, <tt>mariner</tt>, <tt>mzXML</tt>. Optional if <i>raw-spectra-data-file</i> ends in <tt>.wiff</tt>, <tt>.t2m</tt>, or <tt>.mzXML</tt>.
255 <P>
256 <dt>-X <i>xml-format</i>, --xmlformat <i>xml-format</i></dt>
257 <dd>Valid <i>xml-format</i> values: <tt>mzXML</tt> (ISB), <tt>mzData</tt> (HUPO). Optional if <i>output-file</i> ends in <tt>.mzXML</tt> or <tt>.mzData</TT>.
258 <P>
259 <dt>-o <i>output-file</i>, --output <i>output-file</i></dt>
260 <dd>Name of output file. If omitted, and <i>xml-format</i> is supplied, then the output file is inferred by changing the file extention of <i>raw-spectra-data-file</i> to <i>xml-format</i>.
261 <P>
262 <dt>-p <i>ms-levels</i>, --peaks <i>ms-levels</i></dt>
263 <dd> Apply (vendor library) peak detetion to spectra with level in <i>ms-levels</i> (comma separated). QStar (MS/MS spectra only) raw format, 4700 raw format only. Default: 2.
264 <P>
265 <dt>-f <i>filter-spec</i>, --filter <i>filter-spec</i></dt> <dd>
266 Filter output scans by their meta-data. Filters are specified as a
267 comma-separated list of filter tokens. Each filter token is specified
268 as <i>field</i>.<i>comparison</i>.<i>value</i>. <i>field</i> must be
269 an attribute of the scan object. <i>comparison</i> must be one of
270 <tt>eq</tt>, <tt>ne</tt>, <tt>lt</tt>, <tt>le</tt>, <tt>gt</tt>, or
271 <tt>ge</tt>, specifying =, &ne;, &lt;, &le;, &gt;, and &ge;
272 respectively.
273 <P>
274 <dt>-V <i>version</i>, --version <i>version</i></dt><dd>
275 XML version. mzXML only. Valid options
276 <tt>2.1</tt>,<tt>2.2</tt>,<tt>3.0</tt>. Default: <tt>3.0</tt>.
277 <P>
278 <dt>-z, --compress_peaks</dt>
279 <dd>Compress mzXML peak data using zlib. Default: No compression of peak data. Requires mzXML version 3.0.</dd>
280 <P>
281 <dt>-Z <i>compress-format</i>, --compress <i>compress-format</i></dt>
282 <dd> Compress output file. Valid options: <tt>gz</tt>. Default: None, unless output file ends with <tt>.gz</tt>, then <tt>gz</tt>.
283 <P>
284 <dt>-d, --debug</dt>
285 <dd>Debug. Output XML for first 10 spectra only. Truncate spectral data, too. Useful to verify that the output is formatted correctly.</dd>
286 <P>
287 <dt>-h, --help</dt>
288 <dd>Help.</dd>
289 </dl>
290 </dd>
291 </dl>
292 <P>
293 <h3>Applied Biosystems Q-Star Spectra</h3>
294 <P>
295 The raw spectra data files for the ESI spectra from Applied
296 Biosystems' Q-Star instruments are usually extracted as ".wiff"
297 files. These can be opened using Applied Biosystem's Analyst or
298 BioAnalyst programs. <b>PyMsXML</b> uses Analyst's support libraries
299 to extract mass spectra from these files.
300 <P>
301 <P>
302 <h3>Applied Biosystems Mariner, Voyager, 4700 Spectra</h3>
303 <P>
304 The raw spectra data files for the MALDI spectra from Applied
305 Biosystems' Mariner, Voyager and 4700 instruments are usually
306 extracted as ".t2d" or ".dat" files. These can be opened using Applied
307 Biosystem's Data Explorer program. <b>PyMsXML</b> uses Data Explorer's
308 support libraries to extract mass spectra from these files. These file
309 formats store very little meta-data in addition to the mass
310 spectrum. If you do not care whether or not the output data-file
311 contains valid spot, matrix, and plate meta-data; and if your spectra
312 are all contained in one raw datafile, then the datafile can be
313 supplied on the command-line as <i>raw-spectra-data-file</i>. However, if you have many .dat or .t2d files, each corresponding to a MALDI spot, or if you wish to have spot, matrix, or plate meta-data populated into the output file, then see the next set of instructions.
314 <P>
315 Plate, matrix, and spot meta-data must be supplied in
316 a meta-data text file, which is supplied on the command-line as <i>raw-spectra-data-file</i>.
317 The meta-data file is most easily constructed in Excel and saved as
318 tab-separated-values, but it can be formed by hand too, if
319 desired. Each line of the meta-data file specifies a record,
320 describing the MALDI plate, the plates' spots, and the scans acquired
321 from these spots. A short-cut record, that defines the plate and spot
322 naming convention is also provided.
323 <P>
324 The plate definition record consists of the word <tt>PLATE</tt> (case
325 insensitive) in the first column, followed by alternating key-value
326 pairs in subsequent columns. Particular key-value pairs do not need to
327 be specified in any particular order. The following keys must be
328 provided:
329 <tt>plateID</tt>, <tt>spotXCount</tt>, <tt>spotYCount</tt>,
330 <tt>plateManufacturer</tt>, and <tt>plateModel</tt>. The
331 <tt>plateID</tt> value is referenced by the spot and scan definition
332 records. The <tt>spotXCount</tt> is the number of MALDI spots in
333 the horizontal dimension (integer). The <tt>spotYCount</tt> is
334 the number of MALDI spots in the vertical dimension (integer). The
335 <tt>plateManufacturer</tt> and <tt>plateModel</tt> values are inserted verbatim in the output XML.
336 <P>
337 The spot definition record consists of the word <tt>SPOT</tt> (case
338 insensitive) in the first column, followed by alternating key-value
339 pairs in subsequent columns. Particular key-value pairs do not need to
340 be specified in any particular order. The following keys must be
341 provided:
342 <tt>plateID</tt>, <tt>spotID</tt>, <tt>spotXPosition</tt>,
343 <tt>spotYPosition</tt>, and <tt>maldiMatrix</tt>. The
344 <tt>plateID</tt> value must be defined by some plate definition
345 record. The <tt>spotID</tt> is referenced by the scan definition
346 records. The <tt>spotXPosition</tt> is the horizontal position of the
347 spot on the plate (integer). The <tt>spotYPosition</tt> is the
348 vertical position of the spot on the plate (integer). Spot positions
349 can be numbered beginning at 0 or 1. The
350 <tt>maldiMatrix</tt> value is inserted verbatim in the output XML.
351 <P>
352 The scan definition record consists of the word <tt>SCAN</tt> (case
353 insensitive) in the first column, followed by alternating key-value
354 pairs in subsequent columns. Particular key-value pairs do not need to
355 be specified in any particular order. The following keys must be
356 provided:
357 <tt>plateID</tt>, <tt>spotID</tt>, <tt>filename</tt>, and <tt>index</tt>.
358 The
359 <tt>plateID</tt> must be defined by some plate definition record. The
360 <tt>spotID</tt> must be defined by some spot definition record. The
361 <tt>filename</tt> is the name of the ".dat" or ".t2d" file containing
362 the corresponding scan's spectrum. The <tt>index</tt> is the ordinal
363 of the corresponding spectrum in the provided file. Spectra within
364 files should be referenced beginning at 1.
365 <P>
366 To alleviate some of the tedium with specifying the spot definition records, a shortcut plate definition record is provided. The platedef definition record consists of the word <tt>PLATEDEF</tt> (case insensitive) in the first column, followed by alternating key-value
367 pairs in subsequent columns. Particular key-value pairs do not need to
368 be specified in any particular order. The following keys must be
369 provided:
370 <tt>plateID</tt>, <tt>plateManufacturer</tt>, <tt>plateModel</tt>, <tt>spotNaming</tt>, and <tt>maldiMatrix</tt>.
371 The
372 <tt>plateID</tt> value is referenced by the spot and scan definition
373 records. The <tt>plateManufacturer</tt> and <tt>plateModel</tt> are
374 used to identify the properties of the MALDI plate. Currently, only
375 the values <tt>ABI / SCIEX</tt> and <tt>01-192+06-BB</tt> are
376 recognized, but others are easily added on request. The "ABI / SCIEX
377 01-192+06-BB" plate consists of 8 rows of 24 spots (plus 6 calibration
378 spots). The <tt>spotNaming</tt> must be one of <tt>alpha</tt>,
379 <tt>parallel</tt>, or <tt>antiparallel</tt>. At this time, only
380 <tt>alpha</tt> is implemented. The <tt>alpha</tt> spot attribute
381 constructs <tt>spotID</tt> values for all spots on the plate with the
382 row specified by a letter from A to H, and the column specified by a
383 number from 1 to 24. The
384 <tt>maldiMatrix</tt> value is assumed the same for each spot and is
385 inserted verbatim in the output XML.
386 <P>
387 <b>NOTE:</b> The order of scan definition lines is important! MS/MS
388 spectra must appear immediately after the MS spectrum containing their
389 precursors.
390 <P>
391 Example meta-data files are provided in the distribution. <tt>example1.t2m</tt> explicitly defines the MALDI plate, spots and scans. <tt>example2.t2m</tt> is equivalent, but uses the platedef keyword shortcut.
392 <P>
393 <h3>Examples</h3>
394 <P>
395 Convert the Q-Star <tt>example.wiff</tt> file to mzXML format, placing the output in the file <tt>qstar-example.xml</tt>.<P>
396 <code>
397 C:\PyMsXML\example\wiff> pymsxml.cmd -R wiff -X mzXML -o qstar-example.xml example.wiff<br>
398 </code>
399 <P>
400 Convert the Q-Star <tt>example.wiff</tt> file to mzData format, placing the output in the file <tt>example.mzData</tt>.<P>
401 <code>
402 C:\PyMsXML\example\wiff> pymsxml.cmd -X mzData example.wiff<br>
403 </code>
404 <P>
405 Convert the Mariner ESI-CE-MALDI spectra in <tt>example3.dat</tt> to mzXML format, placing the output in the file <tt>example3.mzXML.gz</tt> (automatically gzipped):
406 <code>
407 C:\PyMsXML\example\dat> pymsxml.cmd -R mariner -o example3.mzXML.gz example3.dat<br>
408 </code>
409 <P>
410 Convert the AB4700 spectra listed in <tt>example1.t2m</tt> and <tt>example2.t2m</tt> to mzXML format, placing the output in the files <tt>example1.mzXML</tt> and <tt>example2.mzXML</tt>.<P>
411 <code>
412 C:\PyMsXML\example\t2d> pymsxml.cmd -X mzXML example*.t2m<br>
413 </code>
414 <P>
415 <h3>Release Notes</h3>
416 <P>
417 The Analyst COM libraries seem to have trouble with long pathnames. If you consistently have trouble getting PyMsXML to read ".wiff" files, try moving the files to a shorter directory path.
418 <P>
419 <h3>Credits</h3>
420 <P>
421 Development of <b>PyMsXML</b> was significantly helped by the
422 open-source Visual Basic source code from the MzStar program of the
423 ISB glossolalia project.
424 <P>
425 <!-- CONTENT ENDS HERE -->
426 </td>
427 </tr>
428 </table></td>
429 <td bgcolor="#FFFFFF" width=10 valign="top"><img src="../images/top_shadow.gif" width=10 height=10></td>
430 </tr>
431 <tr>
432 <td bgcolor="#FFC621" width=120 colspan=3><img src="../images/blank.gif" width=10 height=1></td>
433 <td bgcolor="#FFFFFF" width=10 valign="top" background="../images/left_shadow.gif"><table border=0 cellspacing=0 cellpadding=0 background="../images/left_shadow.gif" width="10">
434 <tr>
435 <td valign="top"<img src="../images/left_shadow.gif" width=10 height=50></td>
436 </tr>
437 </table></td>
438 <td bgcolor="#FFFFFF" align="center">
439
440 <font color="#ffffff">
441 .......... .......... .......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
442 .......... .......... .......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
443 .......... .......... .......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
444 <p>
445
446 <table border=0 cellspacing=0 cellpadding=0>
447 <tr>
448 <td><img src="../images/blank.gif" width=25 height=1></td>
449 <td nowrap><div class="navlinks">
450 <a class="breadcrumbs" href="..">Home</a>&nbsp;|&nbsp;<a class="breadcrumbs" href="../research"><b>Research</b></a>&nbsp;|&nbsp;<a class="breadcrumbs" href="../teaching">Teaching</a>&nbsp;|&nbsp;<a class="breadcrumbs" href="../publications">Publications</a> </div></td>
451 <td><img src="../images/blank.gif" width=25 height=1></td>
452 </tr>
453 <tr>
454 <td bgcolor="#000000"><img src="../images/blank.gif" width=25 height=1></td>
455 <td bgcolor="#000000"><img src="../images/blank.gif" width=1 height=1></td>
456 <td bgcolor="#000000"><img src="../images/blank.gif" width=25 height=1></td>
457 </tr>
458 </table>
459
460 <p>
461
462 <!-- UNIVERSITY OF MARYLAND FOOTER BEGINS HERE -->
463
464 <table border=0 cellpadding=1 cellspacing=0 align="center">
465 <tr>
466 <td valign="middle"><a href="http://www.umd.edu/"><img src="../images/maryland_small.gif" width=185 height=32 alt="University of Maryland" border=0></a></td>
467 <td>&nbsp; &nbsp;</td>
468 <td valign=middle nowrap><font face="Arial, Helvetica" size="-2">
469 <a href="http://www.umd.edu/">UM Home</a> | <a href="http://www.umd.edu/whoswho.html">Directories</a> | <a href="http://www.search.umd.edu/">Search</a> | <a href="http://www.umd.edu/prospective/">Admissions</a> | <a href="http://www.umd.edu/calendar/today/">Calendar</a><br>
470 Original created by <a href="mailto:jfuetsch@umiacs.umd.edu">John Fuetsch</a><br>
471 Questions and comments to <a href="mailto:nedwards@umiacs.umd.edu">Nathan Edwards</a>
472 </font></td>
473 </tr>
474 </table>
475
476 <!-- END FOOTER HERE -->
477
478
479 </td>
480 <td bgcolor="#FFFFFF" width=10><img src="../images/blank.gif" width=10 height=1></td>
481 </tr>
482 <tr>
483 <td colspan=4 background="../images/top_shadow.gif" align="right"><img src="../images/top_shadow.gif" width=110 height=10><img src="../images/corner_sharp.gif" width=10 height=10></td>
484 </tr>
485 </table>
486
487 </body>
488
489 </html>