public LoadObjectiveFunctionsViewModel(List <Models.Roi> rois, List <Models.PlanLabel> planLabels, string defaultDirectoryPath)
        {
            DefaultDirectoryPath = defaultDirectoryPath;

            PlanLabels.Clear();
            foreach (var p in planLabels)
            {
                if (p.Label == PlanLabelCombinedDose)
                {
                    DoesUseCombinedDose = true;
                    continue;
                }
                p.LabelInObjectiveFunction = PlanLabelNone;
                PlanLabels.Add(p);
            }
            PlanLabelsInObjectiveFuntions.Add(PlanLabelNone);

            Rois = new ObservableCollection <Models.Roi>(rois);
            foreach (var r in Rois)
            {
                r.NameInObjectiveFunction = RoiNameNone;
            }
            RoiNamesInObjectiveFunctions.Add(RoiNameNone);

            OkCommand         = new DelegateCommand(() => { CanExecute = true; SetObjectiveFunctionArguments(); });
            CancelCommand     = new DelegateCommand(() => { CanExecute = false; });
            ChooseFileCommand = new DelegateCommand(ChooseFile);
        }
        private void SetObjectiveFunctionArguments()
        {
            foreach (var r in Rois)
            {
                if (!r.InUse || r.NameInObjectiveFunction == RoiNameNone)
                {
                    continue;
                }

                var query = ObjectiveFunctions.Where(o => (o.InUse && o.RoiName == r.NameInObjectiveFunction));
                if (query.Count() == 0)
                {
                    continue;
                }

                foreach (var o in query)
                {
                    var    planLabelQuery = PlanLabels.Where(p => p.LabelInObjectiveFunction == o.PlanLabel);
                    string newLabel       = string.Empty;
                    if (planLabelQuery.Count() > 0)
                    {
                        var  newPlanLabel = planLabelQuery.First();
                        bool inUse        = newPlanLabel.InUse;
                        if (!inUse)
                        {
                            continue;
                        }
                        newLabel = newPlanLabel.Label;
                        if (planLabelQuery.Count() >= 2)
                        {
                            Message = $"Multiple plans are assigned to {o.PlanLabel}. Use {newLabel}.";
                        }
                        o.SetPlanLabelInArguments(newLabel);
                    }
                    else if (!(o.PlanLabel == PlanLabelCombinedDose))
                    {
                        continue;
                    }

                    o.UpdateWeightInArguments();
                    o.SetRoiNameInArguments(r.Name);

                    if (o.PlanLabel == PlanLabelCombinedDose)
                    {
                        if (!DoesUseCombinedDose)
                        {
                            continue;
                        }
                        newLabel = PlanLabelCombinedDose;
                    }

                    var    prescriptionQuery = Prescriptions.Where(p => p.PlanLabel == o.PlanLabel);
                    double scale             = 0;
                    if (prescriptionQuery.Count() == 0)
                    {
                        scale   = 1.0;
                        Message = $"Prescription does not exist for new: {newLabel} and original: {o.PlanLabel}";
                    }
                    else
                    {
                        var prescription           = prescriptionQuery.First();
                        var originalPrescribedDose = prescription.PrescribedDoseInObjectiveFunction;
                        var prescribedDose         = prescription.PrescribedDose;
                        if (DoesRescaleDose)
                        {
                            if (originalPrescribedDose == 0)
                            {
                                Message = $"No rescale because the original prescribed dose = 0";
                                scale   = 1.0;
                            }
                            else
                            {
                                scale = prescribedDose / originalPrescribedDose;
                            }
                        }
                    }

                    var functionType = o.Arguments["FunctionType"].ToObject <string>();
                    if (functionType == "DoseFallOff")
                    {
                        var highDoseLevel = scale * o.Arguments["HighDoseLevel"].ToObject <double>();
                        var lowDoseLevel  = scale * o.Arguments["LowDoseLevel"].ToObject <double>();
                        o.Arguments["HighDoseLevel"] = highDoseLevel;
                        o.Arguments["LowDoseLevel"]  = lowDoseLevel;
                    }
                    else if (functionType == "UniformDose" ||
                             functionType == "MaxDose" || functionType == "MinDose" ||
                             functionType == "MaxEud" || functionType == "MinEud" ||
                             functionType == "MaxDvh" || functionType == "MinDvh")
                    {
                        var doseLevel = scale * o.Arguments["DoseLevel"].ToObject <double>();
                        o.Arguments["DoseLevel"] = doseLevel;
                    }

                    r.ObjectiveFunctionArguments.Add(o.Arguments.ToString());
                }
            }
        }
        private void ChooseFile()
        {
            var dialog = new CommonOpenFileDialog("Choose File");

            if (Directory.Exists(DefaultDirectoryPath))
            {
                dialog.InitialDirectory = DefaultDirectoryPath;
            }

            dialog.IsFolderPicker = false;

            if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
            {
                FilePath = dialog.FileName;

                using (var sr = new StreamReader(FilePath))
                    using (JsonTextReader reader = new JsonTextReader(sr))
                    {
                        ObjectiveFunctionsJObject = (JObject)JToken.ReadFrom(reader);
                    }

                var prescriptionsJArray = (JArray)ObjectiveFunctionsJObject["Prescriptions"];
                Prescriptions = prescriptionsJArray.ToObject <ObservableCollection <Models.Prescription> >();

                var descriptionJObject = ObjectiveFunctionsJObject["Description"];
                if (descriptionJObject != null)
                {
                    Description = descriptionJObject.ToObject <string>();
                }
                else
                {
                    Description = string.Empty;
                }

                var argumentsJArray = (JArray)ObjectiveFunctionsJObject["Arguments"];
                ObjectiveFunctions.Clear();
                foreach (var a in argumentsJArray)
                {
                    var jObject = JObject.Parse(a.ToString());
                    ObjectiveFunctions.Add(new Models.ObjectiveFunction(jObject));
                    string roiName = jObject["RoiName"].ToObject <string>();
                    if (!RoiNamesInObjectiveFunctions.Contains(roiName))
                    {
                        RoiNamesInObjectiveFunctions.Add(roiName);
                    }

                    string planLabel = jObject["PlanLabel"].ToObject <string>();
                    if (!(planLabel == PlanLabelCombinedDose) && !PlanLabelsInObjectiveFuntions.Contains(planLabel))
                    {
                        PlanLabelsInObjectiveFuntions.Add(planLabel);
                    }
                }
                RoiNamesInObjectiveFunctions.OrderBy(r => r);

                foreach (var r in Rois)
                {
                    if (RoiNamesInObjectiveFunctions.Contains(r.Name))
                    {
                        r.InUse = true;
                        r.NameInObjectiveFunction = r.Name;
                    }
                }

                foreach (var p in PlanLabels)
                {
                    if (p.InUse && PlanLabelsInObjectiveFuntions.Contains(p.Label))
                    {
                        p.LabelInObjectiveFunction = p.Label;
                    }
                }

                var planSumDose = PlanLabels.Select(p => p.PrescribedDose).Sum();
                foreach (var p in Prescriptions)
                {
                    var query = PlanLabels.Where(pl => pl.Label == p.PlanLabel);
                    if (query.Count() > 0)
                    {
                        p.PrescribedDose = query.First().PrescribedDose;
                        continue;
                    }

                    if (p.PlanLabel == PlanLabelCombinedDose)
                    {
                        p.PrescribedDose = planSumDose;
                    }
                }
            }
            else
            {
                Message = "\"Choose File\" is canceled";
            }
        }