last-modified: 2019-04-28 (日) 18:36:58 (1834d)[変更箇所]
データ解析で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点目については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); }
とかだと実験ごとにいちいち書き換えずに済む。