use of uk.ac.ebi.spot.goci.curation.model.MappingDetails in project goci by EBISPOT.
the class AssociationController method validateUnapproved.
/**
- * Run mapping pipeline on all SNPs in a study
- *
- * @param studyId Study ID in database
- * @param redirectAttributes attributes for a redirect scenario
- */
@RequestMapping(value = "/studies/{studyId}/associations/validate_unapproved", produces = MediaType.TEXT_HTML_VALUE, method = RequestMethod.GET)
public String validateUnapproved(@PathVariable Long studyId, RedirectAttributes redirectAttributes, Model model, HttpServletRequest request) throws // @RequestParam(required = false) Long associationId)
EnsemblMappingException {
Study study = studyRepository.findOne(studyId);
// For the study get all associations
Collection<Association> studyAssociations = associationRepository.findByStudyId(studyId);
for (Association associationToValidate : studyAssociations) {
if (!associationToValidate.getSnpApproved()) {
String measurementType = associationOperationsService.determineIfAssociationIsOrType(associationToValidate);
List<AssociationValidationView> criticalErrors = new ArrayList<>();
if (associationToValidate.getSnpInteraction()) {
criticalErrors = associationOperationsService.checkSnpAssociationInteractionFormErrors((SnpAssociationInteractionForm) associationOperationsService.generateForm(associationToValidate), measurementType);
} else {
criticalErrors = associationOperationsService.checkSnpAssociationFormErrors((SnpAssociationStandardMultiForm) associationOperationsService.generateForm(associationToValidate), measurementType);
}
//if an association has critical errors, go straight to that association
if (!criticalErrors.isEmpty()) {
model.addAttribute("study", study);
model.addAttribute("measurementType", measurementType);
// Get mapping details
model.addAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToValidate));
// Return any association errors
model.addAttribute("errors", criticalErrors);
model.addAttribute("criticalErrorsFound", true);
if (associationToValidate.getSnpInteraction()) {
model.addAttribute("form", associationOperationsService.generateForm(associationToValidate));
return "redirect:/associations/" + associationToValidate.getId();
// return "edit_snp_interaction_association";
} else {
model.addAttribute("form", associationOperationsService.generateForm(associationToValidate));
// Determine view
if (associationToValidate.getMultiSnpHaplotype()) {
return "redirect:/associations/" + associationToValidate.getId();
// return "edit_multi_snp_association";
} else {
// return "edit_standard_snp_association";
return "redirect:/associations/" + associationToValidate.getId();
}
}
} else // if there are no criticial errors, save the validation and go to the next association
{
// Save and validate form
String eRelease = ensemblRestTemplateService.getRelease();
Collection<AssociationValidationView> errors = associationOperationsService.validateAndSaveAssociation(study, associationToValidate, currentUserDetailsService.getUserFromRequest(request), eRelease);
// Determine if we have any errors rather than warnings
long errorCount = errors.stream().filter(validationError -> !validationError.getWarning()).count();
//if there are errors rather than warnings, go straight to the page to edit
if (errorCount > 0) {
model.addAttribute("study", study);
model.addAttribute("measurementType", measurementType);
// Get mapping details for association we're editing
model.addAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToValidate));
model.addAttribute("errors", errors);
model.addAttribute("criticalErrorsFound", true);
if (associationToValidate.getSnpInteraction()) {
model.addAttribute("form", associationOperationsService.generateForm(associationToValidate));
// return "edit_snp_interaction_association";
return "redirect:/associations/" + associationToValidate.getId();
} else {
model.addAttribute("form", associationOperationsService.generateForm(associationToValidate));
// Determine view
if (associationToValidate.getMultiSnpHaplotype()) {
// return "edit_multi_snp_association";
return "redirect:/associations/" + associationToValidate.getId();
} else {
// return "edit_standard_snp_association";
return "redirect:/associations/" + associationToValidate.getId();
}
}
}
}
}
}
String message = "Mapping complete, please check for any errors displayed in the 'Errors' column";
redirectAttributes.addFlashAttribute("mappingComplete", message);
return "redirect:/studies/" + studyId + "/associations";
}
use of uk.ac.ebi.spot.goci.curation.model.MappingDetails in project goci by EBISPOT.
the class AssociationController method viewAssociation.
/* Existing association information */
// View association information
@RequestMapping(value = "/associations/{associationId}", produces = MediaType.TEXT_HTML_VALUE, method = RequestMethod.GET)
public String viewAssociation(Model model, @PathVariable Long associationId) {
// Return association with that ID
Association associationToView = associationRepository.findOne(associationId);
// Get mapping details
MappingDetails mappingDetails = associationOperationsService.createMappingDetails(associationToView);
model.addAttribute("mappingDetails", mappingDetails);
// Return any association errors
model.addAttribute("errors", associationValidationReportService.generateAssociationWarningsListView(associationId));
// Establish study
Long studyId = associationToView.getStudy().getId();
// Also passes back study object to view so we can create links back to main study page
model.addAttribute("study", studyRepository.findOne(studyId));
// Determine if association is an OR or BETA type
String measurementType = associationOperationsService.determineIfAssociationIsOrType(associationToView);
model.addAttribute("measurementType", measurementType);
// Determine form to return
SnpAssociationForm form = associationOperationsService.generateForm(associationToView);
model.addAttribute("form", form);
// Determine page to return
if (associationToView.getSnpInteraction() != null && associationToView.getSnpInteraction()) {
return "edit_snp_interaction_association";
} else if (associationToView.getMultiSnpHaplotype() != null && associationToView.getMultiSnpHaplotype()) {
return "edit_multi_snp_association";
} else {
return "edit_standard_snp_association";
}
}
use of uk.ac.ebi.spot.goci.curation.model.MappingDetails in project goci by EBISPOT.
the class AssociationController method addColEditMode.
// Add single column to table
@RequestMapping(value = "/associations/{associationId}", params = { "addCol" })
public String addColEditMode(SnpAssociationInteractionForm snpAssociationInteractionForm, Model model, @PathVariable Long associationId) {
snpAssociationInteractionForm.getSnpFormColumns().add(new SnpFormColumn());
// Pass back updated form
model.addAttribute("form", snpAssociationInteractionForm);
// Also passes back study object to view so we can create links back to main study page
Association currentAssociation = associationRepository.findOne(associationId);
Study associationStudy = currentAssociation.getStudy();
Long studyId = associationStudy.getId();
model.addAttribute("study", studyRepository.findOne(studyId));
// Determine if association is an OR or BETA type
String measurementType = associationOperationsService.determineIfAssociationIsOrType(currentAssociation);
model.addAttribute("measurementType", measurementType);
// Get mapping details
MappingDetails mappingDetails = associationOperationsService.createMappingDetails(currentAssociation);
model.addAttribute("mappingDetails", mappingDetails);
// Return any association errors
model.addAttribute("errors", associationValidationReportService.generateAssociationWarningsListView(associationId));
return "edit_snp_interaction_association";
}
use of uk.ac.ebi.spot.goci.curation.model.MappingDetails in project goci by EBISPOT.
the class AssociationController method performValidation.
@Async
private void performValidation(Model model, HttpSession session, Study study, SecureUser user) {
Future<Boolean> future = executorService.submit(() -> {
Collection<Association> studyAssociations = associationService.findAllByStudyId(study.getId());
for (Association associationToValidate : studyAssociations) {
if (!associationToValidate.getSnpApproved()) {
String measurementType = associationOperationsService.determineIfAssociationIsOrType(associationToValidate);
List<AssociationValidationView> criticalErrors = new ArrayList<>();
if (associationToValidate.getSnpInteraction()) {
criticalErrors = associationOperationsService.checkSnpAssociationInteractionFormErrorsForView((SnpAssociationInteractionForm) associationOperationsService.generateForm(associationToValidate), measurementType);
} else {
criticalErrors = associationOperationsService.checkSnpAssociationFormErrors((SnpAssociationStandardMultiForm) associationOperationsService.generateForm(associationToValidate), measurementType);
}
// if an association has critical errors, go straight to that association
if (!criticalErrors.isEmpty()) {
session.setAttribute("measurementType", measurementType);
// Get mapping details
session.setAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToValidate));
// Return any association errors
session.setAttribute("errors", criticalErrors);
session.setAttribute("criticalErrorsFound", true);
session.setAttribute("associationId", associationToValidate.getId());
break;
} else // if there are no criticial errors, save the validation and go to the next association
{
// Save and validate form
String eRelease = ensemblRestTemplateService.getRelease();
Collection<AssociationValidationView> errors = associationOperationsService.validateAndSaveAssociation(study, associationToValidate, user, eRelease);
// Determine if we have any errors rather than warnings
long errorCount = errors.stream().filter(validationError -> !validationError.getWarning()).count();
// if there are errors rather than warnings, go straight to the page to edit
if (errorCount > 0) {
session.setAttribute("study", study);
session.setAttribute("measurementType", measurementType);
// Get mapping details for association we're editing
session.setAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToValidate));
session.setAttribute("errors", errors);
session.setAttribute("criticalErrorsFound", true);
session.setAttribute("associationId", associationToValidate.getId());
break;
}
}
}
}
session.setAttribute("done", true);
return true;
});
session.setAttribute("future", future);
}
use of uk.ac.ebi.spot.goci.curation.model.MappingDetails in project goci by EBISPOT.
the class AssociationController method editAssociation.
// Edit existing association
// We tried to remap if the snp or genes changed.
// TODO : implement something for SNP:SNP iteration. Actually we remap.
@RequestMapping(value = "/associations/{associationId}", produces = MediaType.TEXT_HTML_VALUE, method = RequestMethod.POST)
public // TODO COULD REFACTOR TO JUST USE SUPERCLASS AS METHOD PARAMETER
String editAssociation(@ModelAttribute SnpAssociationStandardMultiForm snpAssociationStandardMultiForm, @ModelAttribute SnpAssociationInteractionForm snpAssociationInteractionForm, @PathVariable Long associationId, @RequestParam(value = "associationtype", required = true) String associationType, Model model, HttpServletRequest request, RedirectAttributes redirectAttributes) throws EnsemblMappingException {
// Establish study and association we are editing
Collection<String> previousAuthorReportedGenes = new HashSet<>();
Collection<String> authorReportedGenes = new HashSet<>();
Collection<String> previousSnps = new HashSet<>();
Collection<String> snps = new HashSet<>();
String isToRemapping = "yes";
Association associationToEdit = associationRepository.findOne(associationId);
Long studyId = associationToEdit.getStudy().getId();
Study study = studyRepository.findOne(studyId);
model.addAttribute("study", study);
AssociationReport oldAssociationReport = associationToEdit.getAssociationReport();
previousAuthorReportedGenes = associationOperationsService.getGenesIds(associationToEdit.getLoci());
previousSnps = associationOperationsService.getSpnsName(associationToEdit.getSnps());
// Determine if association is an OR or BETA type
String measurementType = associationOperationsService.determineIfAssociationIsOrType(associationToEdit);
model.addAttribute("measurementType", measurementType);
// Validate returned form depending on association type
List<AssociationValidationView> criticalErrors = new ArrayList<>();
if (associationType.equalsIgnoreCase("interaction")) {
criticalErrors = associationOperationsService.checkSnpAssociationInteractionFormErrorsForView(snpAssociationInteractionForm, measurementType);
} else {
criticalErrors = associationOperationsService.checkSnpAssociationFormErrors(snpAssociationStandardMultiForm, measurementType);
}
// If errors found then return the edit form with all information entered by curator preserved
if (!criticalErrors.isEmpty()) {
// Get mapping details
model.addAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToEdit));
// Return any association errors
model.addAttribute("errors", criticalErrors);
model.addAttribute("criticalErrorsFound", true);
if (associationType.equalsIgnoreCase("interaction")) {
model.addAttribute("form", snpAssociationInteractionForm);
return "edit_snp_interaction_association";
} else {
model.addAttribute("form", snpAssociationStandardMultiForm);
// Determine view
if (associationToEdit.getMultiSnpHaplotype()) {
return "edit_multi_snp_association";
} else {
return "edit_standard_snp_association";
}
}
} else {
// Create association
Association editedAssociation;
// Request parameter determines how to process form and also which form to process
if (associationType.equalsIgnoreCase("interaction")) {
editedAssociation = snpInteractionAssociationService.createAssociation(snpAssociationInteractionForm);
} else {
editedAssociation = singleSnpMultiSnpAssociationService.createAssociation(snpAssociationStandardMultiForm);
// New snps to compare with the previousSnps.
Collection<SnpFormRow> newSnpsList = snpAssociationStandardMultiForm.getSnpFormRows();
if (newSnpsList != null && !newSnpsList.isEmpty()) {
for (SnpFormRow snp : newSnpsList) {
snps.add(snp.getSnp());
}
}
}
authorReportedGenes = associationOperationsService.getGenesIds(editedAssociation.getLoci());
if (oldAssociationReport != null) {
if ((previousAuthorReportedGenes.size() == authorReportedGenes.size()) && (snps.size() == snps.size())) {
// check the values
if ((authorReportedGenes.equals(previousAuthorReportedGenes)) && (snps.equals(previousSnps))) {
editedAssociation.setLastMappingDate(associationToEdit.getLastMappingDate());
editedAssociation.setLastMappingPerformedBy(associationToEdit.getLastMappingPerformedBy());
editedAssociation.setAssociationReport(oldAssociationReport);
isToRemapping = "no";
}
}
}
if ((oldAssociationReport != null) && (isToRemapping.compareTo("yes") == 0)) {
associationOperationsService.deleteAssocationReport(associationToEdit.getAssociationReport().getId());
}
// Save and validate form
String eRelease = ensemblRestTemplateService.getRelease();
Collection<AssociationValidationView> errors = associationOperationsService.saveEditedAssociationFromForm(study, editedAssociation, associationId, currentUserDetailsService.getUserFromRequest(request), eRelease);
// Determine if we have any errors rather than warnings
long errorCount = errors.stream().filter(validationError -> !validationError.getWarning()).count();
if (errorCount > 0) {
// Get mapping details for association we're editing
model.addAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToEdit));
model.addAttribute("errors", errors);
model.addAttribute("criticalErrorsFound", true);
if (associationType.equalsIgnoreCase("interaction")) {
model.addAttribute("form", snpAssociationInteractionForm);
return "edit_snp_interaction_association";
} else {
model.addAttribute("form", snpAssociationStandardMultiForm);
// Determine view
if (associationToEdit.getMultiSnpHaplotype()) {
return "edit_multi_snp_association";
} else {
return "edit_standard_snp_association";
}
}
} else {
redirectAttributes.addFlashAttribute("isToRemapping", isToRemapping);
return "redirect:/associations/" + associationId;
}
}
}
Aggregations