public override ValidationInfo Validate() { //go through all the column names, if any are numeric then stop the analysis List <string> allVars = new List <string>(); allVars.Add(mcVariables.Treatment); allVars.Add(mcVariables.Response); if (!CheckColumnNames(allVars)) { return(ValidationInfo); } if (!CheckFactorsHaveLevels(mcVariables.Treatment)) { return(ValidationInfo); } //Check that the response does not contain non-numeric if (!CheckIsNumeric(mcVariables.Response)) { ValidationInfo.AddErrorMessage("The Response (" + mcVariables.Response + ") contains non-numerical data that cannot be processed. Please check input data and make sure the data was entered correctly."); return(ValidationInfo); } if (mcVariables.Treatment != null && !CheckResponsesPerLevel(mcVariables.Treatment, mcVariables.Response, ReflectionExtensions.GetPropertyDisplayName <ComparisonOfMeansPowerAnalysisDatasetBasedInputsModel>(i => i.Treatment))) { return(ValidationInfo); } if (!String.IsNullOrEmpty(mcVariables.Treatment) && !String.IsNullOrEmpty(mcVariables.Response)) //if a treat and response is selected... { //Check that the number of responses for each level is at least 2 Dictionary <string, int> levelResponses = ResponsesPerLevel(mcVariables.Treatment, mcVariables.Response); foreach (KeyValuePair <string, int> level in levelResponses) { if (level.Value < 2) { ValidationInfo.AddErrorMessage("There is no replication in one or more of the levels of the Treatment factor (" + mcVariables.Treatment + "). Please amend the dataset prior to running the analysis."); return(ValidationInfo); } } //check response and doses contain values if (!CheckFactorAndResponseNotBlank(mcVariables.Treatment, mcVariables.Response, "Treatment factor")) { return(ValidationInfo); } } else if (mcVariables.Treatment == null && mcVariables.Response != null && CountResponses(mcVariables.Response) == 1) //if only a response selected (doing absolute change) then check that more than 1 value is in the dataset! { ValidationInfo.AddErrorMessage("The Response (" + mcVariables.Response + ") contains only 1 value. Please select another factor."); return(ValidationInfo); } if (mcVariables.ChangeType == ChangeTypeOption.Percent) { if (String.IsNullOrEmpty(mcVariables.PercentChange)) { ValidationInfo.AddErrorMessage("Percent changes is required."); return(ValidationInfo); } else if (String.IsNullOrEmpty(mcVariables.ControlGroup)) { ValidationInfo.AddErrorMessage("You have selected % change as expected changes from control, but as you have not defined the control group it is not possible to calculate the % change."); return(ValidationInfo); } else { char[] splitters = { ',' }; string[] changes = mcVariables.PercentChange.Split(splitters, StringSplitOptions.None); //split list by comma foreach (string s in changes) { if (String.IsNullOrWhiteSpace(s)) { ValidationInfo.AddErrorMessage("The list of percent changes contains missing values, please remove any blank entries between the comma separated values."); return(ValidationInfo); } else { if (!Double.TryParse(s, out double number)) { ValidationInfo.AddErrorMessage("Percent changes has non-numeric values or the values are not comma separated."); return(ValidationInfo); } else if (number < 0) { ValidationInfo.AddErrorMessage("Percent changes has values less than zero."); return(ValidationInfo); } else if (number > 100) { ValidationInfo.AddErrorMessage("Percent changes has values greater than 100."); return(ValidationInfo); } } } } } else if (mcVariables.ChangeType == ChangeTypeOption.Absolute) { if (String.IsNullOrEmpty(mcVariables.AbsoluteChange)) { ValidationInfo.AddErrorMessage("Absolute changes is required."); return(ValidationInfo); } else { char[] splitters = { ',' }; string[] changes = mcVariables.AbsoluteChange.Split(splitters, StringSplitOptions.None); //split list by comma foreach (string s in changes) //go through list and check that is a number and is greater than 0 { if (String.IsNullOrWhiteSpace(s)) { ValidationInfo.AddErrorMessage("The list of absolute changes contains missing values, please remove any blank entries between the comma separated values."); return(ValidationInfo); } else { if (!Double.TryParse(s, out double number)) { ValidationInfo.AddErrorMessage("Absolute changes has non-numeric values or the values are not comma separated."); return(ValidationInfo); } else if (number < 0) { ValidationInfo.AddErrorMessage("Absolute changes has values less than zero."); return(ValidationInfo); } } } } } if (mcVariables.PlottingRangeType == PlottingRangeTypeOption.SampleSize) { if (!mcVariables.SampleSizeFrom.HasValue || !mcVariables.SampleSizeTo.HasValue) { ValidationInfo.AddErrorMessage("Sample Size From and To must be set"); return(ValidationInfo); } else if (mcVariables.SampleSizeFrom > mcVariables.SampleSizeTo) { ValidationInfo.AddErrorMessage("Sample Size To value must be greater than the From value."); return(ValidationInfo); } } else if (mcVariables.PlottingRangeType == PlottingRangeTypeOption.Power) { if (!mcVariables.PowerFrom.HasValue || !mcVariables.PowerTo.HasValue) { ValidationInfo.AddErrorMessage("Power From and To must be set"); return(ValidationInfo); } else if (mcVariables.PowerFrom > mcVariables.PowerTo) { ValidationInfo.AddErrorMessage("Power To value must be greater than the From value."); return(ValidationInfo); } } //if get here then no errors so return true return(ValidationInfo); }