Java tutorial
/*L * Copyright (c) 2006 SAIC, SAIC-F. * * Distributed under the OSI-approved BSD 3-Clause License. * See http://ncip.github.com/rembrandt/LICENSE.txt for details. */ package gov.nih.nci.rembrandt.web.xml; import gov.nih.nci.caintegrator.analysis.messaging.ClassComparisonResultEntry; import gov.nih.nci.caintegrator.dto.query.ClassComparisonQueryDTO; import gov.nih.nci.caintegrator.dto.query.ClinicalQueryDTO; import gov.nih.nci.caintegrator.enumeration.ArrayPlatformType; import gov.nih.nci.caintegrator.service.findings.ClassComparisonFinding; import gov.nih.nci.caintegrator.service.findings.Finding; import gov.nih.nci.rembrandt.queryservice.queryprocessing.ge.annotations.AnnotationHandler; import gov.nih.nci.rembrandt.queryservice.queryprocessing.ge.annotations.ReporterAnnotations; import gov.nih.nci.rembrandt.util.ContextSensitiveHelpTag; import gov.nih.nci.rembrandt.util.RembrandtConstants; import gov.nih.nci.rembrandt.web.ajax.GenePatternHelper; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; /** * @author LandyR * Feb 8, 2005 * */ /** * caIntegrator License * * Copyright 2001-2005 Science Applications International Corporation ("SAIC"). * The software subject to this notice and license includes both human readable source code form and machine readable, * binary, object code form ("the caIntegrator Software"). The caIntegrator Software was developed in conjunction with * the National Cancer Institute ("NCI") by NCI employees and employees of SAIC. * To the extent government employees are authors, any rights in such works shall be subject to Title 17 of the United States * Code, section 105. * This caIntegrator Software License (the "License") is between NCI and You. "You (or "Your") shall mean a person or an * entity, and all other entities that control, are controlled by, or are under common control with the entity. "Control" * for purposes of this definition means (i) the direct or indirect power to cause the direction or management of such entity, * whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) * beneficial ownership of such entity. * This License is granted provided that You agree to the conditions described below. NCI grants You a non-exclusive, * worldwide, perpetual, fully-paid-up, no-charge, irrevocable, transferable and royalty-free right and license in its rights * in the caIntegrator Software to (i) use, install, access, operate, execute, copy, modify, translate, market, publicly * display, publicly perform, and prepare derivative works of the caIntegrator Software; (ii) distribute and have distributed * to and by third parties the caIntegrator Software and any modifications and derivative works thereof; * and (iii) sublicense the foregoing rights set out in (i) and (ii) to third parties, including the right to license such * rights to further third parties. For sake of clarity, and not by way of limitation, NCI shall have no right of accounting * or right of payment from You or Your sublicensees for the rights granted under this License. This License is granted at no * charge to You. * 1. Your redistributions of the source code for the Software must retain the above copyright notice, this list of conditions * and the disclaimer and limitation of liability of Article 6, below. Your redistributions in object code form must reproduce * the above copyright notice, this list of conditions and the disclaimer of Article 6 in the documentation and/or other materials * provided with the distribution, if any. * 2. Your end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This * product includes software developed by SAIC and the National Cancer Institute." If You do not include such end-user * documentation, You shall include this acknowledgment in the Software itself, wherever such third-party acknowledgments * normally appear. * 3. You may not use the names "The National Cancer Institute", "NCI" "Science Applications International Corporation" and * "SAIC" to endorse or promote products derived from this Software. This License does not authorize You to use any * trademarks, service marks, trade names, logos or product names of either NCI or SAIC, except as required to comply with * the terms of this License. * 4. For sake of clarity, and not by way of limitation, You may incorporate this Software into Your proprietary programs and * into any third party proprietary programs. However, if You incorporate the Software into third party proprietary * programs, You agree that You are solely responsible for obtaining any permission from such third parties required to * incorporate the Software into such third party proprietary programs and for informing Your sublicensees, including * without limitation Your end-users, of their obligation to secure any required permissions from such third parties * before incorporating the Software into such third party proprietary software programs. In the event that You fail * to obtain such permissions, You agree to indemnify NCI for any claims against NCI by such third parties, except to * the extent prohibited by law, resulting from Your failure to obtain such permissions. * 5. For sake of clarity, and not by way of limitation, You may add Your own copyright statement to Your modifications and * to the derivative works, and You may provide additional or different license terms and conditions in Your sublicenses * of modifications of the Software, or any derivative works of the Software as a whole, provided Your use, reproduction, * and distribution of the Work otherwise complies with the conditions stated in this License. * 6. THIS SOFTWARE IS PROVIDED "AS IS," AND ANY EXPRESSED OR IMPLIED WARRANTIES, (INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. * IN NO EVENT SHALL THE NATIONAL CANCER INSTITUTE, SAIC, OR THEIR AFFILIATES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ public class ClassComparisonReport { private static Logger logger = Logger.getLogger(ClassComparisonReport.class); /** * */ public ClassComparisonReport() { //super(); } public static Document getReportXML(Finding finding, Map filterMapParams) { //changed the sig to include an allannotation flag, hence this wrapper method is born return getReportXML(finding, filterMapParams, false); } public static Document getReportXML(Finding finding, Map filterMapParams, boolean allAnnotations) { return getReportXML(finding, filterMapParams, allAnnotations, null); } /* (non-Javadoc) * @see gov.nih.nci.nautilus.ui.report.ReportGenerator#getTemplate(gov.nih.nci.nautilus.resultset.Resultant, java.lang.String) */ public static Document getReportXML(Finding finding, Map filterMapParams, boolean allAnnotations, ArrayList reporterIdFilter) { DecimalFormat resultFormat = new DecimalFormat("0.0000"); DecimalFormat sciFormat = new DecimalFormat("0.00E0"); DecimalFormat tmpsciFormat = new DecimalFormat("###0.0000#####################"); /* * this is for filtering, we will want a p-value filter for CC */ ArrayList filter_string = new ArrayList(); // hashmap of genes | reporters | cytobands String filter_type = "show"; // show | hide String filter_element = "none"; // none | gene | reporter | cytoband if (filterMapParams.containsKey("filter_string") && filterMapParams.get("filter_string") != null) filter_string = (ArrayList) filterMapParams.get("filter_string"); if (filterMapParams.containsKey("filter_type") && filterMapParams.get("filter_type") != null) filter_type = (String) filterMapParams.get("filter_type"); if (filterMapParams.containsKey("filter_element") && filterMapParams.get("filter_element") != null) filter_element = (String) filterMapParams.get("filter_element"); String defaultV = "--"; String delim = " | "; Document document = DocumentHelper.createDocument(); Element report = document.addElement("Report"); Element cell = null; Element data = null; Element dataRow = null; //add the atts report.addAttribute("reportType", "Class Comparison"); report.addAttribute("helpLink", ContextSensitiveHelpTag.getHelpLink("Class Comparison")); //fudge these for now report.addAttribute("groupBy", "none"); String queryName = "none"; queryName = finding.getTaskId(); //set the queryName to be unique for session/cache access report.addAttribute("queryName", queryName); report.addAttribute("sessionId", "the session id"); report.addAttribute("creationTime", "right now"); StringBuffer sb = new StringBuffer(); int recordCount = 0; int totalSamples = 0; //TODO: instance of ClassComparisonFinding ccf = (ClassComparisonFinding) finding; //process the query details ArrayList<String> queryDetails = new ArrayList(); ClassComparisonQueryDTO ccdto = (ClassComparisonQueryDTO) ccf.getQueryDTO(); if (ccdto != null) { String tmp = ""; tmp = ccdto.getQueryName() != null ? ccdto.getQueryName() : ""; queryDetails.add("Query Name: " + tmp); tmp = ccdto.getArrayPlatformDE() != null ? ccdto.getArrayPlatformDE().getValue().toString() : ""; queryDetails.add("Array Platform: " + tmp); tmp = ""; List<ClinicalQueryDTO> grps = ccdto.getComparisonGroups() != null ? ccdto.getComparisonGroups() : new ArrayList(); Collection grs = new ArrayList(); for (ClinicalQueryDTO cdto : grps) { if (cdto.getQueryName() != null) grs.add(cdto.getQueryName()); } tmp += StringUtils.join(grs.toArray(), ", ") + " (baseline)"; queryDetails.add("Groups: " + tmp); /* noHTMLString = noHTMLString.replaceAll("<", "{"); noHTMLString = noHTMLString.replaceAll(">", "}"); noHTMLString = noHTMLString.replaceAll(" ", " "); */ tmp = ccdto.getExprFoldChangeDE() != null ? ccdto.getExprFoldChangeDE().getValue().toString() : ""; queryDetails.add("Fold Change: " + tmp); //queryDetails.add("Institutions: " + ccdto.getInstitutionDEs()); tmp = ccdto.getMultiGroupComparisonAdjustmentTypeDE() != null ? ccdto.getMultiGroupComparisonAdjustmentTypeDE().getValue().toString() : ""; queryDetails.add("Multi Group: " + tmp); tmp = ccdto.getStatisticalSignificanceDE() != null ? ccdto.getStatisticalSignificanceDE().getValue().toString() : ""; queryDetails.add("Stat Sig.: " + tmp); tmp = ccdto.getStatisticTypeDE() != null ? ccdto.getStatisticTypeDE().getValue().toString() : ""; queryDetails.add("Stat Type: " + tmp); } /* queryDetails.add("Analysis Result name: " + ccform.getAnalysisResultName()); queryDetails.add("Array Platform: " + ccform.getArrayPlatform()); queryDetails.add("Baseline group: " + ccform.getBaselineGroup()); queryDetails.add("Comparison Groups: " + ccform.getSelectedGroups()[0].toString()); queryDetails.add("Comparison Adjustment: " + ccform.getComparisonAdjustment()); //queryDetails.add("Comp. Adj. Coll: " + ccform.getComparisonAdjustmentCollection()); //queryDetails.add("Existing Groups: " + ccform.getExistingGroups()); //queryDetails.add("Existing group list: " + ccform.getExistingGroupsList()); //queryDetails.add("Fold Change: " + ccform.getFoldChange()); queryDetails.add("Fold Change auto: " + ccform.getFoldChangeAuto()); //queryDetails.add("Fold change auto list: " + ccform.getFoldChangeAutoList()); //queryDetails.add("Fold change manual: " + ccform.getFoldChangeManual()); queryDetails.add("Stastic: " + ccform.getStatistic()); queryDetails.add("Stastical method: " + ccform.getStatisticalMethod()); //queryDetails.add("Stastical method coll.: " + ccform.getStatisticalMethodCollection()); queryDetails.add("Stastical significance: " + ccform.getStatisticalSignificance()); */ String qd = ""; for (String q : queryDetails) { qd += q + " ||| "; } if (ccf != null) { Element details = report.addElement("Query_details"); cell = details.addElement("Data"); cell.addText(qd); cell = null; Element headerRow = report.addElement("Row").addAttribute("name", "headerRow"); cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "header") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("Reporter"); data = null; cell = null; //pvalue is fixed in the second column, essential for XSL cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "header") .addAttribute("group", "header"); String isAdj = ccf.arePvaluesAdjusted() ? " (Adjusted) " : ""; data = cell.addElement("Data").addAttribute("type", "header") .addText(RembrandtConstants.PVALUE + isAdj); data = null; cell = null; cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "header") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("Group Avg"); data = null; cell = null; cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "header") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("Fold Change"); data = null; cell = null; cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "header") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("Gene Symbol"); data = null; cell = null; //starting annotations...get them only if allAnnotations == true if (allAnnotations) { cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "csv") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("GenBank Acc"); data = null; cell = null; cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "csv") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("Locus link"); data = null; cell = null; cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "csv") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("GO Id"); data = null; cell = null; cell = headerRow.addElement("Cell").addAttribute("type", "header").addAttribute("class", "csv") .addAttribute("group", "header"); data = cell.addElement("Data").addAttribute("type", "header").addText("Pathways"); data = null; cell = null; } /* done with the headerRow and SampleRow Elements, time to add data rows */ /* Map<String,ReporterResultset> reporterResultsetMap = null; reporterResultsetMap = ccf.getReporterAnnotationsMap(); */ List<ClassComparisonResultEntry> classComparisonResultEntrys = ccf.getResultEntries(); List<String> reporterIds = new ArrayList<String>(); HashSet<String> reporterIdSet = null; if (reporterIdFilter != null) { reporterIdSet = new HashSet<String>(reporterIdFilter); } int index = 0; if (reporterIdFilter == null) { for (ClassComparisonResultEntry classComparisonResultEntry : classComparisonResultEntrys) { if (classComparisonResultEntry.getReporterId() != null) { reporterIds.add(classComparisonResultEntry.getReporterId()); } } } else { reporterIds = reporterIdFilter; } Map reporterResultsetMap = null; ArrayPlatformType arrayPlatform = ccdto.getArrayPlatformDE() != null ? ccdto.getArrayPlatformDE().getValueObjectAsArrayPlatformType() : ArrayPlatformType.AFFY_OLIGO_PLATFORM; if (allAnnotations) { //Map<String, ReporterAnnotations> reporterResultsetMap = null; try { reporterResultsetMap = AnnotationHandler.getAllAnnotationsFor(reporterIds, arrayPlatform); } catch (Exception e) { e.printStackTrace(); } } else { try { reporterResultsetMap = AnnotationHandler.getGeneSymbolsFor(reporterIds, arrayPlatform); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* //this looks like a failsafe for the old method if(reporterResultsetMap == null) { try { reporterResultsetMap = GeneExprAnnotationService.getAnnotationsMapForReporters(reporterIds); } catch(Exception e){} } */ boolean found = false; for (ClassComparisonResultEntry ccre : ccf.getResultEntries()) { if (reporterIdFilter != null) { found = reporterIdSet.contains(ccre.getReporterId()); //not found, then skip if (!found) continue; } dataRow = report.addElement("Row").addAttribute("name", "dataRow"); cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "reporter") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header").addText(ccre.getReporterId()); data = null; cell = null; cell = dataRow.addElement("Cell").addAttribute("type", "pval").addAttribute("class", "data") .addAttribute("group", "data"); //String pv = (ccre.getPvalue() == null) ? String.valueOf(ccre.getPvalue()) : "N/A"; BigDecimal bigd = new BigDecimal(ccre.getPvalue()); data = cell.addElement("Data").addAttribute("type", "header").addText(bigd.toPlainString()); data = null; cell = null; cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "data") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header") .addText(resultFormat.format(ccre.getMeanGrp1()) + " / " + resultFormat.format(ccre.getMeanBaselineGrp())); data = null; cell = null; cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "data") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header") .addText(String.valueOf(resultFormat.format(ccre.getFoldChange()))); data = null; cell = null; //if only showing genes if (!allAnnotations && reporterResultsetMap != null) { String reporterId = ccre.getReporterId(); String genes = reporterResultsetMap.get(reporterId) != null ? (String) reporterResultsetMap.get(reporterId) : defaultV; cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "gene") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header").addText(genes); data = null; cell = null; } else { //get the gene symbols for this reporter //ccre.getReporterId() String genes = defaultV; //start annotations String accIds = defaultV; String llink = defaultV; String go = defaultV; String pw = defaultV; if (reporterResultsetMap != null) { // && reporterIds != null //int count = 0; String reporterId = ccre.getReporterId(); //ReporterResultset reporterResultset = reporterResultsetMap.get(reporterId); ReporterAnnotations ra = (ReporterAnnotations) reporterResultsetMap.get(reporterId); //Collection<String> geneSymbols = (Collection<String>)reporterResultset.getAssiciatedGeneSymbols(); String geneSymbols = ra.getGeneSymbol(); if (geneSymbols != null) genes = geneSymbols; /* if(geneSymbols != null){ genes = StringUtils.join(geneSymbols.toArray(), delim); } */ Collection<String> genBank_AccIDS = (Collection<String>) ra.getAccessions(); if (genBank_AccIDS != null) { accIds = StringUtils.join(genBank_AccIDS.toArray(), delim); } Collection<String> locusLinkIDs = (Collection<String>) ra.getLocusLinks(); if (locusLinkIDs != null) { llink = StringUtils.join(locusLinkIDs.toArray(), delim); } Collection<String> goIds = (Collection<String>) ra.getGoIDS(); if (goIds != null) { go = StringUtils.join(goIds.toArray(), delim); } Collection<String> pathways = (Collection<String>) ra.getPathways(); if (pathways != null) { pw = StringUtils.join(pathways.toArray(), delim); } } cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "gene") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header").addText(genes); data = null; cell = null; cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "csv") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header").addText(accIds); data = null; cell = null; cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "csv") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header").addText(llink); data = null; cell = null; cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "csv") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header").addText(go); data = null; cell = null; cell = dataRow.addElement("Cell").addAttribute("type", "data").addAttribute("class", "csv") .addAttribute("group", "data"); data = cell.addElement("Data").addAttribute("type", "header").addText(pw); data = null; cell = null; } } } else { //TODO: handle this error sb.append("<br/><br/>Class Comparison is empty<br/>"); } return document; } }