ARTEMISで作ったTreeのBranchをマクロ中で取得する
今回は、ARTEMISで生成したデータクラスが詰まっているBranchを取得して煮るなり焼くなりする方法をメモります。
日本語が分かりにくくてすみませんが、要はtree->SetBranchAddress()
してtree->GetEntry(i)
ってやるやつをARTEMISで作ったデータクラスについてやろうということです。
まず、Gateを用いたいときにはTEventListを使うと便利。
tree->Draw(">>elist","gate");
TEventList *elist = (TEventList*)gDirectory->FindObject("elist");
tree->SetEventList(elist);
そして本番ですが、ここでは波形データを詰めるart::TCatPulseShape
のfadc
というBranchのClock, Sample(ADC ch)が詰まっているFloat_t型vectorを1 eventごとにデータとして取って、Histogramにして描画したいと思います。Processorでデータを詰めるときには大体はTClonesArrayを用いています(これはartemisのbranch
コマンドでBranchを表示させた時に、データクラスはTClonesArrayになっているためです)
TClonesArray *arr = NULL;
art::TCatPulseShape *pulse;
tree->SetBranchAddress("fadc",&arr); // SetBranchAddressするのはTClonesArrayのAddressです
char command;
TCanvas *c = new TCanvas();
for (Int_t i = 0; i != elist->GetN(); ++i) {
tree->GetEntry(elist->GetEntry(i)); // TEventListを使っていない場合はtree->GetEntries()に
std::vector<Float_t> clock, sample;
pulse = static_cast<art::TCatPulseShape*>(arr->At(0)); // 最初のHit dataを取得する
clock = pulse->GetClock();
sample = pulse->GetSample();
const Int_t nSample = (Int_t)clock.size();
TGraph *gr = new TGraph(nSample,&(clock.at(0)),&(sample.at(0)));
gr->Draw("AP");
std::cout << "(n)ext, (s)ave, (q)uit" << std::endl;
std::cin >> command;
if (command == 's') {
string filename;
std::cout << "input file name" << std::endl;
std::cin >> filename;
c->SaveAs(filename.c_str());
c->Clear();
delete gr;
continue;
} else if (command == 'n') {
c->Clear();
delete gr;
continue;
} else {
tree->SetEventList(NULL);
delete elist;
delete gr;
delete c;
break;
}
}
こんな感じで。