/* * Copyright [1999-2015] Wellcome Trust Sanger Institute and the EMBL-European Bioinformatics Institute * Copyright [2016-2017] EMBL-European Bioinformatics Institute * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * AltAllele * * @author lairdm */ package org.ensembl.healthcheck.testcase.generic; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import org.ensembl.healthcheck.DatabaseRegistryEntry; import org.ensembl.healthcheck.DatabaseType; import org.ensembl.healthcheck.ReportManager; import org.ensembl.healthcheck.Team; import org.ensembl.healthcheck.testcase.SingleDatabaseTestCase; /** * Test to ensure altallele group members all map back to the same * chromosome * * @author lairdm * */ public class AltAllele extends SingleDatabaseTestCase { private static final int MAX_WARNINGS = 10; private final static String ALLELE_SQL = "SELECT aa.alt_allele_group_id, GROUP_CONCAT( DISTINCT CONCAT(IFNULL(ae.exc_seq_region_id, -1),',', g.seq_region_id, ',', IFNULL(ae.exc_type, 'NULL')) SEPARATOR ';') AS seq_regions FROM alt_allele_group aag LEFT JOIN alt_allele aa ON aa.alt_allele_group_id = aag.alt_allele_group_id LEFT JOIN gene g ON aa.gene_id = g.gene_id LEFT JOIN seq_region sr ON g.seq_region_id = sr.seq_region_id LEFT JOIN assembly_exception ae ON g.seq_region_id = ae.seq_region_id GROUP BY alt_allele_group_id"; public AltAllele() { appliesToType(DatabaseType.CORE); setDescription("Test to ensure AltAllele group members all map back to the same chromosome"); setTeamResponsible(Team.GENEBUILD); } /** * This test only applies to the core database. */ public void types() { removeAppliesToType(DatabaseType.OTHERFEATURES); removeAppliesToType(DatabaseType.CDNA); removeAppliesToType(DatabaseType.SANGER_VEGA); removeAppliesToType(DatabaseType.RNASEQ); removeAppliesToType(DatabaseType.VEGA); } /** * Check if AltAllele group members map to different chromosomes. * * @param dbre * The database to check. * @return True if the test passes. */ public boolean run(DatabaseRegistryEntry dbre) { boolean result = true; Connection con = dbre.getConnection(); try { Statement stmt = con.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(1000); ResultSet rs = stmt.executeQuery(ALLELE_SQL); // Loop through Alt Allele groups while(rs.next()) { // Values for this row int alt_allele_group_id = rs.getInt("alt_allele_group_id"); String seq_regions = rs.getString("seq_regions"); // Store the seq_region_id for this Alt Allele group as // we loop through group members int seq_region_id = 0; // For each Alt Allel in the group for (String seq_region_pair : seq_regions.split(";")) { int curr_seq_region_id = 0; // We have the exception seq_region_id and the seq_region in our pair, // for an allele that's mapped to the main sequence we'll have // -1 in the exception column, and the seq_region_id in the second // value. For alleles mapped to alternative splices, the base seq_region_id // will be in the first value coming from the exception table. // Break our AltAllele group member in to components, and cast the // integer ones appropriately. String[] seq_region_pieces = seq_region_pair.split(","); int exc_seq_region_id = Integer.parseInt( seq_region_pieces[0] ); int base_seq_region_id = Integer.parseInt( seq_region_pieces[1] ); // If the seq_region_id from the exception table is -1 (NULL) or if // the exception type is PAR, we want to use the seq_region_id from // the base slice. Otherwise we'll use the seq_region_id from the // exception table. Thibaut says blame him for the extra checking // logic ;) if( exc_seq_region_id == -1 || seq_region_pieces[2].equals("PAR") ) { curr_seq_region_id = base_seq_region_id; } else { curr_seq_region_id = exc_seq_region_id; } // Did we even find a seq_region_id in this member of the group? if(curr_seq_region_id > 0) { // First iteration, remember what our base seq_region_id should be if(seq_region_id == 0) { seq_region_id = curr_seq_region_id; // Does this member's seq_region_id not match the first member // of the group? Error! } else if(seq_region_id != curr_seq_region_id) { ReportManager.problem(this, con, "Has non-matching seq_regions for AltAllele group " + alt_allele_group_id + "."); result = false; break; } } } // end: for (String seq_region_pair : seq_regions.split(';')) // What happens if we didn't find any seq_region_id, that's a different error! if(seq_region_id == 0) { ReportManager.problem(this, con,"Has no seq_region_id associated with AltAllele group " + alt_allele_group_id + "."); result = false; } } // end: while(rs.next()) } catch (Exception e) { result = false; e.printStackTrace(); } if (result) { ReportManager.correct(this, con, "No mis-matched AltAllele groups."); } return result; } } //AltAllele