編集メニュー > 新規作成 編集 コピー 名前の変更 凍結 アップロード 添付ファイル一覧 バックアップ

解析ソフト

パラメータを管理するクラス

データ解析でANAROOTのようなものを書いているが、 一つのクラスですべてのパラメータを管理しているためにわかりづらいし使いづらい。

NEBULAPlaPara *para1 = prm->Find("NEBULA")->FindPara(ridf_map);
NEBULAPlaPara *para2 = prm->Find("NEBULA")->GetPara(ID);
NEBULAPara *para = prm->Find("NEBULA")->GetPara();
Double_t x_off = para->GetXOffset();
DCHitPara *para = prm->Find("BDC1")->GetPara(WireID);
DCPlanePara *para = prm->Find("BDC1")->GetPara(PlaneID);
double t0 = para->GetT0();
DCPara *para = prm->Find("BDC1")->GetPara();
double zpos = para->GetZ();
double z_tgt = prm->Find("Geom")->GetPara("ZPos_TGT");
prm->PrintListOfPara("Beam")

みたいな感じで書きたい。こうすればBigRIPSとかSAMURAIとか分ける必要なし。 GetとFindはどちらの名前が良いのだろうか?

このやり方の懸念は以下の2点。

  1. Find("Beam")の検索スピード。文字列の比較は遅かったりする?
  2. Findの返り値の抽象をどう解くか?もしくはParaの抽象をどう解くか?

1点目についてはENUMでParameter::NEBULAに数値を割り当てる。ただrootのマクロで使えるのか? 2点目はキャストしてしまえばできるけど。rootのTFile::Getも同じ感じだし...templateを使うの?->共変というのを使うのか?コードが難解になりそう... 最悪メソッドを

TanaNEBULAPara* FindNEBULAPara(){return fNEBULAPara;}
TanaNEBULAPlaPara* FindNEBULAPlaPara(int ID){return fNEBULAPara->Find(ID);}

のようにParameterManager?に羅列すれば両方解決できるが...

またできれば

ParameterManager *prm = ParameterManager::Instance();//singleton
prm->LoadParameterList("NEBULA_Map.csv");

とかすると、ParameterManager?クラスの内部で

if (ParaName=="NEBULA") {
  Parameter *nebula_prm = new NEBULAParameter();
  nebula_prm->Parse();
  Register(nebula_prm);
} 

とかだと実験ごとにいちいち書き換えずに済む。