プロジェクトの一部としてプログラムを作成するために使用している Bruker NMR スペクトルがいくつかあります。私のプログラムは、実際のスペクトルで動作する必要があります。そこで、Bruker NMR スペクトルの 1r ファイルを ASCII に変換しました。カルニチンの場合、ASCII ファイルは次のようになります (これは完全なリストではありません。完全なリストは数千行に及びます。これは単なるスナップショットです)。
-0.807434 -23644
-0.807067 -22980
-0.806701 -22967
-0.806334 -24513
-0.805967 -27609
-0.805601 -31145
-0.805234 -33951
-0.804867 -35553
-0.804501 -35880
-0.804134 -35240
-0.803767 -34626
-0.8034 -34613
-0.803034 -34312
-0.802667 -32411
-0.8023 -28925
-0.801934 -25177
-0.801567 -22132
-0.8012 -19395
これがスペクトルです: (出典: wisc.edu )
私のプログラムは、このデータからピークを識別しなければなりません。したがって、これらの数値を解釈する方法を知る必要があります。そして、それらがスペクトル内の適切な値にどの程度正確に変換されるか。これまでのところ、これは私が学んだことです:
1.) 最初の列は、スペクトル ポイントの位置 (ppm) を表します。
2.) 2 番目の列は、各ピークの強度を表します。
3.) 2 番目の列には、完全には整列していないが、最初の列に近い数値がいくつかあることに注意してください。例:-34613、-28925、-19395。これは重要なことだと思います。
完全な開示のために-私はRでプログラミングを行っています.
注: 私は Biostar でもこれを尋ねましたが、ここで質問に答えている人はあまりいないので、ここよりもここで答えを得る可能性が高いと思います。
編集:これは、私が見つけた1つの解決策がもっともらしいです:
友人から、awk スクリプトを使用して、ファイル内の強度が正から負に変化する正確な場所を確認し、極大値を見つけるというアイデアがありました。ここに作業スクリプトがあります:
awk 'BEGIN{dydx = 0;}
{
if(NR > 1)
{ dydx = ($2 - y0)/($1 - x0); }
if(NR > 2 && last * dydx < 0)
{ printf( "%.4f %.4f\n", (x0 + $1)/2, log((dydx<0)?-dydx:dydx)); } ;
last=dydx; x0=$1; y0=$2
}' /home/chaitanya/Work/nmr_spectra/caffeine/pdata/1/spectrumtext.txt | awk '$2 > 17'
わからなかったら教えて。解説を充実させます。
また、私が尋ねたこの関連する質問があります。