From 442983eed2b0b52fa3076a95617a034d2e8c4123 Mon Sep 17 00:00:00 2001 From: Wenduo Zhou <zhouw@ornl.gov> Date: Fri, 11 Nov 2011 15:49:20 -0500 Subject: [PATCH] Add python algorithm ConjoinGSASFiles(). Refs #4113. --- .../PythonAlgorithms/ConjoinGSASFiles.py | 214 ++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 Code/Mantid/Framework/PythonAPI/PythonAlgorithms/ConjoinGSASFiles.py diff --git a/Code/Mantid/Framework/PythonAPI/PythonAlgorithms/ConjoinGSASFiles.py b/Code/Mantid/Framework/PythonAPI/PythonAlgorithms/ConjoinGSASFiles.py new file mode 100644 index 00000000000..b631dc4e77f --- /dev/null +++ b/Code/Mantid/Framework/PythonAPI/PythonAlgorithms/ConjoinGSASFiles.py @@ -0,0 +1,214 @@ +"""*WIKI* +Conjoin several GSAS files to one single GSAS file. +The Bank will be re-defined + + +*WIKI*""" + +from MantidFramework import * +from mantidsimple import * +import os + +class ConjoinGSASFiles(PythonAlgorithm): + def category(self): + """ + """ + return "DataHandling" + + def name(self): + """ + """ + return "ConjoinGSASFiles" + + def _loadGSASFile(self, filename): + """ Load GSAS file + """ + gsasfiledict = {} + + # 1. read file + gfile = open(filename, "r") + lines = gfile.readlines() + gfile.close() + + # 2. put to different section + stage = "start" + gsasfiledict["start"] = [] + gsasfiledict["detinfo"] = [] + gsasfiledict["data"] = [] + for line in lines: + if line.strip() == "": + continue + + # a) Change of status + if line.startswith("# Total flight path"): + # Start detector information line + stage = "detinfo" + infolines = [] + gsasfiledict["detinfo"].append(infolines) + # ENDIF + + if stage == "start": + # Append start lines + gsasfiledict["start"].append(line.strip()) + + elif stage == "detinfo": + # Append information line + infolines.append(line) + + if line.startswith("BANK"): + stage = "data" + datalines = [] + gsasfiledict["data"].append(datalines) + + elif stage == "data": + # Data lines + datalines.append(line) + + else: + raise NotImplementedError("") + # ENDFOR + + return gsasfiledict + + + def __load(self, directory, instr, run, loader, exts): + """ Load GSAS file by run number and etc information + + Arguments: + - directory + - instr : Short name for instrument + - run : Run number + - exts : List of extensions + """ + for ext in exts: + # 1. Construct file name + filename = "%s_%s%s" % (instr, str(run), ext) + if len(directory) > 0: + filename = os.path.join(directory, filename) + + if not os.path.exists(filename): + self.log().information("File %s does not exist" % (filename)) + continue + else: + self.log().information("Load File %s" % (filename)) + # END-IF + + # 2. Load file + wksp = "%s_%s" % (instr, str(run)) + try: + self.log().information("Trying to load '%s' to Workspace" % filename) + loader(filename, wksp) + except Exception, e: + self.log().error("Failed to load run %s" % str(run)) + + # 3. Load file to string + gsasfiledict = self._loadGSASFile(filename) + # ENDFOR + + return wksp, gsasfiledict + + + def _writeConjoinedGSASFile(self, filedicts, directory, filename): + """ Write all banks to a conjoined file + """ + if not filename.endswith(".gsa"): + filename += ".gsa" + if len(directory) > 0: + filename = os.path.join(directory, filename) + self.log().information("Output File = %s" % (filename)) + + if len(filedicts) == 0: + raise NotImplementedError("Not GSAS file imported") + + outbuffer = "" + + # 1. Header + for line in filedicts[0]["start"]: + outbuffer += line + "\n" + + # 2. Body + bankid = 1 + for filedict in filedicts: + for bid in xrange(len(filedict["detinfo"])): + for line in filedict["detinfo"][bid]: + if line.strip().startswith("BANK"): + # Rename BANK ID + terms = line.split() + terms[1] = str(bankid) + bankid += 1 + line = "" + for term in terms: + line += "%s " % (term) + line += "\n" + # ENDIF + outbuffer += line + for line in filedict["data"][bid]: + outbuffer += line + + # 3. Write + ofile = open(filename, "w") + ofile.write(outbuffer) + ofile.close() + + return + + + def PyInit(self): + """ Declare properties + """ + self.declareListProperty("RunNumbers",[0], Validator=ArrayBoundedValidator(Lower=0)) + self.declareFileProperty("OutputFile","", FileAction.Save, ['.gsa'], + Description="The file conjoining all input GSAS files") + self.declareFileProperty("Directory", "", FileAction.OptionalDirectory) + + return + + # def TestExec(self): + # """ Main exec + # """ + # # generic stuff for running + # # wksp = self.getPropertyValue("OutputWorkspace") + # runs = [4866, 4871] + # instr = mtd.getSettings().facility().instrument().shortName() + # outputfilename = "glued" + # directory = "/home/wzz/Projects/Mantid-Project/Tests/Instrument" + + # # change here if you want something other than gsas files + # exts = ['.gsa'] + # loader = LoadGSS + + # # load things and conjoin them + # filedicts = [] + # for run in runs: + # run = str(run) + # wksp, gsasfiledict = self.__load(directory, instr, run, loader, exts) + # filedicts.append(gsasfiledict) + + # self._writeConjoinedGSASFile(filedicts, directory, outputfilename) + + def PyExec(self): + """ Main exec + """ + # generic stuff for running + # wksp = self.getPropertyValue("OutputWorkspace") + runs = self.getProperty("RunNumbers") + instr = mtd.getSettings().facility().instrument().shortName() + outputfilename = self.getPropertyValue("OutputFile") + directory = self.getPropertyValue("Directory").strip() + + # change here if you want something other than gsas files + exts = ['.gsa'] + loader = LoadGSS + + # load things and conjoin them + filedicts = [] + for run in runs: + run = str(run) + wksp, gsasfiledict = self.__load(directory, instr, run, loader, exts) + filedicts.append(gsasfiledict) + + self._writeConjoinedGSASFile(filedicts, directory, outputfilename) + + return + +mtd.registerPyAlgorithm(ConjoinGSASFiles()) -- GitLab