22   float coerceToFloatRange(
const double value) {
 
   25     return static_cast<float>(std::clamp(
value,minfloat,maxfloat));
 
   71     if (writeKeyData==
nullptr) 
continue;
 
  107     ATH_MSG_FATAL(
"IgnoreDefect != IgnoreDefectsParameters, check job options!");
 
  108     return StatusCode::FAILURE;
 
  111   return StatusCode::SUCCESS;
 
  118   bool validWriteCondHandle{
true};
 
  123       ATH_MSG_DEBUG(
"CondHandle " << writeHandleData[
i].fullKey() << 
" is already valid." 
  124                     << 
". In theory this should not be called, but may happen" 
  125                     << 
" if multiple concurrent events are being processed out of order.");
 
  127       validWriteCondHandle = 
false;
 
  131   if (writeHandleInfo.isValid()) {
 
  132     ATH_MSG_DEBUG(
"CondHandle " << writeHandleInfo.fullKey() << 
" is already valid." 
  133                   << 
". In theory this should not be called, but may happen" 
  134                   << 
" if multiple concurrent events are being processed out of order.");
 
  136     validWriteCondHandle = 
false;
 
  138   if (validWriteCondHandle) 
return StatusCode::SUCCESS;
 
  144     if (readCdo[
i]==
nullptr) {
 
  145       ATH_MSG_FATAL(
"Null pointer to the read conditions object " << readHandle[
i].
key());
 
  146       return StatusCode::FAILURE;
 
  149     writeHandleData[
i].addDependency(readHandle[
i]);
 
  150     writeHandleInfo.addDependency(readHandle[
i]);
 
  151     ATH_MSG_INFO(
"Size of CondAttrListCollection " << readHandle[
i].fullKey() << 
" readCdo->size()= " << readCdo[
i]->
size());
 
  158   if (elements==
nullptr) {
 
  160     return StatusCode::FAILURE;
 
  163     writeHandleData[
i].addDependency(sctDetEle);
 
  165   writeHandleInfo.addDependency(sctDetEle);
 
  168   std::unique_ptr<SCT_CalibDefectData> writeCdoData[
NFEATURES]{
nullptr, 
nullptr};
 
  170     writeCdoData[
i] = std::make_unique<SCT_CalibDefectData>();
 
  172   std::unique_ptr<SCT_AllGoodStripInfo> writeCdoInfo{std::make_unique<SCT_AllGoodStripInfo>()};
 
  176       (*writeCdoInfo)[
w][
s]=
true;
 
  188     for (; itLoop!=itLoop_end; ++itLoop) {
 
  195       IdentifierHash hashId1;
 
  201       p_element = (elements->getDetectorElement(hashId1));
 
  202       bool phiSwap1Present{p_element->swapPhiReadoutDirection()};
 
  211       const std::string &gaindefectb{(anAttrList[
"defectBeginChannel"]).data<std::string>()};
 
  212       const std::string &gaindefecte{(anAttrList[
"defectEndChannel"]).data<std::string>()};
 
  213       const std::string &defectType{(anAttrList[
"defectType"]).data<std::string>()};
 
  214       const std::string &parValue{(anAttrList[
"defectParameter"]).data<std::string>()};
 
  217       std::vector<unsigned int> gaindefectbvec;
 
  218       fillEmptyVectorFromString(gaindefectb, gaindefectbvec);
 
  219       std::vector<unsigned int> gaindefectevec;
 
  220       fillEmptyVectorFromString(gaindefecte, gaindefectevec);
 
  221       std::vector<unsigned int> defectTypevec;
 
  222       fillEmptyVectorFromString(defectType, defectTypevec);
 
  223       std::vector<double> parValuevec;
 
  224       fillEmptyVectorFromString(parValue, parValuevec);
 
  227       long unsigned int gainvec_size{gaindefectbvec.size()};
 
  228       for (
long unsigned int i{0}; 
i<gainvec_size; ++
i) {
 
  231           ATH_MSG_DEBUG(
"Defect type " << defectTypevec[
i] << 
" is not defined! This defect is ignored.");
 
  234           theseDefects.
begDefects.push_back(gaindefectbvec[
i]);
 
  235           theseDefects.
endDefects.push_back(gaindefectevec[
i]);
 
  236           theseDefects.
parValue.push_back(coerceToFloatRange(parValuevec[
i]));
 
  241         for (
unsigned int i{0}; 
i<theseDefects.
begDefects.size(); ++
i) { 
 
  243           bool ignoreDefect{
false};
 
  259           if (not ignoreDefect) {
 
  264                 const unsigned int waferId0{hashId0};
 
  267                 thisWaferIsGoodData0[side0StripNumber] = 
false;
 
  269                 const unsigned int waferId1{hashId1};
 
  272                 thisWaferIsGoodData1[side1StripNumber] = 
false;
 
  285         if (not (writeCdoData[
i]->addModule(moduleId, theseDefects))) {
 
  286           ATH_MSG_ERROR(
"Unable to add module " << moduleId << 
" to NPtGain defect map");
 
  287           return StatusCode::RECOVERABLE;
 
  289           ATH_MSG_DEBUG(
"Defects for module " << moduleId << 
" added to NPG defect map");
 
  293           ATH_MSG_DEBUG(
"No NoiseOccupancy defects for module " << moduleId);
 
  296         if (not (writeCdoData[
i]->addModule(moduleId, theseDefects))) {
 
  297           ATH_MSG_ERROR(
"Unable to add module " << moduleId << 
" to NoiseOccupancy defect map");
 
  298           return StatusCode::RECOVERABLE;
 
  300           ATH_MSG_DEBUG(
"Defects for module " << moduleId << 
" added to NoiseOccupancy defect map");
 
  307   ATH_MSG_DEBUG(
"There are " << writeCdoInfo->size() << 
" elements in " << writeHandleInfo.key());
 
  308   if (writeHandleInfo.record(std::move(writeCdoInfo)).isFailure()) {
 
  309     ATH_MSG_FATAL(
"Could not record SCT_AllGoodStripInfo " << writeHandleInfo.key() 
 
  310                   << 
" with EventRange " << writeHandleInfo.getRange() << 
" into Conditions Store");
 
  311     return StatusCode::FAILURE;
 
  313   ATH_MSG_INFO(
"recorded new CDO " << writeHandleInfo.key() << 
" with range " << writeHandleInfo.getRange() << 
" into Conditions Store");
 
  316     if (writeHandleData[
i].record(std::move(writeCdoData[
i])).isFailure()) {
 
  317       ATH_MSG_FATAL(
"Could not record SCT_CalibDefectData " << writeHandleData[
i].
key()
 
  318                     << 
" with EventRange " << writeHandleData[
i].
getRange() << 
" into Conditions Store");
 
  319       return StatusCode::FAILURE;
 
  321     ATH_MSG_INFO(
"recorded new CDO " << writeHandleData[
i].
key() << 
" with range " << writeHandleData[
i].
getRange() << 
" into Conditions Store");
 
  324   return StatusCode::SUCCESS;
 
  329   return StatusCode::SUCCESS;