这个头文件TFile.h说是root软件自带的,pack/WCDAHitPacket.h这个说是wcda自己编译的这是啥意思,有没有大神解惑
而且这段代码怎么优化一下!!!!
#define BUF_LEN (10*1024*1024)
#define HIT_LEN 16
#include < stdint.h>
#include < TFile.h>
#include < TTree.h>
#include < fstream>
#include < iostream>
#include "pack/WCDAHitPacket.h"
#include "pack/SubDetector.h"
#include "pack/Channel.h"
void decode(char datafile, char rootfile) {
TFile froot(rootfile,"recreate");
TTree t("t","tree");
uint32_t fee ;
uint32_t channel ;
uint32_t l1id = 0;
uint32_t flag;
uint32_t anode_charge ;
uint32_t dynode_charge ;
uint32_t charge_over_range_id ;
uint32_t second ;
uint32_t year ;
uint32_t coarse_time ;
uint32_t low_threshold_fine_time ;
uint32_t high_threshold_fine_time ;
uint32_t coarse_counter_diff_id ;
uint32_t temprature_sensor_info ;
uint32_t flag_info ;
uint32_t reserved ;
uint32_t tail ;
uint64_t time;
uint32_t dt;
t.Branch("l1id", &l1id, "l1id/i");
t.Branch("fee", &fee, "fee/i");
t.Branch("ch", &channel, "ch/i");
t.Branch("anode_charge", &anode_charge, "anode_charge/i");
t.Branch("dynode_charge", &dynode_charge, "dynode_charge/i");
t.Branch("charge_over_range_id", &charge_over_range_id, "charge_over_range_id/i");
t.Branch("second", &second, "second/i");
t.Branch("year", &year, "year/i");
t.Branch("coarse_time", &coarse_time, "coarse_time/i");
t.Branch("high_th_fine_time", &high_threshold_fine_time, "high_th_fine_time/i");
t.Branch("low_th_fine_time", &low_threshold_fine_time, "low_th_fine_time/i");
t.Branch("temprature_sensor_info", &temprature_sensor_info, "temprature_sensor_info/i");
// calculated
t.Branch("time", &time, "time/l");
t.Branch("dt", &dt, "dt/i");
ifstream fdata;
fdata.open(datafile, std::ios::in | std::ios::binary);
uint8_t *buffer = new uint8_t[BUF_LEN];
uint64_t last_time;
bool is_first = true;
while (1) {
uint8_t *ptr = buffer;
fdata.read((char*)ptr, SubDetector::head_size);
if(!fdata.good()) break;
SubDetector sd(ptr);
//std::cout << "subdetector fragment data size: " << sd.dataSize() << std::endl;
fdata.read((char*)sd.data(), sd.dataSize());
if(!fdata.good()) break;
uint8_t *chPtr = sd.data();
while(chPtr - sd.data() < sd.dataSize()) {
Channel ch(chPtr);
fee = ch.channelTag();
uint8_t *hitPtr = ch.data();
uint32_t sz = ch.dataSize();
//std::cout << "channel fragment size: " << sz << std::endl;
for(; hitPtr<ch.data()+sz; hitPtr+=WCDAHitPacket::element_size) {
WCDAHitPacket hit(hitPtr);
//hit.dump();
flag = hit.flag();
channel = hit.channel();
//std::cout << "channel: " << channel << std::endl;
anode_charge = hit.anodeCharge();
dynode_charge = hit.dynodeCharge();
charge_over_range_id = hit.chargeOverRangeId();
second = hit.second();
year = hit.year();
coarse_time = hit.coarseTime();
low_threshold_fine_time = hit.lowThresholdFineTime();
high_threshold_fine_time = hit.highThresholdFineTime();
coarse_counter_diff_id = hit.coarseCounterDiffId();
temprature_sensor_info = hit.tempratureSensorInfo();
flag_info = hit.flagInfo();
tail = hit.tail();
//if(anode_charge < 1200 || anode_charge > 2500) {
// continue;
//}
time = hit.time(); //(uint64_t)second*16000000000ULL + (uint64_t)coarse_time*16+(uint64_t)low_threshold_fine_time*333/1000;
//time = (uint64_t)coarse_time*16;
dt = time - last_time;
last_time = time;
//std::cout << "dt: " << dt << std::endl;
if(!is_first) {
t.Fill();
}
is_first = false;
hitPtr+=WCDAHitPacket::element_size;
}
chPtr += ch.totalSize();
}
l1id ++ ;
}
fdata.close();
t.Write();
//froot.Write();
froot.Close();
}
int main(int argc, char **argv)
{
decode(argv[1], argv[2]);
return 0;
}