The MGM (Modified Gaussian Model) is a powerful analytical tool for characterizing diagnostic absorptions in a quantitative manner.
具体FORTRAN版,MATLAB版和IDL版可从以下链接进行下载。
----实时记录,等全部错误总结完会重写整理此文章-----
====精简版教程====
====IDL 8.5环境下运行MGM模型的步骤====
1. 将代码和示例数据(.asc, .fit)下载,并解压到同一个文件夹下(eg. \MGM\mgm_idl);
1. 打开IDL 8.5编译器;
2. 加载所有pro文件;
3. 修改IDL控制台的路径(点击右下角文件夹符号)到\MGM\mgm_idl文件夹;
4. 在startup.pro的第90行左右(READ_DATAFILE, mstruc.datfile, datarr之前)加入以下代码:
mstruc.datfile = dialog_pickfile(title="select a asciifile",filter="*.asc")
5. 首先运行startup.pro文件,
(1)如果startup文件能跑通,则运行mgm.pro文件,控制台出现以下语句:
Enter Startup File Name:
输入test2_comments,敲回车,弹出对话框,选择asc文件即可;
(2)如果startup文件不能跑通,报以下类似错误:
% Variable is undefined: DATAFILE.
% Execution halted at: READ_FITFILE 137 E:\MGM\mgm_idl\read_fitfile.pro
% STARTUP 47 E:\MGM\mgm_idl\startup.pro
% MGM 5 E:\MGM\mgm_idl\mgm.pro
% $MAIN$
把所有pro文件关闭,重启IDL编译器,重新加载所有pro文件,重复步骤3-5。
——完——
====详细版教程(错误总结)====
1. 运行mgm.pro文件,控制台显示:
Enter Startup File Name:
输入test2_comments,敲击Enter,报错:
(1)File does not exist!! 需要切换IDL的工作空间到代码所在的工作空间,具体操作方法是:直接点击IDL控制台右上角的当前目录旁边的文件夹,修改当前工作空间即可,例如:E:\MGM\mgm_idl。
(2)把示例数据放在该工作空间下。
(3)接着报以下错误,文件名、目录名或卷标语法不正确:
OPENR: Error opening file. Unit: 100, File: E:\MGM\mgm_idl\opx1b [ascii file].asc
文件名、目录名或卷标语法不正确。
解决方法:在startup.pro文件的第90行左右,加入代码:
mstruc.datfile = dialog_pickfile(title="select a asciifile",filter="*.asc")
即改为:
; NOW READ IN DATA FILE AND WRITE OUT TEXT
;
; DATFile = FINDFILE( mstruc.datfile, COUNT=nfile )
; IF nfile EQ 0 THEN BEGIN
; PRINT, ''
; PRINT, 'Data file does not exist: ' + mstruc.datfile
; PRINT, 'Check file path!'
; mstruc = 0
; RETURN
; ENDIF
mstruc.datfile = dialog_pickfile(title="select a asciifile",filter="*.asc")
READ_DATAFILE, mstruc.datfile, datarr
errors = 'n'
IF N_ELEMENTS( datarr(*,0) ) GT 2 THEN BEGIN
PRINT, ''
READ, errors, PROMPT= "Use Errorbars (y or n) ? "
ENDIF
2. 弹出dialog,可以先选择网站上所给的opx1b.asc文件进行实验,点击确定后,在IDL控制台会出现以下信息:
======= MGM-FIT 2.0 Main Menu ========
By Jessica Sunshine and Stephen Pratt -- Brown University
Fri Jun 18 11:14:51 2021
Select: 1-Display Current Parameters
2-Fit Once
3-Fit Until
4-Add/Del/Ch a Parameter
5-Lock/Unlock a Parameter
6-Display Routines
7-Storage Routines (Ref.)
8-Storage Routines (Log)
9-Display Parameter Status
10-Set Fit Resolution
11-Stop
运行成功!
3. 不知道为什么,关了IDL编辑器重启之后一直报这个错误:Variable is undefined: DATAFILE.
% Variable is undefined: DATAFILE.
% Execution halted at: READ_FITFILE 137 E:\MGM\mgm_idl\read_fitfile.pro
% STARTUP 47 E:\MGM\mgm_idl\startup.pro
% MGM 5 E:\MGM\mgm_idl\mgm.pro
% $MAIN$
解决方法:前后多加了俩断点,竟然就成功了…莫名其妙…^_^
4. IDL编辑器重启后报错:Attempt to call undefined procedure: 'READ_FITFILE'.
IDL> read_fitfile
% Compiled module: READ_FITFILE.
% Compiled module: READ_FITFILE.
% Attempt to call undefined procedure: 'READ_FITFILE'.
% Execution halted at: $MAIN$
正在解决…
解决方法:重启IDL编辑器…好丢人…但是的确解决问题了…>_<
5. 在display的过程中,使用6-Send to TIFF File,结果发现保存出的图像出现了上下翻转的情形,借鉴链接教程,在case 6加入代码段:
;重新读入影像,进行镜像处理
imgfile = READ_TIFF(tifffile)
imgstatus = query_image ( imgfile, imageinfo) ;获取图像大小
imgsize = imageinfo.DIMENSIONS
jingxiang = intarr(3,imgsize[0],imgsize[1])
for i = 0, imgsize[0]-1 do begin
for j = 0, imgsize[1]-1 do begin
jingxiang[*,i,-j] = imgfile[*,i,j]
endfor
endfor
WRITE_TIFF, 'test.tif', TVRD()
6. 出现报错:Expression must be a scalar or 1 element array in this context: <BYTE Array[595]>.
% Expression must be a scalar or 1 element array in this context: <BYTE Array[595]>.
% Execution halted at: DISPLAY 387 E:\MGM\mgm_idl\display.pro
% MGM 70 E:\MGM\mgm_idl\mgm.pro
% $MAIN$
原因:矩阵维数不一致
解决方法:MGM-FIT Display Routines下的case 6重写为:
6: BEGIN
ipos = STRPOS( mstruc.datfile, '.asc' )
tifffile = STRMID( mstruc.datfile, 0, ipos ) + '.tif'
WRITE_TIFF, tifffile,TVRD()
;重新读入影像,进行镜像处理
imgfile = READ_TIFF(tifffile)
imgstatus = query_image(tifffile, imageinfo)
imgsize = imageinfo.DIMENSIONS
jingxiang = intarr(imgsize[0],imgsize[1])
for i = 0, imgsize[0]-1 do begin
for j = 0, imgsize[1]-1 do begin
jingxiang[i,-j] = imgfile[i,j]
endfor
endfor
WRITE_TIFF, tifffile, jingxiang
END
这样输出的图片是黑白的,下一步想要输出彩色图>_<
7. 实现彩色输出,把case 6的代码修改为:
6: BEGIN
ipos = STRPOS( mstruc.datfile, '.asc' )
tifffile = STRMID( mstruc.datfile, 0, ipos ) + '.tif'
WRITE_TIFF, tifffile,TVRD(True = 1)
;重新读入影像,进行镜像处理
imgfile = READ_TIFF(tifffile)
imgstatus = QUERY_IMAGE(tifffile, imageinfo)
imgsize = imageinfo.DIMENSIONS
jingxiang = INTARR(3,imgsize[0],imgsize[1])
for i = 0, imgsize[0]-1 do begin
for j = 0, imgsize[1]-1 do begin
jingxiang[*,i,-j] = imgfile[*,i,j]
endfor
endfor
WRITE_TIFF, tifffile, jingxiang
END
结果展示:
8. 在Main Menu下选2 - Fit Once,出现报错,指向
stocfit.pro中的g(*,i) = value / EXPON( datstruc.cont(ddx) )这句命令,
报错如下:
% Compiled module: STOCFIT.
% Compiled module: PGAUSS.
% Variable is undefined: VALUE.
% Execution halted at: STOCFIT 270 E:\MGM\mgm_idl\stocfit.pro
% MGM 57 E:\MGM\mgm_idl\mgm.pro
% $MAIN$
解决方法:
在CASE ipart1 OF中的case5中的第一行,加上以下代码:
mstruc.CONTYP = STRMID(mstruc.CONTYP, 0, 1)
修改完记得保存并编译STOCFIT.pro文件。
原因:修改之前的mstruc.CONTYP得出的结果是一个length达到50的字符串(以下),
'Q [POLYNOMIAL TYPE, Q IS STRAIGHT LINE IN ENERGY]'
让这个长达50的字符串去EQ ‘Q’或者其他字母,肯定返回的结果是0,所以哪个if condition都不会进,所以就会出现variable is undefined: VALUE 这个问题。以上代码的作用是将50个字符串定的第一个字符提取出来,即可以进入if condition语句。
----持续更新----