diff --git a/.gitignore b/.gitignore index ebd3f033..cf344cf0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ ### Maven spring - downloaded with initial project from Spring Intitializer - https://start.spring.io/ ### /target/ +/parui/ !.mvn/wrapper/maven-wrapper.jar ### STS ### diff --git a/pom.xml b/pom.xml index aa896677..fc8b8c6b 100644 --- a/pom.xml +++ b/pom.xml @@ -30,10 +30,6 @@ opencsv 4.1 - - org.springframework.boot - spring-boot-starter-thymeleaf - org.springframework.boot @@ -96,6 +92,17 @@ 2.14.1 + + org.openjfx + javafx-controls + 11 + + + + commons-io + commons-io + 2.4 + @@ -116,6 +123,68 @@ + + + + com.github.eirslett + frontend-maven-plugin + 1.12.0 + + parui + target + + + + install node and npm + + install-node-and-npm + + + v14.16.0 + 6.14.11 + + + + npm install + + npm + + + install + + + + npm run build + + npm + + + run build + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.0.0 + + + generate-resources + + + + + + + + + + run + + + + diff --git a/server install steps.txt b/server install steps.txt index 98da8a8e..d0f4c6cb 100644 --- a/server install steps.txt +++ b/server install steps.txt @@ -10,9 +10,9 @@ mvn test ps -A | grep java sudo kill PID -tar cvzf "../dataBackup/parDataBackup-2021-02-10.tar.gz" target/localData/ +tar cvzf "../dataBackup/parDataBackup-2021-06-15.tar.gz" target/localData/ on local: -scp @par.eastus.cloudapp.azure.com:dataBackup/parDataBackup--2021-02-10.tar.gz Downloads/ +scp @par.eastus.cloudapp.azure.com:dataBackup/parDataBackup--2021-06-15.tar.gz Downloads/ remote if clearing data: rm -f target/localData/*.json rm -f target/localData/students/*.json diff --git a/src/main/java/edu/ithaca/dragon/par/ParServer.java b/src/main/java/edu/ithaca/dragon/par/ParServer.java index 5fdfaae0..8109673f 100644 --- a/src/main/java/edu/ithaca/dragon/par/ParServer.java +++ b/src/main/java/edu/ithaca/dragon/par/ParServer.java @@ -1,12 +1,16 @@ package edu.ithaca.dragon.par; +import java.util.Collection; import java.util.List; +import edu.ithaca.dragon.par.analysis.QuestionHistorySummary; import edu.ithaca.dragon.par.cohort.Cohort; import edu.ithaca.dragon.par.cohort.CohortDatasource; import edu.ithaca.dragon.par.domain.Question; import edu.ithaca.dragon.par.domain.DomainDatasource; import edu.ithaca.dragon.par.student.StudentModelDatasource; +import edu.ithaca.dragon.par.student.json.QuestionHistory; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -32,6 +36,11 @@ public List getCohortIds(){ return cohortDatasource.getCohortIds(); } + public QuestionHistorySummary getQuestionHistorySummary(String studentId){ + logger.info("QuestionHistorySummary for:" + studentId); + return new QuestionHistorySummary(studentModelDatasource.getStudentModel(studentId).getQuestionHistories().values(), domainDatasource); + } + public void addNewUser(String studentId, String cohortId){ studentModelDatasource.createNewModelForId(studentId); cohortDatasource.addStudentToCohort(cohortId, studentId); diff --git a/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java b/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java index 508fb233..3ef8d50b 100644 --- a/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java +++ b/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java @@ -12,18 +12,18 @@ //TODO: can make these: across everyone for all types or certain type, for 1 student for all types or certain type, window size too public class QuestionHistorySummary { private List questionIdsSeen; - private List questionsRespondedTo; - private List questionsCorrect; - private List questionsCorrectAfterIncorrect; - private List questionsIncorrect; + private List questionIdsRespondedTo; + private List questionIdsCorrectFirstTime; + private List questionIdsCorrectAfterIncorrect; + private List questionIdsIncorrect; public QuestionHistorySummary(Collection questionHistoryCollection, DomainDatasource domainData){ questionIdsSeen = buildQuestionIdsSeen(questionHistoryCollection); - questionsRespondedTo = checkQuestionsRespondedTo(questionHistoryCollection); - questionsCorrect = findQuestionsCorrect(questionHistoryCollection, domainData); - questionsIncorrect = findQuestionsIncorrect(questionHistoryCollection, domainData); - questionsCorrectAfterIncorrect = findQuestionsCorrectAfterIncorrect(questionHistoryCollection, domainData); + questionIdsRespondedTo = checkQuestionIdsRespondedTo(questionHistoryCollection); + questionIdsCorrectFirstTime = findQuestionIdsCorrectFirstTime(questionHistoryCollection, domainData); + questionIdsIncorrect = findQuestionIdsIncorrect(questionHistoryCollection, domainData); + questionIdsCorrectAfterIncorrect = findQuestionIdsCorrectAfterIncorrect(questionHistoryCollection, domainData); } public static List buildQuestionIdsSeen(Collection questionHistoryCollection){ @@ -40,7 +40,7 @@ public static List buildQuestionIdsSeen(Collection ques return questionIdsList; } - public static List checkQuestionsRespondedTo(Collection questionHistoryCollection){ + public static List checkQuestionIdsRespondedTo(Collection questionHistoryCollection){ List questionsRespondedList = new ArrayList(); for(QuestionHistory questionHist : questionHistoryCollection){ @@ -51,7 +51,7 @@ public static List checkQuestionsRespondedTo(Collection return questionsRespondedList; } - public static List findQuestionsCorrect(Collection questionHistoryCollection, DomainDatasource domainData){ + public static List findQuestionIdsCorrectFirstTime(Collection questionHistoryCollection, DomainDatasource domainData){ List correctList = new ArrayList(); List historyOfQuestions = QuestionHistorySummary.findAllHistoriesWithResponses(questionHistoryCollection); @@ -65,28 +65,35 @@ public static List findQuestionsCorrect(Collection ques return correctList; } - public static List findQuestionsIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){ + public static List findQuestionIdsIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){ List incorrectList = new ArrayList(); List historyOfQuestions = QuestionHistorySummary.findAllHistoriesWithResponses(questionHistoryCollection); - for (QuestionHistory questionHist : historyOfQuestions){ - String correctAnswer = domainData.getQuestion(questionHist.getQuestionId()).getCorrectAnswer(); - if (!questionHist.responses.iterator().next().getResponseText().equals(correctAnswer)){ + boolean hasCorrectAnswer = false; + + for(Response questionResponse : questionHist.responses){ + String correctAnswer = domainData.getQuestion(questionHist.getQuestionId()).getCorrectAnswer(); + if (questionResponse.getResponseText().equals(correctAnswer) ){ + hasCorrectAnswer = true; + } + } + if (!hasCorrectAnswer){ incorrectList.add(questionHist.getQuestionId()); } } + return incorrectList; } - public static List findQuestionsCorrectAfterIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){ + public static List findQuestionIdsCorrectAfterIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){ List correctAfterIncorrect = new ArrayList(); List historyOfQuestions = QuestionHistorySummary.findAllHistoriesWithResponses(questionHistoryCollection); for (QuestionHistory questionHist : historyOfQuestions){ for(Response questionResponse : questionHist.responses){ String correctAnswer = domainData.getQuestion(questionHist.getQuestionId()).getCorrectAnswer(); - if (questionResponse.getResponseText().equals(correctAnswer)){ + if (questionResponse.getResponseText().equals(correctAnswer) && !questionHist.responses.get(0).getResponseText().equals(correctAnswer)){ correctAfterIncorrect.add(questionHist.getQuestionId()); } } @@ -110,19 +117,19 @@ public List getQuestionIdsSeen() { return questionIdsSeen; } - public List getQuestionsRespondedTo() { - return questionsRespondedTo; + public List getQuestionIdsRespondedTo() { + return questionIdsRespondedTo; } - public List getQuestionsCorrect() { - return questionsCorrect; + public List getQuestionIdsCorrectFirstTime() { + return questionIdsCorrectFirstTime; } - public List getQuestionsIncorrect(){ - return questionsIncorrect; + public List getQuestionIdsIncorrect(){ + return questionIdsIncorrect; } - public List getQuestionsCorrectAfterIncorrect(){ - return questionsCorrectAfterIncorrect; + public List getQuestionIdsCorrectAfterIncorrect(){ + return questionIdsCorrectAfterIncorrect; } } diff --git a/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java b/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java index c93a3803..2909c032 100644 --- a/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java +++ b/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java @@ -3,4 +3,10 @@ public class CreateStudentAction { public String studentId; public String cohortId; + + public CreateStudentAction(){} + public CreateStudentAction(String studentId, String cohortId){ + this.studentId = studentId; + this.cohortId = cohortId; + } } diff --git a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java index 494dad79..54524064 100644 --- a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java +++ b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java @@ -1,6 +1,7 @@ package edu.ithaca.dragon.par.domain; import java.util.List; +import java.util.Set; public interface DomainDatasource { @@ -11,4 +12,9 @@ public interface DomainDatasource { */ Question getQuestion(String id); + List retrieveAllConcepts(); + + String retrieveConceptForAQuestion(String id); + + List retrieveQuestionsByConcept(String concept); } diff --git a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java index 582c9899..cfa16f42 100644 --- a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java +++ b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java @@ -6,7 +6,11 @@ import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; + public class DomainDatasourceJson implements DomainDatasource{ private final String id; @@ -42,4 +46,42 @@ public Question getQuestion(String id){ } throw new IllegalArgumentException("No question found, bad ID:" + id); } + + @Override + public List retrieveAllConcepts() { + List concepts = new ArrayList<>(); + + for(Question question:questions){ + if(!concepts.contains(question.getType())){ + concepts.add(question.getType()); + } + } + return concepts; + } + + @Override + public String retrieveConceptForAQuestion(String id) { + for (Question question: questions){ + if (question.getId().equalsIgnoreCase(id)){ + return question.getType(); + } + } + throw new IllegalArgumentException("No question found, bad ID:" + id); + } + + @Override + public List retrieveQuestionsByConcept(String concept) { + List questionList = new ArrayList<>(); + for (Question question: questions){ + if (question.getType().equalsIgnoreCase(concept)){ + questionList.add(question); + } + } + if(questionList.size()==0){ + throw new IllegalArgumentException("No questions found, bad concept: "+concept); + } + else{ + return questionList; + } + } } diff --git a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java index a6d9a5a8..b1a9f303 100644 --- a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java +++ b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java @@ -1,6 +1,9 @@ package edu.ithaca.dragon.par.domain; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class DomainDatasourceSimple implements DomainDatasource { @@ -24,4 +27,44 @@ public Question getQuestion(String id) { } throw new IllegalArgumentException("Question not found for id:" + id); } + + @Override + public List retrieveAllConcepts() { + List concepts = new ArrayList<>(); + + for(Question question:questions){ + if(!concepts.contains(question.getType())){ + concepts.add(question.getType()); + } + } + return concepts; + } + + @Override + public String retrieveConceptForAQuestion(String id) { + for (Question question: questions){ + if (question.getId().equalsIgnoreCase(id)){ + return question.getType(); + } + } + throw new IllegalArgumentException("No question found, bad ID:" + id); + } + + @Override + public List retrieveQuestionsByConcept(String concept) { + List questionList = new ArrayList<>(); + for (Question question: questions){ + if (question.getType().equalsIgnoreCase(concept)){ + questionList.add(question); + } + } + if(questionList.size()==0){ + throw new IllegalArgumentException("No questions found, bad concept: "+concept); + } + else{ + return questionList; + } + } + + } diff --git a/src/main/java/edu/ithaca/dragon/par/pedagogy/OrderedConceptRubric.java b/src/main/java/edu/ithaca/dragon/par/pedagogy/OrderedConceptRubric.java new file mode 100644 index 00000000..a6d1ad38 --- /dev/null +++ b/src/main/java/edu/ithaca/dragon/par/pedagogy/OrderedConceptRubric.java @@ -0,0 +1,8 @@ +package edu.ithaca.dragon.par.pedagogy; + +enum OrderedConceptRubric{ + UNPREPARED, + DEVELOPING, + COMPETENT, + EXEMPLARY; +} \ No newline at end of file diff --git a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java index b749cc51..5452ca0b 100644 --- a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java +++ b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java @@ -7,7 +7,7 @@ import edu.ithaca.dragon.par.student.StudentModelInfo; @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property ="type") -@JsonSubTypes({@JsonSubTypes.Type(value = QuestionChooserRandom.class, name = "QuestionChooserRandom"),@JsonSubTypes.Type(value = QuestionChooserInOrder.class, name = "QuestionChooserInOrder") }) +@JsonSubTypes({@JsonSubTypes.Type(value = QuestionChooserRandom.class, name = "QuestionChooserRandom"),@JsonSubTypes.Type(value = QuestionChooserInOrder.class, name = "QuestionChooserInOrder"), @JsonSubTypes.Type(value=QuestionChooserByOrderedConcepts.class,name="QuestionChooserByOrderedConcepts")}) public interface QuestionChooser { Question chooseQuestion(StudentModelInfo studentModelInfo, DomainDatasource domainDatasource); } \ No newline at end of file diff --git a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java index 3ab6a179..19fb4214 100644 --- a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java +++ b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java @@ -1,9 +1,23 @@ package edu.ithaca.dragon.par.pedagogy; -public class QuestionChooserByOrderedConcepts { +import java.util.ArrayList; +import java.util.Collection; +import javafx.util.Pair; +import java.util.List; +import java.util.stream.Collectors; + +import edu.ithaca.dragon.par.analysis.QuestionHistorySummary; +import edu.ithaca.dragon.par.domain.DomainDatasource; +import edu.ithaca.dragon.par.domain.Question; +import edu.ithaca.dragon.par.student.StudentModelInfo; +import edu.ithaca.dragon.par.student.json.QuestionHistory; + + + +public class QuestionChooserByOrderedConcepts implements QuestionChooser{ //Each concept(type) has an average of last questions which gets bucketed //rubric-style: unprepared,developing,competent,exemplary - //having too few questions answered puts you automatically into developing + //having too few questions answered puts you automatically into unprepared //concepts are ordered //unprepared on next topic can get turned to developing by competent grade on prior //exemplary on the prior topic can get turned into competent by current topic @@ -12,4 +26,227 @@ public class QuestionChooserByOrderedConcepts { //Find questions of the right type(s) that have the min seen count. //If a minSeen question has the same URL as last question, take that, otherwise go for first minSeen + public List> conceptScores; + public List conceptIds; + + public QuestionChooserByOrderedConcepts(){ + conceptScores = new ArrayList<>(); + } + + public QuestionChooserByOrderedConcepts(List concepts){ + conceptIds=concepts; + conceptScores = new ArrayList<>(); + String firstConcept = concepts.iterator().next(); + for(String concept :concepts){ + if(concept.equalsIgnoreCase(firstConcept)){ + conceptScores.add(new Pair(concept,OrderedConceptRubric.DEVELOPING)); + } + else{ + conceptScores.add(new Pair(concept,OrderedConceptRubric.UNPREPARED)); + } + } + + } + + public Question chooseQuestion(StudentModelInfo studentModelInfo, DomainDatasource domainDatasource){ + //Algorithm: + // 1. get all questions from domain datasource + // 2. select the first concept from the list of questions to be developing, the rest are unprepared + // 3. (Once competent, the next concept will be developing) + // 4. (Once exemplary, the next concept will be updated to competent) + // 5. from the developing and competent buckets, the question asked will be chosen based on least recently seen + // *Test case for when first two topics are exemplary and the next + + + + updateConceptScoresBasedOnPerformanceData(studentModelInfo, domainDatasource); + + + + updateConceptScoresBasedOnComparativeResults(); + + + + List eligibleQuestions = new ArrayList<>(); + for(Pair conceptScore:conceptScores){ + if(conceptScore.getValue()==OrderedConceptRubric.COMPETENT || conceptScore.getValue()==OrderedConceptRubric.DEVELOPING){ + eligibleQuestions.addAll(domainDatasource.retrieveQuestionsByConcept(conceptScore.getKey())); + } + } + + if(eligibleQuestions.size()!=0){ + String questionIdToBeAsked = studentModelInfo.findQuestionSeenLeastRecently(eligibleQuestions.stream().map(q -> q.getId()).collect(Collectors.toList())); + return domainDatasource.getQuestion(questionIdToBeAsked); + } + else{ + throw new RuntimeException("No questions eligible for choosing"); + } + } + + public List> getConceptScores() { + return conceptScores; + } + + public void setConceptScores(List> conceptScores) { + this.conceptScores = conceptScores; + } + + public List getConceptIds() { + return conceptIds; + } + + public void setConceptIds(List conceptIds) { + this.conceptIds = conceptIds; + String firstConcept = conceptIds.iterator().next(); + List>conceptScoresIn = new ArrayList<>(); + for(String concept :conceptIds){ + if(concept.equalsIgnoreCase(firstConcept)){ + conceptScoresIn.add(new Pair(concept,OrderedConceptRubric.DEVELOPING)); + } + else{ + conceptScoresIn.add(new Pair(concept,OrderedConceptRubric.UNPREPARED)); + } + } + setConceptScores(conceptScoresIn); + } + + public static List retrieveQuestionsFromStudentModelByConcept(String concept, Collection questionHistories, DomainDatasource domainDatasource){ + List questionsByConceptFromDatasource = domainDatasource.retrieveQuestionsByConcept(concept); + List questionList = new ArrayList<>(); + for(Question question:questionsByConceptFromDatasource){ + for(QuestionHistory questionHist: questionHistories){ + if(questionHist.questionId.equalsIgnoreCase(question.getId())){ + questionList.add(question); + } + } + } + return questionList; + } + + public void updateConceptScoresBasedOnPerformanceData(StudentModelInfo studentModelInfo,DomainDatasource domainDatasource){ + Collection questionHistories = studentModelInfo.getQuestionHistories().values(); + int i=0; + for(Pair conceptScore:conceptScores){ + String concept = conceptScore.getKey(); + List conceptQuestionsSeenByStudent = retrieveQuestionsFromStudentModelByConcept(concept,questionHistories,domainDatasource); + if(calcUnprepared(conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){ + conceptScores.set(i,new Pair(concept,OrderedConceptRubric.UNPREPARED)); + } + else if(calcDeveloping(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){ + conceptScores.set(i,new Pair(concept,OrderedConceptRubric.DEVELOPING)); + } + else if(calcCompetent(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){ + conceptScores.set(i,new Pair(concept,OrderedConceptRubric.COMPETENT)); + } + else{ + conceptScores.set(i,new Pair(concept,OrderedConceptRubric.EXEMPLARY)); + } + i++; + } + } + + public void updateConceptScoresBasedOnComparativeResults(){ + int i=0; + boolean isAllExemplary = true; + for(Pair conceptScore:conceptScores){ + String concept = conceptScore.getKey(); + if(i==0 && conceptScore.getValue()==OrderedConceptRubric.UNPREPARED){ + conceptScores.set(i,new Pair(concept,OrderedConceptRubric.DEVELOPING)); + isAllExemplary=false; + } + else if(i-1!=-1 && conceptScore.getValue()==OrderedConceptRubric.UNPREPARED){ + Pair previousConceptScore = conceptScores.get(i-1); + if(previousConceptScore.getValue()==OrderedConceptRubric.COMPETENT || previousConceptScore.getValue()==OrderedConceptRubric.EXEMPLARY){ + conceptScores.set(i,new Pair(concept,OrderedConceptRubric.DEVELOPING)); + } + isAllExemplary=false; + } + else{ + if(conceptScore.getValue()!=OrderedConceptRubric.EXEMPLARY){ + isAllExemplary=false; + } + } + i++; + } + + if(isAllExemplary){ + conceptScores = conceptScores.stream().map(score -> new Pair(score.getKey(),OrderedConceptRubric.DEVELOPING)).collect(Collectors.toList()); + } + + } + + public boolean calcUnprepared(List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){ + + List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource); + questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource)); + for(Question question: conceptQuestionsSeenByStudent){ + for(String questionId:questionIdsForEverCorrect){ + if(questionId.equalsIgnoreCase(question.getId())){ + return false; + } + } + } + return true; + + } + + public boolean calcDeveloping(String concept, List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){ + if(calcCompetent(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)||calcExemplary(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){ + return false; + } + else{ + List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource); + questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource)); + + for(Question question: conceptQuestionsSeenByStudent){ + for(String questionId:questionIdsForEverCorrect){ + if(questionId.equalsIgnoreCase(question.getId())){ + return true; + } + } + } + return false; + } + + + } + public boolean calcCompetent(String concept, List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){ + if(calcExemplary(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){ + return false; + } + else{ + List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource); + questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource)); + float denom = (float) domainDatasource.retrieveQuestionsByConcept(concept).size(); + float num = 0; + for(Question question: conceptQuestionsSeenByStudent){ + for(String questionId:questionIdsForEverCorrect){ + if(questionId.equalsIgnoreCase(question.getId())){ + num++; + } + } + } + if(num/denom > 0.5){ + return true; + } else {return false;} + } + + } + public boolean calcExemplary(String concept, List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){ + List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource); + questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource)); + int denom = domainDatasource.retrieveQuestionsByConcept(concept).size(); + int num = 0; + for(Question question: conceptQuestionsSeenByStudent){ + for(String questionId:questionIdsForEverCorrect){ + if(questionId.equalsIgnoreCase(question.getId())){ + num++; + } + } + } + if(num/denom ==1){ + return true; + } else {return false;} + } + } diff --git a/src/main/java/edu/ithaca/dragon/par/spring/ParController.java b/src/main/java/edu/ithaca/dragon/par/spring/ParController.java index 7c592215..d7695ce2 100644 --- a/src/main/java/edu/ithaca/dragon/par/spring/ParController.java +++ b/src/main/java/edu/ithaca/dragon/par/spring/ParController.java @@ -1,6 +1,7 @@ package edu.ithaca.dragon.par.spring; import edu.ithaca.dragon.par.ParServer; +import edu.ithaca.dragon.par.analysis.QuestionHistorySummary; import edu.ithaca.dragon.par.cohort.Cohort; import edu.ithaca.dragon.par.cohort.CohortDatasourceJson; import edu.ithaca.dragon.par.comm.CreateStudentAction; @@ -20,36 +21,40 @@ public class ParController { private final ParServer parServer; - public ParController()throws IOException { + public ParController(ParServer parServer){ + this.parServer=parServer; + } - StudentModelDatasourceJson studentModelDatasourceJson = new StudentModelDatasourceJson( + public ParController()throws IOException { + //TODO: remove default users once there is a front-end way to create new users + // List.of("r1", "r2", "r3", "o1", "o2", "o3", "o4").forEach((userId)-> { + // if (studentModelDatasourceJson.idIsAvailable(userId)){ + // studentModelDatasourceJson.createNewModelForId(userId); + // } + // }); + + this( + new ParServer( + new DomainDatasourceJson( + "HorseUltrasound", + "localData/currentQuestionPool.json", + "author/defaultQuestionPool.json", + new JsonIoHelperSpring() + ), + + new StudentModelDatasourceJson( "allStudents", "localData/student", new JsonIoHelperSpring() - ); - //TODO: remove default users once there is a front-end way to create new users - List.of("r1", "r2", "r3", "o1", "o2", "o3", "o4").forEach((userId)-> { - if (studentModelDatasourceJson.idIsAvailable(userId)){ - studentModelDatasourceJson.createNewModelForId(userId); - } - }); - - parServer = new ParServer( - new DomainDatasourceJson( - "HorseUltrasound", - "localData/currentQuestionPool.json", - "author/defaultQuestionPool.json", - new JsonIoHelperSpring() - ), - - studentModelDatasourceJson, - - //TODO: remove default users from cohort datastores once there is a viable way to add students - new CohortDatasourceJson( - "allCohorts", - "localData/currentCohorts.json", - "author/defaultCohorts.json", - new JsonIoHelperSpring() + ), + + //TODO: remove default users from cohort datastores once there is a viable way to add students + new CohortDatasourceJson( + "allCohorts", + "localData/currentCohorts.json", + "author/defaultCohorts.json", + new JsonIoHelperSpring() + ) ) ); } @@ -75,10 +80,14 @@ public List getCohortIds(){ return parServer.getCohortIds(); } + @GetMapping("/getQuestionHistorySummary") + public QuestionHistorySummary getQuestionHistorySummary(@RequestParam String userId){ + return parServer.getQuestionHistorySummary(userId); + } + @PostMapping("/addNewUser") public void addNewUser(@RequestBody CreateStudentAction studentAction){ parServer.addNewUser(studentAction.studentId, studentAction.cohortId); - } @PostMapping("/addTimeSeen") diff --git a/src/main/java/edu/ithaca/dragon/par/spring/WebController.java b/src/main/java/edu/ithaca/dragon/par/spring/WebController.java index 9992ab51..1b530c3b 100644 --- a/src/main/java/edu/ithaca/dragon/par/spring/WebController.java +++ b/src/main/java/edu/ithaca/dragon/par/spring/WebController.java @@ -1,48 +1,48 @@ -package edu.ithaca.dragon.par.spring; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - - -@Controller -public class WebController implements WebMvcConfigurer { - - @GetMapping("/") - public String base(){ - return "LoginPage"; - } - - @GetMapping("/login") - public String login(){ - return "LoginPage"; - } - - @GetMapping(value = "/imageTaskView") - public String redirect(@RequestParam String userId, Model model) { - model.addAttribute("User", userId); - return "old/ImageTaskTemplate"; - } - - @GetMapping("/studentView") - public String studentView(@RequestParam String userId, Model model){ - model.addAttribute("userId", userId); - return "StudentView"; - } - - @GetMapping("/authorFromTemplateView") - public String authorFromTemplateView(@RequestParam String userId, Model model){ - model.addAttribute("userId", userId); - return "AuthorFromTemplateView"; - } - - @GetMapping("/authorReview") - public String authorReview(@RequestParam String userId, Model model){ - model.addAttribute("userId", userId); - return "AuthorReview"; - } - - -} +//package edu.ithaca.dragon.par.spring; +// +//import org.springframework.stereotype.Controller; +//import org.springframework.ui.Model; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.RequestParam; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +// +// +//@Controller +//public class WebController implements WebMvcConfigurer { +// +// @GetMapping("/") +// public String base(){ +// return "LoginPage"; +// } +// +// @GetMapping("/login") +// public String login(){ +// return "LoginPage"; +// } +// +// @GetMapping(value = "/imageTaskView") +// public String redirect(@RequestParam String userId, Model model) { +// model.addAttribute("User", userId); +// return "old/ImageTaskTemplate"; +// } +// +// @GetMapping("/studentView") +// public String studentView(@RequestParam String userId, Model model){ +// model.addAttribute("userId", userId); +// return "StudentView"; +// } +// +// @GetMapping("/authorFromTemplateView") +// public String authorFromTemplateView(@RequestParam String userId, Model model){ +// model.addAttribute("userId", userId); +// return "AuthorFromTemplateView"; +// } +// +// @GetMapping("/authorReview") +// public String authorReview(@RequestParam String userId, Model model){ +// model.addAttribute("userId", userId); +// return "AuthorReview"; +// } +// +// +//} diff --git a/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java b/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java index f5edd2e1..b5f9a44d 100644 --- a/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java +++ b/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java @@ -1,7 +1,11 @@ package edu.ithaca.dragon.par.student; import java.util.List; +import java.util.Map; + +import edu.ithaca.dragon.par.student.json.QuestionHistory; public interface StudentModelInfo { String findQuestionSeenLeastRecently( List questionIdsToCheck); + Map getQuestionHistories(); } diff --git a/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java b/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java index d65d6d9f..2e39be74 100644 --- a/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java +++ b/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java @@ -83,4 +83,8 @@ private QuestionHistory retrieveOrCreateNewHistory(String questionId){ return questionHistory; } + public Map getQuestionHistories(){ + return questionHistories; + } + } diff --git a/src/main/resources/author/defaultCohorts.json b/src/main/resources/author/defaultCohorts.json index 7ba5e625..2f6ea28c 100644 --- a/src/main/resources/author/defaultCohorts.json +++ b/src/main/resources/author/defaultCohorts.json @@ -15,5 +15,17 @@ "type" : "QuestionChooserInOrder", "questionIdsInOrder" : [ "858-structure1-./images/2ATransverse.jpg", "850-structure3-./images/Annotated2Long.jpg", "866-plane-./images/3BTransverse.jpg", "847-structure2-./images/Annotated2Long.jpg", "614-plane-./images/3CTransverse.jpg" ] } + }, + + "byOrderedConcepts" : { + "id" : "byOrderedConcepts", + "domainId" : "HorseUltrasound", + "studentIds" : [ ], + "questionChooser" : { + "type" : "QuestionChooserByOrderedConcepts", + "conceptIds" : [ "plane", "structure", "attachment", "zone"], + "conceptScores" : [] + } } + } diff --git a/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java b/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java index e6e9f1db..6fa12984 100644 --- a/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java +++ b/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java @@ -25,37 +25,33 @@ public void createQuestionHistorySummary() throws IOException{ QuestionHistorySummary poorPerformance = new QuestionHistorySummary(QuestionHistoryTest.poorStudent(), data); assertEquals(5, poorPerformance.getQuestionIdsSeen().size()); - assertEquals(2, poorPerformance.getQuestionsRespondedTo().size()); - assertEquals(0, poorPerformance.getQuestionsCorrect().size()); - assertEquals(2, poorPerformance.getQuestionsIncorrect().size()); - assertEquals(3, poorPerformance.getQuestionIdsSeen().size() - poorPerformance.getQuestionsRespondedTo().size()); - assertEquals("majorQ", poorPerformance.getQuestionsIncorrect().get(0)); - assertEquals("yearQ", poorPerformance.getQuestionsIncorrect().get(1)); + assertEquals(2, poorPerformance.getQuestionIdsRespondedTo().size()); + assertEquals(0, poorPerformance.getQuestionIdsCorrectFirstTime().size()); + assertEquals(2, poorPerformance.getQuestionIdsIncorrect().size()); + assertEquals(3, poorPerformance.getQuestionIdsSeen().size() - poorPerformance.getQuestionIdsRespondedTo().size()); + assertEquals("majorQ", poorPerformance.getQuestionIdsIncorrect().get(0)); + assertEquals("yearQ", poorPerformance.getQuestionIdsIncorrect().get(1)); QuestionHistorySummary strongPerformance = new QuestionHistorySummary(QuestionHistoryTest.strongStudent(), data); assertEquals(5, strongPerformance.getQuestionIdsSeen().size()); - assertEquals(5, strongPerformance.getQuestionsRespondedTo().size()); - assertEquals(5, strongPerformance.getQuestionsCorrect().size()); - assertEquals("skyQ", strongPerformance.getQuestionsCorrect().get(0)); - assertEquals("mathQ", strongPerformance.getQuestionsCorrect().get(1)); - assertEquals("majorQ", strongPerformance.getQuestionsCorrect().get(2)); - assertEquals("yearQ", strongPerformance.getQuestionsCorrect().get(3)); - assertEquals("googleQ", strongPerformance.getQuestionsCorrect().get(4)); + assertEquals(5, strongPerformance.getQuestionIdsRespondedTo().size()); + assertEquals(5, strongPerformance.getQuestionIdsCorrectFirstTime().size()); + assertEquals("skyQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(0)); + assertEquals("mathQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(1)); + assertEquals("majorQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(2)); + assertEquals("yearQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(3)); + assertEquals("googleQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(4)); QuestionHistorySummary improvingPerformance = new QuestionHistorySummary(QuestionHistoryTest.improvingStudent(), data); assertEquals(5, improvingPerformance.getQuestionIdsSeen().size()); - assertEquals(4, improvingPerformance.getQuestionsRespondedTo().size()); - assertEquals(2, improvingPerformance.getQuestionsCorrect().size()); - assertEquals("mathQ", improvingPerformance.getQuestionsCorrect().get(0)); - assertEquals("majorQ", improvingPerformance.getQuestionsCorrect().get(1)); - assertEquals(2, improvingPerformance.getQuestionsIncorrect().size()); - assertEquals("yearQ", improvingPerformance.getQuestionsIncorrect().get(0)); - assertEquals("googleQ", improvingPerformance.getQuestionsIncorrect().get(1)); - assertEquals(4, improvingPerformance.getQuestionsCorrectAfterIncorrect().size()); - assertEquals("mathQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(0)); - assertEquals("majorQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(1)); - assertEquals("yearQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(2)); - assertEquals("googleQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(3)); + assertEquals(4, improvingPerformance.getQuestionIdsRespondedTo().size()); + assertEquals(2, improvingPerformance.getQuestionIdsCorrectFirstTime().size()); + assertEquals("mathQ", improvingPerformance.getQuestionIdsCorrectFirstTime().get(0)); + assertEquals("majorQ", improvingPerformance.getQuestionIdsCorrectFirstTime().get(1)); + assertEquals(1, improvingPerformance.getQuestionIdsIncorrect().size()); + assertEquals("yearQ", improvingPerformance.getQuestionIdsIncorrect().get(0)); + assertEquals(1, improvingPerformance.getQuestionIdsCorrectAfterIncorrect().size()); + assertEquals("googleQ", improvingPerformance.getQuestionIdsCorrectAfterIncorrect().get(0)); } @Test @@ -71,7 +67,7 @@ public void buildQuestionIdsSeenTest(){ @Test public void checkQuestionsRespondedTest(){ - List questionsRespondedTo = QuestionHistorySummary.checkQuestionsRespondedTo(QuestionHistoryTest.makeExamples()); + List questionsRespondedTo = QuestionHistorySummary.checkQuestionIdsRespondedTo(QuestionHistoryTest.makeExamples()); assertEquals(3, questionsRespondedTo.size()); assertEquals("q1", questionsRespondedTo.get(0)); assertEquals("q3", questionsRespondedTo.get(1)); @@ -81,40 +77,34 @@ public void checkQuestionsRespondedTest(){ @Test public void findQuestionsCorrectTest() throws IOException{ DomainDatasourceSimple data = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class)); - List questionsCorrect = QuestionHistorySummary.findQuestionsCorrect(QuestionHistoryTest.SampleQuestionsEx(), data); + List questionsCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(QuestionHistoryTest.SampleQuestionsEx(), data); assertEquals(5, data.getAllQuestions().size()); - assertEquals(2, questionsCorrect.size()); + assertEquals(1, questionsCorrect.size()); // Sample Question 1: What color is the sky? assertEquals("skyQ", questionsCorrect.get(0)); - // Sample Question 2: What is 1 + 1? - assertEquals("mathQ", questionsCorrect.get(1)); } @Test public void findQuestionsIncorrectTest() throws IOException{ DomainDatasourceSimple data = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class)); - List questionsIncorrect = QuestionHistorySummary.findQuestionsIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data); + List questionsIncorrect = QuestionHistorySummary.findQuestionIdsIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data); assertEquals(5, data.getAllQuestions().size()); assertEquals(1, questionsIncorrect.size()); - - // Sample Question 3: What is your major? - assertEquals("majorQ", questionsIncorrect.get(0)); + assertEquals("mathQ", questionsIncorrect.get(0)); } @Test public void findQuestionsCorrectAfterIncorrectTest() throws IOException{ DomainDatasourceSimple data = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class)); - List CorrectAfterIncorrect = QuestionHistorySummary.findQuestionsCorrectAfterIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data); + List CorrectAfterIncorrect = QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data); assertEquals(5, data.getAllQuestions().size()); - assertEquals(3, CorrectAfterIncorrect.size()); + assertEquals(1, CorrectAfterIncorrect.size()); // Sample Question 3: What is your major? - assertEquals("skyQ", CorrectAfterIncorrect.get(0)); - assertEquals("mathQ", CorrectAfterIncorrect.get(1)); - assertEquals("majorQ", CorrectAfterIncorrect.get(2)); + assertEquals("majorQ", CorrectAfterIncorrect.get(0)); } } \ No newline at end of file diff --git a/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java b/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java index 6c6c0b66..913ff09a 100644 --- a/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java +++ b/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java @@ -19,7 +19,7 @@ public void addStudentToCohortTest(@TempDir Path tempDir) throws IOException{ CohortDatasourceJson sample1 = new CohortDatasourceJson( "allCohorts", tempDir.toString() + "/sampleCohorts.json", - "src/test/resources/rewrite/sampleCohorts.json", + "src/test/resources/rewrite/SampleCohorts.json", new JsonIoHelperDefault() ); diff --git a/src/test/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConceptsTest.java b/src/test/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConceptsTest.java new file mode 100644 index 00000000..7f4746f8 --- /dev/null +++ b/src/test/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConceptsTest.java @@ -0,0 +1,340 @@ +package edu.ithaca.dragon.par.pedagogy; + +import edu.ithaca.dragon.par.domain.DomainDatasource; +import edu.ithaca.dragon.par.student.StudentModelDatasource; +import edu.ithaca.dragon.par.student.StudentModelInfo; +import edu.ithaca.dragon.par.student.json.QuestionHistory; +import edu.ithaca.dragon.par.student.json.StudentModelDatasourceJson; +import edu.ithaca.dragon.par.student.json.StudentModelJson; +import edu.ithaca.dragon.par.domain.DomainDatasourceJson; +import edu.ithaca.dragon.par.domain.Question; +import edu.ithaca.dragon.util.JsonIoHelperDefault; +import edu.ithaca.dragon.util.JsonUtil; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map.Entry; + +import static org.junit.jupiter.api.Assertions.*; + +class QuestionChooserByOrderedConceptsTest{ + + //level 1: sky + //level 2: math + //level 3: major + //level 4: year + //level 5: google + @Test + public void chooseQuestionTest() throws IOException{ + + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + //new Student test + StudentModelJson newStudentModel = studentModelDatasource.getStudentModel("newStudent"); + assertEquals("skyQ1",questionChooser.chooseQuestion(newStudentModel,domainDatasource).getId()); + + + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + + + + + //first concept competent test + StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent"); + + assertEquals("mathQ1",questionChooser.chooseQuestion(studentModelFirstConceptCompetent,domainDatasource).getId()); + + assertEquals(OrderedConceptRubric.COMPETENT,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + + + //first concept exemplary test + + StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + assertEquals("mathQ1",questionChooser.chooseQuestion( studentModelFirstConceptExemplary,domainDatasource).getId()); + + assertEquals(OrderedConceptRubric.EXEMPLARY,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + //all concepts answered correctly at least once test + StudentModelJson studentModelLastSeenTest = studentModelDatasource.getStudentModel("allConceptsCorrectAtLeastOnce"); + + assertEquals("skyQ3",questionChooser.chooseQuestion(studentModelLastSeenTest, domainDatasource).getId()); + + assertEquals(OrderedConceptRubric.COMPETENT,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(4).getValue()); + + //all concepts exemplary all w/ same time seen (makes all concepts developing) + + StudentModelJson studentModelAllConceptsExemplary = studentModelDatasource.getStudentModel("AllConceptsExemplary"); + assertEquals("skyQ1",questionChooser.chooseQuestion(studentModelAllConceptsExemplary,domainDatasource).getId()); + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(4).getValue()); + + StudentModelJson studentModelAllConceptsUnprepared = studentModelDatasource.getStudentModel("AllConceptsUnprepared"); + assertEquals("skyQ2",questionChooser.chooseQuestion(studentModelAllConceptsUnprepared, domainDatasource).getId()); + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + } + + @Test + public void updateConceptScoresBasedOnPerformanceDataTest() throws IOException{ + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + //new student test + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + StudentModelJson newStudent = studentModelDatasource.getStudentModel("newStudent"); + questionChooser.updateConceptScoresBasedOnPerformanceData(newStudent, domainDatasource); + + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + + + // first concept exemplary test + + questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + questionChooser.updateConceptScoresBasedOnPerformanceData(studentModelFirstConceptExemplary, domainDatasource); + + assertEquals(OrderedConceptRubric.EXEMPLARY,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + } + + @Test + public void updateConceptScoresBasedOnComparativeResultsTest() throws IOException{ + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + StudentModelJson newStudent = studentModelDatasource.getStudentModel("newStudent"); + questionChooser.updateConceptScoresBasedOnPerformanceData(newStudent, domainDatasource); + questionChooser.updateConceptScoresBasedOnComparativeResults(); + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + + + questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + questionChooser.updateConceptScoresBasedOnPerformanceData(studentModelFirstConceptExemplary, domainDatasource); + questionChooser.updateConceptScoresBasedOnComparativeResults(); + + assertEquals(OrderedConceptRubric.EXEMPLARY,questionChooser.conceptScores.get(0).getValue()); + assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue()); + assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue()); + + } + + @Test + public void calcUnpreparedTest() throws IOException{ + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + + // unprepared case + StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + Collection questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values(); + boolean isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertTrue(isUnprepared); + + // exemplary case + isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isUnprepared); + + // developing case + StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping"); + questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values(); + isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isUnprepared); + + // competent case + StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent"); + questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values(); + isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isUnprepared); + + } + + @Test + public void calcDevelopingTest() throws IOException{ + + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + // developing case + StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping"); + Collection questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values(); + boolean isDeveloping = questionChooser.calcDeveloping("sky",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertTrue(isDeveloping); + + + // unprepared case + isDeveloping = questionChooser.calcDeveloping("year",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isDeveloping); + + // exemplary case + StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values(); + isDeveloping = questionChooser.calcDeveloping("sky",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isDeveloping); + + // competent case + StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent"); + questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values(); + isDeveloping = questionChooser.calcDeveloping("sky",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isDeveloping); + } + + @Test + public void calcCompetentTest() throws IOException{ + + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + // competent case + StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent"); + Collection questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values(); + boolean isCompetent = questionChooser.calcCompetent("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertTrue(isCompetent); + + // unprepared case + isCompetent = questionChooser.calcCompetent("math", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("math", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isCompetent); + + // developing case + StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping"); + questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values(); + isCompetent = questionChooser.calcCompetent("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isCompetent); + + // exemplary case + StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values(); + isCompetent = questionChooser.calcCompetent("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isCompetent); + + } + + @Test + public void calcExemplaryTest() throws IOException{ + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts()); + + // exemplary first concept case + StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + Collection questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values(); + boolean isExemplary = questionChooser.calcExemplary("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertTrue(isExemplary); + + // developing case + StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping"); + questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values(); + isExemplary = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isExemplary); + + + // unprepared case + isExemplary = questionChooser.calcExemplary("year", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isExemplary); + + // competent case + StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent"); + questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values(); + isExemplary = questionChooser.calcExemplary("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource); + assertFalse(isExemplary); + } + + @Test + public void retrieveQuestionsFromStudentModelByConceptTest() throws IOException{ + DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json"); + StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault()); + StudentModelJson newStudentModel = studentModelDatasource.getStudentModel("newStudent"); + + assertEquals(0,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", newStudentModel.getQuestionHistories().values(), domainDatasource).size()); + + StudentModelJson firstConceptExemplaryStudentModel = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent"); + assertEquals(3,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size()); + assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("math", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size()); + assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("major", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size()); + assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size()); + assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("google", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size()); + + + } + +} diff --git a/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithMockServerTest.java b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithMockServerTest.java new file mode 100644 index 00000000..8a8883b2 --- /dev/null +++ b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithMockServerTest.java @@ -0,0 +1,35 @@ +package edu.ithaca.dragon.par.spring; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment=WebEnvironment.MOCK) +@AutoConfigureMockMvc +public class ParControllerWithMockServerTest { + + @Autowired + private MockMvc mvc; + + @Test + public void greetingTest() throws Exception{ + long start = System.currentTimeMillis(); + this.mvc.perform(get("/api2/")).andExpect(status().isOk()).andExpect(content().string("Hello from PAR api2")); + long end = System.currentTimeMillis(); + System.out.println("\nTime it took to run in ms: "+(end-start)+"\n"); + } + + +} diff --git a/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithServerTest.java b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithServerTest.java new file mode 100644 index 00000000..3d43d9c1 --- /dev/null +++ b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithServerTest.java @@ -0,0 +1,132 @@ +package edu.ithaca.dragon.par.spring; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; + +import org.apache.commons.io.FileUtils; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import edu.ithaca.dragon.par.ParServer; +import edu.ithaca.dragon.par.cohort.Cohort; +import edu.ithaca.dragon.par.cohort.CohortDatasourceJson; +import edu.ithaca.dragon.par.comm.CreateStudentAction; +import edu.ithaca.dragon.par.comm.StudentAction; +import edu.ithaca.dragon.par.domain.DomainDatasourceJson; +import edu.ithaca.dragon.par.domain.Question; +import edu.ithaca.dragon.par.student.json.StudentModelDatasourceJson; +import edu.ithaca.dragon.util.JsonIoHelperDefault; +import edu.ithaca.dragon.util.JsonIoUtil; + +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; + + + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT) +public class ParControllerWithServerTest { + + private ParController parController; + + @Autowired + private TestRestTemplate restTemplate; + + @LocalServerPort + private int port; + + private Path cohortFile; + + @BeforeEach + public void initController(@TempDir Path tempDir) throws Exception{ + Path questionPoolFile = tempDir.resolve("currentQuestionPool.json"); + Files.copy(Paths.get("src/test/resources/rewrite/testServerData/currentQuestionPool.json"),questionPoolFile); + Path studentDirectory = tempDir.resolve("student"); + FileUtils.copyDirectory(new File("src/test/resources/rewrite/testServerData/student"),studentDirectory.toFile()); + this.cohortFile = tempDir.resolve("currentCohorts.json"); + Files.copy(Paths.get("src/test/resources/rewrite/testServerData/currentCohorts.json"),cohortFile); + this.parController = new ParController( + new ParServer( + new DomainDatasourceJson( + "HorseUltrasound", + questionPoolFile.toString(), + "src/test/resources/rewrite/testServerData/currentQuestionPool.json", + new JsonIoHelperDefault() + ), + + new StudentModelDatasourceJson( + "allTestStudents", + studentDirectory.toString(), + new JsonIoHelperDefault() + ), + + //TODO: remove default users from cohort datastores once there is a viable way to add students + new CohortDatasourceJson( + "allCohorts", + cohortFile.toString(), + "src/test/resources/rewrite/testServerData/currentCohorts.json", + new JsonIoHelperDefault() + ) + + ) + ); + } + + + @Test + public void contextLoads() throws Exception{ + assertThat(this.parController).isNotNull(); + } + + + @Test + public void greetingFromServerTest(){ + long start = System.currentTimeMillis(); + assertThat(this.parController.greeting()).isEqualTo("Hello from PAR api2"); + long end = System.currentTimeMillis(); + System.out.println("\nTime it took to run in ms: "+(end-start)+"\n"); + } + + @Test + public void isUserIdAvailableTest(){ + assertThat(this.parController.isUserIdAvailable("o1")).isFalse(); + assertThat(this.parController.isUserIdAvailable("boc1")).isTrue(); + } + + @Test + public void getCohortIdsTest(){ + assertThat(this.parController.getCohortIds().contains("inOrder")).isTrue(); + assertThat(this.parController.getCohortIds().contains("byOutOfOrderConcepts")).isFalse(); + } + + @Test + public void getCurrentQuestionTest(){ + //works with attachment removed + Question questionToBeAsked = this.parController.getCurrentQuestion("bocTest"); + assertThat(questionToBeAsked.getType()).isEqualTo("plane"); + assertThat(questionToBeAsked.getId()).isEqualTo("614-plane-./images/3CTransverse.jpg"); + } + + @Test + public void addNewUserTest() throws IOException{ + // issue creating cohorts from json file when reading boc (using pair list for conceptScore) + this.parController.addNewUser(new CreateStudentAction("o5","inOrder")); + Map cohortMap = new JsonIoUtil(new JsonIoHelperDefault()).mapfromReadOnlyFile("src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json", Cohort.class); + assertThat(cohortMap.get("inOrder").studentIds.contains("o5")); + } + + +} diff --git a/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java b/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java index 62b9ba18..acbdf296 100644 --- a/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java +++ b/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java @@ -56,7 +56,7 @@ public static List SampleQuestionsEx(){ QuestionHistory q2 = new QuestionHistory("mathQ"); q2.addTimeSeen(); - q2.addResponse("2"); + q2.addResponse("3"); sample.add(q2); QuestionHistory q3 = new QuestionHistory("majorQ"); @@ -163,7 +163,7 @@ public static List improvingStudent(){ QuestionHistory year = new QuestionHistory("yearQ"); year.addTimeSeen(); year.addResponse("2021"); - year.addResponse("2020"); + //year.addResponse("2020"); improving.add(year); QuestionHistory google = new QuestionHistory("googleQ"); diff --git a/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java b/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java index fe062cbe..afce112f 100644 --- a/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java +++ b/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java @@ -1,7 +1,16 @@ package edu.ithaca.dragon.par.student.json; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import edu.ithaca.dragon.par.analysis.QuestionHistorySummary; +import edu.ithaca.dragon.par.domain.DomainDatasourceJson; +import edu.ithaca.dragon.par.domain.DomainDatasourceSimple; +import edu.ithaca.dragon.par.domain.Question; +import edu.ithaca.dragon.util.JsonUtil; + +import java.io.IOException; +import java.nio.file.Path; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -26,5 +35,20 @@ void checkTimeLastSeen() { assertEquals(8000L, poor.checkTimeLastSeen("majorQ")); assertEquals(11000L, poor.checkTimeLastSeen("yearQ")); + } + + @Test + public void ToAndFromJsonTest() throws IOException{ + StudentModelJson improvingStudent = new StudentModelJson("improvingStudent", QuestionHistoryTest.improvingStudent()); + DomainDatasourceSimple domainData = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class)); + QuestionHistorySummary qhs = new QuestionHistorySummary(improvingStudent.getQuestionHistories().values(), domainData); + + assertEquals(5, qhs.getQuestionIdsSeen().size()); + assertEquals(4, qhs.getQuestionIdsRespondedTo().size()); + assertTrue(qhs.getQuestionIdsCorrectFirstTime().contains("mathQ")); + assertTrue(qhs.getQuestionIdsCorrectFirstTime().contains("majorQ")); + + + } } \ No newline at end of file diff --git a/src/test/resources/rewrite/QuestionChooserSampleQuestions.json b/src/test/resources/rewrite/QuestionChooserSampleQuestions.json new file mode 100644 index 00000000..ab5204de --- /dev/null +++ b/src/test/resources/rewrite/QuestionChooserSampleQuestions.json @@ -0,0 +1,92 @@ +[ { + "id" : "skyQ1", + "type" : "sky", + "questionText" : "What color is the sky?", + "correctAnswer" : "blue", + "possibleAnswers" : [ "blue", "orange" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "skyQ2", + "type" : "sky", + "questionText" : "What color is the sun?", + "correctAnswer" : "yellow", + "possibleAnswers" : [ "yellow", "red" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + + }, { + "id" : "skyQ3", + "type" : "sky", + "questionText" : "What color is a cloud?", + "correctAnswer" : "white/grey", + "possibleAnswers" : [ "white/grey", "purple" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + + }, { + "id" : "mathQ1", + "type" : "math", + "questionText" : "What is 2 + 2?", + "correctAnswer" : "4", + "possibleAnswers" : [ "2", "3", "4"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "mathQ2", + "type" : "math", + "questionText" : "What is 1 + 1?", + "correctAnswer" : "2", + "possibleAnswers" : [ "2", "3", "4"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "majorQ1", + "type" : "major", + "questionText" : "What is your major?", + "correctAnswer" : "CS", + "possibleAnswers" : [ "CS", "ENG", "MATH"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "majorQ2", + "type" : "major", + "questionText" : "Which is a required course for a CS major?", + "correctAnswer" : "220", + "possibleAnswers" : [ "217", "356", "220"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "yearQ1", + "type" : "year", + "questionText" : "What was the previous year?", + "correctAnswer" : "2020", + "possibleAnswers" : [ "2021", "2019", "2018"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "yearQ2", + "type" : "year", + "questionText" : "What will next year be?", + "correctAnswer" : "2022", + "possibleAnswers" : [ "2021", "2022", "2023"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "googleQ1", + "type" : "google", + "questionText" : "When was Google founded?", + "correctAnswer" : "1998", + "possibleAnswers" : [ "1998", "2001", "2005"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "googleQ2", + "type" : "google", + "questionText" : "What color has never been in the Google logo?", + "correctAnswer" : "orange", + "possibleAnswers" : [ "yellow", "orange", "purple"], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + } +] \ No newline at end of file diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsCorrectAtLeastOnce.json b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsCorrectAtLeastOnce.json new file mode 100644 index 00000000..d202ce93 --- /dev/null +++ b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsCorrectAtLeastOnce.json @@ -0,0 +1,42 @@ +{ + "studentId" : "allConceptsCorrectAtLeastOnce", + "questionHistories" : { + "skyQ1" : { + "questionId" : "skyQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "blue", + "millSeconds" : 1623988888888} ] + }, + "skyQ2" : { + "questionId" : "skyQ2", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "yellow", + "millSeconds" : 1623988888888} ] + }, + "mathQ1" : { + "questionId" : "mathQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "4", + "millSeconds" : 1623988888888} ] + }, + "majorQ1" : { + "questionId" : "majorQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "CS", + "millSeconds" : 1623988888888} ] + }, + "yearQ1" : { + "questionId" : "yearQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "2020", + "millSeconds" : 1623988888888} ] + }, + "googleQ1" : { + "questionId" : "googleQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "1998", + "millSeconds" : 1623988888888} ] + } + } + +} \ No newline at end of file diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsExemplary.json b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsExemplary.json new file mode 100644 index 00000000..d35e1585 --- /dev/null +++ b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsExemplary.json @@ -0,0 +1,72 @@ +{ + "studentId" : "allConceptsExemplary", + "questionHistories" : { + "skyQ1" : { + "questionId" : "skyQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "blue", + "millSeconds" : 1623988888888} ] + }, + "skyQ2" : { + "questionId" : "skyQ2", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "yellow", + "millSeconds" : 1623988888888} ] + }, + "skyQ3" : { + "questionId" : "skyQ3", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "white/grey", + "millSeconds" : 1623988888888} ] + }, + "mathQ1" : { + "questionId" : "mathQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "4", + "millSeconds" : 1623988888888} ] + }, + "mathQ2" : { + "questionId" : "mathQ2", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "2", + "millSeconds" : 1623988888888} ] + }, + "majorQ1" : { + "questionId" : "majorQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "CS", + "millSeconds" : 1623988888888} ] + }, + "majorQ2" : { + "questionId" : "majorQ2", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "220", + "millSeconds" : 1623988888888} ] + }, + "yearQ1" : { + "questionId" : "yearQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "2020", + "millSeconds" : 1623988888888} ] + }, + "yearQ2" : { + "questionId" : "yearQ2", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "2022", + "millSeconds" : 1623988888888} ] + }, + "googleQ1" : { + "questionId" : "googleQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "1998", + "millSeconds" : 1623988888888} ] + }, + "googleQ2" : { + "questionId" : "googleQ2", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "orange", + "millSeconds" : 1623988888888} ] + } + } + +} \ No newline at end of file diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsUnprepared.json b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsUnprepared.json new file mode 100644 index 00000000..08b3dc41 --- /dev/null +++ b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsUnprepared.json @@ -0,0 +1,36 @@ +{ + "studentId" : "allConceptsUnprepared", + "questionHistories" : { + "skyQ1" : { + "questionId" : "skyQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "orange", + "millSeconds" : 1623988888888} ] + }, + "mathQ1" : { + "questionId" : "mathQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "2", + "millSeconds" : 1623988888888} ] + }, + "majorQ1" : { + "questionId" : "majorQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "ENG", + "millSeconds" : 1623988888888} ] + }, + "yearQ1" : { + "questionId" : "yearQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "2019", + "millSeconds" : 1623988888888} ] + }, + "googleQ1" : { + "questionId" : "googleQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "2005", + "millSeconds" : 1623988888888} ] + } + } + +} \ No newline at end of file diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptCompetentStudent.json b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptCompetentStudent.json new file mode 100644 index 00000000..9089a48b --- /dev/null +++ b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptCompetentStudent.json @@ -0,0 +1,25 @@ +{ + "studentId" : "firstConceptCompetentStudent", + "questionHistories" : { + "skyQ1" : { + "questionId" : "skyQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "blue", + "millSeconds" : 1623988888888} ] + }, + "skyQ2" : { + "questionId" : "skyQ2", + "timesSeen" : [ 1623999999999 ], + "responses" : [ {"responseText" : "red", + "millSeconds" : 1624000000005} ] + }, + "skyQ3" : { + "questionId" : "skyQ3", + "timesSeen" : [ 1624000000105 ], + "responses" : [ {"responseText" : "white/grey", + "millSeconds" : 1624000000005} ] + } + + + } +} \ No newline at end of file diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptDeveloping.json b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptDeveloping.json new file mode 100644 index 00000000..15664196 --- /dev/null +++ b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptDeveloping.json @@ -0,0 +1,12 @@ +{ + "studentId" : "firstConceptDeveloping", + "questionHistories" : { + "skyQ1" : { + "questionId" : "skyQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "blue", + "millSeconds" : 1623988888888} ] + } + } + +} \ No newline at end of file diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptExemplaryStudent.json b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptExemplaryStudent.json new file mode 100644 index 00000000..4e1ae566 --- /dev/null +++ b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptExemplaryStudent.json @@ -0,0 +1,23 @@ +{ + "studentId" : "firstConceptExemplaryStudent", + "questionHistories" : { + "skyQ1" : { + "questionId" : "skyQ1", + "timesSeen" : [ 1623971804511 ], + "responses" : [ {"responseText" : "blue", + "millSeconds" : 1623988888888} ] + }, + "skyQ2" : { + "questionId" : "skyQ2", + "timesSeen" : [ 1623999999999 ], + "responses" : [ {"responseText" : "yellow", + "millSeconds" : 1624000000005} ] + }, + "skyQ3" : { + "questionId" : "skyQ3", + "timesSeen" : [ 1624000000105 ], + "responses" : [ {"responseText" : "white/grey", + "millSeconds" : 1624000000005} ] + } + } +} \ No newline at end of file diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/newStudent.json b/src/test/resources/rewrite/questionChooserSampleStudents/newStudent.json new file mode 100644 index 00000000..71f059e0 --- /dev/null +++ b/src/test/resources/rewrite/questionChooserSampleStudents/newStudent.json @@ -0,0 +1,4 @@ +{ + "studentId" : "newStudent", + "questionHistories" : { } +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/currentCohorts.json b/src/test/resources/rewrite/testServerData/currentCohorts.json new file mode 100644 index 00000000..50d99dda --- /dev/null +++ b/src/test/resources/rewrite/testServerData/currentCohorts.json @@ -0,0 +1,29 @@ +{ + "random" : { + "id" : "random", + "domainId" : "HorseUltrasound", + "studentIds" : [ "r2", "r3", "r1" ], + "questionChooser" : { + "type" : "QuestionChooserRandom" + } + }, + "inOrder" : { + "id" : "inOrder", + "domainId" : "HorseUltrasound", + "studentIds" : [ "o1", "o2", "o3", "o4" ], + "questionChooser" : { + "type" : "QuestionChooserInOrder", + "questionIdsInOrder" : [ "858-structure1-./images/2ATransverse.jpg", "850-structure3-./images/Annotated2Long.jpg", "866-plane-./images/3BTransverse.jpg", "847-structure2-./images/Annotated2Long.jpg", "614-plane-./images/3CTransverse.jpg" ] + } + }, + "byOrderedConcepts" : { + "id" : "byOrderedConcepts", + "domainId" : "HorseUltrasound", + "studentIds" : [ "bocTest" ], + "questionChooser" : { + "type" : "QuestionChooserByOrderedConcepts", + "conceptScores" : [ ], + "conceptIds" : [ "plane", "structure", "zone" ] + } + } +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json b/src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json new file mode 100644 index 00000000..45b4410d --- /dev/null +++ b/src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json @@ -0,0 +1,19 @@ +{ + "random" : { + "id" : "random", + "domainId" : "HorseUltrasound", + "studentIds" : [ "r2", "r3", "r1" ], + "questionChooser" : { + "type" : "QuestionChooserRandom" + } + }, + "inOrder" : { + "id" : "inOrder", + "domainId" : "HorseUltrasound", + "studentIds" : [ "o1", "o2", "o3", "o4" ], + "questionChooser" : { + "type" : "QuestionChooserInOrder", + "questionIdsInOrder" : [ "858-structure1-./images/2ATransverse.jpg", "850-structure3-./images/Annotated2Long.jpg", "866-plane-./images/3BTransverse.jpg", "847-structure2-./images/Annotated2Long.jpg", "614-plane-./images/3CTransverse.jpg" ] + } + } + } \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/currentQuestionPool.json b/src/test/resources/rewrite/testServerData/currentQuestionPool.json new file mode 100644 index 00000000..b3781e30 --- /dev/null +++ b/src/test/resources/rewrite/testServerData/currentQuestionPool.json @@ -0,0 +1,1969 @@ +[ { + "id" : "614-plane-./images/3CTransverse.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "617-structure0-./images/3CTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is in the near field?", + "correctAnswer" : "palmar annular ligament", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "620-structure1-./images/3CTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1 cm deep?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ { + "id" : "618-attachment0-structure1-./images/3CTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "619-attachment1-structure1-./images/3CTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "623-structure2-./images/3CTransverse.jpg", + "type" : "structure", + "questionText" : "What are the hyperechoic structures 2.5 cm deep?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "626-structure3-./images/3CTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1.5 cm deep?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ { + "id" : "624-attachment0-structure3-./images/3CTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "625-attachment1-structure3-./images/3CTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "Distal phalanx (P3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "627-zone-./images/3CTransverse.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3c", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/3CTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "628-plane-./images/Zone3Longitudinal.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "longitudinal (long axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ ] +}, { + "id" : "631-structure0-./images/Zone3Longitudinal.jpg", + "type" : "structure", + "questionText" : "What is the hyperechoic structure 4.5 cm deep?", + "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ ] +}, { + "id" : "634-structure1-./images/Zone3Longitudinal.jpg", + "type" : "structure", + "questionText" : "What structure is 1 cm deep?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ { + "id" : "632-attachment0-structure1-./images/Zone3Longitudinal.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ ] + }, { + "id" : "633-attachment1-structure1-./images/Zone3Longitudinal.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "637-structure2-./images/Zone3Longitudinal.jpg", + "type" : "structure", + "questionText" : "What structure is 1.5 cm deep?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ { + "id" : "635-attachment0-structure2-./images/Zone3Longitudinal.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ ] + }, { + "id" : "636-attachment1-structure2-./images/Zone3Longitudinal.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "641-zone-./images/Zone3Longitudinal.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Zone3Longitudinal.jpg", + "followupQuestions" : [ ] +}, { + "id" : "656-plane-./images/Annotated3ATrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "659-structure0-./images/Annotated3ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the blue stars?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ { + "id" : "657-attachment0-structure0-./images/Annotated3ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "658-attachment1-structure0-./images/Annotated3ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "662-structure1-./images/Annotated3ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the green star?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ { + "id" : "660-attachment0-structure1-./images/Annotated3ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "661-attachment1-structure1-./images/Annotated3ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "665-structure2-./images/Annotated3ATrans.jpg", + "type" : "structure", + "questionText" : "What structures are indicated by the white stars?", + "correctAnswer" : "palmar metacarpal vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "668-structure3-./images/Annotated3ATrans.jpg", + "type" : "structure", + "questionText" : "What structures are indicated by the orange stars?", + "correctAnswer" : "suspensory ligament (branches)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ { + "id" : "666-attachment0-structure3-./images/Annotated3ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "667-attachment1-structure3-./images/Annotated3ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "669-zone-./images/Annotated3ATrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated3ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "670-plane-./images/ExtraAnnotated1ATrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "673-structure0-./images/ExtraAnnotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the green line?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "671-attachment0-structure0-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "672-attachment1-structure0-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "676-structure1-./images/ExtraAnnotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the blue line?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "674-attachment0-structure1-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "675-attachment1-structure1-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "679-structure2-./images/ExtraAnnotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the red line?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "677-attachment0-structure2-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "678-attachment1-structure2-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "682-structure3-./images/ExtraAnnotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow line?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "680-attachment0-structure3-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "681-attachment1-structure3-./images/ExtraAnnotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "683-zone-./images/ExtraAnnotated1ATrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "1a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "684-plane-./images/Annotated2ATrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "687-structure0-./images/Annotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structures are indicated by the white lines?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "690-structure1-./images/Annotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the blue line?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ { + "id" : "688-attachment0-structure1-./images/Annotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "689-attachment1-structure1-./images/Annotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "693-structure2-./images/Annotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow line?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ { + "id" : "691-attachment0-structure2-./images/Annotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "692-attachment1-structure2-./images/Annotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "696-structure3-./images/Annotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the green line?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ { + "id" : "694-attachment0-structure3-./images/Annotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "695-attachment1-structure3-./images/Annotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "697-zone-./images/Annotated2ATrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "2a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated2ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "698-plane-./images/Annotated3BTrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "701-structure0-./images/Annotated3BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the white stars?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ { + "id" : "699-attachment0-structure0-./images/Annotated3BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "700-attachment1-structure0-./images/Annotated3BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "704-structure1-./images/Annotated3BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the red star?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ { + "id" : "702-attachment0-structure1-./images/Annotated3BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "703-attachment1-structure1-./images/Annotated3BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "707-structure2-./images/Annotated3BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow star?", + "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "710-structure3-./images/Annotated3BTrans.jpg", + "type" : "structure", + "questionText" : "What structures are indicated by the blue stars?", + "correctAnswer" : "suspensory ligament (branches)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ { + "id" : "708-attachment0-structure3-./images/Annotated3BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "709-attachment1-structure3-./images/Annotated3BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "711-zone-./images/Annotated3BTrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3b", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated3BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "712-plane-./images/Annotated3CTrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "715-structure0-./images/Annotated3CTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the white stars?", + "correctAnswer" : "palmar annular ligament", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "718-structure1-./images/Annotated3CTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow star?", + "correctAnswer" : "palmar ligament", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "721-structure2-./images/Annotated3CTrans.jpg", + "type" : "structure", + "questionText" : "What structures are indicated by the red stars?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "724-structure3-./images/Annotated3CTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the green stars?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ { + "id" : "722-attachment0-structure3-./images/Annotated3CTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "723-attachment1-structure3-./images/Annotated3CTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "725-zone-./images/Annotated3CTrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3c", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated3CTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "726-plane-./images/1BTransverse.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "729-structure0-./images/1BTransverse.jpg", + "type" : "structure", + "questionText" : "What soft tissue structure is in the far field?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ { + "id" : "727-attachment0-structure0-./images/1BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "728-attachment1-structure0-./images/1BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "732-structure1-./images/1BTransverse.jpg", + "type" : "structure", + "questionText" : "What hypoechoic structures are 2.5 cm deep?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "735-structure2-./images/1BTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 2 cm deep?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ { + "id" : "733-attachment0-structure2-./images/1BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "734-attachment1-structure2-./images/1BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "738-structure3-./images/1BTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is in the near field?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ { + "id" : "736-attachment0-structure3-./images/1BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "737-attachment1-structure3-./images/1BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "739-zone-./images/1BTransverse.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "1b", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/1BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "740-plane-./images/AlternativeZone2Long.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "longitudinal (long axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "743-structure0-./images/AlternativeZone2Long.jpg", + "type" : "structure", + "questionText" : "What is the hypoechoic structure?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "746-structure1-./images/AlternativeZone2Long.jpg", + "type" : "structure", + "questionText" : "What structure is 2 cm deep?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ { + "id" : "744-attachment0-structure1-./images/AlternativeZone2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "745-attachment1-structure1-./images/AlternativeZone2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "749-structure2-./images/AlternativeZone2Long.jpg", + "type" : "structure", + "questionText" : "What structure is 1 cm deep?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ { + "id" : "747-attachment0-structure2-./images/AlternativeZone2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "748-attachment1-structure2-./images/AlternativeZone2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "752-structure3-./images/AlternativeZone2Long.jpg", + "type" : "structure", + "questionText" : "What structure is 1.5 cm deep?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ { + "id" : "750-attachment0-structure3-./images/AlternativeZone2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "751-attachment1-structure3-./images/AlternativeZone2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "753-zone-./images/AlternativeZone2Long.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "2", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/AlternativeZone2Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "754-plane-./images/Annotated1ATrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "757-structure0-./images/Annotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the orange star?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "755-attachment0-structure0-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "756-attachment1-structure0-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "760-structure1-./images/Annotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the green star?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "758-attachment0-structure1-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "759-attachment1-structure1-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "763-structure2-./images/Annotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the blue star?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "761-attachment0-structure2-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "762-attachment1-structure2-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "766-structure3-./images/Annotated1ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the red star?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ { + "id" : "764-attachment0-structure3-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "765-attachment1-structure3-./images/Annotated1ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "767-zone-./images/Annotated1ATrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "1a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated1ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "768-plane-./images/1ATransverse.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "771-structure0-./images/1ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1 cm deep?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ { + "id" : "769-attachment0-structure0-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "770-attachment1-structure0-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "774-structure1-./images/1ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1.5 cm deep?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ { + "id" : "772-attachment0-structure1-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "773-attachment1-structure1-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "777-structure2-./images/1ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 2.5 cm deep?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ { + "id" : "775-attachment0-structure2-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "776-attachment1-structure2-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "780-structure3-./images/1ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 3.5 cm deep?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ { + "id" : "778-attachment0-structure3-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "779-attachment1-structure3-./images/1ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "781-zone-./images/1ATransverse.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "1a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/1ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "782-plane-./images/Annotated3Long.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "longitudinal (long axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "785-structure0-./images/Annotated3Long.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the red stars?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ { + "id" : "783-attachment0-structure0-./images/Annotated3Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "784-attachment1-structure0-./images/Annotated3Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "788-structure1-./images/Annotated3Long.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the blue stars?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ { + "id" : "786-attachment0-structure1-./images/Annotated3Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "787-attachment1-structure1-./images/Annotated3Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "791-structure2-./images/Annotated3Long.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow star?", + "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "795-zone-./images/Annotated3Long.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated3Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "796-plane-./images/2BTransverse.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "799-structure0-./images/2BTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 3 cm deep?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ { + "id" : "797-attachment0-structure0-./images/2BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "798-attachment1-structure0-./images/2BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "802-structure1-./images/2BTransverse.jpg", + "type" : "structure", + "questionText" : "What are the hypoechoic structures 2.5 cm deep?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "805-structure2-./images/2BTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1.5 cm deep?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ { + "id" : "803-attachment0-structure2-./images/2BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "804-attachment1-structure2-./images/2BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "808-structure3-./images/2BTransverse.jpg", + "type" : "structure", + "questionText" : "What is the structure in the near field? ", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ { + "id" : "806-attachment0-structure3-./images/2BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "807-attachment1-structure3-./images/2BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "809-zone-./images/2BTransverse.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "2b", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/2BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "810-plane-./images/Annotated2BTrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "813-structure0-./images/Annotated2BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the blue star?", + "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "816-structure1-./images/Annotated2BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the green star?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ { + "id" : "814-attachment0-structure1-./images/Annotated2BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "815-attachment1-structure1-./images/Annotated2BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "819-structure2-./images/Annotated2BTrans.jpg", + "type" : "structure", + "questionText" : "What structures are indicated by the white stars?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "822-structure3-./images/Annotated2BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow star?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ { + "id" : "820-attachment0-structure3-./images/Annotated2BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "821-attachment1-structure3-./images/Annotated2BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "823-zone-./images/Annotated2BTrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "2b", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated2BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "824-plane-./images/3ATransverse.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "827-structure0-./images/3ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is in the near field?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ { + "id" : "825-attachment0-structure0-./images/3ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "826-attachment1-structure0-./images/3ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "830-structure1-./images/3ATransverse.jpg", + "type" : "structure", + "questionText" : "What are the soft tissue structures in the far field?", + "correctAnswer" : "suspensory ligament (branches)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ { + "id" : "828-attachment0-structure1-./images/3ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "829-attachment1-structure1-./images/3ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "833-structure2-./images/3ATransverse.jpg", + "type" : "structure", + "questionText" : "What are the hypoechoic structures?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "836-structure3-./images/3ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1.5 cm deep?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ { + "id" : "834-attachment0-structure3-./images/3ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "835-attachment1-structure3-./images/3ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "837-zone-./images/3ATransverse.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/3ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "838-plane-./images/Annotated2Long.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "longitudinal (long axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "841-structure0-./images/Annotated2Long.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the white stars?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ { + "id" : "839-attachment0-structure0-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "840-attachment1-structure0-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "844-structure1-./images/Annotated2Long.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow stars?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ { + "id" : "842-attachment0-structure1-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "843-attachment1-structure1-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "847-structure2-./images/Annotated2Long.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the red stars?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ { + "id" : "845-attachment0-structure2-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "846-attachment1-structure2-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "850-structure3-./images/Annotated2Long.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the green stars?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ { + "id" : "848-attachment0-structure3-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "849-attachment1-structure3-./images/Annotated2Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "851-zone-./images/Annotated2Long.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "2", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated2Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "852-plane-./images/2ATransverse.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "855-structure0-./images/2ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 3.5 cm deep?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ { + "id" : "853-attachment0-structure0-./images/2ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "854-attachment1-structure0-./images/2ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "858-structure1-./images/2ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure has joined with the structure 1.5 cm deep?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ { + "id" : "856-attachment0-structure1-./images/2ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "857-attachment1-structure1-./images/2ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "861-structure2-./images/2ATransverse.jpg", + "type" : "structure", + "questionText" : "What is the hypoechoic structure 2.5 cm deep?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "864-structure3-./images/2ATransverse.jpg", + "type" : "structure", + "questionText" : "What structure is in the near field?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ { + "id" : "862-attachment0-structure3-./images/2ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "863-attachment1-structure3-./images/2ATransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "865-zone-./images/2ATransverse.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "2a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/2ATransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "866-plane-./images/3BTransverse.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "869-structure0-./images/3BTransverse.jpg", + "type" : "structure", + "questionText" : "What structures are 3 cm deep?", + "correctAnswer" : "suspensory ligament (branches)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ { + "id" : "867-attachment0-structure0-./images/3BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "868-attachment1-structure0-./images/3BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "872-structure1-./images/3BTransverse.jpg", + "type" : "structure", + "questionText" : "What hyperechoic structure is in the far field?", + "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "875-structure2-./images/3BTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1 cm deep?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ { + "id" : "873-attachment0-structure2-./images/3BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "874-attachment1-structure2-./images/3BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "878-structure3-./images/3BTransverse.jpg", + "type" : "structure", + "questionText" : "What structure is 1.5 cm deep?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ { + "id" : "876-attachment0-structure3-./images/3BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] + }, { + "id" : "877-attachment1-structure3-./images/3BTransverse.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "879-zone-./images/3BTransverse.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "3b", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/3BTransverse.jpg", + "followupQuestions" : [ ] +}, { + "id" : "880-plane-./images/AlternativeZone1Long.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "longitudinal (long axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "883-structure0-./images/AlternativeZone1Long.jpg", + "type" : "structure", + "questionText" : "What is the hyperechoic structure in the far field?", + "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "886-structure1-./images/AlternativeZone1Long.jpg", + "type" : "structure", + "questionText" : "What structure is 3.5 cm deep?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ { + "id" : "884-attachment0-structure1-./images/AlternativeZone1Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "885-attachment1-structure1-./images/AlternativeZone1Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "889-structure2-./images/AlternativeZone1Long.jpg", + "type" : "structure", + "questionText" : "What structure is 2 cm deep?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ { + "id" : "887-attachment0-structure2-./images/AlternativeZone1Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "888-attachment1-structure2-./images/AlternativeZone1Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "892-structure3-./images/AlternativeZone1Long.jpg", + "type" : "structure", + "questionText" : "What structure is in the near field?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ { + "id" : "890-attachment0-structure3-./images/AlternativeZone1Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] + }, { + "id" : "891-attachment1-structure3-./images/AlternativeZone1Long.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "893-zone-./images/AlternativeZone1Long.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "1", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/AlternativeZone1Long.jpg", + "followupQuestions" : [ ] +}, { + "id" : "600-plane-./images/Annotated1BTrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "603-structure0-./images/Annotated1BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the orange star?", + "correctAnswer" : "superficial digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ { + "id" : "601-attachment0-structure0-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "602-attachment1-structure0-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "both proximal and middle phalanxes", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "606-structure1-./images/Annotated1BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the white star?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ { + "id" : "604-attachment0-structure1-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "605-attachment1-structure1-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "609-structure2-./images/Annotated1BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the yellow star?", + "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ { + "id" : "607-attachment0-structure2-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "608-attachment1-structure2-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "612-structure3-./images/Annotated1BTrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the blue star?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ { + "id" : "610-attachment0-structure3-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "611-attachment1-structure3-./images/Annotated1BTrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "613-zone-./images/Annotated1BTrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "1b", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/Annotated1BTrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "642-plane-./images/AddlAnnotated2ATrans.jpg", + "type" : "plane", + "questionText" : "On which plane is the ultrasound taken?", + "correctAnswer" : "transverse (short axis)", + "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "645-structure0-./images/AddlAnnotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the white star?", + "correctAnswer" : "deep digital flexor tendon", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ { + "id" : "643-attachment0-structure0-./images/AddlAnnotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "medial humeral epicondyle", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "644-attachment1-structure0-./images/AddlAnnotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "distal phalanx (p3)", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "648-structure1-./images/AddlAnnotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the orange star?", + "correctAnswer" : "suspensory ligament (body)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ { + "id" : "646-attachment0-structure1-./images/AddlAnnotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s proximal attachment?", + "correctAnswer" : "proximal metacarpus 3", + "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] + }, { + "id" : "647-attachment1-structure1-./images/AddlAnnotated2ATrans.jpg", + "type" : "attachment", + "questionText" : "What is this structure’s distal attachment?", + "correctAnswer" : "proximal sesamoid bones", + "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] + } ] +}, { + "id" : "651-structure2-./images/AddlAnnotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structure is indicated by the red star?", + "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "654-structure3-./images/AddlAnnotated2ATrans.jpg", + "type" : "structure", + "questionText" : "What structures are indicated by the green stars?", + "correctAnswer" : "palmar vessels (medial/lateral)", + "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] +}, { + "id" : "655-zone-./images/AddlAnnotated2ATrans.jpg", + "type" : "zone", + "questionText" : "In which zone is the ultrasound taken?", + "correctAnswer" : "2a", + "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ], + "imageUrl" : "./images/AddlAnnotated2ATrans.jpg", + "followupQuestions" : [ ] +} ] \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/bocTest.json b/src/test/resources/rewrite/testServerData/student/bocTest.json new file mode 100644 index 00000000..42d776e1 --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/bocTest.json @@ -0,0 +1,4 @@ +{ + "studentId" : "bocTest", + "questionHistories" : {} +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/o1.json b/src/test/resources/rewrite/testServerData/student/o1.json new file mode 100644 index 00000000..ee0f9c25 --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/o1.json @@ -0,0 +1,37 @@ +{ + "studentId" : "o1", + "questionHistories" : { + "847-structure2-./images/Annotated2Long.jpg" : { + "questionId" : "847-structure2-./images/Annotated2Long.jpg", + "timesSeen" : [ 1625259814533 ], + "responses" : [ ] + }, + "858-structure1-./images/2ATransverse.jpg" : { + "questionId" : "858-structure1-./images/2ATransverse.jpg", + "timesSeen" : [ 1625259604756 ], + "responses" : [ { + "responseText" : "Suspensory ligament (body)", + "millSeconds" : 1625259624283 + }, { + "responseText" : "... I don't know", + "millSeconds" : 1625259628254 + } ] + }, + "850-structure3-./images/Annotated2Long.jpg" : { + "questionId" : "850-structure3-./images/Annotated2Long.jpg", + "timesSeen" : [ 1625259631255 ], + "responses" : [ { + "responseText" : "... I don't know", + "millSeconds" : 1625259635860 + } ] + }, + "866-plane-./images/3BTransverse.jpg" : { + "questionId" : "866-plane-./images/3BTransverse.jpg", + "timesSeen" : [ 1625259636802 ], + "responses" : [ { + "responseText" : "transverse (short axis)", + "millSeconds" : 1625259640814 + } ] + } + } +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/o2.json b/src/test/resources/rewrite/testServerData/student/o2.json new file mode 100644 index 00000000..c3552184 --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/o2.json @@ -0,0 +1,4 @@ +{ + "studentId" : "o2", + "questionHistories" : [ ] +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/o3.json b/src/test/resources/rewrite/testServerData/student/o3.json new file mode 100644 index 00000000..9e7183f5 --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/o3.json @@ -0,0 +1,4 @@ +{ + "studentId" : "o3", + "questionHistories" : [ ] +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/o4.json b/src/test/resources/rewrite/testServerData/student/o4.json new file mode 100644 index 00000000..1f992b55 --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/o4.json @@ -0,0 +1,4 @@ +{ + "studentId" : "o4", + "questionHistories" : [ ] +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/r1.json b/src/test/resources/rewrite/testServerData/student/r1.json new file mode 100644 index 00000000..644142ae --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/r1.json @@ -0,0 +1,4 @@ +{ + "studentId" : "r1", + "questionHistories" : [ ] +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/r2.json b/src/test/resources/rewrite/testServerData/student/r2.json new file mode 100644 index 00000000..73d5bcc9 --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/r2.json @@ -0,0 +1,4 @@ +{ + "studentId" : "r2", + "questionHistories" : [ ] +} \ No newline at end of file diff --git a/src/test/resources/rewrite/testServerData/student/r3.json b/src/test/resources/rewrite/testServerData/student/r3.json new file mode 100644 index 00000000..309f84ff --- /dev/null +++ b/src/test/resources/rewrite/testServerData/student/r3.json @@ -0,0 +1,4 @@ +{ + "studentId" : "r3", + "questionHistories" : [ ] +} \ No newline at end of file