/**
* 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) CIRG, University of Washington, Seattle WA. All Rights Reserved.
*
*/
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 FacscaliburReader extends AnalyzerLineInserter {
private static final String CONTROL_ACCESSION_PREFIX = "IMM";
private static int index = 0;
private static final int Institution = index++;
private static final int Director = index++;
private static final int Operator = index++;
private static final int Cytometer = index++;
private static final int Cytometer_Serial_Number = index++;
private static final int Software_Version = index++;
private static final int Sample_Name = index++;
private static final int Sample_ID = index++;
private static final int Case_Number = index++;
private static final int Column_1 = index++;
private static final int Column_2 = index++;
private static final int Column_3 = index++;
private static final int Panel_Name = index++;
private static final int Collection_Date = index++;
private static final int Date_Analyzed = index++;
private static final int Lab_Report_File_Name = index++;
private static final int Physicians_Report_File_Name = index++;
private static final int WBC_Count_x1000 = index++;
private static final int Lymphs_per = index++;
private static final int Lymphs_x1000 = index++;
private static final int Abs_Cnt_Bead_Name = index++;
private static final int Abs_Cnt_Bead_Lot_ID = index++;
private static final int Abs_Cnt_Beads_Pellet = index++;
private static final int Control_Bead_Name = index++;
private static final int Control_Bead_Lot_ID = index++;
private static final int Control_Low_Beads_µL = index++;
private static final int Control_Medium_Beads_µL = index++;
private static final int Control_High_Beads_µL = index++;
private static final int Control_Low_SD = index++;
private static final int Control_Medium_SD = index++;
private static final int Control_High_SD = index++;
private static final int Ref_Range = index++;
private static final int Comments = index++;
private static final int Lymphosum = index++;
private static final int CD3_per_Lymph_Difference = index++;
private static final int T_Helper_Suppressor_Ratio = index++;
private static final int Min_CD3_Abs_Cnt_Range = index++;
private static final int Max_CD3_Abs_Cnt_Range = index++;
private static final int Avg_CD3_CD4_per_T_Lymph = index++;
private static final int Avg_CD3_CD8__per_T_Lymph = index++;
private static final int Avg_CD3_CD4_CD8__per_T_Lymph = index++;
private static final int Avg_CD3__per_Lymph = index++;
private static final int Avg_CD3__Abs_Cnt = index++;
private static final int Avg_CD3_CD4__per_Lymph = index++;
private static final int Avg_CD3_CD4__Abs_Cnt = index++;
private static final int Avg_CD3_CD8__per_Lymph = index++;
private static final int Avg_CD3_CD8__Abs_Cnt = index++;
private static final int Avg_CD3_CD4_CD8__per_Lymph = index++;
private static final int Avg_CD3_CD4_CD8__Abs_Cnt = index++;
private static final int Avg_CD19__per_Lymph = index++;
private static final int Avg_CD19__Abs_Cnt = index++;
private static final int Avg_CD16_56__per_Lymph = index++;
private static final int Avg_CD16_56__Abs_Cnt = index++;
private static final int CD45__Abs_Cnt = index++;
private static final int CD3_CD4_CD45_FCS_File_Name = index++;
private static final int CD3_CD4_CD45_Lot_ID = index++;
private static final int CD3_CD4_CD45_Collection_Time = index++;
private static final int CD3_CD4_CD45_Total_Events = index++;
private static final int CD3_CD4_CD45_Tube_Name = index++;
private static final int CD3_CD4_CD45_Attr_Def_File_Name = index++;
private static final int CD3_CD4_CD45_Error_Codes = index++;
private static final int CD3_CD4_CD45_Lymph_Events = index++;
private static final int CD3_CD4_CD45_CD3__per_Lymph = index++;
private static final int CD3_CD4_CD45_CD3__Abs_Cnt = index++;
private static final int CD3_CD4_CD45_CD3_CD4__per_Lymph = index++;
private static final int columns = index++;
private static final String DELIMITER = "\t";
private static final String DATE_PATTERN = "dd-MMMM-yy kk:mm:ss";
private static final String ALT_DATE_PATTERN = "dd MMM yyyy KK:mm";
private static String[] testNameIndex = new String[columns];
private static String[] unitsIndex = new String[columns];
{
testNameIndex[Avg_CD3__per_Lymph] = "CD3_PER";
testNameIndex[Avg_CD3_CD4__per_Lymph] = "CD4_PER";
unitsIndex[Avg_CD3__per_Lymph] = "%";
unitsIndex[Avg_CD3_CD4__per_Lymph] = "%";
}
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[Sample_ID];
String date = fields[Collection_Date];
for (int i = 0; i < testNameIndex.length; i++) {
if (!GenericValidator.isBlankOrNull(testNameIndex[i])) {
MappedTestName mappedName = AnalyzerTestNameCache.instance().getMappedTest(AnalyzerTestNameCache.FACSCALIBUR, testNameIndex[i]);
if( mappedName == null){
mappedName = AnalyzerTestNameCache.instance().getEmptyMappedTestName(AnalyzerTestNameCache.FACSCALIBUR, testNameIndex[i]);
}
AnalyzerResults analyzerResults = new AnalyzerResults();
analyzerResults.setAnalyzerId(mappedName.getAnalyzerId());
String result = fields[i];
analyzerResults.setResult(result);
analyzerResults.setUnits(unitsIndex[i]);
String dateTime = date;
Timestamp timestamp = getTimestampFromDate(dateTime);
analyzerResults.setCompleteDate(timestamp);
analyzerResults.setTestId(mappedName.getTestId());
analyzerResults.setAccessionNumber(analyzerAccessionNumber);
analyzerResults.setTestName(mappedName.getOpenElisTestName());
if (analyzerAccessionNumber != null) {
analyzerResults.setIsControl(analyzerAccessionNumber.startsWith(CONTROL_ACCESSION_PREFIX));
} else {
analyzerResults.setIsControl(false);
}
results.add(analyzerResults);
AnalyzerResults resultFromDB = readerUtil.createAnalyzerResultFromDB(analyzerResults);
if( resultFromDB != null){
results.add(resultFromDB);
}
}
}
}
private Timestamp getTimestampFromDate(String dateTime) {
//Mixed date formats are sneaking in ie 24-Jul-12 15:07:09 or Mer 25 juil 2012 9:46
if( dateTime.contains("-")){
return DateUtil.convertStringDateToTimestampWithPatternNoLocale(dateTime , DATE_PATTERN);
}
String[] dateSegs = dateTime.split(" ");
String month = getCorrectedMonth( dateSegs[2] );
String date = dateSegs[1] + " " + month + " " + dateSegs[3] + " " + dateSegs[4];
return DateUtil.convertStringDateToTimestampWithPattern(date , ALT_DATE_PATTERN);
}
//The analyzer is sending abbreviated months without the '.'
private String getCorrectedMonth(String month) {
if( month.endsWith(".") || month.equals("mars") || month.equals("mai") || month.equals("juin") || month.equals("août") ){
return month;
}
return month + ".";
}
@Override
public String getError() {
return "Facscalibur analyzer unable to write to database";
}
}