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.