MGG Progress Documentation
These classes enable users to import and process CSV/TSV files.
/** * This class represents a task for importing a CSV file and processing it into a JSON array. * * The CSV file is read and parsed into a list of string arrays, where each array represents a row in the CSV file. * The task then creates a JSON array where each JSON object corresponds to a row in the CSV file. * The JSON array is then set in the MGGManager * * The task also provides options to display the JSON data in a panel and to write the JSON data to a file. * */ public class ImportFileTask extends AbstractTask { final CySwingApplication swingApplication; final CyApplicationManager cyApplicationManager; private final MGGManager mggManager; private String filePath; private JSONObject jsonObject; @Tunable(description = "Display Data", groups = { "Display Settings" }, tooltip="If checked, the Data will be displayed in a panel") public boolean showJSONInPanel = true; @Tunable(description="Write JSON to file",groups = { "Create File Settings" },tooltip="If checked, a new JSON file will be created in the same path as the original file",exampleStringValue="true") public boolean writeToFile = true; @Tunable(description="Choose input type", groups={"Input Settings"}, gravity=1.0, required=true) public ListSingleSelection<String> input = new ListSingleSelection<>("abundance_table", "network"); @Tunable(description="Choose taxonomy Database", groups={"Input Settings"}, gravity=2.0, required=true) public ListSingleSelection<String>taxonomy = new ListSingleSelection<>("gtdb", "dada2", "qiime2"); @Tunable(description="PhenDB", longDescription="Choose whether to use PhenDB.", groups={"Input Settings"}, gravity=3.0, exampleStringValue="True, False", required=true) public boolean phenDB; @Tunable(description="FAPROTAX", longDescription="Choose whether to use FAPROTAX.", groups={"Input Settings"}, gravity=4.0, exampleStringValue="True, False", required=true) public boolean faproTax; @Tunable(description="NetCooperate", longDescription="Choose whether to use NetCooperate.", groups={"Input Settings"}, gravity=5.0, exampleStringValue="True, False", required=true) public boolean netCooperate; @Tunable(description="NetCmpt", longDescription="Choose whether to use NetCmpt.", groups={"Input Settings"}, gravity=6.0, exampleStringValue="True, False", required=true) public boolean netCmpt; @Tunable(description="Pathway Complementarity", longDescription="Choose whether to use pathway complementarity.", groups={"Input Settings"}, gravity=7.0, exampleStringValue="True, False", required=true) public boolean pathwayComplementarity; /** * Constructor for the ImportFileTask class. * * @param cytoscapeDesktopService The CySwingApplication service, which provides access to Cytoscape desktop components. * @param cyApplicationManager2 The CyApplicationManager service, which provides access to the current network and view. * @param filePath The path of the CSV file to import. * */ public ImportFileTask(String filePath,MGGManager mggManager) { this.swingApplication = mggManager.getService(CySwingApplication.class); this.cyApplicationManager = mggManager.getService(CyApplicationManager.class); this.filePath = filePath; this.mggManager = mggManager; } @Override public void run(TaskMonitor taskMonitor) { taskMonitor.setTitle("Importing File"); taskMonitor.setStatusMessage("Reading file"); try { // Call CSVReader from Utils to parse the TSV/CSV file with tab delimiter List<String[]> csvData = CSVReader.readCSV(taskMonitor, filePath); // Find the headers(the first row that has more than 1 columns) String[] headers = null; for (int i = 0; i < csvData.size(); i++) { String[] row = csvData.get(i); if (row.length > 1) { headers = row; csvData.remove(i); // remove the header row break; } } taskMonitor.setStatusMessage("Processing data"); // Create JSONArray to hold the JSONObjects JSONArray jsonArray = new JSONArray(); JSONArray header = new JSONArray(); for (String hdr:headers) { header.add(hdr); } jsonArray.add(header); // Iterate each row of CSV for (String[] values : csvData) { // Skip rows with only one column if (values.length <= 1) { continue; } JSONArray row=new JSONArray(); for (String value:values) { row.add(value); } jsonArray.add(row); } // Create a new JSONObject JSONObject jsonObject = new JSONObject(); // Add the jsonArray to the jsonObject jsonObject.put("data", jsonArray); // Create a new JSONArray for the input parameters JSONArray inputParameters = new JSONArray(); inputParameters.add(input.getSelectedValue()); inputParameters.add(taxonomy.getSelectedValue()); inputParameters.add(phenDB); inputParameters.add(faproTax); inputParameters.add(netCooperate); inputParameters.add(netCmpt); inputParameters.add(pathwayComplementarity); // Add the input parameters to the jsonObject jsonObject.put("inputParameters", inputParameters); // Set the JSON array in the MGGManager mggManager.setJsonObject(jsonObject); taskMonitor.setStatusMessage("Displaying data in panel"); if (writeToFile) { try { String jsonFilePath = filePath + ".json"; FileWriter writer = new FileWriter(jsonFilePath); writer.write(jsonArray.toJSONString()); writer.close(); } catch (IOException e) { taskMonitor.showMessage(TaskMonitor.Level.ERROR, "Error while writing the file: " + e.getMessage()); e.printStackTrace(); } } // Show the JSON data in a panel if showJSONInPanel if (showJSONInPanel) { SwingUtilities.invokeLater(() -> showDataInPanel(jsonObject)); } taskMonitor.setProgress(1.0); taskMonitor.setStatusMessage("Finished processing file."); } catch (IOException e) { taskMonitor.showMessage(TaskMonitor.Level.ERROR, " Error while processing the file: " + e.getMessage()); e.printStackTrace(); }} private void showDataInPanel(JSONObject jsonObject) { //JSONDisplayPanel panel = new JSONDisplayPanel(mggManager, jsonObject); JsonResultPanel panel = new JsonResultPanel(mggManager, jsonObject); mggManager.registerService(panel, CytoPanelComponent.class, new Properties()); /* * JFrame frame = new JFrame("OTU/ASV Data"); * frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); * frame.getContentPane().add(panel); frame.pack(); frame.setVisible(true); */ }
public class ImportFileTaskFactory implements TaskFactory { private final MGGManager mggManager; public ImportFileTaskFactory(MGGManager mggManager) { this.mggManager=mggManager; } @Override public TaskIterator createTaskIterator() { // Use a JFileChooser to get the file path JFileChooser fileChooser = new JFileChooser(); int option = fileChooser.showOpenDialog(null); if (option == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); String filePath = selectedFile.getAbsolutePath(); return new TaskIterator(new ImportFileTask(filePath, mggManager)); } else if (option == JFileChooser.CANCEL_OPTION) { // User cancelled the file selection, return an empty TaskIterator return new TaskIterator(); } else { // An error occurred or no file was selected String errorMessage = "Error selecting file"; // You can display an error message or handle the error in any other way appropriate for your application JOptionPane.showMessageDialog(null, errorMessage, "Error", JOptionPane.ERROR_MESSAGE); // Return an empty TaskIterator or any other appropriate error handling return new TaskIterator(); } } @Override public boolean isReady() { return true; } }