/// <summary>
        /// Parse specific parameters
        /// </summary>
        /// <param name="metadata"></param>
        public override void ParseSpecific(IDictionary <string, string> metadata)
        {
            if (metadata.TryGetValue("DetPar", out var detparam))
            {
                if (!string.IsNullOrEmpty(detparam))
                {
                    try
                    {
                        DetectorParameters = JsonConvert.DeserializeObject <DetectorDataDto>(detparam);
                    }
                    catch { Console.WriteLine("Cannot parse detector parameters in the NFT"); }
                }
            }
            if (metadata.TryGetValue("SrcPar", out var srcparam))
            {
                if (!string.IsNullOrEmpty(srcparam))
                {
                    try
                    {
                        SourceParameters = JsonConvert.DeserializeObject <SourceParametersDto>(srcparam);
                    }
                    catch { Console.WriteLine("Cannot parse source parameters in the NFT"); }
                }
            }
            if (metadata.TryGetValue("PosPar", out var posparam))
            {
                if (!string.IsNullOrEmpty(posparam))
                {
                    try
                    {
                        PositionerParameters = JsonConvert.DeserializeObject <PositionerParametersDto>(posparam);
                    }
                    catch { Console.WriteLine("Cannot parse detector parameters in the NFT"); }
                }
            }

            if (metadata.TryGetValue("DeviceName", out var dn))
            {
                DeviceName = dn;
            }
            if (metadata.TryGetValue("DetectorName", out var detn))
            {
                DetectorName = detn;
            }
            if (metadata.TryGetValue("SourceName", out var sn))
            {
                SourceName = sn;
            }
            if (metadata.TryGetValue("PositionerName", out var posn))
            {
                PositionerName = posn;
            }
        }
        public override async Task Fill(INFT NFT)
        {
            await FillCommon(NFT);

            var nft = NFT as XrayNFT;

            DeviceName           = nft.DeviceName;
            DetectorName         = nft.DetectorName;
            SourceName           = nft.SourceName;
            PositionerName       = nft.PositionerName;
            DetectorParameters   = nft.DetectorParameters;
            SourceParameters     = nft.SourceParameters;
            PositionerParameters = nft.PositionerParameters;
        }