79 std::filesystem::path path(filename);
80 std::string basename = path.stem().string();
91 std::string cellType =
getProperty(
"CrystalSystem");
93 auto cellNo = 1 + std::distance(
m_typeList.begin(), iter);
102 std::ostringstream ss;
105 std::vector<std::pair<std::string, bool>> criteria;
106 if (type.compare(0, 2,
"Ba") == 0)
107 criteria.emplace_back(
"BankName",
true);
108 else if (type.compare(0, 2,
"Ru") == 0)
109 criteria.emplace_back(
"RunNumber",
true);
111 criteria.emplace_back(
"RunNumber",
true);
112 criteria.emplace_back(
"BankName",
true);
114 criteria.emplace_back(
"h",
true);
115 criteria.emplace_back(
"k",
true);
116 criteria.emplace_back(
"l",
true);
119 std::vector<Peak> peaks =
ws->getPeaks();
126 std::string convention = ConfigService::Instance().getString(
"Q.convention");
127 if (convention ==
"Crystallography")
131 auto inst =
ws->getInstrument();
134 type =
"Both Bank and RunNumber";
135 if (!
ws->sample().hasOrientedLattice()) {
137 const std::string fft(
"FindUBUsingIndexedPeaks");
139 findUB->initialize();
141 findUB->executeAsChildAlg();
143 if (!
ws->sample().hasOrientedLattice()) {
144 g_log.
notice(std::string(
"Could not find UB for ") + std::string(
ws->getName()));
145 throw std::invalid_argument(std::string(
"Could not find UB for ") + std::string(
ws->getName()));
148 lattice =
ws->sample().getOrientedLattice();
151 std::vector<int> numPeaks;
153 std::vector<double> maxLamVec;
154 std::vector<double> minLamVec;
155 std::vector<double> sumLamVec;
156 std::vector<double> minDVec;
161 for (
int wi = 0; wi <
ws->getNumberPeaks(); wi++) {
163 const Peak &p = peaks[wi];
166 if (intensity == 0.0 || !(std::isfinite(sigI)))
168 if (minIsigI !=
EMPTY_DBL() && intensity < std::abs(minIsigI * sigI))
175 p.
getCol() > (nCols - widthBorder) || p.
getRow() > (nRows - widthBorder)))
178 bankName.erase(remove_if(bankName.begin(), bankName.end(), std::not_fn(::isdigit)), bankName.end());
179 if (type.compare(0, 2,
"Ba") == 0) {
183 std::vector<std::string> notBanks =
getProperty(
"EliminateBankNumbers");
184 if (std::find(notBanks.begin(), notBanks.end(), bankName) != notBanks.end())
187 if (inst->hasParameter(
"detScale" + bankName)) {
188 double correc =
static_cast<double>(inst->getNumberParameter(
"detScale" + bankName)[0]);
193 if (minIntensity !=
EMPTY_DBL() && intensity < minIntensity)
202 if (sequence != oldSequence) {
203 oldSequence = sequence;
204 numPeaks.emplace_back(
count);
205 maxLamVec.emplace_back(maxLam);
206 minLamVec.emplace_back(minLam);
207 sumLamVec.emplace_back(sumLam);
208 minDVec.emplace_back(minD);
224 numPeaks.emplace_back(
count);
225 maxLamVec.emplace_back(maxLam);
226 minLamVec.emplace_back(minLam);
227 sumLamVec.emplace_back(sumLam);
228 minDVec.emplace_back(minD);
231 for (
int wi = 0; wi <
ws->getNumberPeaks(); wi++) {
233 const Peak &p = peaks[wi];
236 if (intensity == 0.0 || !(std::isfinite(sigI)))
238 if (minIsigI !=
EMPTY_DBL() && intensity < std::abs(minIsigI * sigI))
245 p.
getCol() > (nCols - widthBorder) || p.
getRow() > (nRows - widthBorder)))
248 bankName.erase(remove_if(bankName.begin(), bankName.end(), std::not_fn(::isdigit)), bankName.end());
249 if (type.compare(0, 2,
"Ba") == 0) {
253 std::vector<std::string> notBanks =
getProperty(
"EliminateBankNumbers");
254 if (std::find(notBanks.begin(), notBanks.end(), bankName) != notBanks.end())
257 if (inst->hasParameter(
"detScale" + bankName)) {
258 double correc =
static_cast<double>(inst->getNumberParameter(
"detScale" + bankName)[0]);
263 if (minIntensity !=
EMPTY_DBL() && intensity < minIntensity)
273 if (sequence != oldSequence) {
274 oldSequence = sequence;
276 out <<
"END-OF-REFLECTION-DATA\n";
277 out <<
"HARMONICS DATA 0 REFLECTIONS\n";
278 out <<
"END-OF-FILE\n";
285 ss << std::setw(3) << std::setfill(
'0') << sequenceNo;
288 path = path.parent_path();
289 path /= basename + ss.str();
291 path.replace_extension(
"geasc");
292 out.open(path.string(), std::ios::out);
295 out << basename <<
"\n";
296 out <<
"CRYS " << basename.substr(0, 6) <<
"\n";
297 out <<
"FIDX 1.00000 1.00000 1.00000 1.00000 "
299 out <<
"FIDY 1.00000 1.00000 1.00000 1.00000 "
301 out <<
"OMEG 1.00000 1.00000 1.00000 1.00000 "
303 out <<
"CELL " << std::setw(11) << std::setprecision(4) << 1.0 / lattice.
a() << std::setw(12)
304 << std::setprecision(4) << 1.0 / lattice.
b() << std::setw(12) << std::setprecision(4) << 1.0 / lattice.
c()
305 << std::setw(9) << boost::math::iround(lattice.
alpha()) << std::setw(9)
306 << boost::math::iround(lattice.
beta()) << std::setw(9) << boost::math::iround(lattice.
gamma()) <<
'\n';
308 out <<
"SYST " << cellNo <<
" " << centerNo <<
" 1 3"
312 out <<
"IBOX 1 1 1 1 1"
317 double phi = angles[2];
318 double chi = angles[1];
319 double omega = angles[0];
321 out <<
"PHIS " << std::setw(11) << std::setprecision(4) << phi << std::setw(12) << std::setprecision(4) << chi
322 << std::setw(12) << std::setprecision(4) << omega <<
"\n";
325 out << std::setprecision(1) << std::fixed << sumLamVec[sequenceNo] / numPeaks[sequenceNo] <<
" "
326 << minLamVec[sequenceNo] <<
" " << maxLamVec[sequenceNo] <<
"\n";
329 out << std::setprecision(2) << std::fixed << minDVec[sequenceNo] <<
"\n";
333 out <<
"RADI " << std::setprecision(0) << std::fixed << L2 <<
"\n";
336 out <<
"XC_S 0.00000 0.00000 0.00000 0.00000 "
338 out <<
"YC_S 0.00000 0.00000 0.00000 0.00000 "
340 out <<
"WC_S 0.00000 0.00000 0.00000 0.00000 "
344 out <<
"TWIS 0.00000 0.00000 0.00000 0.00000 "
345 "0.00000 0.00000 \n";
346 out <<
"TILT 0.00000 0.00000 0.00000 0.00000 "
347 "0.00000 0.00000 \n";
348 out <<
"BULG 0.00000 0.00000 0.00000 0.00000 "
349 "0.00000 0.00000 \n";
350 out <<
"CTOF " << L2 <<
"\n";
351 out <<
"YSCA 1.00000 1.00000 1.00000 1.00000 "
353 out <<
"CRAT 1.00000 1.00000 1.00000 1.00000 "
357 out << minIntensity <<
"\n";
362 out << numPeaks[sequenceNo]
365 out <<
" 0 0 0 0 0 0 0 0 "
368 out <<
"LAMH " << numPeaks[sequenceNo]
369 <<
" 0 0 0 0 0 0 0 0 "
371 out <<
" 0 0 0 0 0 0\n";
376 out <<
"NSPT " << numPeaks[sequenceNo] <<
" 0 0 0 0"
378 out <<
"NODH " << numPeaks[sequenceNo] <<
" 0 0 0 0 0 0 0 0 0\n"
382 out <<
"REFLECTION DATA " << numPeaks[sequenceNo] <<
" REFLECTIONS"
396 out << std::setw(10) << std::fixed << std::setprecision(5) << (p.
getCol() - 127.5) * 150.0 / 256.0;
397 out << std::setw(10) << std::fixed << std::setprecision(5) << (p.
getRow() - 127.5) * 150.0 / 256.0 <<
"\n";
399 out << std::setw(10) << std::fixed << std::setprecision(5) <<
lambda;
402 out <<
" 1 0 0 0 0 0 0 0 0.0 0 ";
404 out << std::setw(10) << std::fixed << std::setprecision(5) << dsp * dsp * 0.25 <<
"\n";
407 out << std::setw(10) << std::fixed << std::setprecision(5) << 0.5 * scattering;
412 double ckIntensity = scaleFactor * intensity;
413 if (ckIntensity > 999999999.985)
414 g_log.
warning() <<
"Scaled intensity, " << ckIntensity <<
" is too large for format. Decrease ScalePeaks.\n";
418 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
421 out << std::setw(10) <<
Utils::round(scaleFactor * sigI);
424 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
426 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
427 out << std::setw(10) <<
Utils::round(scaleFactor * sigI);
428 out <<
" -9999 -9999 -9999 -9999 -9999 * ";
435 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
440 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
442 out <<
" -9999 -9999 -9999 -9999 -9999 \n";
444 out <<
" -9999 -9999 -9999 -9999 -9999 * ";
451 out <<
"END-OF-REFLECTION-DATA\n";
452 out <<
"HARMONICS DATA 0 REFLECTIONS\n";
453 out <<
"END-OF-FILE\n";