oe.plugin.analyzer.SysmeXTImplementation.java Source code

Java tutorial

Introduction

Here is the source code for oe.plugin.analyzer.SysmeXTImplementation.java

Source

 /**
  * The contents of this file are subject to the Mozilla Public License
  * Version 1.1 (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.mozilla.org/MPL/
  *
  * Software distributed under the License is distributed on an "AS IS"
  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  * License for the specific language governing rights and limitations under
  * the License.
  *
  * The Original Code is OpenELIS code.
  *
  * Copyright (C) The Minnesota Department of Health.  All Rights Reserved.
  *
  * Contributor(s): CIRG, University of Washington, Seattle WA.
  */

 package oe.plugin.analyzer;

 import org.apache.commons.validator.GenericValidator;
 import org.hibernate.Transaction;
 import us.mn.state.health.lims.analyzerimport.util.AnalyzerTestNameCache;
 import us.mn.state.health.lims.analyzerimport.util.MappedTestName;
 import us.mn.state.health.lims.analyzerresults.valueholder.AnalyzerResults;
 import us.mn.state.health.lims.common.exception.LIMSRuntimeException;
 import us.mn.state.health.lims.common.util.DateUtil;
 import us.mn.state.health.lims.common.util.HibernateProxy;

 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
 import us.mn.state.health.lims.analyzerimport.analyzerreaders.AnalyzerLineInserter;
 import us.mn.state.health.lims.analyzerimport.analyzerreaders.AnalyzerReaderUtil;

 @SuppressWarnings("unused")
 public class SysmeXTImplementation extends AnalyzerLineInserter {

     private static final String CONTROL_ACCESSION_PREFIX = "QC-";

     private static int index = 0;
     private static final int ID_INSTRUMENT = index++;
     private static final int DATE = index++;
     private static final int TIME = index++;
     private static final int RACK = index++;
     private static final int TUBE = index++;
     private static final int ACCESSION = index++;
     private static final int ACCESSION_INFO = index++;
     private static final int METHOD = index++;
     private static final int ID_PATIENT = index++;
     private static final int ANALYSIS_INFO = index++;
     private static final int POS_NEG = index++;
     private static final int POS_DIFF = index++;
     private static final int POS_MORF = index++;
     private static final int POS_COMP = index++;
     private static final int ERR_FUNC = index++;
     private static final int ERR_RESULT = index++;
     private static final int INFO_REQUEST = index++;
     private static final int GB_ABNORMAL = index++;
     private static final int GB_SUSPICIOUS = index++;
     private static final int GR_ABNORMAL = index++;
     private static final int GR_SUSPICIOUS = index++;
     private static final int PLQ_ABNORMAL = index++;
     private static final int PLQ_SUSPICIOUS = index++;
     private static final int INFO_UNITS = index++;
     private static final int INFO_PLQ = index++;
     private static final int VALID = index++;
     private static final int RET_MESSAGES = index++;
     private static final int DELTA_MESSAGES = index++;
     private static final int SAMPLE_COMMENT = index++;
     private static final int PATIENT_NAME = index++;
     private static final int PATIENT_BIRTH_DATE = index++;
     private static final int PATIENT_GENDER = index++;
     private static final int PATIENT_COMMENT = index++;
     private static final int SERVICE = index++;
     private static final int MEDS = index++;
     private static final int TRANSMISSION_PARMS = index++;
     private static final int SEQUENECE_COUNT = index++;
     private static final int GB_10_uL = index++;
     private static final int GB_M = index++;
     private static final int GR_100000_uL = index++;
     private static final int GR_M = index++;
     private static final int HBG_g_L = index++;
     private static final int HBG_M = index++;
     private static final int HCT_10_NEG_1_PER = index++;
     private static final int HCT_M = index++;
     private static final int VGM_10_NEG_1_fL = index++;
     private static final int VGM_M = index++;
     private static final int TCMH_10_NEG_1_pg = index++;
     private static final int TCMH_M = index++;
     private static final int CCMH_g_L = index++;
     private static final int CCMH_M = index++;
     private static final int PLQ_10_3_uL = index++;
     private static final int PLQ_M = index++;
     private static final int IDR_SD_10_NEG_1_fL = index++;
     private static final int IDR_SD_M = index++;
     private static final int IDR_CV_10_NEG_1_PER = index++;
     private static final int IDR_CV_M = index++;
     private static final int IDP = index++;
     private static final int IDP_M = index++;
     private static final int VPM_10_NEG_1_fL = index++;
     private static final int VPM_M = index++;
     private static final int P_RGC_10_NEG_1_PER = index++;
     private static final int P_RGC_M = index++;
     private static final int PCT_10_NEG_2_PER = index++;
     private static final int PCT_M = index++;
     private static final int NEUT_COUNT_10_uL = index++;
     private static final int NEUT_COUNT_M = index++;
     private static final int LYMPH_COUNT_10_uL = index++;
     private static final int LYMPH_COUNT_M = index++;
     private static final int MONO_COUNT_10_uL = index++;
     private static final int MONO_COUNT_M = index++;
     private static final int EO_COUNT_10_uL = index++;
     private static final int EO_COUNT_M = index++;
     private static final int BASO_COUNT_10_uL = index++;
     private static final int BASO_COUNT_M = index++;
     private static final int NEUT_PER_10_NEG_1_PER = index++;
     private static final int NEUT_PER_M = index++;
     private static final int LYMPH_PER_10_NEG_1_PER = index++;
     private static final int LYMPH_PER_M = index++;
     private static final int MONO_PER_10_NEG_1_PER = index++;
     private static final int MONO_PER_M = index++;
     private static final int EO_PER_10_NEG_1_PER = index++;
     private static final int EO_PER_M = index++;
     private static final int BASO_PER_10_NEG_1_PER = index++;
     private static final int BASO_PER_M = index++;
     private static final int RET_COUNT_10_2_uL = index++;
     private static final int RET_COUNT_M = index++;
     private static final int RET_PER_10_NEG_2_PER = index++;
     private static final int RET_PER_M = index++;
     private static final int LFR_10_NEG_1_PER = index++;
     private static final int LFR_M = index++;
     private static final int MFR_10_NEG_1_PER = index++;
     private static final int MFR_M = index++;
     private static final int HFR_10_NEG_1_PER = index++;
     private static final int HFR_M = index++;
     private static final int IRF_10_NEG_1_PER = index++;
     private static final int IRF_M = index++;
     private static final int IG_COUNT_10_uL = index++;
     private static final int IG_COUNT_M = index++;
     private static final int IG_PER_10_NEG_1_PER = index++;
     private static final int IG_PER_M = index++;
     private static final int NEUT_COUNT_AND_10_uL = index++;
     private static final int NEUT_COUNT_AND_M = index++;
     private static final int NEUT_PER_AND_10_NEG_1_PER = index++;
     private static final int NEUT_PER_AND_M = index++;
     private static final int NRBC_PLUS_W_10_uL = index++;
     private static final int NRBC_PLUS_W_M = index++;
     private static final int LYMPH_COUNT_AND_10_uL = index++;
     private static final int LYMPH_COUNT_AND_M = index++;
     private static final int LYMPH_PER_AND_10_NEG_1_PER = index++;
     private static final int LYMPH_PER_AND_M = index++;
     private static final int OTHER_COUNT_10_uL = index++;
     private static final int OTHER_COUNT_M = index++;
     private static final int OTHER_PER_10_NEG_1_PER = index++;
     private static final int OTHER_PER_M = index++;
     private static final int GR_O_10_4_uL = index++;
     private static final int GR_O_M = index++;
     private static final int PLQ_O_10_3_uL = index++;
     private static final int PLQ_O_M = index++;
     private static final int IP_Abn_GB_Scatterg_GB_Anorm = index++;
     private static final int IP_Abn_GB_NEUTROPENIA = index++;
     private static final int IP_Abn_GB_NEUTROPHILIE = index++;
     private static final int IP_Abn_GB_LYMPHOPENIA = index++;
     private static final int IP_Abn_GB_LYMPHCYTOSIS = index++;
     private static final int IP_Abn_GB_MONOCYTOSIS = index++;
     private static final int IP_Abn_GB_EOSINOPHILIE = index++;
     private static final int IP_Abn_GB_BASOPHILIE = index++;
     private static final int IP_Abn_GB_LEUCOPENIA = index++;
     private static final int IP_Abn_GB_LEUCOCYTOSIS = index++;
     private static final int IP_Abn_GR_Dist_GR_An = index++;
     private static final int IP_Abn_GR_D_pop_GR = index++;
     private static final int IP_Abn_GR_ANISOCYTOSIS = index++;
     private static final int IP_Abn_GR_MICROCYTOSIS = index++;
     private static final int IP_Abn_GR_MACROCYTOSIS = index++;
     private static final int IP_Abn_GR_HYPOCHROMIA = index++;
     private static final int IP_Abn_GR_ANEMIA = index++;
     private static final int IP_Abn_GR_ERYTHROCYTOSIS = index++;
     private static final int IP_Abn_GR_Scatterg_RET_Anorm = index++;
     private static final int IP_Abn_GR_RETICULOCYTOSIS = index++;
     private static final int IP_Abn_PLQ_Dist_PLQ_An = index++;
     private static final int IP_Abn_PLQ_THROMBOCYTOPENIA = index++;
     private static final int IP_Abn_PLQ_THROMBOCYTOSIS = index++;
     private static final int IP_Abn_PLQ_Scatterg_PLQ_Anorm = index++;
     private static final int IP_SUS_GB_Blasts = index++;
     private static final int IP_SUS_GB_Gra_Immat = index++;
     private static final int IP_SUS_GB_Dev_Gauche = index++;
     private static final int IP_SUS_GB_Lympho_Aty = index++;
     private static final int IP_SUS_GB_Anor_Ly_Blasts = index++;
     private static final int IP_SUS_GB_NRBC = index++;
private static final int IP_SUS_GB_Rs_GR_Lyse=index++;
     private static final int IP_SUS_GR_Agglut_GR = index++;
     private static final int IP_SUS_GR_Turb_HGB_Interf = index++;
     private static final int IP_SUS_GR_IRON_DEFICIENCY = index++;
     private static final int IP_SUS_GR_Def_HGB = index++;
     private static final int IP_SUS_GR_Fragments = index++;
     private static final int IP_SUS_PLQ_Agg_PLQ = index++;
     private static final int IP_SUS_PLQ_Agg_PLQ_S = index++;
     private static final int DEFAULT_INFO = index++;
     private static final int Qflag_Blasts = index++;
     private static final int Qflag_Gra_Immat = index++;
     private static final int Qflag_Dev_Gauche = index++;
     private static final int Qflag_Lympho_Aty = index++;
     private static final int Qflag_NRBC = index++;
     private static final int Qflag_Abn_Ly_Bla = index++;
private static final int Qflag_Rs_GR_Lysis=index++;
     private static final int Qflag_Agglut_GR = index++;
     private static final int Qflag_Turb_HGB = index++;
     private static final int Qflag_IRON_DEFICIENCY = index++;
     private static final int Qflag_Def_HGB = index++;
     private static final int Qflag_Fragments = index++;
     private static final int Qflag_Agg_PLQ = index++;
     private static final int Qflag_Agg_PLQ_S = index++;
     private static final int columns = index++;

     private static final String DELIMITER = ",";

     private static final String DATE_PATTERN = "yyyy/MM/dd HH:mm:ss";
     private static String[] testNameIndex = new String[columns];
     private static String[] unitsIndex = new String[columns];
     private static Boolean[] readOnlyIndex = new Boolean[columns];
     private static int[] scaleIndex = new int[columns];
     private static int[] orderedTestIndexs = new int[18];

     {
         testNameIndex[GB_10_uL] = "GB_10_uL";
         testNameIndex[GR_100000_uL] = "GR_100000_uL";
         testNameIndex[NEUT_PER_10_NEG_1_PER] = "NEUT_PER_10_NEG_1_PER";
         testNameIndex[HBG_g_L] = "HBG_g_L";
         testNameIndex[LYMPH_PER_10_NEG_1_PER] = "LYMPH_PER_10_NEG_1_PER";
         testNameIndex[HCT_10_NEG_1_PER] = "HCT_10_NEG_1_PER";
         testNameIndex[MONO_PER_10_NEG_1_PER] = "MONO_PER_10_NEG_1_PER";
         testNameIndex[VGM_10_NEG_1_fL] = "VGM_10_NEG_1_fL";
         testNameIndex[EO_PER_10_NEG_1_PER] = "EO_PER_10_NEG_1_PER";
         testNameIndex[TCMH_10_NEG_1_pg] = "TCMH_10_NEG_1_pg";
         testNameIndex[BASO_PER_10_NEG_1_PER] = "BASO_PER_10_NEG_1_PER";
         testNameIndex[CCMH_g_L] = "CCMH_g_L";
         testNameIndex[PLQ_10_3_uL] = "PLQ_10_3_uL";

         testNameIndex[NEUT_COUNT_10_uL] = "NEUT_COUNT_10_uL";
         testNameIndex[MONO_COUNT_10_uL] = "MONO_COUNT_10_uL";
         testNameIndex[BASO_COUNT_10_uL] = "BASO_COUNT_10_uL";
         testNameIndex[LYMPH_COUNT_10_uL] = "LYMPH_COUNT_10_uL";
         testNameIndex[EO_COUNT_10_uL] = "EO_COUNT_10_uL";

         unitsIndex[GB_10_uL] = "10^3/ul";
         unitsIndex[GR_100000_uL] = "10^6/ul";
         unitsIndex[NEUT_PER_10_NEG_1_PER] = "%";
         unitsIndex[HBG_g_L] = "g/dl";
         unitsIndex[LYMPH_PER_10_NEG_1_PER] = "%";
         unitsIndex[HCT_10_NEG_1_PER] = "%";
         unitsIndex[MONO_PER_10_NEG_1_PER] = "%";
         unitsIndex[VGM_10_NEG_1_fL] = "fl";
         unitsIndex[EO_PER_10_NEG_1_PER] = "%";
         unitsIndex[TCMH_10_NEG_1_pg] = "pg";
         unitsIndex[BASO_PER_10_NEG_1_PER] = "%";
         unitsIndex[CCMH_g_L] = "g/dl";
         unitsIndex[PLQ_10_3_uL] = "10^3/ul";

         unitsIndex[NEUT_COUNT_10_uL] = "10^3/ul";
         unitsIndex[MONO_COUNT_10_uL] = "10^3/ul";
         unitsIndex[BASO_COUNT_10_uL] = "10^3/ul";
         unitsIndex[LYMPH_COUNT_10_uL] = "10^3/ul";
         unitsIndex[EO_COUNT_10_uL] = "10^3/ul";

         for (int i = 0; i < readOnlyIndex.length; i++) {
             readOnlyIndex[i] = Boolean.FALSE;
         }
         /*
         readOnlyIndex[NEUT_COUNT_10_uL] = Boolean.TRUE;
         readOnlyIndex[MONO_COUNT_10_uL] = Boolean.TRUE;
         readOnlyIndex[BASO_COUNT_10_uL] = Boolean.TRUE;
         readOnlyIndex[LYMPH_COUNT_10_uL] = Boolean.TRUE;
         readOnlyIndex[EO_COUNT_10_uL] = Boolean.TRUE;
         */
         scaleIndex[GB_10_uL] = 100;
         scaleIndex[GR_100000_uL] = 100;
         scaleIndex[NEUT_PER_10_NEG_1_PER] = 10;
         scaleIndex[HBG_g_L] = 10;
         scaleIndex[LYMPH_PER_10_NEG_1_PER] = 10;
         scaleIndex[HCT_10_NEG_1_PER] = 10;
         scaleIndex[MONO_PER_10_NEG_1_PER] = 10;
         scaleIndex[VGM_10_NEG_1_fL] = 10;
         scaleIndex[EO_PER_10_NEG_1_PER] = 10;
         scaleIndex[TCMH_10_NEG_1_pg] = 10;
         scaleIndex[BASO_PER_10_NEG_1_PER] = 10;
         scaleIndex[CCMH_g_L] = 10;
         scaleIndex[PLQ_10_3_uL] = 1;
         scaleIndex[NEUT_COUNT_10_uL] = 100;
         scaleIndex[MONO_COUNT_10_uL] = 100;
         scaleIndex[BASO_COUNT_10_uL] = 100;
         scaleIndex[LYMPH_COUNT_10_uL] = 100;
         scaleIndex[EO_COUNT_10_uL] = 100;

         orderedTestIndexs[0] = GB_10_uL;
         orderedTestIndexs[1] = GR_100000_uL;
         orderedTestIndexs[13] = NEUT_PER_10_NEG_1_PER;
         orderedTestIndexs[2] = HBG_g_L;
         orderedTestIndexs[14] = LYMPH_PER_10_NEG_1_PER;
         orderedTestIndexs[3] = HCT_10_NEG_1_PER;
         orderedTestIndexs[15] = MONO_PER_10_NEG_1_PER;
         orderedTestIndexs[4] = VGM_10_NEG_1_fL;
         orderedTestIndexs[16] = EO_PER_10_NEG_1_PER;
         orderedTestIndexs[5] = TCMH_10_NEG_1_pg;
         orderedTestIndexs[17] = BASO_PER_10_NEG_1_PER;
         orderedTestIndexs[6] = CCMH_g_L;
         orderedTestIndexs[7] = PLQ_10_3_uL;

         orderedTestIndexs[8] = NEUT_COUNT_10_uL;
         orderedTestIndexs[10] = MONO_COUNT_10_uL;
         orderedTestIndexs[12] = BASO_COUNT_10_uL;
         orderedTestIndexs[9] = LYMPH_COUNT_10_uL;
         orderedTestIndexs[11] = EO_COUNT_10_uL;

     }

     public boolean insert(List<String> lines, String currentUserId) {

         boolean successful = true;

         List<AnalyzerResults> results = new ArrayList<AnalyzerResults>();

         for (int i = 1; i < lines.size(); i++) {
             addAnalyzerResultFromLine(results, lines.get(i));
         }

         if (results.size() > 0) {

             Transaction tx = HibernateProxy.beginTransaction();

             try {

                 persistResults(results, currentUserId);

                 tx.commit();

             } catch (LIMSRuntimeException lre) {
                 tx.rollback();
                 successful = false;
             } finally {
                 HibernateProxy.closeSession();
             }
         }

         return successful;
     }

     private void addAnalyzerResultFromLine(List<AnalyzerResults> results, String line) {
         String[] fields = line.split(DELIMITER);

         AnalyzerReaderUtil readerUtil = new AnalyzerReaderUtil();
         String analyzerAccessionNumber = fields[ID_PATIENT];
         //Timestamp timestamp = DateUtil.convertStringDateToTimestampWithPattern(fields[DATE] + " " + fields[TIME], DATE_PATTERN);
         Timestamp timestamp = DateUtil.convertStringDateToTimestampWithPattern(fields[DATE] + " " + fields[TIME],
                 DATE_PATTERN);

         List<AnalyzerResults> readOnlyResults = new ArrayList<AnalyzerResults>();

         //the reason for the indirection is to get the order of tests correct
         for (int i = 0; i < orderedTestIndexs.length; i++) {
             int testIndex = orderedTestIndexs[i];

             if (!GenericValidator.isBlankOrNull(testNameIndex[testIndex])) {
                 MappedTestName mappedName = AnalyzerTestNameCache.instance().getMappedTest("SysmeXT",
                         testNameIndex[testIndex]);

                 if (mappedName == null) {
                     mappedName = AnalyzerTestNameCache.instance().getEmptyMappedTestName("SysmeXT",
                             testNameIndex[testIndex]);
                 }

                 AnalyzerResults analyzerResults = new AnalyzerResults();

                 analyzerResults.setAnalyzerId(mappedName.getAnalyzerId());

                 double result = Double.NaN;

                 try {
                     result = Double.parseDouble(fields[testIndex]) / scaleIndex[testIndex];
                 } catch (NumberFormatException nfe) {
                     //no-op -- defaults to NAN
                 }

                 analyzerResults.setResult(String.valueOf(result));
                 analyzerResults.setUnits(unitsIndex[testIndex]);
                 analyzerResults.setCompleteDate(timestamp);
                 analyzerResults.setTestId(mappedName.getTestId());
                 analyzerResults.setAccessionNumber(analyzerAccessionNumber);
                 analyzerResults.setTestName(mappedName.getOpenElisTestName());
                 analyzerResults.setReadOnly(readOnlyIndex[testIndex]);

                 if (analyzerAccessionNumber != null) {
                     analyzerResults.setIsControl(analyzerAccessionNumber.startsWith(CONTROL_ACCESSION_PREFIX));
                 } else {
                     analyzerResults.setIsControl(false);
                 }

                 if (analyzerResults.isReadOnly()) {
                     readOnlyResults.add(analyzerResults);
                 } else {
                     results.add(analyzerResults);
                 }

                 AnalyzerResults resultFromDB = readerUtil.createAnalyzerResultFromDB(analyzerResults);
                 if (resultFromDB != null) {
                     results.add(resultFromDB);
                 }
             }
         }

         results.addAll(readOnlyResults);
     }

     @Override
     public String getError() {
         return "Sysmex analyzer unable to write to database";
     }

 }