地域密着型エリア広告配信リクルートの地域密着型広告ドコイク?アドネットワーク Ads by ドコイク?[無料でホームページを作成] [通報・削除依頼]
[無料でホームページを作成] [通報・削除依頼]

プログラミングの方法

 ここでは、学部4年生から大学院生M2及びD3までの方を対象に、第一原理計算コードのセットアップから、計算方法、結果の解釈、Fortran やC言語、pythonを用いた第一理計算のプログラミングからigor macroを用いた解析までを解説していきます。(社会人でもOK)
  下記のHPが非常に良い(lapackの使い方まで解説されている)。Lapackは日本語の書籍もあることは認識しておきたい。
  http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/tips/linux/fortran.html
下記も参照すると良い。
http://www.phys.keio.ac.jp/guidance/labs/riron/pdf/nosenote1.pdf 
http://www.phys.keio.ac.jp/guidance/labs/riron/pdf/nosenote2.pdf 
http://www.phys.keio.ac.jp/guidance/labs/riron/pdf/nosenote3.pdf 
http://ci.nii.ac.jp/naid/110002066105
http://tkkoba.blog.fc2.com/blog-category-1.html (多くの情報がある)
--------------------------------------------------------------------------------
■ 博士論文(D論)は卒業論文や修士論文と異なり、新規性があり、成功した成果を記さねばなりません。ここで重要になるのがプログラミングです。これができ ると第一原理計算から出力された結果を利用して種々の計算が可能になりますし、時間の短縮とミスの減少を成し遂げることができます。
◇ 最近 Fortran90/95に対して大変良い良書が出版された。下記である。
 藤井文夫ら『Fortran90/95 による有限要素法プログラミング』丸善出版
数年前に出版されていればここまで苦労しなかったのに・・・・・・。私の人生も少しは変わっていた。
 田口俊弘『Fortranハンドブック』技術評論社 はAkaiKKRの理解に役立つかもしれない。
--------------------------------------------------------------------------------
■ Linux OS上でソースコードを書くための便利な環境設定
  CentOS、Fedora, Ubuntuなどでのtext editorの場合
    1) view→Highlight Mode→Sources→Fortran 95を選択する
    2) Edit→Preference→Line Numbers のDisplay line numbersにチェックを入れる
    3) Edit→Preference→Right MarginのDisplay line marginにもチェックを入れる
    4) Edit→Preference→Font&ColorsのEditor fontで見やすいフォントと大きさを設定
  としておくと便利です。(Sourcesには他の言語に対するものもあります)
--------------------------------------------------------------------------------
■ エディタ
 使いやすいものとしては gedit, kwrite, kate, emacs, vi などがある。
  windowsに慣れているユーザーでは geditが使いやすい。
--------------------------------------------------------------------------------
■ Fortran及び理論計算のプログラム
※ WIEN2kのコードを見ていて思ったが、英文字に大文字と小文字の区別無しに記述されている部分がある。可読性という点からはあまり好ましくは無い。Frotran90/95では英文字での大文字と小文字が区別されないことにも注意しておきたい。

  下記の参考文献[1-11]を用いて、実際のFortranプログラムを勉学しながら計算コードを作成すると効率的に理解を深めることができます。ここでは、これらの参考文献を用いて、第一原理計算コードで要となるアルゴリズムやプログラムの解説を行います。
制御文は難しくないので、Fortranとしては、ファイルの読み書き、F90以降から追加された機能について説明します。
(編集中)

  理論計算で重要なアルゴリズム及びプログラムは以下になります。対角化は理論だけは理解して、ライブラリを活用するのが良いでしょう。

□ ベルレ法
(編集中)

□ 予測子修正子法
(編集中)

□ 大規模計算用のテクニック
(編集中)

□ ライブラリの活用
左欄にあるライブラリの設定を参照してください。

参考文献
[0] http://denki.nara-edu.ac.jp/~yabu/soft/fortran.html
[1] 日野理 著、『実践 量子化学計算プログラミング』、アドバンスソフト、(2010).
[2] 山口 憲  冨澤 一隆 著、『非平衡電子輸送論』、アドバンスソフト、(2011).
[3] 湊 明彦 著、『気液二相流の力学と数値解析入門』、アドバンスソフト、(2009).
[4] 岩沢美佐子、足立裕彦 著、『DV-X alpha法による電子状態計算-そのプログラムと解説』、三共出版、(1996).
[5] 渡辺力、名取亮、小国力監修、『Fortran77による数値計算ソフトウェア』、丸善
[6] E. Andersonら、小国力訳、『行列計算パッケージ:LAPACK利用の手引』、丸善
[7] http://www-aos.eps.s.u-tokyo.ac.jp/~takagi/f77-enshu/text/f77-20050419.pdf
[8] http://www-aos.eps.s.u-tokyo.ac.jp/~takagi/lecture/f90-enshu/text/f90-20090418.pdf
[9] http://www.mri-jma.go.jp/Project/mrinpd/coderule.html
[10] http://www.gfd-dennou.org/library/dcmodel/coding-rules/dcmodel-coding-rules.htm
[11] http://wind.geophys.tohoku.ac.jp/nonhydro/workshop/third/draft/3_toyoda.pdf 
[12] http://www-aos.eps.s.u-tokyo.ac.jp/~takagi/lecture/f90-enshu/index.html
[13] http://www.jamstec.go.jp/esc/simschool/f90learning/
--------------------------------------------------------------
■ 64 bit 計算が出来ない場合

□ コンパイル オプションでの問題
・ windows OS の場合 : 下記参考文献 [1] を参照
  Fortran のソースコードにおいて大きなメモリが必要となる配列をCOMMON文からallocate 文に書き換える。
 (intel fortran compiler ではこれが重要)

・ Linux OS の場合 : 下記参考文献 [2-6] を参照
  -mcmodel=large や -m64 などのオプションを追加して下さい。
  ifort -mcmodel=large -o case.f case
  ifort -mcmodel=large -i-dynamic -o case.f case
  ifort -shared-intel -mcmodel=large -o case.f case
  gfortran -m64 -o case.f case

□ メモリ使用制限の問題 [7]
  Linux OS では下記のように対処する方法がある
  ulimit -a で max memory size が unlimited であるかを確認
  メモリ使用量を無制限にするには、ulimit -m unlimited とする。計算用のPCであれば、.bashrc に下記を記入しておいても良いだろう。
  ulimit -s unlimited
  ulimit -v unlimited
  ulimit -m unlimited

References
[1] http://www.softek.co.jp/SPG/Pgi/TIPS/opt_64.html
[2] http://www.hpc-technologies.co.jp/qa/QA-dev.html
[3] http://club-hpc.com/index.php/Intel%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%83%BC (Fortranの移植性を参考)
[4] http://webcache.googleusercontent.com/search?q=cache:910edLiiPoYJ:gfate.iobb.net/~kawai/mv/fate/guidej.html+ifort+64bit+compile&cd=25&hl=ja&ct=clnk&gl=jp&source=www.google.co.jp
[5] http://www2.kobe-u.ac.jp/~lerl2/usage_ifort90.html
[6] http://kekcc.kek.jp/service/cc/uguide/04.compile.html
[7] http://www.atmarkit.co.jp/flinux/rensai/linuxtips/537memulimit.html
[8] http://mvs.icc.ru/documentation/intel/f_ug1/ug1l_rt_errors.htm
[9] http://www.xlsoft.com/jp/products/intel/compilers/fcl/10.1/Release_Notes.htm
[10] http://www.geocities.co.jp/Technopolis/4765/INTRO/parallel4.html
[11] http://jp.xlsoft.com/documents/intel/compiler/527J-001.pdf
[12] http://wwweic.eri.u-tokyo.ac.jp/computer/manual/altixuv/doc/Compiler/fort/jp_lnx_fortdocs11.1.tar/Documentation/ja_JP/compiler_f/main_for/optaps/common/optaps_par_openmp_using.htm [13] http://wwweic.eri.u-tokyo.ac.jp/computer/manual/altixuv/doc/Compiler/fort/jp_lnx_fortdocs11.1.tar/Documentation/ja_JP/compiler_f/main_for/optaps/common/optaps_par_var.htm [14] http://cs.nyu.edu/courses/fall10/G22.2945-001/slides/lect3-4.pdf
--------------------------------------------------------------
■ Linuxのファイル
/usr/bin :一般的なコマンドが格納されているファイル
/usr/sbin :システム管理コマンドが格納されているファイル
/usr/local/bin :ユーザーがコンパイルするなどしてインストールした一般的なコマンド
/usr/local/sbin :ユーザーがコンパイルするなどしてインストールした管理コマンド
[1] http://heberekemaruhunihun.blog77.fc2.com/blog-entry-488.html
[2] http://what-linux.seesaa.net/article/140980754.html
--------------------------------------------------------------
■ 自作のプログラムをコマンド化する方法
ln -s 自作プログラムのアドレス /usr/local/bin/自作プログラム動作のために名付けたいコマンド名
--------------------------------------------------------------
■ 目を通しておくべき文献
[1] 伊理正夫、藤野和建、「数値計算の常識」、共立出版株式会社
[2] 杉江日出澄ら、「FORTRAN 77 による数値計算法」、培風社
[3] 森正武、「FORTRAN77数値計算プログラミング」、岩波書店
[3] 渡部力ら、「Fortran77による数値計算ソフトウェア」、丸善
[4] 小国力 訳、「LAPACK利用の手引」、丸善株式会社
[5] 牛島省、「OpenMPによる並列プログラミングと数値計算法」、丸善
--------------------------------------------------------------

□ Makefile (Fortran)
--------------------------------------------------------------
FC = gfortran
FFLAGS = -O2
LIBS = -L/usr/lib -lblas -llapack -llapack95

prog : main.o sub1.o
$ (FC) $ (FFLAGS) -o prog main.o sub1.o $ (LIBS)
main.o : main.f
$ (FC) $ (FFLAGS) -c main.f
sub1.o : sub.f
$ (FC) $ (FFLAGS) -c sub1.f
--------------------------------------------------------------
-c : コンパイルのみ
-o : 出力ファイルに名前を付ける
-L : ライブラリの存在するディレクトリの指定
-l : 使用するライブラリを指定(-l の後に、ライブラリの名称を記入)
prog : やmain.o : の次の行にある$(FC)の前に TAB を入れておく必要がある。

example (Makefile)
--------------------------------------------------------------
#FC= gfortran
#FFLAGS= -Wall -pedantic -std=f95 -fbounds-check -O \
#  -Wuninitialized -ffpe-trap=invalid,zero,overflow -fbacktrace \
#  -g -free -m64
FC=ifort
FFLAGS= -O2
#FFLAGS= -O2 -check all -warn all -std -fpe0 -traceback -g
#LIBS = -L/usr/lib -lblas -llapack -llapack95
#LIBS=
#INCLUDE=
#OBJS= makethhrklist.o makethhrinput.o calcthhr.o calcnfehr.o
EXE= makethhrklist makethhrinput calcthhr calcnfehr

all: makethhrklist makethhrinput calcthhr calcnfehr
makethhrklist: makethhrklist.f90
    $(FC) $(FFLAGS) -o makethhrklist makethhrklist.f90
#makethhrklist.o : makethhrklist.f90
#    $(FC) $(FFLAGS) -c makethhrklist.f90

makethhrinput: makethhrinput.f90
    $(FC) $(FFLAGS) -o makethhrinput makethhrinput.f90
#makethhrinput.o : makethhrinput.f90
#    $(FC) $(FFLAGS) -c makethhrinput.f90

calcthhr: calcthhr.f90
    $(FC) $(FFLAGS) -o calcthhr calcthhr.f90
#calcthhr.o : calcthhr.f90
#    $(FC) $(FFLAGS) -c calcthhr.f90

calcnfehr: calcnfehr.f90
    $(FC) $(FFLAGS) -o calcnfehr calcnfehr.f90
#calcnfehr.o : calcnfehr.f90
#    $(FC) $(FFLAGS) -c calcnfehr.f90

clean:
     -rm -f $(EXE) *.o *.mod
--------------------------------------------------------------
Reference:
http://d.hatena.ne.jp/cmphys/20120601/1338539221
http://www.creatology.jp/unix/make.html
--------------------------------------------------------------------------------
■ C言語
(編集中)

参考文献
[1] 益田 誠也 著、『0からはじめるプログラミングの基礎:C言語で作るプログラムの考え方』、テクノプレス、2002.
[2] 宝剱 純一郎 著、『図解C言語プログラミングの仕組みと書き方:初心者でも必ずかわる本格的入門書』、メディア・テック出版、2002.
[3] William H.Press 著、『ニューメリカルレシピ・イン・シー:C言語による数値計算のレシピ』、技術評論社、1993.
[4] 日向 俊二 著、『C/C++プログラミング辞典:すぐに役立つ!』、翔泳社、2002.
[5] 『NIKKEI SOFTWARE』、 2011年3月号
[6] http://nlp.nagaokaut.ac.jp/C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80
[7] http://www.cis1.c.dendai.ac.jp/c_master/C_15.htm
[8] http://densan-labs.net/tech/clang
[9] http://www.kumei.ne.jp/c_lang/
[10] http://atom.rye.tama.ac.jp/~stock/cgengo/04ctext2/04ctext2.html
[11] http://www.optic.or.jp/kaiseki-shien-net/0main-page/newpage2/mini-chishiki/mini-teramoto1.pdf 
  4年くらい前だが、タンパク質を扱っている方(構造解析用の新しいプログラムを必要とするプロジェクトだと思う)がVisual C++を扱える博士号取得者が欲しいという求人を聞いたことがある。余裕があればVisual C++も勉強しておきたい。上記の参考文献の他に下記も参考にすると良いだろう。
[12] 林晴比古、『Visual C++ 2005』、SofBank Creative.
[13] 『Visual C++ 逆引き大全』、秀和システム
[14] 日経ソフトウェア 2002年6月号

□ Makefile (C言語)
--------------------------------------------------------------
CC = gcc
CFLAGS = -O2
LIBS = -lm

prog : main.o sub1.o
$ (CC) $ (CFLAGS) -o prog main.o sub1.o $ (LIBS)
main.o : main.f
$ (CC) $ (CFLAGS) -c main.c
sub1.o : sub.f
$ (CC) $ (CFLAGS) -c sub1.c
--------------------------------------------------------------
-c : コンパイルのみ
-o : 出力ファイルに名前を付ける
prog : やmain.o : の後の行はTABで始める必要がある
--------------------------------------------------------------------------------
■ バッチファイル(windows)

□ case.bat
--------------------------------------------------------------
@echo off
echo data transport
if exist A.txt goto B
:B
  copy A.txt C.txt
  echo copy A.txt to C.txt

  move A.txt D.txt

  echo end data >> D.txt

  del E.txt
  echo delete E.txt

  prog
:end
--------------------------------------------------------------
  上記のバッチファイルはA.txtファイルが存在していたら、A.txtをC.txtにコピーして、A.txtをD.txtに変え、D.txtの最後に new dataと書き加え、E.txtを削除して、progというプログラムを動作させるものである。Fortranではwrite文でのFileの最後の読み 取りが上手くいかない場合があるので、このようにして最後の行を指定して処理することができる。
このようなバッチファイルを使えば、Winmostarなどで得られたcase.xyzファイルを、他のプログラムで利用可能な入力ファイルに書き換えるなどが容易に出来るようになる。また、複数のプログラムを動作させたりすることも可能なので応用範囲は広い。

--------------------------------------------------------------------------------
■ C++
(編集中)
[1] http://www7b.biglobe.ne.jp/~robe/cpphtml/
[2] http://www7b.biglobe.ne.jp/~robe/
[3] ロベール、「ロベールのC++入門講座」、毎日コミュニケーションズ
--------------------------------------------------------------------------------
■ シェルスクリプト(Linux or Mac OS)

□ bash
--------------------------------------------------------------
#! /bin/sh
echo 'data transport'
if [ ! -e A.txt ]; then
  echo 'not exist A.txt'
fi

cp A.txt to C.txt
echo copy A.txt to C.txt

mv A.txt D.txt

rm E.txt
echo remove E.txt

prog
--------------------------------------------------------------
  上記のスクリプトはA.txtファイルが存在していたら、A.txtをC.txtにコピーして、A.txtをD.txtに変え、D.txtの最後にnew dataと書き加え、E.txtを削除して、progというプログラムを動作させるものである。

□ cash
--------------------------------------------------------------
#! /bin/csh -f
if !( -d SCF_DATA ) then
  mkdir SCF_DATA
endif
set file = `pwd`
set file = $file:t
set filename = $file'_scf_'
if ( -e $filename.dos1eV ) then
  cp $filename.dos1eV ./SCF_DATA/$filename.dos_data
endif
if ( -e $filename.spaghetti  ) then
  cp $filename.spaghetti  ./SCF_DATA/$filename.band_data
endif
echo '-' >> ./SCF_DATA/$filename.dos_data
prog
--------------------------------------------------------------
  上記のスクリプトはSCF_DATAフォルダが存在していなかったら、SCF_DATAフォルダを作成して、カレントディレクトリの名前を読み取り、それ に_scf_を付け加える。.dos1eVとspaghettiというファイルがあれば、SCF_DATAにカレントディレクトリの名前 + .dos_data及び.band_dataとしてそれぞれコピーする。そして、カレントディレクトリの名前 + .dos_dataの中身の最後の行に - を加えて、progというプログラムを動作させるものである。

□ cash(調査中)
--------------------------------------------------------------
#! /bin/csh -f
date
pwd

set XX=-FP
set list=( 1000000 1010000 11100000 1111000 1111100 )
echo $#list

foreach No ( ${list} )
echo ${No}
  if !( -e AAAA${XX}.ins) then
    echo "AAAA"${XX}".ins not exists"
  else
    sed ''${1 s/1110000/${No}/g' "AAAA"${XX}".ins > new1.ins
    sed ''${2,3 s/1110000/${No}/g' new1.ins > new2.ins
    object.exe
    sed ''${1 s/${No}/1110000/g' new2.ins > new3.ins
    sed ''${2,3 s/${No}/1110000/g' new3.ins > "AAAA"${XX}".ins
  endif
end

foreach No ( ${list} )
echo ${No}
  grep "Total Energy" "AAAA"${XX}".ins | awk '{print $1}'
end
--------------------------------------------------------------
[1] http://homepage3.nifty.com/tamekichi/cshell1.htm
[2] http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2001/2001-06-25/
[3] http://d.hatena.ne.jp/bonlife/20060203/1138958036
[4] http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1217798252

--------------------------------------------------------------------------------
■ Python
 python(パイソン)の利点は、コンパイルが不要(確認中)なことである。FortranやC言語であれば、コンパイルの作業が必要になるので、 コードだけを渡しても手間が必要になり、プログラム未経験の人には小さな障害になりやすいが、pythonではその心配がない。引数は「ひきすう」と読 む。
1. 文頭は下記のように記述する。sys,math はモジュールで標準ライブラリを使えるようにしている。「from numpy import *」は多次元配列を用いるために記述する。
#!/usr/bin/python
import sys,math
from numpy import *
2. 三次元配列の場合は、文献[4]を参考にすると良い。
3. pythonはインデント(空白やTabの個数)でブロック(ifやfor, while文などの範囲)を分けている。

Error [5] (いまのところよく私が遭遇したエラー)
1. SyntaxError: 多くの場合、クオーテーションや括弧の対応が取れていない場合やインデントが正しく行われていない。
2. IndentationError: インデントが正しく行われていない。
3. NameError: 未定義の変数(や関数、モジュール)などを参照または代入したときに表示される。
4. IndexError: インデックスがリストの要素数に収まっていないときに表示される。
5. ZeroDivisionError: 数値を0で割ろうとしたときに表示される。
参考文献
[1] 柏野 雄太、 小松 亮介、 穂苅 実紀夫 著、『実践python : 文字列操作からWebアプリケーション開発まで』、ディー・アート、2006.
[2] http://d.hatena.ne.jp/dplusplus/20100126/p1
[3] http://d.hatena.ne.jp/niam/20110827 
 上記HPで危惧されているように、python 2.7 32bit 版を選択しないと、python 2.7 にリンクしてくれない。
[4] python 3次元配列の作り方:http://pyansblog.blogspot.jp/2011/12/blog-post_05.html 
[5] 柴田淳、「みんなのPython」、第3版、ソフトバンククリエイティブ
--------------------------------------------------------------------------------
■ Perl
[1] http://d.hatena.ne.jp/perlcodesample/20091226/1264257759
--------------------------------------------------------------------------------
■ HTML
  改行:
( XHTML及びXMLでは
)
(編集中)
--------------------------------------------------------------------------------
■ wxWidgets
(編集中)
--------------------------------------------------------------------------------
■ Excel VBA
(編集中)
[1] http://d.hatena.ne.jp/nattou_curry_2/20100129/1264787849
[2] http://excelvba.pc-users.net/
[3] http://www.asahi-net.or.jp/~zn3y-ngi/YNxv239.html
[4] http://www.eurus.dti.ne.jp/yoneyama/Excel/Exl-_zen.htm
--------------------------------------------------------------------------------
■ LabVIEW
  無料のセミナーが開催されているので参加すると良い。データ取得用の装置は性能によるが、最低2-3万円程度で購入できる。また、デモ機も貸し出しているので交渉してみると良い。成功すれば教官にもっとよいものを購入してもらおう。
  無料のセミナーでは、取得している間のデータをグラフで表示でき、測定終了後に結果をtxtやcsv形式で保存する方法が容易に覚えられる。Excelでは途中でグラフが表示できないものでもLabVIEWだと可能にできる。
--------------------------------------------------------------------------------
■ Igor (基礎編)
□ グラフの大きさの固定
1) グラフを二回クリックする。
2) 余白に値を入力。幅モードと縦モードを固定幅にして値を入力する。
3) グラフの設定を保存する(とりあえず全部にチェックを入れておけばよいだろう)。
□ グラフの修正
1) 縦軸を二回クリックする。
2) 「軸」
  a) 「離す」のチェックを外す。
  b) 「反対」をオン。
  c) 「フォント」を Arial にする。
  d) フォントのサイズを 14 〜 16 程度にする。
3) 「目盛とグリッド」
  a) 「位置:」を内側にする。
4) 「軸ラベル」
    Intensity / arb. units など、必要な事項を入力する。
5) 以上を横軸に対しても同様に行う。
□ コマンドウインドウ(「名称未設定」など)に式を入れると簡単な計算が可能になる。
a) A := B + C とすると、 従属関係が構築され、BやCの値を変えると、自動的に A の値が変わるようになる。
b) 電卓として用いたい場合は、コマンドウインドウ(「名称未設定」など)で、print と入力した後に、式を入力する。例 print 25*40
c) 全ての行った行動は、コマンドウインドウに表示される。これをコピー&ペーストすると別のグラフでもほとんどのコマンドが同じように動作する。
--------------------------------------------------------------------------------
■ Igor macro(基礎編)
1) 「データ(D)」→「Data Browser」
2) 「Data Browser」にて、「New Folder...」で新しい名称のファイルを作成する。
3) 右側にある矢印を好きなフォルダに移動させる。
4) 「Browse Expt...」を押して、過去に作成したファイルを開く。
5) 右側に過去に作成したファイルのデータがあるので、必要なものを左側に移動させる。
6) よく使うコマンドは、コマンドウインドウ(「名称未設定」など)に表示される。ここで、赤線の上の部分で必要なものをメモ帳やプロシージャなどにコピーしておいて、赤線の下にペーストすれば、同じ動作を簡単に行うことができる。
--------------------------------------------------------------------------------
■ Igor macro(初級編)
1) 「ウインドウ(W)」→「新規(N)」→「パネル(A)」
2) Panel0 を右クリックして「背景をコントロール」を選択し、好きな色に変えることができる。
3) 「パネル(P)」→「コントロールを追加(A)」→「ボタンを追加(B)」
4) 「パネル(P)」→「ツールを表示(T)」
  a) 左側の二番目を選択し、上記3)で作成したボタンなどをクリックして好きな場所に移動。
  b) 二回クリックすると編集ができる。新規プロシージャを作成する。
  c) パネルを利用するタイプのものに戻す場合は、左側の一番目を押す。
5) 通常良く使う動作を行って、(基礎編)で勉強したように、コマンドをメモっておく。
6) 「ウインドウ(W)」→「プロシージャウィンドウ(P)」にて、よく使うコマンドをコピー&ペーストする。
7) ボタンを押せば動作する。
--------------------------------------------------------------------------------
■ Igor macro(中級編)
下記を参考にするのがよい。大事なこととして、Igorはコマンドラインの合計の長さが400文字に制限されており、行継続記号が無い。
http://www.ppl.k.u-tokyo.ac.jp/saito/etc.html
http://www.nips.ac.jp/huinfo/documents/IGOR/igor01.html
http://nps.sakura.ne.jp/sf/Igor/Igor1.htm
http://www.pme.kit.ac.jp/annex/archives/igor_pro/
http://www.cm.kj.yamagata-u.ac.jp/atom11archive/res/mac/mes/igor_ni.html
http://www.hulinks.co.jp/support/igor/index.html 
http://burggarten.ddo.jp/~tomo/blog/?p=1019
http://payam.minoofar.com/igor/
http://geo.shunpike.info/jpsj/06702/067020038.pdf
http://dora.bk.tsukuba.ac.jp/~takeuchi/index.php?%A5%BD%A5%D5%A5%C8%A5%A6%A5%A7%A5%A2%2FIgor%2F%A5%B7%A5%B9%A5%C6%A5%E0%A4%CE%B4%F0%CB%DC
http://mikaka.org/~kana/dl/pdf/pdf-igor.pdf

Mac の場合は下記のHPを参照すると良い。LEEDやRHEEDを行う学生も目を通しておくと良い。
http://surfphys.tagen.tohoku.ac.jp/pages/HowToUseIgor/HowToUseIgor.pdf
粉末X線回折の場合は下記HPを参照すると良い。
http://www.crl.nitech.ac.jp/~ida/index-j.html
画像の処理では下記が参考になる。
http://dora.bk.tsukuba.ac.jp/~takeuchi/index.php?%A5%BD%A5%D5%A5%C8%A5%A6%A5%A7%A5%A2%2FIgor%2F%A5%B0%A5%E9%A5%D5%B4%D8%CF%A2

□ Table表示
---------------------------------------------------
Macro xxxxx()
  Make/T/O text    // define a text data
  Make/O wave    // define a wave data
  text[0] = "First data"
  text[1] = "Second data"
  wave[0] = 100
  wave[1] = 200
  Edit text, wave    // show a table
EndMacro
---------------------------------------------------
   上記は、マクロ(M)の中にxxxxx という名称のマクロが出来る。Make/T でテキストを、Makeでウェーブを定義して、その具体的な値をwave[0]=100 などで指定している。これらのMakeの後の/Oは上書きの意味。Editは表を示す。このマクロを利用すると、常に初期値を表として出力できるようにな る。フィッティングやデータのメモとして利用できる。

□ データを受け渡して処理するマクロ
---------------------------------------------------
Macro xxxxx( var1, var2 )
  Variable var1, var2
  Prompt var1, "Enter the First data number (1< var1 <=99)"
  Prompt var2, "Enter the Last  data number (2< var2 <= 100)"
  Make/N=100/O sign_data    // define a wave data
  Make/N=100/O BG_data    // define a wave data
    calculation( var1, var2, sign_data, BG_data )
  Edit sign_data,  BG_data   // show a table
EndMacro

Funciton calculation( var1, var2, sign_data, BG_data )
  Variable var1, var2
  Variable i, k_first, k_last, BG_sum_data
  Wave sign_data, BG_data
  k_last = 0.2
  do
k_first = k_last
    BG_sum_data = 0
    for ( i=var1; i<=var2; i +=1 )
      BG_data[i] = k_first* (sign_data[i] - sign_data[var1] - BG_data[i])
      BG_sum_data += BG_data[i]
      BG_data[i] = BG_sum_data
    endfor
    k_last = k_first * (sign_data[var2] - sing_data[var1]) / BG_data[var2]
  while( abs( k_first - k_last ) >0.0001 )
  return sign_data
  return BG_data
End
---------------------------------------------------
  上記のMacroではVariableでver1とver2が数値変数であると宣言しています。次に、ver1とver2に数値を入れるようにさせ、 Functionによってユーザー側で定義した下記にある関数calculationに移ります。関数内で必要となる数値変数とウェーブをそれぞれ VariableとWaveで定義しています。k_last=0.2とBG_sum_data=0で初期の値を設定しています。do〜while間は whileの後の()の中が真のとき繰り返されます。その中にabs()とあるのは、()の値を絶対値にするという意味です。つまり、(k_first - k_last)の絶対値が0.0001を超えている間はdo〜while間を繰り返すという意味になります。次のfor〜endfor間は、初めにiを var1にし、for〜endfor間を繰り返す毎にiを1ずつ足していき(i += x はi = i + 1と同じ意味)、iがver2を超えるまで繰り返すことを指定しています。さらにその中では、sign_data [i]からsing_data[var1]とBG_data[i]を引いた結果にk_firstを掛けて、新しいBG_data[i]としています。次に BG_sum_dataにBG_dataの値を加算し、BG_data[i]にこれまで加算されてきたBG_sum_dataの値が入れられます。 for〜endforの繰り返しが終わるとvar2番目のデータと比較し、k_lastの値を調節します。do〜whileを抜けると、Macroに sing_dataとBG_dataの値を返します。最後に、結果が表として出力されます。
上記を参考にすれば、XPSなどでのデータでBGを差し引くマクロを作成することができます。これらは学部3〜4年生が数週間程度で行う課題に丁度良いでしょう。
---------------------------------------------------

□ 複数のデータがある場合の一括処理のさせ方
---------------------------------------------------
Macro Series_Analysis ( First_wave_number, Last_wave_number )
  Variable First_wave_number = 0    // Set a initial data
  Variable Last_wave_number = 21  // Set a initial data
  Prompt First_wave_number, "Enter the First wave number"   // Input data
  Prompt Last_wave_number, "Enter the Last wave number"   // Input data
  Make/N=100/O sign_data   // Make a wave data
  Make/N=100/O BG_data   // Make a wave data
  Variable var1, var2
  Prompt var1, "Enter the First data number (1< var1 <=99)"    // Input data
  Prompt var2, "Enter the Last data number (2< var2 <= 100)"    // Input data
  Series_calculation( First_wave_number, Last_wave_number, var1, var2, sign_data, BG_data )
  Edit sign_data, BG_data    // Edit a table
EndMacro

Function Series_calculation( First_wave_number, Last_wave_number, var1, var2, sign_data, BG_data )
  Variable i, var1, var2
Wave sign_data, BG_data 
  String sign_wave_name, BG_wave_name
  for( i= First_wave_number; i <= Last_wave_number ; i += 2 )
    sing_wave_name = "wave" + num2istr(i)
    BG_wave_name = "wave" + num2istr(i+1)
    calculate( var1, var2, sign_wave_name, BG_wave_name )
    Display $sign_wave_name, $BG_wave_name    // Edit graph
  Endfor
End
---------------------------------------------------
  上記は、wave1から順にデータを取り込んで、処理していくマクロになる。上記までを参考にすれば、様々なデータを連続的に処理することができるだろ う。ちなみに、x軸のデータがある場合は、Display y軸方向のwave名 vs x軸方向のwave名 で表示させることができる。複製はDuplicate文があるのでそれらも活用するとよい。

□ BoltzTraPからのcase.traceから 特定の温度ときのゼーベック係数と化学ポテンシャルに対するグラフを描画するマクロ
---------------------------------------------------

#pragma rtGlobals=1  // Use modern global access method.
// ver.1.10

Macro seebeck_panel()

NewPanel/W=(0, 0, 180, 190)

Button button0 proc=ButtonProc_1
Button button0 title="change name",proc=ButtonProc_1
SetDrawEnv fsize= 14
Button button0 size={150,20}
Button button0 pos={15,3}

SetVariable setvar0 proc=SetVarProc,limits={-inf,inf,0},fSize=14
SetVariable setvar0 value= _NUM:0
SetVariable setvar0 size={70,20}
SetVariable setvar0 pos={55,30}

DrawText 25,45,"Ef ="
SetDrawEnv fsize= 14

DrawText 130,45,"Ry"
SetDrawEnv fsize= 14

PopupMenu popup0 proc=PopMenuProc
PopupMenu popup0 value="50;100;150;200;250;300;350;400;450;500;550;600;650;700;750;800;850;900;950;1000"
PopupMenu popup0 fSize=14
PopupMenu popup0 pos={120,55}

DrawText 15,70,"Temperature [K]"
SetDrawEnv fsize= 14

Button button1 title="S - μ relation",proc=ButtonProc
SetDrawEnv fsize= 14
Button button1 size={100,30}
Button button1 pos={60,80}

Button button2 title="series",proc=ButtonProc_2
SetDrawEnv fsize= 14
Button button2 size={150,20}
Button button2 pos={15,115}

SetDrawEnv fsize= 14
DrawText 25,155,"μ ="

SetVariable setvar1 proc=SetVarProc_1,limits={-inf,inf,0}
SetVariable setvar1 value= _NUM:0
SetVariable setvar1 size={50,15}
SetVariable setvar1 pos={60,140}

Button button3 title="plot",proc=ButtonProc_3
Button button3 size={50,20}
Button button3 pos={115,138}

Button button4 proc=ButtonProc_4
Button button4 title="series plot"
Button button4 size={70,20}
Button button4 pos={55,165}
Button button4 fSize=14

End

// convert Ry to eV and change name
Function ButtonProc_1(ba) : ButtonControl
 STRUCT WMButtonAction &ba

 switch( ba.eventCode )
  case 2: // mouse up
   // click code here
   WAVE wave0, wave1, wave2, wave3, wave4, wave5, wave6, wave7, wave8, wave9
   // rename
   Rename wave0,Ef_Ry; Rename wave1,T_K; Rename wave2,N; Rename wave3,DOS_Ef
   Rename wave4,Seebeck; Rename wave5,S_t; Rename wave6,R_H; Rename wave7,kappa0
   Rename wave8,c; Rename wave9,chi
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

// read non_dope_EF
Function SetVarProc(sva) : SetVariableControl
 STRUCT WMSetVariableAction &sva

 switch( sva.eventCode )
  case 1: // mouse up
  case 2: // Enter key
  case 3: // Live update
   Variable dval = sva.dval
   String sval = sva.sval
   Variable/G Ef_non_dope
   Variable Num_of_Wave
   WAVE Ef_Ry
   Num_of_Wave = DimSize(Ef_Ry,0)
   Make/O/N=(Num_of_Wave) Ef_eV
   Ef_non_dope = dval
   Ef_eV = (Ef_Ry - Ef_non_dope)*13.602
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

// set extacting temperature
Function PopMenuProc(pa) : PopupMenuControl
 STRUCT WMPopupAction &pa

 switch( pa.eventCode )
  case 2: // mouse up
   Variable popNum = pa.popNum
   String popStr = pa.popStr
   Variable/G temp
   temp = str2num (popStr)
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End


// run bottun
Function ButtonProc(ba) : ButtonControl
 STRUCT WMButtonAction &ba

 switch( ba.eventCode )
  case 2: // mouse up
   // click code here
   NVAR temp
   print  "extract the", temp,"K data from the case.trace"
   sub_extract(temp)
   ModifyGraph width=0,height=0
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End


// main routine
Function sub_extract(temp_K)
  Variable temp_K
  WAVE Ef_eV, T_K, N, DOS_Ef, Seebeck, S_t, R_H, kappa0, c, chi
 
  Variable Num_of_Wave, i, j
  Num_of_Wave = DimSize(T_K,0)
  Make/N=(Num_of_Wave) Shifted_Ef_tempo, Seebeck_at_Shifted_Ef_tempo
 
  i = 0; j = 0
  do
    if ( T_K[i] == temp_K )
      Shifted_Ef_tempo[j] = Ef_eV[i]
      Seebeck_at_Shifted_Ef_tempo[j] = Seebeck[i]
      j = j + 1
    endif
    i = i +1
  while ( i < DimSize(T_K,0) )
 
  String name_of_wave
  name_of_wave =  "Seebeck_at_" + num2str(temp_K) + "_K"
  Make/O/N=(j) Shifted_Ef, $name_of_wave
  Wave Seebeck_at_Shifted_Ef = $name_of_wave

  Shifted_Ef = Shifted_Ef_tempo
  Seebeck_at_Shifted_Ef = Seebeck_at_Shifted_Ef_tempo * 10^6
 
  Display  Seebeck_at_Shifted_Ef vs Shifted_Ef
 
  //setting graph
  ModifyGraph tick=2,mirror=1,fSize=14,standoff=0,font="Arial"
  Label left "\\Z14\rSeebeck coefficients / \\F'Symbol'm\\F'Arial'V\\S-1"
  ModifyGraph tick(bottom)=2,mirror(bottom)=1,fSize(bottom)=14,standoff(bottom)=0
  ModifyGraph font(bottom)="Arial"
  Label bottom "\\Z14\\F'Symbol'm\\F'Arial' / eV"
  SetAxis bottom -2,2
  ModifyGraph margin(left)=57
  ModifyGraph margin(bottom)=43
  ModifyGraph width=340.157,height=226.772
  Legend/C/N=text0/F=0/B=1/A=MC/X=30.00/Y=40.00
 
  KillWaves Shifted_Ef_tempo, Seebeck_at_Shifted_Ef_tempo
 
End

// series
Function ButtonProc_2(ba) : ButtonControl
 STRUCT WMButtonAction &ba

 switch( ba.eventCode )
  case 2: // mouse up
   // click code here
     Variable temp_K
     temp_K = 100
     sub_extract(temp_K)
     for ( temp_K=200; temp_K<=800; temp_K+=100)
       sub2_extract(temp_K)
     endfor
     ModifyGraph rgb(Seebeck_at_200_K)=(65280,21760,0)
     ModifyGraph rgb(Seebeck_at_400_K)=(40960,65280,16384)
     ModifyGraph rgb(Seebeck_at_500_K)=(0,52224,0)
     ModifyGraph rgb(Seebeck_at_600_K)=(0,65280,65280)
     ModifyGraph rgb(Seebeck_at_700_K)=(0,0,65280)
     ModifyGraph rgb(Seebeck_at_800_K)=(29440,0,58880)
     Legend/C/N=text0/F=0/B=1/A=MC/X=30.00/Y=25.00
     ModifyGraph width=0,height=0
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

//second main
Function sub2_extract(temp_K)
  Variable temp_K
  WAVE Ef_eV, T_K, N, DOS_Ef, Seebeck, S_t, R_H, kappa0, c, chi
 
  Variable Num_of_Wave, i, j
  Num_of_Wave = DimSize(T_K,0)
  Make/N=(Num_of_Wave) Shifted_Ef_tempo, Seebeck_at_Shifted_Ef_tempo
 
  i = 0; j = 0
  do
    if ( T_K[i] == temp_K )
      Shifted_Ef_tempo[j] = Ef_eV[i]
      Seebeck_at_Shifted_Ef_tempo[j] = Seebeck[i]
      j = j + 1
    endif
    i = i +1
  while ( i < DimSize(T_K,0) )
 
  String name_of_wave
  name_of_wave =  "Seebeck_at_" + num2str(temp_K) + "_K"
  Make/O/N=(j) Shifted_Ef, $name_of_wave
  Wave Seebeck_at_Shifted_Ef = $name_of_wave

  Shifted_Ef = Shifted_Ef_tempo
  Seebeck_at_Shifted_Ef = Seebeck_at_Shifted_Ef_tempo * 10^6
 
  AppendToGraph  Seebeck_at_Shifted_Ef vs Shifted_Ef
 
  KillWaves Shifted_Ef_tempo, Seebeck_at_Shifted_Ef_tempo
End

//
Function SetVarProc_1(sva) : SetVariableControl
 STRUCT WMSetVariableAction &sva

 switch( sva.eventCode )
  case 1: // mouse up
  case 2: // Enter key
  case 3: // Live update
   Variable dval = sva.dval
   String sval = sva.sval
   Variable/G mu =  dval
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

// S - K plot
Function ButtonProc_3(ba) : ButtonControl
 STRUCT WMButtonAction &ba

 switch( ba.eventCode )
  case 2: // mouse up
   // click code here
   NVAR mu
   sub3_extract(mu)
   ModifyGraph width=0,height=0
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

//third main
Function sub3_extract(mu)
  Variable mu
  WAVE Ef_eV, T_K, N, DOS_Ef, Seebeck, S_t, R_H, kappa0, c, chi
 
  Variable Num_of_Wave, i, j, k, num_of_temp
  Variable mu_low, mu_high
  Num_of_Wave = DimSize(T_K,0)
  Make/N=(Num_of_Wave) K_tempo, Seebeck_for_K_tempo
 
  i = 0; j = 0; k = 0
  do
    if ( Ef_eV[i] <= mu && mu <= Ef_eV[i+1] )
      mu_low = Ef_eV[i]
      mu_high = Ef_eV[i+1]
      do
        k = k + 1
      while ( T_K[i-k] < T_K[i-k+1] )
      num_of_temp = k
      for(k=0;k         K_tempo[k] = T_K[i+k+1]
        Seebeck_for_K_tempo[k] = (Seebeck[i+k+1] - Seebeck[i-num_of_temp+k+1]) * (mu - mu_low) / ( mu_high - mu_low ) +  Seebeck[i-num_of_temp+k+1]
        //print  T_K[i+k+1], T_K[i-num_of_temp+k+1]
        //print  Seebeck[i+k+1], Seebeck[i-num_of_temp+k+1]
      endfor
      break
    endif
    i = i +1
  while ( i < (DimSize(T_K,0) -1) )
 
  String name_of_wave
  name_of_wave = "Seebeck_at_" + num2str(mu) + "_eV"
  Make/O/N=(num_of_temp) temp_K, $name_of_wave
  Wave Seebeck_for_K = $name_of_wave

  temp_K = K_tempo
  Seebeck_for_K = Seebeck_for_K_tempo * 10^6
 
  Display  Seebeck_for_K vs temp_K
 
  //setting graph
  ModifyGraph mode=4,marker=19,msize=4
  ModifyGraph tick=2,mirror=1,fSize=14,standoff=0,font="Arial"
  Label left "\\Z14\rSeebeck coefficients / \\F'Symbol'm\\F'Arial'V\\S-1"
  ModifyGraph tick(bottom)=2,mirror(bottom)=1,fSize(bottom)=14,standoff(bottom)=0
  ModifyGraph font(bottom)="Arial"
  Label bottom "\\Z14\\F'Arial'Temperature / K"
  SetAxis bottom 50,800
  ModifyGraph margin(left)=57
  ModifyGraph margin(bottom)=43
  ModifyGraph width=340.157,height=226.772
  Legend/C/N=text0/F=0/B=1/A=MC/X=30.00/Y=40.00
 
  KillWaves K_tempo, Seebeck_for_K_tempo
 
End

Function ButtonProc_4(ba) : ButtonControl
 STRUCT WMButtonAction &ba

 switch( ba.eventCode )
  case 2: // mouse up
   // click code here
     NVAR mu
     Variable mu_shift
     Display
     for ( mu_shift=-0.15; mu_shift<=0.151; mu_shift+=mu)
       sub4_extract(mu_shift)
     endfor
     Legend/C/N=text0/F=0/B=1/A=MC/X=30.00/Y=25.00
     ModifyGraph width=0,height=0
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

//fourth main
Function sub4_extract(mu)
  Variable mu
  WAVE Ef_eV, T_K, N, DOS_Ef, Seebeck, S_t, R_H, kappa0, c, chi
 
  Variable Num_of_Wave, i, j, k, num_of_temp
  Variable mu_low, mu_high
  Num_of_Wave = DimSize(T_K,0)
  Make/N=(Num_of_Wave) K_tempo, Seebeck_for_K_tempo
 
  i = 0; j = 0; k = 0
  do
    if ( Ef_eV[i] <= mu && mu <= Ef_eV[i+1] )
      mu_low = Ef_eV[i]
      mu_high = Ef_eV[i+1]
      do
        k = k + 1
      while ( T_K[i-k] < T_K[i-k+1] )
      num_of_temp = k
      for(k=0;k         K_tempo[k] = T_K[i+k+1]
        Seebeck_for_K_tempo[k] = (Seebeck[i+k+1] - Seebeck[i-num_of_temp+k+1]) * (mu - mu_low) / ( mu_high - mu_low ) +  Seebeck[i-num_of_temp+k+1]
        //print  T_K[i+k+1], T_K[i-num_of_temp+k+1]
        //print  Seebeck[i+k+1], Seebeck[i-num_of_temp+k+1]
      endfor
      break
    endif
    i = i +1
  while ( i < (DimSize(T_K,0) -1) )
 
  String name_of_wave
  name_of_wave = "Seebeck_at_" + num2str(mu) + "_eV"
  Make/O/N=(num_of_temp) temp_K, $name_of_wave
  Wave Seebeck_for_K = $name_of_wave

  temp_K = K_tempo
  Seebeck_for_K = Seebeck_for_K_tempo * 10^6
 
  AppendToGraph  Seebeck_for_K vs temp_K
 
  //setting graph
  ModifyGraph mode=4,marker=19,msize=4
  ModifyGraph tick=2,mirror=1,fSize=14,standoff=0,font="Arial"
  Label left "\\Z14\rSeebeck coefficients / \\F'Symbol'm\\F'Arial'V\\S-1"
  ModifyGraph tick(bottom)=2,mirror(bottom)=1,fSize(bottom)=14,standoff(bottom)=0
  ModifyGraph font(bottom)="Arial"
  Label bottom "\\Z14\\F'Arial'Temperature / K"
  SetAxis bottom 0,2000
  ModifyGraph margin(left)=57
  ModifyGraph margin(bottom)=43
  ModifyGraph width=340.157,height=226.772
  Legend/C/N=text0/F=0/B=1/A=MC/X=30.00/Y=40.00
 
  KillWaves K_tempo, Seebeck_for_K_tempo
 
End

---------------------------------------------------
case.traceを一般テキストをロードで読み込む。上記は、マクロから seebeck_panel を選択する。上から順番に押していけばよい。最初の一番目は一度だけでよい。

回折パターンを回転対称分だけ平均するマクロ
---------------------------------------------------
#pragma rtGlobals=1  // Use modern global access method.
// ver.1.00

Macro electron_diffraction()

NewPanel/W=(0, 0, 220, 70)

DrawText 5,20,"This program can read *.tif or *.png file"
SetDrawEnv fname= "Arial"

DrawText 20,45,"fold:"
SetDrawEnv fname= "Arial"

PopupMenu popup0 proc=PopMenuProc
PopupMenu popup0 pos={50,28}
PopupMenu popup0 value="2;3;4;5;6;8;10;12"
PopupMenu popup0 font="Arial"

Button button0 title="area",proc=ButtonProc
Button button0 pos={94,28}
Button button0 size={50,20}

Button button1 title="plot", proc=ButtonProc_1
Button button1 pos={154,28}
Button button1 size={50,20}

DrawText 8,66,"wave (image) name is \" image \" only"

String/G origin_image=ImageNameList("Graph0",";")
Variable/G fold=2

End

Function PopMenuProc(pa) : PopupMenuControl
 STRUCT WMPopupAction &pa

 switch( pa.eventCode )
  case 2: // mouse up
   Variable popNum = pa.popNum
   String popStr = pa.popStr
   NVAR fold
   fold = str2num(pa.popStr)
   ShowInfo
   Wave image
   Variable/G NLP, NLQ
   NLP = DimSize(image,0)
   NLQ = DimSize(image,1)
   Cursor/I/P A, image, NLP/2, NLQ/2
   Cursor/I/P B, image, 0, NLQ/2
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

Function ButtonProc(ba) : ButtonControl
 STRUCT WMButtonAction &ba

 switch( ba.eventCode )
  case 2: // mouse up
   // click code here
   Variable/G A_p,A_q,B_p,B_q
   A_p=pcsr(A)
   A_q=qcsr(A)
   B_p=pcsr(B)
   B_q=qcsr(B)
   //DoWindow/R/K 'Graph1'
   //DoWindow/R/S='Graph1' Graph0
   //NewImage $image
   //SVAR origin_image
   //origin_image=ImageNameList("Graph0",";")
   ShowInfo
   //Cursor/I/P A, $origin_image, A_p, A_q
   //Cursor/I/P B, $origin_image, B_p, B_q
   Cursor/I/P A, image, A_p, A_q
   Cursor/I/P B, image, B_p, B_q
   Make/O/N=360 xPoints, yPoints
   Variable i, r
   r = sqrt((xcsr(B)-xcsr(A))^2+(vcsr(B)-vcsr(A))^2)
        for(i=0; i<360; i+=1)
     xPoints[i]=r*cos(Pi/180*i)+xcsr(A)
     yPoints[i]=r*sin(Pi/180*i)+vcsr(A)
   endfor
   AppendToGraph/T yPoints vs xPoints
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

Function ButtonProc_1(ba) : ButtonControl
 STRUCT WMButtonAction &ba

 switch( ba.eventCode )
  case 2: // mouse up
   // click code here
   NVAR fold
   SVAR origin_image
   rotation_plot(fold, origin_image)
   break
  case -1: // control being killed
   break
 endswitch

 return 0
End

// main routine
Function rotation_plot(fold, origin_image)
  Variable fold
  String origin_image
  NVAR NLP, NLQ
  Make/O/N=(NLP,NLQ)  rotate_origin_image
  Wave rotate_origin_image = $origin_image
  Variable i, j
  Variable p, q, rp, rq
  NVAR  A_p,A_q,B_p,B_q
  Variable Max_p, Max_q
  Wave image
  //
  Max_p = sqrt((pcsr(B)-pcsr(A))^2+(qcsr(B)-qcsr(A))^2)
  Max_q = Max_p
  Make/O/N=(NLP,NLQ) rotate_image, sum_image
  //
  for(q=-Max_q;q<=Max_q;q+=1)
    for(p=-Max_p;p<=Max_p;p+=1)
       sum_image[p+A_p][q+A_q] = 0
    endfor
  endfor
  //
  for(i=0;i     for(q=-Max_q;q<=Max_q;q+=1)
      for(p=-Max_p;p<=Max_p;p+=1)
          rp = p*cos(Pi/180*360/fold*i) - q*sin(Pi/180*360/fold*i)
          rq = p*sin(Pi/180*360/fold*i) + q*cos(Pi/180*360/fold*i)
          rotate_image[p+A_p][q+A_q]=image[rp+A_p][rq+A_q]
      endfor
    endfor
    //
    for(q=-Max_q;q<=Max_q;q+=1)
      for(p=-Max_p;p<=Max_p;p+=1)
         sum_image[p+A_p][q+A_q] = sum_image[p+A_p][q+A_q] + rotate_image[p+A_p][q+A_q] / fold
      endfor
    endfor
  endfor
  NewImage sum_image
End
---------------------------------------------------
  画像は .tif または .png で込みこむことが可能。Igorにファイルをドラッグ&ドロップしたら、「イメージをロード」で「イメージをj表示」にチェックを入れて、「新規 ウェーブ名:」を選択して実行を押す。新規ウェーブ名は'image'がディフォルトになっている。マクロ(M)からマクロを起動させて、左から右へと薦 めていく。まず、回転対称性の指定する。次に、カーソルAを中心に、Bを外側において計算範囲を指定する。areaを押せば確実に計算できる範囲が分か る。それで問題なければ、plot を押す。
  このプログラムは綺麗に画像が撮れていないと平均するのでピークがぼけたりする。綺麗に画像を取れるようにカメラを調整して、良い画像を取らなければならない。作ってはみたものの余り使い道がなさそうに思えてガッカリした。

--------------------------------------------------------------------------------
■ Igor macro(上級編)

フィッティング
---------------------------------------------------
#pragma rtGlobals=1    // Use modern global access method
Menu "Fit"
  "Open Input Parameters Panel", Input_Parameters_Panel()
  submenu "Curve fitting"
    "Subtract background", Sub_BG()    // Subtract Back Ground
    "-"    // Edit a line
    "Coefficients Table", Coef_Table()    //  Coefficients data for fitting
    "Fittng Parameters In", Fit_Para_in()    // Fitting parameters input
    "-"    // Edit a line
    "Fitting", Fitting()    // Run fitting process
  End
End
// -----------------------
Proc Input_Parameters_Panel()
  General_Parameters()
  Fitting_Condition_Select_Panel()
End Macro

Function General_Parameters()
  // 他の部分で用いるパラメーターはここでグローバル変数の宣言(/G)をしておくと、
  // 他で利用可能な見やすい引数とできる。
  // 下記はフィッティングするためのグローバル変数を宣言。
  Variable /G Start_Wave_Number, Last_Wave_Number
  String /G Wave_Name
  // フィッティング方法の違いを選択できるように下記のような変数も作成しておくとよい。
  Variable /G Function_type
End Function

Window Fitting_Condition_Select_Panel()
//  Silent 1; PauseUpdate    // No show command line for faster process
// X1 -Y9 は数値に換えて下さい。
  NewPanel /W=(X1, Y1, X2, Y2)    // open panel
  ModifyPanel cbRGB=(R, G, B)    // change color
  SetDrawLayer UserBack    //
  SetDrawEnv fname="Arial", fsize=11, fstyle=1    // Set character
  DrawText X3, Y4, "Fitting Condition Select"    // show some character
  DrawLine X4, Y4, X5, Y5  // draw line
  // ボタンが表示される。必要なデータのパスを入力する欄が出るようになる。
  Button Button_name, pos={X6,Y6}, size={X7,Y7}, proc=Button_Proc\Data_path, title="Set data path"
  // Fit A、Fit B、 Fit C が選択可能な欄が出る。
  // PopupMenuの後の名称は、下のPopupMenuに関連付けるために利用される。
  PopupMenu Popup_name, pos={X6,Y6}, size={X7,Y7}, proc=Button_Proc\Data_path, title="Function type"
  PopupMenu Popup_name, mode=2,value= #"\" Fit A; Fit B; Fit C\""
  // フィッティングするWave名を入力 
  SetVariable Set_Wave_Name, pos={X12, Y12}, size={X13, Y13}, title="Wave_Name"
  SetVariable Set_Wave_Name, font="Arial", fSize=12, value= Wave_Name
  // フィッティングするWaveでの開始点
  SetVariable Set_Start_Fitting_Point, pos={X8, Y8}, size={X9, Y9}, title="Start Fitting Point"
  SetVariable Set_Start_Fitting_Point, font="Arial",fSize=12,value= Start_Wave_Number
  // フィッティングするWaveでの終了点
  SetVariable Set_Last_Fitting_Point, pos={X10, Y10}, size={X11, Y11}, title="Last Fitting Point"
  SetVariable Set_Last_Fitting_Point, font="Arial",fSize=12,value= Last_Wave_Number
End Macro
// -----------------------
Proc Input_Sub_BG()
// (省略。上記を参考に作成してみて下さい)
End Macro
// -----------------------
Proc Coef_Table()
  if(Function_type ==  1)
    Make_Coef_Table_version1()
  endif
  if(Function_type == 5)
    Make_Coef_Table_version5()
  endif
End Macro
// -----------------------
Proc Make_Coef_Table_version1()
  DoWindow/K Coefficients_Table  // Kで所定の名称のウインドウを破棄する
  Make/N=14/T/O Coefficients_Name
  Make/N=14/D/O Coefficients
  Make/N=14/B/O  Hold_Flag
  ModifyTable size=9 // Pointの表示が見えるようにフォントの大きさを小さく指定する
  AppendToTable Coefficients_Table  // 列を名前付きウィンドウに追加する
  AppendToTable Coefficients
  AppendToTable Hold_Flag
  // 下記のように ; を用いると組み込み関数を並べて用いることができる。
  // alignment=で0は左揃え、1は中央揃え、2は右揃え。widthは幅(ポイント)の指定
  ModifyTable alignment=1; ModifyTable width(Coefficients_Name)=90
  // 下記のようにするとA1からA14の名称で予め表に入力された状態となる。
  Coefficients_Name={"A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10"}
  Coefficients_Name[10]={"A11", "A12", "A13", "A14"}  // 見やすいように区切っている。
  DoWindow/C Coefficients_Table  // Cで指定された名称にウインドウを変更
 
  //この後に、上記の様に、フィッティング後の成分を示す表を作ってみるとよい。
End Macro
// -----------------------
Proc Make_Coef_Table_version5()
  // 上記を参考にオリジナルのものを作成してみて下さい。
End Macro
// -----------------------
Proc Fit_Para_in()
  String wave_name
  DoWindow/K Fitting_Graph
  Display
  DoWindow/C Fitting_Graph
  wave_name = Wave_Name
  Duplicate/O $wave_name B1, B2, B3, B4, B5, B6
  if(Function_type==1)
    Fitting_Initial_1()
    AppendToGraphe $wave_name, B1, B2, B3, B4, B5, B6
  endif
  if(Function_type==5)
    // 上記を参考にオリジナルのものを作成してみて下さい。
  endif
End Macro
// -----------------------
Proc Fitting_Initial_1()
  Variable i=0, calculation_limit
  String String_Hold_Flag=""
  if(function_type==1)
    //
    wavestats/Q Coefficients; calculation_limit = V_npnts
    Do
      String_Hold_Flag = String_Hold_Flag + num2str(Hold_Flag[i])
      i = i + 1
    While (i     Fitting(String_Hold_Flag)
  endif
End Macro
// -----------------------
Proc Fitting(String_Hold_Flag)
  String String_Hold_Flag
  if(function_type==1)
    FuncFit/H=String_Hold_Flag /L=
  endif
  (編集中)
End Macro
---------------------------------------------------
(編集中)
[1] http://www.ppl.k.u-tokyo.ac.jp/saito/etc.html
[2] http://nps.sakura.ne.jp/sf/Igor/Igor1.htm
[3] http://www.nips.ac.jp/huinfo/documents/IGOR/igor02.html
---------------------------------------------------
※ 実験装置からデータを取得する場合、PCのアースをしっかりと接続しないと、ノイズが大きくなります。3端子がしっかりと接続されていることを確認しましょう。
---------------------------------------------------

--------------------------------------------------------------------------------
■ I・シバース、M・クラーク 著、『入門FORTRAN77』 啓学出版
終りに(の部分を抜粋)
これまに述べたアプローチには幾つかの欠点があります。最も主要なものは、デザインのときにどうのような決定がなされたかを示す情報がプログラムにほとん ど含まれないということです。つまり、プログラムを作る過程の情報やプログラムのテストやデバッグ時の情報がまったく含まれていないわけです。この欠点は もしプログラムを少しでも変更しようとすると大きな問題となります。そこで、デザインの過程の情報をプログラムにコメントの形で挿入する習慣をつけること をお勧めします。さらに、考えられる重要なエラーについてもコメントにしておくとよいでしょう。また、採用するのをやめたことについてもコメントにしてお くべきです。そのようにすれば、次のときにより良いアプローチをとることができるでしょう。プログラムを作っているときの考えを文章にしたり、他人に説明 しようとするのは、自分の論理の誤りを見つけ出すためにとても役に立ちます。それは特に初心者にいえることです。初心者のときに小さなグループで仕事をす るのは、長いであろうプログラミング経験の中で、きっと大きな意味を持つでしょう。最後に、無視されるかもしれませんが、ひとつお願いをしておきましょ う。多くの人たちがプログラミングを、作る人の個性の延長上に捉えています。プログラムはその人自身の創造物なので、その批評は個人への批評とみなされま す。これを乗り越えてください。もし、あなたのエゴがあなたのプログラムから切り離されるなら、助言を得やすくなるばかりでなく、弊害を避けることがで き、友人との友好関係も続けることができるでしょう。そして、プログラムも進歩するでしょう。しかし、本当はプログラムへの批評は個人への批評ではないの です。
--------------------------------------------------------------------------------
プログラミングの素朴な疑問25
Nikkie software 2011年3月 P.12
--------------------------------------------------------------------------------
プログラミング 途中でぐじけないために必ず知っておきたいこと
Nikkei software 2009年7月 P.16
--------------------------------------------------------------------------------
Windows 基本テクニック プログラミング50
Nikkei software 2010年2月 P.17
--------------------------------------------------------------------------------
小野和俊のプログラマ独立独歩
Nikkei software 2010年2月 P.6
Nikkei software 2010年6月 P.6
Nikkei software 2010年9月 P.8
Nikkei software 2010年11月 P.8
--------------------------------------------------------------------------------
基礎を固めて応用自在! 最新Visual Basic講座
Nikkei software 2010年12月 P.106
--------------------------------------------------------------------------------
VBA, C#, Java, Rubyで自在に操る!
プログラマ的Excel使いこなし術
Nikkei software 2010年12月 P.44
--------------------------------------------------------------------------------
3日で学ぶC言語
Nikkei software 2010年11月 P.21
本当にゼロから始めるC/C++
Nikkei software 2009年5月 P.116
Nikkei software 2009年6月 P.92
Nikkei software 2009年7月 P.84
Nikkei software 2009年8月 P.82
Nikkei software 2009年9月 P.94
Nikkei software 2009年10月 P.106
Nikkei software 2009年11月 P.106
Nikkei software 2009年12月 P.106
Nikkei software 2010年1月 P.116
Nikkei software 2010年2月 P.123
Nikkei software 2010年3月 P.116
Nikkei software 2010年4月 P.108
Nikkei software 2010年5月 P.110
Cエキスパートへの道
Nikkei software 2010年5月 P.90
Nikkei software 2010年6月 P.106
Nikkei software 2010年7月 P.130
Nikkei software 2010年8月 P.122
Nikkei software 2010年9月 P.132
Nikkei software 2010年10月 P.140
Nikkei software 2010年11月 P.140
Nikkei software 2010年12月 P.138
Nikkei software 2011年1月 P.148
Nikkei software 2011年2月 P.132
--------------------------------------------------------------------------------
言語仕様、ライブラリ、GUIでC#を最短攻略!
Nikkei software 2011年2月 P.15
コンソール(C言語)GUI(C#)WEB(PHP)プログラミングの始め方
Nikkei software 2010年4月 P.12
--------------------------------------------------------------------------------
マルチコアを使いこなせ! 並列プログラミング入門
Visual Basic と C++ で様々な手法にチャレンジ
Nikkei software 2010年9月 P.50
--------------------------------------------------------------------------------
最速で学ぶObjective-C
Nikkei software 2010年3月 P.72
Nikkei software 2010年4月 P.64
--------------------------------------------------------------------------------
Javaで始めるプログラミング
Nikkei software 2010年5月 P.68
Nikkei software 2010年6月 P.66
Nikkei software 2010年7月 P.94
Nikkei software 2010年8月 P.88
Nikkei software 2010年9月 P.98
Nikkei software 2010年10月 P.112
Nikkei software 2010年11月 P.114
Nikkei software 2010年12月 P.114
Nikkei software 2011年1月 P.122
Nikkei software 2011年2月 P.112
Nikkei software 2011年3月 P.118
Nikkei software 2011年4月 P.114
じっくり学ぶJavaツール
Nikkei software 2010年1月 P.88
Nikkei software 2010年2月 P.94
Nikkei software 2010年3月 P.88
Nikkei software 2010年4月 P.82
Nikkei software 2010年5月 P.118
Nikkei software 2010年6月 P.114
Nikkei software 2010年7月 P.136
Nikkei software 2010年8月 P.128
Nikkei software 2010年9月 P.138
Nikkei software 2010年10月 P.146
Nikkei software 2010年11月 P.146
Nikkei software 2010年12月 P.144
いまどきのJava Script
Nikkei software 2010年12月 P.120
要件定義からテキストまでJavaでアプリケーションを作り上げよう!
Nikkei software 2010年5月 P.12
--------------------------------------------------------------------------------
フリー・プログラマの華麗な生活
他人のソースコードを楽に読む方法 Nikkei software 2010年9月 P.97
--------------------------------------------------------------------------------
プログラマ娯楽室
Nikkei software 2010年7月 P.114
Nikkei software 2010年8月 P.106
Nikkei software 2010年9月 P.116
Nikkei software 2010年10月 P.124
Nikkei software 2010年11月 P.130
Nikkei software 2010年12月 P.126
Nikkei software 2011年1月 P.136
Nikkei software 2011年2月 P.120
Nikkei software 2011年3月 P.126
--------------------------------------------------------------------------------
Rubyで楽々システム開発
Nikkei software 2010年5月 P.98
Nikkei software 2010年6月 P.90
Nikkei software 2010年7月 P.118
Nikkei software 2010年8月 P.110
Nikkei software 2010年9月 P.120
Nikkei software 2010年10月 P.128
Nikkei software 2010年11月 P.134
Nikkei software 2010年12月 P.130
Nikkei software 2011年1月 P.140
Nikkei software 2011年2月 P.124
Nikkei software 2011年3月 P.130
最前線のプロが直伝! 2D&3Dゲームプログラミング Nikkei software 2011年1月
--------------------------------------------------------------------------------
Androiddプログラミングのレシピ
Nikkei software 2010年12月 P.94
Nikkei software 2011年1月 P.96
Nikkei software 2011年2月 P.84
Nikkei software 2011年3月 P.94
Nikkei software 2011年4月 P.102
自分で作るからAndroidアプリは面白い! Nikkei Linux 2011年2月 P.42
本格派ゲームプログラミング入門 Nikkei software 2010年6月 P. 31
--------------------------------------------------------------------------------
理解して学ぶWebデザイン
Nikkei software 2011年3月 P.82
Nikkei software 2011年4月 P.90
--------------------------------------------------------------------------------
初歩からの組み込みプログラミング
Nikkei software 2010年7月 P.98
Nikkei software 2010年8月 P.74
Nikkei software 2010年9月 P.74
Nikkei software 2010年10月
Nikkei software 2010年11月 P.84
Nikkei software 2010年12月 P.70
Nikkei software 2011年1月 P.78
--------------------------------------------------------------------------------
挫折させないたった900行でオリジナル言語
スクリプト言語
Nikkei  software 2010年8月 P.14
--------------------------------------------------------------------------------
Google Go プログラミング入門
Nikkei software 2010年8月 P.44
--------------------------------------------------------------------------------
動いて楽しいアルゴリズム!
Nikkei software 2009年8月 P.96
Nikkei software 2009年9月 P.108
Nikkei software 2009年10月 P.122
Nikkei software 2009年11月 P.114
Nikkei software 2009年12月 P.116
Nikkei software 2010年1月 P.104
Nikkei software 2010年2月 P.110
Nikkei software 2010年3月 P.104
Nikkei software 2010年4月 P.96
Nikkei software 2010年5月 P.86
Nikkei software 2010年6月 P.102
--------------------------------------------------------------------------------
日経ソフトウェア 2002年4月号
だれでも作れるインストール・プログラム
--------------------------------------------------------------------------------


QRコード
携帯用QRコード
アクセス数
ページビュー数