80 std::filesystem::path path(filename);
81 std::string basename = path.stem().string();
92 std::string cellType =
getProperty(
"CrystalSystem");
94 auto cellNo = 1 + std::distance(
m_typeList.begin(), iter);
100 int oldSequence = -1;
103 std::ostringstream ss;
106 std::vector<std::pair<std::string, bool>> criteria;
107 if (type.compare(0, 2,
"Ba") == 0)
108 criteria.emplace_back(
"BankName",
true);
109 else if (type.compare(0, 2,
"Ru") == 0)
110 criteria.emplace_back(
"RunNumber",
true);
112 criteria.emplace_back(
"RunNumber",
true);
113 criteria.emplace_back(
"BankName",
true);
115 criteria.emplace_back(
"h",
true);
116 criteria.emplace_back(
"k",
true);
117 criteria.emplace_back(
"l",
true);
120 std::vector<Peak> peaks =
ws->getPeaks();
127 std::string convention = ConfigService::Instance().getString(
"Q.convention");
128 if (convention ==
"Crystallography")
132 auto inst =
ws->getInstrument();
135 type =
"Both Bank and RunNumber";
136 if (!
ws->sample().hasOrientedLattice()) {
138 const std::string fft(
"FindUBUsingIndexedPeaks");
140 findUB->initialize();
142 findUB->executeAsChildAlg();
144 if (!
ws->sample().hasOrientedLattice()) {
145 g_log.
notice(std::string(
"Could not find UB for ") + std::string(
ws->getName()));
146 throw std::invalid_argument(std::string(
"Could not find UB for ") + std::string(
ws->getName()));
149 lattice =
ws->sample().getOrientedLattice();
152 std::vector<int> numPeaks;
154 std::vector<double> maxLamVec;
155 std::vector<double> minLamVec;
156 std::vector<double> sumLamVec;
157 std::vector<double> minDVec;
162 for (
int wi = 0; wi <
ws->getNumberPeaks(); wi++) {
164 const Peak &p = peaks[wi];
167 if (intensity == 0.0 || !(std::isfinite(sigI)))
169 if (minIsigI !=
EMPTY_DBL() && intensity < std::abs(minIsigI * sigI))
176 p.
getCol() > (nCols - widthBorder) || p.
getRow() > (nRows - widthBorder)))
179 bankName.erase(remove_if(bankName.begin(), bankName.end(), std::not_fn(::isdigit)), bankName.end());
180 if (type.compare(0, 2,
"Ba") == 0) {
184 std::vector<std::string> notBanks =
getProperty(
"EliminateBankNumbers");
185 if (std::find(notBanks.begin(), notBanks.end(), bankName) != notBanks.end())
188 if (inst->hasParameter(
"detScale" + bankName)) {
189 double correc =
static_cast<double>(inst->getNumberParameter(
"detScale" + bankName)[0]);
194 if (minIntensity !=
EMPTY_DBL() && intensity < minIntensity)
203 if (sequence != oldSequence) {
204 oldSequence = sequence;
205 numPeaks.emplace_back(
count);
206 maxLamVec.emplace_back(maxLam);
207 minLamVec.emplace_back(minLam);
208 sumLamVec.emplace_back(sumLam);
209 minDVec.emplace_back(minD);
225 numPeaks.emplace_back(
count);
226 maxLamVec.emplace_back(maxLam);
227 minLamVec.emplace_back(minLam);
228 sumLamVec.emplace_back(sumLam);
229 minDVec.emplace_back(minD);
232 for (
int wi = 0; wi <
ws->getNumberPeaks(); wi++) {
234 const Peak &p = peaks[wi];
237 if (intensity == 0.0 || !(std::isfinite(sigI)))
239 if (minIsigI !=
EMPTY_DBL() && intensity < std::abs(minIsigI * sigI))
246 p.
getCol() > (nCols - widthBorder) || p.
getRow() > (nRows - widthBorder)))
249 bankName.erase(remove_if(bankName.begin(), bankName.end(), std::not_fn(::isdigit)), bankName.end());
250 if (type.compare(0, 2,
"Ba") == 0) {
254 std::vector<std::string> notBanks =
getProperty(
"EliminateBankNumbers");
255 if (std::find(notBanks.begin(), notBanks.end(), bankName) != notBanks.end())
258 if (inst->hasParameter(
"detScale" + bankName)) {
259 double correc =
static_cast<double>(inst->getNumberParameter(
"detScale" + bankName)[0]);
264 if (minIntensity !=
EMPTY_DBL() && intensity < minIntensity)
274 if (sequence != oldSequence) {
275 oldSequence = sequence;
277 out <<
"END-OF-REFLECTION-DATA\n";
278 out <<
"HARMONICS DATA 0 REFLECTIONS\n";
279 out <<
"END-OF-FILE\n";
286 ss << std::setw(3) << std::setfill(
'0') << sequenceNo;
289 path = path.parent_path();
290 path /= basename + ss.str();
292 path.replace_extension(
"geasc");
293 out.open(path.string(), std::ios::out);
296 out << basename <<
"\n";
297 out <<
"CRYS " << basename.substr(0, 6) <<
"\n";
298 out <<
"FIDX 1.00000 1.00000 1.00000 1.00000 "
300 out <<
"FIDY 1.00000 1.00000 1.00000 1.00000 "
302 out <<
"OMEG 1.00000 1.00000 1.00000 1.00000 "
304 out <<
"CELL " << std::setw(11) << std::setprecision(4) << 1.0 / lattice.
a() << std::setw(12)
305 << std::setprecision(4) << 1.0 / lattice.
b() << std::setw(12) << std::setprecision(4) << 1.0 / lattice.
c()
306 << std::setw(9) << boost::math::iround(lattice.
alpha()) << std::setw(9)
307 << boost::math::iround(lattice.
beta()) << std::setw(9) << boost::math::iround(lattice.
gamma()) <<
'\n';
309 out <<
"SYST " << cellNo <<
" " << centerNo <<
" 1 3"
313 out <<
"IBOX 1 1 1 1 1"
318 double phi = angles[2];
319 double chi = angles[1];
320 double omega = angles[0];
322 out <<
"PHIS " << std::setw(11) << std::setprecision(4) << phi << std::setw(12) << std::setprecision(4) << chi
323 << std::setw(12) << std::setprecision(4) << omega <<
"\n";
326 out << std::setprecision(1) << std::fixed << sumLamVec[sequenceNo] / numPeaks[sequenceNo] <<
" "
327 << minLamVec[sequenceNo] <<
" " << maxLamVec[sequenceNo] <<
"\n";
330 out << std::setprecision(2) << std::fixed << minDVec[sequenceNo] <<
"\n";
334 out <<
"RADI " << std::setprecision(0) << std::fixed << L2 <<
"\n";
337 out <<
"XC_S 0.00000 0.00000 0.00000 0.00000 "
339 out <<
"YC_S 0.00000 0.00000 0.00000 0.00000 "
341 out <<
"WC_S 0.00000 0.00000 0.00000 0.00000 "
345 out <<
"TWIS 0.00000 0.00000 0.00000 0.00000 "
346 "0.00000 0.00000 \n";
347 out <<
"TILT 0.00000 0.00000 0.00000 0.00000 "
348 "0.00000 0.00000 \n";
349 out <<
"BULG 0.00000 0.00000 0.00000 0.00000 "
350 "0.00000 0.00000 \n";
351 out <<
"CTOF " << L2 <<
"\n";
352 out <<
"YSCA 1.00000 1.00000 1.00000 1.00000 "
354 out <<
"CRAT 1.00000 1.00000 1.00000 1.00000 "
358 out << minIntensity <<
"\n";
363 out << numPeaks[sequenceNo]
366 out <<
" 0 0 0 0 0 0 0 0 "
369 out <<
"LAMH " << numPeaks[sequenceNo]
370 <<
" 0 0 0 0 0 0 0 0 "
372 out <<
" 0 0 0 0 0 0\n";
377 out <<
"NSPT " << numPeaks[sequenceNo] <<
" 0 0 0 0"
379 out <<
"NODH " << numPeaks[sequenceNo] <<
" 0 0 0 0 0 0 0 0 0\n"
383 out <<
"REFLECTION DATA " << numPeaks[sequenceNo] <<
" REFLECTIONS"
397 out << std::setw(10) << std::fixed << std::setprecision(5) << (p.
getCol() - 127.5) * 150.0 / 256.0;
398 out << std::setw(10) << std::fixed << std::setprecision(5) << (p.
getRow() - 127.5) * 150.0 / 256.0 <<
"\n";
400 out << std::setw(10) << std::fixed << std::setprecision(5) <<
lambda;
403 out <<
" 1 0 0 0 0 0 0 0 0.0 0 ";
405 out << std::setw(10) << std::fixed << std::setprecision(5) << dsp * dsp * 0.25 <<
"\n";
408 out << std::setw(10) << std::fixed << std::setprecision(5) << 0.5 * scattering;
413 double ckIntensity = scaleFactor * intensity;
414 if (ckIntensity > 999999999.985)
415 g_log.
warning() <<
"Scaled intensity, " << ckIntensity <<
" is too large for format. Decrease ScalePeaks.\n";
419 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
422 out << std::setw(10) <<
Utils::round(scaleFactor * sigI);
425 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
427 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
428 out << std::setw(10) <<
Utils::round(scaleFactor * sigI);
429 out <<
" -9999 -9999 -9999 -9999 -9999 * ";
436 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
441 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
443 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
445 out <<
" -9999 -9999 -9999 -9999 -9999 * ";
452 out <<
"END-OF-REFLECTION-DATA\n";
453 out <<
"HARMONICS DATA 0 REFLECTIONS\n";
454 out <<
"END-OF-FILE\n";