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

*解析ソフト [#cc785248]
**パラメータを管理するクラス [#u9e8902c]
データ解析で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点。
+ Find("Beam")の検索スピード。文字列の比較は遅かったりする?
+ Findの返り値の抽象をどう解くか?もしくはParaの抽象をどう解くか?

1点目についてはENUMでParameter::NEBULAに数値を割り当てる。ただrootのマクロで使えるのか?
2点目はキャストしてしまえばできるけど...templateを使うの?->共変というのを使うのか?コードが難解になりそう...
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);
 } 
とかだと実験ごとにいちいち書き換えずに済む。