2016-07-26 38 views
0

我正在嘗試創建一個簡單的循環來調用順序通道的數據。我有1-8號通道(名爲qL1 - qL8),需要撥打qL*->Draw();命令。變量在ROOT中的命令

有沒有辦法使用循環來不斷更新命令中的數字?我相信c shell中的等效代碼是:

for {set i 1} {$i <= 8} {incr i} { 
    qL$i->Draw(); 
} 

正如標題所述,我正在嘗試爲ROOT編寫一個宏。謝謝。

回答

0

否。如果只有您的頻道名稱是數組,例如qL[N],其中N=0, 1, ..., 7,這將有可能像

for (Int_t i=0; i<8; i++) 
{ 
    qL[i]->Draw(); 
} 
2

把一切都放到一個數組/矢量

好了,你可以填寫你的頻道(我假設TH1在這裏,但它應該工作同樣爲TGraphTTree等)到一個數組/矢量第一,因爲他們無論如何指針:

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() ; } 

儘管這可能不會獲得你多少。

使用ROOT目錄機制和使用字符串操作

什麼可能是更適合與根目錄的管理工作(如果你好歹從輸入文件中得到你的渠道,這應該是一個直接的解決方案):

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();)