73 g_log.
notice() <<
"Starting DgsConvertToEnergyTransfer\n";
75 const std::string reductionManagerName = this->
getProperty(
"ReductionProperties");
76 std::shared_ptr<PropertyManager> reductionManager;
77 if (PropertyManagerDataService::Instance().doesExist(reductionManagerName))
78 reductionManager = PropertyManagerDataService::Instance().retrieve(reductionManagerName);
80 throw std::runtime_error(
"DgsConvertToEnergyTransfer cannot run without a "
81 "reduction PropertyManager.");
88 std::string monWsName = inputWS->getName() +
"_monitors";
89 bool preserveEvents =
false;
92 const std::string facility = ConfigService::Instance().getFacility().name();
93 g_log.
notice() <<
"Processing for " << facility <<
'\n';
94 double eiGuess = this->
getProperty(
"IncidentEnergyGuess");
98 if (
"SNS" == facility) {
102 throw std::runtime_error(
"Incident energy guess MUST be given!");
105 const bool useEiGuess = reductionManager->getProperty(
"UseIncidentEnergyGuess");
106 const double tZeroGuess = reductionManager->getProperty(
"TimeZeroGuess");
107 std::vector<double> etBinning = reductionManager->getProperty(
"EnergyTransferRange");
110 if (etBinning.empty()) {
111 double emin = -0.5 * eiGuess;
112 double deltaE = 0.01 * eiGuess;
113 double emax = 0.99 * eiGuess;
114 etBinning.emplace_back(emin);
115 etBinning.emplace_back(deltaE);
116 etBinning.emplace_back(emax);
119 double incidentEnergy = 0.0;
120 double monPeak = 0.0;
121 specnum_t eiMon1Spec =
static_cast<specnum_t>(reductionManager->getProperty(
"Monitor1SpecId"));
122 specnum_t eiMon2Spec =
static_cast<specnum_t>(reductionManager->getProperty(
"Monitor2SpecId"));
124 if (
"SNS" == facility) {
126 preserveEvents =
true;
129 incidentEnergy = eiGuess;
134 g_log.
notice() <<
"Trying to determine file name\n";
135 std::string runFileName = inputWS->run().getProperty(
"Filename")->value();
136 if (runFileName.empty())
137 throw std::runtime_error(
"Cannot find run filename, therefore cannot "
138 "find the initial energy");
140 std::string loadAlgName;
141 std::string fileProp;
142 if (runFileName.ends_with(
"_event.nxs") || runFileName.ends_with(
".nxs.h5") || runFileName.ends_with(
".nxs")) {
144 loadAlgName =
"LoadNexusMonitors";
145 fileProp =
"Filename";
150 loadmon->setProperty(fileProp, runFileName);
151 loadmon->setProperty(
"OutputWorkspace", monWsName);
152 loadmon->executeAsChildAlg();
153 Workspace_sptr monWSOutput = loadmon->getProperty(
"OutputWorkspace");
156 monWS = std::dynamic_pointer_cast<MatrixWorkspace>(monWSOutput);
157 if ((monWSOutput) && (!monWS))
161 "implemented in DGSReduction yet");
166 getei->setProperty(
"InputWorkspace", monWS);
167 getei->setProperty(
"Monitor1Spec", eiMon1Spec);
168 getei->setProperty(
"Monitor2Spec", eiMon2Spec);
169 getei->setProperty(
"EnergyEstimate", eiGuess);
170 getei->executeAsChildAlg();
171 incidentEnergy = getei->getProperty(
"IncidentEnergy");
172 tZero = getei->getProperty(
"Tzero");
177 alg->setProperty(
"InputWorkspace", inputWS);
178 alg->setProperty(
"OutputWorkspace", outputWS);
179 alg->setProperty(
"Offset", -tZero);
180 alg->executeAsChildAlg();
181 outputWS = alg->getProperty(
"OutputWorkspace");
185 addLog->setProperty(
"Workspace", outputWS);
186 addLog->setProperty(
"LogName",
"CalculatedT0");
187 addLog->setProperty(
"LogType",
"Number");
188 addLog->setProperty(
"LogText", boost::lexical_cast<std::string>(tZero));
189 addLog->executeAsChildAlg();
194 getei->setProperty(
"InputWorkspace", inputWS);
195 getei->setProperty(
"Monitor1Spec", eiMon1Spec);
196 getei->setProperty(
"Monitor2Spec", eiMon2Spec);
197 getei->setProperty(
"EnergyEstimate", eiGuess);
198 getei->executeAsChildAlg();
200 monPeak = getei->getProperty(
"FirstMonitorPeak");
201 const specnum_t monIndex =
static_cast<specnum_t>(getei->getProperty(
"FirstMonitorIndex"));
203 incidentEnergy = getei->getProperty(
"IncidentEnergy");
206 cbo->setProperty(
"InputWorkspace", inputWS);
207 cbo->setProperty(
"OutputWorkspace", outputWS);
208 cbo->setProperty(
"Offset", -monPeak);
209 cbo->executeAsChildAlg();
210 outputWS = cbo->getProperty(
"OutputWorkspace");
212 const auto &specInfo = inputWS->spectrumInfo();
213 const V3D &monPos = specInfo.position(monIndex);
214 std::string srcName = inputWS->getInstrument()->getSource()->getName();
217 moveInstComp->setProperty(
"Workspace", outputWS);
218 moveInstComp->setProperty(
"ComponentName", srcName);
219 moveInstComp->setProperty(
"X", monPos.
X());
220 moveInstComp->setProperty(
"Y", monPos.
Y());
221 moveInstComp->setProperty(
"Z", monPos.
Z());
222 moveInstComp->setProperty(
"RelativePosition",
false);
223 moveInstComp->executeAsChildAlg();
226 const double binOffset = -monPeak;
228 if (
"ISIS" == facility) {
229 std::string detcalFile;
230 if (reductionManager->existsProperty(
"SampleDetCalFilename"))
231 detcalFile = reductionManager->getPropertyValue(
"SampleDetCalFilename");
234 detcalFile = inputWS->run().getProperty(
"Filename")->value();
235 if (!detcalFile.empty()) {
236 const bool relocateDets = reductionManager->getProperty(
"RelocateDetectors");
238 loaddetinfo->setProperty(
"Workspace", outputWS);
239 loaddetinfo->setProperty(
"DataFilename", detcalFile);
240 loaddetinfo->setProperty(
"RelocateDets", relocateDets);
241 loaddetinfo->executeAsChildAlg();
242 outputWS = loaddetinfo->getProperty(
"Workspace");
244 throw std::runtime_error(
"Cannot find detcal filename in run object or as parameter.");
249 const bool doTibSub = reductionManager->getProperty(
"TimeIndepBackgroundSub");
255 double tibTofStart =
getDblPropOrParam(
"TibTofRangeStart", reductionManager,
"bkgd-range-min", inputWS);
256 tibTofStart += binOffset;
257 double tibTofEnd =
getDblPropOrParam(
"TibTofRangeEnd", reductionManager,
"bkgd-range-max", inputWS);
258 tibTofEnd += binOffset;
259 const double tibTofWidth = tibTofEnd - tibTofStart;
260 std::vector<double> params{tibTofStart, tibTofWidth, tibTofEnd};
262 bool treatTibAsEvents =
false;
265 std::vector<std::string> backgroundType =
266 inputWS->getInstrument()->getStringParameter(
"treat-background-as-events");
267 if (backgroundType.empty()) {
269 treatTibAsEvents =
false;
271 if (
"yes" == backgroundType[0] ||
"true" == backgroundType[0]) {
272 treatTibAsEvents =
true;
276 if (
"SNS" == facility) {
280 if (treatTibAsEvents) {
284 createBkg->setProperty(
"InputWorkspace", outputWS);
285 createBkg->setProperty(
"RangeStart", tibTofStart);
286 createBkg->setProperty(
"RangeEnd", tibTofEnd);
287 createBkg->executeAsChildAlg();
288 bkgWS = createBkg->getProperty(
"OutputWorkspace");
293 std::string origBkgWsName =
"background_origin_ws";
295 rebin->setProperty(
"InputWorkspace", outputWS);
296 rebin->setProperty(
"OutputWorkspace", origBkgWsName);
297 rebin->setProperty(
"Params", params);
298 rebin->setProperty(
"PreserveEvents",
false);
299 rebin->setProperty(
"IgnoreBinErrors",
true);
300 rebin->executeAsChildAlg();
305 cnvun->setProperty(
"InputWorkspace", outputWS);
306 cnvun->setProperty(
"OutputWorkspace", outputWS);
307 cnvun->setProperty(
"Target",
"DeltaE");
308 cnvun->setProperty(
"EMode",
"Direct");
309 cnvun->setProperty(
"EFixed", incidentEnergy);
310 cnvun->executeAsChildAlg();
311 outputWS = cnvun->getProperty(
"OutputWorkspace");
314 rebin->setProperty(
"InputWorkspace", outputWS);
315 rebin->setProperty(
"OutputWorkspace", outputWS);
316 rebin->setProperty(
"Params", etBinning);
317 rebin->setProperty(
"PreserveEvents",
false);
318 rebin->executeAsChildAlg();
319 outputWS = rebin->getProperty(
"OutputWorkspace");
322 cnvun->setProperty(
"InputWorkspace", outputWS);
323 cnvun->setProperty(
"OutputWorkspace", outputWS);
324 cnvun->setProperty(
"Target",
"TOF");
325 cnvun->setProperty(
"EMode",
"Direct");
326 cnvun->setProperty(
"EFixed", incidentEnergy);
327 cnvun->executeAsChildAlg();
328 outputWS = cnvun->getProperty(
"OutputWorkspace");
331 cnvToDist->setProperty(
"Workspace", outputWS);
332 cnvToDist->executeAsChildAlg();
333 outputWS = cnvToDist->getProperty(
"Workspace");
337 flatBg->setProperty(
"InputWorkspace", origBkgWS);
338 flatBg->setProperty(
"StartX", tibTofStart);
339 flatBg->setProperty(
"EndX", tibTofEnd);
340 flatBg->setProperty(
"Mode",
"Mean");
341 flatBg->setProperty(
"OutputMode",
"Return Background");
342 flatBg->executeAsChildAlg();
343 bkgWS = flatBg->getProperty(
"OutputWorkspace");
349 cnvToDist->setProperty(
"Workspace", bkgWS);
350 cnvToDist->executeAsChildAlg();
351 bkgWS = cnvToDist->getProperty(
"Workspace");
356 minus->setProperty(
"LHSWorkspace", outputWS);
357 minus->setProperty(
"RHSWorkspace", bkgWS);
358 minus->setProperty(
"OutputWorkspace", outputWS);
359 minus->executeAsChildAlg();
366 cnvToDist->setProperty(
"Workspace", outputWS);
367 cnvToDist->executeAsChildAlg();
368 outputWS = cnvToDist->getProperty(
"Workspace");
371 flatBg->setProperty(
"InputWorkspace", outputWS);
372 flatBg->setProperty(
"OutputWorkspace", outputWS);
373 flatBg->setProperty(
"StartX", tibTofStart);
374 flatBg->setProperty(
"EndX", tibTofEnd);
375 flatBg->setProperty(
"Mode",
"Mean");
376 flatBg->executeAsChildAlg();
377 outputWS = flatBg->getProperty(
"OutputWorkspace");
380 if (!treatTibAsEvents) {
383 cnvFrDist->setProperty(
"Workspace", outputWS);
384 cnvFrDist->executeAsChildAlg();
385 outputWS = cnvFrDist->getProperty(
"Workspace");
391 norm->setProperty(
"InputWorkspace", outputWS);
392 norm->setProperty(
"OutputWorkspace", outputWS);
393 norm->setProperty(
"InputMonitorWorkspace", monWS);
394 norm->setProperty(
"TofRangeOffset", binOffset);
395 norm->executeAsChildAlg();
396 outputWS = norm->getProperty(
"OutputWorkspace");
399 g_log.
notice() <<
"Converting to energy transfer.\n";
401 cnvun->setProperty(
"InputWorkspace", outputWS);
402 cnvun->setProperty(
"OutputWorkspace", outputWS);
403 cnvun->setProperty(
"Target",
"DeltaE");
404 cnvun->setProperty(
"EMode",
"Direct");
405 cnvun->setProperty(
"EFixed", incidentEnergy);
406 cnvun->executeAsChildAlg();
407 outputWS = cnvun->getProperty(
"OutputWorkspace");
411 rebin->setProperty(
"InputWorkspace", outputWS);
412 rebin->setProperty(
"OutputWorkspace", outputWS);
413 rebin->setProperty(
"Params", etBinning);
414 rebin->setProperty(
"IgnoreBinErrors",
true);
415 rebin->setProperty(
"PreserveEvents", preserveEvents);
416 rebin->executeAsChildAlg();
417 outputWS = rebin->getProperty(
"OutputWorkspace");
420 if (
"SNS" == facility) {
422 cnvun->setProperty(
"InputWorkspace", outputWS);
423 cnvun->setProperty(
"OutputWorkspace", outputWS);
424 cnvun->setProperty(
"Target",
"Wavelength");
425 cnvun->executeAsChildAlg();
426 outputWS = cnvun->getProperty(
"OutputWorkspace");
430 alg2->setProperty(
"InputWorkspace", outputWS);
431 alg2->setProperty(
"OutputWorkspace", outputWS);
432 alg2->executeAsChildAlg();
433 outputWS = alg2->getProperty(
"OutputWorkspace");
436 cnvun->setProperty(
"InputWorkspace", outputWS);
437 cnvun->setProperty(
"OutputWorkspace", outputWS);
438 cnvun->setProperty(
"Target",
"DeltaE");
439 cnvun->executeAsChildAlg();
440 outputWS = cnvun->getProperty(
"OutputWorkspace");
445 alg->setProperty(
"InputWorkspace", outputWS);
446 alg->setProperty(
"OutputWorkspace", outputWS);
447 alg->executeAsChildAlg();
448 outputWS = alg->getProperty(
"OutputWorkspace");
451 const bool correctKiKf = reductionManager->getProperty(
"CorrectKiKf");
455 kikf->setProperty(
"InputWorkspace", outputWS);
456 kikf->setProperty(
"OutputWorkspace", outputWS);
457 kikf->setProperty(
"EMode",
"Direct");
458 kikf->executeAsChildAlg();
459 outputWS = kikf->getProperty(
"OutputWorkspace");
463 const bool sofphieIsDistribution = reductionManager->getProperty(
"SofPhiEIsDistribution");
466 rebin->setProperty(
"InputWorkspace", outputWS);
467 rebin->setProperty(
"OutputWorkspace", outputWS);
468 rebin->setProperty(
"IgnoreBinErrors",
true);
469 if (sofphieIsDistribution)
470 rebin->setProperty(
"PreserveEvents",
false);
471 rebin->executeAsChildAlg();
472 outputWS = rebin->getProperty(
"OutputWorkspace");
474 if (sofphieIsDistribution) {
477 distrib->setProperty(
"Workspace", outputWS);
478 distrib->executeAsChildAlg();
479 outputWS = distrib->getProperty(
"Workspace");
483 crop->setProperty(
"InputWorkspace", outputWS);
484 crop->setProperty(
"OutputWorkspace", outputWS);
485 crop->setProperty(
"XMin", etBinning[0]);
486 crop->setProperty(
"XMax", etBinning[2]);
487 crop->executeAsChildAlg();
488 outputWS = crop->getProperty(
"OutputWorkspace");
495 divide->setProperty(
"LHSWorkspace", outputWS);
496 divide->setProperty(
"RHSWorkspace", detVanWS);
497 divide->setProperty(
"OutputWorkspace", outputWS);
498 divide->executeAsChildAlg();
499 outputWS = divide->getProperty(
"OutputWorkspace");
505 std::string oldGroupFile;
506 std::string filePropMod = this->
getProperty(
"AlternateGroupingTag");
507 std::string fileProp = filePropMod +
"OldGroupingFilename";
508 if (reductionManager->existsProperty(fileProp))
509 oldGroupFile = reductionManager->getPropertyValue(fileProp);
511 remap->setProperty(
"InputWorkspace", outputWS);
512 remap->setProperty(
"OutputWorkspace", outputWS);
513 remap->setProperty(
"MaskWorkspace", maskWS);
514 remap->setProperty(
"GroupingWorkspace", groupWS);
515 remap->setProperty(
"OldGroupingFile", oldGroupFile);
516 remap->executeAsChildAlg();
517 outputWS = remap->getProperty(
"OutputWorkspace");
519 if (
"ISIS" == facility) {
520 double scaleFactor = inputWS->getInstrument()->getNumberParameter(
"scale-factor")[0];
522 scaleAlg->setProperty(
"InputWorkspace", outputWS);
523 scaleAlg->setProperty(
"Factor", scaleFactor);
524 scaleAlg->setProperty(
"Operation",
"Multiply");
525 scaleAlg->setProperty(
"OutputWorkspace", outputWS);
526 scaleAlg->executeAsChildAlg();