//This is freeware and released to public domain or Creative Commons CC0. Use at your own risk. The contributor(s) do not provide any guarantee on anything. //contact zhangx@umd.edu for any comment //History: 0.1 basic function // 0.2 two comlumns (_2THETACPS) UXD format // 0.21 automatic CPS convert // //TODO: XYE format; multiple files conversion using System; using System.IO; using System.Windows.Forms; using System.Text.RegularExpressions; namespace panlyticalCSV2UXD { class MainClass { [STAThread] public static void Main (string[] args) { Console.WriteLine("Panalytical CSV file to UXD file converter, select a CSV file then the data will be converted to a UXD file that is acceptable to NIST Reflpack software. This software does not guarantee anything."); Console.WriteLine ("Version 0.21 contact zhangx@umd.edu for comment."); OpenFileDialog openFileDialog1 = new OpenFileDialog(); string path = ""; if (args.Length > 1) { Console.WriteLine (args [1]); } //openFileDialog1.InitialDirectory = "c:\\" ; openFileDialog1.Title = "Select a Panalytical CSV file to be converted to a UXD file for reflpak"; openFileDialog1.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*" ; openFileDialog1.FilterIndex = 2 ; openFileDialog1.RestoreDirectory = true ; if(openFileDialog1.ShowDialog() == DialogResult.OK) { try { if (openFileDialog1.FileName.Trim() != string.Empty) { path = openFileDialog1.FileName; if (File.Exists(path)) { FileStream fs = File.OpenRead(path); string[] lines = Regex.Split(path, "\\/"); string fileNameShort = lines[lines.Length-1]; using(StreamReader sr = new StreamReader(fs, System.Text.Encoding.ASCII)) { int voltage = 40; int current = 20; int count = 1; double timePerStep = 1.0; double stepSize = 0.01; double start = 0; double finish = 0; double omegaOffset = 0; double x=0, y=0, z=0; double chi = 0; string sampleId=""; while(sr.Peek() >= 0) { string line = sr.ReadLine(); line = line.TrimEnd(','); Match m; if( (m = Regex.Match(line,@"Generator voltage, (\d+)")).Success){ voltage = int.Parse(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Tube current, (\d+)")).Success){ current = int.Parse(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Time per step,(\d+.\d+)")).Success){ timePerStep = double.Parse(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Scan step size,(\d+.\d+)")).Success){ stepSize = double.Parse(m.Groups[1].Value); //Console.WriteLine(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"X,(-*\d+.\d+)")).Success){ x = double.Parse(m.Groups[1].Value); //Console.WriteLine(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Y,(-*\d+.\d+)")).Success){ y = double.Parse(m.Groups[1].Value); //Console.WriteLine(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Z,(-*\d+.\d+)")).Success){ z = double.Parse(m.Groups[1].Value); //Console.WriteLine(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Psi,(-*\d+.\d+)")).Success){ chi = double.Parse(m.Groups[1].Value); //Console.WriteLine(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Omega offset,(-*\d+.\d+)")).Success){ omegaOffset = double.Parse(m.Groups[1].Value); //Console.WriteLine(m.Groups[1].Value); }else if( (m = Regex.Match(line,@"Scan range,(\d+.\d+),(\d+.\d+)")).Success){ start = double.Parse(m.Groups[1].Value); finish = double.Parse(m.Groups[2].Value); }else if( (m = Regex.Match(line,@"Sample identification,")).Success){ if(line.Length > 21) sampleId = line.Substring(22, line.Length-22); //Console.WriteLine("match {0}", sampleId); }else if( (m = Regex.Match(line,@"^(\d+.\d+),(\d+)(.*\d*)")).Success){ //count = int.Parse(m.Groups[1].Value); string outFileName = path.Replace("csv", "uxd"); if(File.Exists(outFileName)) File.Delete(outFileName); StreamWriter sw = new StreamWriter(outFileName); sw.WriteLine("; (content of file {0}", outFileName); sw.WriteLine("_FILEVERSION = 2"); sw.WriteLine("_SAMPLE = {0}", fileNameShort); sw.WriteLine("_+SAMPLE = {0}", sampleId); //!! sw.WriteLine("_SITE = \"UMD\""); sw.WriteLine("_USER = Administrator"); sw.WriteLine("_GONIOMETER_CODE = 21"); sw.WriteLine("; Goniometer : D8 theta/theta, stage : Unknown !!!this is wrong!!!! this is a quick hack by zhangx@umd.edu"); sw.WriteLine("_SAMPLE_CHANGER_CODE = 0"); sw.WriteLine("_ATTACHMENTS_CODE = 0"); sw.WriteLine("_GONIOMETER_RADIUS = 320"); sw.WriteLine("_FIXED_DIVSLIT = 1"); sw.WriteLine("_FIXED_SAMPLESLIT = 1"); sw.WriteLine("_SOLLER_SLITS = 2"); sw.WriteLine("_FIXED_DETSLIT = 0.2"); sw.WriteLine("_MONOCHROMATOR = 0"); sw.WriteLine("; Incident beam monochromator : None"); sw.WriteLine("_SOLLER_SLITS_2 = 2"); sw.WriteLine("_THIN_FILM = N"); sw.WriteLine("_BETA_FILTER = N"); sw.WriteLine("_FIXED_ANTISLIT = 1"); sw.WriteLine("_ANALYZER_CODE = 0"); sw.WriteLine("; Received beam analyzer : None"); sw.WriteLine("_RUNTIME = 362"); //!! sw.WriteLine("_WL_UNIT = "); sw.WriteLine("_WL1 = 1.5406"); sw.WriteLine("_WL2 = 1.54439"); sw.WriteLine("_WL3 = 1.39222"); sw.WriteLine("_WLRATIO = 0.5"); sw.WriteLine("_ANODE = Cu"); sw.WriteLine(""); sw.WriteLine("; Data for range 1"); sw.WriteLine("_DRIVE = COUPLED"); sw.WriteLine("_STEPTIME = 1"); sw.WriteLine("_STEPSIZE = {0}", stepSize); sw.WriteLine("_STEPMODE = S"); sw.WriteLine("_START = {0}", start); sw.WriteLine("_THETA = {0}", start/2); //?? sw.WriteLine("_2THETA = {0}", start); sw.WriteLine("_KHI = {0}", chi); //?? sw.WriteLine("_PHI = -0.455"); //!! sw.WriteLine("_X = {0}", x); sw.WriteLine("_Y = {0}", y); sw.WriteLine("_Z = {0}", z); sw.WriteLine("_DIVERGENCE = 0"); sw.WriteLine("_VARDIVERGENCE = "); sw.WriteLine("_ANTISCATTER = 0"); sw.WriteLine("_VARANTISCATTER = "); sw.WriteLine("_HV = 0"); sw.WriteLine("_GAIN = 0"); sw.WriteLine("_LLD = 0"); sw.WriteLine("_DETECTORSLIT = in"); sw.WriteLine("_AUX1 = 0"); sw.WriteLine("_AUX2 = 0"); sw.WriteLine("_AUX3 = 0"); sw.WriteLine("_TIMESTARTED = 0.65"); sw.WriteLine("_TEMP_RATE = 0"); sw.WriteLine("_TEMP_DELAY = 0"); sw.WriteLine("_KV = {0}", voltage); sw.WriteLine("_MA = {0}", current); sw.WriteLine("_RANGE_WL = 1.5406"); sw.WriteLine("_3DPLANE = 1"); sw.WriteLine("_V4_COUNTERS_MASK = 8"); sw.WriteLine("_V4_DRIVES_MASK = 0"); sw.WriteLine("_V4_ENCODERS_MASK = 0"); sw.WriteLine("_COUNTS = 1"); //sw.WriteLine("; Cnt2_D1"); sw.WriteLine("_2THETACPS"); Double twoTheta = Double.Parse(m.Groups[1].Value); String temp = m.Groups[2].Value+m.Groups[3].Value; Double cps = Double.Parse(temp)/timePerStep; sw.WriteLine("{0,9:0.0000} {1,9:0.0}", twoTheta, cps); Console.WriteLine ("{0,9:0.0000} {1,9:0.0}", twoTheta, cps); while(sr.Peek() >= 0) { line = sr.ReadLine(); line = line.TrimEnd(','); if( (m = Regex.Match(line,@"(^\d+.\d+),(\d+)(.*\d*)$")).Success) { twoTheta = Double.Parse(m.Groups[1].Value); temp = m.Groups[2].Value+ m.Groups[3].Value; cps = Double.Parse(temp)/timePerStep; sw.WriteLine("{0,9:0.0000} {1,9:0.0}", twoTheta, cps); Console.WriteLine ("{0,9:0.0000} {1,9:0.0}", twoTheta, cps); } } sw.Flush(); sw.Close(); } } } } } } catch (Exception ex) { MessageBox.Show("Failed to convert the file. Original error: " + ex.Message); } } } } }