private UserAnswers ReadPerson(Worksheet sheet, int personRowIndex)
        {
            string itemRange   = "A" + IdRowIndex + ":" + FinalColumn + IdRowIndex;
            string personRange = "A" + personRowIndex + ":" + FinalColumn + personRowIndex;
            string scaleRange  = "A" + ScaleRowIndex + ":" + FinalColumn + ScaleRowIndex;

            List <string> scaleRow   = CellReader.GetRange(scaleRange, sheet);
            List <string> itemRow    = CellReader.GetRange(itemRange, sheet).Skip(NumEmptyScores).ToList();
            List <string> scoresRow  = CellReader.GetRange(personRange, sheet);
            string        personName = scoresRow[0];

            scoresRow = scoresRow.Skip(NumEmptyScores).ToList();

            List <string> scaleNames = scaleRow.Distinct().ToList();

            List <ScaleAnswers> scaleAnswersList = new List <ScaleAnswers>();

            foreach (var scaleName in scaleNames)
            {
                List <int> indices = Enumerable.Range(0, scaleRow.Count)
                                     .Where(index => scaleRow[index] == scaleName)
                                     .ToList();

                Dictionary <string, int> itemsToAnswersMap = new Dictionary <string, int>();
                for (int k = 0; k < indices.Count; k++)
                {
                    var index    = indices[k];
                    var itemName = itemRow[index];
                    itemsToAnswersMap[itemName] = Convert.ToInt32(scoresRow[index]);
                }

                ScaleAnswers scaleAnswers = new ScaleAnswers()
                {
                    ScaleName       = scaleName,
                    ItemToAnswerMap = itemsToAnswersMap
                };

                scaleAnswersList.Add(scaleAnswers);
            }


            UserAnswers answers = new UserAnswers()
            {
                PersonName   = personName,
                ScaleAnswers = scaleAnswersList
            };

            return(answers);
        }
        private static ScoringOutput GetScores(List <string> scaleNames, List <ItemInformation> itemInformationList, List <string> personNames, List <UserAnswers> answersInput,
                                               CATParameters catParameters)
        {
            List <ScoreDetails>         scores           = new List <ScoreDetails>();
            List <List <QuestionInfo> > questionInfoList = new List <List <QuestionInfo> >();

            foreach (var scaleName in scaleNames)
            {
                List <ItemInformation> itemInfoForScale = itemInformationList.Where(x => x.ScaleName.Equals(scaleName)).ToList();
                IQuestionLoader        questionLoader   = new ExcelQuestionLoader(itemInfoForScale, catParameters.MistakeProbability);
                foreach (var personName in personNames)
                {
                    UserAnswers        personAnswers     = answersInput.Single(x => x.PersonName.Equals(personName));
                    ScaleAnswers       answers           = personAnswers.ScaleAnswers.Single(x => x.ScaleName.Equals(scaleName));
                    IAnswerSheetLoader answerSheetLoader = new ExcelAnswerSheetLoader(answers);

                    LocationEstimator   locationEstimator = new LocationEstimator(questionLoader, answerSheetLoader, catParameters);
                    List <QuestionInfo> output            = locationEstimator.EstimatePersonLocation();
                    questionInfoList.Add(output);

                    ScoreDetails scoreDetails = new ScoreDetails()
                    {
                        PersonName = personName,
                        ScaleName  = scaleName,
                        Score      = (double)output.Last().ThetaEstimate
                    };
                    scores.Add(scoreDetails);
                }
            }

            ScoringOutput scoringOutput = new ScoringOutput()
            {
                FirstPersonQuestionInfo = questionInfoList.First(),
                ScoreDetails            = scores
            };

            return(scoringOutput);
        }
 public ExcelAnswerSheetLoader(ScaleAnswers scaleAnswers)
 {
     _scaleAnswers = scaleAnswers;
 }