ThermoMSで取得したrawデータを開く方法
前回
http://qiita.com/gili/items/bb09f963ff996ea1521b
のものより少しだけスマートになったと思う(なったとは言ってない)。
Xrawfi2_x64.dllのインストールおよび参照の追加は前回通り。
予めフォームへファイルをD&Dで開けるように設定しておいたものを利用。
//
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
MSFileReader_XRawfile rawfile = new MSFileReader_XRawfile();
string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop, false);
rawfile.Open(fileName[0]);
//MSモードにする
rawfile.SetCurrentController(0, 1);
rawデータを開き、SetCurrentController(0, 1)でMSデータを読み込めるようにする。
int totalscannum = 0;
double lowmass = 0;
double highmass = 0;
double massresolution = 0;
string MSname = null;
string MSmodel = null;
ここら辺は必要に応じて初期化
MS情報はrefで取得
rawfile.GetNumSpectra(ref totalscannum);
rawfile.GetLowMass(ref lowmass);
rawfile.GetHighMass(ref highmass);
rawfile.GetMassResolution(ref massresolution);
rawfile.GetInstModel(ref MSname);
rawfile.GetInstName(ref MSmodel);
double ProfilePeakWidth = 0.0;
object MassList = null;
object PeakFlags = null;
int ArraySize = 0;
int ArraySize2 = 0;
object MassList2 = null;
fullmass分析時にあらかじめm/z配列長を取得prescanを取っておくと便利な時がある
rawfile.GetMassListFromScanNum(1, null, 1, 0, 0, 0, ref ProfilePeakWidth,
ref MassList, ref PeakFlags, ref ArraySize);
double[,] mslist = (double[,])MassList;
int prescan = mslist.GetLength(0);
FullMSスキャンの時は配列をあらかじめ決め打ちできるので
下のやり方で問題ない。
MS/MS等を行うときは別途配列の初期化が必要。
double[, ,] array3d = new double[totalscannum, 2, mslist.GetLength(1)];
for (int d1 = 1; d1 < totalscannum; d1++)
{
for (int d2 = 1; d2 < mslist.GetLength(1); d2++)
{
long d3 = d2 - 1;
rawfile.GetMassListFromScanNum(d1, null, 1, 0, 0, 0, ref ProfilePeakWidth,
ref MassList2, ref PeakFlags, ref ArraySize2);
double[,] mslist2 = (double[,])MassList2;
array3d[d1, 0, d2] = mslist2[0, d3];
array3d[d1, 1, d2] = mslist2[1, d3];
}
}
}
クロマトデータとMSデータを一緒にしているけれど、
必要がなければMassList2だけで十分な情報が得られるはず。