8 if(configfile!=
"") m_variables.Initialise(configfile);
15 bool use_stopwatch =
false;
16 m_variables.Get(
"use_stopwatch", use_stopwatch);
29 Log(
"ERROR: outfilename configuration not found. Cancelling initialisation",
ERROR,
m_verbose);
36 m_variables.Get(
"save_multiple_hits_per_trigger", m_save_multiple_hits_per_trigger);
37 Log(
"WARN: TODO save_multiple_hits_per_trigger is not currently implemented",
WARN,
m_verbose);
38 double trigger_offset_temp = 0;
39 m_variables.Get(
"trigger_offset", trigger_offset_temp);
43 Log(
"WARN: TODO save_only_failed_hits is not currently implemented",
WARN,
m_verbose);
48 Int_t bufsize = 64000;
61 m_event_tree->Branch(
"wcsimfilename", &(m_data->CurrentWCSimFile));
62 m_event_tree->Branch(
"wcsimeventnum", &(m_data->CurrentWCSimEventNum));
65 Log(
"DEBUG: DataOut::Initialise filling event-independent trees...",
DEBUG2,
m_verbose);
70 TTree * geom_tree = m_data->WCSimGeomTree->CloneTree(1);
75 Log(
"WARN: TODO Geometry tree filling is not yet implemented for data");
82 TTree * options_tree = m_data->WCSimOptionsTree->CloneTree();
83 m_ss <<
"DEBUG: entries: " << options_tree->GetEntries();
85 TObjString * wcsimfilename =
new TObjString();
86 TBranch * branch = options_tree->Branch(
"wcsimfilename", &wcsimfilename);
87 for(
int i = 0; i < options_tree->GetEntries(); i++) {
88 m_data->WCSimOptionsTree->GetEntry(i);
89 options_tree->GetEntry(i);
90 wcsimfilename->SetString(m_data->WCSimOptionsTree->GetFile()->GetName());
93 options_tree->Write();
155 void DataOut::ExecuteSubDet(WCSimRootEvent * wcsim_event, std::vector<SubSample> & samples, WCSimRootEvent * original_wcsim_event) {
159 wcsim_event->ReInitialize();
178 AddTruthInfo(wcsim_event, original_wcsim_event, time_shift);
187 WCSimRootTrigger * trig;
189 trig = wcsim_event->GetTrigger(0);
195 for(
int i = 0; i < n; i++) {
197 wcsim_event->AddSubEvent();
198 trig = wcsim_event->GetTrigger(i);
212 WCSimRootTrigger * trig0 = original_wcsim_event->GetTrigger(0);
215 time_shift += old_trigger_time;
216 m_ss <<
"DEBUG: Trigger date shift from input WCSim file is " << old_trigger_time;
220 m_ss <<
"DEBUG: Adding additional user-defined time shift of "
225 m_ss <<
"DEBUG: Total time shift is " << time_shift;
232 unsigned int trigger_window;
234 std::vector<int> photon_id_temp;
235 WCSimRootTrigger * wcsim_trigger;
237 for(std::vector<SubSample>::iterator is=samples.begin(); is!=samples.end(); ++is){
238 const size_t nhits = is->m_time.size();
239 unsigned int counter = 0;
240 for(
size_t ihit = 0; ihit < nhits; ihit++) {
242 if(!is->m_trigger_readout_windows[ihit].size())
247 trigger_window = is->m_trigger_readout_windows[ihit][0];
248 wcsim_trigger = wcsim_event->GetTrigger(trigger_window);
251 time = is->AbsoluteDigitTime(ihit);
252 m_ss <<
"Hit " << ihit <<
" is at time " << time << std::endl;
262 wcsim_trigger->AddCherenkovDigiHit(is->m_charge[ihit],
266 m_ss <<
"Saved hit " << counter++;
274 WCSimRootTrigger * new_trig = wcsim_event->GetTrigger(0);
275 WCSimRootTrigger * old_trig = original_wcsim_event->GetTrigger(0);
278 const int nvtx = old_trig->GetNvtxs();
279 new_trig->SetNvtxs(nvtx);
280 for(
int ivtx = 0; ivtx < nvtx; ivtx++) {
281 new_trig->SetVtxsvol(ivtx, old_trig->GetVtxsvol(ivtx));
282 for(
int idim = 0; idim < 3; idim++) {
283 new_trig->SetVtxs(ivtx, idim, old_trig->GetVtxs(ivtx, idim));
288 new_trig->SetMode(old_trig->GetMode());
289 new_trig->SetVecRecNumber(old_trig->GetVecRecNumber());
290 new_trig->SetJmu(old_trig->GetJmu());
291 new_trig->SetJp(old_trig->GetJp());
292 new_trig->SetNpar(old_trig->GetNpar());
295 const WCSimRootPi0 * pi0 = old_trig->GetPi0Info();
297 Int_t pi0_gamma_id[2];
298 Double_t pi0_gamma_e[2];
299 Double_t pi0_gamma_vtx[2][3];
300 for(
int i = 0; i < 3; i++)
301 pi0_vtx[i] = pi0->GetPi0Vtx(i);
302 for(
int i = 0; i < 2; i++) {
303 pi0_gamma_id[i] = pi0->GetGammaID(i);
304 pi0_gamma_e [i] = pi0->GetGammaE (i);
305 for(
int j = 0; j < 3; j++)
306 pi0_gamma_vtx[i][j] = pi0->GetGammaVtx(i, j);
308 new_trig->SetPi0Info(pi0_vtx, pi0_gamma_id, pi0_gamma_e, pi0_gamma_vtx);
311 new_trig->SetNumTubesHit(old_trig->GetNumTubesHit());
312 WCSimRootCherenkovHit * hit;
313 WCSimRootCherenkovHitTime * hit_time;
314 for(
int ihit = 0; ihit < old_trig->GetNcherenkovhits(); ihit++) {
315 TObject * obj = old_trig->GetCherenkovHits()->At(ihit);
317 hit =
dynamic_cast<WCSimRootCherenkovHit*
>(obj);
318 int tube_id = hit->GetTubeID();
319 std::vector<double> true_times;
320 std::vector<int> primary_parent_id;
321 for(
int itime = hit->GetTotalPe(0); itime < hit->GetTotalPe(0) + hit->GetTotalPe(1); itime++) {
322 TObject * obj = old_trig->GetCherenkovHitTimes()->At(itime);
324 hit_time =
dynamic_cast<WCSimRootCherenkovHitTime*
>(obj);
325 true_times .push_back(hit_time->GetTruetime());
326 primary_parent_id.push_back(hit_time->GetParentID());
328 new_trig->AddCherenkovHit(tube_id, true_times, primary_parent_id);
332 WCSimRootTrack * track;
333 for(
int itrack = 0; itrack < old_trig->GetNtrack_slots(); itrack++) {
334 TObject * obj = old_trig->GetTracks()->At(itrack);
336 track =
dynamic_cast<WCSimRootTrack*
>(obj);
337 new_trig->AddTrack(track);
346 new_trig = wcsim_event->GetTrigger(itrigger);
347 double this_trigger_time = new_trig->GetHeader()->GetDate();
348 WCSimRootCherenkovDigiHit * new_digit;
349 WCSimRootCherenkovDigiHit * old_digit;
351 for(
int idigit = 0; idigit < new_trig->GetNcherenkovdigihits(); idigit++) {
352 TObject * obj = new_trig->GetCherenkovDigiHits()->At(idigit);
354 new_digit =
dynamic_cast<WCSimRootCherenkovDigiHit*
>(obj);
355 int tube_id = new_digit->GetTubeId();
357 double time = new_digit->GetT();
366 for(
int idigit_old = 0; idigit_old < old_trig->GetNcherenkovdigihits_slots(); idigit_old++) {
367 TObject * obj = old_trig->GetCherenkovDigiHits()->At(idigit_old);
369 old_digit =
dynamic_cast<WCSimRootCherenkovDigiHit*
>(obj);
371 if(tube_id != old_digit->GetTubeId())
continue;
373 if(abs(time - old_digit->GetT()) > 0.5)
continue;
378 new_digit->SetPhotonIds(old_digit->GetPhotonIds());
386 for(
int i = 0; i < n; i++) {
387 WCSimRootTrigger * trig = wcsim_event->GetTrigger(i);
388 TClonesArray * hits = trig->GetCherenkovDigiHits();
391 for(
int j = 0; j < trig->GetNcherenkovdigihits_slots(); j++) {
392 WCSimRootCherenkovDigiHit * digi = (WCSimRootCherenkovDigiHit *)hits->At(j);
394 sumq += digi->GetQ();
400 trig->SetNumDigitizedTubes(nhits);
401 m_ss <<
"DEBUG: Trigger " << i <<
" has " << nhits <<
" hits";
std::string Result(std::string method_name, std::string output_file="")
std::string m_stopwatch_file
Image filename to save the histogram to, if required.
void Start()
Start the stopwatch.
void CreateSubEvents(WCSimRootEvent *wcsim_event)
std::stringstream m_ss
For easy formatting of Log messages.
StopwatchTimes Stop()
Stop the stopwatch, returning the CPU time.
void Clear()
Clear all triggers.
void FillHits(WCSimRootEvent *wcsim_event, std::vector< SubSample > &samples)
std::vector< TimeDelta > m_readout_end_time
The ending time of the trigger window.
std::vector< std::vector< float > > m_info
Additional information, specific to the trigger.
WCSimRootEvent * m_od_wcsimevent_triggered
Output ROOT event structure for OD.
int m_event_num
Current event number.
TTree * m_event_tree
Tree contain WCSimRootEvent(s), and the original WCSim filename / event number.
TimeDelta m_trigger_offset
A time used to offset all hit times. Set by config file.
TFile * m_output_file
Output ROOT file.
bool Initialise(std::string configfile, DataModel &data)
TriggerInfo * m_all_triggers
Combined list of triggers from all sources (ID+OD)
std::vector< TimeDelta > m_trigger_time
The actual time of the trigger.
void AddTriggers(TriggerInfo *in)
Add all triggers from another TriggerInfo object.
static std::string EnumAsString(Distribution_t dist)
bool m_save_multiple_hits_per_trigger
If false, only 1 hit is allowed to be saved per trigger, rather than all hits from that trigger...
void FinaliseSubEvents(WCSimRootEvent *wcsim_event)
static const TimeDelta ns
TimeDelta of 1 ns.
void AddTruthInfo(WCSimRootEvent *wcsim_event, WCSimRootEvent *original_wcsim_event, const TimeDelta &time_shift)
void ExecuteSubDet(WCSimRootEvent *wcsim_event, std::vector< SubSample > &samples, WCSimRootEvent *original_wcsim_event=0)
Runs other methods to take information from the DataModel and create/populate the WCSimRootEvent...
std::vector< TimeDelta > m_readout_start_time
The starting time of the trigger window.
TimeDelta GetOffset(WCSimRootEvent *original_wcsim_event=0)
int m_verbose
Verbosity level, as defined in tool parameter file.
void Log(const std::string &message, const int message_level)
Format messages in the same way as for tools.
WCSimRootEvent * m_id_wcsimevent_triggered
Output ROOT event structure for ID.
void StreamToLog(int level)
util::Stopwatch * m_stopwatch
The stopwatch, if we're using one.
bool m_save_only_failed_hits
If true, saves hits that failed the trigger, rather those that passed.
std::string m_output_filename
Output ROOT filename that this tool RECREATE's.
unsigned int m_num_triggers
The number of triggers.
std::vector< TriggerType_t > m_type
The type of Trigger.