/** Parse input TableWorkspace to get a list of detectors IDs of which detector * are already masked * @param masktablews :: TableWorkspace containing masking information * @param maskeddetectorids :: (output) vector of detector IDs that are masked */ void ExtractMaskToTable::parseMaskTable( DataObjects::TableWorkspace_sptr masktablews, std::vector<detid_t> &maskeddetectorids) { // Clear input maskeddetectorids.clear(); // Check format of mask table workspace if (masktablews->columnCount() != 3) { g_log.error("Mask table workspace must have more than 3 columns. First 3 " "must be Xmin, Xmax and Spectrum List."); return; } else { vector<string> colnames = masktablews->getColumnNames(); vector<string> chkcolumans(3); chkcolumans[0] = "XMin"; chkcolumans[1] = "XMax"; chkcolumans[2] = "DetectorIDsList"; for (int i = 0; i < 3; ++i) { if (colnames[i] != chkcolumans[i]) { g_log.error() << "Mask table workspace " << masktablews->name() << "'s " << i << "-th column name is " << colnames[i] << ", while it should be " << chkcolumans[i] << ". MaskWorkspace is invalid" << " and thus not used.\n"; return; } } } // Parse each row size_t numrows = masktablews->rowCount(); double xmin, xmax; string specliststr; for (size_t i = 0; i < numrows; ++i) { TableRow tmprow = masktablews->getRow(i); tmprow >> xmin >> xmax >> specliststr; vector<detid_t> tmpdetidvec; parseStringToVector(specliststr, tmpdetidvec); maskeddetectorids.insert(maskeddetectorids.end(), tmpdetidvec.begin(), tmpdetidvec.end()); } return; }
void MaskBinsFromTable::exec() { MatrixWorkspace_sptr inputWS = getProperty("InputWorkspace"); DataObjects::TableWorkspace_sptr paramWS = getProperty("MaskingInformation"); // 1. Check input table workspace and column order g_log.debug() << "Lines of parameters workspace = " << paramWS->rowCount() << std::endl; bool colname_specx = false; if (!paramWS) { throw std::invalid_argument("Input table workspace is not accepted."); } else { std::vector<std::string> colnames = paramWS->getColumnNames(); // check colum name order if (colnames.size() < 3) { g_log.error() << "Input MaskingInformation table workspace has fewer than 3 columns. " << colnames.size() << " columns indeed" << std::endl; throw std::invalid_argument("MaskingInformation (TableWorkspace) has too few columns."); } if (colnames[0].compare("XMin") == 0) { // 1. Style XMin, XMax, SpectraList. Check rest if (colnames[1].compare("XMax") != 0 || colnames[2].compare("SpectraList") != 0) { g_log.error() << "INput MaskingInformation table workspace has wrong column order. " << std::endl; throw std::invalid_argument("MaskingInformation (TableWorkspace) has too few columns."); } } else if (colnames[0].compare("SpectraList") == 0) { // 2. Style SpectraList, XMin, XMax colname_specx = true; if (colnames[1].compare("XMin") != 0 || colnames[2].compare("XMax") != 0) { g_log.error() << "INput MaskingInformation table workspace has wrong column order. " << std::endl; throw std::invalid_argument("MaskingInformation (TableWorkspace) has too few columns."); } } else { g_log.error() << "INput MaskingInformation table workspace has wrong column order. " << std::endl; throw std::invalid_argument("MaskingInformation (TableWorkspace) has too few columns."); } } // 2. Loop over all rows bool firstloop = true; API::MatrixWorkspace_sptr outputws = this->getProperty("OutputWorkspace"); for (size_t ib = 0; ib < paramWS->rowCount(); ++ib) { API::TableRow therow = paramWS->getRow(ib); double xmin, xmax; std::string speclist; if (colname_specx) { therow >> speclist >> xmin >> xmax; } else { therow >> xmin >> xmax >> speclist; } g_log.debug() << "Row " << ib << " XMin = " << xmin << " XMax = " << xmax << " SpectraList = " << speclist << std::endl; API::IAlgorithm_sptr maskbins = this->createChildAlgorithm("MaskBins", 0, 0.3, true); maskbins->initialize(); if (firstloop) { maskbins->setProperty("InputWorkspace", inputWS); firstloop = false; } else { maskbins->setProperty("InputWorkspace", outputws); } maskbins->setProperty("OutputWorkspace", outputws); maskbins->setPropertyValue("SpectraList", speclist); maskbins->setProperty("XMin", xmin); maskbins->setProperty("XMax", xmax); bool isexec = maskbins->execute(); if (!isexec) { g_log.error() << "MaskBins() is not executed for row " << ib << std::endl; throw std::runtime_error("MaskBins() is not executed"); } outputws = maskbins->getProperty("OutputWorkspace"); if (!outputws) { g_log.error() << "OutputWorkspace is not retrieved for row " << ib << ". " << std::endl; throw std::runtime_error("OutputWorkspace is not got from MaskBins"); } }