MGM(Modified Gaussian Model)模型在IDL 8.5环境下的运行错误总结及详细教程

2 篇文章 0 订阅

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语句。

----持续更新----

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值