public static void ChangeWindowsState(int state) { switch (state) { case 1: ActiveForm.Show(); break; case 2: ActiveForm.WindowState = FormWindowState.Normal; break; } }
private void Form1_Load(object sender, EventArgs e) { //Prompt user to select the folder containing the DCM files which need their iso adjusted openfile.ShowDialog(); byte[] filein = File.ReadAllBytes(openfile.FileName); ActiveForm.Show(); textBoxTop.AppendText("Date & Time: " + DateTime.Now); textBox1.AppendText("DICOM Information" + Environment.NewLine + Environment.NewLine); textBox2.AppendText("Comparison Information" + Environment.NewLine + "(User Entered or Lookup)" + Environment.NewLine); textBox3.AppendText("Matched?" + Environment.NewLine + Environment.NewLine); int pathloc = openfile.FileName.LastIndexOf("\\"); string path = openfile.FileName.Remove(pathloc + 1); //textBox1.AppendText("FileName: " + path); byte[] ptnamedcm = { 0x10, 0x00, 0x10, 0x00 }; byte[] ptnumdcm = { 0x10, 0x00, 0x20, 0x00 }; byte[] ctstudyiddcm = { 0x20, 0x00, 0x10, 0x00 }; byte[] studydescdcm = { 0x08, 0x00, 0x30, 0x10 }; byte[] seriesdescdcm = { 0x08, 0x00, 0x3E, 0x10 }; byte[] rtplannamedcm = { 0x0A, 0x30, 0x03, 0x00 }; byte[] rtplandescdcm = { 0x0A, 0x30, 0x04, 0x00 }; byte[] coorddcm = { 0x0A, 0x30, 0x18, 0x00 }; byte[] pntnamedcm = { 0x0A, 0x30, 0x16, 0x00 }; byte[] dwelldcm = { 0x0A, 0x30, 0xD4, 0x02 }; byte[] channeldcm = { 0x0A, 0x30, 0x82, 0x02 }; byte[] frameofreferenceuid = { 0x08, 0x00, 0x55, 0x11 }; byte[] patientpositiondcm = { 0x18, 0x00, 0x00, 0x51 }; byte[] rxdosedcm = { 0x0A, 0x30, 0xA4, 0x00 }; byte[] refdistdcm = { 0x0A, 0x30, 0x84, 0x02 }; byte[] ContourData = { 0x06, 0x30, 0x50, 0x00 }; byte[] sourcestrengthdcm = { 0x0A, 0x30, 0x2A, 0x02 }; int channeltotal = Program.CountOccurences(filein, channeldcm); string ptname = Program.stringTag(ptnamedcm, filein); ptname = ptname.Replace("^^^", " "); ptname = ptname.Replace("^", ", "); string ptnum = Program.stringTag(ptnumdcm, filein); string ctstudyid = Program.stringTag(ctstudyiddcm, filein); string studydesc = Program.stringTag(studydescdcm, filein); string seriesdesc = Program.stringTag(seriesdescdcm, filein); string rtplanname = Program.stringTag(rtplannamedcm, filein); string rtplandesc = Program.stringTag(rtplandescdcm, filein); string rxdose = Program.stringTag(rxdosedcm, filein); string patientposition = ""; string refdiststr1 = Program.stringTag(refdistdcm, filein, 1); string refdiststr2 = Program.stringTag(refdistdcm, filein, 2); string refdiststr3 = Program.stringTag(refdistdcm, filein, 3); double rxdosenum = double.Parse(rxdose); rxdosenum = Math.Round(rxdosenum * 100); double refdist1 = double.Parse(refdiststr1); double refdist2 = double.Parse(refdiststr2); double refdist3 = double.Parse(refdiststr3); string[] refdist = new string[3]; refdist[0] = Math.Round(refdist1).ToString(); refdist[1] = Math.Round(refdist2).ToString(); refdist[2] = Math.Round(refdist3).ToString(); double[,] applicators = Program.ApplicatorPoints(filein); double[,] firstdwells = Program.FirstDwellPosition(filein); string frameofreference = Program.stringTag(frameofreferenceuid, filein, 3); bool CT = File.Exists(path + "CT" + frameofreference + ".dcm"); if (CT) { byte[] CTset = File.ReadAllBytes(path + "CT" + frameofreference + ".dcm"); patientposition = Program.stringTag(patientpositiondcm, CTset); } if (!CT) { patientposition = "To verify patient orientation please export associated image sets with the RTPlan"; } textBox1.AppendText("Patient Name: \t" + ptname + Environment.NewLine); textBox2.AppendText(Environment.NewLine); textBox3.AppendText(Environment.NewLine); string usermrn = Program.Prompt.ShowDialog("Enter the Patient MRN.", "2nd Check Input"); textBox2.AppendText("MRN: " + usermrn + Environment.NewLine + Environment.NewLine); if (usermrn == ptnum) { textBox3.AppendText("Match" + Environment.NewLine + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine + Environment.NewLine); } textBox1.AppendText("MRN: \t \t" + ptnum + Environment.NewLine + Environment.NewLine); string userCTnumb = Program.Prompt.ShowDialog("Enter the CT Exam number.", "2nd Check Input"); double userCTnum = double.Parse(userCTnumb); double ctstudyidnum = double.Parse(ctstudyid); textBox2.AppendText("CT Exam #: " + userCTnum + Environment.NewLine + Environment.NewLine); if (userCTnum == ctstudyidnum) { textBox3.AppendText("Match" + Environment.NewLine + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine + Environment.NewLine); } textBox1.AppendText("CT Exam #: \t" + ctstudyid + Environment.NewLine + Environment.NewLine); textBox1.AppendText("Patient Orientation: \t" + patientposition + Environment.NewLine + Environment.NewLine); textBox1.AppendText("Study Description: \t" + studydesc + Environment.NewLine); textBox1.AppendText("Series Description: \t" + seriesdesc + Environment.NewLine + Environment.NewLine); textBox1.AppendText("RTPlan Name: \t" + rtplanname + Environment.NewLine); textBox1.AppendText("RTPlan Description: " + rtplandesc + Environment.NewLine + Environment.NewLine); for (int i = 0; i < 8; i++) { textBox2.AppendText(Environment.NewLine); textBox3.AppendText(Environment.NewLine); } string userRx = Program.Prompt.ShowDialog("Please enter the prescribed dose per fraction in cGy.", "2nd Check Input"); textBox1.AppendText("Rx Dose: " + rxdosenum.ToString() + Environment.NewLine + Environment.NewLine); textBox2.AppendText("Rx Dose: " + userRx + Environment.NewLine + Environment.NewLine); if (rxdosenum.ToString() == userRx) { textBox3.AppendText("Match" + Environment.NewLine + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine + Environment.NewLine); } int n = applicators.Length; n = n / 6; double[] expectoffset = new double[3]; expectoffset[0] = -6; expectoffset[1] = -6; expectoffset[2] = -5; string expectrefdist = "1300"; for (int i = 0; i < n; i++) { double temp = Math.Sqrt(Math.Pow(firstdwells[i, 0] - applicators[i, 3], 2) + Math.Pow(firstdwells[i, 1] - applicators[i, 4], 2) + Math.Pow(firstdwells[i, 2] - applicators[i, 5], 2)) - Math.Sqrt(Math.Pow(applicators[i, 0] - applicators[i, 3], 2) + Math.Pow(applicators[i, 1] - applicators[i, 4], 2) + Math.Pow(applicators[i, 2] - applicators[i, 5], 2)); int num = i + 1; textBox1.AppendText("Reference Distance for Applicator " + num.ToString() + ": " + refdist[i] + Environment.NewLine); textBox1.AppendText("Offset for Applicator " + num.ToString() + ": " + Math.Round(temp).ToString() + Environment.NewLine); textBox2.AppendText(expectrefdist + "mm" + Environment.NewLine); if (refdist[i] == expectrefdist) { textBox3.AppendText("Match" + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine); } textBox2.AppendText(expectoffset[i] + "mm" + Environment.NewLine); if (Math.Abs(temp - expectoffset[i]) < 0.01) { textBox3.AppendText("Match" + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine); } } textBox1.AppendText(Environment.NewLine); textBox2.AppendText(Environment.NewLine); textBox3.AppendText(Environment.NewLine); string excelpath = "X:\\RadOnc\\Physics\\BRACHYTHERAPY\\HDR\\HDR QA\\Source exchange\\"; excelpath = excelpath + DateTime.Now.Year.ToString(); excelpath = excelpath + "_SourceExchangeQA"; if (!Directory.Exists(excelpath)) { excelpath = "X:\\RadOnc\\Physics\\BRACHYTHERAPY\\HDR\\HDR QA\\Source exchange\\"; excelpath = excelpath + DateTime.Now.AddYears(-1).Year.ToString(); excelpath = excelpath + "_SourceExchangeQA"; } string[,] points = new string[4, 4]; int pnttotal = Program.CountOccurences(filein, coorddcm); int dwelltotal = Program.CountOccurences(filein, dwelldcm); //textBox1.AppendText("count occurence: " + pnttotal + Environment.NewLine + Environment.NewLine); for (int j = 1; j < pnttotal + 1; j++) { string pntname = Program.stringTag(pntnamedcm, filein, j); string coord = Program.stringTag(coorddcm, filein, j); //textBox1.AppendText("test: " + pntname + " " + coord + Environment.NewLine); int foundA = pntname.IndexOf("A"); int founda = pntname.IndexOf("a"); int foundB = pntname.IndexOf("B"); int foundb = pntname.IndexOf("b"); int foundR = pntname.IndexOf("Rt"); int foundr = pntname.IndexOf("rt"); int foundL = pntname.IndexOf("Lt"); int foundl = pntname.IndexOf("lt"); //textBox1.AppendText("A: " + foundA + " B: " + foundB + " r: " + foundr + " l: " + foundl+Environment.NewLine); if (foundA > -1 || founda > -1) { if (foundr > -1 || foundR > -1) { points[1, 0] = pntname; points[1, 1] = coord.Substring(0, coord.IndexOf("\\")); points[1, 2] = coord.Substring(coord.IndexOf("\\") + 1, coord.IndexOf("\\", coord.IndexOf("\\") + 1) - coord.IndexOf("\\") - 1); points[1, 3] = coord.Substring(coord.IndexOf("\\", coord.IndexOf("\\") + 1) + 1, coord.Length - coord.IndexOf("\\", coord.IndexOf("\\") + 1) - 1); } if (foundl > -1 || foundL > -1) { points[0, 0] = pntname; points[0, 1] = coord.Substring(0, coord.IndexOf("\\")); points[0, 2] = coord.Substring(coord.IndexOf("\\") + 1, coord.IndexOf("\\", coord.IndexOf("\\") + 1) - coord.IndexOf("\\") - 1); points[0, 3] = coord.Substring(coord.IndexOf("\\", coord.IndexOf("\\") + 1) + 1, coord.Length - coord.IndexOf("\\", coord.IndexOf("\\") + 1) - 1); } } if (foundB > -1 || foundb > -1) { if (foundr > -1 || foundR > -1) { points[3, 0] = pntname; points[3, 1] = coord.Substring(0, coord.IndexOf("\\")); points[3, 2] = coord.Substring(coord.IndexOf("\\") + 1, coord.IndexOf("\\", coord.IndexOf("\\") + 1) - coord.IndexOf("\\") - 1); points[3, 3] = coord.Substring(coord.IndexOf("\\", coord.IndexOf("\\") + 1) + 1, coord.Length - coord.IndexOf("\\", coord.IndexOf("\\") + 1) - 1); } if (foundl > -1 || foundL > -1) { points[2, 0] = pntname; points[2, 1] = coord.Substring(0, coord.IndexOf("\\")); points[2, 2] = coord.Substring(coord.IndexOf("\\") + 1, coord.IndexOf("\\", coord.IndexOf("\\") + 1) - coord.IndexOf("\\") - 1); points[2, 3] = coord.Substring(coord.IndexOf("\\", coord.IndexOf("\\") + 1) + 1, coord.Length - coord.IndexOf("\\", coord.IndexOf("\\") + 1) - 1); } } } double[,] tandem = Program.TandemArray(filein); int tandemlen = tandem.GetLength(0); double x = 0; double y = 0; double z = 0; for (int i = 0; i < tandemlen; i++) { x = tandem[i, 0] + x; y = tandem[i, 1] + y; z = tandem[i, 2] + z; } x = x / tandemlen; y = y / tandemlen; z = z / tandemlen; for (int i = 0; i < tandemlen; i++) { tandem[i, 0] = tandem[i, 0] - x; tandem[i, 1] = tandem[i, 1] - y; tandem[i, 2] = tandem[i, 2] - z; } Matrix <double> tndm = DenseMatrix.OfArray(tandem); var svd = tndm.Svd(true); // double[,] refframe = MathNet.Numerics.LinearAlgebra.Factorization.Svd(DenseMatrix.OfArray(tandem)) ; //textBox1.AppendText(svd.U.ToString()); //textBox1.AppendText(svd.VT.ToString()); //textBox1.AppendText(svd.W.ToString()); string lastdwellcoord = Program.stringTag(dwelldcm, filein, dwelltotal); double tandemlr = double.Parse(lastdwellcoord.Substring(0, lastdwellcoord.IndexOf("\\"))); double tandemap = double.Parse(lastdwellcoord.Substring(lastdwellcoord.IndexOf("\\") + 1, lastdwellcoord.IndexOf("\\", lastdwellcoord.IndexOf("\\") + 1) - lastdwellcoord.IndexOf("\\") - 1)); double tandemsi = double.Parse(lastdwellcoord.Substring(lastdwellcoord.IndexOf("\\", lastdwellcoord.IndexOf("\\") + 1) + 1, lastdwellcoord.Length - lastdwellcoord.IndexOf("\\", lastdwellcoord.IndexOf("\\") + 1) - 1)); //textBox1.AppendText(Environment.NewLine + tandemlr + Environment.NewLine + tandemap + Environment.NewLine + tandemsi); double Adis = Math.Round(Math.Sqrt(Math.Pow(double.Parse(points[0, 1]) - double.Parse(points[1, 1]), 2) + Math.Pow(double.Parse(points[0, 2]) - double.Parse(points[1, 2]), 2) + Math.Pow(double.Parse(points[0, 3]) - double.Parse(points[1, 3]), 2)), 0); double Bdis = Math.Round(Math.Sqrt(Math.Pow(double.Parse(points[2, 1]) - double.Parse(points[3, 1]), 2) + Math.Pow(double.Parse(points[2, 2]) - double.Parse(points[3, 2]), 2) + Math.Pow(double.Parse(points[2, 3]) - double.Parse(points[3, 3]), 2)), 0); double Al = Math.Round(double.Parse(points[0, 1]) - tandemlr, 0); double Bl = Math.Round(double.Parse(points[2, 1]) - tandemlr, 0); double Ar = Math.Round(double.Parse(points[1, 1]) - tandemlr, 0); double Br = Math.Round(double.Parse(points[3, 1]) - tandemlr, 0); Ar = -Ar; Br = -Br; textBox1.AppendText("Left Point A is " + Al.ToString() + "mm left of the tandem." + Environment.NewLine); textBox1.AppendText("Right Point A is " + Ar.ToString() + "mm right of the tandem." + Environment.NewLine); textBox1.AppendText("Left Point B is " + Bl.ToString() + "mm left of the tandem." + Environment.NewLine); textBox1.AppendText("Right Point B is " + Br.ToString() + "mm right of the tandem." + Environment.NewLine); textBox2.AppendText("20mm" + Environment.NewLine); textBox2.AppendText("20mm" + Environment.NewLine); textBox2.AppendText("50mm" + Environment.NewLine); textBox2.AppendText("50mm" + Environment.NewLine); if (Math.Abs(Al - 20) < 2) { textBox3.AppendText("Match (within 1mm)" + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine); } if (Math.Abs(Ar - 20) < 2) { textBox3.AppendText("Match (within 1mm)" + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine); } if (Math.Abs(Bl - 50) < 4) { textBox3.AppendText("Match (within 3mm)" + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine); } if (Math.Abs(Br - 50) < 4) { textBox3.AppendText("Match (within 3mm)" + Environment.NewLine); } else { textBox3.AppendText("ERROR" + Environment.NewLine); } textBox1.AppendText(Environment.NewLine); textBox2.AppendText(Environment.NewLine); textBox3.AppendText(Environment.NewLine); if (Directory.Exists(excelpath)) { //textBox1.AppendText(Environment.NewLine + excelpath); string[] folders = Directory.GetDirectories(excelpath); if (!Directory.Exists(folders[folders.Length - 1])) { excelpath = "X:\\RadOnc\\Physics\\BRACHYTHERAPY\\HDR\\HDR QA\\Source exchange\\"; excelpath = excelpath + DateTime.Now.AddYears(-1).Year.ToString(); excelpath = excelpath + "_SourceExchangeQA"; folders = Directory.GetDirectories(excelpath); } excelpath = folders[folders.Length - 1] + "\\" + folders[folders.Length - 1].Substring(folders[folders.Length - 1].Length - 8) + ".xlsx"; _Application excel = new _Excel.Application(); Workbook wb = excel.Workbooks.Open(excelpath); Worksheet ws = wb.Worksheets[3]; DateTime sourcetime = ws.Cells[14, 9].Value; double sourcestrength = ws.Cells[14, 3].Value2; if (Math.Abs(sourcestrength - 12) > 3) { textBox2.AppendText("Source Exchange Data could not be found." + Environment.NewLine); } DateTime dtcurrent = DateTime.Now; TimeSpan decaytime = dtcurrent - sourcetime; double currentstrength = sourcestrength * Math.Exp(decaytime.TotalDays * Math.Log(0.5) / 73.83); textBox2.AppendText("Current Source Strength: " + Math.Round(currentstrength, 3).ToString() + "mCi" + Environment.NewLine); string plansourcestrength = Program.stringTag(sourcestrengthdcm, filein); double planstrength = double.Parse(plansourcestrength) * 0.000243; textBox1.AppendText("Plan Source Strength: " + Math.Round(planstrength, 3).ToString() + "mCi"); if (Math.Abs(planstrength - currentstrength) < 0.1 * planstrength) { textBox3.AppendText("Match (within 1% of plan Activity)" + Environment.NewLine); } else { textBox3.AppendText("ERROR (off by >1% of plan Activity)" + Environment.NewLine); } } else { textBox2.AppendText("Source Exchange Data could not be found." + Environment.NewLine); } if (Math.Abs(Math.Abs(Adis) - 40) > 2) { textBox1.AppendText(Environment.NewLine + "CHECK YOUR POINT A DISTANCE FROM THE APPLICATOR. IT SHOULD BE 2cm. THE DISTANCE BETWEEN THE TWO POINT A POINTS IS " + Adis.ToString() + "MM" + Environment.NewLine + Environment.NewLine); } if (Al - Ar < 0 && (patientposition == "HFS" || patientposition == "FFP")) { textBox1.AppendText(Environment.NewLine + "MAKE SURE THAT YOUR POINT A POINTS ARE ON THE CORRECT SIDE OF THE PATIENT AND THAT YOUR LABELS ARE CORRECT."); } if (Ar - Al < 0 && (patientposition == "FFS" || patientposition == "HFP")) { textBox1.AppendText(Environment.NewLine + "MAKE SURE THAT YOUR POINT A POINTS ARE ON THE CORRECT SIDE OF THE PATIENT AND THAT YOUR LABELS ARE CORRECT."); } if (Math.Abs(Math.Abs(Bdis) - 100) > 2) { textBox1.AppendText(Environment.NewLine + "CHECK YOUR POINT B DISTANCE FROM THE APPLICATOR. IT SHOULD BE 5cm. THE DISTANCE BETWEEN THE TWO POINT B POINTS IS " + Bdis.ToString() + "MM" + Environment.NewLine + Environment.NewLine); } if (Bl - Br < 0 && (patientposition == "HFS" || patientposition == "FFP")) { textBox1.AppendText(Environment.NewLine + "MAKE SURE THAT YOUR POINT B POINTS ARE ON THE CORRECT SIDE OF THE PATIENT AND THAT YOUR LABELS ARE CORRECT."); } if (Br - Bl < 0 && (patientposition == "FFS" || patientposition == "HFP")) { textBox1.AppendText(Environment.NewLine + "MAKE SURE THAT YOUR POINT B POINTS ARE ON THE CORRECT SIDE OF THE PATIENT AND THAT YOUR LABELS ARE CORRECT."); } //textBox1.AppendText("A distance: " + Adis.ToString() + Environment.NewLine); //textBox1.AppendText("B distance: " + Bdis.ToString() + Environment.NewLine); }
void IDisposable.Dispose() => ActiveForm.Show();
private void Form1_Load(object sender, EventArgs e) { //Prompt user to select the folder containing the DCM files which need their iso adjusted folderBrowserDialog1.ShowDialog(); ActiveForm.Show(); textBox1.AppendText("Processing files..." + Environment.NewLine); //Loop through all files in folder string direct = folderBrowserDialog1.SelectedPath; //Get list of all dcm files in the folder string[] files = Directory.GetFiles(direct, "*.dcm"); //Several byte arrays which will later be used to find specific DICOM tags byte[] isoheader = { 0x20, 0x00, 0x32, 0x00 }; byte[] tableh = { 0x18, 0x00, 0x30, 0x11 }; byte[] datacentertag = { 0x18, 0x00, 0x13, 0x93 }; byte[] ptorient = { 0x20, 0x00, 0x37, 0x00 }; byte[] stationname = { 0x08, 0x00, 0x10, 0x10 }; byte[] ptname = { 0x10, 0x00, 0x10, 0x00 }; byte[] ptnum = { 0x10, 0x00, 0x20, 0x00 }; byte[] imgtype = { 0x08, 0x00, 0x3E, 0x10 }; byte[] fix = { 0x20, 0x2D, 0x20, 0x49, 0x73, 0x6F, 0x66, 0x69, 0x78, 0x65, 0x64 }; byte[] axial = { 0x41, 0x58, 0x49, 0x41, 0x4C }; byte[] backslsh = { 0x5C }; byte[] endtype = { 0x08, 0x00 }; byte[] end = { 0x20 }; byte[] vrtype = { 0x4C, 0x4F }; string tempname = ""; string tempnum = ""; int filescng = 0; for (int i = 0; i < files.Length; i++) { //read in the file byte[] filein = File.ReadAllBytes(files[i]); //find DICOM tag for machine id int stationloc = Program.ByteSearch(filein, stationname); string comp = System.Text.Encoding.Default.GetString(filein, stationloc + 8, 8); //only continue if the machine id is our Siemens Confidence scanner if (comp == "CT100018") { ////Console.WriteLine("Right machine"); int imgtypeloc = Program.ByteSearch(filein, imgtype); //Check series description to see if "-Isofixed" is in there, if not, proceed int fixd = Program.ByteSearch(filein, fix, imgtypeloc); if (fixd == -1) { ////Console.WriteLine("Not yet corrected"); //Check to see if dcm file is an axial image file, if yes, proceed int isaxial = Program.ByteSearch(filein, axial); if (isaxial > 0) { ////Console.WriteLine("Is Axial"); //get length of the series description tag byte[] typelength = new byte[2]; Array.Copy(filein, imgtypeloc + 6, typelength, 0, 2); short imgtypeint = BitConverter.ToInt16(typelength, 0); //If the variable length is listed as zero, it is because Siemens incorrectly created the series description by omitting the Variable type. This corrects that mistake. if (imgtypeint == 0) { Array.Copy(filein, imgtypeloc + 4, typelength, 0, 2); imgtypeint = BitConverter.ToInt16(typelength, 0); //filein = Program.InsertByte(filein, vrtype, imgtypeloc + 3, imgtypeloc + 6); short newimgtypeint = (short)(imgtypeint + fix.Length); typelength = BitConverter.GetBytes(newimgtypeint); //write in the new length of the series descrition tag with room for "-Isofixed" filein = Program.InsertByte(filein, typelength, imgtypeloc + 3, imgtypeloc + 6); } else { short newimgtypeint = (short)(imgtypeint + fix.Length); typelength = BitConverter.GetBytes(newimgtypeint); //write in the new length of the series descrition tag with room for "-Isofixed" filein = Program.InsertByte(filein, typelength, imgtypeloc + 5, imgtypeloc + 8); } //Find location of Image Position (0020,0032) int isoloc = Program.ByteSearch(filein, isoheader); //Console.WriteLine(isoloc); //Find location of Table Height (0018,1130) int tabloc = Program.ByteSearch(filein, tableh); //Find location of the Tag following the Table Height int tablocend = Program.ByteSearch(filein, end, tabloc + 8); byte[] datacenterbits1 = new byte[8]; byte[] datacenterbits2 = new byte[8]; byte[] datacenterbits3 = new byte[8]; //extract Table Height value from file string tablestr = System.Text.Encoding.Default.GetString(filein, tabloc + 8, tablocend - tabloc - 8); double tablenum = double.Parse(tablestr); // Some dcm files, such as scouts, lack a tag for the Image Position, so only continue if the tag exists if (isoloc > 0) { //Console.WriteLine("has the tag for image position"); //add "-Isofixed" to the series description and create byte array for the updated dcm file byte[] filemid1 = Program.InsertByte(filein, fix, imgtypeloc + imgtypeint + 7, imgtypeloc + imgtypeint + 8); //reacquire the location of Image Position (0020,0032) now that the length of the byte array is greater isoloc = Program.ByteSearch(filemid1, isoheader); //Find location of Data Collection Center Tag int datacenterloc = Program.ByteSearch(filemid1, datacentertag); //extract each of the three float numbers of the Data Collection Center from the byte array and convert to necessary variable type Array.Copy(filemid1, datacenterloc + 8, datacenterbits1, 0, 8); Array.Copy(filemid1, datacenterloc + 16, datacenterbits2, 0, 8); Array.Copy(filemid1, datacenterloc + 24, datacenterbits3, 0, 8); double datacenter1 = BitConverter.ToDouble(datacenterbits1, 0); double datacenter2 = BitConverter.ToDouble(datacenterbits2, 0); double datacenter3 = BitConverter.ToDouble(datacenterbits3, 0); string datacenter1str = datacenter1.ToString(); string datacenter2str = datacenter2.ToString(); string datacenter3str = datacenter3.ToString(); //Find location of each of the three string numbers of the Image Position from the byte array int frstnum = Program.ByteSearch(filemid1, backslsh, isoloc); int lastnum = Program.ByteSearch(filemid1, backslsh, (frstnum + 1)); int endiso = Program.ByteSearch(filemid1, end, (lastnum + 1)); //extract the values of the Image Position and convert to necessary variable type string isostr1 = System.Text.Encoding.Default.GetString(filemid1, isoloc + 8, frstnum - isoloc - 8); string isostr2 = System.Text.Encoding.Default.GetString(filemid1, frstnum + 1, lastnum - frstnum - 1); string isostr3 = System.Text.Encoding.Default.GetString(filemid1, lastnum + 1, endiso - lastnum - 1); double isodub1 = double.Parse(isostr1); double isodub2 = double.Parse(isostr2); double isodub3 = double.Parse(isostr3); //Subtract the Data Collection Center from the Image Position and convert to necessary variable type double newiso1 = isodub1 - datacenter1; double newiso2 = isodub2 - datacenter2; double newiso3 = datacenter3; string newisostr1 = newiso1.ToString(); string newisostr2 = newiso2.ToString(); string newisostr3 = newiso3.ToString(); //Find location of the Patient name & MRN DICOM tags int ptnameloc = Program.ByteSearch(filein, ptname); int ptnumloc = Program.ByteSearch(filein, ptnum); //extract the patient name string name = Encoding.Default.GetString(filein, ptnameloc + 8, ptnumloc - ptnameloc - 8); //If the patient name or table height are different from the previous file in the for-loop then continue if ((tablestr != tempnum || name != tempname)) { if (filescng == 0) { //Write the Patient Name and Table Height to the display window textBox1.AppendText("Patient: "); textBox1.AppendText(name); textBox1.AppendText(Environment.NewLine + "Table Height = " + tablestr + "mm" + Environment.NewLine + Environment.NewLine); //reset the variables for checking if the patient name or table height change between files in the for-loop tempnum = tablestr; tempname = name; } else { textBox1.AppendText("Number of files fixed: " + filescng + Environment.NewLine + Environment.NewLine); filescng = 0; //Write the Patient Name and Table Height to the display window textBox1.AppendText("Patient: "); textBox1.AppendText(name); textBox1.AppendText(Environment.NewLine + "Table Height = " + tablestr + "mm" + Environment.NewLine + Environment.NewLine); //reset the variables for checking if the patient name or table height change between files in the for-loop tempnum = tablestr; tempname = name; } } //convert new Image Position (isocenter) to a byte array char[] newiso1c = newisostr1.ToCharArray(); char[] newiso2c = newisostr2.ToCharArray(); char[] newiso3c = newisostr3.ToCharArray(); byte[] niso1 = System.Text.Encoding.Default.GetBytes(newiso1c); byte[] niso2 = System.Text.Encoding.Default.GetBytes(newiso2c); byte[] niso3 = System.Text.Encoding.Default.GetBytes(newiso3c); //write in the adjusted values for the Image Position byte[] fileout = Program.InsertByte(filemid1, niso2, frstnum, lastnum); fileout = Program.InsertByte(fileout, niso1, isoloc + 7, frstnum); //write the changes into the dcm file File.WriteAllBytes(files[i], fileout); //Console.WriteLine(datacenter1str + " " + datacenter2str + " " + datacenter3str); //Console.WriteLine(isostr1 + " " + isostr2 + " " + isostr3); //Console.WriteLine(newisostr1 + " " + newisostr2 + " " + newisostr3); filescng = filescng + 1; } } } } //continue through loop to the next file } if (filescng > 0) { textBox1.AppendText("Number of files fixed: " + filescng + Environment.NewLine + Environment.NewLine); } //If any dcm files in the folder were adjusted, then announce that the program is completed if (tempnum != "") { textBox1.AppendText("Isofix Completed"); //Console.Read(); } //If no dcm files needed to be adjusted, then announce it if (tempnum == "") { textBox1.AppendText("No dicom files need IsoFix"); } }