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.