More loinc work

This commit is contained in:
James Agnew 2018-03-11 15:46:59 -05:00
parent b9802d0101
commit 33554189a1
13 changed files with 263 additions and 66 deletions

View File

@ -1,5 +1,6 @@
Database migration:
update table TRM_CODESYSTEM_VER drop column RES_VERSION_ID;
drop constraint IDX_CSV_RESOURCEPID_AND_VER from table TRM_CODESYSTEM_VER
TODO:
In answer lists, figure out what to do with externally defined lists
@ -54,3 +55,7 @@ Document Ontology
- Need to define a URI for the document ontology ValueSet. Currently I am
using "http://loinc.org/document-ontology-codes"
Top 2000
- Need to define a URI for both ValueSets. Currently I am using
"http://loinc.org/top-2000-lab-results-us" and
"http://loinc.org/top-2000-lab-results-si"

View File

@ -33,7 +33,7 @@ public interface ITermCodeSystemVersionDao extends JpaRepository<TermCodeSystem
@Query("SELECT cs FROM TermCodeSystemVersion cs WHERE cs.myResource.myId = :resource_id")
List<TermCodeSystemVersion> findByCodeSystemResource(@Param("resource_id") Long theCodeSystemResourcePid);
@Query("SELECT cs FROM TermCodeSystemVersion cs WHERE cs.myResource.myId = :resource_id AND cs.myResourceVersionId = :version_id")
TermCodeSystemVersion findByCodeSystemResourceAndVersion(@Param("resource_id") Long theCodeSystemResourcePid, @Param("version_id") Long theCodeSystemVersionPid);
@Query("SELECT cs FROM TermCodeSystemVersion cs WHERE cs.myCodeSystemHavingThisVersionAsCurrentVersionIfAny.myResource.myId = :resource_id")
TermCodeSystemVersion findCurrentVersionForCodeSystemResourcePid(@Param("resource_id") Long theCodeSystemResourcePid);
}

View File

@ -41,9 +41,9 @@ import javax.persistence.UniqueConstraint;
import ca.uhn.fhir.util.CoverageIgnore;
//@formatter:off
@Table(name="TRM_CODESYSTEM_VER", uniqueConstraints= {
@UniqueConstraint(name="IDX_CSV_RESOURCEPID_AND_VER", columnNames= {"RES_ID", "RES_VERSION_ID"})
})
@Table(name="TRM_CODESYSTEM_VER"
// Note, we used to have a constraint named IDX_CSV_RESOURCEPID_AND_VER (don't reuse this)
)
@Entity()
//@formatter:on
public class TermCodeSystemVersion implements Serializable {
@ -65,6 +65,10 @@ public class TermCodeSystemVersion implements Serializable {
@Column(name = "CS_VERSION_ID", nullable = true, updatable = false)
private String myCodeSystemVersionId;
@SuppressWarnings("unused")
@OneToOne(mappedBy = "myCurrentVersion", optional = true)
private TermCodeSystem myCodeSystemHavingThisVersionAsCurrentVersionIfAny;
/**
* Constructor
*/

View File

@ -60,7 +60,6 @@ public class TerminologyLoaderSvcImpl implements IHapiTerminologyLoaderSvc {
public static final String SCT_FILE_CONCEPT = "Terminology/sct2_Concept_Full_";
public static final String SCT_FILE_DESCRIPTION = "Terminology/sct2_Description_Full-en";
public static final String SCT_FILE_RELATIONSHIP = "Terminology/sct2_Relationship_Full";
private static final int LOG_INCREMENT = 100000;
public static final String LOINC_ANSWERLIST_FILE = "AnswerList_Beta_1.csv";
public static final String LOINC_ANSWERLIST_LINK_FILE = "LoincAnswerListLink_Beta_1.csv";
public static final String LOINC_DOCUMENT_ONTOLOGY_FILE = "DocumentOntology.csv";
@ -70,7 +69,9 @@ public class TerminologyLoaderSvcImpl implements IHapiTerminologyLoaderSvc {
public static final String LOINC_PART_LINK_FILE = "LoincPartLink_Beta_1.csv";
public static final String LOINC_PART_RELATED_CODE_MAPPING_FILE = "PartRelatedCodeMapping_Beta_1.csv";
public static final String LOINC_RSNA_PLAYBOOK_FILE = "LoincRsnaRadiologyPlaybook.csv";
public static final String TOP2000_COMMON_LAB_RESULTS_US_FILE = "Top2000CommonLabResultsUS.csv";
public static final String TOP2000_COMMON_LAB_RESULTS_SI_FILE = "Top2000CommonLabResultsSI.csv";
private static final int LOG_INCREMENT = 100000;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(TerminologyLoaderSvcImpl.class);
@Autowired
private IHapiTerminologySvc myTermSvc;
@ -249,6 +250,14 @@ public class TerminologyLoaderSvcImpl implements IHapiTerminologyLoaderSvc {
handler = new LoincRsnaPlaybookHandler(codeSystemVersion, code2concept, propertyNames, valueSets, conceptMaps);
iterateOverZipFile(theZipBytes, LOINC_RSNA_PLAYBOOK_FILE, handler, ',', QuoteMode.NON_NUMERIC);
// Top 2000 Codes - US
handler = new LoincTop2000LabResultsUsHandler(code2concept, valueSets);
iterateOverZipFile(theZipBytes, TOP2000_COMMON_LAB_RESULTS_US_FILE, handler, ',', QuoteMode.NON_NUMERIC);
// Top 2000 Codes - SI
handler = new LoincTop2000LabResultsSiHandler(code2concept, valueSets);
iterateOverZipFile(theZipBytes, TOP2000_COMMON_LAB_RESULTS_SI_FILE, handler, ',', QuoteMode.NON_NUMERIC);
theZipBytes.clear();
for (Entry<String, TermConcept> next : code2concept.entrySet()) {

View File

@ -0,0 +1,80 @@
package ca.uhn.fhir.jpa.term.loinc;
import ca.uhn.fhir.jpa.entity.TermConcept;
import ca.uhn.fhir.jpa.term.IRecordHandler;
import org.hl7.fhir.r4.model.Enumerations;
import org.hl7.fhir.r4.model.ValueSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.apache.commons.lang3.StringUtils.isBlank;
abstract class BaseHandler implements IRecordHandler {
private final List<ValueSet> myValueSets;
private final Map<String, ValueSet> myIdToValueSet = new HashMap<>();
private final Map<String, TermConcept> myCode2Concept;
BaseHandler(Map<String, TermConcept> theCode2Concept, List<ValueSet> theValueSets) {
myValueSets = theValueSets;
myCode2Concept = theCode2Concept;
}
void addCodeAsIncludeToValueSet(ValueSet theVs, String theCodeSystemUrl, String theCode, String theDisplayName) {
ValueSet.ConceptSetComponent include = null;
for (ValueSet.ConceptSetComponent next : theVs.getCompose().getInclude()) {
if (next.getSystem().equals(theCodeSystemUrl)) {
include = next;
break;
}
}
if (include == null) {
include = theVs.getCompose().addInclude();
include.setSystem(theCodeSystemUrl);
}
boolean found = false;
for (ValueSet.ConceptReferenceComponent next : include.getConcept()) {
if (next.getCode().equals(theCode)) {
found = true;
}
}
if (!found) {
String displayName = theDisplayName;
if (isBlank(displayName)) {
for (TermConcept next : myCode2Concept.values()) {
if (next.getCode().equals(theCode)) {
displayName = next.getDisplay();
}
}
}
include
.addConcept()
.setCode(theCode)
.setDisplay(displayName);
}
}
ValueSet getValueSet(String theValueSetId, String theValueSetUri, String theValueSetName) {
ValueSet vs;
if (!myIdToValueSet.containsKey(theValueSetId)) {
vs = new ValueSet();
vs.setUrl(theValueSetUri);
vs.setId(theValueSetId);
vs.setName(theValueSetName);
vs.setStatus(Enumerations.PublicationStatus.ACTIVE);
myIdToValueSet.put(theValueSetId, vs);
myValueSets.add(vs);
} else {
vs = myIdToValueSet.get(theValueSetId);
}
return vs;
}
}

View File

@ -0,0 +1,36 @@
package ca.uhn.fhir.jpa.term.loinc;
import ca.uhn.fhir.jpa.entity.TermConcept;
import ca.uhn.fhir.jpa.term.IHapiTerminologyLoaderSvc;
import ca.uhn.fhir.jpa.term.IRecordHandler;
import org.apache.commons.csv.CSVRecord;
import org.hl7.fhir.r4.model.ValueSet;
import java.util.List;
import java.util.Map;
import static org.apache.commons.lang3.StringUtils.trim;
public class BaseLoincTop2000LabResultsHandler extends BaseHandler implements IRecordHandler {
private String myValueSetId;
private String myValueSetUri;
private String myValueSetName;
public BaseLoincTop2000LabResultsHandler(Map<String, TermConcept> theCode2concept, List<ValueSet> theValueSets, String theValueSetId, String theValueSetUri, String theValueSetName) {
super(theCode2concept, theValueSets);
myValueSetId = theValueSetId;
myValueSetUri = theValueSetUri;
myValueSetName = theValueSetName;
}
@Override
public void accept(CSVRecord theRecord) {
String loincNumber = trim(theRecord.get("LOINC #"));
String displayName = trim(theRecord.get("Long Common Name"));
ValueSet valueSet = getValueSet(myValueSetId, myValueSetUri, myValueSetName);
addCodeAsIncludeToValueSet(valueSet, IHapiTerminologyLoaderSvc.LOINC_URL, loincNumber, displayName);
}
}

View File

@ -13,7 +13,7 @@ import java.util.*;
import static org.apache.commons.lang3.StringUtils.trim;
public class LoincDocumentOntologyHandler implements IRecordHandler {
public class LoincDocumentOntologyHandler extends BaseHandler implements IRecordHandler {
public static final String DOCUMENT_ONTOLOGY_CODES_VS_ID = "DOCUMENT_ONTOLOGY_CODES_VS";
public static final String DOCUMENT_ONTOLOGY_CODES_VS_URI = "http://loinc.org/document-ontology-codes";
@ -21,15 +21,12 @@ public class LoincDocumentOntologyHandler implements IRecordHandler {
private final Map<String, TermConcept> myCode2Concept;
private final TermCodeSystemVersion myCodeSystemVersion;
private final Set<String> myPropertyNames;
private final List<ValueSet> myValueSets;
private final Map<String, ValueSet> myIdToValueSet = new HashMap<>();
private final Set<String> myCodesInDocumentOntologyValueSet = new HashSet<>();
public LoincDocumentOntologyHandler(TermCodeSystemVersion theCodeSystemVersion, Map<String, TermConcept> theCode2concept, Set<String> thePropertyNames, List<ValueSet> theValueSets) {
super(theCode2concept, theValueSets);
myCodeSystemVersion = theCodeSystemVersion;
myCode2Concept = theCode2concept;
myPropertyNames = thePropertyNames;
myValueSets = theValueSets;
}
@Override
@ -42,35 +39,10 @@ public class LoincDocumentOntologyHandler implements IRecordHandler {
String partName = trim(theRecord.get("PartName"));
// RSNA Codes VS
ValueSet vs;
if (!myIdToValueSet.containsKey(DOCUMENT_ONTOLOGY_CODES_VS_ID)) {
vs = new ValueSet();
vs.setUrl(DOCUMENT_ONTOLOGY_CODES_VS_URI);
vs.setId(DOCUMENT_ONTOLOGY_CODES_VS_ID);
vs.setName(DOCUMENT_ONTOLOGY_CODES_VS_NAME);
vs.setStatus(Enumerations.PublicationStatus.ACTIVE);
myIdToValueSet.put(DOCUMENT_ONTOLOGY_CODES_VS_ID, vs);
myValueSets.add(vs);
} else {
vs = myIdToValueSet.get(DOCUMENT_ONTOLOGY_CODES_VS_ID);
}
if (!myCodesInDocumentOntologyValueSet.contains(loincNumber)) {
String loincDisplayName= null;
if (myCode2Concept.containsKey(loincNumber)) {
loincDisplayName = myCode2Concept.get(loincNumber).getDisplay();
}
vs
.getCompose()
.getIncludeFirstRep()
.setSystem(IHapiTerminologyLoaderSvc.LOINC_URL)
.addConcept()
.setCode(loincNumber)
.setDisplay(loincDisplayName);
myCodesInDocumentOntologyValueSet.add(loincNumber);
}
ValueSet vs = getValueSet(DOCUMENT_ONTOLOGY_CODES_VS_ID, DOCUMENT_ONTOLOGY_CODES_VS_URI, DOCUMENT_ONTOLOGY_CODES_VS_NAME);
addCodeAsIncludeToValueSet(vs, IHapiTerminologyLoaderSvc.LOINC_URL, loincNumber, null);
// Part Properties
String loincCodePropName;
switch (partTypeName) {
case "Document.Kind":
@ -99,4 +71,6 @@ public class LoincDocumentOntologyHandler implements IRecordHandler {
}
}

View File

@ -0,0 +1,20 @@
package ca.uhn.fhir.jpa.term.loinc;
import ca.uhn.fhir.jpa.entity.TermConcept;
import org.hl7.fhir.r4.model.ValueSet;
import java.util.List;
import java.util.Map;
public class LoincTop2000LabResultsSiHandler extends BaseLoincTop2000LabResultsHandler {
public static final String TOP_2000_SI_VS_ID = "TOP_2000_SI_VS_ID";
public static final String TOP_2000_SI_VS_URI = "http://loinc.org/top-2000-lab-results-si";
public static final String TOP_2000_SI_VS_NAME = "Top 2000 Lab Results SI";
public LoincTop2000LabResultsSiHandler(Map<String, TermConcept> theCode2concept, List<ValueSet> theValueSets) {
super(theCode2concept, theValueSets, TOP_2000_SI_VS_ID, TOP_2000_SI_VS_URI, TOP_2000_SI_VS_NAME);
}
}

View File

@ -0,0 +1,20 @@
package ca.uhn.fhir.jpa.term.loinc;
import ca.uhn.fhir.jpa.entity.TermConcept;
import org.hl7.fhir.r4.model.ValueSet;
import java.util.List;
import java.util.Map;
public class LoincTop2000LabResultsUsHandler extends BaseLoincTop2000LabResultsHandler {
public static final String TOP_2000_US_VS_ID = "TOP_2000_LABRESULTS_US";
public static final String TOP_2000_US_VS_URI = "http://loinc.org/top-2000-lab-results-us";
public static final String TOP_2000_US_VS_NAME = "Top 2000 Lab Results US";
public LoincTop2000LabResultsUsHandler(Map<String, TermConcept> theCode2concept, List<ValueSet> theValueSets) {
super(theCode2concept, theValueSets, TOP_2000_US_VS_ID, TOP_2000_US_VS_URI, TOP_2000_US_VS_NAME);
}
}

View File

@ -6,11 +6,14 @@ import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.util.List;
public class TerminologyLoaderSvcIntegrationDstu3Test extends BaseJpaDstu3Test {
@Autowired
private TerminologyLoaderSvcImpl myLoader;
@AfterClass
@ -18,17 +21,14 @@ public class TerminologyLoaderSvcIntegrationDstu3Test extends BaseJpaDstu3Test {
TestUtil.clearAllStaticFieldsForUnitTest();
}
@Before
public void beforeInitTest() {
myLoader = new TerminologyLoaderSvcImpl();
myLoader.setTermSvcForUnitTests(myTermSvc);
}
@Test
@Ignore
public void testLoadAndStoreLoinc() {
List<byte[]> files;
// myLoader.processSnomedCtFiles(files, mySrd);
public void testLoadAndStoreLoinc() throws Exception {
ZipCollectionBuilder files = new ZipCollectionBuilder();
TerminologyLoaderSvcLoincTest.createLoincBundle(files);
myLoader.loadLoinc(files.getFiles(), mySrd);
Thread.sleep(120000);
}
}

View File

@ -2,10 +2,7 @@ package ca.uhn.fhir.jpa.term;
import ca.uhn.fhir.jpa.entity.TermCodeSystemVersion;
import ca.uhn.fhir.jpa.entity.TermConcept;
import ca.uhn.fhir.jpa.term.loinc.LoincDocumentOntologyHandler;
import ca.uhn.fhir.jpa.term.loinc.LoincPartHandler;
import ca.uhn.fhir.jpa.term.loinc.LoincPartRelatedCodeMappingHandler;
import ca.uhn.fhir.jpa.term.loinc.LoincRsnaPlaybookHandler;
import ca.uhn.fhir.jpa.term.loinc.*;
import ca.uhn.fhir.rest.api.server.RequestDetails;
import ca.uhn.fhir.util.TestUtil;
import org.hl7.fhir.r4.model.CodeSystem;
@ -21,6 +18,7 @@ import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -66,15 +64,7 @@ public class TerminologyLoaderSvcLoincTest {
@Test
public void testLoadLoinc() throws Exception {
myFiles.addFile("/loinc/", "loinc.csv", TerminologyLoaderSvcImpl.LOINC_FILE);
myFiles.addFile("/loinc/", "hierarchy.csv", TerminologyLoaderSvcImpl.LOINC_HIERARCHY_FILE);
myFiles.addFile("/loinc/", "AnswerList_Beta_1.csv", TerminologyLoaderSvcImpl.LOINC_ANSWERLIST_FILE);
myFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_ANSWERLIST_LINK_FILE, TerminologyLoaderSvcImpl.LOINC_ANSWERLIST_LINK_FILE);
myFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_PART_FILE, TerminologyLoaderSvcImpl.LOINC_PART_FILE);
myFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_PART_LINK_FILE, TerminologyLoaderSvcImpl.LOINC_PART_LINK_FILE);
myFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_PART_RELATED_CODE_MAPPING_FILE);
myFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_DOCUMENT_ONTOLOGY_FILE);
myFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_RSNA_PLAYBOOK_FILE);
createLoincBundle(myFiles);
// Actually do the load
mySvc.loadLoinc(myFiles.getFiles(), details);
@ -240,14 +230,53 @@ public class TerminologyLoaderSvcLoincTest {
assertEquals("US Retroperitoneum", group.getElement().get(0).getTarget().get(0).getDisplay());
assertEquals(Enumerations.ConceptMapEquivalence.EQUAL, group.getElement().get(0).getTarget().get(0).getEquivalence());
// TOP 2000 - US
vs = valueSets.get(LoincTop2000LabResultsUsHandler.TOP_2000_US_VS_ID);
assertEquals(vs.getName(), LoincTop2000LabResultsUsHandler.TOP_2000_US_VS_NAME);
assertEquals(vs.getUrl(), LoincTop2000LabResultsUsHandler.TOP_2000_US_VS_URI);
assertEquals(1, vs.getCompose().getInclude().size());
assertEquals(IHapiTerminologyLoaderSvc.LOINC_URL, vs.getCompose().getInclude().get(0).getSystem());
assertEquals(9, vs.getCompose().getInclude().get(0).getConcept().size());
assertEquals("2160-0", vs.getCompose().getInclude().get(0).getConcept().get(0).getCode());
assertEquals("Creatinine [Mass/volume] in Serum or Plasma", vs.getCompose().getInclude().get(0).getConcept().get(0).getDisplay());
assertEquals("718-7", vs.getCompose().getInclude().get(0).getConcept().get(1).getCode());
assertEquals("Hemoglobin [Mass/volume] in Blood", vs.getCompose().getInclude().get(0).getConcept().get(1).getDisplay());
// TOP 2000 - SI
vs = valueSets.get(LoincTop2000LabResultsSiHandler.TOP_2000_SI_VS_ID);
assertEquals(vs.getName(), LoincTop2000LabResultsSiHandler.TOP_2000_SI_VS_NAME);
assertEquals(vs.getUrl(), LoincTop2000LabResultsSiHandler.TOP_2000_SI_VS_URI);
assertEquals(1, vs.getCompose().getInclude().size());
assertEquals(IHapiTerminologyLoaderSvc.LOINC_URL, vs.getCompose().getInclude().get(0).getSystem());
assertEquals(9, vs.getCompose().getInclude().get(0).getConcept().size());
assertEquals("14682-9", vs.getCompose().getInclude().get(0).getConcept().get(0).getCode());
assertEquals("Creatinine [Moles/volume] in Serum or Plasma", vs.getCompose().getInclude().get(0).getConcept().get(0).getDisplay());
assertEquals("718-7", vs.getCompose().getInclude().get(0).getConcept().get(1).getCode());
assertEquals("Hemoglobin [Mass/volume] in Blood", vs.getCompose().getInclude().get(0).getConcept().get(1).getDisplay());
}
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
static void createLoincBundle(ZipCollectionBuilder theFiles) throws IOException {
theFiles.addFile("/loinc/", "loinc.csv", TerminologyLoaderSvcImpl.LOINC_FILE);
theFiles.addFile("/loinc/", "hierarchy.csv", TerminologyLoaderSvcImpl.LOINC_HIERARCHY_FILE);
theFiles.addFile("/loinc/", "AnswerList_Beta_1.csv", TerminologyLoaderSvcImpl.LOINC_ANSWERLIST_FILE);
theFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_ANSWERLIST_LINK_FILE, TerminologyLoaderSvcImpl.LOINC_ANSWERLIST_LINK_FILE);
theFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_PART_FILE, TerminologyLoaderSvcImpl.LOINC_PART_FILE);
theFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_PART_LINK_FILE, TerminologyLoaderSvcImpl.LOINC_PART_LINK_FILE);
theFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_PART_RELATED_CODE_MAPPING_FILE);
theFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_DOCUMENT_ONTOLOGY_FILE);
theFiles.addFile("/loinc/", TerminologyLoaderSvcImpl.LOINC_RSNA_PLAYBOOK_FILE);
/*
* Top 2000 files have versions in the filename so don't use the
* constant.. that way this is a better test
*/
theFiles.addFile("/loinc/", "LOINC_1.6_Top2000CommonLabResultsSI.csv");
theFiles.addFile("/loinc/", "LOINC_1.6_Top2000CommonLabResultsUS.csv");
}
}

View File

@ -0,0 +1,10 @@
LOINC #,Long Common Name,Short Name,CLASS,Rank
14682-9,Creatinine [Moles/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1
718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2
2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3
14749-6,Glucose [Moles/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4
2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5
3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6
2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7
2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8
789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9
1 LOINC # Long Common Name Short Name CLASS Rank
2 14682-9 Creatinine [Moles/volume] in Serum or Plasma Creat SerPl-mCnc Chem 1
3 718-7 Hemoglobin [Mass/volume] in Blood Hgb Bld-mCnc HEM/BC 2
4 2823-3 Potassium [Moles/volume] in Serum or Plasma Potassium SerPl-sCnc Chem 3
5 14749-6 Glucose [Moles/volume] in Serum or Plasma Glucose SerPl-mCnc Chem 4
6 2951-2 Sodium [Moles/volume] in Serum or Plasma Sodium SerPl-sCnc Chem 5
7 3094-0 Urea nitrogen [Mass/volume] in Serum or Plasma BUN SerPl-mCnc Chem 6
8 2028-9 Carbon dioxide, total [Moles/volume] in Serum or Plasma CO2 SerPl-sCnc Chem 7
9 2075-0 Chloride [Moles/volume] in Serum or Plasma Chloride SerPl-sCnc Chem 8
10 789-8 Erythrocytes [#/volume] in Blood by Automated count RBC # Bld Auto HEM/BC 9

View File

@ -0,0 +1,10 @@
LOINC #,Long Common Name,Short Name,CLASS,Rank
2160-0,Creatinine [Mass/volume] in Serum or Plasma,Creat SerPl-mCnc,Chem,1
718-7,Hemoglobin [Mass/volume] in Blood,Hgb Bld-mCnc,HEM/BC,2
2823-3,Potassium [Moles/volume] in Serum or Plasma,Potassium SerPl-sCnc,Chem,3
2345-7,Glucose [Mass/volume] in Serum or Plasma,Glucose SerPl-mCnc,Chem,4
2951-2,Sodium [Moles/volume] in Serum or Plasma,Sodium SerPl-sCnc,Chem,5
3094-0,Urea nitrogen [Mass/volume] in Serum or Plasma,BUN SerPl-mCnc,Chem,6
2028-9,"Carbon dioxide, total [Moles/volume] in Serum or Plasma",CO2 SerPl-sCnc,Chem,7
2075-0,Chloride [Moles/volume] in Serum or Plasma,Chloride SerPl-sCnc,Chem,8
789-8,Erythrocytes [#/volume] in Blood by Automated count,RBC # Bld Auto,HEM/BC,9
1 LOINC # Long Common Name Short Name CLASS Rank
2 2160-0 Creatinine [Mass/volume] in Serum or Plasma Creat SerPl-mCnc Chem 1
3 718-7 Hemoglobin [Mass/volume] in Blood Hgb Bld-mCnc HEM/BC 2
4 2823-3 Potassium [Moles/volume] in Serum or Plasma Potassium SerPl-sCnc Chem 3
5 2345-7 Glucose [Mass/volume] in Serum or Plasma Glucose SerPl-mCnc Chem 4
6 2951-2 Sodium [Moles/volume] in Serum or Plasma Sodium SerPl-sCnc Chem 5
7 3094-0 Urea nitrogen [Mass/volume] in Serum or Plasma BUN SerPl-mCnc Chem 6
8 2028-9 Carbon dioxide, total [Moles/volume] in Serum or Plasma CO2 SerPl-sCnc Chem 7
9 2075-0 Chloride [Moles/volume] in Serum or Plasma Chloride SerPl-sCnc Chem 8
10 789-8 Erythrocytes [#/volume] in Blood by Automated count RBC # Bld Auto HEM/BC 9