25 n_sfp.resize(
set->GetNumberOfFebexSfps() );
26 n_dgf.resize(
set->GetNumberOfDgfModules() );
27 n_adc.resize(
set->GetNumberOfAdcModules() );
37 n_sync.resize(
set->GetNumberOfFebexSfps() );
47 for(
unsigned int i = 0; i <
set->GetNumberOfFebexSfps(); ++i ) {
56 n_board[i].resize(
set->GetNumberOfFebexBoards() );
57 n_sync[i].resize(
set->GetNumberOfFebexBoards() );
58 n_pause[i].resize(
set->GetNumberOfFebexBoards() );
59 n_resume[i].resize(
set->GetNumberOfFebexBoards() );
63 for(
unsigned int j = 0; j <
set->GetNumberOfFebexBoards(); ++j )
241 std::vector<unsigned long long>().swap(
mb_ts_list);
247 std::vector<unsigned long long>().swap(
cd_ts_list);
254 std::vector<unsigned long long>().swap(
pad_ts_list);
259 std::vector<unsigned long long>().swap(
bd_ts_list);
267 std::vector<unsigned long long>().swap(
ic_ts_list);
268 std::vector<unsigned char>().swap(
ic_id_list);
279 std::string hname, htitle;
290 tdiff =
new TH1F(
"tdiff",
"Time difference to first trigger;#Delta t [ns]", 1e3, -10, 1e5 );
291 tdiff_clean =
new TH1F(
"tdiff_clean",
"Time difference to first trigger without noise;#Delta t [ns]", 1e3, -10, 1e5 );
295 pulser_freq =
new TProfile(
"pulser_freq",
"Frequency of pulser in FEBEX DAQ as a function of time;time [ns];f [Hz]", 10.8e4, 0, 10.8e12 );
296 pulser_period =
new TH1F(
"pulser_period",
"Period of pulser in FEBEX DAQ;T [ns]", 10e3, 0, 10e9 );
297 int npulserbins =
set->GetNumberOfPulsers()-1;
298 if( npulserbins <= 0 ) npulserbins = 1;
299 pulser_tdiff =
new TH2F(
"pulser_tdiff",
"Time difference of pulser 0 to all other pulsers in FEBEX DAQ;Pulser ID;{#Delta}t [ns]",
300 npulserbins, 0.5,
set->GetNumberOfPulsers()-0.5, 2001, -10005, 10005 );
301 ebis_freq =
new TProfile(
"ebis_freq",
"Frequency of EBIS events as a function of time;time [ns];f [Hz]", 10.8e4, 0, 10.8e12 );
302 ebis_period =
new TH1F(
"ebis_period",
"Period of EBIS events;T [ns]", 10e3, 0, 10e9 );
303 t1_freq =
new TProfile(
"t1_freq",
"Frequency of T1 events (p+ on ISOLDE target) as a function of time;time [ns];f [Hz]", 10.8e4, 0, 10.8e12 );
304 t1_period =
new TH1F(
"t1_period",
"Period of T1 events (p+ on ISOLDE target);T [ns]", 10e3, 0, 10e9 );
305 sc_freq =
new TProfile(
"sc_freq",
"Frequency of SuperCycle events as a function of time;time [ns];f [Hz]", 10.8e4, 0, 10.8e12 );
306 sc_period =
new TH1F(
"sc_period",
"Period of SuperCycle events;T [ns]", 10e3, 0, 10e9 );
320 dirname =
"miniball";
325 mb_td_core_seg =
new TH1F(
"mb_td_core_seg",
"Time difference between core and segment in same crystal;#Delta t [ns]", 499, -2495, 2495 );
326 mb_td_core_core =
new TH1F(
"mb_td_core_core",
"Time difference between two cores in same cluster;#Delta t [ns]", 499, -2495, 2495 );
333 for(
unsigned int i = 0; i <
set->GetNumberOfMiniballClusters(); ++i ) {
335 dirname =
"miniball/cluster_" + std::to_string(i);
343 for(
unsigned int j = 0; j <
set->GetNumberOfMiniballCrystals(); ++j ) {
345 hname =
"mb_en_core_seg_" + std::to_string(i) +
"_";
346 hname += std::to_string(j);
347 htitle =
"Gamma-ray spectrum from cluster " + std::to_string(i);
348 htitle +=
" core " + std::to_string(j) +
", gated by segment ";
349 htitle +=
" (multiplicity = 1 only);segment ID;Energy (keV)";
350 mb_en_core_seg[i][j] =
new TH2F( hname.data(), htitle.data(), 7, -0.5, 6.5, 4096, -0.5, 4095.5 );
353 hname =
"mb_en_core_seg_" + std::to_string(i) +
"_";
354 hname += std::to_string(j) +
"_ebis_on";
355 htitle =
"Gamma-ray spectrum from cluster " + std::to_string(i);
356 htitle +=
" core " + std::to_string(j) +
", gated by segment ";
357 htitle +=
" (multiplicity = 1 only) gated by EBIS time (1.5 ms);segment ID;Energy (keV)";
387 for(
unsigned int i = 0; i <
set->GetNumberOfCDDetectors(); ++i ) {
402 for(
unsigned int j = 0; j <
set->GetNumberOfCDSectors(); ++j ) {
404 hname =
"cd_pen_id_" + std::to_string(i) +
"_" + std::to_string(j);
405 htitle =
"CD p-side energy for detector " + std::to_string(i);
406 htitle +=
", sector " + std::to_string(j);
407 htitle +=
";Strip ID;Energy (keV);Counts per strip, per 500 keV";
408 cd_pen_id[i][j] =
new TH2F( hname.data(), htitle.data(),
409 set->GetNumberOfCDPStrips(), -0.5,
set->GetNumberOfCDPStrips() - 0.5,
413 hname =
"cd_nen_id_" + std::to_string(i) +
"_" + std::to_string(j);
414 htitle =
"CD n-side energy for detector " + std::to_string(i);
415 htitle +=
", sector " + std::to_string(j);
416 htitle +=
";Strip ID;Energy (keV);Counts per strip, per 500 keV";
417 cd_nen_id[i][j] =
new TH2F( hname.data(), htitle.data(),
418 set->GetNumberOfCDNStrips(), -0.5,
set->GetNumberOfCDNStrips() - 0.5,
422 hname =
"cd_pn_1v1_" + std::to_string(i) +
"_" + std::to_string(j);
423 htitle =
"CD p-side vs n-side energy, multiplicity 1v1";
424 htitle +=
"for detector " + std::to_string(i);
425 htitle +=
", sector " + std::to_string(j);
426 htitle +=
";p-side Energy (keV);n-side Energy (keV);Counts";
427 cd_pn_1v1[i][j] =
new TH2F( hname.data(), htitle.data(), 4000, 0, 200e3, 400, 0, 200e3 );
430 hname =
"cd_pn_1v2_" + std::to_string(i) +
"_" + std::to_string(j);
431 htitle =
"CD p-side vs n-side energy, multiplicity 1v2";
432 htitle +=
"for detector " + std::to_string(i);
433 htitle +=
", sector " + std::to_string(j);
434 htitle +=
";p-side Energy (keV);n-side Energy (keV);Counts";
435 cd_pn_1v2[i][j] =
new TH2F( hname.data(), htitle.data(), 4000, 0, 200e3, 400, 0, 200e3 );
438 hname =
"cd_pn_2v1_" + std::to_string(i) +
"_" + std::to_string(j);
439 htitle =
"CD p-side vs n-side energy, multiplicity 2v1";
440 htitle +=
"for detector " + std::to_string(i);
441 htitle +=
", sector " + std::to_string(j);
442 htitle +=
";p-side Energy (keV);n-side Energy (keV);Counts";
443 cd_pn_2v1[i][j] =
new TH2F( hname.data(), htitle.data(), 4000, 0, 200e3, 400, 0, 200e3 );
446 hname =
"cd_pn_2v2_" + std::to_string(i) +
"_" + std::to_string(j);
447 htitle =
"CD p-side vs n-side energy, multiplicity 2v2";
448 htitle +=
"for detector " + std::to_string(i);
449 htitle +=
", sector " + std::to_string(j);
450 htitle +=
";p-side Energy (keV);n-side Energy (keV);Counts";
451 cd_pn_2v2[i][j] =
new TH2F( hname.data(), htitle.data(), 4000, 0, 200e3, 400, 0, 200e3 );
454 hname =
"cd_pn_td_" + std::to_string(i) +
"_" + std::to_string(j);
455 htitle =
"CD p-side vs n-side time difference ";
456 htitle +=
"for detector " + std::to_string(i);
457 htitle +=
", sector " + std::to_string(j);
458 htitle +=
";time difference (ns);Counts per 10 ns";
459 cd_pn_td[i][j] =
new TH1F( hname.data(), htitle.data(), 800, -4e3, 4e3 );
462 hname =
"cd_pp_td_" + std::to_string(i) +
"_" + std::to_string(j);
463 htitle =
"CD p-side vs p-side time difference ";
464 htitle +=
"for detector " + std::to_string(i);
465 htitle +=
", sector " + std::to_string(j);
466 htitle +=
";time difference (ns);Counts per 10 ns";
467 cd_pp_td[i][j] =
new TH1F( hname.data(), htitle.data(), 800, -4e3, 4e3 );
470 hname =
"cd_nn_td_" + std::to_string(i) +
"_" + std::to_string(j);
471 htitle =
"CD n-side vs n-side time difference ";
472 htitle +=
"for detector " + std::to_string(i);
473 htitle +=
", sector " + std::to_string(j);
474 htitle +=
";time difference (ns);Counts per 10 ns";
475 cd_nn_td[i][j] =
new TH1F( hname.data(), htitle.data(), 800, -4e3, 4e3 );
478 hname =
"cd_ppad_td_" + std::to_string(i) +
"_" + std::to_string(j);
479 htitle =
"CD p-side vs pad time difference ";
480 htitle +=
"for detector " + std::to_string(i);
481 htitle +=
", sector " + std::to_string(j);
482 htitle +=
";time difference (ns);Counts per 10 ns";
483 cd_ppad_td[i][j] =
new TH1F( hname.data(), htitle.data(), 800, -4e3, 4e3 );
486 hname =
"cd_pn_mult_" + std::to_string(i) +
"_" + std::to_string(j);
487 htitle =
"CD p-side vs n-side multiplicity ";
488 htitle +=
"for detector " + std::to_string(i);
489 htitle +=
", sector " + std::to_string(j);
490 htitle +=
";p-side multiplicity;n-side multiplicity";
491 cd_pn_mult[i][j] =
new TH2F( hname.data(), htitle.data(), 10, -0.5, 9.5, 10, -0.5, 9.5 );
494 hname =
"cd_ppad_mult_" + std::to_string(i) +
"_" + std::to_string(j);
495 htitle =
"CD vs Pad multiplicity ";
496 htitle +=
"for detector " + std::to_string(i);
497 htitle +=
", sector " + std::to_string(j);
498 htitle +=
";CD multiplicity;Pad multiplicity";
499 cd_ppad_mult[i][j] =
new TH2F( hname.data(), htitle.data(), 10, -0.5, 9.5, 10, -0.5, 9.5 );
504 hname =
"pad_en_" + std::to_string(i);
505 htitle =
"Pad energy for each sector in detector " + std::to_string(i);
506 htitle +=
";Sector;Energy (keV);Counts per quadrant, per 25 keV";
507 pad_en_id[i] =
new TH2F( hname.data(), htitle.data(),
508 set->GetNumberOfCDSectors(), -0.5,
set->GetNumberOfCDSectors() - 0.5,
523 ic_td =
new TH1F(
"ic_td",
"Time difference between signals in the ion chamber;#Delta t [ns]", 499, -2495, 2495 );
524 ic_dE =
new TH1F(
"ic_dE",
"Ionisation chamber;Energy in first layer (Gas) (arb. units);Counts", 4096, 0, 10000 );
525 ic_E =
new TH1F(
"ic_E",
"Ionisation chamber;Energy in final layer (Si) (arb. units);Counts", 4096, 0, 10000 );
526 ic_dE_E =
new TH2F(
"ic_dE_E",
"Ionisation chamber;Rest energy, E (arb. units);Energy Loss, dE (arb. units);Counts", 4096, 0, 10000, 4096, 0, 10000 );
562 unsigned long long MaxTime;
563 unsigned char MaxSegId;
564 unsigned char MaxCryId;
569 unsigned char seg_mul;
570 unsigned char ab_mul;
571 std::vector<unsigned char> ab_index;
574 for(
unsigned int i = 0; i <
mb_en_list.size(); ++i ) {
580 bool segment_veto =
false;
589 for(
unsigned int j = 0; j <
mb_en_list.size(); ++j ) {
592 if( i == j )
continue;
620 >
set->GetMiniballCrystalHitWindow() )
continue;
638 if( segment_veto )
continue;
652 gamma_evt->SetSegmentMaxEnergy( MaxSegEnergy );
653 gamma_evt->SetSegmentSumEnergy( SegSumEnergy );
654 gamma_evt->SetSegmentMultiplicity( seg_mul );
666 for(
unsigned int i = 0; i <
write_evts->GetGammaRayMultiplicity(); ++i ) {
669 if( std::find( ab_index.begin(), ab_index.end(), i ) != ab_index.end() )
673 AbSumEnergy =
write_evts->GetGammaRayEvt(i)->GetEnergy();
674 MaxCryId =
write_evts->GetGammaRayEvt(i)->GetCrystal();
675 MaxSegId =
write_evts->GetGammaRayEvt(i)->GetSegment();
676 MaxEnergy = AbSumEnergy;
677 MaxSegEnergy =
write_evts->GetGammaRayEvt(i)->GetSegmentMaxEnergy();
678 SegSumEnergy =
write_evts->GetGammaRayEvt(i)->GetSegmentSumEnergy();
679 MaxTime =
write_evts->GetGammaRayEvt(i)->GetTime();
680 seg_mul =
write_evts->GetGammaRayEvt(i)->GetSegmentMultiplicity();
684 for(
unsigned int j = i+1; j <
write_evts->GetGammaRayMultiplicity(); ++j ) {
689 if(
write_evts->GetGammaRayEvt(i)->GetCluster() !=
690 write_evts->GetGammaRayEvt(j)->GetCluster() )
continue;
693 if( TMath::Abs( (
double)
write_evts->GetGammaRayEvt(i)->GetTime() -
694 (
double)
write_evts->GetGammaRayEvt(j)->GetTime() )
695 >
set->GetMiniballAddbackHitWindow() )
continue;
698 if( std::find( ab_index.begin(), ab_index.end(), j ) != ab_index.end() )
703 AbSumEnergy +=
write_evts->GetGammaRayEvt(j)->GetEnergy();
704 SegSumEnergy +=
write_evts->GetGammaRayEvt(j)->GetSegmentSumEnergy();
705 seg_mul +=
write_evts->GetGammaRayEvt(j)->GetSegmentMultiplicity();
706 ab_index.push_back(j);
709 if(
write_evts->GetGammaRayEvt(j)->GetEnergy() > MaxEnergy ){
711 MaxEnergy =
write_evts->GetGammaRayEvt(j)->GetEnergy();
712 MaxSegEnergy =
write_evts->GetGammaRayEvt(j)->GetSegmentMaxEnergy();
713 MaxCryId =
write_evts->GetGammaRayEvt(j)->GetCrystal();
714 MaxSegId =
write_evts->GetGammaRayEvt(j)->GetSegment();
715 MaxTime =
write_evts->GetGammaRayEvt(j)->GetTime();
744 std::vector<unsigned char> pindex;
745 std::vector<unsigned char> nindex;
748 for(
unsigned int i = 0; i <
set->GetNumberOfCDDetectors(); ++i ){
750 for(
unsigned int j = 0; j <
set->GetNumberOfCDSectors(); ++j ){
755 std::vector<unsigned char>().swap(pindex);
756 std::vector<unsigned char>().swap(nindex);
757 int pmax_idx = -1, nmax_idx = -1;
758 float pmax_en = -999., nmax_en = -999.;
759 float pad_coinc_en = 0.0;
760 float psum_en, nsum_en;
761 unsigned long long pad_coinc_ts = 0;
762 unsigned int padmult = 0;
765 for(
unsigned int k = 0; k <
cd_en_list.size(); ++k ){
803 for(
unsigned int k = 0; k <
pad_en_list.size(); ++k ){
819 for(
unsigned int p1 = 0; p1 < pindex.size(); ++p1 ){
827 if( pmax_idx >= 0 ) {
830 <
set->GetPadHitWindow() ){
849 if( pindex.size() || nindex.size() )
850 cd_pn_mult[i][j]->Fill( pindex.size(), nindex.size() );
853 for(
unsigned int p1 = 0; p1 < pindex.size(); ++p1 ){
855 for(
unsigned int n1 = 0; n1 < nindex.size(); ++n1 ){
862 for(
unsigned int p2 = p1+1; p2 < pindex.size(); ++p2 ){
871 for(
unsigned int n1 = 0; n1 < nindex.size(); ++n1 ){
873 for(
unsigned int n2 = n1+1; n2 < nindex.size(); ++n2 ){
887 if( pindex.size() == 1 && nindex.size() == 1 ) {
917 else if( pindex.size() == 1 && nindex.size() == 2 ) {
987 else if( pindex.size() == 2 && nindex.size() == 1 ) {
1057 else if( pindex.size() == 2 && nindex.size() == 2 ) {
1170 unsigned int nfriend_idx = nindex.at(0);
1173 nfriend_idx = nindex.at(1);
1192 if( nfriend_idx == nindex.at(1) ) nfriend_idx = nindex.at(0);
1193 else nfriend_idx = nindex.at(1);
1306 else if( pmax_idx >= 0 && nmax_idx >= 0 ){
1462 std::cout <<
" Event Building: nothing to do" << std::endl;
1472 std::cout <<
" Event Building: number of entries in input tree = ";
1475 std::cout <<
"\tnumber of MBS Events/triggers in input tree = ";
1481 for(
unsigned long i = 0; i <
n_entries; ++i ) {
1505 std::cerr <<
"Didn't find matching MBS Event IDs at start of the file: ";
1518 if(
set->GetMbsEventMode() ) {
1530 std::cout <<
"Out of order event in ";
1531 std::cout <<
input_tree->GetName() << std::endl;
1538 std::cout <<
"Out of order MBS event " <<
myeventid;
1588 unsigned int adc_tmp_value;
1593 else adc_tmp_value =
febex_data->GetQshort();
1751 if( pulserID == 0 &&
pulser_prev[pulserID] != 0 ) {
1756 if( pulserID == 0 ) {
1758 for(
unsigned int i = 1; i <
set->GetNumberOfPulsers(); i++ ) {
1804 unsigned int adc_tmp_value =
dgf_data->GetQshort();
1873 unsigned int adc_tmp_value =
adc_data->GetQshort();
2039 info_data->GetCode() <
set->GetPulserCode() +
set->GetNumberOfPulsers() ) {
2041 unsigned int pulserID =
info_data->GetCode() -
set->GetPulserCode();
2046 if( pulserID == 0 &&
pulser_prev[pulserID] != 0 ) {
2051 if( pulserID == 0 ) {
2053 for(
unsigned int i = 1; i <
set->GetNumberOfPulsers(); i++ ) {
2075 if(
info_data->GetSfp() <
set->GetNumberOfFebexSfps() &&
2076 info_data->GetBoard() <
set->GetNumberOfFebexBoards() ) {
2086 std::cerr <<
"Bad sync event in SFP " << (int)
info_data->GetSfp();
2087 std::cerr <<
", board " << (int)
info_data->GetBoard() << std::endl;
2096 if(
info_data->GetSfp() <
set->GetNumberOfFebexSfps() &&
2097 info_data->GetBoard() <
set->GetNumberOfFebexBoards() ) {
2107 std::cerr <<
"Bad pause event in SFP " << (int)
info_data->GetSfp();
2108 std::cerr <<
", board " << (int)
info_data->GetBoard() << std::endl;
2117 if(
info_data->GetSfp() <
set->GetNumberOfFebexSfps() &&
2118 info_data->GetBoard() <
set->GetNumberOfFebexBoards() ) {
2131 std::cout <<
"SFP " <<
info_data->GetSfp();
2132 std::cout <<
", board " <<
info_data->GetBoard();
2133 std::cout <<
" was blocked at start of run for ";
2135 std::cout <<
" seconds" << std::endl;
2143 std::cerr <<
"Bad resume event in SFP " << (int)
info_data->GetSfp();
2144 std::cerr <<
", board " << (int)
info_data->GetBoard() << std::endl;
2192 std::cerr <<
"MBS Event " <<
myeventid <<
" not found by index, looking up manually" << std::endl;
2205 std::cerr <<
"Didn't find matching MBS Event IDs at start of the file: ";
2219 if(
set->GetMbsEventMode() ) {
2282 write_evts->GetGammaRayAddbackMultiplicity() ||
2299 bool update_progress =
false;
2301 update_progress =
true;
2303 update_progress =
true;
2305 if( update_progress ) {
2308 float percent = (float)(i+1)*100.0/(float)
n_entries;
2313 prog->SetPosition( percent );
2314 gSystem->ProcessEvents();
2319 std::cout <<
" " << std::setw(6) << std::setprecision(4);
2320 std::cout << percent <<
"% \r";
2331 std::stringstream ss_log;
2332 ss_log <<
"\n MiniballEventBuilder finished..." << std::endl;
2333 ss_log <<
" FEBEX data packets = " <<
n_febex_data << std::endl;
2334 for(
unsigned int i = 0; i <
set->GetNumberOfFebexSfps(); ++i ) {
2335 ss_log <<
" SFP " << i <<
" events = " <<
n_sfp[i] << std::endl;
2336 for(
unsigned int j = 0; j <
set->GetNumberOfFebexBoards(); ++j ) {
2337 ss_log <<
" Board " << j <<
" events = " <<
n_board[i][j] << std::endl;
2341 ss_log <<
" sync pulses = " <<
n_sync[i][j] << std::endl;
2345 ss_log <<
" DGF data packets = " <<
n_dgf_data << std::endl;
2346 for(
unsigned int i = 0; i <
set->GetNumberOfDgfModules(); ++i ) {
2347 ss_log <<
" Module " << i <<
" events = " <<
n_dgf[i] << std::endl;
2349 ss_log <<
" ADC data packets = " <<
n_adc_data << std::endl;
2350 for(
unsigned int i = 0; i <
set->GetNumberOfAdcModules(); ++i ) {
2351 ss_log <<
" Module " << i <<
" events = " <<
n_adc[i] << std::endl;
2353 ss_log <<
" Info data packets = " <<
n_info_data << std::endl;
2354 for(
unsigned int i = 0; i <
set->GetNumberOfPulsers(); ++i )
2355 ss_log <<
" Pulser " << i <<
" events = " <<
n_pulser[i] << std::endl;
2356 ss_log <<
" EBIS events = " <<
n_ebis << std::endl;
2357 ss_log <<
" RILIS events = " <<
n_rilis << std::endl;
2358 ss_log <<
" T1 events = " <<
n_t1 << std::endl;
2359 ss_log <<
" SuperCycle events = " <<
n_sc << std::endl;
2360 ss_log <<
" Tree entries = " <<
output_tree->GetEntries() << std::endl;
2361 ss_log <<
" Miniball triggers = " <<
n_miniball << std::endl;
2362 ss_log <<
" Gamma singles events = " <<
gamma_ctr << std::endl;
2363 ss_log <<
" Gamma addback events = " <<
gamma_ab_ctr << std::endl;
2364 ss_log <<
" CD detector triggers = " <<
n_cd << std::endl;
2365 ss_log <<
" Pad detector triggers = " <<
n_pad << std::endl;
2366 ss_log <<
" Particle events = " <<
cd_ctr << std::endl;
2367 ss_log <<
" SPEDE triggers = " <<
n_spede << std::endl;
2368 ss_log <<
" Electron events = " <<
spede_ctr << std::endl;
2369 ss_log <<
" Beam dump triggers = " <<
n_bd << std::endl;
2370 ss_log <<
" Beam dump gamma events = " <<
bd_ctr << std::endl;
2371 ss_log <<
" IonChamber triggers = " <<
n_ic << std::endl;
2372 ss_log <<
" IonChamber ion events = " <<
ic_ctr << std::endl;
2373 ss_log <<
"\nTotal number of repeated events skipped = " << std::dec <<
repeat_ctr;
2375 ss_log <<
"\%" << std::endl;
2377 std::cout << ss_log.str();