C# Script won't write value to XML

28 views Asked by At

I'm using this C# script:

using System;
using System.Linq;
using System.IO;
using HRB.Cellario.Scripting.API;
using System.Xml;
using System.Xml.Linq;

namespace Customer.Scripting
{
    public class ActiveQC_Calibrate : AbstractScript
    {          
        public override void Execute(IScriptingApi api)
        {                      
            if (api.IsExecutingInAnalysis)
            {
                return;
            }
            
            /// Capture File Paths
            string plateWeighResultFilePath = "C:\\temp\\PlateWeigh.csv";
            string protocolResultFilePath = "C:\\HTP Data Files\\Certus QC\\";
            string worklistFilePath = "Z:\\Preddator Input Files\\worklist.csv";
            string calibrationFilePath = "C:\\ProgramData\\Gyger\\CERTUS CONTROL\\etc\\flex\\head-supply-configurations.xml";
            
            /// Create Unique File Name
            string protocolName =  api.CurrentPlate.CurrentProtocol.ProtocolName.Replace(" ", "_").Trim() + "_";
            string fileExt = ".csv";
            string newResultFilePath = protocolResultFilePath + protocolName + DateTime.Now.ToString("yyyy-MM-dd") + fileExt; 
            
            /// Record Concentration
            string firstLineConc = File.ReadLines(worklistFilePath).First();
            string[] valuesConc = firstLineConc.Split(',');
            string concentration = valuesConc[0].Trim();
            
            string valve = "";
            double density = 0.0;
            
            if (concentration == "DMSO100")
            {
                valve = "1";
                density = 1.10;
            }
            
            if (concentration == "DMSO90")
            {
                valve = "2";
                density = 1.09;
            }
            
            if (concentration == "DMSO80")
            {
                valve = "3";
                density = 1.08;
            }
            
            /// Record Target Dispense Volumes
            double sum = 0.0;
            
            foreach (string line in File.ReadLines(worklistFilePath))
            {
                string[] valuesVol = line.Split(',');
                double volumes;
                
                if (double.TryParse(valuesVol[2], out volumes))
                {
                    sum += volumes;
                }
                
                else
                {
                    Console.WriteLine("Error parsing volumes");
                }
            }
            
            /// Capture Dispense Weight
            string[] allData = File.Exists(plateWeighResultFilePath) ? File.ReadAllLines(plateWeighResultFilePath) : new string[0];
            string lastLine = allData.Length > 0 ? allData[allData.Length - 1] : "";
            string dispenseWeight = lastLine.Split(',')[2].Trim();
            
            string tareWeight = api.Data.PerPlateData["m1"].ToString();
            api.Data.PerPlateData["m2"] = dispenseWeight;
            
            /// Calculate Dispense Volume
            double volume = Convert.ToDouble(dispenseWeight) / density; /// uL = g / g/uL
            double deviation = Math.Abs(volume - sum);
            
            /// Calculate Calibration Factor
            double calibration = sum / volume;
            
            api.Messaging.WriteDiagnostic(ScriptLogLevel.Normal, "Tare: " + tareWeight + ", Weight: " + dispenseWeight + ", Dispensed Volume: " + volume + ", Target Volume: " + sum + ", Calibration: " + calibration);
            
            /// Write Factor to File            
            XDocument xmlDoc = XDocument.Load(calibrationFilePath);
            
            string kitId = "";
            switch (concentration)
            {
                case "DMSO100":
                    kitId = "A";
                    break;
                case "DMSO90":
                    kitId = "B";
                    break;
                case "DMSO80":
                    kitId = "C";
                    break;
                default:
                    break;
            }

            XElement activeHeadSupply = xmlDoc.Root.Element("active-head-supply");

            api.Messaging.WriteDiagnostic(ScriptLogLevel.Normal, "Concentration: " + concentration + ", Kit ID: " + kitId + ", Valve: " + valve);

            XElement connectionNode = activeHeadSupply
                .Descendants("head-supply-configuration")
                .Where(e => e.Element("fluid-supply-configuration")
                .Attribute("kit-id").Value == kitId)
                .Descendants("connection")
                .FirstOrDefault(c => c.Attribute("channel-id").Value == valve);

            if (connectionNode != null)
            {
                XAttribute factorAttribute = connectionNode.Attribute("factor");
                
                if (factorAttribute != null)
                {
                    factorAttribute.Value = calibration.ToString();
                }
            }

            /// Append Changes
            xmlDoc.Save(calibrationFilePath);
            
            /// Write to Log
            if (!File.Exists(newResultFilePath))
            {
                File.Create(newResultFilePath).Close();
                    
                using (StreamWriter writer = new StreamWriter(newResultFilePath, true))
                {
                    writer.WriteLine("Date,Time,Barcode,Valve,Concentration,TareWeight(g),DispenseWeight(g),TargetVolume(uL),WellVolume(uL),Deviation(uL),CalibrationFactor");
                }   
                
                string date = DateTime.Now.ToString("yyyy-MM-dd");
                string time = DateTime.Now.ToString("HH:mm:ss");
                string barcode = Convert.ToString(api.CurrentPlate.Barcode).Trim();
                
                /// Write to Log
                using (StreamWriter writer = new StreamWriter(newResultFilePath, true))
                {
                    writer.WriteLine(date + "," + time + "," + barcode + "," + valve + "," + concentration + "," + tareWeight + "," + dispenseWeight + "," + sum + "," + volume + "," + deviation + "," + calibration);
                }
            }
        }
    }
}

Attempting to write to this XML (C:\ProgramData\Gyger\CERTUS CONTROL\etc\flex\head-supply-configurations.xml):

<?xml version="1.0" encoding="UTF-8"?>

-<head-supply-configurations>

<!-- -->


<!-- -->


<!-- ===================== -->


<!-- ACTIVE -->



-<active-head-supply>


-<head-supply-configuration name="!active!" id="7b248262-5c1d-43a6-981b-97e2f2631d63">


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="fb003d4b-63a9-4dd7-83e3-e8e01b0f71c3" kit-id="A">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="cd7e10eb-a9e9-4f2a-b64f-916dbd812fae" kit-id="B">


-<connections>

<connection calibration-id="a53b4630-ace3-4fdd-a41b-98995162e92e" factor="1" channel-id="1" supply-id="1"/>

<connection calibration-id="2fe4f04f-462f-49f4-85ca-14f281486e2d" factor="1.06" channel-id="2" supply-id="2"/>

<connection calibration-id="afcd8c36-4ce3-49a7-8385-a1031afedd51" factor="1.07" channel-id="3" supply-id="3"/>

<connection calibration-id="2f3241ba-3094-43fb-9f7f-175051899326" factor="1.02" channel-id="4" supply-id="4"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="5cc04f68-5873-4dc9-aca3-e98f2d8fba27" kit-id="C">

<connections/>

</fluid-supply-configuration>


-<maintenance-set>

<maintenance-params channel-id="1" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="2" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="3" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="4" purge-volume="50ul" prime-volume="20ul"/>

</maintenance-set>

</head-supply-configuration>

</active-head-supply>

<!-- -->


<!-- -->


<!-- ===================== -->


<!-- TEMPLATES -->



-<head-supply-configuration name="Flex 8, Fluid1-Fluid8" id="cec0cec0-00f8-f1f8-abcd-c7426cabb4e4">


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="916c8569-8080-448d-aa4f-fd9c990b74b1" kit-id="A">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="1" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="4eb23d61-0f69-4066-8fea-58a959d70b6c" kit-id="B">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="2" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="a551d59c-8394-4142-995e-d255966ae171" kit-id="C">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="3" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="725083a2-024d-49e9-890b-4d574878628e" kit-id="D">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="4" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="7070c89b-5cb4-41b6-947e-68a0d06464a9" kit-id="E">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="5" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="b126c2ae-5c46-4c2d-90e6-6fff5b5066d5" kit-id="F">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="6" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="02272426-cb11-4afb-b742-db0bc47c584b" kit-id="G">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="7" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="8a95117e-ab40-4734-8502-f7a75ba7caae" pressure="0.3bar" fluid-id="d88bf537-a3c3-4dff-b23a-f93136043487" kit-id="H">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="8" supply-id="1"/>

</connections>

</fluid-supply-configuration>

</head-supply-configuration>

<!-- -->



-<head-supply-configuration name="NickHinchliffeConfig3" id="338b676b-4066-48d8-9b78-d70aa9a27666">


-<fluid-supply-configuration fluid-supply-id="5882c098-73f5-422e-8774-28f282b7f0de" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="A">


-<connections>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="1" supply-id="1"/>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="2" supply-id="2"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="3506e372-222d-4613-850c-4ba8373d05b6" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="B">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="3" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="3506e372-222d-4613-850c-4ba8373d05b6" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="C">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="4" supply-id="1"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="91810655-3a54-42b8-a5cd-21a136f95098" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="D">


-<connections>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="5" supply-id="1"/>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="6" supply-id="2"/>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="7" supply-id="3"/>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="8" supply-id="4"/>

</connections>

</fluid-supply-configuration>

</head-supply-configuration>

<!-- -->



-<head-supply-configuration name="Config_test" id="e6f3da5d-fdb0-4320-8a52-ad9556eb788a">


-<fluid-supply-configuration fluid-supply-id="5882c098-73f5-422e-8774-28f282b7f0de" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="A">


-<connections>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="1" supply-id="1"/>

<connection calibration-id="00ef98db-5dc8-4c88-8f4b-a185dff6e5b5" factor="1" channel-id="2" supply-id="2"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="3506e372-222d-4613-850c-4ba8373d05b6" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="B">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="3506e372-222d-4613-850c-4ba8373d05b6" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="C">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="91810655-3a54-42b8-a5cd-21a136f95098" pressure="0.3bar" fluid-id="d38f1374-0c6e-4746-aa5c-25c58f001f88" kit-id="D">


-<connections>

<connection calibration-id="7bb4e2fe-61a0-4aa1-994a-5504469f78de" factor="1" channel-id="4" supply-id="1"/>

<connection factor="1" channel-id="3" supply-id="2"/>

</connections>

</fluid-supply-configuration>

</head-supply-configuration>

<!-- -->



-<head-supply-configuration name="DMSO100" id="56df4631-46b7-4732-8afa-2fefc8c0bf8e">


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="fb003d4b-63a9-4dd7-83e3-e8e01b0f71c3" kit-id="A">


-<connections>

<connection calibration-id="ace12e4a-ea17-4186-ac40-f993e866af37" factor="1.06" channel-id="1" supply-id="1"/>

<connection calibration-id="3f08c6f2-3f2f-47bc-bff9-3b76793a05d7" factor="1.07" channel-id="2" supply-id="2"/>

<connection calibration-id="67b5479e-227a-4714-8577-1d97f9497aec" factor="1.06" channel-id="3" supply-id="3"/>

<connection calibration-id="56ed98d5-efa7-4775-aba2-3d0f88b84fb5" factor="1.07" channel-id="4" supply-id="4"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="cd7e10eb-a9e9-4f2a-b64f-916dbd812fae" kit-id="B">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="5cc04f68-5873-4dc9-aca3-e98f2d8fba27" kit-id="C">

<connections/>

</fluid-supply-configuration>


-<maintenance-set>

<maintenance-params channel-id="1" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="2" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="3" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="4" purge-volume="50ul" prime-volume="20ul"/>

</maintenance-set>

</head-supply-configuration>

<!-- -->



-<head-supply-configuration name="DMSO90" id="10a4e426-0c8a-4d15-b8db-59ec217b3099">


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="fb003d4b-63a9-4dd7-83e3-e8e01b0f71c3" kit-id="A">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="cd7e10eb-a9e9-4f2a-b64f-916dbd812fae" kit-id="B">


-<connections>

<connection calibration-id="3855528b-bde2-4f04-94fc-d668e6e8664d" factor="1" channel-id="1" supply-id="1"/>

<connection calibration-id="5c76e535-3afe-49a5-a573-736b553d465c" factor="1.06" channel-id="2" supply-id="2"/>

<connection calibration-id="048df963-99e3-4a9b-8de2-1771838f35ba" factor="1.07" channel-id="3" supply-id="3"/>

<connection calibration-id="619f2718-1b4d-416f-a0d4-224a8bc31c34" factor="1.02" channel-id="4" supply-id="4"/>

</connections>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="5cc04f68-5873-4dc9-aca3-e98f2d8fba27" kit-id="C">

<connections/>

</fluid-supply-configuration>


-<maintenance-set>

<maintenance-params channel-id="1" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="2" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="3" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="4" purge-volume="50ul" prime-volume="20ul"/>

</maintenance-set>

</head-supply-configuration>

<!-- -->



-<head-supply-configuration name="DMSO80" id="26c8ade9-32c2-446b-95c0-30f26184adbf">


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="fb003d4b-63a9-4dd7-83e3-e8e01b0f71c3" kit-id="A">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="cd7e10eb-a9e9-4f2a-b64f-916dbd812fae" kit-id="B">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="5cc04f68-5873-4dc9-aca3-e98f2d8fba27" kit-id="C">


-<connections>

<connection calibration-id="f13dc74e-c7b1-43eb-b7da-ea9b2ade561d" factor="1.07" channel-id="1" supply-id="1"/>

<connection calibration-id="3a84b09b-35ba-480f-be8e-70bec1dfd692" factor="1.11" channel-id="2" supply-id="2"/>

<connection calibration-id="7d9c3b47-de1e-4412-abb4-3d8ab5c4555e" factor="1.1" channel-id="3" supply-id="3"/>

<connection calibration-id="776cbddc-5ece-4747-b4ab-22c4a7853898" factor="1.14" channel-id="4" supply-id="4"/>

</connections>

</fluid-supply-configuration>


-<maintenance-set>

<maintenance-params channel-id="1" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="2" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="3" purge-volume="50ul" prime-volume="20ul"/>

<maintenance-params channel-id="4" purge-volume="50ul" prime-volume="20ul"/>

</maintenance-set>

</head-supply-configuration>

<!-- -->



-<head-supply-configuration name="Water" id="cae2e6c5-6c47-4c0a-914a-dd5f7873e4db">


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="fb003d4b-63a9-4dd7-83e3-e8e01b0f71c3" kit-id="A">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="cd7e10eb-a9e9-4f2a-b64f-916dbd812fae" kit-id="B">

<connections/>

</fluid-supply-configuration>


-<fluid-supply-configuration fluid-supply-id="881ec8e8-f0fb-4cd9-89f4-1cfac9a3f324" pressure="0.3bar" fluid-id="5cc04f68-5873-4dc9-aca3-e98f2d8fba27" kit-id="C">


-<connections>

<connection factor="1" channel-id="1" supply-id="1"/>

<connection factor="1" channel-id="2" supply-id="2"/>

<connection factor="1" channel-id="3" supply-id="3"/>

<connection factor="1" channel-id="4" supply-id="4"/>

</connections>

</fluid-supply-configuration>


-<maintenance-set>

<maintenance-params channel-id="1" purge-volume="50ul" prime-volume="10ul"/>

<maintenance-params channel-id="2" purge-volume="50ul" prime-volume="10ul"/>

<maintenance-params channel-id="3" purge-volume="50ul" prime-volume="10ul"/>

<maintenance-params channel-id="4" purge-volume="50ul" prime-volume="10ul"/>

</maintenance-set>

</head-supply-configuration>

<!-- -->


</head-supply-configurations>

I want to update the factor value in the XML. For whatever reason, the value is not being written to the file. Why is that?

These are the values/messages the script generated:

3/28/2024 1:15:00 PM,Tare: 47.961, Weight: 50.961, Dispensed Volume: 46.7532110091743, Target Volume: 2240, Calibration: 47.911147740429

3/28/2024 1:15:00 PM,Concentration: DMSO90, Kit ID: B, Valve: 2

So I can see that the correct Kit-ID, Valve and Concentration are there. I suspect something wrong with the C# script and how reads the XML.

0

There are 0 answers