メタデータにアクセスする

メタデータは、他のデータを参照する情報です。サンプルには、データが元々収集された時刻、データを収集した機器を操作した人、調べた標本の温度が含まれます。メタデータはプロジェクト、ページ、レイヤ、列に保存することができます。

列ラベル行

メタデータは、 ロングネーム (L), 単位 (U), コメント(C), サンプリング間隔 ユーザ定義パラメータを含むさまざまな パラメータ行などといった情報を 列ヘッダに含むワークシート内で表示できます。

列ラベル行は文字によるインデックスが割り当てられます。この文字は列ラベル行のリファレンステーブルで確認できます。 使用例

列ラベル行の読み込み/書き出し

スクリプトから または 列ヘッダ の文字列を取得したり、設定したい場合があります。 対応するラベル行の文字を行インデックスとして、ラベル行にアクセスします。

Note:数値セルへのアクセスはラベル行の文字を使うことをサポートしていません。

以下は列ヘッダ文字列を読み書きするサンプルです。

Book1_A[L]$ = Time;   // 列AのロングネームをTimeにセット
Book1_A[U]$ = sec;    // 列Aの単位をsecにセット
string strC$ = col(2)[C]$;   // 2番目の列のコメント行を読みstrC$に
// 最初のシステムパラメータ行から値を取得
double syspar1 = %(col(2)[p1]$);
Col(1)[L]$="Temperature";   // Col(1) のロングネームを"Temperature"に
range bb = 2;               // Col(2)の範囲変数を宣言
// Col(2) のロングネームに文字列 " Data" を追加して
//  Col(1) のロングネームにセット
bb[L]$=Col(1)[L]$+" Data";

Note: Origin 8.0では、LabTalk変数が列ラベル行の文字に優先されます。例えば、

int L = 4;    // Origin 8.0以前では
Col(B)[L]$=   // Col(B)の4行目の値を文字列として返す

しかし、Origin 8.1では、これは変更され、列ラベル行(L, U, C, など)が優先されます。

int L = 4;    // Origin 8.1では
Col(B)[L]$=   // Col(B)のロングネームを文字列として返す

次のサンプルはユーザパラメータ行の作成およびアクセス方法を示しています。

// 最初のユーザパラメータ行を表示
wks.userParam1 = 1;   
// 最初のユーザパラメータ行をカスタムネームに割り当て
wks.userParam1$ = "Temperature";   
// 列の特定のユーザパラメータ行に書き込み
col(2)[Temperature]$ = "96.8";   
// ユーザ定義パラメータ行の値を取得
double temp = %(col(2)[Temperature]$);

列ラベルの表示/非表示

wks.labels オブジェクトメソッドで、どの列ヘッダ行をどの順番で表示するかをセットすることができます。 アクティブワークシートに対して、このスクリプトは列ヘッダ行、ロングネーム、単位、最初のシステムパラメータ、最初のユーザパラメータ、コメントの順で表示します。ロングネーム, 単位, 最初のシステムパラメータ, 最初のユーザパラメータ, コメント

range ww = !;
ww.labels(LUP1D1C);

等間隔なサンプリング間隔

Originのユーザはデータ系列(Y)に対するサンプリング間隔をデータポイントの対応する行以外の値にセットすることができます。

サンプリング間隔列ラベル行にアクセスする

これを行うと、特別なヘッダ行が作成され、カスタム間隔(と初期の値)が適用されていることが分かります。 このヘッダ行のテキストにアクセスするには、単にE 行インデックス文字を使います。 このヘッダ行は、実際には読み込み専用で、自由な文字列をセットできません。しかし、構成されているこの文字列のプロパティを列のプロパティ (wks.colオブジェクトを参照) またはcolint Xファンクションのどちらかで変更できます。

// 1番目の列のサンプリング間隔ヘッダテキストを読み取り、文字列変数に
string sampInt$ = Col(1)[E]$;  
// サンプリング間隔がCol(1)に開始値2、増分0.5で
// セットされている場合、
sampInt$=;          
// "x0 = 2"                                 
// "dx = 0.5"// と出力される

サンプリング間隔のヘッダを見るには、以下のステップを試します。

  1. 新しいワークシートを作成し、X列を削除します。
  2. 残りの列(例:B(Y))の一番上をクリックして列全体を選択し、右クリックしてメニューからサンプリング間隔を設定を選択します。
  3. 初期値および増分値を1以外の値にします。
  4. OKをクリックし、指定した値が入力されている新しいヘッダ行が表示されます。

次のサンプルはXファンクションを使って、スクリプトからこれを行う方法を示しています。

また、あるデータタイプ(例えば*.wav)をインポートするとき、サンプリング間隔がヘッダ行として表示されます。

Xファンクションによるサンプリング間隔

サンプリング間隔は、その表示がユーザ情報で書式化されるという点で特別なものです。プログラム的に、以下のようにアクセスできます。

// Xファンクションの完全表記を使用
colint rng:=col(1) x0:=68 inc:=.25 units:=Degrees lname:="Temperature";
// 以下は短い表記 
colint 1 68 .25 Degrees "Temperature";

初期値と増分値はワークシート列プロパティを使って読み込むことができます。

double XInitial = wks.col1.xinit;
double XIncrement = wks.col1.xinc;
string XUnits$ = wks.col1.xunits$;
string XName$ = wks.col1.xname$;

Note:サンプリング間隔が設定されている場合を除き、これらのプロパティが列プロパティのリスト内で表示されます(スクリプトウィンドウに wks.col1.= と入力し、列1のプロパティ名を表示)。

  • 文字列 wks.col1.xunits$ および wks.col1.xname$ には値がありません。
  • 数値 wks.col1.xinit および wks.col1.xinc は、それぞれ行番号の最初の値と増分値に対応する1という値を持ちます。


ツリー

ツリーはLabTalkでサポートされるデータタイプで、これは既存のデータを構造化するものなのでメタデータの形式のツリーも考えます。これらは、データタイプと変数で扱うセクションで簡単に紹介されていますが、Xファンクションに対しても重要なので再度説明しています。

多くのXファンクションは、データをツリー形式で入力、出力します。 XファンクションはLabTalkスクリプトからアクセスできる主要なツールの1つなので、効率よくツリー変数を認識し、使用することが重要です。

ファイルインポートのツリーノードにアクセスする

ワークシートにデータをインポートしたあと、Originはページレベルで特別なツリーのような構造(page.info)のメタデータを保存します。ファイルについての基本情報は、この構造から直接取り出すことができます。

string strName, strPath;
double dDate;
// 構造からファイル名、パスデータを取得
strName$ = page.info.system.import.filename$;
strPath$ = page.info.system.import.filepath$;
dDate = page.info.system.import.filedate;
// %と$置換の両方を使用
ty File %(strPath$)%(strName$), dated $(dDate,D10);

// Origin 2019b以降のより簡単にフォーマットされたファイルデータに出力可能
strDate$ = page.info.SYSTEM.IMPORT.FILEDATE$;
//D9データフォーマットを使って日時文字列を生成

このツリー構造は、インポートについて追加の情報を持つツリーを含みます。このツリーはXファンクションを使ってツリー変数として抽出できます。

Tree MyFiles;
impinfo ipg:=[Book2] tr:=MyFiles;
MyFiles.=; // ツリーの内容をスクリプトウィンドウに出力

Note: impinfo ツリーの内容は、インポートに使われる関数に依存します。

複数ファイルを1つのワークブックにインポートする場合(新しいシート、新しい列または新しい行)、オーガナイザーは最後にインポートしたシステムメタデータのみを表示するため、各ファイルに対する特定のツリーをロードする必要があります。

Tree trFile;
int iNumFiles;
// ファイルの数を探すために最初にこの関数を使用
impinfo trInfo:=trFile fcount:=iNumFiles;
// すべてのファイルをループ - インデックス0から始まる
for( idx = 0 ; idx < iNumFiles ; idx++ )
{
   // 次のファイルのツリーを取得
   impinfo findex:=idx trInfo:=trFile;
   string strFileName, strLocation;
   // 
   strFileName$ = trFile.Info.FileName$;
   strLocation$ = trFile.Info.DataRange$;
   ty File %(strFileName$) was imported into %(strLocation$);
}

レポートページツリーにアクセス

分析レポートページは、ツリー構造に基づく特別な形式のワークシートです。この構造を getresults Xファンクションを使って、ツリー変数を取得し、結果を抽出できます。

// Originサンプルファイルをインポート
string fpath$ = "Samples\Curve Fitting\Gaussian.dat";
string fname$ = SYSTEM.PATH.PROGRAM$ + fpath$;
impasc;
// データのGaussフィットを実行しレポートシートを作成
nlbegin (1,2) gauss;
nlfit;
nlend 1 1;
// 自動作成の文字列変数 __REPORT$, 
// は最後に作成されたレポートシートの名前を保持
string strLastReport$ = __REPORT$;
// これはレポートをツリーに取得するXファンクション
getresults tr:=MyResults iw:=%(strLastReport$);
// これらの結果にアクセスできる
ty Variable\tValue\tError;
separator 3;
ty y0\t$(MyResults.Parameters.y0.Value)\t$(MyResults.Parameters.y0.Error);
ty xc\t$(MyResults.Parameters.xc.Value)\t$(MyResults.Parameters.xc.Error);
ty w\t$(MyResults.Parameters.w.Value)\t$(MyResults.Parameters.w.Error);
ty A\t$(MyResults.Parameters.A.Value)\t$(MyResults.Parameters.A.Error);

ページストレージのユーザツリー

ツリー構造(page.tree)を使って情報をワークブック、行列ブック、グラフページに保存できます。次のサンプルは、セクションを作成し、アクティブページ保存領域にサブセクションと値を追加する方法を示します。

// ツリーノードに値を追加;
page.tree.experiment.sample.RunNumber = 45;
page.tree.experiment.sample.Temperature = 273.8; 
// 他のツリーノードに値を追加;
page.tree.experiment.detector.Type$ = "InGaAs";
page.tree.experiment.detector.Cooling$ = "Liquid Nitrogen";
page.tree.=
/*
Output:  
    EXPERIMENT
         +---SAMPLE
         |    +---RUNNUMBER = 45
         |    \---TEMPERATURE = 273.8
         \---DETECTOR
              +---TYPE = InGaAs
              \---COOLING = Liquid Nitrogen
*/

情報を保存すると、保存内容をダンプすることで取り出すことができます。

// ページストレージのすべての内容を出力
page.tree.=;
// またはプログラムでアクセス
temperature = page.tree.experiment.sample.temperature;
string type$ = page.tree.experiment.detector.Type$;
ty Using %(type$) at $(temperature)K;

ワークブックまたは行列ブックのページオーガナイザでツリーを表示できます。

ワークシートのユーザツリー

ワークブックのページレベルに保存されているツリーは、シートがアクティブであるかどうかに関係なく、アクセスできます。シートレベルでツリーを保存することもできます。

// ここではアクティブシートに2つのツリーを追加
wks.tree.add(Input);
// ブランチと値を動的に作成
wks.tree.input.Min = 0;
// 別の値を追加
wks.tree.input.max = 1;
// 2番目のツリーを追加
wks.tree.add(Output);
// 2つ以上の値を追加
wks.tree.output.min = -100;
wks.tree.output.max = 100;
 
// ツリーを出力
wks.tree.=;
// またはアクセス
ty Input $(wks.tree.input.min) to $(wks.tree.input.max);
ty Output $(wks.tree.output.min) to $(wks.tree.output.max);
 
// rangeを使ってシートレベルのツリーにアクセス
range rs = [Book7]Sheet2!;
rs!wks.tree.=;

ワークブックまたは行列ブックのページオーガナイザでツリーを表示できます。

ワークシート列のユーザツリー

個々のワークシート列はツリー形式でメタデータを含むことができます。 ツリーノードを割り当てたり、読みだすことはページレベルのツリーと非常に似ています。

// COLUMN ツリーを作成
wks.col2.tree.add(Batch);
// ブランチを追加
wks.col2.tree.batch.addsection(Mix);
// ブランチに2つの値を追加
wks.col2.tree.batch.mix.ratio$ = "20:15:2";
wks.col2.tree.batch.mix.BatchNo= 113210;
// 動的にブランチと値を追加
wks.col2.tree.batch.Line.No = 7;
wks.col2.tree.batch.Line.Date$ = 3/15/2010; 
 
// スクリプトウィンドウにツリーを出力
wks.col2.tree.=;
// またはツリーにアクセス
batch = wks.col2.tree.batch.mix.batchno;
string strDate$ = wks.col2.tree.batch.Line.Date$;
ty Batch $(batch) made on %(strDate$) [$(date(%(strDate$)))];

列のプロパティダイアログのユーザツリータブでこれらのツリーを表示できます。