*解析ソフト [#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); } とかだと実験ごとにいちいち書き換えずに済む。