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::TCatPulseShapefadcという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;
		}
	}

こんな感じで。

Shoichiro Masuoka

CNS, the Univ. of Tokyo. Dcotoral student