This version of the viewer has the capability to directly download and process raw FID data files from the UWSP data server. Some very brief documentation (and dated) on the data processing capabilities is available here.
Here is a screen shot taken on an iMac 3/26/2020.
Click on a thumbnail on the left to switch spectra. Twenty NMR and twenty IR/MS spectra max.
JCAMP-DX spectral files are best displayed using the JCAMP viewer as the Chime plugin(Windows only) seems unable to display spectra with a large number of data points in an AFFN JCAMP data file.
All jcamp files on this site can be viewed as well as those on the NIST web site. In general, all compounds on this site will have infrared, 1H, 13C, and mass spectra. The viewer reads and saves in AFFN format only. It can read compressed JCAMP formats, but writes only AFFN format. See the official JCAMP specification site for details.
General Viewer Features:
All spectra can be expanded in both X and Y coordinates via commands or buttons on the screen. Click and drag will outline a region which can be expanded or displayed via an inset window. Expansion will automatically rescale the Y dimension to bring the largest peak to full scale. Annotations (simple text labels) can be added via the annotation button (toggles on and off). These annotations will be saved if the file is saved via file:save. Right click on a peak will bring up a contextual menu. One of the options is 'Mark peak' which will produce a label showing the X coordinate of the peak. Labeled peaks will also be saved if file:save is executed. Automatic peak picking results in identification of all all peaks above the threshold which can be adjusted via on screen controls. A peak table can also be displayed.
In general, anything displayed on screen can be printed or copied to the clipboard. If Quicktime is installed, the screen display can be saved in jpeg format suitable for direct display on web pages. All jpeg files on our web site were created using this feature of the viewer. Other picture formats may be available as well depending on your system configuration.
Infrared spectra in the database were recorded and converted using a Nicolet FT-IR spectrometer. The default display format is % transmittance versus wavenumber (cm-1), but absorbance is also available. This default can be changed via the preferences dialog and may be overridden by preferences within the JCAMP file itself.
Mass spectra in the database were recorded on a Hewlett-Packard GC/MS and converted to peak table format using software delveloped locally. Normal expansion and labeling is available.
1H nmr spectra:
Proton nmr spectra can be displayed in both Hz or ppm assuming the spectrometer observe frequency is available in the file header. The default can be changed via the preferences dialog. In addition, automatic integration can be performed. Raw FID data is available for some compunds in both JCAMP ntuples and MacNMR format. The viewer can read and display the real or imaginary portion of the JCAMP FID. We currently use the Bruker JDX export feature of Topspin 3.6 (400 MHz) to make files available for courses and research at UWSP.
13C nmr spectra:
Carbon nmr spectra can be displayed in both Hz and ppm assuming the spectrometer observe frequency is available in the file header. The default can be changed via the preferences dialog. Raw FID data is available for some compunds in both JCAMP ntuples and MacNMR format. The viewer can read and display the real or imaginary portion of the JCAMP FID.We currently use the Bruker JDX export feature of Topspin 3.6 (100 MHz)to make files available for courses and research at UWSP.
3/23/2020 Cleaned up the one comments in problem sets and sized the dataaccess window based on number of questions. 3/22/2020 Added ability to display a one short line comment in red to problem set window for each question. 3/20/2020 Still having problems with multiline Annotations being read and displayed properly from a jdx file. I will try using app.cr to get line feeds properly encoded. I think line feeds are properly encoded in annotations now, but annotations are still somewhat problematical. I have modified the show all spectra call so the window is maximized. The same is true of the plot selected spectra. 3/19/2020 Putzing around with Annotations, but can not seem to use mouse location to see an annotation on the spectrum. 3/17/2020 Changed the mouse assignments in plot and xlocmouse to local rather app.MouseCursor designations which seems to reduce the flip/flop between the plus and arrow pointers. This may also fix the jerky behavior on the 4K screens in 422. Rats that did not work. 3/16/2020 Changed some of the mousemove code in process and spectradisplay windows for better efficiency. Experimenting with aggressive optimization build setting to see if I can get better performance with the 4K display systems in cbb422. 3/15/2020 Changed xlocmouse label to multiline in an effor to get mouse_color and mouse_fontsize on windows. Moved xlocmouse height and width calculations into mouse move so the label would not overwrite too many lines. 3/14/2020 Fixed error reading ir files saved in absorbance mode. Moved title display to bottom left of plot canvas. Printing four spectra on one page seems to use fonts that are a bit too large and some annotations are way off the page for nmr spectra. We are at 3.0.0(beta12) 3/11/2020 Fixed an error that occured when I converted NUMANNOTATIONS to annotationsnum globably. Annotations in older files would be ignored. This required changing commands(24)="##.NUMANNOTATIONS=" and the savefile routines in spectradisplay and process windows. 3/8/2020 It appears that I have Annotation positions just about right on both process and spectradisplay windows and have increased to 3.0.0(beta11) which will be deployed to labs and the pslc web site. 3/7/2020 The only thing that is left is to get the Annotations routine working properly. 3/6/2020 As I implemented the improvements of 2/19 through 3/1 I manged to incorporate the errors that caused the rapid screen flicker described on 2/10. I am going to try copying components of the 3/1 build into the 2/10 build stepwise to get a verion with all of the nice improvements without the screen flicker. I have moved the prefs window from 3/1 version and gotten the spectradisplay and process windows to properly use the new preferences for the mouse cursor. I have discovered a read error for the older nmr files in my problem sets that is apparently fixed in 3/1. Ok. It is fixed now. The screen flicker on windows is gone witn the spectradisplay, but is still there with process windows. So I am going to compare spectradisply on the 2/23 version that fails with the current version in this build to try to find the changes. Looking at the trace file when I compare spectradisplay to process windows the problem appears to be related to a resize event. I finally found the problem in the readprocess routine at line 889 where the routine decides how to size the windows. By making this routine identical to readfilespectradisplay the screen flicker was removed. Little gotchas: TextField textcolor fails on windows. I had to use a TextArea to see the color on both platforms. I have added a space whenever the width of xlocmouse is changed to leave room for all characters. 3/1/2020 The annotation feature is being worked on. As of this date the annotatefield is set up to change height as the number of lines of text increases. The annotatefield width is not being changed dynamically and the field will wrap the text when it gets too long. When annotations additions are turned off, but still showing the mousecursor is changed when the mouse moves over the string (this does not work correctly yet. Ultimately I want to be able to click on an annotation and drag it to a new location with the text floating a the mouse cursor. Kind of like the current floating x location of the mouse which is working quite well including fontsize and color changes. 2/27/2020 app.cr set chr(13) for mac by mistake. Changed to chr(10), line feed so the file save routines work properly. 2/22/2020 annotatefield textcolor set default textcolor for annotations. Significant modifications have been made to the annotate routines for the process window(annotate menus also) to get the text properly stored and placed on the plot canvas. Fine tuning is still required in order to set the y position of the text (x position looks good). I also added the abillity to change the size and color of the text that follows the mouse around the spectrum. Most of this only works in the process (nmr) window. Similar capabilities are coming for IR and Mas Spec displays. 2/20/2020 Fixed spectrum redraw when mouse is between vertical markers. I almost have the annotation feature working properly. I just need to get the location and text into the correct array positions. I need to set the annotatefield textcolor and size and clean up the annotation menu items. 2/19/2020 Several verbs have been deprecated (Textsize = fontsize; stringshape = textshape; mylog.append = mylog.addrow; .text = .value; ubound =lastrowindex. A file read error for files that contain only the real nmr spectrum from the 200 MHz system has been corrected. The mouse movement on the spectrum now displays the xposition in the spectrum. 1/13/2020 After a lot of experimentation I finally got the insetleft and insetright input fields to work on the inset window. I found that converting from a textfield (single line) to textarea (multiple line) got things working. A few more experiments to format the text in these fields to six digits plus a decimal point using format(val,"###.###") commands. Floating the mouse over the textarea is the only reliable way to select all of the text. The return and tab keys will move from field to field in the inset window. 1/5/2020 Fixed issue with thumbs out of sync with spectra open by resizing the newthumbs canvas in the drawthumbs method of the process and spectradisplay windows. Added title display to readnewfile window. Next I will try to show progress bar during integration process since it is rather slow. 11/3/2020 Finally got progressbars to work during decodeing of nmr files. I have not been successful getting floating labels to work on spectradisplay windows. At some point I should get a progressbar working for other slow processes like integration and FFT. It is time to increase the version number. 1/1/2020 An error cropped up reading some Bruker nmr files that resulted from improper inspection of the number of points during decoding which was repaired by carrying the nPoints varialbe into the decode routines. An attempt to get ProgressBars working during decoding using threads did not go well. I also tried to use the more modern (httpsecuresocket is deprecated) URLConnection, but it just doesn't work. So... I added a floating label to the nmr window. I will attempt to add this feature to the spectradisplay windows also. A formating issue with the integrationlist and peaklist textareas was corrected. 6/12/2019 Changing the peak pick threshold may change the integral table if integration has been performed. This was addressed by calling normalize_integral in the keydown event of the threshold field. 6/10/2019 Fixed spectradisplay window activate event so overlay works properly avoids race condition by commenting plotrefresh code. Changed auto peak picking code in spectradisplay window to select between 25 and 35 peaks at first request with appropriate threshold value displayed so user can modify it as desired. This probably will not work well for spectra with a sloping baseleing, but you can't have everythin 6/8/2019 Fixed spectrum display lost upon first opening a file. Fixed race condition in spectradisplay - threshold control due to thresh is recalculated. New property mythresh was used to store threshold value for process and spectrdisplay windows. Fixed file save routine for process window to allow saving just the displayed real values for use on the pslc web site. Modified auto peak pick for IR spectra so users could change the threshold and get more or fewer peaks picked. Will change the initial auto peak pick so that 30 peaks are selected at first use to avoid way too many or too few peaks being labeled. 5/25/2019 Finally found the problem with the last spectrum loaded was not being plotted in the window resize event where a self.refresh drew a blank window. Added a preference (app.print_peak_table) to add the peak table to print outs and jpeg files. It turns out the mac version can create PDF and PNG files also. 5/3/2019 Fixed issues with closing spectradisplay windows becoming out sync with what windows was actually closed. 4/12/2019 After considerable experimentation I believe I have removed all of the race conditions that were causing stack overflow conditions. 3/30/2019 I finally have problem sets working propperly so spectra display when they are opened by setting spectrum_redraw true whenever the activate event is fired. A lot more paint events occur as a result, but a redraw does not require a complete regeneration of the picture - just redraw the current picture in spectrum. 3/21/2019 There were a lot of problems with insets which I believe are fixed with this version for the process windows. I had to reinstitute the insetspectrum changed variable to only plot it when necessary. They work pretty slick now. I still need to get them working for spectradisplay windows and deal with the situations that may occur when both a spectradisplay and process window are editing an inset. 3/19/2019 I tried compiling the mac and windows version to test windows functionality and found that the menus do not appear at all. Apparently this was caused because I removed the default menubar when I first created the project. So I created a new project (JCAMP menu) and populated the original menu with my new items and copied all the windows and modules into JCAMP menu. The menus now work in windows 10 and I have changed the windows build to use the MDI interface and optimized the initial window and all subsequent windows to maximize screen use. At some point I will have to change from multiple windows (up to 40) to multiple modules that can contain all the spectral parameters of a spectrum to be build in a main window, but for now I will stick with multiple windows. I have added another mouse cursor that shows 'click to expand' text to the cursor which only works on the mac because windows cursors are limited to 16x16 pixels(I think). Dragging a textbox around for this purpose cause graphics under the textbox to be erased and I didn't want to restore it programatically any more. Working on makeinset which seems to close the makeinset window whenever I click on the active window and then replots it. Lots of calculations required! So I need to check if reploting the inset window is required. 2/17/2019 Fixed crash when multiple files are loaded at one time. I had to remove window close on the winows with HTTPSecureSockets were part of the session. I also implemented a search on all URLlinks of open files to prevent a file being opened more than once. spectradisplay has trouble when trying to use tools on other panels. Something is causing them to go back to the initial default. Opening all problem set files and then opening an NMR file causes mythumbs scrolling to be really slow. 1/26/2019 Ran the analyze project feature of the compliler to identify unused variables and deprecated functions. The deprecation of Nativepath from the FolderItem tools to NativePath just does not work as advertised. For now I will stick with Nativepath until I figure out what I am doing wrong, if anything. I have added scrollwheel support to the mythumbs window and it works very nicely. The open folder menu item has been tested and seems to work ok with four save files. The special cursor I added (mouseplus in app.readmouse method) only seems to work in the process windows. No go in the spectradisplay windows for now. Added a separate peak listing in process window for marked peaks in the proton spectrum. 1/13/2019 Added mythumbs window to the app to act a a selection sidebar so users could scroll through open spectra and click on the the one they want to view in the main screen. Tools would change to support the type of spectrum they select. 1/6/2019 Spectradisplay now works properly with makeinset and drawthumbs. Now I need to fix the progressbar for data downloads and the scrollbar for the thumbs canvas to support 20 spectra or more? 1/3/2019 Fixed the makeinset problem by seting to inset_spectrum_changed to always true. Probably ought to jsut remove that property altogether. 1/1/2019 Integration trace error upon delete was fixed when it was discovered that I forgot clear all of the variables properly. It appears that some variables do not get passed correctly from the process window to the makeinset window. I suspect that similar errors will occur for the spectradisplay window. Specifically makeinset.left and makeinst.inset variables do not pass properly. It was fixed by creating i and i1 to pass these variables to makeinset (really strange?) in the process:insetpushbutton method. At this point, I still do not know why the inset spectrum does not display when first opened. 12/28/2018 The vertical line marker now appears reliably in the integration routine for normalization and integration marking. 12/27/2018 Upgraded to xojo 2018 release 4 which required considerable changes in programing approach and allowed for a more simplified user interface. The bug that some times included small integration ranges was removed. The bug that caused the integration traces to go very negative when an integration range was removed was squashed. Larger thumbs are now displayed along the left border in a growing canvas that will be scrollable (some day). As before, clicking on a thumb will cause it to be displayed in the main screen. 11/13/2018 Increased integrateranges arrary to 500 to handle really noisy nmr spectra. Readprocess has been modified to include filename in process windows title. 10/28/2018 Add fix to process/spectradisplay mouse down event so thumbnails work in the windows app. Commented out the self.SetFocus in the plot.paint event so makeinset would retain focus to work properly. Modified the readnewfile process/spectradisplay routines to use the display resolution set in the prefs. Hide search and web buttons for problem set windows or if they closed. **** Insets can be edited in windows app when first created, but it appears that edit inset fails after that. **** 1/1/2018 Added Copy File URL to edit menu so students can copy the URLs into their notebooks. 12/31/2017 Added normalize_integral to the end of the integral on off routine so the integral traces and table would be bettered formated. Added a line count and average chemical shift to the integral table to help with proton nmr analysis. Cleaned up the comma separated peak list line to show proton shifts a little more clearly(Could probably add a coupling constant estimate to proton analysis). Changed the default threshold for baseline analysis so some small signals in carbon nmr would be identified. Changed the size of the integral window so all variables would be displayed. 11/19/2017 Adjusted top of integration sliders back to top of plot canvas. 10/10/2017 Added buttons to process and spectradisplay to select web or search windows. Changed the peaklist table generators to show only peaks marked if peakpick is off. 10/9/2017 Fixed bug in process:savefile that resulted is saving real data only for nmr spectra. For the moment, only ntuples format will be saved. 8/2/2017 Fixed bugs that display the wrong peak list when switching windows. Turned off Integrationlist when spectradisplay(ID or MS) is front most window. Added thumbnail displays to the top of all windows that are actually buttons to allow navigation between windows. Thumbnails are updated with all window changes. Set default window size to maximum width and height for the system. 5-2-2017 Enabled inset button when range is selected with the mouse. Changed version to 2.8.2. 3-22-2017 I forgot to initialize integrals_font_size when it was declared which apparently resulted in a 'zero' designation which resulted in very small print text unless it was initialized via the preferences dialog. This was fixed and version number was increased to 2.8.1. 2-22-2017 A student discovered an app crash in the filesave routine. The default title from the Bruker contains slashes (/) and this title is used for the default filename in the save dialog which is not allowed in filenames for windows and a crash results. A ReplaceAll was used to change all slashes to spaces to prevent the crash. Apparently the save dialog will check for invalid characters in the filename a user types into the save dialog. Did a replaceall in the savejpeg routine also. 2-20-2017 The windows version went into a continuous loop when peak pick was selected because an automatic search for TMS and spectrum refresh occured. The spectrum refresh was turned off and the apps were recompiled to correct the issue. 2-5-2017 It appears we have a problem accessing spectra from off campus in problem sets. Apparantly a 301 error is being returned as a result of redirection. This error check was added to the http requests. 1-23-2017 Fixed bug in spectrum printing caused by wrong textsize setting in process and spectradisplay. 1-13-2017 The bug that caused the main display to show the inset display when insets were being edited with peak picks turned was fixed by turning off peak pick until the inset was deleted or inset editing was stopped. Changed the overlay command to the more accurate stack command. Fixed a bug in the stack/overlay command that caused a crash. The integrate button now initiates an auto-integrate very similar to mNova in capabilities. Clicking the clear all integrals button now keeps the system in integrate mode so hand integrating can be performed. 12-15-2016 Fixed a bug in the spectradisplay close routine that would cause a crash whenever a spectradisplay windows was closed. 11-19-2016 Fixed a bug in the inset counting routine that would generate a negative insetsnum count and cause a crash. Inserted the app.peaks_font_size into the peakpick routine so spacing would be corrected when large fonts are selected. A temporary fix in the process:plotinset routine that forces a replot of the process:plot canvas during inset generation. There is something wrong occuring when peakpicks are on during inset creation that causes the inset display to be mirrored in process:plot. 7-20-2016 Fixed the wandering normalization peak problem and modified the read routine so it would properly read and display saved integrations. Now at version 2.7.0. 7-18-2016 Changed version number to 2.6.9 and recompiled to include most recent improvements for world wide access. 7-15-2016 Removed 200 MHz nmr log menu item. Removed auto-integrate button and modified integrate button code so that an auto-integration is performed on the first click. The integral used for normalization is now marked with an N. The auto reset of amplitude when integration is turned on was fixed. 6-21-2016 Added an automactic reference setting routine to the process window (assume TMS at zero - auto_set_TMS_ref method) that is run before each peak pick. It assumes that TMS located somewhere between 0.1 and -0.1 ppm and then searches for the maximum peak in this range after which it sets this peak to zero. 6-20-2016 Modified all URL request code so both http and https requests are supported. 6-16-2016 An algorithm was added to the carbon-13 peak pick to differentiate CDCl3 solvent peaks. The peaks list window now generates a comma separated string that conforms somewhat to standard ACS journal format. More deuterated solvents will be added as time allows. Changed integration display so traces would be plotted above peaks and below peak picks. 6-10-2016 Improved peak and integration discrimination algorithms for proton nmr so the auto integration routine works better. Peaks outside integration regions are marked with the grid color to differentiate them from peaks inside integrals. These peaks are omitted from the peak list window. The peaks list window now generates a comma separated string that conforms somewhat to standard ACS journal format. The S/N is used to select the peak picking threshhold. Fixed spectrum offset calculation in the auto process button code. 6-4-2016 Copy marked peaks table with spectrum copy implemented. Overlay in process Window expansion,contraction and inset plotting fixed. Adjusted mark peaks to select all peaks within 3% of max in range. 3-2-2016 Added spectrum reversal button to the process window. 2-17-2016 Fixed peak label printing to laser printers so the whole label prints properly. Made the vgrid and xgrid default color a bit darker so it shows up better when printed. 01-13-2016 Extracted $$ D1 from Bruker header which the relaxation delay. Important for proton and carbon spectra where T1 is relatively large for some spins. Increase to 5 x largest T1 if peak is barely visible in carbon or accurate proton integration is required. 12-20-2015 Fixed grid line drawing for process and spectradisplay windows. Added pref items to turn x and y grids off/on independently and allow color selection. Grids are now on by default. Added pref item to control fontsize for integral text. Fixed convert to Hz on save then convert back to PPM so proton integrals are properly retained. The mark peak and mark peaks ContextualMenu items have been restructured and cleaned up to work with nmr and ir spectra. 10-2-2015 Fixed horizontal grid to be fixed at 10 divisions with no labels. 9-12-2015 Added horizontal grid as default when grid is turned on. Will be default at first use. Fixed J value button so it is enabled more appropriately. Added a Mark Peaks ContextualMenu that will try to mark all peaks in the selected range based on the current threshold setting. It seems to work fairly well for nmr data. Somewhat less effective for IR and MS. 1-7-2015 Fixed window size for 1280x960 pixels. Added ability to change overlay x, y, intensity and color from the overlay table. 10-5-2014 Fixed problems with improper suffix/extention on windows platforms. 8-15-2014 Added the ability to change some font sizes. 6-30-2014 Fixed x,y export in process window when only real values are available. 6-7-2014 The readfile routine was modified to read picospin jcamp files (missing ##END= line). 5-6-2014 The sort bug in the j vlaue calc routine was fixed. A delete button was added to makeinset window so it would be more obvious how to delete an inset. 4-19-2014 Found some serious errors in JDXDecompressor. The DIF/DUP method was failing to change the lineindex properly and the dup count routine was increasing the dup count one more than requested. There are still some calculation errors in the coupling constant calculation routine. It might be nice to try some multiplet analysis. 3-30-2014 Fixed dataaccess and specdata floating window visibility bugs during deactivate/activate. 2-24-2014 Fixed integration error when there were zero integrals in intregral_calc_ranges. Fixed autoplot on first open in spectradisplay. 1-11-2014 Added mouse wheel preference selection. Default is mouse wheel support off. Fixed annotate function in process and spectradisplay. 12-13-2013 Added d key detect in Search_jdxlist so we don't have to mouse over to the download button. Fixed spectrum replot on window resize. Fixed show integrations and marked peaks in file saved by viewer. Fixed process file save so peaks, coupling constants and integrations would be written and read properly. 9-7-2013 Fixed bug in spectradisplay that caused contract button to be displayed, but disabled. Version 2.5.0 9-2-2013 Modiefied setref window so chemical shift EditFields can be stretched to show more figures. Modified peakmark routine so that peaklist Window appears to the right side of the spectrum window. Annotate still does not function properly. Another day on that one. Increased to version 2.4.9. 8-31-2013 Changed the default widths of the columns in overlay listbox and turned on column resize for the overlay listbox. 8-25-2013 added trace feature to process and makinset windows which can be activated from the prefs windows. Edit sectradisplay to support new makinset capabilities. 8-24-2013 Added utilities module - convert boolean to string. Changed process.save to save in hz mode using hz/point and ouput ##.SHIFT REFERENCE=. Also modified readprocess to give ##.SHIFT REFERENCE= preference in ppm reference of nmr spectra. Numerous corrections to makinset and process windows to support mouse enabled x and y expansion. Edit insets works correctly for nmr. 7-29-2013 Added proper conversion of offset in Bruker FID jcamp files. 7-25-2013 Converted java code from JSPECVIEW sourceforge project to decompress JCAMP data files in fixed, packed, squeezed, and dif/dup format as produced by Bruker Topspin 3.0. It is implemented for the process (nmr) windows only.