35#include "GaudiKernel/IEventProcessor.h"
43#include "TProfile2D.h"
44#include "Math/ProbFuncMathCore.h"
54const std::string shortNames[] = {
"EndCapC",
"Barrel",
"EndCapA"};
56bool areConsecutiveIntervals(
const std::pair<int, int>& i1,
const std::pair<int, int>& i2,
const int withinLimits) {
57 return i1.second <= (i2.first + withinLimits);
59const std::string
xmlHeader{
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"};
60const std::string linefeed{
"\n"};
62associateStylesheet(
const std::string& stylesheetName) {
63 return std::string(
"<?xml-stylesheet type=\"text/xsl\" href=\"")+stylesheetName+
"\"?>";
68xmlPartData(
const Bec bec,
const int layer,
const int eta,
const std::string& dataName,
const T data) {
69 std::ostringstream
os;
70 const std::string thisPart{shortNames[
bec2Index(bec)]};
71 os <<
" <parts>" << std::endl
72 <<
" " <<
xmlValue(
"part", thisPart) << std::endl
73 <<
" " <<
xmlValue(
"layer", layer) << std::endl
75 std::string barrelEtaXml{
xmlValue(
"eta",
"all")};
78 else os << endcapEtaXml;
80 <<
" " <<
xmlValue(dataName, data) << std::endl
81 <<
" </parts>" << std::endl;
87xmlModuleData(
const Bec bec,
const int layer,
const int side,
const int phi,
const int eta,
const std::string& dataName,
const T data,
const std::string& serial,
const std::string& listOfErrors) {
88 std::ostringstream
os;
89 os <<
" <module>" << std::endl
90 <<
" " <<
xmlValue(
"SN", serial) << std::endl;
92 if (bec==ENDCAP_C)
os <<
" " <<
xmlValue(
"barrel_endcap",
"-2") << std::endl;
93 else if (bec==
BARREL)
os <<
" " <<
xmlValue(
"barrel_endcap",
"0") << std::endl;
94 else if (bec==ENDCAP_A)
os <<
" " <<
xmlValue(
"barrel_endcap",
"2") << std::endl;
95 os <<
" " <<
xmlValue(
"layer", layer) << std::endl
96 <<
" " <<
xmlValue(
"side", side) << std::endl
99 <<
" " <<
xmlValue(dataName, data) << std::endl;
101 os <<
" </module>" << std::endl;
127 return StatusCode::FAILURE;
136 ATH_MSG_DEBUG(
"ReadCalibDataTool was removed in initialization");
143 ATH_MSG_DEBUG(
"MajorityConditionsTool was removed in initialization");
155 ATH_MSG_DEBUG(
"ByteStreamErrorsSvc was removed in initialization");
182 ATH_MSG_ERROR(
"Both BS and HIST are set to be read. Choose either of BS or HIST.");
183 return StatusCode::FAILURE;
188 ATH_MSG_INFO(
"------------> Reading from ByteStream <-------------");
194 ATH_MSG_INFO(
"------------> Reading from HIST <-------------");
197 std::string hist{
""};
204 ATH_MSG_ERROR(
"The input histogram collection property is empty");
205 return StatusCode::FAILURE;
216 const std::string os{std::to_string(
m_runNumber.value())};
218 if (not
m_inputHist->GetDirectory(
"/run_"+TString{os})) {
219 ATH_MSG_ERROR(
"RunNumber in HIST is inconsistent with jobO : " << os);
220 return StatusCode::FAILURE ;
224 std::string osHist{std::string{
"/run_"} + std::to_string(
m_runNumber.value())+
"/SCT/GENERAL/Conf/NumberOfEventsVsLB"};
225 TH1F* hist_events{
dynamic_cast<TH1F*
>(
m_inputHist->Get(osHist.c_str()))};
232 ATH_MSG_INFO(
"Initialization of TimeStamp/LB, taken from runInfo.txt");
247 ATH_MSG_INFO(
"Set CalibEventInfo for m_readHitMaps == true");
277 return StatusCode::SUCCESS;
283 if (obtained<required) {
284 ATH_MSG_ERROR(
"Number of events in " << histogramName <<
": " << obtained <<
" is less than the required minimum number of events " << required);
301 const int timeStamp{
static_cast<int>(ctx.eventID().time_stamp())};
302 const int lumiBlock{
static_cast<int>(ctx.eventID().lumi_block())};
303 int timeStampBeginOld;
306 m_calibEvtInfoTool->setTimeStamp(std::min(timeStamp, timeStampBeginOld), std::max(timeStamp, timeStampEndOld));
310 m_calibEvtInfoTool->setLumiBlock(std::min(lumiBlock, lbBeginOld), std::max(lumiBlock, lbEndOld));
334 return StatusCode::SUCCESS;
344 m_numberOfEvents = (m_readHIST or (!m_doHitMaps and m_readHitMaps)) ? m_numberOfEventsHist : m_calibEvtInfoTool->counter();
345 m_calibEvtInfoTool->getTimeStamps(m_utcBegin, m_utcEnd);
348 unsigned int beginRun{
static_cast<unsigned int>(m_runNumber.value())};
349 unsigned int endRun{
static_cast<unsigned int>(m_runNumber.value())};
352 m_iovStart.setRunEvent(
static_cast<unsigned long>(beginRun),
static_cast<unsigned long>(beginLB));
353 m_iovStop.setRunEvent(
static_cast<unsigned long>(endRun),
static_cast<unsigned long>(endLB));
356 const bool doNoisyStripAnalysis{((!m_doHitMaps and m_readHitMaps) or !m_readHitMaps) and m_doNoisyStrip};
357 if (doNoisyStripAnalysis) {
358 if (getNoisyStrip().isFailure()) {
360 return StatusCode::FAILURE;
366 m_gofile.open(m_badModulesFile.value().c_str(), std::ios::out);
367 if (not m_gofile)
ATH_MSG_ERROR(
"Problem opening " << m_badModulesFile);
373 const unsigned int onlyDummy{1};
374 std::pair<int, int> timeInterval{0, 0};
375 std::pair<int, int> lbRange{0, 0};
376 const int withinLimits{m_maxtbins};
378 for (; waferItr not_eq waferItrE; ++waferItr) {
381 const std::vector<std::pair<int, int>>& tvec{m_summarytrips.at(waferHash.
value())};
382 const std::vector<std::pair<int, int>>& tlbn{m_summarytripslb.at(waferHash.
value())};
384 const unsigned int numberOfElements{
static_cast<unsigned int>(tvec.size())};
385 if (numberOfElements > onlyDummy) {
387 timeInterval=tvec.at(1);
389 for (
unsigned int itrip{2}; itrip != numberOfElements; ++itrip) {
390 if (areConsecutiveIntervals(tvec[itrip], timeInterval, withinLimits)) {
391 timeInterval.second = tvec.at(itrip).second;
392 lbRange.second = tlbn.at(itrip).second;
395 doHVPrintXML(timeInterval, lbRange, waferId);
396 timeInterval = tvec.at(itrip);
397 lbRange = tlbn.at(itrip);
400 doHVPrintXML(timeInterval, lbRange, waferId);
406 if ((m_doDeadStrip or m_doDeadChip) and getDeadStrip().isFailure()) {
408 return StatusCode::FAILURE;
412 if (m_doNoiseOccupancy and getNoiseOccupancy().isFailure()) {
414 return StatusCode::FAILURE;
418 if (m_doRawOccupancy and getRawOccupancy().isFailure()) {
420 return StatusCode::FAILURE;
424 if (m_doEfficiency and getEfficiency().isFailure()) {
426 return StatusCode::FAILURE;
430 if (m_doBSErrorDB and getBSErrors().isFailure()) {
432 return StatusCode::FAILURE;
436 if (m_doLorentzAngle and getLorentzAngle().isFailure()) {
438 return StatusCode::FAILURE;
442 if (m_readHIST) m_inputHist->Close();
444 return StatusCode::SUCCESS;
457 return StatusCode::FAILURE;
461 return StatusCode::SUCCESS;
506 enum Categories {ALL, NEW, REF, N_CATEGORIES};
511 const EventContext& ctx = Gaudi::Hive::currentContext();
514 m_numOfLBsProcessed = 0;
515 for (
int iLB{0}; iLB != m_LBRange; ++iLB) {
516 if (m_calibLbTool and m_calibLbTool->getNumberOfEventsInBin(iLB + 1) > 0) ++m_numOfLBsProcessed;
521 using ModuleList_t = std::map<Identifier, std::set<Identifier>>;
522 ModuleList_t moduleLists[N_CATEGORIES];
526 if (m_calibModuleListTool->readModuleList(ctx, moduleLists[REF]).isFailure()) {
528 return StatusCode::FAILURE;
532 using StripList_t = std::set<Identifier>;
533 StripList_t stripIdLists[2];
538 for (; waferItr not_eq waferItrE; ++waferItr) {
541 Identifier moduleId{m_pSCTHelper->module_id(waferId)};
543 if (m_pSCTHelper->side(waferId) == 0) {
544 stripIdLists[
ALL].clear();
545 stripIdLists[NEW].clear();
547 std::pair<int, bool> noisy{getNumNoisyStrips(waferId)};
548 const int numNoisyStripsInWafer{noisy.first};
549 const bool isNoisyWafer{noisy.second};
550 if (numNoisyStripsInWafer!=0 || m_noisyWriteAllModules) {
551 if (m_noisyWaferFinder and isNoisyWafer) {
553 if (not m_noisyWaferWrite)
break;
554 if (m_noisyWaferAllStrips) {
555 if (addStripsToList(ctx, waferId, stripIdLists[ALL],
false,
false).isFailure() or addStripsToList(ctx, waferId, stripIdLists[NEW],
false,
true).isFailure()) {
557 return StatusCode::FAILURE;
562 if (addStripsToList(ctx, waferId, stripIdLists[ALL],
true,
false).isFailure() or addStripsToList(ctx, waferId, stripIdLists[NEW],
true,
true).isFailure()) {
564 return StatusCode::FAILURE;
568 if (addStripsToList(ctx, waferId, stripIdLists[ALL],
true,
false).isFailure() or addStripsToList(ctx, waferId, stripIdLists[NEW],
true,
true).isFailure()) {
570 return StatusCode::FAILURE;
575 if (m_pSCTHelper->side(waferId) == 1) {
576 if (!stripIdLists[ALL].
empty()) moduleLists[
ALL].insert(std::map<
Identifier, std::set<Identifier> >::value_type(moduleId, stripIdLists[ALL]));
577 if (!stripIdLists[NEW].
empty()) moduleLists[NEW].insert(std::map<
Identifier, std::set<Identifier> >::value_type(moduleId, stripIdLists[NEW]));
584 if (writeModuleListToCool(moduleLists[ALL], moduleLists[NEW], moduleLists[REF]).isFailure()) {
586 return StatusCode::FAILURE;
590 if (noisyStripsToXml(moduleLists[ALL], m_badStripsAllFile).isFailure()) {
592 return StatusCode::FAILURE;
594 if (noisyStripsToXml(moduleLists[NEW], m_badStripsNewFile).isFailure()) {
596 return StatusCode::FAILURE;
599 if (noisyStripsToSummaryXml(moduleLists[ALL], moduleLists[REF], m_badStripsSummaryFile).isFailure()) {
601 return StatusCode::FAILURE;
604 return StatusCode::SUCCESS;
615 const EventContext& ctx = Gaudi::Hive::currentContext();
618 const std::set<Identifier>* badMods{m_ConfigurationConditionsTool->badModules(ctx)};
619 std::set<Identifier>::const_iterator ModItr{badMods->begin()};
620 std::set<Identifier>::const_iterator ModEnd{badMods->end()};
622 const std::map<IdentifierHash, std::pair<bool, bool> >* badLinks{m_ConfigurationConditionsTool->badLinks(ctx)};
623 std::map<IdentifierHash, std::pair<bool, bool> >
::const_iterator linkItr{badLinks->begin()};
624 std::map<IdentifierHash, std::pair<bool, bool> >
::const_iterator linkEnd{badLinks->end()};
626 const std::map<Identifier, unsigned int>* badChips{m_ConfigurationConditionsTool->badChips(ctx)};
627 std::map<Identifier, unsigned int>::const_iterator chipItr{badChips->begin()};
628 std::map<Identifier, unsigned int>::const_iterator chipEnd{badChips->end()};
630 std::set<Identifier> badStripsExclusive;
631 m_ConfigurationConditionsTool->badStrips(badStripsExclusive, ctx,
true,
true);
632 std::set<Identifier>::const_iterator stripEnd(badStripsExclusive.end());
634 int numEnabledModules_B[
n_barrels] = {n_phiBinsB0*n_etaInBarrel, n_phiBinsB1*n_etaInBarrel, n_phiBinsB2*n_etaInBarrel, n_phiBinsB3*n_etaInBarrel};
638 if (!((i==0 and j==2) or (i==6 and j==2) or (i==7 and j==2) or (i==8 and j==1) or (i==8 and j==2))) {
639 numEnabledModules_EC[
i][
j] =
j==0 ? n_phiBinsECOuter*2 : n_phiBinsECMiddle*2;
643 for (; ModItr!=ModEnd; ++ModItr) {
645 if (m_pSCTHelper->barrel_ec(moduleId)==
BARREL) numEnabledModules_B[m_pSCTHelper->layer_disk(moduleId)]--;
646 else numEnabledModules_EC[m_pSCTHelper->layer_disk(moduleId)][m_pSCTHelper->eta_module(moduleId)]--;
649 double meanOccupancy_Barrel[
n_barrels] = {0};
653 for (; waferItr != waferItrE; ++waferItr) {
656 for (
int j{0};
j<n_stripPerChip*n_chipPerSide;
j++) {
657 double n_hits{m_calibHitmapTool->getBinForHistogramIndex(j+1, waferHash.
value())};
658 if (n_hits/m_numberOfEvents<m_noisyThr4DeadFinding) {
659 if (m_pSCTHelper->barrel_ec(waferId)==
BARREL) {
660 meanOccupancy_Barrel[m_pSCTHelper->layer_disk(waferId)]+=m_calibHitmapTool->getBinForHistogramIndex(j+1, waferHash.
value());
662 meanOccupancy_EC[m_pSCTHelper->layer_disk(waferId)][m_pSCTHelper->eta_module(waferId)]+=m_calibHitmapTool->getBinForHistogramIndex(j+1, waferHash.
value());
669 meanOccupancy_Barrel[
i]/=
static_cast<double>(m_numberOfEvents*
nbins*2*numEnabledModules_B[
i]);
670 ATH_MSG_INFO(
"Barrel : layer=" << i <<
", meanOccupancy=" << meanOccupancy_Barrel[i] <<
", nbins:" <<
nbins <<
", #enabledModule=" << numEnabledModules_B[i]);
675 if (numEnabledModules_EC[i][j]!=0) {
676 meanOccupancy_EC[
i][
j]/=
static_cast<double>(m_numberOfEvents*
nbins*2*numEnabledModules_EC[
i][
j]);
677 ATH_MSG_INFO(
"EndCap : disk=" << i <<
", eta=" << j <<
", meanOccupancy=" << meanOccupancy_EC[i][j] <<
", #enabledModule=" << numEnabledModules_EC[i][j]);
681 bool busyStream{meanOccupancy_Barrel[3]>m_busyThr4DeadFinding ? true :
false};
682 unsigned int minStat{busyStream ?
static_cast<unsigned int>(m_deadStripMinStatBusy) : static_cast<
unsigned int>(m_deadStripMinStat)};
683 if (m_doDeadStrip and m_numberOfEvents<minStat) {
684 ATH_MSG_WARNING(
"required minimum statistics is " << minStat/1E3 <<
"k events for DeadStrip search with this stream");
685 m_doDeadStrip =
true;
687 if (m_doDeadChip and m_numberOfEvents<m_deadChipMinStat) {
688 ATH_MSG_WARNING(
"required minimum statistics is " <<
static_cast<unsigned int>(m_deadChipMinStat) <<
" events for DeadChip search");
691 if (m_doDeadStrip==
false and m_doDeadChip==
false) {
692 ATH_MSG_ERROR(
"Number of events " << m_numberOfEvents <<
" is less than the required minimum number of events... exit getDeadStrip()");
693 return StatusCode::FAILURE;
697 if (openXML4DB(m_outDeadStrips,
"DeadStrip", m_tagID4DeadStrips.value().c_str(), m_iovStart, m_iovStop).isFailure()) {
699 return StatusCode::FAILURE;
703 if (openXML4DB(m_outDeadChips,
"DeadChip", m_tagID4DeadChips.value().c_str(), m_iovStart, m_iovStop).isFailure()) {
705 return StatusCode::FAILURE;
712 if (elements==
nullptr) {
713 ATH_MSG_FATAL(m_SCTDetEleCollKey.fullKey() <<
" could not be retrieved");
714 return StatusCode::FAILURE;
718 bool hasDeadStrip{
false};
719 bool hasDeadChip{
false};
720 bool isNoHitLink{
false};
722 bool beforeIsDead{
false};
727 int n_checkedChip{0};
730 std::string defectStrip;
731 std::string defectChip;
732 std::ostringstream summaryList;
735 const double deadStripDefinition{ROOT::Math::gaussian_cdf_c(m_deadStripSignificance)};
736 const double deadChipDefinition{ROOT::Math::gaussian_cdf_c(m_deadChipSignificance)};
739 waferItr = m_pSCTHelper->wafer_begin();
740 for (; waferItr != waferItrE; ++waferItr) {
742 Identifier moduleId{m_pSCTHelper->module_id(waferId)};
745 bool disabledChip[n_chipPerModule] = {
false};
746 unsigned int disabledChipFlag=0;
747 double numHitsInStrip[n_stripPerChip*n_chipPerSide] = {0};
748 double numHitsInChip[n_chipPerSide] = {0};
749 double totalHitsInWafer{0};
751 int n_noHitsStrip{0};
752 int n_disabledStrip{0};
753 int n_disabledInChip[n_chipPerSide] = {0};
756 int side{m_pSCTHelper->side(waferId)};
768 if (badMods->find(moduleId)!=badMods->end())
disabled=
true;
769 linkItr=badLinks->find(waferHash);
770 if (linkItr!=linkEnd) {
771 std::pair<bool, bool>
status{(*linkItr).second};
776 bool hasBSError{
false};
777 if (m_calibBsErrTool->size(waferHash.
value())>0) hasBSError=
true;
778 if (disabled or hasBSError) {
781 if (defectChip==
" 0-5 6-11 ") {
783 }
else if (defectChip==
" 0-5 " or defectChip==
" 6-11 ") {
787 if (!(defectStrip.empty()) or !(defectChip.empty())) {
788 if (addToSummaryStr(summaryList, waferId,
"DEAD", defectStrip.c_str(), defectChip.c_str()).isFailure()) {
790 return StatusCode::FAILURE;
794 if (!(defectStrip.empty())) {
796 double threshold = m_deadStripSignificance;
797 if (!m_deadNotQuiet)
threshold = m_quietThresholdStrip;
799 if (m_pCalibWriteTool->createListStrip(moduleId, m_pSCTHelper, 10000,
"DEAD",
threshold, defectStrip).isFailure()) {
801 return StatusCode::FAILURE;
804 if (addToXML4DB(m_outDeadStrips, waferId,
"DEAD",
threshold, defectStrip.c_str()).isFailure()) {
806 return StatusCode::FAILURE;
812 if (!(defectChip.empty())) {
814 double threshold = m_deadChipSignificance;
815 if (!m_deadNotQuiet)
threshold = m_quietThresholdChip;
817 if (m_pCalibWriteTool->createListChip(moduleId, m_pSCTHelper, 10000,
"DEAD",
threshold, defectChip).isFailure()) {
819 return StatusCode::FAILURE;
823 if (addToXML4DB(m_outDeadChips, waferId,
"DEAD",
threshold, defectChip.c_str()).isFailure()) {
825 return StatusCode::FAILURE;
835 chipItr=badChips->find(moduleId);
836 if (chipItr!=chipEnd) disabledChipFlag = (*chipItr).second;
837 for (
unsigned int i{0};
i<n_chipPerModule;
i++) {
838 disabledChip[
i] = ((disabledChipFlag & (1 <<
i)) != 0);
842 for (
int j=0;
j<n_stripPerChip*n_chipPerSide;
j++) {
846 if (side==0) chipNum =
swap ? 5-
j/n_stripPerChip :
j/n_stripPerChip;
847 else chipNum =
swap ? 11-
j/n_stripPerChip : 6+
j/n_stripPerChip;
848 int stripNum{
swap ? 767-
j :
j};
849 Identifier stripId{m_pSCTHelper->strip_id(waferId, j)};
851 numHitsInStrip[stripNum] = m_calibHitmapTool->getBinForHistogramIndex(j+1, waferHash.
value());
852 bool misMatch{
false};
853 double n_hitsInDisable{numHitsInStrip[stripNum]};
854 if (((disabledChipFlag & (1 << chipNum))!=0) or badStripsExclusive.find(stripId)!=stripEnd) {
855 if (numHitsInStrip[stripNum]!=0) misMatch =
true;
856 numHitsInStrip[stripNum] = -99;
860 <<
"n_hits=" << n_hitsInDisable <<
", "
861 <<
"bec=" << m_pSCTHelper->barrel_ec(stripId) <<
", "
862 <<
"layer=" << m_pSCTHelper->layer_disk(stripId) <<
", "
863 <<
"phi=" << m_pSCTHelper->phi_module(stripId) <<
", "
864 <<
"eta=" << m_pSCTHelper->eta_module(stripId) <<
", "
865 <<
"side=" << m_pSCTHelper->side(stripId) <<
", "
866 <<
"strip=" << m_pSCTHelper->strip(stripId));
869 if (numHitsInStrip[stripNum]==0) {
871 ATH_MSG_DEBUG(
"nohit strip : barrel_ec=" << m_pSCTHelper->barrel_ec(stripId)
872 <<
", layer=" << m_pSCTHelper->layer_disk(stripId) <<
", phi=" << m_pSCTHelper->phi_module(stripId)
873 <<
", eta=" << m_pSCTHelper->eta_module(stripId) <<
", side=" << m_pSCTHelper->side(stripId)
874 <<
", strip=offline" << m_pSCTHelper->strip(stripId));
875 }
else if (numHitsInStrip[stripNum]==-99) {
877 n_disabledInChip[stripNum/n_stripPerChip]++;
878 ATH_MSG_DEBUG(
"disabled strip : barrel_ec=" << m_pSCTHelper->barrel_ec(stripId)
879 <<
", layer=" << m_pSCTHelper->layer_disk(stripId) <<
", phi=" << m_pSCTHelper->phi_module(stripId)
880 <<
", eta=" << m_pSCTHelper->eta_module(stripId) <<
", side=" << m_pSCTHelper->side(stripId)
881 <<
", strip=offline" << m_pSCTHelper->strip(stripId));
882 }
else if (numHitsInStrip[stripNum]/m_numberOfEvents>m_noisyThr4DeadFinding) {
885 totalHitsInWafer+=numHitsInStrip[stripNum];
890 if (n_disabledStrip==768) {
892 if (defectChip==
" 0-5 6-11 ") {
894 }
else if (defectChip==
" 0-5 " or defectChip==
" 6-11 ") {
897 if (!(defectStrip.empty()) or !(defectChip.empty())) {
898 if (addToSummaryStr(summaryList, waferId,
"DEAD", defectStrip.c_str(), defectChip.c_str()).isFailure()) {
900 return StatusCode::FAILURE;
904 if (!(defectStrip.empty())) {
906 if (m_pCalibWriteTool->createListStrip(moduleId, m_pSCTHelper, 10000,
"DEAD", m_deadStripSignificance, defectStrip).isFailure()) {
908 return StatusCode::FAILURE;
912 if (addToXML4DB(m_outDeadStrips, waferId,
"DEAD", m_deadStripSignificance, defectStrip.c_str()).isFailure()) {
914 return StatusCode::FAILURE;
919 if (!(defectChip.empty())) {
921 if (m_pCalibWriteTool->createListChip(moduleId, m_pSCTHelper, 10000,
"DEAD", m_deadChipSignificance, defectChip).isFailure()) {
923 return StatusCode::FAILURE;
927 if (addToXML4DB(m_outDeadChips, waferId,
"DEAD", m_deadChipSignificance, defectChip.c_str()).isFailure()) {
929 return StatusCode::FAILURE;
941 if (n_noHitsStrip+n_disabledStrip==768) {
942 n_checkedChip+=n_chipPerSide;
946 if (m_pSCTHelper->barrel_ec(waferId)==
BARREL) meanOccu=meanOccupancy_Barrel[m_pSCTHelper->layer_disk(waferId)];
947 else meanOccu=meanOccupancy_EC[m_pSCTHelper->layer_disk(waferId)][m_pSCTHelper->eta_module(waferId)];
948 double sum_binomial{ROOT::Math::binomial_cdf(0, meanOccu, m_numberOfEvents*n_stripPerChip*n_chipPerSide)};
950 if (sum_binomial<deadChipDefinition) {
951 ATH_MSG_INFO(
"DEADLINK : " << moduleId <<
", side=" << side);
952 n_deadChip+=n_chipPerSide;
956 if (side==0) beginDead=0, endDead=767;
957 else beginDead=768, endDead=1535;
958 defectStrip = m_pCalibWriteTool->addDefect(defectStrip, beginDead, endDead);
963 if (side==0) beginDead=0, endDead=5;
964 else beginDead=6, endDead=11;
965 defectChip = m_pCalibWriteTool->addDefect(defectChip, beginDead, endDead);
969 if (defectChip==
" 0-5 6-11 ") {
971 }
else if (defectChip==
" 0-5 " or defectChip==
" 6-11 ") {
975 if (!(defectStrip.empty()) or !(defectChip.empty())) {
976 if (addToSummaryStr(summaryList, waferId,
"DEAD", defectStrip.c_str(), defectChip.c_str()).isFailure()) {
978 return StatusCode::FAILURE;
981 if (!(defectStrip.empty())) {
983 if (m_pCalibWriteTool->createListStrip(moduleId, m_pSCTHelper, 10000,
"DEAD", m_deadStripSignificance, defectStrip).isFailure()) {
985 return StatusCode::FAILURE;
989 if (addToXML4DB(m_outDeadStrips, waferId,
"DEAD", m_deadStripSignificance, defectStrip.c_str()).isFailure()) {
991 return StatusCode::FAILURE;
998 if (!(defectChip.empty())) {
1000 if (m_pCalibWriteTool->createListChip(moduleId, m_pSCTHelper, 10000,
"DEAD", m_deadChipSignificance, defectChip).isFailure()) {
1002 return StatusCode::FAILURE;
1006 if (addToXML4DB(m_outDeadChips, waferId,
"DEAD", m_deadChipSignificance, defectChip.c_str()).isFailure()) {
1008 return StatusCode::FAILURE;
1019 if (n_noHitsStrip>0 || !m_deadNotQuiet) {
1020 int n_deadChipInWafer{0};
1022 double n_effectiveEvents{0.};
1023 if (busyStream) n_effectiveEvents = m_numberOfEvents*(n_stripPerChip*n_chipPerSide-n_disabledStrip-n_noisyStrip-n_noHitsStrip);
1024 else n_effectiveEvents = m_numberOfEvents*(n_stripPerChip*n_chipPerSide-n_disabledStrip-n_noisyStrip);
1027 double meanOccupancy{totalHitsInWafer/n_effectiveEvents};
1028 for (
int j{0};
j<n_stripPerChip*n_chipPerSide;
j++) {
1029 if (numHitsInStrip[j]>0) numHitsInChip[
j/n_stripPerChip] += numHitsInStrip[
j];
1032 for (
int j{0};
j<n_chipPerSide;
j++) {
1034 int chipNum{
side==0 ?
j :
j+6};
1035 if ( !disabledChip[chipNum] && (numHitsInChip[j]==0 || !m_deadNotQuiet) ) {
1036 if (!isNoHitLink) n_checkedChip++;
1037 double sum_binomial{ROOT::Math::binomial_cdf(0, meanOccupancy, m_numberOfEvents*(n_stripPerChip-n_disabledInChip[j]))};
1039 if ((m_deadNotQuiet && sum_binomial<deadChipDefinition) ||
1040 (!m_deadNotQuiet && numHitsInChip[j]/(m_numberOfEvents*(n_stripPerChip-n_disabledInChip[j])) < meanOccupancy*m_quietThresholdChip)) {
1041 ATH_MSG_INFO(
"DEADCHIP : " << moduleId <<
", side=" << side <<
", chip(online)=" << (side==0 ? j : j+n_chipPerSide));
1044 n_deadChipInWafer++;
1045 endDead =
side==0 ?
j :
j+n_chipPerSide;
1046 if (!beforeIsDead) beginDead =
side==0 ?
j :
j+n_chipPerSide;
1051 if ((beforeIsDead and !isDead) or (j==5 and isDead)) defectChip = m_pCalibWriteTool->addDefect(defectChip, beginDead, endDead);
1053 beforeIsDead = isDead;
1057 if (m_doDeadStrip) {
1058 double meanOccExceptDeadChip{totalHitsInWafer/(n_effectiveEvents-n_stripPerChip*n_deadChipInWafer)};
1059 double numHitsInStripOnlineOrder[n_stripPerChip*n_chipPerSide] = {0};
1060 for (
int j{0};
j<n_stripPerChip*n_chipPerSide;
j++) {
1061 numHitsInStripOnlineOrder[
j] =
side==0 ? numHitsInStrip[
j] : numHitsInStrip[n_stripPerChip*n_chipPerSide-1-
j];
1063 if (numHitsInStripOnlineOrder[j]==0 || !m_deadNotQuiet) {
1064 double sum_binomial{ROOT::Math::binomial_cdf(0, meanOccExceptDeadChip, m_numberOfEvents)};
1066 if ((m_deadNotQuiet && sum_binomial<deadStripDefinition) ||
1067 (!m_deadNotQuiet && numHitsInStripOnlineOrder[j]/m_numberOfEvents < meanOccExceptDeadChip*m_quietThresholdStrip)) {
1068 ATH_MSG_INFO(
"DEADSTRIP : " << moduleId <<
", side=" << side <<
", strip(offline)=" << j);
1071 endDead =
side==0 ?
j :
j+n_stripPerChip*n_chipPerSide;
1072 if (!beforeIsDead) beginDead =
side==0 ?
j :
j+n_stripPerChip*n_chipPerSide;
1076 if (m_doDeadStrip) {
1077 if ((beforeIsDead and !isDead) or (j==5 and isDead)) defectStrip = m_pCalibWriteTool->addDefect(defectStrip, beginDead, endDead);
1079 beforeIsDead = isDead;
1087 if (m_doDeadStrip) {
1089 if (closeXML4DB(m_outDeadStrips).isFailure()) {
1091 return StatusCode::FAILURE;
1095 ATH_MSG_INFO(
"total #DeadChip : " << n_deadChip <<
", #noHitChip : " << n_checkedChip);
1096 if (closeXML4DB(m_outDeadChips).isFailure()) {
1098 return StatusCode::FAILURE;
1103 if (openXML4DeadSummary(m_outDeadSummary,
"DEAD", n_deadModule, n_deadLink, n_deadChip, n_deadStrip).isFailure()) {
1105 return StatusCode::FAILURE;
1107 if (wrapUpXML4Summary(m_outDeadSummary,
"DEAD", summaryList).isFailure()) {
1109 return StatusCode::FAILURE;
1112 if (m_writeToCool) {
1113 if (m_doDeadStrip and hasDeadStrip) {
1114 if (m_pCalibWriteTool->wrapUpDeadStrips().isFailure()) {
1116 return StatusCode::FAILURE;
1119 if (m_doDeadChip and hasDeadChip) {
1120 if (m_pCalibWriteTool->wrapUpDeadChips().isFailure()) {
1122 return StatusCode::FAILURE;
1128 return StatusCode::SUCCESS;
1141 int n_phiBinsBarrel[
n_barrels] = {n_phiBinsB0, n_phiBinsB1, n_phiBinsB2, n_phiBinsB3};
1142 int n_phiBinsEndcap[
n_disks][
n_etaBinsEC] = {{n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1143 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1144 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1145 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1146 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1147 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1148 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1149 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1150 {n_phiBinsECOuter, 0, 0}
1161 stem =
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEC/Noise/";
1162 m_pnoiseoccupancymapHistoVectorECm.clear();
1163 for (
int iDisk{0}; iDisk <
n_disks ; ++iDisk) {
1164 for (
int iSide{0}; iSide < 2; ++iSide) {
1165 std::ostringstream streamHist;
1166 streamHist <<
"hitoccupancymap";
1167 if (m_noiseOccupancyTriggerAware) streamHist <<
"trigger";
1168 streamHist <<
"ECm_" << iDisk <<
"_" << iSide;
1169 std::string
histName{stem + streamHist.str()};
1170 TProfile2D* hist_tmp{
dynamic_cast<TProfile2D*
>(m_inputHist->Get(
histName.c_str()))};
1171 m_pnoiseoccupancymapHistoVectorECm.push_back(hist_tmp);
1175 stem =
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTB/Noise/";
1176 m_pnoiseoccupancymapHistoVector.clear();
1177 for (
int iLayer{0}; iLayer <
n_barrels ; ++iLayer) {
1178 for (
int iSide{0}; iSide < 2; ++iSide) {
1179 std::ostringstream streamHist;
1180 streamHist <<
"hitoccupancymap";
1181 if (m_noiseOccupancyTriggerAware) streamHist <<
"trigger";
1182 streamHist <<
"_" << iLayer <<
"_" << iSide;
1183 std::string
histName{stem + streamHist.str()};
1184 TProfile2D* hist_tmp{
dynamic_cast<TProfile2D*
>(m_inputHist->Get(
histName.c_str()))};
1185 m_pnoiseoccupancymapHistoVector.push_back(hist_tmp);
1189 stem =
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEA/Noise/";
1190 m_pnoiseoccupancymapHistoVectorECp.clear();
1191 for (
int iDisk{0}; iDisk <
n_disks ; ++iDisk) {
1192 for (
int iSide{0}; iSide < 2; ++iSide) {
1193 std::ostringstream streamHist;
1194 streamHist <<
"hitoccupancymap";
1195 if (m_noiseOccupancyTriggerAware) streamHist <<
"trigger";
1196 streamHist <<
"ECp_" << iDisk <<
"_" << iSide;
1197 std::string
histName{stem + streamHist.str()};
1198 TProfile2D* hist_tmp{
dynamic_cast<TProfile2D*
>(m_inputHist->Get(
histName.c_str()))};
1199 m_pnoiseoccupancymapHistoVectorECp.push_back(hist_tmp);
1204 const char* outputNoiseOccupancyFileName{m_noiseOccupancyFile.value().c_str()};
1205 std::ofstream
outFile{outputNoiseOccupancyFileName, std::ios::out};
1207 ATH_MSG_ERROR(
"Unable to open NoiseOccupancyFile : " << outputNoiseOccupancyFileName);
1208 return StatusCode::FAILURE;
1212 std::ostringstream osHeader;
1213 osHeader <<
"<channels server=\"ATLAS_COOLPROD\" schema=\"ATLAS_COOLOFL_SCT\" dbname=\"MONP200\" folder=\"SCT/Derived/NoiseOccupancy\" "
1214 <<
"since=\"" << m_iovStart.re_time() <<
"\" "
1215 <<
"until=\"" << m_iovStop.re_time() <<
"\" "
1216 <<
"tag=\"" << m_tagID4NoiseOccupancy <<
"\" "
1217 <<
"version=\"" <<
"multi\">" << std::endl;
1221 for (
int iDisk{0}; iDisk <
n_disks ; ++iDisk) {
1222 for (
int iSide{0}; iSide < 2; ++iSide) {
1224 for (
int iPhi{0};
iPhi < n_phiBinsEndcap[iDisk][
iEta]; ++
iPhi) {
1225 Identifier waferId = m_pSCTHelper->wafer_id(ENDCAP_C, iDisk, iPhi, iEta, iSide);
1226 float occupancy{
static_cast<float>(m_pnoiseoccupancymapHistoVectorECm[2*iDisk + iSide]->GetBinContent(iEta+1, iPhi+1))};
1227 occupancy /=
static_cast<float>(
ntimeBins);
1230 meanNO_ECC[iDisk][
iEta]+=occupancy;
1233 outFile << xmlChannelNoiseOccDataString(waferId, occupancy, sn) << std::endl;
1235 if (m_writeToCool) {
1236 if (m_pCalibWriteTool->createListNO(waferId, m_pSCTHelper, 10000, occupancy).isFailure()) {
1238 return StatusCode::FAILURE;
1246 for (
int iLayer{0}; iLayer <
n_barrels; ++iLayer) {
1247 for (
int iSide{0}; iSide < 2; ++iSide) {
1249 if (iEta-6 == 0)
continue;
1250 for (
int iPhi{0};
iPhi < n_phiBinsBarrel[iLayer]; ++
iPhi) {
1251 Identifier waferId{m_pSCTHelper->wafer_id(
BARREL, iLayer, iPhi, iEta-6, iSide)};
1252 float occupancy{
static_cast<float>(m_pnoiseoccupancymapHistoVector[2*iLayer + iSide]->GetBinContent(iEta+1, iPhi+1))};
1253 occupancy /=
static_cast<float>(
ntimeBins);
1256 meanNO_Barrel[iLayer]+=occupancy;
1259 outFile << xmlChannelNoiseOccDataString(waferId, occupancy, sn) << std::endl;
1261 if (m_writeToCool) {
1262 if (m_pCalibWriteTool->createListNO(waferId, m_pSCTHelper, 10000, occupancy).isFailure()) {
1264 return StatusCode::FAILURE;
1272 for (
int iDisk{0}; iDisk <
n_disks ; ++iDisk) {
1273 for (
int iSide{0}; iSide < 2; ++iSide) {
1275 for (
int iPhi{0};
iPhi < n_phiBinsEndcap[iDisk][
iEta]; ++
iPhi) {
1276 Identifier waferId{m_pSCTHelper->wafer_id(ENDCAP_A, iDisk, iPhi, iEta, iSide)};
1277 float occupancy{
static_cast<float>(m_pnoiseoccupancymapHistoVectorECp[2*iDisk + iSide]->GetBinContent(iEta+1, iPhi+1))};
1278 occupancy /=
static_cast<float>(
ntimeBins);
1281 meanNO_ECA[iDisk][
iEta]+=occupancy;
1284 outFile << xmlChannelNoiseOccDataString(waferId, occupancy, sn) << std::endl;
1286 if (m_writeToCool) {
1287 if (m_pCalibWriteTool->createListNO(waferId, m_pSCTHelper, 10000, occupancy).isFailure()) {
1289 return StatusCode::FAILURE;
1298 outFile <<
"</channels>" << std::endl;
1301 std::ostringstream summaryList;
1304 if (n_phiBinsEndcap[i][j] != 0) {
1305 meanNO_ECC[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1306 summaryList << xmlPartData(ENDCAP_C, i, j,
"meanNO", meanNO_ECC[i][j]);
1311 meanNO_Barrel[
i] /= (n_phiBinsBarrel[
i]*n_etaInBarrel*2);
1312 summaryList << xmlPartData(
BARREL, i, 0,
"meanNO", meanNO_Barrel[i]);
1316 if (n_phiBinsEndcap[i][j] != 0) {
1317 meanNO_ECA[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1318 summaryList << xmlPartData(ENDCAP_A, i, j,
"meanNO", meanNO_ECA[i][j]);
1323 if (openXML4MonSummary(m_outNOSummary,
"NoiseOccupancy").isFailure()) {
1325 return StatusCode::FAILURE;
1327 if (wrapUpXML4Summary(m_outNOSummary,
"NoiseOccupancy", summaryList).isFailure()) {
1329 return StatusCode::FAILURE;
1333 if (m_writeToCool) {
1334 if (m_pCalibWriteTool->wrapUpNoiseOccupancy().isFailure()) {
1336 return StatusCode::FAILURE;
1340 return StatusCode::SUCCESS;
1353 int n_phiBinsBarrel[
n_barrels] = {n_phiBinsB0, n_phiBinsB1, n_phiBinsB2, n_phiBinsB3};
1354 int n_phiBinsEndcap[
n_disks][
n_etaBinsEC] = {{n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1355 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1356 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1357 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1358 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1359 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1360 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1361 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1362 {n_phiBinsECOuter, 0, 0}
1371 std::vector<std::pair<std::string, int>> EC_stems;
1373 std::pair<std::string, int> stem_C(
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEC/hits/", ENDCAP_C);
1374 std::pair<std::string, int> stem_A(
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEA/hits/", ENDCAP_A);
1375 EC_stems.push_back(stem_C);
1376 EC_stems.push_back(stem_A);
1377 std::vector< std::pair<std::string, int> >
::iterator stemItr{EC_stems.begin()};
1380 for (stemItr=EC_stems.begin(); stemItr!=EC_stems.end(); ++stemItr) {
1381 for (
int iDisk{0}; iDisk<
n_disks; ++iDisk) {
1382 for (
int iSide{0}; iSide<2; ++iSide) {
1384 for (
int iPhi{0};
iPhi<n_phiBinsEndcap[iDisk][
iEta]; ++
iPhi) {
1385 Identifier waferId{m_pSCTHelper->wafer_id((*stemItr).second, iDisk, iPhi, iEta, iSide)};
1386 std::string detector_part;
1387 detector_part.erase();
1388 if (m_histBefore2010) {
1389 if ((*stemItr).second==ENDCAP_C) detector_part =
"ECm_hitsmap";
1390 else detector_part =
"ECp_hitsmap";
1392 if ((*stemItr).second==ENDCAP_C) detector_part =
"hitsmapECm";
1393 else detector_part =
"hitsmapECp";
1395 std::ostringstream streamHist;
1396 streamHist << detector_part <<
"_" << iDisk <<
"_" << iSide;
1397 std::string hitsmapname{stemItr->first + streamHist.str()};
1398 TH2F* hist_tmp{
dynamic_cast<TH2F*
>(m_inputHist->Get(hitsmapname.c_str()))};
1399 unsigned long long n_hits{
static_cast<unsigned long long>(hist_tmp->GetBinContent(iEta+1, iPhi+1))};
1401 if (m_numberOfEvents!=0) {
1402 raw_occu =
static_cast<float>(n_hits)/(m_numberOfEvents*n_chipPerSide*n_stripPerChip);
1404 if (stemItr->second==ENDCAP_C) meanRO_ECC[iDisk][
iEta] +=
static_cast<double>(raw_occu);
1405 else if (stemItr->second==ENDCAP_A) meanRO_ECA[iDisk][
iEta] +=
static_cast<double>(raw_occu);
1408 if (m_writeToCool) {
1409 if (m_pCalibWriteTool->createListRawOccu(waferId, m_pSCTHelper, m_numberOfEvents, raw_occu).isFailure()) {
1411 return StatusCode::FAILURE;
1420 for (
int iLayer{0}; iLayer<
n_barrels; ++iLayer) {
1421 for (
int iSide{0}; iSide<2; ++iSide) {
1423 if (iEta-6==0)
continue;
1424 for (
int iPhi{0};
iPhi<n_phiBinsBarrel[iLayer]; ++
iPhi) {
1425 Identifier waferId{m_pSCTHelper->wafer_id(
BARREL, iLayer, iPhi, iEta-6, iSide)};
1426 std::ostringstream streamHist;
1427 streamHist << iLayer <<
"_" << iSide;
1428 std::string hitsmapname{
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTB/hits/hitsmap_" + streamHist.str()};
1429 TH2F* hist_tmp{
dynamic_cast<TH2F*
>(m_inputHist->Get(hitsmapname.c_str()))};
1430 unsigned long long n_hits{
static_cast<unsigned long long>(hist_tmp->GetBinContent(iEta+1, iPhi+1))};
1432 if (m_numberOfEvents!=0) {
1433 raw_occu =
static_cast<float>(n_hits)/(m_numberOfEvents*n_chipPerSide*n_stripPerChip);
1435 meanRO_Barrel[iLayer] +=
static_cast<double>(raw_occu);
1438 if (m_writeToCool) {
1439 if (m_pCalibWriteTool->createListRawOccu(waferId, m_pSCTHelper, m_numberOfEvents, raw_occu).isFailure()) {
1441 return StatusCode::FAILURE;
1449 std::ostringstream summaryList;
1452 if (n_phiBinsEndcap[i][j] != 0) {
1453 meanRO_ECC[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1454 summaryList << xmlPartData(ENDCAP_C, i, j,
"meanRO", meanRO_ECC[i][j]);
1459 meanRO_Barrel[
i] /= (n_phiBinsBarrel[
i]*n_etaInBarrel*2);
1460 summaryList << xmlPartData(
BARREL, i, 0,
"meanRO", meanRO_Barrel[i]);
1464 if (n_phiBinsEndcap[i][j] != 0) {
1465 meanRO_ECA[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1466 summaryList << xmlPartData(ENDCAP_A, i, j,
"meanRO", meanRO_ECA[i][j]);
1471 if (openXML4MonSummary(m_outROSummary,
"RawOccupancy").isFailure()) {
1473 return StatusCode::FAILURE;
1475 if (wrapUpXML4Summary(m_outROSummary,
"RawOccupancy", summaryList).isFailure()) {
1477 return StatusCode::FAILURE;
1481 if (m_writeToCool) {
1482 if (m_pCalibWriteTool->wrapUpRawOccupancy().isFailure()) {
1484 return StatusCode::FAILURE;
1488 return StatusCode::SUCCESS;
1500 int n_phiBinsBarrel[
n_barrels] = {n_phiBinsB0, n_phiBinsB1, n_phiBinsB2, n_phiBinsB3};
1501 int n_phiBinsEndcap[
n_disks][
n_etaBinsEC] = {{n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1502 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1503 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1504 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1505 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1506 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1507 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1508 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1509 {n_phiBinsECOuter, 0, 0}
1516 double meanEff_Barrel_bcid1[
n_barrels ] = { 0 };
1521 std::vector<std::pair<std::string, int>> EC_stems;
1523 std::pair<std::string, int> stem_C{
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEC/eff/",
ENDCAP_C};
1524 std::pair<std::string, int> stem_A{
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEA/eff/",
ENDCAP_A};
1525 EC_stems.push_back(stem_C);
1526 EC_stems.push_back(stem_A);
1527 std::vector<std::pair<std::string, int>>
::iterator stemItr{EC_stems.begin()};
1529 const char* outputEfficiencyFileName{m_efficiencyModuleFile.value().c_str()};
1530 std::ofstream
outFile{outputEfficiencyFileName, std::ios::out};
1532 ATH_MSG_ERROR(
"Unable to open EfficiencyFile : " << outputEfficiencyFileName);
1533 return StatusCode::FAILURE;
1536 std::string xslName{
"EfficiencyInfo.xsl"};
1537 outFile <<
xmlHeader << linefeed << associateStylesheet(xslName) << linefeed <<
"<run>" << std::endl;
1539 <<
xmlValue(
"StartTime", m_utcBegin) << linefeed
1540 <<
xmlValue(
"EndTime", m_utcEnd) << linefeed
1541 <<
xmlValue(
"Duration", m_calibEvtInfoTool->duration()) << linefeed
1542 <<
xmlValue(
"LB", m_LBRange) << linefeed
1543 <<
xmlValue(
"Events", m_numberOfEvents) << linefeed
1544 <<
" <modules>" << std::endl;
1546 const char* outputEfficiencyFileNameChip{m_efficiencyChipFile.value().c_str()};
1547 std::ofstream outFileChip{outputEfficiencyFileNameChip, std::ios::out};
1548 if (!outFileChip.good()) {
1549 ATH_MSG_ERROR(
"Unable to open EfficiencyFile for chips : " << outputEfficiencyFileNameChip);
1550 return StatusCode::FAILURE;
1553 if (m_efficiencyDoChips) {
1554 std::string xslNameChip{
"EfficiencyChipInfo.xsl"};
1555 outFileChip <<
xmlHeader << linefeed << associateStylesheet(xslNameChip) << linefeed <<
"<run>" << std::endl;
1556 outFileChip <<
xmlValue(
"RunNumber", m_runNumber.value()) << linefeed
1557 <<
xmlValue(
"StartTime", m_utcBegin) << linefeed
1558 <<
xmlValue(
"EndTime", m_utcEnd) << linefeed
1559 <<
xmlValue(
"Duration", m_calibEvtInfoTool->duration()) << linefeed
1560 <<
xmlValue(
"LB", m_LBRange) << linefeed
1561 <<
xmlValue(
"Events", m_numberOfEvents) << linefeed
1562 <<
" <chips>" << std::endl;
1566 for (stemItr=EC_stems.begin(); stemItr!=EC_stems.end(); ++stemItr) {
1567 for (
int iDisk{0}; iDisk<
n_disks; ++iDisk) {
1568 for (
int iSide{0}; iSide<2; ++iSide) {
1570 for (
int iPhi{0};
iPhi<n_phiBinsEndcap[iDisk][
iEta]; ++
iPhi) {
1571 Identifier waferId = m_pSCTHelper->wafer_id((*stemItr).second, iDisk, iPhi, iEta, iSide);
1572 std::string detector_part;
1573 detector_part.erase();
1574 std::ostringstream streamProf;
1575 if ((*stemItr).second==ENDCAP_C) {
1576 detector_part =
"m_eff";
1577 streamProf << detector_part <<
"_" << iDisk <<
"_" << iSide;
1579 detector_part =
"p_eff";
1580 streamProf << detector_part <<
"_" << iDisk <<
"_" << iSide;
1582 std::string effmapname{stemItr->first + streamProf.str()};
1583 TProfile2D* prof_tmp{
dynamic_cast<TProfile2D*
>(m_inputHist->Get(effmapname.c_str()))};
1584 int global_bin{prof_tmp->GetBin(iEta+1, iPhi+1)};
1585 float eff{
static_cast<float>(prof_tmp->GetBinContent(global_bin))};
1586 unsigned long long eff_entry{
static_cast<unsigned long long>(prof_tmp->GetBinEntries(global_bin))};
1589 if (stemItr->second==ENDCAP_C) meanEff_ECC[iDisk][
iEta] +=
static_cast<double>(
eff);
1590 else if (stemItr->second==ENDCAP_A) meanEff_ECA[iDisk][
iEta] +=
static_cast<double>(
eff);
1592 std::string effmapname_bcid1 = effmapname+
"_bcid";
1593 TProfile2D* prof_tmp_bcid1 = (TProfile2D*) m_inputHist->Get( effmapname_bcid1.c_str() );
1594 int global_bin_bcid1 = prof_tmp_bcid1->GetBin( iEta+1, iPhi+1 );
1595 float eff_bcid1 = (
float)prof_tmp_bcid1->GetBinContent( global_bin_bcid1 );
1598 if( stemItr->second==ENDCAP_C ) meanEff_ECC_bcid1[iDisk][
iEta]+=(
double)eff_bcid1;
1599 else if( stemItr->second==ENDCAP_A ) meanEff_ECA_bcid1[iDisk][
iEta]+=(
double)eff_bcid1;
1602 float effToXML = (eff_entry == 0 ? -1. :
eff);
1607 outFile << xmlChannelEfficiencyDataString(waferId, effToXML, sn, iSide) << std::endl;
1610 if (m_efficiencyDoChips) {
1611 for (
int iChip{0}; iChip<n_chipPerSide; ++iChip) {
1612 std::string detector_part_chip;
1613 detector_part_chip.erase();
1614 std::ostringstream streamProfChip;
1615 if ((*stemItr).second==ENDCAP_C) {
1616 detector_part_chip =
"m_eff";
1617 streamProfChip << detector_part_chip <<
"_" <<
"chip" << iChip<<
"_" << iDisk <<
"_" << iSide;
1619 detector_part_chip =
"p_eff";
1620 streamProfChip << detector_part_chip <<
"_" <<
"chip" << iChip<<
"_" << iDisk <<
"_" << iSide;
1622 std::string effchipmapname{stemItr->first +
"chip" + std::to_string(iChip) +
"/" + streamProfChip.str()};
1623 TProfile2D* profChip_tmp{
dynamic_cast<TProfile2D*
>(m_inputHist->Get(effchipmapname.c_str()))};
1624 global_bin = profChip_tmp->GetBin(iEta+1, iPhi+1);
1625 float effChip{
static_cast<float>(profChip_tmp->GetBinContent(global_bin))};
1626 unsigned long long effChip_entry{
static_cast<unsigned long long>(profChip_tmp->GetBinEntries(global_bin))};
1629 effToXML = (effChip_entry == 0 ? -1. : effChip);
1631 std::string effchipmapname_bcid1 = effchipmapname+
"_bcid";
1632 TProfile2D* profChip_tmp_bcid1 = (TProfile2D*) m_inputHist->Get( effchipmapname_bcid1.c_str() );
1633 global_bin_bcid1 = profChip_tmp_bcid1->GetBin( iEta+1, iPhi+1 );
1634 eff_bcid1 = (
float)profChip_tmp_bcid1->GetBinContent( global_bin_bcid1 );
1635 outFileChip << xmlChannelEfficiencyDataStringChip(waferId, effToXML, eff_bcid1, sn, iSide, iChip) << std::endl;
1640 if (m_writeToCool) {
1641 if (m_pCalibWriteTool->createListEff(waferId, m_pSCTHelper, eff_entry, eff).isFailure()) {
1643 return StatusCode::FAILURE;
1652 for (
int iLayer{0}; iLayer<
n_barrels; ++iLayer) {
1653 for (
int iSide{0}; iSide<2; ++iSide) {
1655 if (iEta-6==0)
continue;
1656 for (
int iPhi{0};
iPhi<n_phiBinsBarrel[iLayer]; ++
iPhi) {
1657 Identifier waferId{m_pSCTHelper->wafer_id(
BARREL, iLayer, iPhi, iEta-6, iSide)};
1658 std::ostringstream streamProf;
1659 streamProf << iLayer <<
"_" << iSide;
1661 std::string effmapname{
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTB/eff/eff_" + streamProf.str()};
1662 TProfile2D* prof_tmp{
dynamic_cast<TProfile2D*
>(m_inputHist->Get(effmapname.c_str()))};
1663 int global_bin{prof_tmp->GetBin(iEta+1, iPhi+1)};
1664 float eff{
static_cast<float>(prof_tmp->GetBinContent(global_bin))};
1665 unsigned long long eff_entry{
static_cast<unsigned long long>(prof_tmp->GetBinEntries(global_bin))};
1668 meanEff_Barrel[iLayer] +=
static_cast<double>(
eff);
1670 std::string effmapname_bcid1 = effmapname+
"_bcid";
1671 TProfile2D* prof_tmp_bcid1 = (TProfile2D*) m_inputHist->Get( effmapname_bcid1.c_str() );
1672 int global_bin_bcid1 = prof_tmp_bcid1->GetBin( iEta+1, iPhi+1 );
1673 float eff_bcid1 = (
float)prof_tmp_bcid1->GetBinContent( global_bin_bcid1 );
1676 meanEff_Barrel_bcid1[iLayer]+=(
double)eff_bcid1;
1679 float effToXML = (eff_entry == 0 ? -1. :
eff);
1684 outFile << xmlChannelEfficiencyDataString(waferId, effToXML, sn, iSide) << std::endl;
1687 if (m_efficiencyDoChips) {
1688 for (
int iChip{0}; iChip<n_chipPerSide; ++iChip) {
1689 std::ostringstream streamProfChip;
1690 streamProfChip <<
"chip" << iChip <<
"_" << iLayer <<
"_" << iSide;
1692 std::string effchipmapname{
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTB/eff/chip" + std::to_string(iChip) +
"/eff_" + streamProfChip.str()};
1693 TProfile2D* profChip_tmp{
dynamic_cast<TProfile2D*
>(m_inputHist->Get(effchipmapname.c_str()))};
1694 global_bin = profChip_tmp->GetBin(iEta+1, iPhi+1);
1695 float effChip{
static_cast<float>(profChip_tmp->GetBinContent(global_bin))};
1696 unsigned long long effChip_entry{
static_cast<unsigned long long>(profChip_tmp->GetBinEntries(global_bin))};
1699 effToXML = (effChip_entry == 0 ? -1. : effChip);
1701 std::string effchipmapname_bcid1 = effchipmapname+
"_bcid";
1702 TProfile2D* profChip_tmp_bcid1 = (TProfile2D*) m_inputHist->Get( effchipmapname_bcid1.c_str() );
1703 int global_bin_bcid1 = profChip_tmp_bcid1->GetBin( iEta+1, iPhi+1 );
1704 float eff_bcid1 = (
float)profChip_tmp_bcid1->GetBinContent( global_bin_bcid1 );
1706 outFileChip << xmlChannelEfficiencyDataStringChip(waferId, effToXML, eff_bcid1, sn, iSide, iChip) << std::endl;
1711 if (m_writeToCool) {
1712 if (m_pCalibWriteTool->createListEff(waferId, m_pSCTHelper, eff_entry, eff).isFailure()) {
1714 return StatusCode::FAILURE;
1722 outFile <<
" </modules>" << std::endl;
1723 outFile <<
"</run>" << std::endl;
1725 if (m_efficiencyDoChips) {
1726 outFileChip <<
" </chips>" << std::endl;
1727 outFileChip <<
"</run>" << std::endl;
1731 std::ostringstream summaryList;
1734 if (n_phiBinsEndcap[i][j] != 0) {
1735 meanEff_ECC[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1736 summaryList << xmlPartData(ENDCAP_C, i, j,
"meanEff", meanEff_ECC[i][j]);
1737 meanEff_ECC_bcid1[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1738 summaryList<<xmlPartData(ENDCAP_C, i, j,
"meanEff_bcid1",meanEff_ECC_bcid1[i][j]);
1743 meanEff_Barrel[
i] /= (n_phiBinsBarrel[
i]*n_etaInBarrel*2);
1744 summaryList << xmlPartData(
BARREL, i, 0,
"meanEff", meanEff_Barrel[i]);
1745 meanEff_Barrel_bcid1[
i] /= (n_phiBinsBarrel[
i]*n_etaInBarrel*2);
1746 summaryList<<xmlPartData(
BARREL, i, 0,
"meanEff_bcid1",meanEff_Barrel_bcid1[i]);
1750 if (n_phiBinsEndcap[i][j] != 0) {
1751 meanEff_ECA[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1752 summaryList << xmlPartData(ENDCAP_A, i, j,
"meanEff", meanEff_ECA[i][j]);
1753 meanEff_ECA_bcid1[
i][
j] /= (n_phiBinsEndcap[
i][
j]*2);
1754 summaryList<<xmlPartData(ENDCAP_A, i, j,
"meanEff_bcid1",meanEff_ECA_bcid1[i][j]);
1759 if (openXML4MonSummary(m_outEffSummary,
"Efficiency").isFailure()) {
1761 return StatusCode::FAILURE;
1764 if (wrapUpXML4Summary(m_outEffSummary,
"Efficiency", summaryList).isFailure()) {
1766 return StatusCode::FAILURE;
1770 if (m_writeToCool) {
1771 if (m_pCalibWriteTool->wrapUpEfficiency().isFailure()) {
1773 return StatusCode::FAILURE;
1777 return StatusCode::SUCCESS;
1789 int n_phiBinsBarrel[
n_barrels] = {n_phiBinsB0, n_phiBinsB1, n_phiBinsB2, n_phiBinsB3};
1790 int n_phiBinsEndcap[
n_disks][
n_etaBinsEC] = {{n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1791 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1792 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1793 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1794 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1795 {n_phiBinsECOuter, n_phiBinsECMiddle, n_phiBinsECShort},
1796 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1797 {n_phiBinsECOuter, n_phiBinsECMiddle, 0},
1798 {n_phiBinsECOuter, 0, 0}
1801 unsigned long long nErrLink_Barrel[
n_barrels] = {0};
1805 unsigned long long nErrLink_Barrel_module[
n_barrels][2][
n_etaBins][n_phiBinsB3] = {{{{0}}}};
1806 unsigned long long nErrLink_ECA_module[
n_disks][2][
n_etaBinsEC][n_phiBinsECOuter] = {{{{0}}}};
1807 unsigned long long nErrLink_ECC_module[
n_disks][2][
n_etaBinsEC][n_phiBinsECOuter] = {{{{0}}}};
1818 using IntStringMap = std::map<int, std::string>;
1819 IntStringMap ErrMap_C, ErrMap;
1820 const int numberOfErrorTypes{12};
1821 std::array<std::string, numberOfErrorTypes> errorNames = {{
1822 "ByteStreamParseError",
"TimeOutError",
"BCIDError",
"LVL1IDError",
"PreambleError",
"FormatterError",
1823 "ABCDError",
"RawError",
"MaskedLink",
"RODClockError",
1824 "TruncatedROD",
"ROBFragmentError"
1828 std::array<std::string, numberOfErrorTypes> errorNames_C = {{
1829 "ByteStreamParseError",
"TimeOutError",
"BCIDError",
"LVL1IDError",
"PreambleError",
"FormatterError",
1830 "ABCDError",
"RawError",
"MaskedLink",
"RODClockError",
1831 "TruncatedROD",
"ROBFragmentError"
1834 std::array<int, numberOfErrorTypes> errorValues = {{0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 14}};
1837 for (
int indx{0}; indx!=numberOfErrorTypes; ++indx) {
1838 ErrMap_C.insert(std::make_pair(errorValues[indx], errorNames_C[indx]));
1841 for (
int indx{0}; indx!=numberOfErrorTypes; ++indx) {
1842 ErrMap.insert(std::make_pair(errorValues[indx], errorNames[indx]));
1847 std::array<std::string, N_ENDCAPS> detectorStems = {{
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEC/errors/",
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTEA/errors/"}};
1848 std::array<IntStringMap::iterator, N_ENDCAPS> detectorIterators = {{ErrMap_C.begin(), ErrMap.begin()}};
1849 std::array<IntStringMap::iterator, N_ENDCAPS> detectorIteratorsE = {{ErrMap_C.end(), ErrMap.end()}};
1850 std::array<std::string, N_ENDCAPS> detectorParts = {{
"EC",
"EA"}};
1851 std::string defecttype{
""};
1852 std::string n_defect{
""};
1855 for (
int stemIndex{0}; stemIndex!=
N_ENDCAPS; ++stemIndex) {
1856 const int thisBec{(4 * stemIndex) - 2};
1857 const std::string detector_part{detectorParts[stemIndex]};
1858 for (
int iDisk{0}; iDisk<
n_disks; ++iDisk) {
1859 for (
int iSide{0}; iSide<2; ++iSide) {
1861 for (
int iPhi{0};
iPhi<n_phiBinsEndcap[iDisk][
iEta]; ++
iPhi) {
1864 std::ostringstream osErrorList;
1865 std::ostringstream osProbList;
1866 Identifier waferId{m_pSCTHelper->wafer_id(thisBec, iDisk, iPhi, iEta, iSide)};
1870 if (thisBec==ENDCAP_C) {
1871 nErrLink_ECC_module_serial[iDisk][iSide][
iEta][
iPhi]=sn.
str();
1872 }
else if (thisBec==ENDCAP_A) {
1873 nErrLink_ECA_module_serial[iDisk][iSide][
iEta][
iPhi]=sn.
str();
1876 IntStringMap::iterator errItr{detectorIterators[stemIndex]};
1877 IntStringMap::iterator errItrE{detectorIteratorsE[stemIndex]};
1879 float errorProb{0.};
1880 unsigned long long n_errors{0};
1881 if (errItr!=errItrE and iType == errItr->first) {
1882 std::ostringstream streamHist;
1883 std::ostringstream streamHistAlt;
1884 streamHist <<
"SCT_NumberOf" << errItr->second << detector_part <<
"_" << iDisk <<
"_" << iSide;
1885 streamHistAlt <<
"SCT_" << errItr->second << detector_part <<
"_" << iDisk <<
"_" << iSide;
1886 std::string
folder = errItr->second+std::string(
"/");
1888 std::string profname = detectorStems[stemIndex] +
folder +streamHist.str();
1889 std::string profnameShort = detectorStems[stemIndex] + streamHist.str();
1890 std::string profnameAlt = detectorStems[stemIndex] +
folder +streamHistAlt.str();
1891 std::string profnameAltShort = detectorStems[stemIndex] + streamHistAlt.str();
1893 TProfile2D* prof_tmp = (TProfile2D*) m_inputHist->Get( profname.c_str() );
1894 if(prof_tmp ==
nullptr) {
1895 prof_tmp = (TProfile2D*) m_inputHist->Get( profnameShort.c_str() );
1897 if(prof_tmp ==
nullptr) {
1898 prof_tmp = (TProfile2D*) m_inputHist->Get( profnameAlt.c_str() );
1900 if(prof_tmp ==
nullptr) {
1901 prof_tmp = (TProfile2D*) m_inputHist->Get( profnameAltShort.c_str() );
1903 if(prof_tmp ==
nullptr) {
1904 msg( MSG::ERROR ) <<
"Unable to get profile for BSErrorsDB : " << profname <<
endmsg;
1905 return StatusCode::FAILURE;
1908 float n_errors_float = prof_tmp->GetBinContent(iEta+1, iPhi+1);
1909 if (n_errors_float != 0){
1910 if (thisBec==ENDCAP_C) {
1911 nErrs_ECC_module[iDisk][iSide][
iEta][
iPhi][errItr->first] = n_errors_float;
1912 }
else if (thisBec==ENDCAP_A) {
1913 nErrs_ECA_module[iDisk][iSide][
iEta][
iPhi][errItr->first] = n_errors_float;
1917 n_errors =
static_cast<unsigned long long>(n_errors_float);
1919 defecttype = m_pCalibWriteTool->addNumber(defecttype, errItr->first);
1920 n_defect = m_pCalibWriteTool->addNumber(n_defect, n_errors);
1921 errorProb =
static_cast<float>(n_errors) /
static_cast<float>(m_numberOfEvents);
1922 if (thisBec==ENDCAP_C) {
1923 nErrLink_ECC_module[iDisk][iSide][
iEta][
iPhi]+=n_errors;
1924 }
else if (thisBec==ENDCAP_A) {
1925 nErrLink_ECA_module[iDisk][iSide][
iEta][
iPhi]+=n_errors;
1931 osErrorList << n_errors;
1932 osProbList << errorProb;
1939 if (!(defecttype.empty()) || n_errorLink == 0) {
1941 if (thisBec==ENDCAP_C) {
1942 nErrLink_ECC[iDisk][
iEta]++;
1943 }
else if (thisBec==ENDCAP_A) {
1944 nErrLink_ECA[iDisk][
iEta]++;
1946 if (m_writeToCool) {
1947 if (m_pCalibWriteTool->createListBSErr(waferId, m_pSCTHelper, m_numberOfEvents, osErrorList.str(), osProbList.str()).isFailure()) {
1949 return StatusCode::FAILURE;
1959 for (
int iLayer{0}; iLayer<
n_barrels; ++iLayer) {
1960 for (
int iSide{0}; iSide<2; ++iSide) {
1962 if (iEta-6==0)
continue;
1963 for (
int iPhi{0};
iPhi<n_phiBinsBarrel[iLayer]; ++
iPhi) {
1966 std::ostringstream osErrorList;
1967 std::ostringstream osProbList;
1968 Identifier waferId{m_pSCTHelper->wafer_id(
BARREL, iLayer, iPhi, iEta-6, iSide)};
1971 nErrLink_Barrel_module_serial[iLayer][iSide][
iEta][
iPhi] = sn.
str();
1972 IntStringMap::iterator errItr{ErrMap.begin()};
1973 IntStringMap::iterator errItrE{ErrMap.end()};
1975 float errorProb{0.};
1976 unsigned long long n_errors{0};
1977 if (errItr!=errItrE and iType == errItr->first) {
1978 std::ostringstream streamHist;
1979 streamHist <<
"SCT_NumberOf" << errItr->second <<
"B" <<
"_" << iLayer <<
"_" << iSide;
1981 std::string
folder = errItr->second+std::string(
"/");
1982 std::string profname =
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTB/errors/" +
folder + streamHist.str();
1983 std::string profnameShort =
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/SCTB/errors/" + streamHist.str();
1985 TProfile2D* prof_tmp = (TProfile2D*) m_inputHist->Get( profname.c_str() );
1986 if(prof_tmp ==
nullptr) {
1987 prof_tmp = (TProfile2D*) m_inputHist->Get( profnameShort.c_str() );
1989 if(prof_tmp ==
nullptr) {
1990 msg( MSG::ERROR ) <<
"Unable to get profile for BSErrorsDB : " << profname <<
endmsg;
1991 return StatusCode::FAILURE;
1994 float n_errors_float = prof_tmp->GetBinContent(iEta+1, iPhi+1);
1995 if (n_errors_float != 0){
1996 nErrs_Barrel_module[iLayer][iSide][
iEta][
iPhi][errItr->first] = n_errors_float;
1999 n_errors =
static_cast<unsigned long long>(n_errors_float);
2001 defecttype = m_pCalibWriteTool->addNumber(defecttype, errItr->first);
2002 n_defect = m_pCalibWriteTool->addNumber(n_defect, n_errors);
2003 errorProb =
static_cast<float>(n_errors) /
static_cast<float>(m_numberOfEvents);
2004 nErrLink_Barrel_module[iLayer][iSide][
iEta][
iPhi]+=n_errors;
2009 osErrorList << n_errors;
2010 osProbList << errorProb;
2017 if (!(defecttype.empty())) {
2019 nErrLink_Barrel[iLayer]++;
2020 if (m_writeToCool) {
2021 if (m_pCalibWriteTool->createListBSErr(waferId, m_pSCTHelper, m_numberOfEvents, osErrorList.str(), osProbList.str()).isFailure()) {
2023 return StatusCode::FAILURE;
2032 ATH_MSG_INFO(
"#Links which send BSError : " << n_errorLink);
2035 std::ostringstream summaryList;
2038 if (n_phiBinsEndcap[i][j] != 0) {
2039 summaryList << xmlPartData(ENDCAP_C, i, j,
"nErrLink", nErrLink_ECC[i][j]);
2044 summaryList << xmlPartData(
BARREL, i, 0,
"nErrLink", nErrLink_Barrel[i]);
2049 if (n_phiBinsEndcap[i][j] != 0) {
2050 summaryList << xmlPartData(ENDCAP_A, i, j,
"nErrLink", nErrLink_ECA[i][j]);
2055 if (openXML4MonSummary(m_outBSErrSummary,
"BSErrors").isFailure()) {
2057 return StatusCode::FAILURE;
2059 if (wrapUpXML4Summary(m_outBSErrSummary,
"BSErrors", summaryList).isFailure()) {
2061 return StatusCode::FAILURE;
2069 if (n_phiBinsEndcap[i][j] != 0) {
2070 for (
int k{0};
k < 2;
k++) {
2071 for (
int l{0};
l < n_phiBinsEndcap[
i][
j];
l++) {
2072 serial = nErrLink_ECC_module_serial[
i][
k][
j][
l];
2075 std::ostringstream errList;
2076 for (
int errCount{0}; errCount < numberOfErrorTypes; errCount++) {
2077 int type{errorValues[errCount]};
2078 errList <<
" " <<
xmlValue(ErrMap[
type], nErrs_ECC_module[i][k][j][l][
type]) << std::endl;
2081 moduleList << xmlModuleData(ENDCAP_C, i, k, j, l,
"nErrors", nErrLink_ECC_module[i][k][j][l], serial, errList.str());
2091 for (
int j{0};
j < 2;
j++) {
2093 for (
int l{0};
l < n_phiBinsBarrel[
i] ;
l++) {
2094 serial = nErrLink_Barrel_module_serial[
i][
j][
k][
l];
2096 std::ostringstream errList;
2097 for (
int errCount{0}; errCount < numberOfErrorTypes; errCount++) {
2098 int type{errorValues[errCount]};
2099 errList <<
" " <<
xmlValue(ErrMap[
type], nErrs_Barrel_module[i][j][k][l][
type]) << std::endl;
2102 moduleList << xmlModuleData(
BARREL, i, j, k, l,
"nErrors", nErrLink_Barrel_module[i][j][k][l], serial, errList.str());
2110 if (n_phiBinsEndcap[i][j] != 0) {
2111 for (
int k{0};
k < 2;
k++) {
2112 for (
int l{0};
l < n_phiBinsEndcap[
i][
j];
l++) {
2113 serial = nErrLink_ECA_module_serial[
i][
k][
j][
l];
2115 std::ostringstream errList;
2116 for (
int errCount{0}; errCount < numberOfErrorTypes; errCount++) {
2117 int type{errorValues[errCount]};
2118 errList <<
" " <<
xmlValue(ErrMap[
type], nErrs_ECA_module[i][k][j][l][
type]) << std::endl;
2121 moduleList << xmlModuleData(ENDCAP_A, i, k, j, l,
"nErrors", nErrLink_ECA_module[i][k][j][l], serial, errList.str());
2128 if (openXML4MonSummary(m_outBSErrModule,
"BSErrorsModule").isFailure()) {
2130 return StatusCode::FAILURE;
2132 if (wrapUpXML4Summary(m_outBSErrModule,
"BSErrors", moduleList).isFailure()) {
2134 return StatusCode::FAILURE;
2138 if (m_writeToCool) {
2139 if (m_pCalibWriteTool->wrapUpBSErrors().isFailure()) {
2141 return StatusCode::FAILURE;
2145 return StatusCode::SUCCESS;
2158 float A_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2159 float LA_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2160 float B_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2161 float Sigma_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2163 float Err_A_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2164 float Err_LA_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2165 float Err_B_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2166 float Err_Sigma_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2168 float MCW_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2169 float Err_MCW_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2170 float Chisq_BarrelSide[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2172 std::string DBUploadFlag{
"G"};
2173 std::string
module[2] = {
"100",
"111"};
2174 int moduleint[2] = {100, 111};
2176 int FitFlag[
n_barrels][2][2] = {{{0}, {0}}, {{0}, {0}}};
2185 stem =
"/run_" + std::to_string(m_runNumber.value()) +
"/SCT/GENERAL/lorentz/";
2186 m_h_phiVsNstripsSideHistoVector.clear();
2187 for (
int iLayer{0}; iLayer <
n_barrels ; ++iLayer) {
2188 for (
int iSide{0}; iSide < 2; ++iSide) {
2189 for (
int iModule{0}; iModule < 2; ++iModule) {
2190 std::ostringstream streamHist;
2191 streamHist <<
"h_phiVsNstrips_" <<
module[iModule] <<
"_" << iLayer <<
"Side" << iSide;
2192 std::string
histName{stem + streamHist.str()};
2193 TProfile* hist_tmp{
dynamic_cast<TProfile*
>(m_inputHist->Get(
histName.c_str()))};
2194 if (hist_tmp ==
nullptr) {
2195 ATH_MSG_ERROR(
"Unable to get histogram for LorentzAngle : " << histName);
2196 return StatusCode::FAILURE;
2198 m_h_phiVsNstripsSideHistoVector.push_back(hist_tmp);
2204 const char* outputLorentzAngleFileName{m_LorentzAngleFile.value().c_str()};
2205 std::ofstream
outFile{outputLorentzAngleFileName, std::ios::out};
2207 ATH_MSG_ERROR(
"Unable to open LorentzAngleFile : " << outputLorentzAngleFileName);
2208 return StatusCode::FAILURE;
2212 std::ostringstream osHeader;
2213 osHeader <<
"<folder>" << std::endl;
2216 fitFile =
new TFile(
"FittingDebugFile.root",
"RECREATE");
2219 for (
int iLayer{0}; iLayer <
n_barrels; ++iLayer) {
2220 for (
int iSide{0}; iSide < 2; ++iSide) {
2221 for (
int iModule{0}; iModule < 2; ++iModule) {
2222 if (iLayer==1 and iModule==0)
continue;
2223 ATH_MSG_INFO(
"LorentzAngle fit start : " << 4*iLayer + iSide +1 + iModule <<
" / 16");
2225 Double_t
par[4], err_par[4];
2226 TF1* LAfit{
new TF1{
"LAfit",
LA_func, -9., 2., 4}};
2227 std::ostringstream streamFile;
2228 streamFile <<
"h_phiVsNstrips_" <<
module[iModule] <<
"_" << iLayer <<
"Side" << iSide;
2230 LAfit->SetParLimits(3, 0.1, 50.);
2231 LAfit->SetParNames(
"a",
"LA",
"b",
"sigma");
2232 LAfit->SetParameters(1., -5., 1.13, 2.);
2233 fitResult = m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Fit(
"LAfit",
"E",
"", -9., 2.);
2234 LAfit->GetParameters(par);
2235 err_par[0] = LAfit->GetParError(0);
2236 err_par[1] = LAfit->GetParError(1);
2237 err_par[2] = LAfit->GetParError(2);
2238 err_par[3] = LAfit->GetParError(3);
2241 if (m_LorentzAngleDebugMode) {
2242 std::ostringstream streamFileTmp;
2243 streamFileTmp <<
"h_phiVsNstrips_" <<
module[iModule] <<
"_" << iLayer <<
"Side" << iSide <<
"_First_Fit";
2244 std::string
dn{streamFile.str()};
2245 std::string tmp_hn{streamFileTmp.str()};
2246 const char* dir_name{
dn.c_str()};
2247 const char* histo_name{tmp_hn.c_str()};
2249 fitFile->mkdir(dir_name);
2250 fitFile->cd(dir_name);
2251 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->SetName(histo_name);
2252 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Write();
2253 ATH_MSG_INFO(
"-------:Directory Name: " << dir_name <<
"--------");
2256 if (fitResult != 0) {
2257 ATH_MSG_INFO(
"Try to use parabola Fit to determine initial value!");
2258 TF1* parafit{
new TF1{
"parafit",
"[0]*(x-[1])*(x-[1])+[2]", -9., 2.}};
2259 ATH_MSG_INFO(
"LorentzAngle 2nd para fit start : " << 4*iLayer + iSide +1 + iModule <<
" / 16");
2260 parafit->SetParameters(par[0], par[1], LAfit->Eval(par[1], 0, 0, 0));
2261 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Fit(
"parafit",
"R",
"", -9., 2.);
2262 ATH_MSG_INFO(
"LorentzAngle 2nd pre fit start : " << 4*iLayer + iSide +1 + iModule <<
" / 16");
2263 par[1] = parafit->GetParameter(1);
2264 LAfit->SetParameters(par[0], par[1], par[2], par[3]);
2265 LAfit->SetParLimits(1, par[1], par[1]);
2266 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Fit(
"LAfit",
"R",
"", -9., 2.);
2267 LAfit->GetParameters(par);
2268 LAfit->SetParLimits(1, -90., 90.);
2269 LAfit->SetParameters(par[0], par[1], par[2], par[3]);
2270 ATH_MSG_INFO(
"LorentzAngle 2nd main fit start : " << 4*iLayer + iSide +1 + iModule <<
" / 16");
2271 fitResult = m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Fit(
"LAfit",
"E",
"", -9., 2.);
2272 LAfit->GetParameters(par);
2273 if (m_LorentzAngleDebugMode) {
2274 std::ostringstream streamFileTmp;
2275 streamFileTmp <<
"h_phiVsNstrips_" <<
module[iModule] <<
"_" << iLayer <<
"Side" << iSide <<
"Second_Fit";
2276 std::string tmp_hn{streamFileTmp.str()};
2277 const char* histo_name{tmp_hn.c_str()};
2278 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->SetName(histo_name);
2279 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Write();
2283 if (fitResult != 0) {
2284 ATH_MSG_INFO(
"Try to fix one parameter sigma=2.0 to determine other initial value!");
2285 ATH_MSG_INFO(
"LorentzAngle 3rd pre fit start : " << 4*iLayer + iSide +1+ iModule <<
" / 16");
2286 LAfit->SetParameters(par[0], par[1], par[2], 2.);
2287 LAfit->SetParLimits(3, 2., 2.);
2288 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Fit(
"LAfit",
"R",
"", -9., 2.);
2289 LAfit->GetParameters(par);
2290 LAfit->SetParLimits(3, 0., 50.);
2291 LAfit->SetParameters(par[0], par[1], par[2], par[3]);
2292 ATH_MSG_INFO(
"LorentzAngle 3rd main fit start : " << 4*iLayer + iSide +1 +iModule <<
" / 16");
2293 fitResult = m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Fit(
"LAfit",
"E",
"", -9., 2.);
2294 LAfit->GetParameters(par);
2295 if (m_LorentzAngleDebugMode) {
2296 std::ostringstream streamFileTmp;
2297 streamFileTmp <<
"h_phiVsNstrips_" <<
module[iModule] <<
"_" << iLayer <<
"Side" << iSide <<
"Third_Fit";
2298 std::string tmp_hn{streamFileTmp.str()};
2299 const char* histo_name{tmp_hn.c_str()};
2300 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->SetName(histo_name);
2301 m_h_phiVsNstripsSideHistoVector[4*iLayer + 2*iSide +iModule]->Write();
2305 if (fitResult == 0) {
2306 FitFlag[iLayer][iSide][iModule] = 1;
2309 FitFlag[iLayer][iSide][iModule] = 0;
2316 double err_A{err_par[0]};
2317 double err_LA{err_par[1]};
2318 double err_B{err_par[2]};
2319 double err_sigma{err_par[3]};
2320 float MCW{
static_cast<float>(LAfit->Eval(LA, 0, 0, 0))};
2321 float err_MCW{
static_cast<float>(LAfit->Eval(std::abs(err_par[1]), 0, 0, 0))};
2323 A_BarrelSide[iLayer][iSide][iModule] =
A;
2324 LA_BarrelSide[iLayer][iSide][iModule] = LA;
2325 B_BarrelSide[iLayer][iSide][iModule] =
B;
2326 Sigma_BarrelSide[iLayer][iSide][iModule] =
sigma;
2327 Err_A_BarrelSide[iLayer][iSide][iModule] = err_A;
2328 Err_LA_BarrelSide[iLayer][iSide][iModule] = err_LA;
2329 Err_B_BarrelSide[iLayer][iSide][iModule] = err_B;
2330 Err_Sigma_BarrelSide[iLayer][iSide][iModule] = err_sigma;
2331 MCW_BarrelSide[iLayer][iSide][iModule] = MCW;
2332 Err_MCW_BarrelSide[iLayer][iSide][iModule] = err_MCW;
2333 Chisq_BarrelSide[iLayer][iSide][iModule] = LAfit->GetChisquare();
2338 if (m_LorentzAngleDebugMode) {
2342 for (
int iLayer{0}; iLayer <
n_barrels; ++iLayer) {
2343 for (
int iSide{0}; iSide < 2; ++iSide) {
2344 for (
int iModule{0}; iModule < 2; ++iModule) {
2347 outFile <<
"<folderDefinition folder=\"SCT/Derived/LorentzAngleRun2_v2\" version=\"multi\">" << linefeed
2348 <<
" <folderDescription>" << linefeed
2349 <<
" <timeStamp>run-lumi</timeStamp>" << linefeed
2350 <<
" <addrHeader>" << linefeed
2351 <<
" <address_header service_type=\"71\" clid=\"1238547719\">" << linefeed
2352 <<
" </addrHeader>" << linefeed
2353 <<
" <typeName>CondAttrListCollection</typeName>" << linefeed
2354 <<
" </folderDescription>" << linefeed
2355 <<
" <payloadDescription>" << linefeed
2356 <<
" <payloadType name=\"moduleType\">" << moduleint[iModule] <<
"</payloadType>" << linefeed
2357 <<
" <payloadType name=\"lorentzAngle\">" << LA_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2358 <<
" <payloadType name=\"err_lorentzAngle\">" << Err_LA_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2359 <<
" <payloadType name=\"chisq\">" << Chisq_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2360 <<
" <payloadType name=\"fitParam_a\">" << A_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2361 <<
" <payloadType name=\"err_a\">" << Err_A_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2362 <<
" <payloadType name=\"fitParam_b\">" << B_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2363 <<
" <payloadType name=\"err_b\">" << Err_B_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2364 <<
" <payloadType name=\"fitParam_sigma\">" << Sigma_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2365 <<
" <payloadType name=\"err_sigma\">" << Err_Sigma_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2366 <<
" <payloadType name=\"minClusterWidth\">" << MCW_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2367 <<
" <payloadType name=\"err_minClusterWidth\">" << Err_MCW_BarrelSide[iLayer][iSide][iModule] <<
"</payloadType>" << linefeed
2368 <<
" </payloadDescription>" << linefeed
2369 <<
" <channel id=\"" <<
ch <<
"\" name=\"" << iLayer <<
"_" << iSide <<
" \" />" << linefeed
2370 <<
"</folderDefinition>" << std::endl;
2375 if (m_writeToCool) {
2376 if (m_pCalibWriteTool->createListLA(waferId, m_pSCTHelper, 10000, moduleint[iModule], LA_BarrelSide[iLayer][iSide][iModule], Err_LA_BarrelSide[iLayer][iSide][iModule], Chisq_BarrelSide[iLayer][iSide][iModule], A_BarrelSide[iLayer][iSide][iModule], Err_A_BarrelSide[iLayer][iSide][iModule], B_BarrelSide[iLayer][iSide][iModule], Err_B_BarrelSide[iLayer][iSide][iModule], Sigma_BarrelSide[iLayer][iSide][iModule], Err_Sigma_BarrelSide[iLayer][iSide][iModule], MCW_BarrelSide[iLayer][iSide][iModule], Err_MCW_BarrelSide[iLayer][iSide][iModule]).isFailure()) {
2378 return StatusCode::FAILURE;
2387 outFile <<
"</folder>" << std::endl;
2390 std::ostringstream summaryList;
2392 for (
int iSide{0}; iSide < 2; ++iSide) {
2393 for (
int iModule{0}; iModule < 2; ++iModule) {
2395 summaryList <<
" <parts>" << linefeed
2396 <<
xmlValue(
"part", thisPart) << linefeed
2397 <<
xmlValue(
"layer", i) << linefeed
2398 <<
xmlValue(
"Side", iSide) << linefeed
2399 <<
xmlValue(
"Module", module[iModule]) << linefeed
2400 <<
xmlValue(
"lorentzAngle", LA_BarrelSide[i][iSide][iModule]) << linefeed
2401 <<
xmlValue(
"minClusterWidth", MCW_BarrelSide[i][iSide][iModule]) << linefeed
2402 <<
xmlValue(
"Fit", FitFlag[i][iSide][iModule]) << linefeed
2403 <<
" </parts>" << linefeed;
2408 std::ofstream&
file{m_outLASummary};
2409 using TwoStrings = std::pair<std::string, std::string>;
2410 using Names = std::map<std::string, TwoStrings>;
2411 Names nameAssociation;
2412 nameAssociation[
"LorentzAngle"]=TwoStrings(m_LorentzAngleSummaryFile,
"LorentzAngleInfo.xsl");
2413 Names::iterator
found{nameAssociation.find(
"LorentzAngle")};
2414 if (found!=nameAssociation.end()) {
2416 std::string xslName{
found->second.second};
2418 if (!
file.good())
return StatusCode::FAILURE;
2419 file <<
xmlHeader << linefeed << associateStylesheet(xslName) << linefeed <<
"<run>" << std::endl;
2421 ATH_MSG_ERROR(
" argument \"type\" needs to be LorentzAngle.");
2422 return StatusCode::FAILURE;
2425 file <<
xmlValue(
"RunNumber", m_runNumber.value()) << linefeed
2426 <<
xmlValue(
"StartTime", m_utcBegin) << linefeed
2427 <<
xmlValue(
"EndTime", m_utcEnd) << linefeed
2428 <<
xmlValue(
"Duration", m_calibEvtInfoTool->duration()) << linefeed
2429 <<
xmlValue(
"LB", m_LBRange) << linefeed
2430 <<
xmlValue(
"Events", m_numberOfEvents) << linefeed
2431 <<
xmlValue(
"Flag", DBUploadFlag) << linefeed
2432 <<
" <data>" << std::endl;
2434 if (wrapUpXML4Summary(m_outLASummary,
"LorentzAngle", summaryList).isFailure()) {
2436 return StatusCode::FAILURE;
2440 if (m_writeToCool) {
2441 if (m_pCalibWriteTool->wrapUpLorentzAngle().isFailure()) {
2443 return StatusCode::FAILURE;
2446 return StatusCode::SUCCESS;
2454 if (!strcmp(
type,
"DeadStrip")) {
2456 if (!
file.good())
return StatusCode::FAILURE;
2457 file <<
"<channels server=\"ATLAS_COOLPROD\" schema=\"ATLAS_COOLOFL_SCT\" dbname=\"MONP200\" folder=\"SCT/Derived/DeadStrips\" ";
2458 }
else if (!strcmp(
type,
"DeadChip")) {
2460 if (!
file.good())
return StatusCode::FAILURE;
2461 file <<
"<channels server=\"ATLAS_COOLPROD\" schema=\"ATLAS_COOLOFL_SCT\" dbname=\"MONP200\" folder=\"SCT/Derived/DeadChips\" ";
2463 ATH_MSG_ERROR(
"in openXML4DB : argument \"type\" needs to be (DeadStrip, DeadChip).");
2464 return StatusCode::FAILURE;
2466 file <<
"since=\"" << start.re_time() <<
"\" "
2467 <<
"until=\"" << end.re_time() <<
"\" "
2468 <<
"tag=\"" << tag <<
"\" "
2469 <<
"version=\"" <<
"multi\">" << linefeed;
2470 return StatusCode::SUCCESS;
2475 file <<
"</channels>" << std::endl;
2476 if (
file.is_open()) {
2478 return StatusCode::SUCCESS;
2480 return StatusCode::FAILURE;
2486 std::string tmp{DefectList};
2487 int length{
static_cast<int>(tmp.length())};
2488 std::string Defect4DB{tmp.substr(1,
length-2)};
2491 <<
xmlValue(
"SampleSize",
"10000") << linefeed
2496 <<
xmlValue(
"DefectType", DefectType) << linefeed
2498 <<
xmlValue(
"DefectList", Defect4DB) << linefeed
2501 return StatusCode::SUCCESS;
2509 if (!strcmp(
type,
"DEAD")) {
2511 if (!
file.good())
return StatusCode::FAILURE;
2512 file << xmlHeader << linefeed << associateStylesheet(
"DeadInfo.xsl") << linefeed
2513 <<
"<run>" << linefeed;
2515 ATH_MSG_ERROR(
"in openXML4DeadSummary : argument \"type\" needs to be \"DEAD\".");
2516 return StatusCode::FAILURE;
2520 std::string strUploadFlag{
"U"};
2521 bool isNonZero{
false};
2526 strUploadFlag =
"G";
2528 strUploadFlag =
"R";
2533 std::ostringstream osNonZero;
2534 osNonZero <<
"#chips or #strips is non-zero";
2535 std::ostringstream osFlagReason;
2536 if (!isNonZero) osFlagReason <<
"FAILED in " << osNonZero.str();
2538 std::ostringstream osCheckList;
2539 osCheckList << osNonZero.str();
2547 <<
xmlValue(
"Modules", n_Module) << linefeed
2548 <<
xmlValue(
"Links", n_Link) << linefeed
2549 <<
xmlValue(
"Chips", n_Chip) << linefeed
2550 <<
xmlValue(
"Strips", n_Strip) << linefeed
2551 <<
xmlValue(
"Flag", strUploadFlag) << linefeed
2552 <<
xmlValue(
"FlagReason", osFlagReason.str()) << linefeed
2553 <<
xmlValue(
"FlagEnable", strFlagEnable) << linefeed
2554 <<
xmlValue(
"CheckList", osCheckList.str()) << linefeed
2555 <<
" <modules>" << std::endl;
2557 return StatusCode::SUCCESS;
2562 using TwoStrings = std::pair<std::string, std::string>;
2563 using Names = std::map<std::string, TwoStrings>;
2564 Names nameAssociation;
2570 Names::iterator found{nameAssociation.find(
type)};
2571 if (found!=nameAssociation.end()) {
2572 std::string filename{found->second.first};
2573 std::string xslName{found->second.second};
2575 file.open(filename.c_str(), std::ios::out);
2576 if (!
file.good())
return StatusCode::FAILURE;
2577 file << xmlHeader << linefeed << associateStylesheet(xslName) << linefeed <<
"<run>" << std::endl;
2579 ATH_MSG_ERROR(
"in openXML4MonSummary : argument \"type\" needs to be (NoiseOccupancy, RawOccupancy, Efficiency, BSErrors).");
2580 return StatusCode::FAILURE;
2588 <<
" <data>" << std::endl;
2589 return StatusCode::SUCCESS;
2595 if (!strcmp(
type,
"DEAD")) {
2596 file <<
" </modules>" << std::endl;
2597 }
else if (!strcmp(
type,
"NoiseOccupancy") or !strcmp(
type,
"RawOccupancy") or !strcmp(
type,
"Efficiency") or !strcmp(
type,
"BSErrors") or !strcmp(
type,
"LorentzAngle")) {
2598 file <<
" </data>" << std::endl;
2600 file <<
"</run>" << std::endl;
2602 if (
file.is_open()) {
2604 return StatusCode::SUCCESS;
2606 return StatusCode::FAILURE;
2613 const std::string tmpstrip{stripId};
2614 const std::string tmpchip{chipId};
2615 int len_strip{
static_cast<int>(tmpstrip.length())};
2616 int len_chip{
static_cast<int>(tmpchip.length())};
2617 std::string stripList{
""};
2618 std::string chipList{
""};
2619 if (len_strip > 0) {
2620 int stringLength = (len_strip-2 >0) ? len_strip-2 : len_strip;
2621 stripList = tmpstrip.substr(1, stringLength);
2624 int stringLength = (len_chip-2 >0) ? len_chip-2 : len_chip;
2625 chipList = tmpchip.substr(1, stringLength);
2639 XmlStreamer v{
"value",
"name",
"BecLayerPhiEta", list};
2650 if (!strcmp(
type,
"DEAD")) {
2651 XmlStreamer v{
"value",
"name",
"StripIDOnline", list};
2654 ATH_MSG_ERROR(
"in addToSummaryStr : argument \"type\" needs to be \"DEAD\".");
2655 return StatusCode::FAILURE;
2658 return StatusCode::SUCCESS;
2664 std::ostringstream os;
2666 <<
" " <<
xmlValue(
"SN", serial.
str()) << std::endl
2667 <<
" " <<
xmlValue(
"SampleSize",
"10000") << std::endl
2672 <<
" " <<
xmlValue(
"NoiseOccupancy", occupancy) << std::endl
2680 std::ostringstream os;
2681 os <<
" <module>" << std::endl
2682 <<
" " <<
xmlValue(
"SN", serial.
str()) << std::endl
2683 <<
" " <<
xmlValue(
"SampleSize",
"10000") << std::endl
2689 <<
" " <<
xmlValue(
"Side", side )<<std::endl
2697 std::ostringstream os;
2698 os <<
" <chip>" << std::endl
2699 <<
" " <<
xmlValue(
"SN", serial.
str()) << std::endl
2700 <<
" " <<
xmlValue(
"SampleSize",
"10000") << std::endl
2705 <<
" " <<
xmlValue(
"Side", side )<<std::endl
2706 <<
" " <<
xmlValue(
"Chip", chip )<<std::endl
2708 <<
" " <<
xmlValue(
"Efficiency_bcid", efficiency_bcid) << std::endl
2717 int numNoisyStripsInTheWafer{0};
2718 bool isNoisyWafer{
false};
2720 for (
int iStrip{0}; iStrip !=
nbins; ++iStrip) {
2725 const int subdetector{
m_pSCTHelper->barrel_ec(waferId)};
2734 << averageOccupancy);
2736 return std::make_pair(numNoisyStripsInTheWafer, isNoisyWafer);
2744 for (
int iStrip{0}; iStrip !=
nbins; ++iStrip) {
2747 stripIdList.insert(stripId);
2750 if (stripOccupancy > noisyStripThr) {
2752 stripIdList.insert(stripId);
2757 if (isGoodInConfiguration and isGoodInCalibration) {
2758 stripIdList.insert(stripId);
2765 return StatusCode::SUCCESS;
2771(
const std::map<Identifier, std::set<Identifier>>& moduleListAll,
2772 const std::map<Identifier, std::set<Identifier>>& moduleListNew,
2773 const std::map<Identifier, std::set<Identifier>>& moduleListRef) {
2775 float noisyStripThr{m_noisyStripThrDef?(m_noisyStripThrOffline):(m_noisyStripThrOnline)};
2779 for (; idItr != idItrE; ++idItr) {
2780 if (m_pSCTHelper->side(*idItr) == 0) {
2781 Identifier moduleId{m_pSCTHelper->module_id(*idItr)};
2782 std::map<Identifier, std::set<Identifier>>
::const_iterator moduleAllItr{moduleListAll.find(moduleId)};
2783 std::map<Identifier, std::set<Identifier>>
::const_iterator moduleNewItr{moduleListNew.find(moduleId)};
2784 std::map<Identifier, std::set<Identifier>>
::const_iterator moduleRefItr{moduleListRef.find(moduleId)};
2785 std::string defectStripsAll{moduleAllItr != moduleListAll.end() ? getStripList((*moduleAllItr).second) :
""};
2786 std::string defectStripsNew{moduleNewItr != moduleListNew.end() ? getStripList((*moduleNewItr).second) :
""};
2787 std::string defectStripsRef{moduleRefItr != moduleListRef.end() ? getStripList((*moduleRefItr).second) :
""};
2788 if (m_noisyUpdate) {
2789 if (defectStripsAll != defectStripsRef) {
2790 if (m_pCalibWriteTool->createCondObjects(moduleId, m_pSCTHelper, 10000,
"NOISY", noisyStripThr, defectStripsAll).isFailure()) {
2791 ATH_MSG_ERROR(
"Could not create defect strip entry in the CalibWriteTool.");
2796 if (m_noisyStripAll) {
2797 if (!defectStripsAll.empty() || m_noisyWriteAllModules) {
2798 if (m_pCalibWriteTool->createCondObjects(moduleId, m_pSCTHelper, 10000,
"NOISY", noisyStripThr, defectStripsAll).isFailure()) {
2799 ATH_MSG_ERROR(
"Could not create defect strip entry in the CalibWriteTool.");
2803 if (!defectStripsNew.empty()) {
2804 if (m_pCalibWriteTool->createCondObjects(moduleId, m_pSCTHelper, 10000,
"NOISY", noisyStripThr, defectStripsNew).isFailure()) {
2805 ATH_MSG_ERROR(
"Could not create defect strip entry in the CalibWriteTool.");
2812 ATH_MSG_DEBUG(
"Number of modules for which conditions were created: " << nDefects <<
" !!!!");
2813 if (moduleListAll.empty() or ( nDefects==0 && m_noisyUpdate )) {
2814 ATH_MSG_INFO(
"Number of noisy strips was zero or the same list of noisy strips. No local DB was created.");
2816 ATH_MSG_DEBUG(
"directly before call of wrapUpNoisyChannel");
2817 if (m_pCalibWriteTool->wrapUpNoisyChannel().isFailure()) {
2819 return StatusCode::FAILURE;
2823 return StatusCode::SUCCESS;
2829 std::set<Identifier> stripList;
2830 std::set<Identifier>::const_iterator stripAllItrLast = stripAllIdList.end();
2831 std::set<Identifier>::const_iterator stripRefItrLast = stripRefIdList.end();
2833 std::set<Identifier>::const_iterator stripAllItr = stripAllIdList.begin();
2834 for ( ; stripAllItr != stripAllItrLast; ++stripAllItr ) {
2835 std::set<Identifier>::const_iterator stripRefItr = stripRefIdList.begin();
2837 for ( ; stripRefItr != stripRefItrLast; ++stripRefItr ) {
2838 if (*stripAllItr == *stripRefItr) old =
true;
2841 stripList.insert(*stripAllItr);
2850 std::string strList;
2851 if (!stripIdList.empty()) {
2855 std::set<Identifier>::const_iterator stripItrFirst{stripIdList.begin()};
2856 std::set<Identifier>::const_iterator stripItrLast{--stripIdList.end()};
2858 std::set<Identifier>::const_iterator stripItr{stripIdList.begin()};
2859 std::set<Identifier>::const_iterator stripItrE{stripIdList.end()};
2860 for (; stripItr != stripItrE; ++stripItr) {
2863 if (stripItr == stripItrFirst) {
2877 if (stripItr == stripItrLast) {
2879 int stripEnd{stripNum};
2893 if (!outFile.good()) {
2895 return(StatusCode::FAILURE);
2899 std::ostringstream osModuleList;
2903 for (; waferItr != waferItrE; ++waferItr) {
2907 std::map< Identifier, std::set<Identifier> >
::const_iterator moduleItr{moduleList.find(moduleId)};
2908 if (moduleItr != moduleList.end()) {
2909 std::string defectStrips{
getStripList((*moduleItr).second)};
2910 osModuleList <<
" <channel id=\"" <<
m_pSCTHelper->module_id(waferId).get_compact() <<
"\" "
2911 <<
"since=\"" <<
m_iovStart.re_time() <<
"\" "
2912 <<
"until=\"" <<
m_iovStop.re_time() <<
"\">" << linefeed
2913 <<
" <value name=\"SampleSize\">" <<
"10000" <<
"</value>" << linefeed
2914 <<
" <value name=\"BarrelEndcap\">" <<
m_pSCTHelper->barrel_ec(waferId) <<
"</value>" << linefeed
2915 <<
" <value name=\"Layer\">" <<
m_pSCTHelper->layer_disk(waferId) <<
"</value>" << linefeed
2916 <<
" <value name=\"Eta\">" <<
m_pSCTHelper->eta_module(waferId) <<
"</value>" << linefeed
2917 <<
" <value name=\"Phi\">" <<
m_pSCTHelper->phi_module(waferId) <<
"</value>" << linefeed
2918 <<
" <value name=\"DefectType\">" <<
"NOISY" <<
"</value>" << linefeed
2919 <<
" <value name=\"Threshold\">" << noisyStripThr <<
"</value>" << linefeed
2920 <<
" <value name=\"DefectList\">" <<
normalizeList(defectStrips) <<
"</value>" << linefeed
2921 <<
" </channel>" << std::endl;
2925 outFile <<
"<channels server=\"ATLAS_COOLPROD\" schema=\"ATLAS_COOLOFL_SCT\" dbname=\"CONDBR2\" folder=\"SCT/Derived/Monitoring\" "
2926 <<
"since=\"" <<
m_iovStart.re_time() <<
"\" "
2927 <<
"until=\"" <<
m_iovStop.re_time() <<
"\" "
2929 <<
"version=\"" <<
"multi\">" << std::endl
2930 << osModuleList.str()
2931 <<
"</channels>" << std::endl;
2933 return StatusCode::SUCCESS;
2938 const std::map<
Identifier, std::set<Identifier>>& moduleListRef,
2939 const std::string& badStripsFile)
const {
2946 if (!outFile.good()) {
2948 return(StatusCode::FAILURE);
2952 int numLinksAll{0}, numChipsAll{0};
2953 int numModulesAll{0}, numModulesRef{0};
2954 int numStripsAll{0}, numStripsNew{0}, numStripsRef{0};
2955 int numModulesDiff{0};
2957 std::string defectLinks, defectChips;
2958 std::string defectStripsAll, defectStripsNew, defectStripsRef;
2959 std::ostringstream osModuleList, osChipList;
2964 ATH_MSG_DEBUG(
"noisyStripsToSummaryXml: before wafer loop");
2965 for (; waferItr != waferItrE; ++waferItr) {
2974 defectLinks.erase();
2975 defectChips.erase();
2976 defectStripsAll.erase();
2977 defectStripsNew.erase();
2978 defectStripsRef.erase();
2993 std::map< Identifier, std::set<Identifier> >
::const_iterator moduleAllItr{moduleListAll.find(moduleId)};
2994 if (moduleAllItr != moduleListAll.end()) {
2995 defectStripsAll =
getStripList((*moduleAllItr).second);
2997 numStripsAll += (*moduleAllItr).second.size();
3002 std::map< Identifier, std::set<Identifier> >
::const_iterator moduleRefItr{moduleListRef.find(moduleId)};
3003 if (moduleRefItr != moduleListRef.end()) {
3006 numStripsRef += moduleRefItr->second.size();
3011 if ( moduleAllItr != moduleListAll.end() ) {
3012 if ( moduleRefItr != moduleListRef.end() ) {
3013 std::set<Identifier> listNEW =
getOverlapStripList( (*moduleAllItr).second, (*moduleRefItr).second );
3015 numStripsNew += listNEW.size();
3018 defectStripsNew =
getStripList( (*moduleAllItr).second );
3022 ATH_MSG_DEBUG(
"noisyStripsToSummaryXml: stripIdList -> chipIdList");
3024 if (moduleAllItr != moduleListAll.end()) {
3025 std::set<int> chipIdList{
getNoisyChips(moduleAllItr->second)};
3026 if (!chipIdList.empty()) {
3028 std::set<int>::iterator chipItr{chipIdList.begin()};
3029 std::set<int>::iterator chipItrE{chipIdList.end()};
3030 for (; chipItr != chipItrE; ++chipItr) {
3031 int chipId{*chipItr};
3035 std::pair< std::string, float > defectLB{
getNoisyLB(moduleId, chipId)};
3037 osChipList <<
" <chip>" << linefeed
3038 <<
" <value name=\"SN\">" << sn.
str() <<
"</value>" << linefeed
3039 <<
" <value name=\"BecLayerPhiEta\">" <<
m_pSCTHelper->barrel_ec(waferId) <<
"."
3042 <<
m_pSCTHelper->eta_module(waferId) <<
"</value>" << linefeed
3043 <<
" <value name=\"ChipID\">" << chipId <<
"</value>" << linefeed
3044 <<
" <value name=\"LB\">" <<
normalizeList(defectLB.first) <<
"</value>" << linefeed
3045 <<
" <value name=\"LBFraction\">" << defectLB.second <<
"</value>" << linefeed
3046 <<
" </chip>" << std::endl;
3050 ATH_MSG_DEBUG(
"noisyStripsToSummaryXml: Difference between All & Ref");
3052 if (defectStripsAll != defectStripsRef) ++numModulesDiff;
3054 if (!defectStripsAll.empty() or (
m_noisyUpdate and defectStripsAll != defectStripsRef)) {
3055 osModuleList <<
" <module>" << linefeed
3056 <<
" <value name=\"SN\">" << sn.
str() <<
"</value>" << linefeed
3057 <<
" <value name=\"BecLayerPhiEta\">" <<
m_pSCTHelper->barrel_ec(waferId) <<
"."
3060 <<
m_pSCTHelper->eta_module(waferId) <<
"</value>" << linefeed
3061 <<
" <value name=\"LinkID\">" <<
normalizeList(defectLinks) <<
"</value>" << linefeed
3062 <<
" <value name=\"ChipID\">" <<
normalizeList(defectChips) <<
"</value>" << linefeed
3063 <<
" <value name=\"StripOfflineAll\">" <<
normalizeList(defectStripsAll) <<
"</value>" << linefeed
3064 <<
" <value name=\"StripOfflineNew\">" <<
normalizeList(defectStripsNew) <<
"</value>" << linefeed
3065 <<
" <value name=\"StripOfflineRef\">" <<
normalizeList(defectStripsRef) <<
"</value>" << linefeed
3066 <<
" </module>" << std::endl;
3068 ATH_MSG_DEBUG(
"noisyStripsToSummaryXml: After Difference between All & Ref");
3075 std::string strUploadFlag{
"U"};
3077 bool isRunsInCool{
false};
3078 bool isNoisyMinStat{
false}, isNoisyModuleList{
false}, isNoisyModuleDiff{
false}, isNoisyStripDiff{
false};
3086 if (!isNoisyMinStat or !isNoisyModuleList) {
3087 strUploadFlag =
"R";
3089 if (!isNoisyModuleDiff or !isNoisyStripDiff) {
3090 strUploadFlag =
"Y";
3092 strUploadFlag =
"G";
3098 ATH_MSG_DEBUG(
"noisyStripsToSummaryXml: after FlagChecking");
3101 std::ostringstream osNoisyMinStat, osNoisyModuleList, osNoisyModuleDiff, osNoisyStripDiff;
3102 osNoisyMinStat <<
"#events more than " <<
m_noisyMinStat.value();
3103 osNoisyModuleList <<
"#(modules w/ at least 1 noisy strip) less than " <<
m_noisyModuleList.value();
3104 osNoisyModuleDiff <<
"Increase of #(modules w/ at least 1 noisy strip) from average of recent runs less than " <<
m_noisyModuleDiff*100 <<
"%";
3105 osNoisyStripDiff <<
"Increase of #(noisy strips) from average of recent runs less than " <<
m_noisyStripDiff*100 <<
"%";
3107 std::ostringstream osFlagReason;
3108 if (!isNoisyMinStat) osFlagReason <<
"FAILED in " << osNoisyMinStat.str() <<
"; ";
3109 if (!isNoisyModuleList) osFlagReason <<
"FAILED in " << osNoisyModuleList.str() <<
"; ";
3110 if (!isNoisyModuleDiff) osFlagReason <<
"FAILED in " << osNoisyModuleDiff.str() <<
"; ";
3111 if (!isNoisyStripDiff) osFlagReason <<
"FAILED in " << osNoisyStripDiff.str();
3114 std::string strRunsInCool = isRunsInCool ?
"AVAILABLE" :
"UNAVAILABLE";
3116 std::ostringstream osCheckList;
3117 osCheckList << osNoisyMinStat.str() <<
"; "
3118 << osNoisyModuleList.str() <<
"; "
3119 << osNoisyModuleDiff.str() <<
"; "
3120 << osNoisyStripDiff.str();
3123 outFile << xmlHeader << linefeed
3124 << associateStylesheet(
"BadStrips.xsl") << linefeed
3125 <<
"<run>" << linefeed
3126 <<
" <value name=\"RunNumber\">" <<
m_runNumber.value() <<
"</value>" << linefeed
3127 <<
" <value name=\"StartTime\">" <<
m_utcBegin <<
"</value>" << linefeed
3128 <<
" <value name=\"EndTime\">" <<
m_utcEnd <<
"</value>" << linefeed
3129 <<
" <value name=\"Duration\">" <<
m_calibEvtInfoTool->duration() <<
"</value>" << linefeed
3131 <<
" <value name=\"Events\">" <<
m_numberOfEvents <<
"</value>" << linefeed
3132 <<
" <value name=\"Modules\">" << numModulesAll <<
"</value>" << linefeed
3133 <<
" <value name=\"Links\">" << numLinksAll <<
"</value>" << linefeed
3134 <<
" <value name=\"Chips\">" << numChipsAll <<
"</value>" << linefeed
3135 <<
" <value name=\"StripsOfflineAll\">" << numStripsAll <<
"</value>" << linefeed
3136 <<
" <value name=\"StripsOfflineNew\">" << numStripsNew <<
"</value>" << linefeed
3137 <<
" <value name=\"ModulesRef\">" << numModulesRef <<
"</value>" << linefeed
3138 <<
" <value name=\"StripsOfflineRef\">" << numStripsRef <<
"</value>" << linefeed
3139 <<
" <value name=\"ModulesDiff\">" << numModulesDiff <<
"</value>" << linefeed
3140 <<
" <value name=\"Flag\">" << strUploadFlag <<
"</value>" << linefeed
3141 <<
" <value name=\"FlagReason\">" << osFlagReason.str() <<
"</value>" << linefeed
3142 <<
" <value name=\"FlagEnable\">" << strFlagEnable <<
"</value>" << linefeed
3143 <<
" <value name=\"ReadCool\">" << strRunsInCool <<
"</value>" << linefeed
3144 <<
" <value name=\"CheckList\">" << osCheckList.str() <<
"</value>" << linefeed
3145 <<
" <chips>" << linefeed
3147 <<
" </chips>" << linefeed
3148 <<
" <modules>" << linefeed
3149 << osModuleList.str()
3150 <<
" </modules>" << linefeed
3151 <<
"</run>" << std::endl;
3155 return StatusCode::SUCCESS;
3161 std::set<int> chipIdList;
3167 if (elements==
nullptr) {
3174 if (stripIdList.size() > noisyChipThr) {
3177 std::set<Identifier>::const_iterator stripItr{stripIdList.begin()};
3178 std::set<Identifier>::const_iterator stripItrE{stripIdList.end()};
3179 for (; stripItr != stripItrE; ++stripItr) {
3192 ++numStripsPerChip[chipId];
3197 if (numStripsPerChip[iChip] > noisyChipThr) chipIdList.insert(iChip);
3204std::pair< std::string, float >
3206 std::string defectLB{
""};
3207 float defectLBFrac{0.0};
3219 int histIndex{
static_cast<int>((waferHash.
value())*
n_chipPerSide + chipPositionInSide)};
3223 std::set<int> LBList;
3227 return std::make_pair(defectLB, defectLBFrac);
3230 for (
int iLB{0}; iLB !=
m_LBRange; ++iLB) {
3231 double numEventsInLB{
static_cast<double>(
m_calibLbTool->getNumberOfEventsInBin(iLB + 1))};
3232 if (numEventsInLB == 0)
continue;
3233 double chipOccupancy{(float)
m_calibLbTool->getBinForHistogramIndex(iLB + 1, histIndex) / numEventsInLB};
3234 if (chipOccupancy > chipOccupancyThr) LBList.insert(iLB);
3237 if (LBList.size() != 0) {
3242 return std::make_pair(defectLB, defectLBFrac);
3247 std::string strList;
3249 if (!LBList.empty()) {
3253 std::set<int>::const_iterator LBItrFirst{LBList.begin()};
3254 std::set<int>::const_iterator LBItrLast{--LBList.end()};
3256 std::set<int>::const_iterator LBItr{LBList.begin()};
3257 std::set<int>::const_iterator LBItrE{LBList.end()};
3258 for (; LBItr != LBItrE; ++LBItr) {
3260 if (LBItr == LBItrFirst) {
3264 if (iLB == firstLB + LBSize) {
3267 int LBBegin{firstLB};
3268 int LBEnd{firstLB + LBSize -1};
3274 if (LBItr == LBItrLast) {
3275 int LBBegin{firstLB};
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
void swap(DataVector< T > &a, DataVector< T > &b)
See DataVector<T, BASE>::swap().
static const std::string outputFileName
StatusCode SCTCalib::stop ATLAS_NOT_THREAD_SAFE()
stop - process results accumulated in execute()
Header file for the SCTCalib class.
header file for the SCTCalibUtilities
Double_t LA_func(Double_t *x, Double_t *par)
static const Attributes_t empty
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
const ServiceHandle< StoreGateSvc > & detStore() const
Basic time unit for IOVSvc.
static constexpr uint32_t MINEVENT
static constexpr uint32_t MAXEVENT
value_type get_compact() const
Get the compact id.
This is a "hash" representation of an Identifier.
constexpr value_type value() const
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
bool swapPhiReadoutDirection() const
Determine if readout direction between online and offline needs swapping.
BooleanProperty m_doDeadChip
ToolHandle< ISCT_CalibHistoTool > m_calibBsErrTool
StatusCode openXML4DB(std::ofstream &, const char *, const char *, const IOVTime &, const IOVTime &) const
std::string getStripList(const std::set< Identifier > &stripIdList) const
BooleanProperty m_noisyUpdate
FloatProperty m_noisyWaferThrECC
UnsignedIntegerProperty m_rawOccupancyMinStat
BooleanProperty m_doNoiseOccupancy
StringProperty m_deadStripsFile
std::pair< int, bool > getNumNoisyStrips(const Identifier &waferId) const
UnsignedIntegerProperty m_efficiencyMinStat
FloatProperty m_noisyModuleDiff
FloatProperty m_noisyStripDiff
std::string xmlChannelNoiseOccDataString(const Identifier &waferId, const float occupancy, const SCT_SerialNumber &serial) const
StringProperty m_BSErrorSummaryFile
BooleanProperty m_doDeadStrip
std::string xmlChannelEfficiencyDataString(const Identifier &waferId, const float efficiency, const SCT_SerialNumber &serial, const int side) const
FloatProperty m_noisyStripThrOffline
std::pair< std::string, float > getNoisyLB(const Identifier &moduleId, int &chipId) const
StatusCode noisyStripsToXml(const std::map< Identifier, std::set< Identifier > > &moduleList, const std::string &badStripsFile) const
StatusCode noisyStripsToSummaryXml(const std::map< Identifier, std::set< Identifier > > &moduleListAll, const std::map< Identifier, std::set< Identifier > > &moduleListRef, const std::string &badStripsFile) const
StringProperty m_BSErrorModuleFile
FloatProperty m_noisyModuleAverageInDB
ToolHandle< ISCT_CalibModuleListTool > m_calibModuleListTool
bool retrievedService(S &service) const
StatusCode addToXML4DB(std::ofstream &, const Identifier &, const char *, float, const char *) const
ToolHandle< ISCT_ReadCalibDataTool > m_ReadCalibDataTool
ToolHandle< ISCT_CalibEvtInfo > m_calibEvtInfoTool
ToolHandle< ISCT_ConfigurationConditionsTool > m_ConfigurationConditionsTool
virtual StatusCode initialize() override
std::set< int > getNoisyChips(const std::set< Identifier > &stripIdList) const
UnsignedIntegerProperty m_noiseOccupancyMinStat
std::set< Identifier > getOverlapStripList(const std::set< Identifier > &stripAllIdList, const std::set< Identifier > &stripRefIdList) const
BooleanProperty m_useMajority
ToolHandle< ISCT_CalibHistoTool > m_calibHitmapTool
const SCT_ID * m_pSCTHelper
StringProperty m_rawOccupancySummaryFile
BooleanProperty m_deadChipUploadTest
UnsignedIntegerProperty m_LorentzAngleMinStat
StatusCode wrapUpXML4Summary(std::ofstream &, const char *, std::ostringstream &) const
BooleanProperty m_doBSErrorDB
StringArrayProperty m_input_hist
BooleanProperty m_writeToCool
FloatProperty m_noisyWaferThrECA
IntegerProperty m_nLbsMerged
ToolHandle< ISCT_CablingTool > m_CablingTool
StringProperty m_deadChipsFile
FloatProperty m_noisyStripThrOnline
unsigned long long m_numberOfEventsHist
StringProperty m_deadSummaryFile
ToolHandle< ISCT_CalibHistoTool > m_calibLbTool
UnsignedIntegerProperty m_noisyMinStat
BooleanProperty m_readHitMaps
UnsignedIntegerProperty m_BSErrorDBMinStat
StringProperty m_efficiencySummaryFile
BooleanProperty m_doRawOccupancy
std::string xmlChannelEfficiencyDataStringChip(const Identifier &waferId, const float efficiency, const float efficiency_bcid, const SCT_SerialNumber &serial, const int side, const int chip) const
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
BooleanProperty m_doEfficiency
StatusCode addToSummaryStr(std::ostringstream &, const Identifier &, const char *, const char *, const char *) const
SCTCalib(const std::string &name, ISvcLocator *pSvcLocator)
void doHVPrintXML(const std::pair< int, int > &timeInterval, const std::pair< int, int > &lbRange, Identifier)
doHVPrintXML() Prints XML file for hv modules
StringProperty m_noiseOccupancySummaryFile
BooleanProperty m_useBSError
IntegerProperty m_eventNumber
StatusCode openXML4DeadSummary(std::ofstream &file, const char *type, int n_Module=0, int n_Link=0, int n_Chip=0, int n_Strip=0) const
BooleanProperty m_noisyStripThrDef
virtual StatusCode finalize() override
Finalize - delete any memory allocation from the heap.
StringProperty m_runStartTime
StatusCode openXML4MonSummary(std::ofstream &, const char *) const
FloatProperty m_noisyChipFraction
FloatProperty m_noisyStripAverageInDB
ToolHandle< ISCT_DetectorLevelConditionsTool > m_MajorityConditionsTool
StatusCode closeXML4DB(std::ofstream &) const
StringProperty m_runEndTime
IntegerProperty m_runNumber
unsigned long long m_numberOfEvents
BooleanProperty m_useCalibration
BooleanProperty m_doLorentzAngle
BooleanProperty m_noisyUploadTest
BooleanProperty m_doNoisyStrip
ToolHandle< SCTCalibWriteTool > m_pCalibWriteTool
BooleanProperty m_doBSErrors
FloatProperty m_noisyWaferFraction
BooleanProperty m_doHitMaps
std::string getLBList(const std::set< int > &LBList) const
FloatProperty m_noisyWaferThrBarrel
BooleanProperty m_doHitMapsLB
virtual StatusCode execute(const EventContext &ctx) override
Execute method.
bool notEnoughStatistics(const int required, const int obtained, const std::string &histogramName="HIST") const
BooleanProperty m_deadStripUploadTest
BooleanProperty m_useConfiguration
StringProperty m_tagID4NoisyStrips
IntegerProperty m_noisyModuleList
IntegerProperty m_noisyStripLastRunInDB
StatusCode addStripsToList(const EventContext &ctx, Identifier &waferId, std::set< Identifier > &stripIdList, bool isNoisy, bool isNew) const
std::vector< Identifier >::const_iterator const_id_iterator
SCT_SerialNumber is a class to hold a serial number and provide check on validity,...
std::string str() const
Full serial number as a string.
const_pointer_type retrieve()
void efficiency(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
outFile
Comment Out Those You do not wish to run.
l
Printing final latex table to .tex output file.
std::string formatPosition(const Identifier &waferId, const SCT_ID *helper, std::string_view delimiter, const bool includeSide)
std::string chipList2LinkList(const std::string &chipList)
std::string xmlCloseChannel()
std::string normalizeList(std::string s)
std::string xmlOpenChannel(const long id, const T since, const T until)
std::string xmlValue(const std::string &name, const T value)
unsigned int bec2Index(const int bec)
std::string xmlHeader(const std::string &version="1.0", const std::string &encoding="UTF-8")
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
int ALL
message levels --------------------------------------------------------—
setScale setgFexType iEta
hold the test vectors and ease the comparison