14#define required_argument 1
15#define optional_argument 2
21TH2F *hNucChart =
nullptr;
22TH2F *hNucChartBetaminus =
nullptr;
23TH2F *hNucChartBetaplus =
nullptr;
24TH2F *hNucChartStable =
nullptr;
25TH1F *hRandExcitedState =
nullptr;
28void a_thread(
int ithread,
long NEvents);
38 glog <<
"this utility allows to test the multi thread compatibility" <<
do_endl;
40 glog <<
"supported options:" <<
do_endl;
41 glog <<
" --evts N number of random nuclei to process (default 1e6)" <<
do_endl;
42 glog <<
" --workers N number of workers to be used (default 1)" <<
do_endl;
46int main(
int argc,
char **argv) {
49 static struct option long_options[] = {
50 {
"evts", required_argument,
nullptr,
'e'},
51 {
"workers", required_argument,
nullptr,
'w'},
52 {
"help", no_argument,
nullptr,
'h'},
53 {
nullptr, 0,
nullptr, 0}};
59 int c = getopt_long (argc, argv,
"ewh", long_options, &option_index);
63 NEvents = atof(optarg);
66 NWorkers = atoi(optarg);
73 cout <<
"***********************************************************************************" << endl;
74 cout <<
"* Randomly produce a nucleus and extract a random excited state in multi thread *" << endl;
75 cout <<
"***********************************************************************************" << endl;
79 ROOT::EnableImplicitMT();
80 hNucChart =
new TH2F(
"NucChart",
"NucChart",90,0,180,60,0,120);
81 hNucChartBetaminus =
new TH2F(
"NucChartBetaminus",
"NucChartBetaminus",90,0,180,60,0,120);
82 hNucChartBetaplus =
new TH2F(
"NucChartBetaplus",
"NucChartBetaplus",90,0,180,60,0,120);
83 hNucChartStable =
new TH2F(
"NucChartStable",
"NucChartStable",90,0,180,60,0,120);
84 hRandExcitedState =
new TH1F(
"RandExcitedState",
"RandExcitedState",20000,0,20000);
87 cout <<
"Nevents : " << NEvents << endl;
88 cout <<
"N workers: " << NWorkers << endl;
91 glog.set_warnings(
false);
93 auto tsload = std::chrono::high_resolution_clock::now();
96 gmanager->preload_level_schemes(
true);
99 auto tstart = std::chrono::high_resolution_clock::now();
101 vector<thread> threads;
102 threads.reserve(NWorkers);
103 for(
int i=0 ; i<NWorkers ; i++) {
104 threads.emplace_back(thread(a_thread, i, NEvents/NWorkers));
106 for(
int i=0 ; i<NWorkers ; i++) {
107 threads.at(i).join();
111 auto *fout =
new TFile(
"tkn-thread.root",
"recreate");
113 hNucChartBetaminus->Write();
114 hNucChartBetaplus->Write();
115 hNucChartStable->Write();
116 hRandExcitedState->Write();
117 glog <<
info <<
"tkn-thread.root created with content: " <<
do_endl;
122 auto tstop = std::chrono::high_resolution_clock::now();
123 auto dtload = std::chrono::duration<double, std::milli>(tstart-tsload).count() * 0.001;
124 auto dt_process = std::chrono::duration<double, std::milli>(tstop-tstart).count() * 0.001;
125 auto dt = std::chrono::duration<double, std::milli>(tstop-tsload).count() * 0.001;
128 cout << fixed << setprecision(4) <<
"CPU time to load the full db : " << dtload <<
" s\n";
129 cout << fixed << setprecision(4) <<
"CPU time to process the events: " << dt_process <<
" s\n";
130 cout << fixed << setprecision(4) <<
"Total CPU time : " << dt <<
" s\n";
133void a_thread(
int ithread,
long NEvents) {
136 std::random_device rd;
137 std::mt19937 gen(rd());
140 std::uniform_int_distribution<> dist_nuc(0, gmanager->get_nuclei().size()-1);
142 int Fact = NEvents/100.;
143 for(
long entry=0 ; entry<NEvents ; entry++) {
144 if(ithread==0 && entry%Fact==0) {
145 cout<<
"\r"<<
"Analysis progress : "<<setw(3)<<setprecision(3)<<(double)entry/(
double)NEvents*100<<
" %"<<flush;
147 long inuc = dist_nuc(gen);
148 auto nuc = gmanager->get_nuclei().at(inuc);
149 if(nuc->get_level_scheme()->get_levels().size()>1) {
152 std::uniform_int_distribution<> dist_lev(0, nuc->get_level_scheme()->get_levels().size()-1);
154 long ilvl = dist_lev(gen);
157 hNucChart->Fill(nuc->get_n(),nuc->get_z());
158 if(nuc->has_property(
"QbetaMinus") && nuc->get(
"QbetaMinus")->get_value()>0) hNucChartBetaminus->Fill(nuc->get_n(),nuc->get_z());
159 if(nuc->has_property(
"QpositronEmission") && nuc->get(
"QpositronEmission")->get_value()>0) hNucChartBetaplus->Fill(nuc->get_n(),nuc->get_z());
160 if(nuc->is_stable()) hNucChartStable->Fill(nuc->get_n(),nuc->get_z());
161 if(elev>0) hRandExcitedState->Fill(elev);
tklog & do_endl(tklog &log)
tklog & high_intensity(tklog &log)
Colors.