我正在嘗試創建一個簡單的循環來調用順序通道的數據。我有1-8號通道(名爲qL1 - qL8),需要撥打qL*->Draw();
命令。變量在ROOT中的命令
有沒有辦法使用循環來不斷更新命令中的數字?我相信c shell中的等效代碼是:
for {set i 1} {$i <= 8} {incr i} {
qL$i->Draw();
}
正如標題所述,我正在嘗試爲ROOT編寫一個宏。謝謝。
我正在嘗試創建一個簡單的循環來調用順序通道的數據。我有1-8號通道(名爲qL1 - qL8),需要撥打qL*->Draw();
命令。變量在ROOT中的命令
有沒有辦法使用循環來不斷更新命令中的數字?我相信c shell中的等效代碼是:
for {set i 1} {$i <= 8} {incr i} {
qL$i->Draw();
}
正如標題所述,我正在嘗試爲ROOT編寫一個宏。謝謝。
否。如果只有您的頻道名稱是數組,例如qL[N]
,其中N=0, 1, ..., 7
,這將有可能像
for (Int_t i=0; i<8; i++)
{
qL[i]->Draw();
}
好了,你可以填寫你的頻道(我假設TH1
在這裏,但它應該工作同樣爲TGraph
,TTree
等)到一個數組/矢量第一,因爲他們無論如何指針:
TH1* qL[9]; // nine elements to have indices matching
qL[1] = qL1;
qL[2] = qL2;
qL[3] = qL3;
qL[4] = qL4;
qL[5] = qL5;
qL[6] = qL6;
qL[7] = qL7;
qL[8] = qL8;
for (int i = 1 ; i <= 8 ; i++) { qL[i]->Draw() ; }
儘管這可能不會獲得你多少。
什麼可能是更適合與根目錄的管理工作(如果你好歹從輸入文件中得到你的渠道,這應該是一個直接的解決方案):
for (int i = 1 ; i <= 8 ; i++) {
TH1* localhist = (TH1*) gDirectory->Get(Form("qL%d",i));
localhist->Draw();
}
這裏,Form(...)
是一個CString和Form
語法是一樣的printf
(谷歌是你的朋友)。並且Get
尋找其中名稱是提供的cstring的對象。 (要注意的餘地TH1* variablename = new TH1F(NAME, TITLE , ...)
混亂的,重要的是在NAME
而不是variablename
)
你可以使用一個預處理器(例如升壓)來連接字符串的一部分(QL)你用一個數字變量,並在預處理器宏中使用它,該宏將該數字作爲參數。
#include <boost/preprocessor/cat.hpp>
#define qL(i) BOOST_PP_CAT(qL, i)
TH1* qL1 = new TH1F("test","test",1,0,1);
qL(1)->GetName();
這樣做的問題是,該參數必須在編譯時是已知的,如果你把這個在for循環中,你會因爲qLi
不知道會出錯。 哪一個可以在預處理器中完成,但不知道這是否會在很長一段時間內發揮很大作用
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#define HHHHH(z,n,zz) BOOST_PP_CAT(qL, n) zz
BOOST_PP_REPEAT_FROM_TO(1,3,HHHHH,->Draw();)