I have not tested these linux viewers. If you try running it on your linux system, please drop me an email with your results.
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.
http://www.jcamp-dx.org 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.
6/6/2022|10:31AM Had to clear integrationlist when clearall integrals button is pressed. Might be able to get a better estimate of integration settings by setting limits a few Hz out from each edge. The integraion labels are now displayed horizontally and include the chemical shift for proton spectra. At some point I will clean up the JOC_string so it follows JOC standards. 6/5/2022|02:40PM Inserted the following code in process window so integration panel shows when it is a proton spectrum where the integration panel is more useful. if lables(22)="^1H" then TabPanel1.Value=3 else TabPanel1.Value=4 end if Modified integrationlist labels that is copied to the Clipboard so that it makes a better table when pasted into MS word or OneNote. The format of the output strings for δ, compleing constants was modified to follow ACS specifications as closely as possible. I displayed the integral number of hydrogen lables horizontally and it seems as though including the average chemical shift might be a good addition as well. It was so easy to chemical shift, I added it with the δ symbol for good measure. 6/4/2022|04:54PM I added a contextual menu item to the proton analysis window to expand on a seected integration range. This expancion, like all expansions, searches for the highest peak and scales the spectrum as it is expanded. 6/3/2022|04:53PM I fixed the restore prefs routine so it would also set the number digits for the peaks in proton, carbon13 and IR spectra. A markpeaks1(range_number) was added so a second pass at detecting lines in a multiplet could take advantage of calculating a better estimate of thresh to find peaks more accuately. 5/28/2022|04:58PM I have removed the set reference, the default expansion ranges and added "Show Integration Range" item to contextual menu for the process window. Modified the set integral routine to perfrom a markpeaks to obtain a more accurated peak count. 5/19/2022|04:37PM The locmouse text was getting cut off after a drag through a region and the only way to fix it was to open and close the prefs. I found the in the mousemove routine and fixed it. I also changed the mark peaks routine to sent the threshold at 0.0143 of the highest peak in the range instead of 0.01 so it is not quite so sensitive. Need to see if I can use markpeaks for all integration ranges. Still need to work on trailing edge routine to find integration edges. 5/7/2022|04:18PM The markpeaks and removepeaks routines in process were not adding and removing peaks in a logical fashion. The peaks_marked array manipulation was changed to fix the problems. I still need to get the first pass integration process to mark all of the peaks in an integration range. Is markpeaks not working? I changed a few default font sizes (axis, mouse, peak labels) to make them more readable on a projector. 1/16/2022|11:41AM I discovered that the update module was no longer working, apparently because HTTPSecureSocket is no longer supported. I changed to a URLConnection in the UpdateModule to fix it. I have added a humpcal button to the process display when the Bruker PROHUMP is run on chloroform in acetone. I also incorporated the old mark peak routine that will allow for marking or removing a single peak from/to the peaks_marked array. At some point I need to add the markpeaks and remove peaks routines to spectradisplay. 1/14/2022|12:01PM I think I need to change the mark peaks routine to only mark peaks and add a remove peaks routine. I will start with the process routine. I should also keep the simple markpeak method to finely add and remove peaks? 1/13/2022|5:35PM I added a preference settings to turn the JOC displays on and off. The default is on. I have been thinking about increasing some font sizes so it is a little easier to see things at first glance. Maybe later. 1/12/2022|02:13PM I figured that I may as well add the peaklist to the spectradisplay plot also. A default peaklist now shows on all spectra. I should probably add switches to the preferences for these latest additions. 1/11/2022|02:18PM Over the past few days I have impletmented the integration cleanup and decided to go ahead and print the standard literature format string on the the plots to show chemical shifts for carbon-13 spectra and chemical shift/splitting/integration for proton spectra. 12/27/2021|12:43PM Next I will try to cleanup integrals by removing small peaks that have been marked in each range. I started by finding most intense line in each range ('integrateranges(n,8) = most intense line in region). Next I want to compare each line in region to most intense line and omit lines less than 1%? It seems like I can use a modification of the mark peak routine to make the corrections. 12/26/2021|12:03PM An issue in the process:find_local_peak routine that caused an out of bounds was fixed. Fixed seach_jdxlist so that pressing the download button dounloads all checked files and then clears the check boxes. Turned off plot peak table by default. 10/23/2021|05:32PM The application update option has been modified to support the modified folder structure on the server so the proper file will be downloaded for the platform being used to run the viewer. This is version 3.2.5 and is an extention the 9/6/2021 file. 8/22/2021|11:22AM I got autopeakpick and integrate messages to blink forever, but only works with an odd number of windows actively blinking. I can not figure out why? 8/21/2021|05:36PM Iinserted code into the process windows to blink autopeakpick or integrate text a few times. Maybe it should blink until the appropriate action is taken? 7/13/2021|04:26PM Modified search list boxes so d character downloads all of the checked files in the list with the focus using the mouse.Focus is set to found_list_listbox after search_list is run. Right click inside listbox will produce a contextual menu (Download) if any spectra are selected. I decided to support keydown event d to download selected files. 7/1/2021|12:05PM I have reactivated expandtext lable on all spectrum windows. I am trying to get the stack routine to support expand properly. I could not figure out a way to expand or contract stacked windows so I turned stack(overlay) off and executed the plot refresh. Just discovered that drawthumbs switching from process to spectradisplay does not throw up the spectradisplay spect until the mouse is moved over the plot area. The window is not activating properly. 6/28/2021|02:50PM An infinite loop occurred in the reset_amp routine for spectradisplay, but not for process. Strange?! I added code to prevent the infinite loop in both windows. 6/2/2021|01:27PM I decided to add the FileSaveasJPEG routines to the spectradisplay window and make sure that there is a valid filename value. 6/1/2021 4:50 pm Saving the real vaules only of an nmr file causes a convertion to Hz which needs to be converted back to ppm after the save. I have set up the saveasjpeg menu item in the process window so that it defaults to jpeg, but I lose the ability to save as PDF because I am no longer using the exportpicture routine. I cannot get ExportPicture to select a default file type (always PNG). I have also changed the process filesave routine so it will construct an initialpath when a file has been opened directly off a fileshare. Added UseGDIPlus = True to app.open event so windows apps can save spectrum image as jpg, png or bmp. I see windows10 at uwsp supports print to pdf file. I changed the process savefile so that saving just the real data for the data displayed in the window is the default. You must select jcamp/ntuples format to get all of the data. Now at version 3.1.8. 5/25/2021|04:08PM Updated prefs to record C13_integration_digits properly. I have not implemented use of this variable yet. 3/29/2021|11:30AM I found some saved files could not be opened by Mestrelabs mNova if the following lines were missing for Bruker files: 'It turns out that mesterlabs mnova canot read Bruker files unless the following two lines are at the beginning of the file. if lables(48)<>"" then o.writeline "##TITLE=JCAMP Viewer" o.writeline app.commands(48)+lables(48) end if I think this is fixed now. I also added code to the mousemove and mouse drag routines so the xlocmouse lable does not go off the display on the right. 3/23/2021|12:48PM I have the plot some spectra windows printing the grid format only, but it will be good enough for now. 3/12/2021|04:22PM I am going to try adding a print routine to the option plot some spectra window. 2/23/2022|10:26AM An email from Michael.Kenney@tri-c.edu describing errors when processing picospin data stems from my attempt to automate integration of proton NMR and peakpick carbon13 spectra from our Bruker instruments. I had to insert a test for FID files before executing these commands in the readnewfile:readprocess method to fix it. It seems to read the example Michael sent just fine. I also discovered a crash upon file read when running on MACOS monterey and had to download the most recent version of xojo to fix it. ARGH!! This is going to get expensive. 2/15/2021|11:55AM Fixed the improper xlocmouse display by running reset_amp upon activation. 2/3/2021|09:23AM Added mythumbs.hide to plot some spectra ok button action to properly show the 'some' window. The background was changed from default gray to white and the spacing between spectra on both the all and some windows was adjusted and set the same. 1/24/2021|01:33PM I am working on the overlay(stack) function so that the table display is a little more visible with formated X,Y and I values and a little more room for the color column. I also decided to turn off all peak, integration and jvalue labels in stacked spectra. The user will have to turn them back on when needed. It is not perfect, but is much better. 12/30/2020|11:41AM I have decided to run a prohump on both NMR systems with each LN2 fill. The lineshapecalc routine has been modified to print the line width analysis, expand about the chloroform peak and increase the intensity by 10. 12/26/2020|01:24PM I want to improve peak picking during the integration process for proton NMR. This was accomplished by changing thresh to 0.01 of ymax_peaks in the mark_peaks method. It is not perfect, but it is better. 12/22/2020|12:05PM I discovered that MS xlocmouse was being displayed incorrectly. It was fixed by loading an older version and inserting: if display=app.fid_spec or display=app.mass_spec then xval=xarray(xfirst)+((x+xoffset)/xscale) End If into the mouse move event and mouseup events. xmax and xmin also need to be fixed as xmax should be on the right instead of on the left as it is for IR and NMR spectra. It is too messy at the moment. Maybe change xmax.left and xmin.left to swap them? A quick check says that will not work. 12/22/2020|11:07AM app.plot_integral_trace=true will plot the whole integral trace and its first derivative when proton integraton is requested. I set it false today. 12/8/2020|08:04AM The vertical cursor disappears when an inset window is open and a drag occurs in the main process window. This problem does not occur in a spectradisplay window. Also an integral cannot be cleared until the inset window is closed. All vertical_line.visible = false were changed to true and the virtical line will turn on after a slight pause. I also need to improve peak picks inside an integral trace as auto integration frequently misses small peaks in a clean spectrum. I added the ability to display the whole integral trace. It seems like take the derivative of the integral might be a way to find the integral limits if the baseline is fairly flat. I still need to examine the peak picking algorithum for integrals so it finds all of the peaks. 11/29/2020|12:24PM I added some code to print the humpcalcs on the spectrum and fixed an error with filename transfers from the Search_jdxlist to thumbsfoundlist. Added humpcals to spectrum along with the identity of the spectrometer where I changed chemb124nmr400 to CBB422-NMR-01. I probably need to talk with Sam about replacement computer before this one fails. 11/28/2020|02:14PM The jvalue and integral digits seem to be working ok. I discovered that Mestrelabs Mnova will not read NMR files saved from the JCAMP Viewer unless the ##TITLE= and ##JCAMPDX= lines are the first two lines in the file. Mesterlabs Mnova seems to read Nicolet IR files saved by the JCAAMP Viewer just fine. IR_digits is also working. I need to add some code to remove period when digits is zero. 11/27/2020|06:00PM all of H1 digit items can be fixed except jvalue and integration. 11/27/2020|03:12PM I have begun to implement number of digits to right of decinal point for h1_digits into prefs, app and process window (only one implemented now). The prefs window already contains place holders for jvalues, integral values, mouse values and IR peaks. 11/24/2020|12:13PM I discoverd that plot_firstderivative was in an indetermant state such that it would randomly be set to true causing the derivatives to be ploted. I forced app.plot_firstderivative to be false programatically in prefs:OK. I added version infromation to spectradisplay and process windows. 11/21/2020|02:52PM I created a copy of the found_list_listbox on the MyThumbs window so more files could be downloaded while examining spectra without going to the Search_jdxlist window. I also fixed some little bugs with the newthumbs and scrollthumbs interaction so scrolling is a little more sensible. It looks like we are at version 3.0.20. A definite milestone. 11/20/2020|10:20AM Process actions added to found_list_listbox and fairly complete debugging has been performed including clearing found_list_listbox when a new search string is entered. 11/19/2020|09:55AM The filelist box spacing is fixed and found_list_listbox is populated. Now I need to process actions on the found_list_listbox using the found_list array to get the file(s) requested. A double-click in the found_list_listbox downloads the correct file. Partial implementation of the rest of the functions of the found_list_box. No debugging has been performed. Save it for later. 11/18/2020|09:44AM I have displayed the version/build information on the dataserver window. May as well try to find room on the spectradisplay and process windows as well. Another day for that one. I want to upgrade the search window so that a listbox shows all of the files found at once on the right. I have also added a button to download all files found for a search string. I probably need to fix the problem with multiple downloads requested tha throws a nilobject exception at about 10 to 12 files. Need to fix issue with filelist that truncates filenames and leaves white space to the right side of filelist and create another listbox to hold the files found. There is progress that will make it easier for students to find their files. 11/15/2020|12:07PM I set first startup font to helevetica and font sizes as described in reset_prefs method. 11/14/2020|04:34PM The stack plot for NMR works ok, but for IR none of the offsets are working. I found the error in calcscales routine where the baseoffsets were not incorporated. However, the stack plot only looks decent in absorbance mode. Oh well. Better than nothing. 11/14/2020|12:46PM I am attempting to fix the odd problem with MyThumbs plots jumping from top to bottom with every change in the display. It is fixed now by setting scrollthumbs.maximum in mouse enter event. I also turned title text red for the active window so it easier to find when scrolling. It works for NMR spectra but not for IR spectra. I fixed readprocess so that normalizefield is set properly. 11/13/2020|08:40AM I have installed code in the app.initialize routine to check the system for the reecommended fonts found at https://practicaltypography.com/system-fonts.html and construct font_pointer( ) and font_string_pointer() arrays so the prefs can quickly construct font popup menus for each of the displayed items. Next I want to provide the ability to set the number of digits to right of decimal point where appropriate. I fixed the MyThumbs window loaction with a little code in the newthumbs paint routine. 11/10/2020|05:04PM An crash error occurred when I tried to load Kody Burdick's Ir spectrum of the diol reduction product. Oh goody! Somehow he managed to save the raw interferrogram in JCAMP format which I cannot process. 11/7/2020|02:47PM I think it might be fun to limit the set of fonts to those that look really good on both mac and windows. I found a site: https://practicaltypography.com/system-fonts.html that has some definite opions on what looks good and they may be right. 11/6/2020|03:40PM I discovered that saved peaks come in one data point downfield for proton NMR spectra which was fixed by subtracting one from the peaklocation in readnewfile routine. The peaks output and read for carbon spectra was fixed. IR also saves and reads peaks_marked and peaks to the file, but they all get read in as marked peaks. 11/4/2020-03:18PM I have implemented font and size selection for all displayitems in the prefs window and tested most of them. Next I want to give an option to set the number digits displayed. But not today. Partial fix for peak list save for carbon. 11/04/2020 I have begun the process of implementing a font preference tab by moving the font sizes to a fonts tab and started the process of allowing font selection menus. I have not fixed the save routines for carbon and IR so that peak picks will be saved. Coming soon. It might make sense to print the integration tabel for proton NMR at some point. 11/03/2020 While examining ester NMR and ir spectra from my students I discoved that peak picks were not being saved for carbon-13 and ir data. It was only working for proton. However, the saved data files were not being read correctly as all peak locations were off by about 10 Hz. I found that moving the peak read/analysis routine a little later in the readprocess routine fixed the problem, but I still need to figure out why carbon and ir are not saving peak picks. I will save that one for tomorrow. I want to add a font management panel to the preferences window so that I can select font sizes and offer some font selections like calibri, ariel etc. and allow some control over the number of digits displayed for numerical data. I think this will leaqve room a logo on the preferences page. 9/21/2020 Added the average coupling constant to the single line proton specification on the peaklist and integrationlist tables. 9/19/2020 I calculated the average J for integration ranges and changed the chemical shift display on proton to print ##.00000. 9/17/2020 I decided that the default font sizes were too small and changed them all to 12 point. Version 3.0.16. 8/29/2020 The stack offset listbox was all messed up on the spectradisplay window and has now been fixed. I think we are getting closer and closer to a good app. 8/27/2020 Tab separated peak lists have been implemented and fixed a problem with first pass integration failed to count lines in integrations and calculate chemical shifts correctly. 8/18/2020 Trying to create tab separated peak lists. 8/6/2020 I modified the paste function in process to paste the clipboard(a PDF) full size so molecules will be visible. 8/4/2020 I have fixed the windows update routine so it will work a little bit better. 8/3/2020 I modified the integration routine to make edge selection a little bit better. 8/2/2020 I found that I accidently compiled the version without the color picker and deployed it. Added some more colors to the picker and trimed leading/traling spaces from URL so the url will work properly. It seems like I ought to be able to turn mousewheel on if I scale the change near 1 so it doesn't overshoot and increase the change as we get further from 1. I also think I can do better selecting integral limits by examining the derivatives and making the range symetrical around the central peaks. 7/12/2020 It appears that using the built color picking functions do not work very well in catalina. So... I made my own color picker from a listbox with cells filled with colors from: https://www.rapidtables.com/web/color/Web_Safe.html I extracted the hexadecimal representations from that table and stored them in a color array (mycolors). The user will have to click on an item color to be changed and then click on a color. The color of the item selected should update immediately and color changes will be implemented on all open spectra. These are global colors for the application. None of these colors are stored in the JCAMP files only in the app prefs. 7/1/2020 Finally got around to testing the windows version and discovered a craching bug while trying to open the prefs, previous files and printer setup text. I had to check for file = nil and file.exists. Needed to add PrinterSetup file to app.initialize. Windows 7 seems to be working ok now. Tried to do some printing from windows 6/24/2020 The logo and peaktable location issues appear to have been solved both copying to the clipboard and priinting. However, the inset location problem still persists as of 10:45 AM. I will work on it a bit more. They seem to be moving down and to the left. I suspect the moving left error is because of making space for the logo and table. Finally, I have spectrumcopy and spectrum print working. Time to call it quits and compile this guy as 6/22/2020 Nagging issues: The show logo option plots the log twice on clipboard captures of both window types if the clipboard resolution is large enough. I have set the default clipboard resolution to 1280x960. This means I will have to prevent the logo plot from the plotit routine. The printer output of the logo looks good. Insets are copied to the clipboard ok unless a peaklist is requested and then they are off to the left. Insets seem to be a little low and to the left without a peaklist and a lot to the left if peaklist is printed. Clearly the inset plot routines so take possible peaklist plotting into account durint copy and print. I should change the color of peaklist to the same as plotted peaks. 6/18/2020 It never ends! I found a problem with the process read/save file routines that were not initializing the showpeaks variable and anothe one with proper saving of the normalization variables. It would be nice if I could get the auto phasing routine to be as efficient as mNova. Well, enough for today. I had hoped I was pretty much done. 6/17/2020 Just for fun I added a UWSP log with Badger CodeWerks on it. When requested it will show up on the plot windows (upper left corner) and printouts (lower right corner). I can convert it to just the UWSP logo if necessary. 6/16/2020 Fixed issue with nmr spectra that wasn't leaving enough room for peaklist when printed.Some issues with ir spectra disappearing when moving to the tab panel have been mostly resolved and peaklists for IR spectra are more complete. There is still a problem with printing insets that causes the insets to be larger than they should be. 6/15/2020 Fixed most of the printing issues. Still need to test insets as they print to low just like annotations. Just did another check and peaklist table doesn't have enough room on the proton nmr. 6/14/2020 I believe I fixed the errors with 'graph all spectra' close by forcing a redraw of all spectra before closing the 'all' window. I managed to get the vertical and horizontal lines to disappear by setting .visible=False. 6/12/2020 I am having a lot of trouble getting printing to work as page 1 and page 2 print on top of one another. I believe that I have it fixed doing a g.clearrectangle(page) on the printer Graphics objects. Now if I could just get rid of the blank page at the end. There appears to be a problem with the vertical marker after doing a 'graph all spectra' that may lead to a crash. It is never done, but it is getting closer. 6/11/2020 Fixed xlocmouse.height so lower part text wasn't cut off and added some spaces to xlocmouse.width so we shouldn't miss yvalues, if desired. Found some errors being caught when reading some Bruker files and decided to display the errorlog in the integrationlist when first opened. I can't seem to get rid of them and they do not appear to be serious 5/27/2020 File save and read routines work ok, but there are some subtle problems that occur because of interconversion between and Hz and PPM. Sometimes it doesn't matter and sometimes it does. 5/25/2020 It appears that we need the ability to mark/unmark all the marked peaks in a selected range. We now have that ability. Now it is time to look at coupling constants which were being stored as array pointers. They have been converted to chemical shifts, but they are not working correctly yet. the first one displays incorrectly upon selecting the second one. Some problems were corrected by defineing the beginning and end as doubles. Still need to fix the display problem and test file save/read routines. 5/24/2020 I accidently disabled peak pick when integrations were being displayed. Now mark_integral_peaks only runs on firstintegration. 5/23/2020 I have modified the process integrate routine to use the markspeak routine to get a more accurate peak count for each integral range. I still need to work on edge detection to get more accurate integration ranges, but it is pretty good for now. Time to compile and post to the web. Version 3.0.4. 5/22/2020 I worked on spectradisply a bit looking at ir spectra where peaks had been marked and cleaned up the amplitude setting so it would be at 0.8 if showppeaks=true or showxvalue were true . Otherwise set it to 1.0. Discovered a hidden/forgotten aspect of the m key that would find all peaks in a selected interval. This works in both process and spectradisplay windows. I think I can use it to select(mark) peaks in integral intervals more accutately. Time will tell. 5/21/2020 I decided I needed to try storing and reading the peak pick threshold. If it is not there it should start at 10. I also changed all threshold.text to threshold.value. I have modified the process window so that the annotations can be located in the mousemove routine. The next step is to grab them and move them around. Enough for today. About ready to actually move to 3.0.4 5/20/2020 Tests with windows version showed that it was activating before the yarray was completly populated. Putting a while loop in the activate routine caused the file decode to slow down a lot. So I put it in the resize event which cannot occur until all the data has been read. I also managed to fix a minor problem with the integration being behind the peak counting routine was easy to fix by moving the PeakPick call in plotit in front of the integrate call. The first pass results in a lot of greyed peaks but we can't be perfect. 5/18/2020 threshold.value got tthreshold.valuead insets, annotations and integrals to work for .dx files by including the following code in the activate even run once code area: 'Let's try to chanhold. threshold.value self.threshold.value=self.threshold.value+".001" self.thresholdarrows.visible=true mythresh=val(self.threshold.value) userthresh=true peakpicks_changed=true 'PeakPickAutoPeakPicks spectrum_changed=true plot.refresh doublebuffer normalize_integral 5/17/2020 I had to redo the work of 5/9 because I forgot to save it. I also placed w.normalize_on_this_integral=val(NthField(inputstring(integralsstart+1),chr(9),2)) at line 703 to properly read the normalize_on_this_integral property. Chemical shifts of the intgegration ranges are not being calculated during the file read, but chemical shifts and number of lines are now calculated during first integration pass. Now I have to read them from the file properly. Looks like I need to save the whole integrateranges arrary. 5/9/2020 Found errors in the save and read routines I used to output the insets, annotations and integrations. I changed the insetxfirst and insetxlast to chemical shift, I think. 5/6/2020 I extended the vertical drag line down to the bottom edge of the plot and some single key functions: f: will contract to show the full spectrum if a region has been expanded. An FFT if a FID is visible. e: if an integration has been performed on a proton nmr this key will cause the display to show the default expansion for the integral. An exponential multiply if an FID is visible. p: does a peak pick and toggles peak pick on and off. i: performs an autointegration or toggles intregral on and off. There are others that I will document later. It might be worthwhile to use the peak threshold to determine integration ranges for first integration pass. 4/25/2020 The update module works now. It is not very slick as it just downloads the zip and tries to unzip the archive into ~User/Applications. The user will have to decide if they want to move it into the normal applications folder for their platform. I also changed the build all script in the File:IDE Scripts:BuildAllDesktop.xojo.script menu item. I only put the win32, wind64 and OSX64 versions on the PSLC web server. 4/24/2020 The integrateranges array was getting over run occasionaly in process.integrals_calc_ranges and process.integrals_first_scan methods which was corrected by rediming it until it was big enough. 4/23/2020 fixed problem with makeinset that closed two windows when tempinsetnum was equal to insetsnum+1. I discovered that xgrdiplot and ygridplot are being properly stored, but not properly read and implemented. It appears that this all started when I decided to stop using vgrid and implemented separate booleans for xgridplot and ygridplot. It is now fixed. I hope I have caught most or all of those little problems. 4/19/2020 Inset variables are getting reset again so I decided to define local integer variables to set the makeinset.Top, makeinset.Left, makeinset.Height, makeinset.Width and tempinsetnum variables in the process.insetpushbutton method. I will probably have to check the spectradisplay window as well, but for now it is functional. 4/18/2020 It appears I am using the source variable with almost every window to refer to the source spectrum. in reality the first exercise when a window activates is to set the app.active variable. There is really no need for all of these source variables to be established and set in several locations in the code. Just make sure app.active is correct and I can save a lot of effort. This got rid of the spectrum switching bug. Time to compile and send it out. 4/16/2020 I have added some code by Thomas Tempelmann to record a trace file on the desktop that folks can send to me when they encounter a bug. Hopefully it will help me squash bugs and spiders when I encounter them. Use of the inset function, among others, seem to cause a switch to another window by changing the sorce value on the iMac but not of my MacBook. Strange? 4/14/2020 Edited process window keydown event to 'e' key to check integral list and expand display from -0.5 to 1 ppm greater than the integral range with greatest chemical shift. 'e' is normally used to perform an exponential multiply during FID processing. Most folks will not use this very much. 'f key will contract to display whole spectrum. 4/13/2020 Removed markers when makinset window is closed. Removed markers after jvalue calc is performed. Removed PDF code because it seemed to decrease stability and only works in 32 bit mode. 4/12/2020 I think I have fied the issue with the first integration that did not calculate chemical shift and number of lines in an integral region properly. 4/11/2020 I have begun to experiment with getting chemdraw pictures off the clipboard and into spectrum. This required setting chemdraw 12 general preference:Add PDF to clipboard and then using code written by Will S on the xojo forum who provided a zip of his code to get a PDF off the clipboard using coregraphics calls. It only works in 32 bit version. Compiling for 64bit causes a crash when the page.pictureatwidth call is made. This suggests that it should be possible to convert it to 64 bit(I hope). I am sure it will not work on windows. source to get PDF off clipboard off the clipboard which has been downloaded: http://trochoid.weebly.com/uploads/6/2/6/4/62644133/pastepdf.zip 4/10/2020 Integration used to show NAN responses in the integration table which was repaired by moving the call to normalize the integrals down a couple of lines. I have worked on the process window so that, if the print_peak_table is true, it will be copied onto the clipboard and printed in a colum on the left rather than on the spectrum itself. I also worked on the printme window to control printing appropriately. I still need to work on the spectradisplay windows but they shouldn't be too bad. I have also installed two app methods (refresh_prefs and reset_prefs) so preferences changes are cleaner and if you make a mess of things (colors can get rather screwed up) it is easier to start over. I also found that the prefs file was being saved in the user ~Library folder instead of in the ~Library/Preferences folder. I think was caused by a change to the Nativepath usage. 4/6/2020 Change initial pref for peak list to off? Create space on left for peak list for clipboard and printing. This is doable but need to calculate width of peaklist and leave appropriate room in clipboard and print page for process and spectradisplay windows. started but not done yet. Also need to add method to prefs window to implement global changes on all windows, then replot if necessary. Not even started yet. Update to thumbnail with only one window open causes unnecessary jump from top to botton of thumbnail window with any change to main window. Need to examine font scaling when printing. They seem too large. 4/5/2020 The use of validationmask in makeinset caused issues with the keydown event. So we will not use validationmask for textfields. Enter key in insetleft or insetright textareas failed, so I added a check for chr(3) to the keydown routine. 3/30/2020 I had to TextAlignment for xmin, xmax, insetmin and insetsmax to TextAlignments.left to prevent upsidedown characters during editing. Set appropriate character limits for these items. Changed normalization textarea to fixed and allowed only integer input using up/down arrows. 3/26/2020 Looks like I had better compile both 32 and 64 bit versions for windows. 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. 2/10/2020 One of my students trying to use the windows version discovered rapid window switching making the app unusable probably caused by the thumbnail windows implementation. I have fixed that problem and modified the floating x label on the plots so it blanks only the necessary part of the screen and the fontsize changes with the spectrum fontsize. I still cannot get the scrollwheel to work properly in the windows version. 2/2/2020 The slow peak pick routine for IR spectra was accelerated considerably by creating yabs() and ytrans() arrays when the file is first opened along with a search for maxyabs, maxyabs, minytrans and minyabs. A subsequent search through the yabs() array was much faster than doing an AtoTconvert. The number of peaks selected was also reduced to 15-25 at first pass. The Threshold EditField was also cleaned up so it shows a number that makes some 'sense'. The search_jdx windows was modifiedso that either the number found or the number in sequence are opened. The version number has been changed to 3.0.0(beta(7). 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) go 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. 1/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.12/27/2019 URLConnection does not support simultaneous file requests. So.... back to HTTPSecureSocket. I found that by setting the socket to TLSv12 I could get reliable transfers from off campus. The window.Title of the transfer windows wer set to the file name and the windown was offset by 50 pixels when multiple requests were submitted. 12/16/2019 Problems with access to files from off campus led to the discovery the TCPSockets had been deprecated and URLConnection should be used instead. So the conversion from sockets to URLConnection is underway. This approach does make it unneccessary to write TCPSocket and SSLSocket code to access urls. A problem with decoding some files from the Bruker nmr system led to the discovery that the decompress routines were not adhering to the npoints limit. These bugs have been fixed. An ability to download two or more files in a Search_jdxlist has been implemented to make evaluation of student spectra a bit easier. 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.