314 {
315
316
321
322
324
325 IOVRange iovr2 (
IOVTime((*it)->startRunNumber(),(*it)->startLumiBlockNumber()),
326 IOVTime((*it)->stopRunNumber(),(*it)->stopLumiBlockNumber()));
327
328 bool isrun2 = false;
329 std::string onlfolder;
330 std::string oflfolder;
331 if (iovr2.start().run() > 222222) {
332 isrun2 = true;
333 m_data_db="CONDBR2";
334 onlfolder = "/TRIGGER/LUMI/OnlPrefLumi";
335 oflfolder = "/TRIGGER/OFLLUMI/OflPrefLumi";
336 } else {
337 isrun2 = false;
338 m_data_db="COMP200";
339 onlfolder = "/TRIGGER/LUMI/LBLESTONL";
340 oflfolder = "/TRIGGER/OFLLUMI/LBLESTOFL";
341 }
342
343
344
345
346 if(m_onlinelumi){
347 m_lumi_database = m_lumionl + m_data_db;
348 m_parlumiestfolder = std::move(onlfolder);
349 } else {
350 m_lumi_database = m_lumioff + m_data_db;
351 m_parlumiestfolder = std::move(oflfolder);
352 }
353
354 m_trig_database = m_trigger + m_data_db;
355 m_lar_database = m_laroff + m_data_db;
356 m_bs_database = m_bsonl + m_data_db;
357
358
359 m_logger <<
Root::kINFO <<
"Luminosity database: " << m_lumi_database << Root::GEndl;
360 m_logger <<
Root::kINFO <<
"Trigger database: " << m_trig_database << Root::GEndl;
361
364 delete cq_lumi;
365 return;
366 }
367
370 delete cq_trigger;
371 return;
372 }
373
374 if (m_uselar) {
375 m_logger <<
Root::kINFO <<
"LAr database: " << m_lar_database << Root::GEndl;
376
379 delete cq_lar;
380 return;
381 }
382 }
383
384 if (m_usebs) {
385 m_logger <<
Root::kINFO <<
"Onl beamspot database: " << m_bs_database << Root::GEndl;
386
389 delete cq_bs;
390 return;
391 }
392 }
393
394
395 m_lbstarttime = 0.;
396 m_lbendtime = 0.;
397 m_totalDelL = 0.;
398 m_totalL = 0.;
399 m_totalLRun = 0.;
400 m_totaltime = 0.;
401 m_instLumi = 0.;
402 m_delLumi = 0.;
403 m_intLumi = 0.;
404 m_deltaT = 0.;
405
406 m_totalPrescaleWLiveTime = 0.;
407 m_totalPrescale = 0.;
408 m_lumiWOPrescale = 0.;
409 m_lumiLAr = 0.;
410 m_TotaldeltaT = 0.;
411 m_livefrac = 0.;
412 m_livetime = 0.;
413 m_lartime = 0.;
414 m_larfrac = 0.;
415 m_bsvalid = 0.;
416 m_livetime_l1acc = 0;
417 m_l1acc = 0;
418 m_l2acc = 0;
419 m_l3acc = 0;
420 m_totall1acc = 0;
421 m_livtrig_totall1acc = 0;
422 m_totall2acc = 0;
423 m_totall3acc = 0;
424 m_l1prescale = 1.;
425 m_l2prescale = 1.;
426 m_l3prescale = 1.;
427 m_livetime_beforeprescale = 0;
428 m_livetime_afterprescale = 0;
429 m_afterprescale = 0;
430 m_beforeprescale = 0;
431 m_totall1befpresc = 0;
432 m_runnbr = 0;
433 m_lbstart = 0;
434 m_lbstop = 0;
435 m_lbstart_prev = 0;
436 m_lbstop_prev = 0;
437 m_totalgoodblock = 0;
438 m_totalbadblock = 0;
439 m_clumiblocknbr = 0;
440 m_clumiblocknbrend =0;
441 m_triglevel = 0;
442 m_lbcollectionname = "LumiBlocks";
444 m_l1rate = 0.;
445 m_l2rate = 0.;
446 m_l3rate = 0.;
447 m_l1ratediveffxsec = 0.;
448 m_total_l1ratediveffxsec = 0.;
449 m_total_l1ratediveffxsecRun = 0.;
450 m_l1ratediveffxsec_recorded = 0.;
451 m_total_l1ratediveffxsec_recorded = 0.;
452 m_total_l1ratediveffxsecRun_recorded = 0.;
453 m_runnbr_prev = 0;
454
455
456 m_minrun = 99999999;
457 m_maxrun = 0;
458
459 bool firstL1Missing = true;
460 bool firstHLTMissing = true;
461
462 std::set<cool::ValidityKey> lbrunset;
463 lbrunset.clear();
464
465
466 if (m_collsgrl!=0) { delete m_collsgrl; m_collsgrl=0; }
467 if (m_makecollList) {
469 m_collsgrl->SetVersion("30");
470 m_collsgrl->AddMetaData("Query","Generated by LumiCalculator");
471 }
472
473
475 if (m_triglevel == 0){
476
478 m_logger <<
Root::kINFO <<
"No trigger specified!" << Root::GEndl;
479 } else {
480 m_logger <<
Root::kWARNING <<
"Invalid trigger: [" <<
triggerchain <<
"] - will proceed with no trigger defined!" << Root::GEndl;
481 }
482 }
483
484
486 int reti = regcomp(®ex, "_[[:digit:]]?b[[:digit:]]+_", REG_EXTENDED);
487 if (reti) m_logger <<
Root::kWARNING <<
"Could not compile regex!" << Root::GEndl;
488
489 reti = regexec(®ex,
triggerchain.c_str(), 0, NULL, 0);
490 if ( !reti && !m_usebs) {
491 m_logger <<
Root::kWARNING <<
"Trigger: [" <<
triggerchain <<
"] appears to be a b-jet trigger, but online beamspot validity not included in livefraction!" << Root::GEndl;
492 m_logger <<
Root::kWARNING <<
"Probably need to specify --beamspot to get accurate luminosity!" << Root::GEndl;
493 }
494 regfree(®ex);
495
496
497 if (m_lumimethod != "") {
499 } else {
500 m_Lumiid = m_lumichannel;
501 }
502
503
504
505
506
513
514 std::map<cool::ValidityKey, CoolQuery::LumiFolderData> LumiDataMap;
515
516
517 std::map<cool::ValidityKey, cool::UInt63> L1starttime_map;
518 std::map<cool::ValidityKey, cool::UInt63> L1endtime_map;
519
520
521 std::map<cool::ValidityKey, CoolQuery::L1CountFolderData> Livetime_map;
522 std::map<cool::ValidityKey, CoolQuery::L1CountFolderData> L1accept_map;
523
525 IOVRange iovr(
IOVTime((*it)->startRunNumber(),(*it)->startLumiBlockNumber()),
526 IOVTime((*it)->stopRunNumber(),(*it)->stopLumiBlockNumber()));
527
528
529 m_t_totalDelL = 0.;
530 m_t_totalL = 0.;
531 m_t_totalLRun = 0.;
532 m_t_totaltime = 0.;
533 m_t_deltaT = 0.;
534 m_t_l1acc = 0;
535 m_t_l2acc = 0;
536 m_t_l3acc = 0;
537 m_t_totalgoodblock = 0;
538 m_t_totalbadblock = 0;
539 m_t_totall1befpresc = 0;
540 m_t_totalPrescaleWLiveTime = 0.;
541 m_t_totalPrescale = 0.;
542 m_t_lumiWOPrescale = 0. ;
543 m_t_lumiLAr = 0.;
544
545 m_runnbr = iovr.start().run();
546 m_lbstart = iovr.start().event();
547 m_lbstop = iovr.stop().event();
548
549
550 if(m_lbstart_prev == m_lbstart && m_lbstop_prev == m_lbstop && m_runnbr_prev == m_runnbr){
551 m_logger <<
Root::kWARNING <<
"Skipping multiply stored IOVRange: [" << m_lbstart <<
"-" << m_lbstop <<
"]" << Root::GEndl;
552 continue;
553 }
554
555
556 if ( m_runnbr!=m_runnbr_prev ) {
557
558 if (m_runnbr < m_minrun) m_minrun = m_runnbr;
559 if (m_runnbr > m_maxrun) m_maxrun = m_runnbr;
560
561 m_totalLRun=0.;
562 m_total_l1ratediveffxsecRun=0.;
563 m_total_l1ratediveffxsecRun_recorded=0.;
564
565
568
569
570 m_L1Valid = false;
571 m_L2Valid = false;
572 m_L3Valid = false;
573 m_LiveValid = false;
574 m_triggerlowerchains.clear();
575
576 m_L1triggerchains.clear();
577 m_L1idList.clear();
578
579 std::string lowerch = "";
580
581
582 if(m_triglevel == 3){
585
587 m_triggerlowerchains.push_back(lowerch);
588
590 if (m_L2id == UINT_MAX) {
591 throw std::runtime_error("LumiCalculator::IntegrateLumi : getHLTChannelId returned invalid value.");
592 }
594
596 m_triggerlowerchains.push_back(lowerch);
597
598 m_L1id = cq_trigger->
getL1ChannelId(lowerch, m_parlvl1menufolder );
600
601 }else if(m_triglevel == 2){
603 m_triggerlowerchains.push_back(lowerch);
606
607 ParseL1Trigger(lowerch, cq_trigger);
608
609 }else if(m_triglevel == 1){
610
612 }
613
614 if (firstL1Missing && (!m_L1Valid && m_triglevel > 0)) {
615 firstL1Missing = false;
617 }
618
619 if (firstHLTMissing && ((!m_L2Valid && m_triglevel > 1) || (!m_L3Valid && m_triglevel > 2)) ) {
620 firstHLTMissing = false;
622 }
623
624
625
626
627 if(m_uselivetrigger){
628 m_LiveL1id = cq_trigger->
getL1ChannelId(m_livetrigger, m_parlvl1menufolder);
630 }else{
631
632 m_LiveL1id = m_L1id;
633 m_LiveValid = m_L1Valid;
634 }
635
636 if (!m_LiveValid) {
637 if (m_uselivetrigger)
638 m_logger <<
Root::kWARNING <<
"Runnumber: [" << m_runnbr <<
"] can't find livefraction trigger [" << m_livetrigger <<
"]! Livefraction won't be calculated!" << Root::GEndl;
639 else
640 m_logger <<
Root::kWARNING <<
"Runnumber: [" << m_runnbr <<
"] can't find trigger [" <<
triggerchain <<
"]! Livefraction won't be calculated!" << Root::GEndl;
641 }
642
643
644
645
646
647
648
649 Livetime_map.clear();
650 L1accept_map.clear();
651
652 if (m_LiveValid)
654
655
656 if (m_L1Valid && m_triglevel >= 1)
658
659
660 L1starttime_map.clear();
661 L1endtime_map.clear();
664
665
666
668
669 if (m_uselar) {
670 cool::ValidityKey runstarttime = L1starttime_map.begin()->second;
671 cool::ValidityKey runendtime = L1endtime_map.rbegin()->second;
672
673 cq_lar->
setIOV(runstarttime, runendtime);
674 LArObj = cq_lar->
getIOVData<cool::UInt32>(
"EventVeto", m_parlareventvetofolder, 0, m_lartag);
675 }
676
677
678
680
681 if (m_usebs) {
683 BSObj = cq_bs->
getIOVData<cool::Int32>(
"status", m_paronlbeamspotfolder, 0, m_bstag);
684 }
685
686
687
688
689 LumiDataMap.clear();
690 LumiDataMap = cq_lumi->
getLumiFolderData(m_parlumiestfolder, m_lumitag, m_Lumiid);
691
692
693 }
694
695 m_lbstart_prev = m_lbstart;
696 m_lbstop_prev = m_lbstop;
697 m_runnbr_prev = m_runnbr;
698
699
700 cq_trigger->
setIOV(iovr.start().re_time(), iovr.stop().re_time());
701
702
703 m_logger <<
Root::kINFO << std::left <<
"-----------------------------------" << Root::GEndl;
704 m_logger <<
Root::kINFO <<
"Beginning calculation for ";
705 if (m_triglevel > 0) {
706 m_logger <<
Root::kINFO <<
"Trigger " << m_triggerchain;
707 if(m_triggerlowerchains.size() > 0){
709 for(std::vector<std::string>::iterator sit = m_triggerlowerchains.begin(); sit != m_triggerlowerchains.end(); ++sit){
711 }
713 }
714 }
715 m_logger <<
Root::kINFO <<
"Run " << m_runnbr <<
" LB [" << m_lbstart <<
"-" << m_lbstop <<
"]" << Root::GEndl;
716 m_logger <<
Root::kINFO << std::left <<
"-----------------------------------" << Root::GEndl;
717
718
719
724
725 if(m_L1Valid) {
726
727 if (m_L1idList.size() <= 1) {
728 L1preObj = cq_trigger->
getIOVData<cool::Int32>(
"Lvl1Prescale", m_parlvl1prescalesfolder, m_L1id);
729
730
731 } else {
732
733 m_logger <<
Root::kINFO <<
"Resolving multiple L1 prescales:" << Root::GEndl;
734
735
736 L1preObj = cq_trigger->
getIOVData<cool::Int32>(
"Lvl1Prescale", m_parlvl1prescalesfolder, m_L1idList[0]);
737
738
739 std::list< std::pair<IOVRange, cool::Int32> >
::iterator it;
740
741 m_logger <<
Root::kINFO << std::setw(10) << std::left << m_L1triggerchains[0];
742 for(it = L1preObj.
data.begin(); it != L1preObj.
data.end(); ++it) {
743 m_logger <<
Root::kINFO << std::setw(1) << std::left <<
"[" <<
it->first.start().event() <<
"," <<
it->first.stop().event()-1 <<
"]:" ;
744
746 m_logger <<
it->second <<
", ";
747 else
748 m_logger << (0xFFFFFF /
float(0x1000000 -
it->second)) <<
", ";
749 }
751
752
753 for (unsigned int iid=1; iid < m_L1idList.size(); iid++) {
754 L1preOther = cq_trigger->
getIOVData<cool::Int32>(
"Lvl1Prescale", m_parlvl1prescalesfolder, m_L1idList[iid]);
755
756
757 m_logger <<
Root::kINFO << std::setw(10) << std::left << m_L1triggerchains[iid];
758 for(it = L1preOther.
data.begin(); it != L1preOther.
data.end(); ++it) {
759 m_logger <<
Root::kINFO << std::setw(1) << std::left <<
"[" <<
it->first.start().event() <<
"," <<
it->first.stop().event()-1 <<
"]:" ;
760
762 m_logger <<
it->second <<
", ";
763 else
764 m_logger << (0xFFFFFF /
float(0x1000000 -
it->second)) <<
", ";
765 }
767
768
769 std::list< std::pair<IOVRange, cool::Int32> >
::iterator it1;
770 std::list< std::pair<IOVRange, cool::Int32> >
::iterator it2;
771 for(it1 = L1preObj.
data.begin(), it2 = L1preOther.
data.begin(); it1 != L1preObj.
data.end(); ++it1, ++it2) {
772
773
774 if ((it2->second > 0) && (it1->second > it2->second)) {
775
776 if ((it1->second > 1) && (it2->second > 1)) {
777 m_logger <<
Root::kWARNING <<
"L1 Prescales combined with both triggers prescaled for Run " << m_runnbr <<
"!" << Root::GEndl;
778 }
779 it1->second = it2->second;
780 }
781 }
782 }
783
784
785
786 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"L1 Pre:";
787 for(it = L1preObj.
data.begin(); it != L1preObj.
data.end(); ++it) {
788 m_logger <<
Root::kINFO << std::setw(1) << std::left <<
"[" <<
it->first.start().event() <<
"," <<
it->first.stop().event()-1 <<
"]:" ;
789
791 m_logger <<
it->second <<
", ";
792 else
793 m_logger << (0xFFFFFF /
float(0x1000000 -
it->second)) <<
", ";
794 }
796
797 }
798
799 }
800
801 if(m_L2Valid && m_L2id != UINT_MAX) {
802 if (isrun2) {
803 L2preObj = cq_trigger->
getIOVData<cool::Float>(
"Prescale", m_parhltprescalesfolder, 20000 + m_L2id);
804 }
805 else {
806 L2preObj = cq_trigger->
getIOVData<cool::Float>(
"Prescale", m_parhltprescalesfolder, 2*m_L2id);
807 }
808 }
809
810 if(m_L3Valid) {
811 L3preObj = cq_trigger->
getIOVData<cool::Float>(
"Prescale", m_parhltprescalesfolder, 2*m_L3id+1);
812 }
813
814
815 L1starttime_map.clear();
816 L1endtime_map.clear();
819
820
821 if (L1starttime_map.begin()->first > iovr.start().re_time() || L1starttime_map.rbegin()->first < iovr.stop().re_time()) {
822 m_lbstart = (L1starttime_map.begin()->first & 0xFFFFFFFF);
823 m_lbstop = (L1starttime_map.rbegin()->first & 0xFFFFFFFF);
824 m_logger <<
Root::kINFO <<
"Restricting to valid ATLAS lumi block range [" << m_lbstart <<
"-" << m_lbstop <<
"]" << Root::GEndl;
825 }
826
827
828
829
830
831
832
833
834 int firstMissing = -1;
835 int lastMissing = -1;
836
837 for (cool::ValidityKey currentVK = L1starttime_map.begin()->first; currentVK <= L1starttime_map.rbegin()->first; currentVK++) {
838
839
842
843 m_clumiblocknbr = curIOV.
event();
844 m_clumiblocknbrend = curIOV.
event()+1;
845
846
847 if (lbrunset.count(curIOV.
re_time()) != 0) {
848 m_logger <<
Root::kWARNING <<
"Skipping duplicate [run,lumiblock]: " << curIOV <<
" !" << Root::GEndl;
849 continue;
850 } else {
851 lbrunset.insert(curIOV.
re_time());
852 }
853
854
855 m_totalgoodblock += 1;
856 m_t_totalgoodblock += 1;
857
858
859 std::map<cool::ValidityKey, CoolQuery::LumiFolderData>::iterator itOL = LumiDataMap.find(currentVK);
860
861
862 if (itOL == LumiDataMap.end()) {
863
864 m_t_totalbadblock++;
865 m_totalbadblock++;
866
867 if (firstMissing < 0) {
868
869 firstMissing = curIOV.
event();
870 lastMissing = firstMissing;
871 }
else if (
int(curIOV.
event()) == (lastMissing+1)) {
872
873 lastMissing = curIOV.
event();
874 } else {
875
876 if (firstMissing == lastMissing) {
877 m_logger <<
Root::kWARNING <<
"Luminosity info not found for Run " << m_runnbr <<
" LB " << firstMissing <<
" !" << Root::GEndl;
878 } else {
879 m_logger <<
Root::kWARNING <<
"Luminosity info not found for Run " << m_runnbr <<
" LB [" << firstMissing <<
"-" << lastMissing <<
"] !" << Root::GEndl;
880 }
881 firstMissing = curIOV.
event();
882 lastMissing = firstMissing;
883 }
884
885
886 if (currentVK == L1starttime_map.rbegin()->first) {
887 if (firstMissing == lastMissing) {
888 m_logger <<
Root::kWARNING <<
"Luminosity info not found for Run " << m_runnbr <<
" LB " << firstMissing <<
" !" << Root::GEndl;
889 } else {
890 m_logger <<
Root::kWARNING <<
"Luminosity info not found for Run " << m_runnbr <<
" LB [" << firstMissing <<
"-" << lastMissing <<
"] !" << Root::GEndl;
891 }
892 firstMissing = -1;
893 lastMissing = -1;
894 }
895
896
897 continue;
898
899 } else {
900
901
902 if (firstMissing >= 0) {
903 if (firstMissing == lastMissing) {
904 m_logger <<
Root::kWARNING <<
"Luminosity info not found for Run " << m_runnbr <<
" LB " << firstMissing <<
" !" << Root::GEndl;
905 } else {
906 m_logger <<
Root::kWARNING <<
"Luminosity info not found for Run " << m_runnbr <<
" LB [" << firstMissing <<
"-" << lastMissing <<
"] !" << Root::GEndl;
907 }
908
909 firstMissing = -1;
910 lastMissing = -1;
911 }
912
913 }
914
915
916
917 m_instLumi = (itOL->second).LBAvInstLumi;
918 m_AvEvtsPerBX = (itOL->second).LBAvEvtsPerBX;
919 m_Valid = (itOL->second).Valid;
920
921
922
923 m_l1acc = 0.;
924 m_beforeprescale = 0.;
925 m_afterprescale = 0.;
926 m_l2acc = 0.;
927 m_l3acc = 0.;
928
929
930 m_l1prescale = -1.;
931 m_l2prescale = -1.;
932 m_l3prescale = -1.;
933
934
935 if(m_L1Valid && m_triglevel > 0) {
936
937
938 if (isrun2) {
940 m_l1prescale = L1preObj.
getValue(curIOV);
941 else
942 m_l1prescale = 0xFFFFFF /
float(0x1000000 - L1preObj.
getValue(curIOV));
943 }
944 else {
945 m_l1prescale = L1preObj.
getValue(curIOV);
946 }
947
948 if (m_triglevel >=2) {
949 if(m_L2Valid) {
950
951
952 m_l2prescale = L2preObj.
getValue(curIOV);
953
954 }
955
956
957 } else {
958
959 m_l2prescale = 1.;
960 }
961
962 if(m_triglevel == 3){
963 if (m_L3Valid) {
964
965
966 m_l3prescale = L3preObj.
getValue(curIOV);
967
968 }
969
970 } else {
971
972 m_l3prescale = 1.;
973 }
974 }
975
976
977
978 auto livetime_it = Livetime_map.find(currentVK);
979 if (livetime_it == Livetime_map.end()) {
980 throw std::runtime_error("LumiCalculator::IntegrateLumi Start or End times not found in map.");
981 }
983
986 m_livetime_l1acc = l1count.
L1Accept;
987 if(m_livetime_afterprescale > 0.){
988 m_livefrac = m_livetime_l1acc/(
float)m_livetime_afterprescale;
989 }else{
990 m_livefrac = 0.0;
991 }
992
993
994 if (m_runnbr == 286367) {
995 m_livefrac *= 5./6.;
996 }
997
998 if (m_runnbr == 281385) {
999 if (m_clumiblocknbr <= 196) {
1000 m_livefrac *= 4./6.;
1001 } else if (m_clumiblocknbr <= 374) {
1002 m_livefrac *= 5./6.;
1003 }
1004 }
1005
1006
1007 if(m_livetime_beforeprescale > 0 && m_livetime_afterprescale <= 0 ){
1008 std::string ttrig = "";
1010 if(m_uselivetrigger)ttrig = m_livetrigger;
1011 m_logger <<
Root::kWARNING <<
"L1 counts after prescale (before veto) are 0.0 for trigger " << std::move(ttrig) <<
"! Livefraction set to zero!" << Root::GEndl;
1012 m_logger <<
Root::kWARNING <<
"Try using a high rate L1 trigger for livetime calculation: --livetrigger=<high rate L1 trigger> " << Root::GEndl;
1013 m_logger <<
Root::kINFO << m_runnbr <<
"[" << m_clumiblocknbr <<
"]: L1Acc: " << m_l1acc <<
", AfterPrescale: " << m_afterprescale <<
", L1Presc: " << m_l1prescale << Root::GEndl;
1014 }
1015
1016
1017
1018 auto itStartTime = L1starttime_map.find(currentVK);
1019 auto itEndTime = L1endtime_map.find(currentVK);
1020 if (itStartTime == L1starttime_map.end() or itEndTime == L1endtime_map.end()){
1021 throw std::runtime_error("LumiCalculator::IntegrateLumi Start or End times not found in map.");
1022 }
1023 cool::ValidityKey lbstarttime = L1starttime_map.find(currentVK)->second;
1024 cool::ValidityKey lbendtime = L1endtime_map.find(currentVK)->second;
1025
1026 m_lartime = 0.;
1027 if (m_uselar) {
1028
1030 lbstart.setRETime(lbstarttime);
1031 lbend.setRETime(lbendtime);
1033
1034 std::list<std::pair<IOVRange, cool::UInt32> > larlist;
1036
1037 for (std::list<std::pair<IOVRange, cool::UInt32> >
::iterator it = larlist.begin(); it != larlist.end(); ++it) {
1038 if (
it->second == 0)
continue;
1039 float dtime = (
it->first.stop().re_time() -
it->first.start().re_time())/1.E9;
1040 m_lartime += dtime;
1041 if (m_verbose == true) {
1042 m_logger <<
Root::kINFO <<
"Found LAr veto from " <<
it->first.start().re_time() <<
" to " <<
it->first.stop().re_time() <<
" = " << dtime <<
" seconds" << Root::GEndl;
1043 }
1044 }
1045 }
1046
1047
1048
1049 m_bsvalid = 1.;
1050 if (m_usebs) {
1051
1052
1055
1056
1057 if (status != 7)
valid =
false;
1058
1059 if (!valid) {
1060 m_bsvalid = 0.0;
1061 m_livefrac = 0.0;
1062 if(m_verbose == true){
1063 m_logger <<
Root::kINFO << m_runnbr <<
"[" << m_clumiblocknbr <<
"]: Online beamspot invalid with Lumi=" << m_instLumi <<
" 10^30 cm-2 s-1" << Root::GEndl;
1064 }
1065 }
1066 }
1067
1068
1069
1070 {
1071 auto it = L1accept_map.find(currentVK);
1072 if (it == L1accept_map.end()) {
1073 throw std::runtime_error("LumiCalculator::IntegrateLumi Start or End times not found in map.");
1074 }
1075 l1count =
it->second;
1076 }
1078 m_beforeprescaleof = false;
1080 m_afterprescaleof = false;
1082 m_l1accof = false;
1083
1084 m_deltaT = (lbendtime-lbstarttime)/1.E9;
1085 m_lbstarttime = lbstarttime/1.E9;
1086 m_lbendtime = lbendtime/1.E9;
1087
1088 if (m_deltaT > 0.) m_larfrac = 1.-m_lartime/m_deltaT;
1089
1090
1091 if(m_onlinelumi == true){
1092
1093
1094 cool::UInt32 tempValid = (m_Valid & 1023);
1095
1096 if(tempValid == 10){
1097
1098 if((m_Valid >> 22) == 301
1099 || (m_Valid >> 22) == 302
1100 || (m_Valid >> 22) == 101
1101 || (m_Valid >> 22) == 102
1102 || (m_Valid >> 22) == 103
1103 || (m_Valid >> 22) == 104
1104 ){
1105 m_Valid = 0;
1106 }else{
1107 m_Valid = tempValid;
1108 }
1109 }else{
1110 m_Valid = tempValid;
1111 }
1112
1113 } else {
1114
1115
1116 m_Valid &= 0xFFFF;
1117 }
1118
1119
1120 if(m_verbose == true){
1121 m_logger <<
Root::kINFO << m_runnbr <<
"[" << m_clumiblocknbr <<
"]: L1Acc: " << m_l1acc;
1122 if(m_uselivetrigger) m_logger << ", Livetime trigger L1Acc: " << m_livetime_l1acc;
1123 m_logger << ", InstLumi: " << m_instLumi << ", deltaT: " << m_deltaT << ", AvEvtsPerBX: " << m_AvEvtsPerBX << ", BeforePrescale: " << m_beforeprescale << ", AfterPrescale: " << m_afterprescale;
1124 if (m_uselivetrigger) m_logger << ", Livetime trigger BeforePrescale: " << m_livetime_beforeprescale << " Livetime trigger AfterPrescale: " << m_livetime_afterprescale;
1125 if (isrun2) {
1126 m_logger << ", Livefrac: " << m_livefrac << ", L1Presc: " << m_l1prescale << ", HLTPresc: " << m_l2prescale << ", Valid: " << m_Valid;
1127 } else {
1128 m_logger << ", Livefrac: " << m_livefrac << ", L1Presc: " << m_l1prescale << ", L2Presc: " << m_l2prescale << ", L3Presc: " << m_l3prescale << ", Valid: " << m_Valid;
1129 }
1130 if (m_uselar) m_logger << ", LAr ready fraction: " << m_larfrac;
1131 m_logger << Root::GEndl;
1132 }
1133
1134
1135
1136 if(m_Valid%10 != 0){
1137
1138
1139 m_instLumi = 0.0;
1140 m_totalbadblock += 1;
1141 m_t_totalbadblock += 1;
1142 m_logger <<
Root::kWARNING <<
"Skipping lumiblock " << m_runnbr <<
"[" << m_clumiblocknbr <<
"] with invalid inst. lumi. (valid=" << m_Valid <<
")!" << Root::GEndl;
1143
1144 } else if ((m_triglevel > 0) && (m_l1prescale < 0. || m_l2prescale < 0. || m_l3prescale < 0.)) {
1145
1146
1147 m_totalbadblock += 1;
1148 m_t_totalbadblock += 1;
1149 m_logger <<
Root::kWARNING <<
"Lumiblock " << m_runnbr <<
"[" << m_clumiblocknbr <<
"] has a disabled or incorrectly specified trigger.! " << Root::GEndl;
1150
1151 }
1152
1153
1154
1155
1156
1157
1158 m_totalDelL += (m_deltaT*m_instLumi);
1159 m_t_totalDelL += (m_deltaT*m_instLumi);
1160 m_t_deltaT += m_deltaT;
1161
1162
1163 m_totall1acc += m_l1acc;
1164 m_livtrig_totall1acc += m_livetime_l1acc;
1165 m_t_l1acc += m_l1acc;
1166 m_totall1befpresc += m_beforeprescale;
1167 m_t_totall1befpresc += m_beforeprescale;
1168 m_totall2acc += m_l2acc;
1169 m_t_l2acc += m_l2acc;
1170 m_totall3acc += m_l3acc;
1171 m_t_l3acc += m_l3acc;
1172 m_livetime = m_livefrac*m_deltaT;
1173 m_totaltime += m_livetime;
1174 m_t_totaltime += m_livetime;
1175
1176 double totalPrescale = m_l1prescale * m_l2prescale * m_l3prescale;
1177
1178
1179 if (m_l1prescale < 0. ) totalPrescale = 0.;
1180 if (m_l2prescale < 0. ) totalPrescale = 0.;
1181 if (m_l3prescale < 0. ) totalPrescale = 0.;
1182
1183
1184 if (m_triglevel == 0) totalPrescale = 1.;
1185
1186 m_intLumi = 0.;
1187
1188 m_lumiWOPrescale += m_livetime*m_instLumi ;
1189 m_t_lumiWOPrescale += m_livetime*m_instLumi ;
1190
1191 m_lumiLAr += m_livetime*m_larfrac*m_instLumi;
1192 m_t_lumiLAr += m_livetime*m_larfrac*m_instLumi;
1193
1194 if (totalPrescale > 0.) {
1195 m_totalPrescaleWLiveTime += m_livetime/totalPrescale;
1196 m_t_totalPrescaleWLiveTime += m_livetime/totalPrescale;
1197 m_totalPrescale += 1./totalPrescale;
1198 m_t_totalPrescale += 1./totalPrescale;
1199 m_intLumi = m_larfrac * m_livetime * m_instLumi/totalPrescale;
1200 }
1201
1202
1203 m_totalL += m_intLumi;
1204 m_t_totalL += m_intLumi;
1205 m_totalLRun += m_intLumi;
1206
1207
1208
1209 m_l1rate = ( m_livetime>0 ? m_l1acc / m_livetime : 0. );
1210 m_l2rate = ( m_livetime>0 ? m_l2acc / m_livetime : 0. );
1211 m_l3rate = ( m_livetime>0 ? m_l3acc / m_livetime : 0. );
1212
1213
1214 m_l1ratediveffxsec = (
float)m_afterprescale/( m_deltaT*m_effxsec );
1215 m_total_l1ratediveffxsec += (
float)m_afterprescale / m_effxsec ;
1216 m_total_l1ratediveffxsecRun += (
float)m_afterprescale / m_effxsec ;
1217
1218
1219 m_l1ratediveffxsec_recorded = (
float)m_l1acc /( m_deltaT*m_effxsec );
1220 m_total_l1ratediveffxsec_recorded += (
float)m_l1acc / m_effxsec ;
1221 m_total_l1ratediveffxsecRun_recorded += (
float)m_l1acc / m_effxsec ;
1222
1223 if (m_collsgrl!=0) {
1224 if ( m_l1rate>=m_mintrigrate )
1225 m_collsgrl->AddRunLumiBlock(m_runnbr,m_clumiblocknbr);
1226 }
1227
1228 if (m_verbose) {
1229 if (m_effxsec!=1.0)
1230 m_logger <<
Root::kINFO <<
"L1rate a/ prescale: " << m_afterprescale <<
", Delivered LumiFromL1rate (/ub): " << m_l1ratediveffxsec <<
", Delivered TotalLumiFromL1rate (/ub): " << m_total_l1ratediveffxsec
1231 << Root::GEndl;
1232 }
1233
1234 if(m_LumiTree != 0)m_LumiTree->Fill();
1235 }
1236
1237
1239 m_logger <<
Root::kINFO<< std::setw(10) << std::right <<
"Run" << std::setw(10) << std::right <<
"L1-Acc" << std::setw(10) << std::right <<
"L2-Acc" << std::setw(10) << std::right <<
"L3-Acc" << std::setw(10) << std::right <<
"LiveTime" << std::setw(18) << std::right <<
"IntL rec.(ub^-1)" << std::setw(18) << std::right <<
"IntL del.(ub^-1)" << Root::GEndl;
1240 m_logger <<
Root::kINFO<< std::setw(10) << std::right << m_runnbr << std::setw(10) << std::right << m_t_l1acc << std::setw(10) << std::right << m_t_l2acc << std::setw(10) << std::right << m_t_l3acc << std::setw(10) << std::right << m_t_totaltime << std::setw(18) << std::right << m_t_totalL << std::setw(18) << std::right << m_t_totalDelL << Root::GEndl;
1241
1242
1243 m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"L1/2/3 accept: " << std::setw(10) << std::left << m_t_l1acc << std::setw(10) << std::left << m_t_l2acc << std::setw(10) << std::left << m_t_l3acc << Root::GEndl;
1244 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"L1BeforePresc: " << std::setw(10) << std::left << m_t_totall1befpresc << Root::GEndl;
1245 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Livetime : " << m_t_totaltime << Root::GEndl;
1246 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Prescale Weighted Livetime: " << m_t_totalPrescaleWLiveTime << Root::GEndl;
1247 m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"Good LBs : " << m_t_totalgoodblock - m_t_totalbadblock << Root::GEndl;
1248 m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"Bad LBs : " << m_t_totalbadblock << Root::GEndl;
1249
1250 if ( m_effxsec==1.0 ) {
1251 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"IntL delivered (ub^-1) : " << m_t_totalDelL << Root::GEndl;
1252 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"IntL after livefraction (ub^-1): " << m_t_lumiWOPrescale << Root::GEndl;
1253 if (m_uselar)
1254 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"IntL after LAr fraction (ub^-1): " << m_t_lumiLAr << Root::GEndl;
1255 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"IntL recorded after prescale (ub^-1) : " << m_t_totalL << Root::GEndl;
1256 } else {
1257 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"IntL delived (ub^-1) : " << m_total_l1ratediveffxsec << Root::GEndl;
1258 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"IntL recorded (ub^-1) : " << m_total_l1ratediveffxsec_recorded << Root::GEndl;
1259 }
1260
1261
1262 if(m_triglevel >= 1){
1263
1264 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"L1 Prescales: ";
1265
1266 std::list< std::pair<IOVRange, cool::Int32> >
::iterator it;
1267 for(it = L1preObj.
data.begin(); it != L1preObj.
data.end(); ++it) {
1268 m_logger <<
Root::kINFO << std::setw(1) << std::left <<
"[" <<
it->first.start().event() <<
"," <<
it->first.stop().event()-1 <<
"]:" ;
1269 if (isrun2) {
1271 m_logger <<
it->second <<
", ";
1272 else
1273 m_logger << (0xFFFFFF /
float(0x1000000 -
it->second)) <<
", ";
1274 } else {
1275 m_logger <<
it->second <<
", ";
1276 }
1277 }
1279 }
1280
1281 if(m_triglevel >= 2){
1282
1283 if (isrun2) {
1284 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"HLT Prescales: ";
1285 }
1286 else {
1287 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"L2 Prescales: ";
1288 }
1289
1290 std::list< std::pair<IOVRange, cool::Float> >
::iterator it;
1291 for(it = L2preObj.
data.begin(); it != L2preObj.
data.end(); ++it) {
1292 m_logger <<
Root::kINFO << std::setw(1) << std::left <<
"[" <<
it->first.start().event() <<
"," <<
it->first.stop().event()-1 <<
"]:" <<
it->second <<
", ";
1293 }
1295 }
1296
1297 if(m_triglevel == 3){
1298
1299 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"L3 Prescales: ";
1300
1301 std::list< std::pair<IOVRange, cool::Float> >
::iterator it;
1302 for(it = L3preObj.
data.begin(); it != L3preObj.
data.end(); ++it) {
1303 m_logger <<
Root::kINFO << std::setw(1) << std::left <<
"[" <<
it->first.start().event() <<
"," <<
it->first.stop().event()-1 <<
"]:" <<
it->second <<
", ";
1304 }
1306 }
1307
1308 }
1309
1310
1311
1312
1313 m_logger <<
Root::kINFO << std::left <<
"-----------------------------------" << Root::GEndl;
1314 m_logger <<
Root::kINFO << std::left <<
" LumiCalculator summary" << Root::GEndl;
1315 m_logger <<
Root::kINFO << std::left <<
"-----------------------------------" << Root::GEndl;
1316 m_logger <<
Root::kINFO<< std::setw(10) << std::right <<
"Total" << std::setw(10) << std::right <<
"L1-Acc" << std::setw(10) << std::right <<
"L2-Acc" << std::setw(10) << std::right <<
"L3-Acc" <<
1317 std::setw(10) << std::right << "LiveTime" << std::setw(18) << std::right << "IntL rec.(ub^-1)" << std::setw(18) << std::right << "IntL del.(ub^-1)" << Root::GEndl;
1318 m_logger <<
Root::kINFO<< std::setw(10) << std::right <<
"" << std::setw(10) << std::right << m_totall1acc << std::setw(10) << std::right << m_totall2acc << std::setw(10) << std::right
1319 << m_totall3acc << std::setw(10) << std::right << m_totaltime << std::setw(18) << std::right << m_totalL << std::setw(18) << std::right << m_totalDelL << Root::GEndl;
1320 m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"Total L1/2/3 accept: " << std::setw(10) << std::left << m_totall1acc << std::setw(10) << std::left << m_totall2acc << std::setw(10)
1321 << std::left << m_totall3acc << Root::GEndl;
1322 if(m_uselivetrigger)m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"Total L1 livetime trigger accept: " << std::setw(10) << std::left << m_livtrig_totall1acc << Root::GEndl;
1323
1324 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"First Run: " << std::setw(10) << std::left << m_minrun << Root::GEndl;
1325 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Last Run: " << std::setw(10) << std::left << m_maxrun << Root::GEndl;
1326 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Total L1BeforePresc: " << std::setw(10) << std::left << m_totall1befpresc << Root::GEndl;
1327 m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"Total Livetime : " << m_totaltime << Root::GEndl;
1328 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Total prescale weighted Livetime: " << m_totalPrescaleWLiveTime << Root::GEndl;
1329 m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"Total Good LBs : " << m_totalgoodblock - m_totalbadblock << Root::GEndl;
1330 m_logger <<
Root::kINFO<< std::setw(10) << std::left <<
"Total Bad LBs : " << m_totalbadblock << Root::GEndl;
1331 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Total IntL delivered (ub^-1) : " << m_totalDelL << Root::GEndl;
1332 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Total IntL after livefraction (ub^-1): " << m_lumiWOPrescale << Root::GEndl;
1333 if (m_uselar)
1334 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Total IntL after LAr fraction (ub^-1): " << m_lumiLAr << Root::GEndl;
1335 m_logger <<
Root::kINFO << std::setw(10) << std::left <<
"Total IntL recorded (ub^-1) : " << m_totalL << Root::GEndl;
1336
1337
1338
1339 if(m_makecollList == true){
1340
1341 if (m_collsgrl!=0) {
1342 TString collisionsxml = "collisions_" + m_collsgrl->GetSuggestedName() + ".xml";
1344 writer.SetGoodRunsList( *m_collsgrl );
1345 writer.SetFilename( collisionsxml.Data() );
1347
1348 delete m_collsgrl; m_collsgrl=0;
1349 }
1350 }
1351
1352
1353
1355
1356 delete cq_trigger;
1357 delete cq_lumi;
1358 delete cq_lar;
1359 delete cq_bs;
1360}
std::shared_ptr< HepMC3::Writer > writer
cool::ChannelId getHLTChannelId(const std::string &trigger, const std::string &folder_name)
void setIOV(const cool::ValidityKey start, const cool::ValidityKey stop)
IOVData< T > getIOVData(const std::string &name, const std::string &folder_name, const cool::ChannelId &id, const std::string &tag="")
std::map< cool::ValidityKey, L1CountFolderData > getL1CountFolderData(const std::string &folder_name, const cool::ChannelId &id)
unsigned int getTriggerLevel(const std::string &triggername)
void setIOVForRun(unsigned int runnum)
void printHLTTriggers(const std::string &folder_name)
std::map< cool::ValidityKey, LumiFolderData > getLumiFolderData(const std::string &folder_name, const std::string &tag, const cool::ChannelId &id)
void printL1Triggers(const std::string &folder_name)
cool::ChannelId getL1ChannelId(const std::string &trigger, const std::string &folder_name)
cool::ChannelId getLumiChannelId(const std::string &lumimethod, const std::string &folder_name)
std::string getHLTLowerChainName(const std::string &trigger, const std::string &folder_name)
std::map< cool::ValidityKey, T > getObjMapFromFolderAtChan(const std::string &obj_name, const std::string &folder_name, const cool::ChannelId &id)
DataModel_detail::const_iterator< DataVector > const_iterator
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
std::list< std::pair< IOVRange, T > > getOverlap(const IOVRange &range)
std::list< std::pair< IOVRange, T > > data
Basic time unit for IOVSvc.
void setRETime(uint64_t time) noexcept
uint32_t event() const noexcept
uint64_t re_time() const noexcept
static std::vector< std::string > triggerchain
static std::vector< uint32_t > lbstart
static std::vector< uint32_t > lbend
MakePlots(tree, datapath)
cool::UInt63 AfterPrescale
cool::UInt63 BeforePrescale