Search in sources :

Example 1 with AnalysisSubmission

use of ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission in project irida by phac-nml.

the class AnalysisController method getOutputFilesInfo.

/**
 * For an {@link AnalysisSubmission}, get info about each {@link AnalysisOutputFile}
 *
 * @param id {@link AnalysisSubmission} id
 * @return map of info about each {@link AnalysisOutputFile}
 */
@RequestMapping(value = "/ajax/{id}/outputs", method = RequestMethod.GET)
@ResponseBody
public List<AnalysisOutputFileInfo> getOutputFilesInfo(@PathVariable Long id) {
    AnalysisSubmission submission = analysisSubmissionService.read(id);
    Analysis analysis = submission.getAnalysis();
    Set<String> outputNames = analysis.getAnalysisOutputFileNames();
    return outputNames.stream().map((outputName) -> getAnalysisOutputFileInfo(submission, analysis, outputName)).filter(Objects::nonNull).collect(Collectors.toList());
}
Also used : Analysis(ca.corefacility.bioinformatics.irida.model.workflow.analysis.Analysis) AnalysisSubmission(ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission)

Example 2 with AnalysisSubmission

use of ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission in project irida by phac-nml.

the class AnalysisController method getOutputFile.

/**
 * Read some lines or text from an {@link AnalysisOutputFile}.
 *
 * @param id       {@link AnalysisSubmission} id
 * @param fileId   {@link AnalysisOutputFile} id
 * @param limit    Optional limit to number of lines to read from file
 * @param start    Optional line to start reading from
 * @param end      Optional line to stop reading at
 * @param seek     Optional file byte position to seek to and begin reading
 * @param chunk    Optional number of bytes to read from file
 * @param response HTTP response object
 * @return JSON with file text or lines as well as information about the file.
 */
@RequestMapping(value = "/ajax/{id}/outputs/{fileId}", method = RequestMethod.GET)
@ResponseBody
public AnalysisOutputFileInfo getOutputFile(@PathVariable Long id, @PathVariable Long fileId, @RequestParam(defaultValue = "100", required = false) Long limit, @RequestParam(required = false) Long start, @RequestParam(required = false) Long end, @RequestParam(defaultValue = "0", required = false) Long seek, @RequestParam(required = false) Long chunk, HttpServletResponse response) {
    AnalysisSubmission submission = analysisSubmissionService.read(id);
    Analysis analysis = submission.getAnalysis();
    final Optional<AnalysisOutputFile> analysisOutputFile = analysis.getAnalysisOutputFiles().stream().filter(x -> Objects.equals(x.getId(), fileId)).findFirst();
    if (analysisOutputFile.isPresent()) {
        final AnalysisOutputFile aof = analysisOutputFile.get();
        final Path aofFile = aof.getFile();
        final ToolExecution tool = aof.getCreatedByTool();
        final AnalysisOutputFileInfo contents = new AnalysisOutputFileInfo();
        contents.setId(aof.getId());
        contents.setAnalysisSubmissionId(submission.getId());
        contents.setAnalysisId(analysis.getId());
        contents.setFilename(aofFile.getFileName().toString());
        contents.setFileExt(FileUtilities.getFileExt(aofFile.getFileName().toString()));
        contents.setFileSizeBytes(aof.getFile().toFile().length());
        contents.setToolName(tool.getToolName());
        contents.setToolVersion(tool.getToolVersion());
        try {
            final File file = aofFile.toFile();
            final RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
            randomAccessFile.seek(seek);
            if (seek == 0) {
                if (chunk != null && chunk > 0) {
                    contents.setText(FileUtilities.readChunk(randomAccessFile, seek, chunk));
                    contents.setChunk(chunk);
                    contents.setStartSeek(seek);
                } else {
                    final BufferedReader reader = new BufferedReader(new FileReader(randomAccessFile.getFD()));
                    final List<String> lines = FileUtilities.readLinesLimit(reader, limit, start, end);
                    contents.setLines(lines);
                    contents.setLimit((long) lines.size());
                    contents.setStart(start);
                    contents.setEnd(start + lines.size());
                }
            } else {
                if (chunk != null && chunk > 0) {
                    contents.setText(FileUtilities.readChunk(randomAccessFile, seek, chunk));
                    contents.setChunk(chunk);
                    contents.setStartSeek(seek);
                } else {
                    final List<String> lines = FileUtilities.readLinesFromFilePointer(randomAccessFile, limit);
                    contents.setLines(lines);
                    contents.setStartSeek(seek);
                    contents.setStart(start);
                    contents.setLimit((long) lines.size());
                }
            }
            contents.setFilePointer(randomAccessFile.getFilePointer());
        } catch (IOException e) {
            logger.error("Could not read output file '" + aof.getId() + "' " + e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            contents.setError("Could not read output file");
        }
        return contents;
    } else {
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        return null;
    }
}
Also used : PreAuthorize(org.springframework.security.access.prepost.PreAuthorize) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) AnalysisType(ca.corefacility.bioinformatics.irida.model.enums.AnalysisType) ProjectService(ca.corefacility.bioinformatics.irida.service.ProjectService) FileUtilities(ca.corefacility.bioinformatics.irida.ria.utilities.FileUtilities) Model(org.springframework.ui.Model) MetadataTemplateField(ca.corefacility.bioinformatics.irida.model.sample.MetadataTemplateField) DataTablesResponse(ca.corefacility.bioinformatics.irida.ria.web.components.datatables.DataTablesResponse) AnalysisSubmissionService(ca.corefacility.bioinformatics.irida.service.AnalysisSubmissionService) MetadataTemplate(ca.corefacility.bioinformatics.irida.model.sample.MetadataTemplate) SecurityContextHolder(org.springframework.security.core.context.SecurityContextHolder) TypeReference(com.fasterxml.jackson.core.type.TypeReference) Path(java.nio.file.Path) JsonParseException(com.fasterxml.jackson.core.JsonParseException) ProjectMetadataTemplateJoin(ca.corefacility.bioinformatics.irida.model.joins.impl.ProjectMetadataTemplateJoin) IridaWorkflowNotFoundException(ca.corefacility.bioinformatics.irida.exceptions.IridaWorkflowNotFoundException) AnalysisSubmission(ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission) SequencingObjectService(ca.corefacility.bioinformatics.irida.service.SequencingObjectService) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) MediaType(org.springframework.http.MediaType) Collectors(java.util.stream.Collectors) AnalysesListingService(ca.corefacility.bioinformatics.irida.ria.web.services.AnalysesListingService) Principal(java.security.Principal) org.springframework.web.bind.annotation(org.springframework.web.bind.annotation) User(ca.corefacility.bioinformatics.irida.model.user.User) SampleService(ca.corefacility.bioinformatics.irida.service.sample.SampleService) JsonMappingException(com.fasterxml.jackson.databind.JsonMappingException) Authentication(org.springframework.security.core.Authentication) java.util(java.util) ExecutionManagerException(ca.corefacility.bioinformatics.irida.exceptions.ExecutionManagerException) UpdateAnalysisSubmissionPermission(ca.corefacility.bioinformatics.irida.security.permissions.analysis.UpdateAnalysisSubmissionPermission) Analysis(ca.corefacility.bioinformatics.irida.model.workflow.analysis.Analysis) EntityNotFoundException(ca.corefacility.bioinformatics.irida.exceptions.EntityNotFoundException) Controller(org.springframework.stereotype.Controller) MetadataEntry(ca.corefacility.bioinformatics.irida.model.sample.metadata.MetadataEntry) MetadataTemplateService(ca.corefacility.bioinformatics.irida.service.sample.MetadataTemplateService) ToolExecution(ca.corefacility.bioinformatics.irida.model.workflow.analysis.ToolExecution) MessageSource(org.springframework.context.MessageSource) Logger(org.slf4j.Logger) Files(java.nio.file.Files) AnalysisState(ca.corefacility.bioinformatics.irida.model.enums.AnalysisState) DataTablesRequest(ca.corefacility.bioinformatics.irida.ria.web.components.datatables.config.DataTablesRequest) IridaWorkflowsService(ca.corefacility.bioinformatics.irida.service.workflow.IridaWorkflowsService) HttpServletResponse(javax.servlet.http.HttpServletResponse) SequenceFilePair(ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFilePair) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Sample(ca.corefacility.bioinformatics.irida.model.sample.Sample) Project(ca.corefacility.bioinformatics.irida.model.project.Project) ProjectAnalysisSubmissionJoin(ca.corefacility.bioinformatics.irida.model.workflow.submission.ProjectAnalysisSubmissionJoin) AnalysisOutputFileInfo(ca.corefacility.bioinformatics.irida.ria.web.analysis.dto.AnalysisOutputFileInfo) AnalysisOutputFile(ca.corefacility.bioinformatics.irida.model.workflow.analysis.AnalysisOutputFile) java.io(java.io) UserService(ca.corefacility.bioinformatics.irida.service.user.UserService) JobError(ca.corefacility.bioinformatics.irida.model.workflow.analysis.JobError) IridaWorkflow(ca.corefacility.bioinformatics.irida.model.workflow.IridaWorkflow) DataTablesParams(ca.corefacility.bioinformatics.irida.ria.web.components.datatables.DataTablesParams) Path(java.nio.file.Path) AnalysisSubmission(ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission) ToolExecution(ca.corefacility.bioinformatics.irida.model.workflow.analysis.ToolExecution) Analysis(ca.corefacility.bioinformatics.irida.model.workflow.analysis.Analysis) AnalysisOutputFile(ca.corefacility.bioinformatics.irida.model.workflow.analysis.AnalysisOutputFile) AnalysisOutputFileInfo(ca.corefacility.bioinformatics.irida.ria.web.analysis.dto.AnalysisOutputFileInfo) AnalysisOutputFile(ca.corefacility.bioinformatics.irida.model.workflow.analysis.AnalysisOutputFile)

Example 3 with AnalysisSubmission

use of ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission in project irida by phac-nml.

the class AnalysisController method getAjaxDownloadAnalysisSubmissionIndividualFile.

/**
 * Download single output files from an {@link AnalysisSubmission}
 *
 * @param analysisSubmissionId Id for a {@link AnalysisSubmission}
 * @param fileId               the id of the file to download
 * @param response             {@link HttpServletResponse}
 */
@RequestMapping(value = "/ajax/download/{analysisSubmissionId}/file/{fileId}")
public void getAjaxDownloadAnalysisSubmissionIndividualFile(@PathVariable Long analysisSubmissionId, @PathVariable Long fileId, HttpServletResponse response) {
    AnalysisSubmission analysisSubmission = analysisSubmissionService.read(analysisSubmissionId);
    Analysis analysis = analysisSubmission.getAnalysis();
    Set<AnalysisOutputFile> files = analysis.getAnalysisOutputFiles();
    Optional<AnalysisOutputFile> optFile = files.stream().filter(f -> f.getId().equals(fileId)).findAny();
    if (!optFile.isPresent()) {
        throw new EntityNotFoundException("Could not find file with id " + fileId);
    }
    FileUtilities.createSingleFileResponse(response, optFile.get());
}
Also used : PreAuthorize(org.springframework.security.access.prepost.PreAuthorize) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) AnalysisType(ca.corefacility.bioinformatics.irida.model.enums.AnalysisType) ProjectService(ca.corefacility.bioinformatics.irida.service.ProjectService) FileUtilities(ca.corefacility.bioinformatics.irida.ria.utilities.FileUtilities) Model(org.springframework.ui.Model) MetadataTemplateField(ca.corefacility.bioinformatics.irida.model.sample.MetadataTemplateField) DataTablesResponse(ca.corefacility.bioinformatics.irida.ria.web.components.datatables.DataTablesResponse) AnalysisSubmissionService(ca.corefacility.bioinformatics.irida.service.AnalysisSubmissionService) MetadataTemplate(ca.corefacility.bioinformatics.irida.model.sample.MetadataTemplate) SecurityContextHolder(org.springframework.security.core.context.SecurityContextHolder) TypeReference(com.fasterxml.jackson.core.type.TypeReference) Path(java.nio.file.Path) JsonParseException(com.fasterxml.jackson.core.JsonParseException) ProjectMetadataTemplateJoin(ca.corefacility.bioinformatics.irida.model.joins.impl.ProjectMetadataTemplateJoin) IridaWorkflowNotFoundException(ca.corefacility.bioinformatics.irida.exceptions.IridaWorkflowNotFoundException) AnalysisSubmission(ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission) SequencingObjectService(ca.corefacility.bioinformatics.irida.service.SequencingObjectService) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) MediaType(org.springframework.http.MediaType) Collectors(java.util.stream.Collectors) AnalysesListingService(ca.corefacility.bioinformatics.irida.ria.web.services.AnalysesListingService) Principal(java.security.Principal) org.springframework.web.bind.annotation(org.springframework.web.bind.annotation) User(ca.corefacility.bioinformatics.irida.model.user.User) SampleService(ca.corefacility.bioinformatics.irida.service.sample.SampleService) JsonMappingException(com.fasterxml.jackson.databind.JsonMappingException) Authentication(org.springframework.security.core.Authentication) java.util(java.util) ExecutionManagerException(ca.corefacility.bioinformatics.irida.exceptions.ExecutionManagerException) UpdateAnalysisSubmissionPermission(ca.corefacility.bioinformatics.irida.security.permissions.analysis.UpdateAnalysisSubmissionPermission) Analysis(ca.corefacility.bioinformatics.irida.model.workflow.analysis.Analysis) EntityNotFoundException(ca.corefacility.bioinformatics.irida.exceptions.EntityNotFoundException) Controller(org.springframework.stereotype.Controller) MetadataEntry(ca.corefacility.bioinformatics.irida.model.sample.metadata.MetadataEntry) MetadataTemplateService(ca.corefacility.bioinformatics.irida.service.sample.MetadataTemplateService) ToolExecution(ca.corefacility.bioinformatics.irida.model.workflow.analysis.ToolExecution) MessageSource(org.springframework.context.MessageSource) Logger(org.slf4j.Logger) Files(java.nio.file.Files) AnalysisState(ca.corefacility.bioinformatics.irida.model.enums.AnalysisState) DataTablesRequest(ca.corefacility.bioinformatics.irida.ria.web.components.datatables.config.DataTablesRequest) IridaWorkflowsService(ca.corefacility.bioinformatics.irida.service.workflow.IridaWorkflowsService) HttpServletResponse(javax.servlet.http.HttpServletResponse) SequenceFilePair(ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFilePair) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Sample(ca.corefacility.bioinformatics.irida.model.sample.Sample) Project(ca.corefacility.bioinformatics.irida.model.project.Project) ProjectAnalysisSubmissionJoin(ca.corefacility.bioinformatics.irida.model.workflow.submission.ProjectAnalysisSubmissionJoin) AnalysisOutputFileInfo(ca.corefacility.bioinformatics.irida.ria.web.analysis.dto.AnalysisOutputFileInfo) AnalysisOutputFile(ca.corefacility.bioinformatics.irida.model.workflow.analysis.AnalysisOutputFile) java.io(java.io) UserService(ca.corefacility.bioinformatics.irida.service.user.UserService) JobError(ca.corefacility.bioinformatics.irida.model.workflow.analysis.JobError) IridaWorkflow(ca.corefacility.bioinformatics.irida.model.workflow.IridaWorkflow) DataTablesParams(ca.corefacility.bioinformatics.irida.ria.web.components.datatables.DataTablesParams) Analysis(ca.corefacility.bioinformatics.irida.model.workflow.analysis.Analysis) AnalysisSubmission(ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission) EntityNotFoundException(ca.corefacility.bioinformatics.irida.exceptions.EntityNotFoundException) AnalysisOutputFile(ca.corefacility.bioinformatics.irida.model.workflow.analysis.AnalysisOutputFile)

Example 4 with AnalysisSubmission

use of ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission in project irida by phac-nml.

the class AnalysisController method getDetailsPage.

/**
 * View details about an individual analysis submission
 *
 * @param submissionId the ID of the submission
 * @param model        Model for the view
 * @param locale       User's locale
 * @return name of the details page view
 */
@RequestMapping(value = "/{submissionId}", produces = MediaType.TEXT_HTML_VALUE)
public String getDetailsPage(@PathVariable Long submissionId, Model model, Locale locale) {
    logger.trace("reading analysis submission " + submissionId);
    AnalysisSubmission submission = analysisSubmissionService.read(submissionId);
    model.addAttribute("analysisSubmission", submission);
    UUID workflowUUID = submission.getWorkflowId();
    logger.trace("Workflow ID is " + workflowUUID);
    IridaWorkflow iridaWorkflow;
    try {
        iridaWorkflow = workflowsService.getIridaWorkflow(workflowUUID);
    } catch (IridaWorkflowNotFoundException e) {
        logger.error("Error finding workflow, ", e);
        throw new EntityNotFoundException("Couldn't find workflow for submission " + submission.getId(), e);
    }
    // Get the name of the workflow
    AnalysisType analysisType = iridaWorkflow.getWorkflowDescription().getAnalysisType();
    model.addAttribute("analysisType", analysisType);
    String viewName = getViewForAnalysisType(analysisType);
    String workflowName = messageSource.getMessage("workflow." + analysisType.toString() + ".title", null, locale);
    model.addAttribute("workflowName", workflowName);
    model.addAttribute("version", iridaWorkflow.getWorkflowDescription().getVersion());
    // Input files
    // - Paired
    Set<SequenceFilePair> inputFilePairs = sequencingObjectService.getSequencingObjectsOfTypeForAnalysisSubmission(submission, SequenceFilePair.class);
    model.addAttribute("paired_end", inputFilePairs);
    // Check if user can update analysis
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    model.addAttribute("updatePermission", updateAnalysisPermission.isAllowed(authentication, submission));
    if (iridaWorkflow.getWorkflowDescription().requiresReference() && submission.getReferenceFile().isPresent()) {
        logger.debug("Adding reference file to page for submission with id [" + submission.getId() + "].");
        model.addAttribute("referenceFile", submission.getReferenceFile().get());
    } else {
        logger.debug("No reference file required for workflow.");
    }
    /*
		 * Preview information
		 */
    try {
        if (submission.getAnalysisState().equals(AnalysisState.COMPLETED)) {
            if (analysisType.equals(AnalysisType.PHYLOGENOMICS)) {
                tree(submission, model);
            } else if (analysisType.equals(AnalysisType.SISTR_TYPING)) {
                model.addAttribute("sistr", true);
            }
        }
    } catch (IOException e) {
        logger.error("Couldn't get preview for analysis", e);
    }
    return viewName;
}
Also used : IridaWorkflowNotFoundException(ca.corefacility.bioinformatics.irida.exceptions.IridaWorkflowNotFoundException) AnalysisType(ca.corefacility.bioinformatics.irida.model.enums.AnalysisType) SequenceFilePair(ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFilePair) IridaWorkflow(ca.corefacility.bioinformatics.irida.model.workflow.IridaWorkflow) Authentication(org.springframework.security.core.Authentication) AnalysisSubmission(ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission) EntityNotFoundException(ca.corefacility.bioinformatics.irida.exceptions.EntityNotFoundException)

Example 5 with AnalysisSubmission

use of ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission in project irida by phac-nml.

the class AnalysisController method getMetadataTemplatesForAnalysis.

/**
 * Get a list of all {@link MetadataTemplate}s for the {@link AnalysisSubmission}
 *
 * @param submissionId id of the {@link AnalysisSubmission}
 * @return a map of {@link MetadataTemplate}s
 */
@RequestMapping("/ajax/{submissionId}/metadata-templates")
@ResponseBody
public Map<String, Object> getMetadataTemplatesForAnalysis(@PathVariable Long submissionId) {
    AnalysisSubmission submission = analysisSubmissionService.read(submissionId);
    List<Project> projectsUsedInAnalysisSubmission = projectService.getProjectsUsedInAnalysisSubmission(submission);
    Set<Long> projectIds = new HashSet<>();
    Set<Map<String, Object>> templates = new HashSet<>();
    for (Project project : projectsUsedInAnalysisSubmission) {
        if (!projectIds.contains(project.getId())) {
            projectIds.add(project.getId());
            // Get the templates for the project
            List<ProjectMetadataTemplateJoin> templateList = metadataTemplateService.getMetadataTemplatesForProject(project);
            for (ProjectMetadataTemplateJoin projectMetadataTemplateJoin : templateList) {
                MetadataTemplate metadataTemplate = projectMetadataTemplateJoin.getObject();
                Map<String, Object> templateMap = ImmutableMap.of("label", metadataTemplate.getLabel(), "id", metadataTemplate.getId());
                templates.add(templateMap);
            }
        }
    }
    return ImmutableMap.of("templates", templates);
}
Also used : MetadataTemplate(ca.corefacility.bioinformatics.irida.model.sample.MetadataTemplate) AnalysisSubmission(ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission) ProjectMetadataTemplateJoin(ca.corefacility.bioinformatics.irida.model.joins.impl.ProjectMetadataTemplateJoin) Project(ca.corefacility.bioinformatics.irida.model.project.Project) ImmutableMap(com.google.common.collect.ImmutableMap)

Aggregations

AnalysisSubmission (ca.corefacility.bioinformatics.irida.model.workflow.submission.AnalysisSubmission)183 Test (org.junit.Test)121 WithMockUser (org.springframework.security.test.context.support.WithMockUser)95 IridaWorkflow (ca.corefacility.bioinformatics.irida.model.workflow.IridaWorkflow)30 Analysis (ca.corefacility.bioinformatics.irida.model.workflow.analysis.Analysis)30 Path (java.nio.file.Path)25 SequenceFilePair (ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFilePair)23 HistoriesClient (com.github.jmchilton.blend4j.galaxy.HistoriesClient)20 Project (ca.corefacility.bioinformatics.irida.model.project.Project)19 History (com.github.jmchilton.blend4j.galaxy.beans.History)19 SingleEndSequenceFile (ca.corefacility.bioinformatics.irida.model.sequenceFile.SingleEndSequenceFile)18 AnalysisOutputFile (ca.corefacility.bioinformatics.irida.model.workflow.analysis.AnalysisOutputFile)18 WorkflowsClient (com.github.jmchilton.blend4j.galaxy.WorkflowsClient)18 Workflow (com.github.jmchilton.blend4j.galaxy.beans.Workflow)18 Sample (ca.corefacility.bioinformatics.irida.model.sample.Sample)15 User (ca.corefacility.bioinformatics.irida.model.user.User)15 EntityNotFoundException (ca.corefacility.bioinformatics.irida.exceptions.EntityNotFoundException)12 ExecutionManagerException (ca.corefacility.bioinformatics.irida.exceptions.ExecutionManagerException)12 ProjectAnalysisSubmissionJoin (ca.corefacility.bioinformatics.irida.model.workflow.submission.ProjectAnalysisSubmissionJoin)12 ToolExecution (ca.corefacility.bioinformatics.irida.model.workflow.analysis.ToolExecution)11