/**
* 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 us.mn.state.health.lims.analyzerimport.analyzerreaders;
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;
@SuppressWarnings("unused")
public class SysmexReader 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_Rés_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_Rés_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 = "dd/MM/yyyy 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] = "NE#";
testNameIndex[MONO_COUNT_10_uL] = "MO#";
testNameIndex[BASO_COUNT_10_uL] = "BA#";
testNameIndex[LYMPH_COUNT_10_uL] = "LY#";
testNameIndex[EO_COUNT_10_uL] = "EO#";
*/
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/l";
unitsIndex[PLQ_10_3_uL] = "10^3/ul";
/* unitsIndex[NEUT_COUNT_10_uL] = " ";
unitsIndex[MONO_COUNT_10_uL] = " ";
unitsIndex[BASO_COUNT_10_uL] = " ";
unitsIndex[LYMPH_COUNT_10_uL] = " ";
unitsIndex[EO_COUNT_10_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] = 10;
scaleIndex[LYMPH_COUNT_10_uL] = 100;
scaleIndex[EO_COUNT_10_uL] = 100;
*/
orderedTestIndexs[0] =GB_10_uL;
orderedTestIndexs[6] = GR_100000_uL;
orderedTestIndexs[1] = NEUT_PER_10_NEG_1_PER;
orderedTestIndexs[7] = HBG_g_L;
orderedTestIndexs[2] = LYMPH_PER_10_NEG_1_PER;
orderedTestIndexs[8] = HCT_10_NEG_1_PER;
orderedTestIndexs[3] = MONO_PER_10_NEG_1_PER;
orderedTestIndexs[9] = VGM_10_NEG_1_fL;
orderedTestIndexs[4] = EO_PER_10_NEG_1_PER;
orderedTestIndexs[10] = TCMH_10_NEG_1_pg;
orderedTestIndexs[5] = BASO_PER_10_NEG_1_PER;
orderedTestIndexs[11] = CCMH_g_L;
orderedTestIndexs[12] = PLQ_10_3_uL;
orderedTestIndexs[13] = NEUT_COUNT_10_uL;
orderedTestIndexs[15] = MONO_COUNT_10_uL;
orderedTestIndexs[17] = BASO_COUNT_10_uL;
orderedTestIndexs[14] = LYMPH_COUNT_10_uL;
orderedTestIndexs[16] = EO_COUNT_10_uL;
/*
GB_10_uL WBC 100
GR_100000_uL RBC 100
NEUT_PER_10_NEG_1_PER NE% 10
HBG_g_L HGB 10
LYMPH_PER_10_NEG_1_PER LY% 10
HCT_10_NEG_1_PER HCT 10
MONO_PER_10_NEG_1_PER MO% 10
VGM_10_NEG_1_fL MVC 10
EO_PER_10_NEG_1_PER EO% 10
TCMH_10_NEG_1_pg MCH 10
BASO_PER_10_NEG_1_PER BA% 10
CCMH_g_L MCHC 10
PLQ_10_3_uL PLT 1
NEUT_COUNT_10_uL NE# 100
MONO_COUNT_10_uL MO# 100
BASO_COUNT_10_uL BA# 10
LYMPH_COUNT_10_uL LY# 100
EO_COUNT_10_uL EO# 100
*/
}
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[ACCESSION];
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(AnalyzerTestNameCache.SYSMEX_XT2000_NAME, testNameIndex[testIndex]);
if( mappedName == null){
mappedName = AnalyzerTestNameCache.instance().getEmptyMappedTestName(AnalyzerTestNameCache.SYSMEX_XT2000_NAME, 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";
}
}