> \t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t496757\tLABEXCHTX\tEXCHANGE TRANSFUSION\tFFP\tFRESH FROZEN UNITS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t496757\tLABEXCHTX\tEXCHANGE TRANSFUSION\tRBCSTA\tRBC PRODUCT - UNITS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t618512\tLABTBP57\tTRANSFUSION BLOOD PRODUCT 58\tVL\tPRODUCT VOLUME\t165\t#VALUE!\t1\t165\t27225\t0\tNone\tNone
+BODY FLUID ORDERABLES\t471793\tLABBMBCRQ\tBCR - ABL QUANTITATIVE, BONE MARROW\tQBMBRD\tINTERPRETED BY\t9999999\t496642.1053\t1\t9999999\t1.00E+14\t19\t9436200\t6.91E+12
+BODY FLUID ORDERABLES\t471954\tLABBFCT\tCELL COUNT AND DIFF, FLUID\tBANDFLD\tBAND, FLD\t3\t#VALUE!\t1\t3\t9\t0\tNone\tNone
+BODY FLUID ORDERABLES\t471954\tLABBFCT\tCELL COUNT AND DIFF, FLUID\tFPMN\tPMN, FLD\t11\t#VALUE!\t1\t11\t121\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472012\tLAB11438R\tCHLAMYDIA TRACHOMATIS CULTURE\t11502R\tCHLAMYDIA TRACHOMATIS CULTURE\t9999999\t122600\t1\t9999999\t1.00E+14\t3\t367800\t93376756800
+BODY FLUID ORDERABLES\t472047\tLAB11123R\tCOCCI CF AB, CSF\tCOCC\tCOCCI CF AB (CSF)\t9999999\t768057.9747\t1\t9999999\t1.00E+14\t237\t182029740\t4.44E+14
+BODY FLUID ORDERABLES\t472182\tLABFDIFF\tDIFFERENTIAL, BODY FLUID\tCCNT\tCELLS COUNTED\t39\t#VALUE!\t1\t39\t1521\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472184\tLABSYDIFF\tDIFFERENTIAL, SYNOVIAL FLUID\tSNRBC\tNRBC/100WBC, SYN FLD\t14\t780\t1\t14\t196\t1\t780\t608400
+BODY FLUID ORDERABLES\t472184\tLABSYDIFF\tDIFFERENTIAL, SYNOVIAL FLUID\tSRLYM\tREACT LYMPH, SYN FLD\t2\t780\t1\t2\t4\t1\t780\t608400
+BODY FLUID ORDERABLES\t472774\tLABLWBCC\tLYME WESTERN BLOT, CSF\tBANDPRSNT\tBANDS PRESENT\t9999999\t408240\t1\t9999999\t1.00E+14\t2\t816480\t3.43E+11
+BODY FLUID ORDERABLES\t472774\tLABLWBCC\tLYME WESTERN BLOT, CSF\tBBIGM\tBORELLIA BURG IGM AB\t9999999\t277031.25\t1\t9999999\t1.00E+14\t16\t4432500\t1.39E+12
+BODY FLUID ORDERABLES\t472851\tLABTMSI\tMICROSATELLITE INSTABILITY\tTMSIMD\tINTERPRETED BY\t9999999\t927889.0909\t1\t9999999\t1.00E+14\t11\t10206780\t1.25E+13
+BODY FLUID ORDERABLES\t472933\tLABYMYCRB\tMYCOPLASMA CULTURE, RESPIRATORY\tYMYCR1\tSTATUS\t9999999\t2142018\t1\t9999999\t1.00E+14\t10\t21420180\t5.46E+13
+BODY FLUID ORDERABLES\t472933\tLABYMYCRB\tMYCOPLASMA CULTURE, RESPIRATORY\tYMYCR2\tMYCOPLASMA PNEUMONIAE CULTURE\t9999999\t2142018\t1\t9999999\t1.00E+14\t10\t21420180\t5.46E+13
+BODY FLUID ORDERABLES\t472935\tLABYCMBP\tMYELIN BASIC PROTEIN, CSF\tMBPCSF\tMYELIN BAS.PROT,CSF\t0.9\t#VALUE!\t1\t0.9\t0.81\t0\tNone\tNone
+BODY FLUID ORDERABLES\t473131\tLABLIVER\tPRE LIVER TRANSPLANT PANEL\tHQLINT\tINTERPRETATION\t9999999\t359730\t1\t9999999\t1.00E+14\t2\t719460\t2.59E+11
+BODY FLUID ORDERABLES\t473219\tLABURED\tREDUCING SUBSTANCE, URINE\tREDSUBURN\tREDUCING SUBST., URINE\t9999999\t7800\t1\t9999999\t1.00E+14\t1\t7800\t60840000
+BODY FLUID ORDERABLES\t473359\tLABPOLYSP\tSPUTUM FOR PMNS\tPOLYSP\tSPUTUM FOR PMNS\t9999999\t14460\t1\t9999999\t1.00E+14\t1\t14460\t209091600
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\t12001R\tVCA IGG ,IFA\t9999999\t268440\t1\t9999999\t1.00E+14\t1\t268440\t72060033600
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\t12002R\tVCA IGM ,IFA\t9999999\t268440\t1\t9999999\t1.00E+14\t1\t268440\t72060033600
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tCOM\tCOMMENT\t9999999\t550720\t1\t9999999\t1.00E+14\t3\t1652160\t1.46E+12
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tEA\tEARLY ANTIBODY (R+D) IGG\t9999999\t691860\t1\t9999999\t1.00E+14\t2\t1383720\t1.39E+12
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tEBNA\tEPSTEIN-BARR NUC AB\t9999999\t691860\t1\t9999999\t1.00E+14\t2\t1383720\t1.39E+12
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tHTLVS\tHTLV AB SCREEN\t9999999\t550720\t1\t9999999\t1.00E+14\t3\t1652160\t1.46E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\t1STCONST\t1ST CONSTITUENT\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\t2NDCONST\t2ND CONSTITUENT\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\t3RDCONST\t3RD CONSTITUENT\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\tYSTNCO\tSTONE COMMENT\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\tYSTNNJ\tNIDUS, MAJOR\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\tYSTNNM\tNIDUS, MINOR\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\tYSTNSJ\tSHELL, MAJOR\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\tYSTNSM\tSHELL, MINOR\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\tYSTON\tSTONE ANALYSIS\t9999999\t207922.6667\t1\t9999999\t1.00E+14\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473398\tLABBM1418\tT(14\t18), BONE MARROW\tBM14RS\tRESULTS\t9999999\t1070614.286\t1\t9999999\t1.00E+14\t7\t7494300\t9.42E+12
+BODY FLUID ORDERABLES\t473406\tLABBMTCLO\tT-CELL CLONALITY PCR, BONE MARROW\tBMTDIR\tINTERPRETED BY\t9999999\t771152.3077\t1\t9999999\t1.00E+14\t13\t10024980\t1.13E+13
+BODY FLUID ORDERABLES\t473748\tLABYVDRLC\tVDRL, CSF\tVDRL\tVDRL\t9999999\t248982\t1\t9999999\t1.00E+14\t90\t22408380\t3.08E+13
+BODY FLUID ORDERABLES\t496772\tLABHEPAT\tHEPATIC PROFILE\tALB\tALBUMIN, SER/PLAS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t496772\tLABHEPAT\tHEPATIC PROFILE\tALKP\tALK P\'TASE, TOTAL, SER/PLAS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t496772\tLABHEPAT\tHEPATIC PROFILE\tALT\tALT (SGPT), SER/PLAS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t496772\tLABHEPAT\tHEPATIC PROFILE\tAST\tAST (SGOT), SER/PLAS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t496772\tLABHEPAT\tHEPATIC PROFILE\tDBIL\tCONJUGATED BILI\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t496772\tLABHEPAT\tHEPATIC PROFILE\tIBIL\tUNCONJUGATED BILIRUBIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t496772\tLABHEPAT\tHEPATIC PROFILE\tTBIL\tTOTAL BILIRUBIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t497333\tLABMYCOC\tMYCOPLASMA CULTURE, FASTIDIOUS\tMYORG\tMYCOPLASAM ORGANISM\t9999999\t1967535\t1\t9999999\t1.00E+14\t4\t7870140\t2.00E+13
+BODY FLUID ORDERABLES\t497362\tLABYFK\tPOTASSIUM, FLUID\tYFLSC1\tFLUID TYPE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t497366\tLABYFNA\tSODIUM, FLUID\tYFLSC1\tFLUID TYPE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+BODY FLUID ORDERABLES\t497368\tLABYFGL\tGLUCOSE, FLUID\tYFLSC1\tFLUID TYPE\t9999999\t178578.6207\t1\t9999999\t1.00E+14\t58\t10357560\t2.39E+12
+BODY FLUID ORDERABLES\t497376\tLABYFCL\tCHLORIDE, FLUID\tYFLSC1\tFLUID TYPE\t9999999\t242700\t1\t9999999\t1.00E+14\t1\t242700\t58903290000
+BODY FLUID ORDERABLES\t497380\tLABYFUN\tUREA NITROGEN, FLUID\t11847R\tFLUID TYPE\t9999999\t169644\t1\t9999999\t1.00E+14\t10\t1696440\t3.58E+11
+BODY FLUID ORDERABLES\t669900\tLABKRAS\tKRAS MUTATION DETECTION\tKRASMD\tINTERPRETED BY\t9999999\t797353.8462\t1\t9999999\t1.00E+14\t13\t10365600\t1.05E+13
+BODY FLUID ORDERABLES\t669983\tLAB11000R\tCEA, PANCREATIC CYST\t11002R\tSITE\t9999999\t174390\t1\t9999999\t1.00E+14\t14\t2441460\t4.88E+11
+BODY FLUID ORDERABLES\t744304\tLAB11591R\tARSENIC, HAIR\t12046R\tARSENIC, HAIR\t9999999\t206940\t1\t9999999\t1.00E+14\t1\t206940\t42824163600
+BODY FLUID ORDERABLES\t744304\tLAB11591R\tARSENIC, HAIR\t12047R\tSPECIMEN SOURCE\t9999999\t206940\t1\t9999999\t1.00E+14\t1\t206940\t42824163600
+BODY FLUID ORDERABLES\t744306\tLAB11592R\tCOPPER, TISSUE\t11720R\tCOPPER, LIVER TS\t57\t241800\t1\t57\t3249\t1\t241800\t58467240000
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tBANDFLD\tBAND, FLD\t7\t14820\t1\t7\t49\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tBASOFLD\tBASOPHILS, FLD\t1\t14820\t1\t1\t1\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tFCMT\tFLUID COMMENT\t9999999\t14820\t1\t9999999\t1.00E+14\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tFCOLOR\tAPPEARANCE\t9999999\t14820\t1\t9999999\t1.00E+14\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tFLDTYP\tFLUID SOURCE\t9999999\t14820\t1\t9999999\t1.00E+14\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tFMETA\tMETAMYELOCYTE, FLD\t5\t14820\t1\t5\t25\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tFPMN\tPMN, FLD\t16\t14820\t1\t16\t256\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tFRLYM\tREACTIVE LYMPHS, FLD\t1\t14820\t1\t1\t1\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tFTURB\tTURBIDITY, FLD\t9999999\t14820\t1\t9999999\t1.00E+14\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tLYMFLD\tLYMPHOCYTE %, FLD\t52\t14820\t1\t52\t2704\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tMONFLD\tMONO/MESO %, FLD\t18\t14820\t1\t18\t324\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tRBCFLD\tRBC COUNT, FLD (/UL)\t147100\t14820\t1\t147100\t21638410000\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t871370\tLABAFCT\tCELL CT & DIFF, APHERESIS FLD\tWBCFLD\tNUCL CELLS, FLD(/UL)\t42900\t14820\t1\t42900\t1840410000\t1\t14820\t219632400
+BODY FLUID ORDERABLES\t892281\tLAB13002R\tCOCCIDIOIDES AB IMMUNODIFF CSF\t13001R\tCOCCIDIOIDES AB IMMUNODIFF CSF\t9999999\t1926281.25\t1\t9999999\t1.00E+14\t16\t30820500\t1.70E+14
+COAGULATION ORDERABLES\t472663\tLABVWNTRP\tINTERPRETATION, VW SCREEN\tVWINTP\tINTERPRETATION\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+ECG ORDERABLES\t472256\tEKG5\tECG 12-LEAD\tECGIMPRESS\tECG IMPRESSION\t9999999\t-5950.445219\t1\t9999999\t1.00E+14\t118728\t-706484460\t1.34E+19
+ECHO ORDERABLES\t472301\tECH15\tECHO - TRANSTHORACIC ECHO +DOPPLER\tLVEF\tLEFT VENTRICULAR EJECTION FRACTION MODBP\t9999999\t37937160\t1\t9999999\t1.00E+14\t1\t37937160\t1.44E+15
+ECHO ORDERABLES\t30871485\tECH48\tECHO - TRANSESOPHAGEAL ECHO COMPREHENSIVE\tLVEF\tLEFT VENTRICULAR EJECTION FRACTION MODSP4\t55\t288240\t1\t55\t3025\t1\t288240\t83082297600
+EVAL4\t669617\t210993279\tPM DEVICE EVAL,SNGL,W/REPROGRAMMING\tRABRSENR\tRA BRADY SENSING REFRACTORY PERIOD\t250\t-600\t1\t250\t62500\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tDEVTYPE\tDEVTYPE\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tIMPDATE\tIMPLANT DATE\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tLVBRPACA\tLV BRADY PACING AMPLITUDE\t1.9\t-600\t1\t1.9\t3.61\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tLVBRPACW\tLV BRADY PACING PULSE WIDTH\t0.4\t-600\t1\t0.4\t0.16\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tLVBRSENA\tLV BRADY SENSING AMPLITUDE\t2.5\t-600\t1\t2.5\t6.25\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tLVTHRAMP\tLV THRESHOLD AMPLITUDE\t0.8\t-600\t1\t0.8\t0.64\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tLVTHRDUR\tLV THRESHOLD DURATION\t0.4\t-600\t1\t0.4\t0.16\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tMFR\tMANUFACTURER\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tMOD\tMODEL\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tPMCOMMENT\tPM COMMENTARY\t9999999\t-600\t1\t9999999\t1.00E+14\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tPMLVLDBIIM\tPM LV LEAD BIPOLAR IMPEDANCE\t701\t-600\t1\t701\t491401\t1\t-600\t360000
+EVAL4\t669621\t210993280\tPM DEVICE EVAL,DUAL,W/REPROGRAMMING\tSERNUM\tSERIAL NUMBER\t225435\t120\t1\t225435\t50820939225\t1\t120\t14400
+EVAL4\t669625\t210993281\tPM DEVICE EVAL,BIV,W/REPROGRAMMING\tDEVTYPE\tDEVTYPE\t9999999\t240\t1\t9999999\t1.00E+14\t1\t240\t57600
+EVAL4\t669625\t210993281\tPM DEVICE EVAL,BIV,W/REPROGRAMMING\tIMPDATE\tIMPLANT DATE\t9999999\t240\t1\t9999999\t1.00E+14\t1\t240\t57600
+EVAL4\t669625\t210993281\tPM DEVICE EVAL,BIV,W/REPROGRAMMING\tMFR\tMANUFACTURER\t9999999\t240\t1\t9999999\t1.00E+14\t1\t240\t57600
+EVAL4\t669625\t210993281\tPM DEVICE EVAL,BIV,W/REPROGRAMMING\tMOD\tMODEL\t9999999\t240\t1\t9999999\t1.00E+14\t1\t240\t57600
+EVAL4\t669625\t210993281\tPM DEVICE EVAL,BIV,W/REPROGRAMMING\tSERNUM\tSERIAL NUMBER\t9999999\t240\t1\t9999999\t1.00E+14\t1\t240\t57600
+EVAL6\t669633\t210993289\tICD DEVICE EVAL,BIV,W/OUT REPROG\tLVTHRSENM\tLV THRESHOLD SENSING AMPLITUDE\t19\t1140\t1\t19\t361\t1\t1140\t1299600
+EVAL6\t669633\t210993289\tICD DEVICE EVAL,BIV,W/OUT REPROG\tLVTHRSENPO\tLV THRESHOLD SENSING POLARITY\t9999999\t1140\t1\t9999999\t1.00E+14\t1\t1140\t1299600
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tAFIBTAQRSM\tAFIB TACHY ZONE QRS MORPHOLOGY CRITERIA\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tAFLTAQRSMC\tAFLUTTER TACHY ZONE QRS MORPHOLOGY CRITERIA\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tAFLTAZNRTC\tAFLUTTER TACHY ZONE RATE STABILITY CRITERIA\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tALERT\tALERT\t9999999\t300\t1\t9999999\t1.00E+14\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tATACHTAQRS\tATACH TACHY ZONE QRS MORPHOLOGY CRITERIA\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDBRAVPCD\tBRADY PACED AV DELAY\t120\t300\t1\t120\t14400\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDBRAVSND\tBRADY SENSED AV DELAY\t9999999\t300\t1\t9999999\t1.00E+14\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDBRTRKRT\tBRADY TRACKING RATE\t130\t300\t1\t130\t16900\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDDTATFIB\tICD DETECTIONS AND TREATMENTS ATRIAL FIBRILLATION\t0\t300\t1\t0\t0\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDDTATPAT\tICD DETECTIONS AND TREATMENTS ATP EPISODES ATRIAL\t0\t300\t1\t0\t0\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDDTATRFL\tICD DETECTIONS AND TREATMENTS ATRIAL FLUTTER\t0\t300\t1\t0\t0\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDDTPACAT\tICD DETECTIONS AND TREATMENTS PERCENT PACING ATRIAL\t48\t300\t1\t48\t2304\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDDTSKAAT\tICD DETECTIONS AND TREATMENTS SHOCKS ABORTED ATRIAL\t0\t300\t1\t0\t0\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDDTSKDAT\tICD DETECTIONS AND TREATMENTS SHOCKS DELIVERED ATRIAL\t0\t300\t1\t0\t0\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDTLIMPAT\tICD TEL LEAD IMPEDANCE ATRIAL\t451\t300\t1\t451\t203401\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tICDTLIMPLV\tICD TEL LEAD IMPEDANCE LEFT VENT\t768\t300\t1\t768\t589824\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tLVBRPACA\tLV BRADY PACING AMPLITUDE\t2.2\t300\t1\t2.2\t4.84\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tLVBRPACW\tLV BRADY PACING PULSE WIDTH\t0.5\t300\t1\t0.5\t0.25\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tLVBRSENA\tLV BRADY SENSING AMPLITUDE\t9999999\t300\t1\t9999999\t1.00E+14\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tLVBRSENP\tLV BRADY SENSING BLANKING PERIOD\t400\t300\t1\t400\t160000\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tLVBRSENR\tLV BRADY SENSING REFRACTORY PERIOD\t310\t300\t1\t310\t96100\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRABRPACA\tRA BRADY PACING AMPLITUDE\t2\t300\t1\t2\t4\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRABRPACW\tRA BRADY PACING PULSE WIDTH\t0.5\t300\t1\t0.5\t0.25\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRABRSENA\tRA BRADY SENSING AMPLITUDE\t9999999\t300\t1\t9999999\t1.00E+14\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRABRSENR\tRA BRADY SENSING REFRACTORY PERIOD\t9999999\t300\t1\t9999999\t1.00E+14\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRATHRAMP\tRA THRESHOLD AMPLITUDE\t0.7\t300\t1\t0.7\t0.49\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRATHRDUR\tRA THRESHOLD DURATION\t0.5\t300\t1\t0.5\t0.25\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRATHRSENMP\tRA THRESHOLD SENSING AMPLITUDE\t3.1\t300\t1\t3.1\t9.61\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tRATHRSPOL\tRA THRESHOLD SENSING POLARITY\t9999999\t300\t1\t9999999\t1.00E+14\t1\t300\t90000
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tVSLWVTTZNT\tVSLOWVT TACHY ZONE RATE STABILITY CRITERIA\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL6\t669637\t210993282\tICD DEVICE EVAL,SNGL,W/ REPROGRAMMING\tVSWVTTAQRS\tVSLOWVT TACHY ZONE QRS MORPHOLOGY CRITERIA\t9999999\t120\t1\t9999999\t1.00E+14\t1\t120\t14400
+EVAL6\t669641\t210993283\tICD DEVICE EVAL,DUAL,W/REPROGRAMMING\tFSTVTTDETD\tFASTVT TACHY ZONE DETECTION DURATION\t30\t-360\t1\t30\t900\t1\t-360\t129600
+EVAL6\t669641\t210993283\tICD DEVICE EVAL,DUAL,W/REPROGRAMMING\tFSTVTTZNSC\tFASTVT TACHY ZONE SUDDEN ONSET CRITERIA\t100\t-360\t1\t100\t10000\t1\t-360\t129600
+EVAL6\t669641\t210993283\tICD DEVICE EVAL,DUAL,W/REPROGRAMMING\tICDBRVVDEL\tBRADY VV DELAY\t0\t120\t1\t0\t0\t1\t120\t14400
+EVAL6\t669641\t210993283\tICD DEVICE EVAL,DUAL,W/REPROGRAMMING\tICDEVALCOM\tICD EVAL COMMENTARY\t9999999\t2700\t1\t9999999\t1.00E+14\t1\t2700\t7290000
+EVAL6\t669641\t210993283\tICD DEVICE EVAL,DUAL,W/REPROGRAMMING\tSLWVTTAZNS\tSLOWVT TACHY ZONE SUDDEN ONSET CRITERIA\t100\t-360\t1\t100\t10000\t1\t-360\t129600
+EVAL6\t669645\t210993284\tICD DEVICE EVAL,BIV,W/REPROGRAMMING\tFSTVTTZNSC\tFASTVT TACHY ZONE SUDDEN ONSET CRITERIA\t100\t480\t1\t100\t10000\t1\t480\t230400
+EXTERNAL RESULTS\t890349\tEXTINRM\tINR (MANUAL ENTRY)\tINR\tINR (MANUAL ENTRY)\t1.4\t41040\t1\t1.4\t1.96\t1\t41040\t1684281600
+EXTERNAL RESULTS\t890349\tEXTINRM\tINR (MANUAL ENTRY)\tPT\tPROTHROMBIN TIME\t15.8\t41040\t1\t15.8\t249.64\t1\t41040\t1684281600
+HISTOCOMPATIBILITY ORDERABLE\t481589\t10285R\tHLA ORDER - SPECIMEN IN LAB ORDERS (DONOR)\t10049R\tHLA LAB TESTING STATUS\t9999999\t130260\t1\t9999999\t1.00E+14\t1\t130260\t16967667600
+HISTOCOMPATIBILITY ORDERABLE\t569143\t10225R\tHLA ORDER - DESENSITIZATION MONITORING PRE IVIG\t10049R\tHLA LAB TESTING STATUS\t9999999\t2244840\t1\t9999999\t1.00E+14\t1\t2244840\t5.04E+12
+HISTOCOMPATIBILITY ORDERABLE\t706283\t10000R\tHLA ORDER - TYPING - SOLID ORGAN EVALUATION\tRINFO\tTO FIND RESULT:\t9999999\t736702.1918\t1\t9999999\t1.00E+14\t73\t53779260\t6.97E+13
+HISTOCOMPATIBILITY ORDERABLE\t718854\t10205R\tHLA ORDER - DESENSITIZATION MONITORING PRE IVIG\tRINFO\tTO FIND RESULT:\t9999999\t1896726\t1\t9999999\t1.00E+14\t10\t18967260\t5.63E+13
+HISTOCOMPATIBILITY ORDERABLE\t890780\t10010R\tHLA ORDER - CROSSMATCH (W/UNRELATED DONOR INFO)\t10049R\tHLA LAB TESTING STATUS\t9999999\t170820\t1\t9999999\t1.00E+14\t1\t170820\t29179472400
+HISTOCOMPATIBILITY ORDERABLE\t890832\t10040R\tHLA ORDER - TYPING - BMT CONFIRMATORY (RELATED DONOR)\t10049R\tHLA LAB TESTING STATUS\t9999999\t235080\t1\t9999999\t1.00E+14\t2\t470160\t1.15E+11
+HISTOCOMPATIBILITY ORDERABLE\t890832\t10040R\tHLA ORDER - TYPING - BMT CONFIRMATORY (RELATED DONOR)\tRINFO\tTO FIND RESULT:\t9999999\t235080\t1\t9999999\t1.00E+14\t2\t470160\t1.15E+11
+HISTOCOMPATIBILITY ORDERABLE\t892287\t10297R\tHLA ORDER - DECEASED DNR O.R. SPMN\t10049R\tHLA LAB TESTING STATUS\t9999999\t594360\t1\t9999999\t1.00E+14\t1\t594360\t3.53E+11
+HISTOCOMPATIBILITY ORDERABLE\t892287\t10297R\tHLA ORDER - DECEASED DNR O.R. SPMN\tRINFO\tTO FIND RESULT:\t9999999\t594360\t1\t9999999\t1.00E+14\t1\t594360\t3.53E+11
+HISTOCOMPATIBILITY ORDERABLE\t895898\t10120R\tHLA ORDER - ADDITIONAL SPECIMEN (RECIPIENT)\t10049R\tHLA LAB TESTING STATUS\t9999999\t202080\t1\t9999999\t1.00E+14\t1\t202080\t40836326400
+HISTOCOMPATIBILITY ORDERABLE\t896071\t10295R\tHLA - AUTO T FLOW CROSSMATCH\t9099R\tINTERPRETATION/ COMMENTS\t9999999\t60\t1\t9999999\t1.00E+14\t1\t60\t3600
+HISTOCOMPATIBILITY ORDERABLE\t896077\t10290R\tHLA - TYPING\t9035R\tMICA ALLELE 1\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+HISTOCOMPATIBILITY ORDERABLE\t896077\t10290R\tHLA - TYPING\t9036R\tMICA ALLELE 2\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9342R\tDSA FOR CLASS II\t9999999\t68280\t1\t9999999\t1.00E+14\t1\t68280\t4662158400
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9377R\tCUMULATIVE ANTIBODIES BY C1Q\t9999999\t33166.66667\t1\t9999999\t1.00E+14\t9\t298500\t89030631600
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9391R\tINTERPRETATION/ COMMENTS CLASS I\t9999999\t59700\t1\t9999999\t1.00E+14\t5\t298500\t89030631600
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9404R\tINTERPRETATION/ COMMENTS CLASS II\t9999999\t59700\t1\t9999999\t1.00E+14\t5\t298500\t89030631600
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9347R\tCUMULATIVE ANTIBODIES BY IGG\t9999999\t42651.42857\t1\t9999999\t1.00E+14\t7\t298560\t89030635200
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9361R\tINTERPRETATION/ COMMENTS CLASS I\t9999999\t298380\t1\t9999999\t1.00E+14\t1\t298380\t89030624400
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9367R\tPOSSIBLE HLA ANTIBODIES FOR IGG CLASS II FOR CURRENT\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9374R\tINTERPRETATION/ COMMENTS CLASS II\t9999999\t149190\t1\t9999999\t1.00E+14\t2\t298380\t89030624400
+HISTOCOMPATIBILITY ORDERABLE\t896083\t10335R\tHLA - SCREENING C1Q\t9350R\tMFI RESULTS FOR SCREENING C1Q CLASS I\t9999999\t119126.8571\t1\t9999999\t1.00E+14\t315\t37524960\t4.02E+13
+HISTOCOMPATIBILITY ORDERABLE\t896160\t10165R\tHLA ORDER - FINAL DONOR SELECTION (W/UNRELATED DONOR INFO)\t10049R\tHLA LAB TESTING STATUS\t9999999\t543300\t1\t9999999\t1.00E+14\t1\t543300\t2.95E+11
+HISTOCOMPATIBILITY ORDERABLE\t896160\t10165R\tHLA ORDER - FINAL DONOR SELECTION (W/UNRELATED DONOR INFO)\tRINFO\tTO FIND RESULT:\t9999999\t543300\t1\t9999999\t1.00E+14\t1\t543300\t2.95E+11
+HISTOCOMPATIBILITY ORDERABLE\t4046255\t10015R\tHLA ORDER - DSA SCREENING\tRINFO\tTO FIND RESULT:\t9999999\t1171925.172\t1\t9999999\t1.00E+14\t116\t135943320\t2.64E+14
+LAB BLOOD ORDERABLES\t471506\tLABY17OHP\t17 - HYDROXYPROGESTERONE, SERUM\t17OHPROG\t17-OH PROGESTERONE\t11700\t545760\t1\t11700\t136890000\t1\t545760\t2.98E+11
+LAB BLOOD ORDERABLES\t471512\tLABCHON\tA/HYPOCHONDROPLASIA, SERUM\tCHONDX\tCLINICAL INDICATION\t9999999\t758160\t1\t9999999\t1.00E+14\t1\t758160\t5.75E+11
+LAB BLOOD ORDERABLES\t471512\tLABCHON\tA/HYPOCHONDROPLASIA, SERUM\tCHONRS\tRESULT\t9999999\t758160\t1\t9999999\t1.00E+14\t1\t758160\t5.75E+11
+LAB BLOOD ORDERABLES\t471525\tLABYCHRBC\tACETYLCHOLINESTERASE, RBC\tACHERBC\tACETYLCHOLINESTERASE, RBC\t33.3\t#VALUE!\t1\t33.3\t1108.89\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t471526\tLABYARBIN\tACH RECEPTOR BINDING AB\tYARBIN\tACH RECEPTOR BINDING ANTIBODY\t72.2\t613440\t1\t72.2\t5212.84\t1\t613440\t3.76E+11
+LAB BLOOD ORDERABLES\t471536\tLABADAQ\tADENOSINE DEAMINASE, RBC\tADMD\tREVIEWED BY\t9999999\t490320\t1\t9999999\t1.00E+14\t9\t4412880\t3.48E+12
+LAB BLOOD ORDERABLES\t471586\tLAB12733R\tALPHA-2-ANTIPLASMIN\tA2A\tALPHA-2-ANTIPLASMIN\t80\t156540\t1\t80\t6400\t1\t156540\t24504771600
+LAB BLOOD ORDERABLES\t471586\tLAB12733R\tALPHA-2 PLASMIN INHIBITOR\t12734R\tALPHA-2 PLASMIN INHIBITOR\t57\t90780\t1\t57\t3249\t2\t181560\t16900200000
+LAB BLOOD ORDERABLES\t471609\tLABBMAML\tAML PROGNOSIS ASSAY, BONE MARROW\tBMFLTD\tDISCLAIMER\t9999999\t540213\t1\t9999999\t1.00E+14\t60\t32412780\t2.37E+13
+LAB BLOOD ORDERABLES\t471609\tLABBMAML\tAML PROGNOSIS ASSAY, BONE MARROW\tBMFLTM\tMETHOD\t9999999\t540213\t1\t9999999\t1.00E+14\t60\t32412780\t2.37E+13
+LAB BLOOD ORDERABLES\t471623\tLABIBD\tANCA\t12215R\t12215R\t9999999\t240072.1875\t1\t9999999\t1.00E+14\t64\t15364620\t4.33E+12
+LAB BLOOD ORDERABLES\t471646\tLABABTITI\tAB TITER\tABTITER\tANTIBODY TITER RESULTS\t9999999\t12397.26316\t1\t9999999\t1.00E+14\t95\t1177740\t29891170800
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO7\tCAUTIONS\t9999999\t562920\t1\t9999999\t1.00E+14\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tCAIGG\tCAL ENCEPH IGG\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tCAIGM\tCAL ENCEPH IGM\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tCAINT\tINTERPRETATION\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tEEIGM\tE EQUINE ENCEP IGM AB\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tEEINT\tINTERPRETATION\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tSTIGG\tST. LOUIS ENCEP IGG\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tSTIGM\tST. LOUIS ENCEP IGM\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tSTINT\tINTERPRETATION\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tWEIGG\tW EQUINE IGG AB\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tWEIGM\tW EQUINE IGM AB\t9999999\t2760\t1\t9999999\t1.00E+14\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471705\tLABJO1ABY\tANTI-JO1 ANTIBODY\tJO1INT\tANTI-JO1 INTERPRETATION\t9999999\t395222.2222\t1\t9999999\t1.00E+14\t81\t32013000\t1.65E+13
+LAB BLOOD ORDERABLES\t471706\tLAB11093R\tAUTOANTIBODIES TO SCL 70\tSCL70\tSCL 70 AB, IGG, SERUM\t9999999\t222600\t1\t9999999\t1.00E+14\t1\t222600\t49550760000
+LAB BLOOD ORDERABLES\t471709\tLABRNPABY\tANTI-RNP ANTIBODY\tRNPINT\tANTI-RNP INTERPRETATION\t9999999\t433078.8889\t1\t9999999\t1.00E+14\t162\t70158780\t4.59E+13
+LAB BLOOD ORDERABLES\t471709\tLABYANRNP\tAUTOANTIBODIES TO U1RNP\tU1RNPAB\tAUTOANTIBODIES TO U1RNP\t9999999\t161628\t1\t9999999\t1.00E+14\t20\t3232560\t6.25E+11
+LAB BLOOD ORDERABLES\t471733\tLABYPERAB\tBORDETELLA PERTUSSIS IGG AND IGM AB\tYPERA2\tB PERTUSSIS AB, IGM\t9999999\t32220\t1\t9999999\t1.00E+14\t1\t32220\t1038128400
+LAB BLOOD ORDERABLES\t471758\tLABBTHSQ\tBETA THALASSEMIA SEQUENCING\tBSQCO\tCOMMENT\t9999999\t1383525\t1\t9999999\t1.00E+14\t4\t5534100\t8.61E+12
+LAB BLOOD ORDERABLES\t471760\tLABB2GPCO\tBETA - 2 - GLYCOPROTEIN\tB2GPCM\tBETA-2-GP1 COMMENT\t9999999\t916554.1935\t1\t9999999\t1.00E+14\t31\t28413180\t4.50E+13
+LAB BLOOD ORDERABLES\t471777\tLABYBLAS\tBLASTOMYCES AB\tYBLAS3\tBLASTOMYCES IMMUNODIFFUSION\t9999999\t417449.0625\t1\t9999999\t1.00E+14\t64\t26716740\t1.37E+13
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tCMGDES\tCMV IGG TEST DESCRIPTION\t9999999\t221580\t1\t9999999\t1.00E+14\t2\t443160\t1.80E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tCMGQNT\tCMV IGG LEVEL\t9999999\t18900\t1\t9999999\t1.00E+14\t1\t18900\t357210000
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tCMMDES\tCMV IGM TEST DESCRIPTION\t9999999\t221580\t1\t9999999\t1.00E+14\t2\t443160\t1.80E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tCMMQNT\tCMV IGM LEVEL\t9999999\t18900\t1\t9999999\t1.00E+14\t1\t18900\t357210000
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tHATINT\tINTERPRETATION\t9999999\t284733.75\t1\t9999999\t1.00E+14\t48\t13667220\t4.72E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tHBCAB\tHEP B CORE TOTAL AB\t9999999\t392580\t1\t9999999\t1.00E+14\t1\t392580\t1.54E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tHBSAG\tHEPATITIS B SURF AG\t9999999\t392580\t1\t9999999\t1.00E+14\t1\t392580\t1.54E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tHBSINT\tINTERPRETATION\t9999999\t284733.75\t1\t9999999\t1.00E+14\t48\t13667220\t4.72E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tHBTINT\tINTERPRETATION\t9999999\t284733.75\t1\t9999999\t1.00E+14\t48\t13667220\t4.72E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tHEPAAB\tHEPATITIS A TOTAL AB\t9999999\t392580\t1\t9999999\t1.00E+14\t1\t392580\t1.54E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tHEPCAB\tHEPATITIS C AB\t9999999\t392580\t1\t9999999\t1.00E+14\t1\t392580\t1.54E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tRPRQIN\tINTERPRETATIONS\t9999999\t286934.6939\t1\t9999999\t1.00E+14\t49\t14059800\t4.87E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tVGGDES\tVZV IGG TEST DESCRIPTION\t9999999\t221580\t1\t9999999\t1.00E+14\t2\t443160\t1.80E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMTP\tBMT PRETRANSPLANT PANEL\tVGGQNT\tVZV IGG LEVEL\t9999999\t18900\t1\t9999999\t1.00E+14\t1\t18900\t357210000
+LAB BLOOD ORDERABLES\t471797\tLABBCAA\tBRANCHED CHAIN AMINO ACIDS\tALCN\tALLO-ISOLEUCINE\t0\t348900\t1\t0\t0\t1\t348900\t1.22E+11
+LAB BLOOD ORDERABLES\t471797\tLABBCAA\tBRANCHED CHAIN AMINO ACIDS\tISOLEU\tISOLEUCINE\t32\t348900\t1\t32\t1024\t1\t348900\t1.22E+11
+LAB BLOOD ORDERABLES\t471797\tLABBCAA\tBRANCHED CHAIN AMINO ACIDS\tLEUCINE\tLEUCINE\t72\t348900\t1\t72\t5184\t1\t348900\t1.22E+11
+LAB BLOOD ORDERABLES\t471797\tLABBCAA\tBRANCHED CHAIN AMINO ACIDS\tVALINE\tVALINE\t119\t348900\t1\t119\t14161\t1\t348900\t1.22E+11
+LAB BLOOD ORDERABLES\t471803\tLABYBUPRO\tBUPROPION, SERUM\t12045R\tHYDROXYBUPROPION\t843\t534900\t1\t843\t710649\t1\t534900\t2.86E+11
+LAB BLOOD ORDERABLES\t471803\tLABYBUPRO\tBUPROPION, SERUM\tYBUPR1\tBUPROPION\t47\t534900\t1\t47\t2209\t1\t534900\t2.86E+11
+LAB BLOOD ORDERABLES\t471807\tLABC1INHF\tC1 ESTERASE INHIBITOR FN\tC1INHF\tC1 ESTERASE INHIB FN\t109\t327720\t1\t109\t11881\t1\t327720\t1.07E+11
+LAB BLOOD ORDERABLES\t471810\tLABC1Q\tC1Q BINDING ASSAY\tC1Q\tC1Q BINDING ASSAY\t1.7\t314220\t1\t1.7\t2.89\t1\t314220\t98734208400
+LAB BLOOD ORDERABLES\t471817\tLABYCALCI\tCALCITONIN, PLASMA\tYCALCI\tCALCITONIN, SERUM\t12\t890520\t1\t12\t144\t1\t890520\t7.93E+11
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tALB\tALBUMIN, SER/PLAS\t2.6\t16500\t1\t2.6\t6.76\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tALKP\tALK P\'TASE, TOTAL, SER/PLAS\t44\t16500\t1\t44\t1936\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tALT\tALT (SGPT), SER/PLAS\t69\t16500\t1\t69\t4761\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tAST\tAST (SGOT), SER/PLAS\t44\t16500\t1\t44\t1936\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tBASOAB\tABSOLUTE BASOPHILS\t0\t40260\t1\t0\t0\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tBASOSYN\tBASOPHILS, %\t0\t40260\t1\t0\t0\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tBUN\tUREA NITROGEN,SER/PLAS\t11\t16500\t1\t11\t121\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tCA\tCALCIUM, SER/PLAS\t8.1\t16500\t1\t8.1\t65.61\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tCL\tCHLORIDE, SER/PLAS\t104\t16500\t1\t104\t10816\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tCO2\tCO2, SER/PLAS\t27\t16500\t1\t27\t729\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tCR\tCREATININE, SER/PLAS\t0.7\t16500\t1\t0.7\t0.49\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tEOSAB\tABSOLUTE EOSINOPHILS\t0\t40260\t1\t0\t0\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tEOSFLD\tEOSINOPHILS, %\t0\t40260\t1\t0\t0\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tGLU\tGLUCOSE, SER/PLAS\t106\t16500\t1\t106\t11236\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tHCT\tHEMATOCRIT (MANUAL ENTRY)\t38\t40260\t1\t38\t1444\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tHGB\tHEMOGLOBIN (MANUAL ENTRY)\t12.7\t40260\t1\t12.7\t161.29\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tK\tPOTASSIUM, SER/PLAS\t4.6\t16500\t1\t4.6\t21.16\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tLYMAB\tABSOLUTE LYMPHOCYTES\t1\t40260\t1\t1\t1\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tMONOA\tABSOLUTE MONOCYTES\t1\t40260\t1\t1\t1\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tMONOPHAGE\tMONOCYTE/MACROPHAGE, %\t7\t40260\t1\t7\t49\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tNA\tSODIUM, SER/PLAS\t137\t16500\t1\t137\t18769\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tNEUTAB\tABSOLUTE NEUTROPHIL COUNT\t12.7\t40260\t1\t12.7\t161.29\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tNEUTRA\tABSOLUTE NEUTROPHILS\t3.3\t16500\t1\t3.3\t10.89\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tPLT\tPLATELETS\t247\t40260\t1\t247\t61009\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tRBCHP\tRBC\t4.6\t40260\t1\t4.6\t21.16\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tSYNLYMPH\tLYMPHOCYTES %\t7\t40260\t1\t7\t49\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tTBIL\tTOTAL BILIRUBIN\t0.4\t16500\t1\t0.4\t0.16\t1\t16500\t272250000
+LAB BLOOD ORDERABLES\t471944\tLABCBCD\tCBC WITH DIFF\tWBCHP\tWBC\t14.7\t40260\t1\t14.7\t216.09\t1\t40260\t1620867600
+LAB BLOOD ORDERABLES\t471945\tLABCBCS\tCBC WITH DIFF AND SLIDE REVIEW\tHAIRY\tHAIRY CELLS\t0\t151200\t1\t0\t0\t1\t151200\t22861440000
+LAB BLOOD ORDERABLES\t471965\tLABCFPT\tCF POLY T ANALYSIS\tCFPTR2\tRESULT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t471965\tLABCFPT\tCF POLY T ANALYSIS\tCFPTR3\tRESULT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472036\tLABCLOMIP\tCLOMIPRAMINE AND METABOLITE\tCLOMI\tCLOMIPRAMINE\t63\t#VALUE!\t1\t63\t3969\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472036\tLABCLOMIP\tCLOMIPRAMINE AND METABOLITE\tDMCLOM\tDESMETHYLCLOMIPRAMIN\t14\t#VALUE!\t1\t14\t196\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472036\tLABCLOMIP\tCLOMIPRAMINE AND METABOLITE\tTCLOAM\tCLOMIP & METAB, TOTAL\t77\t#VALUE!\t1\t77\t5929\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472048\tLAB11124R\tCOCCI CF\tCOCFS\tCOCCI CF (SERUM)\t9999999\t951336.1341\t1\t9999999\t1.00E+14\t895\t851445840\t2.05E+15
+LAB BLOOD ORDERABLES\t472051\tLABCDPLTI\tCOLD AGGLUTININ TITER\tCDPLT\tCOLD ANTIBODY TITER\t9999999\t146235.3488\t1\t9999999\t1.00E+14\t43\t6288120\t1.58E+12
+LAB BLOOD ORDERABLES\t472057\tLABVP4\tCOMP HEPATITIS PANEL\tHATINT\tINTERPRETATION\t9999999\t200741.1086\t1\t9999999\t1.00E+14\t451\t90534240\t2.96E+13
+LAB BLOOD ORDERABLES\t472057\tLABVP4\tCOMP HEPATITIS PANEL\tHBSINT\tINTERPRETATION\t9999999\t200741.1086\t1\t9999999\t1.00E+14\t451\t90534240\t2.96E+13
+LAB BLOOD ORDERABLES\t472057\tLABVP4\tCOMP HEPATITIS PANEL\tHBTINT\tINTERPRETATION\t9999999\t200741.1086\t1\t9999999\t1.00E+14\t451\t90534240\t2.96E+13
+LAB BLOOD ORDERABLES\t472057\tLABVP4\tCOMPREHENSIVE HEPATITIS PANEL\tHATINT\tINTERPRETATION\t9999999\t227223.75\t1\t9999999\t1.00E+14\t16\t3635580\t1.30E+12
+LAB BLOOD ORDERABLES\t472057\tLABVP4\tCOMPREHENSIVE HEPATITIS PANEL\tHBSINT\tINTERPRETATION\t9999999\t227223.75\t1\t9999999\t1.00E+14\t16\t3635580\t1.30E+12
+LAB BLOOD ORDERABLES\t472057\tLABVP4\tCOMPREHENSIVE HEPATITIS PANEL\tHBTINT\tINTERPRETATION\t9999999\t227223.75\t1\t9999999\t1.00E+14\t16\t3635580\t1.30E+12
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMP HEPATITIS PANEL\tHAGR\tANTI HAV IGG\t9999999\t19380\t1\t9999999\t1.00E+14\t1\t19380\t375584400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHATR\tANTI-HAV ANTIBODY\t9999999\t56580\t1\t9999999\t1.00E+14\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHBSR\tHEP B SURFACE ANTIGEN\t9999999\t56580\t1\t9999999\t1.00E+14\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHBTR\tANTI-HBC ANTIBODY\t9999999\t56580\t1\t9999999\t1.00E+14\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHCVR\tANTI-HCV\t9999999\t56580\t1\t9999999\t1.00E+14\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHQLINT\tINTERPRETATION\t9999999\t56580\t1\t9999999\t1.00E+14\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHQLR\tANTI-HBS ANTIBODY QUALITATIVE\t9999999\t56580\t1\t9999999\t1.00E+14\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472108\tLABCR\tCREATININE, SERUM/PLASMA\tCRTNR\tCREATINE, PLASMA\t0.5\t-86400\t1\t0.5\t0.25\t1\t-86400\t7464960000
+LAB BLOOD ORDERABLES\t472108\tLABCR\tCREATININE, SERUM/PLASMA\tHGB\tHEMOGLOBIN\t10.9\t0\t1\t10.9\t118.81\t1\t0\t0
+LAB BLOOD ORDERABLES\t472108\tLABCR\tCREATININE, SERUM/PLASMA\tLDH\tLDH, TOTAL, SER/PLAS\t3124\t0\t1\t3124\t9759376\t1\t0\t0
+LAB BLOOD ORDERABLES\t472108\tLABCR\tCREATININE, SERUM/PLASMA\tPLT\tPLATELET COUNT\t47\t0\t1\t47\t2209\t1\t0\t0
+LAB BLOOD ORDERABLES\t472108\tLABCR\tCREATININE, SERUM/PLASMA\tURIC\tURIC ACID, SER/PLAS\t2.5\t0\t1\t2.5\t6.25\t1\t0\t0
+LAB BLOOD ORDERABLES\t472108\tLABCR\tCREATININE, SERUM/PLASMA\tWBC\tWBC\t3.7\t0\t1\t3.7\t13.69\t1\t0\t0
+LAB BLOOD ORDERABLES\t472120\tLABCCP\tANTI CCP\tCCPT\tANTI CCP ANTIBODY LEVEL\t18\t583320\t1\t18\t324\t1\t583320\t3.40E+11
+LAB BLOOD ORDERABLES\t472142\tLABYDOC\t11-DEOXYCORTISOL, SERUM\tYDOC1\t11-DEOXYCORTISOL, S\t9610\t285600\t1\t9610\t92352100\t1\t285600\t81567360000
+LAB BLOOD ORDERABLES\t472142\tLABYDOC\t11-DEOXYCORTISOL, SERUM\tYDOC2\tAM RESULT\t9999999\t285600\t1\t9999999\t1.00E+14\t1\t285600\t81567360000
+LAB BLOOD ORDERABLES\t472142\tLABYDOC\t11-DEOXYCORTISOL, SERUM\tYDOC3\tPM RESULT\t9999999\t285600\t1\t9999999\t1.00E+14\t1\t285600\t81567360000
+LAB BLOOD ORDERABLES\t472148\tLABYDIAZE\tDIAZEPAM AND NORDIAZEPAM\tDIAZEP\tDIAZEPAM\t9999999\t411030\t1\t9999999\t1.00E+14\t2\t822060\t4.30E+11
+LAB BLOOD ORDERABLES\t472148\tLABYDIAZE\tDIAZEPAM AND NORDIAZEPAM\tNORDIAZ\tNORDIAZEPAM\t9999999\t411030\t1\t9999999\t1.00E+14\t2\t822060\t4.30E+11
+LAB BLOOD ORDERABLES\t472148\tLABYDIAZE\tDIAZEPAM AND NORDIAZEPAM\tYDIAZ3\tDIAZEPAM & NORDIAZEPAM\t9999999\t411030\t1\t9999999\t1.00E+14\t2\t822060\t4.30E+11
+LAB BLOOD ORDERABLES\t472180\tLABADIFF\tDIFFERENTIAL\tBASO\tBASOPHILS\t1\t11460\t1\t1\t1\t1\t11460\t131331600
+LAB BLOOD ORDERABLES\t472180\tLABADIFF\tDIFFERENTIAL\tBLASTS\tBLASTS\t16\t#VALUE!\t1\t16\t256\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472180\tLABADIFF\tDIFFERENTIAL\tPRMY\tPROMYELOCYTES\t2\t#VALUE!\t1\t2\t4\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472181\tLABADIFFS\tDIFFERENTIAL AND SLIDE REVIEW\tBAND\tBAND NEUTROPHILS\t16\t#VALUE!\t1\t16\t256\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472181\tLABADIFFS\tDIFFERENTIAL AND SLIDE REVIEW\tLYM\tLYMPHOCYTES\t42\t#VALUE!\t1\t42\t1764\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472181\tLABADIFFS\tDIFFERENTIAL AND SLIDE REVIEW\tMONO\tMONOCYTES\t20\t#VALUE!\t1\t20\t400\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472181\tLABADIFFS\tDIFFERENTIAL AND SLIDE REVIEW\tNEUT\tSEG NEUTROPHILS\t22\t#VALUE!\t1\t22\t484\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472226\tLAB11132R\tDONOR HEP B SURF. AG\tDHB\tDONOR HEP B SURF. AG\t9999999\t180290\t1\t9999999\t1.00E+14\t6\t1081740\t2.32E+11
+LAB BLOOD ORDERABLES\t472331\tLAB11034R\tETHOSUXIMIDE LEVEL\tETHSUX\tETHOSUXIMIDE\t9999999\t174300\t1\t9999999\t1.00E+14\t1\t174300\t30380490000
+LAB BLOOD ORDERABLES\t472347\tLABLEID\tFACTOR V LEIDEN\tLEICMT\tCOMMENT\t9999999\t436344.1652\t1\t9999999\t1.00E+14\t581\t253515960\t1.44E+14
+LAB BLOOD ORDERABLES\t472347\tLABLEID\tFACTOR V LEIDEN\tLEIPRM\tPRIMERS\t9999999\t436344.1652\t1\t9999999\t1.00E+14\t581\t253515960\t1.44E+14
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tCHICK\tCHICKEN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tCORNY\tCORN\t1.15\t#VALUE!\t1\t1.15\t1.3225\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tEGGW\tEGG WHITE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tFISH\tFISH\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tIGEFA\tTOTAL IGE\t980\t#VALUE!\t1\t980\t960400\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tMIL\tMILK\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tNUTTY\tNUT\t5.73\t#VALUE!\t1\t5.73\t32.8329\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tOAT\tOAT\t0.5\t#VALUE!\t1\t0.5\t0.25\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tORAN\tORANGE\t0.37\t#VALUE!\t1\t0.37\t0.1369\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tPEAN\tPEANUT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tSHRIM\tSHRIMP\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tSOY\tSOY\t21.9\t#VALUE!\t1\t21.9\t479.61\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tTOM\tTOMATO\t0.75\t#VALUE!\t1\t0.75\t0.5625\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tWHT\tWHEAT\t0.66\t#VALUE!\t1\t0.66\t0.4356\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472494\tLABHMET\tHEAVY METALS SCREEN, BLOOD\tMER\tMERCURY, BLOOD\t3\t159300\t1\t3\t9\t1\t159300\t25376490000
+LAB BLOOD ORDERABLES\t472502\tLABYHEMOC\tHEMOCHROMATOSIS HFE GENE\tYHEMSP\tSPECIMEN\t9999999\t521638.481\t1\t9999999\t1.00E+14\t79\t41209440\t2.41E+13
+LAB BLOOD ORDERABLES\t472513\tLAB12802R\tHEPARIN COFACTOR\t12801R\tHEPARIN COFACTOR II\t70\t751440\t1\t70\t4900\t1\t751440\t5.65E+11
+LAB BLOOD ORDERABLES\t472521\tLABHBCT\tANTI-HBC\tHBCAB\tHEP B CORE TOTAL AB\t9999999\t22020\t1\t9999999\t1.00E+14\t1\t22020\t484880400
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBCAB\tHEP B CORE TOTAL AB\t9999999\t42480\t1\t9999999\t1.00E+14\t1\t42480\t1804550400
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBCABIGM\tHEPAT.B CORE AB-IGM\t9999999\t42480\t1\t9999999\t1.00E+14\t1\t42480\t1804550400
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBSAB\tHEPATITIS B SURFACE AB QUAL\t9999999\t42480\t1\t9999999\t1.00E+14\t1\t42480\t1804550400
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBSAG\tHEPATITIS B SURF AG\t9999999\t42480\t1\t9999999\t1.00E+14\t1\t42480\t1804550400
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBSAIN\tINTERPRETATION\t9999999\t290760\t1\t9999999\t1.00E+14\t1\t290760\t84541377600
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBSAQT\tHEP B SURF AB QUANT\t236.4\t290760\t1\t236.4\t55884.96\t1\t290760\t84541377600
+LAB BLOOD ORDERABLES\t472527\tLABHBSAG\tHBSAG\tHBSAG\tHEPATITIS B SURF AG\t9999999\t22020\t1\t9999999\t1.00E+14\t1\t22020\t484880400
+LAB BLOOD ORDERABLES\t472528\tLABHCVA\tANTI-HCV\tHCVI\tINTERPRETATION\t9999999\t42280.72931\t1\t9999999\t1.00E+14\t713\t30146160\t3.88E+12
+LAB BLOOD ORDERABLES\t472539\tLABHGBSQ\tHGB S QUANTITATIVE\tHGSMD\tREVIEWED BY\t9999999\t326432\t1\t9999999\t1.00E+14\t45\t14689440\t6.05E+12
+LAB BLOOD ORDERABLES\t472576\tLABYHPL\tHUMAN PLACENTAL LACTOGEN\tYHPL1\tHUMAN PLACENTAL LACTOGEN\t0.19\t901380\t1\t0.19\t0.0361\t1\t901380\t8.12E+11
+LAB BLOOD ORDERABLES\t472632\tLABIMM1\tIMMUNOLOGY PANEL 1\tANAQNT\tTITER\t9999999\t359880\t1\t9999999\t1.00E+14\t1\t359880\t1.30E+11
+LAB BLOOD ORDERABLES\t472633\tLABIMM2\tIMMUNOLOGY PANEL 2\tRHFT\tRHEUMATOID FACTOR LEVEL\t23\t190800\t1\t23\t529\t1\t190800\t36404640000
+LAB BLOOD ORDERABLES\t472697\tLABNJAK2\tJANUS KINASE 2 V617F MUTATION, NON-BLOOD\tNJAKIN\tINTERPRETATION\t9999999\t520500\t1\t9999999\t1.00E+14\t1\t520500\t2.71E+11
+LAB BLOOD ORDERABLES\t472697\tLABNJAK2\tJANUS KINASE 2 V617F MUTATION, NON-BLOOD\tNJAKMD\tINTERPRETED BY\t9999999\t525786.6667\t1\t9999999\t1.00E+14\t9\t4732080\t3.13E+12
+LAB BLOOD ORDERABLES\t472720\tLABLAC\tLACTIC ACID\tLAC\tLACTIC ACID, PLASMA\t2.8\t40500\t1\t2.8\t7.84\t1\t40500\t1640250000
+LAB BLOOD ORDERABLES\t472748\tLABYLEPTN\tLEPTIN\tYLEPT1\tLEPTIN\t20\t963540\t1\t20\t400\t1\t963540\t9.28E+11
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL\tLDL\tLDL (CALCULATED)\t9999999\t7920\t1\t9999999\t1.00E+14\t1\t7920\t62726400
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL, NON-FASTING PATIENT\tCHOL\tCHOLESTEROL, TOTAL\t207\t4020\t1\t207\t42849\t1\t4020\t16160400
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL, NON-FASTING PATIENT\tCHOLHDL\tCHOLESTEROL/HDL RATIO\t9\t4020\t1\t9\t81\t1\t4020\t16160400
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL, NON-FASTING PATIENT\tHDL\tHDL CHOLESTEROL\t23\t4020\t1\t23\t529\t1\t4020\t16160400
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL, NON-FASTING PATIENT\tLDL\tDIRECT LDL CHOL\t62\t4020\t1\t62\t3844\t1\t4020\t16160400
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL, NON-FASTING PATIENT\tNHDL\tNON-HDL CHOL, CALC\t184\t4020\t1\t184\t33856\t1\t4020\t16160400
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL, NON-FASTING PATIENT\tTGL\tTRIGLYCERIDE, SER/PLAS\t739\t4020\t1\t739\t546121\t1\t4020\t16160400
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL. NON-FASTING PATIENT\tCHOL\tCHOLESTEROL, TOTAL\t97\t9900\t1\t97\t9409\t1\t9900\t98010000
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL. NON-FASTING PATIENT\tCHOLHDL\tCHOLESTEROL/HDL RATIO\t7.5\t9900\t1\t7.5\t56.25\t1\t9900\t98010000
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL. NON-FASTING PATIENT\tHDL\tHDL CHOLESTEROL\t13\t9900\t1\t13\t169\t1\t9900\t98010000
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL. NON-FASTING PATIENT\tLDL\tDIRECT LDL CHOL\t49\t9900\t1\t49\t2401\t1\t9900\t98010000
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL. NON-FASTING PATIENT\tNHDL\tNON-HDL CHOL, CALC\t84\t9900\t1\t84\t7056\t1\t9900\t98010000
+LAB BLOOD ORDERABLES\t472754\tLABLPD\tLIPID PANEL. NON-FASTING PATIENT\tTGL\tTRIGLYCERIDE, SER/PLAS\t86\t9900\t1\t86\t7396\t1\t9900\t98010000
+LAB BLOOD ORDERABLES\t472775\tLABLWBCS2\tLYME WESTERN BLOT, SERUM\tLYMEIGMBAND\tB.BURGDORFERI IGM BANDS\t9999999\t265415.6757\t1\t9999999\t1.00E+14\t37\t9820380\t4.41E+12
+LAB BLOOD ORDERABLES\t472855\tLABMALL2\tMISCELLANEOUS ALLERGEN 2\tALLR2\tALLERGEN RESULT\t9999999\t1370400\t1\t9999999\t1.00E+14\t1\t1370400\t1.88E+12
+LAB BLOOD ORDERABLES\t472856\tLABMALL3\tMISCELLANEOUS ALLERGEN 3\tALL3\tALLERGEN\t9999999\t148680\t1\t9999999\t1.00E+14\t1\t148680\t22105742400
+LAB BLOOD ORDERABLES\t472856\tLABMALL3\tMISCELLANEOUS ALLERGEN 3\tALLR3\tALLERGEN RESULT\t9999999\t148680\t1\t9999999\t1.00E+14\t1\t148680\t22105742400
+LAB BLOOD ORDERABLES\t472864\tLABMISCH\tMISCELLANEOUS HEMATOLOGY\tRESULH\tRESULT\t9999999\t3060\t1\t9999999\t1.00E+14\t1\t3060\t9363600
+LAB BLOOD ORDERABLES\t472944\tLABFNKSEN\tNATURAL KILLER CELLS ENUMERATION\tC3AB\tCD3 CD16+CD56 ABS\t40\t265980\t1\t40\t1600\t1\t265980\t70745360400
+LAB BLOOD ORDERABLES\t472944\tLABFNKSEN\tNATURAL KILLER CELLS ENUMERATION\tC3PER\tCD3 CD16+CD56 %\t11\t265980\t1\t11\t121\t1\t265980\t70745360400
+LAB BLOOD ORDERABLES\t472944\tLABFNKSEN\tNATURAL KILLER CELLS ENUMERATION\tLYMAB\tLYMPHOCYTES, ABS.\t352\t265980\t1\t352\t123904\t1\t265980\t70745360400
+LAB BLOOD ORDERABLES\t473043\tLABYOSTEO\tOSTEOCALCIN HUMAN\tOSTEOC\tOSTEOCALCIN, HUMAN\t15\t141000\t1\t15\t225\t1\t141000\t19881000000
+LAB BLOOD ORDERABLES\t473074\tLABPBGD\tPBG DEAMINASE, RBC\tPBGD\tPBG DEAMINASE, RBC\t4.68\t675840\t1\t4.68\t21.9024\t1\t675840\t4.57E+11
+LAB BLOOD ORDERABLES\t473096\tLABPHATYR\tPHENYLALANINE AND TYROSINE\tPHALN\tPHENYLALANINE\t87\t426840\t1\t87\t7569\t1\t426840\t1.82E+11
+LAB BLOOD ORDERABLES\t473096\tLABPHATYR\tPHENYLALANINE AND TYROSINE\tTYROSINE\tTYROSINE\t91\t426840\t1\t91\t8281\t1\t426840\t1.82E+11
+LAB BLOOD ORDERABLES\t473101\tLABYPTSAB\tPHOSPHATIDYLSERINE AB PANEL\tYPTSA\tPHOSPHATIDYLSERINE IGA AB\t3\t353700\t1\t3\t9\t1\t353700\t1.25E+11
+LAB BLOOD ORDERABLES\t473101\tLABYPTSAB\tPHOSPHATIDYLSERINE AB PANEL\tYPTSG\tPHOSPHATIDYLSERINE IGG AB\t10\t353700\t1\t10\t100\t1\t353700\t1.25E+11
+LAB BLOOD ORDERABLES\t473101\tLABYPTSAB\tPHOSPHATIDYLSERINE AB PANEL\tYPTSM\tPHOSPHATIDYLSER. IGM\t41\t353700\t1\t41\t1681\t1\t353700\t1.25E+11
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12590R\tS.PNEUMO SEROTYPE 1 (1)\t4.3\t205440\t1\t4.3\t18.49\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12699R\tS.PNEUMO SEROTYPE 3 (3)\t8.4\t205440\t1\t8.4\t70.56\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12700R\tS.PNEUMO SEROTYPE 4 (4)\t0.4\t205440\t1\t0.4\t0.16\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12701R\tS.PNEUMO SEROTYPE 5 (5)\t3\t205440\t1\t3\t9\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12702R\tS.PNEUMO SEROTYPE 6 (6A)\t3.6\t205440\t1\t3.6\t12.96\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12703R\tS.PNEUMO SEROTYPE 14 (14)\t18.1\t205440\t1\t18.1\t327.61\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12704R\tS.PNEUMO SEROTYPE 19 (19F)\t2.1\t205440\t1\t2.1\t4.41\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12705R\tS.PNEUMO SEROTYPE 23 (23F)\t0.5\t205440\t1\t0.5\t0.25\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12706R\tS.PNEUMO SEROTYPE 26 (6B)\t7\t205440\t1\t7\t49\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12707R\tS.PNEUMO SEROTYPE 51 (7F)\t0.8\t205440\t1\t0.8\t0.64\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12708R\tS.PNEUMO SEROTYPE 56 (18C)\t9999999\t205440\t1\t9999999\t1.00E+14\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12709R\tS.PNEUMO SEROTYPE 57 (19A)\t0.8\t205440\t1\t0.8\t0.64\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473116\tLAB12581R\tS PNEUMONIAE AB IGG (PREVNAR 13)\t12710R\tS.PNEUMO SEROTYPE 68 (9V)\t1.8\t205440\t1\t1.8\t3.24\t1\t205440\t42205593600
+LAB BLOOD ORDERABLES\t473121\tLABPORS\tPORPHYRINS, SERUM\tPORINT\tPORPHYRINS, SER INTR\t9999999\t383598.6207\t1\t9999999\t1.00E+14\t29\t11124360\t1.10E+13
+LAB BLOOD ORDERABLES\t473149\tLABPROTPM\tPRO-PREDICT TPMT\tPRTPMR\tPROPREDICT TPMT\t9999999\t623076.9231\t1\t9999999\t1.00E+14\t78\t48600000\t6.83E+13
+LAB BLOOD ORDERABLES\t473179\tLABP20210\tPROTHROMBIN 20210A\tPT20DR\tINTERPRETED BY\t9999999\t453611.6315\t1\t9999999\t1.00E+14\t521\t236331660\t1.36E+14
+LAB BLOOD ORDERABLES\t473200\tLABQFTBG\tQUANTIFERON FOR LATENT TB INFECTION\tQTFNIN\tQUANTIFERON INTERPRETATION\t9999999\t449070\t1\t9999999\t1.00E+14\t18\t8083260\t1.64E+13
+LAB BLOOD ORDERABLES\t473200\tLABQFTBG\tTB BY QUANTIFERON\tTBGINT\tINTERPRETATION\t9999999\t209921.4545\t1\t9999999\t1.00E+14\t55\t11545680\t2.87E+12
+LAB BLOOD ORDERABLES\t473201\tLABYQUIN\tQUINIDINE\tQUINIDINE\tQUINIDINE\t2.5\t262200\t1\t2.5\t6.25\t1\t262200\t68748840000
+LAB BLOOD ORDERABLES\t473211\tLABRBCMOR\tRBC MORPHLOGY, COMPLETE\tSIGNIF\tSIGNIFICANT ABNORMALITIES\t9999999\t9330\t1\t9999999\t1.00E+14\t2\t18660\t215139600
+LAB BLOOD ORDERABLES\t473216\tLABRBCENZ\tRED CELL ENZYMES\tENO\tENOLASE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t473216\tLABRBCENZ\tRED CELL ENZYMES\tGPILS\tGPI, LOW SUBSTRATE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t473216\tLABRBCENZ\tRED CELL ENZYMES\tNPHOS\tPURINE NUCLEOSIDE PHOSPHORYLASE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t473216\tLABRBCENZ\tRED CELL ENZYMES\tPKLS\tPK, LOW SUBSTRATE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t473221\tLAB11092R\tRENIN ACTIVITY, PLASMA\tRENIN\tRENIN ACTIVITY, PL\t9999999\t279300\t1\t9999999\t1.00E+14\t1\t279300\t78008490000
+LAB BLOOD ORDERABLES\t473271\tLABRIPA\tRISTOCETIN INDUCED PLATELET AGGREGATION\tRIPDIR\tINTERPRETED BY\t9999999\t97431.42857\t1\t9999999\t1.00E+14\t7\t682020\t1.20E+11
+LAB BLOOD ORDERABLES\t473290\tLABSCHIG\tSCHISTOSOMA IGG AB ELISA\tSCHIG1\tSCHISTOSOMA ,LGG\t9999999\t323778.8235\t1\t9999999\t1.00E+14\t51\t16512720\t6.74E+12
+LAB BLOOD ORDERABLES\t473397\tLABT1418\tT(14\t18), BLOOD\tT14RES\tRESULTS\t9999999\t1210908\t1\t9999999\t1.00E+14\t5\t6054540\t9.00E+12
+LAB BLOOD ORDERABLES\t473409\tLABYT3UP\tT3 UPTAKE\tYT7P2\tT-UPTAKE %\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t473432\tLABTHAMP\tTHERMAL AMPLITUDE SCREEN\tTHRAMP\tTHERMAL AMPLITUDE\t9999999\t479657.1429\t1\t9999999\t1.00E+14\t7\t3357600\t7.81E+12
+LAB BLOOD ORDERABLES\t473444\tLAB11097R\tTSI, SERUM\tTSIG\tTHROID-STIMULATING IG, SERUM\t9999999\t253500\t1\t9999999\t1.00E+14\t1\t253500\t64262250000
+LAB BLOOD ORDERABLES\t473463\tLABTOXOP2\tTOXOPLASMOSIS PCR\tTOXGG\tGENERAL GUIDELINES\t9999999\t1116100\t1\t9999999\t1.00E+14\t6\t6696600\t7.98E+12
+LAB BLOOD ORDERABLES\t473463\tLABTOXPCR\tTOXOPLASMA PCR\tTOXRES\tPCR RESULT\t9999999\t1052324\t1\t9999999\t1.00E+14\t30\t31569720\t6.51E+13
+LAB BLOOD ORDERABLES\t473675\tLABTRAZO\tTRAZODONE\tTRAZO\tTRAZODONE\t9999999\t251220\t1\t9999999\t1.00E+14\t1\t251220\t63111488400
+LAB BLOOD ORDERABLES\t473708\tLABREF5\tLAB UNLISTED 5\tRESUL5\tRESULT\t9999999\t5643312\t1\t9999999\t1.00E+14\t5\t28216560\t3.83E+14
+LAB BLOOD ORDERABLES\t473747\tLABYVIP\tVASOACTIVE INTESTINAL POLYPEPTIDE\tVIP\tVASOACTIVE INT PEPTIDE\t850\t890520\t1\t850\t722500\t1\t890520\t7.93E+11
+LAB BLOOD ORDERABLES\t473759\tLAB11098R\t1,25-DIHYDROXYVITAMIN D, SERUM\t125OHD2\tVITAMIN D, 1,25-DIHYDRO\t28\t164940\t1\t28\t784\t1\t164940\t27205203600
+LAB BLOOD ORDERABLES\t473759\tLAB11098R\tPEDIATRIC 1 25 OH VITAMIN D\t125OHD2\tVITAMIN D, 1,25-DIHYDRO\t76\t222660\t1\t76\t5776\t1\t222660\t49577475600
+LAB BLOOD ORDERABLES\t473767\tLABYVITE\tVITAMIN E, SERUM\tVITE\tA-TOCOPHEROL, VITAMIN E\t41.3\t359340\t1\t41.3\t1705.69\t1\t359340\t1.29E+11
+LAB BLOOD ORDERABLES\t473779\tLAB11131R\tVORICONAZOLE LEVEL\tVORI\tVORICONAZOLE LEVEL\t9999999\t559952.1012\t1\t9999999\t1.00E+14\t514\t287815380\t2.74E+14
+LAB BLOOD ORDERABLES\t473796\tLABYWNILE\tWEST NILE VIRUS AB, IGG AND IGM\tWNVIGG\tWEST NILE VIRUS AB IGG\t9999999\t286493.3333\t1\t9999999\t1.00E+14\t252\t72196320\t3.25E+13
+LAB BLOOD ORDERABLES\t497055\tLABRHTYP\tRH BLOOD TYPE\tRHTYP\tRH BLOOD TYPE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t497329\tLABSPAGD\tS. PNEUMONIAE AG DETECTION LA\tSPNAG\tS PNEUMONIAEAG\t9999999\t2758074.146\t1\t9999999\t1.00E+14\t41\t113081040\t2.48E+15
+LAB BLOOD ORDERABLES\t497331\tLABPABN\tPOLIO AB, NEUTRALIZATION\tPOL1\tPOLIO 1\t9999999\t1740\t1\t9999999\t1.00E+14\t1\t1740\t3027600
+LAB BLOOD ORDERABLES\t497331\tLABPABN\tPOLIO AB, NEUTRALIZATION\tPOL3\tPOLIO 3\t9999999\t1740\t1\t9999999\t1.00E+14\t1\t1740\t3027600
+LAB BLOOD ORDERABLES\t497337\tLABHBV\tHBV GENOTYPE: S AND POL GENE\tHPEM\tPRECORE MUTATION\t9999999\t612900\t1\t9999999\t1.00E+14\t1\t612900\t3.76E+11
+LAB BLOOD ORDERABLES\t497337\tLABHBV\tHBV GENOTYPE: S AND POL GENE\tHPSOL\tPOLYMERASE MUTATION\t9999999\t612900\t1\t9999999\t1.00E+14\t1\t612900\t3.76E+11
+LAB BLOOD ORDERABLES\t497337\tLABHBV\tHBV GENOTYPE: S AND POL GENE\tHSPOL\tHEP B VIR GENOTYPING\t9999999\t612900\t1\t9999999\t1.00E+14\t1\t612900\t3.76E+11
+LAB BLOOD ORDERABLES\t497343\tLABCMVG\tCMV GENOTYPE\tCUL54\tUL54 MUTATION\t9999999\t1217280.769\t1\t9999999\t1.00E+14\t78\t94947900\t1.25E+14
+LAB BLOOD ORDERABLES\t497420\tLABASPID\tASPERGILLUS AB, ID, S\tAFLUMI\tASPERGILLUS FUMIGATUS\t9999999\t376384.5\t1\t9999999\t1.00E+14\t40\t15055380\t6.40E+12
+LAB BLOOD ORDERABLES\t497432\tLABFHTLVQ\tHTLV-1/2 DNA QUALITATIVE\tHTLII\tHTLV-II DNA\t9999999\t244110.566\t1\t9999999\t1.00E+14\t53\t12937860\t1.04E+13
+LAB BLOOD ORDERABLES\t497434\tLABFENTA\tENTAMOEBA HISTOLYTICA AB\tENTA\tE.HISTOLYTICA LGG\t9999999\t368756.3415\t1\t9999999\t1.00E+14\t82\t30238020\t1.38E+13
+LAB BLOOD ORDERABLES\t497454\tLABFPARVD\tPARVOVIRUS B19 PCR QUALITATIVE REALTIME\tPARVD\tPARVOVIRUS DNA\t9999999\t247459.7872\t1\t9999999\t1.00E+14\t94\t23261220\t1.27E+13
+LAB BLOOD ORDERABLES\t497456\tLABFQFVR\tCOXIELLA BURNETII AB\t12015R\tQ FEVER IGM PHASE LI TITER\t9999999\t228210\t1\t9999999\t1.00E+14\t4\t912840\t2.66E+11
+LAB BLOOD ORDERABLES\t497466\tLABFHVIG\tHIV-1 AB, WESTERN BLOT\tHVIG\tHIV 1 AB CONFIRMATION\t9999999\t369630.9278\t1\t9999999\t1.00E+14\t97\t35854200\t3.79E+13
+LAB BLOOD ORDERABLES\t497518\tLABTOBUNL\tTOBRAMYCIN SINGLE DAILY DOSE LEVEL\tTOBRASDD\tTOBRAMYCIN, SINGLE DAILY DOSE\t4.4\t10500\t1\t4.4\t19.36\t1\t10500\t110250000
+LAB BLOOD ORDERABLES\t497518\tLABTOBUNL\tTOBRAMYCIN SINGLE DAILY DOSE LEVEL\tTOBUN2\tDATE & TIME OF LAST DOSE\t9999999\t10500\t1\t9999999\t1.00E+14\t1\t10500\t110250000
+LAB BLOOD ORDERABLES\t497518\tLABTOBUNL\tTOBRAMYCIN SINGLE DAILY DOSE LEVEL\tTOBUN3\tDOSAGE\t9999999\t10500\t1\t9999999\t1.00E+14\t1\t10500\t110250000
+LAB BLOOD ORDERABLES\t497518\tLABTOBUNL\tTOBRAMYCIN SINGLE DAILY DOSE LEVEL\tTOBUN4\tADMINISTRATION ROUTE\t9999999\t10500\t1\t9999999\t1.00E+14\t1\t10500\t110250000
+LAB BLOOD ORDERABLES\t541652\tLABAS4I\tAB SCREEN\tSPEXP\tSPECIMEN EXPIRATION DATE/TIME\t9999999\t6960\t1\t9999999\t1.00E+14\t1\t6960\t48441600
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tL0ACTH\tLEFT 0 MINS\t23.5\t#VALUE!\t1\t23.5\t552.25\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tL10ACT\tLEFT +10 MINS\t82\t#VALUE!\t1\t82\t6724\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tL15ACT\tLEFT + 15 MINS\t99.5\t#VALUE!\t1\t99.5\t9900.25\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tL3ACTH\tLEFT +3 MINS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tL5ACTH\tLEFT +5 MINS\t125\t#VALUE!\t1\t125\t15625\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tLM5ACT\tLEFT - 5 MINS\t23.3\t#VALUE!\t1\t23.3\t542.89\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tP0ACTH\tPERIPHERAL 0 MINS\t22.4\t#VALUE!\t1\t22.4\t501.76\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tP10ACT\tPERIPHERAL +10 MINS\t56\t#VALUE!\t1\t56\t3136\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tP15ACT\tPERIPHERAL +15 MINS\t50.1\t#VALUE!\t1\t50.1\t2510.01\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tP3ACTH\tPERIPHERAL +3 MINS\t29.9\t#VALUE!\t1\t29.9\t894.01\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tP5ACTH\tPERIPHERAL +5 MINS\t46.9\t#VALUE!\t1\t46.9\t2199.61\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tPM5ACT\tPERIPHERAL -5 MINS\t22\t#VALUE!\t1\t22\t484\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tR0ACTH\tRIGHT 0 MINS\t65.1\t#VALUE!\t1\t65.1\t4238.01\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tR10ACT\tRIGHT +10 MINS\t339\t#VALUE!\t1\t339\t114921\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tR15ACT\tRIGHT 15 MINS\t325\t#VALUE!\t1\t325\t105625\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tR3ACTH\tRIGHT +3 MINS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tR5ACTH\tRIGHT +5 MINS\t1105\t#VALUE!\t1\t1105\t1221025\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tRM5ACT\tRIGHT -5 MINS\t53.3\t#VALUE!\t1\t53.3\t2840.89\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tSPAC1\tSPACE FOR PETSIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tSPAC2\tSPACE FOR PETSIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tSPAC3\tSPACE FOR PETSIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tSPAC4\tSPACE FOR PETSIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541664\tLABPETSIN\tPETROSAL SINUS TEST\tSPAC5\tSPACE FOR PETSIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541674\tLABTHIOMT\tTHIOPURINE METABOLITES\t6MMPNASSESS\t6-MMPN RESULT ASSESSMENT\t9999999\t605484\t1\t9999999\t1.00E+14\t20\t12109680\t8.50E+12
+LAB BLOOD ORDERABLES\t541677\tLABCDH1\tFAMILIAL GASTRIC CANCER I\tCDH1IN\tINTERPRETATION\t9999999\t1568100\t1\t9999999\t1.00E+14\t1\t1568100\t2.46E+12
+LAB BLOOD ORDERABLES\t541677\tLABCDH1\tFAMILIAL GASTRIC CANCER I\tCDH1RE\tRESULT\t9999999\t1062780\t1\t9999999\t1.00E+14\t4\t4251120\t5.58E+12
+LAB BLOOD ORDERABLES\t541689\tLABFPARVO\tPARVOVIRUS IGG / IGM AB\tFPARV2\tPARVOVIRUS IGM INDEX\t9999999\t323929.7143\t1\t9999999\t1.00E+14\t35\t11337540\t7.36E+12
+LAB BLOOD ORDERABLES\t611471\tLABYDGIGA\tGLIADIN (DEAMIDATED) IGA,SERUM\tYDGLIA\tGLIADIN (DEAMIDATED) IGA\t2.7\t218910\t1\t2.7\t7.29\t2\t437820\t1.07E+11
+LAB BLOOD ORDERABLES\t611814\tLABYENABE\tEXTRACTABLE NUCLEAR AG EVALUATION, SERUM\tSMAB\tAUTOANTIBODIES TO SM\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t611814\tLABYENABE\tEXTRACTABLE NUCLEAR AG EVALUATION, SERUM\tU1RNPAB\tAUTOANTIBODIES TO U1RNP\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t633198\tLABCOXBAB\tCOXSACKIE B AB, SERUM\tTYB1\tCOXSACKIE B1 AB\t9999999\t229080\t1\t9999999\t1.00E+14\t1\t229080\t52477646400
+LAB BLOOD ORDERABLES\t633198\tLABCOXBAB\tCOXSACKIE B AB, SERUM\tTYB2\tCOXSACKIE B2 AB\t9999999\t229080\t1\t9999999\t1.00E+14\t1\t229080\t52477646400
+LAB BLOOD ORDERABLES\t633198\tLABCOXBAB\tCOXSACKIE B AB, SERUM\tTYB3\tCOXSACKIE B3 AB\t9999999\t229080\t1\t9999999\t1.00E+14\t1\t229080\t52477646400
+LAB BLOOD ORDERABLES\t633198\tLABCOXBAB\tCOXSACKIE B AB, SERUM\tTYB4\tCOXSACKIE B4 AB\t9999999\t229080\t1\t9999999\t1.00E+14\t1\t229080\t52477646400
+LAB BLOOD ORDERABLES\t633198\tLABCOXBAB\tCOXSACKIE B AB, SERUM\tTYB5\tCOXSACKIE B5 AB\t9999999\t229080\t1\t9999999\t1.00E+14\t1\t229080\t52477646400
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tPLV1\tPOLIOVIRUS 1 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tPLV2\tPOLIOVIRUS 2 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tPLV3\tPOLIOVIRUS 3 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYB1\tCOXSACKIE B1 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYB2\tCOXSACKIE B2 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYB3\tCOXSACKIE B3 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYB4\tCOXSACKIE B4 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYB5\tCOXSACKIE B5 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYB6\tCOXSACKIE B6 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYP10\tCOXSACKIE A10 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYP16\tCOXSACKIE A16 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYP7\tCOXSACKIE A7 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYP9\tCOXSACKIE A9 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYPE11\tECHOVIRUS 11 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYPE30\tECHOVIRUS 30 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYPE4\tECHOVIRUS 4 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYPE7\tECHOVIRUS 7 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYPE9\tECHOVIRUS 9 AB\t9999999\t335940\t1\t9999999\t1.00E+14\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t668077\tLABRAAS\tRHEUMATOID ARTHRITIS AB SCREEN\tRHFINT\tINTERPRETATION\t9999999\t2437250.769\t1\t9999999\t1.00E+14\t26\t63368520\t2.95E+15
+LAB BLOOD ORDERABLES\t668164\tLABDCMVAB\tDONOR, CMV TOTAL ANTIBODIES\tCMVAB1\tDONOR, CMV TOTAL ANTIBODIES\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668166\tLABDHBCAB\tDONOR, HEP B CORE TOTAL AB\tHBCAB1\tDONOR, HEP B CORE TOTAL AB\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668170\tLABDHBAG\tDONOR, HEP B SURFACE AG\t11891R\tDONOR, HBSAG CONFIRMATION\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668170\tLABDHBAG\tDONOR, HEP B SURFACE AG\tHBAG1\tDONOR, HEP B SURFACE AG\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668172\tLABDHIVAB\tDONOR,HIV-1/HIV-2 AB SCN W/RFL\t11888R\tDONOR, HIV-1/2 AB, CONF.\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668172\tLABDHIVAB\tDONOR,HIV-1/HIV-2 AB SCN W/RFL\tHIVAB1\tDONOR,HIV-1/HIV-2 AB SCN W/RFL\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668174\tLABDHTLVQ\tDONOR, HTLV-I/II AB SCN\tHTLVQ1\tDONOR, HTLV-I/II AB SCN\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668176\tLABDRPR\tDONOR, RPR W/RFL TO SYPH IGG\t11892R\tDONOR, SYPHILIS IGG\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668176\tLABDRPR\tDONOR, RPR W/RFL TO SYPH IGG\tRPR1\tDONOR, RPR W/RFL TO SYPH IGG\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t668178\tLABDRPRS\tDONOR SYPHILIS SCREEN\tRPRS1\tDONOR SYPHILIS SCREEN\t9999999\t208950\t1\t9999999\t1.00E+14\t2\t417900\t91078650000
+LAB BLOOD ORDERABLES\t668192\tLABCKITMU\tDETECTION OF C-KIT MUTATIONS\tKITMD\tINTERPRETED BY\t9999999\t818253.1915\t1\t9999999\t1.00E+14\t188\t153831600\t3.04E+14
+LAB BLOOD ORDERABLES\t670700\tLAB11195R\tN-TELOPEPTIDE, CROSS-LINKED\t11196R\tN-TELOPEPTIDE, CROSS-LINKED\t26\t238920\t1\t26\t676\t1\t238920\t57082766400
+LAB BLOOD ORDERABLES\t670810\tLAB11173R\tIODINE\t11174R\tIODINE\t77\t189300\t1\t77\t5929\t1\t189300\t35834490000
+LAB BLOOD ORDERABLES\t744318\tLAB11599R\tGANICICLOVIR\t11756R\tGANCICLOVIR\t9999999\t636120\t1\t9999999\t1.00E+14\t1\t636120\t4.05E+11
+LAB BLOOD ORDERABLES\t744320\tLAB11604R\tIL 5\t12044R\tINTERLEUKIN 5\t166\t409320\t1\t166\t27556\t1\t409320\t1.68E+11
+LAB BLOOD ORDERABLES\t744324\tLAB11607R\tCOENZYME Q10, REDUCED & TOTAL\t11763R\tINTERPRETATION\t9999999\t282690\t1\t9999999\t1.00E+14\t10\t2826900\t9.22E+11
+LAB BLOOD ORDERABLES\t744330\tLAB11610R\tDONOR, HTLVS(QNS/LIPEMIC ONLY)\t11769R\tDONOR, HTLVS\t9999999\t668460\t1\t9999999\t1.00E+14\t3\t2005380\t1.52E+12
+LAB BLOOD ORDERABLES\t744368\tLABLEGS\tLEGIONELLA SEROLOGY\tLEG1\tL.LEGIONELLA AB (SEROGRP 1)\t9999999\t466080\t1\t9999999\t1.00E+14\t1\t466080\t2.17E+11
+LAB BLOOD ORDERABLES\t862875\tLABPALL\tPROCAINAMIDE\tPA\tPROCAINAMIDE\t9.1\t6420\t1\t9.1\t82.81\t1\t6420\t41216400
+LAB BLOOD ORDERABLES\t862875\tLABPALL\tPROCAINAMIDE\tPAL1\tPEAK, TROUGH, OR RANDOM\t9999999\t6420\t1\t9999999\t1.00E+14\t1\t6420\t41216400
+LAB BLOOD ORDERABLES\t862875\tLABPALL\tPROCAINAMIDE\tPAL2\tDATE & TIME OF LAST DOSE\t9999999\t6420\t1\t9999999\t1.00E+14\t1\t6420\t41216400
+LAB BLOOD ORDERABLES\t862875\tLABPALL\tPROCAINAMIDE\tPAL3\tDOSAGE (INCLUDE UNITS)\t9999999\t6420\t1\t9999999\t1.00E+14\t1\t6420\t41216400
+LAB BLOOD ORDERABLES\t862875\tLABPALL\tPROCAINAMIDE\tPAL4\tADMINISTRATION ROUTE\t9999999\t6420\t1\t9999999\t1.00E+14\t1\t6420\t41216400
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\t12430R\tINTERPRETATION\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tCTIGA\tC.TRACHOMATIS IGA\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tCTIGG\tC.TRACHOMATIS IGG\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tCTIGM\tC.TRACHOMATIS IGM\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tPNIGA\tC. PNEUMONIAE IGA\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tPNIGG\tC. PNEUMONIAE IGG\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tPNIGM\tC. PNEUMONIAE IGM\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tPSIGA\tC. PSITTACI IGA\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tPSIGG\tC. PSITTACI IGG\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\tPSIGM\tC. PSITTACI IGM\t9999999\t165960\t1\t9999999\t1.00E+14\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t885230\tLABGDMTOL\tGDM GLUCOSE TOLERANCE\tGDM1\t1HR\t84\t17220\t1\t84\t7056\t1\t17220\t296528400
+LAB BLOOD ORDERABLES\t885230\tLABGDMTOL\tGDM GLUCOSE TOLERANCE\tGDM2\t2HR\t80\t17220\t1\t80\t6400\t1\t17220\t296528400
+LAB BLOOD ORDERABLES\t885230\tLABGDMTOL\tGDM GLUCOSE TOLERANCE\tGLUF\tGLUCOSE, FASTING (GDMF)\t70\t17220\t1\t70\t4900\t1\t17220\t296528400
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tCENQNT\tANTI-CENTROMERE LEVEL\t43\t279300\t1\t43\t1849\t1\t279300\t78008490000
+LAB BLOOD ORDERABLES\t889079\tLABND816V\tKIT D816V MUT., AS-PCR, NON-BLOOD\tND81DX\tCLINICAL INDICATION\t9999999\t757500\t1\t9999999\t1.00E+14\t1\t757500\t5.74E+11
+LAB BLOOD ORDERABLES\t889079\tLABND816V\tKIT D816V MUT., AS-PCR, NON-BLOOD\tND81RE\tRESULT, NON-BLOOD\t9999999\t757500\t1\t9999999\t1.00E+14\t1\t757500\t5.74E+11
+LAB BLOOD ORDERABLES\t889079\tLABND816V\tKIT D816V MUT., AS-PCR, NON-BLOOD\tND81SO\tSOURCE\t9999999\t757500\t1\t9999999\t1.00E+14\t1\t757500\t5.74E+11
+LAB BLOOD ORDERABLES\t889204\tLABMYD88\tMYD88 MUTATION ANALYSIS\tD88RE\tRESULT\t9999999\t1389780\t1\t9999999\t1.00E+14\t1\t1389780\t1.93E+12
+LAB BLOOD ORDERABLES\t889708\tLABCSMPB\tCANCER SOMATIC MUTATION PNL, BLOOD\tCSMDB\tINTERPRETED BY\t9999999\t940852.5\t1\t9999999\t1.00E+14\t112\t105375480\t2.64E+14
+LAB BLOOD ORDERABLES\t889712\tLABCFSS\tCFTR SCREEN BY SEQUENCING\tCFSSRE\tRESULT\t9999999\t371657.1429\t1\t9999999\t1.00E+14\t7\t2601600\t1.85E+12
+LAB BLOOD ORDERABLES\t890117\tLAB12230R\tSOLUBLE IL 2R\t12231R\t12231R\t9999999\t697333.9535\t1\t9999999\t1.00E+14\t43\t29985360\t7.88E+13
+LAB BLOOD ORDERABLES\t890127\tLAB12241R\tB CELL PHENOTYPING PROFILE\t12254R\t12254R\t9999999\t925412.7273\t1\t9999999\t1.00E+14\t11\t10179540\t4.35E+13
+LAB BLOOD ORDERABLES\t890127\tLAB12241R\tB CELL PHENOTYPING PROFILE\t12255R\t12255R\t9999999\t925412.7273\t1\t9999999\t1.00E+14\t11\t10179540\t4.35E+13
+LAB BLOOD ORDERABLES\t890127\tLAB12241R\tB CELL PHENOTYPING PROFILE\t12278R\t12278R\t9999999\t925412.7273\t1\t9999999\t1.00E+14\t11\t10179540\t4.35E+13
+LAB BLOOD ORDERABLES\t890129\tLAB12279R\tCVID CONFIRMATION FLOW PANEL\t12280R\t12280R\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t890129\tLAB12279R\tCVID CONFIRMATION FLOW PANEL\t12281R\t12281R\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t890137\tLABSTDY1\tSTUDY TEST\tRESS1\tRESS1\t9999999\t671067.3054\t1\t9999999\t1.00E+14\t167\t112068240\t1.25E+14
+LAB BLOOD ORDERABLES\t893876\tLABSF3B1\tSF3B1 MUTATION ANALYSIS\tSF3DX\tCLINICAL INDICATION\t9999999\t190860\t1\t9999999\t1.00E+14\t1\t190860\t36427539600
+LAB BLOOD ORDERABLES\t893876\tLABSF3B1\tSF3B1 MUTATION ANALYSIS\tSF3RE\tRESULT, BLOOD\t9999999\t190860\t1\t9999999\t1.00E+14\t1\t190860\t36427539600
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3DX\tCLINICAL INDICATION\t9999999\t480\t1\t9999999\t1.00E+14\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3SP\tSOURCE\t9999999\t480\t1\t9999999\t1.00E+14\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893915\tLABCDMLPA\tCDH1 MLPA\tCDMLRE\tRESULT\t9999999\t1418550\t1\t9999999\t1.00E+14\t2\t2837100\t4.13E+12
+LAB BLOOD ORDERABLES\t898792\tPATH18\tFLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD\tC48RAT\tTCD4/CD8 RATIO\t1.4\t126180\t1\t1.4\t1.96\t1\t126180\t15921392400
+LAB BLOOD ORDERABLES\t898792\tPATH18\tFLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD\tCD19AB\tCD19 (PAN B), ABS.\t55\t126180\t1\t55\t3025\t1\t126180\t15921392400
+LAB BLOOD ORDERABLES\t898792\tPATH18\tFLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD\tCD19PC\tCD19 (PAN B) %\t17\t126180\t1\t17\t289\t1\t126180\t15921392400
+LAB BLOOD ORDERABLES\t898792\tPATH18\tFLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD\tCD4TOT\tCD4 TOTAL\t41\t126180\t1\t41\t1681\t1\t126180\t15921392400
+LAB BLOOD ORDERABLES\t898792\tPATH18\tFLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD\tTCD4AB\tTOTAL CD4, ABS.\t133\t126180\t1\t133\t17689\t1\t126180\t15921392400
+LAB BLOOD ORDERABLES\t912863\tLAB12415R\tACVRL1 AND ENG (HHT)\t12416R\tHHT FGA SPECIMEN\t9999999\t3636840\t1\t9999999\t1.00E+14\t1\t3636840\t1.32E+13
+LAB BLOOD ORDERABLES\t961559\tLAB12817R\tDONOR, HCV AB SCREEN W/RFLX\t12828R\tDONOR, HEPATITIS C AB\t9999999\t177420\t1\t9999999\t1.00E+14\t1\t177420\t31477856400
+LAB BLOOD ORDERABLES\t966907\tLAB12584R\tTIAGABINE CONCENTRATION\t12593R\tTIAGABINE CONCENTRATION\t37\t350400\t1\t37\t1369\t1\t350400\t1.23E+11
+LAB BLOOD ORDERABLES\t977669\tLABPANPLT\tPLATELET COUNT\tPLT\tPLATELET COUNT\t4\t300\t1\t4\t16\t1\t300\t90000
+LAB BLOOD ORDERABLES\t978241\tLABOGTT\tGLUCOSE TOLERANCE FOR CYSTIC FIBROSIS\tGLT1\tGLUCOSE, 1 HR\t283\t25440\t1\t283\t80089\t1\t25440\t647193600
+LAB BLOOD ORDERABLES\t978241\tLABOGTT\tGLUCOSE TOLERANCE FOR CYSTIC FIBROSIS\tGLT2\tGLUCOSE, 2 HR\t339\t25440\t1\t339\t114921\t1\t25440\t647193600
+MICROBIOLOGY ORDERABLES\t471548\tLABAID\tAEROBIC ORGANISM ID\tSDES\tSPECIMEN\t9999999\t255120\t1\t9999999\t1.00E+14\t1\t255120\t65086214400
+MICROBIOLOGY ORDERABLES\t471620\tLABANERB\tANAEROBIC CULTURE BB\tCULT\tCULT/OTHER RSLT:\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t471771\tLABBXTG\tBIOPSY/TISSUE(GEN)GS\tCULT\tCULT/OTHER RSLT:\t9999999\t522530.9375\t1\t9999999\t1.00E+14\t384\t200651880\t3.85E+14
+MICROBIOLOGY ORDERABLES\t471771\tLABBXTG\tBIOPSY/TISSUE(GEN)GS\tGS\tGRAM STAIN\t9999999\t522530.9375\t1\t9999999\t1.00E+14\t384\t200651880\t3.85E+14
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tAMP\tAMPICILLIN\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tATM\tAZTREONAM.\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tCIP\tCIPROFLOXACIN\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tCRO\tCEFTRIAXONE\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tCTN\tCEFOTETAN\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tCTX\tCEFOTAXIME\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tCZ\tCEFAZOLIN\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tFEP\tCEFEPIME\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tFURI\tCEFUROXIME (IV)\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tGM\tGENTAMICIN\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tIMP\tIMIPENEM\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tLEV\tLEVOFLOXACIN\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tMER\tMEROPENEM\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tMTYP\tMETHOD\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tSAMP\tAMPICILLIN/SULBACTAM\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tSXT\tTRIMETHOPRIM/SULFAMETHOXAZOLE\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471779\tLABBLC\tBLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)\tTZP\tPIPERACILLIN/TAZOBACTAM\t9999999\t418080\t1\t9999999\t1.00E+14\t1\t418080\t1.75E+11
+MICROBIOLOGY ORDERABLES\t471790\tLABBMS\tBMT STERILITY SAMPLE\tCULT\tCULT/OTHER RSLT:\t9999999\t1190220\t1\t9999999\t1.00E+14\t2\t2380440\t2.83E+12
+MICROBIOLOGY ORDERABLES\t471794\tLABBMC\tBONE MARROW CULTURE\tCULT\tCULT/OTHER RSLT:\t9999999\t418604.2105\t1\t9999999\t1.00E+14\t19\t7953480\t3.62E+12
+MICROBIOLOGY ORDERABLES\t472395\tLABFLDC\tFLUID CULTURE AND GRAM STAIN\tORG\tORGANISM\t9999999\t29170200\t1\t9999999\t1.00E+14\t1\t29170200\t8.51E+14
+MICROBIOLOGY ORDERABLES\t472433\tLABFCULS\tFUNGAL CULTURE, SKIN/NAIL\tCULT\tCULT/OTHER RSLT:\t9999999\t1542888\t1\t9999999\t1.00E+14\t10\t15428880\t2.97E+13
+MICROBIOLOGY ORDERABLES\t472454\tLABGENC\tGENITAL CULTURE\tCULT\tCULT/OTHER RSLT:\t9999999\t313706.25\t1\t9999999\t1.00E+14\t32\t10038600\t5.00E+12
+MICROBIOLOGY ORDERABLES\t472458\tLABGIARS\tGIARDIA SCREEN\tCULT\tCULT/OTHER RSLT:\t9999999\t213232.1186\t1\t9999999\t1.00E+14\t236\t50322780\t1.42E+13
+MICROBIOLOGY ORDERABLES\t472593\tLABIDWEE\tWORM ID\tRPT\tRPT\t9999999\t55380\t1\t9999999\t1.00E+14\t1\t55380\t3066944400
+MICROBIOLOGY ORDERABLES\t472593\tLABIDWEE\tWORM ID\tSDES\tSPECIMEN\t9999999\t55380\t1\t9999999\t1.00E+14\t1\t55380\t3066944400
+MICROBIOLOGY ORDERABLES\t472593\tLABIDWEE\tWORM ID\tSREQ\tCOMMENTS\t9999999\t55380\t1\t9999999\t1.00E+14\t1\t55380\t3066944400
+MICROBIOLOGY ORDERABLES\t472680\tLABISOSR\tISOLATOR CULTURE SPECIAL REQUEST\tCULT\tCULT/OTHER RSLT:\t9999999\t1747302.857\t1\t9999999\t1.00E+14\t14\t24462240\t4.57E+13
+MICROBIOLOGY ORDERABLES\t472741\tLABLEGA\tLEGIONELLA CULTURE, ACID\tCULT\tCULT/OTHER RSLT:\t9999999\t616054.2857\t1\t9999999\t1.00E+14\t14\t8624760\t5.65E+12
+MICROBIOLOGY ORDERABLES\t472850\tLABINFO\tMICROBIOLOGY INFORMATION ONLY\tSDES\tSPECIMEN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t472850\tLABINFO\tMICROBIOLOGY INFORMATION ONLY\tSREQ\tCOMMENTS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t473311\tLABSHSV\tHSV SHELL VIAL CULTURE\tCULT\tCULT/OTHER RSLT:\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t473311\tLABSHSV\tHSV SHELL VIAL CULTURE\tRPT\tRPT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t473311\tLABSHSV\tHSV SHELL VIAL CULTURE\tSDES\tSPECIMEN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t473311\tLABSHSV\tHSV SHELL VIAL CULTURE\tSREQ\tCOMMENTS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t473372\tLABSTLC\tSTOOL CULTURE\tCULT\tCULT/OTHER RSLT:\t9999999\t330942.4585\t1\t9999999\t1.00E+14\t301\t99613680\t3.68E+13
+MICROBIOLOGY ORDERABLES\t473437\tLABTHS\tGROUP A STREP CULTURE\tCULT\tCULT/OTHER RSLT:\t9999999\t191605.7143\t1\t9999999\t1.00E+14\t21\t4023720\t8.21E+11
+MICROBIOLOGY ORDERABLES\t473680\tLABTMONA\tTRICHOMONAS EXAM\tCULT\tCULT/OTHER RSLT:\t9999999\t309040\t1\t9999999\t1.00E+14\t3\t927120\t2.91E+11
+MICROBIOLOGY ORDERABLES\t473710\tLABMMIC\tUNLISTED MICROBIOLOGY ORDER\tSDES\tSPECIMEN\t9999999\t518040\t1\t9999999\t1.00E+14\t1\t518040\t2.68E+11
+MICROBIOLOGY ORDERABLES\t473710\tLABMMIC\tUNLISTED MICROBIOLOGY ORDER\tSREQ\tCOMMENTS\t9999999\t518040\t1\t9999999\t1.00E+14\t1\t518040\t2.68E+11
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tAMP\tAMPICILLIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tATM\tAZTREONAM.\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tCIP\tCIPROFLOXACIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tCRO\tCEFTRIAXONE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tCTN\tCEFOTETAN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tCTX\tCEFOTAXIME\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tCZ\tCEFAZOLIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tFEP\tCEFEPIME\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tFURI\tCEFUROXIME (IV)\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tGM\tGENTAMICIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tIMP\tIMIPENEM\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tLEV\tLEVOFLOXACIN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tMER\tMEROPENEM\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tMTYP\tMETHOD\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tSAMP\tAMPICILLIN/SULBACTAM\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tSXT\tTRIMETHOPRIM/SULFAMETHOXAZOLE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t497231\tLABBLC2\tBLOOD CULTURE (2 AEROBIC BOTTLES)\tTZP\tPIPERACILLIN/TAZOBACTAM\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t744390\tLABDVEFLA\tDIRECT VIRAL EXAM FLU A\tDVE\tRESULTS\t9999999\t60293.33333\t1\t9999999\t1.00E+14\t9\t542640\t43775150400
+MICROBIOLOGY ORDERABLES\t744396\tLABDVEADV\tDIRECT VIRAL EXAM ADENO\tRPT\tRPT\t9999999\t49680\t1\t9999999\t1.00E+14\t1\t49680\t2468102400
+MICROBIOLOGY ORDERABLES\t744396\tLABDVEADV\tDIRECT VIRAL EXAM ADENO\tSDES\tSPECIMEN\t9999999\t49680\t1\t9999999\t1.00E+14\t1\t49680\t2468102400
+MICROBIOLOGY ORDERABLES\t744396\tLABDVEADV\tDIRECT VIRAL EXAM ADENO\tSREQ\tCOMMENTS\t9999999\t49680\t1\t9999999\t1.00E+14\t1\t49680\t2468102400
+MICROBIOLOGY ORDERABLES\t744398\tLABDVEP1\tDIRECT VIRAL EXAM PARA 1\tRPT\tRPT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t744398\tLABDVEP1\tDIRECT VIRAL EXAM PARA 1\tSDES\tSPECIMEN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t744398\tLABDVEP1\tDIRECT VIRAL EXAM PARA 1\tSREQ\tCOMMENTS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t870895\tLABBACIDI\tBACTERIA ID BY SEQUENCING, ISOLATE\tSDES\tSPECIMEN\t9999999\t48300\t1\t9999999\t1.00E+14\t1\t48300\t2332890000
+MICROBIOLOGY ORDERABLES\t870895\tLABBACIDI\tBACTERIA ID BY SEQUENCING, ISOLATE\tSREQ\tCOMMENTS\t9999999\t48300\t1\t9999999\t1.00E+14\t1\t48300\t2332890000
+MICROBIOLOGY ORDERABLES\t871582\tLABSHSTGS\tSHC STAT GRAM STAIN\tGS\tGRAM STAIN\t9999999\t3540\t1\t9999999\t1.00E+14\t1\t3540\t12531600
+MICROBIOLOGY ORDERABLES\t884809\tLABROACAN\tACANTHAMOEBA CULTURE\tCULT\tCULT/OTHER RSLT:\t9999999\t2140200\t1\t9999999\t1.00E+14\t1\t2140200\t4.58E+12
+MICROBIOLOGY ORDERABLES\t890162\tLABSTPCR\tTHROAT STREP SCREEN BY PCR\tCULT\tCULT/OTHER RSLT:\t9999999\t114455.7534\t1\t9999999\t1.00E+14\t146\t16710540\t2.41E+12
+MOLECULAR DIAG ORDERABLES\t471737\tLABTBCLO\tB - CELL CLONALITY PCR, TISSUE\tTBCPRM\tPRIMERS\t9999999\t599640\t1\t9999999\t1.00E+14\t1\t599640\t3.60E+11
+MOLECULAR DIAG ORDERABLES\t471737\tLABTBCLO\tB - CELL CLONALITY PCR, TISSUE\tTBCTIS\tSOURCE\t9999999\t599640\t1\t9999999\t1.00E+14\t1\t599640\t3.60E+11
+MOLECULAR DIAG ORDERABLES\t471747\tLABBCRABL\tBCR - ABL, BLOOD\tBCRDIR\tINTERPRETED BY\t9999999\t485881.3483\t1\t9999999\t1.00E+14\t178\t86486880\t5.83E+13
+MOLECULAR DIAG ORDERABLES\t471749\tLABTBCR\tBCR - ABL, TISSUE\tTBCRCT\tCOMMENT\t9999999\t77280\t1\t9999999\t1.00E+14\t1\t77280\t5972198400
+MOLECULAR DIAG ORDERABLES\t471749\tLABTBCR\tBCR - ABL, TISSUE\tTBCRMT\tMETHOD\t9999999\t77280\t1\t9999999\t1.00E+14\t1\t77280\t5972198400
+MOLECULAR DIAG ORDERABLES\t471749\tLABTBCR\tBCR - ABL, TISSUE\tTBCRPM\tPRIMERS\t9999999\t77280\t1\t9999999\t1.00E+14\t1\t77280\t5972198400
+MOLECULAR DIAG ORDERABLES\t472393\tLABFBCRQT\tBCR ABL QUANTITATIVE, FLUID\tFP190\tP190, FLUID\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t472393\tLABFBCRQT\tBCR ABL QUANTITATIVE, FLUID\tQFBCRE\tRESULT\t9999999\t1367340\t1\t9999999\t1.00E+14\t2\t2734680\t5.54E+12
+MOLECULAR DIAG ORDERABLES\t473393\tLABT1114\tT(11\t14) BY PCR\tT11MD\tINTERPRETED BY\t9999999\t266970\t1\t9999999\t1.00E+14\t2\t533940\t2.85E+11
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFPMLR\tPML, FLD\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFT15CO\tCOMMENT, FLD\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFT15FL\tSOURCE, FLUID\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473404\tLABTT1517\tT(15\t17) PML/RAR, TISSUE\tTT15DX\tCLINICAL INDICATION\t9999999\t909120\t1\t9999999\t1.00E+14\t1\t909120\t8.26E+11
+MOLECULAR DIAG ORDERABLES\t473404\tLABTT1517\tT(15\t17) PML/RAR, TISSUE\tTT15RE\tRESULT, TISSUE\t9999999\t909120\t1\t9999999\t1.00E+14\t1\t909120\t8.26E+11
+MOLECULAR DIAG ORDERABLES\t473407\tLABFTCLO\tT-CELL CLONALITY PCR, FLUID\tFTCMT\tCOMMENT\t9999999\t763860\t1\t9999999\t1.00E+14\t1\t763860\t5.83E+11
+MOLECULAR DIAG ORDERABLES\t473408\tLABTTCLO\tT-CELL CLONALITY PCR, TISSUE\tTTCPRM\tPRIMERS\t9999999\t1195020\t1\t9999999\t1.00E+14\t3\t3585060\t4.32E+12
+MOLECULAR DIAG ORDERABLES\t473408\tLABTTCLO\tT-CELL CLONALITY PCR, TISSUE\tTTCTIS\tSOURCE\t9999999\t1195020\t1\t9999999\t1.00E+14\t3\t3585060\t4.32E+12
+MOLECULAR DIAG ORDERABLES\t889710\tLABCSMPBM\tCANCER SOMATIC MUTATION PNL, BM\tCSMDM\tINTERPRETED BY\t9999999\t823243.9024\t1\t9999999\t1.00E+14\t123\t101259000\t9.94E+13
+MOLECULAR DIAG ORDERABLES\t889718\tLABBMNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION, BM\tBMNPMD\tINTERPRETED BY\t9999999\t540720\t1\t9999999\t1.00E+14\t66\t35687520\t2.44E+13
+POINT OF CARE (NON LAB) TESTS\t471601\tPOC44\tPOC URINE DIPSTICK GP\tUGLU\tGLUCOSE URINE\t9999999\t48060\t1\t9999999\t1.00E+14\t2\t96120\t5963220000
+POINT OF CARE (NON LAB) TESTS\t471601\tPOC44\tPOC URINE DIPSTICK GP\tUPROT\tPROTEIN URINE\t9999999\t48060\t1\t9999999\t1.00E+14\t2\t96120\t5963220000
+POINT OF CARE (NON LAB) TESTS\t507568\tPOC1\tPOC URINE DIPSTICK\t11148R\tPH\t8\t-198000\t1\t8\t64\t1\t-198000\t39204000000
+POINT OF CARE (NON LAB) TESTS\t572340\tPOC12\tPOC GASTRIC - OCCULT BLOOD EXAM (UNIT PERFORMED)\tPHGAST\tPH,GASTRIC\t1\t-240\t1\t1\t1\t1\t-240\t57600
+POINT OF CARE (NON LAB) TESTS\t591284\tPOC14\tPOC GLUCOSE BY METER\t11148R\tPH\t7\t16633500\t1\t7\t49\t1\t16633500\t2.77E+14
+POINT OF CARE (NON LAB) TESTS\t591284\tPOC14\tPOC GLUCOSE BY METER\tPNAB1\tPNEUMOCOCCAL AB (PNEUMOVAX)\t150\t-93600\t1\t150\t22500\t1\t-93600\t8760960000
+POINT OF CARE (NON LAB) TESTS\t591284\tPOC14\tPOC GLUCOSE BY METER\tPPD100\tPPD 1:100 CPM\t9999999\t11700\t1\t9999999\t1.00E+14\t1\t11700\t136890000
+POINT OF CARE (NON LAB) TESTS\t591284\tPOC14\tPOC GLUCOSE BY METER\tPPDINT\tPPD INTERPRETATION\t9999999\t-74700\t1\t9999999\t1.00E+14\t1\t-74700\t5580090000
+POINT OF CARE (NON LAB) TESTS\t610682\tPOC32\tPOC HEMOCUE FOR HEMOGLOBIN\tHGB\tPATIENT HEMOGLOBIN RESULT\t9999999\t-240\t1\t9999999\t1.00E+14\t1\t-240\t57600
+POINT OF CARE (NON LAB) TESTS\t624778\tPOC39\tPOC URINE FOR PH\t11147R\tSPECIFIC GRAVITY\t1.01\t-205200\t1\t1.01\t1.0201\t1\t-205200\t42107040000
+POINT OF CARE (NON LAB) TESTS\t624778\tPOC39\tPOC URINE FOR PH\tSPG\tSPECIFIC GRAVITY UA\t1\t-78300\t1\t1\t1\t1\t-78300\t6130890000
+POINT OF CARE (NON LAB) TESTS\t624778\tPOC39\tPOC URINE FOR PH\tUBLOOD\tBLOOD URINE\t9999999\t-196200\t1\t9999999\t1.00E+14\t2\t-392400\t77150880000
+POINT OF CARE (NON LAB) TESTS\t624778\tPOC39\tPOC URINE FOR PH\tUWBC\tLEUKOCYTES\t9999999\t-205200\t1\t9999999\t1.00E+14\t1\t-205200\t42107040000
+POINT OF CARE TESTING\t473185\tLABPCINR\tISTAT INR AND PROTIME\tINR\tINR,POCT\t1.2\t35100\t1\t1.2\t1.44\t1\t35100\t1232010000
+POINT OF CARE TESTING\t473185\tLABPCINR\tISTAT INR AND PROTIME\tPTT\tPTT,POCT\t14.4\t35100\t1\t14.4\t207.36\t1\t35100\t1232010000
+POINT OF CARE TESTING\t591290\tPOC17\tPOC ISTAT CREATININE\tCR\tCREATININE,ISTAT\t0.7\t49260\t1\t0.7\t0.49\t1\t49260\t2426547600
+POINT OF CARE TESTING\t591302\tPOC23\tPOC ISTAT, VENOUS BLOOD GASES (G3+)\tBE\tBASE EXCESS, ISTAT\t1\t57660\t1\t1\t1\t1\t57660\t3324675600
+POINT OF CARE TESTING\t591302\tPOC23\tPOC ISTAT, VENOUS BLOOD GASES (G3+)\tHCO3V\tHCO3 (V), ISTAT\t27.9\t57660\t1\t27.9\t778.41\t1\t57660\t3324675600
+POINT OF CARE TESTING\t591302\tPOC23\tPOC ISTAT, VENOUS BLOOD GASES (G3+)\tPCO2SO\tO2 SATURATION, ISTAT\t19\t57660\t1\t19\t361\t1\t57660\t3324675600
+POINT OF CARE TESTING\t591302\tPOC23\tPOC ISTAT, VENOUS BLOOD GASES (G3+)\tPCO2V\tPCO2 (V), ISTAT\t57.9\t57660\t1\t57.9\t3352.41\t1\t57660\t3324675600
+POINT OF CARE TESTING\t591302\tPOC23\tPOC ISTAT, VENOUS BLOOD GASES (G3+)\tPH\tPH, ISTAT\t7.29\t57660\t1\t7.29\t53.1441\t1\t57660\t3324675600
+POINT OF CARE TESTING\t591304\tPOC24\tPOC ISTAT TROPONIN I\tTNI\tTROPONIN I, POCT\t0\t51000\t1\t0\t0\t1\t51000\t2601000000
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tCAION\tCALCIUM,ION, ISTAT\t1.12\t60\t1\t1.12\t1.2544\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tCR\tCREATININE,ISTAT\t4.7\t60\t1\t4.7\t22.09\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tGLU\tGLUCOSE,ISTAT\t110\t60\t1\t110\t12100\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tHCT\tHCT(CALC), ISTAT\t30\t60\t1\t30\t900\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tHGB\tHGB(CALC), ISTAT\t10.2\t60\t1\t10.2\t104.04\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tK\tPOTASSIUM, ISTAT\t4\t60\t1\t4\t16\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tNA\tSODIUM, ISTAT\t139\t60\t1\t139\t19321\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tPCAGP\tANION GAP, ISTAT\t16\t60\t1\t16\t256\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tPCBUN\tBUN, ISTAT\t21\t60\t1\t21\t441\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tPCCL\tCHLORIDE, ISTAT\t96\t60\t1\t96\t9216\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tPCCOM\tPOCT COMMENT\t9999999\t60\t1\t9999999\t1.00E+14\t1\t60\t3600
+POINT OF CARE TESTING\t1007411\tLABPCCH8\tPOC ISTAT, HCT/HB,NA,K,CHL,BUN,CR,GLUCOSE,ICA,TCO2\tTCO2A\tTCO2, ISTAT\t31\t60\t1\t31\t961\t1\t60\t3600
+POINT OF CARE TESTS (MENLO)\t861037\t230986580\tPOC MENLO PPD TEST\tERYTHREMA\tERYTHREMA\t0\t52200\t1\t0\t0\t1\t52200\t2724840000
+POINT OF CARE TESTS (MENLO)\t861037\t230986580\tPOC MENLO PPD TEST\tMMIND\tMM INDURATION\t0\t52200\t1\t0\t0\t1\t52200\t2724840000
+POINT OF CARE TESTS (MENLO)\t861037\t230986580\tPOC MENLO PPD TEST\tPHLOC\tLOCATION\t9999999\t52200\t1\t9999999\t1.00E+14\t1\t52200\t2724840000
+QUEST ORDERABLES\t977479\tLABQUECORSL\tQUEST - CORTISOL, SERUM LC/MS/MS\tXCORTI\tCORTISOL TOTAL SERUM\t6.2\t-345600\t1\t6.2\t38.44\t1\t-345600\t1.19E+11
+STOOL ORDERABLES\t471510\tLABY5NUC\t5 - NUCLEOTIDASE\t5NUCLEOT\t5\'NUCLEOTIDASE\t67.6\t187770\t1\t67.6\t4569.76\t2\t375540\t81594795600
+STOOL ORDERABLES\t471612\tLABYAMPHB\tAMPHOTERICIN B\tAMPHOTERB\tAMPHOTERICIN B\t9.9\t#VALUE!\t1\t9.9\t98.01\t0\tNone\tNone
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tMG\tMAGNESIUM\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tPHOS\tPHOSPHORUS\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYANTQ\tANTHRAQUINONES\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYBIS\tBISACODYL\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYOXY\tOXYPHENISATIN\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYPHEN\tPHENOLPHTHALEIN\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYRL1\tREPORTING LIMIT\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYRL2\tREPORTING LIMIT\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYRL3\tREPORTING LIMIT\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYRL4\tREPORTING LIMIT\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYRL5\tREPORTING LIMIT\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t471941\tLABYUCLAX\tCATHARTIC LAXATIVE PANEL, URINE\tYRL6\tREPORTING LIMIT\t9999999\t101160\t1\t9999999\t1.00E+14\t1\t101160\t10233345600
+STOOL ORDERABLES\t472304\tLAB11118R\tELASTASE, STOOL\tSTELAS\tELASTASE-1, STOOL\t9999999\t547750.1538\t1\t9999999\t1.00E+14\t130\t71207520\t6.17E+13
+STOOL ORDERABLES\t472784\tLABYSMG\tMAGNESIUM QUANTITATIVE, FECES\tYSMG2\tTOTAL WEIGHT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t472784\tLABYSMG\tMAGNESIUM QUANTITATIVE, FECES\tYSMG3\tCOLLECTION DURATION\t9999999\t280440\t1\t9999999\t1.00E+14\t1\t280440\t78646593600
+STOOL ORDERABLES\t472784\tLABYSMG\tMAGNESIUM QUANTITATIVE, FECES\tYSMG4\tCONCENTRATION\t9999999\t280440\t1\t9999999\t1.00E+14\t1\t280440\t78646593600
+STOOL ORDERABLES\t472823\tLABFECFIB\tMEAT FIBERS, FECAL\tFECFB\tMEAT FIBERS, FECAL\t1\t1306350\t1\t1\t1\t2\t2612700\t4.90E+12
+STOOL ORDERABLES\t473114\tLABSTPOLY\tPMNS / EOSINOPHILS, STOOL\tEOSSTL\tEOSINOPHILS, STOOL\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t473114\tLABSTPOLY\tPMNS / EOSINOPHILS, STOOL\tPOLYST\tPMNS, STOOL\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t473120\tLABPORFEC\tPORPHYRINS FRACTIONATED, FECAL\tFPORIN\tPORPHYRIN INTRP, FEC\t9999999\t495795\t1\t9999999\t1.00E+14\t4\t1983180\t1.03E+12
+STOOL ORDERABLES\t473151\tLABYPA\tPROCAINAMIDE\tNAPA\tNAPA\t1.5\t88380\t1\t1.5\t2.25\t1\t88380\t7811024400
+STOOL ORDERABLES\t473151\tLABYPA\tPROCAINAMIDE\tYPANAP\tPROCAINAMIDE + NAPA\t6\t88380\t1\t6\t36\t1\t88380\t7811024400
+STOOL ORDERABLES\t473151\tLABYPA\tPROCAINAMIDE\tYPROC\tPROCAINAMIDE\t4.5\t88380\t1\t4.5\t20.25\t1\t88380\t7811024400
+STOOL ORDERABLES\t473266\tLABYRICK\tRICKETTSIA AB PANEL\tYRICK2\tSPOTTED FEVER GROUP,AB,IGM,S\t9999999\t236916\t1\t9999999\t1.00E+14\t30\t7107480\t2.42E+12
+STOOL ORDERABLES\t473266\tLABYRICK\tRICKETTSIA AB PANEL\tYRICK3\tTYPHUS FEVER GROUP,AB,IGG,S\t9999999\t236916\t1\t9999999\t1.00E+14\t30\t7107480\t2.42E+12
+STOOL ORDERABLES\t473266\tLABYRICK\tRICKETTSIA AB PANEL\tYRICK4\tTYPHUS FEVER GROUP,AB,IGM,S\t9999999\t236916\t1\t9999999\t1.00E+14\t30\t7107480\t2.42E+12
+STOOL ORDERABLES\t473433\tLABYTHI\tTHIOCYANATE\tTHIOCYAN\tTHIOCYANATE\t9999999\t638707.8261\t1\t9999999\t1.00E+14\t23\t14690280\t1.69E+13
+STOOL ORDERABLES\t473686\tLABYSTRYP\tTRYPSIN, FECAL\tTRYPSINSTL\tTRYPSIN, FECAL\t9999999\t636156\t1\t9999999\t1.00E+14\t5\t3180780\t2.42E+12
+STOOL ORDERABLES\t497243\tLABE2O\tESTRADIOL\tESTRADIOL\tESTRADIOL\t394\t#VALUE!\t1\t394\t155236\t0\tNone\tNone
+STOOL ORDERABLES\t541693\tLABHBCM\tHEPATITIS B CORE / PRECORE MUTATION\tHBCM2\tPRECORE CODON\t9999999\t873165\t1\t9999999\t1.00E+14\t8\t6985320\t7.15E+12
+STOOL ORDERABLES\t576475\tLAB11299R\tSULFONYLUREA HYPOGLYCEMICS\t11300R\tCHLORPROPAMIDE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t576475\tLAB11299R\tSULFONYLUREA HYPOGLYCEMICS\t11301R\tTOLAZAMIDE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t576475\tLAB11299R\tSULFONYLUREA HYPOGLYCEMICS\t11302R\tTOLBUTAMIDE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t576475\tLAB11299R\tSULFONYLUREA HYPOGLYCEMICS\t11303R\tGLYBURIDE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t576475\tLAB11299R\tSULFONYLUREA HYPOGLYCEMICS\t11304R\tGLIPIZIDE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t576475\tLAB11299R\tSULFONYLUREA HYPOGLYCEMICS\t11305R\tACETOHEXAMIDE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t668093\tLABCYLX\tIMMUNE FUNCTION TEST\tCYLX1\tIMMUNE FUNCTION TEST RESULT\t9999999\t321704.1176\t1\t9999999\t1.00E+14\t68\t21875880\t2.40E+13
+STOOL ORDERABLES\t670704\tLAB11269R\tACETYL RECEPTOR AB PANL\tACRBIN\tACETYLCHOLINE BIN AB\t0\t#VALUE!\t1\t0\t0\t0\tNone\tNone
+STOOL ORDERABLES\t670704\tLAB11269R\tACETYL RECEPTOR AB PANL\tACRBLO\tACETYLCHOLINE BLOCKING AB\t0\t#VALUE!\t1\t0\t0\t0\tNone\tNone
+STOOL ORDERABLES\t670704\tLAB11269R\tACETYL RECEPTOR AB PANL\tACRMOD\tACETYLCHOLINE MODULATING AB\t8\t#VALUE!\t1\t8\t64\t0\tNone\tNone
+STOOL ORDERABLES\t670760\tLAB11234R\tVZV TOTAL AND IGM AB PANEL\t11237R\tVZV INTERPRETATION\t9999999\t214763.038\t1\t9999999\t1.00E+14\t237\t50898840\t1.48E+13
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11255R\tORGANISM\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11256R\tAMIKACIN\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11257R\tCIPROFLOXACIN\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11258R\tCLARITHROMYCIN\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11259R\tETHAMBUTOL\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11260R\tLINEZOLID\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11261R\tMOXIFLOXACIN\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11262R\tRIFAMPIN\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11263R\tRIFABUTIN\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11897R\tETHIONAMIDE\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11898R\tISONIAZID\t9999999\t455400\t1\t9999999\t1.00E+14\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670764\tLAB11265R\tENTAMOEBA HISTOLYTICA AG\t11266R\tENTAMOABA HISTOLYTICA AG\t9999999\t249417.8571\t1\t9999999\t1.00E+14\t28\t6983700\t2.23E+12
+STOOL ORDERABLES\t744266\tLAB11568R\tBRUCELLA SEROLOGIES, CSF\t11682R\tBRUCELLA IGG,CSF\t0.1\t272970\t1\t0.1\t0.01\t2\t545940\t1.68E+11
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11724R\tCANDIDA ALBICANS, DILUTION 1\t1.8\t#VALUE!\t1\t1.8\t3.24\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11727R\tCANDIDA ALBICANS, DILUTION 4\t4.9\t#VALUE!\t1\t4.9\t24.01\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11729R\tTETANUS TOXOID, DILUTION 1\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11731R\tTETANUS TOXOID, DILUTION 3\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11732R\tTETANUS TOXOID, DILUTION 4\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB12284R\tLYMPHO PROLIFERATION, AG\t12291R\t12291R\t9999999\t342800\t1\t9999999\t1.00E+14\t3\t1028400\t5.85E+11
+STOOL ORDERABLES\t890139\tLABSTDY2\tSTUDY TEST\tLABS2\tLABS2\t9999999\t427020\t1\t9999999\t1.00E+14\t2\t854040\t3.80E+11
+STOOL ORDERABLES\t890251\tLAB12578R\tCHLORIDE, 24 HR STOOL\tYSTCL2\tTOTAL WEIGHT\t756\t1815000\t1\t756\t571536\t2\t3630000\t6.65E+12
+STOOL ORDERABLES\t910604\tLAB12503R\tPOTASSIUM, 24-HR STOOL\tYSTK2\tTOTAL WEIGHT\t9999999\t310750\t1\t9999999\t1.00E+14\t6\t1864500\t1.50E+12
+TIMED URINE\t473737\tLABUPIET\tURINE PROTEIN IMMUNOFIXATION ELECTROPHORESIS (TIMED)\tUPIER\tRESULT\t9999999\t309620\t1\t9999999\t1.00E+14\t18\t5573160\t2.51E+12
+URINE ORDERABLES\t472442\tLABGHBUR\tGAMMA - HYDROXYBUTYRIC ACID, URINE\tGHBURN\tG-OH-BUTYRIC AC,UR\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t472480\tLABUGLT\tGLUCOSE, URINE (TIMED)\tGLUEX\tGLUCOSE EXCRETION\t364\t7080\t1\t364\t132496\t1\t7080\t50126400
+URINE ORDERABLES\t472480\tLABUGLT\tGLUCOSE, URINE (TIMED)\tGLUURN\tGLUCOSE, URINE\t56\t7080\t1\t56\t3136\t1\t7080\t50126400
+URINE ORDERABLES\t472480\tLABUGLT\tGLUCOSE, URINE (TIMED)\tUT7\tCOLLECTION PERIOD GLUCOSE\t24\t7080\t1\t24\t576\t1\t7080\t50126400
+URINE ORDERABLES\t472480\tLABUGLT\tGLUCOSE, URINE (TIMED)\tVOL7\tVOLUME GLUCOSE\t650\t7080\t1\t650\t422500\t1\t7080\t50126400
+URINE ORDERABLES\t472927\tLABMPSQNT\tMUCOPOLYSACCHARIDES QUANTITATIVE, URINE\tMPS\tMUCOPOLYSAC, UR\t3.9\t#VALUE!\t1\t3.9\t15.21\t0\tNone\tNone
+URINE ORDERABLES\t473092\tLABYUPCPC\tPHENCYCLIDINE CONFIRMATION, URINE\tYUPCGC\tPHENCYCLIDINE\t30\t#VALUE!\t1\t30\t900\t0\tNone\tNone
+URINE ORDERABLES\t473730\tLABUA\tURINALYSIS WITH MICROSCOPIC\tCLNTST\tCLINITEST\t9999999\t4860\t1\t9999999\t1.00E+14\t1\t4860\t23619600
+URINE ORDERABLES\t473731\tLABUAMICR\tURINALYSIS MICROSCOPIC ONLY\tURBC\tRBC, URINE\t9999999\t2220\t1\t9999999\t1.00E+14\t1\t2220\t4928400
+URINE ORDERABLES\t473731\tLABUAMICR\tURINALYSIS MICROSCOPIC ONLY\tUWBC\tWBC, URINE\t9999999\t2220\t1\t9999999\t1.00E+14\t1\t2220\t4928400
+URINE ORDERABLES\t473732\tLABUAPRN\tURINALYSIS, SCREEN FOR CULTURE\tCLNTST\tCLINITEST\t9999999\t1680\t1\t9999999\t1.00E+14\t1\t1680\t2822400
+URINE ORDERABLES\t473770\tLAB12845R\tVMA AND HVA, PEDIATRIC, URINE\t12843R\tCHILD VMA\t9999999\t234900\t1\t9999999\t1.00E+14\t1\t234900\t55178010000
+URINE ORDERABLES\t473770\tLAB12845R\tVMA AND HVA, PEDIATRIC, URINE\t12844R\tCHILD HVA\t9999999\t234900\t1\t9999999\t1.00E+14\t1\t234900\t55178010000
+URINE ORDERABLES\t497400\tLABYDROTC\tDRUG SCREEN PRESCRIPTION / OTC\t12194R\tDRUGS DETECTED:\t9999999\t212726.6667\t1\t9999999\t1.00E+14\t9\t1914540\t6.68E+11
+URINE ORDERABLES\t497400\tLABYDROTC\tDRUG SCREEN PRESCRIPTION / OTC\t12195R\tSUSPECT DRUG\t9999999\t212726.6667\t1\t9999999\t1.00E+14\t9\t1914540\t6.68E+11
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tALCOHOL\tALCOHOL\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tAMPHET\tAMPHETAMINES\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tBARB\tBARBITURATES\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tBENZO\tBENZODIAZEPINES\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tCOCAINE\tCOCAINE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tMETHADONE\tMETHADONE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tOPIATE\tOPIATES\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tPROPOX\tPROPOXYPHENE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tYUPCP\tPHENCYCLIDINE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t517501\tLABYUCD12\tCONFIRMED DRUG ABUSE SURVEY 12\tYUTTHC\tTETRAHYDROCANNABINOL\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t670822\tLAB11219R\tIODINE,U\t11220R\tIDODINE, U\t320\t157260\t1\t320\t102400\t1\t157260\t24730707600
+URINE ORDERABLES\t670822\tLAB11219R\tIODINE,U\t11221R\tCOLLECTION DURATION\t24\t157260\t1\t24\t576\t1\t157260\t24730707600
+URINE ORDERABLES\t670822\tLAB11219R\tIODINE,U\t11222R\tURINE VOLUME\t2905\t157260\t1\t2905\t8439025\t1\t157260\t24730707600
+URINE ORDERABLES\t670822\tLAB11219R\tIODINE,U\t11223R\tIODINE CONCENTRATION\t110\t157260\t1\t110\t12100\t1\t157260\t24730707600
+URINE ORDERABLES\t670826\tLAB11225R\tLEAD,U\t11226R\tCOLLECTION DURATION\t9999999\t218400\t1\t9999999\t1.00E+14\t1\t218400\t47698560000
+URINE ORDERABLES\t670826\tLAB11225R\tLEAD,U\t11227R\tURINE VOLUME\t9999999\t218400\t1\t9999999\t1.00E+14\t1\t218400\t47698560000
+URINE ORDERABLES\t670826\tLAB11225R\tLEAD,U\t11228R\tPB CONC\t9999999\t218400\t1\t9999999\t1.00E+14\t1\t218400\t47698560000
+URINE ORDERABLES\t670826\tLAB11225R\tLEAD,U\t12199R\tLEAD, 24 HR, U\t9999999\t218400\t1\t9999999\t1.00E+14\t1\t218400\t47698560000
+URINE ORDERABLES\t670828\tLAB11229R\tMETANEPHRINE,FRACT,RANM U\tVOLUMEURN\tURINE VOLUME\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t670828\tLAB11229R\tMETANEPHRINE,FRACT,RANM U\tYUMECO\tCOMMENT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+URINE ORDERABLES\t670828\tLAB11229R\tMETANEPHRINE,FRACT,RANM U\tYUMEUT\tCOLLECTION DURATION\t9999999\t471510\t1\t9999999\t1.00E+14\t2\t943020\t4.75E+11
+VIROLOGY ORDERABLES\t472015\tLABCLCR2\tCHLAMYDIA MOLECULAR DETECTION\tDCL4\tTEST INFORMATION\t9999999\t105230\t1\t9999999\t1.00E+14\t12\t1262760\t1.93E+11
+VIROLOGY ORDERABLES\t472201\tLABDVERO\tROTAVIRUS EIA (DIRECT VIRAL EXAM)\tDVE\tRESULTS\t9999999\t68157\t1\t9999999\t1.00E+14\t60\t4089420\t4.28E+11
+VIROLOGY ORDERABLES\t472201\tLABDVERTV\tROTAVIRUS EIA (DIRECT VIRAL EXAM)\tRPT\tRPT\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t472201\tLABDVERTV\tROTAVIRUS EIA (DIRECT VIRAL EXAM)\tSDES\tSPECIMEN\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t472201\tLABDVERTV\tROTAVIRUS EIA (DIRECT VIRAL EXAM)\tSREQ\tCOMMENTS\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t472254\tLABEBPCRQ\tEBV PCR QUANTITATIVE\tEBV\tEBV BY PCR\t9999999\t-518400\t1\t9999999\t1.00E+14\t1\t-518400\t2.69E+11
+VIROLOGY ORDERABLES\t472525\tLABHBSQL\tANTI-HBS QUAL\tHBSAB\tHEPATITIS B SURFACE AB QUAL\t9999999\t22020\t1\t9999999\t1.00E+14\t1\t22020\t484880400
+VIROLOGY ORDERABLES\t472530\tLABHSAB\tHSV VIRAL AB\tHSAB\tVIRAL AB HSV\t9999999\t238239.8507\t1\t9999999\t1.00E+14\t134\t31924140\t1.03E+13
+VIROLOGY ORDERABLES\t472557\tLABHIVQ2\tHIV QUANTITATIVE PCR\tHIVIPR\tTEST DESCRIPTION\t9999999\t339631.7442\t1\t9999999\t1.00E+14\t172\t58416660\t2.76E+13
+VIROLOGY ORDERABLES\t472560\tLABHIVDS\tHIV - 1 AG DONOR SCREEN QUALITATIVE\tVDS4\tHIV-1 P24 (NON ICD) AG LEVEL\t9999999\t773550\t1\t9999999\t1.00E+14\t2\t1547100\t1.20E+12
+VIROLOGY ORDERABLES\t472561\tLABAVRT\tHIV-1 GENOTYPE & ANTIVIR RESIST\tCULT\tCULT/OTHER RSLT:\t9999999\t696693.125\t1\t9999999\t1.00E+14\t96\t66882540\t7.55E+13
+VIROLOGY ORDERABLES\t472574\tLABYHMPVP\tHUMAN METAPNEUMOVIRUS PCR\tYHMP2\tSOURCE\t9999999\t455820\t1\t9999999\t1.00E+14\t1\t455820\t2.08E+11
+VIROLOGY ORDERABLES\t473210\tLABDVEAB\tRAPID FLU A/B EIA\tRFLUA\tINFLUENZA VIRUS TYPE A\t9999999\t11850\t1\t9999999\t1.00E+14\t10\t118500\t2648221200
+VIROLOGY ORDERABLES\t473284\tLABMEAIGG\tRUBEOLA VIRAL AB\tME\tRUBEOLA (MEASLES) AB, IGG\t9999999\t123780\t1\t9999999\t1.00E+14\t1\t123780\t15321488400
+VIROLOGY ORDERABLES\t473461\tLABTOXIG\tTOXOPLASMA SEROLOGY\tTOXO\tTOXOPLASMA IGG\t9999999\t515100\t1\t9999999\t1.00E+14\t1\t515100\t2.65E+11
+VIROLOGY ORDERABLES\t473783\tLABVZVIGG\tVZ IGG\tVGGDES\tVZV IGG TEST DESCRIPTION\t9999999\t167515.5882\t1\t9999999\t1.00E+14\t272\t45564240\t9.41E+12
+VIROLOGY ORDERABLES\t473783\tLABVZVIGG\tVZ IGG\tVZAB\tVARICELLA ZOSTER AB IGG\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t497325\tLABADVDNA\tADENOVIRUS DNA, QUALITATIVE PCR\tADOV\tADENOVIRUS DNA, QL PCR\t9999999\t174138\t1\t9999999\t1.00E+14\t140\t24379320\t5.10E+12
+VIROLOGY ORDERABLES\t497325\tLABADVQL\tADENOVIRUS PCR QUAL\tSOURC3\tADENOVIRUS SOURCE\t9999999\t114450\t1\t9999999\t1.00E+14\t2\t228900\t28059325200
+VIROLOGY ORDERABLES\t497450\tLABBKVPC\tBK VIRUS DNA QUANTITATION\tSOURC6\tSOURCE\t9999999\t168960\t1\t9999999\t1.00E+14\t1\t168960\t28547481600
+VIROLOGY ORDERABLES\t497450\tLABBKVPC\tBK VIRUS PCR, QUANT, PLASMA\tBKQ\tBKV DNA QUANTITATION\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t497450\tLABBKVPC\tBK VIRUS PCR, QUANT, PLASMA\tSOURC6\tSOURCE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t497468\tLABBKDNA\tBK VIRUS DNA PCR\tSOURC7\tSOURCE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t590497\tLABADPCRQ\tADENOVIRUS PCR QUANT\tADPCR1\tADENVIRUS DNA\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t590497\tLABADPCRQ\tADENOVIRUS PCR QUANT\tSOUR10\tSOURCE\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t590497\tLABADVQT\tADENOVIRUS REAL TIME PCR,QUANTITATIVE\tSOUR10\tSOURCE\t9999999\t217572\t1\t9999999\t1.00E+14\t5\t1087860\t2.65E+11
+VIROLOGY ORDERABLES\t590498\tLABADVQT\tADENOVIRUS DNA PCR QUANT\tADVTIP\tTEST DESCRIPTION\t9999999\t170190\t1\t9999999\t1.00E+14\t12\t2042280\t4.38E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, CSF\tEBV\tEBV BY PCR\t9999999\t249394.2857\t1\t9999999\t1.00E+14\t7\t1745760\t4.94E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, CSF\tYEBP1\tSPECIMEN SOURCE\t9999999\t249394.2857\t1\t9999999\t1.00E+14\t7\t1745760\t4.94E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, CSF\tYEBP3\tSPECIAL INFORMATION\t9999999\t249394.2857\t1\t9999999\t1.00E+14\t7\t1745760\t4.94E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, CSF\tYEPB4\tREPORT STATUS\t9999999\t249394.2857\t1\t9999999\t1.00E+14\t7\t1745760\t4.94E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, FLUIDS (EPSTEIN-BARR VIRUS PCR, FLUIDS)\tEBV\tEBV BY PCR\t9999999\t329575.7143\t1\t9999999\t1.00E+14\t14\t4614060\t1.91E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, FLUIDS (EPSTEIN-BARR VIRUS PCR, FLUIDS)\tYEBP3\tSPECIAL INFORMATION\t9999999\t329575.7143\t1\t9999999\t1.00E+14\t14\t4614060\t1.91E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, FLUIDS (EPSTEIN-BARR VIRUS PCR, FLUIDS)\tYEPB4\tREPORT STATUS\t9999999\t329575.7143\t1\t9999999\t1.00E+14\t14\t4614060\t1.91E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN BARR VIRUS PCR, FLUIDS\tEBV\tEBV BY PCR\t9999999\t326800\t1\t9999999\t1.00E+14\t3\t980400\t3.42E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN BARR VIRUS PCR, FLUIDS\tYEBP1\tSPECIMEN SOURCE\t9999999\t326800\t1\t9999999\t1.00E+14\t3\t980400\t3.42E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN BARR VIRUS PCR, FLUIDS\tYEBP3\tSPECIAL INFORMATION\t9999999\t326800\t1\t9999999\t1.00E+14\t3\t980400\t3.42E+11
+VIROLOGY ORDERABLES\t670953\tLABHHV6QT\tHERPES VIRUS 6 DNA, QUANT\t11154R\tSOURCE\t9999999\t206940\t1\t9999999\t1.00E+14\t2\t413880\t92256228000
+VIROLOGY ORDERABLES\t670953\tLABHHV6QT\tHERPES VIRUS 6 DNA, QUANT\tHHV6TI\tTEST DESCRIPTION\t9999999\t254505\t1\t9999999\t1.00E+14\t8\t2036040\t6.91E+11
+VIROLOGY ORDERABLES\t670954\tINACTIVE 1\tHHV-6 PCR QUANT\tHHV6CP\tRESULT\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+VIROLOGY ORDERABLES\t670954\tINACTIVE 1\tHHV-6 PCR QUANT\tHHV6DN\tHHV-6 DNA\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+VIROLOGY ORDERABLES\t670954\tINACTIVE 1\tHHV-6 PCR QUANT\tHHV6LO\tRESULT LOG 10\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+VIROLOGY ORDERABLES\t670954\tINACTIVE 1\tHHV-6 PCR QUANT\tHHV6SP\tSPECIMEN\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+VIROLOGY ORDERABLES\t670954\tINACTIVE 1\tHHV-6 PCR QUANT\tHHV6TI\tTEST DESCRIPTION\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+VIROLOGY ORDERABLES\t670954\tLABHHV6QT\tHHV-6 PCR QUANT\tHHV6TI\tTEST DESCRIPTION\t9999999\t1350\t1\t9999999\t1.00E+14\t2\t2700\t7290000
+VIROLOGY ORDERABLES\t670955\tLABEAIGG\tEBV EARLY ANTIGEN IGG\tEAGDES\tEAGDES\t9999999\t285229.4118\t1\t9999999\t1.00E+14\t17\t4848900\t2.81E+12
+VIROLOGY ORDERABLES\t670957\tLABEBNABY\tEBV NUCLEAR ANTIGEN (EBNA) IGG\tEBNDES\tEBNDES\t9999999\t298560\t1\t9999999\t1.00E+14\t21\t6269760\t3.42E+12
+VIROLOGY ORDERABLES\t670957\tLABEBNABY\tEBV NUCLEAR ANTIGEN IGG\tEBNQUL\tEBNQUL\t9999999\t687360\t1\t9999999\t1.00E+14\t2\t1374720\t9.65E+11
+VIROLOGY ORDERABLES\t670959\tLAB11024R\tEB VIRAL CAPSID AG IGM AB\t11167R\tEB VCA IGM AB\t9999999\t369690\t1\t9999999\t1.00E+14\t2\t739380\t3.71E+11
+VIROLOGY ORDERABLES\t670959\tLABVCAIGM\tEBV VIRAL CAPSID ANTIGEN IGM\tVMDES\tVMDES\t9999999\t251356.0714\t1\t9999999\t1.00E+14\t56\t14075940\t5.57E+12
+VIROLOGY ORDERABLES\t670961\tLAB11030R\tEB VIRAL CAPSID AG IGG AB\t11168R\tEB VCA IGG AB\t9999999\t369690\t1\t9999999\t1.00E+14\t2\t739380\t3.71E+11
+VIROLOGY ORDERABLES\t670961\tLABVCAIGG\tEBV VIRAL CAPSID ANTIGEN IGG\tVGDES\tVGDES\t9999999\t281538.4615\t1\t9999999\t1.00E+14\t52\t14640000\t7.71E+12
+VIROLOGY ORDERABLES\t862853\tLABFLUAPC \tFLU A PCR\tFLUADI\tDISCLAIMER\t9999999\t163609.7143\t1\t9999999\t1.00E+14\t35\t5726340\t1.13E+12
+VIROLOGY ORDERABLES\t864644\tLABFLUAPX\tFLU A PCR REFLEX TO 2009 H1N1\tFLUXDI\tDISCLAIMER\t9999999\t183683.9241\t1\t9999999\t1.00E+14\t158\t29022060\t8.42E+12
+VIROLOGY ORDERABLES\t864646\tLABH1N1PC\t2009 H1N1 PCR, H274Y MUTATION\tH1N1IN\tINTERPRETATION\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t864646\tLABH1N1PC\t2009 H1N1 PCR, H274Y MUTATION\tH1N1MT\tMETHOD\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t876717\tLABDVEAV3\tADENO DFA\tADV3IP\tTEST DESCRIPTION\t9999999\t373280\t1\t9999999\t1.00E+14\t3\t1119840\t9.84E+11
+VIROLOGY ORDERABLES\t876717\tLABDVEAV3\tADENO DFA\tADV3SP\tSPECIMEN\t9999999\t373280\t1\t9999999\t1.00E+14\t3\t1119840\t9.84E+11
+VIROLOGY ORDERABLES\t876725\tLABDVEPI1\tPARA 1 DFA\tPI1\tPARAINFLUENZA 1\t9999999\t987120\t1\t9999999\t1.00E+14\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876725\tLABDVEPI1\tPARA 1 DFA\tPI1IP\tTEST DESCRIPTION\t9999999\t987120\t1\t9999999\t1.00E+14\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876727\tLABDVEPI2\tPARA 2 DFA\tPI2\tPARAINFLUENZA 2\t9999999\t987120\t1\t9999999\t1.00E+14\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876727\tLABDVEPI2\tPARA 2 DFA\tPI2IP\tTEST DESCRIPTION\t9999999\t987120\t1\t9999999\t1.00E+14\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876729\tLABDVEPI3\tPARA 3 DFA\tPI3\tPARAINFLUENZA 3\t9999999\t987120\t1\t9999999\t1.00E+14\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876729\tLABDVEPI3\tPARA 3 DFA\tPI3IP\tTEST DESCRIPTION\t9999999\t987120\t1\t9999999\t1.00E+14\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876731\tLABDVEMP\tMPV DFA\tMPIP\tTEST DESCRIPTION\t9999999\t987120\t1\t9999999\t1.00E+14\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876739\tLABTOXGM\tTOXOPLASMA IGM & IGG\tTOXGQL\tIGG RESULT\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+VIROLOGY ORDERABLES\t876739\tLABTOXGM\tTOXOPLASMA IGM & IGG\tTOXMQL\tIGM RESULT\t9999999\t0\t1\t9999999\t1.00E+14\t1\t0\t0
+VIROLOGY ORDERABLES\t876740\tINACTIVE 4\tTOXOPLASMA IGG IGM\tTOXGQL\tIGG RESULT\t9999999\t186060\t1\t9999999\t1.00E+14\t1\t186060\t34618323600
+VIROLOGY ORDERABLES\t876740\tINACTIVE 4\tTOXOPLASMA IGG IGM\tTOXMQL\tIGM RESULT\t9999999\t186060\t1\t9999999\t1.00E+14\t1\t186060\t34618323600
+VIROLOGY ORDERABLES\t876740\tLABTOXGM\tTOXOPLASMA IGG IGM\tTOXGQT\tIGG LEVEL\t8\t75540\t1\t8\t64\t1\t75540\t5706291600
+VIROLOGY ORDERABLES\t876741\tLABTOXGMR\tTOXO PREGNANCY PANEL\tTOXGQL\tIGG RESULT\t9999999\t148380\t1\t9999999\t1.00E+14\t1\t148380\t22016624400
+VIROLOGY ORDERABLES\t876741\tLABTOXGMR\tTOXO PREGNANCY PANEL\tTOXMQL\tIGM RESULT\t9999999\t148380\t1\t9999999\t1.00E+14\t1\t148380\t22016624400
+VIROLOGY ORDERABLES\t876741\tLABTOXOPR\tTOXO PREGNANCY PANEL\tTOXIGR\tTOXOPLASMA IGG\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t876741\tLABTOXOPR\tTOXO PREGNANCY PANEL\tTOXIMR\tTOXOPLASMA IGM\t9999999\t#VALUE!\t1\t9999999\t1.00E+14\t0\tNone\tNone
+VIROLOGY ORDERABLES\t879420\tLABRMPCR\tRSV/MPV PCR\tRSMPSP\tSPECIMEN\t9999999\t86400\t1\t9999999\t1.00E+14\t3\t259200\t28951264800
+VIROLOGY ORDERABLES\t889084\tLABDVEHVR\tHSV/VZV DFA REFLEX PCR\tHVSP\tSPECIMEN\t9999999\t85470\t1\t9999999\t1.00E+14\t56\t4786320\t8.40E+11
+VIROLOGY ORDERABLES\t897645\tLABHPVHRT\tHPV HIGH RISK-16/18 REFLEX\tHPTI\tTEST INFORMATION\t9999999\t23400\t1\t9999999\t1.00E+14\t1\t23400\t547560000
+VIROLOGY ORDERABLES\t897645\tLABHPVHRT\tHPV HIGH RISK-16/18 REFLEX\tHPV\tHPV DNA PROBE RESULT:\t9999999\t23400\t1\t9999999\t1.00E+14\t1\t23400\t547560000
+VIROLOGY ORDERABLES\t897645\tLABHPVHRT\tHPV HIGH RISK-16/18 REFLEX\tSDES6\tSPECIMEN\t9999999\t23400\t1\t9999999\t1.00E+14\t1\t23400\t547560000
+VIROLOGY ORDERABLES\t906949\tLABMUMRC\tMUMPS RAPID CULTURE\tMUMRCD\tTEST DESCRIPTION\t9999999\t182240\t1\t9999999\t1.00E+14\t3\t546720\t1.15E+11
+VIROLOGY ORDERABLES\t906949\tLABMUMRC\tMUMPS RAPID CULTURE\tMUMSPM\tSPECIMEN\t9999999\t182240\t1\t9999999\t1.00E+14\t3\t546720\t1.15E+11
+VIROLOGY ORDERABLES\t906951\tLABMEARC\tMEASLES RAPID CULTURE\tMEARCD\tTEST DESCRIPTION\t9999999\t124470\t1\t9999999\t1.00E+14\t2\t248940\t34398594000
+VIROLOGY ORDERABLES\t906951\tLABMEARC\tMEASLES RAPID CULTURE\tMEASPM\tSPECIMEN\t9999999\t124470\t1\t9999999\t1.00E+14\t2\t248940\t34398594000
+VIROLOGY ORDERABLES\t906957\tLABCMVRC\tCMV RAPID CULTURE\tCMVDSV\tTEST DESCRIPTION\t9999999\t175699.0909\t1\t9999999\t1.00E+14\t22\t3865380\t7.11E+11
+VIROLOGY ORDERABLES\t966893\tLABVCULO\tVIRAL CULTURE, OCULAR\tCULT\tCULT/OTHER RSLT:\t9999999\t1069548\t1\t9999999\t1.00E+14\t10\t10695480\t1.26E+13
+VIROLOGY ORDERABLES\t966895\tLABVCULU\tVIRAL CULTURE, URINE\tRPT\tRPT\t9999999\t1267920\t1\t9999999\t1.00E+14\t1\t1267920\t1.61E+12
+VIROLOGY ORDERABLES\t966895\tLABVCULU\tVIRAL CULTURE, URINE\tSDES\tSPECIMEN\t9999999\t1267920\t1\t9999999\t1.00E+14\t1\t1267920\t1.61E+12
+VIROLOGY ORDERABLES\t966895\tLABVCULU\tVIRAL CULTURE, URINE\tSREQ\tCOMMENTS\t9999999\t1267920\t1\t9999999\t1.00E+14\t1\t1267920\t1.61E+12
+VIROLOGY ORDERABLES\t1007409\tLABVZVQL\tVZV DNA PCR QUAL, NON LESION\tVZQLIP\tTEST DESCRIPTION\t9999999\t192832.6829\t1\t9999999\t1.00E+14\t82\t15812280\t4.51E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV1\tHCV GENOTYPE 1\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV1S\tHCV GENOTYPE 1 SUBTYPE\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV2\tHCV GENOTYPE 2\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV2S\tHCV GENOTYPE 2 SUBTYPE\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV3\tHCV GENOTYPE 3\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV4\tHCV GENOTYPE 4\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV5\tHCV GENOTYPE 5\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCV6\tHCV GENOTYPE 6\t9999999\t766260\t1\t9999999\t1.00E+14\t2\t1532520\t1.95E+12
+BLOOD BANK PRODUCT ORDERABLES\t473474\tLABTBP\tTRANSFUSION BLOOD PRODUCT 1\tUNT\tUNIT NUMBER \t#VALUE!\t53958.45904\t0\tNone\tNone\t40650\t2193411360\t3.01E+14
+BLOOD BANK PRODUCT ORDERABLES\t473475\tLABTBP9\tTRANSFUSION BLOOD PRODUCT 10\tUNT\tUNIT NUMBER \t#VALUE!\t55642.15709\t0\tNone\tNone\t853\t47462760\t6.04E+12
+BLOOD BANK PRODUCT ORDERABLES\t473486\tLABTBP10\tTRANSFUSION BLOOD PRODUCT 11\tUNT\tUNIT NUMBER \t#VALUE!\t50077.32759\t0\tNone\tNone\t696\t34853820\t4.01E+12
+BLOOD BANK PRODUCT ORDERABLES\t473496\tLABTBP11\tTRANSFUSION BLOOD PRODUCT 12\tUNT\tUNIT NUMBER \t#VALUE!\t50032.09756\t0\tNone\tNone\t615\t30769740\t3.61E+12
+BLOOD BANK PRODUCT ORDERABLES\t473507\tLABTBP12\tTRANSFUSION BLOOD PRODUCT 13\tUNT\tUNIT NUMBER \t#VALUE!\t46753.20236\t0\tNone\tNone\t509\t23797380\t2.56E+12
+BLOOD BANK PRODUCT ORDERABLES\t473518\tLABTBP13\tTRANSFUSION BLOOD PRODUCT 14\tUNT\tUNIT NUMBER \t#VALUE!\t49645.91489\t0\tNone\tNone\t470\t23333580\t2.61E+12
+BLOOD BANK PRODUCT ORDERABLES\t473529\tLABTBP14\tTRANSFUSION BLOOD PRODUCT 15\tUNT\tUNIT NUMBER \t#VALUE!\t48640.67308\t0\tNone\tNone\t416\t20234520\t2.20E+12
+BLOOD BANK PRODUCT ORDERABLES\t473540\tLABTBP15\tTRANSFUSION BLOOD PRODUCT 16\tUNT\tUNIT NUMBER \t#VALUE!\t45845.13812\t0\tNone\tNone\t362\t16595940\t1.66E+12
+BLOOD BANK PRODUCT ORDERABLES\t473551\tLABTBP16\tTRANSFUSION BLOOD PRODUCT 17\tUNT\tUNIT NUMBER \t#VALUE!\t47227.55102\t0\tNone\tNone\t294\t13884900\t1.55E+12
+BLOOD BANK PRODUCT ORDERABLES\t473562\tLABTBP17\tTRANSFUSION BLOOD PRODUCT 18\tUNT\tUNIT NUMBER \t#VALUE!\t46629.4382\t0\tNone\tNone\t267\t12450060\t1.39E+12
+BLOOD BANK PRODUCT ORDERABLES\t473573\tLABTBP18\tTRANSFUSION BLOOD PRODUCT 19\tUNT\tUNIT NUMBER \t#VALUE!\t48294.88789\t0\tNone\tNone\t223\t10769760\t1.30E+12
+BLOOD BANK PRODUCT ORDERABLES\t473584\tLABTBP1\tTRANSFUSION BLOOD PRODUCT 2\tUNT\tUNIT NUMBER \t#VALUE!\t71687.08515\t0\tNone\tNone\t20423\t1464065340\t2.44E+14
+BLOOD BANK PRODUCT ORDERABLES\t473585\tLABTBP19\tTRANSFUSION BLOOD PRODUCT 20\tUNT\tUNIT NUMBER \t#VALUE!\t44357.94118\t0\tNone\tNone\t204\t9049020\t1.06E+12
+BLOOD BANK PRODUCT ORDERABLES\t473587\tLABTBP20\tTRANSFUSION BLOOD PRODUCT 21\tUNT\tUNIT NUMBER \t#VALUE!\t44809.2973\t0\tNone\tNone\t185\t8289720\t9.48E+11
+BLOOD BANK PRODUCT ORDERABLES\t473588\tLABTBP21\tTRANSFUSION BLOOD PRODUCT 22\tUNT\tUNIT NUMBER \t#VALUE!\t42059.64706\t0\tNone\tNone\t170\t7150140\t7.84E+11
+BLOOD BANK PRODUCT ORDERABLES\t473589\tLABTBP22\tTRANSFUSION BLOOD PRODUCT 23\tUNT\tUNIT NUMBER \t#VALUE!\t44215.41667\t0\tNone\tNone\t144\t6367020\t7.61E+11
+BLOOD BANK PRODUCT ORDERABLES\t473590\tLABTBP23\tTRANSFUSION BLOOD PRODUCT 24\tUNT\tUNIT NUMBER \t#VALUE!\t45869.76744\t0\tNone\tNone\t129\t5917200\t7.29E+11
+BLOOD BANK PRODUCT ORDERABLES\t473591\tLABTBP24\tTRANSFUSION BLOOD PRODUCT 25\tUNT\tUNIT NUMBER \t#VALUE!\t45405.78947\t0\tNone\tNone\t114\t5176260\t6.15E+11
+BLOOD BANK PRODUCT ORDERABLES\t473592\tLABTBP25\tTRANSFUSION BLOOD PRODUCT 26\tUNT\tUNIT NUMBER \t#VALUE!\t44582.22222\t0\tNone\tNone\t108\t4814880\t5.88E+11
+BLOOD BANK PRODUCT ORDERABLES\t473593\tLABTBP26\tTRANSFUSION BLOOD PRODUCT 27\tUNT\tUNIT NUMBER \t#VALUE!\t48100.40816\t0\tNone\tNone\t98\t4713840\t5.88E+11
+BLOOD BANK PRODUCT ORDERABLES\t473594\tLABTBP28\tTRANSFUSION BLOOD PRODUCT 29\tUNT\tUNIT NUMBER \t#VALUE!\t45671.25\t0\tNone\tNone\t80\t3653700\t4.10E+11
+BLOOD BANK PRODUCT ORDERABLES\t473595\tLABTBP2\tTRANSFUSION BLOOD PRODUCT 3\tUNT\tUNIT NUMBER \t#VALUE!\t70831.65354\t0\tNone\tNone\t6096\t431789760\t6.51E+13
+BLOOD BANK PRODUCT ORDERABLES\t473596\tLABTBP29\tTRANSFUSION BLOOD PRODUCT 30\tUNT\tUNIT NUMBER \t#VALUE!\t43986.31579\t0\tNone\tNone\t76\t3342960\t3.42E+11
+BLOOD BANK PRODUCT ORDERABLES\t473597\tLABTBP30\tTRANSFUSION BLOOD PRODUCT 31\tUNT\tUNIT NUMBER \t#VALUE!\t41594.32836\t0\tNone\tNone\t67\t2786820\t2.99E+11
+BLOOD BANK PRODUCT ORDERABLES\t473598\tLABTBP31\tTRANSFUSION BLOOD PRODUCT 32\tUNT\tUNIT NUMBER \t#VALUE!\t50272.88136\t0\tNone\tNone\t59\t2966100\t3.78E+11
+BLOOD BANK PRODUCT ORDERABLES\t473599\tLABTBP32\tTRANSFUSION BLOOD PRODUCT 33\tUNT\tUNIT NUMBER \t#VALUE!\t48334.73684\t0\tNone\tNone\t57\t2755080\t3.01E+11
+BLOOD BANK PRODUCT ORDERABLES\t473600\tLABTBP33\tTRANSFUSION BLOOD PRODUCT 34\tUNT\tUNIT NUMBER \t#VALUE!\t49175.09434\t0\tNone\tNone\t53\t2606280\t3.05E+11
+BLOOD BANK PRODUCT ORDERABLES\t473601\tLABTBP34\tTRANSFUSION BLOOD PRODUCT 35\tUNT\tUNIT NUMBER \t#VALUE!\t41741.17647\t0\tNone\tNone\t51\t2128800\t2.07E+11
+BLOOD BANK PRODUCT ORDERABLES\t473602\tLABTBP35\tTRANSFUSION BLOOD PRODUCT 36\tUNT\tUNIT NUMBER \t#VALUE!\t48162.27273\t0\tNone\tNone\t44\t2119140\t2.29E+11
+BLOOD BANK PRODUCT ORDERABLES\t473603\tLABTBP36\tTRANSFUSION BLOOD PRODUCT 37\tUNT\tUNIT NUMBER \t#VALUE!\t31722.43902\t0\tNone\tNone\t41\t1300620\t88116591600
+BLOOD BANK PRODUCT ORDERABLES\t473604\tLABTBP37\tTRANSFUSION BLOOD PRODUCT 38\tUNT\tUNIT NUMBER \t#VALUE!\t34084.61538\t0\tNone\tNone\t39\t1329300\t92575184400
+BLOOD BANK PRODUCT ORDERABLES\t473605\tLABTBP38\tTRANSFUSION BLOOD PRODUCT 39\tUNT\tUNIT NUMBER \t#VALUE!\t34275\t0\tNone\tNone\t36\t1233900\t87256652400
+BLOOD BANK PRODUCT ORDERABLES\t473606\tLABTBP3\tTRANSFUSION BLOOD PRODUCT 4\tUNT\tUNIT NUMBER \t#VALUE!\t71882.52728\t0\tNone\tNone\t5223\t375442440\t5.68E+13
+BLOOD BANK PRODUCT ORDERABLES\t473607\tLABTBP39\tTRANSFUSION BLOOD PRODUCT 40\tUNT\tUNIT NUMBER \t#VALUE!\t32080\t0\tNone\tNone\t33\t1058640\t53302039200
+BLOOD BANK PRODUCT ORDERABLES\t473608\tLABTBP40\tTRANSFUSION BLOOD PRODUCT 41\tUNT\tUNIT NUMBER \t#VALUE!\t29945.80645\t0\tNone\tNone\t31\t928320\t49220258400
+BLOOD BANK PRODUCT ORDERABLES\t473609\tLABTBP41\tTRANSFUSION BLOOD PRODUCT 42\tUNT\tUNIT NUMBER \t#VALUE!\t31464\t0\tNone\tNone\t30\t943920\t67138092000
+BLOOD BANK PRODUCT ORDERABLES\t473610\tLABTBP42\tTRANSFUSION BLOOD PRODUCT 43\tUNT\tUNIT NUMBER \t#VALUE!\t42686.66667\t0\tNone\tNone\t27\t1152540\t1.10E+11
+BLOOD BANK PRODUCT ORDERABLES\t473611\tLABTBP43\tTRANSFUSION BLOOD PRODUCT 44\tUNT\tUNIT NUMBER \t#VALUE!\t41768.88889\t0\tNone\tNone\t27\t1127760\t1.06E+11
+BLOOD BANK PRODUCT ORDERABLES\t473612\tLABTBP44\tTRANSFUSION BLOOD PRODUCT 45\tUNT\tUNIT NUMBER \t#VALUE!\t32076.92308\t0\tNone\tNone\t26\t834000\t53931456000
+BLOOD BANK PRODUCT ORDERABLES\t473613\tLABTBP45\tTRANSFUSION BLOOD PRODUCT 46\tUNT\tUNIT NUMBER \t#VALUE!\t29411.53846\t0\tNone\tNone\t26\t764700\t28925881200
+BLOOD BANK PRODUCT ORDERABLES\t473614\tLABTBP46\tTRANSFUSION BLOOD PRODUCT 47\tUNT\tUNIT NUMBER \t#VALUE!\t35142.85714\t0\tNone\tNone\t21\t738000\t56790907200
+BLOOD BANK PRODUCT ORDERABLES\t473615\tLABTBP47\tTRANSFUSION BLOOD PRODUCT 48\tUNT\tUNIT NUMBER \t#VALUE!\t35055\t0\tNone\tNone\t20\t701100\t55275080400
+BLOOD BANK PRODUCT ORDERABLES\t473616\tLABTBP48\tTRANSFUSION BLOOD PRODUCT 49\tUNT\tUNIT NUMBER \t#VALUE!\t40860\t0\tNone\tNone\t20\t817200\t69801444000
+BLOOD BANK PRODUCT ORDERABLES\t473617\tLABTBP4\tTRANSFUSION BLOOD PRODUCT 5\tUNT\tUNIT NUMBER \t#VALUE!\t63772.73171\t0\tNone\tNone\t2460\t156880920\t2.17E+13
+BLOOD BANK PRODUCT ORDERABLES\t473618\tLABTBP49\tTRANSFUSION BLOOD PRODUCT 50\tUNT\tUNIT NUMBER \t#VALUE!\t35173.33333\t0\tNone\tNone\t18\t633120\t53763523200
+BLOOD BANK PRODUCT ORDERABLES\t473619\tLABTBP50\tTRANSFUSION BLOOD PRODUCT 51\tUNT\tUNIT NUMBER \t#VALUE!\t24108\t0\tNone\tNone\t15\t361620\t13517708400
+BLOOD BANK PRODUCT ORDERABLES\t473620\tLABTBP51\tTRANSFUSION BLOOD PRODUCT 52\tUNT\tUNIT NUMBER \t#VALUE!\t26117.14286\t0\tNone\tNone\t14\t365640\t13709217600
+BLOOD BANK PRODUCT ORDERABLES\t473621\tLABTBP52\tTRANSFUSION BLOOD PRODUCT 53\tUNT\tUNIT NUMBER \t#VALUE!\t29464.61538\t0\tNone\tNone\t13\t383040\t18645940800
+BLOOD BANK PRODUCT ORDERABLES\t473622\tLABTBP53\tTRANSFUSION BLOOD PRODUCT 54\tUNT\tUNIT NUMBER \t#VALUE!\t31638.46154\t0\tNone\tNone\t13\t411300\t20614381200
+BLOOD BANK PRODUCT ORDERABLES\t473623\tLABTBP54\tTRANSFUSION BLOOD PRODUCT 55\tUNT\tUNIT NUMBER \t#VALUE!\t32307.69231\t0\tNone\tNone\t13\t420000\t21061454400
+BLOOD BANK PRODUCT ORDERABLES\t473624\tLABTBP55\tTRANSFUSION BLOOD PRODUCT 56\tUNT\tUNIT NUMBER \t#VALUE!\t27975\t0\tNone\tNone\t12\t335700\t17437417200
+BLOOD BANK PRODUCT ORDERABLES\t473625\tLABTBP56\tTRANSFUSION BLOOD PRODUCT 57\tUNT\tUNIT NUMBER \t#VALUE!\t31958.18182\t0\tNone\tNone\t11\t351540\t18758574000
+BLOOD BANK PRODUCT ORDERABLES\t473626\tLABTBP58\tTRANSFUSION BLOOD PRODUCT 59\tUNT\tUNIT NUMBER \t#VALUE!\t76960\t0\tNone\tNone\t9\t692640\t99484596000
+BLOOD BANK PRODUCT ORDERABLES\t473627\tLABTBP5\tTRANSFUSION BLOOD PRODUCT 6\tUNT\tUNIT NUMBER \t#VALUE!\t63330.90094\t0\tNone\tNone\t2231\t141291240\t1.94E+13
+BLOOD BANK PRODUCT ORDERABLES\t473628\tLABTBP59\tTRANSFUSION BLOOD PRODUCT 60\tUNT\tUNIT NUMBER \t#VALUE!\t81690\t0\tNone\tNone\t8\t653520\t97952421600
+BLOOD BANK PRODUCT ORDERABLES\t473629\tLABTBP60\tTRANSFUSION BLOOD PRODUCT 61\tUNT\tUNIT NUMBER \t#VALUE!\t85174.28571\t0\tNone\tNone\t7\t596220\t77125518000
+BLOOD BANK PRODUCT ORDERABLES\t473630\tLABTBP61\tTRANSFUSION BLOOD PRODUCT 62\tUNT\tUNIT NUMBER \t#VALUE!\t63750\t0\tNone\tNone\t6\t382500\t39290828400
+BLOOD BANK PRODUCT ORDERABLES\t473631\tLABTBP62\tTRANSFUSION BLOOD PRODUCT 63\tUNT\tUNIT NUMBER \t#VALUE!\t47660\t0\tNone\tNone\t6\t285960\t25408432800
+BLOOD BANK PRODUCT ORDERABLES\t473632\tLABTBP63\tTRANSFUSION BLOOD PRODUCT 64\tUNT\tUNIT NUMBER \t#VALUE!\t47650\t0\tNone\tNone\t6\t285900\t25391113200
+BLOOD BANK PRODUCT ORDERABLES\t473633\tLABTBP64\tTRANSFUSION BLOOD PRODUCT 65\tUNT\tUNIT NUMBER \t#VALUE!\t23880\t0\tNone\tNone\t6\t143280\t4565289600
+BLOOD BANK PRODUCT ORDERABLES\t473634\tLABTBP65\tTRANSFUSION BLOOD PRODUCT 66\tUNT\tUNIT NUMBER \t#VALUE!\t28650\t0\tNone\tNone\t6\t171900\t6302451600
+BLOOD BANK PRODUCT ORDERABLES\t473635\tLABTBP66\tTRANSFUSION BLOOD PRODUCT 67\tUNT\tUNIT NUMBER \t#VALUE!\t28550\t0\tNone\tNone\t6\t171300\t6256443600
+BLOOD BANK PRODUCT ORDERABLES\t473636\tLABTBP67\tTRANSFUSION BLOOD PRODUCT 68\tUNT\tUNIT NUMBER \t#VALUE!\t28428\t0\tNone\tNone\t5\t142140\t5357322000
+BLOOD BANK PRODUCT ORDERABLES\t473637\tLABTBP68\tTRANSFUSION BLOOD PRODUCT 69\tUNT\tUNIT NUMBER \t#VALUE!\t18440\t0\tNone\tNone\t3\t55320\t2073319200
+BLOOD BANK PRODUCT ORDERABLES\t473638\tLABTBP6\tTRANSFUSION BLOOD PRODUCT 7\tUNT\tUNIT NUMBER \t#VALUE!\t58144.67277\t0\tNone\tNone\t1528\t88845060\t1.11E+13
+BLOOD BANK PRODUCT ORDERABLES\t473639\tLABTBP69\tTRANSFUSION BLOOD PRODUCT 70\tUNT\tUNIT NUMBER \t#VALUE!\t38400\t0\tNone\tNone\t3\t115200\t7052018400
+BLOOD BANK PRODUCT ORDERABLES\t473640\tLABTBP70\tTRANSFUSION BLOOD PRODUCT 71\tUNT\tUNIT NUMBER \t#VALUE!\t27880\t0\tNone\tNone\t3\t83640\t3495549600
+BLOOD BANK PRODUCT ORDERABLES\t473641\tLABTBP71\tTRANSFUSION BLOOD PRODUCT 72\tUNT\tUNIT NUMBER \t#VALUE!\t38360\t0\tNone\tNone\t3\t115080\t7038208800
+BLOOD BANK PRODUCT ORDERABLES\t473642\tLABTBP72\tTRANSFUSION BLOOD PRODUCT 73\tUNT\tUNIT NUMBER \t#VALUE!\t38320\t0\tNone\tNone\t3\t114960\t7029561600
+BLOOD BANK PRODUCT ORDERABLES\t473643\tLABTBP73\tTRANSFUSION BLOOD PRODUCT 74\tUNT\tUNIT NUMBER \t#VALUE!\t26760\t0\tNone\tNone\t3\t80280\t3222554400
+BLOOD BANK PRODUCT ORDERABLES\t473644\tLABTBP74\tTRANSFUSION BLOOD PRODUCT 75\tUNT\tUNIT NUMBER \t#VALUE!\t40110\t0\tNone\tNone\t2\t80220\t3217712400
+BLOOD BANK PRODUCT ORDERABLES\t473645\tLABTBP75\tTRANSFUSION BLOOD PRODUCT 76\tUNT\tUNIT NUMBER \t#VALUE!\t40110\t0\tNone\tNone\t2\t80220\t3217712400
+BLOOD BANK PRODUCT ORDERABLES\t473646\tLABTBP76\tTRANSFUSION BLOOD PRODUCT 77\tUNT\tUNIT NUMBER \t#VALUE!\t40110\t0\tNone\tNone\t2\t80220\t3217712400
+BLOOD BANK PRODUCT ORDERABLES\t473647\tLABTBP77\tTRANSFUSION BLOOD PRODUCT 78\tUNT\tUNIT NUMBER \t#VALUE!\t40080\t0\tNone\tNone\t2\t80160\t3212928000
+BLOOD BANK PRODUCT ORDERABLES\t473648\tLABTBP78\tTRANSFUSION BLOOD PRODUCT 79\tUNT\tUNIT NUMBER \t#VALUE!\t39390\t0\tNone\tNone\t2\t78780\t3104874000
+BLOOD BANK PRODUCT ORDERABLES\t473649\tLABTBP7\tTRANSFUSION BLOOD PRODUCT 8\tUNT\tUNIT NUMBER \t#VALUE!\t57549.16129\t0\tNone\tNone\t1395\t80281080\t9.91E+12
+BLOOD BANK PRODUCT ORDERABLES\t473650\tLABTBP79\tTRANSFUSION BLOOD PRODUCT 80\tUNT\tUNIT NUMBER \t#VALUE!\t54990\t0\tNone\tNone\t2\t109980\t6598256400
+BLOOD BANK PRODUCT ORDERABLES\t473651\tLABTBP80\tTRANSFUSION BLOOD PRODUCT 81\tUNT\tUNIT NUMBER \t#VALUE!\t54990\t0\tNone\tNone\t2\t109980\t6598256400
+BLOOD BANK PRODUCT ORDERABLES\t473652\tLABTBP81\tTRANSFUSION BLOOD PRODUCT 82\tUNT\tUNIT NUMBER \t#VALUE!\t54990\t0\tNone\tNone\t2\t109980\t6598256400
+BLOOD BANK PRODUCT ORDERABLES\t473653\tLABTBP82\tTRANSFUSION BLOOD PRODUCT 83\tUNT\tUNIT NUMBER \t#VALUE!\t69330\t0\tNone\tNone\t2\t138660\t9623422800
+BLOOD BANK PRODUCT ORDERABLES\t473654\tLABTBP83\tTRANSFUSION BLOOD PRODUCT 84\tUNT\tUNIT NUMBER \t#VALUE!\t69330\t0\tNone\tNone\t2\t138660\t9623422800
+BLOOD BANK PRODUCT ORDERABLES\t473655\tLABTBP84\tTRANSFUSION BLOOD PRODUCT 85\tUNT\tUNIT NUMBER \t#VALUE!\t69330\t0\tNone\tNone\t2\t138660\t9623422800
+BLOOD BANK PRODUCT ORDERABLES\t473656\tLABTBP85\tTRANSFUSION BLOOD PRODUCT 86\tUNT\tUNIT NUMBER \t#VALUE!\t91200\t0\tNone\tNone\t2\t182400\t23119207200
+BLOOD BANK PRODUCT ORDERABLES\t473657\tLABTBP86\tTRANSFUSION BLOOD PRODUCT 87\tUNT\tUNIT NUMBER \t#VALUE!\t49950\t0\tNone\tNone\t2\t99900\t5482357200
+BLOOD BANK PRODUCT ORDERABLES\t473658\tLABTBP87\tTRANSFUSION BLOOD PRODUCT 88\tUNT\tUNIT NUMBER \t#VALUE!\t148140\t0\tNone\tNone\t1\t148140\t21945459600
+BLOOD BANK PRODUCT ORDERABLES\t473659\tLABTBP88\tTRANSFUSION BLOOD PRODUCT 89\tUNT\tUNIT NUMBER \t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t473660\tLABTBP8\tTRANSFUSION BLOOD PRODUCT 9\tUNT\tUNIT NUMBER \t#VALUE!\t51894.30096\t0\tNone\tNone\t937\t48624960\t5.74E+12
+BLOOD BANK PRODUCT ORDERABLES\t473661\tLABTBP89\tTRANSFUSION BLOOD PRODUCT 90\tUNT\tUNIT NUMBER \t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t473662\tLABTBP90\tTRANSFUSION BLOOD PRODUCT 91\tUNT\tUNIT NUMBER \t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t473663\tLABTBP91\tTRANSFUSION BLOOD PRODUCT 92\tUNT\tUNIT NUMBER \t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t473664\tLABTBP92\tTRANSFUSION BLOOD PRODUCT 93\tUNT\tUNIT NUMBER \t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t473665\tLABTBP93\tTRANSFUSION BLOOD PRODUCT 94\tUNT\tUNIT NUMBER \t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BLOOD BANK PRODUCT ORDERABLES\t473671\tLABEITC\tTRANSFUSION EMERGENCY ISSUE\tCEITC\tEMERGENCY ISSUE CMT\t#VALUE!\t86.95945946\t0\tNone\tNone\t296\t25740\t236782800
+BLOOD BANK PRODUCT ORDERABLES\t618478\tLABTBP27\tTRANSFUSION BLOOD PRODUCT 28\tUNT\tUNIT NUMBER \t#VALUE!\t41291.48936\t0\tNone\tNone\t94\t3881400\t3.96E+11
+BLOOD BANK PRODUCT ORDERABLES\t618512\tLABTBP57\tTRANSFUSION BLOOD PRODUCT 58\tUNT\tUNIT NUMBER \t#VALUE!\t35022\t0\tNone\tNone\t10\t350220\t18667335600
+BODY FLUID ORDERABLES\t471604\tLABAACSF\tAMINO ACIDS, CSF\tAASINT\tINTERPRETATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t471604\tLABAACSF\tAMINO ACIDS, CSF\tINTSBY\tINTERPRETED BY\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t471626\tLAB11028R\tANGIOTENSIN CONVERTING ENZYME, CSF\tACE\tANGIOTENSIN COVERT ENZ, CSF\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t471626\tLABCACE\tANGIOTENSIN CONVERTING ENZYME, CSF\tACE\tANGIOTENSIN COVERT ENZ, CSF\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t471692\tLABASPPCP\tASPERGILLUS AB PRECIPITINS\tASPINT\tINTERPRETATION\t#VALUE!\t407597.6471\t0\tNone\tNone\t17\t6929160\t3.73E+12
+BODY FLUID ORDERABLES\t471735\tLABBMBCLO\tB - CELL CLONALITY PCR, BONE MARROW\tBMBDIR\tINTERPRETED BY\t#VALUE!\t1007200\t0\tNone\tNone\t3\t3021600\t3.22E+12
+BODY FLUID ORDERABLES\t471735\tLABBMBCLO\tB - CELL CLONALITY PCR, BONE MARROW\tBMBDIS\tDISCLAIMER\t#VALUE!\t1007200\t0\tNone\tNone\t3\t3021600\t3.22E+12
+BODY FLUID ORDERABLES\t471793\tLABBMBCRQ\tBCR - ABL QUANTITATIVE, BONE MARROW\tQBMBRM\tMETHOD\t#VALUE!\t520905.7143\t0\tNone\tNone\t21\t10939020\t8.12E+12
+BODY FLUID ORDERABLES\t471793\tLABBMBCRQ\tBCR - ABL QUANTITATIVE, BONE MARROW\tQBMBRS\tDISCLAIMER\t#VALUE!\t520905.7143\t0\tNone\tNone\t21\t10939020\t8.12E+12
+BODY FLUID ORDERABLES\t471793\tLABBMBCRQ\tBCR - ABL QUANTITATIVE, BONE MARROW\tQBMBRX\tCLINICAL INDICATION\t#VALUE!\t520905.7143\t0\tNone\tNone\t21\t10939020\t8.12E+12
+BODY FLUID ORDERABLES\t471947\tLABBMCD34\tCD34 PANEL, BONE MARROW\tCD34DS\tDISCLAIMER\t#VALUE!\t23385\t0\tNone\tNone\t4\t93540\t3727911600
+BODY FLUID ORDERABLES\t471948\tLABFCD34\tCD34 PANEL, FLUID\tCD34DS\tDISCLAIMER\t#VALUE!\t8570.769231\t0\tNone\tNone\t26\t222840\t3235593600
+BODY FLUID ORDERABLES\t472047\tLAB11123R\tCOCCIDIOIDES COMPLEMENT FIXATION, CSF\tCOCC\tCOCCI CF AB (CSF)\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472047\tLABCOCC\tCOCCIDIOIDES COMPLEMENT FIXATION, CSF\tCOCC\tCOCCI CF AB (CSF)\t#VALUE!\t709560\t0\tNone\tNone\t1\t709560\t5.03E+11
+BODY FLUID ORDERABLES\t472126\tLABCYSCSF\tCYSTICERCUS AB REFLEX PANEL, CSF\tCYSTAB\tCYSTICERCUS AB(CSF),ELISA\t#VALUE!\t392206.6667\t0\tNone\tNone\t9\t3529860\t1.50E+12
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS BY PCR\tYENP1\tSPECIMEN SOURCE\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS BY PCR\tYENP2\tENTEROVIRUS ,PCR\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS BY PCR\tYENP3\tSPECIAL INFORMATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS BY PCR\tYENP4\tREPORT STATUS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS PCR\tYENP1\tSPECIMEN SOURCE\t#VALUE!\t147120\t0\tNone\tNone\t1\t147120\t21644294400
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS PCR\tYENP2\tENTEROVIRUS ,PCR\t#VALUE!\t147120\t0\tNone\tNone\t1\t147120\t21644294400
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS PCR\tYENP3\tSPECIAL INFORMATION\t#VALUE!\t147120\t0\tNone\tNone\t1\t147120\t21644294400
+BODY FLUID ORDERABLES\t472314\tLABEVPCR\tENTEROVIRUS PCR\tYENP4\tREPORT STATUS\t#VALUE!\t147120\t0\tNone\tNone\t1\t147120\t21644294400
+BODY FLUID ORDERABLES\t472314\tLABYENPCR\tENTEROVIRUS PCR\tYENP1\tSPECIMEN SOURCE\t#VALUE!\t209353.0435\t0\tNone\tNone\t69\t14445360\t3.79E+12
+BODY FLUID ORDERABLES\t472370\tLABFFIBN\tFETAL FIBRONECTIN\tFFIBN\tFETAL FIBRONECTIN\t#VALUE!\t3352.5\t0\tNone\tNone\t8\t26820\t104137200
+BODY FLUID ORDERABLES\t472431\tLABFSYN\tFUNGAL SYNERGY\tFMIC\tFUNGAL MIC\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t472851\tLABTMSI\tMICROSATELLITE INSTABILITY\tTMSIDI\tDISCLAIMER\t#VALUE!\t927889.0909\t0\tNone\tNone\t11\t10206780\t1.25E+13
+BODY FLUID ORDERABLES\t472851\tLABTMSI\tMICROSATELLITE INSTABILITY\tTMSIME\tMETHOD\t#VALUE!\t927889.0909\t0\tNone\tNone\t11\t10206780\t1.25E+13
+BODY FLUID ORDERABLES\t472933\tLABYMYCRB\tMYCOPLASMA CULTURE, RESPIRATORY\t12197R\tSOURCE\t#VALUE!\t1011860\t0\tNone\tNone\t3\t3035580\t6.08E+12
+BODY FLUID ORDERABLES\t473131\tLABLIVER\tPRE LIVER TRANSPLANT PANEL\tHATINT\tINTERPRETATION\t#VALUE!\t359730\t0\tNone\tNone\t2\t719460\t2.59E+11
+BODY FLUID ORDERABLES\t473131\tLABLIVER\tPRE LIVER TRANSPLANT PANEL\tHBSINT\tINTERPRETATION\t#VALUE!\t359730\t0\tNone\tNone\t2\t719460\t2.59E+11
+BODY FLUID ORDERABLES\t473131\tLABLIVER\tPRE LIVER TRANSPLANT PANEL\tHBTINT\tINTERPRETATION\t#VALUE!\t359730\t0\tNone\tNone\t2\t719460\t2.59E+11
+BODY FLUID ORDERABLES\t473131\tLABLIVER\tPRE LIVER TRANSPLANT PANEL\tHTLVS\tHTLV AB SCREEN\t#VALUE!\t359730\t0\tNone\tNone\t2\t719460\t2.59E+11
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\t11165R\tEB VIRUS EARLY AG (R+D) IGG\t#VALUE!\t268440\t0\tNone\tNone\t1\t268440\t72060033600
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\t11166R\tEB NUCLEAR AB\t#VALUE!\t268440\t0\tNone\tNone\t1\t268440\t72060033600
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tHATINT\tINTERPRETATION\t#VALUE!\t712710\t0\tNone\tNone\t2\t1425420\t1.41E+12
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tHBSINT\tINTERPRETATION\t#VALUE!\t712710\t0\tNone\tNone\t2\t1425420\t1.41E+12
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tHBTINT\tINTERPRETATION\t#VALUE!\t712710\t0\tNone\tNone\t2\t1425420\t1.41E+12
+BODY FLUID ORDERABLES\t473361\tLABSTAND\tSTANDARD PRE TRANSPLANT PANEL\tHSAB\tVIRAL AB HSV\t#VALUE!\t550720\t0\tNone\tNone\t3\t1652160\t1.46E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tKIDNEY STONE ANALYSIS\tYSTNSO\tSTONE SOURCE\t#VALUE!\t207922.6667\t0\tNone\tNone\t45\t9356520\t2.34E+12
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tSTONE ANALYSIS\t1STCONST\t1ST CONSTITUENT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tSTONE ANALYSIS\t2NDCONST\t2ND CONSTITUENT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tSTONE ANALYSIS\t3RDCONST\t3RD CONSTITUENT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t473368\tLABYSTONE\tSTONE ANALYSIS\tYSTNSO\tSTONE SOURCE\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t473398\tLABBM1418\tT(14\t18), BONE MARROW\tBM14CT\tCOMMENT\t#VALUE!\t1070614.286\t0\tNone\tNone\t7\t7494300\t9.42E+12
+BODY FLUID ORDERABLES\t473398\tLABBM1418\tT(14\t18), BONE MARROW\tBM14DR\tINTERPRETED BY\t#VALUE!\t1070614.286\t0\tNone\tNone\t7\t7494300\t9.42E+12
+BODY FLUID ORDERABLES\t473398\tLABBM1418\tT(14\t18), BONE MARROW\tBM14DS\tDISCLAIMER\t#VALUE!\t1070614.286\t0\tNone\tNone\t7\t7494300\t9.42E+12
+BODY FLUID ORDERABLES\t473401\tLABBM1517\tT(15\t17) PML/RAR, BONE MARROW\tBM15DI\tDISCLAIMER\t#VALUE!\t644650\t0\tNone\tNone\t18\t11603700\t8.75E+12
+BODY FLUID ORDERABLES\t473401\tLABBM1517\tT(15\t17) PML/RAR, BONE MARROW\tBM15MD\tINTERPRETED BY\t#VALUE!\t644650\t0\tNone\tNone\t18\t11603700\t8.75E+12
+BODY FLUID ORDERABLES\t473401\tLABBM1517\tT(15\t17) PML/RAR, BONE MARROW\tBM15ME\tMETHOD\t#VALUE!\t644650\t0\tNone\tNone\t18\t11603700\t8.75E+12
+BODY FLUID ORDERABLES\t473406\tLABBMTCLO\tT-CELL CLONALITY PCR, BONE MARROW\tBMTDIS\tDISCLAIMER\t#VALUE!\t688582.5\t0\tNone\tNone\t16\t11017320\t1.17E+13
+BODY FLUID ORDERABLES\t473458\tLAB11121R\tTOXOPLASMA IGG DYE TEST\tTOXOD\tTOXOPLASMA DYE TEST\t#VALUE!\t1132650\t0\tNone\tNone\t2\t2265300\t2.79E+12
+BODY FLUID ORDERABLES\t497221\tLABADMARK\tADMARK TAU/AB42, CSF\tADMART\tADMARK TAU/AB42, CSF\t#VALUE!\t2981138.571\t0\tNone\tNone\t14\t41735940\t1.92E+14
+BODY FLUID ORDERABLES\t497362\tLABYFK\tPOTASSIUM, FLUID\tKFLD\tPOTASSIUM BODY FLUID\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t497366\tLABYFNA\tSODIUM, FLUID\tNAFLD\tSODIUM BODY FLUID\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t497368\tLABFLGL\tGLUCOSE, FLUID\tYFLSC1\tFLUID TYPE\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+BODY FLUID ORDERABLES\t497376\tLABYFCL\tCHLORIDE, FLUID\t11844R\tFLUID TYPE\t#VALUE!\t95760\t0\tNone\tNone\t1\t95760\t9169977600
+BODY FLUID ORDERABLES\t497376\tLABYFCL\tCHLORIDE, FLUID\tCLFLD\tCHLORIDE, BODY FLUID\t#VALUE!\t169230\t0\tNone\tNone\t2\t338460\t68073267600
+BODY FLUID ORDERABLES\t497438\tLABFCLPN\tCHLAMYDIA PNEUMONIAE CULTURE\tCLPN\tCHLAMYDIA PNEUMONIAE\t#VALUE!\t287685\t0\tNone\tNone\t4\t1150740\t4.88E+11
+BODY FLUID ORDERABLES\t497448\tLABCHLAM\tCHLAMYDIA TRACHOMATIS / PSITTACI CULTURE\tCHLA\tCHLAMYDIA CULTURE\t#VALUE!\t1093440\t0\tNone\tNone\t3\t3280320\t6.55E+12
+BODY FLUID ORDERABLES\t669900\tLABKRAS\tKRAS MUTATION DETECTION\tKRASDI\tDISCLAIMER\t#VALUE!\t866627.1429\t0\tNone\tNone\t14\t12132780\t1.36E+13
+BODY FLUID ORDERABLES\t669900\tLABKRAS\tKRAS MUTATION DETECTION\tKRASME\tMETHOD\t#VALUE!\t866627.1429\t0\tNone\tNone\t14\t12132780\t1.36E+13
+BODY FLUID ORDERABLES\t670101\tLABMGMT\tMGMT, METHYLATION SPECIFIC PCR\tMGMDI\tDISCLAIMER\t#VALUE!\t741092.1429\t0\tNone\tNone\t28\t20750580\t2.04E+13
+BODY FLUID ORDERABLES\t670101\tLABMGMT\tMGMT, METHYLATION SPECIFIC PCR\tMGMMD\tINTERPRETED BY\t#VALUE!\t741092.1429\t0\tNone\tNone\t28\t20750580\t2.04E+13
+BODY FLUID ORDERABLES\t670101\tLABMGMT\tMGMT, METHYLATION SPECIFIC PCR\tMGMME\tMETHOD\t#VALUE!\t741092.1429\t0\tNone\tNone\t28\t20750580\t2.04E+13
+BODY FLUID ORDERABLES\t670778\tLAB11188R\tM. PNEUMONIAE DNA\t11189R\tM.PNEUMONIAE\t#VALUE!\t166380\t0\tNone\tNone\t8\t1331040\t2.33E+11
+BODY FLUID ORDERABLES\t670820\tLAB11214R\tBETA-2 TRANSFERRIN, BF\t11215R\tBETA-2 TRANSFERRIN, BF\t#VALUE!\t204888.8889\t0\tNone\tNone\t27\t5532000\t1.55E+12
+BODY FLUID ORDERABLES\t670943\tLABCD3F\tCD3, FLUID\tRTFDA2\tNOTE\t#VALUE!\t12144\t0\tNone\tNone\t5\t60720\t762372000
+BODY FLUID ORDERABLES\t744342\tLAB11617R\tCMV PCR, AQUEOUS FLUID\t11776R\tCMV PCR, AQUEOUS FLUID\t#VALUE!\t799992\t0\tNone\tNone\t15\t11999880\t3.06E+13
+BODY FLUID ORDERABLES\t744344\tLAB11618R\tHSV 1/2 PCR, AQUEOUS FLUID\t11777R\tHSV 1/2 PCR,AQUOUS FLUID\t#VALUE!\t910809.2308\t0\tNone\tNone\t13\t11840520\t3.07E+13
+BODY FLUID ORDERABLES\t744348\tLAB11620R\tTOXOPLASMA GONDII, AQUEOUS FLUID\t11779R\tTOXOPLASAMGONDII,AQUEOUS FLUID\t#VALUE!\t1675310\t0\tNone\tNone\t6\t10051860\t2.90E+13
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11992R\tSPECIMEN\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11993R\tSPECIMEN ID\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11994R\tSOURCE\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11995R\tORDER DATE\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11996R\tCOMMENT\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11997R\tAMENDMENT\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11998R\tREVIEWED BY\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t870909\tLAB11991R\tDNA EXTRACTION, NPL\t11999R\tRELEASE DATE\t#VALUE!\t60\t0\tNone\tNone\t2\t120\t7200
+BODY FLUID ORDERABLES\t871378\tLABBRAF\tBRAF\tBRAFDI\tDISCLAIMER\t#VALUE!\t479125.7143\t0\tNone\tNone\t14\t6707760\t4.66E+12
+BODY FLUID ORDERABLES\t871378\tLABBRAF\tBRAF\tBRAFMD\tINTERPRETATION\t#VALUE!\t479125.7143\t0\tNone\tNone\t14\t6707760\t4.66E+12
+BODY FLUID ORDERABLES\t898794\tLABCSMP\tCANCER SOMATIC MUTATION PANEL\tCSDI\tDISCLAIMER\t#VALUE!\t912125.8065\t0\tNone\tNone\t62\t56551800\t6.06E+13
+BODY FLUID ORDERABLES\t898794\tLABCSMP\tCANCER SOMATIC MUTATION PANEL\tCSMD\tINTERPRETED BY\t#VALUE!\t934668.2143\t0\tNone\tNone\t56\t52341420\t5.63E+13
+BODY FLUID ORDERABLES\t898794\tLABCSMP\tCANCER SOMATIC MUTATION PANEL\tCSME\tMETHOD\t#VALUE!\t912125.8065\t0\tNone\tNone\t62\t56551800\t6.06E+13
+BODY FLUID ORDERABLES\t898794\tLABCSMP\tCANCER SOMATIC MUTATION PANEL\tCSREF\tREFERENCES\t#VALUE!\t912125.8065\t0\tNone\tNone\t62\t56551800\t6.06E+13
+BODY FLUID ORDERABLES\t898806\tLAB12328R\tAMYLOID PROTEIN IDENTIFICATION\t12327R\tAMYLOID PROTEIN ID, TISSUE\t#VALUE!\t60\t0\tNone\tNone\t1\t60\t3600
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12342R\tSPECIMEN ID\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12343R\tSOURCE\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12344R\tORDER DATE\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12345R\tREASON FOR REFERRAL\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12346R\tMETHOD\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12347R\tRESULTS\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12348R\tINTERPRETATION\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12349R\tAMENDMENT\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12350R\tCONSULTANT\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898810\tLAB12331R\tMLH1 HYPERMETHYLATION ANALYSIS\t12351R\tREPORT DATE\t#VALUE!\t1463100\t0\tNone\tNone\t3\t4389300\t9.23E+12
+BODY FLUID ORDERABLES\t898812\tLAB12332R\tKIT MUTATION ANALYSIS EXON 11\t12337R\tKIT MUTATION ANALYSIS EXON 11\t#VALUE!\t540607.5\t0\tNone\tNone\t8\t4324860\t2.66E+12
+BODY FLUID ORDERABLES\t898814\tLAB12333R\tKIT MUTATION ANALYSIS EXON 9\t12338R\tKIT MUTATION ANALYSIS EXON 9\t#VALUE!\t708520\t0\tNone\tNone\t3\t2125560\t1.51E+12
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12448R\tACCESSION NUMBER\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12449R\tREFERRING PATH-PHYSICIAN\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12450R\tREF PATH-PHYS ADDRESS\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12451R\tPLACE OF DEATH\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12452R\tDATE AND TIME OF DEATH\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12453R\tDATE OF AUTOPSY\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12454R\tSPECIMEN\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12455R\tMATERIAL\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12456R\tTISSUE DESCRIPTION\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12457R\tMICROSCOPIC DESCRIPTION\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12458R\tCLINICAL HISTORY\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12459R\tFINAL DIAGNOSIS\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12460R\tFINAL DIAGNOSIS\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12461R\tCOMMENT\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12462R\tREVISION DESCRIPTION\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12463R\tSIGNING PATHOLOGIST\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12464R\tSPECIAL PROCEDURES\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12465R\tSP SIGNING PATHOLOGIST\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12466R\tPREVIOUS REPORT FOLLOWS\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12467R\tADDENDUM\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12468R\tADDENDUM COMMENT\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910582\tLAB12447R\tAP SPECIAL STUDIES REVIEW\t12469R\tADDENDUM PATHOLOGIST\t#VALUE!\t13488\t0\tNone\tNone\t5\t67440\t4531989600
+BODY FLUID ORDERABLES\t910584\tLAB12470R\tSTAIN, CONGO RED\t12379R\tCONGO RED, STAIN\t#VALUE!\t0\t0\tNone\tNone\t1\t0\t0
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12472R\tSPECIMEN\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12473R\tADDENDUM COMMENT\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12474R\tACCESSION NUMBER\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12475R\tREFERRING PATH-PHYSICIAN\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12476R\tREF PATH-PHYS ADDRESS\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12477R\tPLACE OF DEATH\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12478R\tDATE AND TIME OF DEATH\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12479R\tDATE OF AUTOPSY\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12480R\tMATERIAL\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12481R\tTISSUE DESCRIPTION\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12482R\tMICROSCOPIC DESCRIPTION\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12483R\tCLINICAL HISTORY\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12484R\tFINAL DIAGNOSIS\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12485R\tFINAL DIAGNOSIS\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12486R\tCOMMENT\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12487R\tREVISION DESCRIPTION\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12488R\tSIGNING PATHOLOGIST\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12489R\tSPECIAL PROCEDURES\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12490R\tSP SIGNING PATHOLOGIST\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12491R\tPREVIOUS REPORT FOLLOWS\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12492R\tADDENDUM\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910586\tLAB12471R\tSURGICAL PATHOLOGY CONSULT\t12493R\tADDENDUM PATHOLOGIST\t#VALUE!\t1096860\t0\tNone\tNone\t1\t1096860\t1.20E+12
+BODY FLUID ORDERABLES\t910588\tLAB12494R\tPATH CONSULT, OUTSIDE SLIDE\t12378R\tPATH CONSULT, OUTSIDE SLIDE\t#VALUE!\t0\t0\tNone\tNone\t1\t0\t0
+CARDIAC ANGIO ORDERABLES\t474722\tIMG11AR1\tCAR CATH HEART RT 1\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474724\tIMG11BXM1\tCAR MYOCARD BIOPSY I\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474725\tIMG11BXMT\tCAR MYOCARD BX I TX\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474726\tIMG11CCP\tCAR CATH CORS POSSIBLE\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474730\tIMG11IA\tCAR INTRA AORTIC BALLOON PUMP\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474731\tIMG11IABP\tCAR IABP REMOVAL\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474736\tIMG11LHC\tCAR LT HEART CATH\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474742\tIMG11PER\tCAR PERICARDIOCENTESIS\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474743\tIMG11RLCA\tCAR RT LT CATH CORS ANGIO\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t474744\tIMG11RLHC\tCAR COMB RT LT HEART CATH\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t517201\tIMG1PTCA\tCAR PTCA EACH ADDITIONAL VESSEL\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t517407\tIMG1STEV\tCAR CORONARY STENT SINGLE\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t517417\tIMG1PTCS\tCAR PTCA 1VESSEL SIMPLE\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t517461\tIMG1ATH\tCAR PTC ROTABLATOR\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+CARDIAC ANGIO ORDERABLES\t660296\tCRP333\tRIGHT LEFT CATH CORS ANGIO\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+COAGULATION ORDERABLES\t472515\tLABHIAB\tHEPARIN INDUCED AB\tHIACOM\tCOMMENTS\t#VALUE!\t64755.64516\t0\tNone\tNone\t372\t24089100\t2.37E+12
+COAGULATION ORDERABLES\t472516\tLABHIPA\tHEPARIN INDUCED PLATELET AGGREGATION\tHIPLAB\tLAB DATA\t#VALUE!\t158939.6319\t0\tNone\tNone\t163\t25907160\t6.12E+12
+COAGULATION ORDERABLES\t472663\tLABVWNTRP\tINTERPRETATION, VW SCREEN\tVWDIR\tINTERPRETED BY\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+COAGULATION ORDERABLES\t472867\tLABCGMISC\tMISCELLANEOUS TEST COAGULATION\tCGRSLT\tRESULT\t#VALUE!\t157680\t0\tNone\tNone\t1\t157680\t24862982400
+CYTOGENETICS ORDERABLES\t472130\tLABCYTGEN\tCYTOGENETICS FISH ORDER\tCYTGN1\tCYTOGEN/FISH TRACKING\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+ECG ORDERABLES\t472256\tEKG5\tECG 12-LEAD\tPDF\tPDF RESULT\t#VALUE!\t-9930.481737\t0\tNone\tNone\t12019\t-119354460\t4.85E+17
+ECG ORDERABLES\t472257\tEKG6\tECG SIGNAL AVERAGED\tECGIMPRESS\tECG IMPRESSION\t#VALUE!\t133908.75\t0\tNone\tNone\t16\t2142540\t3.12E+12
+ECG ORDERABLES\t472257\tEKG6\tECG SIGNAL AVERAGED\tPDF\tPDF RESULT\t#VALUE!\t3600\t0\tNone\tNone\t2\t7200\t26956800
+EP ORDERABLES\t474752\tIMG12AH\tEP ABLATION\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+EP ORDERABLES\t474772\tIMG12IA\tICD ANALYSIS\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+FLOW CYTOMETRY\t473306\tLABSEZPNL\tSEZARY PANEL\tAN20DS\tDISCLAIMER\t#VALUE!\t614750\t0\tNone\tNone\t6\t3688500\t9.36E+12
+HISTOCOMPATIBILITY ORDERABLE\t481589\t10285R\tHLA ORDER - SPECIMEN IN LAB ORDERS (DONOR)\tRINFO\tTO FIND RESULT:\t#VALUE!\t130260\t0\tNone\tNone\t1\t130260\t16967667600
+HISTOCOMPATIBILITY ORDERABLE\t505814\t10410R\tHLA-BMT DONOR MATCH GRADE SUMMARY\t9706R\tDONOR MATCH GRADE SUMMARY\t#VALUE!\t13188948.16\t0\tNone\tNone\t76\t1002360060\t3.04E+16
+HISTOCOMPATIBILITY ORDERABLE\t506036\t10270R\tHLA ORDER - SPECIMEN IN LAB ORDERS (RECIPIENT)\tRINFO\tTO FIND RESULT:\t#VALUE!\t1418312.791\t0\tNone\tNone\t86\t121974900\t4.69E+14
+HISTOCOMPATIBILITY ORDERABLE\t506864\t10235R\tHLA ORDER - DECEASED DONOR CROSSMATCH AND TESTING\tRINFO\tTO FIND RESULT:\t#VALUE!\t584445.8824\t0\tNone\tNone\t68\t39742320\t4.86E+13
+HISTOCOMPATIBILITY ORDERABLE\t507225\t10220R\tHLA ORDER - DESENSITIZATION MONITORING PRE IVIG (POST TRANSPLANT)\tRINFO\tTO FIND RESULT:\t#VALUE!\t1641532\t0\tNone\tNone\t30\t49245960\t1.25E+14
+HISTOCOMPATIBILITY ORDERABLE\t519017\t10230R\tHLA ORDER - DESENSITIZATION MONITORING NO IVIG (PO*\tRINFO\tTO FIND RESULT:\t#VALUE!\t1205680\t0\tNone\tNone\t9\t10851120\t1.84E+13
+HISTOCOMPATIBILITY ORDERABLE\t569143\t10225R\tHLA ORDER - DESENSITIZATION MONITORING POST IVIG (POS*\tRINFO\tTO FIND RESULT:\t#VALUE!\t1487994\t0\tNone\tNone\t30\t44639820\t1.09E+14
+HISTOCOMPATIBILITY ORDERABLE\t569143\t10225R\tHLA ORDER - DESENSITIZATION MONITORING PRE IVIG\tRINFO\tTO FIND RESULT:\t#VALUE!\t2244840\t0\tNone\tNone\t1\t2244840\t5.04E+12
+HISTOCOMPATIBILITY ORDERABLE\t609847\t10265R\tHLA ORDER - SCHEDULED SCREENING KIT PROCESSING\tRINFO\tTO FIND RESULT:\t#VALUE!\t1226580\t0\tNone\tNone\t3\t3679740\t6.00E+12
+HISTOCOMPATIBILITY ORDERABLE\t685703\t10135R\tHLA ORDER - SCHEDULED SCREENING KIT BILLING\tRINFO\tTO FIND RESULT:\t#VALUE!\t1225575\t0\tNone\tNone\t4\t4902300\t2.13E+13
+HISTOCOMPATIBILITY ORDERABLE\t710704\t10210R\tHLA ORDER - DESENSITIZATION MONITORING POST IVIG\tRINFO\tTO FIND RESULT:\t#VALUE!\t2240112\t0\tNone\tNone\t5\t11200560\t3.47E+13
+HISTOCOMPATIBILITY ORDERABLE\t890776\t10110R\tHLA ORDER - FLOW AUTO CROSSMATCH\tRINFO\tTO FIND RESULT:\t#VALUE!\t267540\t0\tNone\tNone\t4\t1070160\t4.76E+11
+HISTOCOMPATIBILITY ORDERABLE\t890780\t10010R\tHLA ORDER - CROSSMATCH (W/UNRELATED DONOR INFO)\tRINFO\tTO FIND RESULT:\t#VALUE!\t170820\t0\tNone\tNone\t1\t170820\t29179472400
+HISTOCOMPATIBILITY ORDERABLE\t890826\t10150R\tHLA ORDER - SUMMARIES\tRINFO\tTO FIND RESULT:\t#VALUE!\t1953334.327\t0\tNone\tNone\t208\t406293540\t1.40E+16
+HISTOCOMPATIBILITY ORDERABLE\t892285\t10273R\tHLA ORDER - WORKUP AT TIME OF TRANSPLANT\tRINFO\tTO FIND RESULT:\t#VALUE!\t452812.6829\t0\tNone\tNone\t41\t18565320\t3.05E+13
+HISTOCOMPATIBILITY ORDERABLE\t895898\t10120R\tHLA ORDER - ADDITIONAL SPECIMEN (RECIPIENT)\tRINFO\tTO FIND RESULT:\t#VALUE!\t202080\t0\tNone\tNone\t1\t202080\t40836326400
+HISTOCOMPATIBILITY ORDERABLE\t896063\t10390R\tHLA-BMT DONOR MATCH DETAIL SUMMARY\t9663R\tDONOR MATCH GRADE DETAIL\t#VALUE!\t11844188.49\t0\tNone\tNone\t106\t1255483980\t3.44E+16
+HISTOCOMPATIBILITY ORDERABLE\t896063\t10390R\tHLA-BMT DONOR MATCH DETAIL SUMMARY\t9706R\tDONOR MATCH GRADE SUMMARY\t#VALUE!\t8251302\t0\tNone\tNone\t30\t247539060\t4.03E+15
+HISTOCOMPATIBILITY ORDERABLE\t896064\t10320R\tHLA - ALLO B CDC CROSSMATCH\t9235R\tDISCLAIMER\t#VALUE!\t528366.6667\t0\tNone\tNone\t9\t4755300\t8.85E+12
+HISTOCOMPATIBILITY ORDERABLE\t896064\t10320R\tHLA - ALLO B CDC CROSSMATCH\t9712R\tDONOR PHENOTYPE\t#VALUE!\t528366.6667\t0\tNone\tNone\t9\t4755300\t8.85E+12
+HISTOCOMPATIBILITY ORDERABLE\t896065\t10310R\tHLA - ALLO B FLOW CROSSMATCH\t9183R\tDISCLAIMER\t#VALUE!\t380304.6774\t0\tNone\tNone\t124\t47157780\t5.17E+13
+HISTOCOMPATIBILITY ORDERABLE\t896066\t10315R\tHLA - ALLO T CDC CROSSMATCH\t9209R\tDISCLAIMER\t#VALUE!\t475542\t0\tNone\tNone\t10\t4755420\t8.85E+12
+HISTOCOMPATIBILITY ORDERABLE\t896066\t10315R\tHLA - ALLO T CDC CROSSMATCH\t9709R\tDONOR PHENOTYPE\t#VALUE!\t475542\t0\tNone\tNone\t10\t4755420\t8.85E+12
+HISTOCOMPATIBILITY ORDERABLE\t896067\t10305R\tHLA - ALLO T FLOW CROSSMATCH\t9152R\tDISCLAIMER\t#VALUE!\t370725\t0\tNone\tNone\t124\t45969900\t4.87E+13
+HISTOCOMPATIBILITY ORDERABLE\t896069\t10300R\tHLA - AUTO B FLOW CROSSMATCH\t9122R\tDISCLAIMER\t#VALUE!\t272784.1379\t0\tNone\tNone\t87\t23732220\t2.33E+13
+HISTOCOMPATIBILITY ORDERABLE\t896071\t10295R\tHLA - AUTO T FLOW CROSSMATCH\t9101R\tDISCLAIMER\t#VALUE!\t273799.3103\t0\tNone\tNone\t87\t23820540\t2.34E+13
+HISTOCOMPATIBILITY ORDERABLE\t896074\t10370R\tHLA - DSA BY C1Q\t9369R\tMFI RESULTS FOR DSA BY C1Q CLASS I\t#VALUE!\t37661.85185\t0\tNone\tNone\t162\t6101220\t2.59E+13
+HISTOCOMPATIBILITY ORDERABLE\t896074\t10370R\tHLA - DSA BY C1Q\t9449R\tDSA RESULTS FOR C1Q CLASS I\t#VALUE!\t2331.428571\t0\tNone\tNone\t7\t16320\t262447200
+HISTOCOMPATIBILITY ORDERABLE\t896074\t10370R\tHLA - DSA BY C1Q\t9451R\tCOMPOSED TEXT CLASS I\t#VALUE!\t37661.85185\t0\tNone\tNone\t162\t6101220\t2.59E+13
+HISTOCOMPATIBILITY ORDERABLE\t896074\t10370R\tHLA - DSA BY C1Q\t9463R\tDSA RESULTS FOR C1Q CLASS II\t#VALUE!\t33.91304348\t0\tNone\tNone\t23\t780\t46800
+HISTOCOMPATIBILITY ORDERABLE\t896074\t10370R\tHLA - DSA BY C1Q\t9465R\tCOMPOSED TEXT CLASS II\t#VALUE!\t37209.87805\t0\tNone\tNone\t164\t6102420\t2.59E+13
+HISTOCOMPATIBILITY ORDERABLE\t896074\t10370R\tHLA - DSA BY C1Q\t9466R\tDISCLAIMER\t#VALUE!\t37217.81818\t0\tNone\tNone\t165\t6140940\t2.59E+13
+HISTOCOMPATIBILITY ORDERABLE\t896074\t10370R\tHLA - DSA BY C1Q\t9657R\tMFI RESULTS FOR DSA BY C1Q CLASS II\t#VALUE!\t37209.87805\t0\tNone\tNone\t164\t6102420\t2.59E+13
+HISTOCOMPATIBILITY ORDERABLE\t896075\t10365R\tHLA - DSA BY IGG\t9368R\tMFI RESULTS FOR DSA BY IGG CLASS I\t#VALUE!\t43413.25301\t0\tNone\tNone\t166\t7206600\t2.67E+13
+HISTOCOMPATIBILITY ORDERABLE\t896075\t10365R\tHLA - DSA BY IGG\t9419R\tDSA RESULTS FOR IGG CLASS I\t#VALUE!\t4032\t0\tNone\tNone\t20\t80640\t6368090400
+HISTOCOMPATIBILITY ORDERABLE\t896075\t10365R\tHLA - DSA BY IGG\t9421R\tCOMPOSED TEXT CLASS I\t#VALUE!\t43413.25301\t0\tNone\tNone\t166\t7206600\t2.67E+13
+HISTOCOMPATIBILITY ORDERABLE\t896075\t10365R\tHLA - DSA BY IGG\t9432R\tDSA RESULTS FOR IGG CLASS II\t#VALUE!\t4365\t0\tNone\tNone\t40\t174600\t15129072000
+HISTOCOMPATIBILITY ORDERABLE\t896075\t10365R\tHLA - DSA BY IGG\t9434R\tCOMPOSED TEXT CLASS II\t#VALUE!\t42896.78571\t0\tNone\tNone\t168\t7206660\t2.67E+13
+HISTOCOMPATIBILITY ORDERABLE\t896075\t10365R\tHLA - DSA BY IGG\t9435R\tDISCLAIMER\t#VALUE!\t42896.78571\t0\tNone\tNone\t168\t7206660\t2.67E+13
+HISTOCOMPATIBILITY ORDERABLE\t896075\t10365R\tHLA - DSA BY IGG\t9656R\tMFI RESULTS FOR DSA BY IGG CLASS II\t#VALUE!\t42896.78571\t0\tNone\tNone\t168\t7206660\t2.67E+13
+HISTOCOMPATIBILITY ORDERABLE\t896076\t10395R\tHLA - CROSSMATCH SUMMARY\t9661R\tHLA CROSSMATCH SUMMARY\t#VALUE!\t6064014.146\t0\tNone\tNone\t41\t248624580\t5.84E+15
+HISTOCOMPATIBILITY ORDERABLE\t896077\t10290R\tHLA - TYPING\t9077R\tNMDP CODES\t#VALUE!\t190845.8369\t0\tNone\tNone\t233\t44467080\t7.74E+13
+HISTOCOMPATIBILITY ORDERABLE\t896077\t10290R\tHLA - TYPING\t9080R\tDISCLAIMER\t#VALUE!\t213091.738\t0\tNone\tNone\t397\t84597420\t1.52E+14
+HISTOCOMPATIBILITY ORDERABLE\t896078\t10400R\tHLA - TYPING SUMMARY\t9662R\tHLA TYPING SUMMARY\t#VALUE!\t5150790.545\t0\tNone\tNone\t55\t283293480\t6.50E+15
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9338R\tINHIBITION RESULTS FOR CLASS I\t#VALUE!\t1441825.714\t0\tNone\tNone\t7\t10092780\t6.71E+13
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9343R\tINHIBITION RESULTS FOR CLASS II\t#VALUE!\t413505\t0\tNone\tNone\t8\t3308040\t5.94E+12
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9344R\tINTERPRETATION/ COMMENTS CLASS II\t#VALUE!\t2652120\t0\tNone\tNone\t3\t7956360\t6.22E+13
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9345R\tCOMPOSED TEXT CLASS II\t#VALUE!\t1119612\t0\tNone\tNone\t10\t11196120\t6.82E+13
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9346R\tDISCLAIMER\t#VALUE!\t1119612\t0\tNone\tNone\t10\t11196120\t6.82E+13
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9351R\tMFI RESULTS FOR IN VITRO IVIG INHIBITION ASSAY CLASS I\t#VALUE!\t1261597.5\t0\tNone\tNone\t8\t10092780\t6.71E+13
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9586R\tINTERPRETATION/ COMMENTS CLASS I\t#VALUE!\t3944040\t0\tNone\tNone\t2\t7888080\t6.22E+13
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9587R\tCOMPOSED TEXT CLASS I\t#VALUE!\t1261597.5\t0\tNone\tNone\t8\t10092780\t6.71E+13
+HISTOCOMPATIBILITY ORDERABLE\t896080\t10350R\tHLA - IN VITRO IVY INHIBITION ASSAY\t9653R\tMFI RESULTS FOR IN VITRO IVIG INHIBITION ASSAY CLASS II\t#VALUE!\t1119612\t0\tNone\tNone\t10\t11196120\t6.82E+13
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9364R\tMFI RESULTS FOR MONITORING BY C1Q CLASS I\t#VALUE!\t33166.66667\t0\tNone\tNone\t9\t298500\t89030631600
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9390R\tMONITORING RESULTS FOR C1Q CLASS I\t#VALUE!\t0\t0\tNone\tNone\t4\t0\t0
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9392R\tCOMPOSED TEXT CLASS I\t#VALUE!\t33166.66667\t0\tNone\tNone\t9\t298500\t89030631600
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9403R\tMONITORING RESULTS FOR C1Q CLASS II\t#VALUE!\t0\t0\tNone\tNone\t2\t0\t0
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9405R\tCOMPOSED TEXT CLASS II\t#VALUE!\t33166.66667\t0\tNone\tNone\t9\t298500\t89030631600
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9406R\tDISCLAIMER\t#VALUE!\t33166.66667\t0\tNone\tNone\t9\t298500\t89030631600
+HISTOCOMPATIBILITY ORDERABLE\t896081\t10360R\tHLA - MONITORING BY C1Q\t9655R\tMFI RESULTS FOR MONITORING BY C1Q CLASS II\t#VALUE!\t37305\t0\tNone\tNone\t8\t298440\t89030628000
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9360R\tMONITORING RESULTS FOR IGG CLASS I\t#VALUE!\t30\t0\tNone\tNone\t4\t120\t7200
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9362R\tCOMPOSED TEXT CLASS I\t#VALUE!\t42651.42857\t0\tNone\tNone\t7\t298560\t89030635200
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9363R\tMFI RESULTS FOR MONITORING BY IGG CLASS I\t#VALUE!\t42651.42857\t0\tNone\tNone\t7\t298560\t89030635200
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9373R\tMONITORING RESULTS FOR IGG CLASS II\t#VALUE!\t30\t0\tNone\tNone\t4\t120\t7200
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9375R\tCOMPOSED TEXT CLASS II\t#VALUE!\t42651.42857\t0\tNone\tNone\t7\t298560\t89030635200
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9376R\tDISCLAIMER\t#VALUE!\t42651.42857\t0\tNone\tNone\t7\t298560\t89030635200
+HISTOCOMPATIBILITY ORDERABLE\t896082\t10355R\tHLA - MONITORING BY IGG\t9654R\tMFI RESULTS FOR MONITORING BY IGG CLASS II\t#VALUE!\t42651.42857\t0\tNone\tNone\t7\t298560\t89030635200
+HISTOCOMPATIBILITY ORDERABLE\t896083\t10335R\tHLA - SCREENING C1Q\t10471R\tSAFE ANTIGENS C1Q\t#VALUE!\t354240\t0\tNone\tNone\t1\t354240\t1.25E+11
+HISTOCOMPATIBILITY ORDERABLE\t896083\t10335R\tHLA - SCREENING C1Q\t9282R\tDISCLAIMER\t#VALUE!\t118749.8734\t0\tNone\tNone\t316\t37524960\t4.02E+13
+HISTOCOMPATIBILITY ORDERABLE\t896083\t10335R\tHLA - SCREENING C1Q\t9652R\tMFI RESULTS FOR SCREENING C1Q CLASS II\t#VALUE!\t138546\t0\tNone\tNone\t210\t29094660\t2.40E+13
+HISTOCOMPATIBILITY ORDERABLE\t896084\t10330R\tHLA - SCREENING IGG\t9261R\tCOMPOSED TEXT CLASS II\t#VALUE!\t160995\t0\tNone\tNone\t288\t46366560\t7.62E+13
+HISTOCOMPATIBILITY ORDERABLE\t896084\t10330R\tHLA - SCREENING IGG\t9262R\tDISCLAIMER\t#VALUE!\t159629.0722\t0\tNone\tNone\t291\t46452060\t7.62E+13
+HISTOCOMPATIBILITY ORDERABLE\t896084\t10330R\tHLA - SCREENING IGG\t9582R\tINTERPRETATION/ COMMENTS CLASS I\t#VALUE!\t444600\t0\tNone\tNone\t2\t889200\t7.91E+11
+HISTOCOMPATIBILITY ORDERABLE\t896084\t10330R\tHLA - SCREENING IGG\t9583R\tCOMPOSED TEXT CLASS I\t#VALUE!\t160179.1034\t0\tNone\tNone\t290\t46451940\t7.62E+13
+HISTOCOMPATIBILITY ORDERABLE\t896084\t10330R\tHLA - SCREENING IGG\t9650R\tMFI RESULTS FOR SCREENING IGG CLASS I\t#VALUE!\t160179.1034\t0\tNone\tNone\t290\t46451940\t7.62E+13
+HISTOCOMPATIBILITY ORDERABLE\t896084\t10330R\tHLA - SCREENING IGG\t9651R\tMFI RESULTS FOR SCREENING IGG CLASS II\t#VALUE!\t160995\t0\tNone\tNone\t288\t46366560\t7.62E+13
+HISTOCOMPATIBILITY ORDERABLE\t896085\t10375R\tHLA - STR/CHIMERISM TESTING\t9574R\tINTERPRETATION/ COMMENTS\t#VALUE!\t8022.580645\t0\tNone\tNone\t31\t248700\t61404901200
+HISTOCOMPATIBILITY ORDERABLE\t896085\t10375R\tHLA - STR/CHIMERISM TESTING\t9575R\tCOMPOSED TEXT\t#VALUE!\t4147.297297\t0\tNone\tNone\t74\t306900\t64653973200
+HISTOCOMPATIBILITY ORDERABLE\t896085\t10375R\tHLA - STR/CHIMERISM TESTING\t9576R\tDISCLAIMER\t#VALUE!\t4147.297297\t0\tNone\tNone\t74\t306900\t64653973200
+HISTOCOMPATIBILITY ORDERABLE\t896159\t10100R\tHLA ORDER - PLATELET COMPATIBILITY\tRINFO\tTO FIND RESULT:\t#VALUE!\t456229.9115\t0\tNone\tNone\t113\t51553980\t7.28E+13
+HISTOCOMPATIBILITY ORDERABLE\t979724\t10287R\tHLA ORDER - REQUEST FOR SUMMARY INFO. - RECIPIENT\tRINFO\tTO FIND RESULT:\t#VALUE!\t5317523.478\t0\tNone\tNone\t23\t122303040\t2.88E+15
+HISTOCOMPATIBILITY ORDERABLE\t1458223\t10175R\tHLA ORDER - KIT PROCESSING RECIPIENT\tRINFO\tTO FIND RESULT:\t#VALUE!\t1408650\t0\tNone\tNone\t2\t2817300\t3.97E+12
+HISTOCOMPATIBILITY ORDERABLE\t1509678\t10070R\tHLA ORDER - IVIG IN VITRO INHIBITION ASSAY\tRINFO\tTO FIND RESULT:\t#VALUE!\t1712980\t0\tNone\tNone\t3\t5138940\t1.13E+13
+HISTOCOMPATIBILITY ORDERABLE\t235818016\t10280R\tHLA ORDER - ADDITIONAL SPECIMEN (RECIPIENT)\tRINFO\tTO FIND RESULT:\t#VALUE!\t5611500\t0\tNone\tNone\t1\t5611500\t3.15E+13
+HISTOCOMPATIBILITY ORDERABLE\t235818016\t10280R\tHLA ORDER - ADDITIONAL SPECIMEN (RECIPIENT) - AB SCREENING\tRINFO\tTO FIND RESULT:\t#VALUE!\t1715198.88\t0\tNone\tNone\t125\t214399860\t7.48E+14
+HISTOCOMPATIBILITY ORDERABLE\t304982014\t10545R\tHLA - CD31 TESTING SUMMARY\t10478R\tCD31 TESTING SUMMARY\t#VALUE!\t240\t0\tNone\tNone\t1\t240\t57600
+IMMUNOLOGY ORDERABLES\t471697\tLABASPR\tASPERGILLUS AB, CF, S\tASPR\tASPERILLUS-CF\t#VALUE!\t435300\t0\tNone\tNone\t1\t435300\t1.89E+11
+IMMUNOLOGY ORDERABLES\t472049\tLABCIMM\tCOCCI AB, ID, S\tCIMM\tCOCCI IMMUNODIFFUSION\t#VALUE!\t385435\t0\tNone\tNone\t24\t9250440\t3.66E+12
+IMMUNOLOGY ORDERABLES\t472360\tLABFASAB\tFASCIOLA HEPATICA AB\tFHAB2\tF.HEPATICA ANTIBODY ,ELISA\t#VALUE!\t8270820\t0\tNone\tNone\t1\t8270820\t6.84E+13
+IMMUNOLOGY ORDERABLES\t472579\tLABHYPP\tHYPERSENSITIVITY PNEUMONITIS SCREEN\tHYPINT\tINTERPRETATION\t#VALUE!\t415480\t0\tNone\tNone\t3\t1246440\t6.65E+11
+IMMUNOLOGY ORDERABLES\t472773\tLAB12214R\tB. BURGDORFERI C6 PEP AB,RFLX\tLYMEC6\tB.BURGDORFERI C6 PEPTIDE\t#VALUE!\t269543.2432\t0\tNone\tNone\t111\t29919300\t1.07E+13
+IMMUNOLOGY ORDERABLES\t472773\tLAB12214R\tLYME SCREEN, SERUM\tLYMEC6\tB.BURGDORFERI C6 PEPTIDE\t#VALUE!\t527280\t0\tNone\tNone\t8\t4218240\t6.97E+12
+IMMUNOLOGY ORDERABLES\t472773\tLABLYMES2\tLYME SCREEN, SERUM\tLYMEC6\tB.BURGDORFERI C6 PEPTIDE\t#VALUE!\t284946.5693\t0\tNone\tNone\t137\t39037680\t1.38E+13
+IMMUNOLOGY ORDERABLES\t473063\tLABPARAG\tPARAGONIMIASIS ANTIBODY, ELISA\tPARAG1\tPARAGONIMIASIS\t#VALUE!\t196920\t0\tNone\tNone\t1\t196920\t38777486400
+IMMUNOLOGY ORDERABLES\t473087\tLABPENALL\tPENICILLIN ALLERGY SCREEN\tPENINT\tINTERPRETATION\t#VALUE!\t485348.8235\t0\tNone\tNone\t34\t16501860\t1.42E+13
+IMMUNOLOGY ORDERABLES\t497406\tLABYNMOG\tNMO IGG\tYNMOG1\t(NMO) AUTOANTIBODY, IGG, SERUM\t#VALUE!\t485895.3846\t0\tNone\tNone\t39\t18949920\t3.33E+13
+IMMUNOLOGY ORDERABLES\t497482\tLABYPLAB\tPLATELET AB\tPLTAB\tPLATELET ANTIBODY\t#VALUE!\t262359.4286\t0\tNone\tNone\t35\t9182580\t2.60E+12
+IMMUNOLOGY ORDERABLES\t497482\tLABYPLAB\tPLATELET AB\tYPLAB2\tCOMMENT\t#VALUE!\t266346.6667\t0\tNone\tNone\t18\t4794240\t1.36E+12
+IR BODY ORDERABLES\t517389\tIMG2EX\tIR ANGIO EXTREMITY\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t471512\tLABCHON\tA/HYPOCHONDROPLASIA, SERUM\tCHONDS\tDISCLAIMER\t#VALUE!\t758160\t0\tNone\tNone\t1\t758160\t5.75E+11
+LAB BLOOD ORDERABLES\t471512\tLABCHON\tA/HYPOCHONDROPLASIA, SERUM\tCHONIN\tINTERPRETATION\t#VALUE!\t758160\t0\tNone\tNone\t1\t758160\t5.75E+11
+LAB BLOOD ORDERABLES\t471512\tLABCHON\tA/HYPOCHONDROPLASIA, SERUM\tCHONMD\tINTERPRETED BY\t#VALUE!\t758160\t0\tNone\tNone\t1\t758160\t5.75E+11
+LAB BLOOD ORDERABLES\t471512\tLABCHON\tA/HYPOCHONDROPLASIA, SERUM\tCHONMT\tMETHOD\t#VALUE!\t758160\t0\tNone\tNone\t1\t758160\t5.75E+11
+LAB BLOOD ORDERABLES\t471532\tLABACYLP\tACYLCARNITINE PROFILE QUANTITATIVE\tACPINT\tINTERPRETATION\t#VALUE!\t373273.3333\t0\tNone\tNone\t9\t3359460\t1.66E+12
+LAB BLOOD ORDERABLES\t471532\tLABACYLP\tACYLCARNITINE PROFILE QUANTITATIVE\tINBY\tINTERPRETED BY\t#VALUE!\t373273.3333\t0\tNone\tNone\t9\t3359460\t1.66E+12
+LAB BLOOD ORDERABLES\t471562\tLABACHOO\tAIRBORNE ALLERGY SCREEN\tACHINT\tINTERPRETATION\t#VALUE!\t397308\t0\tNone\tNone\t5\t1986540\t1.05E+12
+LAB BLOOD ORDERABLES\t471577\tLAB11139R\tCARDIAC REJECTION RISK\tALLO\tALLOMAP\t#VALUE!\t380820\t0\tNone\tNone\t2\t761640\t3.76E+11
+LAB BLOOD ORDERABLES\t471582\tLABATHAL\tALPHA THALASSEMIA PCR\tATHCT\tCOMMENT\t#VALUE!\t738380\t0\tNone\tNone\t12\t8860560\t7.89E+12
+LAB BLOOD ORDERABLES\t471582\tLABATHAL\tALPHA THALASSEMIA PCR\tATHDI\tDISCLAIMER\t#VALUE!\t738380\t0\tNone\tNone\t12\t8860560\t7.89E+12
+LAB BLOOD ORDERABLES\t471582\tLABATHAL\tALPHA THALASSEMIA PCR\tATHIN\tINTERPRETATION\t#VALUE!\t738380\t0\tNone\tNone\t12\t8860560\t7.89E+12
+LAB BLOOD ORDERABLES\t471582\tLABATHAL\tALPHA THALASSEMIA PCR\tATHMD\tINTERPRETED BY\t#VALUE!\t738380\t0\tNone\tNone\t12\t8860560\t7.89E+12
+LAB BLOOD ORDERABLES\t471582\tLABATHAL\tALPHA THALASSEMIA PCR\tATHME\tMETHOD\t#VALUE!\t738380\t0\tNone\tNone\t12\t8860560\t7.89E+12
+LAB BLOOD ORDERABLES\t471605\tLABAAP\tAMINO ACIDS, PLASMA\tAAPINT\tINTERPRETATION\t#VALUE!\t293858.1818\t0\tNone\tNone\t22\t6464880\t2.30E+12
+LAB BLOOD ORDERABLES\t471605\tLABAAP\tAMINO ACIDS, PLASMA\tINTBY\tINTERPRETED BY\t#VALUE!\t293858.1818\t0\tNone\tNone\t22\t6464880\t2.30E+12
+LAB BLOOD ORDERABLES\t471609\tLABBMAML\tAML PROGNOSIS ASSAY, BONE MARROW\tBMFLTB\tINTERPRETED BY\t#VALUE!\t543083.1579\t0\tNone\tNone\t57\t30955740\t2.27E+13
+LAB BLOOD ORDERABLES\t471609\tLABBMAML\tAML PROGNOSIS ASSAY, BONE MARROW\tBMFLTI\tINTERPRETATION, BM\t#VALUE!\t540213\t0\tNone\tNone\t60\t32412780\t2.37E+13
+LAB BLOOD ORDERABLES\t471623\tLABIBD\tANCA IBD WITH REFLEX\t12215R\t12215R\t#VALUE!\t205166.6667\t0\tNone\tNone\t9\t1846500\t4.31E+11
+LAB BLOOD ORDERABLES\t471629\tLABHSP70\tANTI - 68 KD (HSP - 70) ANTIBODIES\tHSP70T\tANTI-68 KD ABS\t#VALUE!\t4737480\t0\tNone\tNone\t1\t4737480\t2.24E+13
+LAB BLOOD ORDERABLES\t471632\tLABAMAONC\tANTI - MALIGNIN AB\tAMA\tANTI-MALIGNIN AB\t#VALUE!\t67680\t0\tNone\tNone\t1\t67680\t4580582400
+LAB BLOOD ORDERABLES\t471638\tLAB11075R\tANTI - SMOOTH MUSCLE AB\tASMA\tANTI-SMOOTH MUSCLE ANITBODY\t#VALUE!\t876090\t0\tNone\tNone\t2\t1752180\t2.43E+12
+LAB BLOOD ORDERABLES\t471638\tLAB11075R\tSMOOTH MUSCLE AB\tASMA\tANTI-SMOOTH MUSCLE ANITBODY\t#VALUE!\t221775\t0\tNone\tNone\t500\t110887500\t3.44E+13
+LAB BLOOD ORDERABLES\t471638\tLABYASMA\tANTI - SMOOTH MUSCLE AB\tASMA\tANTI-SMOOTH MUSCLE ANITBODY\t#VALUE!\t238124.2105\t0\tNone\tNone\t19\t4524360\t1.34E+12
+LAB BLOOD ORDERABLES\t471650\tLABASO\tANTISTREPTOLYSIN O TITER\tASO\tASO TITER (IU/ML)\t#VALUE!\t274380\t0\tNone\tNone\t2\t548760\t1.64E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO1\tSPECIMEN\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO10\tRELEASE DATE\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO11\tINTERPRETATION\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO12\tEXTRACTION PERFORMED?\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO2\tSPECIMEN ID\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO4\tORDER DATE\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO5\tMETHOD\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO6\tRESULT\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471655\tLABYAPOE\tAPOLIPOPROTEIN E GENOTYPING\tYAPO9\tREVIEWED BY\t#VALUE!\t562920\t0\tNone\tNone\t1\t562920\t3.17E+11
+LAB BLOOD ORDERABLES\t471678\tLABFABRO\tARBOVIRUS AB PANEL, IFA (TITER)\tEEIGG\tE EQUINE ENCEP IGG AB\t#VALUE!\t2760\t0\tNone\tNone\t1\t2760\t7617600
+LAB BLOOD ORDERABLES\t471687\tLAB11126R\tASCARIASIS\tASCA\tASCARISIS\t#VALUE!\t1498147.5\t0\tNone\tNone\t8\t11985180\t2.50E+13
+LAB BLOOD ORDERABLES\t471687\tLABASCA\tASCARIASIS AB\tASCA\tASCARISIS\t#VALUE!\t424980\t0\tNone\tNone\t1\t424980\t1.81E+11
+LAB BLOOD ORDERABLES\t471706\tLABSCLABY\tANTI-SCL70 ANTIBODY\tSCLINT\tANTI-SCL70 INTERPRETATION\t#VALUE!\t391549.434\t0\tNone\tNone\t159\t62256360\t3.14E+13
+LAB BLOOD ORDERABLES\t471707\tLABSSAABY\tANTI-RO ANTIBODY\tSSAIN\tANTI-RO INTERPRETATION\t#VALUE!\t390342.8571\t0\tNone\tNone\t210\t81972000\t4.05E+13
+LAB BLOOD ORDERABLES\t471708\tLABSSBABY\tANTI-LA ANTIBODY\tSSBINT\tANTI-LA INTERPRETATION\t#VALUE!\t380593.9806\t0\tNone\tNone\t206\t78402360\t3.76E+13
+LAB BLOOD ORDERABLES\t471733\tLABYPERAB\tBORDETELLA PERTUSSIS IGG AND IGM AB\tYPERA1\tB PERTUSSIS AB, IGG\t#VALUE!\t32220\t0\tNone\tNone\t1\t32220\t1038128400
+LAB BLOOD ORDERABLES\t471734\tLABBCLON\tB - CELL CLONALITY PCR\tBDIR\tINTERPRETED BY\t#VALUE!\t1276240\t0\tNone\tNone\t3\t3828720\t4.91E+12
+LAB BLOOD ORDERABLES\t471734\tLABBCLON\tB - CELL CLONALITY PCR\tBDIS\tDISCLAIMER\t#VALUE!\t1276240\t0\tNone\tNone\t3\t3828720\t4.91E+12
+LAB BLOOD ORDERABLES\t471738\tLABYBABE\tBABESIA MICROTI IGG AND IGM AB\tYBAB1\tBABESIA MICROTI, IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t471738\tLABYBABE\tBABESIA MICROTI IGG AND IGM AB\tYBAB2\tBABESIA MICROTI, IGM\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t471738\tLABYBABE\tBABESIA MICROTI IGG AND IGM AB\tYBAB3\tINTERPRETATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t471746\tLABBCRQT\tBCR - ABL QUANTITATIVE, BLOOD\tQBCRDI\tDISCLAIMER\t#VALUE!\t600772.8477\t0\tNone\tNone\t151\t90716700\t6.81E+13
+LAB BLOOD ORDERABLES\t471746\tLABBCRQT\tBCR - ABL QUANTITATIVE, BLOOD\tQBCRDX\tCLINICAL INDICATION\t#VALUE!\t600772.8477\t0\tNone\tNone\t151\t90716700\t6.81E+13
+LAB BLOOD ORDERABLES\t471746\tLABBCRQT\tBCR - ABL QUANTITATIVE, BLOOD\tQBCRME\tMETHOD\t#VALUE!\t600772.8477\t0\tNone\tNone\t151\t90716700\t6.81E+13
+LAB BLOOD ORDERABLES\t471758\tLABBTHSQ\tBETA THALASSEMIA SEQUENCING\tBSQDI\tDISCLAIMER\t#VALUE!\t1383525\t0\tNone\tNone\t4\t5534100\t8.61E+12
+LAB BLOOD ORDERABLES\t471758\tLABBTHSQ\tBETA THALASSEMIA SEQUENCING\tBSQIN\tINTERPRETATION\t#VALUE!\t1383525\t0\tNone\tNone\t4\t5534100\t8.61E+12
+LAB BLOOD ORDERABLES\t471758\tLABBTHSQ\tBETA THALASSEMIA SEQUENCING\tBSQMD\tINTERPRETED BY\t#VALUE!\t1383525\t0\tNone\tNone\t4\t5534100\t8.61E+12
+LAB BLOOD ORDERABLES\t471758\tLABBTHSQ\tBETA THALASSEMIA SEQUENCING\tBSQME\tMETHOD\t#VALUE!\t1383525\t0\tNone\tNone\t4\t5534100\t8.61E+12
+LAB BLOOD ORDERABLES\t471758\tLABBTHSQ\tBETA THALASSEMIA SEQUENCING\tBSQMU\tMUTATION\t#VALUE!\t1877940\t0\tNone\tNone\t1\t1877940\t3.53E+12
+LAB BLOOD ORDERABLES\t471760\tLABB2GP1\tBETA - 2 - GLYCOPROTEIN\tB2GPCM\tBETA-2-GP1 COMMENT\t#VALUE!\t612816.383\t0\tNone\tNone\t94\t57604740\t3.76E+13
+LAB BLOOD ORDERABLES\t471777\tLABYBLAS\tBLASTOMYCES AB\tYBLAS1\tBLASTOMYCES AB ,S\t#VALUE!\t365589.375\t0\tNone\tNone\t32\t11698860\t4.93E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tCMGDES\tCMV IGG TEST DESCRIPTION\t#VALUE!\t386356.6667\t0\tNone\tNone\t18\t6954420\t3.18E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tCMMDES\tCMV IGM TEST DESCRIPTION\t#VALUE!\t386356.6667\t0\tNone\tNone\t18\t6954420\t3.18E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tHATINT\tINTERPRETATION\t#VALUE!\t379288.125\t0\tNone\tNone\t32\t12137220\t5.64E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tHBSINT\tINTERPRETATION\t#VALUE!\t379288.125\t0\tNone\tNone\t32\t12137220\t5.64E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tHBTINT\tINTERPRETATION\t#VALUE!\t379288.125\t0\tNone\tNone\t32\t12137220\t5.64E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tHSAB\tVIRAL AB HSV\t#VALUE!\t404997.5\t0\tNone\tNone\t24\t9719940\t4.77E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tHVIGDS\tHSV IGG TEST DESCRIPTION\t#VALUE!\t302160\t0\tNone\tNone\t8\t2417280\t8.64E+11
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tRPRQIN\tINTERPRETATIONS\t#VALUE!\t379288.125\t0\tNone\tNone\t32\t12137220\t5.64E+12
+LAB BLOOD ORDERABLES\t471788\tLABBMPTP\tBMT PRETRANSPLANT PANEL\tVGGDES\tVZV IGG TEST DESCRIPTION\t#VALUE!\t386356.6667\t0\tNone\tNone\t18\t6954420\t3.18E+12
+LAB BLOOD ORDERABLES\t471799\tLABBRASP\tBRONCHOPULMONARY ASPERGILLUS SCREEN\tASPINT\tINTERPRETATION\t#VALUE!\t785686.9231\t0\tNone\tNone\t78\t61283580\t6.62E+13
+LAB BLOOD ORDERABLES\t471914\tLAB11105R\tCANDIDA AB\tCANDP\tCANDIDA PRECIPITINS\t#VALUE!\t288000\t0\tNone\tNone\t1\t288000\t82944000000
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11834R\tSPECIMEN\t#VALUE!\t1025250\t0\tNone\tNone\t2\t2050500\t2.16E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11835R\tSPECIMEN ID\t#VALUE!\t1025250\t0\tNone\tNone\t2\t2050500\t2.16E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11836R\tSOURCE\t#VALUE!\t1199640\t0\tNone\tNone\t1\t1199640\t1.44E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11837R\tORDER DATE\t#VALUE!\t1025250\t0\tNone\tNone\t2\t2050500\t2.16E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11838R\tREASON FOR REFERRAL\t#VALUE!\t911000\t0\tNone\tNone\t3\t2733000\t2.63E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11839R\tMETHOD\t#VALUE!\t1025250\t0\tNone\tNone\t2\t2050500\t2.16E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11840R\tINTERPRETATION\t#VALUE!\t911000\t0\tNone\tNone\t3\t2733000\t2.63E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11841R\tAMENDMENT\t#VALUE!\t1199640\t0\tNone\tNone\t1\t1199640\t1.44E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11842R\tREVIEWED BY\t#VALUE!\t911000\t0\tNone\tNone\t3\t2733000\t2.63E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t11843R\tRELEASE DATE\t#VALUE!\t1025250\t0\tNone\tNone\t2\t2050500\t2.16E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t12769R\tTRI-SIALO/DI-OLIGO RATIO\t#VALUE!\t682500\t0\tNone\tNone\t1\t682500\t4.66E+11
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t12770R\tAPO CIII-1/CIII-2 RATIO\t#VALUE!\t682500\t0\tNone\tNone\t1\t682500\t4.66E+11
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\t12771R\tAPO CIII-0/APO CIII-2 RATIO\t#VALUE!\t682500\t0\tNone\tNone\t1\t682500\t4.66E+11
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\tAODOR\tA-OLIGO/DI-OLIGO RAT\t#VALUE!\t911000\t0\tNone\tNone\t3\t2733000\t2.63E+12
+LAB BLOOD ORDERABLES\t471921\tLABYCDTN\tCARBOHYDRATE DEFICIENT TRANSFERRIN\tMODOR\tMONO-OLIGO/DI-OLIGO RATIO\t#VALUE!\t911000\t0\tNone\tNone\t3\t2733000\t2.63E+12
+LAB BLOOD ORDERABLES\t471929\tLABCARN\tCARNITINE FREE AND TOTAL\tCARINT\tINTERPRETATION\t#VALUE!\t396363.6364\t0\tNone\tNone\t33\t13080000\t5.88E+12
+LAB BLOOD ORDERABLES\t471933\tLAB11127R\tCASPOFUNGIN LEVEL\tCASPO\tCASPOFUNGIN (CANCIDAS)\t#VALUE!\t720490.5882\t0\tNone\tNone\t17\t12248340\t1.11E+13
+LAB BLOOD ORDERABLES\t471946\tLABCD34\tCD34 PANEL, BLOOD\tCD34DS\tDISCLAIMER\t#VALUE!\t25604.54545\t0\tNone\tNone\t66\t1689900\t1.43E+11
+LAB BLOOD ORDERABLES\t471965\tLABCFPT\tCF POLY T ANALYSIS\tCFPTDS\tDISCLAIMER\t#VALUE!\t595140\t0\tNone\tNone\t1\t595140\t3.54E+11
+LAB BLOOD ORDERABLES\t471965\tLABCFPT\tCF POLY T ANALYSIS\tCFPTIN\tINTERPRETED BY\t#VALUE!\t595140\t0\tNone\tNone\t1\t595140\t3.54E+11
+LAB BLOOD ORDERABLES\t471965\tLABCFPT\tCF POLY T ANALYSIS\tCFPTME\tMETHOD\t#VALUE!\t595140\t0\tNone\tNone\t1\t595140\t3.54E+11
+LAB BLOOD ORDERABLES\t471965\tLABCFPT\tCF POLY T ANALYSIS\tCFPTRS\tRESULT\t#VALUE!\t595140\t0\tNone\tNone\t1\t595140\t3.54E+11
+LAB BLOOD ORDERABLES\t472016\tLABYCLAMP\tCHLAMYDIA SPECIES SEROLOGY FOR RESPIRATORY\tYCLAM1\tCHLAMYDIA SEROLOGY, S\t#VALUE!\t244670.7692\t0\tNone\tNone\t13\t3180720\t8.85E+11
+LAB BLOOD ORDERABLES\t472048\tLAB11124R\tCOCCIDIOIDES COMPLEMENT FIXATION, SERUM\tCOCFS\tCOCCI CF (SERUM)\t#VALUE!\t952080\t0\tNone\tNone\t7\t6664560\t6.51E+12
+LAB BLOOD ORDERABLES\t472048\tLABCOCFS\tCOCCIDIOIDES COMPLEMENT FIXATION, SERUM\tCOCFS\tCOCCI CF (SERUM)\t#VALUE!\t1082202.353\t0\tNone\tNone\t34\t36794880\t4.16E+13
+LAB BLOOD ORDERABLES\t472053\tLABYTICK\tCOLORADO TICK FEVER AB\tYTICK1\tIGG AB\t#VALUE!\t829560\t0\tNone\tNone\t1\t829560\t6.88E+11
+LAB BLOOD ORDERABLES\t472053\tLABYTICK\tCOLORADO TICK FEVER AB\tYTICK2\tIGM AB\t#VALUE!\t829560\t0\tNone\tNone\t1\t829560\t6.88E+11
+LAB BLOOD ORDERABLES\t472053\tLABYTICK\tCOLORADO TICK FEVER AB\tYTICK3\tINTERPRETATION\t#VALUE!\t829560\t0\tNone\tNone\t1\t829560\t6.88E+11
+LAB BLOOD ORDERABLES\t472057\tLABVP4\tCOMP HEPATITIS PANEL\tHBSAQL\tHEP B SURF AB QUAL\t#VALUE!\t200741.1086\t0\tNone\tNone\t451\t90534240\t2.96E+13
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMP HEPATITIS PANEL\tHAGINT\tINTERPRETATION\t#VALUE!\t19380\t0\tNone\tNone\t1\t19380\t375584400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMP HEPATITIS PANEL\tHATINT\tINTERPRETATION\t#VALUE!\t223680\t0\tNone\tNone\t4\t894720\t2.54E+11
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMP HEPATITIS PANEL\tHBSAQL\tHEP B SURF AB QUAL\t#VALUE!\t182820\t0\tNone\tNone\t5\t914100\t2.55E+11
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMP HEPATITIS PANEL\tHBSINT\tINTERPRETATION\t#VALUE!\t182820\t0\tNone\tNone\t5\t914100\t2.55E+11
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMP HEPATITIS PANEL\tHBTINT\tINTERPRETATION\t#VALUE!\t182820\t0\tNone\tNone\t5\t914100\t2.55E+11
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMP HEPATITIS PANEL\tHCVI\tINTERPRETATION\t#VALUE!\t182820\t0\tNone\tNone\t5\t914100\t2.55E+11
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHATINT\tINTERPRETATION\t#VALUE!\t56580\t0\tNone\tNone\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHBSINT\tINTERPRETATION\t#VALUE!\t56580\t0\tNone\tNone\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHBTINT\tINTERPRETATION\t#VALUE!\t56580\t0\tNone\tNone\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472057\tLABVP5\tCOMPREHENSIVE HEPATITIS PANEL\tHCVI\tINTERPRETATION\t#VALUE!\t56580\t0\tNone\tNone\t1\t56580\t3201296400
+LAB BLOOD ORDERABLES\t472102\tLAB11056R\tCORTISOL FREE, SERUM\tCORTFREE\tCORTISOL, SERUM FREE\t#VALUE!\t426930\t0\tNone\tNone\t4\t1707720\t7.56E+11
+LAB BLOOD ORDERABLES\t472102\tLABSFCORT\tCORTISOL FREE, SERUM\tCORTFREE\tCORTISOL, SERUM FREE\t#VALUE!\t462558.4615\t0\tNone\tNone\t26\t12026520\t6.85E+12
+LAB BLOOD ORDERABLES\t472107\tLABCRTINE\tCREATINE, SERUM\tCRTNR\tCREATINE, PLASMA\t#VALUE!\t1224687.273\t0\tNone\tNone\t11\t13471560\t2.12E+13
+LAB BLOOD ORDERABLES\t472118\tLABYEPIAB\tCUTANEOUS IMMUNOFLUOR AB\tBMAB\tBASEMENT MEMBRANE, IGG\t#VALUE!\t404940\t0\tNone\tNone\t1\t404940\t1.64E+11
+LAB BLOOD ORDERABLES\t472118\tLABYEPIAB\tCUTANEOUS IMMUNOFLUOR AB\tYEP1\tCELL SURFACE AB IGG\t#VALUE!\t404940\t0\tNone\tNone\t1\t404940\t1.64E+11
+LAB BLOOD ORDERABLES\t472118\tLABYEPIAB\tCUTANEOUS IMMUNOFLUOR AB\tYEP3\tMONKEY ESOPHAGUS IGG\t#VALUE!\t404940\t0\tNone\tNone\t1\t404940\t1.64E+11
+LAB BLOOD ORDERABLES\t472118\tLABYEPIAB\tCUTANEOUS IMMUNOFLUOR AB\tYEP4\tHUMAN SPLIT SKIN IGG\t#VALUE!\t404940\t0\tNone\tNone\t1\t404940\t1.64E+11
+LAB BLOOD ORDERABLES\t472118\tLABYEPIAB\tCUTANEOUS IMMUNOFLUOR AB\tYEP5\tOTHER\t#VALUE!\t404940\t0\tNone\tNone\t1\t404940\t1.64E+11
+LAB BLOOD ORDERABLES\t472120\tLABCCP\tANTI CCP\tCCPINT\tINTERPRETATION\t#VALUE!\t296484\t0\tNone\tNone\t5\t1482420\t5.59E+11
+LAB BLOOD ORDERABLES\t472120\tLABYCCPIG\tANTI CCP\tCCPINT\tINTERPRETATION\t#VALUE!\t388985.2294\t0\tNone\tNone\t218\t84798780\t4.31E+13
+LAB BLOOD ORDERABLES\t472123\tLABCF32\tCYSTIC FIBROSIS MUTATION STUDY\tCF32DI\tDISCLAIMER:\t#VALUE!\t807004.6154\t0\tNone\tNone\t39\t31473180\t3.43E+13
+LAB BLOOD ORDERABLES\t472123\tLABCF32\tCYSTIC FIBROSIS MUTATION STUDY\tCF32IN\tINTERPRETED BY\t#VALUE!\t807004.6154\t0\tNone\tNone\t39\t31473180\t3.43E+13
+LAB BLOOD ORDERABLES\t472123\tLABCF32\tCYSTIC FIBROSIS MUTATION STUDY\tCF32ME\tMETHOD:\t#VALUE!\t807004.6154\t0\tNone\tNone\t39\t31473180\t3.43E+13
+LAB BLOOD ORDERABLES\t472125\tLABCYSBLD\tCYSTICERCUS AB REFLEX PANEL, SERUM\tCYSAB2\tCYSTICERCUS AB (SERUM), ELISA\t#VALUE!\t307886.087\t0\tNone\tNone\t23\t7081380\t2.77E+12
+LAB BLOOD ORDERABLES\t472127\tLABCYSI\tCYSTICERCOSIS, CSF AND SERUM\tCYSS\tCYSTICERCOSIS-SERUM\t#VALUE!\t1266680\t0\tNone\tNone\t3\t3800040\t6.75E+12
+LAB BLOOD ORDERABLES\t472180\tLABADIFF\tDIFFERENTIAL\tPSREV\tPATH/SPEC REVIEW\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472180\tLABADIFF\tDIFFERENTIAL\tSIGNIF\tSIGNIFICANT ABNORMALITIES\t#VALUE!\t900\t0\tNone\tNone\t1\t900\t810000
+LAB BLOOD ORDERABLES\t472181\tLABADIFFS\tDIFFERENTIAL AND SLIDE REVIEW\tSIGNIF\tSIGNIFICANT ABNORMALITIES\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472192\tLABDATLA\tDIRECT ANTIGLOBULIN TEST - LARC\tDATLAR\tDIRECT COOMBS - LA RED CROSS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472205\tLABYDISO\tDISOPYRAMIDE, SERUM\tYDISO1\tDISOPYRAMIDE, P\t#VALUE!\t8520\t0\tNone\tNone\t1\t8520\t72590400
+LAB BLOOD ORDERABLES\t472226\tLABDHB\tDONOR HEPATITIS B SURFACE AG\tDHB\tDONOR HEP B SURF. AG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472227\tLABDHEPC\tDONOR HEPATITIS C AB\tDHEPC\tDONOR HEPATITIS C AB\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472228\tLABDHIVB\tDONOR HIV AB\tDHTLV\tDONOR HIV AB COMMENT\t#VALUE!\t199937.1429\t0\tNone\tNone\t7\t1399560\t3.32E+11
+LAB BLOOD ORDERABLES\t472248\tLABYSDA\tDRUG SCREEN, PLASMA\t11832R\tDRUGS DETECTED:\t#VALUE!\t242828.4375\t0\tNone\tNone\t64\t15541020\t1.07E+13
+LAB BLOOD ORDERABLES\t472248\tLABYSDA\tDRUG SCREEN, PLASMA\tDRUGSCRN\tDRUG SCREEN, PLASMA\t#VALUE!\t645556.1538\t0\tNone\tNone\t26\t16784460\t4.16E+13
+LAB BLOOD ORDERABLES\t472251\tLABYAMEB\tE. HISTOLYTICA AB\tYAMEB1\tE. HISTOLYTICA AB\t#VALUE!\t332553.75\t0\tNone\tNone\t16\t5320860\t2.02E+12
+LAB BLOOD ORDERABLES\t472276\tLABECHIG\tECHINOCOCCUS AB, IGG W/REFLEX\tECHIND\tECHINOCOCCUS LGG\t#VALUE!\t287613.3333\t0\tNone\tNone\t9\t2588520\t8.75E+11
+LAB BLOOD ORDERABLES\t472328\tLABYESTRI\tESTRIOL FREE\tYESTR1\tESTRIOL,UNCONJUGATED\t#VALUE!\t154380\t0\tNone\tNone\t1\t154380\t23833184400
+LAB BLOOD ORDERABLES\t472330\tLABYESTRN\tESTRONE, SERUM\tESTRONE\tESTRONE\t#VALUE!\t270300\t0\tNone\tNone\t1\t270300\t73062090000
+LAB BLOOD ORDERABLES\t472347\tLABLEID\tFACTOR V LEIDEN\tLEIDIS\tDISCLAIMER\t#VALUE!\t436344.1652\t0\tNone\tNone\t581\t253515960\t1.44E+14
+LAB BLOOD ORDERABLES\t472359\tLAB11116R\tFANCONI MUTATION ANALYSIS\tGFANCO\tFANCONI AN. GP C MUT\t#VALUE!\t1312400\t0\tNone\tNone\t3\t3937200\t5.30E+12
+LAB BLOOD ORDERABLES\t472365\tLABYLCFA\tFATTY ACID PROF PEROXIDASE (C22 - C26)\tYLCFA9\tCOMMENT\t#VALUE!\t342450\t0\tNone\tNone\t2\t684900\t2.36E+11
+LAB BLOOD ORDERABLES\t472379\tLABFIBRO\tFIBROSPECT FOR LIVER FIBROSIS\tFIBROR\tFIBROSPECT FOR LIV\t#VALUE!\t1223280\t0\tNone\tNone\t2\t2446560\t3.14E+12
+LAB BLOOD ORDERABLES\t472380\tLABFILAB\tFILARIA IGG4 AB ELISA\tFILIG4\tFILARIAL LGG ANTIBODY\t#VALUE!\t476850.9677\t0\tNone\tNone\t31\t14782380\t9.47E+12
+LAB BLOOD ORDERABLES\t472414\tLABITCH\tFOOD ALLERGY SCREEN\tITINT\tINTERPRETATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472420\tLABFRAGX\tFRAGILE X\tFXDIS\tDISCLAIMER\t#VALUE!\t1777160\t0\tNone\tNone\t3\t5331480\t1.17E+13
+LAB BLOOD ORDERABLES\t472420\tLABFRAGX\tFRAGILE X\tFXINT\tINTERPRETATION\t#VALUE!\t1777160\t0\tNone\tNone\t3\t5331480\t1.17E+13
+LAB BLOOD ORDERABLES\t472420\tLABFRAGX\tFRAGILE X\tFXMD\tINTERPRETED BY\t#VALUE!\t1777160\t0\tNone\tNone\t3\t5331480\t1.17E+13
+LAB BLOOD ORDERABLES\t472420\tLABFRAGX\tFRAGILE X\tFXMET\tMETHOD\t#VALUE!\t1777160\t0\tNone\tNone\t3\t5331480\t1.17E+13
+LAB BLOOD ORDERABLES\t472422\tLABYT7P\tFREE THYROXINE INDEX\tFT4INDEX\tFREE THYROXINE INDEX\t#VALUE!\t146604\t0\tNone\tNone\t5\t733020\t1.21E+11
+LAB BLOOD ORDERABLES\t472428\tLABFUNDAP\tFUNGAL DISEASE AB PANEL\tASPR\tASPERILLUS-CF\t#VALUE!\t360680\t0\tNone\tNone\t6\t2164080\t8.46E+11
+LAB BLOOD ORDERABLES\t472428\tLABFUNDAP\tFUNGAL DISEASE AB PANEL\tBLAS\tBLASTO AB CFS\t#VALUE!\t360680\t0\tNone\tNone\t6\t2164080\t8.46E+11
+LAB BLOOD ORDERABLES\t472428\tLABFUNDAP\tFUNGAL DISEASE AB PANEL\tHISTM\tHISTO MYCELIAL PHASE\t#VALUE!\t360680\t0\tNone\tNone\t6\t2164080\t8.46E+11
+LAB BLOOD ORDERABLES\t472430\tLAB11128R\tFUNGAL MIC\tFMIC\tFUNGAL MIC\t#VALUE!\t1068060\t0\tNone\tNone\t1\t1068060\t1.14E+12
+LAB BLOOD ORDERABLES\t472471\tLABGTOL\tGLUCOSE TOLERANCE\tGTTINT\tGTT INTERPRETATION\t#VALUE!\t29820\t0\tNone\tNone\t1\t29820\t889232400
+LAB BLOOD ORDERABLES\t472487\tLABYHALO\tHALOPERIDOL, SERUM\tHALO\tHALOPERIDOL\t#VALUE!\t437280\t0\tNone\tNone\t1\t437280\t1.91E+11
+LAB BLOOD ORDERABLES\t472487\tLABYHALO\tHALOPERIDOL, SERUM\tYHALO2\tREDUCED HALOPERIDOL\t#VALUE!\t437280\t0\tNone\tNone\t1\t437280\t1.91E+11
+LAB BLOOD ORDERABLES\t472493\tLABHDLGGE\tHDL GRADIENT GEL ELECTROPHORESIS\tHDLGE\tHDL GRAD GEL ELECTRO\t#VALUE!\t1547100\t0\tNone\tNone\t1\t1547100\t2.39E+12
+LAB BLOOD ORDERABLES\t472502\tLABHCHGA\tHEMOCHROMATOSIS GENOTYPING ANALYSIS\tHCHCO\tCOMMENT\t#VALUE!\t604041.4286\t0\tNone\tNone\t14\t8456580\t6.01E+12
+LAB BLOOD ORDERABLES\t472502\tLABHCHGA\tHEMOCHROMATOSIS GENOTYPING ANALYSIS\tHCHDI\tDISCLAIMER\t#VALUE!\t604041.4286\t0\tNone\tNone\t14\t8456580\t6.01E+12
+LAB BLOOD ORDERABLES\t472502\tLABHCHGA\tHEMOCHROMATOSIS GENOTYPING ANALYSIS\tHCHIN\tINTERPRETATION\t#VALUE!\t604041.4286\t0\tNone\tNone\t14\t8456580\t6.01E+12
+LAB BLOOD ORDERABLES\t472502\tLABHCHGA\tHEMOCHROMATOSIS GENOTYPING ANALYSIS\tHCHMD\tINTERPRETED BY\t#VALUE!\t604041.4286\t0\tNone\tNone\t14\t8456580\t6.01E+12
+LAB BLOOD ORDERABLES\t472502\tLABHCHGA\tHEMOCHROMATOSIS GENOTYPING ANALYSIS\tHCHME\tMETHOD\t#VALUE!\t604041.4286\t0\tNone\tNone\t14\t8456580\t6.01E+12
+LAB BLOOD ORDERABLES\t472502\tLABHCHGA\tHEMOCHROMATOSIS GENOTYPING ANALYSIS\tHCHPR\tPRIMERS\t#VALUE!\t604041.4286\t0\tNone\tNone\t14\t8456580\t6.01E+12
+LAB BLOOD ORDERABLES\t472502\tLABHCHGA\tHEMOCHROMATOSIS GENOTYPING ANALYSIS\tHCHRE\tRESULT\t#VALUE!\t604041.4286\t0\tNone\tNone\t14\t8456580\t6.01E+12
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tDIAG. HEPATITIS B PANEL\tHBSAQL\tHEP B SURF AB QUAL\t#VALUE!\t70359.66102\t0\tNone\tNone\t413\t29058540\t4.09E+12
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBCINT\tINTERPRETATION\t#VALUE!\t129980\t0\tNone\tNone\t9\t1169820\t3.51E+11
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBSAQL\tHEP B SURF AB QUAL\t#VALUE!\t290760\t0\tNone\tNone\t1\t290760\t84541377600
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBSINT\tINTERPRETATION\t#VALUE!\t129980\t0\tNone\tNone\t9\t1169820\t3.51E+11
+LAB BLOOD ORDERABLES\t472522\tLABDGHBP\tHEPATITIS B DIAGNOSTIC PANEL\tHBTINT\tINTERPRETATION\t#VALUE!\t129980\t0\tNone\tNone\t9\t1169820\t3.51E+11
+LAB BLOOD ORDERABLES\t472523\tLAB11106R\tHEPATITIS B E AB\tHBEAB\tHEPATITIS B E AB\t#VALUE!\t895680\t0\tNone\tNone\t2\t1791360\t2.45E+12
+LAB BLOOD ORDERABLES\t472523\tLABHEAB\tHEPATITIS B E AB\tHBEAB\tHEPATITIS B E AB\t#VALUE!\t281130\t0\tNone\tNone\t2\t562260\t1.58E+11
+LAB BLOOD ORDERABLES\t472524\tLAB11107R\tHEPATITIS B E AG\tHBEAG\tHEPATITIS B E AG\t#VALUE!\t1544340\t0\tNone\tNone\t1\t1544340\t2.38E+12
+LAB BLOOD ORDERABLES\t472524\tLABHEAG\tHEPATITIS B E AG\tHBEAG\tHEPATITIS B E AG\t#VALUE!\t248520\t0\tNone\tNone\t4\t994080\t2.70E+11
+LAB BLOOD ORDERABLES\t472526\tLABHBSQT\tANTI HBS QUANT\tHBSAB\tHBS ANTIBODY, S\t#VALUE!\t125880\t0\tNone\tNone\t5\t629400\t82853755200
+LAB BLOOD ORDERABLES\t472526\tLABHBSQT\tHEPATITIS B SURFACE AB QUANTITATIVE\tHBSAB\tHBS ANTIBODY, S\t#VALUE!\t140700\t0\tNone\tNone\t1\t140700\t19796490000
+LAB BLOOD ORDERABLES\t472526\tLABHBSQT\tHEPATITIS B SURFACE AB QUANTITATIVE\tHBSABQUAL\tHBS ANTIBODY,QUANTITATIVE, S\t#VALUE!\t140700\t0\tNone\tNone\t1\t140700\t19796490000
+LAB BLOOD ORDERABLES\t472526\tLABHBSQT\tHEP B SURF AB QUANT\tHBSAB\tHBS ANTIBODY, S\t#VALUE!\t138684.5455\t0\tNone\tNone\t22\t3051060\t4.80E+11
+LAB BLOOD ORDERABLES\t472526\tLABHBSQT\tHEP B SURF AB QUANT\tHBSAIN\tINTERPRETATION\t#VALUE!\t43043.64407\t0\tNone\tNone\t236\t10158300\t7.64E+11
+LAB BLOOD ORDERABLES\t472526\tLABHBSQT\tHEP B SURF AB QUANT\tHBSAQL\tHEP B SURF AB QUAL\t#VALUE!\t43043.64407\t0\tNone\tNone\t236\t10158300\t7.64E+11
+LAB BLOOD ORDERABLES\t472526\tLABYHABQ\tANTI HBS QUANT\tHBSAB\tHBS ANTIBODY, S\t#VALUE!\t155980\t0\tNone\tNone\t63\t9826740\t1.82E+12
+LAB BLOOD ORDERABLES\t472526\tLABYHABQ\tHEPATITIS B SURFACE AB QUANTITATIVE\tHBSAB\tHBS ANTIBODY, S\t#VALUE!\t174097.8947\t0\tNone\tNone\t38\t6615720\t1.31E+12
+LAB BLOOD ORDERABLES\t472526\tLABYHABQ\tHEPATITIS B SURFACE AB QUANTITATIVE\tHBSABQUAL\tHBS ANTIBODY,QUANTITATIVE, S\t#VALUE!\t174097.8947\t0\tNone\tNone\t38\t6615720\t1.31E+12
+LAB BLOOD ORDERABLES\t472526\tLABYHABQ\tHEP B SURF AB QUANT\tHBSAB\tHBS ANTIBODY, S\t#VALUE!\t161105.0602\t0\tNone\tNone\t166\t26743440\t5.04E+12
+LAB BLOOD ORDERABLES\t472536\tLABHGBFQ\tHGB F QUANTITATIVE\tHGFMD\tREVIEWED BY\t#VALUE!\t434820\t0\tNone\tNone\t3\t1304460\t5.86E+11
+LAB BLOOD ORDERABLES\t472538\tLABHGHPLC\tHGB QUANTITATIVE / FRACTIONATED HPLC\tHGMD\tREVIEWED BY\t#VALUE!\t426444.5714\t0\tNone\tNone\t105\t44776680\t2.79E+13
+LAB BLOOD ORDERABLES\t472549\tLABYHIST\tHISTOPLASMA AB SCREEN\tYHIS1\tHISTOPLASMA AB SCREEN\t#VALUE!\t172041\t0\tNone\tNone\t20\t3440820\t6.83E+11
+LAB BLOOD ORDERABLES\t472571\tLAB11137R\tHSV AB, IMMUNOBLOT\tHSVWB\tHSV WESTERN BLOT\t#VALUE!\t1094730\t0\tNone\tNone\t2\t2189460\t2.40E+12
+LAB BLOOD ORDERABLES\t472573\tLAB11136R\tHTLV-1 AB SCREEN\tHTLVS\tHTLV AB SCREEN\t#VALUE!\t275580\t0\tNone\tNone\t2\t551160\t1.53E+11
+LAB BLOOD ORDERABLES\t472573\tLABHTLVS\tHTLV-1 AB SCREEN\tHTLVS\tHTLV AB SCREEN\t#VALUE!\t350712\t0\tNone\tNone\t5\t1753560\t6.93E+11
+LAB BLOOD ORDERABLES\t472578\tLABHUNDNA\tHUNTINGTON\'S DNA\tHNDNA\tHUNTINGTON\'S DNA\t#VALUE!\t734460\t0\tNone\tNone\t2\t1468920\t2.16E+12
+LAB BLOOD ORDERABLES\t472595\tLABYSCERE\tINFLAMM. BOWEL DISEASE PANEL,S\tNEUTAB\tNEUTROPHIL SPECIFIC ANTIBODIES\t#VALUE!\t232440\t0\tNone\tNone\t3\t697320\t1.65E+11
+LAB BLOOD ORDERABLES\t472631\tLABIFEDE\tIMMUNOFIXATION IGD AND IGE, SERUM\tIFED\tIMMUNOFIXATION IGD\t#VALUE!\t466232\t0\tNone\tNone\t15\t6993480\t7.80E+12
+LAB BLOOD ORDERABLES\t472631\tLABIFEDE\tIMMUNOFIXATION IGD AND IGE, SERUM\tIFEE\tIMMUNOFIXATION IGE\t#VALUE!\t466232\t0\tNone\tNone\t15\t6993480\t7.80E+12
+LAB BLOOD ORDERABLES\t472632\tLABIMM1\tIMMUNOLOGY PANEL 1\tANAINTERP\tANA INTERPRETATION\t#VALUE!\t272940\t0\tNone\tNone\t2\t545880\t1.64E+11
+LAB BLOOD ORDERABLES\t472632\tLABIMM1\tIMMUNOLOGY PANEL 1\tDNAINT\tINTERPRETATION\t#VALUE!\t272940\t0\tNone\tNone\t2\t545880\t1.64E+11
+LAB BLOOD ORDERABLES\t472633\tLABIMM2\tIMMUNOLOGY PANEL 2\tANAINTERP\tANA INTERPRETATION\t#VALUE!\t311100\t0\tNone\tNone\t2\t622200\t2.23E+11
+LAB BLOOD ORDERABLES\t472633\tLABIMM2\tIMMUNOLOGY PANEL 2\tRHFINT\tINTERPRETATION\t#VALUE!\t311100\t0\tNone\tNone\t2\t622200\t2.23E+11
+LAB BLOOD ORDERABLES\t472661\tLABYNABF\tINTERFERON NEUTRALIZING AB\tYNABF1\tINTERFERON NEUTRALIZING AB\t#VALUE!\t1388400\t0\tNone\tNone\t1\t1388400\t1.93E+12
+LAB BLOOD ORDERABLES\t472666\tLABYIFBA\tINTRINSIC FACTOR BLOCKING AB\tYIFB1\tINTRINSIC FACTOR BLOCKING AB\t#VALUE!\t238970\t0\tNone\tNone\t36\t8602920\t5.74E+12
+LAB BLOOD ORDERABLES\t472666\tLABYIFBA\tINTRINSIC FACTOR BLOCKING AB\tYIFB2\tCOMMENT\t#VALUE!\t172041.6\t0\tNone\tNone\t25\t4301040\t8.33E+11
+LAB BLOOD ORDERABLES\t472672\tLABISOHTI\tISOHEMAGGLUTININ TITER\tISOHTR\tISOHEMAGGLUTININ TITER RESULT\t#VALUE!\t22077.33333\t0\tNone\tNone\t90\t1986960\t1.89E+11
+LAB BLOOD ORDERABLES\t472696\tLABJAK2\tJANUS KINASE 2 V617F MUTATION, BLOOD\tJAKCO\tCOMMENT\t#VALUE!\t548376\t0\tNone\tNone\t115\t63063240\t4.39E+13
+LAB BLOOD ORDERABLES\t472696\tLABJAK2\tJANUS KINASE 2 V617F MUTATION, BLOOD\tJAKDI\tDISCLAIMER\t#VALUE!\t557059.322\t0\tNone\tNone\t118\t65733000\t4.63E+13
+LAB BLOOD ORDERABLES\t472696\tLABJAK2\tJANUS KINASE 2 V617F MUTATION, BLOOD\tJAKDX\tCLINICAL INDICATION\t#VALUE!\t557059.322\t0\tNone\tNone\t118\t65733000\t4.63E+13
+LAB BLOOD ORDERABLES\t472696\tLABJAK2\tJANUS KINASE 2 V617F MUTATION, BLOOD\tJAKIN\tINTERPRETATION\t#VALUE!\t889920\t0\tNone\tNone\t3\t2669760\t2.42E+12
+LAB BLOOD ORDERABLES\t472696\tLABJAK2\tJANUS KINASE 2 V617F MUTATION, BLOOD\tJAKME\tMETHOD\t#VALUE!\t557059.322\t0\tNone\tNone\t118\t65733000\t4.63E+13
+LAB BLOOD ORDERABLES\t472696\tLABJAK2\tJANUS KINASE 2 V617F MUTATION, BLOOD\tJAKRF\tREFERENCES\t#VALUE!\t548376\t0\tNone\tNone\t115\t63063240\t4.39E+13
+LAB BLOOD ORDERABLES\t472697\tLABNJAK2\tJANUS KINASE 2 V617F MUTATION, NON-BLOOD\tNJAKCO\tCOMMENT\t#VALUE!\t526447.5\t0\tNone\tNone\t8\t4211580\t2.86E+12
+LAB BLOOD ORDERABLES\t472697\tLABNJAK2\tJANUS KINASE 2 V617F MUTATION, NON-BLOOD\tNJAKDI\tDISCLAIMER\t#VALUE!\t525786.6667\t0\tNone\tNone\t9\t4732080\t3.13E+12
+LAB BLOOD ORDERABLES\t472697\tLABNJAK2\tJANUS KINASE 2 V617F MUTATION, NON-BLOOD\tNJAKDX\tCLINICAL INDICATION\t#VALUE!\t525786.6667\t0\tNone\tNone\t9\t4732080\t3.13E+12
+LAB BLOOD ORDERABLES\t472697\tLABNJAK2\tJANUS KINASE 2 V617F MUTATION, NON-BLOOD\tNJAKME\tMETHOD\t#VALUE!\t525786.6667\t0\tNone\tNone\t9\t4732080\t3.13E+12
+LAB BLOOD ORDERABLES\t472697\tLABNJAK2\tJANUS KINASE 2 V617F MUTATION, NON-BLOOD\tNJAKRF\tREFERENCES\t#VALUE!\t526447.5\t0\tNone\tNone\t8\t4211580\t2.86E+12
+LAB BLOOD ORDERABLES\t472717\tLABKBST\tKLEIHAUER - BETKE STAIN\tKBSINT\tINTERPRETATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t472724\tLABYLEPT\tLEPTOSPIROSIS AB\tYLEP1\tLEPTOSPIRA AB\t#VALUE!\t312504.6429\t0\tNone\tNone\t56\t17500260\t6.19E+12
+LAB BLOOD ORDERABLES\t472727\tLABYLDISO\tLD ISOENZYMES\tYLDIS2\tLD ISOENZYMES, S\t#VALUE!\t234468\t0\tNone\tNone\t5\t1172340\t2.91E+11
+LAB BLOOD ORDERABLES\t472745\tLABYLEGS\tLEGIONELLA PNEUMOPHILA, AB\tYLEGS1\tLEGIONELLA PNEUMOPHILA AB\t#VALUE!\t256849.7561\t0\tNone\tNone\t41\t10530840\t3.34E+12
+LAB BLOOD ORDERABLES\t472746\tLABLEISAB\tLEISHMANIA AB, IFA\t12431R\tINTERPRETATION\t#VALUE!\t323840\t0\tNone\tNone\t3\t971520\t3.52E+11
+LAB BLOOD ORDERABLES\t472746\tLABLEISAB\tLEISHMANIA AB, IFA\tLTROIN\tINTERPRETATION\t#VALUE!\t1997181.818\t0\tNone\tNone\t11\t21969000\t9.76E+13
+LAB BLOOD ORDERABLES\t472747\tLABLEMSAB\tLEMS AUTOAB\tLEMS\tLEMS AUTOANTIBODY\t#VALUE!\t1501180\t0\tNone\tNone\t3\t4503540\t8.25E+12
+LAB BLOOD ORDERABLES\t472755\tLABLPDP\tLIPID PANEL PLUS RISK\tRCRSK\tREL. CARDIAC RISK\t#VALUE!\t66268.5\t0\tNone\tNone\t40\t2650740\t2.72E+11
+LAB BLOOD ORDERABLES\t472757\tLABLPDPC\tLIPID PLUS RISK PANEL WITH CALCULATED LDL\tRCRSK\tREL. CARDIAC RISK\t#VALUE!\t79623.67347\t0\tNone\tNone\t49\t3901560\t7.43E+11
+LAB BLOOD ORDERABLES\t472762\tLABLKMAB\tLIVER KID MICROSOME AB\tLKMAB\tLIV-KID-MICROSOME AB\t#VALUE!\t217920\t0\tNone\tNone\t5\t1089600\t2.48E+11
+LAB BLOOD ORDERABLES\t472777\tLABLMS\tLYMPHOCYTE MITOGEN SCREEN\tCONINT\tCON A INTERPRETATION\t#VALUE!\t771800\t0\tNone\tNone\t3\t2315400\t1.79E+12
+LAB BLOOD ORDERABLES\t472777\tLABLMS\tLYMPHOCYTE MITOGEN SCREEN\tPHAINT\tPHA INTERPRETATION\t#VALUE!\t771800\t0\tNone\tNone\t3\t2315400\t1.79E+12
+LAB BLOOD ORDERABLES\t472777\tLABLMS\tLYMPHOCYTE MITOGEN SCREEN\tPWMINT\tPWM INTERPRETATION\t#VALUE!\t771800\t0\tNone\tNone\t3\t2315400\t1.79E+12
+LAB BLOOD ORDERABLES\t472781\tLABMAGATH\tMAG AUTOAB\tMAGAB\tMAG AUTOANTIBODY\t#VALUE!\t4404444\t0\tNone\tNone\t5\t22022220\t1.81E+14
+LAB BLOOD ORDERABLES\t472818\tLABYMEM\tMEASLES AB, IGM\tYMEM1\tMEAS(RUBEOLA) AB,IGM\t#VALUE!\t253920\t0\tNone\tNone\t2\t507840\t1.39E+11
+LAB BLOOD ORDERABLES\t472834\tLABMELAS\tMELAS MTDNA PROFILE\tMELADN\tMELAS MTDNA PROFILE\t#VALUE!\t72540\t0\tNone\tNone\t1\t72540\t5262051600
+LAB BLOOD ORDERABLES\t472845\tLABYMETHS\tMETHSUXIMIDE\tMETHSX\tMETHSUXIMIDE\t#VALUE!\t1913310\t0\tNone\tNone\t2\t3826620\t8.10E+12
+LAB BLOOD ORDERABLES\t472846\tLABMTHFR\tMETHYLENE- THF REDUCTASE\tMTHCMT\tCOMMENT\t#VALUE!\t638456.25\t0\tNone\tNone\t16\t10215300\t8.63E+12
+LAB BLOOD ORDERABLES\t472846\tLABMTHFR\tMETHYLENE- THF REDUCTASE\tMTHDIR\tINTERPRETED BY\t#VALUE!\t584196\t0\tNone\tNone\t15\t8762940\t6.52E+12
+LAB BLOOD ORDERABLES\t472846\tLABMTHFR\tMETHYLENE- THF REDUCTASE\tMTHDIS\tDISCLAIMER\t#VALUE!\t638456.25\t0\tNone\tNone\t16\t10215300\t8.63E+12
+LAB BLOOD ORDERABLES\t472846\tLABMTHFR\tMETHYLENE- THF REDUCTASE\tMTHPRM\tPRIMERS\t#VALUE!\t638456.25\t0\tNone\tNone\t16\t10215300\t8.63E+12
+LAB BLOOD ORDERABLES\t472854\tLABMALL1\tMISCELLANEOUS ALLERGEN 1\tI1\tINTERPRETATION\t#VALUE!\t630540\t0\tNone\tNone\t4\t2522160\t2.43E+12
+LAB BLOOD ORDERABLES\t472855\tLABMALL2\tMISCELLANEOUS ALLERGEN 2\tALL2\tALLERGEN\t#VALUE!\t1370400\t0\tNone\tNone\t1\t1370400\t1.88E+12
+LAB BLOOD ORDERABLES\t472855\tLABMALL2\tMISCELLANEOUS ALLERGEN 2\tI2\tINTERPRETATION\t#VALUE!\t1370400\t0\tNone\tNone\t1\t1370400\t1.88E+12
+LAB BLOOD ORDERABLES\t472856\tLABMALL3\tMISCELLANEOUS ALLERGEN 3\tI3\tINTERPRETATION\t#VALUE!\t148680\t0\tNone\tNone\t1\t148680\t22105742400
+LAB BLOOD ORDERABLES\t472950\tLAB11048R\tNEURON AB\tNEURON\tNEURONAL CELL ABS, SERUM\t#VALUE!\t944775\t0\tNone\tNone\t4\t3779100\t4.58E+12
+LAB BLOOD ORDERABLES\t472958\tLABNBTS\tNITROBLUE TETRAZOLIUM RED\tNBTCO\tSTIM. CONTROL,NBT\t#VALUE!\t48930\t0\tNone\tNone\t2\t97860\t5243706000
+LAB BLOOD ORDERABLES\t472958\tLABNBTS\tNITROBLUE TETRAZOLIUM RED\tNBTCOM\tCOMMENT, NBT\t#VALUE!\t48930\t0\tNone\tNone\t2\t97860\t5243706000
+LAB BLOOD ORDERABLES\t473042\tLABOF\tOSMOTIC FRAGILITY\tOFDIR\tREVIEWED BY\t#VALUE!\t418596\t0\tNone\tNone\t10\t4185960\t2.53E+12
+LAB BLOOD ORDERABLES\t473054\tLABPAI1AT\tPAI-1 ACTIVITY\tPAI1T\tPAI-1 ACTIVITY\t#VALUE!\t1999356\t0\tNone\tNone\t5\t9996780\t5.51E+13
+LAB BLOOD ORDERABLES\t473055\tLABPAI1AG\tPAI-1 AG\tPAI1G\tPAI-1 ANTIGEN\t#VALUE!\t1906800\t0\tNone\tNone\t1\t1906800\t3.64E+12
+LAB BLOOD ORDERABLES\t473064\tLABYPCA\tPARIETAL CELL AB, SERUM\tYPCA\tPARIETAL CELL AB\t#VALUE!\t261540\t0\tNone\tNone\t1\t261540\t68403171600
+LAB BLOOD ORDERABLES\t473111\tLABPLTFUN\tPLATELET FUNCTION SCREEN\tPLTFCM\tCOMMENT, PLT FUNCTION\t#VALUE!\t12280.51948\t0\tNone\tNone\t154\t1891200\t1.58E+11
+LAB BLOOD ORDERABLES\t473148\tLABPRO6MP\tPRO-PREDICT ENZACT\tPRO6MR\tPRO-PREDICT ENZACT\t#VALUE!\t621850.9091\t0\tNone\tNone\t11\t6840360\t5.42E+12
+LAB BLOOD ORDERABLES\t473177\tLABPT12\tPROTHROMBIN FRAGMENT 1 AND 2\tPTFRNO\tPROTHROMBIN 1+2 NOTE\t#VALUE!\t1072470\t0\tNone\tNone\t4\t4289880\t5.93E+12
+LAB BLOOD ORDERABLES\t473179\tLABP20210\tPROTHROMBIN 20210A\tPTCMT\tCOMMENT\t#VALUE!\t452558.7763\t0\tNone\tNone\t523\t236688240\t1.36E+14
+LAB BLOOD ORDERABLES\t473179\tLABP20210\tPROTHROMBIN 20210A\tPTDIS\tDISCLAIMER\t#VALUE!\t452558.7763\t0\tNone\tNone\t523\t236688240\t1.36E+14
+LAB BLOOD ORDERABLES\t473179\tLABP20210\tPROTHROMBIN 20210A\tPTPRM\tPRIMERS\t#VALUE!\t452558.7763\t0\tNone\tNone\t523\t236688240\t1.36E+14
+LAB BLOOD ORDERABLES\t473200\tLABQFTBG\tQUANTIFERON TEST FOR LATENT TB\tQTFNIN\tQUANTIFERON INTERPRETATION\t#VALUE!\t183897.5\t0\tNone\tNone\t24\t4413540\t8.77E+11
+LAB BLOOD ORDERABLES\t473211\tLABRBCMOR\tRBC MORPHLOGY, COMPLETE\tPSREV\tPATH/SPEC REVIEW\t#VALUE!\t5640\t0\tNone\tNone\t1\t5640\t31809600
+LAB BLOOD ORDERABLES\t473216\tLABRBCENZ\tRED CELL ENZYMES\tRBCINT\tINTERPRETATION\t#VALUE!\t288690\t0\tNone\tNone\t2\t577380\t3.33E+11
+LAB BLOOD ORDERABLES\t473216\tLABRBCENZ\tRED CELL ENZYMES\tRBCMD\tREVIEWED BY\t#VALUE!\t288690\t0\tNone\tNone\t2\t577380\t3.33E+11
+LAB BLOOD ORDERABLES\t473253\tLABYRETAB\tRETICULIN AB\tYRET1\tRETICULIN AB\t#VALUE!\t167400\t0\tNone\tNone\t2\t334800\t56423095200
+LAB BLOOD ORDERABLES\t473262\tLABRF\tRHEUMATOID FACTOR\tRHFINT\tINTERPRETATION\t#VALUE!\t221510.8108\t0\tNone\tNone\t111\t24587700\t7.16E+12
+LAB BLOOD ORDERABLES\t473262\tLABRF\tRHUEMATOID FACTOR\tRHFINT\tINTERPRETATION\t#VALUE!\t239163.253\t0\tNone\tNone\t664\t158804400\t5.11E+13
+LAB BLOOD ORDERABLES\t473273\tLABRITUX\tRITUXAN PANEL\tRTXFDA\tNOTE\t#VALUE!\t131761.5464\t0\tNone\tNone\t194\t25561740\t4.96E+12
+LAB BLOOD ORDERABLES\t473282\tLABRUBG\tRUBELLA IGG ANTIBODY\tRUBINT\tINTERPRETATION\t#VALUE!\t132740\t0\tNone\tNone\t3\t398220\t70434939600
+LAB BLOOD ORDERABLES\t473297\tLABSNP\tSENSORIMOTOR PROFILE\tSNPRR\tSENSORIMOTOR PROFILE\t#VALUE!\t2310180\t0\tNone\tNone\t1\t2310180\t5.34E+12
+LAB BLOOD ORDERABLES\t473376\tLABSTRONG\tSTRONGYLOIDES IGG AB, ELISA\tSTROG\tSTRONGYLOIDES ,LGG\t#VALUE!\t261887.5962\t0\tNone\tNone\t208\t54472620\t1.88E+13
+LAB BLOOD ORDERABLES\t473380\tLABSULFAT\tSULFATIDE AUTOANTIBODY\tSULFAB\tSULFATIDE AUTOANTIBODY\t#VALUE!\t2153280\t0\tNone\tNone\t2\t4306560\t1.31E+13
+LAB BLOOD ORDERABLES\t473397\tLABT1418\tT(14\t18), BLOOD\tT14CMT\tCOMMENT\t#VALUE!\t1210908\t0\tNone\tNone\t5\t6054540\t9.00E+12
+LAB BLOOD ORDERABLES\t473397\tLABT1418\tT(14\t18), BLOOD\tT14DIR\tINTERPRETED BY\t#VALUE!\t1210908\t0\tNone\tNone\t5\t6054540\t9.00E+12
+LAB BLOOD ORDERABLES\t473397\tLABT1418\tT(14\t18), BLOOD\tT14DIS\tDISCLAIMER\t#VALUE!\t1210908\t0\tNone\tNone\t5\t6054540\t9.00E+12
+LAB BLOOD ORDERABLES\t473403\tLABT1517\tT(15\t17) PML/RAR, BLOOD\tT15DI\tDISCLAIMER\t#VALUE!\t643218\t0\tNone\tNone\t50\t32160900\t2.37E+13
+LAB BLOOD ORDERABLES\t473403\tLABT1517\tT(15\t17) PML/RAR, BLOOD\tT15MD\tINTERPRETED BY\t#VALUE!\t643218\t0\tNone\tNone\t50\t32160900\t2.37E+13
+LAB BLOOD ORDERABLES\t473403\tLABT1517\tT(15\t17) PML/RAR, BLOOD\tT15ME\tMETHOD\t#VALUE!\t643218\t0\tNone\tNone\t50\t32160900\t2.37E+13
+LAB BLOOD ORDERABLES\t473405\tLABTCLON\tT-CELL CLONALITY PCR, BLOOD\tTDIR\tINTERPRETED BY\t#VALUE!\t1027142.927\t0\tNone\tNone\t82\t84225720\t1.01E+14
+LAB BLOOD ORDERABLES\t473405\tLABTCLON\tT-CELL CLONALITY PCR, BLOOD\tTDIS\tDISCLAIMER\t#VALUE!\t1027142.927\t0\tNone\tNone\t82\t84225720\t1.01E+14
+LAB BLOOD ORDERABLES\t473446\tLABYTBG\tTHYROXINE BINDING GLOBULIN\tT4BG\tTHYROXINE-BIND GLOB\t#VALUE!\t93540\t0\tNone\tNone\t1\t93540\t8749731600
+LAB BLOOD ORDERABLES\t473457\tLAB11113R\tTOXOPLASMA AB, IGA\tTOXOA\tTOXO LGA ELISA\t#VALUE!\t1243440\t0\tNone\tNone\t3\t3730320\t4.67E+12
+LAB BLOOD ORDERABLES\t473459\tLABTXCAB\tTOXOCARA AB ELISA\tTOXOC1\tTOXOCARA ANTIBODY\t#VALUE!\t325583.0769\t0\tNone\tNone\t13\t4232580\t1.55E+12
+LAB BLOOD ORDERABLES\t473470\tLABGTT\tTRADITIONAL GLUCOSE TOLERANCE\tGTTINT\tGTT INTERPRETATION\t#VALUE!\t20572\t0\tNone\tNone\t30\t617160\t15849540000
+LAB BLOOD ORDERABLES\t473673\tLABTTM\tTRANSPLANT THERAPY MONITORING\tRTXFDA\tNOTE\t#VALUE!\t31387.60563\t0\tNone\tNone\t71\t2228520\t87338577600
+LAB BLOOD ORDERABLES\t473679\tLABTRICHG\tTRICHINELLA IGG AB ELISA\tTRICG\tTRICHINELLA, IGG\t#VALUE!\t401451.4286\t0\tNone\tNone\t7\t2810160\t1.32E+12
+LAB BLOOD ORDERABLES\t473685\tLABYCHAGA\tTRYPANOSOMA CRUZI AB, IGG\tYCHAG1\tTRYPANOSOMA CRUZI AB,IGG\t#VALUE!\t535260\t0\tNone\tNone\t48\t25692480\t1.71E+13
+LAB BLOOD ORDERABLES\t473690\tLABTTRMET\tAMYLOIDOSIS DNA TITER\tAMYLDO\tTTR AMYLOIDOSIS DNA\t#VALUE!\t5351415\t0\tNone\tNone\t4\t21405660\t1.96E+14
+LAB BLOOD ORDERABLES\t473749\tLABVHHA\tVH HYPERMUTATION ASSAY\tVHDI\tDISCLAIMER\t#VALUE!\t1766844\t0\tNone\tNone\t10\t17668440\t3.56E+13
+LAB BLOOD ORDERABLES\t473749\tLABVHHA\tVH HYPERMUTATION ASSAY\tVHDX\tCLINICAL INDICATION\t#VALUE!\t1766844\t0\tNone\tNone\t10\t17668440\t3.56E+13
+LAB BLOOD ORDERABLES\t473749\tLABVHHA\tVH HYPERMUTATION ASSAY\tVHIN\tINTERPRETATION\t#VALUE!\t1766844\t0\tNone\tNone\t10\t17668440\t3.56E+13
+LAB BLOOD ORDERABLES\t473749\tLABVHHA\tVH HYPERMUTATION ASSAY\tVHMD\tINTERPRETED BY\t#VALUE!\t1766844\t0\tNone\tNone\t10\t17668440\t3.56E+13
+LAB BLOOD ORDERABLES\t473749\tLABVHHA\tVH HYPERMUTATION ASSAY\tVHME\tMETHOD\t#VALUE!\t1766844\t0\tNone\tNone\t10\t17668440\t3.56E+13
+LAB BLOOD ORDERABLES\t473750\tLABNVHHA\tVH HYPERMUTATION ASSAY, NON-BLOOD\tNVHDI\tDISCLAIMER:\t#VALUE!\t3358860\t0\tNone\tNone\t1\t3358860\t1.13E+13
+LAB BLOOD ORDERABLES\t473750\tLABNVHHA\tVH HYPERMUTATION ASSAY, NON-BLOOD\tNVHDX\tCLINICAL IND\t#VALUE!\t3358860\t0\tNone\tNone\t1\t3358860\t1.13E+13
+LAB BLOOD ORDERABLES\t473750\tLABNVHHA\tVH HYPERMUTATION ASSAY, NON-BLOOD\tNVHIN\tINTERPRETATION\t#VALUE!\t3358860\t0\tNone\tNone\t1\t3358860\t1.13E+13
+LAB BLOOD ORDERABLES\t473750\tLABNVHHA\tVH HYPERMUTATION ASSAY, NON-BLOOD\tNVHMD\tINTERPRETED BY\t#VALUE!\t3358860\t0\tNone\tNone\t1\t3358860\t1.13E+13
+LAB BLOOD ORDERABLES\t473750\tLABNVHHA\tVH HYPERMUTATION ASSAY, NON-BLOOD\tNVHME\tMETHOD\t#VALUE!\t3358860\t0\tNone\tNone\t1\t3358860\t1.13E+13
+LAB BLOOD ORDERABLES\t473762\tLAB12586R\tVITAMIN B1\tYVB1W2\tCOMMENT\t#VALUE!\t322440\t0\tNone\tNone\t2\t644880\t2.21E+11
+LAB BLOOD ORDERABLES\t473763\tLAB11060R\tVITAMIN B1, PLASMA\tVITB1\tVITAMIN B1, PLASMA\t#VALUE!\t450630\t0\tNone\tNone\t2\t901260\t4.07E+11
+LAB BLOOD ORDERABLES\t473763\tLABVITB1P\tVITAMIN B1, PLASMA\tVITB1\tVITAMIN B1, PLASMA\t#VALUE!\t401070\t0\tNone\tNone\t8\t3208560\t1.34E+12
+LAB BLOOD ORDERABLES\t473775\tLAB12322R\tVON WILLEBRAND MULTIMERS\t12323R\tVON WILLEBRAND MULTIMERS\t#VALUE!\t678327.8571\t0\tNone\tNone\t28\t18993180\t1.56E+13
+LAB BLOOD ORDERABLES\t473775\tLAB12322R\tVON WILLEBRAND MULTIMERS\tYVWMR\tVON WILLEBRAND\t#VALUE!\t1322760\t0\tNone\tNone\t1\t1322760\t1.75E+12
+LAB BLOOD ORDERABLES\t473775\tLABYVWM\tVON WILLEBRAND MULTIMERS\tYVWMR\tVON WILLEBRAND\t#VALUE!\t940496.6667\t0\tNone\tNone\t18\t16928940\t1.85E+13
+LAB BLOOD ORDERABLES\t473778\tLABVWSCN\tVON WILLEBRAND SCREEN\tVWDIR\tINTERPRETED BY\t#VALUE!\t50682.5\t0\tNone\tNone\t24\t1216380\t92331061200
+LAB BLOOD ORDERABLES\t473779\tLAB12631R\tVORICONAZOLE LEVEL\tVORI\tVORICONAZOLE LEVEL\t#VALUE!\t438327.3529\t0\tNone\tNone\t68\t29806260\t1.55E+13
+LAB BLOOD ORDERABLES\t473779\tLABVORI\tVORICONAZOLE LEVEL\tVORI\tVORICONAZOLE LEVEL\t#VALUE!\t495083.3333\t0\tNone\tNone\t18\t8911500\t5.11E+12
+LAB BLOOD ORDERABLES\t473809\tLABYZINCS\tZINC\tZINC\tZINC\t#VALUE!\t224780\t0\tNone\tNone\t3\t674340\t1.79E+11
+LAB BLOOD ORDERABLES\t496771\tLABHELPM\tHELICOBACTER PYLORI IGM AB\tHELPM1\tH. PYLORI IGM ANTIBODY\t#VALUE!\t1694100\t0\tNone\tNone\t2\t3388200\t6.03E+12
+LAB BLOOD ORDERABLES\t496773\tLAB12585R\tHEPATITIS D RNA, QUAL PCR\t12594R\tHDV RNA\t#VALUE!\t302810\t0\tNone\tNone\t6\t1816860\t6.09E+11
+LAB BLOOD ORDERABLES\t496774\tLABHEVG\tHEPATITIS E AB IGG PANEL\tHEVG1\tHEPATITIS E AB IGG\t#VALUE!\t301350\t0\tNone\tNone\t8\t2410800\t7.68E+11
+LAB BLOOD ORDERABLES\t496775\tLABHEVM\tHEPATITIS E AB IGM PANEL\tHEVM1\tHEPATITIS E AB IGM\t#VALUE!\t290029.0909\t0\tNone\tNone\t11\t3190320\t9.72E+11
+LAB BLOOD ORDERABLES\t497189\tLABXAMH\tANTI - MULLERIAN HORMONE\tXAMHOR\tANTI-MULLERIAN HORMONE\t#VALUE!\t371580\t0\tNone\tNone\t1\t371580\t1.38E+11
+LAB BLOOD ORDERABLES\t497200\tLABXGAD65\tANTI GAD 65 ANTIBODIES\tXGADR\tANTI-GAD 65 ANTIBODIES\t#VALUE!\t584742\t0\tNone\tNone\t10\t5847420\t7.20E+12
+LAB BLOOD ORDERABLES\t497202\tLABXHIA\tHUMAN INSULIN ANTIBODY\tXHIAB\tHUMAN INSULIN ANTIBODY\t#VALUE!\t613744.6154\t0\tNone\tNone\t13\t7978680\t5.21E+12
+LAB BLOOD ORDERABLES\t497301\tLABAMLP\tAML PROGNOSIS ASSAY\tFLT3DS\tDISCLAIMER\t#VALUE!\t531220.8\t0\tNone\tNone\t175\t92963640\t6.34E+13
+LAB BLOOD ORDERABLES\t497301\tLABAMLP\tAML PROGNOSIS ASSAY\tFLT3IN\tINTERPRETATION\t#VALUE!\t531220.8\t0\tNone\tNone\t175\t92963640\t6.34E+13
+LAB BLOOD ORDERABLES\t497301\tLABAMLP\tAML PROGNOSIS ASSAY\tFLT3MD\tINTERPRETED BY\t#VALUE!\t536372.9825\t0\tNone\tNone\t171\t91719780\t6.29E+13
+LAB BLOOD ORDERABLES\t497301\tLABAMLP\tAML PROGNOSIS ASSAY\tFLT3MT\tMETHOD\t#VALUE!\t531220.8\t0\tNone\tNone\t175\t92963640\t6.34E+13
+LAB BLOOD ORDERABLES\t497337\tLABHBV\tHBV GENOTYPE: S AND POL GENE\tBCPMUT\tBCP MUTATIONS\t#VALUE!\t612900\t0\tNone\tNone\t1\t612900\t3.76E+11
+LAB BLOOD ORDERABLES\t497341\tLABCYAB\tCYSTICERCUS AB\tCYABS\tCYSTICERCUS AB\t#VALUE!\t302520\t0\tNone\tNone\t11\t3327720\t1.20E+12
+LAB BLOOD ORDERABLES\t497349\tLABWNVRNA\tWEST NILE VIRUS RNA, RT -PCR\tWNRNA\tWEST NILE VIRUS RNA\t#VALUE!\t219683.7209\t0\tNone\tNone\t43\t9446400\t2.67E+12
+LAB BLOOD ORDERABLES\t497351\tLABBARSAB\tBARTONELLA SPECIES AB\tBQIGMT\tB.QUINTANA IGM TITER\t#VALUE!\t1367760\t0\tNone\tNone\t7\t9574320\t4.56E+13
+LAB BLOOD ORDERABLES\t497394\tLABYPARVO\tPARVOVIRUS B19 IGG AND IGM AB\tYPARV3\tINTERPRETATION\t#VALUE!\t223791.6201\t0\tNone\tNone\t179\t40058700\t1.09E+13
+LAB BLOOD ORDERABLES\t497408\tLABYFACE\tFATTY ACID PROFILE ESSENTIAL\tYFAC23\tTRIENE TETRAENE RATIO\t#VALUE!\t504672\t0\tNone\tNone\t10\t5046720\t2.79E+12
+LAB BLOOD ORDERABLES\t497408\tLABYFACE\tFATTY ACID PROFILE ESSENTIAL\tYFAC30\tINTERPRETATION EFA\t#VALUE!\t504672\t0\tNone\tNone\t10\t5046720\t2.79E+12
+LAB BLOOD ORDERABLES\t497414\tLABFHAN\tHANTAVIRUS AB ELISA\tHANIGM\tHANTAVIRUS IGM\t#VALUE!\t223917.1429\t0\tNone\tNone\t21\t4702260\t1.18E+12
+LAB BLOOD ORDERABLES\t497416\tLABFEHRC\tEHRLICHIA CHAFFEENSIS AB\t12430R\tINTERPRETATION\t#VALUE!\t270420\t0\tNone\tNone\t3\t811260\t2.28E+11
+LAB BLOOD ORDERABLES\t497418\tLABFCYST\tCYSTICERCUS IGG AB\tBANDPRSNT\tBANDS PRESENT\t#VALUE!\t289800\t0\tNone\tNone\t4\t1159200\t3.98E+11
+LAB BLOOD ORDERABLES\t497430\tLABHEPDAB\tHEPATITIS D VIRUS AB TOTAL\tHEPD\tHEPATITIS D TOTAL\t#VALUE!\t347432.4324\t0\tNone\tNone\t37\t12855000\t5.46E+12
+LAB BLOOD ORDERABLES\t497436\tLABFECHO\tECHOVIRUS AB, SERUM\tTYPE30\tECHOVIRUS 30 AB\t#VALUE!\t325380\t0\tNone\tNone\t6\t1952280\t6.59E+11
+LAB BLOOD ORDERABLES\t497440\tLABFCHGA\tA. PHAGOCYTOPHILUM AB\tAPINT\tA.PHAGOCYTOPHILUM INTERPRETATION\t#VALUE!\t243480\t0\tNone\tNone\t2\t486960\t1.21E+11
+LAB BLOOD ORDERABLES\t497444\tLABEBVC\tEBV CAPSID AG\tVCAA\tVCA IGA\t#VALUE!\t253638.4615\t0\tNone\tNone\t13\t3297300\t9.44E+11
+LAB BLOOD ORDERABLES\t497444\tLABEBVC\tEBV VIRAL CAPSID ANTIGEN IGA\tVCAA\tVCA IGA\t#VALUE!\t208160\t0\tNone\tNone\t3\t624480\t1.36E+11
+LAB BLOOD ORDERABLES\t497456\tLABFQFVR\tCOXIELLA BURNETII AB\tQFVIN\tQ FEVER INTERPRETATION\t#VALUE!\t431808.2927\t0\tNone\tNone\t41\t17704140\t2.36E+13
+LAB BLOOD ORDERABLES\t497458\tLABFHHV6\tHERPES VIRUS 6 IGG AND IGM AB\t12431R\tINTERPRETATION\t#VALUE!\t282660\t0\tNone\tNone\t1\t282660\t79896675600
+LAB BLOOD ORDERABLES\t497458\tLABFHHV6\tHERPES VIRUS 6 IGG AND IGM AB\tLTROIN\tINTERPRETATION\t#VALUE!\t288270\t0\tNone\tNone\t18\t5188860\t1.84E+12
+LAB BLOOD ORDERABLES\t497460\tLABFRAB\tFRANCISELLA TULARENSIS AB\tFRANT\tFRANCISELLA TULARENSIS AB\t#VALUE!\t230423.0769\t0\tNone\tNone\t26\t5991000\t1.57E+12
+LAB BLOOD ORDERABLES\t497466\tLABFHVIG\tHIV 1 IGG-AB, WESTERN BLOT CONFIRM\tBANDPRSNT\tBANDS PRESENT\t#VALUE!\t392925\t0\tNone\tNone\t4\t1571700\t6.91E+11
+LAB BLOOD ORDERABLES\t497470\tLABYENTE\tYERSINIA ENTEROCOLITICA AB\t12065R\tY.ENTERCOCLITICA IGA\t#VALUE!\t424091.4286\t0\tNone\tNone\t21\t8905920\t4.71E+12
+LAB BLOOD ORDERABLES\t497470\tLABYENTE\tYERSINIA ENTEROCOLITICA AB\tYPSEU\tY.PSEUDOTUBERCULOSIS\t#VALUE!\t3364848\t0\tNone\tNone\t15\t50472720\t4.07E+14
+LAB BLOOD ORDERABLES\t541677\tLABCDH1\tFAMILIAL GASTRIC CANCER I\tCDH1CI\tCLINICAL INDICATION\t#VALUE!\t1062780\t0\tNone\tNone\t4\t4251120\t5.58E+12
+LAB BLOOD ORDERABLES\t541677\tLABCDH1\tFAMILIAL GASTRIC CANCER I\tCDH1DI\tDISCLAIMER\t#VALUE!\t1062780\t0\tNone\tNone\t4\t4251120\t5.58E+12
+LAB BLOOD ORDERABLES\t541677\tLABCDH1\tFAMILIAL GASTRIC CANCER I\tCDH1MD\tINTERPRETED BY\t#VALUE!\t1062780\t0\tNone\tNone\t4\t4251120\t5.58E+12
+LAB BLOOD ORDERABLES\t541677\tLABCDH1\tFAMILIAL GASTRIC CANCER I\tCDH1MT\tMETHOD\t#VALUE!\t1062780\t0\tNone\tNone\t4\t4251120\t5.58E+12
+LAB BLOOD ORDERABLES\t541677\tLABCDH1\tFAMILIAL GASTRIC CANCER I\tCDH1MU\tMUTATION(S)\t#VALUE!\t1568100\t0\tNone\tNone\t1\t1568100\t2.46E+12
+LAB BLOOD ORDERABLES\t541679\tLABBCRKDM\tBCR - ABL KINASE DOMAIN MUTATION ANALYSIS\tBCRKCI\tCLINICAL INDICATION\t#VALUE!\t864270\t0\tNone\tNone\t14\t12099780\t1.30E+13
+LAB BLOOD ORDERABLES\t541679\tLABBCRKDM\tBCR - ABL KINASE DOMAIN MUTATION ANALYSIS\tBCRKDI\tDISCLAIMER\t#VALUE!\t864270\t0\tNone\tNone\t14\t12099780\t1.30E+13
+LAB BLOOD ORDERABLES\t541679\tLABBCRKDM\tBCR - ABL KINASE DOMAIN MUTATION ANALYSIS\tBCRKIT\tINTERPRETED BY\t#VALUE!\t864270\t0\tNone\tNone\t14\t12099780\t1.30E+13
+LAB BLOOD ORDERABLES\t541679\tLABBCRKDM\tBCR - ABL KINASE DOMAIN MUTATION ANALYSIS\tBCRKMT\tMETHOD\t#VALUE!\t864270\t0\tNone\tNone\t14\t12099780\t1.30E+13
+LAB BLOOD ORDERABLES\t541681\tLABDHBCC\tDONOR HEPATITIS B CORE AB (LIVING)\tDHBCC\tDONOR HEP CORE AB\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t541687\tLABFHHV7\tHERPES VIRUS 7 IGG AND IGM AB\tFINT\tINTERPRETATION\t#VALUE!\t356310\t0\tNone\tNone\t2\t712620\t2.55E+11
+LAB BLOOD ORDERABLES\t541689\tLABFPARVO\tPARVOVIRUS IGG / IGM AB\t12835R\tPARVOVIRUS B19 AB IGG\t#VALUE!\t2267650\t0\tNone\tNone\t6\t13605900\t3.52E+13
+LAB BLOOD ORDERABLES\t541695\tLABDSDNA\tANTI - DSDNA AB\tDNAINT\tINTERPRETATION\t#VALUE!\t212647.8896\t0\tNone\tNone\t616\t130991100\t3.85E+13
+LAB BLOOD ORDERABLES\t573825\tLABFHIVQA\tHIV-1 DNA, QUALITATIVE PCR\tHIVQA\tHIV-1 DNA, QUAL, PCR\t#VALUE!\t280410\t0\tNone\tNone\t2\t560820\t1.66E+11
+LAB BLOOD ORDERABLES\t573825\tLABFHIVQA\tHIV-1 PROVIRALL DNA PCR QUAL\tHIVQA\tHIV-1 DNA, QUAL, PCR\t#VALUE!\t236296.3636\t0\tNone\tNone\t11\t2599260\t6.56E+11
+LAB BLOOD ORDERABLES\t590530\tLABCEPLUS\tCELIAC PLUS\tCPLUS1\tCELIAC PLUS RESULT\t#VALUE!\t543240\t0\tNone\tNone\t1\t543240\t2.95E+11
+LAB BLOOD ORDERABLES\t590545\tLABFCLAB\tCHLAMYDIA TRACHOMATIS SEROLOGY FOR OCCULT S\t12428R\tINTERPRETATION\t#VALUE!\t242130\t0\tNone\tNone\t4\t968520\t2.64E+11
+LAB BLOOD ORDERABLES\t590545\tLABFCLAB\tCHLAMYDIA TRACHOMATIS SEROLOGY FOR OCCULT S\tCTINT\tINTERPRETATION\t#VALUE!\t224837.1429\t0\tNone\tNone\t7\t1573860\t3.64E+11
+LAB BLOOD ORDERABLES\t590554\tLAB12814R\tMYCOPLASMA IGG/IGM AB\t12024R\tMYCOPLASMA PNEUMONIA AB IGG\t#VALUE!\t578845.7143\t0\tNone\tNone\t28\t16207680\t1.90E+13
+LAB BLOOD ORDERABLES\t590554\tLAB12814R\tMYCOPLASMA IGG/IGM AB\t12431R\tINTERPRETATION\t#VALUE!\t308790\t0\tNone\tNone\t2\t617580\t2.66E+11
+LAB BLOOD ORDERABLES\t590554\tLAB12814R\tMYCOPLASMA IGG/IGM AB\tLTROIN\tINTERPRETATION\t#VALUE!\t258120\t0\tNone\tNone\t1\t258120\t66625934400
+LAB BLOOD ORDERABLES\t590559\tLABFPOLIO\tPOLIOVIRUS 1-3 AB, SERUM\tPLV3\tPOLIOVIRUS 3 AB\t#VALUE!\t253600\t0\tNone\tNone\t3\t760800\t2.02E+11
+LAB BLOOD ORDERABLES\t590561\tLABFSFTA\tTREPONEMA PALLIDUM AB\tSFTA\tSYPHILIS-FTA\t#VALUE!\t177960\t0\tNone\tNone\t1\t177960\t31669761600
+LAB BLOOD ORDERABLES\t611471\tLABYDGIGA\tGLIADIN (DEAMIDATED) IGA,SERUM\tADGINT\tINTERPRETATION\t#VALUE!\t466236\t0\tNone\tNone\t20\t9324720\t5.28E+12
+LAB BLOOD ORDERABLES\t621214\tLABDDIML\tD - DIMER (ELISA)\tDIMCOM\tCOAGULATION COMMENT\t#VALUE!\t5591.974249\t0\tNone\tNone\t932\t5211720\t50304153600
+LAB BLOOD ORDERABLES\t633198\tLABCOXBAB\tCOXSACKIE B AB, SERUM\tTYB6\tCOXSACKIE B6 AB\t#VALUE!\t229080\t0\tNone\tNone\t1\t229080\t52477646400
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYP2\tCOXSACKIE A2 AB\t#VALUE!\t335940\t0\tNone\tNone\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t633252\tLABFENTP\tENTEROVIRUS PANEL II\tTYP4\tCOXSACKIE A4 AB\t#VALUE!\t335940\t0\tNone\tNone\t1\t335940\t1.13E+11
+LAB BLOOD ORDERABLES\t668075\tLABDNAISO\tNUCLEIC ACID ISOLATION, DNA\tDNADAT\tDATE OF DNA EXTRACTION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t668077\tLABRAAS\tRHEUMATOID ARTHRITIS AB SCREEN\tCCPINT\tINTERPRETATION\t#VALUE!\t2437250.769\t0\tNone\tNone\t26\t63368520\t2.95E+15
+LAB BLOOD ORDERABLES\t668091\tLAB11125R\tCOCCI ID (SERUM)\tCOCI\tCOCCI ID (SERUM)\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t668091\tLABCOCI\tCOCCI ID (SERUM)\tCOCI\tCOCCI ID (SERUM)\t#VALUE!\t1056797.143\t0\tNone\tNone\t7\t7397580\t8.14E+12
+LAB BLOOD ORDERABLES\t668152\tLABATTG\tIGA ANTI TTG\tATTINT\tINTERPRETATION\t#VALUE!\t394865.1799\t0\tNone\tNone\t139\t54886260\t2.79E+13
+LAB BLOOD ORDERABLES\t668154\tLABGDGP\tIGG ANTI DGP\tGDGINT\tINTERPRETATION\t#VALUE!\t399028.2353\t0\tNone\tNone\t34\t13566960\t6.90E+12
+LAB BLOOD ORDERABLES\t668156\tLABCDAS\tCELIAC DISEASE SCREEN\tATTINT\tINTERPRETATION\t#VALUE!\t402189.6296\t0\tNone\tNone\t81\t32577360\t1.89E+13
+LAB BLOOD ORDERABLES\t668156\tLABCDAS\tCELIAC DISEASE SCREEN\tIGAINT\tINTERPRETATION\t#VALUE!\t402189.6296\t0\tNone\tNone\t81\t32577360\t1.89E+13
+LAB BLOOD ORDERABLES\t668158\tLABADAM13\tADAMTS-13 ACTIVITY AND ANTIGEN TESTING\tADMINT\tCLINICAL INTERPRETATION\t#VALUE!\t190497\t0\tNone\tNone\t20\t3809940\t1.38E+12
+LAB BLOOD ORDERABLES\t668158\tLABADAMTS\tADAMTS-13 ACTIVITY AND ANTIGEN TESTING\tADMINT\tCLINICAL INTERPRETATION\t#VALUE!\t247320\t0\tNone\tNone\t3\t741960\t2.61E+11
+LAB BLOOD ORDERABLES\t668158\tLABADAMTS\tADAMTS-13 PROFILE\tADMINT\tCLINICAL INTERPRETATION\t#VALUE!\t206821.875\t0\tNone\tNone\t64\t13236600\t4.74E+12
+LAB BLOOD ORDERABLES\t668178\tLABDRPRS\tDONOR, SYPHILIS SCREEN\tRPRS1\tDONOR SYPHILIS SCREEN\t#VALUE!\t168840\t0\tNone\tNone\t2\t337680\t76120106400
+LAB BLOOD ORDERABLES\t668192\tLABCKITMU\tDETECTION OF C-KIT MUTATIONS\tKITDI\tDISCLAIMER\t#VALUE!\t779901.7925\t0\tNone\tNone\t212\t165339180\t3.13E+14
+LAB BLOOD ORDERABLES\t668192\tLABCKITMU\tDETECTION OF C-KIT MUTATIONS\tKITME\tMETHOD\t#VALUE!\t779901.7925\t0\tNone\tNone\t212\t165339180\t3.13E+14
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11005R\tA. TENUIS/ALTERNATA IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11006R\tASPERGILLUS FUMIGATUS IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11007R\tAUREOBASIDIUM PULLULANS IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11008R\tMICROPOLYSPORA FAENI IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11009R\tP. NOTATUM/CHRYSOGENUM IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11010R\tPHOMA BETAE IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11011R\tTHERMOACTINOMYCES VULGARIS IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11012R\tTRICHODERMA VIRIDE IGG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669985\tLAB11004R\tHYPERSENS. PNEUMONITIS PNL\t11141R\tINTERPRETATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t669987\tLAB11013R\tPLATELET ANTIBODY ID PANEL\t11014R\tANTIGEN CAPTURE\t#VALUE!\t688358.9552\t0\tNone\tNone\t134\t92240100\t8.83E+13
+LAB BLOOD ORDERABLES\t669987\tLAB11013R\tPLATELET ANTIBODY ID PANEL\t11015R\tMODIFIED ANTIGEN CAPTURE\t#VALUE!\t699652.5\t0\tNone\tNone\t96\t67166640\t7.00E+13
+LAB BLOOD ORDERABLES\t669987\tLAB11013R\tPLATELET ANTIBODY ID PANEL\t11016R\tPLATELET ANTIBODY SCREEN\t#VALUE!\t699652.5\t0\tNone\tNone\t96\t67166640\t7.00E+13
+LAB BLOOD ORDERABLES\t670732\tLAB11322R\tMOTOR NEUROPATHY AB SCREEN\t11323R\tCO-GM1 TRIAD AB\t#VALUE!\t1029150\t0\tNone\tNone\t2\t2058300\t4.23E+12
+LAB BLOOD ORDERABLES\t670732\tLAB12774R\tMOTOR NEUROPATHY AB SCREEN\t11323R\tCO-GM1 TRIAD AB\t#VALUE!\t2500414.286\t0\tNone\tNone\t7\t17502900\t9.27E+13
+LAB BLOOD ORDERABLES\t670732\tLAB12774R\tMOTOR NEUROPATHY AB SCREEN\t12775R\tCO-GM1 QUATTRO\t#VALUE!\t1396488\t0\tNone\tNone\t5\t6982440\t1.46E+13
+LAB BLOOD ORDERABLES\t670734\tLAB11324R\tCADASIL EVALUATION, COMPLETE\t11325R\tCOMPLETE CADASIL EVALUATION\t#VALUE!\t2366850\t0\tNone\tNone\t6\t14201100\t7.82E+13
+LAB BLOOD ORDERABLES\t670752\tLAB11343R\tSRA UNFRACTIONATED HEPARIN\t11344R\tSRA UNFRACTIONATED HEPARIN\t#VALUE!\t374785.2941\t0\tNone\tNone\t102\t38228100\t1.72E+13
+LAB BLOOD ORDERABLES\t670756\tLAB11347R\tC-TELOPEPTIDE\t11348R\tC-TELOPEPTIDE\t#VALUE!\t381060\t0\tNone\tNone\t1\t381060\t1.45E+11
+LAB BLOOD ORDERABLES\t670766\tLAB11238R\tHERPESVIRUS-8 IGG AB\t11239R\tHERPESVIRUS-8 IGG AB\t#VALUE!\t392080\t0\tNone\tNone\t6\t2352480\t1.06E+12
+LAB BLOOD ORDERABLES\t670768\tLAB11240R\tMEASLES IGG\t11241R\tMEASLES IGG\t#VALUE!\t213051.4286\t0\tNone\tNone\t14\t2982720\t7.36E+11
+LAB BLOOD ORDERABLES\t670780\tLAB11190R\tBORRELIA HERMSII AB PANL\t12430R\tINTERPRETATION\t#VALUE!\t349300\t0\tNone\tNone\t3\t1047900\t3.86E+11
+LAB BLOOD ORDERABLES\t670780\tLAB11190R\tBORRELIA HERMSII AB PANL\tECINT\tINTERPRETATION\t#VALUE!\t1643340\t0\tNone\tNone\t2\t3286680\t7.18E+12
+LAB BLOOD ORDERABLES\t670784\tLAB11357R\tFAMILIAL MEDITERRANEAN FEVER\t11358R\tFAMILIAL MEDITERRANEAN FEVER\t#VALUE!\t3943252.5\t0\tNone\tNone\t8\t31546020\t1.31E+14
+LAB BLOOD ORDERABLES\t670792\tLAB11365R\tFAMILIAL HIBERNIAN FEVER/TRAPS\t11366R\tFAMILIAL HIBERNIAN FEVER\t#VALUE!\t3634180\t0\tNone\tNone\t3\t10902540\t4.02E+13
+LAB BLOOD ORDERABLES\t670796\tLAB11369R\tLEUKEMIA/LYMPHOMA IMMUPHENTYP\t11370R\tLEUKEMIA/LYMPHOMA IMMUPHENTYP\t#VALUE!\t160740\t0\tNone\tNone\t4\t642960\t1.04E+11
+LAB BLOOD ORDERABLES\t670802\tLAB11373R\tMARFAN(FBN1) SEQUENCING\t11374R\tMARFAN(FBN1) SEQUENCING\t#VALUE!\t1192440\t0\tNone\tNone\t3\t3577320\t4.27E+12
+LAB BLOOD ORDERABLES\t670804\tLAB11375R\tOSTEOGENESIS IMPERFECTA SEQUEN\t11376R\tOSTEOGENESIS IMPERFECTA SEQUEN\t#VALUE!\t3184020\t0\tNone\tNone\t2\t6368040\t2.21E+13
+LAB BLOOD ORDERABLES\t670818\tLAB11199R\tPARANEOPLASTIC AUTOAB EVAL\t11200R\tINTERPRETIVE COMMENTS\t#VALUE!\t902143.4783\t0\tNone\tNone\t69\t62247900\t6.72E+13
+LAB BLOOD ORDERABLES\t670818\tLAB11199R\tPARANEOPLASTIC AUTOANTIBODY EVAL, SERUM\t11200R\tINTERPRETIVE COMMENTS\t#VALUE!\t766684.8\t0\tNone\tNone\t75\t57501360\t5.29E+13
+LAB BLOOD ORDERABLES\t670858\tLAB11401R\tHALIBUT IGE\t11459R\tHALIBUT IGE\t#VALUE!\t390780\t0\tNone\tNone\t1\t390780\t1.53E+11
+LAB BLOOD ORDERABLES\t670920\tLAB11435R\tCELIAC GENETICS\t11499R\tCELIAC GENETICS\t#VALUE!\t666528\t0\tNone\tNone\t5\t3332640\t2.42E+12
+LAB BLOOD ORDERABLES\t670922\tLAB12689R\tINFLIXIMAB, SERUM LEVEL AND AB\t12690R\tINFLIXIMAB, SERUM LEVEL AND AB\t#VALUE!\t536920\t0\tNone\tNone\t3\t1610760\t1.04E+12
+LAB BLOOD ORDERABLES\t670922\tLAB12689R\tSERM INFLIXIMAB/HACA MEASUREMT\t11500R\tSERM INFLIXIMAB/HACA MEASUREMT\t#VALUE!\t783660\t0\tNone\tNone\t1\t783660\t6.14E+11
+LAB BLOOD ORDERABLES\t670941\tLABCD3B\tCD3, BLOOD\tRTFDA1\tNOTE\t#VALUE!\t99900\t0\tNone\tNone\t1\t99900\t9980010000
+LAB BLOOD ORDERABLES\t744174\tLAB11516R\tPANCREATITIS PANEL\t11625R\tPANCREATITIS PANEL\t#VALUE!\t2241593.333\t0\tNone\tNone\t9\t20174340\t5.94E+13
+LAB BLOOD ORDERABLES\t744184\tLAB11522R\tHU AB\t11632R\tHU AB\t#VALUE!\t920782.5\t0\tNone\tNone\t8\t7366260\t7.84E+12
+LAB BLOOD ORDERABLES\t744186\tLAB11523R\tGQ1B AB\t11633R\tGQ1B AB\t#VALUE!\t2399132.727\t0\tNone\tNone\t44\t105561840\t6.12E+14
+LAB BLOOD ORDERABLES\t744190\tLAB11525R\tMUSCLE TYROSINE KINASE AB\t11635R\tMUSCLE TYROSINE KINASE AB\t#VALUE!\t2179075.2\t0\tNone\tNone\t25\t54476880\t2.72E+14
+LAB BLOOD ORDERABLES\t744192\tLAB11526R\tK CHANNEL AB\t11636R\tK CHANNEL AB\t#VALUE!\t1380474\t0\tNone\tNone\t10\t13804740\t2.72E+13
+LAB BLOOD ORDERABLES\t744194\tLAB11527R\tSPINAL MUSCULAR ATROPHY DIAGNO\t11637R\tSPINAL MUSCULAR ATROPHY DIAGNO\t#VALUE!\t756900\t0\tNone\tNone\t2\t1513800\t2.18E+12
+LAB BLOOD ORDERABLES\t744196\tLAB11528R\tPERIPHERAL NEUROPATHY AB SCN\t11638R\tPERIPHERAL NEUROPATHY AB SCN\t#VALUE!\t1460520\t0\tNone\tNone\t1\t1460520\t2.13E+12
+LAB BLOOD ORDERABLES\t744198\tLAB11529R\tENCEPHALITIS AB SCREEN\t11639R\tENCEPHALITIS AB SCREEN\t#VALUE!\t781800\t0\tNone\tNone\t2\t1563600\t1.34E+12
+LAB BLOOD ORDERABLES\t744198\tLAB12772R\tENCEPHALITIS AB SCREEN\t11639R\tENCEPHALITIS AB SCREEN\t#VALUE!\t1309080\t0\tNone\tNone\t1\t1309080\t1.71E+12
+LAB BLOOD ORDERABLES\t744198\tLAB12772R\tENCEPHALITIS AB SCREEN\t12773R\tENCEPHALITIS AB SCREEN\t#VALUE!\t2424660\t0\tNone\tNone\t1\t2424660\t5.88E+12
+LAB BLOOD ORDERABLES\t744200\tLAB11530R\tCEREBELLAR PARANEOPLASTIC AB\t11640R\tCEREBELLAR PARANEOPLASTIC AB\t#VALUE!\t4965280\t0\tNone\tNone\t6\t29791680\t1.72E+14
+LAB BLOOD ORDERABLES\t744206\tLAB11533R\tSENSORIMOTOR SCREEN AB\t11643R\tSENSORIMOTOR SCREEN AB\t#VALUE!\t601560\t0\tNone\tNone\t1\t601560\t3.62E+11
+LAB BLOOD ORDERABLES\t744208\tLAB11534R\tMTDNA SCREENING PANEL\t11644R\tMTDNA SCREENING PANEL\t#VALUE!\t8160\t0\tNone\tNone\t1\t8160\t66585600
+LAB BLOOD ORDERABLES\t744220\tLAB11540R\tOTC SEQUENCING\t11650R\tOTC SEQUENCING\t#VALUE!\t1677000\t0\tNone\tNone\t1\t1677000\t2.81E+12
+LAB BLOOD ORDERABLES\t744236\tLAB11551R\tNK FUNCTION\t11661R\tNK FUNCTION\t#VALUE!\t395914.4681\t0\tNone\tNone\t47\t18607980\t2.99E+13
+LAB BLOOD ORDERABLES\t744246\tLAB11556R\tBLASTOMYCES SEROLOGIES\t11666R\tBLASTO AB ID\t#VALUE!\t387587.5862\t0\tNone\tNone\t116\t44960160\t1.82E+13
+LAB BLOOD ORDERABLES\t744246\tLAB11556R\tBLASTOMYCES SEROLOGIES\tBLAS\tBLASTO AB CFS\t#VALUE!\t387587.5862\t0\tNone\tNone\t116\t44960160\t1.82E+13
+LAB BLOOD ORDERABLES\t744250\tLAB12781R\tBRUCELLA ANTIBODIES\t12779R\tBRUCELLA IGM\t#VALUE!\t327064.4444\t0\tNone\tNone\t27\t8830740\t3.27E+12
+LAB BLOOD ORDERABLES\t744256\tLAB11562R\tLYMPHOCYTIC CHORIOMENINGITI AB\t11674R\tINTERPRETATION\t#VALUE!\t254046.6667\t0\tNone\tNone\t18\t4572840\t1.33E+12
+LAB BLOOD ORDERABLES\t744262\tLAB11566R\tENTEROVIRUS RNA, QUAL\t11680R\tENTEROVIRUS QUAL,PCR\t#VALUE!\t474590\t0\tNone\tNone\t30\t14237700\t3.71E+13
+LAB BLOOD ORDERABLES\t744268\tLAB11570R\tSPINAL MUSC ATROPHY CARRIER\t11685R\tSPINAL MUSC ATROPHY CARRIER\t#VALUE!\t343800\t0\tNone\tNone\t1\t343800\t1.18E+11
+LAB BLOOD ORDERABLES\t744272\tLAB11572R\tTAY-SACHS ENZYME (LEUKOCYTES)\t11781R\tINTERPRETATION\t#VALUE!\t431070\t0\tNone\tNone\t2\t862140\t3.79E+11
+LAB BLOOD ORDERABLES\t744272\tLAB11572R\tTAY-SACHS ENZYME (LEUKOCYTES)\t12782R\tREVIEWED BY\t#VALUE!\t368760\t0\tNone\tNone\t1\t368760\t1.36E+11
+LAB BLOOD ORDERABLES\t744274\tLAB11573R\tCONGENITAL CYCLIC NEUTROPENIA\t11688R\tCONGENITAL CYLIC NEURTOPENIA\t#VALUE!\t3115380\t0\tNone\tNone\t1\t3115380\t9.71E+12
+LAB BLOOD ORDERABLES\t744278\tLAB11576R\tCOBALAMIN C DEFICIENCY(MMACHC)\t11691R\tCOBALAMIN C DEFICIENCY(MMACHC)\t#VALUE!\t3541227.273\t0\tNone\tNone\t11\t38953500\t1.68E+14
+LAB BLOOD ORDERABLES\t744280\tLAB11577R\tALAGILLE (JAG1) MUTATION\t11692R\tALAGILLE (JAG1) MUTATION\t#VALUE!\t5795840\t0\tNone\tNone\t3\t17387520\t1.02E+14
+LAB BLOOD ORDERABLES\t744320\tLAB11604R\tIL 5\t11757R\tINTERLEUKIN 5\t#VALUE!\t420600\t0\tNone\tNone\t1\t420600\t1.77E+11
+LAB BLOOD ORDERABLES\t744326\tLAB11608R\tMARFAN (FBN1) SEQUENCING\t11764R\tFBN1 FULL GENE RESULT\t#VALUE!\t1239540\t0\tNone\tNone\t7\t8676780\t1.19E+13
+LAB BLOOD ORDERABLES\t744326\tLAB11608R\tMARFAN (FBN1) SEQUENCING\t11765R\tFBN1 FULL GENE INTERPRETATION\t#VALUE!\t1358760\t0\tNone\tNone\t6\t8152560\t1.16E+13
+LAB BLOOD ORDERABLES\t744326\tLAB11608R\tMARFAN (FBN1) SEQUENCING\t11766R\tREVIEWED BY\t#VALUE!\t1358760\t0\tNone\tNone\t6\t8152560\t1.16E+13
+LAB BLOOD ORDERABLES\t744326\tLAB11608R\tMARFAN (FBN1) SEQUENCING\t11767R\tSEQUENCING\t#VALUE!\t1239540\t0\tNone\tNone\t7\t8676780\t1.19E+13
+LAB BLOOD ORDERABLES\t744330\tLAB11610R\tDONOR, HTLVS(QNS/LIPEMIC ONLY)\t11890R\tHTLV I/II, WESTERN BLOT\t#VALUE!\t668460\t0\tNone\tNone\t3\t2005380\t1.52E+12
+LAB BLOOD ORDERABLES\t744338\tLAB11615R\tSODIUM BENZOATE LEVEL\t11774R\tSODIUM BENZOATE LEVEL\t#VALUE!\t808116\t0\tNone\tNone\t5\t4040580\t3.27E+12
+LAB BLOOD ORDERABLES\t744368\tLABLEGS\tLEGIONELLA SEROLOGY\tLEG2\tL.LEGIONELLA AB (SEROGRP 2-6,8)\t#VALUE!\t466080\t0\tNone\tNone\t1\t466080\t2.17E+11
+LAB BLOOD ORDERABLES\t744370\tLABPFCATE\tCATECHOLAMINES FRACTIONATED\tPCATIN\tCAT PF INTERPRETATION(CATECHOL INTRP, PL)\t#VALUE!\t294414.375\t0\tNone\tNone\t32\t9421260\t3.19E+12
+LAB BLOOD ORDERABLES\t744408\tLABCEBPA\tDETECTION OF CEBPA, BLOOD\tCEPDI\tDISCLAIMER\t#VALUE!\t781898.5492\t0\tNone\tNone\t193\t150906420\t1.54E+14
+LAB BLOOD ORDERABLES\t744408\tLABCEBPA\tDETECTION OF CEBPA, BLOOD\tCEPMD\tINTERPRETATION\t#VALUE!\t812646.7797\t0\tNone\tNone\t177\t143838480\t1.50E+14
+LAB BLOOD ORDERABLES\t744408\tLABCEBPA\tDETECTION OF CEBPA, BLOOD\tCEPMT\tMETHOD\t#VALUE!\t781898.5492\t0\tNone\tNone\t193\t150906420\t1.54E+14
+LAB BLOOD ORDERABLES\t744410\tLABBMCEBP\tDETECTION OF CEBPA, BONE MARROW\tCEBDI\tDISCLAIMER\t#VALUE!\t878524.7788\t0\tNone\tNone\t113\t99273300\t1.44E+14
+LAB BLOOD ORDERABLES\t744410\tLABBMCEBP\tDETECTION OF CEBPA, BONE MARROW\tCEBMD\tINTERPRETATION\t#VALUE!\t911035.4286\t0\tNone\tNone\t105\t95658720\t1.42E+14
+LAB BLOOD ORDERABLES\t744410\tLABBMCEBP\tDETECTION OF CEBPA, BONE MARROW\tCEBMT\tMETHOD\t#VALUE!\t878524.7788\t0\tNone\tNone\t113\t99273300\t1.44E+14
+LAB BLOOD ORDERABLES\t861761\tLABXIGF1\tPEDIATRIC IGF-1\tXIG1\tIGF-1\t#VALUE!\t477232.5\t0\tNone\tNone\t16\t7635720\t3.76E+12
+LAB BLOOD ORDERABLES\t862881\tLABHITAB\tHEPARIN (HIT) AB\tPF4COM\tPF4 COMMENT\t#VALUE!\t89627.14014\t0\tNone\tNone\t1577\t141342000\t1.41E+13
+LAB BLOOD ORDERABLES\t862881\tLABHITAB\tHEPARIN PLATELET FACTOR 4 AB\tPF4COM\tPF4 COMMENT\t#VALUE!\t95902.35702\t0\tNone\tNone\t577\t55335660\t1.99E+13
+LAB BLOOD ORDERABLES\t864664\tLAB11878R\tCORTISOL BINDING GLOBULIN\t11877R\tCORTISOL BIND.GLOB(CBG)\t#VALUE!\t946260\t0\tNone\tNone\t1\t946260\t8.95E+11
+LAB BLOOD ORDERABLES\t870907\tLAB11989R\tLONG QT SYNDROME\t11990R\tLQTS RESULTS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\t12428R\tINTERPRETATION\t#VALUE!\t165960\t0\tNone\tNone\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t870911\tLABCLAMP\tCHLAMYDIA AB PANEL\t12429R\tINTERPRETATION\t#VALUE!\t165960\t0\tNone\tNone\t1\t165960\t27542721600
+LAB BLOOD ORDERABLES\t871208\tLAB12003R\tHERPESVIRUS 6 AB, IGG\t12004R\tHERPESVIRUS 6 IGG\t#VALUE!\t146100\t0\tNone\tNone\t1\t146100\t21345210000
+LAB BLOOD ORDERABLES\t871220\tLAB12023R\tMYCOPLASMA PNEUMONIA IGG AB\t12024R\tMYCOPLASMA PNEUMONIA AB IGG\t#VALUE!\t286680\t0\tNone\tNone\t1\t286680\t82185422400
+LAB BLOOD ORDERABLES\t871222\tLAB12813R\tPARVOVIRUS B19 AB, IGG\t12835R\tPARVOVIRUS B19 AB IGG\t#VALUE!\t167820\t0\tNone\tNone\t1\t167820\t28163552400
+LAB BLOOD ORDERABLES\t871380\tLAB12050R\tRICKETTSIA AB PNL W/RFLX TITER\t12054R\tR.TYPHI IGM\t#VALUE!\t265070.7692\t0\tNone\tNone\t13\t3445920\t9.64E+11
+LAB BLOOD ORDERABLES\t871382\tLAB12055R\tRMSF IGG TITER\t12056R\tRMSF IGG TITER\t#VALUE!\t60\t0\tNone\tNone\t1\t60\t3600
+LAB BLOOD ORDERABLES\t871386\tLAB12059R\tR. TYPHI IGG TITER\t12060R\tR.TYPHI IGG TITER\t#VALUE!\t0\t0\tNone\tNone\t1\t0\t0
+LAB BLOOD ORDERABLES\t871580\tLAB12066R\tCRMP-5-IGG WESTERN BLOT\tYCRMP\tCRMP-5-IGG WESTERN BLOT\t#VALUE!\t0\t0\tNone\tNone\t5\t0\t0
+LAB BLOOD ORDERABLES\t882631\tLAB12095R\tDARUNAVIR,ANTIRETROVIRAL LEVEL\t12101R\tDARUNAVIR,ANTIRETROVIRAL LEVEL\t#VALUE!\t592920\t0\tNone\tNone\t1\t592920\t3.52E+11
+LAB BLOOD ORDERABLES\t882639\tLAB12099R\tBRUCELLA TOTAL AB,AGGLU (RFLX)\t12100R\tBRUCELLA TOTAL AB, AGGLUTIN\t#VALUE!\t15\t0\tNone\tNone\t4\t60\t3600
+LAB BLOOD ORDERABLES\t883990\tLABFT3DIA\tT3, FREE, TRACER DIALYSIS\t11876R\tT3, TOTAL\t#VALUE!\t594080\t0\tNone\tNone\t3\t1782240\t1.06E+12
+LAB BLOOD ORDERABLES\t883990\tLABFT3DIA\tT3, FREE, TRACER DIALYSIS\tFT3\tFREE T3 (BY DIALYSIS)\t#VALUE!\t594080\t0\tNone\tNone\t3\t1782240\t1.06E+12
+LAB BLOOD ORDERABLES\t885230\tLABGDMTOL\tGDM GLUCOSE TOLERANCE\tGDMINT\tINTERPRETATION\t#VALUE!\t17220\t0\tNone\tNone\t1\t17220\t296528400
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tDNAINT\tINTERPRETATION\t#VALUE!\t441287.3684\t0\tNone\tNone\t19\t8384460\t4.72E+12
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tJO1INT\tANTI-JO1 INTERPRETATION\t#VALUE!\t441287.3684\t0\tNone\tNone\t19\t8384460\t4.72E+12
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tRNPINT\tANTI-RNP INTERPRETATION\t#VALUE!\t441287.3684\t0\tNone\tNone\t19\t8384460\t4.72E+12
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tSCLINT\tANTI-SCL70 INTERPRETATION\t#VALUE!\t441287.3684\t0\tNone\tNone\t19\t8384460\t4.72E+12
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tSNAINT\tSPECIFIC ANA INTERPRETATION\t#VALUE!\t441287.3684\t0\tNone\tNone\t19\t8384460\t4.72E+12
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tSSAIN\tANTI-RO INTERPRETATION\t#VALUE!\t441287.3684\t0\tNone\tNone\t19\t8384460\t4.72E+12
+LAB BLOOD ORDERABLES\t886803\tLABSNA\tSPECIFIC ANA PANEL\tSSBINT\tANTI-LA INTERPRETATION\t#VALUE!\t441287.3684\t0\tNone\tNone\t19\t8384460\t4.72E+12
+LAB BLOOD ORDERABLES\t886809\tLABCFDS\tCFTR DIAGNOSTIC SEQUENCING\tCFDSDI\tDISCLAIMER\t#VALUE!\t1537946.25\t0\tNone\tNone\t16\t24607140\t4.62E+13
+LAB BLOOD ORDERABLES\t886809\tLABCFDS\tCFTR DIAGNOSTIC SEQUENCING\tCFDSDX\tCLINICAL INDICATION\t#VALUE!\t1537946.25\t0\tNone\tNone\t16\t24607140\t4.62E+13
+LAB BLOOD ORDERABLES\t886809\tLABCFDS\tCFTR DIAGNOSTIC SEQUENCING\tCFDSMD\tINTERPRETED BY\t#VALUE!\t1537946.25\t0\tNone\tNone\t16\t24607140\t4.62E+13
+LAB BLOOD ORDERABLES\t886809\tLABCFDS\tCFTR DIAGNOSTIC SEQUENCING\tCFDSMT\tMETHOD\t#VALUE!\t1537946.25\t0\tNone\tNone\t16\t24607140\t4.62E+13
+LAB BLOOD ORDERABLES\t886809\tLABCFDS\tCFTR DIAGNOSTIC SEQUENCING\tCFDSRE\tRESULT\t#VALUE!\t1537946.25\t0\tNone\tNone\t16\t24607140\t4.62E+13
+LAB BLOOD ORDERABLES\t889077\tLABD816V\tKIT D816V MUTATION, AS-PCR, BLOOD\tD816DI\tDISCLAIMER\t#VALUE!\t722297.1429\t0\tNone\tNone\t7\t5056080\t4.67E+12
+LAB BLOOD ORDERABLES\t889077\tLABD816V\tKIT D816V MUTATION, AS-PCR, BLOOD\tD816MD\tINTERPRETED BY\t#VALUE!\t806000\t0\tNone\tNone\t6\t4836000\t4.62E+12
+LAB BLOOD ORDERABLES\t889077\tLABD816V\tKIT D816V MUTATION, AS-PCR, BLOOD\tD816ME\tMETHOD\t#VALUE!\t722297.1429\t0\tNone\tNone\t7\t5056080\t4.67E+12
+LAB BLOOD ORDERABLES\t889077\tLABD816V\tKIT D816V MUTATION, AS-PCR, BLOOD\tD816RF\tREFERENCES\t#VALUE!\t722297.1429\t0\tNone\tNone\t7\t5056080\t4.67E+12
+LAB BLOOD ORDERABLES\t889079\tLABND816V\tKIT D816V MUT., AS-PCR, NON-BLOOD\tND81DI\tDISCLAIMER\t#VALUE!\t757500\t0\tNone\tNone\t1\t757500\t5.74E+11
+LAB BLOOD ORDERABLES\t889079\tLABND816V\tKIT D816V MUT., AS-PCR, NON-BLOOD\tND81MD\tINTERPRETED BY\t#VALUE!\t757500\t0\tNone\tNone\t1\t757500\t5.74E+11
+LAB BLOOD ORDERABLES\t889079\tLABND816V\tKIT D816V MUT., AS-PCR, NON-BLOOD\tND81ME\tMETHOD\t#VALUE!\t757500\t0\tNone\tNone\t1\t757500\t5.74E+11
+LAB BLOOD ORDERABLES\t889079\tLABND816V\tKIT D816V MUT., AS-PCR, NON-BLOOD\tND81RF\tREFERENCES\t#VALUE!\t757500\t0\tNone\tNone\t1\t757500\t5.74E+11
+LAB BLOOD ORDERABLES\t889204\tLABMYD88\tMYD88 MUTATION ANALYSIS\tD88DI\tDISCLAIMER\t#VALUE!\t1389780\t0\tNone\tNone\t1\t1389780\t1.93E+12
+LAB BLOOD ORDERABLES\t889204\tLABMYD88\tMYD88 MUTATION ANALYSIS\tD88DX\tCLINICAL INDICATION\t#VALUE!\t1389780\t0\tNone\tNone\t1\t1389780\t1.93E+12
+LAB BLOOD ORDERABLES\t889204\tLABMYD88\tMYD88 MUTATION ANALYSIS\tD88IN\tINTERPRETATION\t#VALUE!\t1389780\t0\tNone\tNone\t1\t1389780\t1.93E+12
+LAB BLOOD ORDERABLES\t889204\tLABMYD88\tMYD88 MUTATION ANALYSIS\tD88MD\tINTERPRETED BY\t#VALUE!\t1389780\t0\tNone\tNone\t1\t1389780\t1.93E+12
+LAB BLOOD ORDERABLES\t889204\tLABMYD88\tMYD88 MUTATION ANALYSIS\tD88ME\tMETHOD\t#VALUE!\t1389780\t0\tNone\tNone\t1\t1389780\t1.93E+12
+LAB BLOOD ORDERABLES\t889204\tLABMYD88\tMYD88 MUTATION ANALYSIS\tD88RF\tREFERENCES\t#VALUE!\t1389780\t0\tNone\tNone\t1\t1389780\t1.93E+12
+LAB BLOOD ORDERABLES\t889708\tLABCSMPB\tCANCER SOMATIC MUTATION PNL, BLOOD\tCSDIB\tDISCLAIMER\t#VALUE!\t873158.6047\t0\tNone\tNone\t129\t112637460\t2.69E+14
+LAB BLOOD ORDERABLES\t889708\tLABCSMPB\tCANCER SOMATIC MUTATION PNL, BLOOD\tCSMEB\tMETHOD\t#VALUE!\t873158.6047\t0\tNone\tNone\t129\t112637460\t2.69E+14
+LAB BLOOD ORDERABLES\t889708\tLABCSMPB\tCANCER SOMATIC MUTATION PNL, BLOOD\tCSREFB\tREFERENCES\t#VALUE!\t873158.6047\t0\tNone\tNone\t129\t112637460\t2.69E+14
+LAB BLOOD ORDERABLES\t889712\tLABCFSS\tCFTR SCREEN BY SEQUENCING\tCFSSDI\tDISCLAIMER\t#VALUE!\t371657.1429\t0\tNone\tNone\t7\t2601600\t1.85E+12
+LAB BLOOD ORDERABLES\t889712\tLABCFSS\tCFTR SCREEN BY SEQUENCING\tCFSSMD\tINTERPRETED BY\t#VALUE!\t371657.1429\t0\tNone\tNone\t7\t2601600\t1.85E+12
+LAB BLOOD ORDERABLES\t889712\tLABCFSS\tCFTR SCREEN BY SEQUENCING\tCFSSME\tMETHOD\t#VALUE!\t371657.1429\t0\tNone\tNone\t7\t2601600\t1.85E+12
+LAB BLOOD ORDERABLES\t889722\tLAB12573R\tANCA\t12575R\tC-ANCA\t#VALUE!\t305359.0435\t0\tNone\tNone\t230\t70232580\t5.24E+13
+LAB BLOOD ORDERABLES\t889722\tLAB12573R\tANCA\t12576R\tP-ANCA\t#VALUE!\t305359.0435\t0\tNone\tNone\t230\t70232580\t5.24E+13
+LAB BLOOD ORDERABLES\t890107\tLAB12220R\tMSUD MUTATION ANALYSIS\t12221R\t12221R\t#VALUE!\t1404120\t0\tNone\tNone\t1\t1404120\t1.97E+12
+LAB BLOOD ORDERABLES\t890115\tLAB12228R\tLATEX SPECIFIC IGE (RIA) PANEL\t12229R\t12229R\t#VALUE!\t1006840\t0\tNone\tNone\t3\t3020520\t3.88E+12
+LAB BLOOD ORDERABLES\t890119\tLAB12232R\tTHYROGLOBULIN & THYROID AB\t12233R\t12233R\t#VALUE!\t977357.8378\t0\tNone\tNone\t74\t72324480\t4.79E+14
+LAB BLOOD ORDERABLES\t890121\tLAB12234R\tVOLATILES\t12235R\t12235R\t#VALUE!\t166777.5\t0\tNone\tNone\t8\t1334220\t1.07E+12
+LAB BLOOD ORDERABLES\t890127\tLAB12241R\tB CELL PHENOTYPING PROFILE\t12242R\t12242R\t#VALUE!\t925412.7273\t0\tNone\tNone\t11\t10179540\t4.35E+13
+LAB BLOOD ORDERABLES\t890129\tLAB12279R\tCVID CONFIRMATION FLOW PANEL\t12282R\t12282R\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+LAB BLOOD ORDERABLES\t890133\tLAB12212R\tWA1 IGG AB\t12213R\t12213R\t#VALUE!\t677464.2857\t0\tNone\tNone\t14\t9484500\t4.41E+13
+LAB BLOOD ORDERABLES\t893876\tLABSF3B1\tSF3B1 MUTATION ANALYSIS\tSF3DI\tDISCLAIMER\t#VALUE!\t190860\t0\tNone\tNone\t1\t190860\t36427539600
+LAB BLOOD ORDERABLES\t893876\tLABSF3B1\tSF3B1 MUTATION ANALYSIS\tSF3IN\tINTERPRETATION\t#VALUE!\t190860\t0\tNone\tNone\t1\t190860\t36427539600
+LAB BLOOD ORDERABLES\t893876\tLABSF3B1\tSF3B1 MUTATION ANALYSIS\tSF3MD\tINTERPRETED BY\t#VALUE!\t190860\t0\tNone\tNone\t1\t190860\t36427539600
+LAB BLOOD ORDERABLES\t893876\tLABSF3B1\tSF3B1 MUTATION ANALYSIS\tSF3ME\tMETHOD\t#VALUE!\t190860\t0\tNone\tNone\t1\t190860\t36427539600
+LAB BLOOD ORDERABLES\t893876\tLABSF3B1\tSF3B1 MUTATION ANALYSIS\tSF3RF\tREFERENCES\t#VALUE!\t190860\t0\tNone\tNone\t1\t190860\t36427539600
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3DI\tDISCLAIMER\t#VALUE!\t480\t0\tNone\tNone\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3IN\tINTERPRETATION\t#VALUE!\t480\t0\tNone\tNone\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3MD\tINTERPRETED BY\t#VALUE!\t480\t0\tNone\tNone\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3ME\tMETHOD\t#VALUE!\t480\t0\tNone\tNone\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3RE\tRESULT, NON-BLOOD\t#VALUE!\t480\t0\tNone\tNone\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893878\tLABNSF3B1\tSF3B1 MUTATION ANALYSIS, NON-BLOOD\tNSF3RF\tREFERENCES\t#VALUE!\t480\t0\tNone\tNone\t1\t480\t230400
+LAB BLOOD ORDERABLES\t893915\tLABCDMLPA\tCDH1 MLPA\tCDMLDI\tDISCLAIMER\t#VALUE!\t1418550\t0\tNone\tNone\t2\t2837100\t4.13E+12
+LAB BLOOD ORDERABLES\t893915\tLABCDMLPA\tCDH1 MLPA\tCDMLMD\tINTERPRETED BY\t#VALUE!\t1418550\t0\tNone\tNone\t2\t2837100\t4.13E+12
+LAB BLOOD ORDERABLES\t893915\tLABCDMLPA\tCDH1 MLPA\tCDMLME\tMETHOD\t#VALUE!\t1418550\t0\tNone\tNone\t2\t2837100\t4.13E+12
+LAB BLOOD ORDERABLES\t898792\tPATH18\tFLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD\tPTH18R\tRECEIVED IN FLOW CYTOMETRY\t#VALUE!\t89720\t0\tNone\tNone\t6\t538320\t52831173600
+LAB BLOOD ORDERABLES\t898792\tPATH18\tSEZARY/T-CELL PANEL + CD30/CD25/CD52, BLOOD\tPTH18R\tRECEIVED IN FLOW CYTOMETRY\t#VALUE!\t107400\t0\tNone\tNone\t3\t322200\t34644391200
+LAB BLOOD ORDERABLES\t898798\tLABCFMLPA\tCFTR DELETION/DUPLICATION ANALYSIS BY MLPA\tCFMLDI\tDISCLAIMER\t#VALUE!\t1484940\t0\tNone\tNone\t2\t2969880\t4.71E+12
+LAB BLOOD ORDERABLES\t898798\tLABCFMLPA\tCFTR DELETION/DUPLICATION ANALYSIS BY MLPA\tCFMLMD\tINTERPRETED BY\t#VALUE!\t1484940\t0\tNone\tNone\t2\t2969880\t4.71E+12
+LAB BLOOD ORDERABLES\t898798\tLABCFMLPA\tCFTR DELETION/DUPLICATION ANALYSIS BY MLPA\tCFMLME\tMETHOD\t#VALUE!\t1484940\t0\tNone\tNone\t2\t2969880\t4.71E+12
+LAB BLOOD ORDERABLES\t898798\tLABCFMLPA\tCFTR DELETION/DUPLICATION ANALYSIS BY MLPA\tCFMLRE\tRESULT\t#VALUE!\t1484940\t0\tNone\tNone\t2\t2969880\t4.71E+12
+LAB BLOOD ORDERABLES\t898800\tLABMGMTB\tMGMT, METHYLATION SPECIFIC PCR, BLOOD\tMGMDIB\tDISCLAIMER\t#VALUE!\t579996\t0\tNone\tNone\t5\t2899980\t2.09E+12
+LAB BLOOD ORDERABLES\t898800\tLABMGMTB\tMGMT, METHYLATION SPECIFIC PCR, BLOOD\tMGMINB\tINTERPRETATION\t#VALUE!\t579996\t0\tNone\tNone\t5\t2899980\t2.09E+12
+LAB BLOOD ORDERABLES\t898800\tLABMGMTB\tMGMT, METHYLATION SPECIFIC PCR, BLOOD\tMGMMDB\tINTERPRETED BY\t#VALUE!\t579996\t0\tNone\tNone\t5\t2899980\t2.09E+12
+LAB BLOOD ORDERABLES\t898800\tLABMGMTB\tMGMT, METHYLATION SPECIFIC PCR, BLOOD\tMGMMEB\tMETHOD\t#VALUE!\t579996\t0\tNone\tNone\t5\t2899980\t2.09E+12
+LAB BLOOD ORDERABLES\t906953\tLAB12580R\tCU INDEX PANEL\t12589R\tCU INDEX PANEL\t#VALUE!\t544620\t0\tNone\tNone\t1\t544620\t2.97E+11
+LAB BLOOD ORDERABLES\t910564\tLAB12352R\tNMO EVALUATION WITH REFLEX\t11200R\tINTERPRETIVE COMMENTS\t#VALUE!\t606762.8571\t0\tNone\tNone\t7\t4247340\t2.63E+12
+LAB BLOOD ORDERABLES\t910596\tLAB12512R\tVON HIPPEL-LINDAU SYNDROME\t12513R\tVON HIPPEL-LINDAU SYNDROME\t#VALUE!\t3786780\t0\tNone\tNone\t1\t3786780\t1.43E+13
+LAB BLOOD ORDERABLES\t912863\tLAB12415R\tACVRL1 AND ENG (HHT)\t12417R\tSEQUENCING-DELETION/DUPLICATION\t#VALUE!\t3433980\t0\tNone\tNone\t3\t10301940\t3.85E+13
+LAB BLOOD ORDERABLES\t912867\tLAB12507R\tIBD SGI DIAGNOSTIC\t12508R\tIBD SGI DIAGNOSTIC\t#VALUE!\t818250\t0\tNone\tNone\t4\t3273000\t2.81E+12
+LAB BLOOD ORDERABLES\t912869\tLAB12443R\tNEOCOMPLETE PARANEOPLASTIC PRFL, SERUM\t12444R\tNEO PARANEOPLASTIC PRFL\t#VALUE!\t4481154.545\t0\tNone\tNone\t11\t49292700\t2.91E+14
+LAB BLOOD ORDERABLES\t912869\tLAB12443R\tNEO PARANEOPLASTIC PRFL\t12444R\tNEO PARANEOPLASTIC PRFL\t#VALUE!\t2150280\t0\tNone\tNone\t1\t2150280\t4.62E+12
+LAB BLOOD ORDERABLES\t961557\tLAB12809R\tCK ISOENZYME ELECTROPHORESIS\tCKEP\tCK ISOENZYME ELECTROPHORESIS\t#VALUE!\t4442.926829\t0\tNone\tNone\t41\t182160\t32746600800
+LAB BLOOD ORDERABLES\t961563\tLAB12815R\tLYME DISEASE AB IGG IGM W/RFLX\t12830R\tLYME AB SCREEN\t#VALUE!\t253813.6364\t0\tNone\tNone\t22\t5583900\t1.82E+12
+LAB BLOOD ORDERABLES\t961569\tLAB13007R\tQ FEVER IGG PHASE I TITER\t12012R\tQ FEVER IGG PHASE L TITER\t#VALUE!\t0\t0\tNone\tNone\t1\t0\t0
+LAB BLOOD ORDERABLES\t961571\tLAB13008R\tQ FEVER IGG PHASE II TITER\t12014R\tQ FEVER IGG PHASE LI TITER\t#VALUE!\t0\t0\tNone\tNone\t2\t0\t0
+LAB BLOOD ORDERABLES\t961573\tLAB13009R\tQ FEVER IGM PHASE I TITER\t12013R\tQ FEVER IGM PHASE L TITER\t#VALUE!\t0\t0\tNone\tNone\t1\t0\t0
+LAB BLOOD ORDERABLES\t961575\tLAB13010R\tQ FEVER IGM PHASE II TITER\t12015R\tQ FEVER IGM PHASE LI TITER\t#VALUE!\t0\t0\tNone\tNone\t1\t0\t0
+LAB BLOOD ORDERABLES\t961580\tLABHITIA\tHIT FUNCTIONAL ASSAY\tHITI2\tHIT COMMENT\t#VALUE!\t134929.92\t0\tNone\tNone\t125\t16866240\t2.96E+12
+LAB BLOOD ORDERABLES\t961582\tLAB12836R\tETHYLENE GLYCOL\t12837R\tETHYLENE GLYCOL\t#VALUE!\t517470\t0\tNone\tNone\t2\t1034940\t1.04E+12
+LAB BLOOD ORDERABLES\t966899\tLAB12599R\tDILATED CARDIOMYOPATHY PANEL\t12598R\tDILATED CARDIOMYOPATHY PANEL\t#VALUE!\t6362440\t0\tNone\tNone\t3\t19087320\t1.22E+14
+LAB BLOOD ORDERABLES\t977675\tLABMALSC\tMALARIA PREP AND ANTIGEN SCREEN\tMALSCD\tMALARIA ANTIGEN DESCRIPTION\t#VALUE!\t162025.3125\t0\tNone\tNone\t64\t10369620\t3.66E+13
+LAB BLOOD ORDERABLES\t978243\tLAB12582R\tLYMPH MITOGEN AND ANTIGEN SCRN\t12672R\tTETANUS INTERPRETATION\t#VALUE!\t1024890\t0\tNone\tNone\t2\t2049780\t2.10E+12
+LAB BLOOD ORDERABLES\t978243\tLAB12582R\tLYMPH MITOGEN AND ANTIGEN SCRN\t12674R\tCANDIDA INTERPRETATION\t#VALUE!\t1024890\t0\tNone\tNone\t2\t2049780\t2.10E+12
+LAB BLOOD ORDERABLES\t978243\tLAB12582R\tLYMPH MITOGEN AND ANTIGEN SCRN\tCONINT\tCON A INTERPRETATION\t#VALUE!\t1024890\t0\tNone\tNone\t2\t2049780\t2.10E+12
+LAB BLOOD ORDERABLES\t978243\tLAB12582R\tLYMPH MITOGEN AND ANTIGEN SCRN\tPHAINT\tPHA INTERPRETATION\t#VALUE!\t1024890\t0\tNone\tNone\t2\t2049780\t2.10E+12
+LAB BLOOD ORDERABLES\t978243\tLAB12582R\tLYMPH MITOGEN AND ANTIGEN SCRN\tPWMINT\tPWM INTERPRETATION\t#VALUE!\t1024890\t0\tNone\tNone\t2\t2049780\t2.10E+12
+LAB BLOOD ORDERABLES\t978528\tLAB12657R\tT CELL ACTIVATION\t12658R\tT CELL ACTIVATION\t#VALUE!\t229920\t0\tNone\tNone\t9\t2069280\t2.17E+12
+LAB BLOOD ORDERABLES\t978532\tLAB12651R\tHYPERTROPHIC CARDIOMYOPATHY PAN\t12650R\tHYPERTROPHIC CARDIOMYOPATHY PANEL\t#VALUE!\t5240112\t0\tNone\tNone\t5\t26200560\t1.40E+14
+LAB BLOOD ORDERABLES\t978552\tLAB12643R\tBRUTON\'S TYROSINE KINASE (BTK)\t12642R\tBTK PROTEIN FLOW\t#VALUE!\t233640\t0\tNone\tNone\t1\t233640\t54587649600
+LAB BLOOD ORDERABLES\t979488\tLAB12761R\tHEPATITIS B VIRUS GENOTYPE\t12757R\tHBV GENOTYPE\t#VALUE!\t663900\t0\tNone\tNone\t1\t663900\t4.41E+11
+LAB BLOOD ORDERABLES\t1039019\tLABHITPNL\tHEPARIN INDUCED THROMBOCYTOPENIA PANEL\tHITI2\tHIT COMMENT\t#VALUE!\t125334.3396\t0\tNone\tNone\t53\t6642720\t1.05E+12
+LAB BLOOD ORDERABLES\t1039019\tLABHITPNL\tHEPARIN INDUCED THROMBOCYTOPENIA PANEL\tPF4COM\tPF4 COMMENT\t#VALUE!\t125334.3396\t0\tNone\tNone\t53\t6642720\t1.05E+12
+LAB INTERNAL\t590536\tLABCOPYPT\tCOPY REQUEST\tCOPYTO\tSEND COPY TO\t#VALUE!\t120\t0\tNone\tNone\t1\t120\t14400
+MICROBIOLOGY ORDERABLES\t471548\tLABAID\tAEROBIC ORGANISM ID\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t255120\t0\tNone\tNone\t1\t255120\t65086214400
+MICROBIOLOGY ORDERABLES\t471783\tLABBSME\tBLOOD PARASITE EXAM (NOT MALARIA)\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t180211.7241\t0\tNone\tNone\t87\t15678420\t3.56E+12
+MICROBIOLOGY ORDERABLES\t471792\tLABBONC\tBONE CULTURE AND GRAM STAIN\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t527037.1429\t0\tNone\tNone\t21\t11067780\t8.79E+12
+MICROBIOLOGY ORDERABLES\t471792\tLABBONC\tBONE CULTURE AND GRAM STAIN\tGS\tGRAM STAIN\t#VALUE!\t527037.1429\t0\tNone\tNone\t21\t11067780\t8.79E+12
+MICROBIOLOGY ORDERABLES\t472115\tLABCRFA\tCRYPTOSPORIDIUM DFA\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t212126.9388\t0\tNone\tNone\t49\t10394220\t3.21E+12
+MICROBIOLOGY ORDERABLES\t472197\tLABDPARE\tDIRECT PARASITE EXAM\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t79170\t0\tNone\tNone\t2\t158340\t12620538000
+MICROBIOLOGY ORDERABLES\t472396\tLABFLDS\tFLUID STERILITY TEST\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t389580\t0\tNone\tNone\t1\t389580\t1.52E+11
+MICROBIOLOGY ORDERABLES\t472593\tLABIDWEE\tWORM ID\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t55380\t0\tNone\tNone\t1\t55380\t3066944400
+MICROBIOLOGY ORDERABLES\t472673\tLABISOBR\tISOLATOR BRUCELLA\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t472742\tLABLEGDD\tLEGIONELLA CULTURE, D AND D\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t752360\t0\tNone\tNone\t6\t4514160\t3.41E+12
+MICROBIOLOGY ORDERABLES\t472850\tLABINFO\tMICROBIOLOGY INFORMATION ONLY\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t473016\tLABNASC\tNP / NASAL CULTURE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t229096\t0\tNone\tNone\t15\t3436440\t8.88E+11
+MICROBIOLOGY ORDERABLES\t473203\tLABROMSP\tMICROSPORIDIUM SCREEN\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t304958.4615\t0\tNone\tNone\t78\t23786760\t1.00E+13
+MICROBIOLOGY ORDERABLES\t473205\tLABROPK\tISOSPORA/CYCLOSPORA SCREEN\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t197685.5769\t0\tNone\tNone\t104\t20559300\t5.86E+12
+MICROBIOLOGY ORDERABLES\t473206\tLABROSBBP\tR/O STREP BETA GP B BY PCR\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t115550\t0\tNone\tNone\t6\t693300\t89094740400
+MICROBIOLOGY ORDERABLES\t473207\tLABROVRE\tVRE SCREEN\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t272595\t0\tNone\tNone\t4\t1090380\t3.15E+11
+MICROBIOLOGY ORDERABLES\t473372\tLABSTLCP\tSTOOL CULTURE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t316267.8\t0\tNone\tNone\t100\t31626780\t1.20E+13
+MICROBIOLOGY ORDERABLES\t473374\tINACTIVE 7\tSTOOL CULTURE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t3770\t0\tNone\tNone\t6\t22620\t511664400
+MICROBIOLOGY ORDERABLES\t473374\tLABSTLCX\tSTOOL CULTURE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t26115\t0\tNone\tNone\t4\t104460\t10911891600
+MICROBIOLOGY ORDERABLES\t473710\tLABMMIC\tUNLISTED MICROBIOLOGY ORDER\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t518040\t0\tNone\tNone\t1\t518040\t2.68E+11
+MICROBIOLOGY ORDERABLES\t473756\tLABVSTLC\tVIRAL STOOL CULTURE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t1262815.2\t0\tNone\tNone\t75\t94711140\t1.20E+14
+MICROBIOLOGY ORDERABLES\t744392\tLABDVEFLB\tDIRECT VIRAL EXAM FLU B\tDVE\tRESULTS\t#VALUE!\t52970.76923\t0\tNone\tNone\t13\t688620\t38987182800
+MICROBIOLOGY ORDERABLES\t744394\tLABDVERSV\tDIRECT VIRAL EXAM RSV\tDVE\tRESULTS\t#VALUE!\t61173.10345\t0\tNone\tNone\t29\t1774020\t1.29E+11
+MICROBIOLOGY ORDERABLES\t744396\tLABDVEADV\tDIRECT VIRAL EXAM ADENO\tDVE\tRESULTS\t#VALUE!\t49680\t0\tNone\tNone\t1\t49680\t2468102400
+MICROBIOLOGY ORDERABLES\t744398\tLABDVEP1\tDIRECT VIRAL EXAM PARA 1\tDVE\tRESULTS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MICROBIOLOGY ORDERABLES\t744404\tLABDVEMPV\tDIRECT VIRAL EXAM MPV\tDVE\tRESULTS\t#VALUE!\t90300\t0\tNone\tNone\t2\t180600\t16389079200
+MICROBIOLOGY ORDERABLES\t870895\tLABBACIDI\tBACTERIA ID BY SEQUENCING, ISOLATE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t48300\t0\tNone\tNone\t1\t48300\t2332890000
+MICROBIOLOGY ORDERABLES\t870897\tLABFUNIDI\tFUNGAL ID BY SEQUENCING FROM ISOLATE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t569880\t0\tNone\tNone\t4\t2279520\t2.21E+12
+MICROBIOLOGY ORDERABLES\t870897\tLABFUNIDI\tFUNGI ID BY SEQUENCING, ISOLATE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t48300\t0\tNone\tNone\t1\t48300\t2332890000
+MICROBIOLOGY ORDERABLES\t912857\tLABFUNIDS\tFUNGAL ID BY SEQUENCING\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t647532\t0\tNone\tNone\t5\t3237660\t3.07E+12
+MICROBIOLOGY ORDERABLES\t912857\tLABFUNIDS\tFUNGAL ID BY SEQUENCING FROM SPECIMEN\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t471560\t0\tNone\tNone\t18\t8488080\t5.50E+12
+MICROBIOLOGY ORDERABLES\t979486\tLABCRYEIA\tCRYPTOSPORIDIUM EIA\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t80326.5\t0\tNone\tNone\t40\t3213060\t3.71E+11
+MOLECULAR DIAG ORDERABLES\t471736\tLABFBCLO\tB - CELL CLONALITY PCR, FLUID\tFBDIR\tINTERPRETED BY\t#VALUE!\t678540\t0\tNone\tNone\t3\t2035620\t2.03E+12
+MOLECULAR DIAG ORDERABLES\t471736\tLABFBCLO\tB - CELL CLONALITY PCR, FLUID\tFBDIS\tDISCLAIMER\t#VALUE!\t678540\t0\tNone\tNone\t3\t2035620\t2.03E+12
+MOLECULAR DIAG ORDERABLES\t471737\tLABTBCLO\tB - CELL CLONALITY PCR, TISSUE\tTBCDIR\tINTERPRETED BY\t#VALUE!\t599640\t0\tNone\tNone\t1\t599640\t3.60E+11
+MOLECULAR DIAG ORDERABLES\t471737\tLABTBCLO\tB - CELL CLONALITY PCR, TISSUE\tTBCDIS\tDISCLAIMER\t#VALUE!\t599640\t0\tNone\tNone\t1\t599640\t3.60E+11
+MOLECULAR DIAG ORDERABLES\t471747\tLABBCRABL\tBCR - ABL, BLOOD\tBCRDIS\tDISCLAIMER\t#VALUE!\t488214.4565\t0\tNone\tNone\t184\t89831460\t6.08E+13
+MOLECULAR DIAG ORDERABLES\t471748\tLABBMBCR\tBCR - ABL, BONE MARROW\tBMBRDR\tINTERPRETED BY\t#VALUE!\t488123.0769\t0\tNone\tNone\t26\t12691200\t8.34E+12
+MOLECULAR DIAG ORDERABLES\t471748\tLABBMBCR\tBCR - ABL, BONE MARROW\tBMBRDS\tDISCLAIMER\t#VALUE!\t488123.0769\t0\tNone\tNone\t26\t12691200\t8.34E+12
+MOLECULAR DIAG ORDERABLES\t471749\tLABTBCR\tBCR - ABL, TISSUE\tTBCRDR\tINTERPRETED BY\t#VALUE!\t77280\t0\tNone\tNone\t1\t77280\t5972198400
+MOLECULAR DIAG ORDERABLES\t471749\tLABTBCR\tBCR - ABL, TISSUE\tTBCRDS\tDISCLAIMER\t#VALUE!\t77280\t0\tNone\tNone\t1\t77280\t5972198400
+MOLECULAR DIAG ORDERABLES\t471749\tLABTBCR\tBCR - ABL, TISSUE\tTBCRES\tRESULTS\t#VALUE!\t77280\t0\tNone\tNone\t1\t77280\t5972198400
+MOLECULAR DIAG ORDERABLES\t471749\tLABTBCR\tBCR - ABL, TISSUE\tTBCRTS\tSOURCE\t#VALUE!\t77280\t0\tNone\tNone\t1\t77280\t5972198400
+MOLECULAR DIAG ORDERABLES\t472393\tLABFBCRQT\tBCR ABL QUANTITATIVE, FLUID\tQFBCRD\tINTERPRETED BY\t#VALUE!\t1367340\t0\tNone\tNone\t2\t2734680\t5.54E+12
+MOLECULAR DIAG ORDERABLES\t472393\tLABFBCRQT\tBCR ABL QUANTITATIVE, FLUID\tQFBCRM\tMETHOD\t#VALUE!\t1367340\t0\tNone\tNone\t2\t2734680\t5.54E+12
+MOLECULAR DIAG ORDERABLES\t472393\tLABFBCRQT\tBCR ABL QUANTITATIVE, FLUID\tQFBCRS\tDISCLAIMER\t#VALUE!\t1367340\t0\tNone\tNone\t2\t2734680\t5.54E+12
+MOLECULAR DIAG ORDERABLES\t472393\tLABFBCRQT\tBCR ABL QUANTITATIVE, FLUID\tQFBCRX\tCLINICAL INDICATION\t#VALUE!\t1367340\t0\tNone\tNone\t2\t2734680\t5.54E+12
+MOLECULAR DIAG ORDERABLES\t473393\tLABT1114\tT(11\t14) BY PCR\tT11DS\tDISCLAIMER\t#VALUE!\t266970\t0\tNone\tNone\t2\t533940\t2.85E+11
+MOLECULAR DIAG ORDERABLES\t473393\tLABT1114\tT(11\t14) BY PCR\tT11MT\tMETHOD\t#VALUE!\t266970\t0\tNone\tNone\t2\t533940\t2.85E+11
+MOLECULAR DIAG ORDERABLES\t473395\tLABBM1114\tT(11\t14) BY PCR,BONE MARROW\tBM11DS\tDISCLAIMER\t#VALUE!\t1087500\t0\tNone\tNone\t2\t2175000\t2.77E+12
+MOLECULAR DIAG ORDERABLES\t473395\tLABBM1114\tT(11\t14) BY PCR,BONE MARROW\tBM11MD\tINTERPRETED BY\t#VALUE!\t1087500\t0\tNone\tNone\t2\t2175000\t2.77E+12
+MOLECULAR DIAG ORDERABLES\t473395\tLABBM1114\tT(11\t14) BY PCR,BONE MARROW\tBM11MT\tMETHOD\t#VALUE!\t1087500\t0\tNone\tNone\t2\t2175000\t2.77E+12
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFT15DI\tDISCLAIMER\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFT15DX\tCLINICAL INDICATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFT15MD\tINTERPRETED BY\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFT15ME\tMETHOD\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473402\tLABFT1517\tT(15\t17) PML/RAR, FLUID\tFT15RE\tRESULT, FLD\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+MOLECULAR DIAG ORDERABLES\t473404\tLABTT1517\tT(15\t17) PML/RAR, TISSUE\tTT15DI\tDISCLAIMER\t#VALUE!\t909120\t0\tNone\tNone\t1\t909120\t8.26E+11
+MOLECULAR DIAG ORDERABLES\t473404\tLABTT1517\tT(15\t17) PML/RAR, TISSUE\tTT15MD\tINTERPRETED BY\t#VALUE!\t909120\t0\tNone\tNone\t1\t909120\t8.26E+11
+MOLECULAR DIAG ORDERABLES\t473404\tLABTT1517\tT(15\t17) PML/RAR, TISSUE\tTT15ME\tMETHOD\t#VALUE!\t909120\t0\tNone\tNone\t1\t909120\t8.26E+11
+MOLECULAR DIAG ORDERABLES\t473407\tLABFTCLO\tT-CELL CLONALITY PCR, FLUID\tFTDIR\tINTERPRETED BY\t#VALUE!\t763860\t0\tNone\tNone\t1\t763860\t5.83E+11
+MOLECULAR DIAG ORDERABLES\t473407\tLABFTCLO\tT-CELL CLONALITY PCR, FLUID\tFTDIS\tDISCLAIMER\t#VALUE!\t763860\t0\tNone\tNone\t1\t763860\t5.83E+11
+MOLECULAR DIAG ORDERABLES\t473407\tLABFTCLO\tT-CELL CLONALITY PCR, FLUID\tFTPRM\tPRIMERS\t#VALUE!\t763860\t0\tNone\tNone\t1\t763860\t5.83E+11
+MOLECULAR DIAG ORDERABLES\t473408\tLABTTCLO\tT-CELL CLONALITY PCR, TISSUE\tTTCDIR\tINTERPRETED BY\t#VALUE!\t1195020\t0\tNone\tNone\t3\t3585060\t4.32E+12
+MOLECULAR DIAG ORDERABLES\t473408\tLABTTCLO\tT-CELL CLONALITY PCR, TISSUE\tTTCDIS\tDISCLAIMER\t#VALUE!\t1195020\t0\tNone\tNone\t3\t3585060\t4.32E+12
+MOLECULAR DIAG ORDERABLES\t670947\tLABEGFRP\tEGFR GENE MUTATION PANEL\tEGFDI\tDISCLAIMER\t#VALUE!\t1050420\t0\tNone\tNone\t2\t2100840\t3.23E+12
+MOLECULAR DIAG ORDERABLES\t670947\tLABEGFRP\tEGFR GENE MUTATION PANEL\tEGFIN\tINTERPRETATION\t#VALUE!\t333780\t0\tNone\tNone\t1\t333780\t1.11E+11
+MOLECULAR DIAG ORDERABLES\t670947\tLABEGFRP\tEGFR GENE MUTATION PANEL\tEGFMD\tINTERPRETED BY\t#VALUE!\t333780\t0\tNone\tNone\t1\t333780\t1.11E+11
+MOLECULAR DIAG ORDERABLES\t670947\tLABEGFRP\tEGFR GENE MUTATION PANEL\tEGFME\tMETHOD\t#VALUE!\t1050420\t0\tNone\tNone\t2\t2100840\t3.23E+12
+MOLECULAR DIAG ORDERABLES\t889710\tLABCSMPBM\tCANCER SOMATIC MUTATION PNL, BM\tCSDIM\tDISCLAIMER\t#VALUE!\t784098.806\t0\tNone\tNone\t134\t105069240\t1.02E+14
+MOLECULAR DIAG ORDERABLES\t889710\tLABCSMPBM\tCANCER SOMATIC MUTATION PNL, BM\tCSMEM\tMETHOD\t#VALUE!\t784098.806\t0\tNone\tNone\t134\t105069240\t1.02E+14
+MOLECULAR DIAG ORDERABLES\t889710\tLABCSMPBM\tCANCER SOMATIC MUTATION PNL, BM\tCSREFM\tREFERENCES\t#VALUE!\t784098.806\t0\tNone\tNone\t134\t105069240\t1.02E+14
+MOLECULAR DIAG ORDERABLES\t889716\tLABNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION\tNPMDI\tDISCLAIMER\t#VALUE!\t586220.2941\t0\tNone\tNone\t68\t39862980\t2.74E+13
+MOLECULAR DIAG ORDERABLES\t889716\tLABNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION\tNPMIN\tINTERPRETATION\t#VALUE!\t586220.2941\t0\tNone\tNone\t68\t39862980\t2.74E+13
+MOLECULAR DIAG ORDERABLES\t889716\tLABNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION\tNPMMD\tINTERPRETED BY\t#VALUE!\t586220.2941\t0\tNone\tNone\t68\t39862980\t2.74E+13
+MOLECULAR DIAG ORDERABLES\t889716\tLABNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION\tNPMRF\tREFERENCES\t#VALUE!\t586220.2941\t0\tNone\tNone\t68\t39862980\t2.74E+13
+MOLECULAR DIAG ORDERABLES\t889718\tLABBMNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION, BM\tBMNPDI\tDISCLAIMER\t#VALUE!\t540720\t0\tNone\tNone\t66\t35687520\t2.44E+13
+MOLECULAR DIAG ORDERABLES\t889718\tLABBMNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION, BM\tBMNPIN\tINTERPRETATION, BM\t#VALUE!\t540720\t0\tNone\tNone\t66\t35687520\t2.44E+13
+MOLECULAR DIAG ORDERABLES\t889718\tLABBMNPM1\tNPM1, NUCLEOPHOSMIN 1 MUTATION, BM\tBMNPRF\tREFERENCES\t#VALUE!\t540720\t0\tNone\tNone\t66\t35687520\t2.44E+13
+OR PROCEDURES\t659968\tCRP139\tICD GENERATOR AND LEAD INS/REP DUAL\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+OR PROCEDURES\t660294\tCRP332\tRIGHT HEART C NIPRIDE STUDY\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+OR PROCEDURES\t660420\tCRP398\tVALVULOPLASTY ADULT\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+PEDS ANGIO ORDERABLES\t474844\tIMG13RHC\tPED RT HEART CATH\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+PEDS ANGIO ORDERABLES\t474847\tIMG13VA\tPED VALVULOPLASTY AO V\tPDF\tPDF RESULT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+PFT ORDERABLES\t471482\tPFT43\tFULL SPIROMETRY WITH SVC MVV\tPDF\tPDF RESULT\t#VALUE!\t253380\t0\tNone\tNone\t1\t253380\t64201424400
+PFT ORDERABLES\t471484\tPFT45\tLUNG VOLUMES\tPDF\tPDF RESULT\t#VALUE!\t4288380\t0\tNone\tNone\t1\t4288380\t1.84E+13
+PFT ORDERABLES\t471491\tPFT50\tROUTINE STDY - ABG, SPIRO W/BDR,DLCO,VOL\tPDF\tPDF RESULT\t#VALUE!\t37740\t0\tNone\tNone\t2\t75480\t3834295200
+PFT ORDERABLES\t471497\tPFT53\tSPIROMETRY WITH ABG\tPDF\tPDF RESULT\t#VALUE!\t213840\t0\tNone\tNone\t1\t213840\t45727545600
+PFT ORDERABLES\t471498\tPFT54\tSPIROMETRY WITH DLCO\tPDF\tPDF RESULT\t#VALUE!\t555360\t0\tNone\tNone\t4\t2221440\t1.46E+12
+PFT ORDERABLES\t669779\tPFT59\tSPIROMETRY\tPDF\tPDF RESULT\t#VALUE!\t882945.6\t0\tNone\tNone\t50\t44147280\t6.91E+13
+POINT OF CARE (NON LAB) TESTS\t473370\tPOC5\tPOC STOOL - OCCULT BLOOD EXAM (UNIT PERFORMED)\tT11DX\tCLINICAL INDICATION\t#VALUE!\t660\t0\tNone\tNone\t1\t660\t435600
+POINT OF CARE (NON LAB) TESTS\t505766\tPOC6\tPOC PPD SKIN TEST (IP)\tPPDINT\tPPD INTERPRETATION\t#VALUE!\t261720\t0\tNone\tNone\t1\t261720\t68497358400
+POINT OF CARE (NON LAB) TESTS\t507566\tPOC3\tPOC URINE DIPSTICK FOR KETONES\tPHLOC\tLOCATION\t#VALUE!\t13600\t0\tNone\tNone\t3\t40800\t1048500000
+POINT OF CARE (NON LAB) TESTS\t610680\tPOC31\tPOC NITRAZINE PAPER FOR PH MEASUREMENT\tQC7\tQC 7 RESULT\t#VALUE!\t-14672.40876\t0\tNone\tNone\t137\t-2010120\t2.71E+11
+POINT OF CARE (NON LAB) TESTS\t610680\tPOC31\tPOC NITRAZINE PAPER FOR PH MEASUREMENT\tTESTEXP\tTEST STRIP EXP DATE\t#VALUE!\t-14672.40876\t0\tNone\tNone\t137\t-2010120\t2.71E+11
+POINT OF CARE (NON LAB) TESTS\t610680\tPOC31\tPOC NITRAZINE PAPER FOR PH MEASUREMENT\tTESTLOT\tTEST STRIP LOT#\t#VALUE!\t-14672.40876\t0\tNone\tNone\t137\t-2010120\t2.71E+11
+STOOL ORDERABLES\t471633\tLABCANNAB\tNEURONAL NUCLEAR AB, CSF\tCANNA3\tNEURONAL NUCLEAR AB, CSF\t#VALUE!\t764260\t0\tNone\tNone\t6\t4585560\t4.58E+12
+STOOL ORDERABLES\t471693\tLABASPERP\tASPERGILLUS AB ID\tASPERP\tASPERGILLUS AB (ID)\t#VALUE!\t340350\t0\tNone\tNone\t4\t1361400\t4.73E+11
+STOOL ORDERABLES\t471801\tLABYBRUC\tBRUCELLA IGG AND IGM AB\tYBRUC1\tBRUCELLA AB ,IGG\t#VALUE!\t317841.8571\t0\tNone\tNone\t140\t44497860\t1.67E+13
+STOOL ORDERABLES\t471801\tLABYBRUC\tBRUCELLA IGG AND IGM AB\tYBRUC2\tBRUCELLA AB ,IGM\t#VALUE!\t317841.8571\t0\tNone\tNone\t140\t44497860\t1.67E+13
+STOOL ORDERABLES\t471801\tLABYBRUC\tBRUCELLA IGG AND IGM AB\tYBRUC3\tINTERPRETATION\t#VALUE!\t317841.8571\t0\tNone\tNone\t140\t44497860\t1.67E+13
+STOOL ORDERABLES\t471952\tLABCELDIS\tCELIAC DISEASE SYSTEM\tCELDR\tCELIAC DISEASE SYS\t#VALUE!\t777200\t0\tNone\tNone\t3\t2331600\t2.00E+12
+STOOL ORDERABLES\t472230\tLAB11112R\tDONOR TOXOPLASMA AB\tDTOXOM\tDONOR TOXO IGM\t#VALUE!\t3589900\t0\tNone\tNone\t3\t10769700\t8.46E+13
+STOOL ORDERABLES\t472247\tLABYGDA\tDRUG SCREEN, FLUIDS\tDRUGSCRNFLD\tDRUG SCRN, GENERAL, BIOLOGICAL FL\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t472247\tLABYGDA\tDRUG SCREEN, FLUIDS\tYGDA2\tSUSPECT DRUG\t#VALUE!\t145740\t0\tNone\tNone\t2\t291480\t81166788000
+STOOL ORDERABLES\t472311\tLABYEMA\tENDOMYSIAL ANTIBODIES, SERUM\tYEMAIN\tENDOMYSIAL ABS, SERUM\t#VALUE!\t283740\t0\tNone\tNone\t1\t283740\t80508387600
+STOOL ORDERABLES\t472323\tLABYEB\tEBV AB PROFILE, SERUM\tYEB1\tEBV VCA IGG AB\t#VALUE!\t245840\t0\tNone\tNone\t3\t737520\t1.82E+11
+STOOL ORDERABLES\t472323\tLABYEB\tEBV AB PROFILE, SERUM\tYEB2\tEBV VCA IGM AB\t#VALUE!\t245840\t0\tNone\tNone\t3\t737520\t1.82E+11
+STOOL ORDERABLES\t472323\tLABYEB\tEBV AB PROFILE, SERUM\tYEB3\tEBNA AB\t#VALUE!\t245840\t0\tNone\tNone\t3\t737520\t1.82E+11
+STOOL ORDERABLES\t472323\tLABYEB\tEBV AB PROFILE, SERUM\tYEB4\tINTERPRETATION\t#VALUE!\t245840\t0\tNone\tNone\t3\t737520\t1.82E+11
+STOOL ORDERABLES\t472594\tLABIBDDI\tIBD DIAGNOSTIC SYSTEM\tIBDDR\tIBD DIAGNOSTIC SYS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t472630\tLABYKLFRE\tIMMUNO FREE LIGHT CHAINS\tYKLF1\tKAPPA FREE LIGHT CHAIN, S\t#VALUE!\t162735\t0\tNone\tNone\t8\t1301880\t2.38E+11
+STOOL ORDERABLES\t472630\tLABYKLFRE\tIMMUNO FREE LIGHT CHAINS\tYKLF2\tLAMBDA FREE LIGHT CHAIN, S\t#VALUE!\t162735\t0\tNone\tNone\t8\t1301880\t2.38E+11
+STOOL ORDERABLES\t472630\tLABYKLFRE\tIMMUNO FREE LIGHT CHAINS\tYKLF3\tKAPPA/LAMBDA FLC RATIO\t#VALUE!\t162735\t0\tNone\tNone\t8\t1301880\t2.38E+11
+STOOL ORDERABLES\t472644\tLABYINFAB\tINFLUENZA AB PANEL\tYINF1\tINFLUENZA VIRUS A AB, IGG & IGM\t#VALUE!\t245647.5\t0\tNone\tNone\t8\t1965180\t5.15E+11
+STOOL ORDERABLES\t472644\tLABYINFAB\tINFLUENZA AB PANEL\tYINF2\tINFLUENZA VIRUS A AB, IGG\t#VALUE!\t259189.3333\t0\tNone\tNone\t45\t11663520\t3.27E+12
+STOOL ORDERABLES\t472644\tLABYINFAB\tINFLUENZA AB PANEL\tYINF3\tINFLUENZA VIRUS A AB, IGM\t#VALUE!\t259189.3333\t0\tNone\tNone\t45\t11663520\t3.27E+12
+STOOL ORDERABLES\t472644\tLABYINFAB\tINFLUENZA AB PANEL\tYINF4\tINFLUENZA VIRUS B AB, IGG & IGM\t#VALUE!\t245647.5\t0\tNone\tNone\t8\t1965180\t5.15E+11
+STOOL ORDERABLES\t472644\tLABYINFAB\tINFLUENZA AB PANEL\tYINF5\tINFLUENZA VIRUS B AB, IGG\t#VALUE!\t259189.3333\t0\tNone\tNone\t45\t11663520\t3.27E+12
+STOOL ORDERABLES\t472644\tLABYINFAB\tINFLUENZA AB PANEL\tYINF6\tINFLUENZA VIRUS B AB, IGM\t#VALUE!\t259189.3333\t0\tNone\tNone\t45\t11663520\t3.27E+12
+STOOL ORDERABLES\t472657\tLABYINSFT\tINSULIN FREE AND TOTAL\tINS\tINSULIN\t#VALUE!\t421560\t0\tNone\tNone\t5\t2107800\t1.23E+12
+STOOL ORDERABLES\t472657\tLABYINSFT\tINSULIN FREE AND TOTAL\tYINSF1\tFREE INSULIN\t#VALUE!\t421560\t0\tNone\tNone\t5\t2107800\t1.23E+12
+STOOL ORDERABLES\t472722\tLABYLACTS\tLACTOFERRIN DETECTION, STOOL\tYLACT1\tLACTOFERRIN DETECTION\t#VALUE!\t401266.1538\t0\tNone\tNone\t39\t15649380\t7.59E+12
+STOOL ORDERABLES\t472749\tLABYLAP\tLEUKOCYTE ALKALINE PHOSPATASE SCORE\tYLAP1\tLAP SCORE\t#VALUE!\t187714.2857\t0\tNone\tNone\t7\t1314000\t3.12E+11
+STOOL ORDERABLES\t472753\tLABYFCHYL\tLIPID ANALYSIS, BODY FLUID\tYFCHY1\tFLUID TYPE\t#VALUE!\t177360\t0\tNone\tNone\t1\t177360\t31456569600
+STOOL ORDERABLES\t472753\tLABYFCHYL\tLIPID ANALYSIS, BODY FLUID\tYFCHY6\tCOMMENT\t#VALUE!\t177360\t0\tNone\tNone\t1\t177360\t31456569600
+STOOL ORDERABLES\t472776\tLABLAS\tLYMPHOCYTE AG STIMULATION SCREEN\tTETINT\tTETANUS INTERPRETATION\t#VALUE!\t908145\t0\tNone\tNone\t4\t3632580\t3.30E+12
+STOOL ORDERABLES\t472784\tLABYSMG\tMAGNESIUM QUANTITATIVE, FECES\tYSMG1\tMAGNESIUM, QN, F\t#VALUE!\t684960\t0\tNone\tNone\t1\t684960\t4.69E+11
+STOOL ORDERABLES\t472955\tLABYNOB\tNEUTROPHIL OXIDATIVE BURST\tNEUTOXB\tNEUTROPHIL OXIDATIVE BURST\t#VALUE!\t29880\t0\tNone\tNone\t1\t29880\t892814400
+STOOL ORDERABLES\t472955\tLABYNOB\tNEUTROPHIL OXIDATIVE BURST\tYNOB2\tINTERPRETATION\t#VALUE!\t29880\t0\tNone\tNone\t1\t29880\t892814400
+STOOL ORDERABLES\t472955\tLABYNOB\tNEUTROPHIL OXIDATIVE BURST\tYNOB3\tREVIEWED BY\t#VALUE!\t29880\t0\tNone\tNone\t1\t29880\t892814400
+STOOL ORDERABLES\t472979\tLABNORW\tNOROVIRUS ANTIGEN, STOOL EIA\tNORW1\tNOROVIRUS,ELA (STOOL)\t#VALUE!\t244852.9167\t0\tNone\tNone\t288\t70517640\t2.37E+13
+STOOL ORDERABLES\t473061\tLABYP4AB\tPARAINFLUENZA AB\tYP4AB1\tTYPE 1\t#VALUE!\t590370\t0\tNone\tNone\t2\t1180740\t7.06E+11
+STOOL ORDERABLES\t473061\tLABYP4AB\tPARAINFLUENZA AB\tYP4AB2\tTYPE 2\t#VALUE!\t590370\t0\tNone\tNone\t2\t1180740\t7.06E+11
+STOOL ORDERABLES\t473061\tLABYP4AB\tPARAINFLUENZA AB\tYP4AB3\tTYPE 3\t#VALUE!\t590370\t0\tNone\tNone\t2\t1180740\t7.06E+11
+STOOL ORDERABLES\t473095\tLAB11138R\tHIV PHENO EXPR ANTIVIR RESIST\tPHENO\tHIV-1 PHENOTYPE\t#VALUE!\t633000\t0\tNone\tNone\t1\t633000\t4.01E+11
+STOOL ORDERABLES\t473218\tLAB13006R\tREDUCING SUBSTANCE, FECES\t13005R\tREDUCING SUBSTANCE, FECES\t#VALUE!\t189315\t0\tNone\tNone\t8\t1514520\t3.87E+11
+STOOL ORDERABLES\t473266\tLABYRICK\tRICKETTSIA AB PANEL\tYRICK1\tSPOTTED FEVER GROUP,AB,IGG,S\t#VALUE!\t333069.6774\t0\tNone\tNone\t31\t10325160\t1.28E+13
+STOOL ORDERABLES\t473281\tLABYRS\tRSV IGG AND IGM AB\tYRS1\tRSV AB, IGG & IGM\t#VALUE!\t307320\t0\tNone\tNone\t1\t307320\t94445582400
+STOOL ORDERABLES\t473281\tLABYRS\tRSV IGG AND IGM AB\tYRS2\tRSV AB, IGG\t#VALUE!\t317796\t0\tNone\tNone\t5\t1588980\t5.26E+11
+STOOL ORDERABLES\t473281\tLABYRS\tRSV IGG AND IGM AB\tYRS3\tRSV AB, IGM\t#VALUE!\t317796\t0\tNone\tNone\t5\t1588980\t5.26E+11
+STOOL ORDERABLES\t473371\tLABCDTPCR\tC DIFFICILE TOXIN B, STOOL\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t231851.4286\t0\tNone\tNone\t21\t4868880\t1.38E+12
+STOOL ORDERABLES\t473371\tLABCDTPCR\tC.DIFF TOXIN B GENE, QUAL. REAL-TIME PCR\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t192800\t0\tNone\tNone\t3\t578400\t1.13E+11
+STOOL ORDERABLES\t473371\tLABTCDIF\tC DIFFICILE TOXIN B, STOOL\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t210925.3091\t0\tNone\tNone\t275\t58004460\t1.38E+13
+STOOL ORDERABLES\t473460\tLAB11122R\tTOXOPLASMA AB, IGM\tTOXOM\tTOXOPLASMA IGM ELISA\t#VALUE!\t2060076.522\t0\tNone\tNone\t23\t47381760\t3.01E+14
+STOOL ORDERABLES\t473460\tLAB11122R\tTOXOPLASMA IGM ELISA\tTOXOM\tTOXOPLASMA IGM ELISA\t#VALUE!\t1477600\t0\tNone\tNone\t3\t4432800\t6.65E+12
+STOOL ORDERABLES\t473460\tLAB11122R\tTOXOPLASMOSIS IGM\tTOXOM\tTOXOPLASMA IGM ELISA\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t473460\tLABTOXOM\tTOXOPLASMOSIS IGM\tTOXOM\tTOXOPLASMA IGM ELISA\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t473462\tLAB11120R\tTOXOPLASMOSIS, CSF\tTOXOC\tTOXOPLASMA AB,CSF\t#VALUE!\t1690331.429\t0\tNone\tNone\t21\t35496960\t1.93E+14
+STOOL ORDERABLES\t473777\tLABVWFPI\tVON WILLEBRAND PROTEASE INHIBITOR\tVWFPIC\tCOMMENT\t#VALUE!\t1187392.5\t0\tNone\tNone\t8\t9499140\t2.35E+13
+STOOL ORDERABLES\t497378\tLABYFMG\tMAGNESIUM, FLUID\tMGFLD\tMAGNESIUM, BODY FLUID\t#VALUE!\t242700\t0\tNone\tNone\t1\t242700\t58903290000
+STOOL ORDERABLES\t497378\tLABYFMG\tMAGNESIUM, FLUID\tYFMG2\tFLUID TYPE\t#VALUE!\t242700\t0\tNone\tNone\t1\t242700\t58903290000
+STOOL ORDERABLES\t497462\tLABFADAG\tADENOVIRUS AG, STOOL\tADAG\tADENOVIRUS AG\t#VALUE!\t259009.322\t0\tNone\tNone\t236\t61126200\t2.30E+13
+STOOL ORDERABLES\t541691\tLABHEPBG\tHEPATITIS B GENOTYPE\tHEPBG1\tHBV GENOTYPE\t#VALUE!\t646914\t0\tNone\tNone\t10\t6469140\t5.30E+12
+STOOL ORDERABLES\t576475\tLAB11299R\tSULFONYLUREA HYPOGLYCEMICS\t11306R\tSULFONYLUREA SCRN\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t670750\tLAB11340R\tADAMTS 13 PROFILE\t11341R\tADAMTS 13 ACTIVITY\t#VALUE!\t631303.6364\t0\tNone\tNone\t11\t6944340\t6.83E+12
+STOOL ORDERABLES\t670762\tLAB11254R\tM AVIUM COMPLEX MIC PANL\t11264R\tSTREPTOMYCIN\t#VALUE!\t455400\t0\tNone\tNone\t1\t455400\t2.07E+11
+STOOL ORDERABLES\t670924\tLAB11437R\tIBD DIAGNOSTIC\t11501R\tIBD DIAGNOSTIC\t#VALUE!\t902580\t0\tNone\tNone\t2\t1805160\t2.52E+12
+STOOL ORDERABLES\t744166\tLAB11512R\tCYSTIC FIBROSIS, SEQUENCING\t11621R\tCYSTIC FIBROSIS, SEQUENCING\t#VALUE!\t2659970\t0\tNone\tNone\t6\t15959820\t4.44E+13
+STOOL ORDERABLES\t744178\tLAB11518R\tBCR-ABL1 KINASE DOMAIN MUT ANL\t11627R\tBCR-ABL1 KINASE DOMAIN MUT ANAL\t#VALUE!\t605820\t0\tNone\tNone\t2\t1211640\t1.46E+12
+STOOL ORDERABLES\t744202\tLAB11531R\tPARANEOPLASTIC AB SCREEN\t11641R\tPARANEOPLASTIC AB SCREEN\t#VALUE!\t2278057.5\t0\tNone\tNone\t88\t200469060\t6.98E+14
+STOOL ORDERABLES\t744228\tLAB11547R\tHEPATITIS C CONFIRMATORY TEST\t11657R\tHEPATITIS C CONFIRMATORY TEST\t#VALUE!\t1722849.6\t0\tNone\tNone\t25\t43071240\t1.11E+14
+STOOL ORDERABLES\t744232\tLAB11549R\tCALIFORNIA ENCEPHALITIS PANEL\t11659R\tCALIFORNIA ENCEPHALITIS PANEL\t#VALUE!\t2417270\t0\tNone\tNone\t12\t29007240\t9.09E+13
+STOOL ORDERABLES\t744264\tLAB11567R\tHTLV-I/II AB, CSF\t11681R\tHTLV-I/II AB\t#VALUE!\t264940\t0\tNone\tNone\t3\t794820\t2.22E+11
+STOOL ORDERABLES\t744266\tLAB11568R\tBRUCELLA SEROLOGIES, CSF\t11683R\tBRUCELLA IGM,CSF\t#VALUE!\t272970\t0\tNone\tNone\t2\t545940\t1.68E+11
+STOOL ORDERABLES\t744270\tLAB11571R\tCYSTIC FIBROSIS, 97 MUTATIONS\t11686R\tCYSTIC FIBROSIS, 97 MUTATIONS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11723R\tLYMPHOCYTE PROLIFERATION, AG\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11728R\tINTERP, CANDIDA ALBICANS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB11596R\tLYMPHO PROLIFERATION, AG\t11733R\tINTERP, TETANUS TOXOID\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t744312\tLAB12284R\tLYMPHO PROLIFERATION, AG\t12285R\t12285R\t#VALUE!\t342800\t0\tNone\tNone\t3\t1028400\t5.85E+11
+STOOL ORDERABLES\t744322\tLAB11606R\tCYTOCHROME P450 2D6 GENOTYPE\t11758R\tCYP2D6 GENOTYPE\t#VALUE!\t390450\t0\tNone\tNone\t4\t1561800\t6.94E+11
+STOOL ORDERABLES\t744322\tLAB11606R\tCYTOCHROME P450 2D6 GENOTYPE\t11759R\tREVIEWED BY\t#VALUE!\t390450\t0\tNone\tNone\t4\t1561800\t6.94E+11
+STOOL ORDERABLES\t864650\tLAB11855R\tHEPATITIS C VIRAL RNA, QUANT\t11854R\tHCV RNA ,QUANT,TMA LOGIU/ML\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+STOOL ORDERABLES\t871212\tLAB12016R\tCYTOMEGALOVIRUS IGG AB, ELISA\t11667R\tCYTOMEGALOVIRUS IGG\t#VALUE!\t229260\t0\tNone\tNone\t1\t229260\t52560147600
+STOOL ORDERABLES\t889720\tLAB12571R\tFLT3-ITD, FLT3-D835 MUTATIONS\t12572R\tFLT3-ITD, FLT3-D835 MUTATIONS\t#VALUE!\t553828.4746\t0\tNone\tNone\t177\t98027640\t9.87E+13
+STOOL ORDERABLES\t890139\tLABSTDY2\tSTUDY TEST\tRESS2\tRESS2\t#VALUE!\t427020\t0\tNone\tNone\t2\t854040\t3.80E+11
+STOOL ORDERABLES\t890251\tLAB12578R\tCHLORIDE, 24 HR STOOL\tYSTCL1\tCHLORIDE, STOOL, 24 HR\t#VALUE!\t1991280\t0\tNone\tNone\t1\t1991280\t3.97E+12
+STOOL ORDERABLES\t1048039\tLAB12866R\tB HENSELAE IGG TITER\tBHIGGT\tB.HENSELAE IGG TITER\t#VALUE!\t60\t0\tNone\tNone\t1\t60\t3600
+URINE ORDERABLES\t471606\tLABAAUR\tAMINO ACIDS, URINE\tAAUINT\tINTERPRETATION\t#VALUE!\t287790\t0\tNone\tNone\t6\t1726740\t5.69E+11
+URINE ORDERABLES\t471606\tLABAAUR\tAMINO ACIDS, URINE\tINTUBY\tINTERPRETED BY\t#VALUE!\t287790\t0\tNone\tNone\t6\t1726740\t5.69E+11
+URINE ORDERABLES\t471611\tLABYUAMC\tAMPHETAMINES CONFIRMATION, URINE\tYUAMIM\tIMMUNOASSAY SCREEN\t#VALUE!\t26760\t0\tNone\tNone\t4\t107040\t11457561600
+URINE ORDERABLES\t471611\tLABYUAMC\tAMPHETAMINES CONFIRMATION, URINE\tYUAMIN\tINTERPRETATION\t#VALUE!\t26760\t0\tNone\tNone\t4\t107040\t11457561600
+URINE ORDERABLES\t471740\tLABYUBBC\tBARBITURATE CONFIRMATION, URINE\tYUBBIM\tIMMUNOASSAY SCREEN\t#VALUE!\t30\t0\tNone\tNone\t2\t60\t3600
+URINE ORDERABLES\t471740\tLABYUBBC\tBARBITURATE CONFIRMATION, URINE\tYUBBIN\tINTERPRETATION\t#VALUE!\t30\t0\tNone\tNone\t2\t60\t3600
+URINE ORDERABLES\t471754\tLABYUBZC\tBENZODIAZEPINE CONFIRMATION, URINE\tYUBZCO\tCOMMENT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t471754\tLABYUBZC\tBENZODIAZEPINE CONFIRMATION, URINE\tYUBZIM\tIMMUNOASSAY SCREEN\t#VALUE!\t0\t0\tNone\tNone\t9\t0\t0
+URINE ORDERABLES\t471754\tLABYUBZC\tBENZODIAZEPINE CONFIRMATION, URINE\tYUBZIN\tINTERPRETATION\t#VALUE!\t0\t0\tNone\tNone\t9\t0\t0
+URINE ORDERABLES\t471754\tLABYUBZC\tBENZODIAZEPINE CONFIRMATION, URINE\tYUBZNO\tNOTE\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t471939\tLABYUFCAT\tCATECHOLAMINES FRACTIONATED FREE, URINE\tYUCATF\tCATECHOLAMINES, URINE\t#VALUE!\t347778.9474\t0\tNone\tNone\t19\t6607800\t2.55E+12
+URINE ORDERABLES\t472046\tLABYUCC\tCOCAINE CONFIRMATION\tYUCOIM\tIMMUNOASSAY SCREEN\t#VALUE!\t30\t0\tNone\tNone\t2\t60\t3600
+URINE ORDERABLES\t472046\tLABYUCC\tCOCAINE CONFIRMATION\tYUCOIN\tINTERPRETATION\t#VALUE!\t30\t0\tNone\tNone\t2\t60\t3600
+URINE ORDERABLES\t472249\tLABDOA\tDRUGS OF ABUSE SCREEN, URINE\tDOACOM\tDOACOM COMMENTS\t#VALUE!\t11906.82203\t0\tNone\tNone\t7552\t89920320\t1.01E+13
+URINE ORDERABLES\t472564\tLABYUHOMO\tHOMOCYSTEINE TOTAL, URINE\tHMCYURN\tHOMOCYSTEIN, TOTAL,U\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t472836\tLABYUMERC\tMERCURY, URINE (TIMED)\tMERURN\tMERCURY, U\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t472836\tLABYUMERC\tMERCURY, URINE (TIMED)\tVOLUMEURN\tURINE VOLUME\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t472836\tLABYUMERC\tMERCURY, URINE (TIMED)\tYUMER2\tCOLLECTION DURATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t472841\tLABYUMETF\tMETANEPHRINES FRACTIONATED, 24H URINE\tYUMECO\tCOMMENT\t#VALUE!\t330442.6667\t0\tNone\tNone\t45\t14869920\t5.39E+12
+URINE ORDERABLES\t472928\tLABMPSTLC\tMUCOPOLYSACCHARIDES TLC, URINE\tMPSTLC\tMUCOPOLYSA, UR, TLC\t#VALUE!\t562020\t0\tNone\tNone\t1\t562020\t3.16E+11
+URINE ORDERABLES\t473028\tLABOSTLC\tOLIGOSACCHARIDES TLC, URINE\tOSTLC\tOLIGOSAC, UR, TLC\t#VALUE!\t561900\t0\tNone\tNone\t1\t561900\t3.16E+11
+URINE ORDERABLES\t473030\tLABYUOPC\tOPIATE CONFIRMATION, URINE\tYUOPCO\tCOMMENT\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t473030\tLABYUOPC\tOPIATE CONFIRMATION, URINE\tYUOPIM\tIMMUNOASSAY SCREEN\t#VALUE!\t14.11764706\t0\tNone\tNone\t17\t240\t14400
+URINE ORDERABLES\t473030\tLABYUOPC\tOPIATE CONFIRMATION, URINE\tYUOPIN\tINTERPRETATION\t#VALUE!\t14.11764706\t0\tNone\tNone\t17\t240\t14400
+URINE ORDERABLES\t473034\tLABUORG\tORGANIC ACIDS, URINE\tORGU\tORGANIC ACIDS, URINE\t#VALUE!\t438277.5\t0\tNone\tNone\t8\t3506220\t1.68E+12
+URINE ORDERABLES\t473034\tLABUORG\tORGANIC ACIDS, URINE\tORGUIN\tINTERPRETATION\t#VALUE!\t438277.5\t0\tNone\tNone\t8\t3506220\t1.68E+12
+URINE ORDERABLES\t473092\tLABYUPCPC\tPHENCYCLIDINE CONFIRMATION, URINE\tYUPCIM\tIMMUNOASSAY SCREEN\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t473092\tLABYUPCPC\tPHENCYCLIDINE CONFIRMATION, URINE\tYUPCIN\tINTERPRETATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t473192\tLABYUPPP\tPURINE AND PYRINIDINE PANEL, URINE\tPPPCOM\tCOMMENTS\t#VALUE!\t833760\t0\tNone\tNone\t1\t833760\t6.95E+11
+URINE ORDERABLES\t473192\tLABYUPPP\tPURINE AND PYRINIDINE PANEL, URINE\tUHYPOX\tHYPOXANTHINE\t#VALUE!\t833760\t0\tNone\tNone\t1\t833760\t6.95E+11
+URINE ORDERABLES\t473192\tLABYUPPP\tPURINE AND PYRINIDINE PANEL, URINE\tURIC\tURIC ACID\t#VALUE!\t833760\t0\tNone\tNone\t1\t833760\t6.95E+11
+URINE ORDERABLES\t473192\tLABYUPPP\tPURINE AND PYRINIDINE PANEL, URINE\tUURAC\tURACIL\t#VALUE!\t833760\t0\tNone\tNone\t1\t833760\t6.95E+11
+URINE ORDERABLES\t473192\tLABYUPPP\tPURINE AND PYRINIDINE PANEL, URINE\tUXANT\tXANTHINE\t#VALUE!\t833760\t0\tNone\tNone\t1\t833760\t6.95E+11
+URINE ORDERABLES\t473429\tLABYUTHC\tTETRAHYDROCANNABINOL, URINE\tYUTHIM\tIMMUNOASSAY SCREEN\t#VALUE!\t87930\t0\tNone\tNone\t10\t879300\t2.61E+11
+URINE ORDERABLES\t473429\tLABYUTHC\tTETRAHYDROCANNABINOL, URINE\tYUTHIN\tINTERPRETATION\t#VALUE!\t87930\t0\tNone\tNone\t10\t879300\t2.61E+11
+URINE ORDERABLES\t473732\tLABUAPRN\tURINALYSIS, SCREEN FOR CULTURE\tPEDCOM\tSPECIMEN COMMENT\t#VALUE!\t6620\t0\tNone\tNone\t3\t19860\t338230800
+URINE ORDERABLES\t473744\tLABUVMA\tVANILLYMANDELIC ACID, URINE\tVMAINT\tVMA INTRP\t#VALUE!\t321355.3846\t0\tNone\tNone\t13\t4177620\t1.41E+12
+URINE ORDERABLES\t473744\tLABYUVMA\tVANILLYMANDELIC ACID, URINE\tVMAINT\tVMA INTRP\t#VALUE!\t379830\t0\tNone\tNone\t6\t2278980\t9.13E+11
+URINE ORDERABLES\t473770\tLABUVH\tVMA AND HVA\tVHINT\tVMA/HVA INTRP\t#VALUE!\t309984\t0\tNone\tNone\t10\t3099840\t1.05E+12
+URINE ORDERABLES\t497295\tLABYUALA\tAMINOLEVULINIC ACID, URINE\t12000R\tINTERPRETATION\t#VALUE!\t528440\t0\tNone\tNone\t3\t1585320\t8.64E+11
+URINE ORDERABLES\t497295\tLABYUALA\tAMINOLEVULINIC ACID, URINE\t12682R\tREVIEWED BY\t#VALUE!\t408660\t0\tNone\tNone\t1\t408660\t1.67E+11
+URINE ORDERABLES\t497400\tLABYDROTC\tDRUG SCREEN PRESCRIPTION / OTC\tYDR1\tDRUG SCREEN, PRESCRIP/OTC\t#VALUE!\t9375960\t0\tNone\tNone\t2\t18751920\t2.50E+14
+URINE ORDERABLES\t497478\tLABUHVA\tHOMOVANILLIC ACID, URINE\tHVAINT\tHVA INTRP\t#VALUE!\t335730\t0\tNone\tNone\t2\t671460\t2.26E+11
+URINE ORDERABLES\t621213\tLABUFCATE\tCATECHOLAMINES, URN FREE\tUCATIN\tCATECHOL INTRP , URN\t#VALUE!\t242040\t0\tNone\tNone\t1\t242040\t58583361600
+URINE ORDERABLES\t670951\tLAB11145R\tADULTERANTS SURVEY, URINE\t11147R\tSPECIFIC GRAVITY\t#VALUE!\t13.33333333\t0\tNone\tNone\t54\t720\t43200
+URINE ORDERABLES\t670951\tLAB11145R\tADULTERANTS SURVEY, URINE\t11148R\tPH\t#VALUE!\t13.33333333\t0\tNone\tNone\t54\t720\t43200
+URINE ORDERABLES\t670951\tLAB11145R\tADULTERANTS SURVEY, URINE\t11149R\tOXIDANTS\t#VALUE!\t13.33333333\t0\tNone\tNone\t54\t720\t43200
+URINE ORDERABLES\t670951\tLAB11145R\tADULTERANTS SURVEY, URINE\t11152R\tCOMMENT\t#VALUE!\t13.33333333\t0\tNone\tNone\t54\t720\t43200
+URINE ORDERABLES\t744242\tLAB11554R\tS-SULFOCYSTEINE, URINE\t11664R\tS-SULFOCYSTEINE, URINE\t#VALUE!\t607260\t0\tNone\tNone\t1\t607260\t3.69E+11
+URINE ORDERABLES\t864656\tLAB11863R\tASPIRIN RESISTANCE\t11861R\t11-DEHYDROTHROMBOXANE B2\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+URINE ORDERABLES\t864656\tLAB11863R\tASPIRIN RESISTANCE\t11862R\tCREATININE, RANDOM URINE\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VASCULAR CLINIC ORDERABLES\t519228\tVSC02\tVSC CAROTID VERTEBRAL ARTERY ULTRASOUND\tPDF\tPDF RESULT\t#VALUE!\t223710\t0\tNone\tNone\t12\t2684520\t9.96E+11
+VASCULAR CLINIC ORDERABLES\t519229\tVSC03\tVSC ARTERIAL EXAM/ABI\'S\tPDF\tPDF RESULT\t#VALUE!\t560326.5517\t0\tNone\tNone\t58\t32498940\t1.45E+14
+VASCULAR CLINIC ORDERABLES\t519230\tVSC04\tVSC GRAFT W ABI\'S ART DUP\tPDF\tPDF RESULT\t#VALUE!\t247685.4545\t0\tNone\tNone\t22\t5449080\t3.01E+12
+VASCULAR CLINIC ORDERABLES\t519231\tVSC05\tVSC VENOUS ULTRASOUND\tPDF\tPDF RESULT\t#VALUE!\t397694.5714\t0\tNone\tNone\t70\t27838620\t5.79E+13
+VASCULAR CLINIC ORDERABLES\t519232\tVSC06\tVSC ABDO AORTA ULTRASOUND\tPDF\tPDF RESULT\t#VALUE!\t2182770\t0\tNone\tNone\t4\t8731080\t6.51E+13
+VASCULAR CLINIC ORDERABLES\t519233\tVSC07\tVSC ILIAC ARTERY ULTRASOUND\tPDF\tPDF RESULT\t#VALUE!\t272950\t0\tNone\tNone\t6\t1637700\t6.97E+11
+VASCULAR CLINIC ORDERABLES\t519234\tVSC08\tVSC RENAL ULTRASOUND\tPDF\tPDF RESULT\t#VALUE!\t670069.0909\t0\tNone\tNone\t11\t7370760\t1.92E+13
+VASCULAR CLINIC ORDERABLES\t519235\tVSC09\tVSC MESENTERIC ULTRASOUND\tPDF\tPDF RESULT\t#VALUE!\t241540\t0\tNone\tNone\t3\t724620\t1.91E+11
+VIROLOGY ORDERABLES\t472014\tLABCLGCT2\tCHLAMYDIA GC, PAP FLUID\tDCL3\tTEST INFORMATION\t#VALUE!\t553215\t0\tNone\tNone\t4\t2212860\t1.33E+12
+VIROLOGY ORDERABLES\t472014\tLABCLGCT2\tCHLAMYDIA GC, PAP FLUID\tSDES3\tSPECIMEN\t#VALUE!\t553215\t0\tNone\tNone\t4\t2212860\t1.33E+12
+VIROLOGY ORDERABLES\t472042\tLABCMVQL\tCMV DNA PCR QUAL, NON-BLOOD\tCMVLIP\tTEST DESCRIPTION\t#VALUE!\t165780\t0\tNone\tNone\t3\t497340\t92352106800
+VIROLOGY ORDERABLES\t472043\tLABCMVQT\tCMV PCR QUANTITATIVE\tCMVTIP\tTEST DESCRIPTION\t#VALUE!\t159127.5\t0\tNone\tNone\t8\t1273020\t2.10E+11
+VIROLOGY ORDERABLES\t472198\tLABDVERS\tRSV RAPID ANTIGEN, DIRECT EIA\tRSV\tRESPIRATORY SYNCYTIAL VIRUS\t#VALUE!\t150\t0\tNone\tNone\t2\t300\t5490000
+VIROLOGY ORDERABLES\t472201\tLABDVERTV\tROTAVIRUS EIA (DIRECT VIRAL EXAM)\tDVE\tRESULTS\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t472509\tLABHBPQD\tHEPATITIS B PCR QUANTITATIVE DILUTED\tHBDIPR\tTEST DESCRIPTION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t472512\tLABHCVG\tHEPATITIS C VIRUS GENOTYPING\tHCGG\tHCV GENOTYPE\t#VALUE!\t477894\t0\tNone\tNone\t10\t4778940\t2.88E+12
+VIROLOGY ORDERABLES\t472512\tLABHCVGE\tHEPATITIS C VIRUS GENOTYPING\tHCGG\tHCV GENOTYPE\t#VALUE!\t251340\t0\tNone\tNone\t1\t251340\t63171795600
+VIROLOGY ORDERABLES\t472512\tLABHCVGE\tHEPATITIS C VIRUS GENOTYPING\tHCVGDI\tDISCLAIMER\t#VALUE!\t948855\t0\tNone\tNone\t8\t7590840\t8.74E+12
+VIROLOGY ORDERABLES\t472512\tLABHCVGE\tHEPATITIS C VIRUS GENOTYPING\tHCVGMT\tMETHOD\t#VALUE!\t948855\t0\tNone\tNone\t8\t7590840\t8.74E+12
+VIROLOGY ORDERABLES\t472560\tLABHIVDS\tHIV - 1 AG DONOR SCREEN QUALITATIVE\tHNOT\tHIV-1 AG DONOR SCRN QUAL. NOTE\t#VALUE!\t478889.2308\t0\tNone\tNone\t39\t18676680\t1.07E+13
+VIROLOGY ORDERABLES\t472561\tLABAVRT\tHIV - 1 GENOTYPING\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t583060\t0\tNone\tNone\t3\t1749180\t1.27E+12
+VIROLOGY ORDERABLES\t472561\tLABAVRT\tHIV GENO EXPR ANTIVIR RESIST\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t616970\t0\tNone\tNone\t6\t3701820\t2.62E+12
+VIROLOGY ORDERABLES\t472567\tLABHPVHR2\tHPV DNA PROBE HIGH RISK\tHPTI\tTEST INFORMATION\t#VALUE!\t925207.0588\t0\tNone\tNone\t17\t15728520\t1.88E+13
+VIROLOGY ORDERABLES\t472567\tLABHPVHR2\tHPV DNA PROBE HIGH RISK\tSDES6\tSPECIMEN\t#VALUE!\t925207.0588\t0\tNone\tNone\t17\t15728520\t1.88E+13
+VIROLOGY ORDERABLES\t472569\tLABHSVM\tHSV 1 AND 2 IGM\tHSV2M\tHSV 2 IGM, IFA\t#VALUE!\t282932.3077\t0\tNone\tNone\t52\t14712480\t4.92E+12
+VIROLOGY ORDERABLES\t472574\tLABYHMPVP\tHUMAN METAPNEUMOVIRUS PCR\tYHMP1\tHUMAN METAPNEUMOVIRUS PCR\t#VALUE!\t455820\t0\tNone\tNone\t1\t455820\t2.08E+11
+VIROLOGY ORDERABLES\t473283\tLABRUBM\tRUBELLA AB IGM\tRUBM1\tRUBELLA AB, IGM\t#VALUE!\t258660\t0\tNone\tNone\t1\t258660\t66904995600
+VIROLOGY ORDERABLES\t473283\tLABYRUBM\tRUBELLA AB IGM\tRUBM1\tRUBELLA AB, IGM\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t496777\tLABHIVA2\tHIV - 2 AB\tHIV2\tHIV-2 AB\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t496777\tLABHIVA2\tHIV - 2 AB\tHTL2\tHIV-2 AB NOTE:\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t497325\tLABADVQL\tADENOVIRUS DNA PCR QUAL\tADOV\tADENOVIRUS DNA, QL PCR\t#VALUE!\t107295\t0\tNone\tNone\t4\t429180\t62698006800
+VIROLOGY ORDERABLES\t497325\tLABADVQL\tADENOVIRUS DNA PCR QUAL\tSOURC3\tADENOVIRUS SOURCE\t#VALUE!\t107295\t0\tNone\tNone\t4\t429180\t62698006800
+VIROLOGY ORDERABLES\t497325\tLABADVQL\tADENOVIRUS DNA, QUALITATIVE PCR\tADOV\tADENOVIRUS DNA, QL PCR\t#VALUE!\t304440\t0\tNone\tNone\t5\t1522200\t6.91E+11
+VIROLOGY ORDERABLES\t497325\tLABADVQL\tADENOVIRUS PCR QUAL\tADOV\tADENOVIRUS DNA, QL PCR\t#VALUE!\t114450\t0\tNone\tNone\t2\t228900\t28059325200
+VIROLOGY ORDERABLES\t497424\tLABHTLVB\t HTLV-1/2 AB WESTERN BLOT\tHTWB\tHTLV I/II AB, WESTERN BLOT\t#VALUE!\t274132.5\t0\tNone\tNone\t16\t4386120\t1.32E+12
+VIROLOGY ORDERABLES\t497426\tLABHIVDAG\tHIV - 1 DIRECT AG (ICD)\tINTRE\tINTERPRETATION\t#VALUE!\t410679.1304\t0\tNone\tNone\t23\t9445620\t4.14E+12
+VIROLOGY ORDERABLES\t497450\tLABBKVPC\tBK VIRUS DNA QUANTITATION\tBKQ\tBKV DNA QUANTITATION\t#VALUE!\t168960\t0\tNone\tNone\t1\t168960\t28547481600
+VIROLOGY ORDERABLES\t497452\tLABHHV6QL\tHERPES VIRAL 6 DNA QUALITATIVE\tHVDNA\tHERPES VIRUS 6 DNA\t#VALUE!\t184905\t0\tNone\tNone\t4\t739620\t1.80E+11
+VIROLOGY ORDERABLES\t497468\tLABBKDNA\tBK VIRUS DNA PCR\tBKD\tBK VIRUS DNA\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t541685\tLABHSVG\tHSV 1/2 TYPE-SPECIFIC IGG\tHSV2G\tHSV 2, IGG INDEX\t#VALUE!\t262579.4118\t0\tNone\tNone\t34\t8927700\t4.76E+12
+VIROLOGY ORDERABLES\t590497\tLABADVQT\tADENOVIRUS REAL TIME PCR,QUANTITATIVE\tADVTIP\tTEST DESCRIPTION\t#VALUE!\t98320\t0\tNone\tNone\t3\t294960\t33751087200
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV BY RAPID PCR, CSF\tEBV\tEBV BY PCR\t#VALUE!\t404160\t0\tNone\tNone\t3\t1212480\t6.00E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV BY RAPID PCR, CSF\tYEBP1\tSPECIMEN SOURCE\t#VALUE!\t404160\t0\tNone\tNone\t3\t1212480\t6.00E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV BY RAPID PCR, CSF\tYEPB4\tREPORT STATUS\t#VALUE!\t404160\t0\tNone\tNone\t3\t1212480\t6.00E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEBV PCR, FLUIDS (EPSTEIN-BARR VIRUS PCR, FLUIDS)\tYEBP1\tSPECIMEN SOURCE\t#VALUE!\t329575.7143\t0\tNone\tNone\t14\t4614060\t1.91E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN-BARR VIRUS PCR, CSF\tEBV\tEBV BY PCR\t#VALUE!\t478140\t0\tNone\tNone\t5\t2390700\t1.45E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN-BARR VIRUS PCR, CSF\tYEBP1\tSPECIMEN SOURCE\t#VALUE!\t478140\t0\tNone\tNone\t5\t2390700\t1.45E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN-BARR VIRUS PCR, CSF\tYEBP3\tSPECIAL INFORMATION\t#VALUE!\t650850\t0\tNone\tNone\t2\t1301700\t1.05E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN-BARR VIRUS PCR, CSF\tYEPB4\tREPORT STATUS\t#VALUE!\t478140\t0\tNone\tNone\t5\t2390700\t1.45E+12
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN BARR VIRUS PCR, FLUIDS\tYEPB4\tREPORT STATUS\t#VALUE!\t326800\t0\tNone\tNone\t3\t980400\t3.42E+11
+VIROLOGY ORDERABLES\t621215\tLABYEBPCR\tEPSTEIN-BARR VIRUS PCR, NON-BLOOD\tYEBP1\tSPECIMEN SOURCE\t#VALUE!\t295741.791\t0\tNone\tNone\t67\t19814700\t7.67E+12
+VIROLOGY ORDERABLES\t633362\tLABMUMPSG\tMUMPS IGG\tMUMDES\tTEST DESCRIPTION\t#VALUE!\t165986.6667\t0\tNone\tNone\t9\t1493880\t2.85E+11
+VIROLOGY ORDERABLES\t670955\tLAB11020R\tEB VIRUS EARLY AG (R+D) IGG\t11165R\tEB VIRUS EARLY AG (R+D) IGG\t#VALUE!\t303340\t0\tNone\tNone\t3\t910020\t4.00E+11
+VIROLOGY ORDERABLES\t670955\tLABEAIGG\tEB VIRUS EARLY AG (R+D) IGG\t11165R\tEB VIRUS EARLY AG (R+D) IGG\t#VALUE!\t240660\t0\tNone\tNone\t1\t240660\t57917235600
+VIROLOGY ORDERABLES\t670957\tLABEBNABY\tEB NUCLEAR AG AB\t11166R\tEB NUCLEAR AB\t#VALUE!\t201060\t0\tNone\tNone\t1\t201060\t40425123600
+VIROLOGY ORDERABLES\t670957\tLABEBNABY\tEBV NUCLEAR ANTIGEN IGG\tEBNDES\tEBNDES\t#VALUE!\t687360\t0\tNone\tNone\t2\t1374720\t9.65E+11
+VIROLOGY ORDERABLES\t670959\tLABVCAIGM\tEB VIRAL CAPSID AG IGM AB\t11167R\tEB VCA IGM AB\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t670961\tLABVCAIGG\tEB VIRAL CAPSID AG IGG AB\t11168R\tEB VCA IGG AB\t#VALUE!\t201060\t0\tNone\tNone\t1\t201060\t40425123600
+VIROLOGY ORDERABLES\t744406\tLABAVIN\tHIV-1 INTEGRASE RESISTANCE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t2183640\t0\tNone\tNone\t1\t2183640\t4.77E+12
+VIROLOGY ORDERABLES\t862853\tLABFLUAPC\tFLU A PCR\tFLUADI\tDISCLAIMER\t#VALUE!\t142990.5882\t0\tNone\tNone\t17\t2430840\t5.55E+11
+VIROLOGY ORDERABLES\t864646\tLABH1N1PC\t2009 H1N1 PCR, H274Y MUTATION\tH1N1DI\tDISCLAIMER\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t864646\tLABH1N1PC\t2009 H1N1 PCR, H274Y MUTATION\tH1N1R\t2009 INFLUENZA A(H1N1) RNA\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t864646\tLABH1N1PC\t2009 H1N1 PCR, H275Y MUTATION\tH1N1DI\tDISCLAIMER\t#VALUE!\t259084.5\t0\tNone\tNone\t40\t10363380\t6.39E+12
+VIROLOGY ORDERABLES\t864646\tLABH1N1PC\t2009 H1N1 PCR, H275Y MUTATION\tH1N1IN\tINTERPRETATION\t#VALUE!\t259084.5\t0\tNone\tNone\t40\t10363380\t6.39E+12
+VIROLOGY ORDERABLES\t870899\tLABVIRSO1\tMISC. VIROLOGY TEST\tVIROR\tRESULT\t#VALUE!\t823753.7143\t0\tNone\tNone\t35\t28831380\t3.01E+13
+VIROLOGY ORDERABLES\t876725\tLABDVEPI1\tPARA 1 DFA\tPI1SP\tSPECIMEN\t#VALUE!\t987120\t0\tNone\tNone\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876727\tLABDVEPI2\tPARA 2 DFA\tPI2SP\tSPECIMEN\t#VALUE!\t987120\t0\tNone\tNone\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876729\tLABDVEPI3\tPARA 3 DFA\tPI3SP\tSPECIMEN\t#VALUE!\t987120\t0\tNone\tNone\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876731\tLABDVEMP\tMPV DFA\tMPSP\tSPECIMEN\t#VALUE!\t987120\t0\tNone\tNone\t1\t987120\t9.74E+11
+VIROLOGY ORDERABLES\t876737\tLABTOXIM\tTOXOPLASMA IGM\tTOXMDS\tTEST DESCRIPTION\t#VALUE!\t177480\t0\tNone\tNone\t7\t1242360\t2.54E+11
+VIROLOGY ORDERABLES\t876739\tLABTOXGM\tTOXOPLASMA IGM & IGG\tTOXDES\tTEST DESCRIPTION\t#VALUE!\t0\t0\tNone\tNone\t1\t0\t0
+VIROLOGY ORDERABLES\t876740\tINACTIVE 4\tTOXOPLASMA IGG IGM\tTOXDES\tTEST DESCRIPTION\t#VALUE!\t186060\t0\tNone\tNone\t1\t186060\t34618323600
+VIROLOGY ORDERABLES\t876740\tLABTOXGM\tTOXOPLASMA IGG IGM\tTOXDES\tTEST DESCRIPTION\t#VALUE!\t163250\t0\tNone\tNone\t6\t979500\t1.86E+11
+VIROLOGY ORDERABLES\t876741\tLABTOXGMR\tTOXO PREGNANCY PANEL\tTOXDES\tTEST DESCRIPTION\t#VALUE!\t148380\t0\tNone\tNone\t1\t148380\t22016624400
+VIROLOGY ORDERABLES\t879418\tLABMPVPCR\tMPV PCR\tMPVDI\tDISCLAIMER\t#VALUE!\t41910\t0\tNone\tNone\t2\t83820\t6616040400
+VIROLOGY ORDERABLES\t879418\tLABMPVPCR\tMPV PCR\tMPVSP\tSPECIMEN\t#VALUE!\t41910\t0\tNone\tNone\t2\t83820\t6616040400
+VIROLOGY ORDERABLES\t879420\tLABRMPCR\tRSV/MPV PCR\tRSMPDI\tDISCLAIMER\t#VALUE!\t86400\t0\tNone\tNone\t3\t259200\t28951264800
+VIROLOGY ORDERABLES\t883176\tLABHPVPCR\tHPV 16/18 TYPING\tHPVDI\tDISCLAIMER\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t883176\tLABHPVPCR\tHPV 16/18 TYPING\tHPVINT\tINTERPRETATION\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t883176\tLABHPVPCR\tHPV 16/18 TYPING\tHPVMT\tMETHOD\t#VALUE!\t#VALUE!\t0\tNone\tNone\t0\tNone\tNone
+VIROLOGY ORDERABLES\t893882\tLABCMVAV\tCMV IGG AVIDITY\tCMVAVD\tTEST DESCRIPTION\t#VALUE!\t289530\t0\tNone\tNone\t2\t579060\t2.76E+11
+VIROLOGY ORDERABLES\t893900\tLABTOXATP\tTOXO AB TRANSPLANT PNL, SERUM\tTOXDES\tTEST DESCRIPTION\t#VALUE!\t137520\t0\tNone\tNone\t5\t687600\t1.11E+11
+VIROLOGY ORDERABLES\t966895\tLABVCULU\tVIRAL CULTURE, URINE\tCULT\tCULT/OTHER RSLT:\t#VALUE!\t1267920\t0\tNone\tNone\t1\t1267920\t1.61E+12
+VIROLOGY ORDERABLES\t1007403\tLABVZPAN\tVZV IGG IGM PANEL\tVZVDS\tVZV IGM TEST DESCRIPTION\t#VALUE!\t299835.8824\t0\tNone\tNone\t34\t10194420\t3.75E+12
+VIROLOGY ORDERABLES\t1050827\tLABHCVPCX\tHEPATITIS C (HCV) PCR WITH REFLEX TO GENOTYPING\tHCVIPX\tTEST DESCRIPTION\t#VALUE!\t425910\t0\tNone\tNone\t2\t851820\t3.70E+11
+VIROLOGY ORDERABLES\t1050829\tLABHCVGTP\tHEPATITIS C (HCV) GENOTYPE\tHCVGTD\tTEST DESCRIPTION\t#VALUE!\t766260\t0\tNone\tNone\t2\t1532520\t1.95E+12
+"""
+
+if __name__ == "__main__":
main(sys.argv);
\ No newline at end of file
diff --git a/medinfo/cpoe/cpoeSim/simdata/restoreSimTables.sh b/medinfo/cpoe/cpoeSim/simdata/restoreSimTables.sh
new file mode 100644
index 00000000..92967f23
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/restoreSimTables.sh
@@ -0,0 +1,31 @@
+export DB_HOST=localhost
+export DB_PORT=5432
+export DB_DSN=medinfo-5year-time
+export DB_USER=jonc101
+
+# Prepare schema of empty tables ready to receive data
+psql -f cpoeSim.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+
+# Add mock clinical_item values for simulated recommender
+psql -f extraClinicalItems.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+
+# Restore the prior dumps of data table contents
+# Core simulation infrastructure
+psql -f sim_note_type.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+psql -f sim_result.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+psql -f sim_order_result_map.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+# Case specific data
+psql -f sim_state.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+psql -f sim_note.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+# Though there are "default" state results that are more of a core simulation infrastructure results
+psql -f sim_state_result.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+psql -f sim_state_transition.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+
+# Insert sim Grading key
+psql -f sim_grading_key.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+
+# Individual test user interaction behavior (but some default ones are necessary for infrastructure)
+psql -f sim_user.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+psql -f sim_patient.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+psql -f sim_patient_order.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
+psql -f sim_patient_state.dump.sql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_DSN
diff --git a/medinfo/cpoe/cpoeSim/simdata/revertSimTables.sh b/medinfo/cpoe/cpoeSim/simdata/revertSimTables.sh
new file mode 100755
index 00000000..ffec1b97
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/revertSimTables.sh
@@ -0,0 +1,12 @@
+export DB_HOST=localhost
+export DB_PORT=5432
+export DB_DSN=stride_inpatient_2008_2014
+export DB_USER=jonc101
+
+psql -U $DB_USER -d $DB_DSN -h $DB_HOST -p $DB_PORT -c "DROP TABLE IF EXISTS sim_user, sim_note, sim_note_type, sim_patient, sim_patient_order, sim_state_transition, sim_state, sim_patient_state, sim_result, sim_state_result, sim_order_result_map;"
+
+# Drop the extra clinical items added, so they can be readded without conflict
+psql -U $DB_USER -d $DB_DSN -h $DB_HOST -p $DB_PORT -c "DELETE FROM item_collection_item WHERE item_collection_item_id IN (-100);"
+psql -U $DB_USER -d $DB_DSN -h $DB_HOST -p $DB_PORT -c "DELETE FROM item_collection WHERE item_collection_id IN (-100);"
+psql -U $DB_USER -d $DB_DSN -h $DB_HOST -p $DB_PORT -c "DELETE FROM clinical_item_association WHERE clinical_item_association_id IN (-150,-160);"
+psql -U $DB_USER -d $DB_DSN -h $DB_HOST -p $DB_PORT -c "DELETE FROM clinical_item WHERE clinical_item_id IN (-100);"
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_grading_key.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_grading_key.dump.sql
new file mode 100644
index 00000000..99b2a6db
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_grading_key.dump.sql
@@ -0,0 +1,4936 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.9
+-- Dumped by pg_dump version 9.6.9
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_grading_key; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_grading_key (sim_grading_key_id, sim_grader_id, sim_state_id, sim_case_name, clinical_item_id, score, confidence, group_name, comment) FROM stdin;
+9597 Panel Average 40 atrial_fibrillation 45977 3 \N \N \N
+10406 Andre Kumar 40 atrial_fibrillation 45977 0 4 Weight \N
+10407 Jonathan Chen 40 atrial_fibrillation 45977 0 2 \N \N
+10408 Lisa Shieh 40 atrial_fibrillation 45977 0 3 \N \N
+10409 Panel Consensus 40 atrial_fibrillation 45977 0 \N \N \N
+8888 Andre Kumar 41 atrial_fibrillation 45977 5 3 Nursing Only if combind with enoxaparin
+8889 Jason Hom 41 atrial_fibrillation 45977 5 4 \N \N
+9442 Panel Average 41 atrial_fibrillation 45977 4 \N \N \N
+9472 Panel Consensus 41 atrial_fibrillation 45977 4 \N \N \N
+9620 Lisa Shieh 41 atrial_fibrillation 45977 3 3 \N \N
+10410 Jonathan Chen 41 atrial_fibrillation 45977 0 2 \N \N
+11392 Jonathan Chen 43 atrial_fibrillation 46605 0 3 \N Irregular rhythm, so adenosine not so relevant
+8333 Andre Kumar 41 atrial_fibrillation 45814 8 5 Admit Order \N
+8334 Panel Average 41 atrial_fibrillation 45814 8 \N \N \N
+10411 Panel Consensus 41 atrial_fibrillation 45814 0 \N \N \N
+11271 Jonathan Chen 41 atrial_fibrillation 65641 0 3 \N \N
+10412 Jonathan Chen 40 atrial_fibrillation 35968 0 1 \N Still some negative inotropy?
+11106 Andre Kumar 40 atrial_fibrillation 35968 -5 3 Rhythm Control \N
+11107 Jason Hom 40 atrial_fibrillation 35968 -5 5 \N \N
+11108 Lisa Shieh 40 atrial_fibrillation 35968 -5 3 \N \N
+11109 Panel Average 40 atrial_fibrillation 35968 -5 \N \N \N
+11110 Panel Consensus 40 atrial_fibrillation 35968 -5 \N \N \N
+10413 Jonathan Chen 43 atrial_fibrillation 35968 0 1 \N Still some negative inotropy?
+11111 Lisa Shieh 43 atrial_fibrillation 35968 -5 3 \N \N
+11179 Panel Average 43 atrial_fibrillation 35968 -8 \N \N \N
+11182 Andre Kumar 43 atrial_fibrillation 35968 -8 4 Rhythm Control \N
+11183 Panel Consensus 43 atrial_fibrillation 35968 -8 \N \N \N
+11211 Jason Hom 43 atrial_fibrillation 35968 -10 5 \N \N
+10414 Jonathan Chen 43 atrial_fibrillation 44352 0 2 \N \N
+11112 Lisa Shieh 43 atrial_fibrillation 44352 -5 3 \N \N
+11184 Panel Consensus 43 atrial_fibrillation 44352 -8 \N \N \N
+11200 Panel Average 43 atrial_fibrillation 44352 -8 \N \N \N
+11404 Jonathan Chen 41 atrial_fibrillation 47146 1 2 Aspirin \N
+8890 Lisa Shieh 40 atrial_fibrillation 44206 5 5 \N \N
+9947 Jason Hom 40 atrial_fibrillation 44206 2 4 \N \N
+9948 Panel Consensus 40 atrial_fibrillation 44206 2 \N \N \N
+10206 Panel Average 40 atrial_fibrillation 44206 2 \N \N \N
+10238 Jonathan Chen 40 atrial_fibrillation 44206 1 2 \N Troponin mildly elevated so they're treating like NSTEMI, but really is Type 2 demand from the Afib
+10994 Andre Kumar 40 atrial_fibrillation 44206 -2 4 Anticoagulants \N
+8468 Lisa Shieh 41 atrial_fibrillation 44206 7 3 \N \N
+9926 Panel Average 41 atrial_fibrillation 44206 2 \N \N \N
+9949 Panel Consensus 41 atrial_fibrillation 44206 2 \N \N \N
+10239 Jonathan Chen 41 atrial_fibrillation 44206 1 2 Aspirin Troponin mildly elevated so they're treating like NSTEMI, but really is Type 2 demand from the Afib
+10415 Andre Kumar 41 atrial_fibrillation 44206 0 1 Anticoagulants -3points if combined wiht other anticoagulants
+10416 Jason Hom 41 atrial_fibrillation 44206 0 4 \N \N
+11285 Jonathan Chen 43 atrial_fibrillation 44206 1 2 Aspirin \N
+11241 Jonathan Chen 43 atrial_fibrillation 44315 1 2 Aspirin \N
+8891 Lisa Shieh 41 atrial_fibrillation 44240 5 3 \N \N
+9950 Panel Consensus 41 atrial_fibrillation 44240 2 \N \N \N
+10207 Panel Average 41 atrial_fibrillation 44240 2 \N \N \N
+10240 Jonathan Chen 41 atrial_fibrillation 44240 1 2 \N \N
+10417 Andre Kumar 41 atrial_fibrillation 44240 0 5 Statin \N
+10418 Jason Hom 41 atrial_fibrillation 44240 0 4 \N \N
+9621 Lisa Shieh 43 atrial_fibrillation 45901 3 3 \N \N
+9951 Jonathan Chen 43 atrial_fibrillation 45901 2 2 \N \N
+10241 Andre Kumar 43 atrial_fibrillation 45901 1 2 Blood Culture Not Infection \N
+10242 Panel Consensus 43 atrial_fibrillation 45901 1 \N \N \N
+10380 Panel Average 43 atrial_fibrillation 45901 1 \N \N \N
+10995 Jason Hom 43 atrial_fibrillation 45901 -2 5 \N \N
+8892 Jason Hom 40 atrial_fibrillation 45919 5 4 \N \N
+9952 Panel Consensus 40 atrial_fibrillation 45919 2 \N \N \N
+10208 Panel Average 40 atrial_fibrillation 45919 2 \N \N \N
+10243 Jonathan Chen 40 atrial_fibrillation 45919 1 2 Blood Gas \N
+10419 Andre Kumar 40 atrial_fibrillation 45919 0 3 Blood Gas \N
+10420 Lisa Shieh 40 atrial_fibrillation 45919 0 3 \N \N
+8469 Panel Consensus 40 atrial_fibrillation 45887 7 \N \N \N
+8657 Panel Average 40 atrial_fibrillation 45887 7 \N \N \N
+8893 Andre Kumar 40 atrial_fibrillation 45887 5 2 Metabolic Panel \N
+8894 Lisa Shieh 40 atrial_fibrillation 45887 5 3 \N \N
+10421 Jonathan Chen 40 atrial_fibrillation 45887 0 2 \N \N
+8895 Jason Hom 43 atrial_fibrillation 45887 5 5 \N \N
+8896 Lisa Shieh 43 atrial_fibrillation 45887 5 3 \N \N
+9443 Panel Average 43 atrial_fibrillation 45887 4 \N \N \N
+9473 Panel Consensus 43 atrial_fibrillation 45887 4 \N \N \N
+9622 Andre Kumar 43 atrial_fibrillation 45887 3 2 Metabolic Panel \N
+10422 Jonathan Chen 43 atrial_fibrillation 45887 0 2 \N \N
+11315 Jonathan Chen 40 atrial_fibrillation 41870 0 5 \N \N
+10423 Andre Kumar 40 atrial_fibrillation 31164 0 5 UNK ? Is this an order set?
+10424 Panel Average 40 atrial_fibrillation 31164 0 \N \N \N
+8300 Panel Average 40 atrial_fibrillation 45827 8 \N \N \N
+8335 Panel Consensus 40 atrial_fibrillation 45827 8 \N \N \N
+8897 Andre Kumar 40 atrial_fibrillation 45827 5 5 ECG + Monitoring \N
+8898 Jonathan Chen 40 atrial_fibrillation 45827 5 3 \N \N
+11461 Jonathan Chen 41 atrial_fibrillation 45827 5 3 \N \N
+8698 Panel Consensus 40 atrial_fibrillation 45793 6 \N \N \N
+8841 Panel Average 40 atrial_fibrillation 45793 6 \N \N \N
+8899 Lisa Shieh 40 atrial_fibrillation 45793 5 3 \N \N
+9953 Andre Kumar 40 atrial_fibrillation 45793 2 3 CBC \N
+9954 Jonathan Chen 40 atrial_fibrillation 45793 2 3 CBC \N
+8470 Lisa Shieh 41 atrial_fibrillation 45793 7 3 \N \N
+8900 Jason Hom 41 atrial_fibrillation 45793 5 4 \N \N
+9444 Panel Average 41 atrial_fibrillation 45793 4 \N \N \N
+9474 Panel Consensus 41 atrial_fibrillation 45793 4 \N \N \N
+9955 Jonathan Chen 41 atrial_fibrillation 45793 2 3 CBC \N
+10244 Andre Kumar 41 atrial_fibrillation 45793 1 4 CBC \N
+8699 Panel Consensus 43 atrial_fibrillation 45793 6 \N \N \N
+8901 Jason Hom 43 atrial_fibrillation 45793 5 5 \N \N
+8902 Lisa Shieh 43 atrial_fibrillation 45793 5 3 \N \N
+9475 Panel Average 43 atrial_fibrillation 45793 4 \N \N \N
+9956 Andre Kumar 43 atrial_fibrillation 45793 2 3 CBC \N
+9957 Jonathan Chen 43 atrial_fibrillation 45793 2 3 CBC \N
+8700 Panel Consensus 40 atrial_fibrillation 45788 6 \N \N \N
+8842 Panel Average 40 atrial_fibrillation 45788 6 \N \N \N
+8903 Lisa Shieh 40 atrial_fibrillation 45788 5 3 \N \N
+9958 Andre Kumar 40 atrial_fibrillation 45788 2 3 CBC \N
+9959 Jonathan Chen 40 atrial_fibrillation 45788 2 3 CBC \N
+8471 Lisa Shieh 41 atrial_fibrillation 45788 7 3 \N \N
+8701 Panel Consensus 41 atrial_fibrillation 45788 6 \N \N \N
+8904 Jason Hom 41 atrial_fibrillation 45788 5 4 \N \N
+9445 Panel Average 41 atrial_fibrillation 45788 4 \N \N \N
+9960 Jonathan Chen 41 atrial_fibrillation 45788 2 3 CBC \N
+10245 Andre Kumar 41 atrial_fibrillation 45788 1 4 CBC \N
+9623 Lisa Shieh 40 atrial_fibrillation 50400 3 3 \N \N
+10425 Jason Hom 40 atrial_fibrillation 50400 0 4 \N \N
+10426 Jonathan Chen 40 atrial_fibrillation 50400 0 2 \N \N
+10965 Panel Average 40 atrial_fibrillation 50400 -1 \N \N \N
+10970 Panel Consensus 40 atrial_fibrillation 50400 -1 \N \N \N
+11113 Andre Kumar 40 atrial_fibrillation 50400 -5 2 Consult "Delays care no expertise aside from sedation (which can be given by ER providers)"
+8905 Lisa Shieh 43 atrial_fibrillation 50400 5 3 \N \N
+9476 Panel Average 43 atrial_fibrillation 50400 4 \N \N \N
+9477 Panel Consensus 43 atrial_fibrillation 50400 4 \N \N \N
+10427 Jonathan Chen 43 atrial_fibrillation 50400 0 2 \N \N
+11075 Andre Kumar 43 atrial_fibrillation 50400 -3 3 Consult no clear benefit of consulting anes
+8472 Lisa Shieh 40 atrial_fibrillation 49251 7 3 \N \N
+8473 Panel Consensus 40 atrial_fibrillation 49251 7 \N \N \N
+8658 Panel Average 40 atrial_fibrillation 49251 7 \N \N \N
+9624 Andre Kumar 40 atrial_fibrillation 49251 3 4 Consult \N
+10428 Jonathan Chen 40 atrial_fibrillation 49251 0 2 \N \N
+8474 Lisa Shieh 41 atrial_fibrillation 49251 7 3 \N \N
+8906 Jason Hom 41 atrial_fibrillation 49251 5 4 \N \N
+8907 Panel Average 41 atrial_fibrillation 49251 5 \N \N \N
+8908 Panel Consensus 41 atrial_fibrillation 49251 5 \N \N \N
+9625 Andre Kumar 41 atrial_fibrillation 49251 3 4 Consult \N
+10429 Jonathan Chen 41 atrial_fibrillation 49251 0 2 \N \N
+8702 Panel Average 43 atrial_fibrillation 49251 6 \N \N \N
+8909 Lisa Shieh 43 atrial_fibrillation 49251 5 3 \N \N
+9961 Andre Kumar 43 atrial_fibrillation 49251 2 3 Consult delays care, but cardiologist would likely give correct reccomendations
+10430 Jonathan Chen 43 atrial_fibrillation 49251 0 2 \N \N
+11452 Jonathan Chen 41 atrial_fibrillation 65695 0 2 \N \N
+11076 Andre Kumar 43 atrial_fibrillation 65695 -3 3 Consult delays care
+11077 Panel Average 43 atrial_fibrillation 65695 -3 \N \N \N
+8475 Lisa Shieh 43 atrial_fibrillation 61323 7 3 \N \N
+8680 Panel Average 43 atrial_fibrillation 61323 6 \N \N \N
+8703 Panel Consensus 43 atrial_fibrillation 61323 6 \N \N \N
+9962 Andre Kumar 43 atrial_fibrillation 61323 2 3 Consult delays care, but ICU would likely give correct reccomendations
+10431 Jonathan Chen 43 atrial_fibrillation 61323 0 2 \N \N
+10432 Jonathan Chen 40 atrial_fibrillation 50098 0 2 CT Head \N
+10433 Lisa Shieh 40 atrial_fibrillation 50098 0 5 \N \N
+11114 Jason Hom 40 atrial_fibrillation 50098 -5 5 \N \N
+11115 Panel Average 40 atrial_fibrillation 50098 -5 \N \N \N
+11116 Panel Consensus 40 atrial_fibrillation 50098 -5 \N \N \N
+10434 Jonathan Chen 40 atrial_fibrillation 45983 0 2 CT Head \N
+10435 Lisa Shieh 40 atrial_fibrillation 45983 0 3 \N \N
+11117 Jason Hom 40 atrial_fibrillation 45983 -5 4 \N \N
+11118 Panel Average 40 atrial_fibrillation 45983 -5 \N \N \N
+11119 Panel Consensus 40 atrial_fibrillation 45983 -5 \N \N \N
+10436 Jonathan Chen 40 atrial_fibrillation 49965 0 2 CT Head \N
+10437 Lisa Shieh 40 atrial_fibrillation 49965 0 5 \N \N
+11120 Jason Hom 40 atrial_fibrillation 49965 -5 5 \N \N
+11121 Panel Average 40 atrial_fibrillation 49965 -5 \N \N \N
+11122 Panel Consensus 40 atrial_fibrillation 49965 -5 \N \N \N
+10438 Andre Kumar 40 atrial_fibrillation 48871 0 3 D-dimer \N
+10439 Panel Average 40 atrial_fibrillation 48871 0 \N \N \N
+8236 Panel Average 43 atrial_fibrillation -100 9 \N \N \N
+8476 Andre Kumar 43 atrial_fibrillation -100 7 5 Cardioversion Less points for delaying
+8910 Lisa Shieh 40 atrial_fibrillation 44353 5 3 \N \N
+10440 Jonathan Chen 40 atrial_fibrillation 44353 0 1 \N This is probably mis-entered Diltiazem (which is a double negative!) Or could it arguably be intended sedation before DCCV? Probably not (that would be midazolam or lorazepam more likely).
+10989 Panel Average 40 atrial_fibrillation 44353 -2 \N \N \N
+10996 Panel Consensus 40 atrial_fibrillation 44353 -2 \N \N \N
+11123 Andre Kumar 40 atrial_fibrillation 44353 -5 5 Sedation Patient lethargic and diazepam not good for procedural sedation
+11124 Jason Hom 40 atrial_fibrillation 44353 -5 5 \N \N
+8911 Jason Hom 41 atrial_fibrillation 45824 5 4 \N \N
+8912 Lisa Shieh 41 atrial_fibrillation 45824 5 3 \N \N
+9478 Panel Average 41 atrial_fibrillation 45824 4 \N \N \N
+9963 Andre Kumar 41 atrial_fibrillation 45824 2 4 Diet \N
+10246 Panel Consensus 41 atrial_fibrillation 45824 1 \N \N \N
+10441 Jonathan Chen 41 atrial_fibrillation 45824 0 2 \N \N
+10247 Andre Kumar 43 atrial_fibrillation 45824 1 2 Diet \N
+10248 Panel Average 43 atrial_fibrillation 45824 1 \N \N \N
+8477 Panel Consensus 40 atrial_fibrillation 45811 7 \N \N \N
+8659 Panel Average 40 atrial_fibrillation 45811 7 \N \N \N
+8913 Andre Kumar 40 atrial_fibrillation 45811 5 5 NPO \N
+8914 Lisa Shieh 40 atrial_fibrillation 45811 5 5 \N \N
+9964 Jonathan Chen 40 atrial_fibrillation 45811 2 3 \N \N
+11321 Jonathan Chen 41 atrial_fibrillation 45811 2 3 \N \N
+8478 Panel Consensus 43 atrial_fibrillation 45811 7 \N \N \N
+8660 Panel Average 43 atrial_fibrillation 45811 7 \N \N \N
+8915 Andre Kumar 43 atrial_fibrillation 45811 5 3 NPO \N
+8916 Jason Hom 43 atrial_fibrillation 45811 5 5 \N \N
+9965 Jonathan Chen 43 atrial_fibrillation 45811 2 3 \N \N
+9966 Jonathan Chen 40 atrial_fibrillation 46674 2 3 \N \N
+10442 Lisa Shieh 40 atrial_fibrillation 46674 0 3 \N \N
+11100 Panel Average 40 atrial_fibrillation 46674 -4 \N \N \N
+11101 Panel Consensus 40 atrial_fibrillation 46674 -4 \N \N \N
+11125 Jason Hom 40 atrial_fibrillation 46674 -5 4 \N \N
+11173 Andre Kumar 40 atrial_fibrillation 46674 -6 5 Rate Control too slow acting
+11289 Jonathan Chen 43 atrial_fibrillation 46674 -5 3 Negative Inotrope \N
+11126 Jason Hom 40 atrial_fibrillation 35846 -5 5 \N \N
+11127 Jonathan Chen 40 atrial_fibrillation 35846 -5 3 Negative Inotrope \N
+11180 Panel Average 40 atrial_fibrillation 35846 -8 \N \N \N
+11185 Andre Kumar 40 atrial_fibrillation 35846 -8 4 Rate Control \N
+11186 Panel Consensus 40 atrial_fibrillation 35846 -8 \N \N \N
+11128 Jonathan Chen 43 atrial_fibrillation 35846 -5 3 Negative Inotrope \N
+11177 Lisa Shieh 43 atrial_fibrillation 35846 -7 3 \N \N
+11204 Panel Average 43 atrial_fibrillation 35846 -9 \N \N \N
+11205 Panel Consensus 43 atrial_fibrillation 35846 -9 \N \N \N
+11078 Jonathan Chen 43 atrial_fibrillation 44393 -3 3 Negative Inotrope Not as bad as IV negative inotropes, but still not the right time given hypotensive
+11178 Lisa Shieh 43 atrial_fibrillation 44393 -7 3 \N \N
+11187 Andre Kumar 43 atrial_fibrillation 44393 -8 4 Rate Control \N
+11188 Panel Consensus 43 atrial_fibrillation 44393 -8 \N \N \N
+11201 Panel Average 43 atrial_fibrillation 44393 -8 \N \N \N
+9440 Panel Average 10 pulmonary_embolism 44586 5 \N \N \N
+10443 Jonathan Chen 43 atrial_fibrillation 44251 0 1 \N Maybe they think low-output heart failure? No other signs of such elsewhere. Would this make Afib RVR even worse?
+11129 Lisa Shieh 43 atrial_fibrillation 44251 -5 3 \N \N
+11189 Panel Consensus 43 atrial_fibrillation 44251 -8 \N \N \N
+11202 Panel Average 43 atrial_fibrillation 44251 -8 \N \N \N
+10444 Andre Kumar 40 atrial_fibrillation 44204 0 5 Unindicated Med \N
+10445 Jonathan Chen 40 atrial_fibrillation 44204 0 2 \N What is this doing here?
+10446 Lisa Shieh 40 atrial_fibrillation 44204 0 5 \N \N
+10990 Panel Average 40 atrial_fibrillation 44204 -2 \N \N \N
+10997 Panel Consensus 40 atrial_fibrillation 44204 -2 \N \N \N
+11130 Jason Hom 40 atrial_fibrillation 44204 -5 4 \N \N
+9479 Andre Kumar 43 atrial_fibrillation 45941 4 2 UTOX \N
+9626 Lisa Shieh 43 atrial_fibrillation 45941 3 3 \N \N
+9967 Jonathan Chen 43 atrial_fibrillation 45941 2 3 \N \N
+9968 Panel Consensus 43 atrial_fibrillation 45941 2 \N \N \N
+10209 Panel Average 43 atrial_fibrillation 45941 2 \N \N \N
+10998 Jason Hom 43 atrial_fibrillation 45941 -2 5 \N \N
+8237 Panel Average 40 atrial_fibrillation 45866 9 \N \N \N
+8238 Panel Consensus 40 atrial_fibrillation 45866 9 \N \N \N
+8479 Andre Kumar 40 atrial_fibrillation 45866 7 5 ECG + Monitoring \N
+8704 Andre Kumar 41 atrial_fibrillation 45866 6 5 ECG + Monitoring \N
+8866 Panel Average 41 atrial_fibrillation 45866 5 \N \N \N
+8917 Jason Hom 41 atrial_fibrillation 45866 5 4 \N \N
+8918 Lisa Shieh 41 atrial_fibrillation 45866 5 3 \N \N
+8919 Panel Consensus 41 atrial_fibrillation 45866 5 \N \N \N
+11393 Jonathan Chen 43 atrial_fibrillation 45866 10 5 \N \N
+11335 Jonathan Chen 40 atrial_fibrillation 62176 3 2 Echo \N
+11295 Jonathan Chen 43 atrial_fibrillation 62176 3 2 Echo Okay for workup, but not while unstable?
+9627 Lisa Shieh 40 atrial_fibrillation 45963 3 3 \N \N
+10447 Jonathan Chen 40 atrial_fibrillation 45963 0 1 \N Reasonable before DCCV IF stable, but since unstable Afib, would take too long
+10999 Panel Consensus 40 atrial_fibrillation 45963 -2 \N \N \N
+11070 Panel Average 40 atrial_fibrillation 45963 -2 \N \N \N
+11131 Andre Kumar 40 atrial_fibrillation 45963 -5 4 Imaging "Delays care a fib seems paroxysmal given no PMH"
+11132 Jason Hom 40 atrial_fibrillation 45963 -5 4 \N \N
+9628 Lisa Shieh 43 atrial_fibrillation 45963 3 3 \N \N
+10448 Jonathan Chen 43 atrial_fibrillation 45963 0 1 \N Reasonable before DCCV IF stable, but since unstable Afib, would take too long
+11102 Panel Average 43 atrial_fibrillation 45963 -4 \N \N \N
+11103 Panel Consensus 43 atrial_fibrillation 45963 -4 \N \N \N
+11133 Andre Kumar 43 atrial_fibrillation 45963 -5 5 Imaging delays care
+8480 Lisa Shieh 40 atrial_fibrillation 61832 7 3 \N \N
+9629 Jonathan Chen 40 atrial_fibrillation 61832 3 2 Echo Good for Afib workup, but less points if doing it while unstable?
+10971 Panel Average 40 atrial_fibrillation 61832 -1 \N \N \N
+11134 Andre Kumar 40 atrial_fibrillation 61832 -5 3 Imaging \N
+11135 Jason Hom 40 atrial_fibrillation 61832 -5 4 \N \N
+8450 Panel Average 41 atrial_fibrillation 61832 7 \N \N \N
+8481 Lisa Shieh 41 atrial_fibrillation 61832 7 3 \N \N
+8482 Panel Consensus 41 atrial_fibrillation 61832 7 \N \N \N
+8920 Andre Kumar 41 atrial_fibrillation 61832 5 5 imaging \N
+9480 Jonathan Chen 41 atrial_fibrillation 61832 4 2 Echo \N
+11136 Andre Kumar 43 atrial_fibrillation 61832 -5 5 Imaging delays care
+11137 Panel Average 43 atrial_fibrillation 61832 -5 \N \N \N
+8301 Panel Average 40 atrial_fibrillation 46160 8 \N \N \N
+8336 Panel Consensus 40 atrial_fibrillation 46160 8 \N \N \N
+8921 Andre Kumar 40 atrial_fibrillation 46160 5 5 Vitals \N
+10449 Jonathan Chen 40 atrial_fibrillation 46160 0 2 \N \N
+11138 Jonathan Chen 43 atrial_fibrillation 44248 -5 3 Negative Inotrope \N
+11139 Lisa Shieh 43 atrial_fibrillation 44248 -5 3 \N \N
+11190 Panel Consensus 43 atrial_fibrillation 44248 -8 \N \N \N
+11203 Panel Average 43 atrial_fibrillation 44248 -8 \N \N \N
+8922 Andre Kumar 40 atrial_fibrillation 44297 5 5 Sedation \N
+8923 Jason Hom 40 atrial_fibrillation 44297 5 4 \N \N
+8924 Lisa Shieh 40 atrial_fibrillation 44297 5 3 \N \N
+8925 Panel Average 40 atrial_fibrillation 44297 5 \N \N \N
+8926 Panel Consensus 40 atrial_fibrillation 44297 5 \N \N \N
+9969 Jonathan Chen 40 atrial_fibrillation 44297 2 2 Pre-DCCV \N
+8927 Jason Hom 43 atrial_fibrillation 44297 5 5 \N \N
+9927 Panel Average 43 atrial_fibrillation 44297 2 \N \N \N
+9970 Andre Kumar 43 atrial_fibrillation 44297 2 2 Sedation \N
+9971 Jonathan Chen 43 atrial_fibrillation 44297 2 2 Pre-DCCV \N
+9972 Panel Consensus 43 atrial_fibrillation 44297 2 \N \N \N
+10450 Lisa Shieh 43 atrial_fibrillation 44297 0 3 \N \N
+10451 Andre Kumar 40 atrial_fibrillation 46230 0 5 Unindicated Med \N
+10452 Jonathan Chen 40 atrial_fibrillation 46230 0 2 \N What is this doing here?
+10453 Lisa Shieh 40 atrial_fibrillation 46230 0 3 \N \N
+10991 Panel Average 40 atrial_fibrillation 46230 -2 \N \N \N
+11000 Panel Consensus 40 atrial_fibrillation 46230 -2 \N \N \N
+11140 Jason Hom 40 atrial_fibrillation 46230 -5 4 \N \N
+10454 Jonathan Chen 40 atrial_fibrillation 44004 0 1 \N Bad if already hypotensive, or maybe think is volume overload causing the Afib?
+11141 Jason Hom 40 atrial_fibrillation 44004 -5 5 \N \N
+11142 Lisa Shieh 40 atrial_fibrillation 44004 -5 3 \N \N
+11174 Panel Consensus 40 atrial_fibrillation 44004 -6 \N \N \N
+11176 Panel Average 40 atrial_fibrillation 44004 -6 \N \N \N
+11206 Andre Kumar 40 atrial_fibrillation 44004 -9 5 Diuretics \N
+8928 Jason Hom 41 atrial_fibrillation 44004 5 4 \N \N
+9928 Panel Average 41 atrial_fibrillation 44004 2 \N \N \N
+9973 Andre Kumar 41 atrial_fibrillation 44004 2 2 Diuretics \N
+9974 Panel Consensus 41 atrial_fibrillation 44004 2 \N \N \N
+10455 Jonathan Chen 41 atrial_fibrillation 44004 0 1 \N Bad if already hypotensive, or maybe think is volume overload causing the Afib?
+10456 Lisa Shieh 41 atrial_fibrillation 44004 0 3 \N \N
+10457 Jonathan Chen 43 atrial_fibrillation 44004 0 1 \N Bad if already hypotensive, or maybe think is volume overload causing the Afib?
+11143 Lisa Shieh 43 atrial_fibrillation 44004 -5 3 \N \N
+11181 Panel Average 43 atrial_fibrillation 44004 -8 \N \N \N
+11191 Andre Kumar 43 atrial_fibrillation 44004 -8 3 Diuretics \N
+11192 Panel Consensus 43 atrial_fibrillation 44004 -8 \N \N \N
+11381 Jonathan Chen 40 atrial_fibrillation 50343 0 0 \N \N
+8929 Jason Hom 41 atrial_fibrillation 45797 5 4 \N \N
+9630 Panel Consensus 41 atrial_fibrillation 45797 3 \N \N \N
+9925 Panel Average 41 atrial_fibrillation 45797 3 \N \N \N
+10405 Lisa Shieh 41 atrial_fibrillation 45797 0 3 \N \N
+10458 Andre Kumar 41 atrial_fibrillation 45797 0 3 Diabetes \N
+10459 Jonathan Chen 41 atrial_fibrillation 45797 0 2 \N \N
+7546 Jason Hom 40 atrial_fibrillation 44359 10 5 \N \N
+8483 Panel Consensus 40 atrial_fibrillation 44359 7 \N \N \N
+8661 Panel Average 40 atrial_fibrillation 44359 7 \N \N \N
+8930 Andre Kumar 40 atrial_fibrillation 44359 5 4 Anticoagulants \N
+8931 Jonathan Chen 40 atrial_fibrillation 44359 5 3 Anticoagulation \N
+8932 Lisa Shieh 40 atrial_fibrillation 44359 5 3 \N \N
+7547 Andre Kumar 41 atrial_fibrillation 44359 10 5 Anticoagulants No positive points if combined wiht other anticoagulants
+7548 Jason Hom 41 atrial_fibrillation 44359 10 5 \N \N
+8239 Panel Average 41 atrial_fibrillation 44359 9 \N \N \N
+8240 Panel Consensus 41 atrial_fibrillation 44359 9 \N \N \N
+8484 Lisa Shieh 41 atrial_fibrillation 44359 7 3 \N \N
+8933 Jonathan Chen 41 atrial_fibrillation 44359 5 3 Anticoagulation \N
+7549 Jason Hom 43 atrial_fibrillation 44359 10 5 \N \N
+8302 Panel Average 43 atrial_fibrillation 44359 8 \N \N \N
+8337 Andre Kumar 43 atrial_fibrillation 44359 8 4 Anticoagulants \N
+8338 Panel Consensus 43 atrial_fibrillation 44359 8 \N \N \N
+8485 Lisa Shieh 43 atrial_fibrillation 44359 7 3 \N \N
+8934 Jonathan Chen 43 atrial_fibrillation 44359 5 3 Anticoagulation \N
+7550 Jason Hom 40 atrial_fibrillation 46183 10 5 \N \N
+8681 Panel Average 40 atrial_fibrillation 46183 6 \N \N \N
+8705 Panel Consensus 40 atrial_fibrillation 46183 6 \N \N \N
+8935 Lisa Shieh 40 atrial_fibrillation 46183 5 3 \N \N
+9481 Andre Kumar 40 atrial_fibrillation 46183 4 4 Anticoagulants \N
+10460 Jonathan Chen 40 atrial_fibrillation 46183 0 2 \N \N
+7551 Jason Hom 40 atrial_fibrillation 63714 10 5 \N \N
+8682 Panel Average 40 atrial_fibrillation 63714 6 \N \N \N
+8706 Panel Consensus 40 atrial_fibrillation 63714 6 \N \N \N
+8936 Lisa Shieh 40 atrial_fibrillation 63714 5 \N \N \N
+9482 Andre Kumar 40 atrial_fibrillation 63714 4 2 Coags \N
+10461 Jonathan Chen 40 atrial_fibrillation 63714 0 2 \N \N
+9975 Andre Kumar 43 atrial_fibrillation 63714 2 3 Anticoagulants \N
+9976 Panel Average 43 atrial_fibrillation 63714 2 \N \N \N
+9977 Andre Kumar 40 atrial_fibrillation 49301 2 4 Blood Gas \N
+10249 Jonathan Chen 40 atrial_fibrillation 49301 1 2 Blood Gas \N
+10250 Panel Consensus 40 atrial_fibrillation 49301 1 \N \N \N
+10381 Panel Average 40 atrial_fibrillation 49301 1 \N \N \N
+10462 Jason Hom 40 atrial_fibrillation 49301 0 5 \N \N
+10463 Lisa Shieh 40 atrial_fibrillation 49301 0 3 \N \N
+7552 Jason Hom 40 atrial_fibrillation 45888 10 5 \N \N
+9598 Panel Average 40 atrial_fibrillation 45888 3 \N \N \N
+10251 Jonathan Chen 40 atrial_fibrillation 45888 1 2 Blood Gas \N
+10252 Panel Consensus 40 atrial_fibrillation 45888 1 \N \N \N
+10464 Andre Kumar 40 atrial_fibrillation 45888 0 4 Blood Gas \N
+10465 Lisa Shieh 40 atrial_fibrillation 45888 0 3 \N \N
+10253 Jonathan Chen 43 atrial_fibrillation 48732 1 2 Blood Gas \N
+10254 Panel Consensus 43 atrial_fibrillation 48732 1 \N \N \N
+10466 Andre Kumar 43 atrial_fibrillation 48732 0 2 Blood Gases \N
+10467 Jason Hom 43 atrial_fibrillation 48732 0 5 \N \N
+10468 Lisa Shieh 43 atrial_fibrillation 48732 0 3 \N \N
+10469 Panel Average 43 atrial_fibrillation 48732 0 \N \N \N
+7553 Jason Hom 40 atrial_fibrillation 45942 10 5 \N \N
+8937 Panel Average 40 atrial_fibrillation 45942 5 \N \N \N
+8938 Panel Consensus 40 atrial_fibrillation 45942 5 \N \N \N
+9631 Lisa Shieh 40 atrial_fibrillation 45942 3 3 \N \N
+9978 Andre Kumar 40 atrial_fibrillation 45942 2 3 Coags \N
+10470 Jonathan Chen 40 atrial_fibrillation 45942 0 2 \N \N
+7554 Jason Hom 40 atrial_fibrillation 45838 10 5 \N \N
+8707 Jonathan Chen 40 atrial_fibrillation 45838 6 4 Troponin \N
+8708 Panel Average 40 atrial_fibrillation 45838 6 \N \N \N
+8709 Panel Consensus 40 atrial_fibrillation 45838 6 \N \N \N
+8939 Lisa Shieh 40 atrial_fibrillation 45838 5 3 \N \N
+9632 Andre Kumar 40 atrial_fibrillation 45838 3 4 Troponin \N
+8940 Jason Hom 40 atrial_fibrillation 62151 5 4 \N \N
+8941 Jonathan Chen 40 atrial_fibrillation 62151 5 3 Lactate \N
+9599 Panel Average 40 atrial_fibrillation 62151 3 \N \N \N
+9633 Lisa Shieh 40 atrial_fibrillation 62151 3 3 \N \N
+9634 Panel Consensus 40 atrial_fibrillation 62151 3 \N \N \N
+9979 Andre Kumar 40 atrial_fibrillation 62151 2 2 Lactate \N
+8942 Jonathan Chen 41 atrial_fibrillation 62151 5 3 Lactate \N
+9635 Lisa Shieh 41 atrial_fibrillation 62151 3 3 \N \N
+9980 Andre Kumar 41 atrial_fibrillation 62151 2 2 Lactate \N
+9981 Panel Consensus 41 atrial_fibrillation 62151 2 \N \N \N
+10210 Panel Average 41 atrial_fibrillation 62151 2 \N \N \N
+10471 Jason Hom 41 atrial_fibrillation 62151 0 4 \N \N
+8943 Jason Hom 41 atrial_fibrillation 46011 5 4 \N \N
+8944 Lisa Shieh 41 atrial_fibrillation 46011 5 3 \N \N
+9600 Panel Average 41 atrial_fibrillation 46011 3 \N \N \N
+9636 Panel Consensus 41 atrial_fibrillation 46011 3 \N \N \N
+10472 Andre Kumar 41 atrial_fibrillation 46011 0 2 Lipid Panel \N
+10473 Jonathan Chen 41 atrial_fibrillation 46011 0 2 \N \N
+8945 Jason Hom 41 atrial_fibrillation 61837 5 4 \N \N
+8946 Lisa Shieh 41 atrial_fibrillation 61837 5 3 \N \N
+9601 Panel Average 41 atrial_fibrillation 61837 3 \N \N \N
+9637 Panel Consensus 41 atrial_fibrillation 61837 3 \N \N \N
+10474 Andre Kumar 41 atrial_fibrillation 61837 0 2 Lipid Panel \N
+10475 Jonathan Chen 41 atrial_fibrillation 61837 0 2 \N \N
+11455 Jonathan Chen 43 atrial_fibrillation 61837 0 2 \N \N
+11207 Andre Kumar 40 atrial_fibrillation 44276 -9 5 Sedation Patient lethargic and lorezepam not good for procedural sedation
+11208 Panel Average 40 atrial_fibrillation 44276 -9 \N \N \N
+7555 Jason Hom 40 atrial_fibrillation 45806 10 5 \N \N
+8486 Lisa Shieh 40 atrial_fibrillation 45806 7 5 \N \N
+8683 Panel Average 40 atrial_fibrillation 45806 6 \N \N \N
+8710 Panel Consensus 40 atrial_fibrillation 45806 6 \N \N \N
+9982 Andre Kumar 40 atrial_fibrillation 45806 2 3 Metabolic Panel \N
+9983 Jonathan Chen 40 atrial_fibrillation 45806 2 3 \N \N
+7556 Jason Hom 41 atrial_fibrillation 45806 10 4 \N \N
+8487 Lisa Shieh 41 atrial_fibrillation 45806 7 3 \N \N
+8684 Panel Average 41 atrial_fibrillation 45806 6 \N \N \N
+8711 Panel Consensus 41 atrial_fibrillation 45806 6 \N \N \N
+9984 Andre Kumar 41 atrial_fibrillation 45806 2 3 Metabolic Panel \N
+9985 Jonathan Chen 41 atrial_fibrillation 45806 2 3 \N \N
+7557 Jason Hom 40 atrial_fibrillation 45763 10 5 \N \N
+8488 Lisa Shieh 40 atrial_fibrillation 45763 7 3 \N \N
+8489 Panel Consensus 40 atrial_fibrillation 45763 7 \N \N \N
+8662 Panel Average 40 atrial_fibrillation 45763 7 \N \N \N
+9638 Andre Kumar 40 atrial_fibrillation 45763 3 3 Metabolic Panel \N
+9639 Jonathan Chen 40 atrial_fibrillation 45763 3 3 Metabolic Panel \N
+11375 Jonathan Chen 41 atrial_fibrillation 45763 3 3 Metabolic Panel \N
+7558 Jason Hom 40 atrial_fibrillation 45771 10 5 \N \N
+8490 Panel Consensus 40 atrial_fibrillation 45771 7 \N \N \N
+8712 Panel Average 40 atrial_fibrillation 45771 6 \N \N \N
+8947 Lisa Shieh 40 atrial_fibrillation 45771 5 3 \N \N
+9640 Andre Kumar 40 atrial_fibrillation 45771 3 3 Metabolic Panel \N
+9641 Jonathan Chen 40 atrial_fibrillation 45771 3 3 Metabolic Panel \N
+8491 Lisa Shieh 41 atrial_fibrillation 45771 7 3 \N \N
+8492 Panel Consensus 41 atrial_fibrillation 45771 7 \N \N \N
+8948 Jason Hom 41 atrial_fibrillation 45771 5 4 \N \N
+9430 Panel Average 41 atrial_fibrillation 45771 5 \N \N \N
+9642 Jonathan Chen 41 atrial_fibrillation 45771 3 3 Metabolic Panel \N
+9986 Andre Kumar 41 atrial_fibrillation 45771 2 4 Metabolic Panel \N
+8493 Panel Consensus 43 atrial_fibrillation 45771 7 \N \N \N
+8949 Jason Hom 43 atrial_fibrillation 45771 5 5 \N \N
+8950 Lisa Shieh 43 atrial_fibrillation 45771 5 3 \N \N
+9483 Panel Average 43 atrial_fibrillation 45771 4 \N \N \N
+9643 Jonathan Chen 43 atrial_fibrillation 45771 3 3 Metabolic Panel \N
+9987 Andre Kumar 43 atrial_fibrillation 45771 2 3 Metabolic Panel \N
+11144 Jason Hom 40 atrial_fibrillation 44327 -5 5 \N \N
+11145 Jonathan Chen 40 atrial_fibrillation 44327 -5 3 Negative Inotrope \N
+11193 Panel Average 40 atrial_fibrillation 44327 -8 \N \N \N
+11194 Panel Consensus 40 atrial_fibrillation 44327 -8 \N \N \N
+11209 Andre Kumar 40 atrial_fibrillation 44327 -9 5 Rate Control \N
+8951 Jason Hom 41 atrial_fibrillation 44005 5 4 \N \N
+9484 Panel Consensus 41 atrial_fibrillation 44005 4 \N \N \N
+9579 Panel Average 41 atrial_fibrillation 44005 4 \N \N \N
+9644 Andre Kumar 41 atrial_fibrillation 44005 3 2 Rate Control \N
+9645 Jonathan Chen 41 atrial_fibrillation 44005 3 3 \N Beta-blocker AFTER stabilization reasonable for chronic rate control and or CHF treatment
+9646 Lisa Shieh 41 atrial_fibrillation 44005 3 3 \N \N
+8952 Andre Kumar 40 atrial_fibrillation 44000 5 4 Sedation \N
+8953 Jason Hom 40 atrial_fibrillation 44000 5 4 \N \N
+8954 Lisa Shieh 40 atrial_fibrillation 44000 5 3 \N \N
+8955 Panel Average 40 atrial_fibrillation 44000 5 \N \N \N
+8956 Panel Consensus 40 atrial_fibrillation 44000 5 \N \N \N
+9988 Jonathan Chen 40 atrial_fibrillation 44000 2 2 Pre-DCCV \N
+8957 Jason Hom 43 atrial_fibrillation 44000 5 5 \N \N
+8958 Lisa Shieh 43 atrial_fibrillation 44000 5 3 \N \N
+9485 Panel Average 43 atrial_fibrillation 44000 4 \N \N \N
+9486 Panel Consensus 43 atrial_fibrillation 44000 4 \N \N \N
+9989 Andre Kumar 43 atrial_fibrillation 44000 2 3 Sedation \N
+9990 Jonathan Chen 43 atrial_fibrillation 44000 2 2 Pre-DCCV \N
+11420 Jonathan Chen 40 atrial_fibrillation 44294 2 2 Pre-DCCV \N
+8959 Jason Hom 41 atrial_fibrillation 45792 5 4 \N \N
+10211 Panel Average 41 atrial_fibrillation 45792 2 \N \N \N
+10476 Andre Kumar 41 atrial_fibrillation 45792 0 5 MRSA Screen \N
+10477 Jonathan Chen 41 atrial_fibrillation 45792 0 2 \N \N
+10478 Lisa Shieh 41 atrial_fibrillation 45792 0 3 \N \N
+10479 Panel Consensus 41 atrial_fibrillation 45792 0 \N \N \N
+10480 Andre Kumar 43 atrial_fibrillation 45792 0 3 MRSA Screen \N
+10481 Jonathan Chen 43 atrial_fibrillation 45792 0 2 \N \N
+10482 Lisa Shieh 43 atrial_fibrillation 45792 0 3 \N \N
+10966 Panel Average 43 atrial_fibrillation 45792 -1 \N \N \N
+10972 Panel Consensus 43 atrial_fibrillation 45792 -1 \N \N \N
+11001 Jason Hom 43 atrial_fibrillation 45792 -2 5 \N \N
+11430 Jonathan Chen 43 atrial_fibrillation 44241 0 2 \N Trying to relieve preload?
+11268 Jonathan Chen 43 atrial_fibrillation 44256 0 2 \N Trying to relieve preload?
+10483 Andre Kumar 40 atrial_fibrillation 48628 0 4 Anticoagulants \N
+10484 Jason Hom 40 atrial_fibrillation 48628 0 4 \N \N
+10485 Jonathan Chen 40 atrial_fibrillation 48628 0 2 \N \N
+10486 Lisa Shieh 40 atrial_fibrillation 48628 0 3 \N \N
+10487 Panel Average 40 atrial_fibrillation 48628 0 \N \N \N
+10488 Panel Consensus 40 atrial_fibrillation 48628 0 \N \N \N
+10489 Andre Kumar 40 atrial_fibrillation 46081 0 4 Nursing \N
+10490 Jason Hom 40 atrial_fibrillation 46081 0 4 \N \N
+10491 Jonathan Chen 40 atrial_fibrillation 46081 0 2 \N \N
+10492 Lisa Shieh 40 atrial_fibrillation 46081 0 5 \N \N
+10493 Panel Average 40 atrial_fibrillation 46081 0 \N \N \N
+10494 Panel Consensus 40 atrial_fibrillation 46081 0 \N \N \N
+11240 Jonathan Chen 40 atrial_fibrillation 50235 0 3 \N Not a respiratory issue?
+11320 Jonathan Chen 43 atrial_fibrillation 50235 0 3 \N Not respiratory issue, but maybe thinking manage preload with pulmonary pressure?
+11363 Jonathan Chen 43 atrial_fibrillation 36086 0 2 Vasopressor Adding vasopressor on while hypotensive from negative inotrope?
+7559 Jason Hom 40 atrial_fibrillation 45853 10 5 \N \N
+8867 Panel Average 40 atrial_fibrillation 45853 5 \N \N \N
+8960 Panel Consensus 40 atrial_fibrillation 45853 5 \N \N \N
+9487 Jonathan Chen 40 atrial_fibrillation 45853 4 4 \N \N
+9647 Andre Kumar 40 atrial_fibrillation 45853 3 4 BNP \N
+9648 Lisa Shieh 40 atrial_fibrillation 45853 3 3 \N \N
+8961 Jason Hom 41 atrial_fibrillation 45853 5 4 \N \N
+8962 Panel Consensus 41 atrial_fibrillation 45853 5 \N \N \N
+9488 Jonathan Chen 41 atrial_fibrillation 45853 4 4 \N \N
+8185 Jason Hom 10 pulmonary_embolism 45830 10 5 \N \N
+9580 Panel Average 41 atrial_fibrillation 45853 4 \N \N \N
+9649 Andre Kumar 41 atrial_fibrillation 45853 3 4 BNP \N
+9650 Lisa Shieh 41 atrial_fibrillation 45853 3 3 \N \N
+8963 Jason Hom 43 atrial_fibrillation 45853 5 5 \N \N
+8964 Lisa Shieh 43 atrial_fibrillation 45853 5 3 \N \N
+8965 Panel Consensus 43 atrial_fibrillation 45853 5 \N \N \N
+9446 Panel Average 43 atrial_fibrillation 45853 4 \N \N \N
+9489 Jonathan Chen 43 atrial_fibrillation 45853 4 4 \N \N
+9651 Andre Kumar 43 atrial_fibrillation 45853 3 3 BNP \N
+8966 Jason Hom 40 atrial_fibrillation 45787 5 4 \N \N
+10212 Panel Average 40 atrial_fibrillation 45787 2 \N \N \N
+10495 Andre Kumar 40 atrial_fibrillation 45787 0 5 PT/OT \N
+10496 Jonathan Chen 40 atrial_fibrillation 45787 0 2 \N \N
+10497 Lisa Shieh 40 atrial_fibrillation 45787 0 5 \N \N
+10498 Panel Consensus 40 atrial_fibrillation 45787 0 \N \N \N
+11339 Jonathan Chen 41 atrial_fibrillation 45787 0 3 \N \N
+7560 Jason Hom 40 atrial_fibrillation 45864 10 5 \N \N
+8713 Panel Consensus 40 atrial_fibrillation 45864 6 \N \N \N
+8843 Panel Average 40 atrial_fibrillation 45864 6 \N \N \N
+8967 Lisa Shieh 40 atrial_fibrillation 45864 5 3 \N \N
+9991 Andre Kumar 40 atrial_fibrillation 45864 2 2 Oxygen \N
+10499 Jonathan Chen 40 atrial_fibrillation 45864 0 2 \N \N
+11463 Jonathan Chen 40 atrial_fibrillation 48822 0 0 Oxygen \N
+11398 Jonathan Chen 43 atrial_fibrillation 48822 0 2 Oxygen \N
+7561 Jason Hom 40 atrial_fibrillation 45900 10 5 \N \N
+8714 Panel Consensus 40 atrial_fibrillation 45900 6 \N \N \N
+8844 Panel Average 40 atrial_fibrillation 45900 6 \N \N \N
+8968 Lisa Shieh 40 atrial_fibrillation 45900 5 3 \N \N
+9992 Andre Kumar 40 atrial_fibrillation 45900 2 2 Oxygen \N
+10500 Jonathan Chen 40 atrial_fibrillation 45900 0 2 \N \N
+11286 Jonathan Chen 43 atrial_fibrillation 45900 0 2 Oxygen \N
+7562 Lisa Shieh 40 atrial_fibrillation 61823 10 5 \N \N
+7563 Panel Consensus 40 atrial_fibrillation 61823 10 \N \N \N
+9929 Panel Average 40 atrial_fibrillation 61823 2 \N \N \N
+9993 Andre Kumar 40 atrial_fibrillation 61823 2 4 Nursing \N
+10501 Jonathan Chen 40 atrial_fibrillation 61823 0 2 \N \N
+11146 Jason Hom 40 atrial_fibrillation 61823 -5 5 \N \N
+11263 Jonathan Chen 43 atrial_fibrillation 43993 0 0 Vasopressor \N
+7564 Jason Hom 40 atrial_fibrillation 45778 10 5 \N \N
+8969 Lisa Shieh 40 atrial_fibrillation 45778 5 3 \N \N
+8970 Panel Average 40 atrial_fibrillation 45778 5 \N \N \N
+10255 Panel Consensus 40 atrial_fibrillation 45778 1 \N \N \N
+10502 Andre Kumar 40 atrial_fibrillation 45778 0 3 Metabolic Panel \N
+10503 Jonathan Chen 40 atrial_fibrillation 45778 0 2 \N \N
+9994 Andre Kumar 41 atrial_fibrillation 45778 2 4 Metabolic Panel \N
+9995 Panel Average 41 atrial_fibrillation 45778 2 \N \N \N
+8971 Jason Hom 43 atrial_fibrillation 45778 5 5 \N \N
+8972 Lisa Shieh 43 atrial_fibrillation 45778 5 \N \N \N
+9447 Panel Average 43 atrial_fibrillation 45778 4 \N \N \N
+9652 Andre Kumar 43 atrial_fibrillation 45778 3 2 Metabolic Panel \N
+10256 Panel Consensus 43 atrial_fibrillation 45778 1 \N \N \N
+10504 Jonathan Chen 43 atrial_fibrillation 45778 0 2 \N \N
+9653 Lisa Shieh 40 atrial_fibrillation 46090 3 3 \N \N
+9654 Panel Consensus 40 atrial_fibrillation 46090 3 \N \N \N
+10232 Panel Average 40 atrial_fibrillation 46090 1 \N \N \N
+10257 Andre Kumar 40 atrial_fibrillation 46090 1 3 CBC \N
+10505 Jason Hom 40 atrial_fibrillation 46090 0 4 \N \N
+10506 Jonathan Chen 40 atrial_fibrillation 46090 0 2 \N \N
+7565 Jason Hom 40 atrial_fibrillation 45914 10 5 \N \N
+8715 Jonathan Chen 40 atrial_fibrillation 45914 6 4 Troponin \N
+8716 Panel Average 40 atrial_fibrillation 45914 6 \N \N \N
+8717 Panel Consensus 40 atrial_fibrillation 45914 6 \N \N \N
+8973 Lisa Shieh 40 atrial_fibrillation 45914 5 3 \N \N
+9655 Andre Kumar 40 atrial_fibrillation 45914 3 3 Troponin \N
+11256 Jonathan Chen 43 atrial_fibrillation 46185 1 2 Blood Gas \N
+11354 Jonathan Chen 40 atrial_fibrillation 46067 3 3 Metabolic Panel \N
+8974 Jason Hom 40 atrial_fibrillation 45955 5 4 \N \N
+8975 Jonathan Chen 40 atrial_fibrillation 45955 5 3 Lactate \N
+10213 Panel Average 40 atrial_fibrillation 45955 2 \N \N \N
+10258 Panel Consensus 40 atrial_fibrillation 45955 1 \N \N \N
+10507 Andre Kumar 40 atrial_fibrillation 45955 0 4 Blood Gas \N
+10508 Lisa Shieh 40 atrial_fibrillation 45955 0 3 \N \N
+8976 Jonathan Chen 43 atrial_fibrillation 45955 5 3 Lactate \N
+9996 Andre Kumar 43 atrial_fibrillation 45955 2 2 Blood Gases \N
+10259 Panel Consensus 43 atrial_fibrillation 45955 1 \N \N \N
+10509 Jason Hom 43 atrial_fibrillation 45955 0 5 \N \N
+10973 Panel Average 43 atrial_fibrillation 45955 -1 \N \N \N
+11147 Lisa Shieh 43 atrial_fibrillation 45955 -5 3 \N \N
+9997 Andre Kumar 43 atrial_fibrillation 46000 2 1 Urinalysis \N
+10510 Jonathan Chen 43 atrial_fibrillation 46000 0 2 \N \N
+10511 Lisa Shieh 43 atrial_fibrillation 46000 0 3 \N \N
+10512 Panel Average 43 atrial_fibrillation 46000 0 \N \N \N
+10513 Panel Consensus 43 atrial_fibrillation 46000 0 \N \N \N
+11002 Jason Hom 43 atrial_fibrillation 46000 -2 5 \N \N
+7566 Jason Hom 40 atrial_fibrillation 45759 10 5 \N \N
+8977 Panel Average 40 atrial_fibrillation 45759 5 \N \N \N
+8978 Panel Consensus 40 atrial_fibrillation 45759 5 \N \N \N
+9656 Lisa Shieh 40 atrial_fibrillation 45759 3 3 \N \N
+9998 Andre Kumar 40 atrial_fibrillation 45759 2 3 Coags \N
+10514 Jonathan Chen 40 atrial_fibrillation 45759 0 2 \N \N
+7567 Jason Hom 41 atrial_fibrillation 45759 10 4 \N \N
+8494 Lisa Shieh 41 atrial_fibrillation 45759 7 3 \N \N
+8663 Panel Average 41 atrial_fibrillation 45759 7 \N \N \N
+8979 Panel Consensus 41 atrial_fibrillation 45759 5 \N \N \N
+9657 Andre Kumar 41 atrial_fibrillation 45759 3 4 Coags \N
+10515 Jonathan Chen 41 atrial_fibrillation 45759 0 2 \N \N
+8980 Jason Hom 43 atrial_fibrillation 45759 5 5 \N \N
+8981 Panel Consensus 43 atrial_fibrillation 45759 5 \N \N \N
+9581 Panel Average 43 atrial_fibrillation 45759 4 \N \N \N
+9658 Andre Kumar 43 atrial_fibrillation 45759 3 3 Coags \N
+9659 Lisa Shieh 43 atrial_fibrillation 45759 3 3 \N \N
+10516 Jonathan Chen 43 atrial_fibrillation 45759 0 2 \N \N
+8982 Jason Hom 40 atrial_fibrillation 45776 5 4 \N \N
+10214 Panel Average 40 atrial_fibrillation 45776 2 \N \N \N
+10517 Andre Kumar 40 atrial_fibrillation 45776 0 5 PT/OT \N
+10518 Jonathan Chen 40 atrial_fibrillation 45776 0 2 \N \N
+10519 Lisa Shieh 40 atrial_fibrillation 45776 0 6 \N \N
+10520 Panel Consensus 40 atrial_fibrillation 45776 0 \N \N \N
+11312 Jonathan Chen 41 atrial_fibrillation 45776 0 3 \N \N
+7568 Jason Hom 40 atrial_fibrillation 45770 10 5 \N \N
+8983 Panel Average 40 atrial_fibrillation 45770 5 \N \N \N
+8984 Panel Consensus 40 atrial_fibrillation 45770 5 \N \N \N
+9660 Lisa Shieh 40 atrial_fibrillation 45770 3 3 \N \N
+9999 Andre Kumar 40 atrial_fibrillation 45770 2 3 Coags \N
+10521 Jonathan Chen 40 atrial_fibrillation 45770 0 2 \N \N
+9661 Andre Kumar 41 atrial_fibrillation 45770 3 4 Coags \N
+9662 Panel Average 41 atrial_fibrillation 45770 3 \N \N \N
+8495 Lisa Shieh 43 atrial_fibrillation 45770 7 3 \N \N
+8985 Jason Hom 43 atrial_fibrillation 45770 5 5 \N \N
+8986 Panel Average 43 atrial_fibrillation 45770 5 \N \N \N
+8987 Panel Consensus 43 atrial_fibrillation 45770 5 \N \N \N
+9663 Andre Kumar 43 atrial_fibrillation 45770 3 3 Coags \N
+10522 Jonathan Chen 43 atrial_fibrillation 45770 0 2 \N \N
+11364 Jonathan Chen 43 atrial_fibrillation 49995 0 2 \N \N
+7569 Jason Hom 40 atrial_fibrillation 60178 10 5 \N \N
+8988 Jonathan Chen 40 atrial_fibrillation 60178 5 3 Anticoagulation Oral admin, is this too slow, and so should be worth less points?
+9664 Lisa Shieh 40 atrial_fibrillation 60178 3 3 \N \N
+10215 Panel Average 40 atrial_fibrillation 60178 2 \N \N \N
+11195 Andre Kumar 40 atrial_fibrillation 60178 -8 4 Anticoagulants "Per Warden et al (JAHA 2018 PMID 30571504): highest risk of stroke is within 48hrs after cardioversion, and most DOACS take 4-5 doses to reach steady state (e.g. >48 hrs). No prospective trial data evaluating DOACS + EMERGENT DCCV. A few weak trials sugge (...)"
+7570 Jason Hom 41 atrial_fibrillation 60178 10 5 \N \N
+8496 Lisa Shieh 41 atrial_fibrillation 60178 7 3 \N \N
+8989 Jonathan Chen 41 atrial_fibrillation 60178 5 3 Anticoagulation Oral admin, is this too slow, and so should be worth less points?
+9665 Panel Average 41 atrial_fibrillation 60178 3 \N \N \N
+11196 Andre Kumar 41 atrial_fibrillation 60178 -8 5 Anticoagulants \N
+11288 Jonathan Chen 43 atrial_fibrillation 60178 5 3 Anticoagulation Oral admin, is this too slow, and so should be worth less points?
+10523 Andre Kumar 40 atrial_fibrillation 44312 0 5 Statin \N
+10524 Jason Hom 40 atrial_fibrillation 44312 0 4 \N \N
+10525 Jonathan Chen 40 atrial_fibrillation 44312 0 2 \N \N
+10526 Lisa Shieh 40 atrial_fibrillation 44312 0 3 \N \N
+10527 Panel Average 40 atrial_fibrillation 44312 0 \N \N \N
+8990 Jonathan Chen 40 atrial_fibrillation 63725 5 3 Lactate \N
+9666 Lisa Shieh 40 atrial_fibrillation 63725 3 3 \N \N
+10000 Andre Kumar 40 atrial_fibrillation 63725 2 2 Lactate \N
+10001 Panel Consensus 40 atrial_fibrillation 63725 2 \N \N \N
+10216 Panel Average 40 atrial_fibrillation 63725 2 \N \N \N
+10528 Jason Hom 40 atrial_fibrillation 63725 0 4 \N \N
+8497 Lisa Shieh 40 atrial_fibrillation 44198 7 3 \N \N
+8991 Jason Hom 40 atrial_fibrillation 44198 5 4 \N \N
+9490 Jonathan Chen 40 atrial_fibrillation 44198 4 2 \N Reasonable to attempt, but no indication of dehydration as etiology?
+10260 Panel Average 40 atrial_fibrillation 44198 1 \N \N \N
+11003 Panel Consensus 40 atrial_fibrillation 44198 -2 \N \N \N
+11210 Andre Kumar 40 atrial_fibrillation 44198 -9 5 Fluids Patient already shows signs of volume overload
+8498 Lisa Shieh 43 atrial_fibrillation 44198 7 3 \N \N
+8992 Jason Hom 43 atrial_fibrillation 44198 5 5 \N \N
+9491 Jonathan Chen 43 atrial_fibrillation 44198 4 2 \N Reasonable to attempt, but no indication of dehydration as etiology?
+9930 Panel Average 43 atrial_fibrillation 44198 2 \N \N \N
+11004 Panel Consensus 43 atrial_fibrillation 44198 -2 \N \N \N
+11148 Andre Kumar 43 atrial_fibrillation 44198 -5 4 Fluids \N
+7571 Jason Hom 40 atrial_fibrillation 45870 10 5 \N \N
+8718 Jonathan Chen 40 atrial_fibrillation 45870 6 4 Troponin \N
+8719 Panel Average 40 atrial_fibrillation 45870 6 \N \N \N
+8720 Panel Consensus 40 atrial_fibrillation 45870 6 \N \N \N
+8993 Lisa Shieh 40 atrial_fibrillation 45870 5 3 \N \N
+9667 Andre Kumar 40 atrial_fibrillation 45870 3 2 Troponin \N
+8721 Jonathan Chen 41 atrial_fibrillation 45870 6 4 Troponin \N
+8722 Panel Consensus 41 atrial_fibrillation 45870 6 \N \N \N
+8994 Jason Hom 41 atrial_fibrillation 45870 5 4 \N \N
+8995 Lisa Shieh 41 atrial_fibrillation 45870 5 3 \N \N
+9448 Panel Average 41 atrial_fibrillation 45870 4 \N \N \N
+9668 Andre Kumar 41 atrial_fibrillation 45870 3 4 Troponin \N
+8723 Jonathan Chen 43 atrial_fibrillation 45870 6 4 Troponin \N
+8724 Panel Consensus 43 atrial_fibrillation 45870 6 \N \N \N
+8996 Jason Hom 43 atrial_fibrillation 45870 5 5 \N \N
+8997 Lisa Shieh 43 atrial_fibrillation 45870 5 3 \N \N
+9492 Panel Average 43 atrial_fibrillation 45870 4 \N \N \N
+10002 Andre Kumar 43 atrial_fibrillation 45870 2 4 Troponin \N
+7572 Jason Hom 40 atrial_fibrillation 62105 10 5 \N \N
+8499 Panel Consensus 40 atrial_fibrillation 62105 7 \N \N \N
+8664 Panel Average 40 atrial_fibrillation 62105 7 \N \N \N
+8998 Andre Kumar 40 atrial_fibrillation 62105 5 5 Thyroid \N
+8999 Lisa Shieh 40 atrial_fibrillation 62105 5 3 \N \N
+9669 Jonathan Chen 40 atrial_fibrillation 62105 3 4 \N \N
+7573 Jason Hom 41 atrial_fibrillation 62105 10 5 \N \N
+8500 Panel Consensus 41 atrial_fibrillation 62105 7 \N \N \N
+8665 Panel Average 41 atrial_fibrillation 62105 7 \N \N \N
+9000 Andre Kumar 41 atrial_fibrillation 62105 5 5 Thyroid If not done before
+9001 Lisa Shieh 41 atrial_fibrillation 62105 5 3 \N \N
+9670 Jonathan Chen 41 atrial_fibrillation 62105 3 4 \N \N
+10529 Andre Kumar 40 atrial_fibrillation 45945 0 3 Type and Screen \N
+10530 Jason Hom 40 atrial_fibrillation 45945 0 4 \N \N
+10531 Jonathan Chen 40 atrial_fibrillation 45945 0 2 \N \N
+10532 Lisa Shieh 40 atrial_fibrillation 45945 0 3 \N \N
+10533 Panel Average 40 atrial_fibrillation 45945 0 \N \N \N
+10534 Panel Consensus 40 atrial_fibrillation 45945 0 \N \N \N
+10003 Andre Kumar 43 atrial_fibrillation 45945 2 3 Type and Screen \N
+10535 Jonathan Chen 43 atrial_fibrillation 45945 0 2 \N \N
+10536 Lisa Shieh 43 atrial_fibrillation 45945 0 3 \N \N
+10537 Panel Average 43 atrial_fibrillation 45945 0 \N \N \N
+10538 Panel Consensus 43 atrial_fibrillation 45945 0 \N \N \N
+11005 Jason Hom 43 atrial_fibrillation 45945 -2 5 \N \N
+9671 Jonathan Chen 40 atrial_fibrillation 65656 3 3 DVT US \N
+10539 Lisa Shieh 40 atrial_fibrillation 65656 0 3 \N \N
+10974 Panel Consensus 40 atrial_fibrillation 65656 -1 \N \N \N
+10985 Panel Average 40 atrial_fibrillation 65656 -1 \N \N \N
+11006 Andre Kumar 40 atrial_fibrillation 65656 -2 1 Imaging \N
+11007 Jason Hom 40 atrial_fibrillation 65656 -2 4 \N \N
+9672 Jonathan Chen 41 atrial_fibrillation 65656 3 3 DVT US \N
+10540 Andre Kumar 41 atrial_fibrillation 65656 0 5 Imaging \N
+10541 Lisa Shieh 41 atrial_fibrillation 65656 0 3 \N \N
+10967 Panel Average 41 atrial_fibrillation 65656 -1 \N \N \N
+10975 Panel Consensus 41 atrial_fibrillation 65656 -1 \N \N \N
+11008 Jason Hom 41 atrial_fibrillation 65656 -2 4 \N \N
+9673 Jonathan Chen 40 atrial_fibrillation 65692 3 3 DVT US \N
+10542 Lisa Shieh 40 atrial_fibrillation 65692 0 3 \N \N
+10976 Panel Consensus 40 atrial_fibrillation 65692 -1 \N \N \N
+10986 Panel Average 40 atrial_fibrillation 65692 -1 \N \N \N
+11009 Andre Kumar 40 atrial_fibrillation 65692 -2 1 Imaging \N
+11010 Jason Hom 40 atrial_fibrillation 65692 -2 4 \N \N
+9674 Jonathan Chen 41 atrial_fibrillation 65692 3 3 DVT US \N
+10543 Andre Kumar 41 atrial_fibrillation 65692 0 5 Imaging \N
+10544 Lisa Shieh 41 atrial_fibrillation 65692 0 3 \N \N
+10968 Panel Average 41 atrial_fibrillation 65692 -1 \N \N \N
+10977 Panel Consensus 41 atrial_fibrillation 65692 -1 \N \N \N
+11011 Jason Hom 41 atrial_fibrillation 65692 -2 4 \N \N
+10545 Andre Kumar 41 atrial_fibrillation 45751 0 4 Urinalysis \N
+10546 Jason Hom 41 atrial_fibrillation 45751 0 4 \N \N
+10547 Jonathan Chen 41 atrial_fibrillation 45751 0 2 \N Not sure what they're looking for
+10548 Lisa Shieh 41 atrial_fibrillation 45751 0 3 \N \N
+10549 Panel Average 41 atrial_fibrillation 45751 0 \N \N \N
+10550 Panel Consensus 41 atrial_fibrillation 45751 0 \N \N \N
+11474 Jonathan Chen 40 atrial_fibrillation 46236 2 3 \N EtOH as part of Afib eval?
+7574 Jason Hom 40 atrial_fibrillation 45818 10 5 \N \N
+8501 Lisa Shieh 40 atrial_fibrillation 45818 7 5 \N \N
+9675 Jonathan Chen 40 atrial_fibrillation 45818 3 3 CXR \N
+9676 Panel Average 40 atrial_fibrillation 45818 3 \N \N \N
+11079 Panel Consensus 40 atrial_fibrillation 45818 -3 \N \N \N
+11197 Andre Kumar 40 atrial_fibrillation 45818 -8 3 Imaging \N
+8502 Lisa Shieh 41 atrial_fibrillation 45818 7 3 \N \N
+9002 Jason Hom 41 atrial_fibrillation 45818 5 4 \N \N
+9003 Panel Average 41 atrial_fibrillation 45818 5 \N \N \N
+9677 Andre Kumar 41 atrial_fibrillation 45818 3 3 Imaging \N
+9678 Jonathan Chen 41 atrial_fibrillation 45818 3 3 CXR \N
+9679 Panel Consensus 41 atrial_fibrillation 45818 3 \N \N \N
+9004 Jason Hom 43 atrial_fibrillation 45818 5 5 \N \N
+9005 Lisa Shieh 43 atrial_fibrillation 45818 5 3 \N \N
+9680 Jonathan Chen 43 atrial_fibrillation 45818 3 3 CXR \N
+9913 Panel Average 43 atrial_fibrillation 45818 3 \N \N \N
+11012 Andre Kumar 43 atrial_fibrillation 45818 -2 2 Imaging delays care
+11080 Panel Consensus 43 atrial_fibrillation 45818 -3 \N \N \N
+7575 Jason Hom 40 atrial_fibrillation 50200 10 5 \N \N
+8503 Lisa Shieh 40 atrial_fibrillation 50200 7 3 \N \N
+9006 Panel Average 40 atrial_fibrillation 50200 5 \N \N \N
+9681 Jonathan Chen 40 atrial_fibrillation 50200 3 3 CXR \N
+9682 Panel Consensus 40 atrial_fibrillation 50200 3 \N \N \N
+11013 Andre Kumar 40 atrial_fibrillation 50200 -2 2 Imaging Delays care
+8504 Lisa Shieh 41 atrial_fibrillation 50200 7 3 \N \N
+9007 Jason Hom 41 atrial_fibrillation 50200 5 4 \N \N
+9008 Panel Average 41 atrial_fibrillation 50200 5 \N \N \N
+9683 Andre Kumar 41 atrial_fibrillation 50200 3 3 Imaging \N
+9684 Jonathan Chen 41 atrial_fibrillation 50200 3 3 CXR \N
+9685 Panel Consensus 41 atrial_fibrillation 50200 3 \N \N \N
+7576 Jason Hom 40 atrial_fibrillation 45801 10 5 \N \N
+8505 Lisa Shieh 40 atrial_fibrillation 45801 7 3 \N \N
+9686 Jonathan Chen 40 atrial_fibrillation 45801 3 3 CXR \N
+9687 Panel Average 40 atrial_fibrillation 45801 3 \N \N \N
+11081 Andre Kumar 40 atrial_fibrillation 45801 -3 5 Imaging CXR delays care
+11082 Panel Consensus 40 atrial_fibrillation 45801 -3 \N \N \N
+9009 Jason Hom 43 atrial_fibrillation 45801 5 5 \N \N
+9010 Lisa Shieh 43 atrial_fibrillation 45801 5 3 \N \N
+9688 Jonathan Chen 43 atrial_fibrillation 45801 3 3 CXR \N
+9914 Panel Average 43 atrial_fibrillation 45801 3 \N \N \N
+11014 Andre Kumar 43 atrial_fibrillation 45801 -2 2 Imaging delays care
+11083 Panel Consensus 43 atrial_fibrillation 45801 -3 \N \N \N
+9011 Jason Hom 14 gi_bleed 44281 5 4 \N \N
+10382 Panel Average 14 gi_bleed 44281 1 \N \N \N
+10551 Jonathan Chen 14 gi_bleed 44281 0 2 \N \N
+10552 Lisa Shieh 14 gi_bleed 44281 0 5 \N \N
+10978 Panel Consensus 14 gi_bleed 44281 -1 \N \N \N
+11084 Andre Kumar 14 gi_bleed 44281 -3 4 Acetaminophen \N
+10261 Andre Kumar 2 gi_bleed 48829 1 2 Pain Medication \N
+10262 Jonathan Chen 2 gi_bleed 48829 1 2 \N Workup for liver injury. Okay I guess
+10263 Panel Consensus 2 gi_bleed 48829 1 \N \N \N
+10391 Panel Average 2 gi_bleed 48829 0 \N \N \N
+10553 Jason Hom 2 gi_bleed 48829 0 4 \N \N
+10554 Lisa Shieh 2 gi_bleed 48829 0 3 \N \N
+11280 Jonathan Chen 14 gi_bleed 44416 0 2 \N Acetaminophen overdose, non-specific hepatitis treatment?
+9689 Andre Kumar 14 gi_bleed 45932 3 4 Hepatitis Panel \N
+9690 Panel Average 14 gi_bleed 45932 3 \N \N \N
+11368 Jonathan Chen 15 gi_bleed 45932 2 2 \N \N
+11366 Jonathan Chen 14 gi_bleed 65641 0 4 \N \N
+11431 Jonathan Chen 16 gi_bleed 65641 0 4 \N \N
+7577 Jason Hom 16 gi_bleed 45814 10 5 \N \N
+7578 Lisa Shieh 16 gi_bleed 45814 10 5 \N \N
+7579 Panel Consensus 16 gi_bleed 45814 10 \N \N \N
+8303 Panel Average 16 gi_bleed 45814 8 \N \N \N
+9012 Andre Kumar 16 gi_bleed 45814 5 3 Admit \N
+10555 Jonathan Chen 16 gi_bleed 45814 0 2 \N \N
+11273 Jonathan Chen 2 gi_bleed 65641 0 4 \N \N
+9013 Andre Kumar 2 gi_bleed 45814 5 4 Admit \N
+9014 Panel Average 2 gi_bleed 45814 5 \N \N \N
+7580 Jason Hom 14 gi_bleed 61982 10 5 \N \N
+7581 Lisa Shieh 14 gi_bleed 61982 10 5 \N \N
+7582 Panel Consensus 14 gi_bleed 61982 10 \N \N \N
+8451 Panel Average 14 gi_bleed 61982 7 \N \N \N
+10004 Andre Kumar 14 gi_bleed 61982 2 5 Admit \N
+10556 Jonathan Chen 14 gi_bleed 61982 0 2 \N \N
+7583 Jason Hom 15 gi_bleed 61982 10 5 \N \N
+7584 Lisa Shieh 15 gi_bleed 61982 10 5 \N \N
+7585 Panel Consensus 15 gi_bleed 61982 10 \N \N \N
+8304 Panel Average 15 gi_bleed 61982 8 \N \N \N
+9015 Andre Kumar 15 gi_bleed 61982 5 5 Admit \N
+10557 Jonathan Chen 15 gi_bleed 61982 0 2 \N \N
+11440 Jonathan Chen 15 gi_bleed 44275 3 3 IVF \N
+11298 Jonathan Chen 15 gi_bleed 48744 0 3 \N Probably want complete hepatic panel, so give points there
+10005 Andre Kumar 14 gi_bleed 46136 2 1 Ammonia \N
+10264 Jonathan Chen 14 gi_bleed 46136 1 2 \N May be interesting, but not main point of case
+10383 Panel Average 14 gi_bleed 46136 1 \N \N \N
+10558 Jason Hom 14 gi_bleed 46136 0 4 \N \N
+10559 Lisa Shieh 14 gi_bleed 46136 0 3 \N \N
+10560 Panel Consensus 14 gi_bleed 46136 0 \N \N \N
+7586 Andre Kumar 15 gi_bleed 46136 10 5 Hepatic Encephalopathy \N
+9602 Panel Average 15 gi_bleed 46136 3 \N \N \N
+10265 Jonathan Chen 15 gi_bleed 46136 1 2 \N May be interesting, but not main point of case
+10561 Jason Hom 15 gi_bleed 46136 0 4 \N \N
+10562 Lisa Shieh 15 gi_bleed 46136 0 3 \N \N
+10563 Panel Consensus 15 gi_bleed 46136 0 \N \N \N
+10006 Andre Kumar 2 gi_bleed 46136 2 1 Hepatic Encephalopathy \N
+10266 Jonathan Chen 2 gi_bleed 46136 1 2 \N May be interesting, but not main point of case
+10384 Panel Average 2 gi_bleed 46136 1 \N \N \N
+10564 Jason Hom 2 gi_bleed 46136 0 4 \N \N
+10565 Lisa Shieh 2 gi_bleed 46136 0 3 \N \N
+10566 Panel Consensus 2 gi_bleed 46136 0 \N \N \N
+11372 Jonathan Chen 15 gi_bleed 63723 0 3 \N \N
+10567 Jonathan Chen 14 gi_bleed 50962 0 4 \N Mistake, must be looking for blood
+11015 Andre Kumar 14 gi_bleed 50962 -2 5 \N \N
+11099 Panel Average 14 gi_bleed 50962 -4 \N \N \N
+11104 Panel Consensus 14 gi_bleed 50962 -4 \N \N \N
+11149 Jason Hom 14 gi_bleed 50962 -5 5 \N \N
+9016 Lisa Shieh 15 gi_bleed 46245 5 3 \N \N
+9931 Panel Average 15 gi_bleed 46245 2 \N \N \N
+10007 Andre Kumar 15 gi_bleed 46245 2 5 Metabolic Panel \N
+10008 Panel Consensus 15 gi_bleed 46245 2 \N \N \N
+10568 Jason Hom 15 gi_bleed 46245 0 5 \N \N
+10569 Jonathan Chen 15 gi_bleed 46245 0 2 \N Looking to explain hyperbilirubin I guess?
+11276 Jonathan Chen 14 gi_bleed 48513 0 2 \N \N
+9017 Jason Hom 14 gi_bleed 45901 5 4 \N \N
+9932 Panel Average 14 gi_bleed 45901 2 \N \N \N
+10009 Andre Kumar 14 gi_bleed 45901 2 2 Blood Cultures \N
+10570 Jonathan Chen 14 gi_bleed 45901 0 2 \N Irrelevant diagnostic?
+10571 Lisa Shieh 14 gi_bleed 45901 0 3 \N \N
+10572 Panel Consensus 14 gi_bleed 45901 0 \N \N \N
+9018 Jason Hom 14 gi_bleed 45752 5 4 \N \N
+9933 Panel Average 14 gi_bleed 45752 2 \N \N \N
+10010 Andre Kumar 14 gi_bleed 45752 2 4 Blood Cultures \N
+10573 Jonathan Chen 14 gi_bleed 45752 0 2 \N \N
+10574 Lisa Shieh 14 gi_bleed 45752 0 3 \N \N
+10575 Panel Consensus 14 gi_bleed 45752 0 \N \N \N
+9691 Andre Kumar 14 gi_bleed 45760 3 4 Blood Gas \N
+10011 Jason Hom 14 gi_bleed 45760 2 4 \N \N
+10012 Jonathan Chen 14 gi_bleed 45760 2 3 Blood Gas Check for acidosis?
+10217 Panel Average 14 gi_bleed 45760 2 \N \N \N
+10576 Lisa Shieh 14 gi_bleed 45760 0 3 \N \N
+10577 Panel Consensus 14 gi_bleed 45760 0 \N \N \N
+10013 Andre Kumar 15 gi_bleed 45919 2 4 Blood Gas \N
+10014 Jason Hom 15 gi_bleed 45919 2 4 \N \N
+10015 Jonathan Chen 15 gi_bleed 45919 2 3 Blood Gas Check for acidosis?
+10233 Panel Average 15 gi_bleed 45919 1 \N \N \N
+10578 Lisa Shieh 15 gi_bleed 45919 0 3 \N \N
+10579 Panel Consensus 15 gi_bleed 45919 0 \N \N \N
+7587 Jason Hom 14 gi_bleed 45823 10 5 \N \N
+7588 Lisa Shieh 14 gi_bleed 45823 10 5 \N \N
+7589 Panel Consensus 14 gi_bleed 45823 10 \N \N \N
+8305 Panel Average 14 gi_bleed 45823 8 \N \N \N
+9019 Andre Kumar 14 gi_bleed 45823 5 5 Transfuse \N
+10267 Jonathan Chen 14 gi_bleed 45823 1 2 Type and Screen Just a step in RBC transfusion prep
+11395 Jonathan Chen 15 gi_bleed 45823 1 2 Type and Screen \N
+11317 Jonathan Chen 14 gi_bleed 44439 3 3 IVF \N
+7590 Jason Hom 14 gi_bleed 44290 10 4 \N \N
+7591 Lisa Shieh 14 gi_bleed 44290 10 5 ivf \N
+8306 Panel Average 14 gi_bleed 44290 8 \N \N \N
+8339 Panel Consensus 14 gi_bleed 44290 8 \N \N \N
+9020 Andre Kumar 14 gi_bleed 44290 5 4 Fluids \N
+9692 Jonathan Chen 14 gi_bleed 44290 3 3 IVF \N
+11248 Jonathan Chen 15 gi_bleed 44439 3 3 \N \N
+7592 Jason Hom 15 gi_bleed 44290 10 4 \N \N
+7593 Lisa Shieh 15 gi_bleed 44290 10 5 \N \N
+8224 Panel Average 15 gi_bleed 44290 9 \N \N \N
+8340 Andre Kumar 15 gi_bleed 44290 8 4 Fluids \N
+8341 Panel Consensus 15 gi_bleed 44290 8 \N \N \N
+9693 Jonathan Chen 15 gi_bleed 44290 3 3 IVF \N
+9021 Jason Hom 15 gi_bleed 45887 5 4 \N \N
+9022 Lisa Shieh 15 gi_bleed 45887 5 3 \N \N
+9493 Panel Average 15 gi_bleed 45887 4 \N \N \N
+10016 Andre Kumar 15 gi_bleed 45887 2 4 Metabolic Panel \N
+10580 Jonathan Chen 15 gi_bleed 45887 0 2 \N Not sure why necessary
+10581 Panel Consensus 15 gi_bleed 45887 0 \N \N \N
+9023 Jason Hom 2 gi_bleed 45887 5 4 \N \N
+9024 Lisa Shieh 2 gi_bleed 45887 5 3 \N \N
+9494 Panel Average 2 gi_bleed 45887 4 \N \N \N
+10017 Andre Kumar 2 gi_bleed 45887 2 3 Metabolic Panel \N
+10582 Jonathan Chen 2 gi_bleed 45887 0 2 \N \N
+10583 Panel Consensus 2 gi_bleed 45887 0 \N \N \N
+7594 Jason Hom 14 gi_bleed 45793 10 5 \N \N
+7595 Lisa Shieh 14 gi_bleed 45793 10 5 blood count \N
+7596 Panel Consensus 14 gi_bleed 45793 10 \N \N \N
+8225 Panel Average 14 gi_bleed 45793 9 \N \N \N
+8342 Andre Kumar 14 gi_bleed 45793 8 5 CBC \N
+8506 Jonathan Chen 14 gi_bleed 45793 7 4 CBC \N
+7597 Jason Hom 15 gi_bleed 45793 10 5 \N \N
+7598 Lisa Shieh 15 gi_bleed 45793 10 5 \N \N
+7599 Panel Consensus 15 gi_bleed 45793 10 \N \N \N
+8293 Panel Average 15 gi_bleed 45793 9 \N \N \N
+8507 Jonathan Chen 15 gi_bleed 45793 7 4 CBC \N
+8725 Andre Kumar 15 gi_bleed 45793 6 4 CBC \N
+7600 Jason Hom 16 gi_bleed 45793 10 5 \N \N
+7601 Lisa Shieh 16 gi_bleed 45793 10 5 \N \N
+7602 Panel Consensus 16 gi_bleed 45793 10 \N \N \N
+8307 Panel Average 16 gi_bleed 45793 8 \N \N \N
+8508 Jonathan Chen 16 gi_bleed 45793 7 4 CBC \N
+9025 Andre Kumar 16 gi_bleed 45793 5 1 CBC \N
+7603 Jason Hom 2 gi_bleed 45793 10 5 \N \N
+7604 Lisa Shieh 2 gi_bleed 45793 10 5 \N \N
+7605 Panel Consensus 2 gi_bleed 45793 10 \N \N \N
+8452 Panel Average 2 gi_bleed 45793 7 \N \N \N
+8509 Jonathan Chen 2 gi_bleed 45793 7 4 CBC \N
+10018 Andre Kumar 2 gi_bleed 45793 2 3 CBC \N
+7606 Lisa Shieh 14 gi_bleed 45788 10 3 blood count \N
+7607 Panel Consensus 14 gi_bleed 45788 10 \N \N \N
+8241 Jason Hom 14 gi_bleed 45788 9 5 \N \N
+8242 Panel Average 14 gi_bleed 45788 9 \N \N \N
+8343 Andre Kumar 14 gi_bleed 45788 8 5 CBC \N
+8510 Jonathan Chen 14 gi_bleed 45788 7 4 CBC \N
+7608 Lisa Shieh 15 gi_bleed 45788 10 5 \N \N
+7609 Panel Consensus 15 gi_bleed 45788 10 \N \N \N
+8243 Jason Hom 15 gi_bleed 45788 9 5 \N \N
+8308 Panel Average 15 gi_bleed 45788 8 \N \N \N
+8511 Jonathan Chen 15 gi_bleed 45788 7 4 CBC \N
+8726 Andre Kumar 15 gi_bleed 45788 6 5 CBC \N
+7610 Lisa Shieh 2 gi_bleed 45788 10 5 \N \N
+7611 Panel Consensus 2 gi_bleed 45788 10 \N \N \N
+8244 Jason Hom 2 gi_bleed 45788 9 5 \N \N
+8512 Jonathan Chen 2 gi_bleed 45788 7 4 CBC \N
+8513 Panel Average 2 gi_bleed 45788 7 \N \N \N
+10019 Andre Kumar 2 gi_bleed 45788 2 3 CBC \N
+11386 Jonathan Chen 15 gi_bleed 44255 0 2 \N Not reliable to cover Gram negative enterics (e.g., E coli)
+8344 Andre Kumar 15 gi_bleed 44637 8 5 Antibiotics \N
+8345 Jason Hom 15 gi_bleed 44637 8 5 \N \N
+8727 Jonathan Chen 15 gi_bleed 44637 6 5 Antibiotics Would cover same as ceftriaxone, though odd choice
+8868 Panel Average 15 gi_bleed 44637 5 \N \N \N
+9026 Panel Consensus 15 gi_bleed 44637 5 \N \N \N
+10584 Lisa Shieh 15 gi_bleed 44637 0 3 \N \N
+8245 Andre Kumar 14 gi_bleed 45060 9 3 Antibiotics \N
+8514 Jonathan Chen 14 gi_bleed 45060 7 5 Antibiotics \N
+9934 Panel Average 14 gi_bleed 45060 2 \N \N \N
+10020 Panel Consensus 14 gi_bleed 45060 2 \N \N \N
+10585 Lisa Shieh 14 gi_bleed 45060 0 3 \N \N
+11016 Jason Hom 14 gi_bleed 45060 -2 4 \N \N
+8246 Andre Kumar 15 gi_bleed 45060 9 5 Antibiotics \N
+8515 Jonathan Chen 15 gi_bleed 45060 7 5 Antibiotics \N
+9027 Lisa Shieh 15 gi_bleed 45060 5 3 \N \N
+9495 Panel Average 15 gi_bleed 45060 4 \N \N \N
+10021 Panel Consensus 15 gi_bleed 45060 2 \N \N \N
+11017 Jason Hom 15 gi_bleed 45060 -2 4 \N \N
+7612 Andre Kumar 14 gi_bleed 35733 10 5 Antibiotics \N
+7613 Jason Hom 14 gi_bleed 35733 10 5 \N \N
+7614 Panel Consensus 14 gi_bleed 35733 10 \N \N \N
+8247 Panel Average 14 gi_bleed 35733 9 \N \N \N
+8516 Jonathan Chen 14 gi_bleed 35733 7 5 Antibiotics \N
+8517 Lisa Shieh 14 gi_bleed 35733 7 3 \N \N
+7615 Andre Kumar 15 gi_bleed 35733 10 5 Antibiotics \N
+7616 Jason Hom 15 gi_bleed 35733 10 5 \N \N
+7617 Panel Consensus 15 gi_bleed 35733 10 \N \N \N
+8248 Panel Average 15 gi_bleed 35733 9 \N \N \N
+8518 Jonathan Chen 15 gi_bleed 35733 7 5 Antibiotics \N
+8519 Lisa Shieh 15 gi_bleed 35733 7 3 \N If already given, do not give credit again
+7618 Andre Kumar 16 gi_bleed 35733 10 5 Antibiotics Points if not ordered before
+7619 Jason Hom 16 gi_bleed 35733 10 5 \N \N
+7620 Lisa Shieh 16 gi_bleed 35733 10 5 \N \N
+7621 Panel Average 16 gi_bleed 35733 10 \N \N \N
+7622 Panel Consensus 16 gi_bleed 35733 10 \N \N \N
+8520 Jonathan Chen 16 gi_bleed 35733 7 5 Antibiotics \N
+7623 Jason Hom 2 gi_bleed 35733 10 5 \N \N
+7624 Lisa Shieh 2 gi_bleed 35733 10 5 \N If antibiotics, imaging already done, would not give again
+7625 Panel Consensus 2 gi_bleed 35733 10 \N \N \N
+8226 Panel Average 2 gi_bleed 35733 9 \N \N \N
+8346 Andre Kumar 2 gi_bleed 35733 8 3 Antibiotics \N
+8521 Jonathan Chen 2 gi_bleed 35733 7 5 Antibiotics \N
+11397 Jonathan Chen 2 gi_bleed 44249 7 5 Antibiotics Reasonable empiric choice for GNRs
+11423 Jonathan Chen 14 gi_bleed 62027 0 2 \N \N
+7626 Jason Hom 2 gi_bleed 63720 10 5 \N \N
+8522 Lisa Shieh 2 gi_bleed 63720 7 3 \N \N
+8523 Panel Average 2 gi_bleed 63720 7 \N \N \N
+9028 Panel Consensus 2 gi_bleed 63720 5 \N \N \N
+9496 Andre Kumar 2 gi_bleed 63720 4 1 Hepatitis Panel \N
+10022 Jonathan Chen 2 gi_bleed 63720 2 2 \N Workup for liver injury. Okay I guess
+7627 Jason Hom 15 gi_bleed 50400 10 5 \N \N
+8728 Panel Consensus 15 gi_bleed 50400 6 \N \N \N
+8845 Panel Average 15 gi_bleed 50400 6 \N \N \N
+9029 Lisa Shieh 15 gi_bleed 50400 5 3 \N \N
+10023 Andre Kumar 15 gi_bleed 50400 2 1 Consult \N
+10586 Jonathan Chen 15 gi_bleed 50400 0 2 \N \N
+7628 Jason Hom 14 gi_bleed 49481 10 5 \N \N
+7629 Jonathan Chen 14 gi_bleed 49481 10 5 GI-EGD \N
+7630 Lisa Shieh 14 gi_bleed 49481 10 5 \N \N
+7631 Panel Consensus 14 gi_bleed 49481 10 \N \N \N
+8309 Panel Average 14 gi_bleed 49481 8 \N \N \N
+9030 Andre Kumar 14 gi_bleed 49481 5 5 Consult \N
+7632 Andre Kumar 15 gi_bleed 49481 10 5 Consult \N
+7633 Jason Hom 15 gi_bleed 49481 10 5 \N \N
+7634 Jonathan Chen 15 gi_bleed 49481 10 5 GI-EGD \N
+7635 Lisa Shieh 15 gi_bleed 49481 10 5 \N \N
+7636 Panel Average 15 gi_bleed 49481 10 \N \N \N
+7637 Panel Consensus 15 gi_bleed 49481 10 \N \N \N
+7638 Jason Hom 16 gi_bleed 49481 10 5 \N \N
+7639 Jonathan Chen 16 gi_bleed 49481 10 5 GI-EGD \N
+7640 Lisa Shieh 16 gi_bleed 49481 10 5 \N \N
+7641 Panel Consensus 16 gi_bleed 49481 10 \N \N \N
+8453 Panel Average 16 gi_bleed 49481 7 \N \N \N
+10024 Andre Kumar 16 gi_bleed 49481 2 3 Consult \N
+9031 Jason Hom 14 gi_bleed 61323 5 5 \N \N
+9032 Lisa Shieh 14 gi_bleed 61323 5 3 \N \N
+9449 Panel Average 14 gi_bleed 61323 4 \N \N \N
+9694 Andre Kumar 14 gi_bleed 61323 3 4 Consult \N
+10025 Panel Consensus 14 gi_bleed 61323 2 \N \N \N
+10587 Jonathan Chen 14 gi_bleed 61323 0 2 \N \N
+7642 Jason Hom 15 gi_bleed 61323 10 5 \N \N
+7643 Lisa Shieh 15 gi_bleed 61323 10 3 \N \N
+8249 Panel Average 15 gi_bleed 61323 9 \N \N \N
+8250 Panel Consensus 15 gi_bleed 61323 9 \N \N \N
+8524 Andre Kumar 15 gi_bleed 61323 7 3 Consult \N
+10588 Jonathan Chen 15 gi_bleed 61323 0 2 \N \N
+11445 Jonathan Chen 16 gi_bleed 61323 0 2 \N \N
+7644 Jason Hom 14 gi_bleed 49207 10 5 \N \N
+9033 Lisa Shieh 14 gi_bleed 49207 5 3 \N \N
+9450 Panel Average 14 gi_bleed 49207 4 \N \N \N
+9497 Panel Consensus 14 gi_bleed 49207 4 \N \N \N
+10589 Jonathan Chen 14 gi_bleed 49207 0 3 \N \N
+11018 Andre Kumar 14 gi_bleed 49207 -2 2 Admit \N
+11269 Jonathan Chen 14 gi_bleed 49867 0 2 \N Not DIC, more total coagulant deficiency
+11019 Andre Kumar 14 gi_bleed 46072 -2 3 Imaging Delays care
+11020 Panel Average 14 gi_bleed 46072 -2 \N \N \N
+9034 Lisa Shieh 16 gi_bleed 45858 5 3 \N \N
+10026 Jonathan Chen 16 gi_bleed 45858 2 2 CT Abdomen Diagnostic workup okay, but seems like off choice for cirrhosis diagnosis?
+10268 Panel Average 16 gi_bleed 45858 1 \N \N \N
+10590 Jason Hom 16 gi_bleed 45858 0 4 \N \N
+10591 Panel Consensus 16 gi_bleed 45858 0 \N \N \N
+11021 Andre Kumar 16 gi_bleed 45858 -2 2 Imaging \N
+11309 Jonathan Chen 14 gi_bleed 45852 2 2 CT Abdomen \N
+11022 Andre Kumar 16 gi_bleed 45852 -2 2 Imaging \N
+11023 Panel Average 16 gi_bleed 45852 -2 \N \N \N
+8525 Lisa Shieh 2 gi_bleed 49836 7 3 \N \N
+10027 Jonathan Chen 2 gi_bleed 49836 2 2 CT Abdomen Diagnostic workup okay, but seems like off choice for cirrhosis diagnosis?
+10392 Panel Average 2 gi_bleed 49836 0 \N \N \N
+10979 Andre Kumar 2 gi_bleed 49836 -1 4 Imaging \N
+11150 Jason Hom 2 gi_bleed 49836 -5 4 \N \N
+11151 Panel Consensus 2 gi_bleed 49836 -5 \N \N \N
+10592 Jonathan Chen 2 gi_bleed 50737 0 2 \N Looks like mistake. Probably looking for abdomen
+10593 Lisa Shieh 2 gi_bleed 50737 0 5 \N \N
+10980 Andre Kumar 2 gi_bleed 50737 -1 5 Imaging \N
+11024 Panel Average 2 gi_bleed 50737 -2 \N \N \N
+11152 Jason Hom 2 gi_bleed 50737 -5 4 \N \N
+11153 Panel Consensus 2 gi_bleed 50737 -5 \N \N \N
+11387 Jonathan Chen 14 gi_bleed 48871 0 2 \N \N
+7645 Lisa Shieh 14 gi_bleed 46286 10 5 \N \N
+8526 Jonathan Chen 14 gi_bleed 46286 7 4 Coags \N
+8527 Panel Consensus 14 gi_bleed 46286 7 \N \N \N
+8666 Panel Average 14 gi_bleed 46286 7 \N \N \N
+9035 Andre Kumar 14 gi_bleed 46286 5 4 Coags \N
+9036 Jason Hom 14 gi_bleed 46286 5 4 \N \N
+7646 Lisa Shieh 16 gi_bleed 46286 10 5 \N \N
+8528 Jonathan Chen 16 gi_bleed 46286 7 4 Coags \N
+8529 Panel Consensus 16 gi_bleed 46286 7 \N \N \N
+8667 Panel Average 16 gi_bleed 46286 7 \N \N \N
+9037 Andre Kumar 16 gi_bleed 46286 5 2 Coags \N
+9038 Jason Hom 16 gi_bleed 46286 5 4 \N \N
+9695 Andre Kumar 2 gi_bleed 46286 3 3 Coags \N
+9696 Panel Average 2 gi_bleed 46286 3 \N \N \N
+10028 Andre Kumar 2 gi_bleed 45784 2 2 Clear Liquid \N
+10029 Panel Average 2 gi_bleed 45784 2 \N \N \N
+7647 Jason Hom 14 gi_bleed 45811 10 5 \N \N
+7648 Lisa Shieh 14 gi_bleed 45811 10 5 \N \N
+8310 Panel Average 14 gi_bleed 45811 8 \N \N \N
+8347 Panel Consensus 14 gi_bleed 45811 8 \N \N \N
+9039 Andre Kumar 14 gi_bleed 45811 5 5 NPO \N
+9697 Jonathan Chen 14 gi_bleed 45811 3 3 \N \N
+7649 Jason Hom 15 gi_bleed 45811 10 5 \N \N
+7650 Lisa Shieh 15 gi_bleed 45811 10 5 \N \N
+8311 Panel Average 15 gi_bleed 45811 8 \N \N \N
+8348 Panel Consensus 15 gi_bleed 45811 8 \N \N \N
+9040 Andre Kumar 15 gi_bleed 45811 5 5 NPO \N
+9698 Jonathan Chen 15 gi_bleed 45811 3 3 \N \N
+11464 Jonathan Chen 14 gi_bleed 45941 0 2 \N \N
+9041 Lisa Shieh 14 gi_bleed 45866 5 3 \N \N
+9935 Panel Average 14 gi_bleed 45866 2 \N \N \N
+10030 Jason Hom 14 gi_bleed 45866 2 4 \N \N
+10031 Jonathan Chen 14 gi_bleed 45866 2 2 \N \N
+10032 Panel Consensus 14 gi_bleed 45866 2 \N \N \N
+10594 Andre Kumar 14 gi_bleed 45866 0 4 ECG + Monitoring \N
+8530 Lisa Shieh 15 gi_bleed 45866 7 3 \N \N
+9936 Panel Average 15 gi_bleed 45866 2 \N \N \N
+10033 Jason Hom 15 gi_bleed 45866 2 4 \N \N
+10034 Jonathan Chen 15 gi_bleed 45866 2 2 \N \N
+10035 Panel Consensus 15 gi_bleed 45866 2 \N \N \N
+11025 Andre Kumar 15 gi_bleed 45866 -2 4 ECG + Monitoring \N
+10595 Andre Kumar 2 gi_bleed 61832 0 2 Imaging \N
+10596 Jonathan Chen 2 gi_bleed 61832 0 2 \N Working up ascites I guess? History all suggests primary liver though
+10597 Lisa Shieh 2 gi_bleed 61832 0 5 \N \N
+10598 Panel Consensus 2 gi_bleed 61832 0 \N \N \N
+10969 Panel Average 2 gi_bleed 61832 -1 \N \N \N
+11154 Jason Hom 2 gi_bleed 61832 -5 4 \N \N
+7651 Jason Hom 14 gi_bleed 46160 10 5 \N \N
+7652 Lisa Shieh 14 gi_bleed 46160 10 5 \N \N
+7653 Panel Consensus 14 gi_bleed 46160 10 \N \N \N
+8432 Panel Average 14 gi_bleed 46160 8 \N \N \N
+9699 Andre Kumar 14 gi_bleed 46160 3 2 Vitals \N
+10599 Jonathan Chen 14 gi_bleed 46160 0 2 \N \N
+11477 Jonathan Chen 15 gi_bleed 46160 0 2 \N \N
+11330 Jonathan Chen 15 gi_bleed 46078 0 2 \N \N
+7654 Andre Kumar 14 gi_bleed 63759 10 4 Transfuse \N
+7655 Jonathan Chen 14 gi_bleed 63759 10 5 RBC \N
+9042 Jason Hom 14 gi_bleed 63759 5 4 \N \N
+9043 Panel Average 14 gi_bleed 63759 5 \N \N \N
+10600 Lisa Shieh 14 gi_bleed 63759 0 3 \N \N
+10601 Panel Consensus 14 gi_bleed 63759 0 \N \N \N
+7656 Andre Kumar 15 gi_bleed 63759 10 5 Transfuse \N
+7657 Jason Hom 15 gi_bleed 63759 10 4 \N \N
+7658 Jonathan Chen 15 gi_bleed 63759 10 5 RBC \N
+7659 Lisa Shieh 15 gi_bleed 63759 10 5 \N \N
+7660 Panel Average 15 gi_bleed 63759 10 \N \N \N
+7661 Panel Consensus 15 gi_bleed 63759 10 \N \N \N
+9044 Jason Hom 14 gi_bleed 46028 5 4 \N \N
+9498 Panel Consensus 14 gi_bleed 46028 4 \N \N \N
+9582 Panel Average 14 gi_bleed 46028 4 \N \N \N
+9700 Andre Kumar 14 gi_bleed 46028 3 3 Coags \N
+9701 Lisa Shieh 14 gi_bleed 46028 3 3 \N \N
+10602 Jonathan Chen 14 gi_bleed 46028 0 2 \N \N
+7662 Jason Hom 14 gi_bleed 45872 10 5 \N \N
+7663 Lisa Shieh 14 gi_bleed 45872 10 3 \N \N
+8227 Panel Average 14 gi_bleed 45872 9 \N \N \N
+8251 Jonathan Chen 14 gi_bleed 45872 9 4 FFP \N
+8252 Panel Consensus 14 gi_bleed 45872 9 \N \N \N
+8349 Andre Kumar 14 gi_bleed 45872 8 5 Transfuse \N
+7664 Jason Hom 15 gi_bleed 45872 10 5 \N \N
+7665 Lisa Shieh 15 gi_bleed 45872 10 5 \N \N
+8228 Panel Average 15 gi_bleed 45872 9 \N \N \N
+8253 Jonathan Chen 15 gi_bleed 45872 9 4 FFP \N
+8254 Panel Consensus 15 gi_bleed 45872 9 \N \N \N
+8350 Andre Kumar 15 gi_bleed 45872 8 5 Transfuse \N
+7666 Jason Hom 16 gi_bleed 45872 10 5 \N \N
+7667 Lisa Shieh 16 gi_bleed 45872 10 5 \N \N
+8255 Jonathan Chen 16 gi_bleed 45872 9 4 FFP \N
+8256 Panel Average 16 gi_bleed 45872 9 \N \N \N
+8257 Panel Consensus 16 gi_bleed 45872 9 \N \N \N
+8531 Andre Kumar 16 gi_bleed 45872 7 1 Transfuse no points if done previously
+10603 Andre Kumar 14 gi_bleed 41788 0 1 \N ?Order set?
+10604 Panel Average 14 gi_bleed 41788 0 \N \N \N
+11324 Jonathan Chen 14 gi_bleed 44237 6 4 Antibiotics A bit overkill, but would cover GNRs
+9045 Andre Kumar 14 gi_bleed 48724 5 4 H pylori \N
+9046 Jason Hom 14 gi_bleed 48724 5 4 \N \N
+9047 Lisa Shieh 14 gi_bleed 48724 5 3 h pylori \N
+9048 Panel Average 14 gi_bleed 48724 5 \N \N \N
+9049 Panel Consensus 14 gi_bleed 48724 5 \N \N \N
+10269 Jonathan Chen 14 gi_bleed 48724 1 2 \N Antibody not as relevant as stool test
+9050 Jason Hom 14 gi_bleed 45948 5 4 \N \N
+9051 Lisa Shieh 14 gi_bleed 45948 5 3 \N \N
+9052 Panel Consensus 14 gi_bleed 45948 5 \N \N \N
+9583 Panel Average 14 gi_bleed 45948 4 \N \N \N
+9702 Jonathan Chen 14 gi_bleed 45948 3 3 \N \N
+10270 Andre Kumar 14 gi_bleed 45948 1 4 H pylori \N
+8532 Lisa Shieh 15 gi_bleed 45948 7 3 \N \N
+9053 Jason Hom 15 gi_bleed 45948 5 4 \N \N
+9054 Panel Consensus 15 gi_bleed 45948 5 \N \N \N
+9451 Panel Average 15 gi_bleed 45948 4 \N \N \N
+9703 Jonathan Chen 15 gi_bleed 45948 3 3 \N \N
+10271 Andre Kumar 15 gi_bleed 45948 1 3 H pylori \N
+7668 Jason Hom 15 gi_bleed 45891 10 5 \N \N
+7669 Lisa Shieh 15 gi_bleed 45891 10 5 \N \N
+7670 Panel Consensus 15 gi_bleed 45891 10 \N \N \N
+8312 Panel Average 15 gi_bleed 45891 8 \N \N \N
+8533 Jonathan Chen 15 gi_bleed 45891 7 4 CBC \N
+9055 Andre Kumar 15 gi_bleed 45891 5 4 CBC \N
+7671 Jason Hom 15 gi_bleed 46051 10 5 \N \N
+7672 Lisa Shieh 15 gi_bleed 46051 10 5 \N \N
+7673 Panel Consensus 15 gi_bleed 46051 10 \N \N \N
+8313 Panel Average 15 gi_bleed 46051 8 \N \N \N
+8534 Jonathan Chen 15 gi_bleed 46051 7 4 CBC \N
+9056 Andre Kumar 15 gi_bleed 46051 5 5 CBC \N
+11384 Jonathan Chen 15 gi_bleed 46068 0 2 \N \N
+7674 Jason Hom 14 gi_bleed 45910 10 5 \N \N
+8454 Panel Average 14 gi_bleed 45910 7 \N \N \N
+8535 Jonathan Chen 14 gi_bleed 45910 7 4 Metabolic Panel \N
+8536 Lisa Shieh 14 gi_bleed 45910 7 3 \N \N
+8537 Panel Consensus 14 gi_bleed 45910 7 \N \N \N
+9057 Andre Kumar 14 gi_bleed 45910 5 4 Liver Function Test \N
+11441 Jonathan Chen 2 gi_bleed 62029 0 2 \N Covered in hepatitis panel?
+7675 Jason Hom 15 gi_bleed 71083 10 5 \N \N
+8729 Andre Kumar 15 gi_bleed 71083 6 4 ICU Bundle \N
+8869 Panel Average 15 gi_bleed 71083 5 \N \N \N
+9058 Panel Consensus 15 gi_bleed 71083 5 \N \N \N
+10605 Jonathan Chen 15 gi_bleed 71083 0 2 \N Not supposed to be directly ordered
+10606 Lisa Shieh 15 gi_bleed 71083 0 3 \N \N
+7676 Lisa Shieh 14 gi_bleed 65649 10 3 \N \N
+9452 Panel Average 14 gi_bleed 65649 4 \N \N \N
+9499 Panel Consensus 14 gi_bleed 65649 4 \N \N \N
+9704 Andre Kumar 14 gi_bleed 65649 3 3 NG tube \N
+10036 Jonathan Chen 14 gi_bleed 65649 2 2 Airway Protection May not be necessary, but reasonable
+10607 Jason Hom 14 gi_bleed 65649 0 4 \N \N
+8538 Andre Kumar 15 gi_bleed 62022 7 5 Intubate \N
+8539 Panel Consensus 15 gi_bleed 62022 7 \N \N \N
+9059 Jason Hom 15 gi_bleed 62022 5 4 \N \N
+9500 Panel Average 15 gi_bleed 62022 4 \N \N \N
+10037 Jonathan Chen 15 gi_bleed 62022 2 2 Airway Protection Wasn't supposed to be necessary, but not unreasonable if worried about ongoing hematemesis
+10608 Lisa Shieh 15 gi_bleed 62022 0 5 \N \N
+7677 Jason Hom 14 gi_bleed 45942 10 5 \N \N
+7678 Lisa Shieh 14 gi_bleed 45942 10 6 coags \N
+8314 Panel Average 14 gi_bleed 45942 8 \N \N \N
+8351 Panel Consensus 14 gi_bleed 45942 8 \N \N \N
+8540 Jonathan Chen 14 gi_bleed 45942 7 4 Coags \N
+9060 Andre Kumar 14 gi_bleed 45942 5 5 Coags \N
+9061 Lisa Shieh 15 gi_bleed 45838 5 3 \N \N
+10038 Jonathan Chen 15 gi_bleed 45838 2 3 Troponin \N
+10218 Panel Average 15 gi_bleed 45838 2 \N \N \N
+10609 Andre Kumar 15 gi_bleed 45838 0 2 Troponin \N
+10610 Jason Hom 15 gi_bleed 45838 0 4 \N \N
+10611 Panel Consensus 15 gi_bleed 45838 0 \N \N \N
+7679 Jason Hom 14 gi_bleed 48954 10 4 \N \N
+7680 Lisa Shieh 14 gi_bleed 48954 10 5 ivf \N
+7681 Panel Consensus 14 gi_bleed 48954 10 \N \N \N
+8541 Panel Average 14 gi_bleed 48954 7 \N \N \N
+10039 Jonathan Chen 14 gi_bleed 48954 2 2 IV Access \N
+10272 Andre Kumar 14 gi_bleed 48954 1 5 Nursing \N
+11433 Jonathan Chen 15 gi_bleed 44978 0 2 \N Peri-procedure sedation???
+9062 Jason Hom 14 gi_bleed 62151 5 4 \N \N
+9937 Panel Average 14 gi_bleed 62151 2 \N \N \N
+10040 Andre Kumar 14 gi_bleed 62151 2 4 Lactate \N
+10041 Jonathan Chen 14 gi_bleed 62151 2 4 Lactate \N
+10042 Panel Consensus 14 gi_bleed 62151 2 \N \N \N
+10612 Lisa Shieh 14 gi_bleed 62151 0 3 \N \N
+11360 Jonathan Chen 15 gi_bleed 62151 2 4 Lactate \N
+11341 Jonathan Chen 16 gi_bleed 62151 2 4 Lactate \N
+10043 Andre Kumar 14 gi_bleed 45918 2 4 Lactate \N
+10044 Panel Average 14 gi_bleed 45918 2 \N \N \N
+10613 Lisa Shieh 15 gi_bleed 46289 0 3 \N \N
+11026 Andre Kumar 15 gi_bleed 46289 -2 1 Hepatic Encephalopathy \N
+11027 Jonathan Chen 15 gi_bleed 46289 -2 2 Lactulose Maybe even negative points? Giving lactulose to make patient have diarrhea while they are actively bleeding out seems bad
+11028 Panel Consensus 15 gi_bleed 46289 -2 \N \N \N
+11071 Panel Average 15 gi_bleed 46289 -2 \N \N \N
+11155 Jason Hom 15 gi_bleed 46289 -5 4 \N \N
+10614 Lisa Shieh 15 gi_bleed 44302 0 3 \N \N
+11029 Andre Kumar 15 gi_bleed 44302 -2 5 Hepatic Encephalopathy \N
+11030 Jonathan Chen 15 gi_bleed 44302 -2 2 Lactulose Maybe even negative points? Giving lactulose to make patient have diarrhea while they are actively bleeding out seems bad
+11031 Panel Consensus 15 gi_bleed 44302 -2 \N \N \N
+11072 Panel Average 15 gi_bleed 44302 -2 \N \N \N
+11156 Jason Hom 15 gi_bleed 44302 -5 4 \N \N
+10615 Lisa Shieh 15 gi_bleed 44593 0 3 \N \N
+11032 Andre Kumar 15 gi_bleed 44593 -2 5 Hepatic Encephalopathy \N
+11033 Jonathan Chen 15 gi_bleed 44593 -2 2 Lactulose Maybe even negative points? Giving lactulose to make patient have diarrhea while they are actively bleeding out seems bad
+11034 Panel Consensus 15 gi_bleed 44593 -2 \N \N \N
+11073 Panel Average 15 gi_bleed 44593 -2 \N \N \N
+11157 Jason Hom 15 gi_bleed 44593 -5 4 \N \N
+11316 Jonathan Chen 14 gi_bleed 45903 0 2 \N \N
+11426 Jonathan Chen 14 gi_bleed 62144 0 0 \N \N
+9705 Andre Kumar 16 gi_bleed 62144 3 3 Imaging \N
+9706 Panel Average 16 gi_bleed 62144 3 \N \N \N
+10616 Andre Kumar 14 gi_bleed 45894 0 2 Lipase \N
+10617 Jason Hom 14 gi_bleed 45894 0 4 \N \N
+10618 Jonathan Chen 14 gi_bleed 45894 0 2 \N Irrelevant diagnostic?
+10619 Lisa Shieh 14 gi_bleed 45894 0 3 \N \N
+10620 Panel Average 14 gi_bleed 45894 0 \N \N \N
+10621 Panel Consensus 14 gi_bleed 45894 0 \N \N \N
+7682 Jason Hom 15 gi_bleed 45806 10 4 \N \N
+9603 Panel Average 15 gi_bleed 45806 3 \N \N \N
+10045 Panel Consensus 15 gi_bleed 45806 2 \N \N \N
+10622 Andre Kumar 15 gi_bleed 45806 0 5 Metabolic Panel \N
+10623 Jonathan Chen 15 gi_bleed 45806 0 2 \N \N
+10624 Lisa Shieh 15 gi_bleed 45806 0 3 \N \N
+10046 Andre Kumar 2 gi_bleed 45806 2 3 Metabolic Panel \N
+10047 Panel Average 2 gi_bleed 45806 2 \N \N \N
+9063 Andre Kumar 14 gi_bleed 63745 5 2 Transfuse \N
+9064 Jason Hom 14 gi_bleed 63745 5 4 \N \N
+9604 Panel Average 14 gi_bleed 63745 3 \N \N \N
+10625 Jonathan Chen 14 gi_bleed 63745 0 2 \N \N
+10626 Lisa Shieh 14 gi_bleed 63745 0 3 \N \N
+10627 Panel Consensus 14 gi_bleed 63745 0 \N \N \N
+11244 Jonathan Chen 15 gi_bleed 63745 0 2 \N \N
+7683 Jason Hom 14 gi_bleed 45763 10 4 \N \N
+7684 Lisa Shieh 14 gi_bleed 45763 10 5 \N \N
+8352 Panel Consensus 14 gi_bleed 45763 8 \N \N \N
+8433 Panel Average 14 gi_bleed 45763 8 \N \N \N
+8542 Jonathan Chen 14 gi_bleed 45763 7 4 Metabolic Panel \N
+9707 Andre Kumar 14 gi_bleed 45763 3 3 Metabolic Panel \N
+7685 Jason Hom 15 gi_bleed 45763 10 4 \N \N
+7686 Lisa Shieh 15 gi_bleed 45763 10 5 \N \N
+8353 Panel Consensus 15 gi_bleed 45763 8 \N \N \N
+8434 Panel Average 15 gi_bleed 45763 8 \N \N \N
+8543 Jonathan Chen 15 gi_bleed 45763 7 4 Metabolic Panel \N
+9708 Andre Kumar 15 gi_bleed 45763 3 4 Metabolic Panel \N
+7687 Jason Hom 2 gi_bleed 45763 10 4 \N \N
+7688 Lisa Shieh 2 gi_bleed 45763 10 5 \N \N
+8315 Panel Average 2 gi_bleed 45763 8 \N \N \N
+8354 Panel Consensus 2 gi_bleed 45763 8 \N \N \N
+8544 Jonathan Chen 2 gi_bleed 45763 7 4 Metabolic Panel \N
+9065 Andre Kumar 2 gi_bleed 45763 5 2 Metabolic Panel \N
+7689 Jason Hom 14 gi_bleed 45771 10 4 \N \N
+7690 Lisa Shieh 14 gi_bleed 45771 10 5 \N \N
+8258 Panel Consensus 14 gi_bleed 45771 9 \N \N \N
+8355 Panel Average 14 gi_bleed 45771 8 \N \N \N
+8545 Jonathan Chen 14 gi_bleed 45771 7 4 Metabolic Panel \N
+9501 Andre Kumar 14 gi_bleed 45771 4 5 Metabolic Panel \N
+7691 Jason Hom 15 gi_bleed 45771 10 4 \N \N
+7692 Lisa Shieh 15 gi_bleed 45771 10 5 \N \N
+8259 Panel Consensus 15 gi_bleed 45771 9 \N \N \N
+8435 Panel Average 15 gi_bleed 45771 8 \N \N \N
+8546 Jonathan Chen 15 gi_bleed 45771 7 4 Metabolic Panel \N
+9709 Andre Kumar 15 gi_bleed 45771 3 4 Metabolic Panel \N
+11342 Jonathan Chen 2 gi_bleed 45771 7 4 Metabolic Panel \N
+11035 Andre Kumar 14 gi_bleed 44294 -2 5 Pain Medication \N
+11036 Panel Average 14 gi_bleed 44294 -2 \N \N \N
+10628 Andre Kumar 15 gi_bleed 45792 0 2 MRSA \N
+10629 Jason Hom 15 gi_bleed 45792 0 4 \N \N
+10630 Jonathan Chen 15 gi_bleed 45792 0 2 \N \N
+10631 Lisa Shieh 15 gi_bleed 45792 0 3 \N \N
+10632 Panel Average 15 gi_bleed 45792 0 \N \N \N
+10633 Panel Consensus 15 gi_bleed 45792 0 \N \N \N
+7693 Jason Hom 14 gi_bleed 45785 10 4 \N \N
+9605 Panel Average 14 gi_bleed 45785 3 \N \N \N
+10634 Andre Kumar 14 gi_bleed 45785 0 1 Nursing \N
+10635 Jonathan Chen 14 gi_bleed 45785 0 2 \N \N
+10636 Lisa Shieh 14 gi_bleed 45785 0 \N \N \N
+10637 Panel Consensus 14 gi_bleed 45785 0 \N \N \N
+8730 Andre Kumar 15 gi_bleed 36086 6 3 Pressors \N
+9066 Jason Hom 15 gi_bleed 36086 5 4 \N \N
+9067 Panel Consensus 15 gi_bleed 36086 5 \N \N \N
+9584 Panel Average 15 gi_bleed 36086 4 \N \N \N
+10638 Jonathan Chen 15 gi_bleed 36086 0 2 Pressors \N
+10639 Lisa Shieh 15 gi_bleed 36086 0 3 \N \N
+10273 Andre Kumar 14 gi_bleed 48815 1 3 Stool test \N
+10274 Panel Average 14 gi_bleed 48815 1 \N \N \N
+11422 Jonathan Chen 14 gi_bleed 51110 0 2 \N Largely irrelevant in acute setting
+9710 Jonathan Chen 14 gi_bleed 46451 3 3 Octreotide Subcutaneous probably not the correct route
+10640 Lisa Shieh 14 gi_bleed 46451 0 3 Octreotide \N
+10987 Panel Average 14 gi_bleed 46451 -1 \N \N \N
+11037 Andre Kumar 14 gi_bleed 46451 -2 2 Bleeding Medication \N
+11038 Jason Hom 14 gi_bleed 46451 -2 4 \N \N
+11039 Panel Consensus 14 gi_bleed 46451 -2 \N \N \N
+9068 Lisa Shieh 15 gi_bleed 46451 5 3 \N \N
+9711 Jonathan Chen 15 gi_bleed 46451 3 3 Octreotide Subcutaneous probably not the correct route
+10393 Panel Average 15 gi_bleed 46451 0 \N \N \N
+11040 Andre Kumar 15 gi_bleed 46451 -2 3 Bleeding Medication \N
+11041 Jason Hom 15 gi_bleed 46451 -2 4 \N \N
+11042 Panel Consensus 15 gi_bleed 46451 -2 \N \N \N
+7694 Andre Kumar 14 gi_bleed 43996 10 5 Bleeding Medication \N
+7695 Jason Hom 14 gi_bleed 43996 10 5 \N \N
+7696 Panel Consensus 14 gi_bleed 43996 10 \N \N \N
+8260 Panel Average 14 gi_bleed 43996 9 \N \N \N
+8547 Lisa Shieh 14 gi_bleed 43996 7 3 \N no known cirrhosis but angiomata on exam
+9069 Jonathan Chen 14 gi_bleed 43996 5 4 Octreotide Presumptive variceal bleed
+7697 Andre Kumar 15 gi_bleed 43996 10 4 Bleeding Medication \N
+7698 Jason Hom 15 gi_bleed 43996 10 5 \N \N
+7699 Lisa Shieh 15 gi_bleed 43996 10 5 \N \N
+7700 Panel Average 15 gi_bleed 43996 10 \N \N \N
+7701 Panel Consensus 15 gi_bleed 43996 10 \N \N \N
+9070 Jonathan Chen 15 gi_bleed 43996 5 4 Octreotide Presumptive variceal bleed
+7702 Jason Hom 16 gi_bleed 43996 10 5 \N \N
+7703 Lisa Shieh 16 gi_bleed 43996 10 5 \N \N
+7704 Panel Consensus 16 gi_bleed 43996 10 \N \N \N
+8668 Panel Average 16 gi_bleed 43996 7 \N \N \N
+9071 Jonathan Chen 16 gi_bleed 43996 5 4 Octreotide Presumptive variceal bleed
+10641 Andre Kumar 16 gi_bleed 43996 0 2 Bleeding Medication \N
+7705 Jason Hom 2 gi_bleed 43996 10 5 \N \N
+7706 Lisa Shieh 2 gi_bleed 43996 10 5 \N \N
+7707 Panel Consensus 2 gi_bleed 43996 10 \N \N \N
+8669 Panel Average 2 gi_bleed 43996 7 \N \N \N
+9072 Jonathan Chen 2 gi_bleed 43996 5 4 Octreotide Presumptive variceal bleed
+10642 Andre Kumar 2 gi_bleed 43996 0 2 Bleeding Medication \N
+9073 Lisa Shieh 15 gi_bleed 46449 5 3 \N \N
+9712 Jonathan Chen 15 gi_bleed 46449 3 3 Octreotide Subcutaneous probably not the correct route
+10394 Panel Average 15 gi_bleed 46449 0 \N \N \N
+11043 Andre Kumar 15 gi_bleed 46449 -2 3 Bleeding Medication \N
+11044 Jason Hom 15 gi_bleed 46449 -2 4 \N \N
+11045 Panel Consensus 15 gi_bleed 46449 -2 \N \N \N
+9074 Jason Hom 14 gi_bleed 44216 5 4 \N \N
+10048 Panel Average 14 gi_bleed 44216 2 \N \N \N
+10049 Panel Consensus 14 gi_bleed 44216 2 \N \N \N
+10275 Andre Kumar 14 gi_bleed 44216 1 2 Nausea Medication \N
+10643 Jonathan Chen 14 gi_bleed 44216 0 2 \N \N
+10644 Lisa Shieh 14 gi_bleed 44216 0 3 \N \N
+7708 Lisa Shieh 14 gi_bleed 45868 10 5 \N \N
+8356 Jason Hom 14 gi_bleed 45868 8 4 \N \N
+8357 Panel Consensus 14 gi_bleed 45868 8 \N \N \N
+8731 Panel Average 14 gi_bleed 45868 6 \N \N \N
+9713 Jonathan Chen 14 gi_bleed 45868 3 2 \N \N
+10645 Andre Kumar 14 gi_bleed 45868 0 5 Vitals \N
+10050 Andre Kumar 2 gi_bleed 45787 2 1 PT/OT \N
+10051 Panel Average 2 gi_bleed 45787 2 \N \N \N
+11410 Jonathan Chen 14 gi_bleed 48822 0 2 Oxygen No specific hypoxia in case
+11264 Jonathan Chen 14 gi_bleed 45900 0 2 Oxygen No specific hypoxia in case
+7709 Andre Kumar 14 gi_bleed 44219 10 5 PPI \N
+7710 Jason Hom 14 gi_bleed 44219 10 5 \N \N
+7711 Lisa Shieh 14 gi_bleed 44219 10 5 \N \N
+7712 Panel Average 14 gi_bleed 44219 10 \N \N \N
+7713 Panel Consensus 14 gi_bleed 44219 10 \N \N \N
+9075 Jonathan Chen 14 gi_bleed 44219 5 4 \N \N
+7714 Andre Kumar 15 gi_bleed 44219 10 5 Bleeding Medication \N
+7715 Jason Hom 15 gi_bleed 44219 10 5 \N \N
+7716 Lisa Shieh 15 gi_bleed 44219 10 5 \N \N
+7717 Panel Average 15 gi_bleed 44219 10 \N \N \N
+7718 Panel Consensus 15 gi_bleed 44219 10 \N \N \N
+9076 Jonathan Chen 15 gi_bleed 44219 5 4 \N \N
+7719 Jason Hom 16 gi_bleed 44219 10 5 \N \N
+7720 Lisa Shieh 16 gi_bleed 44219 10 5 \N \N
+7721 Panel Average 16 gi_bleed 44219 10 \N \N \N
+7722 Panel Consensus 16 gi_bleed 44219 10 \N \N \N
+9077 Jonathan Chen 16 gi_bleed 44219 5 4 \N \N
+11261 Jonathan Chen 14 gi_bleed 44236 0 3 \N Mistake, should be giving oral med while vomiting blood
+9078 Lisa Shieh 15 gi_bleed 44236 5 3 \N \N
+10052 Andre Kumar 15 gi_bleed 44236 2 4 Bleeding Medication \N
+10385 Panel Average 15 gi_bleed 44236 1 \N \N \N
+10646 Jonathan Chen 15 gi_bleed 44236 0 3 \N Mistake, should be giving oral med while vomiting blood
+10647 Panel Consensus 15 gi_bleed 44236 0 \N \N \N
+11158 Jason Hom 15 gi_bleed 44236 -5 5 \N \N
+11303 Jonathan Chen 15 gi_bleed 62171 0 2 \N Active bleeding, probably not right time for para, though SBP always to consider?
+7723 Jason Hom 14 gi_bleed 61823 10 5 \N \N
+7724 Lisa Shieh 14 gi_bleed 61823 10 5 \N \N
+7725 Panel Consensus 14 gi_bleed 61823 10 \N \N \N
+8316 Panel Average 14 gi_bleed 61823 8 \N \N \N
+9079 Andre Kumar 14 gi_bleed 61823 5 4 Nursing \N
+10053 Jonathan Chen 14 gi_bleed 61823 2 2 IV Access \N
+7726 Jason Hom 15 gi_bleed 61823 10 5 \N \N
+7727 Lisa Shieh 15 gi_bleed 61823 10 5 \N \N
+7728 Panel Consensus 15 gi_bleed 61823 10 \N \N \N
+8317 Panel Average 15 gi_bleed 61823 8 \N \N \N
+9080 Andre Kumar 15 gi_bleed 61823 5 1 Nursing \N
+10054 Jonathan Chen 15 gi_bleed 61823 2 2 IV Access \N
+7729 Jason Hom 14 gi_bleed 45802 10 5 \N \N
+7730 Lisa Shieh 14 gi_bleed 45802 10 5 \N \N
+7731 Panel Consensus 14 gi_bleed 45802 10 \N \N \N
+8318 Panel Average 14 gi_bleed 45802 8 \N \N \N
+9081 Andre Kumar 14 gi_bleed 45802 5 5 Nursing \N
+10055 Jonathan Chen 14 gi_bleed 45802 2 2 IV Access Maybe trying to capture placing large bore IVs. Is important, but don't want to have others lose too many points for missing this, because many won't realize that can order this (usually you just tell a nurse)
+8732 Andre Kumar 15 gi_bleed 43993 6 3 Pressors \N
+9714 Panel Consensus 15 gi_bleed 43993 3 \N \N \N
+10395 Panel Average 15 gi_bleed 43993 0 \N \N \N
+10648 Jonathan Chen 15 gi_bleed 43993 0 2 Pressors \N
+10649 Lisa Shieh 15 gi_bleed 43993 0 3 \N \N
+11159 Jason Hom 15 gi_bleed 43993 -5 5 \N \N
+7732 Jason Hom 15 gi_bleed 45778 10 5 \N \N
+9453 Panel Average 15 gi_bleed 45778 4 \N \N \N
+9502 Panel Consensus 15 gi_bleed 45778 4 \N \N \N
+9715 Andre Kumar 15 gi_bleed 45778 3 4 Coags \N
+10650 Jonathan Chen 15 gi_bleed 45778 0 2 \N \N
+10651 Lisa Shieh 15 gi_bleed 45778 0 3 \N \N
+7733 Jason Hom 2 gi_bleed 45778 10 5 \N \N
+8846 Panel Average 2 gi_bleed 45778 6 \N \N \N
+9082 Lisa Shieh 2 gi_bleed 45778 5 3 \N \N
+9503 Panel Consensus 2 gi_bleed 45778 4 \N \N \N
+10056 Andre Kumar 2 gi_bleed 45778 2 1 Metabolic Panel \N
+10652 Jonathan Chen 2 gi_bleed 45778 0 2 \N \N
+8358 Jason Hom 14 gi_bleed 45875 8 4 \N \N
+9915 Panel Average 14 gi_bleed 45875 3 \N \N \N
+10057 Jonathan Chen 14 gi_bleed 45875 2 2 \N Some points for preparing platelets, even though ends up not being necessary
+10653 Andre Kumar 14 gi_bleed 45875 0 1 Transfuse \N
+10654 Lisa Shieh 14 gi_bleed 45875 0 5 \N \N
+10655 Panel Consensus 14 gi_bleed 45875 0 \N \N \N
+7734 Jason Hom 15 gi_bleed 45875 10 5 \N \N
+9938 Panel Average 15 gi_bleed 45875 2 \N \N \N
+10058 Jonathan Chen 15 gi_bleed 45875 2 2 \N Some points for preparing platelets, even though ends up not being necessary
+10656 Lisa Shieh 15 gi_bleed 45875 0 5 \N \N
+10657 Panel Consensus 15 gi_bleed 45875 0 \N \N \N
+11085 Andre Kumar 15 gi_bleed 45875 -3 5 Transfuse \N
+11351 Jonathan Chen 15 gi_bleed 45955 2 4 Lactate \N
+9083 Lisa Shieh 14 gi_bleed 50267 5 3 \N \N
+10059 Jonathan Chen 14 gi_bleed 50267 2 2 \N Okay, but again, don't do too many points, since most people just do this or see in physical exam, not an order
+10060 Panel Average 14 gi_bleed 50267 2 \N \N \N
+10276 Andre Kumar 14 gi_bleed 50267 1 1 Stool test \N
+10658 Jason Hom 14 gi_bleed 50267 0 5 \N \N
+10659 Panel Consensus 14 gi_bleed 50267 0 \N \N \N
+11365 Jonathan Chen 15 gi_bleed 44292 0 2 \N Pre-procedure sedation?
+10660 Jonathan Chen 14 gi_bleed 49904 0 4 \N Wrong, they were looking for Prothrombin Time
+10661 Lisa Shieh 14 gi_bleed 49904 0 5 \N \N
+10992 Panel Average 14 gi_bleed 49904 -2 \N \N \N
+11046 Jason Hom 14 gi_bleed 49904 -2 5 \N \N
+11047 Panel Consensus 14 gi_bleed 49904 -2 \N \N \N
+11086 Andre Kumar 14 gi_bleed 49904 -3 3 Thrombophilia \N
+7735 Jason Hom 14 gi_bleed 45759 10 5 \N \N
+7736 Lisa Shieh 14 gi_bleed 45759 10 5 \N \N
+8319 Panel Average 14 gi_bleed 45759 8 \N \N \N
+8359 Panel Consensus 14 gi_bleed 45759 8 \N \N \N
+8548 Jonathan Chen 14 gi_bleed 45759 7 4 Coags Key diagnostic
+9084 Andre Kumar 14 gi_bleed 45759 5 5 Coags \N
+7737 Jason Hom 15 gi_bleed 45759 10 5 \N \N
+7738 Lisa Shieh 15 gi_bleed 45759 10 5 \N \N
+8320 Panel Average 15 gi_bleed 45759 8 \N \N \N
+8360 Panel Consensus 15 gi_bleed 45759 8 \N \N \N
+8549 Jonathan Chen 15 gi_bleed 45759 7 4 Coags Key diagnostic
+9085 Andre Kumar 15 gi_bleed 45759 5 5 Coags \N
+7739 Jason Hom 16 gi_bleed 45759 10 5 \N \N
+7740 Lisa Shieh 16 gi_bleed 45759 10 5 \N \N
+8361 Panel Consensus 16 gi_bleed 45759 8 \N \N \N
+8550 Jonathan Chen 16 gi_bleed 45759 7 4 Coags Key diagnostic
+8551 Panel Average 16 gi_bleed 45759 7 \N \N \N
+10277 Andre Kumar 16 gi_bleed 45759 1 2 Coags \N
+7741 Jason Hom 2 gi_bleed 45759 10 5 \N \N
+7742 Lisa Shieh 2 gi_bleed 45759 10 5 \N \N
+8362 Panel Consensus 2 gi_bleed 45759 8 \N \N \N
+8436 Panel Average 2 gi_bleed 45759 8 \N \N \N
+8552 Jonathan Chen 2 gi_bleed 45759 7 4 Coags Key diagnostic
+9716 Andre Kumar 2 gi_bleed 45759 3 2 Coags \N
+10061 Andre Kumar 2 gi_bleed 45776 2 1 Coags \N
+10062 Panel Average 2 gi_bleed 45776 2 \N \N \N
+7743 Jason Hom 14 gi_bleed 45770 10 4 \N \N
+7744 Lisa Shieh 14 gi_bleed 45770 10 5 \N \N
+8321 Panel Average 14 gi_bleed 45770 8 \N \N \N
+8363 Panel Consensus 14 gi_bleed 45770 8 \N \N \N
+8553 Jonathan Chen 14 gi_bleed 45770 7 4 Coags Key diagnostic
+9086 Andre Kumar 14 gi_bleed 45770 5 5 Coags \N
+7745 Jason Hom 15 gi_bleed 45770 10 4 \N \N
+7746 Lisa Shieh 15 gi_bleed 45770 10 5 \N \N
+8322 Panel Average 15 gi_bleed 45770 8 \N \N \N
+8364 Panel Consensus 15 gi_bleed 45770 8 \N \N \N
+8554 Jonathan Chen 15 gi_bleed 45770 7 4 Coags Key diagnostic
+9087 Andre Kumar 15 gi_bleed 45770 5 4 Coags \N
+7747 Jason Hom 2 gi_bleed 45770 10 4 \N \N
+7748 Lisa Shieh 2 gi_bleed 45770 10 5 \N \N
+8365 Panel Consensus 2 gi_bleed 45770 8 \N \N \N
+8437 Panel Average 2 gi_bleed 45770 8 \N \N \N
+8555 Jonathan Chen 2 gi_bleed 45770 7 4 Coags Key diagnostic
+9717 Andre Kumar 2 gi_bleed 45770 3 2 Coags \N
+9504 Andre Kumar 2 gi_bleed 62103 4 5 HIV \N
+10234 Panel Average 2 gi_bleed 62103 1 \N \N \N
+10662 Jason Hom 2 gi_bleed 62103 0 4 \N \N
+10663 Jonathan Chen 2 gi_bleed 62103 0 2 \N \N
+10664 Lisa Shieh 2 gi_bleed 62103 0 3 \N \N
+10665 Panel Consensus 2 gi_bleed 62103 0 \N \N \N
+7749 Jason Hom 14 gi_bleed 45927 10 5 \N \N
+7750 Jonathan Chen 14 gi_bleed 45927 10 5 RBC \N
+7751 Panel Consensus 14 gi_bleed 45927 10 \N \N \N
+8366 Andre Kumar 14 gi_bleed 45927 8 5 Transfuse \N
+8733 Panel Average 14 gi_bleed 45927 6 \N \N \N
+10666 Lisa Shieh 14 gi_bleed 45927 0 3 \N \N
+7752 Andre Kumar 15 gi_bleed 45927 10 5 Transfuse \N
+7753 Jason Hom 15 gi_bleed 45927 10 5 \N \N
+7754 Jonathan Chen 15 gi_bleed 45927 10 5 RBC \N
+7755 Lisa Shieh 15 gi_bleed 45927 10 5 \N \N
+7756 Panel Average 15 gi_bleed 45927 10 \N \N \N
+7757 Panel Consensus 15 gi_bleed 45927 10 \N \N \N
+7758 Jason Hom 16 gi_bleed 45927 10 5 \N \N
+7759 Jonathan Chen 16 gi_bleed 45927 10 5 RBC \N
+7760 Lisa Shieh 16 gi_bleed 45927 10 5 \N \N
+7761 Panel Consensus 16 gi_bleed 45927 10 \N \N \N
+8261 Panel Average 16 gi_bleed 45927 9 \N \N \N
+8556 Andre Kumar 16 gi_bleed 45927 7 1 Transfuse \N
+7762 Jason Hom 2 gi_bleed 45927 10 5 \N \N
+7763 Jonathan Chen 2 gi_bleed 45927 10 5 RBC \N
+7764 Lisa Shieh 2 gi_bleed 45927 10 5 \N \N
+7765 Panel Consensus 2 gi_bleed 45927 10 \N \N \N
+8262 Panel Average 2 gi_bleed 45927 9 \N \N \N
+8557 Andre Kumar 2 gi_bleed 45927 7 2 Transfuse If not done previously, otherwise 0
+11349 Jonathan Chen 15 gi_bleed 45832 0 2 \N ?Mechanical ventilation? Airway protection?
+10278 Andre Kumar 15 gi_bleed 44424 1 1 Hepatic Encephalopathy \N
+10667 Lisa Shieh 15 gi_bleed 44424 0 3 \N \N
+10668 Panel Consensus 15 gi_bleed 44424 0 \N \N \N
+10988 Panel Average 15 gi_bleed 44424 -1 \N \N \N
+11048 Jonathan Chen 15 gi_bleed 44424 -2 2 Lactulose Maybe even negative points? Giving lactulose to make patient have diarrhea while they are actively bleeding out seems bad
+11160 Jason Hom 15 gi_bleed 44424 -5 4 \N \N
+11437 Jonathan Chen 14 gi_bleed 49173 0 2 \N ?Intoxication not really active issue
+9718 Jonathan Chen 14 gi_bleed 63725 3 4 Lactate \N
+10063 Andre Kumar 14 gi_bleed 63725 2 4 Lactate \N
+10279 Panel Consensus 14 gi_bleed 63725 1 \N \N \N
+10386 Panel Average 14 gi_bleed 63725 1 \N \N \N
+10669 Jason Hom 14 gi_bleed 63725 0 4 \N \N
+10670 Lisa Shieh 14 gi_bleed 63725 0 3 \N \N
+7766 Jason Hom 14 gi_bleed 44198 10 4 \N \N
+7767 Lisa Shieh 14 gi_bleed 44198 10 5 ivf \N
+8323 Panel Average 14 gi_bleed 44198 8 \N \N \N
+8367 Panel Consensus 14 gi_bleed 44198 8 \N \N \N
+9088 Andre Kumar 14 gi_bleed 44198 5 2 Fluids \N
+9719 Jonathan Chen 14 gi_bleed 44198 3 3 IVF Okay for resuscitation, but needs blood more
+7768 Jason Hom 15 gi_bleed 44198 10 4 \N \N
+7769 Lisa Shieh 15 gi_bleed 44198 10 5 \N \N
+8229 Panel Average 15 gi_bleed 44198 9 \N \N \N
+8368 Andre Kumar 15 gi_bleed 44198 8 2 Fluids \N
+8369 Panel Consensus 15 gi_bleed 44198 8 \N \N \N
+9720 Jonathan Chen 15 gi_bleed 44198 3 3 IVF Okay for resuscitation, but needs blood more
+11457 Jonathan Chen 15 gi_bleed 44441 0 2 \N ?Pre-intubation for airway protection?
+11450 Jonathan Chen 14 gi_bleed 61993 9 4 FFP \N
+7770 Jason Hom 14 gi_bleed 45877 10 5 \N \N
+8263 Jonathan Chen 14 gi_bleed 45877 9 4 FFP \N
+8370 Andre Kumar 14 gi_bleed 45877 8 5 Transfuse \N
+8371 Panel Consensus 14 gi_bleed 45877 8 \N \N \N
+8734 Panel Average 14 gi_bleed 45877 6 \N \N \N
+10671 Lisa Shieh 14 gi_bleed 45877 0 3 \N \N
+11391 Jonathan Chen 15 gi_bleed 61993 9 4 FFP \N
+7771 Jason Hom 15 gi_bleed 45877 10 5 \N \N
+7772 Lisa Shieh 15 gi_bleed 45877 10 5 \N \N
+8230 Panel Average 15 gi_bleed 45877 9 \N \N \N
+8264 Jonathan Chen 15 gi_bleed 45877 9 4 FFP \N
+8372 Andre Kumar 15 gi_bleed 45877 8 5 Transfuse \N
+8373 Panel Consensus 15 gi_bleed 45877 8 \N \N \N
+11407 Jonathan Chen 16 gi_bleed 61993 9 4 FFP \N
+7773 Jason Hom 16 gi_bleed 45877 10 5 \N \N
+7774 Lisa Shieh 16 gi_bleed 45877 10 5 \N \N
+8265 Jonathan Chen 16 gi_bleed 45877 9 4 FFP \N
+8266 Panel Average 16 gi_bleed 45877 9 \N \N \N
+8374 Panel Consensus 16 gi_bleed 45877 8 \N \N \N
+8558 Andre Kumar 16 gi_bleed 45877 7 2 Transfuse no points if done previously
+7775 Jason Hom 14 gi_bleed 65702 10 5 \N \N
+7776 Lisa Shieh 14 gi_bleed 65702 10 3 \N \N
+8231 Panel Average 14 gi_bleed 65702 9 \N \N \N
+8267 Jonathan Chen 14 gi_bleed 65702 9 4 FFP \N
+8375 Andre Kumar 14 gi_bleed 65702 8 5 Transfuse \N
+8376 Panel Consensus 14 gi_bleed 65702 8 \N \N \N
+7777 Jason Hom 15 gi_bleed 65702 10 5 \N \N
+7778 Lisa Shieh 15 gi_bleed 65702 10 5 \N \N
+8232 Panel Average 15 gi_bleed 65702 9 \N \N \N
+8268 Jonathan Chen 15 gi_bleed 65702 9 4 FFP \N
+8377 Andre Kumar 15 gi_bleed 65702 8 5 Transfuse \N
+8378 Panel Consensus 15 gi_bleed 65702 8 \N \N \N
+7779 Jason Hom 16 gi_bleed 65702 10 5 \N \N
+7780 Lisa Shieh 16 gi_bleed 65702 10 5 \N \N
+8269 Jonathan Chen 16 gi_bleed 65702 9 4 FFP \N
+8270 Panel Average 16 gi_bleed 65702 9 \N \N \N
+8379 Panel Consensus 16 gi_bleed 65702 8 \N \N \N
+8559 Andre Kumar 16 gi_bleed 65702 7 2 Transfuse no points if done previously
+8380 Jason Hom 14 gi_bleed 65646 8 4 \N \N
+10219 Panel Average 14 gi_bleed 65646 2 \N \N \N
+10672 Jonathan Chen 14 gi_bleed 65646 0 2 \N Not sure necessary or appropriate to transfuse platelets given observed counts not low?
+10673 Lisa Shieh 14 gi_bleed 65646 0 3 \N \N
+10674 Panel Consensus 14 gi_bleed 65646 0 \N \N \N
+11087 Andre Kumar 14 gi_bleed 65646 -3 5 Transfuse No indication
+8381 Jason Hom 15 gi_bleed 65646 8 4 \N \N
+10220 Panel Average 15 gi_bleed 65646 2 \N \N \N
+10675 Jonathan Chen 15 gi_bleed 65646 0 2 \N Not sure necessary or appropriate to transfuse platelets given observed counts not low?
+10676 Lisa Shieh 15 gi_bleed 65646 0 3 \N \N
+10677 Panel Consensus 15 gi_bleed 65646 0 \N \N \N
+11088 Andre Kumar 15 gi_bleed 65646 -3 5 Transfuse \N
+11465 Jonathan Chen 14 gi_bleed 45956 0 2 \N Not sure necessary or appropriate to transfuse platelets given observed counts not low?
+11306 Jonathan Chen 15 gi_bleed 61976 0 2 \N Not sure necessary or appropriate to transfuse platelets given observed counts not low?
+7781 Jason Hom 15 gi_bleed 45956 10 5 \N \N
+7782 Lisa Shieh 15 gi_bleed 45956 10 5 \N \N
+8847 Panel Average 15 gi_bleed 45956 6 \N \N \N
+10678 Jonathan Chen 15 gi_bleed 45956 0 2 \N Not sure necessary or appropriate to transfuse platelets given observed counts not low?
+10679 Panel Consensus 15 gi_bleed 45956 0 \N \N \N
+11089 Andre Kumar 15 gi_bleed 45956 -3 5 Transfuse \N
+11408 Jonathan Chen 14 gi_bleed 45748 10 5 RBC \N
+7783 Jason Hom 14 gi_bleed 61975 10 5 \N \N
+7784 Jonathan Chen 14 gi_bleed 61975 10 5 RBC \N
+7785 Lisa Shieh 14 gi_bleed 61975 10 3 \N do not know hbg yet
+7786 Panel Consensus 14 gi_bleed 61975 10 \N \N \N
+8233 Panel Average 14 gi_bleed 61975 9 \N \N \N
+8382 Andre Kumar 14 gi_bleed 61975 8 5 Transfuse \N
+11467 Jonathan Chen 15 gi_bleed 45748 10 5 RBC \N
+7787 Andre Kumar 15 gi_bleed 61975 10 5 Transfuse \N
+7788 Jason Hom 15 gi_bleed 61975 10 5 \N \N
+7789 Jonathan Chen 15 gi_bleed 61975 10 5 RBC \N
+7790 Lisa Shieh 15 gi_bleed 61975 10 5 \N \N
+7791 Panel Average 15 gi_bleed 61975 10 \N \N \N
+7792 Panel Consensus 15 gi_bleed 61975 10 \N \N \N
+7793 Jason Hom 16 gi_bleed 61975 10 5 \N \N
+7794 Jonathan Chen 16 gi_bleed 61975 10 5 RBC \N
+7795 Lisa Shieh 16 gi_bleed 61975 10 5 \N \N
+7796 Panel Consensus 16 gi_bleed 61975 10 \N \N \N
+8271 Panel Average 16 gi_bleed 61975 9 \N \N \N
+8560 Andre Kumar 16 gi_bleed 61975 7 2 Transfuse no points if done previously
+7797 Jason Hom 14 gi_bleed 65640 10 5 \N \N
+7798 Jonathan Chen 14 gi_bleed 65640 10 5 RBC \N
+7799 Lisa Shieh 14 gi_bleed 65640 10 3 \N \N
+7800 Panel Consensus 14 gi_bleed 65640 10 \N \N \N
+8234 Panel Average 14 gi_bleed 65640 9 \N \N \N
+8383 Andre Kumar 14 gi_bleed 65640 8 5 Transfuse \N
+7801 Andre Kumar 15 gi_bleed 65640 10 5 Transfuse \N
+7802 Jason Hom 15 gi_bleed 65640 10 5 \N \N
+7803 Jonathan Chen 15 gi_bleed 65640 10 5 RBC \N
+7804 Lisa Shieh 15 gi_bleed 65640 10 5 \N \N
+7805 Panel Average 15 gi_bleed 65640 10 \N \N \N
+7806 Panel Consensus 15 gi_bleed 65640 10 \N \N \N
+7807 Jason Hom 16 gi_bleed 65640 10 5 \N \N
+7808 Jonathan Chen 16 gi_bleed 65640 10 5 RBC \N
+7809 Lisa Shieh 16 gi_bleed 65640 10 5 \N \N
+7810 Panel Consensus 16 gi_bleed 65640 10 \N \N \N
+8272 Panel Average 16 gi_bleed 65640 9 \N \N \N
+8561 Andre Kumar 16 gi_bleed 65640 7 2 Transfuse no points if done previously
+7811 Jason Hom 2 gi_bleed 65640 10 5 \N \N
+7812 Jonathan Chen 2 gi_bleed 65640 10 5 RBC \N
+7813 Lisa Shieh 2 gi_bleed 65640 10 5 \N \N
+7814 Panel Consensus 2 gi_bleed 65640 10 \N \N \N
+8273 Panel Average 2 gi_bleed 65640 9 \N \N \N
+8562 Andre Kumar 2 gi_bleed 65640 7 3 Transfuse \N
+11356 Jonathan Chen 14 gi_bleed 50581 0 2 \N \N
+11291 Jonathan Chen 15 gi_bleed 50581 0 2 \N \N
+7815 Jason Hom 14 gi_bleed 50618 10 5 \N \N
+7816 Jonathan Chen 14 gi_bleed 50618 10 5 RBC \N
+7817 Panel Consensus 14 gi_bleed 50618 10 \N \N \N
+8384 Andre Kumar 14 gi_bleed 50618 8 3 Transfuse \N
+8735 Panel Average 14 gi_bleed 50618 6 \N \N \N
+10680 Lisa Shieh 14 gi_bleed 50618 0 3 \N \N
+7818 Andre Kumar 15 gi_bleed 50618 10 5 Transfuse \N
+7819 Jason Hom 15 gi_bleed 50618 10 5 \N \N
+7820 Jonathan Chen 15 gi_bleed 50618 10 5 RBC \N
+7821 Lisa Shieh 15 gi_bleed 50618 10 5 \N \N
+7822 Panel Average 15 gi_bleed 50618 10 \N \N \N
+7823 Panel Consensus 15 gi_bleed 50618 10 \N \N \N
+11235 Jonathan Chen 14 gi_bleed 45870 2 3 \N Hemodynamic stability assessment?
+7824 Jason Hom 14 gi_bleed 45945 10 5 \N \N
+7825 Lisa Shieh 14 gi_bleed 45945 10 5 blood type verification \N
+7826 Panel Consensus 14 gi_bleed 45945 10 \N \N \N
+8274 Panel Average 14 gi_bleed 45945 9 \N \N \N
+8563 Andre Kumar 14 gi_bleed 45945 7 5 Transfuse \N
+10280 Jonathan Chen 14 gi_bleed 45945 1 2 Type and Screen \N
+7827 Andre Kumar 15 gi_bleed 45945 10 5 Transfuse \N
+7828 Jason Hom 15 gi_bleed 45945 10 5 \N \N
+7829 Lisa Shieh 15 gi_bleed 45945 10 5 \N \N
+7830 Panel Average 15 gi_bleed 45945 10 \N \N \N
+7831 Panel Consensus 15 gi_bleed 45945 10 \N \N \N
+10281 Jonathan Chen 15 gi_bleed 45945 1 2 Type and Screen \N
+7832 Jason Hom 14 gi_bleed 45869 10 5 \N \N
+8564 Lisa Shieh 14 gi_bleed 45869 7 3 \N \N
+8736 Panel Average 14 gi_bleed 45869 6 \N \N \N
+8737 Panel Consensus 14 gi_bleed 45869 6 \N \N \N
+9089 Jonathan Chen 14 gi_bleed 45869 5 2 US Abdomen Okay to think about checking this, as long as not delaying immediate treatment
+10282 Andre Kumar 14 gi_bleed 45869 1 1 Imaging \N
+11049 Andre Kumar 16 gi_bleed 45869 -2 4 Imaging delays care
+11050 Panel Average 16 gi_bleed 45869 -2 \N \N \N
+7833 Jason Hom 2 gi_bleed 45869 10 5 \N \N
+8455 Panel Average 2 gi_bleed 45869 7 \N \N \N
+8565 Lisa Shieh 2 gi_bleed 45869 7 3 imaging \N
+8738 Panel Consensus 2 gi_bleed 45869 6 \N \N \N
+9090 Andre Kumar 2 gi_bleed 45869 5 2 Imaging \N
+9091 Jonathan Chen 2 gi_bleed 45869 5 2 US Abdomen \N
+11051 Andre Kumar 14 gi_bleed 49408 -2 3 Imaging \N
+11052 Panel Average 14 gi_bleed 49408 -2 \N \N \N
+11053 Andre Kumar 16 gi_bleed 49408 -2 5 Imaging delays care
+11054 Panel Average 16 gi_bleed 49408 -2 \N \N \N
+7834 Jason Hom 2 gi_bleed 49408 10 5 \N \N
+8456 Panel Average 2 gi_bleed 49408 7 \N \N \N
+8566 Lisa Shieh 2 gi_bleed 49408 7 3 \N \N
+8739 Panel Consensus 2 gi_bleed 49408 6 \N \N \N
+9092 Andre Kumar 2 gi_bleed 49408 5 4 Imaging \N
+9093 Jonathan Chen 2 gi_bleed 49408 5 2 US Abdomen \N
+7835 Jason Hom 14 gi_bleed 46343 10 5 \N \N
+8567 Lisa Shieh 14 gi_bleed 46343 7 5 ultrasound \N
+8740 Panel Consensus 14 gi_bleed 46343 6 \N \N \N
+9094 Jonathan Chen 14 gi_bleed 46343 5 2 US Abdomen \N
+9095 Panel Average 14 gi_bleed 46343 5 \N \N \N
+11055 Andre Kumar 14 gi_bleed 46343 -2 2 Imaging \N
+11056 Andre Kumar 16 gi_bleed 46343 -2 5 Imaging delays care
+11057 Panel Average 16 gi_bleed 46343 -2 \N \N \N
+7836 Jason Hom 2 gi_bleed 46343 10 5 \N \N
+7837 Lisa Shieh 2 gi_bleed 46343 10 5 \N \N
+8324 Panel Average 2 gi_bleed 46343 8 \N \N \N
+8741 Panel Consensus 2 gi_bleed 46343 6 \N \N \N
+9096 Andre Kumar 2 gi_bleed 46343 5 3 Imaging \N
+9097 Jonathan Chen 2 gi_bleed 46343 5 2 US Abdomen \N
+7838 Andre Kumar 14 gi_bleed 45969 10 5 Endoscopy \N
+7839 Jason Hom 14 gi_bleed 45969 10 5 \N \N
+7840 Jonathan Chen 14 gi_bleed 45969 10 5 GI-EGD GI won't take patient yet, but points for preparing
+7841 Lisa Shieh 14 gi_bleed 45969 10 5 \N \N
+7842 Panel Average 14 gi_bleed 45969 10 \N \N \N
+7843 Panel Consensus 14 gi_bleed 45969 10 \N \N \N
+7844 Andre Kumar 15 gi_bleed 45969 10 5 Endoscopy \N
+7845 Jason Hom 15 gi_bleed 45969 10 5 \N \N
+7846 Jonathan Chen 15 gi_bleed 45969 10 5 GI-EGD \N
+7847 Lisa Shieh 15 gi_bleed 45969 10 5 \N \N
+7848 Panel Average 15 gi_bleed 45969 10 \N \N \N
+7849 Panel Consensus 15 gi_bleed 45969 10 \N \N \N
+7850 Andre Kumar 16 gi_bleed 45969 10 4 Endoscopy \N
+7851 Jason Hom 16 gi_bleed 45969 10 5 \N \N
+7852 Jonathan Chen 16 gi_bleed 45969 10 5 GI-EGD \N
+7853 Lisa Shieh 16 gi_bleed 45969 10 5 \N \N
+7854 Panel Average 16 gi_bleed 45969 10 \N \N \N
+7855 Panel Consensus 16 gi_bleed 45969 10 \N \N \N
+10283 Andre Kumar 14 gi_bleed 45873 1 3 Urinalysis \N
+10396 Panel Average 14 gi_bleed 45873 0 \N \N \N
+10681 Jason Hom 14 gi_bleed 45873 0 4 \N \N
+10682 Jonathan Chen 14 gi_bleed 45873 0 2 \N Irrelevant diagnostic?
+10683 Lisa Shieh 14 gi_bleed 45873 0 3 \N \N
+10684 Panel Consensus 14 gi_bleed 45873 0 \N \N \N
+11281 Jonathan Chen 14 gi_bleed 46348 0 4 \N \N
+7856 Jason Hom 14 gi_bleed 50372 10 5 \N \N
+7857 Lisa Shieh 14 gi_bleed 50372 10 5 \N \N
+7858 Panel Consensus 14 gi_bleed 50372 10 \N \N \N
+8438 Panel Average 14 gi_bleed 50372 8 \N \N \N
+9721 Andre Kumar 14 gi_bleed 50372 3 4 Informed Consent \N
+10685 Jonathan Chen 14 gi_bleed 50372 0 2 \N \N
+8275 Jonathan Chen 14 gi_bleed 44001 9 4 Vitamin K \N
+8385 Jason Hom 14 gi_bleed 44001 8 4 \N \N
+8568 Lisa Shieh 14 gi_bleed 44001 7 3 \N risk of anaphylaxis
+8569 Panel Consensus 14 gi_bleed 44001 7 \N \N \N
+8670 Panel Average 14 gi_bleed 44001 7 \N \N \N
+9098 Andre Kumar 14 gi_bleed 44001 5 4 Coagulopathy Reversal \N
+7859 Lisa Shieh 15 gi_bleed 44001 10 5 \N \N
+8276 Jonathan Chen 15 gi_bleed 44001 9 4 Vitamin K \N
+8386 Jason Hom 15 gi_bleed 44001 8 4 \N \N
+8439 Panel Average 15 gi_bleed 44001 8 \N \N \N
+8570 Panel Consensus 15 gi_bleed 44001 7 \N \N \N
+9099 Andre Kumar 15 gi_bleed 44001 5 3 Coagulopathy Reversal \N
+7860 Lisa Shieh 16 gi_bleed 44001 10 5 \N \N
+8277 Jonathan Chen 16 gi_bleed 44001 9 4 Vitamin K \N
+8387 Jason Hom 16 gi_bleed 44001 8 4 \N \N
+8440 Panel Average 16 gi_bleed 44001 8 \N \N \N
+8571 Panel Consensus 16 gi_bleed 44001 7 \N \N \N
+9100 Andre Kumar 16 gi_bleed 44001 5 5 Coagulopathy Reversal 5 pts if no FFP or vitamin K given previously, otherwise 0
+9101 Andre Kumar 2 gi_bleed 44001 5 5 Coagulopathy Reversal \N
+9102 Panel Average 2 gi_bleed 44001 5 \N \N \N
+7861 Lisa Shieh 15 gi_bleed 44404 10 5 \N \N
+8388 Jason Hom 15 gi_bleed 44404 8 4 \N \N
+8572 Panel Consensus 15 gi_bleed 44404 7 \N \N \N
+8671 Panel Average 15 gi_bleed 44404 7 \N \N \N
+9103 Jonathan Chen 15 gi_bleed 44404 5 2 Vitamin K Onset of action a bit too slow
+10064 Andre Kumar 15 gi_bleed 44404 2 2 Bleeding Medication \N
+7862 Lisa Shieh 16 gi_bleed 44404 10 5 \N \N
+8389 Jason Hom 16 gi_bleed 44404 8 4 \N \N
+8441 Panel Average 16 gi_bleed 44404 8 \N \N \N
+8573 Panel Consensus 16 gi_bleed 44404 7 \N \N \N
+9104 Andre Kumar 16 gi_bleed 44404 5 2 Coagulopathy Reversal 5 pts if no FFP or vitamin K given previously, otherwise 0
+9105 Jonathan Chen 16 gi_bleed 44404 5 2 Vitamin K Onset of action a bit too slow
+8390 Jason Hom 14 gi_bleed 44382 8 4 \N \N
+9106 Jonathan Chen 14 gi_bleed 44382 5 2 Vitamin K Onset of action a bit too slow
+9107 Lisa Shieh 14 gi_bleed 44382 5 3 \N \N
+9606 Panel Average 14 gi_bleed 44382 3 \N \N \N
+11058 Panel Consensus 14 gi_bleed 44382 -2 \N \N \N
+11090 Andre Kumar 14 gi_bleed 44382 -3 5 Coagulopathy Reversal Studies have shown SubQ vitamin K is similar to placebo (PMID: 16505257 )
+8391 Jason Hom 15 gi_bleed 44382 8 4 \N \N
+8574 Lisa Shieh 15 gi_bleed 44382 7 3 \N \N
+9108 Jonathan Chen 15 gi_bleed 44382 5 2 Vitamin K Onset of action a bit too slow
+9505 Panel Average 15 gi_bleed 44382 4 \N \N \N
+11059 Panel Consensus 15 gi_bleed 44382 -2 \N \N \N
+11091 Andre Kumar 15 gi_bleed 44382 -3 5 Bleeding Medication \N
+11419 Jonathan Chen 14 gi_bleed 46096 0 2 \N \N
+10981 Andre Kumar 14 gi_bleed 46018 -1 3 Imaging Delays care
+10982 Panel Average 14 gi_bleed 46018 -1 \N \N \N
+8392 Jason Hom 14 gi_bleed 45818 8 4 \N \N
+9916 Panel Average 14 gi_bleed 45818 3 \N \N \N
+10686 Andre Kumar 14 gi_bleed 45818 0 1 Imaging \N
+10687 Jonathan Chen 14 gi_bleed 45818 0 2 CXR Irrelevant diagnostic?
+10688 Lisa Shieh 14 gi_bleed 45818 0 3 \N \N
+10689 Panel Consensus 14 gi_bleed 45818 0 \N \N \N
+8393 Jason Hom 15 gi_bleed 45818 8 4 \N \N
+10065 Panel Average 15 gi_bleed 45818 2 \N \N \N
+10690 Jonathan Chen 15 gi_bleed 45818 0 2 CXR Irrelevant diagnostic?
+10691 Lisa Shieh 15 gi_bleed 45818 0 3 \N \N
+10692 Panel Consensus 15 gi_bleed 45818 0 \N \N \N
+11060 Andre Kumar 15 gi_bleed 45818 -2 1 Imaging delays care
+10693 Andre Kumar 2 gi_bleed 45818 0 1 Imaging \N
+10694 Panel Average 2 gi_bleed 45818 0 \N \N \N
+11389 Jonathan Chen 14 gi_bleed 50200 0 2 CXR Irrelevant diagnostic?
+8394 Jason Hom 14 gi_bleed 45801 8 4 \N \N
+9917 Panel Average 14 gi_bleed 45801 3 \N \N \N
+10695 Andre Kumar 14 gi_bleed 45801 0 2 Imaging \N
+10696 Jonathan Chen 14 gi_bleed 45801 0 2 CXR Irrelevant diagnostic?
+10697 Lisa Shieh 14 gi_bleed 45801 0 3 \N \N
+10698 Panel Consensus 14 gi_bleed 45801 0 \N \N \N
+11299 Jonathan Chen 30 meningitis 56492 1 3 Pain Control Minor points for symptom control?
+11236 Jonathan Chen 31 meningitis 56492 1 3 Pain Control Minor points for symptom control?
+8395 Jason Hom 30 meningitis 44281 8 4 \N \N
+9109 Panel Consensus 30 meningitis 44281 5 \N \N \N
+9431 Panel Average 30 meningitis 44281 5 \N \N \N
+9506 Lisa Shieh 30 meningitis 44281 4 4 \N \N
+10066 Andre Kumar 30 meningitis 44281 2 2 Fever Medication \N
+10284 Jonathan Chen 30 meningitis 44281 1 3 Pain Control Minor points for symptom control?
+8396 Jason Hom 31 meningitis 44281 8 4 \N \N
+8575 Lisa Shieh 31 meningitis 44281 7 3 \N \N
+8742 Panel Average 31 meningitis 44281 6 \N \N \N
+9110 Panel Consensus 31 meningitis 44281 5 \N \N \N
+9722 Andre Kumar 31 meningitis 44281 3 2 Fever Medication \N
+10285 Jonathan Chen 31 meningitis 44281 1 3 Pain Control Minor points for symptom control?
+11300 Jonathan Chen 33 meningitis 44281 1 3 Pain Control Minor points for symptom control?
+11415 Jonathan Chen 30 meningitis 44310 1 3 Pain Control Minor points for symptom control?
+8397 Jason Hom 30 meningitis 44278 8 4 \N \N
+9507 Panel Consensus 30 meningitis 44278 4 \N \N \N
+9585 Panel Average 30 meningitis 44278 4 \N \N \N
+9723 Lisa Shieh 30 meningitis 44278 3 3 \N \N
+10286 Jonathan Chen 30 meningitis 44278 1 3 Pain Control Minor points for symptom control?
+10699 Andre Kumar 30 meningitis 44278 0 1 Fever Medication \N
+11466 Jonathan Chen 31 meningitis 44310 1 3 Pain Control Minor points for symptom control?
+10067 Andre Kumar 31 meningitis 44278 2 2 Fever Medication \N
+10068 Panel Average 31 meningitis 44278 2 \N \N \N
+11257 Jonathan Chen 30 meningitis 48829 0 4 \N Irrelevant diagnostics. Probably trying to order medicine
+8398 Jason Hom 30 meningitis 44615 8 4 \N \N
+8870 Panel Average 30 meningitis 44615 5 \N \N \N
+9111 Andre Kumar 30 meningitis 44615 5 4 Antiviral reasonable for mollaret's meningitis
+9724 Lisa Shieh 30 meningitis 44615 3 3 \N \N
+10700 Jonathan Chen 30 meningitis 44615 0 3 \N Doesn't meet guideline recs for empiric treatment
+10701 Panel Consensus 30 meningitis 44615 0 \N \N \N
+9112 Andre Kumar 31 meningitis 44615 5 3 Antiviral No points if already ordered
+9113 Lisa Shieh 31 meningitis 44615 5 3 \N \N
+9607 Panel Average 31 meningitis 44615 3 \N \N \N
+10702 Jason Hom 31 meningitis 44615 0 4 \N \N
+10703 Jonathan Chen 31 meningitis 44615 0 3 \N Doesn't meet guideline recs for empiric treatment
+10704 Panel Consensus 31 meningitis 44615 0 \N \N \N
+9508 Andre Kumar 33 meningitis 44615 4 2 Antivirals \N
+9509 Jason Hom 33 meningitis 44615 4 4 \N \N
+9586 Panel Average 33 meningitis 44615 4 \N \N \N
+9725 Lisa Shieh 33 meningitis 44615 3 3 \N \N
+10705 Jonathan Chen 33 meningitis 44615 0 3 \N Doesn't meet guideline recs for empiric treatment
+10706 Panel Consensus 33 meningitis 44615 0 \N \N \N
+11332 Jonathan Chen 30 meningitis 48770 0 3 \N Low yield
+11260 Jonathan Chen 33 meningitis 48770 0 3 \N Low yield
+7863 Lisa Shieh 30 meningitis 44595 10 4 \N \N
+9918 Panel Average 30 meningitis 44595 3 \N \N \N
+10707 Andre Kumar 30 meningitis 44595 0 3 Antibiotics \N
+10708 Jonathan Chen 30 meningitis 44595 0 3 \N Doesn't meet guideline recs for empiric treatment
+10709 Panel Consensus 30 meningitis 44595 0 \N \N \N
+11061 Jason Hom 30 meningitis 44595 -2 5 \N \N
+9114 Lisa Shieh 31 meningitis 44595 5 3 \N \N
+10287 Panel Average 31 meningitis 44595 1 \N \N \N
+10710 Andre Kumar 31 meningitis 44595 0 5 Antibiotics \N
+10711 Jonathan Chen 31 meningitis 44595 0 3 \N Doesn't meet guideline recs for empiric treatment
+10712 Panel Consensus 31 meningitis 44595 0 \N \N \N
+11062 Jason Hom 31 meningitis 44595 -2 5 \N \N
+9726 Lisa Shieh 33 meningitis 44595 3 3 \N \N
+10397 Panel Average 33 meningitis 44595 0 \N \N \N
+10713 Andre Kumar 33 meningitis 44595 0 5 Antibiotics \N
+10714 Jonathan Chen 33 meningitis 44595 0 3 \N Doesn't meet guideline recs for empiric treatment
+10715 Panel Consensus 33 meningitis 44595 0 \N \N \N
+11063 Jason Hom 33 meningitis 44595 -2 5 \N \N
+9115 Jason Hom 31 meningitis 61864 5 5 \N \N
+9727 Lisa Shieh 31 meningitis 61864 3 3 \N \N
+9728 Panel Consensus 31 meningitis 61864 3 \N \N \N
+9919 Panel Average 31 meningitis 61864 3 \N \N \N
+10069 Jonathan Chen 31 meningitis 61864 2 2 HIV \N
+10716 Andre Kumar 31 meningitis 61864 0 4 STD Testing \N
+9116 Andre Kumar 30 meningitis 46093 5 5 CSF \N
+9117 Jason Hom 30 meningitis 46093 5 5 \N \N
+9118 Lisa Shieh 30 meningitis 46093 5 3 \N \N
+9119 Panel Average 30 meningitis 46093 5 \N \N \N
+9120 Panel Consensus 30 meningitis 46093 5 \N \N \N
+10288 Jonathan Chen 30 meningitis 46093 1 3 Pregnancy Test \N
+7864 Jason Hom 30 meningitis 45901 10 5 \N \N
+7865 Lisa Shieh 30 meningitis 45901 10 5 \N \N
+7866 Panel Consensus 30 meningitis 45901 10 \N \N \N
+8294 Panel Average 30 meningitis 45901 9 \N \N \N
+8576 Jonathan Chen 30 meningitis 45901 7 4 Blood Cultures \N
+8743 Andre Kumar 30 meningitis 45901 6 5 Blood Cultures \N
+7867 Panel Consensus 31 meningitis 45901 10 \N \N \N
+8577 Jonathan Chen 31 meningitis 45901 7 4 Blood Cultures \N
+9729 Lisa Shieh 31 meningitis 45901 3 3 \N \N
+10070 Jason Hom 31 meningitis 45901 2 5 \N \N
+10071 Panel Average 31 meningitis 45901 2 \N \N \N
+10289 Andre Kumar 31 meningitis 45901 1 1 Blood Cultures \N
+7868 Panel Consensus 33 meningitis 45901 10 \N \N \N
+8578 Jonathan Chen 33 meningitis 45901 7 4 Blood Cultures \N
+9510 Andre Kumar 33 meningitis 45901 4 4 Blood Cultures \N
+9730 Lisa Shieh 33 meningitis 45901 3 3 \N \N
+9731 Panel Average 33 meningitis 45901 3 \N \N \N
+10072 Jason Hom 33 meningitis 45901 2 5 \N \N
+7869 Jason Hom 30 meningitis 45752 10 5 \N \N
+7870 Lisa Shieh 30 meningitis 45752 10 4 \N \N
+7871 Panel Consensus 30 meningitis 45752 10 \N \N \N
+8295 Panel Average 30 meningitis 45752 9 \N \N \N
+8579 Jonathan Chen 30 meningitis 45752 7 4 Blood Cultures \N
+8744 Andre Kumar 30 meningitis 45752 6 5 Blood Cultures \N
+7872 Panel Consensus 31 meningitis 45752 10 \N \N \N
+8580 Jonathan Chen 31 meningitis 45752 7 4 Blood Cultures \N
+9732 Lisa Shieh 31 meningitis 45752 3 3 \N \N
+10073 Jason Hom 31 meningitis 45752 2 5 \N \N
+10074 Panel Average 31 meningitis 45752 2 \N \N \N
+10290 Andre Kumar 31 meningitis 45752 1 2 Blood cultures "No points if already ordered lower points here assuming pt got abx already"
+7873 Panel Consensus 33 meningitis 45752 10 \N \N \N
+8581 Jonathan Chen 33 meningitis 45752 7 4 Blood Cultures \N
+9511 Andre Kumar 33 meningitis 45752 4 4 Blood Cultures \N
+9733 Lisa Shieh 33 meningitis 45752 3 3 \N \N
+9734 Panel Average 33 meningitis 45752 3 \N \N \N
+10075 Jason Hom 33 meningitis 45752 2 5 \N \N
+11383 Jonathan Chen 30 meningitis 44439 5 3 IVF \N
+8582 Lisa Shieh 30 meningitis 44290 7 4 \N \N
+9121 Jason Hom 30 meningitis 44290 5 4 \N \N
+9122 Jonathan Chen 30 meningitis 44290 5 3 IVF \N
+9123 Panel Average 30 meningitis 44290 5 \N \N \N
+9124 Panel Consensus 30 meningitis 44290 5 \N \N \N
+9735 Andre Kumar 30 meningitis 44290 3 5 Fluids \N
+7874 Jason Hom 30 meningitis 45793 10 4 cbc \N
+8457 Panel Average 30 meningitis 45793 7 \N \N \N
+8583 Lisa Shieh 30 meningitis 45793 7 4 \N \N
+8584 Panel Consensus 30 meningitis 45793 7 \N \N \N
+9125 Andre Kumar 30 meningitis 45793 5 4 CBC \N
+9736 Jonathan Chen 30 meningitis 45793 3 4 CBC \N
+7875 Jason Hom 30 meningitis 45788 10 4 cbc \N
+8458 Panel Average 30 meningitis 45788 7 \N \N \N
+8585 Lisa Shieh 30 meningitis 45788 7 4 \N \N
+8586 Panel Consensus 30 meningitis 45788 7 \N \N \N
+9126 Andre Kumar 30 meningitis 45788 5 5 CBC \N
+9737 Jonathan Chen 30 meningitis 45788 3 4 CBC \N
+11337 Jonathan Chen 30 meningitis 45966 3 4 CBC \N
+8399 Andre Kumar 33 meningitis 36210 8 2 Antibiotics \N
+9127 Jason Hom 33 meningitis 36210 5 5 \N \N
+9128 Panel Consensus 33 meningitis 36210 5 \N \N \N
+9454 Panel Average 33 meningitis 36210 4 \N \N \N
+9512 Jonathan Chen 33 meningitis 36210 4 5 CNS Cephalosporin Can replace ceftriaxone, but slightly less points, as is a little unnecessary overkill
+10717 Lisa Shieh 33 meningitis 36210 0 3 \N \N
+7876 Andre Kumar 30 meningitis 35733 10 \N Antibiotics \N
+7877 Jason Hom 30 meningitis 35733 10 5 \N \N
+7878 Jonathan Chen 30 meningitis 35733 10 5 CNS Cephalosporin \N
+7879 Lisa Shieh 30 meningitis 35733 10 5 \N \N
+7880 Panel Average 30 meningitis 35733 10 \N \N \N
+7881 Panel Consensus 30 meningitis 35733 10 \N \N \N
+7882 Jason Hom 31 meningitis 35733 10 5 \N \N
+7883 Jonathan Chen 31 meningitis 35733 10 5 CNS Cephalosporin \N
+7884 Panel Consensus 31 meningitis 35733 10 \N \N \N
+8400 Andre Kumar 31 meningitis 35733 8 3 Antibiotics No points if already ordered
+8442 Panel Average 31 meningitis 35733 8 \N \N \N
+9129 Lisa Shieh 31 meningitis 35733 5 3 \N \N
+8401 Andre Kumar 33 meningitis 35733 8 2 Antibiotics less points if delayed
+8871 Panel Average 33 meningitis 35733 5 \N \N \N
+9130 Jason Hom 33 meningitis 35733 5 5 \N \N
+9131 Jonathan Chen 33 meningitis 35733 5 4 CNS Cephalosporin Good antibiotic, but didn't prescribe until got to the worsened" state, meaning waited over an hour before prescribing. Don't give as many points"
+9132 Panel Consensus 33 meningitis 35733 5 \N \N \N
+9738 Lisa Shieh 33 meningitis 35733 3 3 already did LP_ so no credit for running LP tests- maybe for cocci or other rarer tests since no improvement \N
+7885 Andre Kumar 30 meningitis 48880 10 5 CSF max points if before antibiotics, otherwise 8 points
+7886 Jason Hom 30 meningitis 48880 10 5 \N \N
+7887 Lisa Shieh 30 meningitis 48880 10 5 \N \N
+7888 Panel Average 30 meningitis 48880 10 \N \N \N
+7889 Panel Consensus 30 meningitis 48880 10 \N \N \N
+8745 Jonathan Chen 30 meningitis 48880 6 4 LP Panel of CSF tests, should get point for each? Adds up to more than value of antibiotics
+11233 Jonathan Chen 31 meningitis 48880 6 4 LP Panel of CSF tests, should get point for each? Adds up to more than value of antibiotics
+8746 Andre Kumar 33 meningitis 48880 6 3 CSF max points if before antibiotics, otherwise 3 points
+8747 Jonathan Chen 33 meningitis 48880 6 4 LP Panel of CSF tests, should get point for each? Adds up to more than value of antibiotics
+9133 Jason Hom 33 meningitis 48880 5 5 \N \N
+9134 Panel Consensus 33 meningitis 48880 5 \N \N \N
+9587 Panel Average 33 meningitis 48880 4 \N \N \N
+10718 Lisa Shieh 33 meningitis 48880 0 3 \N \N
+11425 Jonathan Chen 30 meningitis 50930 0 2 \N Wrong order. Synovial fluid not CSF
+10719 Andre Kumar 30 meningitis 49079 0 4 STD Testing \N
+10720 Jason Hom 30 meningitis 49079 0 4 \N \N
+10721 Jonathan Chen 30 meningitis 49079 0 2 \N \N
+10722 Lisa Shieh 30 meningitis 49079 0 3 \N \N
+10723 Panel Average 30 meningitis 49079 0 \N \N \N
+10724 Panel Consensus 30 meningitis 49079 0 \N \N \N
+10291 Andre Kumar 30 meningitis 48603 1 4 CSF \N
+10292 Panel Average 30 meningitis 48603 1 \N \N \N
+11373 Jonathan Chen 33 meningitis 48603 0 2 \N Not relevant to test?
+11343 Jonathan Chen 33 meningitis 61973 0 2 \N Not relevant to test?
+10293 Andre Kumar 30 meningitis 61853 1 1 CSF \N
+10294 Panel Average 30 meningitis 61853 1 \N \N \N
+11362 Jonathan Chen 33 meningitis 48752 0 2 \N Not relevant to test?
+11231 Jonathan Chen 30 meningitis 61826 0 2 \N Not relevant to test?
+9739 Lisa Shieh 33 meningitis 61826 3 3 \N \N
+10235 Panel Average 33 meningitis 61826 1 \N \N \N
+10295 Andre Kumar 33 meningitis 61826 1 4 3 \N
+10725 Jason Hom 33 meningitis 61826 0 4 \N \N
+10726 Jonathan Chen 33 meningitis 61826 0 2 \N No good indication
+10727 Panel Consensus 33 meningitis 61826 0 \N \N \N
+9135 Jason Hom 31 meningitis 48980 5 5 \N \N
+9136 Lisa Shieh 31 meningitis 48980 5 3 \N \N
+9137 Panel Consensus 31 meningitis 48980 5 \N \N \N
+9432 Panel Average 31 meningitis 48980 5 \N \N \N
+9513 Andre Kumar 31 meningitis 48980 4 2 Consult \N
+10728 Jonathan Chen 31 meningitis 48980 0 3 \N Fine, but don't offer direct points for this?
+7890 Jason Hom 33 meningitis 48980 10 5 \N \N
+8848 Panel Average 33 meningitis 48980 6 \N \N \N
+9138 Lisa Shieh 33 meningitis 48980 5 3 \N \N
+9139 Panel Consensus 33 meningitis 48980 5 \N \N \N
+10076 Andre Kumar 33 meningitis 48980 2 2 Consult \N
+10729 Jonathan Chen 33 meningitis 48980 0 3 \N \N
+7891 Jason Hom 31 meningitis 49207 10 5 \N \N
+7892 Panel Consensus 31 meningitis 49207 10 \N \N \N
+8748 Panel Average 31 meningitis 49207 6 \N \N \N
+9140 Andre Kumar 31 meningitis 49207 5 5 Consult \N
+9740 Lisa Shieh 31 meningitis 49207 3 3 \N \N
+10730 Jonathan Chen 31 meningitis 49207 0 3 \N \N
+10296 Andre Kumar 31 meningitis 50841 1 1 Isolation \N
+10297 Panel Average 31 meningitis 50841 1 \N \N \N
+11439 Jonathan Chen 31 meningitis 49649 0 2 \N \N
+11328 Jonathan Chen 30 meningitis 49594 0 2 \N No good indication
+10298 Andre Kumar 33 meningitis 49594 1 1 CSF \N
+10398 Panel Average 33 meningitis 49594 0 \N \N \N
+10731 Jason Hom 33 meningitis 49594 0 4 \N \N
+10732 Jonathan Chen 33 meningitis 49594 0 2 \N No good indication
+10733 Lisa Shieh 33 meningitis 49594 0 3 \N \N
+10734 Panel Consensus 33 meningitis 49594 0 \N \N \N
+7893 Andre Kumar 30 meningitis 49083 10 5 CSF max points if before antibiotics, otherwise 8 points
+7894 Jason Hom 30 meningitis 49083 10 5 \N \N
+7895 Lisa Shieh 30 meningitis 49083 10 5 \N \N
+7896 Panel Average 30 meningitis 49083 10 \N \N \N
+7897 Panel Consensus 30 meningitis 49083 10 \N \N \N
+8749 Jonathan Chen 30 meningitis 49083 6 5 \N \N
+11353 Jonathan Chen 31 meningitis 49083 6 5 \N \N
+8750 Andre Kumar 33 meningitis 49083 6 3 Consult max points if before antibiotics, otherwise 3 points
+8751 Jonathan Chen 33 meningitis 49083 6 5 \N \N
+9141 Jason Hom 33 meningitis 49083 5 5 \N \N
+9142 Panel Consensus 33 meningitis 49083 5 \N \N \N
+9588 Panel Average 33 meningitis 49083 4 \N \N \N
+10735 Lisa Shieh 33 meningitis 49083 0 3 \N \N
+11447 Jonathan Chen 30 meningitis 50692 4 4 \N \N
+9741 Jonathan Chen 30 meningitis 45983 3 3 CT Head Okay to order CT scan, but not okay if delay antibiotics awaiting result
+10736 Lisa Shieh 30 meningitis 45983 0 3 \N \N
+11092 Panel Consensus 30 meningitis 45983 -3 \N \N \N
+11098 Panel Average 30 meningitis 45983 -3 \N \N \N
+11161 Andre Kumar 30 meningitis 45983 -5 4 Imaging "No indication delays care"
+11162 Jason Hom 30 meningitis 45983 -5 4 \N \N
+11333 Jonathan Chen 31 meningitis 45983 3 3 CT Head \N
+9742 Jonathan Chen 30 meningitis 50241 3 3 CT Head \N
+9743 Lisa Shieh 30 meningitis 50241 3 3 \N \N
+11074 Panel Average 30 meningitis 50241 -3 \N \N \N
+11093 Panel Consensus 30 meningitis 50241 -3 \N \N \N
+11163 Andre Kumar 30 meningitis 50241 -5 4 Imaging "No indication delays care"
+11175 Jason Hom 30 meningitis 50241 -6 4 \N \N
+9143 Lisa Shieh 30 meningitis 48871 5 3 \N \N
+10221 Panel Average 30 meningitis 48871 2 \N \N \N
+10737 Andre Kumar 30 meningitis 48871 0 3 D-dimer \N
+10738 Jason Hom 30 meningitis 48871 0 4 \N \N
+10739 Jonathan Chen 30 meningitis 48871 0 3 \N \N
+10740 Panel Consensus 30 meningitis 48871 0 \N \N \N
+7898 Andre Kumar 30 meningitis 44017 10 5 Steroids \N
+7899 Lisa Shieh 30 meningitis 44017 10 5 \N \N
+7900 Panel Consensus 30 meningitis 44017 10 \N \N \N
+8278 Jonathan Chen 30 meningitis 44017 9 4 \N \N
+8325 Panel Average 30 meningitis 44017 8 \N \N \N
+9144 Jason Hom 30 meningitis 44017 5 4 \N \N
+7901 Panel Consensus 31 meningitis 44017 10 \N \N \N
+8279 Jonathan Chen 31 meningitis 44017 9 4 \N \N
+9145 Andre Kumar 31 meningitis 44017 5 2 Steroids 5 points if ordered late
+9146 Jason Hom 31 meningitis 44017 5 4 \N \N
+9147 Lisa Shieh 31 meningitis 44017 5 3 \N \N
+9148 Panel Average 31 meningitis 44017 5 \N \N \N
+11262 Jonathan Chen 33 meningitis 44017 9 4 \N \N
+9149 Jason Hom 33 meningitis 35969 5 4 \N \N
+10741 Lisa Shieh 33 meningitis 35969 0 3 \N \N
+10742 Panel Average 33 meningitis 35969 0 \N \N \N
+11164 Andre Kumar 33 meningitis 35969 -5 5 Sedation \N
+11165 Jonathan Chen 33 meningitis 35969 -5 2 \N Must be erroneous entry trying to get Dexamethasone
+11166 Panel Consensus 33 meningitis 35969 -5 \N \N \N
+9150 Jason Hom 30 meningitis 46286 5 4 \N \N
+9151 Panel Consensus 30 meningitis 46286 5 \N \N \N
+9744 Lisa Shieh 30 meningitis 46286 3 3 \N \N
+9745 Panel Average 30 meningitis 46286 3 \N \N \N
+10299 Andre Kumar 30 meningitis 46286 1 2 Coags \N
+10743 Jonathan Chen 30 meningitis 46286 0 3 \N \N
+9746 Andre Kumar 30 meningitis 45811 3 2 NPO \N
+9747 Lisa Shieh 30 meningitis 45811 3 3 \N \N
+10077 Panel Average 30 meningitis 45811 2 \N \N \N
+10078 Panel Consensus 30 meningitis 45811 2 \N \N \N
+10744 Jason Hom 30 meningitis 45811 0 4 \N \N
+10745 Jonathan Chen 30 meningitis 45811 0 3 \N \N
+10746 Andre Kumar 30 meningitis 44626 0 1 Antibiotics \N
+10747 Panel Average 30 meningitis 44626 0 \N \N \N
+8587 Lisa Shieh 30 meningitis 49054 7 3 \N \N
+8752 Panel Consensus 30 meningitis 49054 6 \N \N \N
+8849 Panel Average 30 meningitis 49054 6 \N \N \N
+9152 Andre Kumar 30 meningitis 49054 5 3 Isolation \N
+9153 Jason Hom 30 meningitis 49054 5 4 \N \N
+10300 Jonathan Chen 30 meningitis 49054 1 2 \N \N
+8753 Panel Consensus 31 meningitis 49054 6 \N \N \N
+9154 Lisa Shieh 31 meningitis 49054 5 3 \N \N
+9514 Andre Kumar 31 meningitis 49054 4 2 Isolation \N
+9748 Panel Average 31 meningitis 49054 3 \N \N \N
+10301 Jonathan Chen 31 meningitis 49054 1 2 \N \N
+10748 Jason Hom 31 meningitis 49054 0 4 \N \N
+10302 Andre Kumar 30 meningitis 61843 1 1 CSF \N
+10303 Panel Average 30 meningitis 61843 1 \N \N \N
+9749 Lisa Shieh 30 meningitis 45866 3 3 \N \N
+10079 Jason Hom 30 meningitis 45866 2 4 \N \N
+10222 Panel Average 30 meningitis 45866 2 \N \N \N
+10749 Andre Kumar 30 meningitis 45866 0 1 ECG + Monitoring \N
+10750 Jonathan Chen 30 meningitis 45866 0 3 \N \N
+10751 Panel Consensus 30 meningitis 45866 0 \N \N \N
+9750 Lisa Shieh 31 meningitis 45866 3 3 \N \N
+10080 Jason Hom 31 meningitis 45866 2 4 \N \N
+10223 Panel Average 31 meningitis 45866 2 \N \N \N
+10752 Andre Kumar 31 meningitis 45866 0 2 ECG + Monitoring \N
+10753 Jonathan Chen 31 meningitis 45866 0 3 \N \N
+10754 Panel Consensus 31 meningitis 45866 0 \N \N \N
+10304 Andre Kumar 30 meningitis 46160 1 3 Nursing \N
+10305 Panel Average 30 meningitis 46160 1 \N \N \N
+11232 Jonathan Chen 33 meningitis 63761 1 3 \N Common meningitis cause, okay to review
+10306 Andre Kumar 30 meningitis 49142 1 1 CSF \N
+10307 Panel Average 30 meningitis 49142 1 \N \N \N
+11344 Jonathan Chen 33 meningitis 49142 1 3 \N Common meningitis cause, okay to review
+9155 Andre Kumar 30 meningitis 46103 5 4 CSF \N
+9751 Lisa Shieh 30 meningitis 46103 3 3 \N \N
+9920 Panel Average 30 meningitis 46103 3 \N \N \N
+10755 Jason Hom 30 meningitis 46103 0 4 \N \N
+10756 Jonathan Chen 30 meningitis 46103 0 3 \N \N
+10757 Panel Consensus 30 meningitis 46103 0 \N \N \N
+10308 Andre Kumar 31 meningitis 46103 1 5 CSF \N
+10309 Panel Average 31 meningitis 46103 1 \N \N \N
+11275 Jonathan Chen 30 meningitis 50685 0 2 \N Mostly irrelevant STD testing?
+11379 Jonathan Chen 30 meningitis 44252 2 4 \N Doesn't penetrate CNS
+9156 Lisa Shieh 30 meningitis 44237 5 3 \N \N
+10081 Jonathan Chen 30 meningitis 44237 2 4 \N Doesn't penetrate CNS
+11105 Panel Average 30 meningitis 44237 -4 \N \N \N
+11198 Andre Kumar 30 meningitis 44237 -8 5 Antibiotics Doesn't cross CSF
+11199 Panel Consensus 30 meningitis 44237 -8 \N \N \N
+7902 Andre Kumar 30 meningitis 48577 10 5 CSF max points if before antibiotics, otherwise 8 points
+7903 Jason Hom 30 meningitis 48577 10 5 \N \N
+7904 Panel Consensus 30 meningitis 48577 10 \N \N \N
+8280 Panel Average 30 meningitis 48577 9 \N \N \N
+8588 Lisa Shieh 30 meningitis 48577 7 3 \N \N
+9515 Jonathan Chen 30 meningitis 48577 4 5 \N \N
+11325 Jonathan Chen 31 meningitis 48577 4 5 \N \N
+7905 Panel Consensus 33 meningitis 48577 10 \N \N \N
+8754 Andre Kumar 33 meningitis 48577 6 3 CSF max points if before antibiotics, otherwise 3 points
+9157 Jason Hom 33 meningitis 48577 5 5 \N \N
+9516 Jonathan Chen 33 meningitis 48577 4 5 \N \N
+9589 Panel Average 33 meningitis 48577 4 \N \N \N
+10758 Lisa Shieh 33 meningitis 48577 0 3 \N \N
+7906 Andre Kumar 30 meningitis 46006 10 5 CSF \N
+7907 Jason Hom 30 meningitis 46006 10 5 \N \N
+7908 Lisa Shieh 30 meningitis 46006 10 10 \N \N
+7909 Panel Average 30 meningitis 46006 10 \N \N \N
+7910 Panel Consensus 30 meningitis 46006 10 \N \N \N
+9517 Jonathan Chen 30 meningitis 46006 4 4 \N \N
+11348 Jonathan Chen 33 meningitis 46006 4 4 \N \N
+11278 Jonathan Chen 30 meningitis 42197 0 5 \N \N
+7911 Jason Hom 30 meningitis 49109 10 5 \N \N
+8281 Andre Kumar 30 meningitis 49109 9 5 CSF \N
+8459 Panel Average 30 meningitis 49109 7 \N \N \N
+8589 Panel Consensus 30 meningitis 49109 7 \N \N \N
+9752 Jonathan Chen 30 meningitis 49109 3 2 HSV CSF \N
+9753 Lisa Shieh 30 meningitis 49109 3 3 \N \N
+11301 Jonathan Chen 33 meningitis 49109 3 2 HSV CSF \N
+10310 Andre Kumar 30 meningitis 50425 1 1 CSF \N
+10311 Panel Average 30 meningitis 50425 1 \N \N \N
+11385 Jonathan Chen 30 meningitis 62011 0 2 \N Not the right screening test for HIV
+7912 Jason Hom 30 meningitis 63767 10 5 \N \N
+8282 Andre Kumar 30 meningitis 63767 9 4 CSF \N
+8402 Panel Average 30 meningitis 63767 8 \N \N \N
+8590 Panel Consensus 30 meningitis 63767 7 \N \N \N
+9158 Lisa Shieh 30 meningitis 63767 5 3 \N \N
+9754 Jonathan Chen 30 meningitis 63767 3 2 HSV CSF \N
+8591 Panel Consensus 31 meningitis 63767 7 \N \N \N
+9159 Jason Hom 31 meningitis 63767 5 5 \N \N
+9755 Jonathan Chen 31 meningitis 63767 3 2 HSV CSF \N
+9756 Lisa Shieh 31 meningitis 63767 3 3 \N \N
+9757 Panel Average 31 meningitis 63767 3 \N \N \N
+10312 Andre Kumar 31 meningitis 63767 1 3 CSF \N
+8592 Panel Consensus 33 meningitis 63767 7 \N \N \N
+9160 Jason Hom 33 meningitis 63767 5 5 \N \N
+9608 Panel Average 33 meningitis 63767 3 \N \N \N
+9758 Jonathan Chen 33 meningitis 63767 3 2 HSV CSF \N
+9759 Lisa Shieh 33 meningitis 63767 3 3 \N \N
+10082 Andre Kumar 33 meningitis 63767 2 4 4 \N
+9161 Andre Kumar 30 meningitis 44230 5 1 Steroids Dexamethasone, not hydrocort recommended?
+9162 Panel Average 30 meningitis 44230 5 \N \N \N
+9760 Lisa Shieh 30 meningitis 44319 3 3 \N \N
+10083 Jason Hom 30 meningitis 44319 2 4 \N \N
+10084 Panel Consensus 30 meningitis 44319 2 \N \N \N
+10224 Panel Average 30 meningitis 44319 2 \N \N \N
+10313 Jonathan Chen 30 meningitis 44319 1 3 Pain Control \N
+10759 Andre Kumar 30 meningitis 44319 0 1 Pain Medication \N
+11272 Jonathan Chen 30 meningitis 48732 0 2 \N Blood gases?
+7913 Jason Hom 30 meningitis 48954 10 5 \N \N
+7914 Lisa Shieh 30 meningitis 48954 10 5 \N \N
+7915 Panel Consensus 30 meningitis 48954 10 \N \N \N
+8593 Panel Average 30 meningitis 48954 7 \N \N \N
+10314 Andre Kumar 30 meningitis 48954 1 1 Nursing \N
+10760 Jonathan Chen 30 meningitis 48954 0 3 \N \N
+9163 Andre Kumar 30 meningitis 62151 5 5 Lactate \N
+9164 Jason Hom 30 meningitis 62151 5 4 \N \N
+9165 Jonathan Chen 30 meningitis 62151 5 3 Lactate \N
+9166 Lisa Shieh 30 meningitis 62151 5 3 \N \N
+9167 Panel Average 30 meningitis 62151 5 \N \N \N
+9168 Panel Consensus 30 meningitis 62151 5 \N \N \N
+9169 Jonathan Chen 31 meningitis 62151 5 3 Lactate \N
+9170 Panel Consensus 31 meningitis 62151 5 \N \N \N
+9761 Lisa Shieh 31 meningitis 62151 3 3 \N \N
+10085 Andre Kumar 31 meningitis 62151 2 2 Lactate \N
+10225 Panel Average 31 meningitis 62151 2 \N \N \N
+10761 Jason Hom 31 meningitis 62151 0 4 \N \N
+11412 Jonathan Chen 33 meningitis 62151 5 3 Lactate \N
+9171 Andre Kumar 30 meningitis 45918 5 5 Lactate \N
+9172 Jason Hom 30 meningitis 45918 5 4 \N \N
+9173 Jonathan Chen 30 meningitis 45918 5 3 Lactate \N
+9174 Panel Consensus 30 meningitis 45918 5 \N \N \N
+9455 Panel Average 30 meningitis 45918 4 \N \N \N
+9762 Lisa Shieh 30 meningitis 45918 3 3 \N \N
+10086 Andre Kumar 31 meningitis 45918 2 2 Lactate \N
+10087 Panel Average 31 meningitis 45918 2 \N \N \N
+8403 Jason Hom 33 meningitis 45918 8 4 \N \N
+9175 Jonathan Chen 33 meningitis 45918 5 3 Lactate \N
+9176 Panel Consensus 33 meningitis 45918 5 \N \N \N
+9433 Panel Average 33 meningitis 45918 5 \N \N \N
+9763 Andre Kumar 33 meningitis 45918 3 4 Lactate \N
+9764 Lisa Shieh 33 meningitis 45918 3 3 \N \N
+11421 Jonathan Chen 30 meningitis 50510 2 3 \N Reasonable, though not standard guidelines to check
+9177 Andre Kumar 33 meningitis 50510 5 4 CSF very sensitive marker
+9178 Panel Consensus 33 meningitis 50510 5 \N \N \N
+10088 Jonathan Chen 33 meningitis 50510 2 3 \N Reasonable, though not standard guidelines to check
+10226 Panel Average 33 meningitis 50510 2 \N \N \N
+10762 Jason Hom 33 meningitis 50510 0 4 \N \N
+10763 Lisa Shieh 33 meningitis 50510 0 3 \N \N
+7916 Andre Kumar 30 meningitis 63811 10 5 Lumbar Puncture "Max points before antibiotics 5 points if after antibiotics"
+7917 Jason Hom 30 meningitis 63811 10 5 \N \N
+7918 Lisa Shieh 30 meningitis 63811 10 5 \N \N
+7919 Panel Average 30 meningitis 63811 10 \N \N \N
+7920 Panel Consensus 30 meningitis 63811 10 \N \N \N
+8755 Jonathan Chen 30 meningitis 63811 6 2 LP Group with CSF Cell count as implicit that going to do LP if order that
+7921 Jason Hom 31 meningitis 63811 10 5 \N \N
+8756 Jonathan Chen 31 meningitis 63811 6 2 LP Group with CSF Cell count as implicit that going to do LP if order that
+9179 Panel Consensus 31 meningitis 63811 5 \N \N \N
+9596 Panel Average 31 meningitis 63811 4 \N \N \N
+11094 Andre Kumar 31 meningitis 63811 -3 0 Lumbar Puncture Why repeat LP? Is it they improved with ABX without LP and now are getting procedure? If so, I would say minus points for delay in care
+8404 Andre Kumar 33 meningitis 63811 8 5 5 less points if delayed
+8757 Jonathan Chen 33 meningitis 63811 6 2 LP Group with CSF Cell count as implicit that going to do LP if order that
+9180 Jason Hom 33 meningitis 63811 5 5 \N \N
+9181 Panel Consensus 33 meningitis 63811 5 \N \N \N
+9456 Panel Average 33 meningitis 63811 4 \N \N \N
+10764 Lisa Shieh 33 meningitis 63811 0 3 \N \N
+7922 Andre Kumar 30 meningitis 62167 10 5 Lumbar Puncture "Max points before antibiotics 5 points if after antibiotics"
+7923 Jason Hom 30 meningitis 62167 10 5 \N \N
+7924 Lisa Shieh 30 meningitis 62167 10 5 \N \N
+7925 Panel Average 30 meningitis 62167 10 \N \N \N
+7926 Panel Consensus 30 meningitis 62167 10 \N \N \N
+8758 Jonathan Chen 30 meningitis 62167 6 2 LP Group with CSF Cell count as implicit that going to do LP if order that
+8405 Andre Kumar 33 meningitis 62167 8 5 5 less points if delayed
+8759 Jonathan Chen 33 meningitis 62167 6 2 LP Group with CSF Cell count as implicit that going to do LP if order that
+9182 Jason Hom 33 meningitis 62167 5 5 \N \N
+9183 Panel Consensus 33 meningitis 62167 5 \N \N \N
+9457 Panel Average 33 meningitis 62167 4 \N \N \N
+10765 Lisa Shieh 33 meningitis 62167 0 3 \N \N
+9184 Jason Hom 30 meningitis 45763 5 4 \N \N
+9185 Lisa Shieh 30 meningitis 45763 5 4 \N \N
+9186 Panel Consensus 30 meningitis 45763 5 \N \N \N
+9458 Panel Average 30 meningitis 45763 4 \N \N \N
+9765 Andre Kumar 30 meningitis 45763 3 4 Metabolic panel \N
+10089 Jonathan Chen 30 meningitis 45763 2 3 Metabolic Panel \N
+8594 Lisa Shieh 30 meningitis 45771 7 4 \N \N
+9187 Jason Hom 30 meningitis 45771 5 4 \N \N
+9188 Panel Average 30 meningitis 45771 5 \N \N \N
+9189 Panel Consensus 30 meningitis 45771 5 \N \N \N
+9766 Andre Kumar 30 meningitis 45771 3 4 Metabolic panel \N
+10090 Jonathan Chen 30 meningitis 45771 2 3 Metabolic Panel \N
+8406 Andre Kumar 30 meningitis 44586 8 1 Steroids Only dexamethasone recommended?
+8407 Panel Average 30 meningitis 44586 8 \N \N \N
+11334 Jonathan Chen 31 meningitis 44199 0 2 \N Symptomatic management
+10315 Andre Kumar 31 meningitis 44641 1 1 Pain Medication \N
+10316 Panel Average 31 meningitis 44641 1 \N \N \N
+10091 Andre Kumar 31 meningitis 46065 2 1 Imaging \N
+10092 Panel Average 31 meningitis 46065 2 \N \N \N
+11307 Jonathan Chen 30 meningitis 45792 0 2 \N \N
+10317 Andre Kumar 31 meningitis 45792 1 4 MRSA \N
+10399 Panel Average 31 meningitis 45792 0 \N \N \N
+10766 Jason Hom 31 meningitis 45792 0 4 \N \N
+10767 Jonathan Chen 31 meningitis 45792 0 2 \N \N
+10768 Lisa Shieh 31 meningitis 45792 0 3 \N \N
+10769 Panel Consensus 31 meningitis 45792 0 \N \N \N
+10318 Andre Kumar 30 meningitis 61852 1 1 CSF \N
+10400 Panel Average 30 meningitis 61852 0 \N \N \N
+10770 Jason Hom 30 meningitis 61852 0 4 \N \N
+10771 Jonathan Chen 30 meningitis 61852 0 2 \N No good indication
+10772 Lisa Shieh 30 meningitis 61852 0 3 \N \N
+10773 Panel Consensus 30 meningitis 61852 0 \N \N \N
+10319 Andre Kumar 30 meningitis 45750 1 5 Nursing \N
+10320 Panel Average 30 meningitis 45750 1 \N \N \N
+10774 Andre Kumar 30 meningitis 44216 0 1 Nausea Medication \N
+10775 Panel Average 30 meningitis 44216 0 \N \N \N
+11250 Jonathan Chen 30 meningitis 61823 0 4 \N \N
+10321 Andre Kumar 30 meningitis 45802 1 4 Nursing \N
+10322 Panel Average 30 meningitis 45802 1 \N \N \N
+11253 Jonathan Chen 31 meningitis 49334 0 2 \N Irrelevant?
+11476 Jonathan Chen 30 meningitis 46090 0 2 \N \N
+9190 Jason Hom 30 meningitis 45955 5 4 \N \N
+9191 Jonathan Chen 30 meningitis 45955 5 3 Lactate \N
+9192 Panel Consensus 30 meningitis 45955 5 \N \N \N
+10093 Panel Average 30 meningitis 45955 2 \N \N \N
+10323 Andre Kumar 30 meningitis 45955 1 1 Blood Gas \N
+10776 Lisa Shieh 30 meningitis 45955 0 3 \N \N
+9193 Andre Kumar 30 meningitis 48561 5 5 Upreg \N
+9194 Panel Average 30 meningitis 48561 5 \N \N \N
+11277 Jonathan Chen 30 meningitis 45798 1 3 Pregnancy Test \N
+9195 Panel Consensus 33 meningitis 49134 5 \N \N \N
+10324 Andre Kumar 33 meningitis 49134 1 1 UPreg \N
+10325 Jonathan Chen 33 meningitis 49134 1 3 Pregnancy Test \N
+10401 Panel Average 33 meningitis 49134 0 \N \N \N
+10777 Jason Hom 33 meningitis 49134 0 4 \N \N
+10778 Lisa Shieh 33 meningitis 49134 0 3 \N \N
+9767 Lisa Shieh 30 meningitis 62042 3 3 \N \N
+9939 Panel Average 30 meningitis 62042 2 \N \N \N
+10094 Andre Kumar 30 meningitis 62042 2 2 Procalcitonin \N
+10095 Jason Hom 30 meningitis 62042 2 4 \N \N
+10096 Panel Consensus 30 meningitis 62042 2 \N \N \N
+10326 Jonathan Chen 30 meningitis 62042 1 2 \N \N
+7927 Andre Kumar 30 meningitis 49020 10 5 CSF max points if before antibiotics, otherwise 8 points
+7928 Jason Hom 30 meningitis 49020 10 5 \N \N
+7929 Panel Consensus 30 meningitis 49020 10 \N \N \N
+8283 Panel Average 30 meningitis 49020 9 \N \N \N
+8595 Lisa Shieh 30 meningitis 49020 7 3 \N \N
+9518 Jonathan Chen 30 meningitis 49020 4 4 \N \N
+11435 Jonathan Chen 31 meningitis 49020 4 4 \N \N
+8760 Andre Kumar 33 meningitis 49020 6 3 CSF max points if before antibiotics, otherwise 3 points
+9196 Jason Hom 33 meningitis 49020 5 5 \N \N
+9197 Panel Consensus 33 meningitis 49020 5 \N \N \N
+9519 Jonathan Chen 33 meningitis 49020 4 4 \N \N
+9590 Panel Average 33 meningitis 49020 4 \N \N \N
+10779 Lisa Shieh 33 meningitis 49020 0 3 \N \N
+8596 Lisa Shieh 30 meningitis 45759 7 4 \N \N
+8761 Panel Consensus 30 meningitis 45759 6 \N \N \N
+8850 Panel Average 30 meningitis 45759 6 \N \N \N
+9198 Andre Kumar 30 meningitis 45759 5 5 Coags \N
+9199 Jason Hom 30 meningitis 45759 5 5 \N \N
+10780 Jonathan Chen 30 meningitis 45759 0 3 \N \N
+11347 Jonathan Chen 31 meningitis 45776 0 4 \N Process
+8597 Lisa Shieh 30 meningitis 45770 7 4 \N \N
+8762 Panel Consensus 30 meningitis 45770 6 \N \N \N
+8851 Panel Average 30 meningitis 45770 6 \N \N \N
+9200 Andre Kumar 30 meningitis 45770 5 4 Coags \N
+9201 Jason Hom 30 meningitis 45770 5 5 \N \N
+10781 Jonathan Chen 30 meningitis 45770 0 3 \N \N
+8408 Jason Hom 30 meningitis 62103 8 5 \N \N
+9202 Panel Consensus 30 meningitis 62103 5 \N \N \N
+9520 Andre Kumar 30 meningitis 62103 4 1 STD Testing \N
+9521 Panel Average 30 meningitis 62103 4 \N \N \N
+10097 Jonathan Chen 30 meningitis 62103 2 2 HIV \N
+10782 Lisa Shieh 30 meningitis 62103 0 3 \N \N
+11460 Jonathan Chen 31 meningitis 62103 2 2 HIV \N
+9203 Lisa Shieh 33 meningitis 62103 5 3 \N \N
+9204 Panel Consensus 33 meningitis 62103 5 \N \N \N
+9522 Jason Hom 33 meningitis 62103 4 5 \N \N
+9609 Panel Average 33 meningitis 62103 3 \N \N \N
+10098 Jonathan Chen 33 meningitis 62103 2 2 HIV \N
+10327 Andre Kumar 33 meningitis 62103 1 3 7 \N
+11367 Jonathan Chen 30 meningitis 48728 0 2 \N \N
+11428 Jonathan Chen 31 meningitis 48728 0 2 \N \N
+9205 Jason Hom 30 meningitis 63923 5 4 \N \N
+9768 Andre Kumar 30 meningitis 63923 3 2 Respiratory Panel \N
+9769 Panel Consensus 30 meningitis 63923 3 \N \N \N
+9921 Panel Average 30 meningitis 63923 3 \N \N \N
+10783 Jonathan Chen 30 meningitis 63923 0 2 \N \N
+10784 Lisa Shieh 30 meningitis 63923 0 3 \N \N
+8598 Lisa Shieh 30 meningitis 48586 7 3 \N \N
+9206 Jason Hom 30 meningitis 48586 5 4 \N \N
+9207 Panel Average 30 meningitis 48586 5 \N \N \N
+9208 Panel Consensus 30 meningitis 48586 5 \N \N \N
+9770 Andre Kumar 30 meningitis 48586 3 4 CSF \N
+10785 Jonathan Chen 30 meningitis 48586 0 3 \N \N
+9209 Andre Kumar 30 meningitis 63725 5 5 Lactate \N
+9210 Jason Hom 30 meningitis 63725 5 4 \N \N
+9211 Jonathan Chen 30 meningitis 63725 5 3 Lactate \N
+9212 Lisa Shieh 30 meningitis 63725 5 3 \N \N
+9213 Panel Average 30 meningitis 63725 5 \N \N \N
+9214 Panel Consensus 30 meningitis 63725 5 \N \N \N
+11258 Jonathan Chen 31 meningitis 63725 5 3 Lactate \N
+8599 Lisa Shieh 30 meningitis 44198 7 3 \N \N
+9215 Jonathan Chen 30 meningitis 44198 5 3 IVF \N
+9216 Panel Consensus 30 meningitis 44198 5 \N \N \N
+9459 Panel Average 30 meningitis 44198 4 \N \N \N
+9771 Andre Kumar 30 meningitis 44198 3 5 Fluids \N
+9772 Jason Hom 30 meningitis 44198 3 4 \N \N
+9523 Andre Kumar 31 meningitis 44198 4 3 Fluids \N
+9524 Panel Average 31 meningitis 44198 4 \N \N \N
+8763 Jason Hom 33 meningitis 44198 6 4 \N \N
+8872 Panel Average 33 meningitis 44198 5 \N \N \N
+9217 Andre Kumar 33 meningitis 44198 5 2 Fluids \N
+9218 Jonathan Chen 33 meningitis 44198 5 3 IVF \N
+9219 Lisa Shieh 33 meningitis 44198 5 3 \N \N
+9220 Panel Consensus 33 meningitis 44198 5 \N \N \N
+10099 Andre Kumar 30 meningitis 46131 2 4 STD Testing \N
+10387 Panel Average 30 meningitis 46131 1 \N \N \N
+10786 Jason Hom 30 meningitis 46131 0 4 \N \N
+10787 Jonathan Chen 30 meningitis 46131 0 2 \N Symptoms don't suggest neurosyphillis?
+10788 Lisa Shieh 30 meningitis 46131 0 3 \N \N
+10789 Panel Consensus 30 meningitis 46131 0 \N \N \N
+10100 Andre Kumar 30 meningitis 45751 2 5 Urinalysis \N
+10101 Jason Hom 30 meningitis 45751 2 4 \N \N
+10102 Jonathan Chen 30 meningitis 45751 2 3 UA General workup for fever/infection, though symptoms not suggestive of UTI
+10236 Panel Average 30 meningitis 45751 1 \N \N \N
+10790 Lisa Shieh 30 meningitis 45751 0 3 \N \N
+10791 Panel Consensus 30 meningitis 45751 0 \N \N \N
+10103 Jonathan Chen 33 meningitis 45751 2 3 UA General workup for fever/infection, though symptoms not suggestive of UTI
+10328 Andre Kumar 33 meningitis 45751 1 4 Urinalysis \N
+10402 Panel Average 33 meningitis 45751 0 \N \N \N
+10792 Jason Hom 33 meningitis 45751 0 4 \N \N
+10793 Lisa Shieh 33 meningitis 45751 0 3 \N \N
+10794 Panel Consensus 33 meningitis 45751 0 \N \N \N
+9221 Jason Hom 30 meningitis 45873 5 4 \N \N
+9940 Panel Average 30 meningitis 45873 2 \N \N \N
+10104 Andre Kumar 30 meningitis 45873 2 3 Urinalysis \N
+10105 Jonathan Chen 30 meningitis 45873 2 3 UA General workup for fever/infection, though symptoms not suggestive of UTI
+10795 Lisa Shieh 30 meningitis 45873 0 3 \N \N
+10796 Panel Consensus 30 meningitis 45873 0 \N \N \N
+9222 Jason Hom 31 meningitis 45873 5 4 \N \N
+10106 Jonathan Chen 31 meningitis 45873 2 3 UA General workup for fever/infection, though symptoms not suggestive of UTI
+10227 Panel Average 31 meningitis 45873 2 \N \N \N
+10797 Andre Kumar 31 meningitis 45873 0 5 Urinalysis \N
+10798 Lisa Shieh 31 meningitis 45873 0 3 \N \N
+10799 Panel Consensus 31 meningitis 45873 0 \N \N \N
+10329 Andre Kumar 30 meningitis 45782 1 4 Urine Culture \N
+10330 Panel Average 30 meningitis 45782 1 \N \N \N
+7930 Andre Kumar 30 meningitis 43997 10 5 Antibiotics \N
+7931 Jason Hom 30 meningitis 43997 10 5 \N \N
+7932 Lisa Shieh 30 meningitis 43997 10 5 \N \N
+7933 Panel Average 30 meningitis 43997 10 \N \N \N
+7934 Panel Consensus 30 meningitis 43997 10 \N \N \N
+8284 Jonathan Chen 30 meningitis 43997 9 5 \N \N
+7935 Jason Hom 31 meningitis 43997 10 5 \N \N
+7936 Panel Consensus 31 meningitis 43997 10 \N \N \N
+8285 Jonathan Chen 31 meningitis 43997 9 5 \N \N
+8409 Andre Kumar 31 meningitis 43997 8 3 Antibiotics No points if already ordered
+8443 Panel Average 31 meningitis 43997 8 \N \N \N
+9223 Lisa Shieh 31 meningitis 43997 5 3 \N \N
+8410 Andre Kumar 33 meningitis 43997 8 2 Antibiotics \N
+8873 Panel Average 33 meningitis 43997 5 \N \N \N
+9224 Jason Hom 33 meningitis 43997 5 5 \N \N
+9225 Jonathan Chen 33 meningitis 43997 5 4 \N Good antibiotic, but didn't prescribe until got to the worsened" state, meaning waited over an hour before prescribing. Don't give as many points"
+9226 Panel Consensus 33 meningitis 43997 5 \N \N \N
+9773 Lisa Shieh 33 meningitis 43997 3 3 \N \N
+11242 Jonathan Chen 33 meningitis 48486 2 3 Vancomycin Level Okay to check followup leels
+11434 Jonathan Chen 30 meningitis 45972 2 3 Vancomycin Level Okay to check followup leels
+11376 Jonathan Chen 33 meningitis 45972 2 3 Vancomycin Level Okay to check followup leels
+7937 Andre Kumar 30 meningitis 48519 10 5 CSF \N
+7938 Panel Average 30 meningitis 48519 10 \N \N \N
+11390 Jonathan Chen 33 meningitis 48519 0 2 \N \N
+11327 Jonathan Chen 33 meningitis 48529 0 2 \N \N
+11338 Jonathan Chen 30 meningitis 63735 0 2 \N \N
+11265 Jonathan Chen 30 meningitis 45766 0 2 \N \N
+9227 Jason Hom 30 meningitis 50654 5 4 \N \N
+9774 Lisa Shieh 30 meningitis 50654 3 3 \N \N
+9775 Panel Average 30 meningitis 50654 3 \N \N \N
+10331 Andre Kumar 30 meningitis 50654 1 1 CSF \N
+10800 Jonathan Chen 30 meningitis 50654 0 2 \N No good indication
+10801 Panel Consensus 30 meningitis 50654 0 \N \N \N
+9228 Jason Hom 33 meningitis 50654 5 4 \N \N
+9776 Lisa Shieh 33 meningitis 50654 3 3 ?does not change management \N
+9777 Panel Average 33 meningitis 50654 3 \N \N \N
+10332 Andre Kumar 33 meningitis 50654 1 4 3 \N
+10802 Jonathan Chen 33 meningitis 50654 0 2 \N No good indication
+10803 Panel Consensus 33 meningitis 50654 0 \N \N \N
+9229 Jason Hom 30 meningitis 45818 5 4 \N \N
+9778 Lisa Shieh 30 meningitis 45818 3 3 \N \N
+9779 Panel Consensus 30 meningitis 45818 3 \N \N \N
+10107 Jonathan Chen 30 meningitis 45818 2 3 CXR General workup for fever/infection, though symptoms not suggestive of pneumonia
+10108 Panel Average 30 meningitis 45818 2 \N \N \N
+11064 Andre Kumar 30 meningitis 45818 -2 3 Imaging \N
+9230 Jason Hom 31 meningitis 45818 5 4 \N \N
+9610 Panel Average 31 meningitis 45818 3 \N \N \N
+9780 Lisa Shieh 31 meningitis 45818 3 3 \N \N
+9781 Panel Consensus 31 meningitis 45818 3 \N \N \N
+10109 Andre Kumar 31 meningitis 45818 2 1 Imaging ?Check for pneumonoccocal pneumonia
+10110 Jonathan Chen 31 meningitis 45818 2 3 CXR General workup for fever/infection, though symptoms not suggestive of pneumonia
+9782 Lisa Shieh 33 meningitis 45818 3 3 \N \N
+9783 Panel Consensus 33 meningitis 45818 3 \N \N \N
+10111 Jonathan Chen 33 meningitis 45818 2 3 CXR General workup for fever/infection, though symptoms not suggestive of pneumonia
+10403 Panel Average 33 meningitis 45818 0 \N \N \N
+10804 Jason Hom 33 meningitis 45818 0 4 \N \N
+11065 Andre Kumar 33 meningitis 45818 -2 4 Imaging \N
+9231 Jason Hom 30 meningitis 45801 5 4 \N \N
+9784 Lisa Shieh 30 meningitis 45801 3 3 \N \N
+10112 Jonathan Chen 30 meningitis 45801 2 3 CXR General workup for fever/infection, though symptoms not suggestive of pneumonia
+10113 Panel Average 30 meningitis 45801 2 \N \N \N
+11066 Andre Kumar 30 meningitis 45801 -2 3 Imaging \N
+11345 Jonathan Chen 5000 neutropenic 56492 1 2 \N \N
+9232 Jason Hom 5002 neutropenic 44281 5 4 \N \N
+9233 Lisa Shieh 5002 neutropenic 44281 5 3 \N \N
+9525 Panel Average 5002 neutropenic 44281 4 \N \N \N
+9526 Panel Consensus 5002 neutropenic 44281 4 \N \N \N
+10114 Andre Kumar 5002 neutropenic 44281 2 3 Fever Medication \N
+10333 Jonathan Chen 5002 neutropenic 44281 1 2 \N \N
+11401 Jonathan Chen 5003 neutropenic 44281 1 2 \N \N
+9234 Jason Hom 5000 neutropenic 44281 5 4 \N \N
+9527 Panel Consensus 5000 neutropenic 44281 4 \N \N \N
+9591 Panel Average 5000 neutropenic 44281 4 \N \N \N
+9785 Andre Kumar 5000 neutropenic 44281 3 3 Fever Medication \N
+9786 Lisa Shieh 5000 neutropenic 44281 3 3 \N \N
+10334 Jonathan Chen 5000 neutropenic 44281 1 2 \N \N
+9235 Lisa Shieh 5000 neutropenic 48829 5 3 \N \N
+10237 Panel Average 5000 neutropenic 48829 1 \N \N \N
+10805 Andre Kumar 5000 neutropenic 48829 0 5 \N \N
+10806 Jonathan Chen 5000 neutropenic 48829 0 2 \N \N
+10983 Jason Hom 5000 neutropenic 48829 -1 4 \N \N
+10984 Panel Consensus 5000 neutropenic 48829 -1 \N \N \N
+11329 Jonathan Chen 5002 neutropenic 65641 0 4 \N Process
+9236 Andre Kumar 5002 neutropenic 45814 5 2 Admit Assuming MASCC score is <21
+9237 Panel Average 5002 neutropenic 45814 5 \N \N \N
+7939 Jason Hom 5000 neutropenic 48775 10 4 \N \N
+9238 Lisa Shieh 5000 neutropenic 48775 5 3 after post void \N
+9239 Panel Average 5000 neutropenic 48775 5 \N \N \N
+10807 Andre Kumar 5000 neutropenic 48775 0 1 \N \N
+10808 Jonathan Chen 5000 neutropenic 48775 0 2 \N \N
+10809 Panel Consensus 5000 neutropenic 48775 0 \N \N \N
+7940 Jason Hom 5002 neutropenic 46157 10 5 \N \N
+7941 Panel Consensus 5002 neutropenic 46157 10 \N \N \N
+8600 Jonathan Chen 5002 neutropenic 46157 7 4 Blood Cultures \N
+8685 Panel Average 5002 neutropenic 46157 6 \N \N \N
+8764 Andre Kumar 5002 neutropenic 46157 6 5 Time to Positivity More points for time to positivity cultures
+9787 Lisa Shieh 5002 neutropenic 46157 3 3 \N \N
+7942 Jason Hom 5002 neutropenic 46291 10 5 \N \N
+7943 Lisa Shieh 5002 neutropenic 46291 10 3 \N \N
+7944 Panel Consensus 5002 neutropenic 46291 10 \N \N \N
+8296 Panel Average 5002 neutropenic 46291 9 \N \N \N
+8601 Jonathan Chen 5002 neutropenic 46291 7 4 Blood Cultures \N
+8765 Andre Kumar 5002 neutropenic 46291 6 5 Time to Positivity \N
+7945 Jason Hom 5002 neutropenic 45901 10 5 \N \N
+7946 Lisa Shieh 5002 neutropenic 45901 10 5 \N \N
+7947 Panel Consensus 5002 neutropenic 45901 10 \N \N \N
+8326 Panel Average 5002 neutropenic 45901 8 \N \N \N
+8602 Jonathan Chen 5002 neutropenic 45901 7 4 Blood Cultures \N
+9240 Andre Kumar 5002 neutropenic 45901 5 5 Blood cultures \N
+11438 Jonathan Chen 5003 neutropenic 45901 7 4 Blood Cultures \N
+7948 Jason Hom 5000 neutropenic 45901 10 4 \N \N
+7949 Lisa Shieh 5000 neutropenic 45901 10 3 \N \N
+7950 Panel Consensus 5000 neutropenic 45901 10 \N \N \N
+8297 Panel Average 5000 neutropenic 45901 9 \N \N \N
+8603 Jonathan Chen 5000 neutropenic 45901 7 4 Blood Cultures \N
+8766 Andre Kumar 5000 neutropenic 45901 6 5 Blood Cultures \N
+7951 Jason Hom 5002 neutropenic 45752 10 5 \N \N
+7952 Lisa Shieh 5002 neutropenic 45752 10 5 \N \N
+7953 Panel Consensus 5002 neutropenic 45752 10 \N \N \N
+8327 Panel Average 5002 neutropenic 45752 8 \N \N \N
+8604 Jonathan Chen 5002 neutropenic 45752 7 4 Blood Cultures \N
+9241 Andre Kumar 5002 neutropenic 45752 5 5 Blood Cultures \N
+11245 Jonathan Chen 5003 neutropenic 45752 7 4 Blood Cultures \N
+7954 Jason Hom 5000 neutropenic 45752 10 5 \N \N
+7955 Lisa Shieh 5000 neutropenic 45752 10 5 \N \N
+7956 Panel Consensus 5000 neutropenic 45752 10 \N \N \N
+8298 Panel Average 5000 neutropenic 45752 9 \N \N \N
+8605 Jonathan Chen 5000 neutropenic 45752 7 4 Blood Cultures \N
+8767 Andre Kumar 5000 neutropenic 45752 6 5 Blood Cultures \N
+7957 Jason Hom 5000 neutropenic 45760 10 5 \N \N
+8686 Panel Average 5000 neutropenic 45760 6 \N \N \N
+8768 Andre Kumar 5000 neutropenic 45760 6 2 Blood gas \N
+8769 Panel Consensus 5000 neutropenic 45760 6 \N \N \N
+9788 Lisa Shieh 5000 neutropenic 45760 3 3 \N \N
+10115 Jonathan Chen 5000 neutropenic 45760 2 2 Blood Gas \N
+10335 Andre Kumar 5003 neutropenic 45919 1 2 Blood Gas \N
+10336 Panel Average 5003 neutropenic 45919 1 \N \N \N
+7958 Jason Hom 5003 neutropenic 44395 10 5 \N \N
+7959 Panel Consensus 5003 neutropenic 44395 10 \N \N \N
+8606 Jonathan Chen 5003 neutropenic 44395 7 4 IVF \N
+9242 Panel Average 5003 neutropenic 44395 5 \N \N \N
+9789 Lisa Shieh 5003 neutropenic 44395 3 3 \N \N
+10116 Andre Kumar 5003 neutropenic 44395 2 3 Fluids \N
+11290 Jonathan Chen 5003 neutropenic 44439 7 4 IVF \N
+7960 Jason Hom 5000 neutropenic 44290 10 5 \N \N
+7961 Panel Consensus 5000 neutropenic 44290 10 \N \N \N
+8607 Jonathan Chen 5000 neutropenic 44290 7 4 IVF \N
+8770 Panel Average 5000 neutropenic 44290 6 \N \N \N
+9243 Andre Kumar 5000 neutropenic 44290 5 5 Fluids \N
+9790 Lisa Shieh 5000 neutropenic 44290 3 3 \N \N
+7962 Jason Hom 5002 neutropenic 45793 10 5 \N \N
+8608 Panel Consensus 5002 neutropenic 45793 7 \N \N \N
+8672 Panel Average 5002 neutropenic 45793 7 \N \N \N
+9244 Andre Kumar 5002 neutropenic 45793 5 5 CBC \N
+9245 Lisa Shieh 5002 neutropenic 45793 5 3 \N \N
+9528 Jonathan Chen 5002 neutropenic 45793 4 4 CBC \N
+11462 Jonathan Chen 5003 neutropenic 45793 4 4 CBC \N
+7963 Jason Hom 5002 neutropenic 45788 10 5 \N \N
+8411 Panel Consensus 5002 neutropenic 45788 8 \N \N \N
+8460 Panel Average 5002 neutropenic 45788 7 \N \N \N
+8609 Lisa Shieh 5002 neutropenic 45788 7 3 \N \N
+9246 Andre Kumar 5002 neutropenic 45788 5 5 CBC \N
+9529 Jonathan Chen 5002 neutropenic 45788 4 4 CBC \N
+11402 Jonathan Chen 5003 neutropenic 45788 4 4 CBC \N
+7964 Jason Hom 5000 neutropenic 45788 10 5 \N \N
+8412 Panel Consensus 5000 neutropenic 45788 8 \N \N \N
+8444 Panel Average 5000 neutropenic 45788 8 \N \N \N
+8610 Lisa Shieh 5000 neutropenic 45788 7 3 \N \N
+8771 Andre Kumar 5000 neutropenic 45788 6 5 CBC \N
+9530 Jonathan Chen 5000 neutropenic 45788 4 4 CBC \N
+11355 Jonathan Chen 5002 neutropenic 45966 4 4 CBC \N
+7965 Jason Hom 5000 neutropenic 45966 10 5 \N \N
+8286 Lisa Shieh 5000 neutropenic 45966 9 3 \N \N
+8328 Panel Average 5000 neutropenic 45966 8 \N \N \N
+8413 Panel Consensus 5000 neutropenic 45966 8 \N \N \N
+8772 Andre Kumar 5000 neutropenic 45966 6 5 CBC \N
+9531 Jonathan Chen 5000 neutropenic 45966 4 4 CBC \N
+7966 Andre Kumar 5002 neutropenic 36210 10 5 Antibiotics \N
+7967 Jason Hom 5002 neutropenic 36210 10 5 \N \N
+7968 Jonathan Chen 5002 neutropenic 36210 10 5 Anti-Pseudomonas \N
+7969 Lisa Shieh 5002 neutropenic 36210 10 5 \N \N
+7970 Panel Average 5002 neutropenic 36210 10 \N \N \N
+7971 Panel Consensus 5002 neutropenic 36210 10 \N \N \N
+11475 Jonathan Chen 5003 neutropenic 36210 10 5 Anti-Pseudomonas \N
+7972 Andre Kumar 5000 neutropenic 36210 10 5 Antibiotics \N
+7973 Jason Hom 5000 neutropenic 36210 10 5 \N \N
+7974 Jonathan Chen 5000 neutropenic 36210 10 5 Anti-Pseudomonas \N
+7975 Lisa Shieh 5000 neutropenic 36210 10 5 \N \N
+7976 Panel Average 5000 neutropenic 36210 10 \N \N \N
+7977 Panel Consensus 5000 neutropenic 36210 10 \N \N \N
+11167 Andre Kumar 5000 neutropenic 35733 -5 3 Antibiotics \N
+11168 Panel Average 5000 neutropenic 35733 -5 \N \N \N
+11449 Jonathan Chen 5002 neutropenic 50547 0 4 \N Consult
+11249 Jonathan Chen 5002 neutropenic 48980 0 4 \N Consult
+9247 Jason Hom 5003 neutropenic 48980 5 5 \N \N
+9248 Lisa Shieh 5003 neutropenic 48980 5 3 \N \N
+9532 Panel Average 5003 neutropenic 48980 4 \N \N \N
+9533 Panel Consensus 5003 neutropenic 48980 4 \N \N \N
+10117 Andre Kumar 5003 neutropenic 48980 2 2 Consult \N
+10810 Jonathan Chen 5003 neutropenic 48980 0 3 \N \N
+10118 Andre Kumar 5003 neutropenic 49207 2 2 Consult \N
+10119 Panel Average 5003 neutropenic 49207 2 \N \N \N
+7978 Jason Hom 5002 neutropenic 49228 10 5 \N \N
+8874 Panel Average 5002 neutropenic 49228 5 \N \N \N
+9249 Panel Consensus 5002 neutropenic 49228 5 \N \N \N
+9791 Andre Kumar 5002 neutropenic 49228 3 1 Consult \N
+9792 Lisa Shieh 5002 neutropenic 49228 3 3 \N \N
+10811 Jonathan Chen 5002 neutropenic 49228 0 3 \N \N
+11442 Jonathan Chen 5003 neutropenic 49228 0 4 \N Consult
+11287 Jonathan Chen 5002 neutropenic 48711 0 2 \N Wrong type of isolation
+10812 Andre Kumar 5003 neutropenic 48711 0 4 Isolation \N
+10813 Panel Average 5003 neutropenic 48711 0 \N \N \N
+11292 Jonathan Chen 5000 neutropenic 48532 0 2 \N \N
+7979 Jason Hom 5003 neutropenic 46286 10 5 \N \N
+9250 Panel Average 5003 neutropenic 46286 5 \N \N \N
+9251 Panel Consensus 5003 neutropenic 46286 5 \N \N \N
+9793 Lisa Shieh 5003 neutropenic 46286 3 3 \N \N
+10120 Andre Kumar 5003 neutropenic 46286 2 1 Coags \N
+10814 Jonathan Chen 5003 neutropenic 46286 0 2 \N No reason to expect DIC at this point?
+9252 Jason Hom 5003 neutropenic 48686 5 4 \N \N
+9253 Lisa Shieh 5003 neutropenic 48686 5 3 \N \N
+9534 Panel Average 5003 neutropenic 48686 4 \N \N \N
+10121 Andre Kumar 5003 neutropenic 48686 2 3 Diet \N
+10122 Panel Consensus 5003 neutropenic 48686 2 \N \N \N
+10815 Jonathan Chen 5003 neutropenic 48686 0 3 \N \N
+9254 Jason Hom 5000 neutropenic 48686 5 4 \N \N
+9255 Lisa Shieh 5000 neutropenic 48686 5 3 \N \N
+9535 Panel Average 5000 neutropenic 48686 4 \N \N \N
+10123 Andre Kumar 5000 neutropenic 48686 2 1 Diet \N
+10124 Panel Consensus 5000 neutropenic 48686 2 \N \N \N
+10816 Jonathan Chen 5000 neutropenic 48686 0 3 \N \N
+11357 Jonathan Chen 5003 neutropenic 46004 0 2 \N \N
+11378 Jonathan Chen 5003 neutropenic 45811 0 2 \N Unnecessary?
+11296 Jonathan Chen 5003 neutropenic 49054 0 3 \N Neutropenic, not droplet isolation
+7980 Jason Hom 5000 neutropenic 49054 10 5 \N \N
+9256 Lisa Shieh 5000 neutropenic 49054 5 3 \N \N
+9257 Panel Average 5000 neutropenic 49054 5 \N \N \N
+9258 Panel Consensus 5000 neutropenic 49054 5 \N \N \N
+10817 Andre Kumar 5000 neutropenic 49054 0 4 Isolation \N
+10818 Jonathan Chen 5000 neutropenic 49054 0 3 \N Neutropenic, not droplet isolation
+7981 Jason Hom 5002 neutropenic 45866 10 5 \N \N
+9434 Panel Average 5002 neutropenic 45866 5 \N \N \N
+9536 Panel Consensus 5002 neutropenic 45866 4 \N \N \N
+9794 Lisa Shieh 5002 neutropenic 45866 3 3 \N \N
+10125 Jonathan Chen 5002 neutropenic 45866 2 2 \N Tachycardia eval?
+10337 Andre Kumar 5002 neutropenic 45866 1 1 ECG + monitoring \N
+7982 Jason Hom 5003 neutropenic 45866 10 5 \N \N
+9537 Panel Consensus 5003 neutropenic 45866 4 \N \N \N
+9611 Panel Average 5003 neutropenic 45866 3 \N \N \N
+10126 Jonathan Chen 5003 neutropenic 45866 2 2 \N Tachycardia eval?
+10819 Andre Kumar 5003 neutropenic 45866 0 1 ECG + monitoring \N
+10820 Lisa Shieh 5003 neutropenic 45866 0 3 \N \N
+7983 Jason Hom 5000 neutropenic 45866 10 5 \N \N
+9460 Panel Average 5000 neutropenic 45866 4 \N \N \N
+9538 Panel Consensus 5000 neutropenic 45866 4 \N \N \N
+9795 Lisa Shieh 5000 neutropenic 45866 3 3 \N \N
+10127 Jonathan Chen 5000 neutropenic 45866 2 2 \N Tachycardia eval?
+10821 Andre Kumar 5000 neutropenic 45866 0 1 ECG + Monitoring \N
+11319 Jonathan Chen 5000 neutropenic 46160 0 4 \N Process
+11399 Jonathan Chen 5000 neutropenic 41759 0 4 \N Presenting symptom
+11374 Jonathan Chen 5002 neutropenic 45225 7 4 \N Reduce hospitalized neutropenic time
+11369 Jonathan Chen 5002 neutropenic 44252 10 5 Anti-Pseudomonas \N
+7984 Andre Kumar 5002 neutropenic 44237 10 5 Antibiotics \N
+7985 Jason Hom 5002 neutropenic 44237 10 5 \N \N
+7986 Jonathan Chen 5002 neutropenic 44237 10 5 Anti-Pseudomonas \N
+7987 Lisa Shieh 5002 neutropenic 44237 10 5 \N \N
+7988 Panel Average 5002 neutropenic 44237 10 \N \N \N
+7989 Panel Consensus 5002 neutropenic 44237 10 \N \N \N
+7990 Andre Kumar 5000 neutropenic 44237 10 5 Antibiotics \N
+7991 Jason Hom 5000 neutropenic 44237 10 5 \N \N
+7992 Jonathan Chen 5000 neutropenic 44237 10 5 Anti-Pseudomonas \N
+7993 Lisa Shieh 5000 neutropenic 44237 10 5 \N \N
+7994 Panel Average 5000 neutropenic 44237 10 \N \N \N
+7995 Panel Consensus 5000 neutropenic 44237 10 \N \N \N
+11274 Jonathan Chen 5002 neutropenic 46006 0 2 \N \N
+9259 Jason Hom 5000 neutropenic 46020 5 4 \N \N
+9941 Panel Average 5000 neutropenic 46020 2 \N \N \N
+10128 Andre Kumar 5000 neutropenic 46020 2 4 Blood gas \N
+10129 Jonathan Chen 5000 neutropenic 46020 2 2 Blood Gas \N
+10130 Panel Consensus 5000 neutropenic 46020 2 \N \N \N
+10822 Lisa Shieh 5000 neutropenic 46020 0 3 \N \N
+7996 Jason Hom 5002 neutropenic 62151 10 5 \N \N
+7997 Panel Consensus 5002 neutropenic 62151 10 \N \N \N
+8673 Panel Average 5002 neutropenic 62151 7 \N \N \N
+8773 Jonathan Chen 5002 neutropenic 62151 6 4 Lactate \N
+9260 Andre Kumar 5002 neutropenic 62151 5 4 Lactate \N
+9261 Lisa Shieh 5002 neutropenic 62151 5 3 \N \N
+7998 Jason Hom 5003 neutropenic 62151 10 5 \N \N
+7999 Panel Consensus 5003 neutropenic 62151 10 \N \N \N
+8774 Jonathan Chen 5003 neutropenic 62151 6 4 Lactate \N
+8775 Panel Average 5003 neutropenic 62151 6 \N \N \N
+9262 Lisa Shieh 5003 neutropenic 62151 5 3 \N \N
+9796 Andre Kumar 5003 neutropenic 62151 3 1 Lactate \N
+8000 Jason Hom 5000 neutropenic 62151 10 5 \N \N
+8001 Panel Consensus 5000 neutropenic 62151 10 \N \N \N
+8674 Panel Average 5000 neutropenic 62151 7 \N \N \N
+8776 Jonathan Chen 5000 neutropenic 62151 6 4 Lactate \N
+9263 Andre Kumar 5000 neutropenic 62151 5 5 Lactate \N
+9264 Lisa Shieh 5000 neutropenic 62151 5 3 \N \N
+9797 Andre Kumar 5003 neutropenic 45918 3 2 Lactate \N
+9798 Panel Average 5003 neutropenic 45918 3 \N \N \N
+9265 Andre Kumar 5000 neutropenic 45918 5 4 Lactate \N
+9266 Panel Average 5000 neutropenic 45918 5 \N \N \N
+9539 Jason Hom 5000 neutropenic 45903 4 4 \N \N
+9799 Lisa Shieh 5000 neutropenic 45903 3 \N \N \N
+9942 Panel Average 5000 neutropenic 45903 2 \N \N \N
+10131 Panel Consensus 5000 neutropenic 45903 2 \N \N \N
+10338 Jonathan Chen 5000 neutropenic 45903 1 2 Tumor Lysis Worth tracking?
+10823 Andre Kumar 5000 neutropenic 45903 0 1 \N \N
+10824 Andre Kumar 5000 neutropenic 45894 0 1 Lipase \N
+10825 Panel Average 5000 neutropenic 45894 0 \N \N \N
+8002 Jason Hom 5002 neutropenic 45806 10 5 \N \N
+8875 Panel Average 5002 neutropenic 45806 5 \N \N \N
+9800 Andre Kumar 5002 neutropenic 45806 3 4 Metabolic Panel \N
+9801 Lisa Shieh 5002 neutropenic 45806 3 3 \N \N
+9802 Panel Consensus 5002 neutropenic 45806 3 \N \N \N
+10826 Jonathan Chen 5002 neutropenic 45806 0 2 \N \N
+11436 Jonathan Chen 5003 neutropenic 45806 0 2 \N \N
+11323 Jonathan Chen 5000 neutropenic 45806 0 2 \N \N
+8003 Jason Hom 5002 neutropenic 45763 10 5 \N \N
+8004 Panel Consensus 5002 neutropenic 45763 10 \N \N \N
+8777 Panel Average 5002 neutropenic 45763 6 \N \N \N
+9267 Lisa Shieh 5002 neutropenic 45763 5 3 \N \N
+9803 Andre Kumar 5002 neutropenic 45763 3 3 Metabolic panel \N
+9804 Jonathan Chen 5002 neutropenic 45763 3 3 Metabolic Panel \N
+11304 Jonathan Chen 5003 neutropenic 45763 3 3 Metabolic Panel \N
+8005 Jason Hom 5000 neutropenic 45763 10 5 \N \N
+8006 Panel Consensus 5000 neutropenic 45763 10 \N \N \N
+8687 Panel Average 5000 neutropenic 45763 6 \N \N \N
+9268 Lisa Shieh 5000 neutropenic 45763 5 3 \N \N
+9540 Andre Kumar 5000 neutropenic 45763 4 2 Metabolic Panel \N
+9805 Jonathan Chen 5000 neutropenic 45763 3 3 Metabolic Panel \N
+8007 Jason Hom 5002 neutropenic 45771 10 5 \N \N
+8008 Panel Consensus 5002 neutropenic 45771 10 \N \N \N
+8778 Panel Average 5002 neutropenic 45771 6 \N \N \N
+9269 Lisa Shieh 5002 neutropenic 45771 5 3 \N \N
+9806 Andre Kumar 5002 neutropenic 45771 3 4 Metabolic Panel \N
+9807 Jonathan Chen 5002 neutropenic 45771 3 3 Metabolic Panel \N
+11400 Jonathan Chen 5003 neutropenic 45771 3 3 Metabolic Panel \N
+8009 Jason Hom 5000 neutropenic 45771 10 5 \N \N
+8010 Panel Consensus 5000 neutropenic 45771 10 \N \N \N
+8688 Panel Average 5000 neutropenic 45771 6 \N \N \N
+9270 Lisa Shieh 5000 neutropenic 45771 5 3 \N \N
+9541 Andre Kumar 5000 neutropenic 45771 4 2 MEtabolic Panel \N
+9808 Jonathan Chen 5000 neutropenic 45771 3 3 Metabolic Panel \N
+9271 Jason Hom 5002 neutropenic 45792 5 4 \N \N
+9612 Panel Average 5002 neutropenic 45792 3 \N \N \N
+9809 Lisa Shieh 5002 neutropenic 45792 3 3 \N \N
+10132 Andre Kumar 5002 neutropenic 45792 2 5 MRSA \N
+10133 Panel Consensus 5002 neutropenic 45792 2 \N \N \N
+10339 Jonathan Chen 5002 neutropenic 45792 1 2 \N Reasonable if helps triage Vancomycin decision?
+9272 Jason Hom 5003 neutropenic 45792 5 4 \N \N
+9592 Panel Average 5003 neutropenic 45792 4 \N \N \N
+9810 Andre Kumar 5003 neutropenic 45792 3 2 MRSA \N
+9811 Lisa Shieh 5003 neutropenic 45792 3 3 \N \N
+10134 Panel Consensus 5003 neutropenic 45792 2 \N \N \N
+10340 Jonathan Chen 5003 neutropenic 45792 1 2 \N Reasonable if helps triage Vancomycin decision?
+8011 Jason Hom 5002 neutropenic 48960 10 5 \N \N
+8012 Lisa Shieh 5002 neutropenic 48960 10 5 \N \N
+8414 Panel Consensus 5002 neutropenic 48960 8 \N \N \N
+8445 Panel Average 5002 neutropenic 48960 8 \N \N \N
+8779 Jonathan Chen 5002 neutropenic 48960 6 4 \N \N
+9812 Andre Kumar 5002 neutropenic 48960 3 1 Isolation \N
+8013 Jason Hom 5003 neutropenic 48960 10 5 \N \N
+8014 Lisa Shieh 5003 neutropenic 48960 10 3 \N \N
+8415 Panel Consensus 5003 neutropenic 48960 8 \N \N \N
+8461 Panel Average 5003 neutropenic 48960 7 \N \N \N
+8780 Jonathan Chen 5003 neutropenic 48960 6 4 \N \N
+10135 Andre Kumar 5003 neutropenic 48960 2 3 Isolation \N
+8015 Jason Hom 5000 neutropenic 48960 10 5 \N \N
+8416 Panel Consensus 5000 neutropenic 48960 8 \N \N \N
+8611 Lisa Shieh 5000 neutropenic 48960 7 3 \N \N
+8675 Panel Average 5000 neutropenic 48960 7 \N \N \N
+8781 Jonathan Chen 5000 neutropenic 48960 6 4 \N \N
+9813 Andre Kumar 5000 neutropenic 48960 3 4 Isolation \N
+10827 Andre Kumar 5003 neutropenic 45853 0 5 BNP \N
+10828 Panel Average 5003 neutropenic 45853 0 \N \N \N
+11237 Jonathan Chen 5000 neutropenic 44420 0 2 \N Symptom management
+11429 Jonathan Chen 5000 neutropenic 45900 0 2 \N Irrelevant
+10136 Andre Kumar 5000 neutropenic 61823 2 3 Nursing \N
+10137 Panel Average 5000 neutropenic 61823 2 \N \N \N
+10138 Andre Kumar 5000 neutropenic 45802 2 1 Nursing \N
+10139 Panel Average 5000 neutropenic 45802 2 \N \N \N
+11297 Jonathan Chen 5003 neutropenic 45778 0 2 \N \N
+11294 Jonathan Chen 5002 neutropenic 50554 0 4 \N Irrelevant
+11371 Jonathan Chen 5003 neutropenic 50554 0 4 \N Irrelevant
+11326 Jonathan Chen 5003 neutropenic 45955 6 4 Lactate \N
+8016 Panel Consensus 5000 neutropenic 45955 10 \N \N \N
+8782 Jonathan Chen 5000 neutropenic 45955 6 4 Lactate \N
+9542 Jason Hom 5000 neutropenic 45955 4 4 \N \N
+9814 Lisa Shieh 5000 neutropenic 45955 3 3 \N \N
+9815 Panel Average 5000 neutropenic 45955 3 \N \N \N
+10140 Andre Kumar 5000 neutropenic 45955 2 3 Blood gas \N
+9816 Jonathan Chen 5000 neutropenic 46000 3 4 UA \N
+10829 Andre Kumar 5000 neutropenic 46000 0 1 Urinalysis \N
+10830 Jason Hom 5000 neutropenic 46000 0 4 \N \N
+10831 Lisa Shieh 5000 neutropenic 46000 0 3 not symptomatic? \N
+10832 Panel Average 5000 neutropenic 46000 0 \N \N \N
+10833 Panel Consensus 5000 neutropenic 46000 0 \N \N \N
+8017 Jason Hom 5002 neutropenic 45759 10 5 \N \N
+9461 Panel Average 5002 neutropenic 45759 4 \N \N \N
+9543 Panel Consensus 5002 neutropenic 45759 4 \N \N \N
+9817 Andre Kumar 5002 neutropenic 45759 3 4 Coags \N
+10834 Jonathan Chen 5002 neutropenic 45759 0 3 \N \N
+10835 Lisa Shieh 5002 neutropenic 45759 0 3 \N \N
+11336 Jonathan Chen 5003 neutropenic 45759 0 3 \N \N
+11453 Jonathan Chen 5000 neutropenic 45759 0 3 \N \N
+8018 Jason Hom 5002 neutropenic 45770 10 5 \N \N
+9462 Panel Average 5002 neutropenic 45770 4 \N \N \N
+9544 Panel Consensus 5002 neutropenic 45770 4 \N \N \N
+9818 Andre Kumar 5002 neutropenic 45770 3 4 Coags \N
+10836 Jonathan Chen 5002 neutropenic 45770 0 3 \N \N
+10837 Lisa Shieh 5002 neutropenic 45770 0 3 \N \N
+11279 Jonathan Chen 5003 neutropenic 45770 0 3 \N \N
+11403 Jonathan Chen 5000 neutropenic 45770 0 3 \N \N
+10341 Andre Kumar 5003 neutropenic 52757 1 2 PT/OT \N
+10342 Panel Average 5003 neutropenic 52757 1 \N \N \N
+10141 Andre Kumar 5000 neutropenic 45890 2 5 Blood Gas \N
+10142 Jonathan Chen 5000 neutropenic 45890 2 2 Blood Gas \N
+10388 Panel Average 5000 neutropenic 45890 1 \N \N \N
+10838 Jason Hom 5000 neutropenic 45890 0 4 \N \N
+10839 Lisa Shieh 5000 neutropenic 45890 0 3 \N \N
+10840 Panel Consensus 5000 neutropenic 45890 0 \N \N \N
+11358 Jonathan Chen 5003 neutropenic 62023 2 3 Respiratory Virus Screen \N
+8019 Jason Hom 5000 neutropenic 62023 10 5 \N \N
+8783 Panel Average 5000 neutropenic 62023 6 \N \N \N
+8784 Panel Consensus 5000 neutropenic 62023 6 \N \N \N
+9273 Lisa Shieh 5000 neutropenic 62023 5 3 \N \N
+9819 Andre Kumar 5000 neutropenic 62023 3 2 Respiratory Viral Panel \N
+8796 Panel Consensus 5000 neutropenic 45782 6 \N \N \N
+10143 Jonathan Chen 5000 neutropenic 62023 2 3 Respiratory Virus Screen \N
+8020 Jason Hom 5002 neutropenic 63923 10 5 \N \N
+8785 Panel Average 5002 neutropenic 63923 6 \N \N \N
+8786 Panel Consensus 5002 neutropenic 63923 6 \N \N \N
+9274 Lisa Shieh 5002 neutropenic 63923 5 3 \N \N
+9820 Andre Kumar 5002 neutropenic 63923 3 3 Respiratory Viral Panel \N
+10144 Jonathan Chen 5002 neutropenic 63923 2 3 Respiratory Virus Screen \N
+11302 Jonathan Chen 5003 neutropenic 63923 2 3 Respiratory Virus Screen \N
+8021 Jason Hom 5000 neutropenic 63923 10 5 \N \N
+8787 Panel Average 5000 neutropenic 63923 6 \N \N \N
+8788 Panel Consensus 5000 neutropenic 63923 6 \N \N \N
+9275 Lisa Shieh 5000 neutropenic 63923 5 3 \N \N
+9821 Andre Kumar 5000 neutropenic 63923 3 1 Respiratory Viral Panel \N
+10145 Jonathan Chen 5000 neutropenic 63923 2 3 Respiratory Virus Screen \N
+11310 Jonathan Chen 5002 neutropenic 63725 6 4 Lactate \N
+8022 Jason Hom 5003 neutropenic 63725 10 5 \N \N
+8023 Panel Consensus 5003 neutropenic 63725 10 \N \N \N
+8789 Jonathan Chen 5003 neutropenic 63725 6 4 Lactate \N
+8790 Panel Average 5003 neutropenic 63725 6 \N \N \N
+9276 Lisa Shieh 5003 neutropenic 63725 5 3 \N \N
+9822 Andre Kumar 5003 neutropenic 63725 3 1 Lactate \N
+8024 Jason Hom 5000 neutropenic 63725 10 5 \N \N
+8025 Panel Consensus 5000 neutropenic 63725 10 \N \N \N
+8676 Panel Average 5000 neutropenic 63725 7 \N \N \N
+8791 Jonathan Chen 5000 neutropenic 63725 6 4 Lactate \N
+9277 Andre Kumar 5000 neutropenic 63725 5 4 lactate \N
+9278 Lisa Shieh 5000 neutropenic 63725 5 3 \N \N
+8026 Jason Hom 5002 neutropenic 44198 10 5 \N \N
+8027 Panel Consensus 5002 neutropenic 44198 10 \N \N \N
+8462 Panel Average 5002 neutropenic 44198 7 \N \N \N
+8612 Jonathan Chen 5002 neutropenic 44198 7 4 IVF \N
+8613 Lisa Shieh 5002 neutropenic 44198 7 3 \N \N
+9279 Andre Kumar 5002 neutropenic 44198 5 5 Fluids \N
+8028 Jason Hom 5003 neutropenic 44198 10 5 \N \N
+8029 Panel Consensus 5003 neutropenic 44198 10 \N \N \N
+8614 Jonathan Chen 5003 neutropenic 44198 7 4 IVF \N
+8615 Lisa Shieh 5003 neutropenic 44198 7 3 \N \N
+8689 Panel Average 5003 neutropenic 44198 6 \N \N \N
+10146 Andre Kumar 5003 neutropenic 44198 2 3 Fluids \N
+8030 Jason Hom 5000 neutropenic 44198 10 5 \N \N
+8031 Panel Consensus 5000 neutropenic 44198 10 \N \N \N
+8463 Panel Average 5000 neutropenic 44198 7 \N \N \N
+8616 Jonathan Chen 5000 neutropenic 44198 7 4 IVF \N
+8617 Lisa Shieh 5000 neutropenic 44198 7 3 \N \N
+9280 Andre Kumar 5000 neutropenic 44198 5 5 Fluids \N
+11282 Jonathan Chen 5000 neutropenic 45945 1 2 \N Anticipating transfusions, but not needed now
+11331 Jonathan Chen 5003 neutropenic 45995 1 2 Tumor Lysis \N
+9281 Jason Hom 5000 neutropenic 45995 5 4 \N \N
+9823 Lisa Shieh 5000 neutropenic 45995 3 3 \N \N
+9824 Panel Consensus 5000 neutropenic 45995 3 \N \N \N
+9922 Panel Average 5000 neutropenic 45995 3 \N \N \N
+10343 Jonathan Chen 5000 neutropenic 45995 1 2 Tumor Lysis \N
+10841 Andre Kumar 5000 neutropenic 45995 0 1 Tumor Lysis \N
+9825 Andre Kumar 5002 neutropenic 45751 3 5 Urinalysis \N
+9826 Panel Average 5002 neutropenic 45751 3 \N \N \N
+8618 Lisa Shieh 5000 neutropenic 45751 7 3 \N \N
+8792 Panel Consensus 5000 neutropenic 45751 6 \N \N \N
+8852 Panel Average 5000 neutropenic 45751 6 \N \N \N
+9282 Andre Kumar 5000 neutropenic 45751 5 2 Urinalysis \N
+9283 Jason Hom 5000 neutropenic 45751 5 4 \N \N
+9827 Jonathan Chen 5000 neutropenic 45751 3 3 UA \N
+8793 Panel Consensus 5000 neutropenic 45873 6 \N \N \N
+9284 Andre Kumar 5000 neutropenic 45873 5 5 Urinalysis \N
+9285 Jason Hom 5000 neutropenic 45873 5 4 \N \N
+9463 Panel Average 5000 neutropenic 45873 4 \N \N \N
+9828 Jonathan Chen 5000 neutropenic 45873 3 4 UA \N
+9829 Lisa Shieh 5000 neutropenic 45873 3 3 \N \N
+8794 Panel Consensus 5002 neutropenic 45782 6 \N \N \N
+9286 Andre Kumar 5002 neutropenic 45782 5 5 Urine Culture \N
+9287 Jason Hom 5002 neutropenic 45782 5 4 \N \N
+9464 Panel Average 5002 neutropenic 45782 4 \N \N \N
+9830 Jonathan Chen 5002 neutropenic 45782 3 4 UA \N
+9831 Lisa Shieh 5002 neutropenic 45782 3 3 \N \N
+8795 Panel Consensus 5003 neutropenic 45782 6 \N \N \N
+9288 Jason Hom 5003 neutropenic 45782 5 4 \N \N
+9545 Andre Kumar 5003 neutropenic 45782 4 4 Urine Culture \N
+9546 Panel Average 5003 neutropenic 45782 4 \N \N \N
+9832 Jonathan Chen 5003 neutropenic 45782 3 4 UA \N
+9833 Lisa Shieh 5003 neutropenic 45782 3 3 \N \N
+9289 Andre Kumar 5000 neutropenic 45782 5 5 Urine Culture \N
+9290 Jason Hom 5000 neutropenic 45782 5 4 \N \N
+9613 Panel Average 5000 neutropenic 45782 3 \N \N \N
+9834 Jonathan Chen 5000 neutropenic 45782 3 4 UA \N
+10842 Lisa Shieh 5000 neutropenic 45782 0 3 \N \N
+9291 Jonathan Chen 5002 neutropenic 43997 5 3 \N Case deliberately ambiguous about needing vancomycin / MRSA coverage. With elevated lactate, reasonable to assess as severe sepsis for empiric coverage
+9292 Lisa Shieh 5002 neutropenic 43997 5 3 \N \N
+9943 Panel Average 5002 neutropenic 43997 2 \N \N \N
+10147 Jason Hom 5002 neutropenic 43997 2 5 \N \N
+10148 Panel Consensus 5002 neutropenic 43997 2 \N \N \N
+10843 Andre Kumar 5002 neutropenic 43997 0 4 Antibiotics \N
+8619 Lisa Shieh 5003 neutropenic 43997 7 3 \N \N
+9293 Jonathan Chen 5003 neutropenic 43997 5 3 \N Case deliberately ambiguous about needing vancomycin / MRSA coverage. With elevated lactate, reasonable to assess as severe sepsis for empiric coverage
+9835 Panel Average 5003 neutropenic 43997 3 \N \N \N
+10149 Jason Hom 5003 neutropenic 43997 2 4 \N \N
+10150 Panel Consensus 5003 neutropenic 43997 2 \N \N \N
+10844 Andre Kumar 5003 neutropenic 43997 0 5 Antibiotics \N
+9294 Jonathan Chen 5000 neutropenic 43997 5 3 \N Case deliberately ambiguous about needing vancomycin / MRSA coverage. With elevated lactate, reasonable to assess as severe sepsis for empiric coverage
+9295 Lisa Shieh 5000 neutropenic 43997 5 3 \N \N
+9944 Panel Average 5000 neutropenic 43997 2 \N \N \N
+10151 Jason Hom 5000 neutropenic 43997 2 4 \N \N
+10152 Panel Consensus 5000 neutropenic 43997 2 \N \N \N
+10845 Andre Kumar 5000 neutropenic 43997 0 5 Antibiotics \N
+11478 Jonathan Chen 5000 neutropenic 45972 2 3 \N \N
+9836 Andre Kumar 5002 neutropenic 63735 3 3 Respiratory Viral Panel \N
+9837 Lisa Shieh 5002 neutropenic 63735 3 3 \N \N
+10153 Jonathan Chen 5002 neutropenic 63735 2 3 Respiratory Virus Screen \N
+10154 Panel Average 5002 neutropenic 63735 2 \N \N \N
+10846 Jason Hom 5002 neutropenic 63735 0 5 \N \N
+10847 Panel Consensus 5002 neutropenic 63735 0 \N \N \N
+9838 Andre Kumar 5003 neutropenic 63735 3 2 Respiratory Viral Panel \N
+10155 Jonathan Chen 5003 neutropenic 63735 2 3 Respiratory Virus Screen \N
+10344 Panel Average 5003 neutropenic 63735 1 \N \N \N
+10848 Jason Hom 5003 neutropenic 63735 0 5 \N \N
+10849 Lisa Shieh 5003 neutropenic 63735 0 3 \N \N
+10850 Panel Consensus 5003 neutropenic 63735 0 \N \N \N
+11238 Jonathan Chen 5000 neutropenic 45766 0 2 \N Process
+8032 Jason Hom 5002 neutropenic 45818 10 5 \N \N
+8033 Panel Consensus 5002 neutropenic 45818 10 \N \N \N
+8677 Panel Average 5002 neutropenic 45818 7 \N \N \N
+9296 Andre Kumar 5002 neutropenic 45818 5 2 Imaging \N
+9297 Lisa Shieh 5002 neutropenic 45818 5 3 \N \N
+9839 Jonathan Chen 5002 neutropenic 45818 3 3 CXR \N
+8034 Jason Hom 5003 neutropenic 45818 10 5 \N \N
+8035 Panel Consensus 5003 neutropenic 45818 10 \N \N \N
+8853 Panel Average 5003 neutropenic 45818 6 \N \N \N
+9547 Andre Kumar 5003 neutropenic 45818 4 4 Imaging No points if already done
+9840 Jonathan Chen 5003 neutropenic 45818 3 3 CXR \N
+9841 Lisa Shieh 5003 neutropenic 45818 3 3 \N \N
+8036 Jason Hom 5000 neutropenic 45818 10 5 \N \N
+8037 Panel Consensus 5000 neutropenic 45818 10 \N \N \N
+8446 Panel Average 5000 neutropenic 45818 8 \N \N \N
+8620 Lisa Shieh 5000 neutropenic 45818 7 3 \N \N
+8797 Andre Kumar 5000 neutropenic 45818 6 4 Imaging \N
+9842 Jonathan Chen 5000 neutropenic 45818 3 3 CXR \N
+8038 Jason Hom 5002 neutropenic 45801 10 5 \N \N
+8039 Panel Consensus 5002 neutropenic 45801 10 \N \N \N
+8464 Panel Average 5002 neutropenic 45801 7 \N \N \N
+8621 Lisa Shieh 5002 neutropenic 45801 7 3 \N \N
+9298 Andre Kumar 5002 neutropenic 45801 5 2 Imaging \N
+9843 Jonathan Chen 5002 neutropenic 45801 3 3 CXR \N
+8040 Jason Hom 5000 neutropenic 45801 10 5 \N \N
+8041 Panel Consensus 5000 neutropenic 45801 10 \N \N \N
+8287 Lisa Shieh 5000 neutropenic 45801 9 3 \N \N
+8329 Panel Average 5000 neutropenic 45801 8 \N \N \N
+8798 Andre Kumar 5000 neutropenic 45801 6 4 Imaging \N
+9844 Jonathan Chen 5000 neutropenic 45801 3 3 CXR \N
+8042 Jason Hom 10 pulmonary_embolism 45977 10 5 \N \N
+8043 Panel Consensus 10 pulmonary_embolism 45977 10 \N \N \N
+9435 Panel Average 10 pulmonary_embolism 45977 5 \N \N \N
+9845 Lisa Shieh 10 pulmonary_embolism 45977 3 3 \N \N
+10345 Andre Kumar 10 pulmonary_embolism 45977 1 1 Weight \N
+10851 Jonathan Chen 10 pulmonary_embolism 45977 0 2 \N \N
+8044 Jason Hom 11 pulmonary_embolism 45977 10 5 \N \N
+8045 Panel Consensus 11 pulmonary_embolism 45977 10 \N \N \N
+8854 Panel Average 11 pulmonary_embolism 45977 6 \N \N \N
+9299 Lisa Shieh 11 pulmonary_embolism 45977 5 3 \N \N
+10156 Andre Kumar 11 pulmonary_embolism 45977 2 2 Weight \N
+10852 Jonathan Chen 11 pulmonary_embolism 45977 0 2 \N \N
+11252 Jonathan Chen 11 pulmonary_embolism 65641 0 4 \N Process
+8046 Jason Hom 11 pulmonary_embolism 45814 10 5 \N \N
+8047 Panel Consensus 11 pulmonary_embolism 45814 10 \N \N \N
+8690 Panel Average 11 pulmonary_embolism 45814 6 \N \N \N
+9300 Lisa Shieh 11 pulmonary_embolism 45814 5 3 \N \N
+9548 Andre Kumar 11 pulmonary_embolism 45814 4 5 Admit \N
+10853 Jonathan Chen 11 pulmonary_embolism 45814 0 2 \N \N
+9549 Andre Kumar 11 pulmonary_embolism 61982 4 5 Admit \N
+9550 Panel Average 11 pulmonary_embolism 61982 4 \N \N \N
+11443 Jonathan Chen 10 pulmonary_embolism 46309 2 4 Nebs \N
+11473 Jonathan Chen 11 pulmonary_embolism 46309 2 4 Nebs \N
+11311 Jonathan Chen 10 pulmonary_embolism 44349 2 4 Nebs \N
+11468 Jonathan Chen 10 pulmonary_embolism 60175 2 4 Nebs \N
+8048 Jason Hom 10 pulmonary_embolism 44330 10 5 \N \N
+8622 Lisa Shieh 10 pulmonary_embolism 44330 7 3 \N \N
+8623 Panel Consensus 10 pulmonary_embolism 44330 7 \N \N \N
+8678 Panel Average 10 pulmonary_embolism 44330 7 \N \N \N
+9846 Andre Kumar 10 pulmonary_embolism 44330 3 3 Nebs \N
+10157 Jonathan Chen 10 pulmonary_embolism 44330 2 4 Nebs \N
+11471 Jonathan Chen 12 pulmonary_embolism 60175 2 4 Nebs \N
+11340 Jonathan Chen 11 pulmonary_embolism 44349 2 4 Nebs \N
+11432 Jonathan Chen 11 pulmonary_embolism 60175 2 4 Nebs \N
+8049 Jason Hom 11 pulmonary_embolism 44330 10 5 \N \N
+8624 Panel Consensus 11 pulmonary_embolism 44330 7 \N \N \N
+8855 Panel Average 11 pulmonary_embolism 44330 6 \N \N \N
+9301 Lisa Shieh 11 pulmonary_embolism 44330 5 3 \N \N
+10158 Andre Kumar 11 pulmonary_embolism 44330 2 1 Nebs \N
+10159 Jonathan Chen 11 pulmonary_embolism 44330 2 4 Nebs \N
+11427 Jonathan Chen 11 pulmonary_embolism 44595 0 2 \N Weird antibiotic choice?
+11405 Jonathan Chen 10 pulmonary_embolism 47146 0 2 \N \N
+9302 Jason Hom 10 pulmonary_embolism 44206 5 5 \N \N
+9303 Lisa Shieh 10 pulmonary_embolism 44206 5 3 \N \N
+9551 Panel Average 10 pulmonary_embolism 44206 4 \N \N \N
+9552 Panel Consensus 10 pulmonary_embolism 44206 4 \N \N \N
+10160 Andre Kumar 10 pulmonary_embolism 44206 2 2 ACS meds \N
+10854 Jonathan Chen 10 pulmonary_embolism 44206 0 2 \N \N
+9304 Lisa Shieh 11 pulmonary_embolism 44206 5 3 \N \N
+9553 Panel Consensus 11 pulmonary_embolism 44206 4 \N \N \N
+9945 Panel Average 11 pulmonary_embolism 44206 2 \N \N \N
+10161 Andre Kumar 11 pulmonary_embolism 44206 2 1 ACS Medications \N
+10855 Jason Hom 11 pulmonary_embolism 44206 0 5 \N \N
+10856 Jonathan Chen 11 pulmonary_embolism 44206 0 2 \N \N
+11472 Jonathan Chen 8 pulmonary_embolism 44206 0 2 \N \N
+10346 Andre Kumar 10 pulmonary_embolism 44315 1 2 ACS meds \N
+10347 Panel Average 10 pulmonary_embolism 44315 1 \N \N \N
+11270 Jonathan Chen 8 pulmonary_embolism 46551 0 2 \N \N
+10857 Andre Kumar 8 pulmonary_embolism 44240 0 5 Statin \N
+10858 Panel Average 8 pulmonary_embolism 44240 0 \N \N \N
+8050 Jason Hom 10 pulmonary_embolism 35849 10 5 \N \N
+8799 Panel Average 10 pulmonary_embolism 35849 6 \N \N \N
+8800 Panel Consensus 10 pulmonary_embolism 35849 6 \N \N \N
+9305 Lisa Shieh 10 pulmonary_embolism 35849 5 3 \N \N
+9847 Andre Kumar 10 pulmonary_embolism 35849 3 3 Antibiotics \N
+10859 Jonathan Chen 10 pulmonary_embolism 35849 0 2 \N Shortness of breath, but no specific pneumonia? But maybe reasonable guess when CXR shows opacity (even though it's supposed to be cancer)
+8801 Panel Consensus 12 pulmonary_embolism 35849 6 \N \N \N
+9306 Jason Hom 12 pulmonary_embolism 35849 5 5 \N \N
+9614 Panel Average 12 pulmonary_embolism 35849 3 \N \N \N
+9848 Lisa Shieh 12 pulmonary_embolism 35849 3 3 \N \N
+10162 Andre Kumar 12 pulmonary_embolism 35849 2 1 Antibiotics \N
+10860 Jonathan Chen 12 pulmonary_embolism 35849 0 2 \N Shortness of breath, but no specific pneumonia? But maybe reasonable guess when CXR shows opacity (even though it's supposed to be cancer)
+8051 Jason Hom 11 pulmonary_embolism 35849 10 5 \N \N
+8802 Panel Consensus 11 pulmonary_embolism 35849 6 \N \N \N
+8876 Panel Average 11 pulmonary_embolism 35849 5 \N \N \N
+9307 Lisa Shieh 11 pulmonary_embolism 35849 5 3 \N \N
+10348 Andre Kumar 11 pulmonary_embolism 35849 1 2 Antibiotics \N
+10861 Jonathan Chen 11 pulmonary_embolism 35849 0 2 \N Shortness of breath, but no specific pneumonia? But maybe reasonable guess when CXR shows opacity (even though it's supposed to be cancer)
+8052 Jason Hom 10 pulmonary_embolism 44388 10 5 \N \N
+8803 Panel Consensus 10 pulmonary_embolism 44388 6 \N \N \N
+8877 Panel Average 10 pulmonary_embolism 44388 5 \N \N \N
+9308 Lisa Shieh 10 pulmonary_embolism 44388 5 3 \N \N
+10349 Andre Kumar 10 pulmonary_embolism 44388 1 3 Antibiotics \N
+10862 Jonathan Chen 10 pulmonary_embolism 44388 0 2 \N Shortness of breath, but no specific pneumonia? But maybe reasonable guess when CXR shows opacity (even though it's supposed to be cancer)
+8053 Jason Hom 11 pulmonary_embolism 44388 10 5 \N \N
+8804 Panel Consensus 11 pulmonary_embolism 44388 6 \N \N \N
+9436 Panel Average 11 pulmonary_embolism 44388 5 \N \N \N
+9849 Lisa Shieh 11 pulmonary_embolism 44388 3 3 \N \N
+10350 Andre Kumar 11 pulmonary_embolism 44388 1 2 Antibiotics \N
+10863 Jonathan Chen 11 pulmonary_embolism 44388 0 2 \N Shortness of breath, but no specific pneumonia? But maybe reasonable guess when CXR shows opacity (even though it's supposed to be cancer)
+8054 Jason Hom 11 pulmonary_embolism 45901 10 5 \N \N
+9309 Panel Consensus 11 pulmonary_embolism 45901 5 \N \N \N
+9437 Panel Average 11 pulmonary_embolism 45901 5 \N \N \N
+9850 Lisa Shieh 11 pulmonary_embolism 45901 3 3 \N \N
+10163 Jonathan Chen 11 pulmonary_embolism 45901 2 \N Blood Cultures Not infection, but reasonable to check if not empirically treat?
+10351 Andre Kumar 11 pulmonary_embolism 45901 1 2 Blood Cultures \N
+8055 Jason Hom 11 pulmonary_embolism 45752 10 5 \N \N
+9310 Panel Consensus 11 pulmonary_embolism 45752 5 \N \N \N
+9438 Panel Average 11 pulmonary_embolism 45752 5 \N \N \N
+9851 Lisa Shieh 11 pulmonary_embolism 45752 3 3 \N \N
+10164 Jonathan Chen 11 pulmonary_embolism 45752 2 \N Blood Cultures \N
+10352 Andre Kumar 11 pulmonary_embolism 45752 1 2 Blood Cultures \N
+8056 Jason Hom 10 pulmonary_embolism 45760 10 5 \N \N
+8465 Panel Average 10 pulmonary_embolism 45760 7 \N \N \N
+8625 Lisa Shieh 10 pulmonary_embolism 45760 7 3 \N \N
+8626 Panel Consensus 10 pulmonary_embolism 45760 7 \N \N \N
+9311 Andre Kumar 10 pulmonary_embolism 45760 5 5 Blood Gas \N
+9312 Jonathan Chen 10 pulmonary_embolism 45760 5 4 Blood Gas \N
+8057 Jason Hom 12 pulmonary_embolism 45760 10 5 \N \N
+8627 Panel Consensus 12 pulmonary_embolism 45760 7 \N \N \N
+8691 Panel Average 12 pulmonary_embolism 45760 6 \N \N \N
+9313 Jonathan Chen 12 pulmonary_embolism 45760 5 4 Blood Gas \N
+9314 Lisa Shieh 12 pulmonary_embolism 45760 5 3 \N \N
+9554 Andre Kumar 12 pulmonary_embolism 45760 4 3 Blood Gas \N
+9555 Andre Kumar 11 pulmonary_embolism 45760 4 4 Blood Gas \N
+9556 Panel Average 11 pulmonary_embolism 45760 4 \N \N \N
+8058 Jason Hom 10 pulmonary_embolism 45919 10 5 \N \N
+9315 Jonathan Chen 10 pulmonary_embolism 45919 5 4 Blood Gas \N
+9316 Lisa Shieh 10 pulmonary_embolism 45919 5 3 \N \N
+9317 Panel Average 10 pulmonary_embolism 45919 5 \N \N \N
+9318 Panel Consensus 10 pulmonary_embolism 45919 5 \N \N \N
+10864 Andre Kumar 10 pulmonary_embolism 45919 0 5 Blood Gas \N
+8059 Jason Hom 12 pulmonary_embolism 45919 10 5 \N \N
+8805 Panel Average 12 pulmonary_embolism 45919 6 \N \N \N
+9319 Jonathan Chen 12 pulmonary_embolism 45919 5 4 Blood Gas \N
+9320 Lisa Shieh 12 pulmonary_embolism 45919 5 3 \N \N
+9321 Panel Consensus 12 pulmonary_embolism 45919 5 \N \N \N
+9852 Andre Kumar 12 pulmonary_embolism 45919 3 3 Blood Gas \N
+9322 Jason Hom 11 pulmonary_embolism 45919 5 5 \N \N
+9323 Jonathan Chen 11 pulmonary_embolism 45919 5 4 Blood Gas \N
+9324 Lisa Shieh 11 pulmonary_embolism 45919 5 3 \N \N
+9325 Panel Consensus 11 pulmonary_embolism 45919 5 \N \N \N
+9465 Panel Average 11 pulmonary_embolism 45919 4 \N \N \N
+9853 Andre Kumar 11 pulmonary_embolism 45919 3 4 Blood Gas \N
+11448 Jonathan Chen 10 pulmonary_embolism 44439 0 2 IVF \N
+8060 Jason Hom 10 pulmonary_embolism 45793 10 5 \N \N
+8061 Panel Consensus 10 pulmonary_embolism 45793 10 \N \N \N
+8856 Panel Average 10 pulmonary_embolism 45793 6 \N \N \N
+9326 Lisa Shieh 10 pulmonary_embolism 45793 5 3 \N \N
+9854 Jonathan Chen 10 pulmonary_embolism 45793 3 2 CBC \N
+10165 Andre Kumar 10 pulmonary_embolism 45793 2 3 CBC \N
+11267 Jonathan Chen 12 pulmonary_embolism 45793 3 2 CBC \N
+8062 Jason Hom 11 pulmonary_embolism 45793 10 5 \N \N
+8063 Panel Consensus 11 pulmonary_embolism 45793 10 \N \N \N
+8806 Panel Average 11 pulmonary_embolism 45793 6 \N \N \N
+9327 Lisa Shieh 11 pulmonary_embolism 45793 5 3 \N \N
+9855 Andre Kumar 11 pulmonary_embolism 45793 3 2 CBC \N
+9856 Jonathan Chen 11 pulmonary_embolism 45793 3 2 CBC \N
+11305 Jonathan Chen 8 pulmonary_embolism 45793 3 2 CBC \N
+8064 Jason Hom 10 pulmonary_embolism 45788 10 5 \N \N
+8065 Panel Consensus 10 pulmonary_embolism 45788 10 \N \N \N
+8807 Panel Average 10 pulmonary_embolism 45788 6 \N \N \N
+9328 Lisa Shieh 10 pulmonary_embolism 45788 5 3 \N \N
+9857 Andre Kumar 10 pulmonary_embolism 45788 3 3 CBC \N
+9858 Jonathan Chen 10 pulmonary_embolism 45788 3 2 CBC \N
+8066 Jason Hom 11 pulmonary_embolism 45788 10 5 \N \N
+8067 Panel Consensus 11 pulmonary_embolism 45788 10 \N \N \N
+8808 Panel Average 11 pulmonary_embolism 45788 6 \N \N \N
+9329 Lisa Shieh 11 pulmonary_embolism 45788 5 3 \N \N
+9859 Andre Kumar 11 pulmonary_embolism 45788 3 2 CBC \N
+9860 Jonathan Chen 11 pulmonary_embolism 45788 3 2 CBC \N
+11255 Jonathan Chen 8 pulmonary_embolism 45788 3 2 CBC \N
+8068 Jason Hom 10 pulmonary_embolism 35733 10 5 \N \N
+8809 Panel Average 10 pulmonary_embolism 35733 6 \N \N \N
+8810 Panel Consensus 10 pulmonary_embolism 35733 6 \N \N \N
+9330 Lisa Shieh 10 pulmonary_embolism 35733 5 3 \N \N
+9861 Andre Kumar 10 pulmonary_embolism 35733 3 4 Antibiotics \N
+10865 Jonathan Chen 10 pulmonary_embolism 35733 0 2 \N Shortness of breath, but no specific pneumonia? But maybe reasonable guess when CXR shows opacity (even though it's supposed to be cancer)
+8069 Jason Hom 11 pulmonary_embolism 35733 10 5 \N \N
+8811 Panel Average 11 pulmonary_embolism 35733 6 \N \N \N
+8812 Panel Consensus 11 pulmonary_embolism 35733 6 \N \N \N
+9331 Lisa Shieh 11 pulmonary_embolism 35733 5 3 \N \N
+9862 Andre Kumar 11 pulmonary_embolism 35733 3 2 Antibiotics \N
+10866 Jonathan Chen 11 pulmonary_embolism 35733 0 2 \N Shortness of breath, but no specific pneumonia? But maybe reasonable guess when CXR shows opacity (even though it's supposed to be cancer)
+11377 Jonathan Chen 11 pulmonary_embolism 45892 0 3 \N Superceded by troponin if needed at all
+9863 Lisa Shieh 10 pulmonary_embolism 49251 3 3 \N \N
+10166 Andre Kumar 10 pulmonary_embolism 49251 2 3 Consult \N
+10228 Panel Average 10 pulmonary_embolism 49251 2 \N \N \N
+10867 Jason Hom 10 pulmonary_embolism 49251 0 5 \N \N
+10868 Jonathan Chen 10 pulmonary_embolism 49251 0 3 \N \N
+10869 Panel Consensus 10 pulmonary_embolism 49251 0 \N \N \N
+9864 Andre Kumar 11 pulmonary_embolism 49251 3 2 Consult \N
+9865 Lisa Shieh 11 pulmonary_embolism 49251 3 3 \N \N
+10167 Panel Average 11 pulmonary_embolism 49251 2 \N \N \N
+10870 Jason Hom 11 pulmonary_embolism 49251 0 5 \N \N
+10871 Jonathan Chen 11 pulmonary_embolism 49251 0 3 \N \N
+10872 Panel Consensus 11 pulmonary_embolism 49251 0 \N \N \N
+8070 Jason Hom 10 pulmonary_embolism 65695 10 5 \N \N
+8857 Panel Average 10 pulmonary_embolism 65695 6 \N \N \N
+9332 Lisa Shieh 10 pulmonary_embolism 65695 5 3 \N \N
+9333 Panel Consensus 10 pulmonary_embolism 65695 5 \N \N \N
+10168 Andre Kumar 10 pulmonary_embolism 65695 2 3 Consult \N
+10873 Jonathan Chen 10 pulmonary_embolism 65695 0 3 \N \N
+8071 Jason Hom 11 pulmonary_embolism 65695 10 5 \N \N
+8813 Panel Average 11 pulmonary_embolism 65695 6 \N \N \N
+9334 Lisa Shieh 11 pulmonary_embolism 65695 5 3 \N \N
+9335 Panel Consensus 11 pulmonary_embolism 65695 5 \N \N \N
+9866 Andre Kumar 11 pulmonary_embolism 65695 3 2 Consult \N
+10874 Jonathan Chen 11 pulmonary_embolism 65695 0 3 \N \N
+10353 Andre Kumar 8 pulmonary_embolism 65695 1 5 Consult \N
+10354 Panel Average 8 pulmonary_embolism 65695 1 \N \N \N
+11293 Jonathan Chen 10 pulmonary_embolism 61323 0 4 \N Consult
+8072 Jason Hom 12 pulmonary_embolism 61323 10 5 \N \N
+8628 Lisa Shieh 12 pulmonary_embolism 61323 7 3 \N \N
+8692 Panel Average 12 pulmonary_embolism 61323 6 \N \N \N
+8814 Panel Consensus 12 pulmonary_embolism 61323 6 \N \N \N
+10169 Andre Kumar 12 pulmonary_embolism 61323 2 2 Consult \N
+10875 Jonathan Chen 12 pulmonary_embolism 61323 0 3 \N \N
+11259 Jonathan Chen 11 pulmonary_embolism 61323 0 4 \N Consult
+11284 Jonathan Chen 12 pulmonary_embolism 48502 2 2 Biopsy Consult, but maybe thinking about IR procedure. Not necessary for initial PE treatment, but maybe thinking about biopsy already
+8073 Jason Hom 10 pulmonary_embolism 49207 10 5 \N \N
+9336 Panel Average 10 pulmonary_embolism 49207 5 \N \N \N
+9337 Panel Consensus 10 pulmonary_embolism 49207 5 \N \N \N
+9867 Lisa Shieh 10 pulmonary_embolism 49207 3 3 \N \N
+10170 Andre Kumar 10 pulmonary_embolism 49207 2 3 Consult \N
+10876 Jonathan Chen 10 pulmonary_embolism 49207 0 3 \N \N
+11456 Jonathan Chen 12 pulmonary_embolism 49207 0 4 \N Consult
+9868 Andre Kumar 11 pulmonary_embolism 49207 3 2 Consult \N
+9869 Panel Average 11 pulmonary_embolism 49207 3 \N \N \N
+8074 Jason Hom 11 pulmonary_embolism 49228 10 5 \N \N
+9615 Panel Average 11 pulmonary_embolism 49228 3 \N \N \N
+9870 Panel Consensus 11 pulmonary_embolism 49228 3 \N \N \N
+10877 Andre Kumar 11 pulmonary_embolism 49228 0 5 Consult \N
+10878 Jonathan Chen 11 pulmonary_embolism 49228 0 3 \N \N
+10879 Lisa Shieh 11 pulmonary_embolism 49228 0 3 \N \N
+8075 Jason Hom 8 pulmonary_embolism 49228 10 5 \N \N
+9616 Panel Average 8 pulmonary_embolism 49228 3 \N \N \N
+9871 Panel Consensus 8 pulmonary_embolism 49228 3 \N \N \N
+10880 Andre Kumar 8 pulmonary_embolism 49228 0 5 Consult \N
+10881 Jonathan Chen 8 pulmonary_embolism 49228 0 3 \N \N
+10882 Lisa Shieh 8 pulmonary_embolism 49228 0 3 \N \N
+11451 Jonathan Chen 11 pulmonary_embolism 50509 0 4 \N Consult
+8076 Andre Kumar 10 pulmonary_embolism 48522 10 4 Imaging \N
+8077 Lisa Shieh 10 pulmonary_embolism 48522 10 5 \N \N
+8078 Panel Consensus 10 pulmonary_embolism 48522 10 \N \N \N
+8417 Jonathan Chen 10 pulmonary_embolism 48522 8 4 CT Chest \N
+9338 Panel Average 10 pulmonary_embolism 48522 5 \N \N \N
+11169 Jason Hom 10 pulmonary_embolism 48522 -5 5 \N \N
+8079 Panel Consensus 11 pulmonary_embolism 48522 10 \N \N \N
+8418 Andre Kumar 11 pulmonary_embolism 48522 8 5 Imaging Less points for delaying scan?
+8419 Jonathan Chen 11 pulmonary_embolism 48522 8 4 CT Chest \N
+8629 Lisa Shieh 11 pulmonary_embolism 48522 7 5 late \N
+9617 Panel Average 11 pulmonary_embolism 48522 3 \N \N \N
+11170 Jason Hom 11 pulmonary_embolism 48522 -5 5 \N \N
+8815 Jonathan Chen 11 pulmonary_embolism 49073 6 4 CT Chest This is without contrast, so isn't really the right way to search for PE. Is more for the mass/lung
+10883 Andre Kumar 11 pulmonary_embolism 49073 0 4 IMaging won't capture PE
+10884 Jason Hom 11 pulmonary_embolism 49073 0 5 \N \N
+10885 Lisa Shieh 11 pulmonary_embolism 49073 0 3 need contrast \N
+10886 Panel Average 11 pulmonary_embolism 49073 0 \N \N \N
+10887 Panel Consensus 11 pulmonary_embolism 49073 0 \N \N \N
+8080 Lisa Shieh 10 pulmonary_embolism 45762 10 5 \N \N
+8420 Jonathan Chen 10 pulmonary_embolism 45762 8 4 CT Chest \N
+8466 Panel Average 10 pulmonary_embolism 45762 7 \N \N \N
+8630 Andre Kumar 10 pulmonary_embolism 45762 7 4 Imaging \N
+8631 Panel Consensus 10 pulmonary_embolism 45762 7 \N \N \N
+9339 Jason Hom 10 pulmonary_embolism 45762 5 5 \N \N
+8081 Lisa Shieh 11 pulmonary_embolism 45762 10 5 \N \N
+8421 Andre Kumar 11 pulmonary_embolism 45762 8 4 IMaging \N
+8422 Jonathan Chen 11 pulmonary_embolism 45762 8 4 CT Chest \N
+8447 Panel Average 11 pulmonary_embolism 45762 8 \N \N \N
+8632 Panel Consensus 11 pulmonary_embolism 45762 7 \N \N \N
+9340 Jason Hom 11 pulmonary_embolism 45762 5 5 \N \N
+8082 Jason Hom 10 pulmonary_embolism 48676 10 5 \N \N
+8083 Lisa Shieh 10 pulmonary_embolism 48676 10 3 \N \N
+8084 Panel Consensus 10 pulmonary_embolism 48676 10 \N \N \N
+8235 Panel Average 10 pulmonary_embolism 48676 9 \N \N \N
+8423 Andre Kumar 10 pulmonary_embolism 48676 8 4 Imaging \N
+8424 Jonathan Chen 10 pulmonary_embolism 48676 8 4 CT Chest \N
+8085 Jason Hom 11 pulmonary_embolism 48676 10 5 \N \N
+8086 Panel Consensus 11 pulmonary_embolism 48676 10 \N \N \N
+8330 Panel Average 11 pulmonary_embolism 48676 8 \N \N \N
+8425 Andre Kumar 11 pulmonary_embolism 48676 8 4 Imaging \N
+8426 Jonathan Chen 11 pulmonary_embolism 48676 8 4 CT Chest \N
+8633 Lisa Shieh 11 pulmonary_embolism 48676 7 3 \N \N
+8816 Andre Kumar 10 pulmonary_embolism 48871 6 3 D-dimer \N
+8878 Panel Average 10 pulmonary_embolism 48871 5 \N \N \N
+9341 Jason Hom 10 pulmonary_embolism 48871 5 5 \N \N
+9342 Lisa Shieh 10 pulmonary_embolism 48871 5 3 \N \N
+9343 Panel Consensus 10 pulmonary_embolism 48871 5 \N \N \N
+10171 Jonathan Chen 10 pulmonary_embolism 48871 2 3 D-Dimer \N
+9344 Andre Kumar 11 pulmonary_embolism 48871 5 2 D-dimer \N
+9345 Panel Consensus 11 pulmonary_embolism 48871 5 \N \N \N
+9872 Lisa Shieh 11 pulmonary_embolism 48871 3 3 \N \N
+9923 Panel Average 11 pulmonary_embolism 48871 3 \N \N \N
+10172 Jonathan Chen 11 pulmonary_embolism 48871 2 3 D-Dimer \N
+10888 Jason Hom 11 pulmonary_embolism 48871 0 5 \N \N
+8817 Andre Kumar 10 pulmonary_embolism 48532 6 3 D-dimer \N
+8879 Panel Average 10 pulmonary_embolism 48532 5 \N \N \N
+9346 Jason Hom 10 pulmonary_embolism 48532 5 5 \N \N
+9347 Lisa Shieh 10 pulmonary_embolism 48532 5 3 \N \N
+9348 Panel Consensus 10 pulmonary_embolism 48532 5 \N \N \N
+10173 Jonathan Chen 10 pulmonary_embolism 48532 2 3 D-Dimer D-Dimer okay to screen, but have enough data to go straight to CT PE
+9349 Andre Kumar 11 pulmonary_embolism 48532 5 2 D-dimer \N
+9350 Panel Consensus 11 pulmonary_embolism 48532 5 \N \N \N
+9873 Lisa Shieh 11 pulmonary_embolism 48532 3 3 \N \N
+9924 Panel Average 11 pulmonary_embolism 48532 3 \N \N \N
+10174 Jonathan Chen 11 pulmonary_embolism 48532 2 3 D-Dimer \N
+10889 Jason Hom 11 pulmonary_embolism 48532 0 5 \N \N
+11247 Jonathan Chen 10 pulmonary_embolism 44017 5 4 Corticosteroids Main issue is PE, but could reasonably say it's triggering a COPD exacerbation as well
+9874 Lisa Shieh 10 pulmonary_embolism 45811 3 3 \N \N
+10175 Andre Kumar 10 pulmonary_embolism 45811 2 2 Diet \N
+10176 Panel Consensus 10 pulmonary_embolism 45811 2 \N \N \N
+10229 Panel Average 10 pulmonary_embolism 45811 2 \N \N \N
+10890 Jason Hom 10 pulmonary_embolism 45811 0 5 \N \N
+10891 Jonathan Chen 10 pulmonary_embolism 45811 0 2 \N \N
+8087 Jason Hom 12 pulmonary_embolism 45811 10 5 \N \N
+8858 Panel Average 12 pulmonary_embolism 45811 6 \N \N \N
+9351 Lisa Shieh 12 pulmonary_embolism 45811 5 3 \N \N
+10177 Andre Kumar 12 pulmonary_embolism 45811 2 2 Diet \N
+10178 Panel Consensus 12 pulmonary_embolism 45811 2 \N \N \N
+10892 Jonathan Chen 12 pulmonary_embolism 45811 0 2 \N \N
+9875 Andre Kumar 11 pulmonary_embolism 45811 3 1 Diet \N
+9876 Panel Average 11 pulmonary_embolism 45811 3 \N \N \N
+8088 Jason Hom 8 pulmonary_embolism 46008 10 5 \N \N
+9466 Panel Average 8 pulmonary_embolism 46008 4 \N \N \N
+9557 Panel Consensus 8 pulmonary_embolism 46008 4 \N \N \N
+9877 Lisa Shieh 8 pulmonary_embolism 46008 3 3 \N \N
+10893 Andre Kumar 8 pulmonary_embolism 46008 0 3 Diet \N
+10894 Jonathan Chen 8 pulmonary_embolism 46008 0 2 \N \N
+8089 Jason Hom 10 pulmonary_embolism 49054 10 5 \N \N
+9352 Panel Consensus 10 pulmonary_embolism 49054 5 \N \N \N
+9439 Panel Average 10 pulmonary_embolism 49054 5 \N \N \N
+9878 Lisa Shieh 10 pulmonary_embolism 49054 3 3 \N \N
+10355 Andre Kumar 10 pulmonary_embolism 49054 1 1 Isolation \N
+10356 Jonathan Chen 10 pulmonary_embolism 49054 1 2 \N \N
+8090 Jason Hom 10 pulmonary_embolism 45866 10 5 \N \N
+8634 Lisa Shieh 10 pulmonary_embolism 45866 7 3 \N \N
+8635 Panel Average 10 pulmonary_embolism 45866 7 \N \N \N
+8636 Panel Consensus 10 pulmonary_embolism 45866 7 \N \N \N
+8818 Jonathan Chen 10 pulmonary_embolism 45866 6 4 \N \N
+9558 Andre Kumar 10 pulmonary_embolism 45866 4 4 ECG + Monitoring \N
+11234 Jonathan Chen 12 pulmonary_embolism 45866 6 4 \N \N
+8091 Jason Hom 11 pulmonary_embolism 45866 10 5 \N \N
+8637 Lisa Shieh 11 pulmonary_embolism 45866 7 3 \N \N
+8638 Panel Average 11 pulmonary_embolism 45866 7 \N \N \N
+8639 Panel Consensus 11 pulmonary_embolism 45866 7 \N \N \N
+8819 Jonathan Chen 11 pulmonary_embolism 45866 6 4 \N \N
+9559 Andre Kumar 11 pulmonary_embolism 45866 4 2 ECG + Monitoring \N
+11388 Jonathan Chen 10 pulmonary_embolism 62176 4 2 Echo \N
+11411 Jonathan Chen 11 pulmonary_embolism 62176 4 2 Echo \N
+8092 Jason Hom 10 pulmonary_embolism 61832 10 5 \N \N
+8820 Panel Average 10 pulmonary_embolism 61832 6 \N \N \N
+8821 Panel Consensus 10 pulmonary_embolism 61832 6 \N \N \N
+9353 Lisa Shieh 10 pulmonary_embolism 61832 5 3 \N \N
+9560 Jonathan Chen 10 pulmonary_embolism 61832 4 2 Echo \N
+9879 Andre Kumar 10 pulmonary_embolism 61832 3 4 Imaging \N
+8093 Jason Hom 11 pulmonary_embolism 61832 10 5 \N \N
+8640 Lisa Shieh 11 pulmonary_embolism 61832 7 3 \N \N
+8641 Panel Average 11 pulmonary_embolism 61832 7 \N \N \N
+8822 Panel Consensus 11 pulmonary_embolism 61832 6 \N \N \N
+9561 Andre Kumar 11 pulmonary_embolism 61832 4 2 Imaging \N
+9562 Jonathan Chen 11 pulmonary_embolism 61832 4 2 Echo \N
+8094 Jason Hom 8 pulmonary_embolism 61832 10 5 \N \N
+8693 Panel Average 8 pulmonary_embolism 61832 6 \N \N \N
+8823 Panel Consensus 8 pulmonary_embolism 61832 6 \N \N \N
+9354 Lisa Shieh 8 pulmonary_embolism 61832 5 3 \N \N
+9563 Andre Kumar 8 pulmonary_embolism 61832 4 4 Imaging \N
+9564 Jonathan Chen 8 pulmonary_embolism 61832 4 2 Echo \N
+11246 Jonathan Chen 10 pulmonary_embolism 46160 0 4 \N Process
+11266 Jonathan Chen 11 pulmonary_embolism 46160 0 4 \N Process
+8095 Andre Kumar 11 pulmonary_embolism 44250 10 5 Anticoagulation \N
+8096 Jason Hom 11 pulmonary_embolism 44250 10 5 \N \N
+7515 Jason Hom 40 atrial_fibrillation 45977 10 4 \N \N
+7516 Jason Hom 40 atrial_fibrillation 45887 10 5 \N \N
+7517 Jason Hom 40 atrial_fibrillation 45827 10 5 \N \N
+7518 Lisa Shieh 40 atrial_fibrillation 45827 10 5 \N \N
+7519 Jason Hom 40 atrial_fibrillation 45793 10 5 \N \N
+7520 Jason Hom 40 atrial_fibrillation 45788 10 5 \N \N
+7521 Jason Hom 43 atrial_fibrillation 50400 10 5 \N \N
+7522 Jason Hom 40 atrial_fibrillation 49251 10 5 \N \N
+7523 Jason Hom 43 atrial_fibrillation 49251 10 5 \N \N
+7524 Jason Hom 43 atrial_fibrillation 61323 10 5 \N \N
+10958 Lisa Shieh 11 pulmonary_embolism 62023 0 3 \N \N
+7525 Andre Kumar 40 atrial_fibrillation -100 10 5 Cardioversion \N
+7526 Jason Hom 40 atrial_fibrillation -100 10 5 \N \N
+7527 Jonathan Chen 40 atrial_fibrillation -100 10 5 \N \N
+7528 Lisa Shieh 40 atrial_fibrillation -100 10 5 \N \N
+7529 Panel Average 40 atrial_fibrillation -100 10 \N \N \N
+7530 Panel Consensus 40 atrial_fibrillation -100 10 \N \N \N
+7531 Jason Hom 43 atrial_fibrillation -100 10 5 \N \N
+7532 Jonathan Chen 43 atrial_fibrillation -100 10 5 \N \N
+7533 Lisa Shieh 43 atrial_fibrillation -100 10 5 \N \N
+7534 Panel Consensus 43 atrial_fibrillation -100 10 \N \N \N
+7535 Jason Hom 40 atrial_fibrillation 45811 10 5 \N \N
+7536 Lisa Shieh 43 atrial_fibrillation 45811 10 5 \N \N
+7537 Jason Hom 40 atrial_fibrillation 45866 10 5 \N \N
+7538 Jonathan Chen 40 atrial_fibrillation 45866 10 5 \N \N
+7539 Lisa Shieh 40 atrial_fibrillation 45866 10 5 \N \N
+7540 Jonathan Chen 41 atrial_fibrillation 45866 10 5 \N \N
+7541 Jason Hom 41 atrial_fibrillation 61832 10 5 \N \N
+7542 Jason Hom 40 atrial_fibrillation 46160 10 5 \N \N
+7543 Lisa Shieh 40 atrial_fibrillation 46160 10 5 \N \N
+7544 Andre Kumar 41 atrial_fibrillation 44250 10 5 Anticoagulants No positive points if combined wiht other anticoagulants
+7545 Panel Average 41 atrial_fibrillation 44250 10 \N \N \N
+8097 Jonathan Chen 11 pulmonary_embolism 44250 10 5 Anticoagulation \N
+8098 Lisa Shieh 11 pulmonary_embolism 44250 10 3 ? Full dose \N
+8099 Panel Average 11 pulmonary_embolism 44250 10 \N \N \N
+8100 Panel Consensus 11 pulmonary_embolism 44250 10 \N \N \N
+10895 Andre Kumar 11 pulmonary_embolism 61978 0 5 Foley \N
+10896 Jason Hom 11 pulmonary_embolism 61978 0 5 \N \N
+10897 Jonathan Chen 11 pulmonary_embolism 61978 0 2 \N Probably because think CHF exacerbation and going to lots of diuresis?
+10993 Panel Average 11 pulmonary_embolism 61978 -2 \N \N \N
+11171 Lisa Shieh 11 pulmonary_embolism 61978 -5 3 \N \N
+11172 Panel Consensus 11 pulmonary_embolism 61978 -5 \N \N \N
+8101 Jason Hom 10 pulmonary_embolism 44004 10 5 \N \N
+9355 Lisa Shieh 10 pulmonary_embolism 44004 5 3 \N \N
+9467 Panel Average 10 pulmonary_embolism 44004 4 \N \N \N
+10898 Jonathan Chen 10 pulmonary_embolism 44004 0 2 \N Some pedal edema from chronic CHF? But not supposed to be volume overloaded
+11212 Andre Kumar 43 atrial_fibrillation 44352 -10 5 Rhythm Control \N
+11213 Jason Hom 43 atrial_fibrillation 44352 -10 5 \N \N
+11214 Andre Kumar 40 atrial_fibrillation 50098 -10 5 Imaging Delays care
+11215 Andre Kumar 40 atrial_fibrillation 45983 -10 5 Imaging Delays care
+11216 Andre Kumar 40 atrial_fibrillation 49965 -10 5 Imaging Delays care
+11217 Andre Kumar 43 atrial_fibrillation 44389 -10 4 Rate Control \N
+11218 Panel Average 43 atrial_fibrillation 44389 -10 \N \N \N
+11219 Lisa Shieh 40 atrial_fibrillation 35846 -10 3 \N \N
+11220 Andre Kumar 43 atrial_fibrillation 35846 -10 4 Rate Control \N
+11221 Jason Hom 43 atrial_fibrillation 35846 -10 5 \N \N
+11222 Jason Hom 43 atrial_fibrillation 44393 -10 5 \N \N
+11223 Andre Kumar 43 atrial_fibrillation 44251 -10 5 Ionotropes \N
+11224 Jason Hom 43 atrial_fibrillation 44251 -10 5 \N \N
+11225 Jason Hom 43 atrial_fibrillation 45963 -10 5 \N \N
+11226 Andre Kumar 43 atrial_fibrillation 44248 -10 5 Rate Control \N
+11227 Jason Hom 43 atrial_fibrillation 44248 -10 5 \N \N
+11228 Jason Hom 43 atrial_fibrillation 44004 -10 5 \N \N
+11229 Lisa Shieh 40 atrial_fibrillation 44327 -10 3 \N \N
+11230 Jason Hom 30 meningitis 44237 -10 4 \N \N
+10899 Panel Consensus 10 pulmonary_embolism 44004 0 \N \N \N
+11067 Andre Kumar 10 pulmonary_embolism 44004 -2 4 Diuretics \N
+8102 Jason Hom 11 pulmonary_embolism 44004 10 5 \N \N
+9356 Lisa Shieh 11 pulmonary_embolism 44004 5 3 \N \N
+9468 Panel Average 11 pulmonary_embolism 44004 4 \N \N \N
+10900 Jonathan Chen 11 pulmonary_embolism 44004 0 2 \N Some pedal edema from chronic CHF? But not supposed to be volume overloaded
+10901 Panel Consensus 11 pulmonary_embolism 44004 0 \N \N \N
+11068 Andre Kumar 11 pulmonary_embolism 44004 -2 3 Diuretics \N
+10179 Jason Hom 11 pulmonary_embolism 45797 2 5 \N \N
+10357 Panel Consensus 11 pulmonary_embolism 45797 1 \N \N \N
+10389 Panel Average 11 pulmonary_embolism 45797 1 \N \N \N
+10902 Andre Kumar 11 pulmonary_embolism 45797 0 3 A1c \N
+10903 Jonathan Chen 11 pulmonary_embolism 45797 0 2 \N \N
+10904 Lisa Shieh 11 pulmonary_embolism 45797 0 3 \N \N
+11446 Jonathan Chen 10 pulmonary_embolism 46438 10 5 Anticoagulants \N
+8103 Andre Kumar 10 pulmonary_embolism 44359 10 5 Anticoagulants \N
+8104 Jonathan Chen 10 pulmonary_embolism 44359 10 5 Anticoagulation \N
+8105 Panel Consensus 10 pulmonary_embolism 44359 10 \N \N \N
+8642 Lisa Shieh 10 pulmonary_embolism 44359 7 3 \N \N
+8859 Panel Average 10 pulmonary_embolism 44359 6 \N \N \N
+10905 Jason Hom 10 pulmonary_embolism 44359 0 5 \N \N
+8106 Andre Kumar 11 pulmonary_embolism 44359 10 5 Anticoagulation \N
+8107 Jason Hom 11 pulmonary_embolism 44359 10 5 \N \N
+8108 Jonathan Chen 11 pulmonary_embolism 44359 10 5 Anticoagulation \N
+8109 Lisa Shieh 11 pulmonary_embolism 44359 10 5 \N \N
+8110 Panel Average 11 pulmonary_embolism 44359 10 \N \N \N
+8111 Panel Consensus 11 pulmonary_embolism 44359 10 \N \N \N
+11444 Jonathan Chen 10 pulmonary_embolism 46183 0 2 \N Just count of part heparin protocol
+8112 Jason Hom 11 pulmonary_embolism 46183 10 5 \N \N
+8113 Lisa Shieh 11 pulmonary_embolism 46183 10 3 \N \N
+8114 Panel Consensus 11 pulmonary_embolism 46183 10 \N \N \N
+8448 Panel Average 11 pulmonary_embolism 46183 8 \N \N \N
+9880 Andre Kumar 11 pulmonary_embolism 46183 3 2 Anticoagulation \N
+10906 Jonathan Chen 11 pulmonary_embolism 46183 0 2 \N Just count of part heparin protocol
+11322 Jonathan Chen 10 pulmonary_embolism 63714 0 2 \N Just count of part heparin protocol
+8649 Lisa Shieh 10 pulmonary_embolism 45830 7 3 \N \N
+11350 Jonathan Chen 11 pulmonary_embolism 63714 0 2 \N Just count of part heparin protocol
+9881 Andre Kumar 10 pulmonary_embolism 44211 3 3 Nebs \N
+9882 Panel Average 10 pulmonary_embolism 44211 3 \N \N \N
+11308 Jonathan Chen 10 pulmonary_embolism 49301 5 4 Blood Gas \N
+8643 Panel Consensus 8 pulmonary_embolism 49301 7 \N \N \N
+9357 Jason Hom 8 pulmonary_embolism 49301 5 5 \N \N
+9358 Jonathan Chen 8 pulmonary_embolism 49301 5 4 Blood Gas \N
+9618 Panel Average 8 pulmonary_embolism 49301 3 \N \N \N
+9883 Lisa Shieh 8 pulmonary_embolism 49301 3 3 \N \N
+10180 Andre Kumar 8 pulmonary_embolism 49301 2 4 Blood Gass \N
+9884 Andre Kumar 10 pulmonary_embolism 46020 3 3 Blood gas \N
+9885 Panel Average 10 pulmonary_embolism 46020 3 \N \N \N
+8115 Jason Hom 10 pulmonary_embolism 45838 10 5 \N \N
+8694 Panel Average 10 pulmonary_embolism 45838 6 \N \N \N
+8824 Panel Consensus 10 pulmonary_embolism 45838 6 \N \N \N
+9359 Jonathan Chen 10 pulmonary_embolism 45838 5 4 Troponin \N
+9360 Lisa Shieh 10 pulmonary_embolism 45838 5 3 \N \N
+9565 Andre Kumar 10 pulmonary_embolism 45838 4 2 Troponin \N
+8116 Jason Hom 10 pulmonary_embolism 62151 10 5 \N \N
+8880 Panel Average 10 pulmonary_embolism 62151 5 \N \N \N
+9361 Jonathan Chen 10 pulmonary_embolism 62151 5 4 Blood Gas \N
+9362 Panel Consensus 10 pulmonary_embolism 62151 5 \N \N \N
+9886 Andre Kumar 10 pulmonary_embolism 62151 3 2 Lactate \N
+9887 Lisa Shieh 10 pulmonary_embolism 62151 3 3 \N \N
+10358 Andre Kumar 11 pulmonary_embolism 44299 1 2 Antibiotics \N
+10359 Panel Average 11 pulmonary_embolism 44299 1 \N \N \N
+11361 Jonathan Chen 10 pulmonary_embolism 62144 0 2 \N Not sure?
+9363 Lisa Shieh 11 pulmonary_embolism 61837 5 3 \N \N
+10230 Panel Average 11 pulmonary_embolism 61837 2 \N \N \N
+10907 Andre Kumar 11 pulmonary_embolism 61837 0 5 Lipid Panel \N
+10908 Jason Hom 11 pulmonary_embolism 61837 0 5 \N \N
+10909 Jonathan Chen 11 pulmonary_embolism 61837 0 2 \N \N
+10910 Panel Consensus 11 pulmonary_embolism 61837 0 \N \N \N
+11283 Jonathan Chen 10 pulmonary_embolism 44213 0 2 \N Like asthma exacerbation treatment?
+11239 Jonathan Chen 10 pulmonary_embolism 45806 0 2 \N \N
+11243 Jonathan Chen 12 pulmonary_embolism 45806 0 2 \N \N
+8117 Jason Hom 11 pulmonary_embolism 45806 10 5 \N \N
+8881 Panel Average 11 pulmonary_embolism 45806 5 \N \N \N
+9364 Lisa Shieh 11 pulmonary_embolism 45806 5 3 \N \N
+9365 Panel Consensus 11 pulmonary_embolism 45806 5 \N \N \N
+10360 Andre Kumar 11 pulmonary_embolism 45806 1 4 Metabolic Panel \N
+10911 Jonathan Chen 11 pulmonary_embolism 45806 0 2 \N \N
+11346 Jonathan Chen 8 pulmonary_embolism 45806 0 2 \N \N
+8118 Jason Hom 10 pulmonary_embolism 45763 10 5 \N \N
+8119 Panel Consensus 10 pulmonary_embolism 45763 10 \N \N \N
+8825 Panel Average 10 pulmonary_embolism 45763 6 \N \N \N
+9366 Lisa Shieh 10 pulmonary_embolism 45763 5 3 \N \N
+9888 Andre Kumar 10 pulmonary_embolism 45763 3 2 MEtabolic Panel \N
+9889 Jonathan Chen 10 pulmonary_embolism 45763 3 2 Metabolic Panel \N
+8120 Jason Hom 11 pulmonary_embolism 45763 10 5 \N \N
+8121 Panel Consensus 11 pulmonary_embolism 45763 10 \N \N \N
+8882 Panel Average 11 pulmonary_embolism 45763 5 \N \N \N
+9367 Lisa Shieh 11 pulmonary_embolism 45763 5 3 \N \N
+9890 Jonathan Chen 11 pulmonary_embolism 45763 3 2 Metabolic Panel \N
+10361 Andre Kumar 11 pulmonary_embolism 45763 1 4 Metabolic Panel \N
+8122 Jason Hom 10 pulmonary_embolism 45771 10 5 \N \N
+8123 Panel Consensus 10 pulmonary_embolism 45771 10 \N \N \N
+8826 Panel Average 10 pulmonary_embolism 45771 6 \N \N \N
+9368 Lisa Shieh 10 pulmonary_embolism 45771 5 3 \N \N
+9891 Andre Kumar 10 pulmonary_embolism 45771 3 2 MEtabolic Panel \N
+9892 Jonathan Chen 10 pulmonary_embolism 45771 3 2 Metabolic Panel \N
+11352 Jonathan Chen 12 pulmonary_embolism 45771 3 2 Metabolic Panel \N
+8124 Jason Hom 11 pulmonary_embolism 45771 10 5 \N \N
+8125 Panel Consensus 11 pulmonary_embolism 45771 10 \N \N \N
+8883 Panel Average 11 pulmonary_embolism 45771 5 \N \N \N
+9369 Lisa Shieh 11 pulmonary_embolism 45771 5 3 \N \N
+9893 Jonathan Chen 11 pulmonary_embolism 45771 3 2 Metabolic Panel \N
+10362 Andre Kumar 11 pulmonary_embolism 45771 1 4 Metabolic Panel \N
+11251 Jonathan Chen 8 pulmonary_embolism 45771 3 2 Metabolic Panel \N
+8644 Lisa Shieh 10 pulmonary_embolism 44586 7 3 \N \N
+9370 Jason Hom 10 pulmonary_embolism 44586 5 5 \N \N
+9371 Jonathan Chen 10 pulmonary_embolism 44586 5 4 Corticosteroids \N
+9372 Panel Consensus 10 pulmonary_embolism 44586 5 \N \N \N
+10181 Andre Kumar 10 pulmonary_embolism 44586 2 3 Steroids \N
+9373 Jason Hom 11 pulmonary_embolism 44586 5 5 \N \N
+9374 Jonathan Chen 11 pulmonary_embolism 44586 5 4 Corticosteroids \N
+9375 Lisa Shieh 11 pulmonary_embolism 44586 5 3 \N \N
+9376 Panel Consensus 11 pulmonary_embolism 44586 5 \N \N \N
+9593 Panel Average 11 pulmonary_embolism 44586 4 \N \N \N
+10363 Andre Kumar 11 pulmonary_embolism 44586 1 4 Steroids \N
+8126 Jason Hom 11 pulmonary_embolism 45792 10 5 \N \N
+9469 Panel Average 11 pulmonary_embolism 45792 4 \N \N \N
+9566 Panel Consensus 11 pulmonary_embolism 45792 4 \N \N \N
+9894 Lisa Shieh 11 pulmonary_embolism 45792 3 3 \N \N
+10912 Andre Kumar 11 pulmonary_embolism 45792 0 4 MRSA \N
+10913 Jonathan Chen 11 pulmonary_embolism 45792 0 2 \N \N
+8127 Jason Hom 11 pulmonary_embolism 44228 10 5 \N \N
+9470 Panel Average 11 pulmonary_embolism 44228 4 \N \N \N
+9567 Panel Consensus 11 pulmonary_embolism 44228 4 \N \N \N
+9895 Lisa Shieh 11 pulmonary_embolism 44228 3 3 \N \N
+10182 Jonathan Chen 11 pulmonary_embolism 44228 2 2 Nicotine replacement \N
+10914 Andre Kumar 11 pulmonary_embolism 44228 0 4 Nicotine \N
+9896 Lisa Shieh 11 pulmonary_embolism 48628 3 3 \N \N
+10364 Panel Average 11 pulmonary_embolism 48628 1 \N \N \N
+10915 Andre Kumar 11 pulmonary_embolism 48628 0 4 Anticoagulation \N
+10916 Jason Hom 11 pulmonary_embolism 48628 0 5 \N \N
+10917 Jonathan Chen 11 pulmonary_embolism 48628 0 2 \N \N
+10918 Panel Consensus 11 pulmonary_embolism 48628 0 \N \N \N
+10919 Andre Kumar 11 pulmonary_embolism 46081 0 4 Anticoagulation \N
+10920 Jason Hom 11 pulmonary_embolism 46081 0 5 \N \N
+10921 Jonathan Chen 11 pulmonary_embolism 46081 0 2 \N \N
+10922 Lisa Shieh 11 pulmonary_embolism 46081 0 3 \N \N
+10923 Panel Average 11 pulmonary_embolism 46081 0 \N \N \N
+10924 Panel Consensus 11 pulmonary_embolism 46081 0 \N \N \N
+8128 Jonathan Chen 10 pulmonary_embolism 50235 10 5 Oxygen \N
+9377 Lisa Shieh 10 pulmonary_embolism 50235 5 3 \N \N
+10365 Panel Average 10 pulmonary_embolism 50235 1 \N \N \N
+10925 Jason Hom 10 pulmonary_embolism 50235 0 4 \N \N
+10926 Panel Consensus 10 pulmonary_embolism 50235 0 \N \N \N
+11069 Andre Kumar 10 pulmonary_embolism 50235 -2 1 NIPPV \N
+8129 Jason Hom 12 pulmonary_embolism 50235 10 5 \N \N
+8130 Jonathan Chen 12 pulmonary_embolism 50235 10 5 Oxygen \N
+9378 Lisa Shieh 12 pulmonary_embolism 50235 5 3 \N \N
+9568 Panel Average 12 pulmonary_embolism 50235 4 \N \N \N
+10927 Panel Consensus 12 pulmonary_embolism 50235 0 \N \N \N
+11095 Andre Kumar 12 pulmonary_embolism 50235 -3 1 NIPPV \N
+8131 Jason Hom 10 pulmonary_embolism 45853 10 5 \N \N
+8827 Panel Average 10 pulmonary_embolism 45853 6 \N \N \N
+8828 Panel Consensus 10 pulmonary_embolism 45853 6 \N \N \N
+9379 Lisa Shieh 10 pulmonary_embolism 45853 5 3 \N \N
+9897 Andre Kumar 10 pulmonary_embolism 45853 3 1 BNP \N
+9898 Jonathan Chen 10 pulmonary_embolism 45853 3 4 \N \N
+8132 Jason Hom 11 pulmonary_embolism 45853 10 5 \N \N
+8829 Panel Consensus 11 pulmonary_embolism 45853 6 \N \N \N
+8860 Panel Average 11 pulmonary_embolism 45853 6 \N \N \N
+9380 Lisa Shieh 11 pulmonary_embolism 45853 5 3 \N \N
+9899 Jonathan Chen 11 pulmonary_embolism 45853 3 4 \N \N
+10183 Andre Kumar 11 pulmonary_embolism 45853 2 4 BNP \N
+11359 Jonathan Chen 10 pulmonary_embolism 45750 2 3 \N Process?
+11314 Jonathan Chen 11 pulmonary_embolism 45787 0 2 \N Process
+11416 Jonathan Chen 10 pulmonary_embolism 51290 10 5 Oxygen \N
+8133 Andre Kumar 11 pulmonary_embolism 51290 10 5 Oxygen \N
+8134 Jason Hom 11 pulmonary_embolism 51290 10 5 \N \N
+8135 Jonathan Chen 11 pulmonary_embolism 51290 10 5 Oxygen \N
+8136 Panel Consensus 11 pulmonary_embolism 51290 10 \N \N \N
+8331 Panel Average 11 pulmonary_embolism 51290 8 \N \N \N
+9381 Lisa Shieh 11 pulmonary_embolism 51290 5 3 \N \N
+8137 Andre Kumar 10 pulmonary_embolism 45864 10 5 Oxygen only 1 time award for oxygen
+8138 Jason Hom 10 pulmonary_embolism 45864 10 5 \N \N
+8139 Jonathan Chen 10 pulmonary_embolism 45864 10 5 Oxygen \N
+8140 Lisa Shieh 10 pulmonary_embolism 45864 10 5 \N \N
+8141 Panel Average 10 pulmonary_embolism 45864 10 \N \N \N
+8142 Panel Consensus 10 pulmonary_embolism 45864 10 \N \N \N
+8143 Jason Hom 12 pulmonary_embolism 45864 10 5 \N \N
+8144 Jonathan Chen 12 pulmonary_embolism 45864 10 5 Oxygen \N
+8145 Lisa Shieh 12 pulmonary_embolism 45864 10 5 \N \N
+8146 Panel Consensus 12 pulmonary_embolism 45864 10 \N \N \N
+8220 Panel Average 12 pulmonary_embolism 45864 10 \N \N \N
+8288 Andre Kumar 12 pulmonary_embolism 45864 9 4 Oxygen less points for delaying O2?
+8147 Andre Kumar 10 pulmonary_embolism 48822 10 5 Oxygen \N
+8148 Jason Hom 10 pulmonary_embolism 48822 10 5 \N \N
+8149 Jonathan Chen 10 pulmonary_embolism 48822 10 5 Oxygen \N
+8150 Lisa Shieh 10 pulmonary_embolism 48822 10 5 \N \N
+8151 Panel Average 10 pulmonary_embolism 48822 10 \N \N \N
+8152 Panel Consensus 10 pulmonary_embolism 48822 10 \N \N \N
+8153 Jason Hom 12 pulmonary_embolism 48822 10 5 \N \N
+8154 Jonathan Chen 12 pulmonary_embolism 48822 10 5 Oxygen \N
+8155 Lisa Shieh 12 pulmonary_embolism 48822 10 5 \N \N
+8156 Panel Consensus 12 pulmonary_embolism 48822 10 \N \N \N
+8221 Panel Average 12 pulmonary_embolism 48822 10 \N \N \N
+8289 Andre Kumar 12 pulmonary_embolism 48822 9 4 Oxygen less points for delaying O2?
+8157 Andre Kumar 10 pulmonary_embolism 45900 10 5 Oxygen \N
+8158 Jason Hom 10 pulmonary_embolism 45900 10 5 \N \N
+8159 Jonathan Chen 10 pulmonary_embolism 45900 10 5 Oxygen \N
+8160 Lisa Shieh 10 pulmonary_embolism 45900 10 5 \N \N
+8161 Panel Average 10 pulmonary_embolism 45900 10 \N \N \N
+8162 Panel Consensus 10 pulmonary_embolism 45900 10 \N \N \N
+8163 Jason Hom 12 pulmonary_embolism 45900 10 5 \N \N
+8164 Jonathan Chen 12 pulmonary_embolism 45900 10 5 Oxygen \N
+8165 Lisa Shieh 12 pulmonary_embolism 45900 10 5 \N \N
+8166 Panel Consensus 12 pulmonary_embolism 45900 10 \N \N \N
+8222 Panel Average 12 pulmonary_embolism 45900 10 \N \N \N
+8290 Andre Kumar 12 pulmonary_embolism 45900 9 4 Oxygen less points for delaying O2?
+11370 Jonathan Chen 10 pulmonary_embolism 46090 0 2 \N Heparin protocol
+8291 Lisa Shieh 11 pulmonary_embolism 46090 9 3 \N \N
+9619 Panel Average 11 pulmonary_embolism 46090 3 \N \N \N
+10184 Panel Consensus 11 pulmonary_embolism 46090 2 \N \N \N
+10366 Andre Kumar 11 pulmonary_embolism 46090 1 3 Anticoagulation \N
+10928 Jason Hom 11 pulmonary_embolism 46090 0 5 \N \N
+10929 Jonathan Chen 11 pulmonary_embolism 46090 0 2 \N Heparin protocol
+8167 Jason Hom 10 pulmonary_embolism 45914 10 5 \N \N
+8695 Panel Average 10 pulmonary_embolism 45914 6 \N \N \N
+8830 Panel Consensus 10 pulmonary_embolism 45914 6 \N \N \N
+9382 Jonathan Chen 10 pulmonary_embolism 45914 5 4 Troponin \N
+9383 Lisa Shieh 10 pulmonary_embolism 45914 5 3 \N \N
+9569 Andre Kumar 10 pulmonary_embolism 45914 4 3 Troponin \N
+9570 Andre Kumar 11 pulmonary_embolism 45914 4 3 Troponin \N
+9571 Panel Average 11 pulmonary_embolism 45914 4 \N \N \N
+8168 Jason Hom 10 pulmonary_embolism 50773 10 5 \N \N
+8645 Panel Consensus 10 pulmonary_embolism 50773 7 \N \N \N
+8679 Panel Average 10 pulmonary_embolism 50773 7 \N \N \N
+9384 Andre Kumar 10 pulmonary_embolism 50773 5 5 Blood gas \N
+9385 Jonathan Chen 10 pulmonary_embolism 50773 5 4 Blood Gas \N
+9386 Lisa Shieh 10 pulmonary_embolism 50773 5 3 \N \N
+8169 Jason Hom 10 pulmonary_embolism 50503 10 5 \N \N
+9387 Jonathan Chen 10 pulmonary_embolism 50503 5 4 Blood Gas \N
+9388 Lisa Shieh 10 pulmonary_embolism 50503 5 3 \N \N
+9389 Panel Average 10 pulmonary_embolism 50503 5 \N \N \N
+9390 Panel Consensus 10 pulmonary_embolism 50503 5 \N \N \N
+10930 Andre Kumar 10 pulmonary_embolism 50503 0 3 Blood gas \N
+8170 Jason Hom 10 pulmonary_embolism 45955 10 5 \N \N
+9391 Jonathan Chen 10 pulmonary_embolism 45955 5 4 Blood Gas \N
+9392 Lisa Shieh 10 pulmonary_embolism 45955 5 3 \N \N
+9393 Panel Average 10 pulmonary_embolism 45955 5 \N \N \N
+9394 Panel Consensus 10 pulmonary_embolism 45955 5 \N \N \N
+10931 Andre Kumar 10 pulmonary_embolism 45955 0 3 Blood Gas \N
+9395 Jason Hom 11 pulmonary_embolism 45955 5 5 \N \N
+9396 Jonathan Chen 11 pulmonary_embolism 45955 5 4 Blood Gas \N
+9397 Lisa Shieh 11 pulmonary_embolism 45955 5 3 \N \N
+9398 Panel Consensus 11 pulmonary_embolism 45955 5 \N \N \N
+9441 Panel Average 11 pulmonary_embolism 45955 5 \N \N \N
+9572 Andre Kumar 11 pulmonary_embolism 45955 4 3 Blood Gas \N
+10932 Andre Kumar 8 pulmonary_embolism 50267 0 3 Anticoagulation \N
+10933 Jason Hom 8 pulmonary_embolism 50267 0 5 \N \N
+10934 Jonathan Chen 8 pulmonary_embolism 50267 0 2 \N \N
+10935 Lisa Shieh 8 pulmonary_embolism 50267 0 3 \N \N
+10936 Panel Average 8 pulmonary_embolism 50267 0 \N \N \N
+10937 Panel Consensus 8 pulmonary_embolism 50267 0 \N \N \N
+8646 Lisa Shieh 10 pulmonary_embolism 44011 7 3 \N \N
+9399 Jonathan Chen 10 pulmonary_embolism 44011 5 4 Corticosteroids Main issue is PE, but could reasonably say it's triggering a COPD exacerbation as well
+9400 Panel Consensus 10 pulmonary_embolism 44011 5 \N \N \N
+9900 Panel Average 10 pulmonary_embolism 44011 3 \N \N \N
+10185 Andre Kumar 10 pulmonary_embolism 44011 2 3 Steroids \N
+10938 Jason Hom 10 pulmonary_embolism 44011 0 5 \N \N
+9401 Jonathan Chen 11 pulmonary_embolism 44011 5 4 Corticosteroids Main issue is PE, but could reasonably say it's triggering a COPD exacerbation as well
+9402 Lisa Shieh 11 pulmonary_embolism 44011 5 3 \N \N
+9403 Panel Consensus 11 pulmonary_embolism 44011 5 \N \N \N
+10186 Panel Average 11 pulmonary_embolism 44011 2 \N \N \N
+10367 Andre Kumar 11 pulmonary_embolism 44011 1 4 Steroids \N
+10939 Jason Hom 11 pulmonary_embolism 44011 0 5 \N \N
+8171 Jason Hom 11 pulmonary_embolism 62042 10 5 \N \N
+8884 Panel Average 11 pulmonary_embolism 62042 5 \N \N \N
+9404 Panel Consensus 11 pulmonary_embolism 62042 5 \N \N \N
+9901 Andre Kumar 11 pulmonary_embolism 62042 3 4 Procalcitonin \N
+9902 Jonathan Chen 11 pulmonary_embolism 62042 3 3 \N May be helpful for complex differential diagnosis
+9903 Lisa Shieh 11 pulmonary_embolism 62042 3 3 \N \N
+8172 Jason Hom 10 pulmonary_embolism 45759 10 5 \N \N
+8173 Panel Consensus 10 pulmonary_embolism 45759 10 \N \N \N
+8831 Panel Average 10 pulmonary_embolism 45759 6 \N \N \N
+9405 Lisa Shieh 10 pulmonary_embolism 45759 5 3 \N \N
+9904 Andre Kumar 10 pulmonary_embolism 45759 3 3 Coags \N
+10940 Jonathan Chen 10 pulmonary_embolism 45759 0 2 \N \N
+8174 Jason Hom 11 pulmonary_embolism 45759 10 5 \N \N
+8175 Panel Consensus 11 pulmonary_embolism 45759 10 \N \N \N
+8861 Panel Average 11 pulmonary_embolism 45759 6 \N \N \N
+9406 Lisa Shieh 11 pulmonary_embolism 45759 5 3 \N \N
+10187 Andre Kumar 11 pulmonary_embolism 45759 2 2 Coagulation \N
+10941 Jonathan Chen 11 pulmonary_embolism 45759 0 2 \N \N
+8176 Jason Hom 8 pulmonary_embolism 45759 10 5 \N \N
+8177 Panel Consensus 8 pulmonary_embolism 45759 10 \N \N \N
+8647 Lisa Shieh 8 pulmonary_embolism 45759 7 3 \N \N
+8832 Panel Average 8 pulmonary_embolism 45759 6 \N \N \N
+10368 Andre Kumar 8 pulmonary_embolism 45759 1 4 Coags \N
+10942 Jonathan Chen 8 pulmonary_embolism 45759 0 2 \N \N
+8178 Jason Hom 11 pulmonary_embolism 45776 10 5 \N \N
+9573 Panel Consensus 11 pulmonary_embolism 45776 4 \N \N \N
+9594 Panel Average 11 pulmonary_embolism 45776 4 \N \N \N
+10369 Andre Kumar 11 pulmonary_embolism 45776 1 2 PT/OT \N
+10943 Jonathan Chen 11 pulmonary_embolism 45776 0 2 \N \N
+10944 Lisa Shieh 11 pulmonary_embolism 45776 0 3 \N \N
+10370 Andre Kumar 8 pulmonary_embolism 45776 1 2 PT/OT \N
+10371 Panel Average 8 pulmonary_embolism 45776 1 \N \N \N
+10945 Andre Kumar 8 pulmonary_embolism 49268 0 2 Coags \N
+10946 Jason Hom 8 pulmonary_embolism 49268 0 5 \N \N
+10947 Jonathan Chen 8 pulmonary_embolism 49268 0 2 \N Probably a typo, looking for PTT
+10948 Lisa Shieh 8 pulmonary_embolism 49268 0 3 \N \N
+10949 Panel Average 8 pulmonary_embolism 49268 0 \N \N \N
+10950 Panel Consensus 8 pulmonary_embolism 49268 0 \N \N \N
+11469 Jonathan Chen 10 pulmonary_embolism 45770 0 2 \N \N
+11470 Jonathan Chen 12 pulmonary_embolism 45770 0 2 \N \N
+8179 Jason Hom 11 pulmonary_embolism 45770 10 5 \N \N
+8180 Panel Consensus 11 pulmonary_embolism 45770 10 \N \N \N
+8885 Panel Average 11 pulmonary_embolism 45770 5 \N \N \N
+9407 Lisa Shieh 11 pulmonary_embolism 45770 5 3 \N \N
+10372 Andre Kumar 11 pulmonary_embolism 45770 1 2 Coags \N
+10951 Jonathan Chen 11 pulmonary_embolism 45770 0 2 \N \N
+8181 Jason Hom 8 pulmonary_embolism 45770 10 5 \N \N
+8182 Panel Consensus 8 pulmonary_embolism 45770 10 \N \N \N
+8648 Lisa Shieh 8 pulmonary_embolism 45770 7 3 \N \N
+8833 Panel Average 8 pulmonary_embolism 45770 6 \N \N \N
+10373 Andre Kumar 8 pulmonary_embolism 45770 1 2 Coags \N
+10952 Jonathan Chen 8 pulmonary_embolism 45770 0 2 \N \N
+11459 Jonathan Chen 11 pulmonary_embolism 63730 0 2 \N Not for acute TB even if that was the diagnosis?
+8183 Jason Hom 8 pulmonary_embolism 62175 10 5 \N \N
+9471 Panel Average 8 pulmonary_embolism 62175 4 \N \N \N
+9574 Panel Consensus 8 pulmonary_embolism 62175 4 \N \N \N
+9905 Lisa Shieh 8 pulmonary_embolism 62175 3 3 \N \N
+10188 Jonathan Chen 8 pulmonary_embolism 62175 2 2 Biopsy Referral for biopsy?
+10953 Andre Kumar 8 pulmonary_embolism 62175 0 1 Consults \N
+8184 Jason Hom 12 pulmonary_embolism 45857 10 5 \N \N
+8834 Panel Consensus 12 pulmonary_embolism 45857 6 \N \N \N
+8862 Panel Average 12 pulmonary_embolism 45857 6 \N \N \N
+9408 Lisa Shieh 12 pulmonary_embolism 45857 5 3 \N \N
+10189 Andre Kumar 12 pulmonary_embolism 45857 2 1 Nebs \N
+10190 Jonathan Chen 12 pulmonary_embolism 45857 2 4 Nebs \N
+8650 Panel Average 10 pulmonary_embolism 45830 7 \N \N \N
+8651 Panel Consensus 10 pulmonary_embolism 45830 7 \N \N \N
+9575 Andre Kumar 10 pulmonary_embolism 45830 4 2 Nebs \N
+10191 Jonathan Chen 10 pulmonary_embolism 45830 2 4 Nebs \N
+8186 Jason Hom 12 pulmonary_embolism 45830 10 5 \N \N
+8652 Lisa Shieh 12 pulmonary_embolism 45830 7 3 \N \N
+8653 Panel Consensus 12 pulmonary_embolism 45830 7 \N \N \N
+8696 Panel Average 12 pulmonary_embolism 45830 6 \N \N \N
+10192 Andre Kumar 12 pulmonary_embolism 45830 2 1 Nebs \N
+10193 Jonathan Chen 12 pulmonary_embolism 45830 2 4 Nebs \N
+10194 Andre Kumar 11 pulmonary_embolism 45830 2 5 Nebs \N
+10195 Panel Average 11 pulmonary_embolism 45830 2 \N \N \N
+8187 Jonathan Chen 10 pulmonary_embolism 46030 10 5 Oxygen \N
+9409 Lisa Shieh 10 pulmonary_embolism 46030 5 3 \N \N
+10390 Panel Average 10 pulmonary_embolism 46030 1 \N \N \N
+10954 Jason Hom 10 pulmonary_embolism 46030 0 4 \N \N
+10955 Panel Consensus 10 pulmonary_embolism 46030 0 \N \N \N
+11096 Andre Kumar 10 pulmonary_embolism 46030 -3 1 NIPPV may drop cardiac output
+8188 Jonathan Chen 11 pulmonary_embolism 46030 10 5 Oxygen \N
+9410 Jason Hom 11 pulmonary_embolism 46030 5 5 \N \N
+9411 Lisa Shieh 11 pulmonary_embolism 46030 5 3 \N \N
+9946 Panel Average 11 pulmonary_embolism 46030 2 \N \N \N
+10956 Panel Consensus 11 pulmonary_embolism 46030 0 \N \N \N
+11097 Andre Kumar 11 pulmonary_embolism 46030 -3 1 NIPPV Could induce circulatory collapse
+8189 Andre Kumar 10 pulmonary_embolism 45921 10 5 Oxygen \N
+8190 Jason Hom 10 pulmonary_embolism 45921 10 5 \N \N
+8191 Jonathan Chen 10 pulmonary_embolism 45921 10 5 Oxygen \N
+8192 Lisa Shieh 10 pulmonary_embolism 45921 10 5 \N \N
+8193 Panel Average 10 pulmonary_embolism 45921 10 \N \N \N
+8194 Panel Consensus 10 pulmonary_embolism 45921 10 \N \N \N
+8195 Jason Hom 12 pulmonary_embolism 45921 10 5 \N \N
+8196 Jonathan Chen 12 pulmonary_embolism 45921 10 5 Oxygen \N
+8197 Lisa Shieh 12 pulmonary_embolism 45921 10 5 \N \N
+8198 Panel Consensus 12 pulmonary_embolism 45921 10 \N \N \N
+8223 Panel Average 12 pulmonary_embolism 45921 10 \N \N \N
+8292 Andre Kumar 12 pulmonary_embolism 45921 9 4 Oxygen \N
+11413 Jonathan Chen 11 pulmonary_embolism 45921 10 5 Oxygen \N
+9906 Jonathan Chen 11 pulmonary_embolism 46336 3 3 Respiratory Culture \N
+9907 Lisa Shieh 11 pulmonary_embolism 46336 3 3 \N \N
+10196 Andre Kumar 11 pulmonary_embolism 46336 2 2 Respiratory Culture \N
+10197 Panel Consensus 11 pulmonary_embolism 46336 2 \N \N \N
+10231 Panel Average 11 pulmonary_embolism 46336 2 \N \N \N
+10957 Jason Hom 11 pulmonary_embolism 46336 0 5 \N \N
+11409 Jonathan Chen 11 pulmonary_embolism 46179 3 3 Respiratory Culture \N
+8199 Jason Hom 11 pulmonary_embolism 48544 10 5 \N \N
+9412 Panel Average 11 pulmonary_embolism 48544 5 \N \N \N
+9413 Panel Consensus 11 pulmonary_embolism 48544 5 \N \N \N
+9908 Jonathan Chen 11 pulmonary_embolism 48544 3 3 Respiratory Culture \N
+9909 Lisa Shieh 11 pulmonary_embolism 48544 3 3 \N \N
+10198 Andre Kumar 11 pulmonary_embolism 48544 2 4 Respiratory Culture \N
+11396 Jonathan Chen 10 pulmonary_embolism 62023 3 4 Respiratory Virus Screen \N
+11394 Jonathan Chen 12 pulmonary_embolism 62023 3 4 Respiratory Virus Screen \N
+8200 Jason Hom 11 pulmonary_embolism 62023 10 5 \N \N
+9414 Panel Consensus 11 pulmonary_embolism 62023 5 \N \N \N
+9595 Panel Average 11 pulmonary_embolism 62023 4 \N \N \N
+9910 Jonathan Chen 11 pulmonary_embolism 62023 3 4 Respiratory Virus Screen \N
+10374 Andre Kumar 11 pulmonary_embolism 62023 1 4 Respiratory Viral Panel \N
+8201 Jason Hom 10 pulmonary_embolism 63923 10 5 \N \N
+8863 Panel Average 10 pulmonary_embolism 63923 6 \N \N \N
+9415 Lisa Shieh 10 pulmonary_embolism 63923 5 3 \N \N
+9416 Panel Consensus 10 pulmonary_embolism 63923 5 \N \N \N
+9911 Jonathan Chen 10 pulmonary_embolism 63923 3 4 Respiratory Virus Screen \N
+10199 Andre Kumar 10 pulmonary_embolism 63923 2 5 Respiratory Viral Panel \N
+8202 Jason Hom 11 pulmonary_embolism 63923 10 5 \N \N
+8886 Panel Average 11 pulmonary_embolism 63923 5 \N \N \N
+9417 Lisa Shieh 11 pulmonary_embolism 63923 5 3 \N \N
+9418 Panel Consensus 11 pulmonary_embolism 63923 5 \N \N \N
+9912 Jonathan Chen 11 pulmonary_embolism 63923 3 4 Respiratory Virus Screen \N
+10375 Andre Kumar 11 pulmonary_embolism 63923 1 4 Respiratory Viral Panel \N
+11380 Jonathan Chen 12 pulmonary_embolism 60178 10 5 Anticoagulation \N
+11406 Jonathan Chen 11 pulmonary_embolism 60178 10 5 Anticoagulation \N
+11424 Jonathan Chen 10 pulmonary_embolism 41796 0 5 \N Presenting Symptom Diagnosis
+10200 Andre Kumar 10 pulmonary_embolism 44198 2 2 Fluids \N
+10201 Panel Average 10 pulmonary_embolism 44198 2 \N \N \N
+11418 Jonathan Chen 12 pulmonary_embolism 44198 0 2 IVF \N
+11454 Jonathan Chen 8 pulmonary_embolism 44313 0 2 \N Nebs, but this is more for long term use
+8203 Jason Hom 10 pulmonary_embolism 45870 10 5 \N \N
+8697 Panel Average 10 pulmonary_embolism 45870 6 \N \N \N
+8835 Panel Consensus 10 pulmonary_embolism 45870 6 \N \N \N
+9419 Jonathan Chen 10 pulmonary_embolism 45870 5 4 Troponin \N
+9420 Lisa Shieh 10 pulmonary_embolism 45870 5 3 \N \N
+9576 Andre Kumar 10 pulmonary_embolism 45870 4 4 Troponin \N
+11414 Jonathan Chen 12 pulmonary_embolism 45870 5 4 Troponin \N
+8204 Jason Hom 11 pulmonary_embolism 45870 10 5 \N \N
+8836 Panel Consensus 11 pulmonary_embolism 45870 6 \N \N \N
+8864 Panel Average 11 pulmonary_embolism 45870 6 \N \N \N
+9421 Jonathan Chen 11 pulmonary_embolism 45870 5 4 Troponin \N
+9422 Lisa Shieh 11 pulmonary_embolism 45870 5 3 \N \N
+10202 Andre Kumar 11 pulmonary_embolism 45870 2 3 Troponin \N
+8205 Jason Hom 8 pulmonary_embolism 45870 10 5 \N \N
+8837 Panel Consensus 8 pulmonary_embolism 45870 6 \N \N \N
+8865 Panel Average 8 pulmonary_embolism 45870 6 \N \N \N
+9423 Jonathan Chen 8 pulmonary_embolism 45870 5 4 Troponin \N
+9424 Lisa Shieh 8 pulmonary_embolism 45870 5 3 \N \N
+10203 Andre Kumar 8 pulmonary_embolism 45870 2 2 Troponin \N
+11313 Jonathan Chen 11 pulmonary_embolism 45945 0 2 \N \N
+11458 Jonathan Chen 11 pulmonary_embolism 65672 2 2 DVT US Could be good early diagnosis, but here the diagnosis of PE has likely already been made given on anticoag. So not sure what the point of adding on DVT US. They'll find DVT, but already diagnosed PE anyway.
+8206 Jason Hom 8 pulmonary_embolism 65672 10 5 \N \N
+9577 Panel Average 8 pulmonary_embolism 65672 4 \N \N \N
+9578 Panel Consensus 8 pulmonary_embolism 65672 4 \N \N \N
+10204 Andre Kumar 8 pulmonary_embolism 65672 2 2 Imaging "IF CTA not done otherwise -2 points"
+10205 Jonathan Chen 8 pulmonary_embolism 65672 2 2 DVT US Could be good early diagnosis, but here the diagnosis of PE has likely already been made given on anticoag. So not sure what the point of adding on DVT US. They'll find DVT, but already diagnosed PE anyway.
+10959 Lisa Shieh 8 pulmonary_embolism 65672 0 3 \N \N
+11417 Jonathan Chen 11 pulmonary_embolism 65656 2 2 DVT US Could be good early diagnosis, but here the diagnosis of PE has likely already been made given on anticoag. So not sure what the point of adding on DVT US. They'll find DVT, but already diagnosed PE anyway.
+11318 Jonathan Chen 11 pulmonary_embolism 65692 2 2 DVT US Could be good early diagnosis, but here the diagnosis of PE has likely already been made given on anticoag. So not sure what the point of adding on DVT US. They'll find DVT, but already diagnosed PE anyway.
+11254 Jonathan Chen 10 pulmonary_embolism 45751 0 2 \N \N
+10376 Andre Kumar 11 pulmonary_embolism 45751 1 4 Urinalysis \N
+10404 Panel Average 11 pulmonary_embolism 45751 0 \N \N \N
+10960 Jason Hom 11 pulmonary_embolism 45751 0 5 \N \N
+10961 Jonathan Chen 11 pulmonary_embolism 45751 0 2 \N \N
+10962 Lisa Shieh 11 pulmonary_embolism 45751 0 3 \N \N
+10963 Panel Consensus 11 pulmonary_embolism 45751 0 \N \N \N
+11382 Jonathan Chen 11 pulmonary_embolism 45911 0 2 \N Process
+8207 Jason Hom 8 pulmonary_embolism 46113 10 5 \N \N
+8887 Panel Average 8 pulmonary_embolism 46113 5 \N \N \N
+9425 Lisa Shieh 8 pulmonary_embolism 46113 5 3 \N \N
+9426 Panel Consensus 8 pulmonary_embolism 46113 5 \N \N \N
+10377 Andre Kumar 8 pulmonary_embolism 46113 1 1 Oxygen \N
+10964 Jonathan Chen 8 pulmonary_embolism 46113 0 2 \N \N
+10378 Andre Kumar 10 pulmonary_embolism 45766 1 2 Weight \N
+10379 Panel Average 10 pulmonary_embolism 45766 1 \N \N \N
+8208 Jason Hom 10 pulmonary_embolism 45818 10 5 \N \N
+8209 Panel Consensus 10 pulmonary_embolism 45818 10 \N \N \N
+8427 Jonathan Chen 10 pulmonary_embolism 45818 8 4 CXR \N
+8449 Panel Average 10 pulmonary_embolism 45818 8 \N \N \N
+8654 Lisa Shieh 10 pulmonary_embolism 45818 7 3 \N \N
+8838 Andre Kumar 10 pulmonary_embolism 45818 6 3 Imaging \N
+8210 Jason Hom 11 pulmonary_embolism 45818 10 5 \N \N
+8211 Panel Consensus 11 pulmonary_embolism 45818 10 \N \N \N
+8428 Jonathan Chen 11 pulmonary_embolism 45818 8 4 CXR \N
+8467 Panel Average 11 pulmonary_embolism 45818 7 \N \N \N
+8655 Lisa Shieh 11 pulmonary_embolism 45818 7 3 \N \N
+9427 Andre Kumar 11 pulmonary_embolism 45818 5 4 Imaging \N
+8212 Jason Hom 10 pulmonary_embolism 50200 10 5 \N \N
+8213 Panel Consensus 10 pulmonary_embolism 50200 10 \N \N \N
+8429 Jonathan Chen 10 pulmonary_embolism 50200 8 4 CXR \N
+8656 Panel Average 10 pulmonary_embolism 50200 7 \N \N \N
+8839 Andre Kumar 10 pulmonary_embolism 50200 6 3 Imaging \N
+9428 Lisa Shieh 10 pulmonary_embolism 50200 5 3 \N \N
+8214 Jason Hom 10 pulmonary_embolism 45801 10 5 \N \N
+8215 Lisa Shieh 10 pulmonary_embolism 45801 10 5 \N \N
+8216 Panel Consensus 10 pulmonary_embolism 45801 10 \N \N \N
+8299 Panel Average 10 pulmonary_embolism 45801 9 \N \N \N
+8430 Jonathan Chen 10 pulmonary_embolism 45801 8 4 CXR \N
+8840 Andre Kumar 10 pulmonary_embolism 45801 6 3 Imaging \N
+8217 Jason Hom 11 pulmonary_embolism 45801 10 5 \N \N
+8218 Lisa Shieh 11 pulmonary_embolism 45801 10 3 \N \N
+8219 Panel Consensus 11 pulmonary_embolism 45801 10 \N \N \N
+8332 Panel Average 11 pulmonary_embolism 45801 8 \N \N \N
+8431 Jonathan Chen 11 pulmonary_embolism 45801 8 4 CXR \N
+9429 Andre Kumar 11 pulmonary_embolism 45801 5 4 Imaging \N
+11479 Post-Panel Consolidation 40 atrial_fibrillation 35968 0 0 \N Negative points seems too severe here. Anti-arrhythmic can be option in unstable Afib if awaiting or failed DCCV. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1861334/
+11480 Post-Panel Consolidation 43 atrial_fibrillation 35968 0 0 \N Negative points seems too severe here. Anti-arrhythmic can be option in unstable Afib if awaiting or failed DCCV. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1861334/
+11481 Post-Panel Consolidation 43 atrial_fibrillation 44352 0 0 \N Negative points seems too severe here. Anti-arrhythmic can be option in unstable Afib if awaiting or failed DCCV. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1861334/
+11482 Post-Panel Consolidation 40 atrial_fibrillation 45887 3 0 \N Why different per initial vs. worse state?
+11483 Post-Panel Consolidation 43 atrial_fibrillation 45887 3 0 \N Why different per initial vs. worse state?
+11484 Post-Panel Consolidation 40 atrial_fibrillation 62176 7 0 Echo \N
+11485 Post-Panel Consolidation 43 atrial_fibrillation 62176 7 0 Echo Okay for workup, but not while unstable?
+11486 Post-Panel Consolidation 40 atrial_fibrillation 45963 -4 0 TEEcho Not while unstable
+11487 Post-Panel Consolidation 43 atrial_fibrillation 45963 -4 0 TEEcho \N
+11488 Post-Panel Consolidation 41 atrial_fibrillation 61832 7 0 Echo \N
+11489 Post-Panel Consolidation 40 atrial_fibrillation 61832 7 0 Echo Good for Afib workup, but less points if doing it while unstable?
+11490 Post-Panel Consolidation 40 atrial_fibrillation 44004 0 0 \N \N
+11491 Post-Panel Consolidation 41 atrial_fibrillation 44004 0 0 \N Positive points for furosemide here, but negative points for initial state. But also give negative points for giving IV Fluids?
+11492 Post-Panel Consolidation 43 atrial_fibrillation 44004 0 0 \N \N
+11493 Post-Panel Consolidation 16 gi_bleed 45858 -5 0 CT Abdomen Treat all CT Abd/Pelvis orders as comparable for simplicity, so why different scores? Weird cirrhosis diagnostic, but maybe people are looking for bleeding vessel?
+11494 Post-Panel Consolidation 14 gi_bleed 45852 -5 0 CT Abdomen Treat all CT Abd/Pelvis orders as comparable for simplicity, so why different scores? Weird cirrhosis diagnostic, but maybe people are looking for bleeding vessel?
+11495 Post-Panel Consolidation 2 gi_bleed 49836 -5 0 CT Abdomen Treat all CT Abd/Pelvis orders as comparable for simplicity, so why different scores? Weird cirrhosis diagnostic, but maybe people are looking for bleeding vessel?
+11496 Post-Panel Consolidation 30 meningitis 45983 -3 0 CT Head \N
+11497 Post-Panel Consolidation 31 meningitis 45983 -3 0 CT Head Gave -3 points if CT head before treatment, but what about after treatment?
+11498 Post-Panel Consolidation 30 meningitis 50241 -3 0 CT Head \N
+11499 Post-Panel Consolidation 40 atrial_fibrillation 45977 0 0 \N Standard Process
+11500 Post-Panel Consolidation 41 atrial_fibrillation 45977 0 0 \N Standard Process
+11501 Post-Panel Consolidation 40 atrial_fibrillation 45919 1 0 Blood Gas Override for consistency with others
+11502 Post-Panel Consolidation 41 atrial_fibrillation 45793 6 0 CBC Override for consistency with other choices across states
+11503 Post-Panel Consolidation 40 atrial_fibrillation 50400 0 0 \N \N
+11504 Post-Panel Consolidation 43 atrial_fibrillation 50400 0 0 \N \N
+11505 Post-Panel Consolidation 40 atrial_fibrillation 49251 0 0 \N Override, neutralize non-procedure consults
+11506 Post-Panel Consolidation 41 atrial_fibrillation 49251 0 0 \N Override, neutralize non-procedure consults
+11507 Post-Panel Consolidation 43 atrial_fibrillation 49251 0 0 \N Override, neutralize non-procedure consults
+11508 Post-Panel Consolidation 40 atrial_fibrillation 45811 2 0 \N Override, excess points for non-action
+11509 Post-Panel Consolidation 43 atrial_fibrillation 45811 2 0 \N Override, excess points for non-action
+11510 Post-Panel Consolidation 40 atrial_fibrillation 46160 0 0 \N Standard process
+11511 Post-Panel Consolidation 40 atrial_fibrillation 44297 3 0 \N Override, less point differential for initial vs. worse state
+11512 Post-Panel Consolidation 40 atrial_fibrillation 44359 8 0 Anticoagulation Override consistent points
+11513 Post-Panel Consolidation 41 atrial_fibrillation 44359 8 0 Anticoagulation Override consistent points
+11514 Post-Panel Consolidation 40 atrial_fibrillation 46183 0 0 \N Override, standard process after heparin order
+11515 Post-Panel Consolidation 40 atrial_fibrillation 63714 0 0 \N Override, standard process after heparin order
+11516 Post-Panel Consolidation 43 atrial_fibrillation 61837 3 0 Lipids \N
+11517 Post-Panel Consolidation 41 atrial_fibrillation 45763 7 0 Metabolic Panel \N
+11518 Post-Panel Consolidation 40 atrial_fibrillation 45864 0 0 Oxygen Override, no hypoxia?
+11519 Post-Panel Consolidation 40 atrial_fibrillation 45900 0 0 Oxygen Override, no hypoxia?
+11520 Post-Panel Consolidation 40 atrial_fibrillation 61823 0 0 \N Override, standard process
+11521 Post-Panel Consolidation 40 atrial_fibrillation 46090 0 0 \N Override, embedded in CBC or part of Heparin protocol
+11522 Post-Panel Consolidation 40 atrial_fibrillation 45955 3 0 Lactate Override to match lactate order
+11523 Post-Panel Consolidation 43 atrial_fibrillation 45955 3 0 Lactate Override to match lactate order
+11524 Post-Panel Consolidation 43 atrial_fibrillation 49995 5 0 Cardiology Override, treat same as Cardiology consult
+11525 Post-Panel Consolidation 40 atrial_fibrillation 60178 3 0 Anticoagulation-Oral Oral admin, is this too slow, and so should be worth less points?
+11526 Post-Panel Consolidation 41 atrial_fibrillation 60178 3 0 Anticoagulation-Oral Oral admin, is this too slow, and so should be worth less points?
+11527 Post-Panel Consolidation 43 atrial_fibrillation 60178 3 0 Anticoagulation-Oral Oral admin, is this too slow, and so should be worth less points?
+11528 Post-Panel Consolidation 40 atrial_fibrillation 63725 3 0 Lactate Override for consistency
+11529 Post-Panel Consolidation 40 atrial_fibrillation 45818 3 0 \N Override to match Portable CXR, since this can be a portable order too
+11530 Post-Panel Consolidation 43 atrial_fibrillation 45818 3 0 \N Override to match Portable CXR, since this can be a portable order too
+11531 Post-Panel Consolidation 15 gi_bleed 45932 5 0 Hepatitis Panel Override to match panel
+11532 Post-Panel Consolidation 16 gi_bleed 45814 0 0 \N Override, standard process
+11533 Post-Panel Consolidation 14 gi_bleed 61982 0 0 \N Override, standard process
+11534 Post-Panel Consolidation 15 gi_bleed 61982 0 0 \N Override, standard process
+11535 Post-Panel Consolidation 15 gi_bleed 44275 8 0 IVF Override to match panel grade
+11536 Post-Panel Consolidation 14 gi_bleed 48513 2 0 \N Override, consistencu with Indirect Bilirubin
+11537 Post-Panel Consolidation 15 gi_bleed 45823 10 0 Type and Screen Override, match panel, though this seems like too much for what will likely be part of standard tranfusion process orders
+11538 Post-Panel Consolidation 14 gi_bleed 44439 8 0 IVF Override to match panel grade
+11539 Post-Panel Consolidation 15 gi_bleed 44439 8 0 IVF Override to match panel grade
+11540 Post-Panel Consolidation 15 gi_bleed 50400 0 0 \N Neutralize consults
+11541 Post-Panel Consolidation 15 gi_bleed 61323 2 0 \N Override for consistency and avoid excess points for worse state compensation
+11542 Post-Panel Consolidation 14 gi_bleed 49207 0 0 \N Override, standard process
+11543 Post-Panel Consolidation 14 gi_bleed 46160 0 0 \N Override, standard process
+11544 Post-Panel Consolidation 14 gi_bleed 63759 10 0 RBC Override, seems typo on score?
+11545 Post-Panel Consolidation 15 gi_bleed 71083 0 0 \N Override, non-specific process / consult
+11546 Post-Panel Consolidation 2 gi_bleed 45771 9 0 Metabolic Panel \N
+11547 Post-Panel Consolidation 15 gi_bleed 45832 7 0 Intubation ?Mechanical ventilation? Airway protection?
+11548 Post-Panel Consolidation 14 gi_bleed 63725 2 0 Lactate Override to match others
+11549 Post-Panel Consolidation 14 gi_bleed 61993 8 0 Coagulopathy Correction \N
+11550 Post-Panel Consolidation 15 gi_bleed 61993 8 0 Coagulopathy Correction \N
+11551 Post-Panel Consolidation 16 gi_bleed 61993 8 0 Coagulopathy Correction \N
+11552 Post-Panel Consolidation 14 gi_bleed 45870 0 0 Troponin Hemodynamic stability assessment?
+11553 Post-Panel Consolidation 14 gi_bleed 50372 0 0 \N Override, standard process
+11554 Post-Panel Consolidation 30 meningitis 56492 5 0 Pain Control Minor points for symptom control?
+11555 Post-Panel Consolidation 31 meningitis 56492 5 0 Pain Control Minor points for symptom control?
+11556 Post-Panel Consolidation 33 meningitis 44281 5 0 Pain Control Minor points for symptom control?
+11557 Post-Panel Consolidation 30 meningitis 44310 5 0 Pain Control Minor points for symptom control?
+11558 Post-Panel Consolidation 31 meningitis 44310 5 0 Pain Control Minor points for symptom control?
+11559 Post-Panel Consolidation 31 meningitis 61864 5 0 HIV Test Override, match other HIV tests
+11560 Post-Panel Consolidation 30 meningitis 45966 7 0 CBC \N
+11561 Post-Panel Consolidation 31 meningitis 48880 5 0 \N Panel of CSF tests, should get point for each? Adds up to more than value of antibiotics
+11562 Post-Panel Consolidation 31 meningitis 48980 0 0 \N Override, neutralize non-procedure consults
+11563 Post-Panel Consolidation 33 meningitis 48980 0 0 \N Override, neutralize non-procedure consults
+11564 Post-Panel Consolidation 31 meningitis 49207 0 0 \N Override, standard process
+11565 Post-Panel Consolidation 31 meningitis 49083 1 0 \N Late to be drawing culture if already got antibiotics
+11566 Post-Panel Consolidation 30 meningitis 44237 0 0 \N Mix of scores, as doesn't penetrate CNS. Leave as 0 for ambiguous, not directly harmful
+11567 Post-Panel Consolidation 30 meningitis 44252 0 0 \N Mix of scores, as doesn't penetrate CNS. Leave as 0 for ambiguous, not directly harmful
+11568 Post-Panel Consolidation 31 meningitis 48577 5 0 \N \N
+11569 Post-Panel Consolidation 30 meningitis 46006 0 0 \N Override, let be subsumed by Culture + Gram Stain order
+11570 Post-Panel Consolidation 33 meningitis 46006 0 0 \N Override, let be subsumed by Culture + Gram Stain order
+11571 Post-Panel Consolidation 33 meningitis 49109 7 0 HSV CSF \N
+11572 Post-Panel Consolidation 30 meningitis 48954 0 0 \N Standard process
+11573 Post-Panel Consolidation 30 meningitis 50510 5 0 \N Reasonable, though not standard guidelines to check
+11574 Post-Panel Consolidation 30 meningitis 63811 0 0 \N Override, let points be from respective test orders
+11575 Post-Panel Consolidation 31 meningitis 63811 0 0 \N Override, let points be from respective test orders
+11576 Post-Panel Consolidation 33 meningitis 63811 0 0 \N Override, let points be from respective test orders
+11577 Post-Panel Consolidation 30 meningitis 62167 0 0 \N Override, let points be from respective test orders
+11578 Post-Panel Consolidation 33 meningitis 62167 0 0 \N Override, let points be from respective test orders
+11579 Post-Panel Consolidation 30 meningitis 45798 5 0 Pregnancy Test \N
+11580 Post-Panel Consolidation 31 meningitis 49020 5 0 \N \N
+11581 Post-Panel Consolidation 30 meningitis 45759 5 0 Coags Override, match DIC screen
+11582 Post-Panel Consolidation 30 meningitis 45770 5 0 Coags Override, match DIC screen
+11583 Post-Panel Consolidation 31 meningitis 62103 5 0 HIV Test \N
+11584 Post-Panel Consolidation 30 meningitis 48586 0 0 \N \N
+11585 Post-Panel Consolidation 30 meningitis 45801 3 0 CXR General workup for fever/infection, though symptoms not suggestive of pneumonia
+11586 Post-Panel Consolidation 5000 neutropenic 56492 4 0 Acetaminophen \N
+11587 Post-Panel Consolidation 5003 neutropenic 44281 4 0 Acetaminophen \N
+11588 Post-Panel Consolidation 5000 neutropenic 48829 0 0 \N \N
+11589 Post-Panel Consolidation 5003 neutropenic 45901 10 0 Blood Cultures Less points if after antibiotics? May not be able to reliably distinguish if batch order
+11590 Post-Panel Consolidation 5003 neutropenic 45752 10 0 Blood Cultures Less points if after antibiotics? May not be able to reliably distinguish if batch order
+11591 Post-Panel Consolidation 5003 neutropenic 44439 10 0 IVF \N
+11592 Post-Panel Consolidation 5002 neutropenic 45793 8 0 CBC Override for consistency with panel
+11593 Post-Panel Consolidation 5003 neutropenic 45793 8 0 CBC \N
+11594 Post-Panel Consolidation 5003 neutropenic 45788 8 0 CBC \N
+11595 Post-Panel Consolidation 5002 neutropenic 45966 8 0 CBC \N
+11596 Post-Panel Consolidation 5003 neutropenic 48980 0 0 \N Neutralize non-procedure consults
+11597 Post-Panel Consolidation 5002 neutropenic 49228 0 0 \N Neutralize non-procedure consults
+11598 Post-Panel Consolidation 5003 neutropenic 49054 5 0 \N Neutropenic, not droplet isolation. Override to match panel. Could be on initial isolation pending viral screen
+11599 Post-Panel Consolidation 5000 neutropenic 45806 3 0 \N Match panel
+11600 Post-Panel Consolidation 5003 neutropenic 45806 3 0 \N Match panel
+11601 Post-Panel Consolidation 5003 neutropenic 45763 10 0 Metabolic Panel Match panel
+11602 Post-Panel Consolidation 5003 neutropenic 45771 10 0 Metabolic Panel Match panel
+11603 Post-Panel Consolidation 5003 neutropenic 45955 10 0 Lactate Match panel
+11604 Post-Panel Consolidation 5000 neutropenic 45759 4 0 Coags Match panel
+11605 Post-Panel Consolidation 5003 neutropenic 45759 4 0 Coags Match panel
+11606 Post-Panel Consolidation 5000 neutropenic 45770 4 0 Coags Match panel
+11607 Post-Panel Consolidation 5003 neutropenic 45770 4 0 Coags Match panel
+11608 Post-Panel Consolidation 5003 neutropenic 62023 6 0 Respiratory Virus Screen Match panel
+11609 Post-Panel Consolidation 5003 neutropenic 63923 6 0 Respiratory Virus Screen Match panel
+11610 Post-Panel Consolidation 5002 neutropenic 63725 10 0 Lactate Match panel
+11611 Post-Panel Consolidation 5003 neutropenic 45995 3 0 \N Match panel
+11612 Post-Panel Consolidation 10 pulmonary_embolism 45977 0 0 \N Override, standard process
+11613 Post-Panel Consolidation 11 pulmonary_embolism 45977 0 0 \N Override, standard process
+11614 Post-Panel Consolidation 11 pulmonary_embolism 45814 0 0 \N Override, standard process
+11615 Post-Panel Consolidation 10 pulmonary_embolism 46309 7 0 Nebs Match panel
+11616 Post-Panel Consolidation 11 pulmonary_embolism 46309 7 0 Nebs Match panel
+11617 Post-Panel Consolidation 10 pulmonary_embolism 44349 7 0 Nebs Match panel
+11618 Post-Panel Consolidation 11 pulmonary_embolism 44349 7 0 Nebs Match panel
+11619 Post-Panel Consolidation 10 pulmonary_embolism 60175 7 0 Nebs Match panel
+11620 Post-Panel Consolidation 11 pulmonary_embolism 60175 7 0 Nebs Match panel
+11621 Post-Panel Consolidation 12 pulmonary_embolism 60175 7 0 Nebs Match panel
+11622 Post-Panel Consolidation 10 pulmonary_embolism 47146 4 0 Aspirin Match panel
+11623 Post-Panel Consolidation 8 pulmonary_embolism 44206 4 0 Aspirin \N
+11624 Post-Panel Consolidation 8 pulmonary_embolism 45793 10 0 CBC Match panel, though seems high
+11625 Post-Panel Consolidation 12 pulmonary_embolism 45793 10 0 CBC Match panel, though seems high
+11626 Post-Panel Consolidation 8 pulmonary_embolism 45788 10 0 CBC Match panel, though seems high
+11627 Post-Panel Consolidation 10 pulmonary_embolism 65695 0 0 \N Override, neutralize non-procedural consults
+11628 Post-Panel Consolidation 11 pulmonary_embolism 65695 0 0 \N Override, neutralize non-procedural consults
+11629 Post-Panel Consolidation 12 pulmonary_embolism 61323 0 0 \N Override, neutralize non-procedural consults. Patient wouldn't qualify for ICU transfer?
+11630 Post-Panel Consolidation 12 pulmonary_embolism 48502 4 0 Biopsy Consult, but maybe thinking about IR procedure. Not necessary for initial PE treatment, but maybe thinking about biopsy already
+11631 Post-Panel Consolidation 10 pulmonary_embolism 49207 0 0 \N Override, neutralize non-procedural consults
+11632 Post-Panel Consolidation 11 pulmonary_embolism 49228 0 0 \N Override, neutralize non-procedural consults
+11633 Post-Panel Consolidation 8 pulmonary_embolism 49228 0 0 \N Override, neutralize non-procedural consults
+11634 Post-Panel Consolidation 11 pulmonary_embolism 49073 7 0 CT Chest Override, still offer points, as CT Chest order details could allow specification of PE / contrast protocol
+11635 Post-Panel Consolidation 8 pulmonary_embolism 46008 2 0 NPO Override for consistency with other NPO orders
+11636 Post-Panel Consolidation 12 pulmonary_embolism 45866 7 0 \N Match panel
+11637 Post-Panel Consolidation 10 pulmonary_embolism 62176 6 0 Echo Match panel
+11638 Post-Panel Consolidation 11 pulmonary_embolism 62176 6 0 Echo Match panel
+11639 Post-Panel Consolidation 11 pulmonary_embolism 46183 0 0 \N Override, just count primary anticoagulation order
+11640 Post-Panel Consolidation 10 pulmonary_embolism 49301 7 0 Blood Gas Match panel
+11641 Post-Panel Consolidation 8 pulmonary_embolism 45806 5 0 \N Match panel
+11642 Post-Panel Consolidation 10 pulmonary_embolism 45806 5 0 \N Match panel
+11643 Post-Panel Consolidation 12 pulmonary_embolism 45806 5 0 \N Match panel
+11644 Post-Panel Consolidation 8 pulmonary_embolism 45771 10 0 Metabolic Panel \N
+11645 Post-Panel Consolidation 12 pulmonary_embolism 45771 10 0 Metabolic Panel \N
+11646 Post-Panel Consolidation 11 pulmonary_embolism 46090 0 0 \N Override, embed to heparin order
+11647 Post-Panel Consolidation 11 pulmonary_embolism 45776 0 0 \N Override, process
+11648 Post-Panel Consolidation 10 pulmonary_embolism 45770 10 0 Coags Match panel. Monitor in prep for anticoagulation?
+11649 Post-Panel Consolidation 12 pulmonary_embolism 45770 10 0 Coags \N
+11650 Post-Panel Consolidation 12 pulmonary_embolism 45857 0 0 \N Override, process order for actual nebs medication order
+11651 Post-Panel Consolidation 10 pulmonary_embolism 45830 0 0 \N Override, process order for actual nebs medication order
+11652 Post-Panel Consolidation 12 pulmonary_embolism 45830 0 0 \N Override, process order for actual nebs medication order
+11653 Post-Panel Consolidation 11 pulmonary_embolism 46179 5 0 Respiratory Culture \N
+11654 Post-Panel Consolidation 10 pulmonary_embolism 62023 5 0 Respiratory Virus Screen \N
+11655 Post-Panel Consolidation 12 pulmonary_embolism 62023 5 0 Respiratory Virus Screen \N
+11656 Post-Panel Consolidation 12 pulmonary_embolism 45870 6 0 Troponin \N
+11657 Post-Panel Consolidation 11 pulmonary_embolism 65672 4 0 DVT US Could be good early diagnosis, but here the diagnosis of PE has likely already been made given on anticoag. So not sure what the point of adding on DVT US. They'll find DVT, but already diagnosed PE anyway.
+11658 Post-Panel Consolidation 11 pulmonary_embolism 65656 4 0 DVT US Could be good early diagnosis, but here the diagnosis of PE has likely already been made given on anticoag. So not sure what the point of adding on DVT US. They'll find DVT, but already diagnosed PE anyway.
+11659 Post-Panel Consolidation 11 pulmonary_embolism 65692 4 0 DVT US Could be good early diagnosis, but here the diagnosis of PE has likely already been made given on anticoag. So not sure what the point of adding on DVT US. They'll find DVT, but already diagnosed PE anyway.
+11660 Post-Panel Consolidation 8 pulmonary_embolism 46113 0 0 \N Process?
+11661 Post-Panel Consolidation 43 atrial_fibrillation 46605 0 1 \N Irregular rhythm, so adenosine not so relevant
+11662 Post-Panel Consolidation 41 atrial_fibrillation 65641 0 1 \N Standard Process
+11663 Post-Panel Consolidation 41 atrial_fibrillation 47146 2 1 Aspirin \N
+11664 Post-Panel Consolidation 40 atrial_fibrillation 44206 2 1 Aspirin \N
+11665 Post-Panel Consolidation 41 atrial_fibrillation 44206 2 1 Aspirin \N
+11666 Post-Panel Consolidation 43 atrial_fibrillation 44206 2 1 Aspirin \N
+11667 Post-Panel Consolidation 43 atrial_fibrillation 44315 1 1 Aspirin \N
+11668 Post-Panel Consolidation 41 atrial_fibrillation 44240 2 1 \N \N
+11669 Post-Panel Consolidation 43 atrial_fibrillation 45901 1 1 \N \N
+11670 Post-Panel Consolidation 40 atrial_fibrillation 41870 0 1 \N \N
+11671 Post-Panel Consolidation 40 atrial_fibrillation 45827 8 1 \N \N
+11672 Post-Panel Consolidation 41 atrial_fibrillation 45827 8 1 \N \N
+11673 Post-Panel Consolidation 40 atrial_fibrillation 45793 6 1 CBC \N
+11674 Post-Panel Consolidation 43 atrial_fibrillation 45793 6 1 CBC \N
+11675 Post-Panel Consolidation 40 atrial_fibrillation 45788 6 1 CBC \N
+11676 Post-Panel Consolidation 41 atrial_fibrillation 45788 6 1 CBC \N
+11677 Post-Panel Consolidation 41 atrial_fibrillation 65695 0 1 \N \N
+11678 Post-Panel Consolidation 43 atrial_fibrillation 61323 6 1 \N \N
+11679 Post-Panel Consolidation 40 atrial_fibrillation 50098 -5 1 CT Head \N
+11680 Post-Panel Consolidation 40 atrial_fibrillation 45983 -5 1 CT Head \N
+11681 Post-Panel Consolidation 40 atrial_fibrillation 49965 -5 1 CT Head \N
+11682 Post-Panel Consolidation 40 atrial_fibrillation -100 10 1 \N \N
+11683 Post-Panel Consolidation 43 atrial_fibrillation -100 10 1 \N \N
+11684 Post-Panel Consolidation 40 atrial_fibrillation 44353 -2 1 \N \N
+11685 Post-Panel Consolidation 41 atrial_fibrillation 45824 1 1 \N \N
+11686 Post-Panel Consolidation 41 atrial_fibrillation 45811 2 1 \N \N
+11687 Post-Panel Consolidation 40 atrial_fibrillation 46674 -4 1 \N \N
+11688 Post-Panel Consolidation 43 atrial_fibrillation 46674 -4 1 \N \N
+11689 Post-Panel Consolidation 40 atrial_fibrillation 35846 -8 1 \N \N
+11690 Post-Panel Consolidation 43 atrial_fibrillation 35846 -9 1 \N \N
+11691 Post-Panel Consolidation 43 atrial_fibrillation 44393 -8 1 \N \N
+11692 Post-Panel Consolidation 43 atrial_fibrillation 44251 -8 1 \N \N
+11693 Post-Panel Consolidation 40 atrial_fibrillation 44204 -2 1 \N \N
+11694 Post-Panel Consolidation 43 atrial_fibrillation 45941 2 1 \N \N
+11695 Post-Panel Consolidation 40 atrial_fibrillation 45866 9 1 \N \N
+11696 Post-Panel Consolidation 41 atrial_fibrillation 45866 5 1 \N Okay to have less points here, to emphasize missed opportunity initially?
+11697 Post-Panel Consolidation 43 atrial_fibrillation 45866 9 1 \N \N
+11698 Post-Panel Consolidation 43 atrial_fibrillation 44248 -8 1 \N \N
+11699 Post-Panel Consolidation 43 atrial_fibrillation 44297 2 1 \N \N
+11700 Post-Panel Consolidation 40 atrial_fibrillation 46230 -2 1 \N \N
+11701 Post-Panel Consolidation 40 atrial_fibrillation 50343 0 1 \N \N
+11702 Post-Panel Consolidation 41 atrial_fibrillation 45797 3 1 \N \N
+11703 Post-Panel Consolidation 43 atrial_fibrillation 44359 8 1 Anticoagulation \N
+11704 Post-Panel Consolidation 40 atrial_fibrillation 49301 1 1 Blood Gas \N
+11705 Post-Panel Consolidation 40 atrial_fibrillation 45888 1 1 Blood Gas \N
+11706 Post-Panel Consolidation 43 atrial_fibrillation 48732 1 1 Blood Gas \N
+11707 Post-Panel Consolidation 40 atrial_fibrillation 45942 5 1 INR \N
+11708 Post-Panel Consolidation 40 atrial_fibrillation 45838 6 1 Troponin \N
+11709 Post-Panel Consolidation 40 atrial_fibrillation 62151 3 1 Lactate \N
+11710 Post-Panel Consolidation 41 atrial_fibrillation 62151 2 1 Lactate \N
+11711 Post-Panel Consolidation 41 atrial_fibrillation 46011 3 1 Lipids \N
+11712 Post-Panel Consolidation 41 atrial_fibrillation 61837 3 1 Lipids \N
+11713 Post-Panel Consolidation 40 atrial_fibrillation 45806 6 1 \N \N
+11714 Post-Panel Consolidation 41 atrial_fibrillation 45806 6 1 \N \N
+11715 Post-Panel Consolidation 40 atrial_fibrillation 45763 7 1 Metabolic Panel \N
+11716 Post-Panel Consolidation 40 atrial_fibrillation 45771 7 1 Metabolic Panel \N
+11717 Post-Panel Consolidation 41 atrial_fibrillation 45771 7 1 Metabolic Panel \N
+11718 Post-Panel Consolidation 43 atrial_fibrillation 45771 7 1 Metabolic Panel \N
+11719 Post-Panel Consolidation 40 atrial_fibrillation 44327 -8 1 \N \N
+11720 Post-Panel Consolidation 41 atrial_fibrillation 44005 4 1 \N \N
+11721 Post-Panel Consolidation 40 atrial_fibrillation 44000 5 1 \N \N
+11722 Post-Panel Consolidation 43 atrial_fibrillation 44000 4 1 \N \N
+11723 Post-Panel Consolidation 40 atrial_fibrillation 44294 2 1 \N \N
+11724 Post-Panel Consolidation 41 atrial_fibrillation 45792 0 1 \N \N
+11725 Post-Panel Consolidation 43 atrial_fibrillation 45792 -1 1 \N \N
+11726 Post-Panel Consolidation 43 atrial_fibrillation 44241 0 1 \N Trying to relieve preload?
+11727 Post-Panel Consolidation 43 atrial_fibrillation 44256 0 1 \N Trying to relieve preload?
+11728 Post-Panel Consolidation 40 atrial_fibrillation 48628 0 1 \N \N
+11729 Post-Panel Consolidation 40 atrial_fibrillation 46081 0 1 \N \N
+11730 Post-Panel Consolidation 40 atrial_fibrillation 50235 0 1 \N Not a respiratory issue?
+11731 Post-Panel Consolidation 43 atrial_fibrillation 50235 0 1 \N Not respiratory issue, but maybe thinking manage preload with pulmonary pressure?
+11732 Post-Panel Consolidation 43 atrial_fibrillation 36086 0 1 Vasopressor Adding vasopressor on while hypotensive from negative inotrope?
+11733 Post-Panel Consolidation 40 atrial_fibrillation 45853 5 1 \N \N
+11734 Post-Panel Consolidation 41 atrial_fibrillation 45853 5 1 \N \N
+11735 Post-Panel Consolidation 43 atrial_fibrillation 45853 5 1 \N \N
+11736 Post-Panel Consolidation 40 atrial_fibrillation 45787 0 1 \N \N
+11737 Post-Panel Consolidation 41 atrial_fibrillation 45787 0 1 \N \N
+11738 Post-Panel Consolidation 40 atrial_fibrillation 48822 0 1 Oxygen \N
+11739 Post-Panel Consolidation 43 atrial_fibrillation 48822 0 1 Oxygen \N
+11740 Post-Panel Consolidation 43 atrial_fibrillation 45900 0 1 Oxygen \N
+11741 Post-Panel Consolidation 43 atrial_fibrillation 43993 0 1 Vasopressor \N
+11742 Post-Panel Consolidation 40 atrial_fibrillation 45778 1 1 \N \N
+11743 Post-Panel Consolidation 43 atrial_fibrillation 45778 1 1 \N \N
+11744 Post-Panel Consolidation 40 atrial_fibrillation 45914 6 1 Troponin \N
+11745 Post-Panel Consolidation 43 atrial_fibrillation 46185 1 1 Blood Gas \N
+11746 Post-Panel Consolidation 40 atrial_fibrillation 46067 3 1 Metabolic Panel \N
+11747 Post-Panel Consolidation 43 atrial_fibrillation 46000 0 1 \N \N
+11748 Post-Panel Consolidation 40 atrial_fibrillation 45759 5 1 INR \N
+11749 Post-Panel Consolidation 41 atrial_fibrillation 45759 5 1 INR \N
+11750 Post-Panel Consolidation 43 atrial_fibrillation 45759 5 1 INR \N
+11751 Post-Panel Consolidation 40 atrial_fibrillation 45776 0 1 \N \N
+11752 Post-Panel Consolidation 41 atrial_fibrillation 45776 0 1 \N \N
+11753 Post-Panel Consolidation 40 atrial_fibrillation 45770 5 1 INR Merge with INR just to represent checking coags
+11754 Post-Panel Consolidation 43 atrial_fibrillation 45770 5 1 INR Merge with INR just to represent checking coags
+11755 Post-Panel Consolidation 40 atrial_fibrillation 44312 0 1 \N \N
+11756 Post-Panel Consolidation 40 atrial_fibrillation 44198 -2 1 \N \N
+11757 Post-Panel Consolidation 43 atrial_fibrillation 44198 -2 1 \N \N
+11758 Post-Panel Consolidation 40 atrial_fibrillation 45870 6 1 Troponin \N
+11759 Post-Panel Consolidation 41 atrial_fibrillation 45870 6 1 Troponin \N
+11760 Post-Panel Consolidation 43 atrial_fibrillation 45870 6 1 Troponin \N
+11761 Post-Panel Consolidation 40 atrial_fibrillation 62105 7 1 \N \N
+11762 Post-Panel Consolidation 41 atrial_fibrillation 62105 7 1 \N \N
+11763 Post-Panel Consolidation 40 atrial_fibrillation 45945 0 1 \N \N
+11764 Post-Panel Consolidation 43 atrial_fibrillation 45945 0 1 \N \N
+11765 Post-Panel Consolidation 40 atrial_fibrillation 65656 -1 1 DVT US \N
+11766 Post-Panel Consolidation 41 atrial_fibrillation 65656 -1 1 DVT US \N
+11767 Post-Panel Consolidation 40 atrial_fibrillation 65692 -1 1 DVT US \N
+11768 Post-Panel Consolidation 41 atrial_fibrillation 65692 -1 1 DVT US \N
+11769 Post-Panel Consolidation 41 atrial_fibrillation 45751 0 1 \N \N
+11770 Post-Panel Consolidation 40 atrial_fibrillation 46236 2 1 \N EtOH as part of Afib eval?
+11771 Post-Panel Consolidation 41 atrial_fibrillation 45818 3 1 \N \N
+11772 Post-Panel Consolidation 40 atrial_fibrillation 50200 3 1 \N \N
+11773 Post-Panel Consolidation 41 atrial_fibrillation 50200 3 1 \N \N
+11774 Post-Panel Consolidation 40 atrial_fibrillation 45801 -3 1 \N \N
+11775 Post-Panel Consolidation 43 atrial_fibrillation 45801 -3 1 \N \N
+11776 Post-Panel Consolidation 14 gi_bleed 44281 -1 1 \N \N
+11777 Post-Panel Consolidation 2 gi_bleed 48829 1 1 \N \N
+11778 Post-Panel Consolidation 14 gi_bleed 44416 0 1 \N Acetaminophen overdose, non-specific hepatitis treatment?
+11779 Post-Panel Consolidation 2 gi_bleed 65641 0 1 \N \N
+11780 Post-Panel Consolidation 14 gi_bleed 65641 0 1 \N \N
+11781 Post-Panel Consolidation 16 gi_bleed 65641 0 1 \N \N
+11782 Post-Panel Consolidation 15 gi_bleed 48744 0 1 \N Probably want complete hepatic panel, so give points there
+11783 Post-Panel Consolidation 14 gi_bleed 46136 0 1 \N \N
+11784 Post-Panel Consolidation 15 gi_bleed 46136 0 1 \N \N
+11785 Post-Panel Consolidation 2 gi_bleed 46136 0 1 \N \N
+11786 Post-Panel Consolidation 15 gi_bleed 63723 0 1 \N \N
+11787 Post-Panel Consolidation 14 gi_bleed 50962 -4 1 \N Mistaken test. Wasted, but not directly harmful?
+11788 Post-Panel Consolidation 15 gi_bleed 46245 2 1 \N \N
+11789 Post-Panel Consolidation 14 gi_bleed 45901 0 1 \N \N
+11790 Post-Panel Consolidation 14 gi_bleed 45752 0 1 \N \N
+11791 Post-Panel Consolidation 14 gi_bleed 45760 0 1 Blood Gas \N
+11792 Post-Panel Consolidation 15 gi_bleed 45919 0 1 Blood Gas \N
+11793 Post-Panel Consolidation 14 gi_bleed 45823 10 1 Type and Screen \N
+11794 Post-Panel Consolidation 14 gi_bleed 44290 8 1 IVF \N
+11795 Post-Panel Consolidation 15 gi_bleed 44290 8 1 IVF \N
+11796 Post-Panel Consolidation 15 gi_bleed 45887 0 1 \N \N
+11797 Post-Panel Consolidation 2 gi_bleed 45887 0 1 \N \N
+11798 Post-Panel Consolidation 14 gi_bleed 45793 10 1 CBC \N
+11799 Post-Panel Consolidation 15 gi_bleed 45793 10 1 CBC \N
+11800 Post-Panel Consolidation 16 gi_bleed 45793 10 1 CBC \N
+11801 Post-Panel Consolidation 2 gi_bleed 45793 10 1 CBC \N
+11802 Post-Panel Consolidation 14 gi_bleed 45788 10 1 CBC \N
+11803 Post-Panel Consolidation 15 gi_bleed 45788 10 1 CBC \N
+11804 Post-Panel Consolidation 2 gi_bleed 45788 10 1 CBC \N
+11805 Post-Panel Consolidation 15 gi_bleed 44255 0 1 \N Not reliable to cover Gram negative enterics (e.g., E coli)
+11806 Post-Panel Consolidation 15 gi_bleed 44637 5 1 Antibiotics \N
+11807 Post-Panel Consolidation 14 gi_bleed 45060 2 1 Antibiotics \N
+11808 Post-Panel Consolidation 15 gi_bleed 45060 2 1 Antibiotics \N
+11809 Post-Panel Consolidation 14 gi_bleed 35733 10 1 Antibiotics \N
+11810 Post-Panel Consolidation 15 gi_bleed 35733 10 1 Antibiotics \N
+11811 Post-Panel Consolidation 16 gi_bleed 35733 10 1 Antibiotics \N
+11812 Post-Panel Consolidation 2 gi_bleed 35733 10 1 Antibiotics \N
+11813 Post-Panel Consolidation 2 gi_bleed 44249 7 1 Antibiotics Reasonable empiric choice for GNRs
+11814 Post-Panel Consolidation 14 gi_bleed 62027 0 1 \N \N
+11815 Post-Panel Consolidation 2 gi_bleed 63720 5 1 Hepatitis Panel \N
+11816 Post-Panel Consolidation 14 gi_bleed 49481 10 1 GI EGD \N
+11817 Post-Panel Consolidation 15 gi_bleed 49481 10 1 GI EGD \N
+11818 Post-Panel Consolidation 16 gi_bleed 49481 10 1 GI EGD \N
+11819 Post-Panel Consolidation 14 gi_bleed 61323 2 1 \N \N
+11820 Post-Panel Consolidation 16 gi_bleed 61323 0 1 \N \N
+11821 Post-Panel Consolidation 14 gi_bleed 49867 0 1 \N Not DIC, more total coagulant deficiency
+11822 Post-Panel Consolidation 2 gi_bleed 50737 -5 1 \N \N
+11823 Post-Panel Consolidation 14 gi_bleed 48871 0 1 \N \N
+11824 Post-Panel Consolidation 14 gi_bleed 46286 7 1 Coags \N
+11825 Post-Panel Consolidation 16 gi_bleed 46286 7 1 Coags \N
+11826 Post-Panel Consolidation 14 gi_bleed 45811 8 1 \N \N
+11827 Post-Panel Consolidation 15 gi_bleed 45811 8 1 \N \N
+11828 Post-Panel Consolidation 14 gi_bleed 45941 0 1 \N \N
+11829 Post-Panel Consolidation 14 gi_bleed 45866 2 1 \N \N
+11830 Post-Panel Consolidation 15 gi_bleed 45866 2 1 \N \N
+11831 Post-Panel Consolidation 2 gi_bleed 61832 0 1 \N \N
+11832 Post-Panel Consolidation 15 gi_bleed 46160 0 1 \N \N
+11833 Post-Panel Consolidation 15 gi_bleed 46078 0 1 \N \N
+11834 Post-Panel Consolidation 15 gi_bleed 63759 10 1 RBC \N
+11835 Post-Panel Consolidation 14 gi_bleed 46028 4 1 \N \N
+11836 Post-Panel Consolidation 14 gi_bleed 45872 9 1 FFP \N
+11837 Post-Panel Consolidation 15 gi_bleed 45872 9 1 FFP \N
+11838 Post-Panel Consolidation 16 gi_bleed 45872 9 1 FFP \N
+11839 Post-Panel Consolidation 14 gi_bleed 44237 6 1 Antibiotics A bit overkill, but would cover GNRs
+11840 Post-Panel Consolidation 14 gi_bleed 48724 5 1 \N \N
+11841 Post-Panel Consolidation 14 gi_bleed 45948 5 1 \N \N
+11842 Post-Panel Consolidation 15 gi_bleed 45948 5 1 \N \N
+11843 Post-Panel Consolidation 15 gi_bleed 45891 10 1 CBC \N
+11844 Post-Panel Consolidation 15 gi_bleed 46051 10 1 CBC \N
+11845 Post-Panel Consolidation 15 gi_bleed 46068 0 1 \N \N
+11846 Post-Panel Consolidation 14 gi_bleed 45910 7 1 Metabolic Panel \N
+11847 Post-Panel Consolidation 2 gi_bleed 62029 0 1 \N Covered in hepatitis panel?
+11848 Post-Panel Consolidation 14 gi_bleed 65649 4 1 \N \N
+11849 Post-Panel Consolidation 15 gi_bleed 62022 7 1 Intubation \N
+11850 Post-Panel Consolidation 14 gi_bleed 45942 8 1 Coags \N
+11851 Post-Panel Consolidation 15 gi_bleed 45838 0 1 Troponin \N
+11852 Post-Panel Consolidation 14 gi_bleed 48954 10 1 IV Access Standard process that can be hard to distinguish, but include for particular relevance in this case
+11853 Post-Panel Consolidation 15 gi_bleed 44978 0 1 \N Peri-procedure sedation???
+11854 Post-Panel Consolidation 14 gi_bleed 62151 2 1 Lactate \N
+11855 Post-Panel Consolidation 15 gi_bleed 62151 2 1 Lactate \N
+11856 Post-Panel Consolidation 16 gi_bleed 62151 2 1 Lactate \N
+11857 Post-Panel Consolidation 15 gi_bleed 46289 -2 1 Lactulose \N
+11858 Post-Panel Consolidation 15 gi_bleed 44302 -2 1 Lactulose \N
+11859 Post-Panel Consolidation 15 gi_bleed 44593 -2 1 Lactulose \N
+11860 Post-Panel Consolidation 14 gi_bleed 45903 0 1 \N Hemolytic anemia eval?
+11861 Post-Panel Consolidation 14 gi_bleed 62144 0 1 \N \N
+11862 Post-Panel Consolidation 14 gi_bleed 45894 0 1 \N \N
+11863 Post-Panel Consolidation 15 gi_bleed 45806 2 1 \N \N
+11864 Post-Panel Consolidation 14 gi_bleed 63745 0 1 \N \N
+11865 Post-Panel Consolidation 15 gi_bleed 63745 0 1 \N \N
+11866 Post-Panel Consolidation 14 gi_bleed 45763 8 1 Metabolic Panel \N
+11867 Post-Panel Consolidation 15 gi_bleed 45763 8 1 Metabolic Panel \N
+11868 Post-Panel Consolidation 2 gi_bleed 45763 8 1 Metabolic Panel \N
+11869 Post-Panel Consolidation 14 gi_bleed 45771 9 1 Metabolic Panel \N
+11870 Post-Panel Consolidation 15 gi_bleed 45771 9 1 Metabolic Panel \N
+11871 Post-Panel Consolidation 15 gi_bleed 45792 0 1 \N \N
+11872 Post-Panel Consolidation 14 gi_bleed 45785 0 1 \N \N
+11873 Post-Panel Consolidation 15 gi_bleed 36086 5 1 Vasopressors \N
+11874 Post-Panel Consolidation 14 gi_bleed 51110 0 1 \N Largely irrelevant in acute setting
+11875 Post-Panel Consolidation 14 gi_bleed 46451 -2 1 \N \N
+11876 Post-Panel Consolidation 15 gi_bleed 46451 -2 1 \N \N
+11877 Post-Panel Consolidation 14 gi_bleed 43996 10 1 \N \N
+11878 Post-Panel Consolidation 15 gi_bleed 43996 10 1 \N \N
+11879 Post-Panel Consolidation 16 gi_bleed 43996 10 1 \N \N
+11880 Post-Panel Consolidation 2 gi_bleed 43996 10 1 \N \N
+11881 Post-Panel Consolidation 15 gi_bleed 46449 -2 1 \N \N
+11882 Post-Panel Consolidation 14 gi_bleed 44216 2 1 \N \N
+11883 Post-Panel Consolidation 14 gi_bleed 45868 8 1 \N \N
+11884 Post-Panel Consolidation 14 gi_bleed 48822 0 1 Oxygen No specific hypoxia in case
+11885 Post-Panel Consolidation 14 gi_bleed 45900 0 1 Oxygen No specific hypoxia in case
+11886 Post-Panel Consolidation 14 gi_bleed 44219 10 1 \N \N
+11887 Post-Panel Consolidation 15 gi_bleed 44219 10 1 \N \N
+11888 Post-Panel Consolidation 16 gi_bleed 44219 10 1 \N \N
+11889 Post-Panel Consolidation 15 gi_bleed 44236 0 1 \N \N
+11890 Post-Panel Consolidation 14 gi_bleed 44236 0 1 \N Mistake, should be giving oral med while vomiting blood
+11891 Post-Panel Consolidation 15 gi_bleed 62171 0 1 \N Active bleeding, probably not right time for para, though SBP always to consider?
+11892 Post-Panel Consolidation 14 gi_bleed 61823 10 1 IV Access \N
+11893 Post-Panel Consolidation 15 gi_bleed 61823 10 1 IV Access \N
+11894 Post-Panel Consolidation 14 gi_bleed 45802 10 1 IV Access \N
+11895 Post-Panel Consolidation 15 gi_bleed 43993 3 1 Vasopressors \N
+11896 Post-Panel Consolidation 15 gi_bleed 45778 4 1 \N \N
+11897 Post-Panel Consolidation 2 gi_bleed 45778 4 1 \N \N
+11898 Post-Panel Consolidation 14 gi_bleed 45875 0 1 Platelets \N
+11899 Post-Panel Consolidation 15 gi_bleed 45875 0 1 Platelets \N
+11900 Post-Panel Consolidation 15 gi_bleed 45955 2 1 Lactate \N
+11901 Post-Panel Consolidation 14 gi_bleed 50267 0 1 \N \N
+11902 Post-Panel Consolidation 15 gi_bleed 44292 0 1 \N Pre-procedure sedation?
+11903 Post-Panel Consolidation 14 gi_bleed 49904 -2 1 \N \N
+11904 Post-Panel Consolidation 14 gi_bleed 45759 8 1 Coags \N
+11905 Post-Panel Consolidation 15 gi_bleed 45759 8 1 Coags \N
+11906 Post-Panel Consolidation 16 gi_bleed 45759 8 1 Coags \N
+11907 Post-Panel Consolidation 2 gi_bleed 45759 8 1 Coags \N
+11908 Post-Panel Consolidation 14 gi_bleed 45770 8 1 Coags \N
+11909 Post-Panel Consolidation 15 gi_bleed 45770 8 1 Coags \N
+11910 Post-Panel Consolidation 2 gi_bleed 45770 8 1 Coags \N
+11911 Post-Panel Consolidation 2 gi_bleed 62103 0 1 \N \N
+11912 Post-Panel Consolidation 14 gi_bleed 45927 10 1 RBC \N
+11913 Post-Panel Consolidation 15 gi_bleed 45927 10 1 RBC \N
+11914 Post-Panel Consolidation 16 gi_bleed 45927 10 1 RBC \N
+11915 Post-Panel Consolidation 2 gi_bleed 45927 10 1 RBC \N
+11916 Post-Panel Consolidation 15 gi_bleed 44424 0 1 \N \N
+11917 Post-Panel Consolidation 14 gi_bleed 49173 0 1 \N ?Intoxication not really active issue
+11918 Post-Panel Consolidation 14 gi_bleed 44198 8 1 IVF \N
+11919 Post-Panel Consolidation 15 gi_bleed 44198 8 1 IVF \N
+11920 Post-Panel Consolidation 15 gi_bleed 44441 0 1 \N ?Pre-intubation for airway protection?
+11921 Post-Panel Consolidation 14 gi_bleed 45877 8 1 Coagulopathy Correction \N
+11922 Post-Panel Consolidation 15 gi_bleed 45877 8 1 Coagulopathy Correction \N
+11923 Post-Panel Consolidation 16 gi_bleed 45877 8 1 Coagulopathy Correction \N
+11924 Post-Panel Consolidation 14 gi_bleed 65702 8 1 Coagulopathy Correction \N
+11925 Post-Panel Consolidation 15 gi_bleed 65702 8 1 Coagulopathy Correction \N
+11926 Post-Panel Consolidation 16 gi_bleed 65702 8 1 Coagulopathy Correction \N
+11927 Post-Panel Consolidation 14 gi_bleed 65646 0 1 Transfuse Platelets \N
+11928 Post-Panel Consolidation 15 gi_bleed 65646 0 1 Transfuse Platelets \N
+11929 Post-Panel Consolidation 15 gi_bleed 45956 0 1 Transfuse Platelets \N
+11930 Post-Panel Consolidation 14 gi_bleed 45956 0 1 Transfuse Platelets Not sure necessary or appropriate to transfuse platelets given observed counts not low?
+11997 Post-Panel Consolidation 33 meningitis 48880 5 1 \N \N
+11931 Post-Panel Consolidation 15 gi_bleed 61976 0 1 Transfuse Platelets Not sure necessary or appropriate to transfuse platelets given observed counts not low?
+11932 Post-Panel Consolidation 14 gi_bleed 61975 10 1 Transfuse RBC \N
+11933 Post-Panel Consolidation 15 gi_bleed 61975 10 1 Transfuse RBC \N
+11934 Post-Panel Consolidation 16 gi_bleed 61975 10 1 Transfuse RBC \N
+11935 Post-Panel Consolidation 14 gi_bleed 45748 10 1 Transfuse RBC \N
+11936 Post-Panel Consolidation 15 gi_bleed 45748 10 1 Transfuse RBC \N
+11937 Post-Panel Consolidation 14 gi_bleed 65640 10 1 Transfuse RBC \N
+11938 Post-Panel Consolidation 15 gi_bleed 65640 10 1 Transfuse RBC \N
+11939 Post-Panel Consolidation 16 gi_bleed 65640 10 1 Transfuse RBC \N
+11940 Post-Panel Consolidation 2 gi_bleed 65640 10 1 Transfuse RBC \N
+11941 Post-Panel Consolidation 14 gi_bleed 50581 0 1 \N \N
+11942 Post-Panel Consolidation 15 gi_bleed 50581 0 1 \N \N
+11943 Post-Panel Consolidation 14 gi_bleed 50618 10 1 Transfuse RBC \N
+11944 Post-Panel Consolidation 15 gi_bleed 50618 10 1 Transfuse RBC \N
+11945 Post-Panel Consolidation 14 gi_bleed 45945 10 1 Type and Screen \N
+11946 Post-Panel Consolidation 15 gi_bleed 45945 10 1 Type and Screen \N
+11947 Post-Panel Consolidation 14 gi_bleed 45869 6 1 US Abdomen \N
+11948 Post-Panel Consolidation 2 gi_bleed 45869 6 1 US Abdomen \N
+11949 Post-Panel Consolidation 2 gi_bleed 49408 6 1 US Abdomen \N
+11950 Post-Panel Consolidation 14 gi_bleed 46343 6 1 US Abdomen \N
+11951 Post-Panel Consolidation 2 gi_bleed 46343 6 1 US Abdomen \N
+11952 Post-Panel Consolidation 14 gi_bleed 45969 10 1 GI EGD \N
+11953 Post-Panel Consolidation 15 gi_bleed 45969 10 1 GI EGD \N
+11954 Post-Panel Consolidation 16 gi_bleed 45969 10 1 GI EGD \N
+11955 Post-Panel Consolidation 14 gi_bleed 45873 0 1 \N \N
+11956 Post-Panel Consolidation 14 gi_bleed 46348 0 1 \N \N
+11957 Post-Panel Consolidation 14 gi_bleed 44001 7 1 Coagulopathy Correction \N
+11958 Post-Panel Consolidation 15 gi_bleed 44001 7 1 Coagulopathy Correction \N
+11959 Post-Panel Consolidation 16 gi_bleed 44001 7 1 Coagulopathy Correction \N
+11960 Post-Panel Consolidation 15 gi_bleed 44404 7 1 Coagulopathy Correction \N
+11961 Post-Panel Consolidation 16 gi_bleed 44404 7 1 Coagulopathy Correction \N
+11962 Post-Panel Consolidation 14 gi_bleed 44382 -2 1 \N \N
+11963 Post-Panel Consolidation 15 gi_bleed 44382 -2 1 \N \N
+11964 Post-Panel Consolidation 14 gi_bleed 46096 0 1 \N \N
+11965 Post-Panel Consolidation 14 gi_bleed 45818 0 1 CXR \N
+11966 Post-Panel Consolidation 15 gi_bleed 45818 0 1 CXR \N
+11967 Post-Panel Consolidation 14 gi_bleed 50200 0 1 CXR Irrelevant diagnostic?
+11968 Post-Panel Consolidation 14 gi_bleed 45801 0 1 CXR \N
+11969 Post-Panel Consolidation 30 meningitis 44281 5 1 Pain Control \N
+11970 Post-Panel Consolidation 31 meningitis 44281 5 1 Pain Control \N
+11971 Post-Panel Consolidation 30 meningitis 44278 5 1 Pain Control \N
+11972 Post-Panel Consolidation 30 meningitis 48829 0 1 \N Irrelevant diagnostics. Probably trying to order medicine
+11973 Post-Panel Consolidation 30 meningitis 44615 0 1 \N \N
+11974 Post-Panel Consolidation 31 meningitis 44615 0 1 \N \N
+11975 Post-Panel Consolidation 33 meningitis 44615 0 1 \N \N
+11976 Post-Panel Consolidation 30 meningitis 48770 0 1 \N Low yield
+11977 Post-Panel Consolidation 33 meningitis 48770 0 1 \N Low yield
+11978 Post-Panel Consolidation 30 meningitis 44595 0 1 \N \N
+11979 Post-Panel Consolidation 31 meningitis 44595 0 1 \N \N
+11980 Post-Panel Consolidation 33 meningitis 44595 0 1 \N \N
+11981 Post-Panel Consolidation 30 meningitis 46093 5 1 Pregnancy Test \N
+11982 Post-Panel Consolidation 30 meningitis 45901 10 1 Blood Culture \N
+11983 Post-Panel Consolidation 31 meningitis 45901 10 1 Blood Culture \N
+11984 Post-Panel Consolidation 33 meningitis 45901 10 1 Blood Culture \N
+11985 Post-Panel Consolidation 30 meningitis 45752 10 1 Blood Culture \N
+11986 Post-Panel Consolidation 31 meningitis 45752 10 1 Blood Culture \N
+11987 Post-Panel Consolidation 33 meningitis 45752 10 1 Blood Culture \N
+11988 Post-Panel Consolidation 30 meningitis 44290 5 1 IVF \N
+11989 Post-Panel Consolidation 30 meningitis 44439 5 1 IVF \N
+11990 Post-Panel Consolidation 30 meningitis 45793 7 1 CBC \N
+11991 Post-Panel Consolidation 30 meningitis 45788 7 1 CBC \N
+11992 Post-Panel Consolidation 33 meningitis 36210 5 1 Antibiotics \N
+11993 Post-Panel Consolidation 30 meningitis 35733 10 1 Antibiotics \N
+11994 Post-Panel Consolidation 31 meningitis 35733 10 1 Antibiotics \N
+11995 Post-Panel Consolidation 33 meningitis 35733 5 1 Antibiotics \N
+11996 Post-Panel Consolidation 30 meningitis 48880 10 1 \N \N
+11998 Post-Panel Consolidation 30 meningitis 50930 0 1 \N Wrong order. Synovial fluid not CSF
+11999 Post-Panel Consolidation 30 meningitis 49079 0 1 \N \N
+12000 Post-Panel Consolidation 33 meningitis 48603 0 1 \N Not relevant to test?
+12001 Post-Panel Consolidation 33 meningitis 61973 0 1 \N Not relevant to test?
+12002 Post-Panel Consolidation 33 meningitis 48752 0 1 \N Not relevant to test?
+12003 Post-Panel Consolidation 33 meningitis 61826 0 1 \N \N
+12004 Post-Panel Consolidation 30 meningitis 61826 0 1 \N Not relevant to test?
+12005 Post-Panel Consolidation 31 meningitis 49649 0 1 \N \N
+12006 Post-Panel Consolidation 33 meningitis 49594 0 1 \N \N
+12007 Post-Panel Consolidation 30 meningitis 49594 0 1 \N No good indication
+12008 Post-Panel Consolidation 30 meningitis 49083 10 1 \N \N
+12009 Post-Panel Consolidation 33 meningitis 49083 5 1 \N \N
+12010 Post-Panel Consolidation 30 meningitis 50692 4 1 \N \N
+12011 Post-Panel Consolidation 30 meningitis 48871 0 1 \N \N
+12012 Post-Panel Consolidation 30 meningitis 44017 10 1 \N \N
+12013 Post-Panel Consolidation 31 meningitis 44017 10 1 \N \N
+12014 Post-Panel Consolidation 33 meningitis 44017 9 1 \N \N
+12015 Post-Panel Consolidation 33 meningitis 35969 -5 1 \N \N
+12016 Post-Panel Consolidation 30 meningitis 46286 5 1 Coags \N
+12017 Post-Panel Consolidation 30 meningitis 45811 2 1 \N \N
+12018 Post-Panel Consolidation 30 meningitis 49054 6 1 \N \N
+12019 Post-Panel Consolidation 31 meningitis 49054 6 1 \N \N
+12020 Post-Panel Consolidation 30 meningitis 45866 0 1 \N \N
+12021 Post-Panel Consolidation 31 meningitis 45866 0 1 \N \N
+12022 Post-Panel Consolidation 33 meningitis 63761 1 1 \N Common meningitis cause, okay to review
+12023 Post-Panel Consolidation 33 meningitis 49142 1 1 \N Common meningitis cause, okay to review
+12024 Post-Panel Consolidation 30 meningitis 46103 0 1 \N \N
+12025 Post-Panel Consolidation 30 meningitis 50685 0 1 \N Mostly irrelevant STD testing?
+12026 Post-Panel Consolidation 30 meningitis 48577 10 1 \N \N
+12027 Post-Panel Consolidation 33 meningitis 48577 10 1 \N Doesn't match CSF cell count pattern of less points if delayed to worsened?
+12028 Post-Panel Consolidation 30 meningitis 42197 0 1 \N \N
+12029 Post-Panel Consolidation 30 meningitis 49109 7 1 HSV CSF \N
+12030 Post-Panel Consolidation 30 meningitis 62011 0 1 \N Not the right screening test for HIV
+12031 Post-Panel Consolidation 30 meningitis 63767 7 1 HSV CSF \N
+12032 Post-Panel Consolidation 31 meningitis 63767 7 1 HSV CSF \N
+12033 Post-Panel Consolidation 33 meningitis 63767 7 1 HSV CSF \N
+12034 Post-Panel Consolidation 30 meningitis 44319 2 1 Pain Control \N
+12035 Post-Panel Consolidation 30 meningitis 48732 0 1 \N Blood gases?
+12036 Post-Panel Consolidation 30 meningitis 62151 5 1 Lactate \N
+12037 Post-Panel Consolidation 31 meningitis 62151 5 1 Lactate \N
+12038 Post-Panel Consolidation 33 meningitis 62151 5 1 Lactate \N
+12039 Post-Panel Consolidation 30 meningitis 45918 5 1 Lactate \N
+12040 Post-Panel Consolidation 33 meningitis 45918 5 1 Lactate \N
+12041 Post-Panel Consolidation 33 meningitis 50510 5 1 \N \N
+12042 Post-Panel Consolidation 30 meningitis 45763 5 1 Metabolic Panel \N
+12043 Post-Panel Consolidation 30 meningitis 45771 5 1 Metabolic Panel \N
+12044 Post-Panel Consolidation 31 meningitis 44199 0 1 \N Symptomatic management
+12045 Post-Panel Consolidation 31 meningitis 45792 0 1 \N \N
+12046 Post-Panel Consolidation 30 meningitis 45792 0 1 \N \N
+12047 Post-Panel Consolidation 30 meningitis 61852 0 1 \N \N
+12048 Post-Panel Consolidation 30 meningitis 61823 0 1 \N \N
+12049 Post-Panel Consolidation 31 meningitis 49334 0 1 \N Irrelevant?
+12050 Post-Panel Consolidation 30 meningitis 46090 0 1 \N \N
+12051 Post-Panel Consolidation 30 meningitis 45955 5 1 Lactate \N
+12052 Post-Panel Consolidation 33 meningitis 49134 5 1 Pregnancy Test \N
+12053 Post-Panel Consolidation 30 meningitis 62042 2 1 \N \N
+12054 Post-Panel Consolidation 30 meningitis 49020 10 1 \N \N
+12055 Post-Panel Consolidation 33 meningitis 49020 5 1 \N \N
+12056 Post-Panel Consolidation 31 meningitis 45776 0 1 \N Process
+12057 Post-Panel Consolidation 30 meningitis 62103 5 1 HIV Test \N
+12058 Post-Panel Consolidation 33 meningitis 62103 5 1 HIV Test \N
+12059 Post-Panel Consolidation 30 meningitis 48728 0 1 \N \N
+12060 Post-Panel Consolidation 31 meningitis 48728 0 1 \N \N
+12061 Post-Panel Consolidation 30 meningitis 63923 3 1 \N \N
+12062 Post-Panel Consolidation 30 meningitis 63725 5 1 Lactate \N
+12063 Post-Panel Consolidation 31 meningitis 63725 5 1 Lactate \N
+12064 Post-Panel Consolidation 30 meningitis 44198 5 1 IVF \N
+12065 Post-Panel Consolidation 33 meningitis 44198 5 1 IVF \N
+12066 Post-Panel Consolidation 30 meningitis 46131 0 1 \N \N
+12067 Post-Panel Consolidation 30 meningitis 45751 0 1 \N \N
+12068 Post-Panel Consolidation 33 meningitis 45751 0 1 \N \N
+12069 Post-Panel Consolidation 30 meningitis 45873 0 1 \N \N
+12070 Post-Panel Consolidation 31 meningitis 45873 0 1 \N \N
+12071 Post-Panel Consolidation 30 meningitis 43997 10 1 \N \N
+12072 Post-Panel Consolidation 31 meningitis 43997 10 1 \N \N
+12073 Post-Panel Consolidation 33 meningitis 43997 5 1 \N \N
+12074 Post-Panel Consolidation 33 meningitis 48486 2 1 Vancomycin Level Okay to check followup leels
+12075 Post-Panel Consolidation 30 meningitis 45972 2 1 Vancomycin Level Okay to check followup leels
+12076 Post-Panel Consolidation 33 meningitis 45972 2 1 Vancomycin Level Okay to check followup leels
+12077 Post-Panel Consolidation 33 meningitis 48519 0 1 \N \N
+12078 Post-Panel Consolidation 33 meningitis 48529 0 1 \N \N
+12079 Post-Panel Consolidation 30 meningitis 63735 0 1 \N \N
+12080 Post-Panel Consolidation 30 meningitis 45766 0 1 \N \N
+12081 Post-Panel Consolidation 30 meningitis 50654 0 1 \N \N
+12082 Post-Panel Consolidation 33 meningitis 50654 0 1 \N \N
+12083 Post-Panel Consolidation 30 meningitis 45818 3 1 CXR \N
+12084 Post-Panel Consolidation 31 meningitis 45818 3 1 CXR \N
+12085 Post-Panel Consolidation 33 meningitis 45818 3 1 CXR \N
+12086 Post-Panel Consolidation 5002 neutropenic 44281 4 1 Acetaminophen \N
+12087 Post-Panel Consolidation 5000 neutropenic 44281 4 1 Acetaminophen \N
+12088 Post-Panel Consolidation 5002 neutropenic 65641 0 1 \N Process
+12089 Post-Panel Consolidation 5000 neutropenic 48775 0 1 \N \N
+12090 Post-Panel Consolidation 5002 neutropenic 46157 10 1 Blood Cultures \N
+12091 Post-Panel Consolidation 5002 neutropenic 46291 10 1 Blood Cultures \N
+12092 Post-Panel Consolidation 5002 neutropenic 45901 10 1 Blood Cultures \N
+12093 Post-Panel Consolidation 5000 neutropenic 45901 10 1 Blood Cultures \N
+12094 Post-Panel Consolidation 5002 neutropenic 45752 10 1 Blood Cultures \N
+12095 Post-Panel Consolidation 5000 neutropenic 45752 10 1 Blood Cultures \N
+12096 Post-Panel Consolidation 5000 neutropenic 45760 6 1 Blood Gas \N
+12097 Post-Panel Consolidation 5003 neutropenic 44395 10 1 IVF \N
+12098 Post-Panel Consolidation 5000 neutropenic 44290 10 1 IVF \N
+12099 Post-Panel Consolidation 5002 neutropenic 45788 8 1 CBC \N
+12100 Post-Panel Consolidation 5000 neutropenic 45788 8 1 CBC \N
+12101 Post-Panel Consolidation 5000 neutropenic 45966 8 1 CBC \N
+12102 Post-Panel Consolidation 5002 neutropenic 36210 10 1 Anti-Pseudomonas \N
+12103 Post-Panel Consolidation 5000 neutropenic 36210 10 1 Anti-Pseudomonas \N
+12104 Post-Panel Consolidation 5003 neutropenic 36210 10 1 Anti-Pseudomonas \N
+12105 Post-Panel Consolidation 5002 neutropenic 50547 0 1 \N Consult
+12106 Post-Panel Consolidation 5002 neutropenic 48980 0 1 \N Consult
+12107 Post-Panel Consolidation 5003 neutropenic 49228 0 1 \N Consult
+12108 Post-Panel Consolidation 5002 neutropenic 48711 0 1 \N Wrong type of isolation
+12109 Post-Panel Consolidation 5000 neutropenic 48532 0 1 \N \N
+12110 Post-Panel Consolidation 5003 neutropenic 46286 5 1 Coags \N
+12111 Post-Panel Consolidation 5003 neutropenic 48686 2 1 \N \N
+12112 Post-Panel Consolidation 5000 neutropenic 48686 2 1 \N \N
+12113 Post-Panel Consolidation 5003 neutropenic 46004 0 1 \N \N
+12114 Post-Panel Consolidation 5003 neutropenic 45811 0 1 \N Unnecessary?
+12115 Post-Panel Consolidation 5000 neutropenic 49054 5 1 \N \N
+12116 Post-Panel Consolidation 5002 neutropenic 45866 4 1 \N \N
+12117 Post-Panel Consolidation 5003 neutropenic 45866 4 1 \N \N
+12118 Post-Panel Consolidation 5000 neutropenic 45866 4 1 \N \N
+12119 Post-Panel Consolidation 5000 neutropenic 46160 0 1 \N Process
+12120 Post-Panel Consolidation 5000 neutropenic 41759 0 1 \N Presenting symptom
+12121 Post-Panel Consolidation 5002 neutropenic 45225 7 1 \N Reduce hospitalized neutropenic time
+12122 Post-Panel Consolidation 5002 neutropenic 44237 10 1 Anti-Pseudomonas \N
+12123 Post-Panel Consolidation 5000 neutropenic 44237 10 1 Anti-Pseudomonas \N
+12124 Post-Panel Consolidation 5002 neutropenic 44252 10 1 Anti-Pseudomonas \N
+12125 Post-Panel Consolidation 5002 neutropenic 46006 0 1 \N \N
+12126 Post-Panel Consolidation 5000 neutropenic 46020 2 1 \N \N
+12127 Post-Panel Consolidation 5002 neutropenic 62151 10 1 Lactate \N
+12128 Post-Panel Consolidation 5003 neutropenic 62151 10 1 Lactate \N
+12129 Post-Panel Consolidation 5000 neutropenic 62151 10 1 Lactate \N
+12130 Post-Panel Consolidation 5000 neutropenic 45903 2 1 \N \N
+12131 Post-Panel Consolidation 5002 neutropenic 45806 3 1 \N \N
+12132 Post-Panel Consolidation 5002 neutropenic 45763 10 1 Metabolic Panel \N
+12133 Post-Panel Consolidation 5000 neutropenic 45763 10 1 Metabolic Panel \N
+12134 Post-Panel Consolidation 5002 neutropenic 45771 10 1 Metabolic Panel \N
+12135 Post-Panel Consolidation 5000 neutropenic 45771 10 1 Metabolic Panel \N
+12136 Post-Panel Consolidation 5002 neutropenic 45792 2 1 \N \N
+12137 Post-Panel Consolidation 5003 neutropenic 45792 2 1 \N \N
+12138 Post-Panel Consolidation 5002 neutropenic 48960 8 1 \N \N
+12139 Post-Panel Consolidation 5003 neutropenic 48960 8 1 \N \N
+12140 Post-Panel Consolidation 5000 neutropenic 48960 8 1 \N \N
+12141 Post-Panel Consolidation 5000 neutropenic 44420 0 1 \N Symptom management
+12142 Post-Panel Consolidation 5000 neutropenic 45900 0 1 \N Irrelevant
+12143 Post-Panel Consolidation 5003 neutropenic 45778 0 1 \N \N
+12144 Post-Panel Consolidation 5002 neutropenic 50554 0 1 \N Irrelevant
+12145 Post-Panel Consolidation 5003 neutropenic 50554 0 1 \N Irrelevant
+12146 Post-Panel Consolidation 5000 neutropenic 45955 10 1 Lactate \N
+12147 Post-Panel Consolidation 5000 neutropenic 46000 0 1 \N \N
+12148 Post-Panel Consolidation 5002 neutropenic 45759 4 1 Coags \N
+12149 Post-Panel Consolidation 5002 neutropenic 45770 4 1 Coags \N
+12150 Post-Panel Consolidation 5000 neutropenic 45890 0 1 \N \N
+12151 Post-Panel Consolidation 5000 neutropenic 62023 6 1 Respiratory Virus Screen \N
+12152 Post-Panel Consolidation 5002 neutropenic 63923 6 1 Respiratory Virus Screen \N
+12153 Post-Panel Consolidation 5000 neutropenic 63923 6 1 Respiratory Virus Screen \N
+12154 Post-Panel Consolidation 5003 neutropenic 63725 10 1 Lactate \N
+12155 Post-Panel Consolidation 5000 neutropenic 63725 10 1 Lactate \N
+12156 Post-Panel Consolidation 5002 neutropenic 44198 10 1 IVF \N
+12157 Post-Panel Consolidation 5003 neutropenic 44198 10 1 IVF \N
+12158 Post-Panel Consolidation 5000 neutropenic 44198 10 1 IVF \N
+12159 Post-Panel Consolidation 5000 neutropenic 45945 1 1 \N Anticipating transfusions, but not needed now
+12160 Post-Panel Consolidation 5000 neutropenic 45995 3 1 \N \N
+12161 Post-Panel Consolidation 5000 neutropenic 45751 6 1 UA + Culture \N
+12162 Post-Panel Consolidation 5000 neutropenic 45873 6 1 UA + Culture \N
+12163 Post-Panel Consolidation 5002 neutropenic 45782 6 1 UA + Culture \N
+12164 Post-Panel Consolidation 5003 neutropenic 45782 6 1 UA + Culture \N
+12165 Post-Panel Consolidation 5000 neutropenic 45782 6 1 UA + Culture \N
+12166 Post-Panel Consolidation 5002 neutropenic 43997 2 1 \N \N
+12167 Post-Panel Consolidation 5003 neutropenic 43997 2 1 \N \N
+12168 Post-Panel Consolidation 5000 neutropenic 43997 2 1 \N \N
+12169 Post-Panel Consolidation 5000 neutropenic 45972 2 1 \N \N
+12170 Post-Panel Consolidation 5002 neutropenic 63735 0 1 \N \N
+12171 Post-Panel Consolidation 5003 neutropenic 63735 0 1 \N \N
+12172 Post-Panel Consolidation 5000 neutropenic 45766 0 1 \N Process
+12173 Post-Panel Consolidation 5002 neutropenic 45818 10 1 CXR \N
+12174 Post-Panel Consolidation 5003 neutropenic 45818 10 1 CXR \N
+12175 Post-Panel Consolidation 5000 neutropenic 45818 10 1 CXR \N
+12176 Post-Panel Consolidation 5002 neutropenic 45801 10 1 CXR \N
+12177 Post-Panel Consolidation 5000 neutropenic 45801 10 1 CXR \N
+12178 Post-Panel Consolidation 11 pulmonary_embolism 65641 0 1 \N Process
+12179 Post-Panel Consolidation 10 pulmonary_embolism 44330 7 1 Nebs \N
+12180 Post-Panel Consolidation 11 pulmonary_embolism 44330 7 1 Nebs \N
+12181 Post-Panel Consolidation 11 pulmonary_embolism 44595 0 1 \N Weird antibiotic choice?
+12182 Post-Panel Consolidation 10 pulmonary_embolism 44206 4 1 Aspirin \N
+12183 Post-Panel Consolidation 11 pulmonary_embolism 44206 4 1 Aspirin \N
+12184 Post-Panel Consolidation 8 pulmonary_embolism 46551 0 1 \N \N
+12185 Post-Panel Consolidation 10 pulmonary_embolism 35849 6 1 Azithromycin \N
+12186 Post-Panel Consolidation 12 pulmonary_embolism 35849 6 1 Azithromycin \N
+12187 Post-Panel Consolidation 11 pulmonary_embolism 35849 6 1 Azithromycin \N
+12188 Post-Panel Consolidation 10 pulmonary_embolism 44388 6 1 Azithromycin \N
+12189 Post-Panel Consolidation 11 pulmonary_embolism 44388 6 1 Azithromycin \N
+12190 Post-Panel Consolidation 11 pulmonary_embolism 45901 5 1 Blood Cultures \N
+12191 Post-Panel Consolidation 11 pulmonary_embolism 45752 5 1 Blood Cultures \N
+12192 Post-Panel Consolidation 10 pulmonary_embolism 45760 7 1 Blood Gas \N
+12193 Post-Panel Consolidation 12 pulmonary_embolism 45760 7 1 Blood Gas \N
+12194 Post-Panel Consolidation 10 pulmonary_embolism 45919 5 1 Blood Gas \N
+12195 Post-Panel Consolidation 12 pulmonary_embolism 45919 5 1 Blood Gas \N
+12196 Post-Panel Consolidation 11 pulmonary_embolism 45919 5 1 Blood Gas \N
+12197 Post-Panel Consolidation 10 pulmonary_embolism 44439 0 1 IVF \N
+12198 Post-Panel Consolidation 10 pulmonary_embolism 45793 10 1 CBC \N
+12199 Post-Panel Consolidation 11 pulmonary_embolism 45793 10 1 CBC \N
+12200 Post-Panel Consolidation 10 pulmonary_embolism 45788 10 1 CBC \N
+12201 Post-Panel Consolidation 11 pulmonary_embolism 45788 10 1 CBC \N
+12202 Post-Panel Consolidation 10 pulmonary_embolism 35733 6 1 \N \N
+12203 Post-Panel Consolidation 11 pulmonary_embolism 35733 6 1 \N \N
+12204 Post-Panel Consolidation 11 pulmonary_embolism 45892 0 1 \N Superceded by troponin if needed at all
+12205 Post-Panel Consolidation 10 pulmonary_embolism 49251 0 1 \N \N
+12206 Post-Panel Consolidation 11 pulmonary_embolism 49251 0 1 \N \N
+12207 Post-Panel Consolidation 10 pulmonary_embolism 61323 0 1 \N Consult
+12208 Post-Panel Consolidation 11 pulmonary_embolism 61323 0 1 \N Consult
+12209 Post-Panel Consolidation 12 pulmonary_embolism 49207 0 1 \N Consult
+12210 Post-Panel Consolidation 11 pulmonary_embolism 50509 0 1 \N \N
+12211 Post-Panel Consolidation 10 pulmonary_embolism 48522 10 1 CT Chest \N
+12212 Post-Panel Consolidation 11 pulmonary_embolism 48522 10 1 CT Chest \N
+12213 Post-Panel Consolidation 10 pulmonary_embolism 45762 7 1 CT Chest \N
+12214 Post-Panel Consolidation 11 pulmonary_embolism 45762 7 1 CT Chest \N
+12215 Post-Panel Consolidation 10 pulmonary_embolism 48676 10 1 CT Chest \N
+12216 Post-Panel Consolidation 11 pulmonary_embolism 48676 10 1 CT Chest \N
+12217 Post-Panel Consolidation 10 pulmonary_embolism 48871 5 1 D-Dimer \N
+12218 Post-Panel Consolidation 11 pulmonary_embolism 48871 5 1 D-Dimer \N
+12219 Post-Panel Consolidation 10 pulmonary_embolism 48532 5 1 D-Dimer \N
+12220 Post-Panel Consolidation 11 pulmonary_embolism 48532 5 1 D-Dimer \N
+12221 Post-Panel Consolidation 10 pulmonary_embolism 44017 5 1 Corticosteroids Main issue is PE, but could reasonably say it's triggering a COPD exacerbation as well
+12222 Post-Panel Consolidation 10 pulmonary_embolism 45811 2 1 NPO \N
+12223 Post-Panel Consolidation 12 pulmonary_embolism 45811 2 1 NPO \N
+12224 Post-Panel Consolidation 10 pulmonary_embolism 49054 5 1 \N \N
+12225 Post-Panel Consolidation 10 pulmonary_embolism 45866 7 1 \N \N
+12226 Post-Panel Consolidation 11 pulmonary_embolism 45866 7 1 \N \N
+12227 Post-Panel Consolidation 10 pulmonary_embolism 61832 6 1 Echo \N
+12228 Post-Panel Consolidation 11 pulmonary_embolism 61832 6 1 Echo \N
+12229 Post-Panel Consolidation 8 pulmonary_embolism 61832 6 1 Echo \N
+12230 Post-Panel Consolidation 10 pulmonary_embolism 46160 0 1 \N Process
+12231 Post-Panel Consolidation 11 pulmonary_embolism 46160 0 1 \N Process
+12232 Post-Panel Consolidation 11 pulmonary_embolism 44250 10 1 Anticoagulation \N
+12233 Post-Panel Consolidation 11 pulmonary_embolism 61978 -5 1 \N \N
+12234 Post-Panel Consolidation 10 pulmonary_embolism 44004 0 1 \N \N
+12235 Post-Panel Consolidation 11 pulmonary_embolism 44004 0 1 \N \N
+12236 Post-Panel Consolidation 11 pulmonary_embolism 45797 1 1 \N \N
+12237 Post-Panel Consolidation 10 pulmonary_embolism 46438 10 1 Anticoagulation \N
+12238 Post-Panel Consolidation 10 pulmonary_embolism 44359 10 1 Anticoagulation \N
+12239 Post-Panel Consolidation 11 pulmonary_embolism 44359 10 1 Anticoagulation \N
+12240 Post-Panel Consolidation 10 pulmonary_embolism 46183 0 1 \N Just count of part heparin protocol
+12241 Post-Panel Consolidation 10 pulmonary_embolism 63714 0 1 \N Just count of part heparin protocol
+12242 Post-Panel Consolidation 11 pulmonary_embolism 63714 0 1 \N Just count of part heparin protocol
+12243 Post-Panel Consolidation 8 pulmonary_embolism 49301 7 1 Blood Gas \N
+12244 Post-Panel Consolidation 10 pulmonary_embolism 45838 6 1 Troponin \N
+12245 Post-Panel Consolidation 10 pulmonary_embolism 62151 5 1 Lactate \N
+12246 Post-Panel Consolidation 10 pulmonary_embolism 62144 0 1 \N Not sure?
+12247 Post-Panel Consolidation 11 pulmonary_embolism 61837 0 1 \N \N
+12248 Post-Panel Consolidation 10 pulmonary_embolism 44213 0 1 \N Like asthma exacerbation treatment?
+12249 Post-Panel Consolidation 11 pulmonary_embolism 45806 5 1 \N Not sure why so much points?
+12250 Post-Panel Consolidation 10 pulmonary_embolism 45763 10 1 Metabolic Panel \N
+12251 Post-Panel Consolidation 11 pulmonary_embolism 45763 10 1 Metabolic Panel \N
+12252 Post-Panel Consolidation 10 pulmonary_embolism 45771 10 1 Metabolic Panel \N
+12253 Post-Panel Consolidation 11 pulmonary_embolism 45771 10 1 Metabolic Panel \N
+12254 Post-Panel Consolidation 10 pulmonary_embolism 44586 5 1 Corticosteroids \N
+12255 Post-Panel Consolidation 11 pulmonary_embolism 44586 5 1 Corticosteroids \N
+12256 Post-Panel Consolidation 11 pulmonary_embolism 45792 4 1 \N \N
+12257 Post-Panel Consolidation 11 pulmonary_embolism 44228 4 1 \N \N
+12258 Post-Panel Consolidation 11 pulmonary_embolism 48628 0 1 \N \N
+12259 Post-Panel Consolidation 11 pulmonary_embolism 46081 0 1 \N \N
+12260 Post-Panel Consolidation 10 pulmonary_embolism 50235 0 1 NIPPV \N
+12261 Post-Panel Consolidation 12 pulmonary_embolism 50235 0 1 NIPPV \N
+12262 Post-Panel Consolidation 10 pulmonary_embolism 45853 6 1 \N \N
+12263 Post-Panel Consolidation 11 pulmonary_embolism 45853 6 1 \N \N
+12264 Post-Panel Consolidation 10 pulmonary_embolism 45750 2 1 \N Process?
+12265 Post-Panel Consolidation 11 pulmonary_embolism 45787 0 1 \N Process
+12266 Post-Panel Consolidation 11 pulmonary_embolism 51290 10 1 Oxygen \N
+12267 Post-Panel Consolidation 10 pulmonary_embolism 51290 10 1 Oxygen \N
+12268 Post-Panel Consolidation 10 pulmonary_embolism 45864 10 1 Oxygen \N
+12269 Post-Panel Consolidation 12 pulmonary_embolism 45864 10 1 Oxygen \N
+12270 Post-Panel Consolidation 10 pulmonary_embolism 48822 10 1 Oxygen \N
+12271 Post-Panel Consolidation 12 pulmonary_embolism 48822 10 1 Oxygen \N
+12272 Post-Panel Consolidation 10 pulmonary_embolism 45900 10 1 Oxygen \N
+12273 Post-Panel Consolidation 12 pulmonary_embolism 45900 10 1 Oxygen \N
+12274 Post-Panel Consolidation 10 pulmonary_embolism 46090 0 1 \N Heparin protocol
+12275 Post-Panel Consolidation 10 pulmonary_embolism 45914 6 1 Troponin \N
+12276 Post-Panel Consolidation 10 pulmonary_embolism 50773 7 1 Blood Gas \N
+12277 Post-Panel Consolidation 10 pulmonary_embolism 50503 5 1 Blood Gas \N
+12278 Post-Panel Consolidation 10 pulmonary_embolism 45955 5 1 Blood Gas \N
+12279 Post-Panel Consolidation 11 pulmonary_embolism 45955 5 1 Blood Gas \N
+12280 Post-Panel Consolidation 8 pulmonary_embolism 50267 0 1 \N \N
+12281 Post-Panel Consolidation 10 pulmonary_embolism 44011 5 1 Corticosteroids \N
+12282 Post-Panel Consolidation 11 pulmonary_embolism 44011 5 1 Corticosteroids \N
+12283 Post-Panel Consolidation 11 pulmonary_embolism 62042 5 1 \N \N
+12284 Post-Panel Consolidation 10 pulmonary_embolism 45759 10 1 Coags \N
+12285 Post-Panel Consolidation 11 pulmonary_embolism 45759 10 1 Coags \N
+12286 Post-Panel Consolidation 8 pulmonary_embolism 45759 10 1 Coags \N
+12287 Post-Panel Consolidation 8 pulmonary_embolism 49268 0 1 \N \N
+12288 Post-Panel Consolidation 11 pulmonary_embolism 45770 10 1 Coags \N
+12289 Post-Panel Consolidation 8 pulmonary_embolism 45770 10 1 Coags \N
+12290 Post-Panel Consolidation 11 pulmonary_embolism 63730 0 1 \N Not for acute TB even if that was the diagnosis?
+12291 Post-Panel Consolidation 8 pulmonary_embolism 62175 4 1 \N For biopsy?
+12292 Post-Panel Consolidation 10 pulmonary_embolism 46030 0 1 NIPPV \N
+12293 Post-Panel Consolidation 11 pulmonary_embolism 46030 0 1 NIPPV \N
+12294 Post-Panel Consolidation 10 pulmonary_embolism 45921 10 1 Oxygen \N
+12295 Post-Panel Consolidation 12 pulmonary_embolism 45921 10 1 Oxygen \N
+12296 Post-Panel Consolidation 11 pulmonary_embolism 45921 10 1 Oxygen \N
+12297 Post-Panel Consolidation 11 pulmonary_embolism 46336 0 1 \N Override, process order
+12298 Post-Panel Consolidation 11 pulmonary_embolism 48544 5 1 Respiratory Culture \N
+12299 Post-Panel Consolidation 11 pulmonary_embolism 62023 5 1 Respiratory Virus Screen \N
+12300 Post-Panel Consolidation 10 pulmonary_embolism 63923 5 1 Respiratory Virus Screen \N
+12301 Post-Panel Consolidation 11 pulmonary_embolism 63923 5 1 Respiratory Virus Screen \N
+12302 Post-Panel Consolidation 11 pulmonary_embolism 60178 10 1 Anticoagulation \N
+12303 Post-Panel Consolidation 12 pulmonary_embolism 60178 10 1 Anticoagulation \N
+12304 Post-Panel Consolidation 10 pulmonary_embolism 41796 0 1 \N Presenting Symptom Diagnosis
+12305 Post-Panel Consolidation 12 pulmonary_embolism 44198 0 1 IVF \N
+12306 Post-Panel Consolidation 8 pulmonary_embolism 44313 0 1 \N Nebs, but this is more for long term use
+12307 Post-Panel Consolidation 10 pulmonary_embolism 45870 6 1 Troponin \N
+12308 Post-Panel Consolidation 11 pulmonary_embolism 45870 6 1 Troponin \N
+12309 Post-Panel Consolidation 8 pulmonary_embolism 45870 6 1 Troponin \N
+12310 Post-Panel Consolidation 11 pulmonary_embolism 45945 0 1 \N \N
+12311 Post-Panel Consolidation 8 pulmonary_embolism 65672 4 1 DVT US \N
+12312 Post-Panel Consolidation 11 pulmonary_embolism 45751 0 1 \N \N
+12313 Post-Panel Consolidation 10 pulmonary_embolism 45751 0 1 \N \N
+12314 Post-Panel Consolidation 11 pulmonary_embolism 45911 0 1 \N Process
+12315 Post-Panel Consolidation 10 pulmonary_embolism 45818 10 1 CXR \N
+12316 Post-Panel Consolidation 11 pulmonary_embolism 45818 10 1 CXR \N
+12317 Post-Panel Consolidation 10 pulmonary_embolism 50200 10 1 CXR \N
+12318 Post-Panel Consolidation 10 pulmonary_embolism 45801 10 1 CXR \N
+12319 Post-Panel Consolidation 11 pulmonary_embolism 45801 10 1 CXR \N
+12320 Post-Panel Consolidation 40 atrial_fibrillation 48871 0 0 \N \N
+12321 Post-Panel Consolidation 43 atrial_fibrillation 44389 -4 1 \N \N
+12322 Post-Panel Consolidation 43 atrial_fibrillation 61832 7 0 Echo \N
+12323 Post-Panel Consolidation 41 atrial_fibrillation 44250 8 0 Anticoaguation Match heparin
+12324 Post-Panel Consolidation 40 atrial_fibrillation 44276 5 1 \N Match midazolam
+12325 Post-Panel Consolidation 41 atrial_fibrillation 45778 1 1 \N \N
+12326 Post-Panel Consolidation 41 atrial_fibrillation 45770 5 1 INR Merge with INR just to represent checking coags
+12327 Post-Panel Consolidation 14 gi_bleed 45932 5 0 Hepatitis Panel \N
+12328 Post-Panel Consolidation 4 gi_bleed 45793 10 1 CBC Assume was GI Bleed case
+12329 Post-Panel Consolidation 4 gi_bleed 49481 10 1 GI EGD Assume was GI Bleed case
+12330 Post-Panel Consolidation 14 gi_bleed 46072 -5 0 CT Abdomen Treat all CT Abd/Pelvis orders as comparable for simplicity, so why different scores? Weird cirrhosis diagnostic, but maybe people are looking for bleeding vessel?
+12331 Post-Panel Consolidation 16 gi_bleed 45852 -5 0 CT Abdomen Treat all CT Abd/Pelvis orders as comparable for simplicity, so why different scores? Weird cirrhosis diagnostic, but maybe people are looking for bleeding vessel?
+12332 Post-Panel Consolidation 4 gi_bleed 46286 7 1 Coags Assume GI Bleed case
+12333 Post-Panel Consolidation 2 gi_bleed 46286 7 1 Coags \N
+12334 Post-Panel Consolidation 2 gi_bleed 45784 0 0 \N Post-stabilization is fine, but ignore as process order?
+12335 Post-Panel Consolidation 4 gi_bleed 45872 9 1 FFP Assume GI Bleed case
+12336 Post-Panel Consolidation 14 gi_bleed 45918 2 1 Lactate \N
+12337 Post-Panel Consolidation 16 gi_bleed 62144 0 1 \N \N
+12338 Post-Panel Consolidation 2 gi_bleed 45806 2 1 \N \N
+12339 Post-Panel Consolidation 14 gi_bleed 44294 0 1 \N Not relevant to anything?
+12340 Post-Panel Consolidation 14 gi_bleed 48815 0 1 \N Largely irrelevant in acute setting
+12341 Post-Panel Consolidation 2 gi_bleed 45787 0 1 \N Process order
+12342 Post-Panel Consolidation 4 gi_bleed 62171 0 1 \N Active bleeding, probably not right time for para, though SBP always to consider?
+12343 Post-Panel Consolidation 2 gi_bleed 45776 0 1 \N Process order
+12344 Post-Panel Consolidation 4 gi_bleed 45927 10 1 RBC Assume GI Bleed case
+12345 Post-Panel Consolidation 4 gi_bleed 45877 8 0 Coagulopathy Correction Assume GI Bleed case
+12346 Post-Panel Consolidation 4 gi_bleed 61993 8 0 Coagulopathy Correction Assume GI Bleed case
+12347 Post-Panel Consolidation 4 gi_bleed 45748 10 1 Transfuse RBC Assume GI Bleed case
+12348 Post-Panel Consolidation 4 gi_bleed 61975 10 1 Transfuse RBC Assume GI Bleed case
+12349 Post-Panel Consolidation 16 gi_bleed 45869 6 1 US Abdomen \N
+12350 Post-Panel Consolidation 14 gi_bleed 49408 6 1 US Abdomen \N
+12351 Post-Panel Consolidation 16 gi_bleed 49408 6 1 US Abdomen \N
+12352 Post-Panel Consolidation 16 gi_bleed 46343 6 1 US Abdomen \N
+12353 Post-Panel Consolidation 2 gi_bleed 44001 7 1 Coagulopathy Correction \N
+12354 Post-Panel Consolidation 14 gi_bleed 46018 0 1 \N \N
+12355 Post-Panel Consolidation 2 gi_bleed 45818 0 1 \N \N
+12356 Post-Panel Consolidation 30 meningitis 48603 0 1 \N Not relevant to test?
+12357 Post-Panel Consolidation 30 meningitis 61853 0 1 \N Not relevant to test?
+12358 Post-Panel Consolidation 31 meningitis 50841 0 1 \N \N
+12359 Post-Panel Consolidation 30 meningitis 44626 0 1 \N Nothing specific being treated? Lyme?
+12360 Post-Panel Consolidation 30 meningitis 61843 0 1 \N \N
+12361 Post-Panel Consolidation 30 meningitis 46160 0 1 \N Process order
+12362 Post-Panel Consolidation 30 meningitis 49142 1 1 \N Common meningitis cause, okay to review
+12363 Post-Panel Consolidation 31 meningitis 46103 0 1 \N \N
+12364 Post-Panel Consolidation 30 meningitis 50425 0 1 \N Too specific for meningitis eval
+12365 Post-Panel Consolidation 30 meningitis 44230 9 0 \N Should be dexamethasone, but give credit for steroids (mostly matter of dosing)
+12366 Post-Panel Consolidation 31 meningitis 45918 5 1 Lactate \N
+12367 Post-Panel Consolidation 30 meningitis 44586 9 0 \N Should be dexamethasone, but give credit for steroids (mostly matter of dosing)
+12368 Post-Panel Consolidation 31 meningitis 44641 2 1 \N Symptomatic management
+12369 Post-Panel Consolidation 31 meningitis 46065 -3 0 CT Head Unnecessary head imaging, consistent with head CT?
+12370 Post-Panel Consolidation 30 meningitis 45750 0 1 \N Process order
+12371 Post-Panel Consolidation 30 meningitis 44216 0 1 \N Symptom management? Not vomiting anyway
+12372 Post-Panel Consolidation 30 meningitis 45802 0 1 \N Process order
+12373 Post-Panel Consolidation 30 meningitis 48561 5 1 Pregnancy Test \N
+12374 Post-Panel Consolidation 31 meningitis 44198 5 1 IVF \N
+12375 Post-Panel Consolidation 30 meningitis 45782 0 1 \N No specific indication of urinary infection
+12376 Post-Panel Consolidation 30 meningitis 48519 0 1 \N \N
+12377 Post-Panel Consolidation 5001 neutropenic 45901 10 1 Blood Cultures \N
+12378 Post-Panel Consolidation 5001 neutropenic 45752 10 1 Blood Cultures \N
+12379 Post-Panel Consolidation 5003 neutropenic 45919 6 1 Blood Gas \N
+12380 Post-Panel Consolidation 5001 neutropenic 45788 8 1 CBC \N
+12381 Post-Panel Consolidation 5000 neutropenic 35733 0 -1 \N Doesn't cover Pseudomonas, but would cover most other things?
+12382 Post-Panel Consolidation 5003 neutropenic 49207 0 1 \N Process / Consult
+12383 Post-Panel Consolidation 5003 neutropenic 48711 0 1 \N Wrong type of isolation
+12384 Post-Panel Consolidation 5002 neutropenic 49054 5 1 \N \N
+12385 Post-Panel Consolidation 5003 neutropenic 45918 10 1 Lactate \N
+12386 Post-Panel Consolidation 5000 neutropenic 45918 10 1 Lactate \N
+12387 Post-Panel Consolidation 5000 neutropenic 45894 0 1 \N No symptoms for pancreatitis?
+12388 Post-Panel Consolidation 5001 neutropenic 45771 10 1 Metabolic Panel \N
+12389 Post-Panel Consolidation 5001 neutropenic 48960 8 1 \N \N
+12390 Post-Panel Consolidation 5003 neutropenic 45853 0 1 \N Not relevant? No hx or sx of CHF
+12391 Post-Panel Consolidation 5000 neutropenic 61823 0 1 \N Process order
+12392 Post-Panel Consolidation 5000 neutropenic 45802 0 1 \N Process order
+12393 Post-Panel Consolidation 5003 neutropenic 52757 0 1 \N Process order
+12394 Post-Panel Consolidation 5002 neutropenic 62023 6 1 Respiratory Virus Screen \N
+12395 Post-Panel Consolidation 5001 neutropenic 44198 10 1 IVF \N
+12396 Post-Panel Consolidation 5001 neutropenic 45751 6 1 UA + Culture \N
+12397 Post-Panel Consolidation 5002 neutropenic 45751 6 1 UA + Culture \N
+12398 Post-Panel Consolidation 5001 neutropenic 45782 6 1 UA + Culture \N
+12399 Post-Panel Consolidation 5001 neutropenic 45818 10 1 CXR \N
+12400 Post-Panel Consolidation 11 pulmonary_embolism 61982 0 1 \N Process
+12401 Post-Panel Consolidation 10 pulmonary_embolism 44315 4 1 Aspirin \N
+12402 Post-Panel Consolidation 8 pulmonary_embolism 44240 0 1 \N Not ACS anyway? Type 2 NSTEMI?
+12403 Post-Panel Consolidation 11 pulmonary_embolism 45760 7 1 Blood Gas \N
+12404 Post-Panel Consolidation 8 pulmonary_embolism 65695 0 0 \N Override, neutralize non-procedural consults
+12405 Post-Panel Consolidation 11 pulmonary_embolism 49207 0 1 \N Consult
+12406 Post-Panel Consolidation 11 pulmonary_embolism 45811 2 1 \N \N
+12407 Post-Panel Consolidation 10 pulmonary_embolism 44211 7 1 Nebs \N
+12408 Post-Panel Consolidation 10 pulmonary_embolism 46020 7 1 Blood Gas \N
+12409 Post-Panel Consolidation 11 pulmonary_embolism 44299 6 1 Antibiotics-CAP \N
+12410 Post-Panel Consolidation 11 pulmonary_embolism 45914 6 1 Troponin \N
+12411 Post-Panel Consolidation 8 pulmonary_embolism 45776 0 1 \N Override, process
+12412 Post-Panel Consolidation 11 pulmonary_embolism 45830 0 0 \N \N
+12413 Post-Panel Consolidation 10 pulmonary_embolism 44198 0 1 IVF \N
+12414 Post-Panel Consolidation 10 pulmonary_embolism 45766 0 1 \N Process
+\.
+
+
+--
+-- Name: sim_grading_key_sim_grading_key_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_grading_key_sim_grading_key_id_seq', 12414, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_note.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_note.dump.sql
new file mode 100644
index 00000000..bec16804
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_note.dump.sql
@@ -0,0 +1,71 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_note; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_note (sim_note_id, sim_state_id, note_type_id, author_type_id, service_type_id, relative_state_time, content) FROM stdin;
+49 8 2 2001 1500 0 Patient still short of breath, but improved compared to this morning now on oxygen and tolerated anticoagulation without incident.
Admitting team will transfer care of patient in the next hour. They request that you complete any further diagnostics or therapeutics needed before then.
Physical Exam
T: 98.6F, BP: 130/85, HR: 92, RR: 18, O2: 93% on 6L nasal cannula - General: Resting on gurney
- HEENT: Lips no longer blue
- Neck: JVP ~6cm.
- Lungs: Good air movement. Minimal faint wheezes at base.
- Cardiac: Regular rate and rhythm.
- Extremities: Trace pedal edema. 1+ DP pulses.
+8 3 3 2001 1003 0 CC:
Chest pain HPI:
62M with hx HTN, HLD, T2DM, smoker.
Drove cross country over past three days to meet family in usual state of health. At outdoor festival 2 hours ago, climbing up hill when complained to wife of onset of feeling winded and chest pain. Sat down in shade and drank water with some relief of symptoms over several minutes. 45 minutes later, continued to feel low-grade chest pain and pressure, so family brought in to emergency room for evaluation.
Review of Systems
Otherwise negative except as per HPI, including: Denies fever, chills, cough, palpitations, abdominal pain, nausea, vomiting, leg pain or edema. Medical History
- Hypertension
- Hyperlipidemia
- Type 2 Diabetes
- Tobacco Use
Surgical History
- Appendectomy at 28 years old
Allergies:
NKDA Medications:
- Hydrochlorothiazide 25mg daily
- Lisinopril 5mg daily
- Metformin 1000mg bid
Family/Social Hx:
Mother died of stroke at 85 years old. Father still alive at 89 years old with prostate cancer.
Married with two children. Vietnam veteran. Works as building contractor. Physical Exam
T: 98.8F, BP: 145/84, HR: 103, RR: 19, O2: 92% - General: Uncomfortable, sweating, but no acute distress, sitting up in bed
- Neck: Supple, no lymphdenopathy, JVP ~6-8cm
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales. Tachypneic.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops. Chest wall non-tender to palpation.
- Abdomen: Soft, non-tender, non-distended. Normo-active bowel sounds. No organomegaly or masses noted
- Extremities: No clubbing, cyanosis, edema. 2+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes or lesions noted.
+1 1 1 2001 1500 0
+39 40 3 2001 1003 0 CC:
Palpitations HPI:
66 F hx HTN, HFpEF Patient reports palpitations and shortness of breath since 6am this morning. Normally can walk 1/2 mile without shortness of breath. Lives alone, called EMS this morning. History of CHF, HTN. States she takes her medications. Also reports worsening dizziness since this morning. No chest pain reported. EMS noted patient was tachycardic. 5mg IV diltiazem given in the field
ROS:
Otherwise negative except as per HPI, including; Denies fever, chills, chest pain. Denies recent travel. Denies orthopnea. Denies leg swelling. Denies dyspnea on exertion. Denies weakness/sensory changes. Medical History
Allergies:
NKDA Medications:
- Hydrochlorothiazide
- Ibuprofen PRN
Family/Social Hx:
Father with a history of coronary artery disease in his 50s. Denies drug use/alcohol Physical Exam
T: 97.9F, BP: 83/59, HR: 153, RR: 24, O2: 92%% - General: Fatigued appearing
- HEENT: No conjunctival pallor. EOMI, PERRL, no mucositis or oral lesions noted.
- Neck: Supple, JVP 9cm above the sternal angle
- Lungs: Significant crackles throughout the lung fields
- Cardiac: Rapid, irregularily irregular No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender and non-distended without organomegaly.
- Rectal: deferred
- Extremities: cool with 3+ pitting edema No clubbing, cyanosis
- Neuro: Alert and oriented x2, lethargic. Not cooperative with neuro-exam, but moving all extremities.
- Skin: no rashes
+46 10 3 2001 1003 0 CC:
Shortness of Breath HPI:
70M hx CAD, systolic CHF, COPD, smoking. Patient complains of acute on chronic shortness of breath since this morning. Has been hospitalized before for both COPD and CHF exacerbations in prior 5 years as have developed more chronic health problems, but endorses taking all his medications as prescribed. Just returned from family vacation in Hawaii, where may have been more lax with dietary choices. Endorses some dry cough, but similar to his chronic cough. Having difficulty providing further history due to shortness of breath.
ROS:
Otherwise negative except as per HPI, including; Denies fever, chills, chest pain, orthopnea, paroxysmal nocturnal dyspnea. Not aware of any specific sick contacts, but was in many busy travel/tourist locations (just got off plane this morning). Medical History
- Coronary Artery Disease
- CHF (EF 35% last checked 4 months ago)
- COPD
- Tobacco Smoking (1 pack per day x30 years, active)
Allergies:
NKDA Medications:
- Aspirin
- Atorvastatin
- Carvedilol
- Losartan
- Furosemide
- Tiotropium
- Albuterol-Ipratropium PRN (used twice this morning, with little improvement in symptoms)
Family/Social Hx:
Father died of heart attack in 80s. Physical Exam
T: 98.5F, BP: 141/92, HR: 109, RR: 25, O2: 81% on room air - General: Short of breath, moderate distress. No change with lying or sitting up.
- HEENT: Lips tinged blue. EOMI, PERRL, no mucositis or oral lesions noted.
- Neck: Supple, JVP ~6cm. No hepatojugular reflex.
- Lungs: Tachypneic. Wheezes in bilateral bases, but good air movement. No significant crackles.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-distended. Thin. Normo-active bowel sounds. Mild epigastric tenderness.
- Extremities: Trace pedal edema. No clubbing, cyanosis. 1+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: Pale. No rashes or lesions noted.
+47 11 2 2001 1500 0 Patient still short of breath, but more comfortable with supplemental oxygen. Physical Exam
T: 98.5F, BP: 132/87, HR: 96, RR: 20, O2: 92% on 6L nasal cannula - General: Resting on gurney, mildly short of breath
- HEENT: Lips no longer blue
- Neck: JVP ~6cm.
- Lungs: Faint wheezes in bilateral bases, but good air movement. No significant crackles.
- Cardiac: Rapid but Regular rate and rhythm.
- Extremities: Trace pedal edema. 1+ DP pulses.
+48 12 2 2001 1500 0 Patient tolerating anticoagulation administration, but remains acutely short of breath Physical Exam
T: 98.7F, BP: 142/91, HR: 112, RR: 26, O2: 80% on room air - General: Short of breath, moderate distress. No change with lying or sitting up.
- HEENT: Lips tinged blue.
- Neck: JVP ~6cm
- Lungs: Tachypneic. Wheezes in bilateral bases, but good air movement. No significant crackles.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Extremities: Trace pedal edema.
+23 4 2 2001 1002 0 Patient suffered a pulseless arrest. Code blue was called and the ICU team has taken over management as they attempt cardiopulmonary resuscitation.
+21 16 2 2001 1500 0 Patient stopped spitting up blood. Physical Exam
T: 98.1F, BP: 108/61, HR: 97, RR: 18, O2: 97% - General: Pale, fatigued.
- HEENT: Conjunctival pallor. Scleral icterus.
- Lungs: Clear to auscultation bilaterally.
- Cardiac: Rapid but Regular
- Abdomen: Soft. Moderately-distended. Hyper-active bowel sounds. Mild RUQ and epigastric tenderness.
- Extremities: 1+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant. Mild asterixis.
- Skin: Pale. Scattered spider angiomata.
+41 44 2 2001 1500 0 Unused state
+36 33 2 2001 1500 0 Patient feels headache may be worsening, is having a hard time keeping her eyes open with the lights on in the room. Physical Exam
T: 102.1F, BP: 98/62, HR: 115, RR: 19, O2: 96% - General: Appears uncomfortable, eyes closed, lying in bed.
- HEENT: Ability to perform flexion/extension of neck limited. EOMI, PERRL, no mucositis or oral lesions noted.
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended.
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Alert and oriented, although uncomfortable and a bit somnolent. CN II-XII intact. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes.
+37 31 2 2001 1500 0 The patient still feels very tired but has defervesced and overall feels less uncomfortable.
Admitting team indicates they well assume care of patient in an hour and request you complete any diagnostics or therapeutics needed in the meantime.
Physical Exam
T: 100.1F, BP: 110/70, HR: 95, RR: 16, O2: 96% - General: Appears mildly uncomfortable but improved from prior, eyes open most of the time, lying in bed.
- HEENT: Ability to perform flexion/extension of neck limited. EOMI, PERRL, no mucositis or oral lesions noted.
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended.
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Alert and oriented, although mildly uncomfortable. CN II-XII intact. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes.
+45 46 8 2001 1500 0 Cardiology is busy with another emergent case. Recommends hemodynamic stabilization and management of secondary risks until they can arrive.
+28 18 2 2001 1500 0 Patient feels fatigued and with abdominal discomfort. Physical Exam
T: 98.5F, BP: 111/74, HR: 102, RR: 26, O2: 96% - General: Tired
- Lungs: Deep sighing respirations
- Cardiac: Rapid but Regular
- Abdomen: Soft, non-distended. Generalized tenderness without guarding or rebound
- Extremities: 2+ DP pulses.
- Neuro: Fatigued, but alert and oriented. Grossly non-focal. Moving all extremities.
- Skin: No rashes or lesions noted.
+29 19 2 2001 1500 0 Patient feeling much improved compared to previous Physical Exam
T: 98.8F, BP: 123/78, HR: 82, RR: 16, O2: 97% - General: Resting comfortably
- Lungs: Normal respiratory effort, CTAB
- Cardiac: Regular Rate and Rhythm
- Abdomen: Soft, non-distended, no focal tenderness
- Extremities: 2+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Moving all extremities.
- Skin: No rashes or lesions noted.
+30 20 2 2001 1500 0 Patient feeling restless, uncomfortable, trembling, difficulty concentrating Physical Exam
T: 97.8F, BP: 95/57, HR: 137, RR: 31, O2: 95% - General: Trembling, difficult to arouse
- HEENT: PERRL
- Lungs: Deep sighing respirations. CTAB
- Cardiac: Rapid but Regular Rhythm
- Abdomen: Soft, non-distended, generalized tenderness to palpation without rebound or guarding
- Extremities: Thready DP pulses.
- Neuro: Drowsy and difficult to arouse. Trembling extremities
- Skin: Clammy
+10 7 3 2001 1003 0 CC:
Vomiting HPI:
57M hx HTN, smoking, and knee arthritis. Patient from South Korea, here for travel, hiking across multiple tourist destinations over the past week. Has some chronic R knee arthritis pain with flare in past week with increasing walking. Taking Motrin 600mg about three times per day since to manage pain. Feeling a little lightheaded this morning, ate a cheese burrito. Vomited black, gritty material two times later in the morning and continuing to feel lightheaded. Mild abdominal pain and shortness of breath.
ROS:
Otherwise negative except as per HPI, including; Denies fever, chills, chest pain. Denies diarrhea, constipation or otherwise abnormal stools, normal in consistency as of last night. Medical History
- Hypertension
- Tobacco Smoking
- Osteoarthritis, Knee
Allergies:
NKDA Medications:
- Hydrochlorothiazide
- Ibuprofen PRN
Family/Social Hx:
Mother died of gastric cancer in her 60s. Physical Exam
T: 97.9F, BP: 101/62, HR: 105, RR: 19, O2: 96% - General: Pale, fatigued
- HEENT: Conjunctival pallor. EOMI, PERRL, no mucositis or oral lesions noted. Black stains around lips.
- Neck: Supple, JVP flat
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-distended. Hyper-active bowel sounds. Mild epigastric tenderness.
- Rectal: Guaic positive black stool in rectal vault
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: Pale No rashes or lesions noted.
+24 2 8 2001 1503 0 GI performs an upper GI endoscopy, finding multiple esophageal varices. The largest bleeding varix is banded. This has stabilized the patient's acute bleed. The GI team advises you to continue your medical management for the patient.
The admitting medical team indicates they will assume care of the patient in an hour.
+27 21 2 2001 1500 0 Patient feels exhausted and with abdominal discomfort.
Physical Exam
T: 98.4F, BP: 105/72, HR: 117, RR: 29, O2: 96%, BMI: 36 - General: Lethargic but arousable
- HEENT: EOMI, PERRL, no mucositis or oral lesions noted. Sweet odor on breath
- Neck: Supple, JVP flat
- Lungs: Deep sighing respirations. Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-distended. Generalized tenderness without guarding or rebound. Normo-active bowel sounds.
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Drowsy but arousable. Grossly non-focal. Moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes or lesions noted.
+17 14 2 2001 1500 0 Patient feels lightheaded, with mild abdominal pain and shortness of breath. Occasionally spitting up some red blood. Physical Exam
T: 97.9F, BP: 101/62, HR: 105, RR: 19, O2: 96% - General: Pale, fatigued. Occasionaly spitting up some red blood
- HEENT: Conjunctival pallor. Scleral icterus. EOMI, PERRL, no mucositis or oral lesions noted.
- Neck: Supple, JVP flat
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft. Moderately-distended. Hyper-active bowel sounds. Mild RUQ and epigastric tenderness.
- Rectal: Guaic positive black stool in rectal vault
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant, moving all extremities. No overt cerebellar signs / incoordination. Mild asterixis.
- Skin: Pale. Scattered spider angiomata.
+20 15 2 2001 1500 0 Patient drifting off in alertness, difficult to arouse. Continues to spit up red blood. Physical Exam
T: 97.2F, BP: 85/54, HR: 127, RR: 29, O2: 95% - General: Ill appearing, very pale
- HEENT: Conjunctival pallor. Scleral icterus. PERRL
- Lungs: Rapid, shallow breaths. Clear to auscultation bilaterally
- Cardiac: Very Rapid
- Abdomen: Soft. Moderately-distended. Hyper-active bowel sounds.
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Drifting off, difficult to arouse
- Skin: Pale. Scattered spider angiomata.
+40 43 2 2001 1500 0 Patient is lethargic and very short of breath Physical Exam
T: 97.9F, BP: 83/59, HR: 153, RR: 24, O2: 92%% - General: Fatigued appearing, dozing off
- Neck: Supple, JVP 9cm above the sternal angle
- Lungs: Significant crackles throughout the lung fields
- Cardiac: Rapid, irregularily irregular No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender and non-distended without organomegaly.
- Extremities: cool with 3+ pitting edema
- Neuro: Alert and oriented x2, lethargic. Not cooperative with neuro-exam, but moving all extremities.
+42 45 2 2001 1500 0 After infusion of antiarrhythmic, patients heart rate goes down to 135 but reverts to high 140s one minute after without other significant change in vital signs. Patient does not feel improved.
+43 41 2 2001 1500 0 After synchronized direct current cardioversion, patient's irregular heart rhythm convert to normal sinus rhythm. Patient reports breathing and dizziness have improved.
Admitting team indicate they will transfer care in one hour and request that you complete any additional diagnostics and therapeutics needed until then.
Physical Exam
T: 98.1F, BP: 138/81, HR: 87, RR: 18, O2: 97%% - General: No apparent distress
- Lungs: Slight crackles at the bases bilaterally; no wheezes or rhonchi
- Cardiac: Regular, no murmurs rubs, or gallups
- Abdomen: Soft. Nontender and nondistended.
- Extremities: 1+ DP pulses, warm, 3+ Pitting edema
- Neuro: Alert and oriented. Grossly non-focal. Conversant.
+44 42 2 2001 1500 0 During adenosine infusion, patient's heart rate slows and monitor reveals irregular rhythm consistent with atrial fibrillation. Heart rate reverts back to high 140s within a few seconds.
+33 5002 2 2001 1500 0 Patient feels more awake, but still hot and lousy. Physical Exam
T: 101.8F, BP: 105/70, HR: 98, RR: 16, O2: 96% - General: Sweating
- HEENT: No mucositis or oral lesions noted
- Neck: Supple, shotty lymphdenopathy, JVP ~8cm
- Lungs: Clear to auscultation bilaterally.
- Cardiac: Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended. Normo-active bowel sounds.
- Extremities: 1+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal.
- Skin: No rashes or lesions noted.
- Lines: R arm PICC line without surrounding erythema, drainage, or tenderness
+22 17 8 2001 1503 0 GI Consult advises you stabilize patient hemodynamics and coagulopathy before pursuing endoscopic intervention. Please consult GI again once patient has been stabilized.
+34 5003 2 2001 1500 0 Patient reports feeling relatively better, not so hot or lightheaded.
Admitting team indicates they will assume care of patient in another hour and request you complete any further diagnostics or therapeutics in the meantime.
T: 98.8F, BP: 116/75, HR: 84, RR: 14, O2: 97%
- General: Improved, resting on bed
- HEENT: No mucositis or oral lesions noted
- Neck: Supple,shotty lymphdenopathy, JVP ~8cm
- Lungs: Clear to auscultation bilaterally
- Cardiac: Regular rate and rhythm
- Abdomen: Soft, non-tender, non-distended. Normo-active bowel sounds
- Extremities: 2+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant
- Skin: No rashes or lesions noted.
- Lines: R arm PICC line without surrounding erythema, drainage, or tenderness
+11 9 3 2001 1003 36000 CC:
Fatigue, abdominal pain HPI:
26F G1P1 hx T1DM, HLD. Brought into ER in middle of night as husband noting several hours of progressively worsening abdominal pain and fatigue, with husband having difficulty keeping patient awake. Patient's 2 year old child in daycare with diarrhea last week. Past few days patient with minimal diarrhea, but nausea and poor appetite. Patient self-titrated glargine insulin down to half dose and has been holding prandial insulin doses while feeling ill.
ROS:
Otherwise negative except as per HPI, including; Denies fever, chills, chest pain. Denies diarrhea, constipation or otherwise abnormal stools, normal in consistency as of last night. Medical History
- Type 1 Diabetes since teenager
- Hyperlipidemia
Allergies:
NKDA Medications:
- Insulin glargine qhs
- Insulin lispro AC & qhs
- Atorvastatin
Family/Social Hx:
Mother with hypothyroidism from Hashimoto's thyroiditis in 30s.
+38 32 2 2001 1500 0 The patient continues to feel worse, and her nurse orders an RRT. The MICU fellow responds and recommends changing the empiric regimen for bacterial meningitis to vancomycin and ceftriaxone, to be given stat. T: 103.1F, BP: 86/52, HR: 128, RR: 21, O2: 96% - General: Appears uncomfortable, eyes closed, lying in bed.
- HEENT: Ability to perform flexion/extension of neck limited. EOMI, PERRL, no mucositis or oral lesions noted.
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended.
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Alert and oriented, although quite uncomfortable and a bit somnolent. CN II-XII intact. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes.
+31 5000 3 2001 1003 0 CC:
Fever and chills HPI:
32M was otherwise healthy until 1 month ago when developed night sweats and low grade fevers. Subsequent workup by Heme/Onc diagnosed patient with DLBCLymphoma for which he underwent first cycle of inpatient R-CHOP chemotherapy 10 days ago. He was due to see Heme/Onc for follow-up therapy plans today, but was then directed to the emergency department based on his present symptoms.
Patient reporting new-onset high fever, chills, and rigors, for past few hours. Moderately short of breath, but no cough. No urination since woke up this morning, though no specific pain.
Except for nausea, general weakness, and hair thinning after his last course of chemotherapy, ROS otherwise negative, including denies abdominal pain, diarrhea, rashes/lesions.
Medical History
- Diffuse Large B-Cell Lymphoma
Allergies:
NKDA Medications:
- Rituximab, Cyclophosphamide, Doxorubicin, Vincristine, Prednisone
Family/Social Hx:
No known family history of heme malignancy. Mother and father alive in 60s with serious medical isues. Two siblings, aged 37 and 28. Physical Exam
T: 102F, BP: 90/57, HR: 126, RR: 24, O2: 98% - General: Shivering, wrapped in blankets in bed
- HEENT: EOMI, PERRL, no mucositis or oral lesions noted
- Neck: Supple, shotty lymphdenopathy, JVP ~6cm
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended. Normo-active bowel sounds. No organomegaly or masses noted
- Rectal: No perirectal abscess or lesions
- Extremities: No clubbing, cyanosis, edema. Cool feet. Thready DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes or lesions noted.
- Lines: R arm PICC line without surrounding erythema, drainage, or tenderness
+32 5001 2 2001 1500 0 Patient reports feeling less hot, but still lightheaded. Physical Exam
T: 99F, BP: 92/61, HR: 119, RR: 19, O2: 96% - General: Tired, ill appearing
- HEENT: EOMI, PERRL, no mucositis or oral lesions noted
- Neck: Supple, shotty lymphdenopathy, JVP ~6cm
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended. Normo-active bowel sounds. No organomegaly or masses noted
- Rectal: No perirectal abscess or lesions
- Extremities: No clubbing, cyanosis, edema. Cool feet. Thready DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes or lesions noted.
- Lines: R arm PICC line without surrounding erythema, drainage, or tenderness
+16 13 3 2001 1003 7200 CC:
Vomiting blood HPI:
59M hx HTN, osteoarthritis. Patient here for travel from South Korea, hiking across multiple vineyards over the past week. Has some chronic R knee arthritis pain with flare in past week with increasing walking. Taking Motrin and drinking wine multiple times per day since to manage pain. Feeling a little lightheaded this morning, ate a cheese burrito. Vomited black, gritty material shortly thereafter, and then a half cup of red blood. Patient continues to feel lightheaded, with mild abdominal pain and shortness of breath.
ROS:
Otherwise negative except as per HPI, including; Denies fever, chills, chest pain. Denies diarrhea, constipation or otherwise abnormal stools, normal in consistency as of last night. Medical History
- Hypertension
- Osteoarthritis, Knee
Allergies:
NKDA Medications:
- Hydrochlorothiazide
- Ibuprofen PRN
Family/Social Hx:
Mother died of gastric cancer in her 60s. 20 pack year tobacco smoker. Drinks up to a bottle of soju daily.
+15 6 3 2001 1003 0 CC:
Fever and chills HPI:
32M recent dx DLBCLymphoma and underwent first cycle of R-CHOP chemotherapy 10 days ago.
Patient seen at infusion center today for labs and PICC line dressing change.
Patient reporting new-onset high fever, chills, and rigor, for past few hours but no other focal symptoms. Labs in clinic today noted WBC 0.8, Hgb 11, Plt 96 with an absolute neutrophil count of 80. Patient direct admitted to the hospital for febrile neutropenia.
Medical History
- Diffuse Large B-Cell Lymphoma
Allergies:
NKDA Medications:
- Rituximab, Cyclophosphamide, Doxorubicin, Vincristine, Prednisone
Family/Social Hx:
No known family history of heme malignancy. Mother and father alive in 60s with serious medical isues. Two siblings, aged 37 and 28. Physical Exam
T: 102F, BP: 90/43, HR: 128, RR: 24, O2: 98% - General: Shivering, wrapped in blankets in bed
- HEENT: EOMI, PERRL, no mucositis or oral lesions noted
- Neck: Supple, shotty lymphdenopathy, JVP ~6cm
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended. Normo-active bowel sounds. No organomegaly or masses noted
- Rectal: No perirectal abscess or lesions
- Extremities: No clubbing, cyanosis, edema. Cool feet. 2+ DP pulses.
- Neuro: Alert and oriented. Grossly non-focal. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes or lesions noted.
- Lines: R arm PICC line without surrounding erythema, drainage, or tenderness
+35 30 3 2001 1003 0 CC:
Headache HPI:
25 year-old woman, no significant PMH, who was at her job as an office assistant when she experienced rapidly progressive onset of headaches and photophobia over the course of hours.
She was last out of the country a month ago visiting her mother in Germany who was in the hospital recovering from a hip surgery. She believes she is up to date on all recommended vaccinations.
ROS:
Otherwise negative except as per HPI, including: Reports no new rashes. Medical History
Healthy, sees her primary care physician once a year.
Allergies:
NKDA Medications:
Family/Social Hx:
Parents both alive, both with history of HTN and DM. One brother, healthy.
No tobacco. Drinks average 1 glass of wine per night.
Sexually active with two male partners in past year. Does not regularly use condoms. Physical Exam
T: 101.2F, BP: 104/68, HR: 104, RR: 18, O2: 96% - General: Appears uncomfortable, eyes closed, lying in bed.
- HEENT: Pain limited flexion/extension of neck. EOMI, PERRL, no mucositis or oral lesions noted.
- Lungs: Clear to auscultation bilaterally. No wheezes/rhonchi/rales.
- Cardiac: Rapid but Regular rate and rhythm. No murmurs, rubs or gallops.
- Abdomen: Soft, non-tender, non-distended.
- Extremities: No clubbing, cyanosis, edema. 1+ DP pulses.
- Neuro: Alert and oriented, although uncomfortable. CN II-XII intact. Conversant, moving all extremities. No overt cerebellar signs / incoordination.
- Skin: No rashes.
+\.
+
+
+--
+-- Name: sim_note_sim_note_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_note_sim_note_id_seq', 49, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/db/definition/simdata/sim_note_type.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_note_type.dump.sql
similarity index 85%
rename from medinfo/db/definition/simdata/sim_note_type.dump.sql
rename to medinfo/cpoe/cpoeSim/simdata/sim_note_type.dump.sql
index ee5164fc..1b67a279 100644
--- a/medinfo/db/definition/simdata/sim_note_type.dump.sql
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_note_type.dump.sql
@@ -2,19 +2,24 @@
-- PostgreSQL database dump
--
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
-
-SET search_path = public, pg_catalog;
+SET row_security = off;
--
-- Data for Name: sim_note_type; Type: TABLE DATA; Schema: public; Owner: -
--
-COPY sim_note_type (sim_note_type_id, name, priority, description) FROM stdin;
+COPY public.sim_note_type (sim_note_type_id, name, priority, description) FROM stdin;
1 H&P \N \N
2 Progress Note \N \N
3 ED Provider Note \N \N
diff --git a/medinfo/db/definition/simdata/sim_order_result_map.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_order_result_map.dump.sql
similarity index 98%
rename from medinfo/db/definition/simdata/sim_order_result_map.dump.sql
rename to medinfo/cpoe/cpoeSim/simdata/sim_order_result_map.dump.sql
index 8998c66c..2d78a6cc 100644
--- a/medinfo/db/definition/simdata/sim_order_result_map.dump.sql
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_order_result_map.dump.sql
@@ -2,19 +2,24 @@
-- PostgreSQL database dump
--
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
-
-SET search_path = public, pg_catalog;
+SET row_security = off;
--
-- Data for Name: sim_order_result_map; Type: TABLE DATA; Schema: public; Owner: -
--
-COPY sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result_id, turnaround_time) FROM stdin;
+COPY public.sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result_id, turnaround_time) FROM stdin;
33 45821 10 300
34 45821 20 300
35 45821 30 300
@@ -102,18 +107,9 @@ COPY sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result
117 45753 1000003 900
118 45753 16050 900
119 45887 13100 900
-120 45866 19010 900
-121 45866 19020 900
-122 45866 19030 900
-123 45866 19040 900
-124 45866 19050 900
-125 45866 19060 900
-126 45866 19070 900
127 45844 1000007 900
128 45763 1000008 900
129 45753 1000009 900
-130 45866 19080 900
-131 45866 19090 900
132 45844 1000010 900
133 45753 1000011 900
134 45788 1000012 900
@@ -6024,7 +6020,6 @@ COPY sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result
6039 66043 1000120 900
6040 65729 1002959 900
6041 61062 1001670 900
-6042 45866 1002960 900
6043 61832 1002961 900
6044 64143 1000289 900
6045 65512 1001418 900
@@ -7027,7 +7022,6 @@ COPY sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result
7055 61062 1003493 900
7056 63073 1003494 900
7057 48503 1003495 900
-7058 45866 1003490 900
7059 51689 1002960 900
7060 51689 1003490 900
7061 62075 1003490 900
@@ -7970,7 +7964,6 @@ COPY sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result
7998 65682 1004190 900
7999 66085 1004191 900
8000 66088 1004192 900
-8001 45866 1004198 300
8004 45818 1004194 900
8005 45801 1004194 900
8006 50200 1004194 300
@@ -7984,6 +7977,117 @@ COPY sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result
8014 45955 1000003 900
8015 45955 1000009 900
8016 45955 1000011 900
+8068 49083 125 900
+8077 62831 131 3600
+8078 46039 131 3600
+8079 46065 131 3600
+8080 62831 131 3600
+8081 46039 131 3600
+8082 46065 131 3600
+8092 45804 133 3600
+8093 45983 133 3600
+8094 48524 133 3600
+8095 50241 133 3600
+8096 52016 133 3600
+8097 64739 133 3600
+8098 65940 133 3600
+8099 50098 133 3600
+8100 49965 133 3600
+8200 61832 200 1800
+8001 45866 1004198 300
+8101 45913 1004206 900
+8102 49115 1004206 900
+8103 49869 1004206 900
+8104 48559 1004206 900
+8105 49653 1004206 900
+8106 51403 1004206 900
+8107 65696 1004206 900
+8108 65692 1004206 900
+8109 65661 1004206 900
+8110 66074 1004206 900
+8111 65672 1004206 900
+8112 65656 1004206 900
+8113 50199 1004208 3600
+8114 52080 1004194 900
+8115 54044 1004194 900
+8116 51726 1004194 900
+8117 54129 1004194 900
+8118 62362 1004194 900
+8119 49454 1004194 900
+8120 48569 1004194 900
+8121 52236 1004194 900
+8122 49006 1004194 900
+8123 45963 200 1800
+8124 62176 200 1800
+8125 62083 1004207 3600
+8126 52590 1004207 3600
+8127 49780 200 1800
+8128 49285 1004207 3600
+8129 45984 200 1800
+8130 49981 1004207 3600
+8131 56934 200 1800
+8132 61848 1004207 3600
+8133 61122 200 1800
+8134 62785 1004207 3600
+8135 63911 1004207 3600
+8136 65546 1004207 3600
+8137 65744 200 1800
+8138 65745 200 1800
+8139 57038 200 1800
+8140 58178 200 1800
+8141 58123 200 1800
+8142 48597 200 1800
+8143 46111 200 1800
+8144 65433 1004207 3600
+8145 64143 200 1800
+8146 50123 200 1800
+8147 62645 1004207 3600
+8148 56902 1004207 3600
+8149 58456 200 1800
+8150 45889 131 3600
+8151 46077 131 3600
+8152 45858 1004196 3600
+8153 45852 1004196 3600
+8154 48604 1004195 3600
+8155 48716 1004196 3600
+8156 48698 1004195 3600
+8157 48522 1004195 3600
+8158 48716 1004195 3600
+8159 48676 1004195 3600
+8160 46084 1004195 3600
+8161 46084 1004196 3600
+8162 48604 1004196 3600
+8163 46072 1004196 3600
+8164 45762 1004195 3600
+8165 50259 1004195 3600
+8166 50259 1004196 3600
+8167 49836 1004196 3600
+8168 45946 1004196 3600
+8169 49031 1004195 3600
+8170 62133 1004196 3600
+8171 50853 1004196 3600
+8172 49922 1004196 3600
+8173 49073 1004195 3600
+8174 61058 1004195 3600
+120 45866 19010 300
+121 45866 19020 300
+122 45866 19030 300
+123 45866 19040 300
+124 45866 19050 300
+125 45866 19060 300
+126 45866 19070 300
+130 45866 19080 300
+131 45866 19090 300
+6042 45866 1002960 300
+7058 45866 1003490 300
+-571 63923 18030 900
+-572 63923 18040 900
+-573 63923 18050 900
+-574 63923 18060 900
+-575 63923 18070 900
+-576 63923 18080 900
+-577 63923 18090 900
+-578 63923 18100 900
\.
@@ -7991,7 +8095,7 @@ COPY sim_order_result_map (sim_order_result_map_id, clinical_item_id, sim_result
-- Name: sim_order_result_map_sim_order_result_map_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
--
-SELECT pg_catalog.setval('sim_order_result_map_sim_order_result_map_id_seq', 8016, true);
+SELECT pg_catalog.setval('public.sim_order_result_map_sim_order_result_map_id_seq', 8174, true);
--
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_patient.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_patient.dump.sql
new file mode 100644
index 00000000..4673e1bd
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_patient.dump.sql
@@ -0,0 +1,466 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.9
+-- Dumped by pg_dump version 9.6.9
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_patient; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_patient (sim_patient_id, name, age_years, gender, study_list) FROM stdin;
+23 (User3) Hematemesis, Alcohol 59 Male \N
+31 (User4) Hematemesis, Alcohol 59 Male \N
+35 (User5) Hematemesis, Alcohol 59 Male \N
+39 (User6) Hematemesis, Alcohol 59 Male \N
+7 (xTemplate) Black vomit 57 Male \N
+9 (Template) Chest Pain 62 Male \N
+22 (Template) Diabetic Fatigue 26 Female \N
+6 (xTemplate) DLBCL Fever 32 Male \N
+48 (Template) Headache 25 Female \N
+49 (Template) Palpitations 66 Female \N
+13 (User1) Chest Pain 62 Male \N
+16 (User1) Diabetic fatigue 26 Female \N
+14 (User1) DLBCL Fever 32 Male \N
+15 (User1) Vomiting 57 Male \N
+18 (User2) Black vomit 57 Male \N
+19 (User2) Chest Pain 62 Male \N
+17 (User2) Diabetic fatigue 26 Female \N
+20 (User2) DLBCL Fever 32 Male \N
+24 (User3) Chest Pain 62 Male \N
+8 (User3) Diabetic fatigue 26 Female \N
+25 (User3) DLBCL Fever 32 Male \N
+29 (User4) Chest Pain 62 Male \N
+28 (User4) Diabetic Fatigue 26 Female \N
+30 (User4) DLBCL Fever 32 Male \N
+32 (User5) Chest Pain 62 Male \N
+33 (User5) Diabetic Fatigue 26 Female \N
+34 (User5) DLBCL Fever 32 Male \N
+37 (User6) Chest Pain 62 Male \N
+36 (User6) Diabetic fatigue 26 Female \N
+38 (User6) DLBCL Fever 32 Male \N
+61 (Template) Shortness of Breath 70 Male \N
+65 xx_chestpain 62 Male \N
+66 xx_feverb 30 Male \N
+67 xx_headache 25 Female \N
+68 xx_hematemesis 59 Male \N
+69 xx_palpitations 66 Female \N
+70 xx_shortness 70 Male \N
+71 xx_JT_chestpain 62 Male \N
+72 xx_JT_diabeticfatigue 26 Female \N
+83 zz_KS_Diabeticfatigue 26 Female \N
+84 zz_KS_ChestPain 62 Male \N
+85 nn_sk_chestpain 62 Male \N
+86 nn_sk_diabeticfatigue 26 Female \N
+87 nn_sk_feverb 30 Male \N
+89 nn_sk_hematemesis 59 Male \N
+92 qq_jc_chest_pain 62 Male \N
+93 qq_jc_diabetic_fatigue 26 Female \N
+98 minh_shortness 70 Male \N
+99 yyy_shortness 70 Male \N
+101 user_script_testing 30 Male \N
+102 user_script_testing_feverb 30 Male \N
+103 user_script_testing_headache 25 Female \N
+104 user_test_scripting_hematemesis 59 Male \N
+105 user_script_testing_hematemesis 66 Female \N
+106 user_script_testing_palpitations 66 Female \N
+107 user_script_testing_shortness_of_breath 70 Male \N
+108 user_script_hematemesis2 59 Male \N
+109 son_5_shortness 70 Male \N
+110 mmm_s5_chestpain 62 Male \N
+116 rrr_sw6_chest_pain 62 Male \N
+117 rrr_sw6_diabetic_fatigue 26 Female \N
+123 tester3 59 Male \N
+124 sw_testing_why 59 Male \N
+125 rrr_JC_REVIEW 59 Male \N
+126 hema_tem 59 Male \N
+127 eee_al_7_chestpain 62 Male \N
+128 eee_al_7_diabetic_fatigue 26 Female \N
+134 zzz_testing 59 Male \N
+135 zzz_hema2 59 Male \N
+136 zzz_hema3 59 Male \N
+137 zzzz_gl8_chestpain 62 Male \N
+138 zzzz_gl8_diabeticFatigue 26 Female \N
+144 zzzzzz_ph9_chestpain 62 Male \N
+145 zzzzzz_ph9_diabeticfatigue 26 Female \N
+151 zzzzzzz_kh10_chestpain 62 Male \N
+152 qqq1_feverb_ 30 Male \N
+153 1_test_he 59 Male \N
+154 zzzzzzz_kh10_diabeticfatigue 26 Female \N
+160 zzzzzzzz_r11_chestpain 62 Male \N
+161 zzzzzzzz_r11_diabeticfatigue 26 Female \N
+167 Z_r12_chestpain 62 Male \N
+168 zzzzzzzzz_r12_chestpain 62 Male \N
+169 zzzzzzzzz_r12_diabeticfatigue_one 26 Female \N
+175 zzzzzzzzzz_r13_chestpain 62 Male \N
+176 zzzzzzzzzz_r14_diabeticFatigue 26 Female \N
+178 zzzzzzzzzz_r13_diabeticFatigue 26 Female \N
+183 palptest 66 Female \N
+189 zzzzzzzzzz_r14_chestPain 62 Male \N
+190 zzzzzzzzzz_15_chestpain 62 Male \N
+191 zzzzzzzzzz_15_diabeticFatigue 26 Female \N
+194 zzzzzzzzzz_15_hematemesis 59 Male \N
+197 zzzzzzzzzz_r15_chestPain 62 Male \N
+198 zzzzzzzzzz_r15_diabeticFatigue 26 Female \N
+200 zzzzzzzzzz_r16_chestPain 62 Male \N
+201 zzzzzzzzzz_r16_chestPain 62 Male \N
+202 zzzzzzzzzz_r16_diabeticFatigue 26 Female \N
+208 zzzzzzzzzz_r17_chestPain 62 Male \N
+209 zzzzzzzzzz_r17_diabeticFatigue 26 Female \N
+215 zzzzzzzzzz_r18_chestPain 62 Male \N
+216 zzzzzzzzzz_r18_diabeticFatigue 26 Female \N
+217 zzzzzzzzzz_r18_feverB 30 Male \N
+218 zzzzzzzzzz_r18_headache 25 Female \N
+219 zzzzzzzzzz_r18_hematemesis 59 Male \N
+220 zzzzzzzzzz_r18_palpitations 66 Female \N
+221 zzzzzzzzzz_r18_shortnessBreath 70 Male \N
+222 zzzzzzzzzz_r19_chestPain 62 Male \N
+223 zzzzzzzzzz_r19_diabeticFatigue 26 Female \N
+224 zzzzzzzzz_r19_feverB 30 Male \N
+225 zzzzzzzzz_r19_headache 25 Female \N
+226 zzzzzzzzz_r19_hematemesis 59 Male \N
+228 zzzzzzzzz_r19_headache 25 Female \N
+232 zzzzzzzzzz_shortness_breath 70 Male \N
+234 zzzzzzzzzz_r20_chestPain 62 Male \N
+235 zzzzzzzzzz_r20_diabeticFatigue 26 Female \N
+241 palp_test 66 Female \N
+242 palptest2 66 Female \N
+243 palp_test3 66 Female \N
+244 zzzzzzzzzz_r21_chestPain 62 Male \N
+245 zzzzzzzzzz_r21_diabeticFatigue 26 Female \N
+251 zzzzzzzzzz_r22_chestpain 62 Male \N
+252 zzzzzzzzzz_r22_diabetic_fatigue 26 Female \N
+253 zzzzzzzzzz_r21_feverB 30 Male \N
+254 zzzzzzzzzz_r21_headache 25 Female \N
+256 zzzzzzzzz_r22_feverB 30 Male \N
+259 zzzzzzzzzz_r21_hematemesis 59 Male \N
+260 zzzzzzzzzz_r21_palpitations 66 Female \N
+262 zzzzzzzzzz_r21_palpitations 66 Female \N
+264 testSTAR 66 Female \N
+265 zzzzzzzzzz_r23_chestpain 62 Male \N
+266 zzzzzzzzzz_r23_diabeticFatigue 26 Female \N
+272 testingcase_palpitations 66 Female \N
+273 zzzzzzzzzz_r24_chestpain 62 Male \N
+274 zzzzzzzzzz_r24_diabetic_fatigue 26 Female \N
+280 zzzzzzzzzz_r25_chestpain 62 Male \N
+281 zzzzzzzzzz_r25_diabeticFatigue 26 Female \N
+284 zzzzzzzzzz_R25_hematemesis 59 Male \N
+288 zzzzzzzzzz_r26_chestPain 62 Male \N
+289 zzzzzzzzzz_r26_diabeticFatigue 26 Female \N
+290 zzzzzzzzz_r26_feverB 30 Male \N
+295 zzzzzzzzzz_shortnessBreath 70 Male \N
+297 zzzzzzzzzz_r27_chestPain 62 Male \N
+298 zzzzzzzzzz_r27_diabeticFatigue 26 Female \N
+304 zzzzzzzzzz_ls_test 59 Male \N
+305 zzzzzzzzzz_r28_hematemesis 59 Male \N
+306 hematemesis_lisa_shieh 59 Male \N
+307 LISASHIEH_HEADACHE 25 Female \N
+308 zzzzzzzzzz_jh_meningitis 25 Female \N
+309 zzzzzzzzzz_r29_gibleed 59 Male \N
+310 zzzzzzzzzz_r30_palpitations 66 Female \N
+311 zzzzzzzzzz_r31 30 Male \N
+312 zzzzzzzzzz_r31_shortness 70 Male \N
+313 zzzzzzzzzz_r31_feverb 30 Male \N
+314 zzzzzzzzzzz_r32_ 26 Female \N
+315 zzzzzzzzzzz_r32_chestpain 62 Male \N
+318 zzzzzzzzzz_r31_hematemesis 59 Male \N
+322 zzzzzzzzzzz_r33_diabeticFatigue 26 Female \N
+323 zzzzzzzzzzz_r33_chestPain 62 Male \N
+329 zzzzzzzzzzz_33_chestPain 62 Male \N
+330 zzzzzzzzzzz_33_diabeticFatigue 26 Female \N
+331 zzzzzzzzzzz_33_feverB 30 Male \N
+332 zzzzzzzzzzz_33_headache 25 Female \N
+333 zzzzzzzzzzz_33_hematemesis 59 Male \N
+334 zzzzzzzzzzz_33_palpitations 66 Female \N
+335 zzzzzzzzzzz_33_shortnessBreath 70 Male \N
+336 zzzzzzzzzzz_34_hematemesis 59 Male \N
+337 zzzzzzzzzzz_34_hematemesis 59 Male \N
+338 zzzzzzzzzz_34_hematemesis 59 Male \N
+344 zzzzzzzzzzz_r35_ 62 Male \N
+345 zzzzzzzzzzzz_r35_chestPain 62 Male \N
+346 zzzzzzzzzzzz_r35_diabeticFatigue 26 Female \N
+352 zzzzzzzzzzzz_r36_chestPain 62 Male \N
+353 zzzzzzzzzzzz_r36_diabeticFatigue 26 Female \N
+354 30 Male \N
+360 zzzzzzzzzzzz_r37_chestPain 62 Male \N
+361 zzzzzzzzzzzz_r37_diabeticFatigue 26 Female \N
+367 zzzzzzzzzzzz_r38_chestPain 62 Male \N
+368 zzzzzzzzzzzz_r38_diabeticFatigue 26 Female \N
+374 mel_test 26 Female \N
+375 zzzzzzzzzzzz_r39_chestpain 62 Male \N
+376 zzzzzzzzzzzz_r39_diabeticFatigue 26 Female \N
+382 zzzzzzzzzzzz_r40 26 Female \N
+383 zzzzzzzzzzzz_r40 26 Female \N
+384 zzzzzzzzzzzz_r40_chestpain 62 Male \N
+390 zzzzzzzzzzzz_r41_chestPain 62 Male \N
+391 zzzzzzzzzzzz_r41_diabeticFatigue 26 Female \N
+397 zzzzzzzzzzzz_r42_chestpain 62 Male \N
+398 zzzzzzzzzzzz_r42_diabeticFatigue 26 Female \N
+409 zzzzzzzzzzzz_r43_diabeticFatigue 26 Female \N
+410 zzzzzzzzzzzz_r43_chestPain 62 Male \N
+411 zzzzzzzzzzzzzz_feverB 30 Male \N
+412 zzzzzzzzzzzz_r44_chestPain 62 Male \N
+413 zzzzzzzzzzzz_r44_diabeticFatigue 26 Female \N
+419 zzzzzzzzzzzz_r45_chestPain 62 Male \N
+420 zzzzzzzzzzzz_r45_diabeticFatigue 26 Female \N
+425 zzzzzzzzzzzz_r44_shortnessBreath 70 Male \N
+428 zzzzzzzzzzzz_r46_chestPain 62 Male \N
+429 zzzzzzzzzzzz_r46_diabeticFatigue 26 Female \N
+434 zzzzzzzzzzzz_r47_diabeticFatigue 26 Female \N
+435 zzzzzzzzzzzz_r47_chestPain 62 Male \N
+436 zzzzzzzzzzzz_r47_feverB 30 Male \N
+437 zzzzzzzzzzzz_r47_headache 25 Female \N
+438 zzzzzzzzzzzz_r47_hematemesis 59 Male \N
+439 zzzzzzzzzzzz_r47_palpitations 66 Female \N
+440 zzzzzzzzzzzz_r47_shortnessBreath 70 Male \N
+441 zzzzzzzzzzzz_r48_chestPain 62 Male \N
+442 zzzzzzzzzzzz_r48_diabeticFatigue 26 Female \N
+443 zzzzzzzzzzzz_r48_feverB 30 Male \N
+444 zzzzzzzzzzzz_r48_headache 25 Female \N
+445 zzzzzzzzzzzz_r48_hematemesis 59 Male \N
+446 zzzzzzzzzzzz_r48_palpitations 66 Female \N
+447 zzzzzzzzzzzz_r48_shortnessBreath 70 Male \N
+448 zzzzzzzzzzzz_r49_chestPain 62 Male \N
+449 zzzzzzzzzzzz_r49_diabeticFatigue 26 Female \N
+455 zzzzzzzzzzzz_r50_chestPain 62 Male \N
+456 zzzzzzzzzzzz_r50_diabeticFatigue 26 Female \N
+5 (Template) Hematemesis 59 Male OrderRex.Usability.Scoring
+50 (Template) Fever B 30 Male OrderRex.Usability.Scoring
+73 xx_JT_feverB 30 Male OrderRex.Usability.Scoring
+74 xx_JT_headache 25 Female OrderRex.Usability.Scoring
+75 xx_JT_hematemesis 59 Male OrderRex.Usability.Scoring
+76 xx_JT_palpitations 66 Female OrderRex.Usability.Scoring
+77 zz_KS_feverb 30 Male OrderRex.Usability.Scoring
+78 zz_KS_Headache 25 Female OrderRex.Usability.Scoring
+79 zz_KS_hematemesis 59 Male OrderRex.Usability.Scoring
+80 zz_KS_palpitations 66 Female OrderRex.Usability.Scoring
+81 zz_ks_shortness 70 Male OrderRex.Usability.Scoring
+82 xx_JT_shortness 70 Male OrderRex.Usability.Scoring
+88 nn_sk_headache 25 Female OrderRex.Usability.Scoring
+90 nn_sk_palpitations 66 Female OrderRex.Usability.Scoring
+91 nn_sk_shortness 70 Male OrderRex.Usability.Scoring
+94 qq_jc_feverb 30 Male OrderRex.Usability.Scoring
+95 qq_jc_hematemesis 59 Male OrderRex.Usability.Scoring
+96 qq_jc_palpitations 66 Female OrderRex.Usability.Scoring
+97 qq_jc_shortness_breath 70 Male OrderRex.Usability.Scoring
+100 qq_jc_headache 25 Female OrderRex.Usability.Scoring
+111 mmm_s5_feverb 30 Male OrderRex.Usability.Scoring
+112 mmm_s5_headache 25 Female OrderRex.Usability.Scoring
+113 mmm_s5_hematemiss 59 Male OrderRex.Usability.Scoring
+114 mmm_s5_palpitations 66 Female OrderRex.Usability.Scoring
+115 mmm_s5_sob 70 Male OrderRex.Usability.Scoring
+118 rrr_sw6_feverb 30 Male OrderRex.Usability.Scoring
+119 rrr_sw6_headache 25 Female OrderRex.Usability.Scoring
+120 rrr_sw6_hematemesis 59 Male OrderRex.Usability.Scoring
+121 rrr_sw6_palpitations 66 Female OrderRex.Usability.Scoring
+122 rrr_sw6_shortness_breath 70 Male OrderRex.Usability.Scoring
+129 eee_al_7_feverb 30 Male OrderRex.Usability.Scoring
+130 eee_al_7_headache 25 Female OrderRex.Usability.Scoring
+131 eee_al_7_hematemesis 59 Male OrderRex.Usability.Scoring
+132 eee_al_7_palpitations 66 Female OrderRex.Usability.Scoring
+133 eee_al_7_shortness 70 Male OrderRex.Usability.Scoring
+139 zzzz_gl8_feverB 30 Male OrderRex.Usability.Scoring
+140 zzzz_gl8_headache 25 Female OrderRex.Usability.Scoring
+141 zzzz_gl8_hematemesis 59 Male OrderRex.Usability.Scoring
+142 zzzz_gl8_palpitations 66 Female OrderRex.Usability.Scoring
+143 zzzz_gl8_shortness 70 Male OrderRex.Usability.Scoring
+146 zzzzzz_ph9_feverB 30 Male OrderRex.Usability.Scoring
+147 zzzzzz_ph9_headache 25 Female OrderRex.Usability.Scoring
+148 zzzzzz_ph9_hematemesis 59 Male OrderRex.Usability.Scoring
+149 zzzzzz_ph9_palpitations 66 Female OrderRex.Usability.Scoring
+150 zzzzzz_ph9_shortness 70 Male OrderRex.Usability.Scoring
+155 zzzzzzz_kh10_feverb 30 Male OrderRex.Usability.Scoring
+156 zzzzzzz_kh10_headache 25 Female OrderRex.Usability.Scoring
+157 zzzzzzz_kh10_hematemesis 59 Male OrderRex.Usability.Scoring
+158 zzzzzzz_kh10_palpitations 66 Female OrderRex.Usability.Scoring
+159 zzzzzzz_kh10_shortness 70 Male OrderRex.Usability.Scoring
+162 zzzzzzzz_r11_feverb 30 Male OrderRex.Usability.Scoring
+163 zzzzzzzz_r11_headache 25 Female OrderRex.Usability.Scoring
+164 zzzzzzzz_r11_hematemesis 59 Male OrderRex.Usability.Scoring
+165 zzzzzzzz_r11_palpitations 66 Female OrderRex.Usability.Scoring
+166 zzzzzzzz_r11_shortness 70 Male OrderRex.Usability.Scoring
+170 zzzzzzzzz_r12_feverb 30 Male OrderRex.Usability.Scoring
+171 zzzzzzzzz_r12_headache 25 Female OrderRex.Usability.Scoring
+172 zzzzzzzzz_r12_hematemesis 59 Male OrderRex.Usability.Scoring
+173 zzzzzzzzz_r12_palpitations 66 Female OrderRex.Usability.Scoring
+174 zzzzzzzzz_r12_shortness 70 Male OrderRex.Usability.Scoring
+177 zzzzzzzzzz_13_feverB 30 Male OrderRex.Usability.Scoring
+179 zzzzzzzzzz_r13_headache 25 Female OrderRex.Usability.Scoring
+180 zzzzzzzzzz_r13_hematemesis 59 Male OrderRex.Usability.Scoring
+181 zzzzzzzzzz_r13_palpitations 66 Female OrderRex.Usability.Scoring
+182 zzzzzzzzzz_r13_shortnessBreath 70 Male OrderRex.Usability.Scoring
+184 zzzzzzzzzz_r14_feverB 30 Male OrderRex.Usability.Scoring
+185 zzzzzzzzzz_r14_headache 25 Female OrderRex.Usability.Scoring
+186 zzzzzzzzzz_r14_hematemesis 59 Male OrderRex.Usability.Scoring
+187 zzzzzzzzzz_r14_palpitations 66 Female OrderRex.Usability.Scoring
+188 zzzzzzzzzz_r14_shortnessBreath 70 Male OrderRex.Usability.Scoring
+192 zzzzzzzzzz_r15_feverB 30 Male OrderRex.Usability.Scoring
+193 zzzzzzzzzz_r15_headache 25 Female OrderRex.Usability.Scoring
+195 zzzzzzzzzz_r15_palpitations 66 Female OrderRex.Usability.Scoring
+196 zzzzzzzzzz_r15_shortnessofBreath 70 Male OrderRex.Usability.Scoring
+199 zzzzzzzzzz_r15_hematemesis 59 Male OrderRex.Usability.Scoring
+203 zzzzzzzzzz_r16_feverB 30 Male OrderRex.Usability.Scoring
+204 zzzzzzzzzz_r16_headache 25 Female OrderRex.Usability.Scoring
+205 zzzzzzzzzz_r16_hematemesis 59 Male OrderRex.Usability.Scoring
+206 zzzzzzzzzz_r16_palpitations 66 Female OrderRex.Usability.Scoring
+207 zzzzzzzzzz_r16_shortnessBreath 70 Male OrderRex.Usability.Scoring
+210 zzzzzzzzzz_r17_feverB 30 Male OrderRex.Usability.Scoring
+211 zzzzzzzzzz_r17_headache 25 Female OrderRex.Usability.Scoring
+212 zzzzzzzzzz_r17_hematemesis 59 Male OrderRex.Usability.Scoring
+213 zzzzzzzzzz_r17_palpitations 66 Female OrderRex.Usability.Scoring
+214 zzzzzzzzzz_r17_shortness 70 Male OrderRex.Usability.Scoring
+227 zzzzzzzzzz_r19_feverB 30 Male OrderRex.Usability.Scoring
+229 zzzzzzzzzz_r19_headache 25 Female OrderRex.Usability.Scoring
+230 zzzzzzzzzz_r19_hematemesis 59 Male OrderRex.Usability.Scoring
+231 zzzzzzzzzz_r19_palpitations 66 Female OrderRex.Usability.Scoring
+233 zzzzzzzzzz_r19_shortnessBreath 70 Male OrderRex.Usability.Scoring
+236 zzzzzzzzzz_r20_feverB 30 Male OrderRex.Usability.Scoring
+237 zzzzzzzzzz_r20_headache 25 Female OrderRex.Usability.Scoring
+238 zzzzzzzzzz_r20_hematemesis 59 Male OrderRex.Usability.Scoring
+239 zzzzzzzzzz_r20_palpitations 66 Female OrderRex.Usability.Scoring
+240 zzzzzzzzzz_r20_shortnessBreath 70 Male OrderRex.Usability.Scoring
+246 zzzzzzzzzz_r21_feverB 30 Male OrderRex.Usability.Scoring
+247 zzzzzzzzzz_r21_headache 25 Female OrderRex.Usability.Scoring
+248 zzzzzzzzzz_r21_hematemesis 59 Male OrderRex.Usability.Scoring
+249 zzzzzzzzzz_r21_palpitations 66 Female OrderRex.Usability.Scoring
+250 zzzzzzzzzz_r21_shortnessBreath 70 Male OrderRex.Usability.Scoring
+255 zzzzzzzzzz_r22_hematemesis 59 Male OrderRex.Usability.Scoring
+257 zzzzzzzzzz_r22_feverB 30 Male OrderRex.Usability.Scoring
+258 zzzzzzzzzz_r22_headache 25 Female OrderRex.Usability.Scoring
+261 zzzzzzzzzz_r22_shortnessBreath 70 Male OrderRex.Usability.Scoring
+263 zzzzzzzzzz_r22_palpitations 66 Female OrderRex.Usability.Scoring
+267 zzzzzzzzzz_r23_feverB 30 Male OrderRex.Usability.Scoring
+268 zzzzzzzzzz_r23_headache 25 Female OrderRex.Usability.Scoring
+269 zzzzzzzzzz_r23_hematemesis 59 Male OrderRex.Usability.Scoring
+270 zzzzzzzzzz_r23_palpitations 66 Female OrderRex.Usability.Scoring
+271 zzzzzzzzzz_r23_shortnessBreath 70 Male OrderRex.Usability.Scoring
+275 zzzzzzzzzz_r24_feverB 30 Male OrderRex.Usability.Scoring
+276 zzzzzzzzzz_r24_headache 25 Female OrderRex.Usability.Scoring
+277 zzzzzzzzzz_r24_hematemesis 59 Male OrderRex.Usability.Scoring
+278 zzzzzzzzzz_r24_palpitations 66 Female OrderRex.Usability.Scoring
+279 zzzzzzzzzz_r24_shortnessBreath 70 Male OrderRex.Usability.Scoring
+282 zzzzzzzzzz_r25_feverB 30 Male OrderRex.Usability.Scoring
+283 zzzzzzzzzz_r25_headache 25 Female OrderRex.Usability.Scoring
+285 zzzzzzzzzz_r25_palpitations 66 Female OrderRex.Usability.Scoring
+286 zzzzzzzzzz_r25_shortnessBreath 70 Male OrderRex.Usability.Scoring
+287 zzzzzzzzzz_r25_hematemesis 59 Male OrderRex.Usability.Scoring
+291 zzzzzzzzzz_r26_feverB 30 Male OrderRex.Usability.Scoring
+292 zzzzzzzzzz_r26_headache 25 Female OrderRex.Usability.Scoring
+293 zzzzzzzzzz_r26_hematemesis 59 Male OrderRex.Usability.Scoring
+294 zzzzzzzzzz_r26_palpitations 66 Female OrderRex.Usability.Scoring
+296 zzzzzzzzzz_r26_shortnessBreath 70 Male OrderRex.Usability.Scoring
+299 zzzzzzzzzz_r27_feverB 30 Male OrderRex.Usability.Scoring
+300 zzzzzzzzzz_r27_headache 25 Female OrderRex.Usability.Scoring
+301 zzzzzzzzzz_r27_hematemesis 59 Male OrderRex.Usability.Scoring
+302 zzzzzzzzzz_r27_palpitations 66 Female OrderRex.Usability.Scoring
+303 zzzzzzzzzz_r27_shortnessBreath 70 Male OrderRex.Usability.Scoring
+316 zzzzzzzzzzz_r32_feverB 30 Male OrderRex.Usability.Scoring
+317 zzzzzzzzzzz_r32_headache 25 Female OrderRex.Usability.Scoring
+319 zzzzzzzzzzz_r32_palpitations 66 Female OrderRex.Usability.Scoring
+320 zzzzzzzzzzz_r32_shortnessBreath 70 Male OrderRex.Usability.Scoring
+321 zzzzzzzzzzz_r32_hematemesis 59 Male OrderRex.Usability.Scoring
+324 zzzzzzzzzzz_r33_feverB 30 Male OrderRex.Usability.Scoring
+325 zzzzzzzzzzz_r33_headache 25 Female OrderRex.Usability.Scoring
+326 zzzzzzzzzzz_r33_hematemesis 59 Male OrderRex.Usability.Scoring
+327 zzzzzzzzzzz_r33_palpitations 66 Female OrderRex.Usability.Scoring
+328 zzzzzzzzzzz_r33_shortnessBreath 70 Male OrderRex.Usability.Scoring
+339 zzzzzzzzzzzz_r34_hematemesis 59 Male OrderRex.Usability.Scoring
+340 zzzzzzzzzzz_r34_palpitaitonis 66 Female OrderRex.Usability.Scoring
+341 zzzzzzzzzzz_r34_headache 25 Female OrderRex.Usability.Scoring
+342 zzzzzzzzzzz_r34_feverB 30 Male OrderRex.Usability.Scoring
+343 zzzzzzzzzzz_r34_shortness 70 Male OrderRex.Usability.Scoring
+347 zzzzzzzzzzzz_r35_feverB 30 Male OrderRex.Usability.Scoring
+348 zzzzzzzzzzzz_r35_headache 25 Female OrderRex.Usability.Scoring
+349 zzzzzzzzzzzz_r35_hematemesis 59 Male OrderRex.Usability.Scoring
+350 zzzzzzzzzzzz_r35_palpitations 66 Female OrderRex.Usability.Scoring
+351 zzzzzzzzzzzz_r35_shortnessBreath 70 Male OrderRex.Usability.Scoring
+355 zzzzzzzzzzzz_r36_feverB 30 Male OrderRex.Usability.Scoring
+356 zzzzzzzzzzzz_r36_headache 25 Female OrderRex.Usability.Scoring
+357 zzzzzzzzzzzz_r36_hematemesis 59 Male OrderRex.Usability.Scoring
+358 zzzzzzzzzzzz_r36_palpitations 66 Female OrderRex.Usability.Scoring
+359 zzzzzzzzzzzz_r36_shortnessBreath 70 Male OrderRex.Usability.Scoring
+362 zzzzzzzzzzzz_r37_feverB 30 Male OrderRex.Usability.Scoring
+363 zzzzzzzzzzzz_r37_headache 25 Female OrderRex.Usability.Scoring
+364 zzzzzzzzzzzz_r37_hematemesis 59 Male OrderRex.Usability.Scoring
+365 zzzzzzzzzzzz_r37_palpitations 66 Female OrderRex.Usability.Scoring
+366 zzzzzzzzzzzz_r37_shortnessBreath 70 Male OrderRex.Usability.Scoring
+369 zzzzzzzzzzzz_r38_feverB 30 Male OrderRex.Usability.Scoring
+370 zzzzzzzzzzzz_r38_headache 25 Female OrderRex.Usability.Scoring
+371 zzzzzzzzzzzz_r38_hematemesis 59 Male OrderRex.Usability.Scoring
+372 zzzzzzzzzzzz_r38_palpitations 66 Female OrderRex.Usability.Scoring
+373 zzzzzzzzzzzz_r38_shortnessBreath 70 Male OrderRex.Usability.Scoring
+377 zzzzzzzzzzzz_r39_feverB 30 Male OrderRex.Usability.Scoring
+378 zzzzzzzzzzzz_r39_headache 25 Female OrderRex.Usability.Scoring
+379 zzzzzzzzzzzz_r39_hematemesis 59 Male OrderRex.Usability.Scoring
+380 zzzzzzzzzzzz_r39_palpitations 66 Female OrderRex.Usability.Scoring
+381 zzzzzzzzzzzz_r39_shortness 70 Male OrderRex.Usability.Scoring
+385 zzzzzzzzzzzz_r40_headache 25 Female OrderRex.Usability.Scoring
+386 zzzzzzzzzzzz_r40_palpitations 66 Female OrderRex.Usability.Scoring
+387 zzzzzzzzzzzz_r40_hematem 59 Male OrderRex.Usability.Scoring
+388 zzzzzzzzzzzz_r40_fever 30 Male OrderRex.Usability.Scoring
+389 zzzzzzzzzzzz_r40_shortness 70 Male OrderRex.Usability.Scoring
+392 zzzzzzzzzzzz_r41_feverB 30 Male OrderRex.Usability.Scoring
+393 zzzzzzzzzzzz_r41_headache 25 Female OrderRex.Usability.Scoring
+394 zzzzzzzzzzzz_r41_hematemesis 59 Male OrderRex.Usability.Scoring
+395 zzzzzzzzzzzz_r41_palpitations 66 Female OrderRex.Usability.Scoring
+396 zzzzzzzzzzzz_r41_shortnessBreath 70 Male OrderRex.Usability.Scoring
+399 zzzzzzzzzzzz_r42_feverB 30 Male OrderRex.Usability.Scoring
+400 zzzzzzzzzzzz_r42_headache 25 Female OrderRex.Usability.Scoring
+401 zzzzzzzzzzzz_r42_hematemesis 59 Male OrderRex.Usability.Scoring
+402 zzzzzzzzzzzz_r42_palpitations 66 Female OrderRex.Usability.Scoring
+403 zzzzzzzzzzzz_r42_shortness 70 Male OrderRex.Usability.Scoring
+404 zzzzzzzzzzzz_r43_feverB 30 Male OrderRex.Usability.Scoring
+405 zzzzzzzzzzzz_r43_headache 25 Female OrderRex.Usability.Scoring
+406 zzzzzzzzzzzz_r43_palpitations 66 Female OrderRex.Usability.Scoring
+407 zzzzzzzzzzzz_r43_hematemesis 59 Male OrderRex.Usability.Scoring
+408 zzzzzzzzzzzz_r43_shortnessBreath 70 Male OrderRex.Usability.Scoring
+414 zzzzzzzzzzzz_r44_feverB 30 Male OrderRex.Usability.Scoring
+415 zzzzzzzzzzzz_r44_headache 25 Female OrderRex.Usability.Scoring
+416 zzzzzzzzzzzz_r44_hematemesis 59 Male OrderRex.Usability.Scoring
+417 zzzzzzzzzzzz_r44_palipitations 66 Female OrderRex.Usability.Scoring
+418 zzzzzzzzzzzz_r44_shortnessBreath 70 Male OrderRex.Usability.Scoring
+421 zzzzzzzzzzzz_r45_feverB 30 Male OrderRex.Usability.Scoring
+422 zzzzzzzzzzzz_r45_headache 25 Female OrderRex.Usability.Scoring
+423 zzzzzzzzzzzz_r45_hematemesis 59 Male OrderRex.Usability.Scoring
+424 zzzzzzzzzzzz_r45_palpitations 66 Female OrderRex.Usability.Scoring
+426 zzzzzzzzzzzz_r45_shortness 70 Male OrderRex.Usability.Scoring
+427 zzzzzzzzzzzz_r46_feverB 30 Male OrderRex.Usability.Scoring
+430 zzzzzzzzzzzz_r46_headache 25 Female OrderRex.Usability.Scoring
+431 zzzzzzzzzzzz_r46_hematemesis 59 Male OrderRex.Usability.Scoring
+432 zzzzzzzzzzzz_r46_palpitations 66 Female OrderRex.Usability.Scoring
+433 zzzzzzzzzzzz_r46_shortnessBreath 70 Male OrderRex.Usability.Scoring
+450 zzzzzzzzzzzz_r49_feverB 30 Male OrderRex.Usability.Scoring
+451 zzzzzzzzzzzz_r49_headache 25 Female OrderRex.Usability.Scoring
+452 zzzzzzzzzzzz_r49_hematemesis 59 Male OrderRex.Usability.Scoring
+453 zzzzzzzzzzzz_r49_palpitations 66 Female OrderRex.Usability.Scoring
+454 zzzzzzzzzzzz_r49_shortnessBreath 70 Male OrderRex.Usability.Scoring
+457 zzzzzzzzzzzz_r50_feverB 30 Male OrderRex.Usability.Scoring
+458 zzzzzzzzzzzz_r50_headache 25 Female OrderRex.Usability.Scoring
+459 zzzzzzzzzzzz_r50_hematemesis 59 Male OrderRex.Usability.Scoring
+460 zzzzzzzzzzzz_r50_palpitations 66 Female OrderRex.Usability.Scoring
+461 zzzzzzzzzzzz_r50_shortness 70 Male OrderRex.Usability.Scoring
+\.
+
+
+--
+-- Name: sim_patient_sim_patient_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_patient_sim_patient_id_seq', 461, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_patient_order.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_patient_order.dump.sql
new file mode 100644
index 00000000..89120799
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_patient_order.dump.sql
@@ -0,0 +1,5291 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_patient_order; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_patient_order (sim_patient_order_id, sim_user_id, sim_patient_id, clinical_item_id, relative_time_start, relative_time_end, sim_state_id) FROM stdin;
+125 9 13 44256 0 \N 3
+78 0 9 41839 0 \N 3
+126 9 13 62083 1800 \N 3
+127 0 14 45801 -1200 \N 6
+128 0 14 45763 -1200 \N 6
+129 0 14 45788 -1200 \N 6
+130 0 14 45955 -1200 \N 6
+131 0 14 45873 -1200 \N 6
+132 0 14 45821 -1200 \N 6
+114 0 13 45763 -1200 \N 3
+115 0 13 45801 -1200 \N 3
+116 0 13 45866 -1200 \N 3
+117 0 13 45838 -1200 \N 3
+118 0 13 45788 -1200 \N 3
+119 0 13 45821 -1200 \N 3
+120 0 13 41839 0 \N 3
+121 9 13 63392 0 \N 3
+122 9 13 50706 0 \N 3
+123 9 13 45797 0 \N 3
+124 9 13 45935 0 \N 3
+133 0 14 45918 -1200 \N 6
+134 9 14 44198 0 \N 6
+135 9 14 45866 0 \N 6
+136 9 14 45972 0 \N 6
+137 9 14 45910 0 \N 6
+138 9 14 57721 0 \N 6
+139 9 14 45752 0 \N 6
+140 9 14 45945 0 \N 6
+141 9 14 43997 0 \N 6
+142 9 14 45759 0 \N 6
+143 9 14 45792 0 \N 6
+144 9 14 49228 0 \N 6
+145 0 15 45793 -1200 \N 7
+146 0 15 45771 -1200 \N 7
+147 0 15 45759 -1200 \N 7
+148 0 15 45821 -1200 \N 7
+149 0 15 41788 0 \N 7
+150 9 15 45969 0 \N 7
+151 9 15 49481 0 \N 7
+152 9 15 45945 0 \N 7
+153 9 15 45927 0 \N 7
+154 9 15 48954 0 \N 7
+155 9 15 63165 0 \N 7
+156 9 15 44219 0 \N 7
+157 9 15 45811 0 \N 7
+158 9 15 45948 0 \N 7
+159 9 15 62866 0 \N 7
+160 0 16 45955 -1200 \N 9
+161 0 16 45771 -1200 \N 9
+162 0 16 45788 -1200 \N 9
+163 0 16 45821 -1200 \N 9
+164 0 16 45873 -1200 \N 9
+165 0 16 42232 0 \N 9
+166 9 16 45763 0 \N 9
+167 9 16 45806 0 \N 9
+168 9 16 44198 0 \N 9
+169 9 16 35850 0 \N 9
+170 9 16 51920 0 \N 9
+171 9 16 45811 0 \N 9
+172 9 16 45771 0 \N 9
+173 9 16 63927 0 \N 9
+174 9 16 45751 0 \N 9
+175 9 16 50850 1200 \N 9
+178 0 6 41964 0 \N 6
+180 0 7 41788 0 \N 7
+184 0 18 41788 0 \N 7
+185 0 19 41839 0 \N 3
+186 0 20 41964 0 \N 6
+188 2 17 45793 0 \N 9
+189 2 17 45771 0 \N 9
+190 2 17 50343 0 \N 9
+191 2 17 44198 0 \N 9
+192 2 17 45763 1200 \N 9
+193 2 17 45797 1200 \N 9
+194 2 17 44198 1200 \N 9
+195 2 17 35850 1200 \N 9
+196 2 17 49549 1200 \N 9
+197 2 17 45870 1200 \N 9
+198 2 17 61840 1200 \N 9
+199 2 17 45778 1200 \N 9
+200 2 17 45811 1200 \N 9
+201 2 17 45751 1200 \N 9
+202 2 17 45752 1200 \N 9
+203 2 17 45918 1200 \N 9
+204 2 17 45866 1200 \N 9
+205 2 17 49134 1200 \N 9
+206 2 17 46096 1200 \N 9
+207 2 19 45801 0 \N 3
+208 2 19 45866 0 \N 3
+209 2 19 45771 0 \N 3
+210 2 19 48532 0 \N 3
+211 2 19 45914 0 \N 3
+212 2 19 45788 0 \N 3
+213 2 19 44206 1200 \N 3
+214 2 19 44256 1200 \N 3
+215 2 18 45793 0 \N 7
+216 2 18 49481 0 \N 7
+217 2 18 45802 0 \N 7
+218 2 18 45771 0 \N 7
+219 2 18 45945 0 \N 7
+220 2 18 44219 0 \N 7
+221 2 18 45759 0 \N 7
+222 2 18 46348 0 \N 7
+223 2 18 45927 0 \N 7
+224 2 18 49005 0 \N 7
+225 2 18 45748 1200 \N 7
+226 2 18 44592 1200 \N 7
+227 2 18 45827 1200 \N 7
+228 2 20 44198 0 \N 6
+229 2 20 63725 0 \N 6
+230 2 20 36210 0 \N 6
+231 2 20 45752 0 \N 6
+232 2 20 45901 0 \N 6
+233 2 20 45782 0 \N 6
+234 2 20 45751 0 \N 6
+235 2 20 45801 0 \N 6
+236 2 20 45945 0 \N 6
+237 2 20 43997 1200 \N 6
+253 0 5 41788 0 \N 14
+282 0 23 41788 0 \N 14
+283 0 23 41788 0 \N 14
+284 0 24 41839 0 \N 3
+285 0 25 41964 0 \N 6
+291 10 8 45793 0 \N 21
+292 10 8 45763 60 \N 21
+293 10 8 45797 60 \N 21
+294 10 8 50343 60 \N 21
+295 10 8 45751 240 \N 21
+296 10 8 45818 1200 \N 21
+297 10 8 45838 1200 \N 21
+298 10 8 45919 1200 \N 21
+299 10 8 44439 1380 \N 21
+300 10 8 35850 1440 \N 21
+301 10 8 45806 1440 \N 21
+302 10 8 61840 1440 \N 21
+303 10 8 45778 1440 \N 21
+304 10 8 45811 1440 \N 21
+305 10 8 48916 1440 \N 21
+306 10 8 45763 1800 \N 18
+308 10 24 45866 0 \N 3
+309 10 24 45771 0 \N 3
+310 10 24 44206 0 \N 3
+311 10 24 45914 0 \N 3
+312 10 24 45788 0 \N 3
+313 10 24 45818 0 \N 3
+314 10 24 45759 0 \N 3
+315 10 24 45870 1320 \N 3
+316 10 24 45892 2280 \N 3
+317 10 24 44212 2280 \N 3
+318 10 24 45870 2280 \N 3
+319 10 24 45806 2280 \N 3
+320 10 24 44240 2520 \N 3
+321 10 24 63714 2520 \N 3
+322 10 24 44256 2640 \N 3
+323 10 24 49251 2640 \N 3
+324 10 23 50267 0 \N 14
+325 10 23 44198 0 \N 14
+326 10 23 49481 0 \N 14
+327 10 23 45770 0 \N 14
+328 10 23 45771 0 \N 14
+329 10 23 45811 0 \N 14
+330 10 23 45945 0 \N 14
+331 10 23 44219 0 \N 14
+332 10 23 45788 0 \N 14
+333 10 23 45866 0 \N 14
+334 10 23 45759 0 \N 14
+335 10 23 46245 1560 \N 15
+336 10 23 45927 1620 \N 15
+337 10 23 44439 1620 \N 15
+338 10 23 45872 1620 \N 15
+339 10 23 45877 1620 \N 15
+340 10 23 61975 1620 \N 15
+341 10 23 43996 1620 \N 15
+342 10 23 45793 2880 \N 14
+343 10 23 44439 2940 \N 14
+344 10 23 44001 4800 \N 14
+345 10 23 45969 4860 \N 16
+351 0 29 41839 0 \N 3
+352 0 30 41964 0 \N 6
+353 0 31 41788 0 \N 14
+354 11 28 45788 0 \N 21
+355 11 28 45827 960 \N 21
+356 11 28 45965 960 \N 21
+357 11 28 45841 960 \N 21
+358 11 28 48515 960 \N 21
+359 11 28 45849 960 \N 21
+360 11 28 44198 960 \N 21
+361 11 28 45870 960 \N 21
+362 11 28 45750 960 \N 21
+363 11 28 45751 960 \N 21
+364 11 28 45755 960 \N 21
+365 11 28 45766 960 \N 21
+366 11 28 45771 960 \N 21
+367 11 28 45901 960 \N 21
+368 11 28 45776 960 \N 21
+369 11 28 45778 960 \N 21
+370 11 28 45781 960 \N 21
+371 11 28 45782 960 \N 21
+372 11 28 45783 960 \N 21
+373 11 28 45787 960 \N 21
+374 11 28 46050 960 \N 21
+375 11 28 45799 960 \N 21
+376 11 28 65641 960 \N 21
+377 11 28 45802 960 \N 21
+378 11 28 45806 960 \N 21
+379 11 28 45811 960 \N 21
+380 11 28 45801 960 \N 21
+381 11 28 61823 960 \N 21
+382 11 28 35850 2580 \N 21
+383 11 28 45760 2640 \N 18
+384 11 29 45892 0 \N 3
+385 11 29 45866 0 \N 3
+386 11 29 45771 0 \N 3
+387 11 29 44206 0 \N 3
+388 11 29 48532 0 \N 3
+389 11 29 45870 0 \N 3
+390 11 29 45818 0 \N 3
+391 11 29 45788 0 \N 3
+392 11 29 48676 1380 \N 3
+393 11 29 45770 1380 \N 3
+394 11 29 45806 1380 \N 3
+395 11 29 45811 1380 \N 3
+396 11 29 45853 1380 \N 3
+397 11 29 45759 1380 \N 3
+398 11 29 52590 3540 \N 3
+399 11 29 45870 3600 \N 3
+400 11 29 45824 3660 \N 3
+401 11 29 50100 3660 \N 3
+402 11 29 61837 3660 \N 3
+403 11 29 45797 3660 \N 3
+404 11 31 44198 0 \N 14
+405 11 31 49481 0 \N 14
+406 11 31 45770 0 \N 14
+407 11 31 45771 0 \N 14
+408 11 31 45811 0 \N 14
+409 11 31 45945 0 \N 14
+410 11 31 44219 0 \N 14
+411 11 31 45788 0 \N 14
+412 11 31 45866 0 \N 14
+413 11 31 45759 0 \N 14
+414 11 31 45778 600 \N 15
+415 11 31 45806 600 \N 15
+416 11 31 45927 600 \N 15
+417 11 31 65640 1680 \N 15
+418 11 31 61823 1680 \N 15
+419 11 31 65649 1800 \N 14
+420 11 31 61993 1860 \N 14
+421 11 31 45793 1920 \N 16
+422 11 31 45759 1920 \N 16
+423 11 31 49481 2940 \N 16
+424 11 30 48960 0 \N 6
+425 11 30 44198 0 \N 6
+426 11 30 45801 0 \N 6
+427 11 30 45771 0 \N 6
+428 11 30 49228 0 \N 6
+429 11 30 45901 0 \N 6
+430 11 30 46157 0 \N 6
+431 11 30 36210 0 \N 6
+432 11 30 45788 0 \N 6
+433 0 32 41839 0 \N 3
+434 0 34 41964 0 \N 6
+435 0 35 41788 0 \N 14
+436 12 33 45788 0 \N 21
+437 12 33 45763 960 \N 21
+438 12 33 50343 960 \N 21
+439 12 33 45763 1980 \N 21
+440 12 33 44198 1980 \N 21
+441 12 33 62151 1980 \N 21
+442 12 33 35850 1980 \N 21
+443 12 33 44267 1980 \N 21
+444 12 33 45901 1980 \N 21
+445 12 33 61840 1980 \N 21
+446 12 33 45873 1980 \N 21
+447 12 33 45778 1980 \N 21
+448 12 33 45811 1980 \N 21
+449 12 33 44021 1980 \N 21
+450 12 33 45752 1980 \N 21
+451 12 33 45818 1980 \N 21
+452 12 33 44283 1980 \N 21
+453 12 33 44220 1980 \N 21
+454 12 32 44294 0 \N 3
+455 12 32 45866 0 \N 3
+456 12 32 45771 0 \N 3
+457 12 32 45900 0 \N 3
+458 12 32 45870 0 \N 3
+459 12 32 44206 0 \N 3
+460 12 32 45914 0 \N 3
+461 12 32 45788 0 \N 3
+462 12 32 45818 0 \N 3
+463 12 32 45759 0 \N 3
+464 12 32 44256 1500 \N 3
+465 12 32 46081 1500 \N 3
+466 12 32 49251 1500 \N 3
+467 12 32 44359 1500 \N 3
+468 12 32 45866 1500 \N 3
+469 12 32 45870 1500 \N 3
+470 12 32 48628 1500 \N 3
+471 12 32 45977 1500 \N 3
+472 12 35 45945 0 \N 14
+473 12 35 45771 0 \N 14
+474 12 35 45788 0 \N 14
+475 12 35 45869 0 \N 14
+476 12 35 45759 0 \N 14
+477 12 35 44219 300 \N 14
+478 12 35 43996 300 \N 14
+479 12 35 35733 300 \N 14
+480 12 35 49481 480 \N 14
+481 12 35 45969 480 \N 14
+482 12 35 45793 1500 \N 15
+483 12 35 65640 1560 \N 15
+484 12 35 61993 1560 \N 15
+485 12 35 65646 1560 \N 15
+486 12 35 61975 1560 \N 15
+487 12 35 46286 1800 \N 16
+488 12 35 44404 1860 \N 16
+489 12 35 49481 3720 \N 16
+490 12 34 48960 0 \N 6
+491 12 34 45955 0 \N 6
+492 12 34 44198 0 \N 6
+493 12 34 45801 0 \N 6
+494 12 34 45771 0 \N 6
+495 12 34 49228 0 \N 6
+496 12 34 45873 0 \N 6
+497 12 34 36210 0 \N 6
+498 12 34 45788 0 \N 6
+499 12 34 44198 1440 \N 6
+500 0 37 41839 0 \N 3
+501 0 38 41964 0 \N 6
+502 0 39 41788 0 \N 14
+503 13 36 45793 0 \N 21
+504 13 36 45778 960 \N 21
+505 13 36 45763 960 \N 21
+506 13 36 45788 960 \N 21
+507 13 36 45910 960 \N 21
+508 13 36 45806 960 \N 21
+509 13 36 46093 1260 \N 21
+510 13 36 45763 2220 \N 21
+511 13 36 45796 2220 \N 21
+512 13 36 45797 2220 \N 21
+513 13 36 44198 2220 \N 21
+514 13 36 35850 2220 \N 21
+515 13 36 49549 2220 \N 21
+516 13 36 61840 2220 \N 21
+517 13 36 45778 2220 \N 21
+518 13 36 45811 2220 \N 21
+519 13 36 48916 2220 \N 21
+520 13 36 44021 2220 \N 21
+521 13 36 45751 2220 \N 21
+522 13 36 45752 2220 \N 21
+523 13 36 45918 2220 \N 21
+524 13 36 45919 2220 \N 21
+525 13 37 44256 0 \N 3
+526 13 37 45892 0 \N 3
+527 13 37 45866 0 \N 3
+528 13 37 45771 0 \N 3
+529 13 37 45838 0 \N 3
+530 13 37 44206 0 \N 3
+531 13 37 45870 0 \N 3
+532 13 37 45818 0 \N 3
+533 13 37 45788 0 \N 3
+534 13 37 45759 0 \N 3
+535 13 37 46160 1500 \N 3
+536 13 37 48871 1560 \N 3
+537 13 37 45811 1620 \N 3
+538 13 37 71052 2580 \N 3
+539 13 37 61982 2580 \N 3
+540 13 39 45793 0 \N 14
+541 13 39 44198 0 \N 14
+542 13 39 49481 0 \N 14
+543 13 39 45770 0 \N 14
+544 13 39 45771 0 \N 14
+545 13 39 43996 0 \N 14
+546 13 39 45811 0 \N 14
+547 13 39 49207 0 \N 14
+548 13 39 45945 0 \N 14
+549 13 39 44219 0 \N 14
+550 13 39 45788 0 \N 14
+551 13 39 45866 0 \N 14
+552 13 39 45759 0 \N 14
+553 13 39 45969 1680 \N 15
+554 13 39 61982 1680 \N 15
+555 13 39 61993 1680 \N 15
+556 13 39 45872 1860 \N 15
+557 13 39 65640 1860 \N 15
+558 13 39 61975 1860 \N 15
+559 13 39 63759 1860 \N 15
+560 13 39 45927 1860 \N 15
+561 13 39 61323 2160 \N 14
+562 13 39 61982 2160 \N 14
+563 13 39 45872 2280 \N 14
+564 13 39 61993 2280 \N 14
+565 13 39 45793 2400 \N 16
+566 13 39 45759 2400 \N 16
+567 13 39 49481 2520 \N 16
+568 13 39 63720 2580 \N 2
+569 13 39 46343 2580 \N 2
+570 13 38 48960 0 \N 6
+571 13 38 44198 0 \N 6
+572 13 38 45801 0 \N 6
+573 13 38 45771 0 \N 6
+574 13 38 49228 0 \N 6
+575 13 38 46157 0 \N 6
+576 13 38 45806 0 \N 6
+577 13 38 36210 0 \N 6
+578 13 38 44439 0 \N 6
+579 13 38 45752 0 \N 6
+580 13 38 45788 0 \N 6
+581 13 38 43997 0 \N 6
+582 13 38 45811 1620 \N 6
+583 13 38 45919 1620 \N 6
+691 0 49 41870 0 \N 40
+810 0 61 41796 0 \N 10
+824 0 48 42197 0 \N 30
+825 0 50 41759 0 \N 5000
+845 0 65 41839 0 \N 3
+846 0 66 41759 0 \N 5000
+847 0 67 42197 0 \N 30
+848 0 68 41788 0 \N 14
+849 0 69 41870 0 \N 40
+850 0 70 41796 0 \N 10
+851 16 70 45914 60 \N 10
+852 16 70 45838 60 \N 10
+853 16 70 45793 180 \N 10
+854 16 70 45763 180 \N 10
+855 16 70 45788 180 \N 10
+856 16 70 45771 180 \N 10
+857 16 70 45759 180 \N 10
+858 0 71 41839 0 \N 3
+859 0 73 41759 0 \N 5000
+860 0 74 42197 0 \N 30
+861 0 75 41788 0 \N 14
+862 0 76 41870 0 \N 40
+863 0 77 41759 0 \N 5000
+864 0 78 42197 0 \N 30
+865 0 79 41788 0 \N 14
+866 0 80 41870 0 \N 40
+867 0 81 41796 0 \N 10
+868 15 72 63752 60 \N 21
+869 15 72 45873 60 \N 21
+870 15 72 45771 60 \N 21
+871 15 72 45788 60 \N 21
+872 15 72 35850 1200 \N 21
+873 15 72 45811 1200 \N 21
+874 15 71 45866 60 \N 3
+875 15 71 45838 60 \N 3
+876 15 73 45955 60 \N 5000
+877 15 73 44198 60 \N 5000
+878 15 73 45801 60 \N 5000
+879 15 73 45771 60 \N 5000
+880 15 73 45901 60 \N 5000
+881 15 73 63923 60 \N 5000
+882 15 73 45782 60 \N 5000
+883 15 73 45751 60 \N 5000
+884 15 73 45752 60 \N 5000
+885 15 73 45788 60 \N 5000
+886 15 73 45866 660 \N 5002
+887 15 73 45792 960 \N 5002
+888 15 73 36210 960 \N 5002
+889 15 73 62151 960 \N 5002
+890 15 73 48960 1140 \N 5003
+891 15 73 46286 1200 \N 5003
+892 15 75 44219 60 \N 14
+893 15 75 45927 60 \N 14
+894 15 75 43996 60 \N 14
+895 15 75 45866 60 \N 14
+896 15 75 45771 60 \N 14
+897 15 75 45869 60 \N 14
+898 15 75 45811 60 \N 14
+899 15 75 35733 60 \N 14
+900 15 75 45945 60 \N 14
+901 15 75 45818 60 \N 14
+902 15 75 45759 60 \N 14
+903 15 75 45788 60 \N 14
+904 15 75 45823 60 \N 14
+905 15 75 65640 960 \N 14
+906 15 75 49481 960 \N 14
+907 15 75 45948 960 \N 14
+908 15 75 45969 960 \N 14
+909 15 75 61323 1200 \N 14
+910 15 75 65702 1200 \N 14
+911 15 75 49481 1320 \N 16
+912 15 75 45793 1380 \N 2
+913 15 76 61832 60 \N 40
+914 15 76 45866 60 \N 40
+915 15 76 45771 60 \N 40
+916 15 76 45806 60 \N 40
+917 15 76 45870 60 \N 40
+918 15 76 62105 60 \N 40
+919 15 76 45818 60 \N 40
+920 15 76 45788 60 \N 40
+921 15 76 45853 60 \N 40
+922 15 76 46674 600 \N 40
+923 15 76 49251 600 \N 40
+924 15 76 50400 720 \N 43
+925 15 76 44000 720 \N 43
+926 15 76 44359 720 \N 43
+927 15 76 44297 720 \N 43
+928 15 76 45770 720 \N 43
+929 15 76 -100 720 \N 43
+930 15 76 45759 720 \N 43
+931 15 76 45870 1140 \N 41
+932 15 76 62151 1140 \N 41
+933 15 76 60178 1260 \N 41
+934 0 82 41796 0 \N 10
+935 15 82 62151 60 \N 10
+936 15 82 45866 60 \N 10
+937 15 82 45771 60 \N 10
+938 15 82 45900 60 \N 10
+939 15 82 45870 60 \N 10
+940 15 82 45853 60 \N 10
+941 15 82 45818 60 \N 10
+942 15 82 45788 60 \N 10
+943 15 82 44349 60 \N 10
+944 15 82 45919 60 \N 10
+945 15 82 62042 960 \N 11
+946 15 82 63923 960 \N 11
+947 15 82 48676 960 \N 11
+948 15 82 49228 4740 \N 11
+949 15 82 44359 4740 \N 11
+950 15 82 65672 4860 \N 8
+951 15 82 45770 4920 \N 8
+952 15 82 45759 4920 \N 8
+953 15 74 48577 60 \N 30
+954 15 74 49020 60 \N 30
+955 15 74 45866 60 \N 30
+956 15 74 45771 60 \N 30
+957 15 74 48880 60 \N 30
+958 15 74 45811 60 \N 30
+959 15 74 49083 60 \N 30
+960 15 74 45788 60 \N 30
+961 15 74 45983 60 \N 30
+962 15 74 35733 960 \N 30
+963 15 74 46286 960 \N 30
+964 15 74 62151 960 \N 30
+965 15 74 63811 1140 \N 31
+966 15 74 48980 1140 \N 31
+967 0 84 41839 0 \N 3
+968 17 83 45793 60 \N 21
+969 17 83 45763 60 \N 21
+970 17 83 44198 60 \N 21
+971 17 83 45751 60 \N 21
+972 17 83 45801 960 \N 21
+973 17 83 35850 960 \N 21
+974 17 83 44439 960 \N 21
+975 17 84 45866 60 \N 3
+976 17 84 45771 60 \N 3
+977 17 84 45838 60 \N 3
+978 17 84 44206 60 \N 3
+979 17 84 45870 60 \N 3
+980 17 84 45818 60 \N 3
+981 17 84 45788 60 \N 3
+982 17 84 45759 60 \N 3
+983 17 84 44256 1440 \N 3
+984 17 84 49251 1440 \N 3
+985 17 84 44212 1440 \N 3
+986 17 84 44359 1440 \N 3
+987 17 77 48960 60 \N 5000
+988 17 77 44198 60 \N 5000
+989 17 77 62023 60 \N 5000
+990 17 77 45801 60 \N 5000
+991 17 77 45771 60 \N 5000
+992 17 77 45901 60 \N 5000
+993 17 77 45782 60 \N 5000
+994 17 77 45751 60 \N 5000
+995 17 77 45752 60 \N 5000
+996 17 77 45788 60 \N 5000
+997 17 77 48829 60 \N 5000
+998 17 77 49054 60 \N 5000
+999 17 77 48960 1680 \N 5002
+1000 17 77 36210 1680 \N 5002
+1001 17 77 49228 1680 \N 5002
+1002 17 79 45793 60 \N 14
+1003 17 79 49481 60 \N 14
+1004 17 79 45770 60 \N 14
+1005 17 79 45771 60 \N 14
+1006 17 79 43996 60 \N 14
+1007 17 79 45901 60 \N 14
+1008 17 79 45811 60 \N 14
+1009 17 79 35733 60 \N 14
+1010 17 79 49207 60 \N 14
+1011 17 79 45752 60 \N 14
+1012 17 79 45945 60 \N 14
+1013 17 79 44219 60 \N 14
+1014 17 79 45788 60 \N 14
+1015 17 79 45866 60 \N 14
+1016 17 79 45759 60 \N 14
+1017 17 79 45927 1860 \N 4
+1018 17 79 61993 1860 \N 4
+1019 17 79 46286 1860 \N 4
+1020 17 79 45872 1860 \N 4
+1021 17 79 45748 1860 \N 4
+1022 17 79 45877 1860 \N 4
+1023 17 79 61975 1860 \N 4
+1024 17 79 49481 2280 \N 4
+1025 17 79 45793 2340 \N 4
+1026 17 79 62171 2340 \N 4
+1027 17 78 45763 60 \N 30
+1028 17 78 45801 60 \N 30
+1029 17 78 62103 60 \N 30
+1030 17 78 45901 60 \N 30
+1031 17 78 45751 60 \N 30
+1032 17 78 45752 60 \N 30
+1033 17 78 44281 60 \N 30
+1034 17 78 45788 60 \N 30
+1035 17 78 45983 60 \N 30
+1036 17 78 48577 1500 \N 30
+1037 17 78 63811 1500 \N 30
+1038 17 78 48880 1500 \N 30
+1039 17 78 62167 1500 \N 30
+1040 17 78 49083 1500 \N 30
+1041 17 78 49020 1500 \N 30
+1042 17 78 35733 2760 \N 30
+1043 17 80 35968 60 \N 40
+1044 17 80 45793 60 \N 40
+1045 17 80 45827 60 \N 40
+1046 17 80 62151 60 \N 40
+1047 17 80 61832 60 \N 40
+1048 17 80 45866 60 \N 40
+1049 17 80 45771 60 \N 40
+1050 17 80 45870 60 \N 40
+1051 17 80 45806 60 \N 40
+1052 17 80 65656 60 \N 40
+1053 17 80 45818 60 \N 40
+1054 17 80 65692 60 \N 40
+1055 17 80 44000 780 \N 43
+1056 17 80 -100 780 \N 43
+1057 17 80 45866 960 \N 41
+1058 17 80 49251 1260 \N 41
+1059 17 81 45921 60 \N 10
+1060 17 81 45763 60 \N 10
+1061 17 81 45830 60 \N 10
+1062 17 81 45793 60 \N 10
+1063 17 81 45801 60 \N 10
+1064 17 81 45866 60 \N 10
+1065 17 81 50503 60 \N 10
+1066 17 81 46030 60 \N 10
+1067 17 81 44349 60 \N 10
+1068 17 81 63923 60 \N 10
+1069 17 81 45838 60 \N 10
+1070 17 81 45853 60 \N 10
+1071 17 81 45919 60 \N 10
+1072 17 81 44004 960 \N 11
+1073 17 81 35849 960 \N 11
+1074 17 81 44011 960 \N 11
+1075 17 81 45901 960 \N 11
+1076 17 81 35733 960 \N 11
+1077 17 81 45752 960 \N 11
+1078 17 81 48871 1320 \N 11
+1079 17 81 48676 2280 \N 11
+1080 17 81 45866 2340 \N 11
+1081 17 81 61832 6000 \N 11
+1082 17 81 45770 6000 \N 11
+1083 17 81 45759 6000 \N 11
+1084 17 81 44359 6000 \N 11
+1085 0 85 41839 0 \N 3
+1086 0 87 41759 0 \N 5000
+1087 0 88 42197 0 \N 30
+1088 0 89 41788 0 \N 14
+1089 0 90 41870 0 \N 40
+1090 0 91 41796 0 \N 10
+1091 0 92 41839 0 \N 3
+1092 0 94 41759 0 \N 5000
+1093 0 95 41788 0 \N 14
+1094 0 96 41870 0 \N 40
+1095 0 97 41796 0 \N 10
+1096 21 93 45763 60 \N 21
+1097 21 93 44198 120 \N 21
+1098 21 93 44215 180 \N 21
+1099 21 85 45866 60 \N 3
+1100 21 85 45771 60 \N 3
+1101 21 85 45838 60 \N 3
+1102 21 85 44206 60 \N 3
+1103 21 85 45870 60 \N 3
+1104 21 85 45818 60 \N 3
+1105 21 85 45788 60 \N 3
+1106 21 85 45759 60 \N 3
+1107 21 91 48822 60 \N 10
+1108 21 91 45866 120 \N 10
+1109 21 91 45771 120 \N 10
+1110 21 91 45838 120 \N 10
+1111 21 91 45818 120 \N 10
+1112 21 91 45788 120 \N 10
+1113 21 91 45853 120 \N 10
+1114 21 91 45759 120 \N 10
+1115 21 91 48532 1440 \N 10
+1116 21 91 60175 1500 \N 10
+1117 21 91 48676 2460 \N 10
+1118 21 91 61832 6120 \N 10
+1119 21 91 49207 6120 \N 10
+1120 21 91 44359 6120 \N 10
+1121 21 91 50235 6300 \N 12
+1122 21 91 61323 6360 \N 12
+1123 21 91 35849 6420 \N 12
+1124 21 91 45811 6480 \N 12
+1125 21 91 45857 10140 \N 12
+1126 21 91 45830 10140 \N 12
+1127 21 91 45760 12060 \N 12
+1128 21 50 45955 60 \N 5000
+1129 21 50 44198 60 \N 5000
+1130 21 50 45801 60 \N 5000
+1131 21 50 45771 60 \N 5000
+1132 21 50 45901 60 \N 5000
+1133 21 50 45782 60 \N 5000
+1134 21 50 45751 60 \N 5000
+1135 21 50 45752 60 \N 5000
+1136 21 50 45788 60 \N 5000
+1137 21 50 36210 960 \N 5002
+1138 21 50 49054 960 \N 5002
+1139 21 50 62023 960 \N 5002
+1140 21 50 44198 1140 \N 5003
+1141 21 50 48960 1200 \N 5003
+1142 21 5 44198 60 \N 14
+1143 21 5 49481 60 \N 14
+1144 21 5 45770 60 \N 14
+1145 21 5 45771 60 \N 14
+1146 21 5 45811 60 \N 14
+1147 21 5 49207 60 \N 14
+1148 21 5 45945 60 \N 14
+1149 21 5 44219 60 \N 14
+1150 21 5 45788 60 \N 14
+1151 21 5 45866 60 \N 14
+1152 21 5 45759 60 \N 14
+1153 21 5 43996 960 \N 15
+1154 21 5 45927 960 \N 15
+1155 21 5 44382 1080 \N 15
+1156 21 5 45969 1140 \N 15
+1157 21 5 46289 1200 \N 15
+1158 21 5 45872 1260 \N 15
+1159 21 5 61993 1260 \N 15
+1160 21 5 65640 1380 \N 15
+1161 21 5 45894 2160 \N 14
+1162 21 5 50618 3120 \N 14
+1163 21 5 45927 3120 \N 14
+1164 21 5 45948 3240 \N 14
+1165 21 5 45942 3300 \N 14
+1166 21 5 45759 3300 \N 14
+1167 21 88 44198 60 \N 30
+1168 21 88 45771 60 \N 30
+1169 21 88 45752 60 \N 30
+1170 21 88 62042 60 \N 30
+1171 21 88 45788 60 \N 30
+1172 21 88 49054 60 \N 30
+1173 21 88 45759 60 \N 30
+1174 21 88 45983 960 \N 30
+1175 21 88 63811 4620 \N 33
+1176 21 88 49134 4620 \N 33
+1177 21 88 62167 4620 \N 33
+1178 21 88 48880 4800 \N 33
+1179 21 88 48577 4800 \N 33
+1180 21 88 49020 4800 \N 33
+1181 21 88 63767 4800 \N 33
+1182 21 88 35969 5940 \N 33
+1183 21 88 43997 5940 \N 33
+1184 21 88 35733 5940 \N 33
+1185 21 90 45866 60 \N 40
+1186 21 90 45771 60 \N 40
+1187 21 90 45788 60 \N 40
+1188 21 90 45818 60 \N 40
+1189 21 90 45870 60 \N 40
+1190 21 90 50400 360 \N 40
+1191 21 90 49251 960 \N 40
+1192 21 90 -100 960 \N 40
+1193 0 98 41796 0 \N 10
+1194 0 99 41796 0 \N 10
+1195 25 93 45760 240 \N 21
+1196 25 93 45890 240 \N 21
+1197 25 92 45818 60 \N 3
+1198 25 92 45914 60 \N 3
+1199 25 92 45866 60 \N 3
+1200 25 92 45870 60 \N 3
+1201 0 100 42197 0 \N 30
+1202 25 100 45771 60 \N 30
+1203 25 100 45788 60 \N 30
+1204 25 100 45759 60 \N 30
+1205 25 100 45983 60 \N 30
+1206 25 100 63811 1200 \N 30
+1207 25 100 62167 1200 \N 30
+1208 25 100 44198 1200 \N 30
+1209 25 100 44319 1200 \N 30
+1210 25 100 48880 1440 \N 30
+1211 25 100 48577 1440 \N 30
+1212 25 100 49083 1440 \N 30
+1213 25 100 49020 1440 \N 30
+1214 25 100 63767 1440 \N 30
+1215 25 100 44017 1740 \N 30
+1216 25 100 45918 1740 \N 30
+1217 25 100 43997 1860 \N 30
+1218 25 100 35733 1860 \N 30
+1219 25 100 45792 1980 \N 31
+1220 25 100 45752 1980 \N 31
+1221 25 100 45901 1980 \N 31
+1222 25 100 45873 2160 \N 31
+1223 25 100 45818 2160 \N 31
+1224 25 97 45830 60 \N 10
+1225 25 97 45864 60 \N 10
+1226 25 97 45801 60 \N 10
+1227 25 97 45866 60 \N 10
+1228 25 97 45771 60 \N 10
+1229 25 97 45900 60 \N 10
+1230 25 97 44349 60 \N 10
+1231 25 97 45914 60 \N 10
+1232 25 97 45788 60 \N 10
+1233 25 97 45853 60 \N 10
+1234 25 97 45955 660 \N 11
+1235 25 97 44586 1620 \N 11
+1236 25 97 44388 1620 \N 11
+1237 25 97 35733 1620 \N 11
+1238 25 97 44206 1620 \N 11
+1239 25 97 46336 1860 \N 11
+1240 25 97 48544 1860 \N 11
+1241 25 97 44004 1860 \N 11
+1242 25 97 44330 2040 \N 11
+1243 25 97 51290 2100 \N 11
+1244 25 97 49251 2160 \N 11
+1245 25 97 48676 2220 \N 11
+1246 25 97 44359 3180 \N 11
+1247 25 95 45793 60 \N 14
+1248 25 95 44198 60 \N 14
+1249 25 95 45770 60 \N 14
+1250 25 95 45771 60 \N 14
+1251 25 95 45811 60 \N 14
+1252 25 95 45945 60 \N 14
+1253 25 95 44219 60 \N 14
+1254 25 95 45788 60 \N 14
+1255 25 95 45759 60 \N 14
+1257 25 95 62151 960 \N 14
+1258 25 95 43996 960 \N 14
+1259 25 95 35733 960 \N 14
+1260 25 95 45927 960 \N 14
+1261 25 95 49481 1260 \N 14
+1262 25 95 43993 1320 \N 15
+1263 25 95 71083 1320 \N 15
+1264 25 95 61323 1320 \N 15
+1265 25 95 44198 1320 \N 15
+1266 25 95 45872 1560 \N 15
+1267 25 95 65640 1560 \N 15
+1268 25 95 65702 1560 \N 15
+1269 25 95 65641 2640 \N 16
+1270 25 95 49481 2640 \N 16
+1256 25 95 45060 960 2640 14
+1271 25 94 44198 60 \N 5000
+1272 25 94 62151 60 \N 5000
+1273 25 94 45801 60 \N 5000
+1274 25 94 45771 60 \N 5000
+1275 25 94 45901 60 \N 5000
+1276 25 94 45873 60 \N 5000
+1277 25 94 45782 60 \N 5000
+1278 25 94 45752 60 \N 5000
+1279 25 94 45788 60 \N 5000
+1280 25 94 36210 960 \N 5002
+1281 25 96 45793 60 \N 40
+1282 25 96 62151 60 \N 40
+1283 25 96 45866 60 \N 40
+1284 25 96 45771 60 \N 40
+1285 25 96 45818 60 \N 40
+1286 25 96 45914 60 \N 40
+1287 25 96 35968 960 \N 40
+1288 25 96 49251 960 \N 40
+1289 25 96 45759 960 \N 40
+1290 25 96 -100 1140 \N 43
+1291 0 101 41759 0 \N 5000
+1292 0 102 41759 0 \N 5000
+1293 0 103 42197 0 \N 30
+1294 0 104 41788 0 \N 14
+1295 0 105 41870 0 \N 40
+1296 0 106 41870 0 \N 40
+1297 0 107 41796 0 \N 10
+1298 26 102 45955 60 \N 5000
+1299 26 102 46020 60 \N 5000
+1300 26 102 44198 60 \N 5000
+1301 26 102 45801 60 \N 5000
+1302 26 102 45771 60 \N 5000
+1303 26 102 45901 60 \N 5000
+1304 26 102 45782 60 \N 5000
+1305 26 102 45751 60 \N 5000
+1306 26 102 45752 60 \N 5000
+1307 26 102 45788 60 \N 5000
+1308 26 102 45866 660 \N 5002
+1309 26 102 45788 720 \N 5002
+1310 26 102 45793 780 \N 5002
+1311 26 102 45770 780 \N 5002
+1312 26 102 45763 780 \N 5002
+1313 26 102 45806 780 \N 5002
+1314 26 102 45759 780 \N 5002
+1315 26 102 63923 1080 \N 5002
+1316 26 102 62151 2040 \N 5002
+1317 26 102 36210 2100 \N 5002
+1318 26 102 45792 2160 \N 5003
+1319 0 108 41788 0 \N 14
+1320 26 108 45760 60 \N 14
+1321 26 108 45793 60 \N 14
+1322 26 108 44219 60 \N 14
+1323 26 108 45927 60 \N 14
+1324 26 108 45770 60 \N 14
+1325 26 108 45771 60 \N 14
+1326 26 108 50962 60 \N 14
+1327 26 108 45811 60 \N 14
+1328 26 108 45945 60 \N 14
+1329 26 108 45823 60 \N 14
+1330 26 108 45788 60 \N 14
+1331 26 108 45759 60 \N 14
+1332 26 108 45060 960 \N 14
+1333 26 108 45818 1020 \N 14
+1334 26 108 45866 1020 \N 14
+1335 26 108 49904 2040 \N 14
+1336 26 108 45771 2100 \N 14
+1337 26 108 45927 2100 \N 14
+1338 26 108 43996 2220 \N 14
+1339 26 108 65640 3180 \N 14
+1340 26 108 49481 3180 \N 14
+1341 26 108 45948 3180 \N 14
+1342 26 108 45969 3180 \N 14
+1343 0 109 41796 0 \N 10
+1344 0 110 41839 0 \N 3
+1345 0 111 41759 0 \N 5000
+1346 0 112 42197 0 \N 30
+1347 0 113 41788 0 \N 14
+1348 0 114 41870 0 \N 40
+1349 0 115 41796 0 \N 10
+1350 27 22 44198 60 \N 21
+1351 27 22 45793 120 \N 21
+1352 27 22 45771 120 \N 21
+1353 27 110 45793 60 \N 3
+1354 27 110 45866 60 \N 3
+1355 27 110 45771 60 \N 3
+1356 27 110 45838 60 \N 3
+1357 27 110 44206 60 \N 3
+1358 27 110 45870 60 \N 3
+1359 27 110 45818 60 \N 3
+1360 27 110 45759 60 \N 3
+1361 27 113 44198 60 \N 14
+1362 27 113 49481 60 \N 14
+1363 27 113 45866 60 \N 14
+1364 27 113 45771 60 \N 14
+1365 27 113 45811 60 \N 14
+1366 27 113 45945 60 \N 14
+1367 27 113 44219 60 \N 14
+1368 27 113 45788 60 \N 14
+1369 27 113 45759 60 \N 14
+1370 27 113 65702 1500 \N 15
+1371 27 113 45927 1500 \N 15
+1372 27 113 65640 1500 \N 15
+1373 27 113 45872 1500 \N 15
+1374 27 113 50618 1500 \N 15
+1375 27 113 43996 1500 \N 15
+1376 27 113 49481 2760 \N 16
+1377 27 113 45793 2820 \N 2
+1378 27 115 45763 60 \N 10
+1379 27 115 45830 60 \N 10
+1380 27 115 45801 60 \N 10
+1381 27 115 45866 60 \N 10
+1382 27 115 45838 60 \N 10
+1383 27 115 44349 60 \N 10
+1384 27 115 45788 60 \N 10
+1385 27 115 45853 60 \N 10
+1386 27 115 44586 1440 \N 10
+1387 27 115 44011 1440 \N 10
+1388 27 115 44004 1440 \N 10
+1389 27 115 35849 3420 \N 10
+1390 27 115 49207 3420 \N 10
+1391 27 115 48676 5340 \N 10
+1392 27 115 44359 9000 \N 10
+1393 27 115 48822 9060 \N 12
+1394 27 115 45864 10020 \N 12
+1395 27 114 62151 60 \N 40
+1396 27 114 45864 60 \N 40
+1397 27 114 45866 60 \N 40
+1398 27 114 45771 60 \N 40
+1399 27 114 45900 60 \N 40
+1400 27 114 45870 60 \N 40
+1401 27 114 46674 60 \N 40
+1402 27 114 45838 60 \N 40
+1403 27 114 45818 60 \N 40
+1404 27 114 45788 60 \N 40
+1405 27 114 45853 60 \N 40
+1406 27 114 45919 60 \N 40
+1407 27 114 44327 1680 \N 40
+1408 27 114 61323 1740 \N 43
+1409 27 114 -100 1740 \N 43
+1410 27 112 63811 60 \N 30
+1411 27 112 44198 60 \N 30
+1412 27 112 45770 60 \N 30
+1413 27 112 45771 60 \N 30
+1414 27 112 45788 60 \N 30
+1415 27 112 45983 60 \N 30
+1416 27 112 48880 1380 \N 30
+1417 27 112 48577 1380 \N 30
+1418 27 112 49083 1380 \N 30
+1419 27 112 49020 1380 \N 30
+1420 27 112 43997 1620 \N 30
+1421 27 112 35733 1620 \N 30
+1422 27 111 45955 60 \N 5000
+1423 27 111 44198 60 \N 5000
+1424 27 111 45801 60 \N 5000
+1425 27 111 45771 60 \N 5000
+1426 27 111 45901 60 \N 5000
+1427 27 111 45782 60 \N 5000
+1428 27 111 45751 60 \N 5000
+1429 27 111 45752 60 \N 5000
+1430 27 111 45788 60 \N 5000
+1431 27 111 36210 600 \N 5002
+1432 27 111 63923 600 \N 5002
+1433 0 116 41839 0 \N 3
+1434 0 118 41759 0 \N 5000
+1435 0 119 42197 0 \N 30
+1436 0 120 41788 0 \N 14
+1437 0 121 41870 0 \N 40
+1438 0 122 41796 0 \N 10
+1439 29 117 45793 60 \N 21
+1440 29 117 45788 60 \N 21
+1441 29 116 45763 60 \N 3
+1442 29 116 45866 60 \N 3
+1443 29 116 45771 60 \N 3
+1444 29 116 45838 60 \N 3
+1445 29 116 45870 60 \N 3
+1446 29 116 45914 60 \N 3
+1447 29 116 45788 60 \N 3
+1448 29 116 45759 60 \N 3
+1449 29 122 45762 60 \N 10
+1450 29 122 45801 60 \N 10
+1451 29 122 45866 60 \N 10
+1452 29 122 45771 60 \N 10
+1453 29 122 45838 60 \N 10
+1454 29 122 45788 60 \N 10
+1455 29 122 45853 60 \N 10
+1456 29 122 45759 480 \N 10
+1457 29 122 44359 1440 \N 10
+1458 29 122 60175 1440 \N 10
+1459 29 122 48822 4260 \N 12
+1460 29 122 45919 4320 \N 12
+1461 29 122 45921 4380 \N 12
+1462 29 120 44198 60 \N 14
+1463 29 120 46343 60 \N 14
+1464 29 120 43996 60 \N 14
+1465 29 120 45866 60 \N 14
+1466 29 120 45771 60 \N 14
+1467 29 120 45969 60 \N 14
+1468 29 120 61823 60 \N 14
+1469 29 120 35733 60 \N 14
+1470 29 120 45811 60 \N 14
+1471 29 120 45945 60 \N 14
+1472 29 120 45948 60 \N 14
+1473 29 120 44219 60 \N 14
+1474 29 120 45788 60 \N 14
+1475 29 120 49481 60 \N 14
+1476 29 120 45759 60 \N 14
+1477 29 120 44001 960 \N 15
+1478 29 120 46136 1020 \N 15
+1479 29 120 45838 1080 \N 15
+1480 29 120 45872 1140 \N 15
+1481 29 120 61993 1140 \N 15
+1482 29 120 65702 1140 \N 15
+1483 29 120 65640 1320 \N 15
+1484 29 120 50618 1320 \N 15
+1485 29 120 61975 1320 \N 15
+1486 29 120 45927 1320 \N 15
+1487 29 120 46286 1560 \N 14
+1488 29 120 46028 2520 \N 14
+1489 29 120 49481 2580 \N 14
+1490 29 120 44302 2640 \N 15
+1491 29 120 44424 3600 \N 15
+1492 29 120 61323 3660 \N 15
+1493 29 120 45969 3720 \N 15
+1494 29 120 44198 3780 \N 15
+1495 29 120 45818 3840 \N 15
+1496 29 120 45919 3840 \N 15
+1497 29 120 45866 3840 \N 15
+1498 29 120 45778 3840 \N 15
+1499 29 120 45887 3840 \N 15
+1500 29 120 46289 5040 \N 15
+1501 29 120 44593 5040 \N 15
+1502 29 121 44004 60 \N 40
+1503 29 121 61832 60 \N 40
+1504 29 121 45866 60 \N 40
+1505 29 121 45771 60 \N 40
+1506 29 121 45838 60 \N 40
+1507 29 121 45788 60 \N 40
+1508 29 121 45853 60 \N 40
+1509 29 121 44248 1380 \N 43
+1510 29 121 45801 1380 \N 43
+1511 29 121 45955 1380 \N 43
+1512 29 121 46000 1560 \N 43
+1513 29 121 45901 1560 \N 43
+1514 29 121 45941 1560 \N 43
+1515 29 121 -100 2640 \N 43
+1516 29 118 44198 60 \N 5000
+1517 29 118 45801 60 \N 5000
+1518 29 118 45771 60 \N 5000
+1519 29 118 45901 60 \N 5000
+1520 29 118 46000 60 \N 5000
+1521 29 118 36210 60 \N 5000
+1522 29 118 63923 60 \N 5000
+1523 29 118 45782 60 \N 5000
+1524 29 118 45788 60 \N 5000
+1525 29 119 63923 60 \N 30
+1526 29 119 48577 60 \N 30
+1527 29 119 63811 60 \N 30
+1528 29 119 44198 60 \N 30
+1529 29 119 49020 60 \N 30
+1530 29 119 45771 60 \N 30
+1531 29 119 62103 60 \N 30
+1532 29 119 49083 60 \N 30
+1533 29 119 45901 60 \N 30
+1534 29 119 48880 60 \N 30
+1535 29 119 45811 60 \N 30
+1536 29 119 62167 60 \N 30
+1537 29 119 45983 60 \N 30
+1538 29 119 45788 60 \N 30
+1539 29 119 45759 60 \N 30
+1540 29 119 44319 60 \N 30
+1541 29 119 44615 1020 \N 30
+1542 29 119 46093 1020 \N 30
+1543 29 119 44017 1020 \N 30
+1544 29 119 35733 1020 \N 30
+1545 29 119 63767 1020 \N 30
+1546 29 119 43997 1020 \N 30
+1547 29 119 49054 1380 \N 31
+1548 0 123 41788 0 \N 14
+1549 26 123 45927 60 \N 14
+1550 26 123 65640 60 \N 14
+1551 26 123 46451 60 \N 14
+1552 26 123 35733 60 \N 14
+1553 26 123 45818 60 \N 14
+1554 26 123 44219 60 \N 14
+1555 26 123 49481 420 \N 14
+1556 26 123 45060 480 \N 15
+1557 26 123 45759 480 \N 15
+1558 26 123 44236 480 \N 15
+1559 26 123 44219 480 \N 15
+1560 26 123 45927 480 \N 15
+1561 26 123 45793 780 \N 15
+1562 26 123 45763 780 \N 15
+1563 26 123 44198 780 \N 15
+1564 26 123 45770 780 \N 15
+1565 26 123 45771 780 \N 15
+1566 26 123 45806 780 \N 15
+1567 26 123 45945 780 \N 15
+1568 26 123 45788 780 \N 15
+1569 26 123 61323 1260 \N 15
+1570 26 123 45969 1320 \N 15
+1571 26 123 45872 1380 \N 15
+1572 26 123 45811 1380 \N 15
+1573 26 123 45948 1380 \N 15
+1574 26 123 45927 1380 \N 15
+1575 26 123 49481 1620 \N 15
+1576 26 123 43996 2580 \N 15
+1577 26 123 65702 2640 \N 15
+1578 0 124 41788 0 \N 14
+1579 0 125 41788 0 \N 14
+1580 26 123 45759 2700 \N 15
+1581 0 126 41788 0 \N 14
+1582 0 126 49481 60 \N 14
+1583 0 126 65702 120 \N 15
+1584 0 126 45927 120 \N 15
+1585 0 126 45788 120 \N 15
+1586 0 126 45866 120 \N 15
+1587 0 126 35733 120 \N 15
+1588 0 126 44219 120 \N 15
+1589 0 126 43996 120 \N 15
+1590 0 126 44637 120 \N 15
+1591 0 126 44404 600 \N 15
+1592 0 126 49481 660 \N 15
+1593 0 126 61323 720 \N 15
+1594 0 126 45792 780 \N 15
+1595 0 126 45793 780 \N 15
+1596 0 126 45763 780 \N 15
+1597 0 126 44198 780 \N 15
+1598 0 126 61993 780 \N 15
+1599 0 126 45770 780 \N 15
+1600 0 126 45771 780 \N 15
+1601 0 126 45806 780 \N 15
+1602 0 126 45872 780 \N 15
+1603 0 126 45969 780 \N 15
+1604 0 126 45818 780 \N 15
+1605 0 126 45759 780 \N 15
+1606 0 126 45872 1680 \N 15
+1607 0 126 65702 1680 \N 15
+1608 0 126 49481 1800 \N 15
+1609 0 126 46451 1860 \N 15
+1610 0 126 43996 1860 \N 15
+1611 0 127 41839 0 \N 3
+1612 0 129 41759 0 \N 5000
+1613 0 130 42197 0 \N 30
+1614 0 131 41788 0 \N 14
+1615 0 132 41870 0 \N 40
+1616 0 133 41796 0 \N 10
+1617 30 128 45763 60 \N 21
+1618 30 128 45788 120 \N 21
+1619 30 127 45866 60 \N 3
+1620 30 127 45771 60 \N 3
+1621 30 127 45838 60 \N 3
+1622 30 127 45870 60 \N 3
+1623 30 127 45818 60 \N 3
+1624 30 127 45788 60 \N 3
+1625 30 127 45811 420 \N 3
+1626 30 127 44206 420 \N 3
+1627 30 130 45771 60 \N 30
+1628 30 130 45788 60 \N 30
+1629 30 130 45759 60 \N 30
+1630 30 130 45983 60 \N 30
+1631 30 130 44198 300 \N 30
+1632 30 130 62151 300 \N 30
+1633 30 130 48577 4020 \N 33
+1634 30 130 63811 4020 \N 33
+1635 30 130 45901 4020 \N 33
+1636 30 130 48880 4020 \N 33
+1637 30 130 45751 4020 \N 33
+1638 30 130 45752 4020 \N 33
+1639 30 130 45818 4020 \N 33
+1640 30 130 49083 4020 \N 33
+1641 30 130 49020 4020 \N 33
+1642 30 130 44198 4560 \N 33
+1643 30 130 36210 4920 \N 33
+1644 30 130 44595 4920 \N 33
+1645 30 130 43997 4920 \N 33
+1646 30 130 45792 5100 \N 31
+1647 30 130 45866 5100 \N 31
+1648 30 132 45866 60 \N 40
+1649 30 132 45771 60 \N 40
+1650 30 132 45788 60 \N 40
+1651 30 132 45870 60 \N 40
+1652 30 132 62151 60 \N 40
+1653 30 132 44000 360 \N 40
+1654 30 132 -100 360 \N 40
+1655 30 132 45818 480 \N 41
+1656 30 132 45866 480 \N 41
+1657 30 132 44004 480 \N 41
+1658 30 132 45853 480 \N 41
+1659 30 131 44198 60 \N 14
+1660 30 131 62151 60 \N 14
+1661 30 131 45771 60 \N 14
+1662 30 131 45945 60 \N 14
+1663 30 131 45788 60 \N 14
+1664 30 131 61823 60 \N 14
+1665 30 131 49481 960 \N 14
+1666 30 131 44219 960 \N 14
+1667 30 131 43996 960 \N 14
+1668 30 131 45869 960 \N 14
+1669 30 131 45927 960 \N 14
+1670 30 131 45770 1260 \N 15
+1671 30 131 61975 1260 \N 15
+1672 30 131 44198 1260 \N 15
+1673 30 131 45759 1260 \N 15
+1674 30 131 45818 1500 \N 14
+1675 30 131 49481 2460 \N 14
+1676 30 131 45927 2520 \N 15
+1677 30 131 65640 2520 \N 15
+1678 30 131 61993 2520 \N 15
+1679 30 131 65646 2520 \N 15
+1680 30 131 45872 2520 \N 15
+1681 30 131 61975 2520 \N 15
+1682 30 131 61976 2520 \N 15
+1683 30 131 49481 2940 \N 16
+1684 30 133 45801 60 \N 10
+1685 30 133 45866 60 \N 10
+1686 30 133 45771 60 \N 10
+1687 30 133 45838 60 \N 10
+1688 30 133 45870 60 \N 10
+1689 30 133 45788 60 \N 10
+1690 30 133 45853 60 \N 10
+1691 30 133 45759 60 \N 10
+1692 30 133 60175 540 \N 10
+1693 30 133 48676 960 \N 10
+1694 30 133 45811 960 \N 10
+1695 30 133 45900 960 \N 10
+1696 30 133 48822 960 \N 10
+1697 30 133 44206 1200 \N 11
+1698 30 133 61832 4860 \N 11
+1699 30 133 44250 4860 \N 11
+1700 30 133 45870 4980 \N 8
+1701 30 129 44198 60 \N 5000
+1702 30 129 45801 60 \N 5000
+1703 30 129 45771 60 \N 5000
+1704 30 129 45901 60 \N 5000
+1705 30 129 36210 60 \N 5000
+1706 30 129 45782 60 \N 5000
+1707 30 129 45752 60 \N 5000
+1708 30 129 45788 60 \N 5000
+1709 30 129 48960 1440 \N 5003
+1710 30 129 48686 1440 \N 5003
+1711 30 129 62151 1440 \N 5003
+1712 0 134 41788 0 \N 14
+1713 26 134 45788 60 \N 14
+1714 26 134 45793 120 \N 14
+1715 26 134 45763 120 \N 14
+1716 26 134 44198 120 \N 14
+1717 26 134 45770 120 \N 14
+1718 26 134 45771 120 \N 14
+1719 26 134 45945 120 \N 14
+1720 26 134 45759 120 \N 14
+1721 26 134 45771 540 \N 14
+1722 26 134 45927 600 \N 14
+1723 26 134 45872 660 \N 14
+1724 26 134 65702 660 \N 14
+1725 26 134 49481 780 \N 16
+1726 0 135 41788 0 \N 14
+1727 26 135 45927 60 \N 14
+1728 26 135 44198 120 \N 14
+1729 26 135 45872 180 \N 14
+1730 26 135 45872 240 \N 14
+1731 26 135 61993 240 \N 14
+1732 26 135 65702 240 \N 14
+1733 26 135 49481 420 \N 16
+1734 0 136 41788 0 \N 14
+1735 26 136 45872 60 \N 14
+1736 26 136 65702 120 \N 14
+1737 0 137 41839 0 \N 3
+1738 0 139 41759 0 \N 5000
+1739 0 140 42197 0 \N 30
+1740 0 141 41788 0 \N 14
+1741 0 142 41870 0 \N 40
+1742 31 138 45788 60 \N 21
+1743 31 137 45866 60 \N 3
+1744 31 137 44206 60 \N 3
+1745 0 143 41796 0 \N 10
+1746 31 143 45830 60 \N 10
+1747 31 143 45864 60 \N 10
+1748 31 143 45866 60 \N 10
+1749 31 143 45771 60 \N 10
+1750 31 143 45838 60 \N 10
+1751 31 143 45818 60 \N 10
+1752 31 143 45788 60 \N 10
+1753 31 143 44349 60 \N 10
+1754 31 143 44011 540 \N 11
+1755 31 143 44388 960 \N 11
+1756 31 143 45919 1020 \N 11
+1757 31 143 45792 1080 \N 11
+1758 31 143 45776 1080 \N 11
+1759 31 143 44228 1080 \N 11
+1760 31 143 62023 1080 \N 11
+1761 31 143 45797 1320 \N 11
+1762 31 143 61837 1320 \N 11
+1763 31 143 44206 1440 \N 11
+1764 31 141 50372 60 \N 14
+1765 31 141 44198 60 \N 14
+1766 31 141 45894 60 \N 14
+1767 31 141 43996 60 \N 14
+1768 31 141 45771 60 \N 14
+1769 31 141 46286 60 \N 14
+1770 31 141 35733 60 \N 14
+1771 31 141 49481 60 \N 14
+1772 31 141 45945 60 \N 14
+1773 31 141 44219 60 \N 14
+1774 31 141 45788 60 \N 14
+1775 31 141 61823 60 \N 14
+1776 31 141 45811 780 \N 15
+1777 31 141 50400 840 \N 15
+1778 31 141 44001 840 \N 15
+1779 31 141 65702 840 \N 15
+1780 31 141 44198 840 \N 15
+1781 31 141 45927 840 \N 15
+1782 31 141 65640 840 \N 15
+1783 31 141 65646 840 \N 15
+1784 31 141 45872 840 \N 15
+1785 31 141 45875 840 \N 15
+1786 31 141 45919 840 \N 15
+1787 31 141 49481 1440 \N 16
+1788 31 141 45793 1500 \N 2
+1789 31 141 45763 1500 \N 2
+1790 31 141 45759 1500 \N 2
+1791 31 140 63767 60 \N 30
+1792 31 140 48577 60 \N 30
+1793 31 140 63811 60 \N 30
+1794 31 140 45788 60 \N 30
+1795 31 140 45771 60 \N 30
+1796 31 140 45901 60 \N 30
+1797 31 140 48880 60 \N 30
+1798 31 140 62167 60 \N 30
+1799 31 140 45752 60 \N 30
+1800 31 140 49083 60 \N 30
+1801 31 140 49020 60 \N 30
+1802 31 140 50654 60 \N 30
+1803 31 140 45983 60 \N 30
+1804 31 140 44615 840 \N 30
+1805 31 140 43997 840 \N 30
+1806 31 140 35733 840 \N 30
+1807 31 142 45866 60 \N 40
+1808 31 142 -100 60 \N 40
+1809 31 142 45838 60 \N 40
+1810 31 142 44198 60 \N 40
+1811 31 142 61823 60 \N 40
+1812 31 142 61832 360 \N 41
+1813 31 142 45866 360 \N 41
+1814 31 142 45771 360 \N 41
+1815 31 142 45806 360 \N 41
+1816 31 142 45870 360 \N 41
+1817 31 142 45818 360 \N 41
+1818 31 142 45788 360 \N 41
+1819 31 142 45792 780 \N 41
+1820 31 142 44005 840 \N 41
+1821 31 139 44198 60 \N 5000
+1822 31 139 48775 60 \N 5000
+1823 31 139 45771 60 \N 5000
+1824 31 139 45901 60 \N 5000
+1825 31 139 44237 60 \N 5000
+1826 31 139 45782 60 \N 5000
+1827 31 139 45751 60 \N 5000
+1828 31 139 45752 60 \N 5000
+1829 31 139 45818 60 \N 5000
+1830 31 139 45788 60 \N 5000
+1831 31 139 43997 60 \N 5000
+1832 31 139 44198 720 \N 5002
+1833 31 139 62151 960 \N 5002
+1834 31 139 45792 1020 \N 5002
+1835 31 139 63923 1020 \N 5002
+1836 0 144 41839 0 \N 3
+1837 0 146 41759 0 \N 5000
+1838 0 147 42197 0 \N 30
+1839 0 148 41788 0 \N 14
+1840 0 149 41870 0 \N 40
+1841 0 150 41796 0 \N 10
+1842 33 145 45788 60 \N 21
+1843 33 144 44206 60 \N 3
+1844 33 144 45771 60 \N 3
+1845 33 144 45838 60 \N 3
+1846 33 144 45870 60 \N 3
+1847 33 144 45759 60 \N 3
+1848 33 147 45983 60 \N 30
+1849 33 147 45771 60 \N 30
+1850 33 147 45788 60 \N 30
+1851 33 147 45759 60 \N 30
+1852 33 147 49083 1200 \N 30
+1853 33 147 49020 1200 \N 30
+1854 33 147 48880 1320 \N 30
+1855 33 147 48577 1320 \N 30
+1856 33 147 63811 1320 \N 30
+1857 33 147 44198 1500 \N 30
+1858 33 147 35733 2460 \N 30
+1859 33 147 43997 2520 \N 31
+1860 33 147 44595 2580 \N 31
+1861 33 150 45763 60 \N 10
+1862 33 150 45864 1020 \N 10
+1863 33 150 45900 1020 \N 10
+1864 33 150 44330 1140 \N 11
+1865 33 150 48522 1200 \N 11
+1866 33 150 45870 4860 \N 11
+1867 33 150 45853 4920 \N 11
+1868 33 150 44359 4980 \N 11
+1869 33 149 45866 60 \N 40
+1870 33 149 44198 60 \N 40
+1871 33 149 35846 360 \N 40
+1872 33 149 -100 420 \N 43
+1873 33 149 61832 480 \N 41
+1874 33 149 45793 480 \N 41
+1875 33 149 45771 480 \N 41
+1876 33 149 45759 480 \N 41
+1877 33 149 44359 720 \N 41
+1878 33 146 44198 60 \N 5000
+1879 33 146 45771 120 \N 5002
+1880 33 146 45901 120 \N 5002
+1881 33 146 45782 120 \N 5002
+1882 33 146 45752 120 \N 5002
+1883 33 146 45818 120 \N 5002
+1884 33 146 45788 120 \N 5002
+1885 33 146 45759 120 \N 5002
+1886 33 146 44281 540 \N 5002
+1887 33 146 36210 1020 \N 5002
+1888 33 148 44198 60 \N 14
+1889 33 148 49481 60 \N 14
+1890 33 148 45866 60 \N 14
+1891 33 148 45771 60 \N 14
+1892 33 148 43996 60 \N 14
+1893 33 148 45969 60 \N 14
+1894 33 148 45811 60 \N 14
+1895 33 148 45945 60 \N 14
+1896 33 148 44219 60 \N 14
+1897 33 148 45788 60 \N 14
+1898 33 148 45759 60 \N 14
+1899 33 148 36086 720 \N 15
+1900 33 148 61323 720 \N 15
+1901 33 148 62022 720 \N 15
+1902 33 148 44198 720 \N 15
+1903 33 148 65640 960 \N 15
+1904 33 148 45927 960 \N 15
+1905 33 148 35733 1080 \N 14
+1906 33 148 49481 1140 \N 14
+1907 33 148 44198 1140 \N 14
+1908 33 148 45872 1260 \N 15
+1909 33 148 65640 1260 \N 15
+1910 33 148 44198 1260 \N 15
+1911 33 148 65702 1260 \N 15
+1912 33 148 45927 1260 \N 15
+1913 33 148 49481 1560 \N 16
+1914 2 32 45793 1560 \N 3
+1915 13 39 45869 2640 \N 2
+1916 13 39 45869 2700 \N 2
+1917 13 39 49408 3660 \N 2
+1918 13 39 46343 3720 \N 2
+1919 13 39 61832 4680 \N 2
+1920 13 39 50737 6540 \N 2
+1921 13 39 49836 6540 \N 2
+1922 13 39 45778 6600 \N 2
+1923 13 39 45763 6600 \N 2
+1924 0 151 41839 0 \N 3
+1925 0 152 41759 0 \N 5000
+1926 0 153 41788 0 \N 14
+1927 0 153 45793 60 \N 14
+1928 0 153 44198 60 \N 14
+1929 0 153 45770 60 \N 14
+1930 0 153 45771 60 \N 14
+1931 0 153 45811 60 \N 14
+1932 0 153 45945 60 \N 14
+1933 0 153 44219 60 \N 14
+1934 0 153 45788 60 \N 14
+1935 0 153 45866 60 \N 14
+1936 0 153 45759 60 \N 14
+1937 0 153 49481 960 \N 14
+1938 0 153 45891 1020 \N 15
+1939 0 153 46051 1020 \N 15
+1940 0 153 45969 2040 \N 15
+1941 0 153 45763 2100 \N 15
+1942 0 153 45770 2160 \N 15
+1943 0 153 45759 2160 \N 15
+1944 0 153 44198 3180 \N 15
+1945 0 153 45793 3240 \N 15
+1946 0 153 44198 4200 \N 15
+1947 0 153 65640 4260 \N 15
+1948 0 153 45927 4260 \N 15
+1949 0 153 44382 4380 \N 14
+1950 0 153 65646 4440 \N 14
+1951 0 153 45872 4500 \N 14
+1952 0 153 65702 4500 \N 14
+1953 0 153 49481 4620 \N 16
+1954 0 155 41759 0 \N 5000
+1955 0 156 42197 0 \N 30
+1956 0 157 41788 0 \N 14
+1957 0 158 41870 0 \N 40
+1958 34 154 45771 60 \N 21
+1959 34 151 45866 60 \N 3
+1960 34 151 45771 60 \N 3
+1961 34 151 45870 60 \N 3
+1962 34 151 44206 60 \N 3
+1963 34 151 45914 60 \N 3
+1964 34 151 45788 60 \N 3
+1965 0 159 41796 0 \N 10
+1966 34 159 45818 60 \N 10
+1967 34 159 50235 60 \N 10
+1968 34 159 44349 60 \N 10
+1969 34 159 45830 60 \N 10
+1970 34 159 45853 60 \N 10
+1971 34 159 45771 360 \N 10
+1972 34 159 45788 360 \N 10
+1974 34 159 45811 1380 \N 10
+1976 34 159 45977 1560 \N 10
+1977 34 159 63923 1620 \N 10
+1979 34 159 45866 1740 \N 10
+1980 34 159 45921 1800 \N 10
+1981 34 159 48822 1800 \N 10
+1982 34 159 48676 1920 \N 11
+1983 34 159 48871 1980 \N 11
+1984 34 159 44250 4740 \N 11
+1985 34 159 45770 5700 \N 8
+1986 34 159 49301 5700 \N 8
+1987 34 159 45759 5700 \N 8
+2026 34 155 45752 60 \N 5000
+1978 34 159 49054 1620 5880 10
+1973 34 159 35849 1380 5880 10
+1975 34 159 35733 1380 5880 10
+1988 34 158 45866 60 \N 40
+1989 34 158 45763 60 \N 40
+1990 34 158 45806 60 \N 40
+1991 34 158 45838 60 \N 40
+1992 34 158 45818 360 \N 40
+1993 34 158 45811 360 \N 40
+1994 34 158 -100 360 \N 40
+1995 34 158 45977 540 \N 41
+1996 34 158 60178 540 \N 41
+1997 34 158 44004 540 \N 41
+1998 34 158 45853 540 \N 41
+1999 34 158 45824 780 \N 41
+2000 34 158 49251 780 \N 41
+2001 34 157 45793 60 \N 14
+2002 34 157 45771 60 \N 14
+2003 34 157 45759 60 \N 14
+2004 34 157 44290 240 \N 14
+2005 34 157 45811 240 \N 14
+2006 34 157 45945 360 \N 14
+2007 34 157 45823 360 \N 14
+2008 34 157 65640 1380 \N 14
+2009 34 157 61993 1380 \N 14
+2010 34 157 65702 1380 \N 14
+2011 34 157 61975 1380 \N 14
+2012 34 157 49481 1620 \N 16
+2013 34 157 44219 1620 \N 16
+2014 34 157 43996 1740 \N 2
+2015 34 157 35733 1740 \N 2
+2016 34 156 48577 60 \N 30
+2017 34 156 63811 60 \N 30
+2018 34 156 45788 60 \N 30
+2019 34 156 45771 60 \N 30
+2020 34 156 48880 60 \N 30
+2021 34 156 35733 60 \N 30
+2022 34 156 62167 60 \N 30
+2023 34 156 49083 60 \N 30
+2024 34 156 49020 60 \N 30
+2025 34 156 43997 60 \N 30
+2027 34 155 44290 60 \N 5000
+2028 34 155 45771 60 \N 5000
+2029 34 155 45788 60 \N 5000
+2030 34 155 36210 60 \N 5000
+2031 34 155 45818 360 \N 5003
+2032 34 155 45782 360 \N 5003
+2033 0 160 41839 0 \N 3
+2034 0 162 41759 0 \N 5000
+2035 0 163 42197 0 \N 30
+2036 0 164 41788 0 \N 14
+2037 0 165 41870 0 \N 40
+2038 0 166 41796 0 \N 10
+2039 35 161 45771 60 \N 21
+2040 35 160 45866 60 \N 3
+2041 35 160 45771 60 \N 3
+2042 35 160 45870 60 \N 3
+2043 35 160 44206 60 \N 3
+2044 35 160 45838 60 \N 3
+2045 35 160 45818 60 \N 3
+2046 35 166 45830 60 \N 10
+2047 35 166 45801 60 \N 10
+2048 35 166 45866 60 \N 10
+2049 35 166 45771 60 \N 10
+2050 35 166 45838 60 \N 10
+2051 35 166 44349 60 \N 10
+2052 35 166 45788 60 \N 10
+2053 35 166 45853 60 \N 10
+2054 35 166 61832 1440 \N 10
+2055 35 166 44011 1440 \N 10
+2056 35 166 44388 1440 \N 10
+2057 35 166 44206 1440 \N 10
+2058 35 166 49251 1680 \N 10
+2059 35 166 65695 1680 \N 10
+2060 35 166 45811 1800 \N 10
+2061 35 166 45759 1860 \N 10
+2062 35 164 44198 60 \N 14
+2063 35 164 45788 60 \N 14
+2064 35 164 45771 60 \N 14
+2065 35 164 61823 60 \N 14
+2066 35 164 46160 60 \N 14
+2067 35 164 45811 60 \N 14
+2068 35 164 45945 60 \N 14
+2069 35 164 45818 60 \N 14
+2070 35 164 44219 60 \N 14
+2071 35 164 43996 60 \N 14
+2072 35 164 45759 60 \N 14
+2073 35 164 65702 1620 \N 14
+2074 35 164 45927 1620 \N 14
+2075 35 164 61993 1620 \N 14
+2076 35 164 65646 1620 \N 14
+2077 35 164 45872 1620 \N 14
+2078 35 164 45873 1620 \N 14
+2079 35 164 45875 1620 \N 14
+2080 35 164 49481 1620 \N 14
+2081 35 163 48577 60 \N 30
+2082 35 163 44198 60 \N 30
+2083 35 163 49020 60 \N 30
+2084 35 163 45771 60 \N 30
+2085 35 163 48880 60 \N 30
+2086 35 163 49083 60 \N 30
+2087 35 163 45788 60 \N 30
+2088 35 163 45759 60 \N 30
+2089 35 163 44281 1440 \N 30
+2090 35 163 44252 1500 \N 30
+2091 35 163 49079 1500 \N 30
+2092 35 165 45888 60 \N 40
+2093 35 165 49251 60 \N 40
+2094 35 165 45866 60 \N 40
+2095 35 165 45771 60 \N 40
+2096 35 165 45838 60 \N 40
+2097 35 165 45806 60 \N 40
+2098 35 165 45788 60 \N 40
+2099 35 165 45955 1380 \N 43
+2101 35 165 45759 2340 \N 43
+2102 35 165 35968 2460 \N 43
+2100 35 165 35846 2340 2460 43
+2103 35 165 -100 2520 \N 43
+2104 35 165 61832 2580 \N 41
+2105 35 165 44004 2580 \N 41
+2106 35 162 45955 60 \N 5000
+2107 35 162 45801 60 \N 5000
+2108 35 162 45771 60 \N 5000
+2109 35 162 45782 60 \N 5000
+2110 35 162 45751 60 \N 5000
+2111 35 162 45752 60 \N 5000
+2112 35 162 45788 60 \N 5000
+2113 35 162 44281 1380 \N 5000
+2114 35 162 36210 1380 \N 5000
+2115 35 162 44198 1380 \N 5000
+2116 35 162 44198 1560 \N 5003
+2117 0 167 41839 0 \N 3
+2118 0 168 41839 0 \N 3
+2119 0 170 41759 0 \N 5000
+2120 0 171 42197 0 \N 30
+2121 0 172 41788 0 \N 14
+2122 0 173 41870 0 \N 40
+2123 0 174 41796 0 \N 10
+2124 39 169 45771 60 \N 21
+2125 39 168 45914 60 \N 3
+2126 39 168 45788 60 \N 3
+2127 39 168 45759 60 \N 3
+2128 39 174 45921 60 \N 10
+2129 39 174 45900 60 \N 10
+2130 39 174 48822 60 \N 10
+2131 39 174 45866 240 \N 11
+2132 39 174 45771 240 \N 11
+2133 39 174 44349 240 \N 11
+2134 39 174 48532 240 \N 11
+2135 39 174 45818 240 \N 11
+2136 39 174 45788 240 \N 11
+2137 39 174 45853 240 \N 11
+2138 39 174 45955 660 \N 11
+2139 39 174 45919 660 \N 11
+2140 39 174 44004 1680 \N 11
+2141 39 174 48676 1740 \N 11
+2142 39 174 44359 5400 \N 11
+2143 39 174 45770 5460 \N 8
+2144 39 174 45870 5460 \N 8
+2145 39 174 45759 5460 \N 8
+2146 39 170 45955 60 \N 5000
+2147 39 170 44198 60 \N 5000
+2148 39 170 62023 60 \N 5000
+2149 39 170 45801 60 \N 5000
+2150 39 170 45771 60 \N 5000
+2151 39 170 45901 60 \N 5000
+2152 39 170 45782 60 \N 5000
+2153 39 170 45751 60 \N 5000
+2154 39 170 45752 60 \N 5000
+2155 39 170 45788 60 \N 5000
+2156 39 170 48960 1560 \N 5002
+2157 39 170 36210 1560 \N 5002
+2158 39 170 46291 1560 \N 5002
+2159 39 170 43997 1560 \N 5002
+2160 39 170 46157 1560 \N 5002
+2161 39 172 44198 60 \N 14
+2162 39 172 45927 60 \N 14
+2163 39 172 49481 60 \N 14
+2164 39 172 45770 60 \N 14
+2165 39 172 45771 60 \N 14
+2166 39 172 43996 60 \N 14
+2167 39 172 45872 60 \N 14
+2168 39 172 45868 60 \N 14
+2169 39 172 45811 60 \N 14
+2170 39 172 35733 60 \N 14
+2171 39 172 45945 60 \N 14
+2172 39 172 44219 60 \N 14
+2173 39 172 45788 60 \N 14
+2174 39 172 45866 60 \N 14
+2175 39 172 45759 60 \N 14
+2176 39 172 65640 960 \N 16
+2177 39 172 61975 960 \N 16
+2178 39 172 45872 1080 \N 16
+2179 39 172 65702 1080 \N 16
+2180 39 172 45858 1200 \N 16
+2181 39 172 49481 4860 \N 16
+2182 39 173 44353 60 \N 40
+2183 39 173 45763 60 \N 40
+2184 39 173 -100 60 \N 40
+2185 39 173 45866 60 \N 40
+2186 39 173 45771 60 \N 40
+2187 39 173 45806 60 \N 40
+2188 39 173 49251 60 \N 40
+2189 39 173 45838 60 \N 40
+2190 39 173 44297 60 \N 40
+2191 39 173 62105 60 \N 40
+2192 39 173 45788 60 \N 40
+2193 39 173 45759 60 \N 40
+2194 39 171 45955 60 \N 30
+2195 39 171 44198 60 \N 30
+2196 39 171 45771 60 \N 30
+2197 39 171 45901 60 \N 30
+2198 39 171 45873 60 \N 30
+2199 39 171 63811 60 \N 30
+2200 39 171 62167 60 \N 30
+2201 39 171 45752 60 \N 30
+2202 39 171 45788 60 \N 30
+2203 39 171 35733 960 \N 30
+2204 39 171 43997 960 \N 30
+2205 0 175 41839 0 \N 3
+2206 0 177 41759 0 \N 5000
+2207 0 179 42197 0 \N 30
+2208 0 180 41788 0 \N 14
+2209 0 181 41870 0 \N 40
+2210 0 182 41796 0 \N 10
+2211 40 178 45788 60 1020 21
+2212 40 175 44256 60 \N 3
+2213 40 175 45866 60 \N 3
+2214 40 175 49251 60 \N 3
+2215 40 175 44206 60 \N 3
+2216 40 177 45955 60 \N 5000
+2217 40 177 44198 60 \N 5000
+2218 40 177 45801 60 \N 5000
+2219 40 177 45771 60 \N 5000
+2220 40 177 45901 60 \N 5000
+2221 40 177 48686 60 \N 5000
+2222 40 177 36210 60 \N 5000
+2223 40 177 45782 60 \N 5000
+2224 40 177 45751 60 \N 5000
+2225 40 177 45752 60 \N 5000
+2226 40 177 45788 60 \N 5000
+2227 40 177 43997 60 \N 5000
+2228 40 177 48960 960 \N 5003
+2229 40 177 44198 960 \N 5003
+2230 40 182 46030 60 \N 10
+2231 40 182 45788 120 \N 10
+2232 40 182 45771 180 \N 10
+2233 40 182 45955 240 \N 10
+2234 40 182 50200 300 \N 10
+2235 40 182 45866 360 \N 10
+2236 40 182 45870 660 \N 10
+2237 40 182 45838 660 \N 10
+2238 40 182 45921 780 \N 10
+2239 40 182 45900 780 \N 10
+2240 40 182 48676 900 \N 11
+2241 40 182 44359 4560 \N 11
+2242 40 182 62175 4620 \N 8
+2243 40 182 46113 4680 \N 8
+2244 40 182 61832 4740 \N 8
+2245 40 180 45793 60 \N 14
+2246 40 180 44198 60 \N 14
+2247 40 180 49481 60 \N 14
+2248 40 180 45770 60 \N 14
+2249 40 180 45771 60 \N 14
+2250 40 180 43996 60 \N 14
+2251 40 180 45811 60 \N 14
+2252 40 180 45945 60 \N 14
+2253 40 180 44219 60 \N 14
+2254 40 180 45788 60 \N 14
+2255 40 180 45866 60 \N 14
+2256 40 180 45759 60 \N 14
+2257 40 180 44198 780 \N 15
+2258 40 180 63759 780 \N 15
+2259 40 180 61323 900 \N 15
+2260 40 180 61993 960 \N 15
+2261 40 180 65640 1020 \N 16
+2262 40 180 45927 1020 \N 16
+2263 40 180 45969 1140 \N 16
+2264 40 180 46286 1140 \N 16
+2265 40 179 44198 60 \N 30
+2266 40 179 45866 60 \N 30
+2267 40 179 45771 60 \N 30
+2268 40 179 45811 60 \N 30
+2269 40 179 45759 60 \N 30
+2270 40 179 45788 60 \N 30
+2271 40 179 45983 60 \N 30
+2272 40 179 48880 4080 \N 33
+2273 40 179 48577 4080 \N 33
+2274 40 179 49083 4080 \N 33
+2275 40 179 49020 4080 \N 33
+2276 40 179 63767 4080 \N 33
+2277 40 179 43997 4380 \N 33
+2278 40 179 35733 4440 \N 31
+2279 40 179 44615 4500 \N 31
+2280 40 181 45866 60 \N 40
+2281 40 181 45788 240 \N 40
+2282 40 181 45771 300 \N 40
+2283 40 181 45806 360 \N 40
+2284 40 181 45914 420 \N 40
+2285 40 181 45955 480 \N 40
+2286 40 181 62151 540 \N 40
+2287 40 181 44198 600 \N 40
+2288 40 181 -100 660 \N 40
+2289 40 181 50200 720 \N 41
+2290 0 183 41870 0 \N 40
+2291 0 184 41759 0 \N 5000
+2292 0 185 42197 0 \N 30
+2293 0 186 41788 0 \N 14
+2294 0 187 41870 0 \N 40
+2295 0 188 41796 0 \N 10
+2296 41 176 45751 60 \N 21
+2297 41 176 45788 120 \N 21
+2298 0 189 41839 0 \N 3
+2299 41 189 45763 60 \N 3
+2300 41 189 45866 60 \N 3
+2301 41 189 45771 60 \N 3
+2302 41 189 45838 60 \N 3
+2303 41 189 44206 60 \N 3
+2304 41 189 45818 60 \N 3
+2305 41 189 45788 60 \N 3
+2306 41 189 45759 60 \N 3
+2307 41 188 45801 60 \N 10
+2308 41 188 45866 60 \N 10
+2309 41 188 45771 60 \N 10
+2310 41 188 45838 60 \N 10
+2311 41 188 45788 60 \N 10
+2312 41 188 45853 60 \N 10
+2313 41 188 44206 1320 \N 10
+2314 41 188 44004 1380 \N 10
+2315 41 188 48822 1440 \N 10
+2316 41 188 45900 1500 \N 10
+2317 41 188 61978 1560 \N 11
+2318 41 188 60175 1620 \N 11
+2319 41 188 65641 1680 \N 11
+2320 41 188 48532 1740 \N 11
+2321 41 188 45751 2700 \N 11
+2322 41 188 48676 2760 \N 11
+2323 41 188 65695 2760 \N 11
+2324 41 188 44250 6480 \N 11
+2325 41 185 45811 60 \N 30
+2326 41 185 45983 60 \N 30
+2327 41 185 45771 60 \N 30
+2328 41 185 45788 60 \N 30
+2329 41 185 45759 60 \N 30
+2330 41 185 44198 1260 \N 30
+2331 41 185 44281 1320 \N 30
+2332 41 185 44310 1320 \N 30
+2333 41 185 45873 1440 \N 30
+2334 41 185 45752 1500 \N 30
+2335 41 185 45818 1560 \N 30
+2336 41 185 63811 4320 \N 33
+2337 41 185 49083 4320 \N 33
+2338 41 185 44615 4440 \N 33
+2339 41 185 35733 4440 \N 33
+2340 41 185 43997 4440 \N 33
+2341 41 186 50267 60 \N 14
+2342 41 186 44198 60 \N 14
+2343 41 186 45948 60 \N 14
+2344 41 186 45771 60 \N 14
+2345 41 186 45811 60 \N 14
+2346 41 186 49481 60 \N 14
+2347 41 186 45945 60 \N 14
+2348 41 186 44219 60 \N 14
+2349 41 186 45788 60 \N 14
+2350 41 186 45759 60 \N 14
+2351 41 186 65640 660 \N 15
+2352 41 186 44198 720 \N 14
+2353 41 186 63759 780 \N 14
+2354 41 186 45927 780 \N 14
+2355 41 186 63745 900 \N 14
+2356 41 186 61993 960 \N 14
+2357 41 186 49481 1020 \N 16
+2358 41 187 45866 60 \N 40
+2359 41 187 45801 120 \N 40
+2360 41 187 45763 180 \N 40
+2361 41 187 45759 240 \N 40
+2362 41 187 45788 300 \N 40
+2363 41 187 45853 360 \N 40
+2364 41 187 44004 420 \N 40
+2365 41 187 35846 1380 \N 43
+2366 41 187 -100 1440 \N 43
+2367 41 187 45751 1500 \N 41
+2368 41 187 61832 1560 \N 41
+2369 41 187 45870 1620 \N 41
+2370 41 187 44206 2580 \N 41
+2371 41 187 45866 2640 \N 41
+2372 41 187 46011 2700 \N 41
+2373 41 187 45797 2760 \N 41
+2374 41 187 44240 2820 \N 41
+2375 41 184 45763 60 \N 5000
+2376 41 184 44198 60 \N 5000
+2377 41 184 62151 60 \N 5000
+2378 41 184 45801 60 \N 5000
+2379 41 184 45751 60 \N 5000
+2380 41 184 45752 60 \N 5000
+2381 41 184 45788 60 \N 5000
+2382 41 184 44281 480 \N 5002
+2383 41 184 36210 1440 \N 5002
+2384 41 184 48980 1500 \N 5003
+2385 41 184 63725 1560 \N 5003
+2386 41 184 43997 1620 \N 5003
+2387 0 190 41839 0 \N 3
+2388 0 192 41759 0 \N 5000
+2389 0 193 42197 0 \N 30
+2390 0 194 41788 0 \N 14
+2391 0 195 41870 0 \N 40
+2392 0 196 41796 0 \N 10
+2393 0 197 41839 0 \N 3
+2394 0 199 41788 0 \N 14
+2396 42 198 45793 60 \N 21
+2397 42 198 46298 60 \N 21
+2398 42 198 44198 60 \N 21
+2399 42 198 61840 60 \N 21
+2395 42 198 45760 60 1320 21
+2400 42 197 45866 60 \N 3
+2401 42 197 45771 60 \N 3
+2402 42 197 45788 60 \N 3
+2403 42 197 45870 60 \N 3
+2404 42 195 49251 60 \N 40
+2405 42 195 -100 60 \N 40
+2406 42 195 45770 60 \N 40
+2407 42 195 45771 60 \N 40
+2408 42 195 45806 60 \N 40
+2409 42 195 45838 60 \N 40
+2410 42 195 45942 60 \N 40
+2411 42 195 45788 60 \N 40
+2412 42 195 45866 60 \N 40
+2413 42 195 45818 600 \N 41
+2414 42 195 61837 600 \N 41
+2415 42 196 48871 60 \N 10
+2416 42 196 45866 60 \N 10
+2417 42 196 45771 60 \N 10
+2418 42 196 45838 60 \N 10
+2419 42 196 50200 60 \N 10
+2420 42 196 45788 60 \N 10
+2421 42 196 48522 960 \N 10
+2422 42 196 45864 1020 \N 10
+2423 42 196 45770 4680 \N 11
+2424 42 196 45759 4680 \N 11
+2425 42 196 44250 5700 \N 11
+2426 42 193 48577 60 \N 30
+2427 42 193 44198 60 \N 30
+2428 42 193 45788 60 \N 30
+2429 42 193 45771 60 \N 30
+2430 42 193 48880 60 \N 30
+2431 42 193 62103 60 \N 30
+2432 42 193 45759 60 \N 30
+2433 42 193 49020 60 \N 30
+2434 42 193 44319 60 \N 30
+2435 42 193 45752 600 \N 30
+2436 42 193 44281 600 \N 30
+2437 42 193 45770 600 \N 30
+2438 42 193 48954 600 \N 30
+2439 42 193 45918 600 \N 30
+2440 42 193 48880 960 \N 30
+2441 42 193 44017 960 \N 30
+2442 42 193 49109 960 \N 30
+2443 42 193 46006 960 \N 30
+2444 42 193 49083 960 \N 30
+2445 42 193 43997 960 \N 30
+2446 42 193 35733 960 \N 30
+2447 42 199 44198 60 \N 14
+2448 42 199 45770 60 \N 14
+2449 42 199 45771 60 \N 14
+2450 42 199 45945 60 \N 14
+2451 42 199 45811 60 \N 14
+2452 42 199 45785 60 \N 14
+2453 42 199 44281 60 \N 14
+2454 42 199 45788 60 \N 14
+2455 42 199 45802 60 \N 14
+2456 42 199 45759 60 \N 14
+2457 42 199 49481 960 \N 14
+2458 42 199 45872 1020 \N 15
+2459 42 199 45748 1020 \N 15
+2460 42 199 45877 1020 \N 15
+2461 42 199 45927 1020 \N 15
+2462 42 199 49481 1260 \N 16
+2463 42 199 44219 1260 \N 16
+2464 42 199 43996 1260 \N 16
+2465 42 199 35733 1260 \N 16
+2466 42 199 63720 1500 \N 2
+2467 42 199 48829 1500 \N 2
+2468 42 199 62103 1500 \N 2
+2469 42 192 45955 60 \N 5000
+2470 42 192 44198 60 \N 5000
+2471 42 192 62023 60 \N 5000
+2472 42 192 45801 60 \N 5000
+2473 42 192 45771 60 \N 5000
+2474 42 192 45751 60 \N 5000
+2475 42 192 45752 60 \N 5000
+2476 42 192 45788 60 \N 5000
+2477 42 192 44252 540 \N 5002
+2478 42 192 43997 540 \N 5002
+2479 42 192 45782 960 \N 5003
+2480 42 192 48960 1020 \N 5003
+2481 0 201 41839 0 \N 3
+2482 0 203 41759 0 \N 5000
+2483 0 204 42197 0 \N 30
+2484 0 205 41788 0 \N 14
+2485 0 206 41870 0 \N 40
+2486 0 207 41796 0 \N 10
+2487 0 208 41839 0 \N 3
+2488 0 210 41759 0 \N 5000
+2489 0 211 42197 0 \N 30
+2490 0 212 41788 0 \N 14
+2491 0 213 41870 0 \N 40
+2492 0 214 41796 0 \N 10
+2493 43 202 45788 60 \N 21
+2494 43 201 45866 60 \N 3
+2495 43 201 45771 60 \N 3
+2496 43 201 45788 60 \N 3
+2497 43 205 46160 60 \N 14
+2498 43 205 44198 120 \N 14
+2499 43 205 45770 120 \N 14
+2500 43 205 45771 120 \N 14
+2501 43 205 45811 120 \N 14
+2502 43 205 45945 120 \N 14
+2503 43 205 45788 120 \N 14
+2504 43 205 45866 120 \N 14
+2505 43 205 45759 120 \N 14
+2506 43 205 48954 600 \N 14
+2507 43 205 44198 660 \N 14
+2508 43 205 48724 1020 \N 14
+2509 43 205 44219 1080 \N 14
+2510 43 205 44216 1140 \N 14
+2511 43 205 49481 1200 \N 14
+2512 43 205 46449 1260 \N 15
+2513 43 205 50618 1320 \N 15
+2514 43 205 45927 1320 \N 15
+2515 43 205 44001 1440 \N 14
+2516 43 205 45872 1500 \N 16
+2517 43 205 65702 1500 \N 16
+2518 43 205 49481 1620 \N 16
+2519 43 205 46136 1680 \N 2
+2520 43 206 45866 60 \N 40
+2521 43 206 45771 60 \N 40
+2522 43 206 45870 60 \N 40
+2523 43 206 46160 60 \N 40
+2524 43 206 45818 60 \N 40
+2525 43 206 45788 60 \N 40
+2526 43 206 45853 60 \N 40
+2527 43 206 35846 480 \N 40
+2529 43 206 44004 600 \N 43
+2530 43 206 35968 660 \N 43
+2531 43 206 44251 660 780 43
+2528 43 206 44198 540 780 43
+2532 43 206 49251 960 \N 43
+2533 43 206 45963 1020 \N 43
+2534 43 206 -100 1020 \N 43
+2535 43 204 48577 60 \N 30
+2536 43 204 63811 60 \N 30
+2537 43 204 44198 60 \N 30
+2538 43 204 49020 60 \N 30
+2539 43 204 45771 60 \N 30
+2540 43 204 45901 60 \N 30
+2541 43 204 48880 60 \N 30
+2542 43 204 62167 60 \N 30
+2543 43 204 45752 60 \N 30
+2544 43 204 49083 60 \N 30
+2545 43 204 45788 60 \N 30
+2546 43 204 43997 960 \N 30
+2547 43 204 35733 960 \N 30
+2548 43 204 44281 1080 \N 31
+2549 43 203 44198 60 \N 5000
+2550 43 203 45801 60 \N 5000
+2551 43 203 45771 60 \N 5000
+2552 43 203 45901 60 \N 5000
+2553 43 203 45966 60 \N 5000
+2554 43 203 36210 60 \N 5000
+2555 43 203 45782 60 \N 5000
+2556 43 203 45751 60 \N 5000
+2557 43 203 45752 60 \N 5000
+2558 43 207 45864 60 \N 10
+2559 43 207 45900 60 \N 10
+2560 43 207 45801 180 \N 11
+2561 43 207 45866 180 \N 11
+2562 43 207 45771 180 \N 11
+2563 43 207 45870 180 \N 11
+2564 43 207 45806 180 \N 11
+2565 43 207 45788 180 \N 11
+2566 43 207 45853 180 \N 11
+2567 43 207 44349 600 \N 11
+2568 43 207 49073 1080 \N 11
+2569 43 207 61832 1140 \N 11
+2570 43 207 44011 1200 \N 11
+2571 43 207 44388 1200 \N 11
+2572 43 207 44004 1320 \N 11
+2573 43 207 44359 4980 \N 11
+2574 43 207 46008 5040 \N 8
+2575 44 209 45866 60 \N 21
+2576 44 210 45955 60 \N 5000
+2577 44 210 44198 60 \N 5000
+2578 44 210 62023 60 \N 5000
+2579 44 210 45801 60 \N 5000
+2580 44 210 45771 60 \N 5000
+2581 44 210 45901 60 \N 5000
+2582 44 210 36210 60 \N 5000
+2583 44 210 45782 60 \N 5000
+2584 44 210 45751 60 \N 5000
+2585 44 210 45752 60 \N 5000
+2586 44 210 45788 60 \N 5000
+2587 44 210 49054 60 \N 5000
+2588 44 210 45792 960 \N 5003
+2589 44 210 48960 960 \N 5003
+2590 44 210 45866 960 \N 5003
+2591 44 210 44395 960 \N 5003
+2592 44 210 63725 960 \N 5003
+2593 44 211 48577 60 \N 30
+2594 44 211 49083 60 \N 30
+2595 44 211 44198 60 \N 30
+2596 44 211 49020 60 \N 30
+2597 44 211 45866 60 \N 30
+2598 44 211 45771 60 \N 30
+2599 44 211 45901 60 \N 30
+2600 44 211 48880 60 \N 30
+2601 44 211 45873 60 \N 30
+2602 44 211 45801 60 \N 30
+2603 44 211 45752 60 \N 30
+2604 44 211 45759 60 \N 30
+2605 44 211 45788 60 \N 30
+2606 44 211 45770 60 \N 30
+2607 44 211 45983 60 \N 30
+2608 44 211 44595 960 \N 30
+2609 44 211 44439 960 \N 30
+2610 44 211 43997 960 \N 30
+2611 44 211 35733 960 \N 30
+2612 44 211 44017 4800 \N 31
+2613 44 211 45792 4860 \N 31
+2614 44 214 45921 60 \N 10
+2615 44 214 45955 60 \N 10
+2616 44 214 45801 60 \N 10
+2617 44 214 45866 60 \N 10
+2618 44 214 45771 60 \N 10
+2619 44 214 45900 60 \N 10
+2620 44 214 45870 60 \N 10
+2621 44 214 44349 60 \N 10
+2622 44 214 63923 60 \N 10
+2623 44 214 45788 60 \N 10
+2624 44 214 45853 60 \N 10
+2625 44 214 49054 60 \N 10
+2626 44 214 48676 960 \N 11
+2627 44 214 44250 4620 \N 11
+2628 44 214 45770 4680 \N 8
+2629 44 214 50267 4680 \N 8
+2630 44 214 49268 4680 \N 8
+2631 44 214 45759 4680 \N 8
+2632 44 214 49228 4920 \N 8
+2633 44 212 45927 60 \N 14
+2634 44 212 65640 60 \N 14
+2635 44 212 43996 60 \N 14
+2636 44 212 45770 60 \N 14
+2637 44 212 45771 60 \N 14
+2638 44 212 63725 60 \N 14
+2639 44 212 45969 60 \N 14
+2640 44 212 49481 60 \N 14
+2641 44 212 46136 60 \N 14
+2642 44 212 45945 60 \N 14
+2643 44 212 44219 60 \N 14
+2644 44 212 45788 60 \N 14
+2645 44 212 45759 60 \N 14
+2646 44 212 44198 840 \N 15
+2647 44 212 65640 960 \N 15
+2648 44 212 61323 960 \N 15
+2649 44 212 45927 960 \N 15
+2650 44 212 46028 1140 \N 14
+2651 44 212 44001 1200 \N 14
+2652 44 212 49481 1320 \N 16
+2653 44 212 45770 1380 \N 2
+2654 44 212 45788 1380 \N 2
+2655 44 212 45759 1380 \N 2
+2656 44 213 63714 60 \N 40
+2657 44 213 49251 60 \N 40
+2658 44 213 44359 60 \N 40
+2659 44 213 -100 60 \N 40
+2660 44 213 45866 60 \N 40
+2661 44 213 45771 60 \N 40
+2662 44 213 63725 60 \N 40
+2663 44 213 45838 60 \N 40
+2664 44 213 50200 60 \N 40
+2665 44 213 45788 60 \N 40
+2666 44 213 45770 60 \N 40
+2667 44 213 45759 60 \N 40
+2668 44 213 61832 960 \N 41
+2669 44 213 62105 960 \N 41
+2670 44 213 44004 960 \N 41
+2671 44 213 45853 960 \N 41
+2672 44 213 45870 960 \N 41
+2673 44 213 65656 1260 \N 41
+2674 44 213 65692 1260 \N 41
+2675 44 213 45866 3180 \N 41
+2676 0 215 41839 0 \N 3
+2677 0 217 41759 0 \N 5000
+2678 0 218 42197 0 \N 30
+2679 0 219 41788 0 \N 14
+2680 0 220 41870 0 \N 40
+2681 0 221 41796 0 \N 10
+2682 0 222 41839 0 \N 3
+2683 0 224 41759 0 \N 5000
+2684 0 225 42197 0 \N 30
+2685 0 226 41788 0 \N 14
+2686 0 227 41759 0 \N 5000
+2687 0 228 42197 0 \N 30
+2688 0 229 42197 0 \N 30
+2689 0 230 41788 0 \N 14
+2690 0 231 41870 0 \N 40
+2691 0 232 41796 0 \N 10
+2692 0 233 41796 0 \N 10
+2693 46 223 45793 60 \N 21
+2695 46 223 44198 60 \N 21
+2696 46 223 63752 60 \N 21
+2697 46 223 35850 60 \N 21
+2698 46 223 45771 60 \N 21
+2699 46 223 45873 60 \N 21
+2694 46 223 45763 60 960 21
+2700 46 222 45866 60 \N 3
+2701 46 222 45771 60 \N 3
+2702 46 222 44206 60 \N 3
+2703 46 222 45870 60 \N 3
+2704 46 222 45818 60 \N 3
+2705 46 222 45788 60 \N 3
+2706 46 222 45811 420 \N 3
+2707 46 233 45801 60 \N 10
+2708 46 233 45866 60 \N 10
+2709 46 233 45771 60 \N 10
+2710 46 233 45838 60 \N 10
+2711 46 233 45788 60 \N 10
+2712 46 233 45853 60 \N 10
+2713 46 233 45759 60 \N 10
+2714 46 233 45762 960 \N 10
+2715 46 233 61832 4620 \N 10
+2716 46 233 44359 4620 \N 10
+2717 46 233 49207 4620 \N 10
+2718 46 233 45900 4800 \N 12
+2719 46 233 48822 4800 \N 12
+2720 46 233 45770 6720 \N 8
+2721 46 230 45793 60 \N 14
+2722 46 230 44198 60 \N 14
+2723 46 230 45770 60 \N 14
+2724 46 230 45771 60 \N 14
+2725 46 230 45811 60 \N 14
+2726 46 230 45945 60 \N 14
+2727 46 230 44219 60 \N 14
+2728 46 230 45788 60 \N 14
+2729 46 230 45866 60 \N 14
+2730 46 230 45759 60 \N 14
+2731 46 230 43996 960 \N 14
+2732 46 230 49481 1020 \N 14
+2733 46 230 45969 1020 \N 14
+2734 46 230 44198 1140 \N 15
+2735 46 230 61323 1200 \N 15
+2736 46 230 45793 1260 \N 15
+2737 46 230 50618 2220 \N 15
+2738 46 230 45872 2280 \N 14
+2739 46 230 61993 2280 \N 14
+2740 46 230 49481 2400 \N 16
+2741 46 230 45793 2460 \N 2
+2742 46 230 45759 2460 \N 2
+2743 46 230 65640 3480 \N 2
+2744 46 230 45927 3480 \N 2
+2745 46 230 45887 3600 \N 2
+2746 46 231 45866 60 \N 40
+2747 46 231 49251 360 \N 40
+2748 46 231 45818 420 \N 43
+2749 46 231 45793 480 \N 43
+2750 46 231 45771 480 \N 43
+2751 46 231 35968 600 \N 43
+2752 46 231 35968 660 \N 43
+2753 46 231 -100 720 \N 43
+2754 46 231 45806 1380 \N 41
+2755 46 231 61832 2340 \N 41
+2756 46 231 45866 4200 \N 41
+2757 46 227 45760 60 \N 5000
+2758 46 227 45890 60 \N 5000
+2759 46 227 44198 60 \N 5000
+2760 46 227 45771 60 \N 5000
+2761 46 227 45901 60 \N 5000
+2762 46 227 45782 60 \N 5000
+2763 46 227 45751 60 \N 5000
+2764 46 227 45752 60 \N 5000
+2765 46 227 45788 60 \N 5000
+2766 46 227 45801 600 \N 5002
+2767 46 227 63735 660 \N 5002
+2768 46 227 44281 720 \N 5002
+2769 46 227 36210 960 \N 5002
+2770 46 227 63735 1560 \N 5003
+2771 46 227 48960 2520 \N 5003
+2772 46 227 48686 2520 \N 5003
+2773 46 229 45793 60 \N 30
+2774 46 229 45771 60 \N 30
+2775 46 229 45983 1080 \N 30
+2776 46 229 63811 4740 \N 33
+2777 46 229 44198 4740 \N 33
+2778 46 229 62167 4740 \N 33
+2779 46 229 48880 4920 \N 33
+2780 46 229 48577 4920 \N 33
+2781 46 229 49083 4920 \N 33
+2782 46 229 49020 4920 \N 33
+2783 46 229 45918 4920 \N 33
+2784 46 229 36210 6120 \N 33
+2785 46 229 43997 6120 \N 33
+2786 46 229 48980 6240 \N 31
+2787 46 229 49207 6300 \N 31
+2788 46 229 45752 6360 \N 31
+2789 46 229 45901 6360 \N 31
+2790 46 229 45873 6480 \N 31
+2791 46 229 63767 6540 \N 31
+2792 46 229 44281 7500 \N 31
+2793 0 234 41839 0 \N 3
+2794 0 236 41759 0 \N 5000
+2795 0 237 42197 0 \N 30
+2796 0 238 41788 0 \N 14
+2797 0 239 41870 0 \N 40
+2798 0 240 41796 0 \N 10
+2799 0 241 41870 0 \N 40
+2800 0 241 -100 60 \N 40
+2801 0 242 41870 0 \N 40
+2802 0 242 45793 60 \N 40
+2803 0 242 45763 60 \N 40
+2804 0 242 44198 60 \N 40
+2805 0 242 45770 60 \N 40
+2806 0 242 45771 60 \N 40
+2807 0 242 45806 60 \N 40
+2808 0 242 45838 60 \N 40
+2809 0 242 45788 60 \N 40
+2810 0 242 45866 60 \N 40
+2811 0 242 45759 60 \N 40
+2812 0 242 63714 660 \N 40
+2813 0 242 49251 660 \N 40
+2814 0 242 35846 660 \N 40
+2815 0 242 45963 660 \N 40
+2816 0 242 44204 660 \N 40
+2817 0 242 60178 660 \N 40
+2818 0 242 49301 660 \N 40
+2819 0 242 46230 660 \N 40
+2820 0 242 44312 660 \N 40
+2821 0 242 -100 660 \N 40
+2822 0 243 41870 0 \N 40
+2823 0 243 45793 60 \N 40
+2824 0 243 45763 60 \N 40
+2825 0 243 45866 60 \N 40
+2826 0 243 45771 60 \N 40
+2827 0 243 45806 60 \N 40
+2828 0 243 45788 60 \N 40
+2829 0 243 45770 60 \N 40
+2830 0 243 45759 60 \N 40
+2831 0 243 45776 540 \N 40
+2832 0 243 45787 540 \N 40
+2833 0 243 50098 960 \N 40
+2834 0 243 49965 960 \N 40
+2835 0 243 45983 960 \N 40
+2836 0 243 49251 5640 \N 40
+2837 0 243 45945 5700 \N 43
+2838 0 243 45778 5700 \N 43
+2839 0 243 45870 5700 \N 43
+2840 0 243 45887 5700 \N 43
+2841 0 243 -100 6840 \N 43
+2842 0 243 49251 6900 \N 41
+2843 0 243 45945 4260 \N 40
+2844 0 243 45778 4260 \N 40
+2845 0 243 45870 4260 \N 40
+2846 0 243 45887 4260 \N 40
+2847 0 243 -100 6300 \N 43
+2848 47 235 45966 60 \N 21
+2849 47 235 45771 1020 \N 21
+2850 47 234 44256 60 \N 3
+2851 47 234 45870 60 \N 3
+2852 47 234 45866 60 \N 3
+2853 47 234 45771 60 \N 3
+2854 47 234 44206 60 \N 3
+2855 47 234 48532 60 \N 3
+2856 47 234 45838 60 \N 3
+2857 47 234 45788 60 \N 3
+2858 47 239 35846 60 \N 40
+2859 47 239 45866 60 \N 40
+2860 47 239 45771 60 \N 40
+2861 47 239 45838 60 \N 40
+2862 47 239 45806 60 \N 40
+2863 47 239 45788 60 \N 40
+2864 47 239 49251 1320 \N 43
+2865 47 239 44393 1320 \N 43
+2866 47 239 45818 1320 \N 43
+2867 47 239 45963 1320 \N 43
+2868 47 239 35968 2460 \N 43
+2869 47 239 45792 2460 \N 43
+2870 47 239 45811 2460 \N 43
+2871 47 239 44251 2640 \N 43
+2872 47 239 48732 3600 \N 43
+2873 47 239 44352 4560 \N 43
+2874 47 239 -100 6420 \N 43
+2875 47 237 45866 60 \N 30
+2876 47 237 45771 60 \N 30
+2877 47 237 45788 60 \N 30
+2878 47 237 44198 60 \N 30
+2879 47 237 44319 60 \N 30
+2880 47 237 48577 1260 \N 30
+2881 47 237 63811 1260 \N 30
+2882 47 237 61852 1260 \N 30
+2883 47 237 48586 1260 \N 30
+2884 47 237 63767 1260 \N 30
+2885 47 237 48880 1260 \N 30
+2886 47 237 46103 1260 \N 30
+2887 47 237 49083 1260 \N 30
+2888 47 237 49020 1260 \N 30
+2889 47 237 46131 2700 \N 30
+2890 47 237 45811 2700 \N 30
+2891 47 237 44595 2820 \N 30
+2892 47 237 35733 2820 \N 30
+2893 47 237 45792 2940 \N 31
+2894 47 237 61864 2940 \N 31
+2895 47 238 50267 60 \N 14
+2896 47 238 44198 60 \N 14
+2897 47 238 45948 60 \N 14
+2898 47 238 45770 60 \N 14
+2899 47 238 45771 60 \N 14
+2900 47 238 45969 60 \N 14
+2901 47 238 45811 60 \N 14
+2902 47 238 49481 60 \N 14
+2903 47 238 45945 60 \N 14
+2904 47 238 44219 60 \N 14
+2905 47 238 45788 60 \N 14
+2906 47 238 45866 60 \N 14
+2907 47 238 45759 60 \N 14
+2908 47 238 43996 840 \N 15
+2909 47 238 63759 840 \N 15
+2910 47 238 45872 960 \N 15
+2911 47 238 61993 960 \N 15
+2912 47 238 44001 1080 \N 16
+2913 47 238 49481 1080 \N 16
+2914 47 236 45801 60 \N 5000
+2915 47 236 45771 60 \N 5000
+2916 47 236 45751 60 \N 5000
+2917 47 236 45966 60 \N 5000
+2918 47 236 45903 60 \N 5000
+2919 47 236 45752 1260 \N 5000
+2920 47 236 45866 1260 \N 5000
+2921 47 236 45995 1260 \N 5000
+2922 47 236 45901 1260 \N 5000
+2923 47 236 36210 2400 \N 5000
+2924 47 236 43997 2400 \N 5000
+2925 47 236 44198 2520 \N 5001
+2926 47 240 45955 60 \N 10
+2927 47 240 45830 60 \N 10
+2928 47 240 45801 60 \N 10
+2929 47 240 45771 60 \N 10
+2930 47 240 45900 60 \N 10
+2931 47 240 45788 60 \N 10
+2932 47 240 35849 1320 \N 11
+2933 47 240 44011 1320 \N 11
+2934 47 240 44349 1320 \N 11
+2935 47 240 45866 2400 \N 11
+2936 47 240 44004 5160 \N 11
+2937 47 240 35733 6120 \N 11
+2938 47 240 44349 6180 \N 11
+2939 47 240 45919 7140 \N 11
+2940 47 240 46030 8100 \N 11
+2941 0 244 41839 0 \N 3
+2942 0 246 41759 0 \N 5000
+2943 0 247 42197 0 \N 30
+2944 0 248 41788 0 \N 14
+2945 0 249 41870 0 \N 40
+2946 0 250 41796 0 \N 10
+2947 48 245 49403 60 \N 21
+2948 48 245 45788 60 \N 21
+2949 48 244 45866 60 \N 3
+2950 48 244 45771 60 \N 3
+2951 48 244 45838 60 \N 3
+2952 48 244 45870 60 \N 3
+2953 48 244 45818 60 \N 3
+2954 48 244 45788 60 \N 3
+2955 48 247 45771 60 \N 30
+2956 48 247 45788 60 \N 30
+2957 48 247 63725 60 \N 30
+2958 48 247 45983 60 \N 30
+2959 48 247 48880 1200 \N 30
+2960 48 247 48577 1200 \N 30
+2961 48 247 49083 1200 \N 30
+2962 48 247 49020 1200 \N 30
+2963 48 247 44198 1200 \N 30
+2964 48 247 61852 1500 \N 30
+2965 48 247 63767 1500 \N 30
+2966 48 247 44017 2520 \N 30
+2967 48 247 43997 2520 \N 30
+2968 48 247 35733 2520 \N 30
+2969 48 247 45752 2700 \N 31
+2970 48 247 45901 2700 \N 31
+2971 48 247 62151 3720 \N 31
+2972 48 250 45760 60 \N 10
+2973 48 250 45830 60 \N 10
+2974 48 250 45864 60 \N 10
+2975 48 250 45801 60 \N 10
+2976 48 250 45866 60 \N 10
+2977 48 250 45771 60 \N 10
+2978 48 250 45900 60 \N 10
+2979 48 250 45838 60 \N 10
+2980 48 250 44349 60 \N 10
+2981 48 250 50773 60 \N 10
+2982 48 250 48822 60 \N 10
+2983 48 250 45818 60 \N 10
+2984 48 250 45788 60 \N 10
+2985 48 250 45853 60 \N 10
+2986 48 250 44004 960 \N 11
+2987 48 250 61832 960 \N 11
+2988 48 250 44011 960 \N 11
+2989 48 250 44206 960 \N 11
+2990 48 250 60175 960 \N 11
+2991 48 250 44388 960 \N 11
+2992 48 250 45762 3120 \N 11
+2993 48 250 46081 6780 \N 11
+2994 48 250 44359 6780 \N 11
+2995 48 250 45770 6780 \N 11
+2996 48 250 46183 6780 \N 11
+2997 48 250 48628 6780 \N 11
+2998 48 250 45751 6780 \N 11
+2999 48 250 45977 6780 \N 11
+3000 48 250 46090 6780 \N 11
+3001 48 250 45759 6780 \N 11
+3002 48 246 45801 60 \N 5000
+3003 48 246 45866 60 \N 5000
+3004 48 246 45771 60 \N 5000
+3005 48 246 63725 60 \N 5000
+3006 48 246 45901 60 \N 5000
+3007 48 246 45873 60 \N 5000
+3008 48 246 45752 60 \N 5000
+3009 48 246 44281 60 \N 5000
+3010 48 246 45788 60 \N 5000
+3011 48 246 36210 1500 \N 5000
+3012 48 246 43997 1500 \N 5000
+3013 48 246 44198 1620 \N 5001
+3014 48 248 44198 60 \N 14
+3015 48 248 45801 60 \N 14
+3016 48 248 45770 60 \N 14
+3017 48 248 45771 60 \N 14
+3018 48 248 45788 60 \N 14
+3019 48 248 45866 60 \N 14
+3020 48 248 45759 60 \N 14
+3021 48 248 45927 1380 \N 14
+3022 48 248 45869 1380 \N 14
+3023 48 248 45748 1380 \N 14
+3024 48 248 35733 1380 \N 14
+3025 48 248 44219 1380 \N 14
+3026 48 248 43996 1380 \N 14
+3027 48 248 44001 1740 \N 14
+3028 48 248 45969 1800 \N 16
+3029 48 249 46081 60 \N 40
+3030 48 249 45763 60 \N 40
+3031 48 249 44359 60 \N 40
+3032 48 249 45864 60 \N 40
+3033 48 249 -100 60 \N 40
+3034 48 249 45866 60 \N 40
+3035 48 249 45771 60 \N 40
+3036 48 249 45900 60 \N 40
+3037 48 249 45806 60 \N 40
+3038 48 249 46090 60 \N 40
+3039 48 249 48628 60 \N 40
+3040 48 249 45838 60 \N 40
+3041 48 249 45977 60 \N 40
+3042 48 249 46183 60 \N 40
+3043 48 249 45788 60 \N 40
+3044 48 249 45770 60 \N 40
+3045 48 249 45759 60 \N 40
+3046 48 249 44004 1080 \N 41
+3047 0 251 41839 0 \N 3
+3048 0 253 41759 0 \N 5000
+3049 0 254 42197 0 \N 30
+3050 0 255 41788 0 \N 14
+3051 0 256 41759 0 \N 5000
+3052 0 257 41759 0 \N 5000
+3053 0 258 42197 0 \N 30
+3054 0 259 41788 0 \N 14
+3055 0 260 41870 0 \N 40
+3056 0 261 41796 0 \N 10
+3057 0 262 41870 0 \N 40
+3058 0 263 41870 0 \N 40
+3059 49 252 45793 60 \N 21
+3060 49 251 44256 60 \N 3
+3061 49 251 45763 60 \N 3
+3062 49 251 45892 60 \N 3
+3063 49 251 45866 60 \N 3
+3064 49 251 45771 60 \N 3
+3065 49 251 61837 60 \N 3
+3066 49 251 45870 60 \N 3
+3067 49 251 44206 60 \N 3
+3068 49 251 45838 60 \N 3
+3069 49 251 45818 60 \N 3
+3070 49 251 45788 60 \N 3
+3071 49 255 45793 60 \N 14
+3072 49 255 44198 60 \N 14
+3073 49 255 45771 60 \N 14
+3074 49 255 45811 60 \N 14
+3075 49 255 45945 60 \N 14
+3076 49 255 44219 60 \N 14
+3077 49 255 45788 60 \N 14
+3078 49 255 45759 60 \N 14
+3079 49 255 45910 540 \N 14
+3080 49 255 65640 960 \N 14
+3081 49 255 45818 960 \N 14
+3082 49 255 50618 960 \N 14
+3083 49 255 45927 960 \N 14
+3084 49 255 49481 1200 \N 14
+3085 49 255 65702 1200 \N 14
+3086 49 255 45872 1320 \N 16
+3087 49 255 61993 1320 \N 16
+3088 49 255 49481 1440 \N 16
+3089 49 255 43996 1500 \N 2
+3090 49 258 45793 60 \N 30
+3091 49 258 50241 120 \N 30
+3092 49 258 45763 120 \N 30
+3093 49 258 48871 240 \N 30
+3094 49 258 44198 1200 \N 30
+3095 49 258 44281 2160 \N 30
+3096 49 258 45752 4020 \N 33
+3097 49 258 63811 4020 \N 33
+3098 49 258 62103 4020 \N 33
+3099 49 258 48577 4260 \N 33
+3100 49 258 61826 4260 \N 33
+3101 49 258 50510 4260 \N 33
+3102 49 258 48880 4260 \N 33
+3103 49 258 63767 4260 \N 33
+3104 49 258 49594 4260 \N 33
+3105 49 258 49083 4260 \N 33
+3106 49 258 49020 4260 \N 33
+3107 49 258 50654 4260 \N 33
+3108 49 258 48980 5160 \N 33
+3109 49 258 35733 5160 \N 33
+3110 49 258 44017 5280 \N 31
+3111 49 257 48960 60 \N 5000
+3112 49 257 45955 60 \N 5000
+3113 49 257 44198 60 \N 5000
+3114 49 257 62023 60 \N 5000
+3115 49 257 45801 60 \N 5000
+3116 49 257 45771 60 \N 5000
+3117 49 257 36210 60 \N 5000
+3118 49 257 45782 60 \N 5000
+3119 49 257 45752 60 \N 5000
+3120 49 257 45788 60 \N 5000
+3121 49 257 43997 60 \N 5000
+3122 49 261 45864 60 \N 10
+3123 49 261 45900 60 \N 10
+3124 49 261 45793 180 \N 11
+3125 49 261 45763 180 \N 11
+3126 49 261 45801 180 \N 11
+3127 49 261 45853 180 \N 11
+3128 49 261 44349 180 \N 11
+3129 49 261 45866 1380 \N 11
+3130 49 261 44004 1380 \N 11
+3131 49 261 45870 1380 \N 11
+3132 49 261 44011 2460 \N 11
+3133 49 261 35849 2520 \N 11
+3134 49 261 48522 2580 \N 11
+3135 49 261 44206 2640 \N 11
+3136 49 261 44250 6300 \N 11
+3137 49 263 45793 60 \N 40
+3138 49 263 45763 60 \N 40
+3139 49 263 45866 60 \N 40
+3140 49 263 45838 60 \N 40
+3141 49 263 45818 60 \N 40
+3142 49 263 45788 60 \N 40
+3143 49 263 44206 420 \N 40
+3144 49 263 35846 480 \N 40
+3145 49 263 35968 540 \N 43
+3146 49 263 45963 540 \N 43
+3147 49 263 49251 660 \N 43
+3148 49 263 -100 660 \N 43
+3149 49 263 45853 660 \N 43
+3150 0 264 41870 0 \N 40
+3151 0 264 45793 60 \N 40
+3152 0 264 45763 60 \N 40
+3153 0 264 45771 60 \N 40
+3154 0 264 45838 60 \N 40
+3155 0 264 45788 60 \N 40
+3156 0 264 45759 60 \N 40
+3157 0 264 45793 420 \N 40
+3158 0 264 -100 1380 \N 40
+3159 0 265 41839 0 \N 3
+3160 0 267 41759 0 \N 5000
+3161 0 268 42197 0 \N 30
+3162 0 269 41788 0 \N 14
+3163 0 270 41870 0 \N 40
+3164 0 271 41796 0 \N 10
+3165 50 266 48737 60 \N 21
+3166 50 266 62151 60 \N 21
+3167 50 266 45866 60 \N 21
+3168 50 266 45771 60 \N 21
+3169 50 266 45788 60 \N 21
+3170 50 266 45918 60 \N 21
+3171 50 265 45866 60 \N 3
+3172 50 265 45818 60 \N 3
+3173 50 265 45870 60 \N 3
+3174 50 265 45759 60 \N 3
+3175 50 270 45866 60 \N 40
+3176 50 270 45763 60 \N 40
+3177 50 270 45788 60 \N 40
+3178 50 270 45806 60 \N 40
+3179 50 270 45771 60 \N 40
+3180 50 270 48871 360 \N 40
+3181 50 270 -100 1320 \N 40
+3182 50 270 49251 1380 \N 41
+3183 50 270 65641 1440 \N 41
+3184 50 270 45770 1500 \N 41
+3185 50 270 45778 1560 \N 41
+3186 50 269 44198 60 \N 14
+3187 50 269 45770 60 \N 14
+3188 50 269 45771 60 \N 14
+3189 50 269 45811 60 \N 14
+3190 50 269 45945 60 \N 14
+3191 50 269 44219 60 \N 14
+3192 50 269 45788 60 \N 14
+3193 50 269 45759 60 \N 14
+3194 50 269 46072 540 \N 14
+3195 50 269 43996 540 \N 14
+3196 50 269 44294 540 \N 14
+3197 50 269 49481 720 \N 14
+3198 50 269 45969 720 \N 14
+3199 50 269 61976 960 \N 15
+3200 50 269 45875 960 \N 15
+3201 50 269 45872 960 \N 15
+3202 50 269 61975 960 \N 15
+3203 50 269 45927 960 \N 15
+3204 50 269 61993 1260 \N 16
+3205 50 269 49481 1320 \N 16
+3206 50 269 65641 1380 \N 2
+3207 50 267 45894 60 \N 5000
+3208 50 267 44198 60 \N 5000
+3209 50 267 45802 60 \N 5000
+3210 50 267 45771 60 \N 5000
+3211 50 267 63725 60 \N 5000
+3213 50 267 45782 60 \N 5000
+3214 50 267 45752 60 \N 5000
+3215 50 267 44281 60 \N 5000
+3216 50 267 45818 60 \N 5000
+3217 50 267 45788 60 \N 5000
+3218 50 267 45918 60 \N 5000
+3219 50 267 61823 60 \N 5000
+3220 50 267 48960 960 \N 5002
+3221 50 267 65641 1020 \N 5002
+3222 50 267 36210 1020 \N 5002
+3223 50 267 45751 1020 \N 5002
+3212 50 267 35733 60 1020 5000
+3224 50 267 45918 2100 \N 5003
+3225 50 267 44198 2100 \N 5003
+3226 50 267 49207 2220 \N 5003
+3227 50 268 48519 60 \N 30
+3228 50 268 62167 60 \N 30
+3229 50 268 61843 60 \N 30
+3230 50 268 35733 60 \N 30
+3231 50 268 61853 60 \N 30
+3232 50 268 45983 60 \N 30
+3233 50 268 44198 60 \N 30
+3234 50 268 48561 60 \N 30
+3235 50 268 50654 60 \N 30
+3236 50 268 46006 60 \N 30
+3237 50 268 45751 60 \N 30
+3238 50 268 44216 60 \N 30
+3239 50 268 49083 60 \N 30
+3240 50 268 45759 60 \N 30
+3241 50 268 63811 60 \N 30
+3242 50 268 45750 60 \N 30
+3243 50 268 44230 60 \N 30
+3244 50 268 45770 60 \N 30
+3245 50 268 45771 60 \N 30
+3246 50 268 46160 60 \N 30
+3247 50 268 45752 60 \N 30
+3248 50 268 45782 60 \N 30
+3249 50 268 44281 60 \N 30
+3250 50 268 48603 60 \N 30
+3251 50 268 45788 60 \N 30
+3252 50 268 43997 60 \N 30
+3253 50 268 45918 60 \N 30
+3254 50 268 45802 60 \N 30
+3255 50 268 49142 60 \N 30
+3256 50 268 50425 60 \N 30
+3257 50 268 45818 60 \N 30
+3258 50 271 44586 60 \N 10
+3259 50 271 45766 60 \N 10
+3260 50 271 45830 60 \N 10
+3261 50 271 48871 60 \N 10
+3262 50 271 45866 60 \N 10
+3263 50 271 45771 60 \N 10
+3264 50 271 45838 60 \N 10
+3265 50 271 44349 60 \N 10
+3266 50 271 44211 60 \N 10
+3267 50 271 45818 60 \N 10
+3268 50 271 45788 60 \N 10
+3269 50 271 45853 60 \N 10
+3270 50 271 44315 960 \N 10
+3271 50 271 48676 960 \N 10
+3272 50 271 45811 1080 \N 10
+3273 50 271 44198 1080 \N 10
+3274 50 271 45864 1200 \N 10
+3275 50 271 45977 1260 \N 11
+3276 50 271 46090 1260 \N 11
+3277 50 271 46081 1260 \N 11
+3278 50 271 44359 1260 \N 11
+3279 0 272 41870 0 \N 40
+3280 9 272 45793 60 \N 40
+3281 9 272 45866 60 \N 40
+3282 9 272 45853 60 \N 40
+3283 9 272 45838 60 \N 40
+3284 9 272 45801 60 \N 40
+3285 9 272 49251 1260 \N 40
+3286 9 272 35846 1260 \N 40
+3287 9 272 45824 1380 \N 43
+3288 9 272 61832 1380 \N 43
+3289 9 272 63714 1380 \N 43
+3290 9 272 -100 1380 \N 43
+3291 9 272 65695 1380 \N 43
+3292 0 273 41839 0 \N 3
+3293 0 275 41759 0 \N 5000
+3294 0 276 42197 0 \N 30
+3295 0 277 41788 0 \N 14
+3296 0 278 41870 0 \N 40
+3297 0 279 41796 0 \N 10
+3298 51 274 45788 60 \N 21
+3299 51 273 45866 60 \N 3
+3300 51 273 45771 60 \N 3
+3301 51 273 45838 60 \N 3
+3302 51 273 44206 60 \N 3
+3303 51 273 45818 60 \N 3
+3304 51 273 45788 60 \N 3
+3305 51 277 44198 60 \N 14
+3306 51 277 49481 60 \N 14
+3307 51 277 45770 60 \N 14
+3308 51 277 45771 60 \N 14
+3309 51 277 43996 60 \N 14
+3310 51 277 45969 60 \N 14
+3311 51 277 45811 60 \N 14
+3312 51 277 45945 60 \N 14
+3313 51 277 44219 60 \N 14
+3314 51 277 45788 60 \N 14
+3315 51 277 45866 60 \N 14
+3316 51 277 45759 60 \N 14
+3317 51 277 45872 960 \N 15
+3318 51 277 45748 960 \N 15
+3319 51 277 45877 960 \N 15
+3320 51 277 45927 960 \N 15
+3321 51 277 49481 1200 \N 16
+3322 51 277 45793 1260 \N 2
+3323 51 277 44001 1260 \N 2
+3324 51 277 45806 1260 \N 2
+3325 51 277 45778 1260 \N 2
+3326 51 277 45784 1260 \N 2
+3327 51 277 45818 1260 \N 2
+3328 51 279 45793 60 \N 10
+3329 51 279 45763 60 \N 10
+3330 51 279 45801 60 \N 10
+3331 51 279 45866 60 \N 10
+3332 51 279 45870 60 \N 10
+3333 51 279 45853 60 \N 10
+3334 51 279 44586 1320 \N 10
+3335 51 279 44349 1320 \N 10
+3336 51 279 45900 1440 \N 10
+3337 51 279 49207 1500 \N 11
+3338 51 279 65641 1560 \N 11
+3339 51 279 61982 1560 \N 11
+3340 51 279 62042 1680 \N 11
+3341 51 276 45811 60 \N 30
+3342 51 276 45983 60 \N 30
+3343 51 276 45771 60 \N 30
+3344 51 276 45788 60 \N 30
+3345 51 276 45759 60 \N 30
+3346 51 276 63811 360 \N 30
+3347 51 276 49083 360 \N 30
+3348 51 276 49020 360 \N 30
+3349 51 276 48577 1440 \N 30
+3350 51 276 43997 1440 \N 30
+3351 51 276 35733 1440 \N 30
+3352 51 276 63767 1620 \N 31
+3353 51 276 46103 1620 \N 31
+3354 51 276 44198 1620 \N 31
+3355 51 276 44615 1620 \N 31
+3356 51 275 44198 60 \N 5000
+3357 51 275 45801 60 \N 5000
+3358 51 275 45771 60 \N 5000
+3359 51 275 45901 60 \N 5000
+3360 51 275 45873 60 \N 5000
+3361 51 275 36210 60 \N 5000
+3362 51 275 45752 60 \N 5000
+3363 51 275 45788 60 \N 5000
+3364 51 278 49251 60 \N 40
+3365 51 278 44198 60 \N 40
+3366 51 278 45866 60 \N 40
+3367 51 278 45771 60 \N 40
+3368 51 278 45838 60 \N 40
+3369 51 278 45788 60 \N 40
+3370 51 278 45801 420 \N 43
+3371 51 278 45811 1380 \N 43
+3372 51 278 44198 1380 \N 43
+3373 51 278 35968 1500 \N 43
+3374 51 278 44389 1500 \N 43
+3375 51 278 -100 1620 \N 43
+3376 0 280 41839 0 \N 3
+3377 0 282 41759 0 \N 5000
+3378 0 283 42197 0 \N 30
+3379 0 284 41788 0 \N 14
+3380 0 285 41870 0 \N 40
+3381 0 286 41796 0 \N 10
+3382 0 287 41788 0 \N 14
+3383 52 281 45771 60 \N 21
+3384 52 281 45788 60 \N 21
+3385 52 280 45866 60 \N 3
+3386 52 280 45771 60 \N 3
+3387 52 280 44206 60 \N 3
+3388 52 280 45870 60 \N 3
+3389 52 280 45818 60 \N 3
+3390 52 280 45759 60 \N 3
+3391 52 282 44198 60 \N 5000
+3392 52 282 45801 60 \N 5000
+3393 52 282 45771 60 \N 5000
+3394 52 282 45901 60 \N 5000
+3395 52 282 45873 60 \N 5000
+3396 52 282 45751 60 \N 5000
+3397 52 282 45752 60 \N 5000
+3398 52 282 45788 60 \N 5000
+3399 52 282 36210 540 \N 5002
+3400 52 282 62151 960 \N 5003
+3401 52 282 48960 1020 \N 5003
+3402 52 282 48686 1020 \N 5003
+3403 52 285 45866 60 \N 40
+3404 52 285 46674 360 \N 40
+3405 52 285 45771 420 \N 40
+3406 52 285 45788 420 \N 40
+3407 52 285 45806 420 \N 40
+3408 52 285 45870 420 \N 40
+3409 52 285 45811 1320 \N 40
+3410 52 285 45963 1320 \N 40
+3411 52 285 44297 3240 \N 40
+3412 52 285 -100 3240 \N 40
+3413 52 285 44276 3240 \N 40
+3414 52 286 45801 60 \N 10
+3415 52 286 45771 60 \N 10
+3416 52 286 45900 60 \N 10
+3417 52 286 45853 60 \N 10
+3418 52 286 45788 60 \N 10
+3419 52 286 44349 60 \N 10
+3420 52 286 45752 960 \N 11
+3421 52 286 44299 960 \N 11
+3422 52 286 45901 960 \N 11
+3423 52 286 44349 960 \N 11
+3424 52 286 46030 1200 \N 11
+3425 52 286 45866 1320 \N 11
+3426 52 286 45760 1620 \N 11
+3427 52 286 48676 2580 \N 11
+3428 52 286 44359 6240 \N 11
+3429 52 287 44198 60 \N 14
+3430 52 287 43996 60 \N 14
+3431 52 287 45770 60 \N 14
+3432 52 287 45771 60 \N 14
+3433 52 287 61823 60 \N 14
+3434 52 287 45945 60 \N 14
+3435 52 287 44219 60 \N 14
+3436 52 287 45788 60 \N 14
+3437 52 287 45759 60 \N 14
+3438 52 287 49481 960 \N 14
+3439 52 287 61993 960 \N 14
+3440 52 287 45969 960 \N 14
+3441 52 287 49481 1140 \N 16
+3442 52 283 48577 60 \N 30
+3443 52 283 44198 60 \N 30
+3444 52 283 45788 60 \N 30
+3445 52 283 45866 60 \N 30
+3446 52 283 45771 60 \N 30
+3447 52 283 48880 60 \N 30
+3448 52 283 49083 60 \N 30
+3449 52 283 49020 60 \N 30
+3450 52 283 49054 60 \N 30
+3451 52 283 45983 60 \N 30
+3452 52 283 45752 960 \N 30
+3453 52 283 44586 960 \N 30
+3454 52 283 43997 960 \N 30
+3455 52 283 45901 960 \N 30
+3456 52 283 35733 960 \N 30
+3457 0 288 41839 0 \N 3
+3458 0 290 41759 0 \N 5000
+3459 0 232 45788 60 \N 10
+3460 0 232 45762 120 \N 10
+3461 0 232 44349 120 \N 10
+3462 0 232 45830 120 \N 10
+3463 0 291 41759 0 \N 5000
+3464 0 292 42197 0 \N 30
+3465 0 293 41788 0 \N 14
+3466 0 294 41870 0 \N 40
+3467 0 295 41796 0 \N 10
+3468 53 289 45763 60 \N 21
+3469 53 288 44256 60 \N 3
+3470 53 288 45866 60 \N 3
+3471 53 288 45771 60 \N 3
+3472 53 288 44206 60 \N 3
+3473 53 288 45870 60 \N 3
+3474 53 288 45818 60 \N 3
+3475 53 293 44198 60 \N 14
+3476 53 293 45770 60 \N 14
+3477 53 293 45771 60 \N 14
+3478 53 293 45811 60 \N 14
+3479 53 293 46136 60 \N 14
+3480 53 293 45945 60 \N 14
+3481 53 293 44219 60 \N 14
+3482 53 293 45788 60 \N 14
+3483 53 293 45866 60 \N 14
+3484 53 293 45759 60 \N 14
+3485 53 293 45818 660 \N 14
+3486 53 293 43996 960 \N 14
+3487 53 293 44382 960 \N 14
+3488 53 293 45927 960 \N 14
+3489 53 293 46018 1140 \N 14
+3490 53 293 63725 1140 \N 14
+3491 53 293 44198 1260 \N 14
+3492 53 293 46018 1320 \N 14
+3493 53 293 35733 2040 \N 14
+3494 53 293 49481 2100 \N 14
+3495 53 293 45872 2160 \N 15
+3496 53 293 61993 2160 \N 15
+3497 53 293 45811 2160 \N 15
+3498 53 293 49481 2340 \N 16
+3499 53 293 45784 2400 \N 2
+3500 53 293 45793 2400 \N 2
+3501 53 293 45763 2400 \N 2
+3502 53 293 45776 2580 \N 2
+3503 53 293 45787 2580 \N 2
+3504 53 293 46286 2580 \N 2
+3505 53 293 49408 2760 \N 2
+3506 0 296 41796 0 \N 10
+3507 53 296 45900 60 \N 10
+3508 53 296 48871 120 \N 11
+3509 53 296 45866 120 \N 11
+3510 53 296 45771 120 \N 11
+3511 53 296 45853 120 \N 11
+3512 53 296 45914 120 \N 11
+3513 53 296 45788 120 \N 11
+3514 53 296 45818 120 \N 11
+3515 53 296 45818 540 \N 11
+3516 53 296 45830 600 \N 11
+3517 53 296 45762 1020 \N 11
+3518 53 296 45919 1020 \N 11
+3519 53 296 45811 2040 \N 11
+3520 53 296 45870 2040 \N 11
+3521 53 296 44359 4860 \N 11
+3522 53 296 45776 4920 \N 8
+3523 53 296 61832 4920 \N 8
+3524 53 292 48577 60 \N 30
+3525 53 292 63811 60 \N 30
+3526 53 292 44198 60 \N 30
+3527 53 292 49020 60 \N 30
+3528 53 292 45771 60 \N 30
+3529 53 292 45901 60 \N 30
+3530 53 292 62167 60 \N 30
+3531 53 292 48880 60 \N 30
+3532 53 292 45873 60 \N 30
+3533 53 292 62103 60 \N 30
+3534 53 292 45752 60 \N 30
+3535 53 292 49083 60 \N 30
+3536 53 292 45788 60 \N 30
+3537 53 292 44017 960 \N 30
+3538 53 292 35733 960 \N 30
+3539 53 292 43997 960 \N 30
+3540 53 292 44281 1140 \N 31
+3541 53 292 44198 1140 \N 31
+3542 53 292 44641 1260 \N 31
+3543 53 292 45818 1320 \N 31
+3544 53 294 45866 60 \N 40
+3545 53 294 45771 60 \N 40
+3546 53 294 63725 60 \N 40
+3547 53 294 45838 60 \N 40
+3548 53 294 45806 60 \N 40
+3549 53 294 45788 60 \N 40
+3550 53 294 45866 540 \N 40
+3551 53 294 46674 960 \N 40
+3552 53 294 49251 1020 \N 40
+3553 53 294 45811 1080 \N 43
+3554 53 294 -100 1080 \N 43
+3555 53 294 61832 1200 \N 41
+3556 53 294 44004 1200 \N 41
+3557 53 291 44198 60 \N 5000
+3558 53 291 45771 60 \N 5000
+3559 53 291 45901 60 \N 5000
+3560 53 291 45782 60 \N 5000
+3561 53 291 45751 60 \N 5000
+3562 53 291 45752 60 \N 5000
+3563 53 291 44281 60 \N 5000
+3564 53 291 45818 60 \N 5000
+3565 53 291 45788 60 \N 5000
+3566 53 291 44198 600 \N 5002
+3567 53 291 36210 960 \N 5002
+3568 53 291 52757 1020 \N 5003
+3569 53 291 48686 1020 \N 5003
+3570 53 291 48711 1020 \N 5003
+3571 0 297 41839 0 \N 3
+3572 0 299 41759 0 \N 5000
+3573 0 300 42197 0 \N 30
+3574 0 301 41788 0 \N 14
+3575 0 302 41870 0 \N 40
+3576 0 303 41796 0 \N 10
+3577 54 298 45793 60 \N 21
+3578 54 298 48916 60 \N 21
+3579 54 298 45797 60 \N 21
+3580 54 297 49251 60 \N 3
+3581 54 297 45866 60 \N 3
+3582 54 297 45771 60 \N 3
+3583 54 297 61837 60 \N 3
+3584 54 297 45870 60 \N 3
+3585 54 297 44206 60 \N 3
+3586 54 297 45818 60 \N 3
+3587 54 297 45788 60 \N 3
+3588 54 297 44005 540 \N 3
+3589 54 303 46020 60 \N 10
+3590 54 303 48871 60 \N 10
+3591 54 303 45801 60 \N 10
+3592 54 303 45866 60 \N 10
+3593 54 303 45771 60 \N 10
+3594 54 303 45838 60 \N 10
+3595 54 303 45788 60 \N 10
+3596 54 303 45853 60 \N 10
+3597 54 303 44206 540 \N 10
+3598 54 303 48822 900 \N 10
+3599 54 303 45900 960 \N 10
+3600 54 303 62042 1020 \N 11
+3601 54 303 45762 1080 \N 11
+3602 54 303 45811 1080 \N 11
+3603 54 303 60175 1200 \N 11
+3604 54 303 61832 2160 \N 11
+3605 54 303 44004 2220 \N 11
+3606 54 303 44250 4980 \N 11
+3607 54 303 65695 5040 \N 8
+3608 54 303 45870 5100 \N 8
+3609 54 303 44240 5160 \N 8
+3610 54 300 48577 60 \N 30
+3611 54 300 45788 60 \N 30
+3612 54 300 45771 60 \N 30
+3613 54 300 45901 60 \N 30
+3614 54 300 48880 60 \N 30
+3615 54 300 45811 60 \N 30
+3616 54 300 45752 60 \N 30
+3617 54 300 49083 60 \N 30
+3618 54 300 49020 60 \N 30
+3619 54 300 45759 60 \N 30
+3620 54 300 63767 720 \N 30
+3621 54 300 46131 780 \N 30
+3622 54 300 44198 960 \N 30
+3623 54 300 44626 1020 \N 30
+3624 54 300 43997 1020 \N 30
+3625 54 300 35733 1020 \N 30
+3626 54 300 45918 1200 \N 31
+3627 54 300 44310 1260 \N 31
+3628 54 300 50841 2040 \N 31
+3629 54 300 45792 2100 \N 31
+3630 54 300 46065 2160 \N 31
+3631 54 299 44198 60 \N 5000
+3632 54 299 45801 60 \N 5000
+3633 54 299 45771 60 \N 5000
+3634 54 299 45901 60 \N 5000
+3635 54 299 45966 60 \N 5000
+3636 54 299 45782 60 \N 5000
+3637 54 299 45752 60 \N 5000
+3638 54 299 45918 60 \N 5000
+3639 54 299 36210 540 \N 5002
+3640 54 299 45792 600 \N 5003
+3641 54 299 45853 660 \N 5003
+3642 54 299 44198 960 \N 5003
+3643 54 299 45919 960 \N 5003
+3644 54 299 45918 4680 \N 5003
+3645 54 301 44198 60 \N 14
+3646 54 301 45770 60 \N 14
+3647 54 301 45771 60 \N 14
+3648 54 301 45932 60 \N 14
+3649 54 301 48815 60 \N 14
+3650 54 301 44219 60 \N 14
+3651 54 301 45788 60 \N 14
+3652 54 301 45918 60 \N 14
+3653 54 301 45759 60 \N 14
+3654 54 301 45869 600 \N 14
+3655 54 301 49408 780 \N 14
+3656 54 301 45945 960 \N 14
+3657 54 301 45927 960 \N 14
+3658 54 301 45823 960 \N 14
+3659 54 301 44382 1140 \N 14
+3660 54 301 45872 1200 \N 14
+3661 54 301 46343 2160 \N 16
+3662 54 301 62144 2220 \N 16
+3663 54 301 49408 2220 \N 16
+3665 54 301 45869 2220 \N 16
+3664 54 301 45852 2220 2460 16
+3666 54 301 45858 2460 \N 16
+3667 54 301 45793 4320 \N 16
+3668 54 301 49481 5280 \N 16
+3669 54 302 49251 60 \N 40
+3670 54 302 44198 60 \N 40
+3671 54 302 45770 60 \N 40
+3672 54 302 45771 60 \N 40
+3673 54 302 45838 60 \N 40
+3674 54 302 45788 60 \N 40
+3675 54 302 45866 60 \N 40
+3676 54 302 45759 60 \N 40
+3677 54 302 35968 540 \N 43
+3678 54 302 -100 540 \N 43
+3679 54 302 61832 660 \N 41
+3680 54 302 45818 660 \N 41
+3681 54 302 45866 660 \N 41
+3682 54 302 45853 660 \N 41
+3683 54 302 44250 1320 \N 41
+3684 0 91 45771 12120 \N 12
+3685 0 304 41788 0 \N 14
+3686 0 305 41788 0 \N 14
+3687 0 306 41788 0 \N 14
+3688 55 306 45793 60 \N 14
+3689 55 306 45771 60 \N 14
+3690 55 306 45759 60 \N 14
+3691 55 306 49481 1140 \N 14
+3692 55 306 45788 1200 \N 15
+3693 0 307 42197 0 \N 30
+3694 55 307 48577 60 \N 30
+3695 55 307 45788 60 \N 30
+3696 55 307 45771 60 \N 30
+3697 55 307 48880 60 \N 30
+3698 55 307 49083 60 \N 30
+3699 55 307 49020 60 \N 30
+3700 55 307 45759 60 \N 30
+3701 0 308 42197 0 \N 30
+3702 57 308 35733 9060 \N 33
+3703 57 308 62151 9120 \N 31
+3704 0 309 41788 0 \N 14
+3705 57 309 45945 60 \N 14
+3706 57 309 45771 60 \N 14
+3707 57 309 45788 60 \N 14
+3708 57 309 45759 60 \N 14
+3709 57 309 48724 300 \N 14
+3710 57 309 45948 300 \N 14
+3711 57 309 50267 300 \N 14
+3712 57 309 43996 300 \N 14
+3713 57 309 45872 540 \N 14
+3714 57 309 65702 540 \N 14
+3715 57 309 49481 660 \N 16
+3716 0 310 41870 0 \N 40
+3717 55 310 -100 18060 \N 40
+3718 55 310 45763 18120 \N 41
+3719 55 310 45788 18120 \N 41
+3720 55 310 45771 18120 \N 41
+3721 55 310 45759 18120 \N 41
+3722 0 311 41759 0 \N 5000
+3723 55 311 36210 60 \N 5000
+3724 55 311 44198 120 \N 5001
+3725 55 311 45793 180 \N 5003
+3726 55 311 45763 180 \N 5003
+3727 55 311 45771 180 \N 5003
+3728 55 311 45806 180 \N 5003
+3729 55 311 45752 180 \N 5003
+3730 55 311 45788 180 \N 5003
+3731 55 311 48960 540 \N 5003
+3732 0 312 41796 0 \N 10
+3733 55 312 45763 60 \N 10
+3734 55 312 45771 60 \N 10
+3735 55 312 45838 60 \N 10
+3736 55 312 45788 60 \N 10
+3737 55 312 45853 60 \N 10
+3738 55 312 45759 60 \N 10
+3739 55 312 45762 1320 \N 10
+3740 55 312 45914 1320 \N 10
+3741 55 312 45870 1320 \N 10
+3742 55 312 49301 1320 \N 10
+3743 55 312 46438 2460 \N 10
+3744 55 312 44359 2460 \N 10
+3745 55 312 45793 2580 \N 12
+3746 55 312 45770 2580 \N 12
+3747 55 312 45866 2580 \N 12
+3748 55 312 45806 2580 \N 12
+3749 55 312 44198 2580 \N 12
+3750 55 312 48822 2880 \N 12
+3751 55 312 45900 2940 \N 12
+3752 55 312 45793 3000 \N 8
+3753 55 312 45788 3000 \N 8
+3754 0 313 41759 0 \N 5000
+3755 55 313 45752 60 \N 5000
+3756 55 313 45771 60 \N 5000
+3757 55 313 45788 60 \N 5000
+3758 55 313 45901 60 \N 5000
+3759 55 313 45751 60 \N 5000
+3760 55 313 36210 360 \N 5000
+3761 55 313 44198 420 \N 5001
+3762 55 313 45793 480 \N 5003
+3763 55 313 45763 480 \N 5003
+3764 55 313 45770 480 \N 5003
+3765 55 313 45806 480 \N 5003
+3766 55 313 45866 480 \N 5003
+3767 55 313 45759 480 \N 5003
+3768 0 315 41839 0 \N 3
+3769 0 316 41759 0 \N 5000
+3770 0 317 42197 0 \N 30
+3771 0 318 41788 0 \N 14
+3772 0 319 41870 0 \N 40
+3773 0 320 41796 0 \N 10
+3774 59 314 45788 60 \N 21
+3775 59 315 45771 60 \N 3
+3776 59 315 48532 60 \N 3
+3777 59 315 45838 60 \N 3
+3778 59 315 45870 60 \N 3
+3779 59 320 45801 60 \N 10
+3780 59 320 45866 60 \N 10
+3781 59 320 45771 60 \N 10
+3782 59 320 46030 60 \N 10
+3783 59 320 44349 60 \N 10
+3784 59 320 45838 60 \N 10
+3785 59 320 45788 60 \N 10
+3786 59 320 45853 60 \N 10
+3787 59 320 45864 540 \N 10
+3788 59 320 45921 540 \N 10
+3789 59 320 35849 660 \N 11
+3790 59 320 48871 960 \N 11
+3791 59 320 35733 1020 \N 11
+3792 59 320 45762 1980 \N 11
+3793 59 320 65641 5640 \N 11
+3794 59 320 63714 5640 \N 11
+3795 59 320 49251 5640 \N 11
+3796 59 320 44359 6720 \N 11
+3797 59 317 63767 60 \N 30
+3798 59 317 48577 60 \N 30
+3799 59 317 61826 60 \N 30
+3800 59 317 63811 60 \N 30
+3801 59 317 44198 60 \N 30
+3802 59 317 49020 60 \N 30
+3803 59 317 45771 60 \N 30
+3804 59 317 56492 60 \N 30
+3805 59 317 62167 60 \N 30
+3806 59 317 48880 60 \N 30
+3807 59 317 50510 60 \N 30
+3808 59 317 35733 60 \N 30
+3809 59 317 62103 60 \N 30
+3810 59 317 49594 60 \N 30
+3811 59 317 49083 60 \N 30
+3812 59 317 45788 60 \N 30
+3813 59 317 43997 60 \N 30
+3814 0 321 41788 0 \N 14
+3815 59 321 43996 60 \N 14
+3816 59 321 45770 60 \N 14
+3817 59 321 45771 60 \N 14
+3818 59 321 45811 60 \N 14
+3819 59 321 46136 60 \N 14
+3820 59 321 45945 60 \N 14
+3821 59 321 44219 60 \N 14
+3822 59 321 45788 60 \N 14
+3823 59 321 45759 60 \N 14
+3824 59 321 44198 600 \N 14
+3825 59 321 49481 960 \N 14
+3826 59 321 65641 960 \N 14
+3827 59 321 45969 960 \N 14
+3828 59 321 45872 1140 \N 15
+3829 59 321 63745 1140 \N 15
+3830 59 321 65702 1140 \N 15
+3831 59 321 44382 1140 \N 15
+3832 59 321 61993 1140 \N 15
+3833 59 321 49481 1440 \N 16
+3834 59 321 45770 1500 \N 2
+3835 59 321 45788 1500 \N 2
+3836 59 321 45759 1500 \N 2
+3837 59 319 45763 60 \N 40
+3838 59 319 45864 60 \N 40
+3839 59 319 45866 60 \N 40
+3840 59 319 45771 60 \N 40
+3841 59 319 45900 60 \N 40
+3842 59 319 45838 60 \N 40
+3843 59 319 45818 60 \N 40
+3844 59 319 45788 60 \N 40
+3845 59 319 45853 60 \N 40
+3846 59 319 35846 600 \N 40
+3847 59 319 44198 660 \N 43
+3848 59 319 35846 960 \N 43
+3849 59 319 -100 1920 \N 43
+3850 59 319 65641 1980 \N 41
+3851 59 319 45866 1980 \N 41
+3852 59 316 48960 60 \N 5000
+3853 59 316 44198 60 \N 5000
+3854 59 316 45801 60 \N 5000
+3855 59 316 45771 60 \N 5000
+3856 59 316 56492 60 \N 5000
+3857 59 316 45873 60 \N 5000
+3858 59 316 48532 60 \N 5000
+3859 59 316 44281 60 \N 5000
+3860 59 316 45788 60 \N 5000
+3861 59 316 65641 960 \N 5002
+3862 59 316 36210 960 \N 5002
+3863 59 316 50547 960 \N 5002
+3864 59 316 63923 1140 \N 5003
+3865 59 316 45752 1200 \N 5003
+3866 59 316 46004 1200 \N 5003
+3867 59 316 45901 1200 \N 5003
+3868 0 323 41839 0 \N 3
+3869 0 324 41759 0 \N 5000
+3870 0 325 42197 0 \N 30
+3871 0 326 41788 0 \N 14
+3872 0 327 41870 0 \N 40
+3873 0 328 41796 0 \N 10
+3874 60 322 63752 60 \N 21
+3875 60 322 45763 60 \N 21
+3876 60 322 45788 60 \N 21
+3877 60 322 44198 60 \N 21
+3878 60 322 45751 60 \N 21
+3879 60 322 62151 1260 \N 21
+3880 60 323 44256 60 \N 3
+3881 60 323 45866 60 \N 3
+3882 60 323 45771 60 \N 3
+3883 60 323 45838 60 \N 3
+3884 60 323 44206 60 \N 3
+3885 60 323 45870 60 \N 3
+3886 60 323 45818 60 \N 3
+3887 60 323 45788 60 \N 3
+3888 60 323 48532 960 \N 3
+3889 60 324 48960 60 \N 5000
+3890 60 324 45955 60 \N 5000
+3891 60 324 44198 60 \N 5000
+3892 60 324 45801 60 \N 5000
+3893 60 324 45771 60 \N 5000
+3894 60 324 45901 60 \N 5000
+3895 60 324 36210 60 \N 5000
+3896 60 324 45782 60 \N 5000
+3897 60 324 45751 60 \N 5000
+3898 60 324 45752 60 \N 5000
+3899 60 324 45788 60 \N 5000
+3900 60 324 44281 720 \N 5003
+3901 60 324 36210 960 \N 5003
+3902 60 326 44198 60 \N 14
+3903 60 326 65640 60 \N 14
+3904 60 326 45771 60 \N 14
+3905 60 326 45870 60 \N 14
+3906 60 326 45811 60 \N 14
+3907 60 326 35733 60 \N 14
+3908 60 326 61975 60 \N 14
+3909 60 326 44216 60 \N 14
+3910 60 326 45945 60 \N 14
+3911 60 326 45818 60 \N 14
+3912 60 326 44219 60 \N 14
+3913 60 326 45788 60 \N 14
+3914 60 326 45759 60 \N 14
+3915 60 326 45872 960 \N 14
+3916 60 326 61993 960 \N 14
+3917 60 326 65640 960 \N 14
+3918 60 326 65702 960 \N 14
+3919 60 326 45927 960 \N 14
+3920 60 326 43996 1260 \N 16
+3921 60 326 45869 1320 \N 16
+3922 60 326 49481 2280 \N 16
+3923 60 328 45763 60 \N 10
+3924 60 328 44388 60 \N 10
+3925 60 328 44198 60 \N 10
+3926 60 328 45830 60 \N 10
+3927 60 328 45801 60 \N 10
+3928 60 328 45866 60 \N 10
+3929 60 328 45838 60 \N 10
+3930 60 328 45788 60 \N 10
+3931 60 328 44349 60 \N 10
+3932 60 328 35733 1500 \N 10
+3933 60 328 44586 1560 \N 10
+3934 60 328 44206 1620 \N 10
+3935 60 328 48522 1680 \N 10
+3936 60 328 63714 5340 \N 10
+3937 60 328 44359 5340 \N 10
+3938 60 328 50235 5460 \N 12
+3939 60 328 60175 5460 \N 12
+3940 60 328 62023 5580 \N 12
+3941 60 328 48822 5640 \N 12
+3942 60 328 60175 5700 \N 12
+3943 60 328 45900 5760 \N 12
+3944 60 327 45866 60 \N 40
+3945 60 327 45763 120 \N 40
+3946 60 327 35846 120 \N 40
+3947 60 327 50343 120 \N 40
+3948 60 327 45870 120 \N 40
+3949 60 327 46067 120 \N 40
+3950 60 327 45955 120 \N 40
+3951 60 327 45788 120 \N 40
+3952 60 327 45853 120 \N 40
+3953 60 327 -100 600 \N 43
+3954 60 325 48577 60 \N 30
+3955 60 325 45763 60 \N 30
+3957 60 325 45798 60 \N 30
+3958 60 325 45901 60 \N 30
+3959 60 325 50930 60 \N 30
+3960 60 325 45955 60 \N 30
+3961 60 325 45752 60 \N 30
+3962 60 325 44281 60 \N 30
+3963 60 325 49083 60 \N 30
+3964 60 325 45788 60 \N 30
+3965 60 325 45759 60 \N 30
+3966 60 325 35733 960 \N 30
+3967 60 325 44198 960 \N 30
+3956 60 325 45983 60 1080 30
+3968 0 329 41839 0 \N 3
+3969 0 331 41759 0 \N 5000
+3970 0 332 42197 0 \N 30
+3971 0 333 41788 0 \N 14
+3972 0 334 41870 0 \N 40
+3973 0 335 41796 0 \N 10
+3974 61 322 45788 1320 \N 21
+3975 61 323 45824 1020 \N 3
+3976 61 323 44212 1020 \N 3
+3977 61 323 45759 1020 \N 3
+3978 0 336 41788 0 \N 14
+3979 0 337 41788 0 \N 14
+3980 0 338 41788 0 \N 14
+3981 0 339 41788 0 \N 14
+3982 61 339 51110 60 \N 14
+3983 61 339 44198 60 \N 14
+3984 61 339 45770 60 \N 14
+3985 61 339 45818 60 \N 14
+3986 61 339 45788 60 \N 14
+3987 61 339 45759 60 \N 14
+3988 61 339 49481 960 \N 14
+3989 61 339 45770 960 \N 14
+3990 61 339 46028 960 \N 14
+3991 61 339 44198 1140 \N 15
+3992 61 339 48744 1140 \N 15
+3993 61 339 45771 1140 \N 15
+3994 61 339 65646 1140 \N 15
+3995 61 339 50581 1140 \N 15
+3996 61 339 43996 1140 \N 15
+3997 61 339 45788 2040 \N 15
+3998 61 339 44198 2100 \N 15
+3999 61 339 45872 2160 \N 15
+4000 61 339 49481 2220 \N 16
+4001 61 339 45771 2280 \N 2
+4002 0 340 41870 0 \N 40
+4003 61 340 45866 60 \N 40
+4004 61 340 45771 60 \N 40
+4005 61 340 45788 60 \N 40
+4006 61 340 45838 60 \N 40
+4007 61 340 44206 300 \N 40
+4008 61 340 48822 300 \N 40
+4009 61 340 44004 420 \N 40
+4010 61 340 49251 480 \N 43
+4011 61 340 45801 540 \N 43
+4012 61 340 46605 600 \N 43
+4013 61 340 44256 960 \N 43
+4014 61 340 46605 960 \N 43
+4015 61 340 -100 1080 \N 43
+4016 61 340 61832 1140 \N 41
+4017 61 340 45866 1140 \N 41
+4018 0 341 42197 0 \N 30
+4019 61 341 48577 60 \N 30
+4020 61 341 50692 60 \N 30
+4021 61 341 45788 60 \N 30
+4022 61 341 45771 60 \N 30
+4023 61 341 48880 60 \N 30
+4024 61 341 35733 60 \N 30
+4025 61 341 63767 60 \N 30
+4026 61 341 45752 60 \N 30
+4027 61 341 49020 60 \N 30
+4028 61 341 43997 60 \N 30
+4029 0 342 41759 0 \N 5000
+4030 61 342 44198 60 \N 5000
+4031 61 342 45801 60 \N 5000
+4032 61 342 45866 60 \N 5000
+4033 61 342 45771 60 \N 5000
+4034 61 342 45752 60 \N 5000
+4035 61 342 45788 60 \N 5000
+4036 61 342 36210 960 \N 5002
+4037 61 342 49228 1020 \N 5003
+4038 0 343 41796 0 \N 10
+4039 61 343 45864 60 \N 10
+4040 61 343 45801 60 \N 10
+4041 61 343 45771 60 \N 10
+4042 61 343 45788 60 \N 10
+4043 61 343 48676 960 \N 11
+4044 61 343 45866 1020 \N 11
+4045 61 343 45770 1080 \N 11
+4046 61 343 44595 1080 \N 11
+4047 61 343 63730 1080 \N 11
+4048 61 343 45759 1080 \N 11
+4049 61 343 44359 4920 \N 11
+4050 0 344 41839 0 \N 3
+4051 0 345 41839 0 \N 3
+4052 0 347 41759 0 \N 5000
+4053 0 348 42197 0 \N 30
+4054 0 349 41788 0 \N 14
+4055 0 350 41870 0 \N 40
+4056 0 351 41796 0 \N 10
+4057 62 346 45788 60 \N 21
+4058 62 345 45866 60 \N 3
+4059 62 345 45771 60 \N 3
+4060 62 345 45870 60 \N 3
+4061 62 345 44206 60 \N 3
+4062 62 345 45818 60 \N 3
+4063 62 345 45788 60 \N 3
+4064 62 347 48960 60 \N 5000
+4065 62 347 45955 60 \N 5000
+4066 62 347 44198 60 \N 5000
+4067 62 347 45801 60 \N 5000
+4068 62 347 45771 60 \N 5000
+4069 62 347 45901 60 \N 5000
+4070 62 347 45782 60 \N 5000
+4071 62 347 45751 60 \N 5000
+4072 62 347 45752 60 \N 5000
+4073 62 347 45788 60 \N 5000
+4074 62 347 44281 660 \N 5002
+4075 62 347 45866 780 \N 5002
+4076 62 347 36210 960 \N 5002
+4077 62 347 45778 1020 \N 5003
+4078 62 347 45995 1020 \N 5003
+4079 62 348 48577 60 \N 30
+4080 62 348 44198 60 \N 30
+4081 62 348 45788 60 \N 30
+4082 62 348 45771 60 \N 30
+4083 62 348 48880 60 \N 30
+4084 62 348 45811 60 \N 30
+4085 62 348 49083 60 \N 30
+4086 62 348 49020 60 \N 30
+4087 62 348 45759 60 \N 30
+4088 62 348 45983 60 \N 30
+4089 62 348 62167 660 \N 30
+4090 62 348 45752 720 \N 30
+4091 62 348 44615 720 \N 30
+4092 62 348 43997 720 \N 30
+4093 62 348 45901 720 \N 30
+4094 62 348 35733 720 \N 30
+4095 62 348 44281 1020 \N 31
+4096 62 350 45866 60 \N 40
+4097 62 350 45771 60 \N 40
+4098 62 350 45870 60 \N 40
+4099 62 350 45818 60 \N 40
+4100 62 350 50235 60 \N 40
+4101 62 350 45788 60 \N 40
+4102 62 350 45853 60 \N 40
+4103 62 350 44004 480 \N 40
+4104 62 350 44297 540 \N 43
+4105 62 350 -100 540 \N 43
+4106 62 350 44206 960 \N 41
+4107 62 351 62144 60 \N 10
+4108 62 351 48676 60 \N 10
+4109 62 351 45866 60 \N 10
+4110 62 351 45771 60 \N 10
+4111 62 351 44439 60 \N 10
+4112 62 351 45818 60 \N 10
+4113 62 351 50235 60 \N 10
+4114 62 351 45788 60 \N 10
+4115 62 351 45770 8160 \N 10
+4116 62 351 45759 8160 \N 10
+4117 62 351 61323 8160 \N 10
+4118 62 351 44359 8160 \N 10
+4119 62 351 45870 8400 \N 12
+4120 62 351 48502 8460 \N 12
+4121 62 351 45864 8520 \N 12
+4122 62 351 45921 8520 \N 12
+4123 62 349 49481 60 \N 14
+4124 62 349 45770 60 \N 14
+4125 62 349 45771 60 \N 14
+4126 62 349 44439 60 \N 14
+4127 62 349 45945 60 \N 14
+4128 62 349 45759 60 \N 14
+4129 62 349 45788 60 \N 14
+4130 62 349 61823 60 \N 14
+4131 62 349 44441 540 \N 15
+4132 62 349 44978 540 \N 15
+4133 62 349 62022 540 \N 15
+4134 62 349 45818 720 \N 15
+4135 62 349 43996 780 \N 15
+4136 62 349 35733 780 \N 15
+4137 62 349 44001 960 \N 15
+4138 62 349 50581 960 \N 15
+4139 62 349 49481 1080 \N 16
+4140 0 352 41839 0 \N 3
+4141 0 354 41759 0 \N 5000
+4142 0 355 41759 0 \N 5000
+4143 0 356 42197 0 \N 30
+4144 0 357 41788 0 \N 14
+4145 0 358 41870 0 \N 40
+4146 0 359 41796 0 \N 10
+4147 63 353 44216 60 \N 21
+4148 63 353 44198 60 \N 21
+4149 63 353 65655 60 \N 21
+4150 63 353 45793 1140 \N 21
+4151 63 353 45763 1140 \N 21
+4152 63 352 45866 60 \N 3
+4153 63 352 45771 60 \N 3
+4154 63 352 44206 60 \N 3
+4155 63 352 45870 60 \N 3
+4156 63 352 45818 60 \N 3
+4157 63 352 45788 60 \N 3
+4158 63 352 45759 60 \N 3
+4159 63 352 48532 960 \N 3
+4160 63 356 49083 60 \N 30
+4161 63 356 44198 60 \N 30
+4162 63 356 44615 60 \N 30
+4163 63 356 45866 60 \N 30
+4164 63 356 45771 60 \N 30
+4165 63 356 44017 60 \N 30
+4166 63 356 35733 60 \N 30
+4167 63 356 45759 60 \N 30
+4168 63 356 45788 60 \N 30
+4169 63 356 45983 60 \N 30
+4170 63 356 48577 660 \N 31
+4171 63 356 63811 660 \N 31
+4172 63 356 63725 660 \N 31
+4173 63 356 48880 660 \N 31
+4174 63 356 49334 660 \N 31
+4175 63 356 49020 660 \N 31
+4176 63 356 56492 1020 \N 31
+4177 63 356 44199 1020 \N 31
+4178 63 358 45888 60 \N 40
+4179 63 358 45866 60 \N 40
+4180 63 358 45771 60 \N 40
+4181 63 358 45838 60 \N 40
+4182 63 358 45778 60 \N 40
+4183 63 358 45806 60 \N 40
+4184 63 358 48822 60 \N 40
+4185 63 358 45818 60 \N 40
+4186 63 358 45788 60 \N 40
+4187 63 358 45759 60 \N 40
+4188 63 358 35846 660 \N 40
+4189 63 358 45866 720 \N 43
+4190 63 358 50235 780 \N 43
+4191 63 358 36086 840 \N 43
+4192 63 358 44315 900 \N 43
+4193 63 358 35846 900 \N 43
+4194 63 358 43993 1020 \N 43
+4195 63 358 44241 1080 \N 43
+4196 63 358 45866 1140 \N 43
+4197 63 358 46185 1200 \N 43
+4198 63 358 -100 1440 \N 43
+4199 63 359 35849 60 \N 10
+4200 63 359 45866 60 \N 10
+4201 63 359 45771 60 \N 10
+4202 63 359 45838 60 \N 10
+4203 63 359 60175 60 \N 10
+4204 63 359 47146 60 \N 10
+4205 63 359 45870 60 \N 10
+4206 63 359 45818 60 \N 10
+4207 63 359 50235 60 \N 10
+4208 63 359 45788 60 \N 10
+4209 63 359 45853 60 \N 10
+4210 63 359 35733 960 \N 10
+4211 63 359 45806 960 \N 10
+4212 63 359 44213 960 \N 10
+4213 63 359 44004 1200 \N 10
+4214 63 359 51290 1260 \N 10
+4215 63 359 45921 1320 \N 10
+4216 63 355 44198 60 \N 5000
+4217 63 355 45771 60 \N 5000
+4218 63 355 36210 60 \N 5000
+4219 63 355 45752 60 \N 5000
+4220 63 355 44281 60 \N 5000
+4221 63 355 45788 60 \N 5000
+4222 63 355 43997 60 \N 5000
+4223 63 357 62151 60 \N 14
+4224 63 357 43996 60 \N 14
+4225 63 357 45771 60 \N 14
+4226 63 357 44236 60 \N 14
+4227 63 357 45927 60 \N 14
+4228 63 357 35733 60 \N 14
+4229 63 357 45945 60 \N 14
+4230 63 357 45788 60 \N 14
+4231 63 357 45759 60 \N 14
+4232 63 357 45872 1500 \N 14
+4233 63 357 46028 1500 \N 14
+4234 63 357 48871 1500 \N 14
+4235 63 357 49481 2580 \N 16
+4236 63 357 61323 2580 \N 16
+4237 0 360 41839 0 \N 3
+4238 0 362 41759 0 \N 5000
+4239 0 363 42197 0 \N 30
+4240 0 364 41788 0 \N 14
+4241 0 365 41870 0 \N 40
+4242 0 366 41796 0 \N 10
+4243 64 361 45788 60 \N 21
+4244 64 360 45866 60 \N 3
+4245 64 360 45870 60 \N 3
+4246 64 362 44198 60 \N 5000
+4247 64 362 45801 60 \N 5000
+4248 64 362 45782 60 \N 5000
+4249 64 362 45751 60 \N 5000
+4250 64 362 45752 60 \N 5000
+4251 64 362 45788 60 \N 5000
+4252 64 362 45771 1320 \N 5002
+4253 64 362 63725 1320 \N 5002
+4254 64 362 44252 1440 \N 5002
+4255 64 365 49251 60 \N 40
+4256 64 365 45866 60 \N 40
+4257 64 365 45771 60 \N 40
+4258 64 365 45838 60 \N 40
+4259 64 365 45806 60 \N 40
+4260 64 365 45942 60 \N 40
+4261 64 365 45914 60 \N 40
+4262 64 365 45759 60 \N 40
+4263 64 365 35846 540 \N 43
+4264 64 365 49995 540 \N 43
+4265 64 365 61837 540 \N 43
+4266 64 365 44206 540 \N 43
+4267 64 365 48822 540 \N 43
+4268 64 365 45818 540 \N 43
+4269 64 365 46674 960 \N 43
+4270 64 365 61832 1020 \N 43
+4271 64 365 45811 1020 \N 43
+4272 64 365 45870 1020 \N 43
+4273 64 365 44393 1200 \N 43
+4274 64 365 44389 1200 \N 43
+4275 64 365 35968 1620 \N 43
+4276 64 365 -100 1680 \N 43
+4277 64 365 45776 1740 \N 41
+4278 64 365 45866 1740 \N 41
+4279 64 365 45787 1740 \N 41
+4280 64 363 48577 60 \N 30
+4281 64 363 63811 60 \N 30
+4282 64 363 49020 60 \N 30
+4283 64 363 63767 60 \N 30
+4284 64 363 45901 60 \N 30
+4285 64 363 50510 60 \N 30
+4286 64 363 48880 60 \N 30
+4287 64 363 62167 60 \N 30
+4288 64 363 45752 60 \N 30
+4289 64 363 49083 60 \N 30
+4290 64 363 45788 60 \N 30
+4291 64 363 44017 720 \N 30
+4292 64 363 35733 720 \N 30
+4293 64 363 43997 720 \N 30
+4294 64 366 45760 60 \N 10
+4295 64 366 45921 60 \N 10
+4296 64 366 45763 60 \N 10
+4298 64 366 45830 60 \N 10
+4299 64 366 48871 60 \N 10
+4300 64 366 45801 60 \N 10
+4301 64 366 45866 60 \N 10
+4302 64 366 45838 60 \N 10
+4303 64 366 45853 60 \N 10
+4304 64 366 45806 60 \N 10
+4305 64 366 44349 60 \N 10
+4306 64 366 51290 60 \N 10
+4307 64 366 65695 60 \N 10
+4308 64 366 45788 60 \N 10
+4309 64 366 45770 60 \N 10
+4310 64 366 45759 60 \N 10
+4311 64 366 45762 1980 \N 11
+4312 64 366 45792 2040 \N 11
+4313 64 366 48544 2040 \N 11
+4314 64 366 44299 2040 \N 11
+4315 64 366 45776 2040 \N 11
+4316 64 366 45811 2040 \N 11
+4317 64 366 45787 2040 \N 11
+4373 66 373 48871 120 \N 10
+4374 66 373 45864 120 \N 10
+4375 66 373 45866 120 \N 10
+4376 66 373 45771 120 \N 10
+4297 64 366 44388 60 2040 10
+4318 64 366 44250 6000 \N 11
+4319 64 366 61832 6060 \N 8
+4320 64 364 49481 60 \N 14
+4321 64 364 45770 60 \N 14
+4322 64 364 45771 60 \N 14
+4323 64 364 45932 60 \N 14
+4324 64 364 45969 60 \N 14
+4325 64 364 45788 60 \N 14
+4326 64 364 45759 60 \N 14
+4327 64 364 44198 480 \N 15
+4328 64 364 45927 480 \N 15
+4329 64 364 63759 480 \N 15
+4330 64 364 46068 480 \N 15
+4331 64 364 61975 480 \N 15
+4332 64 364 45945 480 \N 15
+4333 64 364 50618 480 \N 15
+4334 64 364 45823 480 \N 15
+4335 64 364 46343 960 \N 14
+4336 64 364 49481 960 \N 14
+4337 64 364 45900 960 \N 14
+4338 64 364 44237 960 \N 14
+4339 64 364 65646 960 \N 14
+4340 64 364 48954 960 \N 14
+4341 64 364 44219 960 \N 14
+4342 64 364 43996 960 \N 14
+4343 64 364 45872 1440 \N 15
+4344 64 364 61993 1440 \N 15
+4345 64 364 49481 1560 \N 16
+4346 0 367 41839 0 \N 3
+4347 0 369 41759 0 \N 5000
+4348 0 370 42197 0 \N 30
+4349 0 371 41788 0 \N 14
+4350 0 372 41870 0 \N 40
+4351 0 373 41796 0 \N 10
+4352 66 368 45788 60 \N 21
+4353 66 367 45866 60 \N 3
+4354 66 367 45771 60 \N 3
+4355 66 367 45788 60 \N 3
+4356 66 367 45818 60 \N 3
+4357 66 367 45838 60 \N 3
+4358 66 372 45793 60 \N 40
+4359 66 372 45866 60 \N 40
+4360 66 372 45771 60 \N 40
+4361 66 372 45838 60 \N 40
+4362 66 372 44206 60 \N 40
+4363 66 372 50200 60 \N 40
+4364 66 372 45788 60 \N 40
+4365 66 372 45853 960 \N 40
+4366 66 372 44198 960 \N 40
+4367 66 372 46160 1860 \N 40
+4368 66 372 49251 1860 \N 40
+4369 66 372 46674 1980 \N 43
+4370 66 372 61832 2160 \N 43
+4371 66 372 -100 4020 \N 43
+4372 66 373 48822 60 \N 10
+4377 66 373 45838 120 \N 10
+4378 66 373 45818 120 \N 10
+4379 66 373 45788 120 \N 10
+4380 66 373 45853 120 \N 10
+4381 66 373 65656 1020 \N 11
+4382 66 373 65692 1020 \N 11
+4383 66 373 44206 1020 \N 11
+4384 66 373 60178 2100 \N 11
+4385 66 373 44313 2160 \N 8
+4386 66 370 48728 60 \N 30
+4387 66 370 48561 60 \N 30
+4388 66 370 45771 60 \N 30
+4389 66 370 45788 60 \N 30
+4390 66 370 46090 1200 \N 30
+4391 66 370 45901 1200 \N 30
+4392 66 370 44198 2220 \N 30
+4393 66 370 48577 2280 \N 30
+4394 66 370 63811 2280 \N 30
+4395 66 370 63767 2280 \N 30
+4396 66 370 48880 2280 \N 30
+4397 66 370 62167 2280 \N 30
+4398 66 370 49083 2280 \N 30
+4399 66 370 49020 2280 \N 30
+4400 66 370 62151 3600 \N 33
+4401 66 370 44281 3660 \N 33
+4402 66 370 44017 3720 \N 33
+4403 66 370 43997 3780 \N 33
+4404 66 370 35733 3780 \N 33
+4405 66 371 48513 60 \N 14
+4406 66 371 62027 60 \N 14
+4407 66 371 45771 60 \N 14
+4408 66 371 48724 60 \N 14
+4409 66 371 45941 60 \N 14
+4410 66 371 45945 60 \N 14
+4411 66 371 44219 60 \N 14
+4412 66 371 45788 60 \N 14
+4413 66 371 49481 960 \N 14
+4414 66 371 65640 1020 \N 15
+4415 66 371 45770 1080 \N 14
+4416 66 371 45759 1080 \N 14
+4417 66 371 45793 1200 \N 14
+4418 66 371 44198 1260 \N 14
+4419 66 371 44416 1320 \N 14
+4420 66 371 45869 1380 \N 14
+4421 66 371 44001 2040 \N 14
+4422 66 371 49481 2100 \N 16
+4423 66 369 44198 60 \N 5000
+4424 66 369 45801 60 \N 5000
+4425 66 369 45771 60 \N 5000
+4426 66 369 45901 60 \N 5000
+4427 66 369 63725 60 \N 5000
+4428 66 369 45782 60 \N 5000
+4429 66 369 45751 60 \N 5000
+4430 66 369 44281 60 \N 5000
+4431 66 369 45788 60 \N 5000
+4432 66 369 48960 960 \N 5002
+4433 66 369 48711 960 \N 5002
+4434 66 369 46006 1080 \N 5002
+4435 66 369 49228 1140 \N 5002
+4436 66 369 48980 2100 \N 5002
+4437 66 369 44198 2160 \N 5002
+4438 66 369 50554 2220 \N 5002
+4439 66 369 44252 2280 \N 5002
+4440 66 369 43997 2280 \N 5002
+4441 67 374 45793 60 \N 21
+4442 67 374 45763 60 \N 21
+4443 67 374 44198 1080 \N 21
+4444 67 374 45927 1080 \N 21
+4445 67 374 45770 1080 \N 21
+4446 67 374 45866 1080 \N 21
+4447 67 374 65639 1080 \N 21
+4448 67 374 45901 1080 \N 21
+4449 67 374 45806 1080 \N 21
+4450 67 374 44205 1080 \N 21
+4451 67 374 45776 1080 \N 21
+4452 67 374 45937 1080 \N 21
+4453 67 374 45811 1080 \N 21
+4454 67 374 45879 1080 \N 21
+4455 67 374 45945 1080 \N 21
+4456 67 374 45914 1080 \N 21
+4457 67 374 45787 1080 \N 21
+4458 67 374 45788 1080 \N 21
+4459 67 374 45873 1080 \N 21
+4460 67 374 45854 1080 \N 21
+4461 67 374 45759 1080 \N 21
+4462 67 374 35850 2220 \N 21
+4463 67 374 45778 2280 \N 18
+4464 67 374 45771 2280 \N 18
+4465 67 374 45887 2280 \N 18
+4466 0 375 41839 0 \N 3
+4467 0 377 41759 0 \N 5000
+4468 0 378 42197 0 \N 30
+4469 0 379 41788 0 \N 14
+4470 0 380 41870 0 \N 40
+4471 0 381 41796 0 \N 10
+4472 68 376 45788 60 \N 21
+4473 68 376 45763 120 \N 21
+4474 68 375 45763 60 \N 3
+4475 68 375 45866 60 \N 3
+4476 68 375 45771 60 \N 3
+4477 68 375 45870 60 \N 3
+4478 68 375 45818 60 \N 3
+4479 68 375 45788 60 \N 3
+4480 68 375 45759 60 \N 3
+4481 68 375 49251 480 \N 3
+4482 68 381 45900 60 \N 10
+4483 68 381 45866 120 \N 11
+4484 68 381 45771 120 \N 11
+4485 68 381 45788 120 \N 11
+4486 68 381 45818 120 \N 11
+4487 68 381 45919 120 \N 11
+4488 68 381 48871 420 \N 11
+4489 68 381 48676 1380 \N 11
+4490 68 381 62176 1440 \N 11
+4491 68 381 60175 2400 \N 11
+4492 68 381 46160 3360 \N 11
+4493 68 381 44359 5220 \N 11
+4494 68 381 45770 5280 \N 8
+4495 68 381 45759 5280 \N 8
+4496 68 377 44198 60 \N 5000
+4497 68 377 45801 60 \N 5000
+4498 68 377 45770 60 \N 5000
+4499 68 377 45771 60 \N 5000
+4500 68 377 36210 60 \N 5000
+4501 68 377 45782 60 \N 5000
+4502 68 377 45751 60 \N 5000
+4503 68 377 45752 60 \N 5000
+4504 68 377 45788 60 \N 5000
+4505 68 377 43997 60 \N 5000
+4506 68 377 45759 60 \N 5000
+4507 68 380 45770 60 \N 40
+4508 68 380 45771 60 \N 40
+4509 68 380 45806 60 \N 40
+4510 68 380 45788 60 \N 40
+4511 68 380 45866 60 \N 40
+4512 68 380 45759 60 \N 40
+4513 68 380 45838 420 \N 40
+4514 68 380 49251 480 \N 40
+4515 68 380 -100 540 \N 43
+4516 68 380 45818 600 \N 41
+4517 68 378 45770 60 \N 30
+4518 68 378 45771 60 \N 30
+4519 68 378 45811 60 \N 30
+4520 68 378 45759 60 \N 30
+4521 68 378 45788 60 \N 30
+4522 68 378 45983 60 \N 30
+4523 68 378 45752 420 \N 30
+4524 68 378 63811 480 \N 30
+4525 68 378 62167 480 \N 30
+4526 68 378 44198 960 \N 30
+4527 68 378 44017 1020 \N 30
+4528 68 378 43997 1020 \N 30
+4529 68 378 35733 1020 \N 30
+4530 68 378 49083 2100 \N 31
+4531 68 378 56492 3960 \N 31
+4532 68 379 44198 60 \N 14
+4533 68 379 62151 60 \N 14
+4534 68 379 45771 60 \N 14
+4535 68 379 44236 60 \N 14
+4536 68 379 45969 60 \N 14
+4537 68 379 45811 60 \N 14
+4538 68 379 45945 60 \N 14
+4539 68 379 45788 60 \N 14
+4540 68 379 61823 60 \N 14
+4541 68 379 44198 600 \N 15
+4542 68 379 65640 660 \N 15
+4543 68 379 45927 660 \N 15
+4544 68 379 65640 960 \N 14
+4545 68 379 45927 960 \N 14
+4546 68 379 45793 1080 \N 14
+4547 68 379 45759 1140 \N 14
+4548 68 379 45770 1200 \N 14
+4549 68 379 43996 1260 \N 14
+4550 68 379 35733 1320 \N 14
+4551 68 379 45869 2280 \N 14
+4552 68 379 45969 2340 \N 14
+4553 68 379 44275 2400 \N 15
+4554 68 379 36086 2460 \N 15
+4555 68 379 45793 2520 \N 15
+4556 68 379 62151 2520 \N 15
+4557 68 379 45932 2940 \N 15
+4558 68 379 46160 3000 \N 15
+4559 68 379 63745 3420 \N 15
+4560 68 379 45872 3480 \N 15
+4561 68 379 61993 3480 \N 15
+4562 68 379 65702 3480 \N 15
+4563 68 379 45969 3660 \N 16
+4564 69 383 46093 60 \N 21
+4565 69 383 45788 120 \N 21
+4566 69 383 50343 180 \N 21
+4567 0 384 41839 0 \N 3
+4568 69 384 45866 60 \N 3
+4569 69 384 45771 60 \N 3
+4570 69 384 45838 60 \N 3
+4571 69 384 45870 60 \N 3
+4572 69 384 45818 60 \N 3
+4573 69 384 45788 60 \N 3
+4574 0 385 42197 0 \N 30
+4575 69 385 45771 60 \N 30
+4576 69 385 45788 60 \N 30
+4577 69 385 46093 60 \N 30
+4578 69 385 45983 60 \N 30
+4579 69 385 48577 300 \N 30
+4580 69 385 50510 300 \N 30
+4581 69 385 48880 300 \N 30
+4582 69 385 63767 300 \N 30
+4583 69 385 49083 300 \N 30
+4584 69 385 49020 300 \N 30
+4585 69 385 44017 1560 \N 30
+4586 69 385 35733 1560 \N 30
+4587 69 385 43997 1560 \N 30
+4588 69 385 44198 1740 \N 31
+4589 69 385 45752 1800 \N 31
+4590 69 385 45918 1860 \N 31
+4591 0 386 41870 0 \N 40
+4592 69 386 45763 60 \N 40
+4593 69 386 45866 60 \N 40
+4594 69 386 45771 60 \N 40
+4595 69 386 45806 60 \N 40
+4596 69 386 45838 60 \N 40
+4597 69 386 45788 60 \N 40
+4598 69 386 45770 60 \N 40
+4599 69 386 45759 60 \N 40
+4600 69 386 45827 540 \N 40
+4601 69 386 -100 600 \N 40
+4602 0 387 41788 0 \N 14
+4603 69 387 46348 60 \N 14
+4604 69 387 45770 60 \N 14
+4605 69 387 45771 60 \N 14
+4606 69 387 46028 60 \N 14
+4607 69 387 50581 60 \N 14
+4608 69 387 45945 60 \N 14
+4609 69 387 45759 60 \N 14
+4610 69 387 45788 60 \N 14
+4611 69 387 45823 60 \N 14
+4612 69 387 45866 600 \N 14
+4613 69 387 44219 600 \N 14
+4614 69 387 45870 600 \N 14
+4615 69 387 45872 960 \N 14
+4616 69 387 45956 960 \N 14
+4617 69 387 45875 960 \N 14
+4618 69 387 49867 960 \N 14
+4619 69 387 45748 960 \N 14
+4620 69 387 49481 1260 \N 16
+4621 69 387 61323 1260 \N 16
+4622 69 387 43996 1380 \N 2
+4623 69 387 35733 1380 \N 2
+4624 0 388 41759 0 \N 5000
+4625 69 388 45955 60 \N 5000
+4626 69 388 45766 60 \N 5000
+4627 69 388 45802 60 \N 5000
+4628 69 388 45866 60 \N 5000
+4629 69 388 45771 60 \N 5000
+4630 69 388 45900 60 \N 5000
+4631 69 388 63725 60 \N 5000
+4632 69 388 45806 60 \N 5000
+4633 69 388 43997 60 \N 5000
+4634 69 388 46160 60 \N 5000
+4635 69 388 36210 60 \N 5000
+4636 69 388 45752 60 \N 5000
+4637 69 388 44281 60 \N 5000
+4638 69 388 45818 60 \N 5000
+4639 69 388 45788 60 \N 5000
+4640 69 388 45770 60 \N 5000
+4641 69 388 45918 60 \N 5000
+4642 69 388 45759 60 \N 5000
+4643 69 388 44198 1140 \N 5001
+4644 0 389 41796 0 \N 10
+4645 69 389 45921 60 \N 10
+4646 69 389 35849 60 \N 10
+4647 69 389 45866 60 \N 10
+4648 69 389 45771 60 \N 10
+4649 69 389 45838 60 \N 10
+4650 69 389 44017 60 \N 10
+4651 69 389 51290 60 \N 10
+4652 69 389 46030 60 \N 10
+4653 69 389 35733 60 \N 10
+4654 69 389 45818 60 \N 10
+4655 69 389 45919 60 \N 10
+4656 69 389 45788 60 \N 10
+4657 69 389 45853 60 \N 10
+4658 69 389 45759 60 \N 10
+4659 69 389 44004 960 \N 11
+4660 69 389 48532 960 \N 11
+4661 69 389 48676 1980 \N 11
+4662 69 389 65695 2940 \N 11
+4663 69 389 45945 5700 \N 11
+4664 69 389 61323 5700 \N 11
+4665 69 389 44359 5700 \N 11
+4666 69 389 44206 5880 \N 8
+4667 69 389 46551 5880 \N 8
+4668 0 390 41839 0 \N 3
+4669 0 392 41759 0 \N 5000
+4670 0 393 42197 0 \N 30
+4671 0 394 41788 0 \N 14
+4672 0 395 41870 0 \N 40
+4673 0 396 41796 0 \N 10
+4674 70 391 45788 60 \N 21
+4675 70 393 45763 60 \N 30
+4676 70 393 44198 60 \N 30
+4677 70 393 45771 60 \N 30
+4678 70 393 45811 60 \N 30
+4679 70 393 45759 60 \N 30
+4680 70 393 45788 60 \N 30
+4681 70 393 45983 60 \N 30
+4682 70 393 63811 960 \N 30
+4683 70 393 48577 1020 \N 30
+4684 70 393 48770 1020 \N 30
+4685 70 393 48880 1020 \N 30
+4686 70 393 63767 1020 \N 30
+4687 70 393 49083 1020 \N 30
+4688 70 393 49020 1020 \N 30
+4689 70 393 45752 1920 \N 30
+4690 70 393 45818 1920 \N 30
+4691 70 393 43997 1920 \N 30
+4692 70 393 44198 1920 \N 30
+4693 70 393 35733 1920 \N 30
+4694 70 392 44198 60 \N 5000
+4695 70 392 45801 60 \N 5000
+4696 70 392 45771 60 \N 5000
+4697 70 392 44237 60 \N 5000
+4698 70 392 45873 60 \N 5000
+4699 70 392 45782 60 \N 5000
+4700 70 392 45752 60 \N 5000
+4701 70 392 45788 60 \N 5000
+4702 70 392 43997 60 \N 5000
+4703 70 392 45759 60 \N 5000
+4704 70 392 62151 960 \N 5002
+4705 70 392 50547 2100 \N 5002
+4706 70 392 44198 2160 \N 5002
+4707 70 392 62151 3120 \N 5002
+4708 70 392 44198 4080 \N 5002
+4709 70 392 45966 4140 \N 5002
+4710 70 395 45827 60 \N 40
+4711 70 395 45801 60 \N 40
+4712 70 395 45866 60 \N 40
+4713 70 395 45771 60 \N 40
+4714 70 395 45870 60 \N 40
+4715 70 395 45788 60 \N 40
+4716 70 395 45759 60 \N 40
+4717 70 395 49251 480 \N 40
+4718 70 395 -100 480 \N 40
+4719 70 394 44198 60 \N 14
+4720 70 394 49481 60 \N 14
+4721 70 394 45866 60 \N 14
+4722 70 394 45771 60 \N 14
+4723 70 394 45811 60 \N 14
+4724 70 394 45945 60 \N 14
+4725 70 394 44219 60 \N 14
+4726 70 394 45788 60 \N 14
+4727 70 394 45759 60 \N 14
+4728 70 394 45832 600 \N 15
+4729 70 394 50400 600 \N 15
+4730 70 394 62022 600 \N 15
+4731 70 394 65640 780 \N 15
+4732 70 394 45955 780 \N 15
+4733 70 394 44198 780 \N 15
+4734 70 394 43996 960 \N 14
+4735 70 394 35733 960 \N 14
+4736 70 394 45869 960 \N 14
+4737 70 394 45969 1140 \N 14
+4738 70 394 45927 1140 \N 14
+4739 70 394 61323 1260 \N 15
+4740 70 394 71083 1260 \N 15
+4741 70 394 63723 1380 \N 15
+4742 70 394 44292 1380 \N 15
+4743 70 394 65640 1500 \N 15
+4744 70 394 44198 1500 \N 15
+4745 70 394 63759 1500 \N 15
+4746 70 394 45852 1680 \N 14
+4747 70 394 62171 6240 \N 15
+4748 70 394 62022 6300 \N 15
+4749 70 394 45872 6360 \N 15
+4750 70 394 65702 6360 \N 15
+4751 70 394 49481 6480 \N 16
+4752 70 396 45830 60 \N 10
+4753 70 396 45801 60 \N 10
+4754 70 396 45866 60 \N 10
+4755 70 396 45771 60 \N 10
+4756 70 396 45838 60 \N 10
+4757 70 396 45788 60 \N 10
+4758 70 396 44349 60 \N 10
+4759 70 396 45759 60 \N 10
+4760 70 396 49301 540 \N 10
+4761 70 396 48822 540 \N 10
+4762 70 396 50235 1500 \N 10
+4763 70 396 46030 1500 \N 10
+4764 70 396 35849 1620 \N 10
+4765 70 396 44586 1620 \N 10
+4766 70 396 60175 1740 \N 10
+4767 70 396 44388 1800 \N 10
+4768 70 396 62023 1800 \N 10
+4769 70 396 45811 1920 \N 10
+4770 70 396 35733 1980 \N 10
+4771 0 397 41839 0 \N 3
+4772 0 399 41759 0 \N 5000
+4773 0 400 42197 0 \N 30
+4774 0 401 41788 0 \N 14
+4775 0 402 41870 0 \N 40
+4776 0 403 41796 0 \N 10
+4777 71 398 45788 60 \N 21
+4778 71 397 45788 60 \N 3
+4779 71 400 44198 60 \N 30
+4780 71 400 45771 60 \N 30
+4781 71 400 49083 60 \N 30
+4782 71 400 45788 60 \N 30
+4783 71 400 48829 60 \N 30
+4784 71 400 45983 60 \N 30
+4785 71 400 63811 420 \N 30
+4786 71 400 35733 540 \N 30
+4787 71 400 45792 600 \N 31
+4788 71 400 48577 600 \N 31
+4789 71 400 49020 600 \N 31
+4790 71 401 44198 60 \N 14
+4791 71 401 45771 60 \N 14
+4792 71 401 45945 60 \N 14
+4793 71 401 44219 60 \N 14
+4794 71 401 45788 60 \N 14
+4795 71 401 45759 60 \N 14
+4796 71 401 43996 1320 \N 14
+4797 71 401 35733 1320 \N 14
+4798 71 401 65640 1440 \N 14
+4799 71 401 45927 1440 \N 14
+4800 71 401 61975 1440 \N 14
+4801 71 401 45872 1620 \N 14
+4802 71 401 61993 1620 \N 14
+4803 71 401 65702 1620 \N 14
+4804 71 401 49481 1800 \N 16
+4805 71 403 45955 60 \N 10
+4806 71 403 45801 60 \N 10
+4807 71 403 45866 60 \N 10
+4808 71 403 45771 60 \N 10
+4809 71 403 45900 60 \N 10
+4810 71 403 45870 60 \N 10
+4811 71 403 44349 60 \N 10
+4812 71 403 45788 60 \N 10
+4813 71 403 45853 60 \N 10
+4814 71 403 46030 1620 \N 11
+4815 71 403 44206 1680 \N 11
+4816 71 403 44004 1740 \N 11
+4817 71 403 61982 1800 \N 11
+4818 71 403 44388 1860 \N 11
+4819 71 403 49251 1920 \N 11
+4820 71 403 50509 1980 \N 11
+4821 71 403 49207 1980 \N 11
+4822 71 403 45921 2100 \N 11
+4823 71 403 46179 2160 \N 11
+4824 71 403 63923 2160 \N 11
+4825 71 403 48676 3180 \N 11
+4826 71 403 46081 6840 \N 11
+4827 71 403 46183 6840 \N 11
+4828 71 403 45770 6840 \N 11
+4829 71 403 48628 6840 \N 11
+4830 71 403 45751 6840 \N 11
+4831 71 403 45977 6840 \N 11
+4832 71 403 46090 6840 \N 11
+4833 71 403 45759 6840 \N 11
+4834 71 403 44359 8220 \N 11
+4835 71 402 45763 60 \N 40
+4836 71 402 44198 60 \N 40
+4837 71 402 45866 60 \N 40
+4838 71 402 45771 60 \N 40
+4839 71 402 45806 60 \N 40
+4840 71 402 45838 60 \N 40
+4841 71 402 45818 60 \N 40
+4842 71 402 45788 60 \N 40
+4843 71 402 45759 60 \N 40
+4844 71 402 35846 600 \N 40
+4845 71 402 44000 660 \N 43
+4846 71 402 -100 660 \N 43
+4847 71 399 48960 60 \N 5000
+4848 71 399 45955 60 \N 5000
+4849 71 399 44198 60 \N 5000
+4850 71 399 62023 60 \N 5000
+4851 71 399 45801 60 \N 5000
+4852 71 399 45771 60 \N 5000
+4853 71 399 45782 60 \N 5000
+4854 71 399 45751 60 \N 5000
+4855 71 399 45752 60 \N 5000
+4856 71 399 45788 60 \N 5000
+4857 71 399 49054 60 \N 5000
+4858 71 399 36210 960 \N 5002
+4859 71 399 43997 960 \N 5002
+4860 71 399 44281 1080 \N 5003
+4861 0 404 41759 0 \N 5000
+4862 0 405 42197 0 \N 30
+4863 0 406 41870 0 \N 40
+4864 0 407 41788 0 \N 14
+4865 0 408 41796 0 \N 10
+4866 0 410 41839 0 \N 3
+4867 0 411 41759 0 \N 5000
+4868 73 411 36210 60 \N 5000
+4869 73 411 43997 60 \N 5000
+4870 73 411 44198 60 \N 5000
+4871 73 411 62023 60 \N 5000
+4872 74 409 45788 60 \N 21
+4873 74 410 45914 60 \N 3
+4874 74 410 45771 60 \N 3
+4875 74 410 45788 60 \N 3
+4876 74 410 45866 60 \N 3
+4877 74 407 45793 60 \N 14
+4878 74 407 44198 60 \N 14
+4879 74 407 45927 60 \N 14
+4880 74 407 65640 60 \N 14
+4881 74 407 49481 60 \N 14
+4882 74 407 45771 60 \N 14
+4883 74 407 43996 60 \N 14
+4884 74 407 45868 60 \N 14
+4885 74 407 45811 60 \N 14
+4886 74 407 45945 60 \N 14
+4887 74 407 44219 60 \N 14
+4888 74 407 45788 60 \N 14
+4889 74 407 45759 60 \N 14
+4890 74 407 45969 960 \N 14
+4891 74 407 44198 960 \N 14
+4892 74 407 65702 960 \N 14
+4893 74 407 44001 960 \N 14
+4894 74 407 65640 1200 \N 16
+4895 74 407 65702 1200 \N 16
+4896 74 407 49481 1320 \N 16
+4897 74 407 44249 1380 \N 2
+4898 74 407 46343 1440 \N 2
+4899 74 407 45793 1500 \N 2
+4900 74 404 36210 60 \N 5000
+4901 74 404 48960 120 \N 5001
+4902 74 404 44198 120 \N 5001
+4903 74 404 45771 120 \N 5001
+4904 74 404 45901 120 \N 5001
+4905 74 404 45782 120 \N 5001
+4906 74 404 45751 120 \N 5001
+4907 74 404 45752 120 \N 5001
+4908 74 404 45818 120 \N 5001
+4909 74 404 45788 120 \N 5001
+4910 74 404 44198 660 \N 5003
+4911 74 404 49054 1020 \N 5003
+4912 74 404 62023 1020 \N 5003
+4913 74 408 45760 60 \N 10
+4914 74 408 45864 120 \N 10
+4915 74 408 45900 120 \N 10
+4916 74 408 48676 240 \N 11
+4917 74 408 44359 3900 \N 11
+4918 74 408 45793 3960 \N 8
+4919 74 408 45771 3960 \N 8
+4920 74 408 45759 3960 \N 8
+4921 74 406 45793 60 \N 40
+4922 74 406 45763 60 \N 40
+4923 74 406 -100 60 \N 40
+4924 74 406 45759 60 \N 40
+4925 74 406 44359 60 \N 40
+4926 74 406 44004 360 \N 41
+4927 74 406 45866 420 \N 41
+4928 74 406 45827 480 \N 41
+4929 74 406 61832 540 \N 41
+4930 74 405 48577 60 \N 30
+4931 74 405 44198 60 \N 30
+4932 74 405 49020 60 \N 30
+4933 74 405 45771 60 \N 30
+4934 74 405 48880 60 \N 30
+4935 74 405 35733 60 \N 30
+4936 74 405 49083 60 \N 30
+4937 74 405 45788 60 \N 30
+4938 74 405 43997 60 \N 30
+4939 74 405 45983 60 \N 30
+4940 74 405 63811 660 \N 31
+4941 74 405 49649 1620 \N 31
+4942 0 412 41839 0 \N 3
+4943 0 414 41759 0 \N 5000
+4944 0 415 42197 0 \N 30
+4945 0 416 41788 0 \N 14
+4946 0 417 41870 0 \N 40
+4947 0 418 41796 0 \N 10
+4948 76 413 45793 60 \N 21
+4949 76 412 45866 60 \N 3
+4951 76 412 45838 60 \N 3
+4952 76 412 45870 60 \N 3
+4953 76 412 44206 60 \N 3
+4950 76 412 45763 60 360 3
+4954 76 418 45801 60 \N 10
+4955 76 418 45866 60 \N 10
+4956 76 418 45838 60 \N 10
+4957 76 418 44349 60 \N 10
+4958 76 418 45788 60 \N 10
+4959 76 418 45853 60 \N 10
+4960 76 418 45811 420 \N 10
+4961 76 418 45900 420 \N 10
+4962 76 418 48822 420 \N 10
+4963 76 418 45830 420 \N 10
+4964 76 418 35849 960 \N 11
+4965 76 418 45892 960 \N 11
+4966 76 418 45870 960 \N 11
+4967 76 418 45911 1320 \N 11
+4968 76 418 44004 3180 \N 11
+4969 76 418 65695 3180 \N 11
+4970 76 418 48676 4200 \N 11
+4971 76 418 44250 7860 \N 11
+4972 76 416 49481 60 \N 14
+4973 76 416 45770 60 \N 14
+4974 76 416 43996 60 \N 14
+4975 76 416 45811 60 \N 14
+4976 76 416 45945 60 \N 14
+4977 76 416 45948 60 \N 14
+4978 76 416 44219 60 \N 14
+4979 76 416 45788 60 \N 14
+4980 76 416 45759 60 \N 14
+4981 76 416 44198 600 \N 15
+4982 76 416 45927 600 \N 15
+4983 76 416 45872 960 \N 15
+4984 76 416 61993 960 \N 15
+4985 76 416 44001 960 \N 15
+4986 76 416 49481 1140 \N 16
+4987 76 416 45771 1200 \N 2
+4988 76 415 45811 60 \N 30
+4989 76 415 45763 60 \N 30
+4990 76 415 45788 60 \N 30
+4991 76 415 45759 60 \N 30
+4992 76 415 45983 60 \N 30
+4993 76 415 45792 360 \N 30
+4994 76 415 48577 1320 \N 30
+4995 76 415 61826 1320 \N 30
+4996 76 415 63811 1320 \N 30
+4997 76 415 48880 1320 \N 30
+4998 76 415 62167 1320 \N 30
+4999 76 415 49083 1320 \N 30
+5000 76 415 49020 1320 \N 30
+5001 76 415 44595 2220 \N 30
+5002 76 415 43997 2220 \N 30
+5003 76 415 35733 2220 \N 30
+5004 76 417 45801 60 \N 40
+5005 76 417 45866 60 \N 40
+5006 76 417 46236 60 \N 40
+5007 76 417 45870 60 \N 40
+5008 76 417 44327 60 \N 40
+5009 76 417 44004 360 \N 43
+5010 76 417 35968 420 \N 43
+5011 76 417 49251 480 \N 43
+5012 76 417 -100 480 \N 43
+5013 76 417 61832 600 \N 41
+5014 76 417 62105 600 \N 41
+5015 76 417 45763 600 \N 41
+5016 76 414 44420 60 \N 5000
+5017 76 414 45801 60 \N 5000
+5018 76 414 45771 60 \N 5000
+5019 76 414 45901 60 \N 5000
+5020 76 414 46160 60 \N 5000
+5021 76 414 45782 60 \N 5000
+5022 76 414 45751 60 \N 5000
+5023 76 414 45752 60 \N 5000
+5024 76 414 45945 60 \N 5000
+5025 76 414 45788 60 \N 5000
+5026 76 414 36210 960 \N 5000
+5027 76 414 44198 1020 \N 5001
+5028 0 419 41839 0 \N 3
+5029 0 421 41759 0 \N 5000
+5030 0 422 42197 0 \N 30
+5031 0 423 41788 0 \N 14
+5032 0 424 41870 0 \N 40
+5033 0 425 41796 0 \N 10
+5034 76 420 45793 60 \N 21
+5035 76 420 45751 1020 \N 21
+5036 76 420 45763 1020 \N 21
+5037 76 420 45919 1020 \N 21
+5038 77 419 45818 60 \N 3
+5039 77 419 45788 60 \N 3
+5040 77 419 45838 60 \N 3
+5041 77 421 48960 60 \N 5000
+5042 77 421 45955 60 \N 5000
+5043 77 421 44198 60 \N 5000
+5044 77 421 45801 60 \N 5000
+5045 77 421 45771 60 \N 5000
+5046 77 421 45901 60 \N 5000
+5047 77 421 36210 60 \N 5000
+5048 77 421 45751 60 \N 5000
+5049 77 421 45752 60 \N 5000
+5050 77 421 44281 60 \N 5000
+5051 77 421 45788 60 \N 5000
+5052 77 421 43997 60 \N 5000
+5053 77 421 49054 60 \N 5000
+5054 77 421 45792 960 \N 5003
+5055 77 421 63923 960 \N 5003
+5056 77 421 45782 960 \N 5003
+5057 0 426 41796 0 \N 10
+5058 77 426 45801 60 \N 10
+5059 77 426 45771 60 \N 10
+5060 77 426 45900 60 \N 10
+5061 77 426 45870 60 \N 10
+5062 77 426 44349 60 \N 10
+5063 77 426 45788 60 \N 10
+5064 77 426 45853 60 \N 10
+5065 77 426 49073 960 \N 11
+5066 77 426 44011 960 \N 11
+5067 77 426 44388 960 \N 11
+5068 77 426 46309 960 \N 11
+5069 77 426 45870 4800 \N 11
+5070 77 426 44359 4800 \N 11
+5071 77 426 65672 4920 \N 8
+5072 77 423 44198 60 \N 14
+5073 77 423 49481 60 \N 14
+5074 77 423 45770 60 \N 14
+5075 77 423 45771 60 \N 14
+5076 77 423 45811 60 \N 14
+5077 77 423 50200 60 \N 14
+5078 77 423 45945 60 \N 14
+5079 77 423 44219 60 \N 14
+5080 77 423 45788 60 \N 14
+5081 77 423 45866 60 \N 14
+5082 77 423 45759 60 \N 14
+5083 77 423 65640 720 \N 15
+5084 77 423 45875 720 \N 15
+5085 77 423 44255 720 \N 15
+5086 77 423 43996 720 \N 15
+5087 77 423 45927 720 \N 15
+5088 77 423 45969 1020 \N 14
+5089 77 423 48822 1020 \N 14
+5090 77 423 45872 1140 \N 15
+5091 77 423 61976 1140 \N 15
+5092 77 423 65702 1140 \N 15
+5093 77 423 49481 1320 \N 16
+5094 77 424 45900 60 \N 40
+5095 77 424 45866 60 \N 40
+5096 77 424 45771 60 \N 40
+5097 77 424 45788 60 \N 40
+5098 77 424 45870 60 \N 40
+5099 77 424 -100 360 \N 40
+5100 77 424 45866 960 \N 41
+5101 77 422 48577 60 \N 30
+5102 77 422 45763 60 \N 30
+5103 77 422 44198 60 \N 30
+5104 77 422 45788 60 \N 30
+5105 77 422 45866 60 \N 30
+5106 77 422 48880 60 \N 30
+5107 77 422 63811 60 \N 30
+5108 77 422 35733 60 \N 30
+5109 77 422 44281 60 \N 30
+5110 77 422 49083 60 \N 30
+5111 77 422 49020 60 \N 30
+5112 77 422 43997 60 \N 30
+5113 77 422 45983 60 \N 30
+5114 0 427 41759 0 \N 5000
+5115 0 428 41839 0 \N 3
+5116 0 430 42197 0 \N 30
+5117 0 431 41788 0 \N 14
+5118 0 432 41870 0 \N 40
+5119 0 433 41796 0 \N 10
+5120 78 429 45793 60 1020 21
+5121 78 428 45771 60 \N 3
+5122 78 428 45788 60 \N 3
+5123 78 428 45838 60 \N 3
+5124 78 428 45763 60 \N 3
+5125 78 428 45870 60 \N 3
+5126 78 431 45793 60 \N 14
+5127 78 431 44198 60 \N 14
+5128 78 431 49481 60 \N 14
+5129 78 431 45866 60 \N 14
+5130 78 431 45771 60 \N 14
+5131 78 431 45811 60 \N 14
+5132 78 431 45945 60 \N 14
+5133 78 431 48954 60 \N 14
+5134 78 431 44219 60 \N 14
+5135 78 431 45948 60 \N 14
+5136 78 431 45969 960 \N 15
+5137 78 431 45770 960 \N 15
+5138 78 431 45759 960 \N 15
+5139 78 431 65640 1140 \N 15
+5140 78 431 45955 1140 \N 15
+5141 78 431 45927 1140 \N 15
+5142 78 431 43996 1140 \N 15
+5143 78 431 63759 1140 \N 15
+5144 78 431 61993 1680 \N 14
+5145 78 431 46028 1680 \N 14
+5146 78 431 65702 1680 \N 14
+5147 78 431 45903 1680 \N 14
+5148 78 431 62151 1920 \N 16
+5149 78 431 49481 1980 \N 16
+5150 78 431 44249 2040 \N 2
+5151 78 430 48577 60 \N 30
+5152 78 430 45763 60 \N 30
+5153 78 430 45766 60 \N 30
+5154 78 430 44198 60 \N 30
+5155 78 430 62151 60 \N 30
+5156 78 430 46160 60 \N 30
+5157 78 430 45788 60 \N 30
+5158 78 430 45866 60 \N 30
+5159 78 430 48880 60 \N 30
+5160 78 430 48561 60 \N 30
+5161 78 430 45752 60 \N 30
+5162 78 430 44281 60 \N 30
+5163 78 430 49083 60 \N 30
+5164 78 430 49020 60 \N 30
+5165 78 430 45802 60 \N 30
+5166 78 430 44017 960 \N 30
+5167 78 430 45972 960 \N 30
+5168 78 430 35733 960 \N 30
+5169 78 430 43997 960 \N 30
+5170 78 430 62103 1200 \N 31
+5171 78 432 49251 60 \N 40
+5172 78 432 35846 60 \N 40
+5173 78 432 45866 60 \N 40
+5174 78 432 45806 60 \N 40
+5175 78 432 45763 60 \N 40
+5176 78 432 45838 60 \N 40
+5177 78 432 45788 60 \N 40
+5178 78 432 -100 480 \N 43
+5179 78 432 60178 480 \N 43
+5180 78 432 45963 480 \N 43
+5181 78 432 44004 480 \N 43
+5182 78 432 45818 1620 \N 41
+5183 78 432 65695 1620 \N 41
+5184 78 432 45824 2640 \N 41
+5185 78 427 45766 60 \N 5000
+5186 78 427 44198 60 \N 5000
+5187 78 427 62151 60 \N 5000
+5188 78 427 45801 60 \N 5000
+5189 78 427 45866 60 \N 5000
+5190 78 427 45771 60 \N 5000
+5191 78 427 46160 60 \N 5000
+5192 78 427 45782 60 \N 5000
+5193 78 427 45752 60 \N 5000
+5194 78 427 44281 60 \N 5000
+5195 78 427 45788 60 \N 5000
+5196 78 427 45802 60 \N 5000
+5197 78 427 36210 780 \N 5002
+5198 78 433 45806 60 \N 10
+5199 78 433 45763 60 \N 10
+5200 78 433 45830 60 \N 10
+5201 78 433 45870 60 \N 10
+5202 78 433 45866 60 \N 10
+5203 78 433 45838 60 \N 10
+5204 78 433 44349 60 \N 10
+5205 78 433 46030 60 \N 10
+5206 78 433 45788 60 \N 10
+5207 78 433 45853 60 \N 10
+5208 78 433 45801 660 \N 10
+5209 78 433 46160 780 \N 10
+5210 78 433 45750 780 \N 10
+5211 78 433 45919 960 \N 10
+5212 78 433 45864 1080 \N 10
+5213 78 433 45921 1080 \N 10
+5214 78 433 61832 2100 \N 11
+5215 78 433 44004 3960 \N 11
+5216 78 433 44206 4020 \N 11
+5217 78 433 45870 4020 \N 11
+5218 78 433 65641 5040 \N 11
+5219 0 435 41839 0 \N 3
+5220 0 436 41759 0 \N 5000
+5221 0 437 42197 0 \N 30
+5222 0 438 41788 0 \N 14
+5223 0 439 41870 0 \N 40
+5224 0 440 41796 0 \N 10
+5225 75 434 45788 60 \N 21
+5226 75 434 46050 1020 \N 21
+5227 75 434 44198 1020 \N 21
+5228 75 434 35850 1020 \N 21
+5229 75 434 45811 1020 \N 21
+5230 75 434 48916 1020 \N 21
+5231 75 434 44021 1020 \N 21
+5232 75 434 44283 1020 \N 21
+5233 75 435 45866 60 \N 3
+5234 75 435 45771 60 \N 3
+5235 75 435 45838 60 \N 3
+5236 75 435 44206 60 \N 3
+5237 75 435 45870 60 \N 3
+5238 75 435 45818 60 \N 3
+5239 75 435 45788 60 \N 3
+5240 75 435 44256 1380 \N 3
+5241 75 435 44212 1380 \N 3
+5242 75 435 45914 1380 \N 3
+5243 75 435 45892 1380 \N 3
+5244 75 435 61837 1380 \N 3
+5245 75 440 45762 60 \N 10
+5246 75 440 46020 60 \N 10
+5247 75 440 45830 60 \N 10
+5248 75 440 45866 60 \N 10
+5249 75 440 45771 60 \N 10
+5250 75 440 45853 60 \N 10
+5251 75 440 44349 60 \N 10
+5252 75 440 45818 60 \N 10
+5253 75 440 45788 60 \N 10
+5254 75 440 45914 60 \N 10
+5255 75 440 62176 3660 \N 10
+5264 75 440 60178 5460 \N 12
+5258 75 440 46183 3720 5460 10
+5257 75 440 46090 3720 5460 10
+5262 75 440 45759 3720 5460 10
+5261 75 440 45770 3720 5460 10
+5259 75 440 45751 3720 5460 10
+5332 75 439 44352 1080 \N 43
+5260 75 440 45977 3720 5460 10
+5263 75 440 49207 4140 5460 12
+5256 75 440 44359 3720 5520 10
+5265 75 440 45900 5520 \N 12
+5266 75 440 48822 5520 \N 12
+5267 75 440 45806 5640 \N 8
+5268 78 438 45770 60 \N 14
+5269 78 438 45771 60 \N 14
+5270 78 438 44439 60 \N 14
+5271 78 438 45759 60 \N 14
+5272 78 438 45788 60 \N 14
+5273 78 438 61823 60 \N 14
+5274 78 438 45866 420 \N 14
+5275 78 438 45811 420 \N 14
+5276 78 438 49481 540 \N 14
+5277 78 438 44198 600 \N 15
+5278 78 438 61323 660 \N 15
+5279 78 438 63745 960 \N 15
+5280 78 438 45927 1020 \N 15
+5281 78 438 61975 1020 \N 15
+5282 78 438 45872 1140 \N 14
+5283 78 438 61993 1140 \N 14
+5284 78 438 49481 1260 \N 16
+5285 78 438 45788 1320 \N 2
+5286 78 438 45759 1320 \N 2
+5287 75 437 45752 60 \N 30
+5288 75 437 44439 60 \N 30
+5289 75 437 48732 60 \N 30
+5290 75 437 45901 60 \N 30
+5291 75 437 61823 60 \N 30
+5292 75 437 45771 360 \N 30
+5293 75 437 45788 360 \N 30
+5294 75 437 45866 480 \N 30
+5295 75 437 63811 1440 \N 30
+5296 75 437 62167 1440 \N 30
+5297 75 437 44017 1560 \N 30
+5298 75 437 35733 1560 \N 30
+5299 75 437 43997 1560 \N 30
+5300 75 437 45873 1740 \N 31
+5301 75 437 45983 1800 \N 31
+5302 75 436 48960 60 \N 5000
+5303 75 436 45955 60 \N 5000
+5304 75 436 44198 60 \N 5000
+5305 75 436 45801 60 \N 5000
+5306 75 436 45771 60 \N 5000
+5307 75 436 63923 60 \N 5000
+5308 75 436 45782 60 \N 5000
+5309 75 436 45751 60 \N 5000
+5310 75 436 45752 60 \N 5000
+5311 75 436 45788 60 \N 5000
+5312 75 436 49054 60 \N 5000
+5313 75 436 45792 960 \N 5002
+5314 75 436 45225 960 \N 5002
+5315 75 436 36210 960 \N 5002
+5316 75 436 45866 960 \N 5002
+5317 75 436 45806 960 \N 5002
+5318 75 439 62176 60 \N 40
+5319 75 439 35968 120 \N 40
+5320 75 439 45770 120 \N 40
+5321 75 439 45771 120 \N 40
+5322 75 439 45806 120 \N 40
+5323 75 439 45818 120 \N 40
+5324 75 439 45788 120 \N 40
+5325 75 439 45866 120 \N 40
+5326 75 439 45759 120 \N 40
+5327 75 439 49251 780 \N 43
+5328 75 439 50400 780 \N 43
+5329 75 439 45811 780 \N 43
+5330 75 439 45900 780 \N 43
+5331 75 439 48822 780 \N 43
+5333 75 439 -100 1140 \N 43
+5334 0 441 41839 0 \N 3
+5335 0 443 41759 0 \N 5000
+5336 0 444 42197 0 \N 30
+5337 0 445 41788 0 \N 14
+5338 0 446 41870 0 \N 40
+5339 0 447 41796 0 \N 10
+5340 79 442 45793 60 \N 21
+5341 79 441 45771 60 \N 3
+5342 79 441 45788 60 \N 3
+5343 79 441 45870 60 \N 3
+5344 79 443 45955 60 \N 5000
+5345 79 443 44198 60 \N 5000
+5346 79 443 45801 60 \N 5000
+5347 79 443 45771 60 \N 5000
+5348 79 443 45901 60 \N 5000
+5349 79 443 45751 60 \N 5000
+5350 79 443 45752 60 \N 5000
+5351 79 443 45788 60 \N 5000
+5352 79 443 44281 540 \N 5002
+5353 79 443 44252 540 \N 5002
+5354 79 443 43997 540 \N 5002
+5355 79 443 44439 960 \N 5003
+5356 79 443 63923 1020 \N 5003
+5357 79 447 45763 60 \N 10
+5358 79 447 48871 60 \N 10
+5359 79 447 45801 60 \N 10
+5360 79 447 63923 60 \N 10
+5361 79 447 45788 60 \N 10
+5362 79 447 45853 60 \N 10
+5363 79 447 45864 420 \N 10
+5364 79 447 45866 420 \N 10
+5365 79 447 45900 420 \N 10
+5366 79 447 46309 420 \N 10
+5367 79 447 45870 420 \N 10
+5368 79 447 44586 960 \N 11
+5369 79 447 44349 960 \N 11
+5370 79 447 44388 960 \N 11
+5371 79 447 45901 960 \N 11
+5372 79 447 35733 960 \N 11
+5373 79 447 48522 1260 \N 11
+5374 79 447 44359 4920 \N 11
+5375 79 447 61832 4980 \N 8
+5376 79 446 45866 60 \N 40
+5377 79 446 45801 120 \N 40
+5378 79 446 45763 120 \N 40
+5379 79 446 45788 120 \N 40
+5380 79 446 45853 120 \N 40
+5381 79 446 45870 120 \N 40
+5382 79 446 48822 420 \N 40
+5383 79 446 44000 480 \N 40
+5384 79 446 -100 480 \N 40
+5385 79 446 44294 480 \N 40
+5386 79 446 61832 660 \N 41
+5387 79 445 45763 60 \N 14
+5388 79 445 45801 60 \N 14
+5389 79 445 45866 60 \N 14
+5390 79 445 44439 60 \N 14
+5391 79 445 44219 60 \N 14
+5392 79 445 45788 60 \N 14
+5393 79 445 45770 60 \N 14
+5394 79 445 45759 60 \N 14
+5395 79 445 46096 540 \N 14
+5396 79 445 62144 540 \N 14
+5397 79 445 45910 540 \N 14
+5398 79 445 46136 540 \N 14
+5399 79 445 44001 960 \N 14
+5400 79 445 65702 960 \N 14
+5401 79 445 45927 960 \N 14
+5402 79 445 49481 960 \N 14
+5403 79 445 45872 960 \N 14
+5404 79 445 61993 960 \N 14
+5405 79 445 45945 960 \N 14
+5406 79 445 49481 1380 \N 16
+5407 79 445 43996 1440 \N 2
+5408 79 445 35733 1440 \N 2
+5409 79 444 44281 60 \N 30
+5410 79 444 45763 60 \N 30
+5411 79 444 45788 60 \N 30
+5412 79 444 45983 60 \N 30
+5413 79 444 44439 300 \N 30
+5414 79 444 62011 360 \N 30
+5415 79 444 50685 360 \N 30
+5416 79 444 45901 360 \N 30
+5417 79 444 45782 360 \N 30
+5418 79 444 49079 360 \N 30
+5419 79 444 48577 1560 \N 30
+5420 79 444 63811 1560 \N 30
+5421 79 444 44586 1560 \N 30
+5422 79 444 63767 1560 \N 30
+5423 79 444 45966 1560 \N 30
+5424 79 444 48880 1560 \N 30
+5425 79 444 35733 1560 \N 30
+5426 79 444 62167 1560 \N 30
+5427 79 444 49083 1560 \N 30
+5428 79 444 49020 1560 \N 30
+5429 79 444 43997 1560 \N 30
+5430 79 444 49054 2460 \N 31
+5431 0 448 41839 0 \N 3
+5432 0 450 41759 0 \N 5000
+5433 0 451 42197 0 \N 30
+5434 0 452 41788 0 \N 14
+5435 0 453 41870 0 \N 40
+5436 0 454 41796 0 \N 10
+5438 80 449 45955 1080 \N 21
+5439 80 449 45797 1080 \N 21
+5440 80 449 45894 1080 \N 21
+5441 80 449 49353 1080 \N 21
+5442 80 449 45866 1080 \N 21
+5443 80 449 45771 1080 \N 21
+5444 80 449 45900 1080 \N 21
+5445 80 449 45901 1080 \N 21
+5446 80 449 45806 1080 \N 21
+5447 80 449 46160 1080 \N 21
+5448 80 449 45778 1080 \N 21
+5450 80 449 45750 1080 \N 21
+5451 80 449 45751 1080 \N 21
+5452 80 449 45752 1080 \N 21
+5453 80 449 46041 1080 \N 21
+5454 80 449 45818 1080 \N 21
+5455 80 449 44206 2100 \N 21
+5437 80 449 45793 60 3060 21
+5449 80 449 45811 1080 3060 21
+5456 80 448 45763 60 \N 3
+5457 80 448 45866 60 \N 3
+5458 80 448 45771 60 \N 3
+5459 80 448 45870 60 \N 3
+5460 80 448 44206 60 \N 3
+5461 80 448 49251 60 \N 3
+5462 80 448 45838 60 \N 3
+5463 80 448 45818 60 \N 3
+5464 80 448 45788 60 \N 3
+5465 80 448 44256 1500 \N 3
+5466 80 448 63714 1500 \N 3
+5467 80 448 48532 1500 \N 3
+5468 80 448 62037 1500 \N 3
+5469 80 451 63811 60 \N 30
+5470 80 451 44198 60 \N 30
+5471 80 451 45798 60 \N 30
+5472 80 451 45771 60 \N 30
+5473 80 451 56492 60 \N 30
+5474 80 451 45811 60 \N 30
+5475 80 451 62167 60 \N 30
+5476 80 451 45788 60 \N 30
+5477 80 451 48880 1440 \N 30
+5478 80 451 48577 1440 \N 30
+5479 80 451 48586 1440 \N 30
+5480 80 451 49020 1440 \N 30
+5481 80 451 35733 2580 \N 30
+5482 80 451 44615 2580 \N 30
+5483 80 451 45776 2700 \N 31
+5484 80 451 49083 2700 \N 31
+5485 80 451 62103 2700 \N 31
+5486 80 451 46103 2700 \N 31
+5487 80 450 48960 60 \N 5000
+5488 80 450 45955 60 \N 5000
+5489 80 450 44198 60 \N 5000
+5490 80 450 62023 60 \N 5000
+5491 80 450 45801 60 \N 5000
+5492 80 450 45771 60 \N 5000
+5493 80 450 45901 60 \N 5000
+5494 80 450 36210 60 \N 5000
+5495 80 450 45782 60 \N 5000
+5496 80 450 45751 60 \N 5000
+5497 80 450 45752 60 \N 5000
+5498 80 450 45788 60 \N 5000
+5499 80 450 43997 60 \N 5000
+5500 80 450 49054 60 \N 5000
+5501 80 450 45866 900 \N 5003
+5502 80 450 45811 900 \N 5003
+5503 80 450 45955 1020 \N 5003
+5504 80 454 62144 60 \N 10
+5505 80 454 45921 60 \N 10
+5506 80 454 45830 60 \N 10
+5507 80 454 45864 60 \N 10
+5508 80 454 45801 60 \N 10
+5509 80 454 45771 60 \N 10
+5510 80 454 45870 60 \N 10
+5511 80 454 35849 60 \N 10
+5512 80 454 45788 60 \N 10
+5513 80 454 45853 60 \N 10
+5514 80 454 44004 1560 \N 11
+5515 80 454 46030 1620 \N 11
+5516 80 454 48871 1680 \N 11
+5517 80 454 48522 2640 \N 11
+5518 80 454 65672 2700 \N 11
+5519 80 454 48676 2700 \N 11
+5520 80 454 44359 6420 \N 11
+5521 80 452 44198 60 \N 14
+5522 80 452 45771 60 \N 14
+5523 80 452 48815 60 \N 14
+5524 80 452 45945 60 \N 14
+5525 80 452 44219 60 \N 14
+5526 80 452 45788 60 \N 14
+5527 80 452 61823 60 \N 14
+5528 80 452 45969 1380 \N 14
+5529 80 452 43996 1380 \N 14
+5530 80 452 35733 1380 \N 14
+5531 80 452 45927 1380 \N 14
+5532 80 452 46078 1620 \N 15
+5533 80 452 45759 2580 \N 15
+5534 80 452 65640 2640 \N 15
+5535 80 452 45788 2640 \N 15
+5536 80 452 65640 3660 \N 14
+5537 80 452 65646 3660 \N 14
+5538 80 452 65640 3780 \N 14
+5539 80 452 45801 3780 \N 14
+5540 80 452 62027 3780 \N 14
+5541 80 452 49173 3780 \N 14
+5542 80 452 46343 3780 \N 14
+5543 80 452 65640 4980 \N 14
+5544 80 452 45872 4980 \N 14
+5545 80 452 44001 4980 \N 14
+5546 80 452 49481 5160 \N 16
+5547 80 452 45788 5220 \N 2
+5548 80 452 45869 6180 \N 2
+5549 80 453 49251 60 \N 40
+5550 80 453 45801 60 \N 40
+5551 80 453 45866 60 \N 40
+5552 80 453 45838 60 \N 40
+5553 80 453 45763 60 \N 40
+5554 80 453 45818 60 \N 40
+5555 80 453 45788 60 \N 40
+5556 80 453 45853 60 \N 40
+5557 80 453 45759 60 \N 40
+5558 80 453 62176 1500 \N 43
+5559 80 453 49251 1560 \N 43
+5560 80 453 -100 1560 \N 43
+5561 80 453 45866 3480 \N 41
+5562 80 453 45811 3480 \N 41
+5563 80 453 47146 3480 \N 41
+5564 80 453 44004 3660 \N 41
+5565 0 455 41839 0 \N 3
+5566 0 457 41759 0 \N 5000
+5567 0 458 42197 0 \N 30
+5568 0 459 41788 0 \N 14
+5569 0 460 41870 0 \N 40
+5570 0 461 41796 0 \N 10
+5571 81 456 45760 60 \N 21
+5572 81 456 45793 60 \N 21
+5573 81 456 45763 60 \N 21
+5574 81 456 44198 60 \N 21
+5575 81 456 45801 1200 \N 21
+5576 81 456 35850 1200 \N 21
+5577 81 455 44256 60 \N 3
+5578 81 455 45892 60 \N 3
+5579 81 455 45866 60 \N 3
+5580 81 455 45771 60 \N 3
+5581 81 455 61837 60 \N 3
+5582 81 455 45870 60 \N 3
+5583 81 455 44206 60 \N 3
+5584 81 455 48532 60 \N 3
+5585 81 455 45838 60 \N 3
+5586 81 455 45818 60 \N 3
+5587 81 455 45788 60 \N 3
+5588 81 455 45759 60 \N 3
+5589 81 460 45793 60 \N 40
+5590 81 460 44004 60 \N 40
+5591 81 460 35846 60 \N 40
+5592 81 460 45801 60 \N 40
+5593 81 460 45770 60 \N 40
+5594 81 460 45771 60 \N 40
+5595 81 460 45806 60 \N 40
+5596 81 460 45866 60 \N 40
+5597 81 460 45759 60 \N 40
+5598 81 460 49251 960 \N 43
+5599 81 460 35968 960 \N 43
+5600 81 460 45963 960 \N 43
+5601 81 460 -100 960 \N 43
+5602 81 460 45811 1200 \N 41
+5603 81 461 45763 60 \N 10
+5604 81 461 44388 60 \N 10
+5605 81 461 45830 60 \N 10
+5606 81 461 48871 60 \N 10
+5607 81 461 45801 60 \N 10
+5608 81 461 44011 60 \N 10
+5609 81 461 45838 60 \N 10
+5610 81 461 45853 60 \N 10
+5611 81 461 45788 60 \N 10
+5612 81 461 44349 60 \N 10
+5613 81 461 45759 60 \N 10
+5614 81 461 45921 960 \N 10
+5615 81 461 48522 960 \N 10
+5616 81 461 45900 960 \N 10
+5617 81 461 45866 960 \N 10
+5618 81 461 62023 960 \N 10
+5619 81 461 46081 4860 \N 11
+5620 81 461 44359 4860 \N 11
+5621 81 461 45770 4860 \N 11
+5622 81 461 46183 4860 \N 11
+5623 81 461 48628 4860 \N 11
+5624 81 461 45751 4860 \N 11
+5625 81 461 45977 4860 \N 11
+5626 81 461 46090 4860 \N 11
+5627 81 461 45870 5340 \N 8
+5628 81 458 45770 60 \N 30
+5629 81 458 45771 60 \N 30
+5630 81 458 63735 60 \N 30
+5631 81 458 45759 60 \N 30
+5632 81 458 45788 60 \N 30
+5633 81 458 45983 60 \N 30
+5634 81 458 63811 4140 \N 33
+5635 81 458 62167 4140 \N 33
+5636 81 458 48577 4260 \N 33
+5637 81 458 48770 4260 \N 33
+5638 81 458 48603 4260 \N 33
+5639 81 458 49142 4260 \N 33
+5640 81 458 63761 4260 \N 33
+5641 81 458 48519 4260 \N 33
+5642 81 458 48880 4260 \N 33
+5643 81 458 48529 4260 \N 33
+5644 81 458 61973 4260 \N 33
+5645 81 458 46006 4260 \N 33
+5646 81 458 62103 4260 \N 33
+5647 81 458 48752 4260 \N 33
+5648 81 458 49083 4260 \N 33
+5649 81 458 49020 4260 \N 33
+5650 81 458 50654 4260 \N 33
+5651 81 458 49109 4260 \N 33
+5652 81 458 45972 5220 \N 33
+5653 81 458 35733 5220 \N 33
+5654 81 458 48486 5220 \N 33
+5655 81 458 43997 5220 \N 33
+5656 81 458 44198 5460 \N 31
+5657 81 458 44281 5520 \N 31
+5658 81 458 48728 5580 \N 31
+5659 81 457 45873 60 \N 5000
+5660 81 457 45771 60 \N 5000
+5661 81 457 45788 60 \N 5000
+5662 81 457 45901 60 \N 5000
+5663 81 457 45801 60 \N 5000
+5664 81 457 36210 1260 \N 5000
+5665 81 457 45972 1260 \N 5000
+5666 81 457 43997 1260 \N 5000
+5667 81 457 44198 1440 \N 5001
+5668 81 457 50554 1500 \N 5003
+5669 81 457 48960 1560 \N 5003
+5670 81 459 49481 60 \N 14
+5671 81 459 45770 60 \N 14
+5672 81 459 45771 60 \N 14
+5673 81 459 43996 60 \N 14
+5674 81 459 45969 60 \N 14
+5675 81 459 45811 60 \N 14
+5676 81 459 45945 60 \N 14
+5677 81 459 45948 60 \N 14
+5678 81 459 44219 60 \N 14
+5679 81 459 45788 60 \N 14
+5680 81 459 45759 60 \N 14
+5681 81 459 44001 960 \N 15
+5682 81 459 49481 960 \N 15
+5683 81 459 63720 1080 \N 2
+5684 81 459 45869 1080 \N 2
+5685 81 459 62029 1080 \N 2
+\.
+
+
+--
+-- Name: sim_patient_order_sim_patient_order_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_patient_order_sim_patient_order_id_seq', 5685, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_patient_state.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_patient_state.dump.sql
new file mode 100644
index 00000000..c5241567
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_patient_state.dump.sql
@@ -0,0 +1,1309 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_patient_state; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_patient_state (sim_patient_state_id, sim_patient_id, sim_state_id, relative_time_start, relative_time_end) FROM stdin;
+9 9 3 -7200 \N
+13 6 6 -14400 \N
+7 7 7 -7200 \N
+15 13 3 -7200 \N
+16 14 6 -14400 \N
+17 15 7 -7200 \N
+20 18 7 -7200 \N
+21 19 3 -7200 \N
+22 20 6 -14400 \N
+23 5 13 -7200 0
+42 23 13 -7200 0
+44 24 3 -7200 \N
+45 25 6 -14400 \N
+8 8 9 -36000 0
+18 16 9 -36000 0
+19 17 9 -36000 0
+41 22 9 -36000 0
+49 16 21 0 \N
+50 17 21 0 \N
+51 22 21 0 \N
+47 8 21 0 1440
+53 8 18 1440 \N
+43 23 14 0 0
+54 23 17 0 0
+55 23 15 0 1620
+56 23 14 1620 1620
+57 23 14 1620 4800
+58 23 16 4800 4860
+59 23 2 4860 \N
+63 28 9 -36000 0
+65 29 3 -7200 \N
+66 30 6 -14400 \N
+67 31 13 -7200 0
+64 28 21 0 2580
+69 28 18 2580 \N
+68 31 14 0 0
+70 31 17 0 0
+71 31 15 0 1680
+72 31 14 1680 1860
+73 31 16 1860 2940
+74 31 2 2940 \N
+75 32 3 -7200 \N
+76 33 9 -36000 0
+78 34 6 -14400 \N
+79 35 13 -7200 0
+77 33 21 0 1980
+81 33 18 1980 5580
+82 33 20 5580 \N
+80 35 14 0 300
+83 35 14 300 480
+84 35 17 480 480
+85 35 15 480 480
+86 35 17 480 480
+87 35 15 480 1560
+88 35 14 1560 1560
+89 35 14 1560 1560
+90 35 16 1560 3720
+91 35 2 3720 \N
+92 36 9 -36000 0
+94 37 3 -7200 \N
+95 38 6 -14400 \N
+96 39 13 -7200 0
+93 36 21 0 2220
+98 36 18 2220 5820
+99 36 20 5820 \N
+97 39 14 0 0
+100 39 17 0 0
+101 39 15 0 1680
+102 39 17 1680 1680
+103 39 15 1680 1860
+104 39 14 1860 1860
+105 39 14 1860 2280
+106 39 16 2280 2520
+107 39 2 2520 \N
+120 48 30 0 \N
+178 61 10 0 \N
+600 49 40 0 \N
+187 65 3 -7200 \N
+188 66 5000 0 \N
+189 67 30 0 \N
+190 68 13 -7200 0
+191 68 14 0 \N
+192 69 40 0 \N
+193 70 10 0 \N
+194 71 3 -7200 \N
+195 72 9 -36000 0
+199 75 13 -7200 0
+204 79 13 -7200 0
+196 72 21 0 1200
+208 72 18 1200 \N
+197 73 5000 0 60
+209 73 5002 60 960
+210 73 5003 960 \N
+200 75 14 0 60
+211 75 14 60 960
+212 75 17 960 960
+213 75 15 960 960
+214 75 17 960 960
+215 75 15 960 960
+216 75 14 960 1200
+217 75 16 1200 1320
+218 75 2 1320 \N
+201 76 40 0 600
+219 76 46 600 600
+220 76 43 600 720
+221 76 41 720 \N
+222 82 10 0 60
+223 82 11 60 4740
+224 82 8 4740 \N
+198 74 30 0 960
+225 74 31 960 \N
+226 83 9 -36000 0
+228 84 3 -7200 \N
+227 83 21 0 960
+229 83 18 960 \N
+202 77 5000 0 60
+230 77 5002 60 1680
+231 77 5003 1680 \N
+205 79 14 0 60
+232 79 17 60 60
+233 79 15 60 1860
+234 79 4 1860 \N
+203 78 30 0 2760
+235 78 31 2760 \N
+206 80 40 0 60
+236 80 45 60 60
+237 80 43 60 780
+238 80 41 780 \N
+207 81 10 0 60
+239 81 11 60 6000
+240 81 8 6000 \N
+241 85 3 -7200 \N
+24 5 14 0 60
+242 86 9 -36000 0
+243 86 21 0 \N
+244 87 5000 0 \N
+246 89 13 -7200 0
+247 89 14 0 \N
+250 92 3 -7200 \N
+251 93 9 -36000 0
+252 93 21 0 \N
+254 95 13 -7200 0
+249 91 10 0 6120
+258 91 12 6120 \N
+775 263 43 480 540
+261 5 17 60 60
+262 5 15 60 1140
+263 5 17 1140 1140
+264 5 15 1140 1380
+265 5 14 1380 \N
+245 88 30 0 3600
+266 88 33 3600 5940
+267 88 31 5940 \N
+248 90 40 0 960
+268 90 46 960 960
+269 90 43 960 960
+270 90 41 960 \N
+271 98 10 0 \N
+272 99 10 0 \N
+273 100 30 0 1860
+274 100 31 1860 \N
+257 97 10 0 60
+275 97 11 60 3180
+276 97 8 3180 \N
+255 95 14 0 960
+277 95 14 960 1260
+278 95 17 1260 1260
+279 95 15 1260 1560
+280 95 14 1560 1560
+281 95 16 1560 2640
+282 95 2 2640 \N
+253 94 5000 0 60
+283 94 5002 60 960
+284 94 5003 960 \N
+256 96 40 0 960
+285 96 46 960 960
+286 96 43 960 960
+287 96 45 960 960
+288 96 43 960 1140
+289 96 41 1140 \N
+290 101 5000 0 \N
+292 103 30 0 \N
+293 104 13 -7200 0
+294 104 14 0 \N
+295 105 40 0 \N
+296 106 40 0 \N
+297 107 10 0 \N
+291 102 5000 0 60
+298 102 5002 60 2100
+299 102 5003 2100 \N
+300 108 13 -7200 0
+301 108 14 0 2220
+302 108 14 2220 3180
+303 108 17 3180 3180
+304 108 15 3180 3180
+305 108 17 3180 3180
+306 108 15 3180 3180
+307 108 14 3180 \N
+308 109 10 0 \N
+309 110 3 -7200 \N
+312 113 13 -7200 0
+313 113 14 0 60
+316 113 17 60 60
+317 113 15 60 1500
+318 113 14 1500 1500
+319 113 16 1500 2760
+320 113 2 2760 \N
+315 115 10 0 9000
+321 115 12 9000 10020
+322 115 8 10020 \N
+314 114 40 0 1680
+323 114 43 1680 1740
+324 114 41 1740 \N
+311 112 30 0 1620
+325 112 31 1620 \N
+310 111 5000 0 60
+326 111 5002 60 600
+327 111 5003 600 \N
+328 116 3 -7200 \N
+329 117 9 -36000 0
+330 117 21 0 \N
+333 120 13 -7200 0
+336 122 10 0 1440
+337 122 12 1440 4380
+338 122 8 4380 \N
+334 120 14 0 60
+339 120 14 60 60
+340 120 17 60 60
+341 120 15 60 60
+342 120 17 60 60
+343 120 15 60 1320
+344 120 14 1320 1320
+345 120 14 1320 2580
+346 120 17 2580 2580
+347 120 15 2580 3720
+348 120 17 3720 3720
+349 120 15 3720 5520
+350 120 4 5520 \N
+335 121 40 0 60
+351 121 43 60 2640
+352 121 41 2640 \N
+331 118 5000 0 60
+353 118 5001 60 60
+354 118 5003 60 \N
+332 119 30 0 1020
+355 119 31 1020 \N
+356 123 13 -7200 0
+357 123 14 0 60
+358 123 14 60 420
+359 123 17 420 420
+360 123 15 420 1320
+361 123 17 1320 1320
+362 123 15 1320 1620
+363 123 17 1620 1620
+365 124 13 -7200 0
+366 124 14 0 \N
+367 125 13 -7200 0
+368 125 14 0 \N
+364 123 15 1620 3420
+369 123 4 3420 \N
+370 126 13 -7200 0
+371 126 14 0 60
+372 126 17 60 60
+373 126 15 60 660
+374 126 17 660 660
+375 126 15 660 780
+376 126 17 780 780
+377 126 15 780 1800
+378 126 17 1800 1800
+379 126 15 1800 \N
+121 50 5000 0 \N
+781 265 3 -7200 \N
+380 127 3 -7200 \N
+381 128 9 -36000 0
+382 128 21 0 \N
+385 131 13 -7200 0
+384 130 30 0 3600
+389 130 33 3600 4920
+390 130 31 4920 \N
+387 132 40 0 360
+391 132 41 360 \N
+386 131 14 0 960
+392 131 17 960 960
+393 131 15 960 1260
+394 131 14 1260 2460
+395 131 17 2460 2460
+396 131 15 2460 2520
+397 131 14 2520 2520
+398 131 14 2520 2520
+399 131 16 2520 2940
+400 131 2 2940 \N
+388 133 10 0 960
+401 133 11 960 4860
+402 133 8 4860 \N
+383 129 5000 0 60
+403 129 5002 60 60
+404 129 5003 60 \N
+405 134 13 -7200 0
+406 134 14 0 660
+407 134 16 660 780
+408 134 2 780 \N
+409 135 13 -7200 0
+410 135 14 0 240
+411 135 16 240 420
+412 135 2 420 \N
+413 136 13 -7200 0
+414 136 14 0 120
+415 136 16 120 \N
+416 137 3 -7200 \N
+417 138 9 -36000 0
+418 138 21 0 \N
+421 141 13 -7200 0
+424 143 10 0 60
+425 143 11 60 \N
+422 141 14 0 60
+426 141 14 60 60
+427 141 17 60 60
+428 141 15 60 840
+429 141 14 840 840
+430 141 16 840 1440
+431 141 2 1440 \N
+420 140 30 0 840
+432 140 31 840 \N
+423 142 40 0 60
+433 142 41 60 \N
+419 139 5000 0 60
+434 139 5002 60 \N
+435 144 3 -7200 \N
+436 145 9 -36000 0
+437 145 21 0 \N
+440 148 13 -7200 0
+439 147 30 0 2460
+444 147 31 2460 \N
+443 150 10 0 1020
+445 150 11 1020 4980
+446 150 8 4980 \N
+442 149 40 0 360
+447 149 43 360 420
+448 149 41 420 \N
+438 146 5000 0 60
+449 146 5002 60 1020
+450 146 5003 1020 \N
+441 148 14 0 60
+451 148 17 60 60
+452 148 15 60 60
+453 148 17 60 60
+454 148 15 60 960
+455 148 14 960 1140
+456 148 17 1140 1140
+457 148 15 1140 1260
+458 148 14 1260 1260
+459 148 16 1260 1560
+460 148 2 1560 \N
+461 151 3 -7200 \N
+462 152 5000 0 \N
+463 153 13 -7200 0
+464 153 14 0 960
+1328 446 41 480 \N
+465 153 17 960 960
+466 153 15 960 2040
+467 153 17 2040 2040
+468 153 15 2040 4260
+469 153 14 4260 4500
+470 153 16 4500 4620
+471 153 2 4620 \N
+472 154 9 -36000 0
+473 154 21 0 \N
+476 157 13 -7200 0
+479 159 10 0 1800
+480 159 11 1800 4740
+481 159 8 4740 \N
+478 158 40 0 360
+482 158 41 360 \N
+477 157 14 0 1380
+483 157 14 1380 1380
+484 157 14 1380 1380
+485 157 16 1380 1620
+486 157 2 1620 \N
+475 156 30 0 60
+487 156 31 60 \N
+474 155 5000 0 60
+488 155 5002 60 60
+489 155 5003 60 \N
+490 160 3 -7200 \N
+491 161 9 -36000 0
+492 161 21 0 \N
+494 163 30 0 \N
+495 164 13 -7200 0
+498 166 10 0 \N
+496 164 14 0 60
+499 164 14 60 1620
+500 164 16 1620 1620
+501 164 2 1620 \N
+497 165 40 0 60
+502 165 46 60 60
+503 165 43 60 2460
+504 165 45 2460 2460
+505 165 43 2460 2520
+506 165 41 2520 \N
+493 162 5000 0 1380
+507 162 5001 1380 1380
+508 162 5003 1380 \N
+509 167 3 -7200 \N
+510 168 3 -7200 \N
+511 169 9 -36000 0
+512 169 21 0 \N
+776 263 45 540 540
+515 172 13 -7200 0
+518 174 10 0 60
+519 174 11 60 5400
+520 174 8 5400 \N
+513 170 5000 0 60
+521 170 5002 60 1560
+522 170 5003 1560 \N
+516 172 14 0 60
+523 172 17 60 60
+524 172 15 60 60
+525 172 16 60 4860
+526 172 2 4860 \N
+517 173 40 0 60
+527 173 46 60 60
+528 173 43 60 60
+529 173 41 60 \N
+514 171 30 0 960
+530 171 31 960 \N
+531 175 3 -7200 \N
+532 176 9 -36000 0
+533 176 21 0 \N
+535 178 9 -36000 0
+536 178 21 0 \N
+538 180 13 -7200 0
+534 177 5000 0 60
+542 177 5002 60 60
+543 177 5003 60 \N
+541 182 10 0 780
+544 182 11 780 4560
+545 182 8 4560 \N
+539 180 14 0 60
+546 180 17 60 60
+547 180 15 60 960
+548 180 16 960 1140
+549 180 2 1140 \N
+537 179 30 0 3600
+550 179 33 3600 4380
+551 179 31 4380 \N
+540 181 40 0 660
+552 181 41 660 \N
+553 183 40 0 \N
+556 186 13 -7200 0
+560 189 3 -7200 \N
+559 188 10 0 1500
+561 188 11 1500 6480
+562 188 8 6480 \N
+555 185 30 0 3600
+563 185 33 3600 4440
+564 185 31 4440 \N
+557 186 14 0 60
+565 186 17 60 60
+566 186 15 60 660
+567 186 14 660 960
+568 186 16 960 1020
+569 186 2 1020 \N
+558 187 40 0 420
+570 187 43 420 1440
+571 187 41 1440 \N
+554 184 5000 0 60
+572 184 5002 60 1440
+573 184 5003 1440 \N
+574 190 3 -7200 \N
+575 191 9 -36000 0
+576 191 21 0 \N
+579 194 13 -7200 0
+580 194 14 0 \N
+583 197 3 -7200 \N
+584 198 9 -36000 0
+585 198 21 0 \N
+586 199 13 -7200 0
+581 195 40 0 60
+588 195 46 60 60
+589 195 43 60 60
+590 195 41 60 \N
+582 196 10 0 1020
+591 196 11 1020 5700
+592 196 8 5700 \N
+578 193 30 0 960
+593 193 31 960 \N
+587 199 14 0 960
+594 199 17 960 960
+595 199 15 960 1020
+596 199 16 1020 1260
+597 199 2 1260 \N
+577 192 5000 0 60
+598 192 5002 60 540
+599 192 5003 540 \N
+601 201 3 -7200 \N
+602 202 9 -36000 0
+603 202 21 0 \N
+606 205 13 -7200 0
+610 208 3 -7200 \N
+611 209 9 -36000 0
+612 209 21 0 \N
+615 212 13 -7200 0
+607 205 14 0 1200
+619 205 17 1200 1200
+620 205 15 1200 1320
+621 205 14 1320 1440
+622 205 16 1440 1620
+623 205 2 1620 \N
+608 206 40 0 480
+624 206 43 480 660
+625 206 45 660 660
+626 206 43 660 1020
+627 206 41 1020 \N
+605 204 30 0 960
+628 204 31 960 \N
+604 203 5000 0 60
+629 203 5002 60 60
+630 203 5003 60 \N
+609 207 10 0 60
+631 207 11 60 4980
+632 207 8 4980 \N
+613 210 5000 0 60
+633 210 5002 60 60
+634 210 5003 60 \N
+614 211 30 0 960
+635 211 31 960 \N
+618 214 10 0 60
+636 214 11 60 4620
+637 214 8 4620 \N
+616 212 14 0 60
+638 212 14 60 60
+639 212 14 60 60
+640 212 17 60 60
+641 212 15 60 60
+642 212 17 60 60
+643 212 15 60 960
+617 213 40 0 60
+762 263 40 0 480
+644 212 14 960 1200
+645 212 16 1200 1320
+646 212 2 1320 \N
+779 264 40 0 1380
+647 213 46 60 60
+648 213 43 60 60
+649 213 41 60 \N
+650 215 3 -7200 \N
+651 216 9 -36000 0
+652 216 21 0 \N
+653 217 5000 0 \N
+654 218 30 0 \N
+655 219 13 -7200 0
+656 219 14 0 \N
+657 220 40 0 \N
+658 221 10 0 \N
+659 222 3 -7200 \N
+660 223 9 -36000 0
+662 224 5000 0 \N
+663 225 30 0 \N
+664 226 13 -7200 0
+665 226 14 0 \N
+667 228 30 0 \N
+669 230 13 -7200 0
+672 232 10 0 \N
+661 223 21 0 60
+674 223 18 60 \N
+673 233 10 0 4620
+675 233 12 4620 4800
+676 233 8 4800 \N
+670 230 14 0 960
+677 230 14 960 1020
+678 230 17 1020 1020
+679 230 15 1020 1020
+680 230 17 1020 1020
+681 230 15 1020 2220
+682 230 14 2220 2280
+683 230 16 2280 2400
+684 230 2 2400 \N
+671 231 40 0 360
+685 231 46 360 360
+686 231 43 360 600
+687 231 45 600 600
+688 231 43 600 660
+689 231 45 660 660
+690 231 43 660 720
+691 231 41 720 \N
+666 227 5000 0 60
+692 227 5002 60 960
+693 227 5003 960 \N
+668 229 30 0 3600
+694 229 33 3600 6120
+695 229 31 6120 \N
+696 234 3 -7200 \N
+697 235 9 -36000 0
+698 235 21 0 \N
+701 238 13 -7200 0
+705 241 40 0 60
+706 241 41 60 \N
+707 242 40 0 660
+708 242 41 660 \N
+709 243 40 0 5640
+710 243 46 5640 5640
+711 243 43 5640 6840
+712 243 41 6840 \N
+713 243 41 6300 \N
+703 239 40 0 60
+714 239 43 60 2460
+715 239 45 2460 2460
+716 239 43 2460 6420
+717 239 41 6420 \N
+700 237 30 0 2820
+718 237 31 2820 \N
+702 238 14 0 60
+719 238 17 60 60
+720 238 15 60 60
+721 238 17 60 60
+722 238 15 60 960
+723 238 16 960 1080
+724 238 2 1080 \N
+699 236 5000 0 2400
+725 236 5001 2400 2520
+726 236 5003 2520 \N
+704 240 10 0 60
+727 240 11 60 \N
+728 244 3 -7200 \N
+729 245 9 -36000 0
+730 245 21 0 \N
+733 248 13 -7200 0
+732 247 30 0 2520
+737 247 31 2520 \N
+736 250 10 0 60
+738 250 11 60 6780
+739 250 8 6780 \N
+731 246 5000 0 1500
+740 246 5001 1500 1620
+741 246 5003 1620 \N
+734 248 14 0 1380
+742 248 14 1380 1380
+743 248 14 1380 1740
+744 248 16 1740 1800
+745 248 2 1800 \N
+735 249 40 0 60
+746 249 41 60 \N
+747 251 3 -7200 \N
+748 252 9 -36000 0
+749 252 21 0 \N
+750 253 5000 0 \N
+751 254 30 0 \N
+752 255 13 -7200 0
+754 256 5000 0 \N
+757 259 13 -7200 0
+758 259 14 0 \N
+759 260 40 0 \N
+761 262 40 0 \N
+753 255 14 0 960
+763 255 14 960 960
+764 255 14 960 1200
+765 255 17 1200 1200
+766 255 15 1200 1200
+767 255 16 1200 1440
+768 255 2 1440 \N
+756 258 30 0 3600
+769 258 33 3600 5160
+770 258 31 5160 \N
+755 257 5000 0 60
+771 257 5002 60 60
+772 257 5003 60 \N
+760 261 10 0 60
+773 261 11 60 6300
+774 261 8 6300 \N
+777 263 43 540 660
+778 263 41 660 \N
+780 264 41 1380 \N
+782 266 9 -36000 0
+783 266 21 0 \N
+1324 443 5002 60 540
+786 269 13 -7200 0
+788 270 40 0 1320
+790 270 41 1320 \N
+787 269 14 0 540
+791 269 14 540 720
+792 269 17 720 720
+793 269 15 720 720
+794 269 17 720 720
+795 269 15 720 960
+796 269 14 960 960
+797 269 16 960 1320
+798 269 2 1320 \N
+784 267 5000 0 60
+799 267 5002 60 1020
+800 267 5003 1020 \N
+785 268 30 0 60
+801 268 31 60 \N
+789 271 10 0 1200
+802 271 11 1200 1260
+803 271 8 1260 \N
+804 272 40 0 1260
+805 272 46 1260 1260
+806 272 43 1260 1380
+807 272 41 1380 \N
+808 273 3 -7200 \N
+809 274 9 -36000 0
+810 274 21 0 \N
+813 277 13 -7200 0
+814 277 14 0 60
+817 277 17 60 60
+818 277 15 60 60
+819 277 17 60 60
+820 277 15 60 960
+821 277 16 960 1200
+822 277 2 1200 \N
+816 279 10 0 1440
+823 279 11 1440 \N
+812 276 30 0 1440
+824 276 31 1440 \N
+811 275 5000 0 60
+825 275 5002 60 60
+826 275 5003 60 \N
+815 278 40 0 60
+827 278 46 60 60
+828 278 43 60 1500
+829 278 45 1500 1500
+830 278 43 1500 1620
+831 278 41 1620 \N
+832 280 3 -7200 \N
+833 281 9 -36000 0
+834 281 21 0 \N
+837 284 13 -7200 0
+838 284 14 0 \N
+841 287 13 -7200 0
+835 282 5000 0 60
+843 282 5002 60 540
+844 282 5003 540 \N
+839 285 40 0 3240
+845 285 41 3240 \N
+840 286 10 0 60
+846 286 11 60 6240
+847 286 8 6240 \N
+842 287 14 0 60
+848 287 14 60 960
+849 287 17 960 960
+850 287 15 960 960
+851 287 17 960 960
+852 287 15 960 960
+853 287 16 960 1140
+854 287 2 1140 \N
+836 283 30 0 960
+855 283 31 960 \N
+856 288 3 -7200 \N
+857 289 9 -36000 0
+858 289 21 0 \N
+859 290 5000 0 \N
+862 293 13 -7200 0
+865 295 10 0 \N
+863 293 14 0 960
+866 293 14 960 2100
+867 293 17 2100 2100
+868 293 15 2100 2160
+869 293 16 2160 2340
+870 293 2 2340 \N
+871 296 10 0 60
+872 296 11 60 4860
+873 296 8 4860 \N
+861 292 30 0 960
+874 292 31 960 \N
+864 294 40 0 1020
+875 294 46 1020 1020
+876 294 43 1020 1080
+877 294 41 1080 \N
+860 291 5000 0 60
+878 291 5002 60 960
+879 291 5003 960 \N
+880 297 3 -7200 \N
+881 298 9 -36000 0
+882 298 21 0 \N
+885 301 13 -7200 0
+888 303 10 0 960
+889 303 11 960 4980
+890 303 8 4980 \N
+884 300 30 0 1020
+891 300 31 1020 \N
+883 299 5000 0 60
+892 299 5002 60 540
+893 299 5003 540 \N
+886 301 14 0 1200
+894 301 16 1200 5280
+895 301 2 5280 \N
+887 302 40 0 60
+896 302 46 60 60
+897 302 43 60 540
+898 302 45 540 540
+899 302 43 540 540
+900 302 41 540 \N
+901 304 13 -7200 0
+902 304 14 0 \N
+903 305 13 -7200 0
+904 305 14 0 \N
+905 306 13 -7200 0
+906 306 14 0 1140
+907 306 17 1140 1140
+908 306 15 1140 \N
+909 307 30 0 \N
+1325 443 5003 540 \N
+910 308 30 0 3600
+911 308 33 3600 9060
+912 308 31 9060 \N
+913 309 13 -7200 0
+914 309 14 0 300
+915 309 14 300 540
+916 309 16 540 660
+917 309 2 660 \N
+918 310 40 0 18060
+919 310 41 18060 \N
+920 311 5000 0 60
+921 311 5001 60 120
+922 311 5003 120 \N
+923 312 10 0 2460
+924 312 12 2460 2940
+925 312 8 2940 \N
+926 313 5000 0 360
+927 313 5001 360 420
+928 313 5003 420 \N
+929 314 9 -36000 0
+930 314 21 0 \N
+931 315 3 -7200 \N
+934 318 13 -7200 0
+935 318 14 0 \N
+937 320 10 0 540
+938 320 11 540 6720
+939 320 8 6720 \N
+933 317 30 0 60
+940 317 31 60 \N
+941 321 13 -7200 0
+942 321 14 0 60
+943 321 14 60 960
+944 321 17 960 960
+945 321 15 960 960
+946 321 17 960 960
+947 321 15 960 1140
+948 321 16 1140 1440
+949 321 2 1440 \N
+936 319 40 0 600
+950 319 43 600 1920
+951 319 41 1920 \N
+932 316 5000 0 60
+952 316 5002 60 960
+953 316 5003 960 \N
+954 322 9 -36000 0
+955 322 21 0 \N
+956 323 3 -7200 \N
+959 326 13 -7200 0
+957 324 5000 0 60
+963 324 5002 60 60
+964 324 5003 60 \N
+960 326 14 0 60
+965 326 14 60 60
+966 326 14 60 960
+967 326 16 960 2280
+968 326 2 2280 \N
+962 328 10 0 5340
+969 328 12 5340 5760
+970 328 8 5760 \N
+961 327 40 0 120
+971 327 43 120 600
+972 327 41 600 \N
+958 325 30 0 960
+973 325 31 960 \N
+974 329 3 -7200 \N
+975 330 9 -36000 0
+976 330 21 0 \N
+977 331 5000 0 \N
+978 332 30 0 \N
+979 333 13 -7200 0
+980 333 14 0 \N
+981 334 40 0 \N
+982 335 10 0 \N
+983 336 13 -7200 0
+984 336 14 0 \N
+985 337 13 -7200 0
+986 337 14 0 \N
+987 338 13 -7200 0
+988 338 14 0 \N
+989 339 13 -7200 0
+990 339 14 0 960
+991 339 17 960 960
+992 339 15 960 2160
+993 339 16 2160 2220
+994 339 2 2220 \N
+995 340 40 0 420
+996 340 43 420 600
+997 340 42 600 600
+998 340 43 600 960
+999 340 42 960 960
+1000 340 43 960 1080
+1001 340 41 1080 \N
+1002 341 30 0 60
+1003 341 31 60 \N
+1004 342 5000 0 60
+1005 342 5002 60 960
+1006 342 5003 960 \N
+1007 343 10 0 60
+1008 343 11 60 4920
+1009 343 8 4920 \N
+1010 344 3 -7200 \N
+1011 345 3 -7200 \N
+1012 346 9 -36000 0
+1013 346 21 0 \N
+1016 349 13 -7200 0
+1014 347 5000 0 60
+1020 347 5002 60 960
+1021 347 5003 960 \N
+1015 348 30 0 720
+1022 348 31 720 \N
+1018 350 40 0 480
+1023 350 43 480 540
+1024 350 41 540 \N
+1019 351 10 0 8160
+1025 351 12 8160 8520
+1026 351 8 8520 \N
+1017 349 14 0 60
+1027 349 17 60 60
+1028 349 15 60 960
+1029 349 16 960 1080
+1030 349 2 1080 \N
+1031 352 3 -7200 \N
+1032 353 9 -36000 0
+1033 353 21 0 \N
+1034 354 5000 0 \N
+1037 357 13 -7200 0
+1035 355 5000 0 60
+1038 357 14 0 60
+1036 356 30 0 60
+1041 356 31 60 \N
+1039 358 40 0 660
+1042 358 43 660 1440
+1043 358 41 1440 \N
+1040 359 10 0 1320
+1044 359 11 1320 \N
+1045 355 5002 60 60
+1046 355 5003 60 \N
+1047 357 14 60 1500
+1048 357 16 1500 2580
+1049 357 2 2580 \N
+1050 360 3 -7200 \N
+1051 361 9 -36000 0
+1052 361 21 0 \N
+1055 364 13 -7200 0
+1053 362 5000 0 60
+1059 362 5002 60 1440
+1060 362 5003 1440 \N
+1057 365 40 0 60
+1061 365 46 60 60
+1062 365 43 60 1620
+1063 365 45 1620 1620
+1064 365 43 1620 1680
+1065 365 41 1680 \N
+1054 363 30 0 720
+1066 363 31 720 \N
+1058 366 10 0 60
+1067 366 11 60 6000
+1068 366 8 6000 \N
+1056 364 14 0 60
+1069 364 17 60 60
+1070 364 15 60 60
+1071 364 17 60 60
+1072 364 15 60 480
+1073 364 14 480 480
+1074 364 14 480 960
+1075 364 17 960 960
+1076 364 15 960 1440
+1077 364 16 1440 1560
+1078 364 2 1560 \N
+1079 367 3 -7200 \N
+1080 368 9 -36000 0
+1081 368 21 0 \N
+1084 371 13 -7200 0
+1086 372 40 0 1860
+1088 372 46 1860 1860
+1089 372 43 1860 4020
+1090 372 41 4020 \N
+1087 373 10 0 120
+1091 373 11 120 2100
+1092 373 8 2100 \N
+1083 370 30 0 3600
+1093 370 33 3600 3780
+1094 370 31 3780 \N
+1085 371 14 0 960
+1095 371 17 960 960
+1096 371 15 960 1020
+1097 371 14 1020 2040
+1098 371 16 2040 2100
+1099 371 2 2100 \N
+1082 369 5000 0 60
+1100 369 5002 60 2280
+1101 369 5003 2280 \N
+1102 374 9 -36000 0
+1103 374 21 0 2220
+1104 374 18 2220 \N
+1105 375 3 -7200 \N
+1106 376 9 -36000 0
+1107 376 21 0 \N
+1110 379 13 -7200 0
+1113 381 10 0 60
+1114 381 11 60 5220
+1115 381 8 5220 \N
+1108 377 5000 0 60
+1116 377 5002 60 60
+1117 377 5003 60 \N
+1112 380 40 0 480
+1118 380 46 480 480
+1119 380 43 480 540
+1120 380 41 540 \N
+1109 378 30 0 1020
+1121 378 31 1020 \N
+1111 379 14 0 60
+1122 379 17 60 60
+1123 379 15 60 660
+1124 379 14 660 960
+1125 379 14 960 1260
+1126 379 14 1260 2340
+1127 379 17 2340 2340
+1128 379 15 2340 3480
+1129 379 16 3480 3660
+1130 379 2 3660 \N
+1131 382 9 -36000 0
+1132 382 21 0 \N
+1133 383 9 -36000 0
+1134 383 21 0 \N
+1135 384 3 -7200 \N
+1136 385 30 0 1560
+1137 385 31 1560 \N
+1138 386 40 0 600
+1139 386 41 600 \N
+1140 387 13 -7200 0
+1141 387 14 0 960
+1142 387 14 960 960
+1143 387 16 960 1260
+1144 387 2 1260 \N
+1145 388 5000 0 60
+1146 388 5001 60 1140
+1147 388 5003 1140 \N
+1148 389 10 0 60
+1149 389 11 60 5700
+1150 389 8 5700 \N
+1151 390 3 -7200 \N
+1152 391 9 -36000 0
+1153 391 21 0 \N
+1156 394 13 -7200 0
+1159 396 10 0 \N
+1155 393 30 0 1920
+1160 393 31 1920 \N
+1154 392 5000 0 60
+1161 392 5002 60 \N
+1158 395 40 0 480
+1162 395 46 480 480
+1163 395 43 480 480
+1164 395 41 480 \N
+1157 394 14 0 60
+1165 394 17 60 60
+1166 394 15 60 780
+1167 394 14 780 960
+1168 394 14 960 1140
+1169 394 17 1140 1140
+1170 394 15 1140 1500
+1171 394 14 1500 5100
+1172 394 15 5100 6360
+1173 394 16 6360 6480
+1174 394 2 6480 \N
+1175 397 3 -7200 \N
+1176 398 9 -36000 0
+1177 398 21 0 \N
+1180 401 13 -7200 0
+1179 400 30 0 540
+1184 400 31 540 \N
+1181 401 14 0 1320
+1185 401 14 1320 1440
+1186 401 14 1440 1440
+1187 401 14 1440 1620
+1188 401 16 1620 1800
+1189 401 2 1800 \N
+1183 403 10 0 60
+1190 403 11 60 8220
+1191 403 8 8220 \N
+1182 402 40 0 600
+1192 402 43 600 660
+1193 402 41 660 \N
+1178 399 5000 0 60
+1194 399 5002 60 960
+1195 399 5003 960 \N
+1199 407 13 -7200 0
+1202 409 9 -36000 0
+1203 409 21 0 \N
+1204 410 3 -7200 \N
+1205 411 5000 0 60
+1206 411 5001 60 60
+1207 411 5003 60 \N
+1200 407 14 0 60
+1208 407 17 60 60
+1209 407 15 60 60
+1210 407 14 60 60
+1211 407 14 60 960
+1212 407 17 960 960
+1213 407 15 960 960
+1214 407 16 960 1320
+1215 407 2 1320 \N
+1196 404 5000 0 60
+1216 404 5001 60 120
+1217 404 5003 120 \N
+1201 408 10 0 120
+1218 408 11 120 3900
+1219 408 8 3900 \N
+1198 406 40 0 60
+1220 406 41 60 \N
+1197 405 30 0 60
+1221 405 31 60 \N
+1222 412 3 -7200 \N
+1223 413 9 -36000 0
+1224 413 21 0 \N
+1227 416 13 -7200 0
+1230 418 10 0 420
+1231 418 11 420 7860
+1232 418 8 7860 \N
+1228 416 14 0 60
+1233 416 17 60 60
+1234 416 15 60 960
+1235 416 16 960 1140
+1236 416 2 1140 \N
+1226 415 30 0 2220
+1237 415 31 2220 \N
+1229 417 40 0 60
+1238 417 43 60 420
+1239 417 45 420 420
+1240 417 43 420 480
+1241 417 41 480 \N
+1225 414 5000 0 960
+1242 414 5001 960 1020
+1243 414 5003 1020 \N
+1244 419 3 -7200 \N
+1245 420 9 -36000 0
+1246 420 21 0 \N
+1249 423 13 -7200 0
+1252 425 10 0 \N
+1247 421 5000 0 60
+1253 421 5001 60 60
+1254 421 5003 60 \N
+1255 426 10 0 60
+1256 426 11 60 4800
+1257 426 8 4800 \N
+1250 423 14 0 60
+1258 423 17 60 60
+1259 423 15 60 720
+1260 423 14 720 720
+1261 423 14 720 1020
+1262 423 17 1020 1020
+1263 423 15 1020 1140
+1264 423 16 1140 1320
+1265 423 2 1320 \N
+1251 424 40 0 360
+1266 424 41 360 \N
+1248 422 30 0 60
+1267 422 31 60 \N
+1269 428 3 -7200 \N
+1270 429 9 -36000 0
+1271 429 21 0 \N
+1273 431 13 -7200 0
+1274 431 14 0 60
+1277 431 17 60 60
+1278 431 15 60 960
+1279 431 17 960 960
+1280 431 15 960 1140
+1281 431 14 1140 1140
+1282 431 14 1140 1680
+1283 431 16 1680 1980
+1284 431 2 1980 \N
+1272 430 30 0 960
+1285 430 31 960 \N
+1275 432 40 0 60
+1286 432 46 60 60
+1287 432 43 60 480
+1288 432 41 480 \N
+1268 427 5000 0 60
+1289 427 5002 60 780
+1290 427 5003 780 \N
+1276 433 10 0 1080
+1291 433 11 1080 \N
+1292 434 9 -36000 0
+1294 435 3 -7200 \N
+1297 438 13 -7200 0
+1298 438 14 0 540
+1295 436 5000 0 60
+1318 443 5000 0 60
+1323 447 10 0 420
+1293 434 21 0 1020
+1301 434 18 1020 \N
+1300 440 10 0 3720
+1326 447 11 420 4920
+1302 440 12 3720 5520
+1303 440 8 5520 \N
+1327 447 8 4920 \N
+1304 438 17 540 540
+1322 446 40 0 480
+1305 438 15 540 1020
+1321 445 14 0 960
+1306 438 14 1020 1140
+1329 445 17 960 960
+1307 438 16 1140 1260
+1308 438 2 1260 \N
+1296 437 30 0 1560
+1309 437 31 1560 \N
+1310 436 5002 60 960
+1311 436 5003 960 \N
+1299 439 40 0 120
+1330 445 15 960 960
+1312 439 45 120 120
+1313 439 43 120 1140
+1314 439 41 1140 \N
+1315 441 3 -7200 \N
+1316 442 9 -36000 0
+1317 442 21 0 \N
+1320 445 13 -7200 0
+1331 445 16 960 1380
+1332 445 2 1380 \N
+1319 444 30 0 1560
+1333 444 31 1560 \N
+1334 448 3 -7200 \N
+1335 449 9 -36000 0
+1336 449 21 0 \N
+1339 452 13 -7200 0
+1338 451 30 0 2580
+1343 451 31 2580 \N
+1337 450 5000 0 60
+1344 450 5001 60 60
+1345 450 5003 60 \N
+1342 454 10 0 60
+1346 454 11 60 6420
+1347 454 8 6420 \N
+1340 452 14 0 1380
+1348 452 14 1380 1380
+1349 452 17 1380 1380
+1350 452 15 1380 2640
+1351 452 14 2640 3660
+1352 452 14 3660 3780
+1353 452 14 3780 4980
+1354 452 14 4980 4980
+1355 452 16 4980 5160
+1356 452 2 5160 \N
+1341 453 40 0 60
+1357 453 46 60 60
+1358 453 43 60 1560
+1359 453 41 1560 \N
+1360 455 3 -7200 \N
+1361 456 9 -36000 0
+1365 459 13 -7200 0
+1362 456 21 0 1200
+1369 456 18 1200 \N
+1367 460 40 0 60
+1370 460 43 60 960
+1371 460 41 960 \N
+1368 461 10 0 960
+1372 461 11 960 4860
+1373 461 8 4860 \N
+1364 458 30 0 3600
+1374 458 33 3600 5220
+1375 458 31 5220 \N
+1363 457 5000 0 1260
+1376 457 5001 1260 1440
+1377 457 5003 1440 \N
+1366 459 14 0 60
+1378 459 17 60 60
+1379 459 15 60 60
+1380 459 17 60 60
+1381 459 15 60 960
+1382 459 16 960 960
+1383 459 2 960 \N
+\.
+
+
+--
+-- Name: sim_patient_state_sim_patient_state_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_patient_state_sim_patient_state_id_seq', 1383, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/db/definition/simdata/sim_result.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_result.dump.sql
similarity index 99%
rename from medinfo/db/definition/simdata/sim_result.dump.sql
rename to medinfo/cpoe/cpoeSim/simdata/sim_result.dump.sql
index cf7171fa..9a8356c9 100644
--- a/medinfo/db/definition/simdata/sim_result.dump.sql
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_result.dump.sql
@@ -2,19 +2,24 @@
-- PostgreSQL database dump
--
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
-
-SET search_path = public, pg_catalog;
+SET row_security = off;
--
-- Data for Name: sim_result; Type: TABLE DATA; Schema: public; Owner: -
--
-COPY sim_result (sim_result_id, name, description, group_string, priority) FROM stdin;
+COPY public.sim_result (sim_result_id, name, description, group_string, priority) FROM stdin;
11000 WBC WBC LAB BLOOD ORDERABLES>Hematology>Automated Blood Count 11000
11010 HGB HEMOGLOBIN LAB BLOOD ORDERABLES>Hematology>Automated Blood Count 11010
11020 HCT HEMATOCRIT LAB BLOOD ORDERABLES>Hematology>Automated Blood Count 11020
@@ -614,6 +619,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1000434 FREEKL FREE KAPPA/LAMBDA RATIO LAB BLOOD ORDERABLES>Other>FREE LIGHT CHAIN RATIO 1001121
1000435 FREEL FREE LAMBDA LIGHT CHAIN LAB BLOOD ORDERABLES>Other>FREE LIGHT CHAIN RATIO 1001122
1000436 HYST PSEUDO-HYPHAE URINE ORDERABLES>Other>URINALYSIS WITH MICROSCOPIC 1001131
+1000654 C3P4PC CD3+/CD4+,% LAB BLOOD ORDERABLES>Other>CD4 COUNT 1001454
1000437 C1656A CD3-/16+56(NK),ABS. LAB BLOOD ORDERABLES>Other>T SUBSETS AND B LYMPHOCYTES, BLOOD 1001132
1000438 C1656P CD3-/16+56(NK)% LAB BLOOD ORDERABLES>Other>T SUBSETS AND B LYMPHOCYTES, BLOOD 1001133
1000439 CD19AB CD19 (PAN B), ABS. LAB BLOOD ORDERABLES>Other>T SUBSETS AND B LYMPHOCYTES, BLOOD 1001134
@@ -831,7 +837,6 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1000651 9247R CPRA FOR CUMULATIVE C1Q HISTOCOMPATIBILITY ORDERABLE>Other>HLA - SCREENING IGG 1001450
1000652 9244R CUMULATIVE ANTIBODIES BY IGG HISTOCOMPATIBILITY ORDERABLE>Other>HLA - SCREENING IGG 1001452
1000653 C3P4PA CD3+/CD4+,ABS LAB BLOOD ORDERABLES>Other>CD4 COUNT 1001453
-1000654 C3P4PC CD3+/CD4+,% LAB BLOOD ORDERABLES>Other>CD4 COUNT 1001454
1000655 IOPTH INTRA OPERATIVE PTH LAB BLOOD ORDERABLES>Other>INTRA OPERATIVE PTH 1001458
1000656 11235R VARICELLA-ZOSTER, ACIF STOOL ORDERABLES>Other>VZV TOTAL AND IGM AB PANEL 1001459
1000657 11236R VZ AB IGM, IFA STOOL ORDERABLES>Other>VZV TOTAL AND IGM AB PANEL 1001460
@@ -1113,6 +1118,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1000933 VOL1 VOLUME SODIUM URINE ORDERABLES>Other>SODIUM, URINE (TIMED) 1001917
1000934 AMIPR2 DATE & TIME OF LAST DOSE LAB BLOOD ORDERABLES>Other>AMIKACIN TROUGH LEVEL 1001918
1000935 OXCMT1 OXCARBAZEPINE METABOLITE LAB BLOOD ORDERABLES>Other>OXCARBAZEPINE METABOLITE LEVEL 1001919
+1001149 11896R ARSENIC,U URINE ORDERABLES>Other>HEAVY METALS, URINE 1002308
1000936 GIDH1B IDH1, BLOOD LAB BLOOD ORDERABLES>Other>CANCER SOMATIC MUTATION PNL, BLOOD 1001920
1000937 GIDH2B IDH2, BLOOD LAB BLOOD ORDERABLES>Other>CANCER SOMATIC MUTATION PNL, BLOOD 1001921
1000938 GKRASB KRAS, BLOOD LAB BLOOD ORDERABLES>Other>CANCER SOMATIC MUTATION PNL, BLOOD 1001922
@@ -1326,7 +1332,6 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1001146 NPMRE RESULT MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION 1002305
1001147 BMNPDX CLINICAL INDICATION MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION, BM 1002306
1001148 BMNPME METHOD MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION, BM 1002307
-1001149 11896R ARSENIC,U URINE ORDERABLES>Other>HEAVY METALS, URINE 1002308
1001150 YUHYM6 TOTAL VOLUME URINE ORDERABLES>Other>HEAVY METALS, URINE 1002309
1001151 HV6QLD HHV-6 DNA VIROLOGY ORDERABLES>Other>HHV-6 DNA PCR QUAL 1002312
1001152 CSCI CLINICAL INDICATION BODY FLUID ORDERABLES>Other>CANCER SOMATIC MUTATION PANEL 1002313
@@ -1746,6 +1751,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1001566 NAPA N-ACETYLPROCAINAMIDE (NAPA) LAB BLOOD ORDERABLES>Other>PROCAINAMIDE AND NAPA 1003054
1001567 PA PROCAINAMIDE LAB BLOOD ORDERABLES>Other>PROCAINAMIDE AND NAPA 1003055
1001568 PANAP1 PEAK, TROUGH, OR RANDOM LAB BLOOD ORDERABLES>Other>PROCAINAMIDE AND NAPA 1003056
+1001713 HBEAB HEPATITIS B E AB LAB BLOOD ORDERABLES>Other>HBE AB 1003378
1001569 PANAP2 DATE & TIME OF LAST DOSE LAB BLOOD ORDERABLES>Other>PROCAINAMIDE AND NAPA 1003057
1001570 PANAP3 DOSAGE (INCLUDE UNITS) LAB BLOOD ORDERABLES>Other>PROCAINAMIDE AND NAPA 1003058
1001571 PANAP4 ADMINISTRATION ROUTE LAB BLOOD ORDERABLES>Other>PROCAINAMIDE AND NAPA 1003059
@@ -1890,7 +1896,6 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1001710 CF32R2 RESULT 2 LAB BLOOD ORDERABLES>Other>CYSTIC FIBROSIS MUTATION STUDY 1003375
1001711 GAD65AB GAD65 ANTIBODY LAB BLOOD ORDERABLES>Other>GAD AB 1003376
1001712 HBODY HEINZ BODY PREP LAB BLOOD ORDERABLES>Other>HEINZ BODY PREP 1003377
-1001713 HBEAB HEPATITIS B E AB LAB BLOOD ORDERABLES>Other>HBE AB 1003378
1001714 HIVI INTERPRETATION LAB BLOOD ORDERABLES>Other>ANTI-HIV 1003379
1001715 MEXIL MEXILETINE LAB BLOOD ORDERABLES>Other>MEXILETINE 1003380
1001716 YPANPP PANCREATIC POLYPEPTIDE LAB BLOOD ORDERABLES>Other>PP 1003381
@@ -2587,6 +2592,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1002407 11191R BORRELIA HERMSII IGG LAB BLOOD ORDERABLES>Other>BORRELIA HERMSII AB PANL 1004765
1002408 11192R BORRELIA HERMSII IGM LAB BLOOD ORDERABLES>Other>BORRELIA HERMSII AB PANL 1004766
1002409 D816RE RESULT, BLOOD LAB BLOOD ORDERABLES>Other>KIT D816V MUTATION, AS-PCR, BLOOD 1004767
+1003040 LEIPRM PRIMERS LAB BLOOD ORDERABLES>Other>FACTOR V LEIDEN 1006241
1002410 C2526N CD25, % OF CD3+/CD4+/CD26NEG LAB BLOOD ORDERABLES>Other>FLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD 1004768
1002411 C257N CD25, % OF CD3+/CD4+/CD7NEG LAB BLOOD ORDERABLES>Other>FLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD 1004769
1002412 C3026N CD30, % OF CD3+/CD4+/CD26NEG LAB BLOOD ORDERABLES>Other>FLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD 1004772
@@ -2720,6 +2726,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1002540 UNCAN UNSTIMULATED CPM STOOL ORDERABLES>Other>LYMPHOCYTE AG STIMULATION SCREEN 1005017
1002541 UNPPD UNSTIMULATED CPM STOOL ORDERABLES>Other>LYMPHOCYTE AG STIMULATION SCREEN 1005018
1002542 UNTET UNSTIMULATED CPM STOOL ORDERABLES>Other>LYMPHOCYTE AG STIMULATION SCREEN 1005019
+1003041 CHICK CHICKEN LAB BLOOD ORDERABLES>Other>FOOD ALLERGY SCREEN 1006242
1002543 TALBU ALBUMIN EXCRETION TIMED URINE>Other>ALBUMIN, URINE (TIMED) 1005020
1002544 UT35 COLLECTION PERIOD TIMED URINE>Other>ALBUMIN, URINE (TIMED) 1005022
1002545 VOL35 VOLUME TIMED URINE>Other>ALBUMIN, URINE (TIMED) 1005023
@@ -3002,6 +3009,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1002823 REQS REQUEST SENT LAB BLOOD ORDERABLES>Other>DIRECT ANTIGLOBULIN TEST - LARC 1005693
1002824 ECHIND ECHINOCOCCUS LGG LAB BLOOD ORDERABLES>Other>ECHINOCOCCUS AB, IGG 1005694
1002825 FLUOXE FLUOXETINE LAB BLOOD ORDERABLES>Other>FLUOXETINE AND NORFLUOXETINE 1005695
+1003042 CORNY CORN LAB BLOOD ORDERABLES>Other>FOOD ALLERGY SCREEN 1006243
1002826 NORFLU NORFLUOXETINE LAB BLOOD ORDERABLES>Other>FLUOXETINE AND NORFLUOXETINE 1005696
1002827 T4 THYROXINE, TOTAL LAB BLOOD ORDERABLES>Other>FREE THYROXINE INDEX 1005697
1002828 YT7P2 T-UPTAKE % LAB BLOOD ORDERABLES>Other>FREE THYROXINE INDEX 1005698
@@ -3216,9 +3224,6 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1003037 DHB DONOR HEP B SURF. AG LAB BLOOD ORDERABLES>Other>DONOR HEP B SURF. AG 1006238
1003038 ETHSUX ETHOSUXIMIDE LAB BLOOD ORDERABLES>Other>ETHOSUXIMIDE LEVEL 1006239
1003039 LEICMT COMMENT LAB BLOOD ORDERABLES>Other>FACTOR V LEIDEN 1006240
-1003040 LEIPRM PRIMERS LAB BLOOD ORDERABLES>Other>FACTOR V LEIDEN 1006241
-1003041 CHICK CHICKEN LAB BLOOD ORDERABLES>Other>FOOD ALLERGY SCREEN 1006242
-1003042 CORNY CORN LAB BLOOD ORDERABLES>Other>FOOD ALLERGY SCREEN 1006243
1003043 EGGW EGG WHITE LAB BLOOD ORDERABLES>Other>FOOD ALLERGY SCREEN 1006244
1003044 FISH FISH LAB BLOOD ORDERABLES>Other>FOOD ALLERGY SCREEN 1006245
1003045 IGEFA TOTAL IGE LAB BLOOD ORDERABLES>Other>FOOD ALLERGY SCREEN 1006246
@@ -4138,6 +4143,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1003959 CDMLDI DISCLAIMER LAB BLOOD ORDERABLES>Other>CDH1 MLPA 1007691
1003960 CDMLMD INTERPRETED BY LAB BLOOD ORDERABLES>Other>CDH1 MLPA 1007692
1003961 CDMLME METHOD LAB BLOOD ORDERABLES>Other>CDH1 MLPA 1007693
+1004032 NPMRF REFERENCES MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION 1007808
1003962 PTH18R RECEIVED IN FLOW CYTOMETRY LAB BLOOD ORDERABLES>Other>FLOW CYTOMETRY FOR T CELL IMMUNOTHERAPY PANEL, BLOOD 1007694
1003963 CFMLDI DISCLAIMER LAB BLOOD ORDERABLES>Other>CFTR DELETION/DUPLICATION ANALYSIS BY MLPA 1007696
1003964 CFMLMD INTERPRETED BY LAB BLOOD ORDERABLES>Other>CFTR DELETION/DUPLICATION ANALYSIS BY MLPA 1007697
@@ -4208,7 +4214,6 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
1004029 NPMDI DISCLAIMER MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION 1007805
1004030 NPMIN INTERPRETATION MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION 1007806
1004031 NPMMD INTERPRETED BY MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION 1007807
-1004032 NPMRF REFERENCES MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION 1007808
1004033 BMNPDI DISCLAIMER MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION, BM 1007809
1004034 BMNPIN INTERPRETATION, BM MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION, BM 1007810
1004035 BMNPRF REFERENCES MOLECULAR DIAG ORDERABLES>Other>NPM1, NUCLEOPHOSMIN 1 MUTATION, BM 1007811
@@ -4373,18 +4378,22 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
40 DBP Blood Pressure, Diastolic (DBP) Flowsheet>Vitals 40
80 GCS Glasgow Coma Scale (GCS) Flowsheet>Vitals 80
1004193 SpO2 O2 Saturation Flowsheet>Vitals 55
+125 Gram Stain and Culture CULTURE AND GRAM STAIN, CSF BODY FLUID ORDERABLES>Other>CULTURE AND GRAM STAIN, CSF \N
+1004208 VQScan Ventilation/Perfusion Scan Imaging>Nuclear 2050000
1004194 CXR Chest XRay Imaging>XRay 2000000
-1004196 CTAbdomen CT Abdomen Imaging>CT 2011000
-1004197 CTPelvis CT Pelvis Imaging>CT 2011010
-1004199 CTHead CT Head Imaging>CT 2010000
1004195 CTChest CT Chest Imaging>CT 2010500
1004200 AbdUS US Abdomen Imaging>US 2020000
-1004201 MRIBrain MRI Brain Imaging>MRI 2030000
1004202 CTCSpine CT Cervical Spine Imaging>CT 2010200
1004204 MRITSpine MRI Thoracic Spine Imaging>MRI 2030500
1004203 MRICSpine MRI Cervical Spine Imaging>MRI 2030300
1004205 MRILSpine MRI Lumbar Spine Imagine>MRI 2030700
1004198 ECG ECG 12-Lead Cardiology>EKG 3000000
+200 ECHO Echocardiogram Cardiology>ECHO 3000100
+1004206 DVTUS Deep Vein Thrombosis Ultrasound Imaging>US 2020100
+1004207 ECHOStress Stress Echocardiogram Cardiology>ECHO 3000200
+133 CT Head CT Head Imaging>CT 2010002
+131 MRI Brain MRI Brain Imaging>MRI 2030002
+1004196 CTAbdPelv CT Abdomen Pelvis Imaging>CT 2011000
\.
@@ -4392,7 +4401,7 @@ COPY sim_result (sim_result_id, name, description, group_string, priority) FROM
-- Name: sim_result_sim_result_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
--
-SELECT pg_catalog.setval('sim_result_sim_result_id_seq', 1004205, true);
+SELECT pg_catalog.setval('public.sim_result_sim_result_id_seq', 1004208, true);
--
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_state.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_state.dump.sql
new file mode 100644
index 00000000..c8c15516
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_state.dump.sql
@@ -0,0 +1,73 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_state; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_state (sim_state_id, name, description) FROM stdin;
+1 Example Example State
+0 Default Default State Info
+5 ACS Relief ACS Pain Relief
+6 NFever Neutropenic Fever (no source) Initial State
+7 GIBleed GI Bleed Initial State
+3 ACS ACS Initial State
+14 EtOH-GIBleed Active Alcoholic Hepatitis - GI Bleed Active
+15 EtOH-GIBleed Bleeding Out Alcoholic Hepatitis - GI Bleed Bleeding Out
+4 CodeBlue Code Blue / ACLS / Dead / Dying
+16 EtOH-GIBleed Coag Stabilized Alcoholic Hepatitis - GI Bleed Coagulopathy Stabilized
+2 EtOH-GIBleed Post-EGD Alcoholic Hepatitis - GI Bleed EGD Done
+17 EtOH-GIBleed GI Consult Block Alcoholic Hepatitis - GI Bleed GI Consult Block Pending Med Management
+13 EtOH-GIBleed Onset Alcoholic Hepatitis - GI Bleed Onset (pre-admission)
+9 DKA Onset Diabetic Ketoacidosis - Onset
+20 DKA Hypoglycemic Diabetic Ketoacidosis - Low Glucose, Low K, Anion Gap
+21 DKA Hyperglycemic Diabetic Ketoacidosis - High Glucose, Normal-High K, Anion Gap
+18 DKA Euglycemic Diabetic Ketoacidosis - Normal Glucose, Normal K, Anion Gap
+19 DKA Gap Closed Diabetic Ketoacidosis - Gap Closed
+5000 Neutropenic Fever v2 Neutropenic Fever (v2 example) Initial State
+5001 Neutropenic Fever Treated with Abx Appropriate antibiotic improve patient condition
+5002 Neutropenic Fever Treated with IVF Appropriate IVF improve patient condition
+5003 Neutropenic Fever Treated with IVF + ABX Appropriate Treatments for patient condition
+30 Mening Active Meningitis Active
+31 Meningitis Adequately Treated Appropriate antibiotic improve patient condition
+32 Meningits Inadequately Treated Inadequate treatment worsens patient condition
+33 Meningits Worsens Patient condition worsens after 1 hr
+40 Afib-RVR Initial Afib-RVR Initial State (unstable/hypotensive)
+41 Afib-RVR Stabilized DC Cardioversion improves hemodynamics
+43 Afib-RVR Worse More unstable (after time or nodal blocking agent)
+46 Afib-RVR Cardiology Cardiology consult response
+42 Afib-RVR Adenosine Transient state while adenosine administered
+45 Afib-RVR Antiarrhythmic Transient state with amiodarone or others, but still unstable
+44 Afib-RVR critical??? Critical after nodal agents, may be redundant with 43?
+10 PE-COPD-LungCA Shortness of Breath - PE - COPD - Lung Cancer
+11 PE-COPD-LungCA + O2 Shortness of Breath - PE - COPD - Lung Cancer + O2
+12 PE-COPD-LungCA + Anticoagulation Shortness of Breath - PE - COPD - Lung Cancer + Anticoagulation
+8 PE-COPD-LungCA + O2 + Anticoagulation Shortness of Breath - PE - COPD - Lung Cancer + O2 + Anticoagulation
+\.
+
+
+--
+-- Name: sim_state_sim_state_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_state_sim_state_id_seq', 21, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_state_result.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_state_result.dump.sql
new file mode 100644
index 00000000..03039ccd
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_state_result.dump.sql
@@ -0,0 +1,975 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.3.11
+-- Dumped by pg_dump version 9.6.9
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_state_result; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_state_result (sim_state_result_id, sim_state_id, sim_result_id, clinical_item_id, num_value, num_value_noise, text_value, result_flag) FROM stdin;
+4903 2 1000061 \N 0 0 \N \N
+147 7 11010 66124 7.4000000000000004 0.20000000000000001 \N Low
+150 7 11020 66123 25 1 \N Low
+102 0 1004198 66211 \N \N Normal sinus rhythm \N
+4905 14 1000061 66497 0.20000000000000001 0 \N High
+148 7 11000 \N 9.4000000000000004 0.5 \N \N
+149 7 50 \N 17 2 \N \N
+152 7 40 \N 62 3 \N \N
+154 7 10 \N 98.400000000000006 \N \N \N
+155 7 30 \N 102 4 \N \N
+157 7 11030 66258 338 10 \N \N
+6 1 20 \N 112 5 \N High
+9 1 10 \N 101.3 0.20000000000000001 \N High
+17 1 11000 72454 13.6 0.20000000000000001 \N High
+26 1 13060 66286 2.1000000000000001 0 \N High
+145 7 13530 66144 0.20000000000000001 0 \N High
+146 7 13060 66286 1.2 0.10000000000000001 \N High
+153 7 13050 66273 65 3 \N High
+156 7 20 \N 105 4 \N High
+178 9 13080 \N 30 0 \N High
+186 9 11120 \N 90 2 \N High
+189 9 20 \N 117 3 \N High
+192 9 13070 66695 614 13 \N High
+193 9 13730 66866 1432 24 \N High
+151 7 13460 66402 57 4 \N Low
+4904 13 1000061 66497 0.20000000000000001 0 \N High
+4901 7 1000061 66497 0.20000000000000001 0 \N High
+4906 15 1000061 66497 2.5 0 \N High Panic
+1 2 11030 \N 352 23 \N \N
+2 2 70 \N 300 0 \N \N
+3 2 13010 \N 140 0 \N \N
+4 2 13540 \N 124 0 \N \N
+5 2 30 \N 123 4 \N \N
+7 2 13070 \N 110 0 \N \N
+8 2 13260 \N 102 0 \N \N
+10 2 13030 \N 95 0 \N \N
+11 2 40 \N 79 4 \N \N
+12 2 11020 \N 40 1 \N \N
+13 2 13050 \N 27 0 \N \N
+14 2 13040 \N 22 0 \N \N
+15 2 80 \N 15 0 \N \N
+16 2 13250 \N 15 0 \N \N
+18 2 11010 \N 13.4 0.20000000000000001 \N \N
+19 2 50 \N 13 2 \N \N
+20 2 13240 \N 12 0 \N \N
+21 2 13090 \N 8.9000000000000004 0 \N \N
+22 2 13670 \N 6.2999999999999998 0 \N \N
+23 2 13280 \N 5.9000000000000004 0 \N \N
+24 2 13020 \N 4.5 0 \N \N
+25 2 13270 \N 3.8999999999999999 0 \N \N
+27 2 13110 \N 2.1000000000000001 0 \N \N
+28 2 13750 \N 1.5 0 \N \N
+29 2 12040 \N 1 0 \N \N
+30 2 13506 \N 0.90000000000000002 0 \N \N
+31 2 13210 \N 0.80000000000000004 0 \N \N
+32 2 60 \N 0.20999999999999999 0 \N \N
+33 2 13530 \N 0 0 \N \N
+105 3 30 \N 145 3 \N \N
+106 3 40 \N 86 3 \N \N
+107 3 50 \N 20 1 \N \N
+108 3 1004193 \N 0.92000000000000004 0.10000000000000001 \N \N
+109 3 11000 \N 10 0.29999999999999999 \N \N
+110 3 12010 \N 285 17 \N \N
+111 3 13060 \N 1.1000000000000001 0.10000000000000001 \N \N
+113 3 13640 \N 124 4 \N \N
+115 3 1004198 \N \N \N T-wave inversions in V2,V3 \N
+131 6 13410 66407 6.7000000000000002 0.20000000000000001 \N \N
+161 9 17090 \N \N \N Negative \N
+162 9 17100 \N \N \N Negative \N
+163 9 17110 \N \N \N Negative \N
+164 9 17120 \N \N \N Negative \N
+166 9 13060 \N 0.80000000000000004 0.10000000000000001 \N \N
+173 9 11010 \N 14.5 0.69999999999999996 \N \N
+183 9 11020 \N 45 2 \N \N
+184 9 40 \N 72 3 \N \N
+188 9 30 \N 105 4 \N \N
+191 9 11030 \N 270 10 \N \N
+104 3 20 \N 105 2 \N High
+112 3 13250 \N 52 4 \N High
+114 3 13670 \N 7.7999999999999998 0.10000000000000001 \N High
+117 6 10 \N 102 1 \N High
+118 6 20 \N 128 5 \N High
+121 6 50 \N 25 2 \N High
+132 6 13420 66159 480 13 \N High
+133 6 13502 69841 4.4000000000000004 0.10000000000000001 \N High
+134 6 13506 66505 3.2999999999999998 0.20000000000000001 \N High
+103 0 1004195 \N \N \N No acute intrathoracic abnormalities \N
+101 0 1004194 \N \N \N No acute cardiopulmonary abnormalities \N
+143 6 16100 66502 3.3999999999999999 0.20000000000000001 \N High
+144 6 1000173 70921 3.3999999999999999 0.10000000000000001 \N High
+158 9 17050 66506 \N \N 3+ High
+159 9 17040 66507 \N \N 4+ High
+168 9 13020 71563 5.4000000000000004 0 \N High
+175 9 11000 66279 23 1 \N High
+176 9 13050 66273 24 2 \N High
+177 9 50 \N 29 2 \N High
+119 6 30 \N 86 4 \N Low
+120 6 40 \N 43 3 \N Low
+122 6 11000 66630 0.80000000000000004 0 \N Low
+123 6 11010 66124 11.1 0.29999999999999999 \N Low
+124 6 11020 66123 33 1 \N Low
+125 6 11030 66258 95 10 \N Low
+126 6 11120 \N 10 0 \N Low
+127 6 11130 \N 90 0 \N Low
+128 6 11220 66684 80 0 \N Low
+129 6 11240 72951 720 0 \N Low
+130 6 13040 66403 19 1 \N Low
+135 6 15010 66383 7.3399999999999999 0.01 \N Low
+136 6 15020 66375 34 1 \N Low
+137 6 15050 66392 7.3399999999999999 0.01 \N Low
+138 6 15060 66495 34 1 \N Low
+139 6 16010 66413 7.3399999999999999 0.01 \N Low
+140 6 16020 66203 34 1 \N Low
+141 6 16060 66504 7.3399999999999999 0.01 \N Low
+142 6 16070 66493 34 1 \N Low
+165 9 13120 66349 0.5 0 \N Low
+169 9 15010 66383 7.2999999999999998 0 \N Low
+170 9 15050 66392 7.2999999999999998 0 \N Low
+171 9 16010 66413 7.2999999999999998 0 \N Low
+187 9 10 \N 98.400000000000006 0.20000000000000001 \N \N
+4630 15 20 \N 127 3 \N High
+160 9 1000565 72018 5.4000000000000004 0.10000000000000001 Elevated High
+172 9 16060 66504 7.2999999999999998 0 \N Low
+174 9 13040 66403 15 0 \N Low
+179 9 15020 66375 30 0 \N Low
+180 9 15060 66495 30 0 \N Low
+181 9 16020 66203 30 0 \N Low
+182 9 16070 66493 30 0 \N Low
+185 9 13030 66328 80 0 \N Low
+190 9 13010 66194 125 0 \N Low
+4527 13 1000036 \N \N \N B- \N
+4528 13 1004196 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4529 13 1004200 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4530 13 1004198 \N \N \N Sinus tachycardia \N
+4531 13 13530 66144 0.20000000000000001 0 \N High
+4532 13 1000223 \N 1.3999999999999999 0.10000000000000001 \N \N
+4533 13 13060 66286 2.3999999999999999 0.10000000000000001 \N High
+4534 13 12040 66112 2.7000000000000002 0.20000000000000001 \N High
+4535 13 13270 66266 2.7999999999999998 0.10000000000000001 \N Low
+4536 13 1000169 \N 3 \N \N \N
+4537 13 1000121 \N 5 \N \N \N
+4538 13 13220 66283 6.0999999999999996 0.10000000000000001 \N High
+4539 13 13210 66386 6.2999999999999998 0.10000000000000001 \N High
+4540 13 11010 66124 7.5999999999999996 0.10000000000000001 \N Low
+4541 13 1000068 66321 7.5999999999999996 0.10000000000000001 \N Low
+4542 13 11000 \N 9.4000000000000004 0.5 \N \N
+4543 13 50 \N 19 2 \N \N
+4544 13 11020 66123 25 1 \N Low
+4545 13 1000067 66322 25 1 \N Low
+4546 13 12030 66111 28 2 \N High
+4547 13 13720 66380 52 3 \N High
+4548 13 1000120 \N 53 2 \N \N
+4549 13 13460 66402 57 4 \N Low
+4550 13 13240 66370 60 1 \N High
+4551 13 40 \N 62 3 \N \N
+4552 13 13320 66559 72 2 \N High
+275 0 17010 \N \N \N Yellow \N
+4553 13 11030 66258 88 9 \N Low
+4554 13 11040 \N 93 1 \N \N
+4555 13 1004193 \N 96 1 \N \N
+4556 13 13050 66273 96 3 \N High
+4557 13 10 \N 97.900000000000006 \N \N Low
+4558 13 30 \N 101 2 \N \N
+4559 13 20 \N 105 3 \N High
+4560 13 13250 66369 125 2 \N High
+4561 13 13830 67396 186 2 \N High
+4562 13 13260 66371 210 3 \N High
+4563 14 1000036 \N \N \N B- \N
+4564 14 1004196 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4565 14 1004200 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4566 14 1004198 \N \N \N Sinus tachycardia \N
+4567 14 13530 66144 0.20000000000000001 0 \N High
+4568 14 1000223 \N 1.3999999999999999 0.10000000000000001 \N \N
+4569 14 13060 66286 2.3999999999999999 0.10000000000000001 \N High
+4570 14 12040 66112 2.7000000000000002 0.20000000000000001 \N High
+4571 14 13270 66266 2.7999999999999998 0.10000000000000001 \N Low
+4572 14 1000169 \N 3 \N \N \N
+4573 14 1000121 \N 5 \N \N \N
+4574 14 13220 66283 6.0999999999999996 0.10000000000000001 \N High
+4575 14 13210 66386 6.2999999999999998 0.10000000000000001 \N High
+4576 14 11010 66124 7.5999999999999996 0.10000000000000001 \N Low
+4577 14 1000068 66321 7.5999999999999996 0.10000000000000001 \N Low
+4578 14 11000 \N 9.4000000000000004 0.5 \N \N
+4579 14 50 \N 19 2 \N \N
+4580 14 11020 66123 25 1 \N Low
+4581 14 1000067 66322 25 1 \N Low
+4582 14 12030 66111 28 2 \N High
+4583 14 13720 66380 52 3 \N High
+4584 14 1000120 \N 53 2 \N \N
+4585 14 13460 66402 57 4 \N Low
+4586 14 13240 66370 60 1 \N High
+4587 14 40 \N 62 3 \N \N
+4588 14 13320 66559 72 2 \N High
+4589 14 11030 66258 88 9 \N Low
+4590 14 11040 \N 93 1 \N \N
+4591 14 1004193 \N 96 1 \N \N
+4592 14 13050 66273 96 3 \N High
+4593 14 10 \N 97.900000000000006 \N \N Low
+4594 14 30 \N 101 2 \N \N
+4595 14 20 \N 105 3 \N High
+4596 14 13250 66369 125 2 \N High
+4597 14 13830 67396 186 2 \N High
+4598 14 13260 66371 210 3 \N High
+4599 15 1000036 \N \N \N B- \N
+4600 15 1004196 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4601 15 1004200 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4602 15 1004198 \N \N \N Sinus tachycardia \N
+4603 15 1000223 \N 1.3999999999999999 0.10000000000000001 \N \N
+4604 15 13530 66144 2.5 0 \N High Panic
+4605 15 12040 66112 2.7000000000000002 0.20000000000000001 \N High
+4606 15 13270 66266 2.7999999999999998 0.10000000000000001 \N Low
+4607 15 13060 66286 2.8999999999999999 0.10000000000000001 \N High
+4608 15 1000169 \N 3 \N \N \N
+4609 15 1000121 \N 4 \N \N \N
+4610 15 11010 66488 6.0999999999999996 0.10000000000000001 \N Low Panic
+4611 15 13220 66283 6.0999999999999996 0.10000000000000001 \N High
+4612 15 13210 66386 6.2999999999999998 0.10000000000000001 \N High
+4613 15 1000068 72995 7.5999999999999996 0.10000000000000001 \N Low Panic
+4614 15 11000 \N 9.4000000000000004 0.5 \N \N
+4615 15 11020 66436 18 1 \N Low Panic
+4616 15 1000067 72994 18 1 \N Low Panic
+4617 15 12030 66111 28 2 \N High
+4618 15 50 \N 29 2 \N High
+4619 15 1000120 \N 51 2 \N \N
+4620 15 40 \N 54 1 \N Low
+4621 15 13460 66402 57 4 \N Low
+4622 15 13720 66380 63 3 \N High
+4623 15 13320 66559 72 2 \N High
+4624 15 30 \N 85 2 \N Low
+4625 15 11030 66258 85 7 \N Low
+4626 15 11040 \N 93 1 \N \N
+4627 15 1004193 \N 95 1 \N \N
+4628 15 10 \N 97.200000000000003 \N \N Low
+4629 15 13050 66273 103 3 \N High
+4631 15 13240 66370 131 1 \N High
+4632 15 13830 67396 162 2 \N High
+4633 15 13260 66371 210 3 \N High
+4634 15 13250 66369 212 2 \N High
+4635 16 1000036 \N \N \N B- \N
+4636 16 1004196 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4637 16 1004200 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4638 16 1004198 \N \N \N Sinus tachycardia \N
+4639 16 12040 \N 1.3999999999999999 0.10000000000000001 \N \N
+4640 16 1000223 \N 1.3999999999999999 0.10000000000000001 \N \N
+4641 16 13060 66286 1.8 0.10000000000000001 \N High
+4642 16 13270 66266 2.7999999999999998 0.10000000000000001 \N Low
+4643 16 1000169 \N 3 \N \N \N
+4644 16 1000121 \N 4 \N \N \N
+4645 16 13220 66283 6.0999999999999996 0.10000000000000001 \N High
+4646 16 13210 66386 6.2999999999999998 0.10000000000000001 \N High
+4647 16 11010 66124 8.1999999999999993 0.10000000000000001 \N Low
+4648 16 1000068 66321 8.1999999999999993 0.10000000000000001 \N Low
+4649 16 11000 \N 9.4000000000000004 0.5 \N \N
+4650 16 12030 \N 14 1 \N \N
+4651 16 50 \N 18 1 \N \N
+4652 16 11020 66123 25 1 \N Low
+4653 16 1000067 66322 26 1 \N Low
+4654 16 1000120 \N 51 2 \N \N
+4655 16 13460 66402 57 4 \N Low
+4656 16 13720 66380 58 3 \N High
+4657 16 40 \N 61 1 \N \N
+4658 16 13240 66370 71 1 \N High
+4659 16 13320 66559 72 2 \N High
+4813 18 17090 \N \N \N Negative \N
+4660 16 13050 66273 75 1 \N High
+4661 16 11030 66258 89 7 \N Low
+4662 16 11040 \N 93 1 \N \N
+4663 16 20 \N 97 1 \N \N
+4664 16 1004193 \N 97 1 \N \N
+4665 16 10 \N 98.099999999999994 \N \N \N
+4666 16 30 \N 108 2 \N \N
+4667 16 13830 67396 142 2 \N High
+4668 16 13250 66369 154 2 \N High
+4669 16 13260 66371 210 3 \N High
+4670 2 1000036 \N \N \N B- \N
+4671 2 1004196 \N \N \N Coarsened hepatic echotexture, splenomegaly, moderate ascites \N
+4673 2 1004198 \N \N \N Sinus tachycardia \N
+4674 2 12040 \N 1.3999999999999999 0.10000000000000001 \N \N
+4675 2 1000223 \N 1.3999999999999999 0.10000000000000001 \N \N
+4676 2 13060 66286 1.8 0.10000000000000001 \N High
+4677 2 13270 66266 2.7999999999999998 0.10000000000000001 \N Low
+4678 2 1000169 \N 3 \N \N \N
+4679 2 1000121 \N 4 \N \N \N
+4680 2 13220 66283 6.0999999999999996 0.10000000000000001 \N High
+4681 2 13210 66386 6.2999999999999998 0.10000000000000001 \N High
+4682 2 11010 66124 8.1999999999999993 0.10000000000000001 \N Low
+4683 2 1000068 66321 8.1999999999999993 0.10000000000000001 \N Low
+4684 2 11000 \N 9.4000000000000004 0.5 \N \N
+4685 2 50 \N 14 1 \N \N
+4686 2 12030 \N 14 1 \N \N
+4687 2 11020 66123 25 1 \N Low
+4688 2 1000067 66322 26 1 \N Low
+4689 2 1000120 \N 51 2 \N \N
+4690 2 13460 66402 57 4 \N Low
+4691 2 13720 66380 58 3 \N High
+4692 2 40 \N 65 1 \N \N
+4693 2 13240 66370 71 1 \N High
+4694 2 13320 66559 72 2 \N High
+4695 2 13050 66273 75 1 \N High
+4696 2 20 \N 86 1 \N \N
+4697 2 11030 66258 89 7 \N Low
+4698 2 11040 \N 93 1 \N \N
+4699 2 1004193 \N 98 1 \N \N
+4700 2 10 \N 98.5 \N \N \N
+4701 2 30 \N 118 2 \N \N
+4702 2 13830 67396 142 2 \N High
+4703 2 13250 66369 154 2 \N High
+4704 2 13260 66371 210 3 \N High
+4775 21 17050 66506 \N \N 3+ High
+4776 21 17040 66507 \N \N 4+ High
+4777 21 1000565 72018 5.4000000000000004 0.10000000000000001 Elevated High
+4778 21 17090 \N \N \N Negative \N
+4779 21 17100 \N \N \N Negative \N
+4780 21 17110 \N \N \N Negative \N
+4781 21 17120 \N \N \N Negative \N
+4782 21 13120 66349 0.5 0 \N Low
+4783 21 13060 \N 0.80000000000000004 0.10000000000000001 \N \N
+4784 21 13020 71563 5.4000000000000004 0 \N High
+4785 21 15010 66383 7.2999999999999998 0 \N Low
+4786 21 15050 66392 7.2999999999999998 0 \N Low
+4787 21 16010 66413 7.2999999999999998 0 \N Low
+4788 21 16060 66504 7.2999999999999998 0 \N Low
+4789 21 11010 \N 14.5 0.69999999999999996 \N \N
+4790 21 13040 66403 15 0 \N Low
+4791 21 11000 66279 23 1 \N High
+4792 21 13050 66273 24 2 \N High
+4793 21 50 \N 29 2 \N High
+4794 21 13080 \N 30 0 \N High
+4795 21 15020 66375 30 0 \N Low
+4796 21 15060 66495 30 0 \N Low
+4797 21 16020 66203 30 0 \N Low
+4798 21 16070 66493 30 0 \N Low
+4799 21 11020 \N 45 2 \N \N
+4800 21 40 \N 72 3 \N \N
+4801 21 13030 66328 80 0 \N Low
+4802 21 11120 \N 90 2 \N High
+4803 21 10 \N 98.400000000000006 0.20000000000000001 \N \N
+4804 21 30 \N 105 4 \N \N
+4805 21 20 \N 117 3 \N High
+4806 21 13010 66194 125 0 \N Low
+4807 21 11030 \N 270 10 \N \N
+4808 21 13070 66695 614 13 \N High
+4809 21 13730 66866 1432 24 \N High
+4810 18 17050 66506 \N \N 3+ High
+4811 18 17040 66507 \N \N 4+ High
+4812 18 1000565 72018 5.4000000000000004 0.10000000000000001 Elevated High
+4672 0 1004200 \N \N \N No acute intrabdominal findings noted \N
+4814 18 17100 \N \N \N Negative \N
+4815 18 17110 \N \N \N Negative \N
+4816 18 17120 \N \N \N Negative \N
+4817 18 13120 66349 0.5 0 \N Low
+4818 18 13060 \N 0.80000000000000004 0.10000000000000001 \N \N
+4819 18 13020 71563 4.0999999999999996 0 \N High
+4820 18 15010 66383 7.2999999999999998 0 \N Low
+4821 18 15050 66392 7.2999999999999998 0 \N Low
+4822 18 16010 66413 7.2999999999999998 0 \N Low
+4823 18 16060 66504 7.2999999999999998 0 \N Low
+4824 18 11010 \N 14.5 0.69999999999999996 \N \N
+4825 18 11000 66279 18 1 \N High
+4826 18 13040 66403 18 0 \N Low
+4827 18 13050 66273 24 2 \N High
+4828 18 50 \N 26 2 \N High
+4829 18 13080 \N 27 0 \N High
+4830 18 15020 66375 30 0 \N Low
+4831 18 15060 66495 30 0 \N Low
+4832 18 16020 66203 30 0 \N Low
+4833 18 16070 66493 30 0 \N Low
+4834 18 11020 \N 45 2 \N \N
+4835 18 40 \N 76 2 \N \N
+4836 18 13030 66328 80 0 \N Low
+4837 18 11120 \N 90 2 \N High
+4838 18 10 \N 98.599999999999994 0.20000000000000001 \N \N
+4839 18 20 \N 103 3 \N High
+4840 18 30 \N 111 3 \N \N
+4841 18 13010 66194 136 0 \N Low
+4842 18 13070 66695 195 4 \N High
+4843 18 11030 \N 270 10 \N \N
+4844 18 13730 66866 1432 24 \N High
+4845 19 17040 66507 \N \N 1+ High
+4846 19 1000565 72018 5.4000000000000004 0.10000000000000001 Elevated High
+4847 19 13060 \N 0.80000000000000004 0.10000000000000001 \N \N
+4848 19 13020 \N 4.0999999999999996 0 \N \N
+4849 19 15010 66383 7.4000000000000004 0 \N Low
+4850 19 15050 66392 7.4000000000000004 0 \N Low
+4851 19 16010 66413 7.4000000000000004 0 \N Low
+4852 19 16060 66504 7.4000000000000004 0 \N Low
+4853 19 11000 66279 12 1 \N \N
+4854 19 13080 \N 12 0 \N \N
+4855 19 11010 \N 14.5 0.69999999999999996 \N \N
+4856 19 50 \N 15 2 \N \N
+4857 19 13050 \N 16 2 \N \N
+4858 19 13040 \N 24 0 \N \N
+4859 19 15020 66375 40 0 \N Low
+4860 19 15060 66495 40 0 \N Low
+4861 19 16020 66203 40 0 \N Low
+4862 19 16070 66493 40 0 \N Low
+4863 19 11020 \N 45 2 \N \N
+4864 19 40 \N 82 2 \N \N
+4865 19 20 \N 86 3 \N \N
+4866 19 11120 \N 90 2 \N High
+4867 19 13030 \N 90 0 \N \N
+4868 19 10 \N 98.599999999999994 0.10000000000000001 \N \N
+4869 19 30 \N 124 3 \N \N
+4870 19 13010 \N 136 0 \N \N
+4871 19 13070 \N 195 4 \N \N
+4872 19 11030 \N 270 10 \N \N
+4873 20 17040 66507 \N \N 1+ High
+4874 20 1000565 72018 5.4000000000000004 0.10000000000000001 Elevated High
+4875 20 13060 \N 0.80000000000000004 0.10000000000000001 \N \N
+4876 20 13020 66624 2.7999999999999998 0 \N Low
+4877 20 15010 66383 7.2999999999999998 0 \N Low
+4878 20 15050 66392 7.2999999999999998 0 \N Low
+4879 20 16010 66413 7.2999999999999998 0 \N Low
+4880 20 16060 66504 7.2999999999999998 0 \N Low
+4881 20 11000 66279 12 1 \N \N
+4882 20 13040 \N 12 0 \N Low
+4883 20 11010 \N 14.5 0.69999999999999996 \N \N
+4884 20 13050 \N 23 2 \N \N
+4885 20 13080 \N 28 0 \N High
+4886 20 15020 66375 30 0 \N Low
+4887 20 15060 66495 30 0 \N Low
+4888 20 16020 66203 30 0 \N Low
+4889 20 16070 66493 30 0 \N Low
+4890 20 50 \N 33 2 \N High
+4891 20 11020 \N 45 2 \N \N
+4892 20 13070 66549 54 4 \N Low
+4893 20 40 \N 57 2 \N Low
+4894 20 13030 \N 81 0 \N Low
+4895 20 30 \N 85 3 \N Low
+4896 20 11120 \N 90 2 \N High
+4897 20 10 \N 97.900000000000006 0.10000000000000001 \N Low
+4898 20 20 \N 134 3 \N High
+4899 20 13010 \N 138 0 \N \N
+4900 20 11030 \N 270 10 \N \N
+4907 5000 13410 66407 6.7000000000000002 0.20000000000000001 \N \N
+4908 5000 10 \N 102 1 \N High
+4909 5000 20 \N 128 5 \N High
+4910 5000 50 \N 25 2 \N High
+4911 5000 13420 66159 480 13 \N High
+4912 5000 13502 69841 4.4000000000000004 0.10000000000000001 \N High
+4918 5000 11000 66630 0.80000000000000004 0 \N Low
+4919 5000 11010 66124 11.1 0.29999999999999999 \N Low
+4920 5000 11020 66123 33 1 \N Low
+4921 5000 11030 66258 95 10 \N Low
+4922 5000 11120 \N 10 0 \N Low
+4923 5000 11130 \N 90 0 \N Low
+4924 5000 11220 66684 80 0 \N Low
+4925 5000 11240 72951 720 0 \N Low
+4926 5000 13040 66403 19 1 \N Low
+4927 5000 15010 66383 7.3399999999999999 0.01 \N Low
+4928 5000 15020 66375 34 1 \N Low
+4929 5000 15050 66392 7.3399999999999999 0.01 \N Low
+4930 5000 15060 66495 34 1 \N Low
+4931 5000 16010 66413 7.3399999999999999 0.01 \N Low
+4932 5000 16020 66203 34 1 \N Low
+4933 5000 16060 66504 7.3399999999999999 0.01 \N Low
+4934 5000 16070 66493 34 1 \N Low
+4916 5000 30 \N 89 4 \N Low
+4917 5000 40 \N 58 3 \N Low
+4913 5000 13506 66505 3.8999999999999999 0.20000000000000001 \N High
+4914 5000 16100 66502 3.8999999999999999 0.20000000000000001 \N High
+4915 5000 1000173 70921 3.8999999999999999 0.10000000000000001 \N High
+4935 5001 10 \N 99 1 \N High
+4936 5001 20 \N 119 5 \N High
+4937 5001 30 \N 92 4 \N Low
+4938 5001 40 \N 60 3 \N Low
+4939 5001 50 \N 19 2 \N High
+4940 5001 11000 66630 0.80000000000000004 0 \N Low
+4941 5001 11010 66124 11.1 0.29999999999999999 \N Low
+4942 5001 11020 66123 33 1 \N Low
+4943 5001 11030 66258 100 10 \N Low
+4944 5001 11120 \N 10 0 \N Low
+4945 5001 11130 \N 90 0 \N Low
+4946 5001 11220 66684 80 0 \N Low
+4947 5001 11240 72951 720 0 \N Low
+4948 5001 13040 66403 20 1 \N Low
+4949 5001 13410 66407 6.7000000000000002 0.20000000000000001 \N \N
+4950 5001 13420 66159 480 13 \N High
+4951 5001 13502 69841 3.8999999999999999 0.10000000000000001 \N High
+4952 5001 13506 66505 3.3999999999999999 0.20000000000000001 \N High
+4953 5001 15010 66383 7.3399999999999999 0.01 \N Low
+4954 5001 15020 66375 34 1 \N Low
+4955 5001 15050 66392 7.3399999999999999 0.01 \N Low
+4956 5001 15060 66495 34 1 \N Low
+4957 5001 16010 66413 7.3399999999999999 0.01 \N Low
+4958 5001 16020 66203 34 1 \N Low
+4959 5001 16060 66504 7.3399999999999999 0.01 \N Low
+4960 5001 16070 66493 34 1 \N Low
+4961 5001 16100 66502 3.3999999999999999 0.20000000000000001 \N High
+4962 5001 1000173 70921 3.3999999999999999 0.10000000000000001 \N High
+4963 5002 10 \N 101.7 1 \N High
+4964 5002 20 \N 99 5 \N High
+4965 5002 30 \N 106 4 \N Low
+4966 5002 40 \N 69 3 \N Low
+4967 5002 50 \N 16 2 \N High
+4968 5002 11000 66630 0.69999999999999996 0 \N Low
+4969 5002 11010 66124 10.9 0.29999999999999999 \N Low
+4970 5002 11020 66123 31 1 \N Low
+4971 5002 11030 66258 93 10 \N Low
+4972 5002 11120 \N 9 0 \N Low
+4973 5002 11130 \N 91 0 \N Low
+4974 5002 11220 66684 80 0 \N Low
+4975 5002 11240 72951 720 0 \N Low
+4976 5002 13040 66403 22 1 \N Low
+4977 5002 13410 66407 6.7000000000000002 0.20000000000000001 \N \N
+4978 5002 13420 66159 480 13 \N High
+4979 5002 13502 69841 3.8999999999999999 0.10000000000000001 \N High
+4980 5002 13506 66505 2.1000000000000001 0.20000000000000001 \N High
+4981 5002 15010 66383 7.3700000000000001 0.01 \N \N
+4982 5002 15020 66375 37 1 \N \N
+4983 5002 15050 66392 7.3700000000000001 0.01 \N \N
+4984 5002 15060 66495 37 1 \N \N
+4985 5002 16010 66413 7.3700000000000001 0.01 \N \N
+4986 5002 16020 66203 37 1 \N \N
+4987 5002 16060 66504 7.3700000000000001 0.01 \N \N
+4988 5002 16070 66493 37 1 \N \N
+4989 5002 16100 66502 2.1000000000000001 0.20000000000000001 \N High
+4990 5002 1000173 70921 2.1000000000000001 0.10000000000000001 \N High
+4991 5003 10 \N 98.799999999999997 1 \N High
+4992 5003 20 \N 85 5 \N High
+4993 5003 30 \N 114 4 \N Low
+4994 5003 40 \N 77 3 \N Low
+4995 5003 50 \N 14 2 \N High
+4996 5003 11000 66630 0.69999999999999996 0 \N Low
+4997 5003 11010 66124 10.9 0.29999999999999999 \N Low
+4998 5003 11020 66123 31 1 \N Low
+4999 5003 11030 66258 93 10 \N Low
+5000 5003 11120 \N 9 0 \N Low
+5001 5003 11130 \N 91 0 \N Low
+5002 5003 11220 66684 80 0 \N Low
+5003 5003 11240 72951 720 0 \N Low
+5004 5003 13040 66403 23 1 \N Low
+5005 5003 13410 66407 6.7000000000000002 0.20000000000000001 \N \N
+5006 5003 13420 66159 480 13 \N High
+5007 5003 13502 69841 2.2000000000000002 0.10000000000000001 \N High
+5008 5003 13506 66505 1.2 0.20000000000000001 \N \N
+5009 5003 15010 66383 7.3899999999999997 0.01 \N \N
+5010 5003 15020 66375 39 1 \N \N
+5011 5003 15050 66392 7.3899999999999997 0.01 \N \N
+5012 5003 15060 66495 39 1 \N \N
+5013 5003 16010 66413 7.3899999999999997 0.01 \N \N
+5014 5003 16020 66203 39 1 \N \N
+5015 5003 16060 66504 7.3899999999999997 0.01 \N \N
+5016 5003 16070 66493 39 1 \N \N
+5017 5003 16100 66502 1.2 0.20000000000000001 \N \N
+5018 5003 1000173 70921 1.2 0.10000000000000001 \N \N
+5020 2 13504 \N 0.90000000000000002 0 \N \N
+5021 6 13504 66505 3.2999999999999998 0.20000000000000001 \N High
+5022 5000 13504 66505 3.8999999999999999 0.20000000000000001 \N High
+5023 5001 13504 66505 3.3999999999999999 0.20000000000000001 \N High
+5024 5002 13504 66505 2.1000000000000001 0.20000000000000001 \N High
+5025 5003 13504 66505 1.2 0.20000000000000001 \N \N
+404 30 13050 48917 30 \N \N High
+405 30 13060 48574 1.5 \N \N High
+414 30 11030 46090 88 \N \N Low
+415 30 11000 65835 18 \N \N High
+416 30 13504 62151 2.2999999999999998 \N \N High
+422 32 1000330 50510 15 \N \N \N
+425 30 125 49083 \N \N Rare Gram Positive Diplococci, many neutrophils \N
+426 32 125 49083 \N \N Rare Gram Positive Diplococci, many neutrophils \N
+427 33 125 49083 \N \N Rare Gram Positive Diplococci, many neutrophils \N
+428 31 125 49083 \N \N Moderate neutrophils, no organisms seen \N
+430 32 1000156 49020 200 \N \N \N
+434 32 1000155 48577 10 \N \N \N
+429 30 1000156 49020 200 \N \N High
+431 33 1000156 49020 200 \N \N High
+432 31 1000156 49020 200 \N \N High
+433 30 1000155 48577 10 \N \N Low
+435 33 1000155 48577 10 \N \N Low
+421 30 1000330 50510 15 \N \N High
+423 33 1000330 50510 15 \N \N High
+424 31 1000330 50510 15 \N \N High
+6051 43 40 46160 59 \N \N \N
+418 32 1000129 48880 1394 \N Neutrophil 95% High
+443 30 131 62831 \N \N Questionable subtle diffuse meningeal enhancement. \N
+444 30 131 46039 \N \N Questionable subtle diffuse meningeal enhancement. \N
+445 30 131 46065 \N \N Questionable subtle diffuse meningeal enhancement. \N
+446 32 131 62831 \N \N Questionable subtle diffuse meningeal enhancement. \N
+447 32 131 46039 \N \N Questionable subtle diffuse meningeal enhancement. \N
+448 32 131 46065 \N \N Questionable subtle diffuse meningeal enhancement. \N
+476 32 133 45804 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+477 32 133 45983 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+478 32 133 48524 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+479 32 133 50241 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+480 32 133 52016 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+481 32 133 64739 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+482 32 133 65940 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+483 32 133 50098 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+484 32 133 49965 \N \N Preliminary read: No hemorrhage or evidence of ischemic stroke. \N
+500 40 13530 45870 0.59999999999999998 \N \N High
+501 40 13540 45853 1600 \N \N High
+502 40 15010 45760 7.4800000000000004 \N \N High
+503 40 15030 45760 75 \N \N Low
+504 40 15020 45760 31 \N \N Low
+505 40 1000019 45760 21 \N \N Low
+506 40 15050 45919 7.4500000000000002 \N \N High
+507 40 15070 45919 21 \N \N Low
+508 40 15060 45919 38 \N \N Low
+509 40 1001944 45919 19 \N \N Low
+510 41 13530 45870 0.20000000000000001 \N \N High
+511 41 13540 45853 1200 \N \N High
+512 40 1004198 45866 \N \N Atrial fibrillation with rapid ventricular rate. 1mm ST depression in V1-V4 \N
+513 40 200 61832 \N \N EF 71% with LVH, atrial fibrillation. No wall motion abnormality. \N
+514 41 1004198 45866 \N \N Normal sinus rhythm \N
+515 41 200 61832 \N \N EF 68% with LVH, normal sinus rhythm \N
+533 42 131 62831 \N \N DWI demonstrates restricted diffusion in the L temporal lobe, R internal capsule, consistent with cardio-embolic stroke. \N
+534 42 131 46039 \N \N DWI demonstrates restricted diffusion in the L temporal lobe, R internal capsule, consistent with cardio-embolic stroke. \N
+535 42 131 46065 \N \N DWI demonstrates restricted diffusion in the L temporal lobe, R internal capsule, consistent with cardio-embolic stroke. \N
+436 31 1000155 48577 10 \N \N Low
+490 30 10 46160 101.2 \N \N \N
+492 30 20 46160 104 \N \N \N
+494 30 50 46160 18 \N \N \N
+496 30 60 46160 0.95999999999999996 \N \N \N
+498 30 30 46160 104 \N \N \N
+499 30 40 46160 68 \N \N \N
+6000 40 10 46160 97.900000000000006 \N \N \N
+6010 40 20 46160 153 \N \N \N
+6020 40 50 46160 24 \N \N \N
+6030 40 60 46160 0.92000000000000004 \N \N \N
+6040 40 30 46160 83 \N \N \N
+6050 40 40 46160 59 \N \N \N
+6001 43 10 46160 97.900000000000006 \N \N \N
+6011 43 20 46160 153 \N \N \N
+6021 43 50 46160 24 \N \N \N
+6031 43 60 46160 0.92000000000000004 \N \N \N
+6041 43 30 46160 83 \N \N \N
+417 30 1000129 48880 1487 \N Neutrophil 98% High
+6002 44 10 46160 97.900000000000006 \N \N \N
+6012 44 20 46160 123 \N \N \N
+6022 44 50 46160 30 \N \N \N
+6032 44 60 46160 0.89000000000000001 \N \N \N
+6042 44 30 46160 81 \N \N \N
+6052 44 40 46160 59 \N \N \N
+6003 42 10 46160 98.099999999999994 \N \N \N
+6013 42 20 46160 90 \N \N \N
+6023 42 50 46160 18 \N \N \N
+6033 42 60 46160 0.96999999999999997 \N \N \N
+6043 42 30 46160 138 \N \N \N
+6053 42 40 46160 81 \N \N \N
+6004 46 10 46160 98.099999999999994 \N \N \N
+6014 46 20 46160 90 \N \N \N
+6024 46 50 46160 18 \N \N \N
+6034 46 60 46160 0.96999999999999997 \N \N \N
+6044 46 30 46160 138 \N \N \N
+6054 46 40 46160 81 \N \N \N
+6005 41 10 46160 98.099999999999994 \N \N \N
+6015 41 20 46160 87 \N \N \N
+6025 41 50 46160 18 \N \N \N
+6035 41 60 46160 0.96999999999999997 \N \N \N
+6045 41 30 46160 138 \N \N \N
+6055 41 40 46160 81 \N \N \N
+486 30 13504 45918 2.2999999999999998 \N \N High
+487 30 13504 63725 2.2999999999999998 \N \N High
+590 43 200 61832 \N \N EF 71% with LVH, atrial fibrillation. No wall motion abnormality. \N
+591 43 1004198 45866 \N \N Atrial fibrillation with rapid ventricular rate. 1mm ST depression in V1-V4 \N
+95 0 13210 \N 0.69999999999999996 0.20000000000000001 \N \N
+4902 0 1000061 \N 0 0 \N \N
+85 0 13240 \N 13 3 \N \N
+82 0 13250 \N 17 4 \N \N
+74 0 13260 \N 107 9 \N \N
+90 0 13270 \N 3.8999999999999999 0.20000000000000001 \N \N
+79 0 13050 \N 11 2 \N \N
+88 0 13280 \N 6 0.20000000000000001 \N \N
+97 0 13530 \N 0 0 \N \N
+75 0 10 \N 98.700000000000003 0.20000000000000001 \N \N
+72 0 20 \N 68 4 \N \N
+71 0 30 \N 115 4 \N \N
+77 0 40 \N 72 3 \N \N
+84 0 50 \N 13 2 \N \N
+100 0 1004193 \N 0.98999999999999999 0.01 \N \N
+96 0 60 \N 0.20999999999999999 0 \N \N
+68 0 70 \N 300 100 \N \N
+81 0 80 \N 15 0 \N \N
+98 0 11000 \N 6.2000000000000002 0.69999999999999996 \N \N
+83 0 11010 \N 13.4 0.20000000000000001 \N \N
+78 0 11020 \N 40 1 \N \N
+67 0 11030 \N 352 23 \N \N
+93 0 12040 \N 1 0.10000000000000001 \N \N
+89 0 13020 \N 4.5 0.20000000000000001 \N \N
+80 0 13040 \N 24 1 \N \N
+99 0 13060 \N 0.69999999999999996 0.10000000000000001 \N \N
+73 0 13070 \N 110 0 \N \N
+86 0 13090 \N 8.9000000000000004 0.20000000000000001 \N \N
+91 0 13110 \N 2.1000000000000001 0.20000000000000001 \N \N
+94 0 13506 \N 0.69999999999999996 0.20000000000000001 \N \N
+70 0 13540 \N 124 17 \N \N
+87 0 13670 \N 5.2000000000000002 0.10000000000000001 \N \N
+92 0 13750 \N 1.7 0.20000000000000001 \N \N
+221 0 13220 \N 0.5 0.10000000000000001 \N \N
+222 0 13230 \N 0.29999999999999999 0.10000000000000001 \N \N
+226 0 13330 \N 290 3 \N \N
+227 0 13410 \N 4.7999999999999998 0.29999999999999999 \N \N
+228 0 13420 \N 79 3 \N \N
+229 0 13430 \N 105 2 \N \N
+230 0 13440 \N 12 1 \N \N
+231 0 13450 \N 572 6 \N \N
+232 0 13460 \N 144 3 \N \N
+233 0 13470 \N 109 3 \N \N
+235 0 13490 \N 36 2 \N \N
+236 0 13502 \N 0.20000000000000001 0.10000000000000001 \N \N
+237 0 13510 \N 1.2 0.10000000000000001 \N \N
+238 0 13520 \N 87 2 \N \N
+260 0 15030 \N 98 1 \N \N
+261 0 15040 \N 0.20999999999999999 0 \N \N
+262 0 15050 \N 7.3799999999999999 0.01 \N \N
+263 0 15060 \N 41 2 \N \N
+264 0 15070 \N 38 2 \N \N
+265 0 16010 \N 7.3899999999999997 0.01 \N \N
+266 0 16020 \N 40 2 \N \N
+267 0 16030 \N 98 1 \N \N
+268 0 16040 \N 98 1 \N \N
+269 0 16050 \N 0.20999999999999999 0 \N \N
+270 0 16060 \N 7.3799999999999999 0.01 \N \N
+271 0 16070 \N 41 2 \N \N
+272 0 16080 \N 38 2 \N \N
+273 0 16090 \N 65 2 \N \N
+274 0 16100 \N 0.80000000000000004 0.10000000000000001 \N \N
+276 0 17020 \N \N \N Clear \N
+277 0 17030 \N 1.018 0.0030000000000000001 \N \N
+278 0 17040 \N \N \N Negative \N
+279 0 17050 \N \N \N Negative \N
+280 0 17060 \N \N \N Negative \N
+281 0 17070 \N 7.5 0.10000000000000001 \N \N
+282 0 17080 \N \N \N Negative \N
+283 0 17090 \N \N \N Negative \N
+284 0 17100 \N \N \N Negative \N
+285 0 17110 \N 0 0 \N \N
+287 0 17130 \N \N \N Negative \N
+310 0 18040 \N \N \N Negative \N
+311 0 18050 \N \N \N Negative \N
+312 0 18060 \N \N \N Negative \N
+313 0 18070 \N \N \N Negative \N
+314 0 18080 \N \N \N Negative \N
+315 0 18090 \N \N \N Negative \N
+316 0 18100 \N \N \N Negative \N
+326 0 1000001 \N 113 4 \N \N
+194 0 11040 \N 96 1 \N \N
+213 0 12010 \N 84 2 \N \N
+215 0 12030 \N 11 1 \N \N
+218 0 13080 \N 10 1 \N \N
+220 0 13120 \N 3.1000000000000001 0.20000000000000001 \N \N
+239 0 13504 \N 0.80000000000000004 0.10000000000000001 \N \N
+240 0 13610 \N 145 3 \N \N
+242 0 13630 \N 45 2 \N \N
+243 0 13640 \N 107 2 \N \N
+245 0 13660 \N 87 4 \N \N
+246 0 13710 \N 0 0 \N \N
+247 0 13720 \N 11 1 \N \N
+248 0 13730 \N 12 1 \N \N
+249 0 13740 \N 76 3 \N \N
+250 0 13760 \N 1.2 0.10000000000000001 \N \N
+251 0 13770 \N 13 1 \N \N
+252 0 13780 \N 0.5 0.10000000000000001 \N \N
+253 0 13790 \N 8 1 \N \N
+254 0 13810 \N 1.2 0.10000000000000001 \N \N
+255 0 13820 \N 28 2 \N \N
+256 0 13830 \N 0 0 \N \N
+258 0 15010 \N 7.3899999999999997 0.01 \N \N
+259 0 15020 \N 40 2 \N \N
+286 0 17120 \N 0 0 \N \N
+288 0 17140 \N \N \N Negative \N
+289 0 17150 \N \N \N Negative \N
+290 0 17210 \N \N \N Negative \N
+291 0 17220 \N \N \N Negative \N
+292 0 17230 \N \N \N Negative \N
+293 0 17240 \N \N \N Negative \N
+294 0 17250 \N \N \N Negative \N
+295 0 17260 \N \N \N Negative \N
+296 0 17270 \N \N \N Negative \N
+297 0 17280 \N \N \N Negative \N
+298 0 17290 \N \N \N Negative \N
+299 0 17310 \N 13 0 \N \N
+301 0 17330 \N 1132 32 \N \N
+302 0 17340 \N 2.1000000000000001 0.20000000000000001 \N \N
+304 0 17360 \N 32 3 \N \N
+306 0 17380 \N 176 5 \N \N
+307 0 18010 \N \N \N Negative \N
+308 0 18020 \N \N \N Negative \N
+309 0 18030 \N \N \N Negative \N
+5019 0 13504 \N 0.69999999999999996 0.20000000000000001 \N \N
+467 0 133 \N \N \N No acute intracranial abnormality \N
+5030 0 1004202 \N \N \N No cervical spinal abnormalities noted \N
+5031 0 1004196 \N \N \N No intrabdominal pathologies noted \N
+5032 0 1004206 \N \N \N No deep vein thromboses detected \N
+5033 0 131 \N \N \N No acute intracranial abnormality \N
+5034 0 1004203 \N \N \N No cervical spinal abnormalities noted \N
+5035 0 1004204 \N \N \N No thoracic spinal abnormalities noted \N
+5036 0 1004205 \N \N \N No lumbar spinal abnormalities noted \N
+5037 0 1004208 \N \N \N Normal perfusion scan \N
+5038 0 200 \N \N \N Normal systolic function without significant valvular abnormalities \N
+5039 0 1004207 \N \N \N No resting or stress induced wall motion abnormalities noted \N
+5040 10 20 \N 108 4 \N High
+5041 10 30 \N 142 4 \N High
+5042 10 40 \N 94 3 \N High
+5043 10 50 \N 26 2 \N High
+5044 10 1004193 \N 0.81999999999999995 0.01 \N \N
+5045 10 11000 \N 10 0.69999999999999996 \N \N
+5046 10 12010 \N 12632 2 \N High
+5047 10 13040 \N 29 1 \N High
+5048 10 13530 \N 0.10000000000000001 0 \N High
+5049 10 13540 \N 356 17 \N High
+5050 10 13780 \N 1.8 0.10000000000000001 \N High
+5051 10 13790 \N 56 1 \N High
+5052 10 15010 \N 7.4199999999999999 0.01 \N \N
+5053 10 15020 \N 40 2 \N \N
+5054 10 15030 \N 51 1 \N Low
+5055 10 15050 \N 7.4199999999999999 0.01 \N \N
+5056 10 15060 \N 40 2 \N \N
+5057 10 15070 \N 38 2 \N \N
+5058 10 16010 \N 7.4199999999999999 0.01 \N \N
+5059 10 16020 \N 40 2 \N \N
+5060 10 16030 \N 51 1 \N Low
+5061 10 16040 \N 81 1 \N Low
+5062 10 16050 \N 0.20999999999999999 0 \N \N
+5063 10 16060 \N 7.4199999999999999 0.01 \N \N
+5064 10 16070 \N 40 2 \N \N
+5065 10 16080 \N 38 2 \N Low
+5066 10 16090 \N 38 2 \N \N
+5067 10 1000061 \N 0.16 0 \N High
+5068 10 1004194 \N \N \N Increased lung volumes with mild cardiomegaly and blunting of left costophrenic angle. 2cm density in left lower lung. \N
+5069 10 1004195 \N \N \N Multiple filling defects indicating pulmonary emboli off branches of L main pulmonary artery. Moderate emphysematous changes throughout. 2cm spiculated mass in left lower lung, suspicious for malignancy. \N
+5070 10 1004206 \N \N \N 3cm deep vein thrombosis in right calf \N
+5071 10 1004208 \N \N \N Perfusion defects in L lower lung fields. Moderate probability of pulmonary embolism. \N
+5072 10 1004198 \N \N \N Sinus tachycardia \N
+5073 10 200 \N \N \N LVEF 37% with no significant valvular abnormalities noted. RVSP 29. RAP 8. \N
+5074 12 20 \N 112 4 \N High
+5075 12 30 \N 142 4 \N High
+5076 12 40 \N 91 3 \N High
+5077 12 50 \N 26 2 \N High
+5078 12 1004193 \N 0.80000000000000004 0.01 \N \N
+5079 12 11000 \N 10 0.69999999999999996 \N \N
+5080 12 12010 \N 11431 2 \N High
+5081 12 13040 \N 30 1 \N High
+5082 12 13530 \N 0.10000000000000001 0 \N High
+5083 12 13540 \N 356 17 \N High
+5084 12 13780 \N 1.8 0.10000000000000001 \N High
+5085 12 13790 \N 56 1 \N High
+5086 12 15010 \N 7.4199999999999999 0.01 \N \N
+5087 12 15020 \N 40 2 \N \N
+5088 12 15030 \N 51 1 \N Low
+5089 12 15050 \N 7.4199999999999999 0.01 \N \N
+5090 12 15060 \N 40 2 \N \N
+5091 12 15070 \N 38 2 \N \N
+5092 12 16010 \N 7.4199999999999999 0.01 \N \N
+5093 12 16020 \N 40 2 \N \N
+5094 12 16030 \N 51 1 \N Low
+5095 12 16040 \N 81 1 \N Low
+5096 12 16050 \N 0.20999999999999999 0 \N \N
+5097 12 16060 \N 7.4199999999999999 0.01 \N \N
+5098 12 16070 \N 40 2 \N \N
+5099 12 16080 \N 38 2 \N Low
+5100 12 16090 \N 38 2 \N \N
+5101 12 1000061 \N 0.16 0 \N High
+5102 12 1004194 \N \N \N Increased lung volumes with mild cardiomegaly and blunting of left costophrenic angle. 2cm density in left lower lung. \N
+5103 12 1004195 \N \N \N Multiple filling defects indicating pulmonary emboli off branches of L main pulmonary artery. Moderate emphysematous changes throughout. 2cm spiculated mass in left lower lung, suspicious for malignancy. \N
+5104 12 1004206 \N \N \N 3cm deep vein thrombosis in right calf \N
+5105 12 1004208 \N \N \N Perfusion defects in L lower lung fields. Moderate probability of pulmonary embolism. \N
+5106 12 1004198 \N \N \N Sinus tachycardia \N
+5107 12 200 \N \N \N LVEF 37% with no significant valvular abnormalities noted. RVSP 29. RAP 8. \N
+5108 11 20 \N 96 4 \N High
+5109 11 30 \N 132 4 \N \N
+5110 11 40 \N 87 3 \N \N
+5111 11 50 \N 20 2 \N High
+5112 11 1004193 \N 0.92000000000000004 0.01 \N \N
+5113 11 60 \N 0.40000000000000002 0 6L Nasal Cannula \N
+5114 11 11000 \N 10 0.69999999999999996 \N \N
+5115 11 12010 \N 12873 2 \N High
+5116 11 13040 \N 30 1 \N High
+5117 11 13530 \N 0.10000000000000001 0 \N High
+5118 11 13540 \N 356 17 \N High
+5119 11 13780 \N 1.8 0.10000000000000001 \N High
+5120 11 13790 \N 56 1 \N High
+5121 11 15010 \N 7.3899999999999997 0.01 \N \N
+5122 11 15020 \N 45 2 \N \N
+5123 11 15030 \N 64 1 \N \N
+5124 11 15040 \N 0.40000000000000002 0 \N High
+5125 11 15050 \N 7.3899999999999997 0.01 \N \N
+5126 11 15060 \N 45 2 \N High
+5127 11 15070 \N 42 2 \N \N
+5128 11 16010 \N 7.3899999999999997 0.01 \N \N
+5129 11 16020 \N 45 2 \N High
+5130 11 16030 \N 64 1 \N Low
+5131 11 16040 \N 81 1 \N Low
+5132 11 16050 \N 0.40000000000000002 0 \N High
+5133 11 16060 \N 7.3899999999999997 0.01 \N \N
+5134 11 16070 \N 45 2 \N High
+5135 11 16080 \N 42 2 \N Low
+5136 11 16090 \N 38 2 \N \N
+5137 11 1000061 \N 0.14000000000000001 0 \N High
+5138 11 1004194 \N \N \N Increased lung volumes with mild cardiomegaly and blunting of left costophrenic angle. 2cm density in left lower lung. \N
+5139 11 1004195 \N \N \N Multiple filling defects indicating pulmonary emboli off branches of L main pulmonary artery. Moderate emphysematous changes throughout. 2cm spiculated mass in left lower lung, suspicious for malignancy. \N
+5140 11 1004206 \N \N \N 3cm deep vein thrombosis in right calf \N
+5141 11 1004208 \N \N \N Perfusion defects in L lower lung fields. Moderate probability of pulmonary embolism. \N
+5142 11 1004198 \N \N \N Sinus tachycardia \N
+5143 11 200 \N \N \N LVEF 37% with no significant valvular abnormalities noted. RVSP 29. RAP 8. \N
+5144 8 20 \N 91 4 \N High
+5145 8 30 \N 129 4 \N \N
+5146 8 40 \N 83 3 \N \N
+5147 8 50 \N 18 2 \N High
+5148 8 1004193 \N 0.93000000000000005 0.01 \N \N
+5149 8 60 \N 0.40000000000000002 0 6L Nasal Cannula \N
+5150 8 11000 \N 10 0.69999999999999996 \N \N
+5151 8 12010 \N 10653 2 \N High
+5152 8 13040 \N 30 1 \N High
+5153 8 13530 \N 0.10000000000000001 0 \N High
+5154 8 13540 \N 356 17 \N High
+5155 8 13780 \N 1.8 0.10000000000000001 \N High
+5156 8 13790 \N 56 1 \N High
+5157 8 15010 \N 7.3899999999999997 0.01 \N \N
+5158 8 15020 \N 45 2 \N \N
+5159 8 15030 \N 64 1 \N \N
+5160 8 15040 \N 0.40000000000000002 0 \N High
+5161 8 15050 \N 7.3899999999999997 0.01 \N \N
+5162 8 15060 \N 45 2 \N High
+5163 8 15070 \N 42 2 \N \N
+5164 8 16010 \N 7.3899999999999997 0.01 \N \N
+5165 8 16020 \N 45 2 \N High
+5166 8 16030 \N 64 1 \N Low
+5167 8 16040 \N 81 1 \N Low
+5168 8 16050 \N 0.40000000000000002 0 \N High
+5169 8 16060 \N 7.3899999999999997 0.01 \N \N
+5170 8 16070 \N 45 2 \N High
+5171 8 16080 \N 42 2 \N Low
+5172 8 16090 \N 38 2 \N \N
+5173 8 1000061 \N 0.14000000000000001 0 \N High
+5174 8 1004194 \N \N \N Increased lung volumes with mild cardiomegaly and blunting of left costophrenic angle. 2cm density in left lower lung. \N
+5175 8 1004195 \N \N \N Multiple filling defects indicating pulmonary emboli off branches of L main pulmonary artery. Moderate emphysematous changes throughout. 2cm spiculated mass in left lower lung, suspicious for malignancy. \N
+5176 8 1004206 \N \N \N 3cm deep vein thrombosis in right calf \N
+5177 8 1004208 \N \N \N Perfusion defects in L lower lung fields. Moderate probability of pulmonary embolism. \N
+5178 8 1004198 \N \N \N Normal sinus rhythm \N
+5179 8 200 \N \N \N LVEF 37% with no significant valvular abnormalities noted. RVSP 29. RAP 8. \N
+419 33 1000129 48880 1454 \N Neutrophil 96% High
+420 31 1000129 48880 1462 \N Neutrophil 93% High
+-179 5000 13080 \N 16 \N \N High
+69 0 13010 \N 141 2 \N \N
+76 0 13030 \N 106 2 \N \N
+6056 0 1004200 45869 \N \N No intra-abdominal abnormalities noted \N
+6057 0 1004200 49408 \N \N No intra-abdominal abnormalities noted \N
+6058 0 1004200 46343 \N \N No intra-abdominal abnormalities noted \N
+\.
+
+
+--
+-- Name: sim_state_result_sim_state_result_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_state_result_sim_state_result_id_seq', 5179, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_state_transition.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_state_transition.dump.sql
new file mode 100644
index 00000000..d649cf30
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_state_transition.dump.sql
@@ -0,0 +1,136 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.11
+-- Dumped by pg_dump version 9.6.11
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_state_transition; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_state_transition (sim_state_transition_id, pre_state_id, post_state_id, clinical_item_id, time_trigger, description) FROM stdin;
+1 14 15 \N 3600 Active bleed uncontrolled
+3 15 14 65640 \N Transfuse RBC temporarily restabilizes
+4 15 14 61975 \N Transfuse RBC temporarily restabilizes
+5 14 14 65640 \N Transfuse RBC temporarily resets state decay
+6 14 14 61975 \N Transfuse RBC temporarily resets state decay timer
+7 14 14 43996 \N Octreotide temporarily stalls variceal bleed
+8 14 16 61993 \N Coagulopathy corrected with FFP
+9 14 16 65702 \N Coagulopathy corrected with FFP
+10 14 16 44001 \N Cogulopathy stabilized with Vitamin K
+11 16 2 49481 \N GI Consult takes patient for EGD
+12 16 2 45969 \N EGD Ordered and Done
+15 15 17 49481 \N GI Consult Block
+20 15 17 45969 \N EGD Block until stabilize
+21 14 17 49481 \N GI Consult block
+22 14 17 45969 \N EGD Block until stabilize
+23 17 15 \N 0 Consult block immediately to bleeding out state
+24 15 14 45748 \N Transfuse RBC temporarily restabilizes
+25 14 14 45748 \N Transfuse RBC temporarily resets state decay timer
+26 21 18 35850 \N Insulin given for DKA, normalizes glucose
+27 18 20 \N 3600 Only insulin given, DKA patient becomes hypoglycemic
+28 20 18 44201 \N Glucose and or potassium added back?
+30 20 18 44239 \N Glucose and or potassium added back?
+31 20 18 44316 \N Glucose and or potassium added back?
+32 20 18 46277 \N Glucose and or potassium added back?
+33 20 18 46505 \N Glucose and or potassium added back?
+29 18 19 44201 \N Gap closed when ongoing insulin supplemented by glucose and potassium
+34 18 19 44239 \N Gap closed when ongoing insulin supplemented by glucose and potassium
+35 18 19 44316 \N Gap closed when ongoing insulin supplemented by glucose and potassium
+36 18 19 46277 \N Gap closed when ongoing insulin supplemented by glucose and potassium
+37 18 19 46505 \N Gap closed when ongoing insulin supplemented by glucose and potassium
+5000 5000 5001 44391 \N Appropriate antibiotics improve patient condition - Zosyn (pip/tazo)
+5010 5000 5001 44252 \N Appropriate antibiotics improve patient condition - Zosyn (pip/tazo) (alternate)
+5020 5000 5001 44008 \N Appropriate antibiotics improve patient condition - Meropenem
+5030 5000 5001 36210 \N Appropriate antibiotics improve patient condition - Cefepime
+5040 5000 5001 44678 \N Appropriate antibiotics improve patient condition - Aztreonam
+5050 5000 5001 44637 \N Appropriate antibiotics improve patient condition - Ceftazadime
+5100 5000 5002 44198 \N IV Fluid resuscitation improves patient condition - Sodium Chloride/Normal Saline
+5110 5000 5002 44439 \N IV Fluid resuscitation improves patient condition - Lactated Ringers
+5120 5000 5002 44290 \N IV Fluid resuscitation improves patient condition - Lactated Ringers v2
+5210 5001 5003 44198 \N IV Fluid resuscitation improves patient condition - Sodium Chloride/Normal Saline
+5220 5001 5003 44439 \N IV Fluid resuscitation improves patient condition - Lactated Ringers
+5230 5001 5003 44290 \N IV Fluid resuscitation improves patient condition - Lactated Ringers v2
+5300 5002 5003 44391 \N Appropriate antibiotics improve patient condition - Zosyn (pip/tazo)
+5310 5002 5003 44252 \N Appropriate antibiotics improve patient condition - Zosyn (pip/tazo) (alternate)
+5320 5002 5003 44008 \N Appropriate antibiotics improve patient condition - Meropenem
+5330 5002 5003 36210 \N Appropriate antibiotics improve patient condition - Cefepime
+5340 5002 5003 44678 \N Appropriate antibiotics improve patient condition - Aztreonam
+5350 5002 5003 44637 \N Appropriate antibiotics improve patient condition - Ceftazadime
+63 30 31 43997 \N Appropriate antibiotics improve patient condition - Vancomycin
+64 32 31 43997 \N Appropriate antibiotics improve patient condition - Vancomycin
+65 33 31 43997 \N Appropriate antibiotics improve patient condition - Vancomycin
+40 30 31 35733 \N Appropriate antibiotics improve patient condition - Ceftriaxone
+41 32 31 35733 \N Appropriate antibiotics improve patient condition - Ceftriaxone
+42 33 31 35733 \N Appropriate antibiotics improve patient condition - Ceftriaxone
+43 30 31 36210 \N Appropriate antibiotics improve patient condition - Cefepime
+44 32 31 36210 \N Appropriate antibiotics improve patient condition - Cefepime
+50 30 33 \N 3600 Patient condition worsens after 1 hr of inadquate empiric treatment
+45 33 31 36210 \N Appropriate antibiotics improve patient condition - Cefepime
+46 30 31 44008 \N Appropriate antibiotics improve patient condition - Meropenem
+47 32 31 44008 \N Appropriate antibiotics improve patient condition - Meropenem
+48 33 31 44008 \N Appropriate antibiotics improve patient condition - Meropenem
+57 40 46 49251 \N Cardiology Consultation
+58 40 43 35846 \N Nodal Agents worsen hypotension
+59 40 43 44327 \N Nodal Agents worsen hypotension
+60 40 45 35968 \N Transient improvement with amiodarone
+500 40 41 -100 \N Cardioversion improves hemodynamics
+51 43 45 35968 \N Transient improvement with amiodarone
+54 40 42 46605 \N Adenosine evaluation
+56 43 41 -100 \N Cardioversion improves hemodynamics - from critical post diuretics
+62 43 42 46605 \N Adenosine evaluation
+86 44 43 \N \N \N
+85 44 43 \N \N \N
+80 44 43 \N \N \N
+81 44 43 \N \N \N
+82 44 43 \N \N \N
+83 44 43 \N \N \N
+84 44 43 \N \N \N
+69 40 43 44004 \N Diuretics worsen hypotension
+87 10 11 45900 \N Oxygen supplementation
+88 10 11 45864 \N Oxygen supplementation
+89 10 11 45921 \N Oxygen supplementation
+90 10 12 44359 \N Anticoagulation, but still hypoxic (Heparin IV)
+91 10 12 44250 \N Anticoagulation, but still hypoxic (Enoxaparin)
+92 10 12 60178 \N Anticoagulation, but still hypoxic (Rivaroxaban - Note Apixiban not available in 2014 data)
+93 11 8 44359 \N Oxygen + Anticoagulation added
+94 11 8 44250 \N Oxygen + Anticoagulation added
+95 11 8 60178 \N Oxygen + Anticoagulation added
+96 12 8 45900 \N Anticoagulation + Oxygen supplemented
+97 12 8 45864 \N Anticoagulation + Oxygen supplemented
+98 12 8 45921 \N Anticoagulation + Oxygen supplemented
+61 45 43 \N 0 Amiodarone not enough to stabilize. Send to worse state to avoid repeating initial history
+53 46 43 \N 0 Consult completed. Send to worse state to avoid repeating initial history
+55 42 43 \N 0 Adenosine wears off. Send to worse state to avoid repeating initial history
+-9 15 16 65702 \N Coagulopathy corrected with FFP
+-10 15 16 44001 \N Cogulopathy stabilized with Vitamin K
+-8 15 16 61993 \N Coagulopathy corrected with FFP
+-21 14 16 45872 \N Coagulopathy corrected with FFP
+-22 15 16 45872 \N Coagulopathy corrected with FFP
+-23 14 14 50618 \N Transfuse RBC temporarily restabilizes
+-24 15 14 50618 \N Transfuse RBC temporarily restabilizes
+\.
+
+
+--
+-- Name: sim_state_transition_sim_state_transition_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_state_transition_sim_state_transition_id_seq', 98, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/cpoe/cpoeSim/simdata/sim_user.dump.sql b/medinfo/cpoe/cpoeSim/simdata/sim_user.dump.sql
new file mode 100644
index 00000000..91ca9ec8
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/simdata/sim_user.dump.sql
@@ -0,0 +1,101 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.3.11
+-- Dumped by pg_dump version 9.6.9
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: sim_user; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY public.sim_user (sim_user_id, name) FROM stdin;
+0 Default User
+1 Jonathan Chen
+9 User1
+2 User2
+10 User3
+11 User4
+12 User5
+13 User6
+15 x_JimmyTooley
+16 xa_generic_test
+17 x_KaiSwenson
+19 x_KS_3
+21 x_SK_3
+23 minh
+25 x_jc_user4
+26 tester
+27 son_5
+29 sw_6
+30 al_7
+31 gl_8
+33 phy_9
+34 kh_10
+35 rph_11
+38 r13
+39 r12
+40 mw13
+41 alice14
+42 phy15
+43 r16
+44 r17
+45 r18
+46 r19
+47 r20
+48 r21
+49 r22
+50 r23
+51 kg24
+52 kp25
+53 r26
+54 r27
+55 LisaShieh
+57 JH
+59 sp28
+60 ms29
+61 km30
+62 ab31
+63 cm32
+64 sv33
+65 pb32
+66 br33
+67 mel99
+68 ij34
+69 aa35
+70 dy36
+71 cd37
+72 cw37
+73 xd_jonc
+74 ek38
+75 vk39
+76 arp40
+77 dr41
+78 cc42
+79 vg43
+80 cw43
+81 jz44
+\.
+
+
+--
+-- Name: sim_user_sim_user_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('public.sim_user_sim_user_id_seq', 81, true);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/medinfo/cpoe/cpoeSim/test/Const.py b/medinfo/cpoe/cpoeSim/test/Const.py
new file mode 100644
index 00000000..6cf4f0a4
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/test/Const.py
@@ -0,0 +1,26 @@
+"""Various constants for use by the application module test cases"""
+
+import logging
+
+"""Application name, for example to identify a common logger object"""
+APPLICATION_NAME = "medinfo.cpoe.cpoeSim.test"
+
+"""Default level for application logging. Modify these for different scenarios.
+See Python logging package documentation for more information
+"""
+LOGGER_LEVEL = logging.ERROR
+
+"""Default format of logger output"""
+LOGGER_FORMAT = "[%(asctime)s %(levelname)s] %(message)s"
+
+"""Verbosity of the test runner"""
+RUNNER_VERBOSITY = 2
+
+"""Application logger level. Set this to higher level to suppress uninteresting
+application output during test runs."""
+APP_LOGGER_LEVEL = logging.CRITICAL
+#APP_LOGGER_LEVEL = logging.DEBUG
+
+
+"""For some test cases with many test points, don't want to abort the entire test if just one item fails"""
+ALLOW_MULTIPLE_ERRORS = True;
diff --git a/medinfo/cpoe/cpoeSim/test/TestMakeUsageReport.py b/medinfo/cpoe/cpoeSim/test/TestMakeUsageReport.py
new file mode 100644
index 00000000..701348ad
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/test/TestMakeUsageReport.py
@@ -0,0 +1,198 @@
+import unittest
+import mock
+import os
+
+from .Const import RUNNER_VERBOSITY
+from medinfo.db.test.Util import DBTestCase
+from medinfo.cpoe.cpoeSim.analysis import make_usage_report
+from .Util import log, captured_output
+from medinfo.db import DBUtil
+from medinfo.cpoe.cpoeSim.SimManager import SimManager
+from io import StringIO
+import tempfile
+import csv
+
+header = ['user', 'patient', 'start_time', 'elapsed_time', 'total_num_clicks', 'num_note_clicks',
+ 'num_results_review_clicks', 'recommended_options', 'unique_recommended_options',
+ 'manual_search_options', 'total_orders', 'orders_from_recommender', 'orders_from_manual_search',
+ 'orders_from_recommender_missed']
+
+
+def mock_aggregate_simulation_data(data_home, output_path):
+ # create mock csv - we're not testing aggregate_simulation_data here
+ content = [['1', '1']]
+
+ with open(output_path, 'w') as outfile:
+ outfile.write(str.join(',', header) + '\n')
+ for row in content:
+ outfile.write(str.join(',', row) + '\n')
+
+
+@mock.patch('medinfo.cpoe.cpoeSim.analysis.make_usage_report.aggregate_simulation_data',
+ side_effect=mock_aggregate_simulation_data)
+class TestMakeUsageReport(DBTestCase):
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self)
+ self.usage_reporter = SimManager()
+
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata()
+ self.usage_reporter.buildCPOESimSchema()
+
+ log.info("Populate the database with test data")
+
+ # Basically import a bunch of rigged CSV or TSV files that have realistic simulating case and grading data
+ # Get that data into the test database
+ clinical_item_category_str = \
+ """clinical_item_category_id;source_table
+ 1;source_table
+ """
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(clinical_item_category_str), "clinical_item_category", delim=";")
+
+ clinical_item_str = \
+ """clinical_item_id;clinical_item_category_id;name
+ 1;1;Clinical item 1
+ """
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(clinical_item_str), "clinical_item", delim=";")
+
+ clinical_item_str = \
+ """sim_user_id;name
+ 1;Jonathan Chen
+ """
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(clinical_item_str), "sim_user", delim=";")
+
+ sim_patient_str = \
+ """sim_patient_id;name;age_years;gender
+ 1;Patient One;40;Male
+ """
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_patient_str), "sim_patient", delim=";")
+
+ sim_state_str = \
+ """sim_state_id;name
+ 1;Sim state 1
+ """
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_state_str), "sim_state", delim=";")
+
+ sim_patient_order_str = \
+ """sim_patient_order_id;sim_user_id;sim_patient_id;clinical_item_id;relative_time_start;sim_state_id
+ 1;1;1;1;1;1
+ """
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_patient_order_str), "sim_patient_order", delim=";")
+
+ sim_grading_key_str = \
+ """sim_grader_id;sim_state_id;clinical_item_id;score;group_name;sim_case_name
+ Jonathan Chen;1;1;1;g1;case_name
+ Andre Kumar;1;1;2;g1;case_name
+ """
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_grading_key_str), "sim_grading_key", delim=";")
+
+ # Prepare survey file
+ self.survey_csv = tempfile.NamedTemporaryFile(mode='w+', delete=False)
+ self.survey_csv.write("Physician User Name,resident" + os.linesep +
+ "Jonathan Chen,1")
+ self.survey_csv.flush()
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ DBTestCase.tearDown(self)
+
+ # delete temporary survey file
+ self.survey_csv.close()
+ os.remove(self.survey_csv.name)
+
+ # delete output csv
+ try:
+ os.remove(tempfile.gettempdir() + os.pathsep + 'tmp.csv')
+ except OSError:
+ pass
+
+ def test_not_enough_args(self, mock_aggregate_simulation_data):
+ # setup
+ argv = ['make_usage_report.py', '-g', tempfile.gettempdir() + '/tmp.csv']
+
+ # test & verify
+ self.verify_error_message_for_argv(argv, "Given parameters are not enough. Exiting.")
+
+ def test_no_grader(self, mock_aggregate_simulation_data):
+ # setup
+ argv = ['make_usage_report.py', '../analysis/sim_data', tempfile.gettempdir() + '/tmp.csv']
+
+ # test & verify
+ self.verify_error_message_for_argv(argv, "No graders given. Cannot grade patient cases. Exiting.")
+
+ def test_single_grader(self, mock_aggregate_simulation_data):
+ # setup
+ output_filename = tempfile.gettempdir() + '/tmp.csv'
+ argv = ['make_usage_report.py', '../analysis/sim_data', '-g', 'Jonathan Chen', output_filename]
+
+ # test
+ make_usage_report.main(argv)
+
+ # verify
+ with open(output_filename) as output_file:
+ output = csv.DictReader(output_file)
+ self.assertTrue('grade ({})'.format(argv[3]) in output.fieldnames)
+ # assert more columns than original + grade column
+ self.assertGreater(len(output.fieldnames), len(header) + 1)
+
+ def test_multiple_graders(self, mock_aggregate_simulation_data):
+ # setup
+ output_filename = tempfile.gettempdir() + '/tmp.csv'
+ argv = ['make_usage_report.py', '../analysis/sim_data', '-g', 'Jonathan Chen,Andre Kumar', output_filename]
+
+ # test
+ make_usage_report.main(argv)
+
+ # verify
+ with open(output_filename) as output_file:
+ output = csv.DictReader(output_file)
+ self.assertTrue('grade ({})'.format(argv[3].split(',')[0]) in output.fieldnames)
+ self.assertTrue('grade ({})'.format(argv[3].split(',')[1]) in output.fieldnames)
+ # assert more columns than original + grade columns
+ self.assertGreater(len(output.fieldnames), len(header) + 2)
+
+ def test_resident_column_is_present(self, mock_aggregate_simulation_data):
+ # setup
+ output_filename = tempfile.gettempdir() + '/tmp.csv'
+ argv = ['make_usage_report.py', '../analysis/sim_data', '-s', self.survey_csv.name, '-g', 'Jonathan Chen', output_filename]
+
+ # test
+ make_usage_report.main(argv)
+
+ # verify
+ with open(output_filename) as output_file:
+ output = csv.DictReader(output_file)
+ self.assertTrue('resident' in output.fieldnames)
+
+ def verify_error_message_for_argv(self, argv, expected_error_message):
+ with self.assertRaises(SystemExit) as cm: # capture sys.exit() in the tested class
+ with captured_output() as (out, err):
+ make_usage_report.main(argv)
+
+ actual_output = out.getvalue()
+ self.assertEqual(expected_error_message, actual_output.split("\n", 1)[0])
+
+ self.assertIsNone(cm.exception.code) # we can verify exception code here
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(unittest.makeSuite(TestMakeUsageReport))
+
+ return test_suite
+
+
+if __name__ == "__main__":
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/cpoe/test/TestSimManager.py b/medinfo/cpoe/cpoeSim/test/TestSimManager.py
similarity index 69%
rename from medinfo/cpoe/test/TestSimManager.py
rename to medinfo/cpoe/cpoeSim/test/TestSimManager.py
index 1303e74b..8f58f2e3 100644
--- a/medinfo/cpoe/test/TestSimManager.py
+++ b/medinfo/cpoe/cpoeSim/test/TestSimManager.py
@@ -2,35 +2,41 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel, modelListFromTable;
-from medinfo.cpoe.SimManager import SimManager;
+from medinfo.cpoe.cpoeSim.SimManager import SimManager;
class TestSimManager(DBTestCase):
def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
-
+
+ self.manager = SimManager(); # Instance to test on
+
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+ self.manager.buildCPOESimSchema();
+
self.testPatientId = None;
-
+
self.purgeTestRecords();
-
+
log.info("Populate the database with test data")
self.clinicalItemCategoryIdStrList = list();
headers = ["clinical_item_category_id","source_table"];
dataModels = \
- [
+ [
RowItemModel( [-1, "Labs"], headers ),
RowItemModel( [-2, "Imaging"], headers ),
RowItemModel( [-3, "Meds"], headers ),
@@ -44,9 +50,9 @@ def setUp(self):
headers = ["clinical_item_id","clinical_item_category_id","name","analysis_status"];
dataModels = \
- [
+ [
RowItemModel( [-1, -1, "CBC",1], headers ),
- RowItemModel( [-2, -1, "BMP",1], headers ),
+ RowItemModel( [-2, -1, "BMP",1], headers ),
RowItemModel( [-3, -1, "Hepatic Panel",1], headers ),
RowItemModel( [-4, -1, "Cardiac Enzymes",1], headers ),
RowItemModel( [-5, -2, "CXR",1], headers ),
@@ -113,7 +119,7 @@ def setUp(self):
""" # Parse into DB insertion object
DBUtil.insertFile( StringIO(dataTextStr), "sim_result", delim=";");
- # Map orders to expected results.
+ # Map orders to expected results.
# Simplify expect vital signs to result in 5 minutes. Basic chemistry labs in 10 minutes, CBC in 15 minutes
dataTextStr = \
"""sim_order_result_map_id;clinical_item_id;sim_result_id;turnaround_time
@@ -146,6 +152,7 @@ def setUp(self):
dataTextStr = \
"""sim_state_id;name;description
+0;Test 0; Test State 0
-1;Test 1;Test State 1
-2;Test 2;Test State 2
-3;Test 3;Test State 3
@@ -174,13 +181,13 @@ def setUp(self):
# Order Vital Signs at time 0, then basic labs (CBC, BMP, LFTs) at 10 minutes (600 seconds)
dataTextStr = \
"""sim_patient_order_id;sim_user_id;sim_patient_id;sim_state_id;clinical_item_id;relative_time_start;relative_time_end
--1;-1;-1;-1;-15;0;0
--2;-1;-1;-1;-1;600;600
--3;-1;-1;-1;-2;600;600
--4;-1;-1;-1;-3;600;600
--5;-1;-1;-2;-15;1800;1800
--6;-1;-1;-2;-1;1800;1800
--7;-1;-1;-2;-2;1800;1800
+-1;-1;-1;-1;-15;0;None
+-2;-1;-1;-1;-1;600;None
+-3;-1;-1;-1;-2;600;None
+-4;-1;-1;-1;-3;600;None
+-5;-1;-1;-2;-15;1800;None
+-6;-1;-1;-2;-1;1800;None
+-7;-1;-1;-2;-2;1800;None
""" # Parse into DB insertion object
DBUtil.insertFile( StringIO(dataTextStr), "sim_patient_order", delim=";");
@@ -234,8 +241,6 @@ def setUp(self):
""" # Parse into DB insertion object
DBUtil.insertFile( StringIO(dataTextStr), "sim_note", delim=";");
- self.manager = SimManager(); # Instance to test on
-
def purgeTestRecords(self):
log.info("Purge test records from the database")
if self.testPatientId is not None:
@@ -251,11 +256,11 @@ def purgeTestRecords(self):
DBUtil.execute("delete from sim_result where sim_result_id < 0");
DBUtil.execute("delete from sim_patient_state where sim_state_id < 0 or sim_patient_state_id < 0");
DBUtil.execute("delete from sim_state_transition where pre_state_id < 0");
- DBUtil.execute("delete from sim_state where sim_state_id < 0");
+ DBUtil.execute("delete from sim_state where sim_state_id <= 0");
DBUtil.execute("delete from sim_user where sim_user_id < 0");
DBUtil.execute("delete from sim_patient where sim_patient_id < 0");
DBUtil.execute("delete from clinical_item where clinical_item_id < 0");
-
+
def tearDown(self):
"""Restore state from any setUp or test steps"""
self.purgeTestRecords();
@@ -267,13 +272,13 @@ def test_copyPatientTemplate(self):
templatePatientId = -1;
self.testPatientId = self.manager.copyPatientTemplate( newPatientData, templatePatientId );
futureTime = 1000000; # Far future time to test that we still only copied the results up to time zero
-
+
# Verify basic patient information
patientCols = ["name","age_years","gender","sim_state_id"];
patientModel = self.manager.loadPatientInfo([self.testPatientId])[0];
expectedPatientModel = RowItemModel(["Template Copy",60,"Female",-1], patientCols);
self.assertEqualDict(expectedPatientModel, patientModel, patientCols);
-
+
# Verify notes
dataCols = ["sim_patient_id","content"];
sampleData = self.manager.loadNotes(self.testPatientId, futureTime);
@@ -282,15 +287,15 @@ def test_copyPatientTemplate(self):
RowItemModel([self.testPatientId,"Initial Note"], dataCols), # Second copy because another state initiation at time zero and negative onset time
];
self.assertEqualDictList(verifyData, sampleData, dataCols);
-
+
# Verify orders
dataCols = ["sim_user_id","sim_patient_id","sim_state_id","clinical_item_id","relative_time_start","relative_time_end"];
sampleData = self.manager.loadPatientOrders(self.testPatientId, futureTime, loadActive=None);
verifyData = \
- [ RowItemModel([-1,self.testPatientId,-1,-15,0,0], dataCols),
+ [ RowItemModel([-1,self.testPatientId,-1,-15,0,None], dataCols),
];
self.assertEqualDictList(verifyData, sampleData, dataCols);
-
+
# Verify states
dataCols = ["sim_patient_id","sim_state_id","relative_time_start","relative_time_end"];
query = SQLQuery();
@@ -310,15 +315,15 @@ def test_copyPatientTemplate(self):
def test_loadResults(self):
# Query for results based on simulated turnaround times, including fallback to default normal values
# if no explicit (abnormal) values specified for simulated state
-
+
colNames = ["name", "num_value", "result_relative_time"];
-
+
# Time zero, no orders for diagnostics, so no results should exist
patientId = -1;
relativeTime = 0;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
];
self.assertEqualDictList(verifyResults, sampleResults, colNames);
@@ -326,7 +331,7 @@ def test_loadResults(self):
relativeTime = 120;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
];
self.assertEqualDictList(verifyResults, sampleResults, colNames);
@@ -334,7 +339,7 @@ def test_loadResults(self):
relativeTime = 300;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
RowItemModel(["Temp", 101.4, 300], colNames),
RowItemModel(["Pulse", 115, 300], colNames),
RowItemModel(["SBP", 92, 300], colNames),
@@ -347,7 +352,7 @@ def test_loadResults(self):
relativeTime = 600;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
RowItemModel(["Temp", 101.4, 300], colNames),
RowItemModel(["Pulse", 115, 300], colNames),
RowItemModel(["SBP", 92, 300], colNames),
@@ -360,7 +365,7 @@ def test_loadResults(self):
relativeTime = 1200;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
RowItemModel(["Temp", 101.4, 300], colNames),
RowItemModel(["Pulse", 115, 300], colNames),
RowItemModel(["SBP", 92, 300], colNames),
@@ -388,13 +393,13 @@ def test_loadResults(self):
relativeTime = 1500;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
RowItemModel(["Temp", 101.4, 300], colNames),
RowItemModel(["Pulse", 115, 300], colNames),
RowItemModel(["SBP", 92, 300], colNames),
RowItemModel(["DBP", 55, 300], colNames),
RowItemModel(["Resp", 12, 300], colNames), # Normal result retrieve from default state 0
-
+
RowItemModel(["NA", 140, 1200], colNames),
RowItemModel(["K", 4.5, 1200], colNames),
RowItemModel(["CL", 95, 1200], colNames),
@@ -422,13 +427,13 @@ def test_loadResults(self):
relativeTime = 1800;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
RowItemModel(["Temp", 101.4, 300], colNames),
RowItemModel(["Pulse", 115, 300], colNames),
RowItemModel(["SBP", 92, 300], colNames),
RowItemModel(["DBP", 55, 300], colNames),
RowItemModel(["Resp", 12, 300], colNames), # Normal result retrieve from default state 0
-
+
RowItemModel(["NA", 140, 1200], colNames),
RowItemModel(["K", 4.5, 1200], colNames),
RowItemModel(["CL", 95, 1200], colNames),
@@ -456,13 +461,13 @@ def test_loadResults(self):
relativeTime = 2700;
sampleResults = self.manager.loadResults(patientId, relativeTime);
verifyResults = \
- [
+ [
RowItemModel(["Temp", 101.4, 300], colNames),
RowItemModel(["Pulse", 115, 300], colNames),
RowItemModel(["SBP", 92, 300], colNames),
RowItemModel(["DBP", 55, 300], colNames),
RowItemModel(["Resp", 12, 300], colNames), # Normal result retrieve from default state 0
-
+
RowItemModel(["NA", 140, 1200], colNames),
RowItemModel(["K", 4.5, 1200], colNames),
RowItemModel(["CL", 95, 1200], colNames),
@@ -489,7 +494,7 @@ def test_loadResults(self):
RowItemModel(["SBP", 130, 2100], colNames),
RowItemModel(["DBP", 85, 2100], colNames),
RowItemModel(["Resp", 12, 2100], colNames),
-
+
RowItemModel(["NA", 140, 2400], colNames),
RowItemModel(["K", 4.5, 2400], colNames),
RowItemModel(["CL", 95, 2400], colNames),
@@ -506,27 +511,211 @@ def test_loadResults(self):
];
self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ def test_discontinueOrders(self):
+ # Verify behavior of discontinuing/cancelling orders
+ # Should not generate subsequent results or count as "recent items" that should
+ # be considered to trigger recommender. If cancelled at same time as order time,
+ # then delete the record altogether.
+
+ colNames = ["name", "num_value", "result_relative_time"];
+
+ # See setUp for test data construction
+ userId = -1;
+ patientId = -1;
+
+ # Time zero, vital sign orders check entered (clinical_item_id = -15, sim_patient_order_id = -1)
+ # Time 2 minutes, orders done, but not long-enough to get results back, so no results should exist
+ relativeTime = 120;
+ sampleResults = self.manager.loadResults(patientId, relativeTime);
+ verifyResults = \
+ [
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Record of vital sign order (but not yet resulted)
+ sampleRecentItemIds = self.manager.recentItemIds(patientId, relativeTime);
+ verifyRecentItemIds = set([-15]);
+ self.assertEqual(verifyRecentItemIds, sampleRecentItemIds);
+
+
+ # Time 5 minutes, vital signs should result now
+ relativeTime = 300;
+ sampleResults = self.manager.loadResults(patientId, relativeTime);
+ verifyResults = \
+ [
+ RowItemModel(["Temp", 101.4, 300], colNames),
+ RowItemModel(["Pulse", 115, 300], colNames),
+ RowItemModel(["SBP", 92, 300], colNames),
+ RowItemModel(["DBP", 55, 300], colNames),
+ RowItemModel(["Resp", 12, 300], colNames), # Normal result retrieve from default state 0
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Restrict recent item search to limited time that should miss the vital sign order
+ sampleRecentItemIds = self.manager.recentItemIds(patientId, relativeTime, 100);
+ verifyRecentItemIds = set([]);
+ self.assertEqual(verifyRecentItemIds, sampleRecentItemIds);
+
+ # Include longer time difference that should catch the prior order
+ sampleRecentItemIds = self.manager.recentItemIds(patientId, relativeTime, 400);
+ verifyRecentItemIds = set([-15]);
+ self.assertEqual(verifyRecentItemIds, sampleRecentItemIds);
+
+
+ # Go back and simulate the vitals check order being discontinued before results came back
+ discontinueTime = 120;
+ newOrderItemIds = []; # No new orders
+ discontinuePatientOrderIds = [-1]; # See setUp data for the ID of the order to simulate canceling
+ self.manager.signOrders(userId, patientId, discontinueTime, newOrderItemIds, discontinuePatientOrderIds);
+
+ # Redo simulation of Time 5 minutes, vital signs should not appear now, since order was cancelled
+ relativeTime = 300;
+ sampleResults = self.manager.loadResults(patientId, relativeTime);
+ verifyResults = \
+ [
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Check that there is still a record of orders, including the cancelled one (but not in "recent items" list)
+ orderCols = ["name","relative_time_start","relative_time_end"];
+ sampleOrders = self.manager.loadPatientOrders(patientId, 300, loadActive=None);
+ verifyOrders = \
+ [
+ RowItemModel(["Vital Signs", 0, 120], orderCols),
+ ];
+ self.assertEqualDictList(verifyOrders, sampleOrders, orderCols);
+
+ sampleRecentItemIds = self.manager.recentItemIds(patientId, relativeTime);
+ verifyRecentItemIds = set([]); # Don't count the cancelled order
+ self.assertEqual(verifyRecentItemIds, sampleRecentItemIds);
+
+ # Go back and simulate the vitals check order being discontinued immediately (same time as order),
+ # then don't even keep a record of it to clean up data entry error
+ discontinueTime = 0;
+ newOrderItemIds = []; # No new orders
+ discontinuePatientOrderIds = [-1]; # See setUp data for the ID of the order to simulate canceling
+ self.manager.signOrders(userId, patientId, discontinueTime, newOrderItemIds, discontinuePatientOrderIds);
+
+ # Check that there is no record of the order anymore, even including the cancelled one
+ orderCols = ["name","relative_time_start","relative_time_end"];
+ sampleOrders = self.manager.loadPatientOrders(patientId, 300, loadActive=None);
+ verifyOrders = \
+ [
+ ];
+ self.assertEqualDictList(verifyOrders, sampleOrders, orderCols);
+
+ sampleRecentItemIds = self.manager.recentItemIds(patientId, relativeTime);
+ verifyRecentItemIds = set([]);
+ self.assertEqual(verifyRecentItemIds, sampleRecentItemIds);
+
+ def test_loadPendingResultOrders(self):
+ # Verify behavior of finding patient orders that will, but have not yet, yielded test results
+ colNames = ["clinical_item_id", "name", "time_until_result"];
+
+ # See setUp for test data construction
+ userId = -1;
+ patientId = -1;
+
+ # Time zero, vital sign orders check entered (clinical_item_id = -15, sim_patient_order_id = -1)
+ # Time 2 minutes, orders done, but not long-enough to get results back, so no results should exist, but can see pending result
+ relativeTime = 120;
+ sampleResults = self.manager.loadPendingResultOrders(patientId, relativeTime);
+ verifyResults = \
+ [ RowItemModel([-15, "Vital Signs", 300-(120-0)], colNames),
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Time 5 minutes, vital signs should result now. So no pending results
+ relativeTime = 300;
+ sampleResults = self.manager.loadPendingResultOrders(patientId, relativeTime);
+ verifyResults = \
+ [
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Go back and simulate the vitals check order being discontinued before results came back
+ discontinueTime = 100;
+ newOrderItemIds = []; # No new orders
+ discontinuePatientOrderIds = [-1]; # See setUp data for the ID of the order to simulate canceling
+ self.manager.signOrders(userId, patientId, discontinueTime, newOrderItemIds, discontinuePatientOrderIds);
+
+ # Redo simulation shortly after. Should not show pending results since order was cancelled
+ relativeTime = 120;
+ sampleResults = self.manager.loadPendingResultOrders(patientId, relativeTime);
+ verifyResults = \
+ [
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Time 10 minutes, should have multiple pending orders just entered
+ relativeTime = 600;
+ sampleResults = self.manager.loadPendingResultOrders(patientId, relativeTime);
+ verifyResults = \
+ [ # Show results sorted by time until result, then alphabetical order
+ RowItemModel([-2, "BMP", 600-(600-600)], colNames),
+ RowItemModel([-3, "Hepatic Panel", 600-(600-600)], colNames),
+ RowItemModel([-1, "CBC", 900-(600-600)], colNames),
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Time 20 minutes, some of the results should be back, while others still pending
+ relativeTime = 1200;
+ sampleResults = self.manager.loadPendingResultOrders(patientId, relativeTime);
+ verifyResults = \
+ [
+ RowItemModel([-1, "CBC", 900-(1200-600)], colNames),
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Go back and sign new orders of same type
+ relativeTime = 900;
+ orderItemIds = [-1,-2];
+ self.manager.signOrders(userId, patientId, relativeTime, orderItemIds);
+
+ # Should now see some overlapping pending order times
+ relativeTime = 1200;
+ sampleResults = self.manager.loadPendingResultOrders(patientId, relativeTime);
+ verifyResults = \
+ [ # If multiple results with same time until result, then show in order of first one ordered
+ RowItemModel([-1, "CBC", 900-(1200-600)], colNames),
+ RowItemModel([-2, "BMP", 600-(1200-900)], colNames),
+ RowItemModel([-1, "CBC", 900-(1200-900)], colNames),
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
+ # Later batch of more orders at 30 minutes
+ relativeTime = 1800;
+ sampleResults = self.manager.loadPendingResultOrders(patientId, relativeTime);
+ verifyResults = \
+ [
+ RowItemModel([-15, "Vital Signs", 300-(1800-1800)], colNames),
+ RowItemModel([-2, "BMP", 600-(1800-1800)], colNames),
+ RowItemModel([-1, "CBC", 900-(1800-1800)], colNames),
+ ];
+ self.assertEqualDictList(verifyResults, sampleResults, colNames);
+
def test_stateTransition(self):
# Query for results based on simulated turnaround times, including fallback to default normal values
# if no explicit (abnormal) values specified for simulated state
-
+
colNames = ["sim_state_id"];
userId = -1;
patientId = -1;
-
+
# Time zero, initial state expected
relativeTime = 0;
samplePatient = self.manager.loadPatientInfo([patientId], relativeTime)[0];
verifyPatient = RowItemModel([-1], colNames);
self.assertEqualDict(samplePatient, verifyPatient, colNames);
- # After previously recorded second state
+ # After previously recorded second state
relativeTime = 2000;
samplePatient = self.manager.loadPatientInfo([patientId], relativeTime)[0];
verifyPatient = RowItemModel([-2], colNames);
self.assertEqualDict(samplePatient, verifyPatient, colNames);
-
+
# Sign orders that do not affect this state
orderItemIds = [-4,-5];
self.manager.signOrders(userId, patientId, relativeTime, orderItemIds);
@@ -553,7 +742,7 @@ def test_stateTransition(self):
samplePatient = self.manager.loadPatientInfo([patientId], relativeTime)[0];
verifyPatient = RowItemModel([-2], colNames);
self.assertEqualDict(samplePatient, verifyPatient, colNames);
-
+
# Retroactive query to verify state 1 intermediate transition state
relativeTime = 12000;
samplePatient = self.manager.loadPatientInfo([patientId], relativeTime)[0];
@@ -589,6 +778,53 @@ def test_stateTransition(self):
verifyPatient = RowItemModel([-4], colNames);
self.assertEqualDict(samplePatient, verifyPatient, colNames);
+ def test_loadPatientLastEventTime(self):
+ # Query for last time have a record of a patient order start or cancellation
+ # as natural point to resume a simulated case
+
+ # See setUp for test data construction
+ userId = -1;
+ patientId = -1;
+
+ # Initial test data already loaded with example orders
+ sampleValue = self.manager.loadPatientLastEventTime(patientId);
+ verifyValue = 1800;
+ self.assertEqual(verifyValue, sampleValue);
+
+ # Sign an additional order
+ relativeTime = 2000;
+ newOrderItemIds = [-1]; # Any additional order
+ self.manager.signOrders(userId, patientId, relativeTime, newOrderItemIds);
+
+ # Verify update of last order time
+ sampleValue = self.manager.loadPatientLastEventTime(patientId);
+ verifyValue = 2000;
+ self.assertEqual(verifyValue, sampleValue);
+
+ # Find and cancel the last order at a later time
+ relativeTime = 2200;
+ patientOrders = self.manager.loadPatientOrders(patientId, relativeTime);
+ lastOrder = patientOrders[0];
+ for patientOrder in patientOrders:
+ if lastOrder["relative_time_start"] < patientOrder["relative_time_start"]:
+ lastOrder = patientOrder;
+
+ newOrderItemIds = []; # No new orders
+ discontinuePatientOrderIds = [lastOrder["sim_patient_order_id"]];
+ self.manager.signOrders(userId, patientId, relativeTime, newOrderItemIds, discontinuePatientOrderIds);
+
+ # Verify update of last order time includes discontinue times
+ sampleValue = self.manager.loadPatientLastEventTime(patientId);
+ verifyValue = 2200;
+ self.assertEqual(verifyValue, sampleValue);
+
+ # Lookup patient with no prior orders recorded, then should default to time 0
+ patientId = -2;
+ sampleValue = self.manager.loadPatientLastEventTime(patientId);
+ verifyValue = 0;
+ self.assertEqual(verifyValue, sampleValue);
+
+
def suite():
"""Returns the suite of tests to run for this test class / module.
@@ -596,13 +832,14 @@ def suite():
methods for the given class whose name starts with "test"
"""
suite = unittest.TestSuite();
- #suite.addTest(TestSimManager("test_compositeRelated"));
- #suite.addTest(TestSimManager("test_insertFile_skipErrors"));
- #suite.addTest(TestSimManager('test_executeIterator'));
- #suite.addTest(TestSimManager('test_deactivateAnalysis'));
+ #suite.addTest(TestSimManager("test_copyPatientTemplate"));
+ #suite.addTest(TestSimManager("test_loadPatientLastEventTime"));
+ #suite.addTest(TestSimManager('test_loadPendingResultOrders'));
+ #suite.addTest(TestSimManager('test_stateTransition'));
+ #suite.addTest(TestSimManager('test_discontinueOrders'));
suite.addTest(unittest.makeSuite(TestSimManager));
-
+
return suite;
-
+
if __name__=="__main__":
unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/cpoe/cpoeSim/test/TestSimManagerGrading.py b/medinfo/cpoe/cpoeSim/test/TestSimManagerGrading.py
new file mode 100644
index 00000000..c76b249a
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/test/TestSimManagerGrading.py
@@ -0,0 +1,258 @@
+#!/usr/bin/env python
+"""Test case for respective module in application package"""
+
+import unittest
+from io import BytesIO # for Python 3 use StringIO
+from io import StringIO
+
+import json
+import csv
+from .Const import RUNNER_VERBOSITY
+from medinfo.common.Const import COMMENT_TAG, VALUE_DELIM
+from .Util import log, captured_output
+from medinfo.cpoe.cpoeSim.SimManager import SimManager
+from medinfo.db import DBUtil
+from medinfo.db.test.Util import DBTestCase
+
+
+class TestSimManagerGrading(DBTestCase):
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self)
+
+ self.manager = SimManager() # Instance to test on
+
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata()
+ self.manager.buildCPOESimSchema()
+
+ log.info("Populate the database with test data")
+
+ # Basically import a bunch of rigged CSV or TSV files that have realistic simulating case and grading data
+ # Get that data into the test database
+ clinical_item_category_str = \
+"""clinical_item_category_id;source_table
+1;source_table
+"""
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(clinical_item_category_str), "clinical_item_category", delim=";")
+
+ clinical_item_str = \
+"""clinical_item_id;clinical_item_category_id;name
+1;1;Clinical item 1
+2;1;Clinical item 2
+3;1;Clinical item 3
+4;1;Clinical item 4
+5;1;Clinical item 5
+6;1;Clinical item 6
+7;1;Clinical item 7
+"""
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(clinical_item_str), "clinical_item", delim=";")
+
+ clinical_item_str = \
+"""sim_user_id;name
+0;Default user
+1;Jonathan Chen
+2;User 2
+3;User 3
+4;User 4
+"""
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(clinical_item_str), "sim_user", delim=";")
+
+ sim_patient_str = \
+"""sim_patient_id;name;age_years;gender
+1;Patient One;40;Male
+2;Patient Two;50;Female
+3;Patient Three;60;Male
+4;Patient Four;70;Female
+5;Patient Five;80;Male
+6;Patient Six;90;Female
+7;Patient Seven;100;Male
+"""
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_patient_str), "sim_patient", delim=";")
+
+ sim_state_str = \
+"""sim_state_id;name
+1;Sim state 1
+2;Sim state 2
+3;Sim state 3
+4;Sim state 4
+5;Sim state 5
+6;Sim state 6
+7;Sim state 7
+"""
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_state_str), "sim_state", delim=";")
+
+ sim_patient_order_str = \
+"""sim_patient_order_id;sim_user_id;sim_patient_id;clinical_item_id;relative_time_start;sim_state_id
+1;0;1;1;1;1
+2;1;1;2;2;2
+3;1;1;3;3;3
+4;1;1;4;4;4
+5;1;1;5;5;5
+6;1;1;6;6;6
+7;1;1;7;7;7
+8;2;2;1;1;1
+9;3;2;2;2;1
+10;3;2;3;3;2
+11;2;3;1;1;1
+12;3;3;2;2;2
+13;3;3;3;3;3
+14;1;4;1;1;2
+15;1;4;2;2;3
+16;2;5;1;1;3
+17;2;5;2;2;4
+18;3;6;4;1;1
+19;3;6;4;2;2
+20;3;6;4;3;3
+21;4;7;5;1;1
+22;4;7;5;2;2
+23;4;7;5;3;3
+24;4;7;5;4;4
+"""
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_patient_order_str), "sim_patient_order", delim=";")
+
+ sim_grading_key_str = \
+"""sim_grader_id;sim_state_id;clinical_item_id;score;group_name
+Jonathan Chen;1;1;1;g1
+Jonathan Chen;2;2;1;g2
+Jonathan Chen;3;3;1;g3
+Jonathan Chen;4;4;1;
+Jonathan Chen;5;5;1;g5
+Jonathan Chen;6;6;1;
+Jonathan Chen;7;7;1;g7
+Jonathan Chen;3;1;1;g8
+Jonathan Chen;4;2;1;g8
+Jonathan Chen;1;4;-1000;
+Jonathan Chen;2;4;10;
+Jonathan Chen;3;4;2000;
+Jonathan Chen;1;5;-1000;g9
+Jonathan Chen;2;5;-1;
+Jonathan Chen;3;5;0;g10
+Jonathan Chen;3;5;-500;
+"""
+ # Parse into DB insertion object
+ DBUtil.insertFile(StringIO(sim_grading_key_str), "sim_grading_key", delim=";")
+
+ self.expected_grades_by_patient_id = [
+ {
+ "total_score": 6, # Default user (id = 0) is ignored and NULL group_names are counted separately
+ "sim_patient_id": 1,
+ "most_graded_user_id": 1,
+ "most_active_user_id": 1,
+ "sim_grader_id": "Jonathan Chen"
+ },
+ {
+ "total_score": 1, # Ungraded (clinical_item_id, sim_state_id) keys are omitted from summation
+ "sim_patient_id": 2,
+ "most_graded_user_id": 2, # Most graded user is User 2 (even though most active is User 3)
+ "most_active_user_id": 3,
+ "sim_grader_id": "Jonathan Chen"
+ },
+ {
+ "total_score": 3,
+ "sim_patient_id": 3,
+ "most_graded_user_id": 3, # Most graded user is the most active one
+ "most_active_user_id": 3,
+ "sim_grader_id": "Jonathan Chen"
+ },
+ # 4: No grading available for the existing case
+ {
+ "total_score": 1, # Scores in the same group g8 are counted only once
+ "sim_patient_id": 5,
+ "most_graded_user_id": 2,
+ "most_active_user_id": 2,
+ "sim_grader_id": "Jonathan Chen"
+ },
+ {
+ "total_score": 1010, # Non-uniform scores (i.e., not all scores = 1)
+ "sim_patient_id": 6,
+ "most_graded_user_id": 3,
+ "most_active_user_id": 3,
+ "sim_grader_id": "Jonathan Chen"
+ },
+ {
+ "total_score": -1501, # All negative and one 0 score results in negative score
+ "sim_patient_id": 7,
+ "most_graded_user_id": 4,
+ "most_active_user_id": 4,
+ "sim_grader_id": "Jonathan Chen"
+ }
+ # 8: Case doesn't exist
+ ]
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ DBTestCase.tearDown(self)
+
+ def test_gradeCases(self):
+ # Give the application ID of some simulated patient test cases and the name
+ # of a grading key and just verify that it produces the expected results
+ sim_patient_ids = [1, 2, 3, 4, 5, 6, 7, 8]
+ sim_grading_key_id = "Jonathan Chen"
+ actual_grades_by_patient_id = self.manager.grade_cases(sim_patient_ids, sim_grading_key_id)
+ self.assertEqual(self.expected_grades_by_patient_id, actual_grades_by_patient_id)
+
+ def test_commandLine(self):
+ argv = ["SimManager.py", "-p", "1,2,3,4,5,6", "-g", "Jonathan Chen"]
+ with captured_output() as (out, err):
+ self.manager.main(argv)
+
+ actual_output = out.getvalue()
+
+ actual_comment_line, output_csv = actual_output.split("\n", 1)
+
+ # verify comment line
+ expected_comment_line = COMMENT_TAG + " " + json.dumps({"argv": argv})
+ self.assertEqual(expected_comment_line, actual_comment_line)
+
+ # verify csv
+ actual_output_csv = StringIO(output_csv)
+ reader = csv.DictReader(actual_output_csv)
+ # verify header
+ self.assertEqualList(sorted(self.expected_grades_by_patient_id[0].keys()), sorted(reader.fieldnames))
+
+ # verify lines
+ for line_num, actual_grade in enumerate(reader):
+ expected_grade_str_values = {k: str(v) for k, v in self.expected_grades_by_patient_id[line_num].items()}
+ self.assertEqual(expected_grade_str_values, actual_grade)
+
+ def test_commandLine_no_patientIds(self):
+ argv = ["SimManager.py", "-g", "Jonathan Chen"]
+ self.verify_error_message_for_argv(argv, "No patient cases given. Nothing to grade. Exiting.")
+
+ def test_commandLine_no_graderIds(self):
+ argv = ["SimManager.py", "-p", "1"]
+ self.verify_error_message_for_argv(argv, "No graders given. Cannot grade patient cases. Exiting.")
+
+ def verify_error_message_for_argv(self, argv, expected_error_message):
+ with self.assertRaises(SystemExit) as cm: # capture sys.exit() in the tested class
+ with captured_output() as (out, err):
+ self.manager.main(argv)
+
+ actual_output = out.getvalue()
+ self.assertEqual(expected_error_message, actual_output.split("\n", 1)[0])
+
+ self.assertIsNone(cm.exception.code) # we can verify exception code here
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(unittest.makeSuite(TestSimManagerGrading))
+
+ return test_suite
+
+
+# TODO testcase for different scores for same group in different state
+
+if __name__ == "__main__":
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/cpoe/cpoeSim/test/Util.py b/medinfo/cpoe/cpoeSim/test/Util.py
new file mode 100644
index 00000000..8114a5a4
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/test/Util.py
@@ -0,0 +1,35 @@
+from . import Const
+import sys, os
+import logging
+import cgi
+from collections import UserDict
+import unittest
+from contextlib import contextmanager
+from io import StringIO
+
+from medinfo.db.test.Util import DBTestCase;
+
+import medinfo.cpoe.Util;
+
+
+log = logging.getLogger("CDSS")
+
+handler = logging.StreamHandler(sys.stderr)
+formatter = logging.Formatter(Const.LOGGER_FORMAT)
+
+handler.setFormatter(formatter)
+log.addHandler(handler)
+
+# Suppress uninteresting application output
+medinfo.cpoe.Util.log.setLevel(Const.APP_LOGGER_LEVEL)
+
+
+@contextmanager
+def captured_output():
+ new_out, new_err = StringIO(), StringIO()
+ old_out, old_err = sys.stdout, sys.stderr
+ try:
+ sys.stdout, sys.stderr = new_out, new_err
+ yield sys.stdout, sys.stderr
+ finally:
+ sys.stdout, sys.stderr = old_out, old_err
diff --git a/medinfo/cpoe/cpoeSim/test/__init__.py b/medinfo/cpoe/cpoeSim/test/__init__.py
new file mode 100644
index 00000000..7aa19f47
--- /dev/null
+++ b/medinfo/cpoe/cpoeSim/test/__init__.py
@@ -0,0 +1,7 @@
+# Nothing much for now, just enable importing of various modules as a common package
+# Test modules should be added here to be included in the "test_all" module suite
+
+__all__ = \
+ [
+
+ ];
diff --git a/medinfo/cpoe/test/Const.py b/medinfo/cpoe/test/Const.py
index 615d145d..04b1d359 100644
--- a/medinfo/cpoe/test/Const.py
+++ b/medinfo/cpoe/test/Const.py
@@ -5,10 +5,10 @@
"""Application name, for example to identify a common logger object"""
APPLICATION_NAME = "medinfo.cpoe.test"
-"""Default level for application logging. Modify these for different scenarios.
+"""Default level for application logging. Modify these for different scenarios.
See Python logging package documentation for more information
"""
-LOGGER_LEVEL = logging.DEBUG
+LOGGER_LEVEL = logging.ERROR
"""Default format of logger output"""
LOGGER_FORMAT = "[%(asctime)s %(levelname)s] %(message)s"
@@ -23,4 +23,4 @@
"""For some test cases with many test points, don't want to abort the entire test if just one item fails"""
-ALLOW_MULTIPLE_ERRORS = True;
\ No newline at end of file
+ALLOW_MULTIPLE_ERRORS = True;
diff --git a/medinfo/cpoe/test/TestAssociationAnalysis.py b/medinfo/cpoe/test/TestAssociationAnalysis.py
index 98ec56ec..534109e0 100644
--- a/medinfo/cpoe/test/TestAssociationAnalysis.py
+++ b/medinfo/cpoe/test/TestAssociationAnalysis.py
@@ -2,12 +2,12 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
-from Util import log;
+from .Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
@@ -17,594 +17,596 @@
from medinfo.cpoe.AssociationAnalysis import AssociationAnalysis, AnalysisOptions;
class TestAssociationAnalysis(DBTestCase):
- def setUp(self):
- """Prepare state for test cases"""
- DBTestCase.setUp(self);
-
- log.info("Populate the database with test data")
-
- self.clinicalItemCategoryIdStrList = list();
- headers = ["clinical_item_category_id","source_table"];
- dataModels = \
- [
- RowItemModel( [-1, "Labs"], headers ),
- RowItemModel( [-2, "Imaging"], headers ),
- RowItemModel( [-3, "Meds"], headers ),
- RowItemModel( [-4, "Nursing"], headers ),
- RowItemModel( [-5, "Problems"], headers ),
- RowItemModel( [-6, "Lab Results"], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", dataModel );
- self.clinicalItemCategoryIdStrList.append( str(dataItemId) );
-
- headers = ["clinical_item_id","clinical_item_category_id","name","analysis_status"];
- dataModels = \
- [
- RowItemModel( [-1, -1, "CBC",1], headers ),
- RowItemModel( [-2, -1, "BMP",0], headers ), # Clear analysis status, so this will be ignored unless changed
- RowItemModel( [-3, -1, "Hepatic Panel",1], headers ),
- RowItemModel( [-4, -1, "Cardiac Enzymes",1], headers ),
- RowItemModel( [-5, -2, "CXR",1], headers ),
- RowItemModel( [-6, -2, "RUQ Ultrasound",1], headers ),
- RowItemModel( [-7, -2, "CT Abdomen/Pelvis",1], headers ),
- RowItemModel( [-8, -2, "CT PE Thorax",1], headers ),
- RowItemModel( [-9, -3, "Acetaminophen",1], headers ),
- RowItemModel( [-10, -3, "Carvedilol",1], headers ),
- RowItemModel( [-11, -3, "Enoxaparin",1], headers ),
- RowItemModel( [-12, -3, "Warfarin",1], headers ),
- RowItemModel( [-13, -3, "Ceftriaxone",1], headers ),
- RowItemModel( [-14, -4, "Foley Catheter",1], headers ),
- RowItemModel( [-15, -4, "Strict I&O",1], headers ),
- RowItemModel( [-16, -4, "Fall Precautions",1], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", dataModel );
-
- headers = ["patient_item_id","encounter_id","patient_id","clinical_item_id","item_date"];
- dataModels = \
- [
- RowItemModel( [-1, -111, -11111, -4, datetime(2000, 1, 1, 0)], headers ),
- RowItemModel( [-2, -111, -11111, -10, datetime(2000, 1, 1, 0)], headers ),
- RowItemModel( [-3, -111, -11111, -8, datetime(2000, 1, 1, 2)], headers ),
- RowItemModel( [-4, -112, -11111, -10, datetime(2000, 1, 2, 0)], headers ),
- RowItemModel( [-5, -112, -11111, -12, datetime(2000, 2, 1, 0)], headers ),
- RowItemModel( [-10, -222, -22222, -7, datetime(2000, 1, 5, 0)], headers ),
- RowItemModel( [-12, -222, -22222, -6, datetime(2000, 1, 9, 0)], headers ),
- RowItemModel( [-13, -222, -22222, -11, datetime(2000, 1, 9, 0)], headers ),
- RowItemModel( [-14, -333, -33333, -6, datetime(2000, 2, 9, 0)], headers ),
- RowItemModel( [-15, -333, -33333, -2, datetime(2000, 2,11, 0)], headers ), # Will set clinical_item_link inheritances to this item to only record certain associations
- RowItemModel( [-16, -333, -33333, -11, datetime(2000, 2,11, 0)], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("patient_item", dataModel );
-
- headers = ["clinical_item_id","linked_item_id"];
- dataModels = \
- [ # Don't have direct, but instead demonstrate inherited relationship from 6 to 2 will still be recognized
- RowItemModel( [-6, -4], headers ),
- RowItemModel( [-4, -2], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_link", dataModel );
-
- # Temp filename for data buffer
- self.bufferFilename = "updateBufferTemp.txt"
-
- self.analyzer = AssociationAnalysis(); # Instance to test on
-
- def tearDown(self):
- """Restore state from any setUp or test steps"""
- log.info("Purge test records from the database")
-
- DBUtil.execute("delete from clinical_item_link where clinical_item_id < 0");
- DBUtil.execute("delete from clinical_item_association where clinical_item_id < 0");
- DBUtil.execute("delete from patient_item where patient_item_id < 0");
- DBUtil.execute("delete from clinical_item where clinical_item_id < 0");
- DBUtil.execute("delete from clinical_item_category where clinical_item_category_id in (%s)" % str.join(",", self.clinicalItemCategoryIdStrList) );
-
- # Deletes any temp bufferFile
- dirname = os.path.dirname(self.bufferFilename);
- if dirname == "": dirname = ".";
- for filename in os.listdir(dirname):
- if filename.startswith(self.bufferFilename):
- os.remove(os.path.join(dirname,filename));
-
- DBTestCase.tearDown(self);
-
- def test_analyzePatientItems_commandLine_bufferFile(self):
- # Run the association analysis, save to a file, and update from the file to the database, all command-line control
- associationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
- patient_count_2592000, patient_count_7776000, patient_count_31536000,
- patient_count_any,
- patient_time_diff_sum, patient_time_diff_sum_squares
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
-
- log.debug("Use incremental update, including date filters to start.");
- self.analyzer.main(["AssociationAnalysis.py","-s","2000-01-09","-e","2000-02-11","-b",self.bufferFilename,"-p","1", "0,-22222,-33333"]);
- self.analyzer.main(["AssociationAnalysis.py","-b",self.bufferFilename]);
-
- expectedAssociationStats = \
- [
- [-11,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -6,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- ];
-
- associationStats = DBUtil.execute(associationQuery)
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 )
-
-
-
- log.debug("Use incremental update, only doing the update based on a part of the data.");
- self.analyzer.main(["AssociationAnalysis.py","-b",self.bufferFilename,"0,-22222,-33333"]);
- self.analyzer.main(["AssociationAnalysis.py","-b",self.bufferFilename]);
-
- expectedAssociationStats = \
- [
- [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
-
- [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- def test_analyzePatientItemsFromBuffer(self):
- # Run the association analysis, save to a file, and update from the file to the database
- associationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
- patient_count_2592000, patient_count_7776000, patient_count_31536000,
- patient_count_any,
- patient_time_diff_sum, patient_time_diff_sum_squares
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
-
- log.debug("Use incremental update, including date filters to start.");
- analysisOptions = AnalysisOptions();
- analysisOptions.patientIds = [-22222, -33333];
- analysisOptions.startDate = datetime(2000,1,9);
- analysisOptions.endDate = datetime(2000,2,11);
- analysisOptions.bufferFile = self.bufferFilename;
-
- self.analyzer.analyzePatientItems(analysisOptions)
- self.analyzer.commitUpdateBufferFromFile(self.bufferFilename)
-
- expectedAssociationStats = \
- [
- [-11,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -6,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- ];
-
- associationStats = DBUtil.execute(associationQuery)
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 )
-
-
-
- log.debug("Use incremental update, only doing the update based on a part of the data.");
- analysisOptions = AnalysisOptions();
- analysisOptions.patientIds = [-22222, -33333];
- analysisOptions.bufferFile = self.bufferFilename;
-
- self.analyzer.analyzePatientItems( analysisOptions );
- self.analyzer.commitUpdateBufferFromFile(self.bufferFilename)
-
- expectedAssociationStats = \
- [
- [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
-
- [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- def test_analyzePatientItems(self):
- # Run the association analysis against the mock test data above and verify
- # expected stats afterwards.
-
- associationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
- patient_count_2592000, patient_count_7776000, patient_count_31536000,
- patient_count_any,
- patient_time_diff_sum, patient_time_diff_sum_squares
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
-
-
- log.debug("Use incremental update, including date filters to start.");
- analysisOptions = AnalysisOptions();
- analysisOptions.patientIds = [-22222, -33333];
- analysisOptions.startDate = datetime(2000,1,9);
- analysisOptions.endDate = datetime(2000,2,11);
- self.analyzer.analyzePatientItems( analysisOptions );
-
- expectedAssociationStats = \
- [
- [-11,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -6,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
-
- log.debug("Use incremental update, only doing the update based on a part of the data.");
- analysisOptions = AnalysisOptions();
- analysisOptions.patientIds = [-22222, -33333];
- self.analyzer.analyzePatientItems( analysisOptions );
-
- expectedAssociationStats = \
- [
- [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
-
- [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- log.debug("Expand incremental update, by now including additional clinical items whose analysis status previously excluded them.");
- DBUtil.updateRow("clinical_item",{"analysis_status":1},-2);
- analysisOptions.patientIds = [-22222, -33333];
- self.analyzer.analyzePatientItems( analysisOptions );
-
- expectedAssociationStats = \
- [
- [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
-
- [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
-
- [ -2,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
-
- log.debug("Incremental update that includes a single patient data being split, so have to account for all of those dependencies");
-
- headers = ["patient_item_id","encounter_id","patient_id","clinical_item_id","item_date"];
- dataModels = \
- [
- RowItemModel( [-1111, -334, -33333, -3, datetime(2000, 2,11, 8)], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("patient_item", dataModel );
-
- analysisOptions.patientIds = [-22222, -33333];
- self.analyzer.analyzePatientItems( analysisOptions );
-
- expectedAssociationStats = \
- [
- [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
-
- [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 201600.0, 40642560000.0],
-
- [ -3,-11, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
-
- [ -2,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- ];
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- log.debug("Negative test case, repeating analysis should not change any results");
- analysisOptions.patientIds = [-22222, -33333];
- self.analyzer.analyzePatientItems( analysisOptions );
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- log.debug("Complete the remaining incremental update");
- analysisOptions.patientIds = [-11111, -22222, -33333];
- self.analyzer.analyzePatientItems( analysisOptions );
-
- expectedAssociationStats = \
- [ # Note that sum-squares in particular gets rounded off due to large values
- [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-10, -12, 0, 0, 0, 0, 0, 1, 1, 1, 2678400.0, 7173830000000.0], # Longer time diff?
- [-10, -10, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -12, 0, 0, 0, 0, 0, 1, 1, 1, 2671200.0, 7135310000000.0], # Longer diff
- [ -8, -10, 0, 0, 1, 1, 1, 1, 1, 1, 79200.0, 6272640000.0],
- [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 201600.0, 40642600000.0],
- [ -4, -12, 0, 0, 0, 0, 0, 1, 1, 1, 2678400.0, 7173830000000.0], # ???
- [ -4, -10, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0]
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- # Check the association stats for non-unique counts as well (allowing for repeats)
- nonUniqueAssociationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- count_0, count_3600, count_86400, count_604800,
- count_2592000, count_7776000, count_31536000, count_126144000,
- count_any,
- time_diff_sum, time_diff_sum_squares
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
- expectedAssociationStats = \
- [ # Note that sum-squares in particular gets rounded off due to large values
- [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-10, -12, 0, 0, 0, 0, 1, 2, 2, 2, 2, 5270400.0, 13892300000000.0],
- [-10, -10, 2, 2, 3, 3, 3, 3, 3, 3, 3, 86400.0, 7464960000.0],
- [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2671200.0, 7135310000000.0],
- [ -8, -10, 0, 0, 1, 1, 1, 1, 1, 1, 1, 79200.0, 6272640000.0],
- [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 2, 172800.0, 29859800000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 201600.0, 40642600000.0],
- [ -4, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2678400.0, 7173830000000.0],
- [ -4, -10, 1, 1, 2, 2, 2, 2, 2, 2, 2, 86400.0, 7464960000.0],
- [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- ];
- associationStats = DBUtil.execute(nonUniqueAssociationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
-
- # Again for patient level counts
- patientAssociationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
- patient_count_2592000, patient_count_7776000, patient_count_31536000, patient_count_126144000,
- patient_count_any,
- patient_time_diff_sum, patient_time_diff_sum_squares
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
- expectedAssociationStats = \
- [ # Note that sum-squares in particular gets rounded off due to large values
- [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-10, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2678400.0, 2678400.0*2678400.0], # Main difference. Duplicates within a single patient, only count once
- [-10, -10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0], # Don't count duplicates
- [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2671200.0, 7135310000000.0],
- [ -8, -10, 0, 0, 1, 1, 1, 1, 1, 1, 1, 79200.0, 6272640000.0],
- [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 2, 172800.0, 29859800000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 201600.0, 40642600000.0],
- [ -4, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2678400.0, 7173830000000.0],
- [ -4, -10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0], # Don't count repeats
- [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
- [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- ];
- associationStats = DBUtil.execute(patientAssociationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
-
- # Again for encounter level counts
- encounterAssociationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- encounter_count_0, encounter_count_3600, encounter_count_86400, encounter_count_604800,
- encounter_count_2592000, encounter_count_7776000, encounter_count_31536000, encounter_count_126144000,
- encounter_count_any,
- encounter_time_diff_sum, encounter_time_diff_sum_squares
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
- expectedAssociationStats = \
- [ # Note that sum-squares in particular gets rounded off due to large values
- [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-11, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
- [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [-10, -12, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2592000.0, 2592000.0*2592000.0], # Only count the relation within a common encounter
- [-10, -10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0], # Now count for separate encounters
- [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
- [ -8, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
- [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
- [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 2, 172800.0, 29859800000.0],
- [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
- [ -6, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
- [ -4, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
- [ -4, -10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
- [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
- [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- [ -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
- [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
- ];
- associationStats = DBUtil.execute(encounterAssociationQuery);
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self);
+
+ log.info("Populate the database with test data")
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+
+ self.clinicalItemCategoryIdStrList = list();
+ headers = ["clinical_item_category_id","source_table"];
+ dataModels = \
+ [
+ RowItemModel( [-1, "Labs"], headers ),
+ RowItemModel( [-2, "Imaging"], headers ),
+ RowItemModel( [-3, "Meds"], headers ),
+ RowItemModel( [-4, "Nursing"], headers ),
+ RowItemModel( [-5, "Problems"], headers ),
+ RowItemModel( [-6, "Lab Results"], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", dataModel );
+ self.clinicalItemCategoryIdStrList.append( str(dataItemId) );
+
+ headers = ["clinical_item_id","clinical_item_category_id","name","analysis_status"];
+ dataModels = \
+ [
+ RowItemModel( [-1, -1, "CBC",1], headers ),
+ RowItemModel( [-2, -1, "BMP",0], headers ), # Clear analysis status, so this will be ignored unless changed
+ RowItemModel( [-3, -1, "Hepatic Panel",1], headers ),
+ RowItemModel( [-4, -1, "Cardiac Enzymes",1], headers ),
+ RowItemModel( [-5, -2, "CXR",1], headers ),
+ RowItemModel( [-6, -2, "RUQ Ultrasound",1], headers ),
+ RowItemModel( [-7, -2, "CT Abdomen/Pelvis",1], headers ),
+ RowItemModel( [-8, -2, "CT PE Thorax",1], headers ),
+ RowItemModel( [-9, -3, "Acetaminophen",1], headers ),
+ RowItemModel( [-10, -3, "Carvedilol",1], headers ),
+ RowItemModel( [-11, -3, "Enoxaparin",1], headers ),
+ RowItemModel( [-12, -3, "Warfarin",1], headers ),
+ RowItemModel( [-13, -3, "Ceftriaxone",1], headers ),
+ RowItemModel( [-14, -4, "Foley Catheter",1], headers ),
+ RowItemModel( [-15, -4, "Strict I&O",1], headers ),
+ RowItemModel( [-16, -4, "Fall Precautions",1], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", dataModel );
+
+ headers = ["patient_item_id","encounter_id","patient_id","clinical_item_id","item_date"];
+ dataModels = \
+ [
+ RowItemModel( [-1, -111, -11111, -4, datetime(2000, 1, 1, 0)], headers ),
+ RowItemModel( [-2, -111, -11111, -10, datetime(2000, 1, 1, 0)], headers ),
+ RowItemModel( [-3, -111, -11111, -8, datetime(2000, 1, 1, 2)], headers ),
+ RowItemModel( [-4, -112, -11111, -10, datetime(2000, 1, 2, 0)], headers ),
+ RowItemModel( [-5, -112, -11111, -12, datetime(2000, 2, 1, 0)], headers ),
+ RowItemModel( [-10, -222, -22222, -7, datetime(2000, 1, 5, 0)], headers ),
+ RowItemModel( [-12, -222, -22222, -6, datetime(2000, 1, 9, 0)], headers ),
+ RowItemModel( [-13, -222, -22222, -11, datetime(2000, 1, 9, 0)], headers ),
+ RowItemModel( [-14, -333, -33333, -6, datetime(2000, 2, 9, 0)], headers ),
+ RowItemModel( [-15, -333, -33333, -2, datetime(2000, 2,11, 0)], headers ), # Will set clinical_item_link inheritances to this item to only record certain associations
+ RowItemModel( [-16, -333, -33333, -11, datetime(2000, 2,11, 0)], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("patient_item", dataModel );
+
+ headers = ["clinical_item_id","linked_item_id"];
+ dataModels = \
+ [ # Don't have direct, but instead demonstrate inherited relationship from 6 to 2 will still be recognized
+ RowItemModel( [-6, -4], headers ),
+ RowItemModel( [-4, -2], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_link", dataModel );
+
+ # Temp filename for data buffer
+ self.bufferFilename = "updateBufferTemp.txt"
+
+ self.analyzer = AssociationAnalysis(); # Instance to test on
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ log.info("Purge test records from the database")
+
+ DBUtil.execute("delete from clinical_item_link where clinical_item_id < 0");
+ DBUtil.execute("delete from clinical_item_association where clinical_item_id < 0");
+ DBUtil.execute("delete from patient_item where patient_item_id < 0");
+ DBUtil.execute("delete from clinical_item where clinical_item_id < 0");
+ DBUtil.execute("delete from clinical_item_category where clinical_item_category_id in (%s)" % str.join(",", self.clinicalItemCategoryIdStrList) );
+
+ # Deletes any temp bufferFile
+ dirname = os.path.dirname(self.bufferFilename);
+ if dirname == "": dirname = ".";
+ for filename in os.listdir(dirname):
+ if filename.startswith(self.bufferFilename):
+ os.remove(os.path.join(dirname,filename));
+
+ DBTestCase.tearDown(self);
+
+ def test_analyzePatientItems_commandLine_bufferFile(self):
+ # Run the association analysis, save to a file, and update from the file to the database, all command-line control
+ associationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
+ patient_count_2592000, patient_count_7776000, patient_count_31536000,
+ patient_count_any,
+ patient_time_diff_sum, patient_time_diff_sum_squares
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+
+ log.debug("Use incremental update, including date filters to start.");
+ self.analyzer.main(["AssociationAnalysis.py","-s","2000-01-09","-e","2000-02-11","-b",self.bufferFilename,"-p","1", "0,-22222,-33333"]);
+ self.analyzer.main(["AssociationAnalysis.py","-b",self.bufferFilename]);
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -6,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery)
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 )
+
+
+
+ log.debug("Use incremental update, only doing the update based on a part of the data.");
+ self.analyzer.main(["AssociationAnalysis.py","-b",self.bufferFilename,"0,-22222,-33333"]);
+ self.analyzer.main(["AssociationAnalysis.py","-b",self.bufferFilename]);
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+
+ [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ def test_analyzePatientItemsFromBuffer(self):
+ # Run the association analysis, save to a file, and update from the file to the database
+ associationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
+ patient_count_2592000, patient_count_7776000, patient_count_31536000,
+ patient_count_any,
+ patient_time_diff_sum, patient_time_diff_sum_squares
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+
+ log.debug("Use incremental update, including date filters to start.");
+ analysisOptions = AnalysisOptions();
+ analysisOptions.patientIds = [-22222, -33333];
+ analysisOptions.startDate = datetime(2000,1,9);
+ analysisOptions.endDate = datetime(2000,2,11);
+ analysisOptions.bufferFile = self.bufferFilename;
+
+ self.analyzer.analyzePatientItems(analysisOptions)
+ self.analyzer.commitUpdateBufferFromFile(self.bufferFilename)
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -6,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery)
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 )
+
+
+
+ log.debug("Use incremental update, only doing the update based on a part of the data.");
+ analysisOptions = AnalysisOptions();
+ analysisOptions.patientIds = [-22222, -33333];
+ analysisOptions.bufferFile = self.bufferFilename;
+
+ self.analyzer.analyzePatientItems( analysisOptions );
+ self.analyzer.commitUpdateBufferFromFile(self.bufferFilename)
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+
+ [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ def test_analyzePatientItems(self):
+ # Run the association analysis against the mock test data above and verify
+ # expected stats afterwards.
+
+ associationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
+ patient_count_2592000, patient_count_7776000, patient_count_31536000,
+ patient_count_any,
+ patient_time_diff_sum, patient_time_diff_sum_squares
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+
+
+ log.debug("Use incremental update, including date filters to start.");
+ analysisOptions = AnalysisOptions();
+ analysisOptions.patientIds = [-22222, -33333];
+ analysisOptions.startDate = datetime(2000,1,9);
+ analysisOptions.endDate = datetime(2000,2,11);
+ self.analyzer.analyzePatientItems( analysisOptions );
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -6,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+
+ log.debug("Use incremental update, only doing the update based on a part of the data.");
+ analysisOptions = AnalysisOptions();
+ analysisOptions.patientIds = [-22222, -33333];
+ self.analyzer.analyzePatientItems( analysisOptions );
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+
+ [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ log.debug("Expand incremental update, by now including additional clinical items whose analysis status previously excluded them.");
+ DBUtil.updateRow("clinical_item",{"analysis_status":1},-2);
+ analysisOptions.patientIds = [-22222, -33333];
+ self.analyzer.analyzePatientItems( analysisOptions );
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+
+ [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+
+ [ -2,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+
+ log.debug("Incremental update that includes a single patient data being split, so have to account for all of those dependencies");
+
+ headers = ["patient_item_id","encounter_id","patient_id","clinical_item_id","item_date"];
+ dataModels = \
+ [
+ RowItemModel( [-1111, -334, -33333, -3, datetime(2000, 2,11, 8)], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("patient_item", dataModel );
+
+ analysisOptions.patientIds = [-22222, -33333];
+ self.analyzer.analyzePatientItems( analysisOptions );
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7,-11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439360000.0],
+
+ [ -6,-11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 201600.0, 40642560000.0],
+
+ [ -3,-11, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+
+ [ -2,-11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ ];
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ log.debug("Negative test case, repeating analysis should not change any results");
+ analysisOptions.patientIds = [-22222, -33333];
+ self.analyzer.analyzePatientItems( analysisOptions );
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ log.debug("Complete the remaining incremental update");
+ analysisOptions.patientIds = [-11111, -22222, -33333];
+ self.analyzer.analyzePatientItems( analysisOptions );
+
+ expectedAssociationStats = \
+ [ # Note that sum-squares in particular gets rounded off due to large values
+ [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-10, -12, 0, 0, 0, 0, 0, 1, 1, 1, 2678400.0, 7173830000000.0], # Longer time diff?
+ [-10, -10, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -12, 0, 0, 0, 0, 0, 1, 1, 1, 2671200.0, 7135310000000.0], # Longer diff
+ [ -8, -10, 0, 0, 1, 1, 1, 1, 1, 1, 79200.0, 6272640000.0],
+ [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 172800.0, 29859840000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 201600.0, 40642600000.0],
+ [ -4, -12, 0, 0, 0, 0, 0, 1, 1, 1, 2678400.0, 7173830000000.0], # ???
+ [ -4, -10, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0]
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ # Check the association stats for non-unique counts as well (allowing for repeats)
+ nonUniqueAssociationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ count_0, count_3600, count_86400, count_604800,
+ count_2592000, count_7776000, count_31536000, count_126144000,
+ count_any,
+ time_diff_sum, time_diff_sum_squares
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+ expectedAssociationStats = \
+ [ # Note that sum-squares in particular gets rounded off due to large values
+ [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-10, -12, 0, 0, 0, 0, 1, 2, 2, 2, 2, 5270400.0, 13892300000000.0],
+ [-10, -10, 2, 2, 3, 3, 3, 3, 3, 3, 3, 86400.0, 7464960000.0],
+ [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2671200.0, 7135310000000.0],
+ [ -8, -10, 0, 0, 1, 1, 1, 1, 1, 1, 1, 79200.0, 6272640000.0],
+ [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 2, 172800.0, 29859800000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 201600.0, 40642600000.0],
+ [ -4, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2678400.0, 7173830000000.0],
+ [ -4, -10, 1, 1, 2, 2, 2, 2, 2, 2, 2, 86400.0, 7464960000.0],
+ [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ ];
+ associationStats = DBUtil.execute(nonUniqueAssociationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+
+ # Again for patient level counts
+ patientAssociationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
+ patient_count_2592000, patient_count_7776000, patient_count_31536000, patient_count_126144000,
+ patient_count_any,
+ patient_time_diff_sum, patient_time_diff_sum_squares
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+ expectedAssociationStats = \
+ [ # Note that sum-squares in particular gets rounded off due to large values
+ [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-10, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2678400.0, 2678400.0*2678400.0], # Main difference. Duplicates within a single patient, only count once
+ [-10, -10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0], # Don't count duplicates
+ [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2671200.0, 7135310000000.0],
+ [ -8, -10, 0, 0, 1, 1, 1, 1, 1, 1, 1, 79200.0, 6272640000.0],
+ [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 2, 172800.0, 29859800000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [ -6, -3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 201600.0, 40642600000.0],
+ [ -4, -12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2678400.0, 7173830000000.0],
+ [ -4, -10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0], # Don't count repeats
+ [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -2, -3, 0, 0, 1, 1, 1, 1, 1, 1, 1, 28800.0, 829440000.0],
+ [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ ];
+ associationStats = DBUtil.execute(patientAssociationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+
+ # Again for encounter level counts
+ encounterAssociationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ encounter_count_0, encounter_count_3600, encounter_count_86400, encounter_count_604800,
+ encounter_count_2592000, encounter_count_7776000, encounter_count_31536000, encounter_count_126144000,
+ encounter_count_any,
+ encounter_time_diff_sum, encounter_time_diff_sum_squares
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+ expectedAssociationStats = \
+ [ # Note that sum-squares in particular gets rounded off due to large values
+ [-12, -12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-12, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-12, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [-11, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [-11, -6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-11, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
+ [-11, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [-10, -12, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2592000.0, 2592000.0*2592000.0], # Only count the relation within a common encounter
+ [-10, -10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0], # Now count for separate encounters
+ [-10, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [-10, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
+ [ -8, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
+ [ -8, -8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -8, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -7, -11, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -7, -7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -7, -6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 345600.0, 119439000000.0],
+ [ -6, -11, 1, 1, 1, 2, 2, 2, 2, 2, 2, 172800.0, 29859800000.0],
+ [ -6, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -6, -6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0.0, 0.0],
+ [ -6, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
+ [ -4, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
+ [ -4, -10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -4, -8, 0, 0, 1, 1, 1, 1, 1, 1, 1, 7200.0, 51840000.0],
+ [ -4, -4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -3, -3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0],
+ [ -2, -11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ [ -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0], # No longer related in separate encounters
+ [ -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0, 0.0],
+ ];
+ associationStats = DBUtil.execute(encounterAssociationQuery);
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
def suite():
- """Returns the suite of tests to run for this test class / module.
- Use unittest.makeSuite methods which simply extracts all of the
- methods for the given class whose name starts with "test"
- """
- suite = unittest.TestSuite();
- #suite.addTest(TestAssociationAnalysis("test_incColNamesAndTypeCodes"));
- #suite.addTest(TestAssociationAnalysis("test_insertFile_skipErrors"));
- #suite.addTest(TestAssociationAnalysis('test_executeIterator'));
- #suite.addTest(TestAssociationAnalysis('test_findOrInsertItem'));
- #suite.addTest(TestAssociationAnalysis('test_analyzePatientItems_commandLine_bufferFile'))
- suite.addTest(unittest.makeSuite(TestAssociationAnalysis));
-
- return suite;
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ suite = unittest.TestSuite();
+ #suite.addTest(TestAssociationAnalysis("test_incColNamesAndTypeCodes"));
+ #suite.addTest(TestAssociationAnalysis("test_insertFile_skipErrors"));
+ #suite.addTest(TestAssociationAnalysis('test_executeIterator'));
+ #suite.addTest(TestAssociationAnalysis('test_findOrInsertItem'));
+ #suite.addTest(TestAssociationAnalysis('test_analyzePatientItems_commandLine_bufferFile'))
+ suite.addTest(unittest.makeSuite(TestAssociationAnalysis));
+
+ return suite;
if __name__=="__main__":
- log.setLevel(LOGGER_LEVEL)
+ log.setLevel(LOGGER_LEVEL)
- unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/cpoe/test/TestDataManager.py b/medinfo/cpoe/test/TestDataManager.py
index 62ef9194..b93a2876 100644
--- a/medinfo/cpoe/test/TestDataManager.py
+++ b/medinfo/cpoe/test/TestDataManager.py
@@ -2,12 +2,12 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
-from Util import log;
+from .Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
@@ -20,6 +20,8 @@ class TestDataManager(DBTestCase):
def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
log.info("Populate the database with test data")
diff --git a/medinfo/cpoe/test/TestDecayingWindows.py b/medinfo/cpoe/test/TestDecayingWindows.py
index 1796bf0d..c0cf574c 100644
--- a/medinfo/cpoe/test/TestDecayingWindows.py
+++ b/medinfo/cpoe/test/TestDecayingWindows.py
@@ -3,13 +3,13 @@
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import *
import unittest
import time
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
@@ -21,416 +21,422 @@
from medinfo.cpoe.AssociationAnalysis import AssociationAnalysis, AnalysisOptions;
+TEMP_FILENAME = "DWTemp.txt";
+
class TestDecayingWindows(DBTestCase):
- def setUp(self):
- """Prepare state for test cases"""
- DBTestCase.setUp(self);
-
- log.info("Populate the database with test data")
-
- self.clinicalItemCategoryIdStrList = list();
- headers = ["clinical_item_category_id","source_table"];
- dataModels = \
- [
- RowItemModel( [-1, "Labs"], headers ),
- RowItemModel( [-2, "Imaging"], headers ),
- RowItemModel( [-3, "Meds"], headers ),
- RowItemModel( [-4, "Nursing"], headers ),
- RowItemModel( [-5, "Problems"], headers ),
- RowItemModel( [-6, "Lab Results"], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", dataModel );
- self.clinicalItemCategoryIdStrList.append( str(dataItemId) );
-
- headers = ["clinical_item_id","clinical_item_category_id","name","analysis_status"];
- dataModels = \
- [
- RowItemModel( [-1, -1, "CBC",1], headers ),
- RowItemModel( [-2, -1, "BMP",0], headers ), # Clear analysis status, so this will be ignored unless changed
- RowItemModel( [-3, -1, "Hepatic Panel",1], headers ),
- RowItemModel( [-4, -1, "Cardiac Enzymes",1], headers ),
- RowItemModel( [-5, -2, "CXR",1], headers ),
- RowItemModel( [-6, -2, "RUQ Ultrasound",1], headers ),
- RowItemModel( [-7, -2, "CT Abdomen/Pelvis",1], headers ),
- RowItemModel( [-8, -2, "CT PE Thorax",1], headers ),
- RowItemModel( [-9, -3, "Acetaminophen",1], headers ),
- RowItemModel( [-10, -3, "Carvedilol",1], headers ),
- RowItemModel( [-11, -3, "Enoxaparin",1], headers ),
- RowItemModel( [-12, -3, "Warfarin",1], headers ),
- RowItemModel( [-13, -3, "Ceftriaxone",1], headers ),
- RowItemModel( [-14, -4, "Foley Catheter",1], headers ),
- RowItemModel( [-15, -4, "Strict I&O",1], headers ),
- RowItemModel( [-16, -4, "Fall Precautions",1], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", dataModel );
-
- headers = ["patient_item_id","encounter_id","patient_id","clinical_item_id","item_date"];
- dataModels = \
- [
- RowItemModel( [-1, -111, -11111, -4, datetime(2000, 1, 1, 0)], headers ),
- RowItemModel( [-2, -111, -11111, -10, datetime(2000, 1, 1, 0)], headers ),
- RowItemModel( [-3, -111, -11111, -8, datetime(2000, 1, 1, 2)], headers ),
- RowItemModel( [-4, -112, -11111, -10, datetime(2000, 1, 2, 0)], headers ),
- RowItemModel( [-5, -112, -11111, -12, datetime(2000, 2, 1, 0)], headers ),
- RowItemModel( [-10, -222, -22222, -7, datetime(2000, 1, 5, 0)], headers ),
- RowItemModel( [-12, -222, -22222, -6, datetime(2000, 1, 9, 0)], headers ),
- RowItemModel( [-13, -222, -22222, -11, datetime(2000, 1, 9, 0)], headers ),
- RowItemModel( [-95, -222, -22222, -9, datetime(2000, 1,10, 0)], headers ),
- RowItemModel( [-94, -333, -33333, -8, datetime(2000, 1,10, 0)], headers ), # In first window delta unit only
- RowItemModel( [-14, -333, -33333, -6, datetime(2000, 2, 9, 0)], headers ),
- RowItemModel( [-15, -333, -33333, -2, datetime(2000, 2,11, 0)], headers ), # Will set clinical_item_link inheritances to this item to only record certain associations
- RowItemModel( [-16, -333, -33333, -11, datetime(2000, 2,11, 0)], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("patient_item", dataModel );
-
-
- headers = ["clinical_item_id","linked_item_id"];
- dataModels = \
- [ # Don't have direct, but instead demonstrate inherited relationship from 6 to 2 will still be recognized
- RowItemModel( [-6, -4], headers ),
- RowItemModel( [-4, -2], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_link", dataModel );
-
- self.decayAnalyzer = DecayingWindows() # DecayingWindows instance to test on, *** remember to change database to medinfo_copy
- self.dataManager = DataManager();
-
- def tearDown(self):
- """Restore state from any setUp or test steps"""
- log.info("Purge test records from the database")
-
- DBUtil.execute("delete from clinical_item_link where clinical_item_id < 0");
- DBUtil.execute("delete from clinical_item_association where clinical_item_id < 0");
- DBUtil.execute("delete from patient_item where patient_item_id < 0");
- DBUtil.execute("delete from clinical_item where clinical_item_id < 0");
- DBUtil.execute("delete from clinical_item_category where clinical_item_category_id in (%s)" % str.join(",", self.clinicalItemCategoryIdStrList) );
-
- if os.path.exists("DWTemp.txt"):
- os.remove("DWTemp.txt")
-
- DBTestCase.tearDown(self);
-
- def test_decayingWindowsFromBuffer(self):
-
- associationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- count_0, count_3600, count_86400, count_604800,
- count_2592000, count_7776000, count_31536000,
- count_any
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
-
- decayAnalysisOptions = DecayAnalysisOptions()
- decayAnalysisOptions.startD = datetime(2000,1,9)
- decayAnalysisOptions.endD = datetime(2000,2,11)
- #decayAnalysisOptions.windowLength = 10
- decayAnalysisOptions.decay = 0.9
- decayAnalysisOptions.delta = timedelta(weeks=4)
- decayAnalysisOptions.patientIds = [-22222, -33333]
- decayAnalysisOptions.outputFile = "DWTemp.txt"
-
- self.decayAnalyzer.decayAnalyzePatientItems(decayAnalysisOptions)
-
- expectedAssociationStats = \
- [
- [-11,-11, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9], # Note that decaying windows approach will not try to update counts for time periods longer than the delta period
- [-11, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [-11, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted. Consider future upgrade. Don't train on all time ever, but train on two deltas at a time, sliding / shifting window so do catch the overlap ranges
- [-11, -6, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -9,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -9, -9, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -9, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -9, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -8,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -8, -9, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -8, -8, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -8, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -6,-11, 0.9, 0.9, 0.9, 1.9, 1.9, 0, 0, 1.9],
- [ -6, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -6, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -6, -6, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9],
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- #for row in expectedAssociationStats:
- # print >> sys.stderr, row;
- #print >> sys.stderr, "============"
- #for row in associationStats:
- # print >> sys.stderr, row;
- #print >> sys.stderr, "============"
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- expectedItemBaseCountById = \
- {
- -1: 0,
- -2: 0,
- -3: 0,
- -4: 0,
- -5: 0,
- -6: 1.9,
- -7: 0,
- -8: 0.9,
- -9: 0.9,
- -10: 0,
- -11: 1.9,
- -12: 0,
- -13: 0,
- -14: 0,
- -15: 0,
- -16: 0,
- }
- itemBaseCountById = self.dataManager.loadClinicalItemBaseCountByItemId();
- #print >> sys.stderr, itemBaseCountById;
- self.assertEqualDict(expectedItemBaseCountById, itemBaseCountById);
-
-
- ######## Reset the model data and rerun with different decay parameters
- self.dataManager.resetAssociationModel()
-
- decayAnalysisOptions = DecayAnalysisOptions()
- decayAnalysisOptions.startD = datetime(2000,1,9)
- decayAnalysisOptions.endD = datetime(2000,2,11)
- decayAnalysisOptions.windowLength = 4; # Just specify window length, then should calculate decay parameter
- #decayAnalysisOptions.decay = 0.9
- decayAnalysisOptions.delta = timedelta(weeks=4)
- decayAnalysisOptions.patientIds = [-22222, -33333]
- decayAnalysisOptions.outputFile = "DWTemp.txt"
-
- self.decayAnalyzer.decayAnalyzePatientItems(decayAnalysisOptions)
-
- expectedAssociationStats = \
- [
- [-11,-11, 1.75, 1.75, 1.75, 1.75, 1.75, 0, 0, 1.75],
- [-11, -9, 0.0, 0.0, 0.75, 0.75, 0.75, 0, 0, 0.75],
- [-11, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [-11, -6, 0.75, 0.75, 0.75, 0.75, 0.75, 0, 0, 0.75],
- [ -9,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -9, -9, 0.75, 0.75, 0.75, 0.75, 0.75, 0, 0, 0.75],
- [ -9, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -9, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -8,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -8, -9, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -8, -8, 0.75, 0.75, 0.75, 0.75, 0.75, 0, 0, 0.75],
- [ -8, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -6,-11, 0.75, 0.75, 0.75, 1.75, 1.75, 0, 0, 1.75],
- [ -6, -9, 0.0, 0.0, 0.75, 0.75, 0.75, 0, 0, 0.75],
- [ -6, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -6, -6, 1.75, 1.75, 1.75, 1.75, 1.75, 0, 0, 1.75],
- ];
-
- associationStats = DBUtil.execute(associationQuery);
- #for row in expectedAssociationStats:
- # print >> sys.stderr, row;
- #print >> sys.stderr, "============"
- #for row in associationStats:
- # print >> sys.stderr, row;
- #print >> sys.stderr, "============"
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- expectedItemBaseCountById = \
- {
- -1: 0,
- -2: 0,
- -3: 0,
- -4: 0,
- -5: 0,
- -6: 1.75,
- -7: 0,
- -8: 0.75,
- -9: 0.75,
- -10: 0,
- -11: 1.75,
- -12: 0,
- -13: 0,
- -14: 0,
- -15: 0,
- -16: 0,
- }
- itemBaseCountById = self.dataManager.loadClinicalItemBaseCountByItemId(acceptCache=False); # Don't use cache, otherwise will get prior results
- print >> sys.stderr, itemBaseCountById;
- self.assertEqualDict(expectedItemBaseCountById, itemBaseCountById);
-
-
- def test_decayingWindows(self):
- # Muthu's function to test DecayingWindows module
-
- associationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
- patient_count_2592000, patient_count_7776000, patient_count_31536000,
- patient_count_any
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
-
-
- decayAnalysisOptions = DecayAnalysisOptions()
- decayAnalysisOptions.startD = datetime(2000,1,9)
- decayAnalysisOptions.endD = datetime(2000,2,11)
- decayAnalysisOptions.windowLength = 10
- decayAnalysisOptions.decay = 0.9
- decayAnalysisOptions.delta = timedelta(weeks=4)
- decayAnalysisOptions.patientIds = [-22222, -33333]
-
- self.decayAnalyzer.decayAnalyzePatientItems (decayAnalysisOptions)
-
- expectedAssociationStats = \
- [
- [-11,-11, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9], # Note that decaying windows approach will not try to update counts for time periods longer than the delta period
- [-11, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [-11, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted. Consider future upgrade. Don't train on all time ever, but train on two deltas at a time, sliding / shifting window so do catch the overlap ranges. Problem here is buffer based algorithm, won't be recording analyze_dates as go, so will end up with duplicate counts of items each month?
- [-11, -6, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -9,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -9, -9, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -9, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -9, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
- [ -8,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -8, -9, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -8, -8, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -8, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -6,-11, 0.9, 0.9, 0.9, 1.9, 1.9, 0, 0, 1.9],
- [ -6, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
- [ -6, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
- [ -6, -6, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9],
- ];
-
- associationStats = DBUtil.execute(associationQuery)
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
- #DBUtil.execute("delete from clinical_item_association")
-
- # Add another training period then should get a second decay multiplier for older data?
- # Weird in that incrementally building on prior data that is getting decayed, even though new training data actually occurred before chronologic time of data
- decayAnalysisOptions = DecayAnalysisOptions();
- decayAnalysisOptions.startD = datetime(2000,1,1)
- decayAnalysisOptions.endD = datetime(2000,2,12)
- decayAnalysisOptions.windowLength = 10
- decayAnalysisOptions.decay = 0.9
- decayAnalysisOptions.delta = timedelta(weeks=4)
- decayAnalysisOptions.patientIds = [-22222, -33333]
-
- self.decayAnalyzer.decayAnalyzePatientItems (decayAnalysisOptions)
-
- expectedAssociationStats = \
- [
- [-11L, -11L, 1.539, 1.539, 1.539, 1.539, 1.539, 0.0, 0.0, 1.539],
- [-11L, -9L, 0.0, 0.0, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
- [-11L, -8L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-11L, -7L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-11L, -6L, 0.729, 0.729, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
- [-9L, -11L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-9L, -9L, 0.729, 0.729, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
- [-9L, -8L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-9L, -7L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-9L, -6L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-8L, -11L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-8L, -9L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-8L, -8L, 0.729, 0.729, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
- [-8L, -6L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-7L, -11L, 0.0, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.9],
- [-7L, -9L, 0.0, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.9],
- [-7L, -7L, 0.9, 0.9, 0.9, 0.9, 0.9, 0.0, 0.0, 0.9],
- [-7L, -6L, 0.0, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.9],
- [-6L, -11L, 0.729, 0.729, 0.729, 1.539, 1.539, 0.0, 0.0, 1.539],
- [-6L, -9L, 0.0, 0.0, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
- [-6L, -8L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-6L, -7L, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
- [-6L, -6L, 1.539, 1.539, 1.539, 1.539, 1.539, 0.0, 0.0, 1.539],
- ];
-
- associationStats = DBUtil.execute(associationQuery)
- #for row in expectedAssociationStats:
- # print >> sys.stderr, row;
- #print >> sys.stderr, "============"
- #for row in associationStats:
- # print >> sys.stderr, row;
- #print >> sys.stderr, "============"
- self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
-
-
- def test_resetModel(self):
- associationQuery = \
- """
- select
- clinical_item_id, subsequent_item_id,
- patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
- patient_count_2592000, patient_count_7776000, patient_count_31536000,
- patient_count_any
- from
- clinical_item_association
- where
- clinical_item_id < 0
- order by
- clinical_item_id, subsequent_item_id
- """;
-
- associationQueryDate = \
- """
- select
- patient_item_id, analyze_date
- from
- patient_item
- where
- patient_item_id < 0
- order by
- patient_item_id
- """;
-
- # fill up the association table with something
- decayAnalysisOptions = DecayAnalysisOptions()
- decayAnalysisOptions.startD = datetime(2000,1,9)
- decayAnalysisOptions.endD = datetime(2000,2,11)
- decayAnalysisOptions.windowLength = 10
- decayAnalysisOptions.decay = 0.9
- decayAnalysisOptions.patientIds = [-22222, -33333]
- self.decayAnalyzer.decayAnalyzePatientItems (decayAnalysisOptions)
-
- # then clear the table
- self.dataManager.resetAssociationModel()
-
- expectedAssociationStats = \
- [
- ];
- associationStats = DBUtil.execute(associationQuery)
- self.assertEqualTable(expectedAssociationStats, associationStats, precision=3 )
-
- # Set as NULL
- expectedAssociationStatsDate = \
- [[-95, None],[-94, None],[-16, None], [-15, None], [-14, None], [-13, None], [-12, None], [-10, None], [-5, None], [-4, None], [-3, None], [-2, None], [-1, None]
- ];
- associationStatsDate = DBUtil.execute(associationQueryDate)
- #print >> sys.stderr, associationStatsDate
- self.assertEqualTable(expectedAssociationStatsDate, associationStatsDate)
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self);
+
+ log.info("Populate the database with test data")
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+
+ self.clinicalItemCategoryIdStrList = list();
+ headers = ["clinical_item_category_id","source_table"];
+ dataModels = \
+ [
+ RowItemModel( [-1, "Labs"], headers ),
+ RowItemModel( [-2, "Imaging"], headers ),
+ RowItemModel( [-3, "Meds"], headers ),
+ RowItemModel( [-4, "Nursing"], headers ),
+ RowItemModel( [-5, "Problems"], headers ),
+ RowItemModel( [-6, "Lab Results"], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", dataModel );
+ self.clinicalItemCategoryIdStrList.append( str(dataItemId) );
+
+ headers = ["clinical_item_id","clinical_item_category_id","name","analysis_status"];
+ dataModels = \
+ [
+ RowItemModel( [-1, -1, "CBC",1], headers ),
+ RowItemModel( [-2, -1, "BMP",0], headers ), # Clear analysis status, so this will be ignored unless changed
+ RowItemModel( [-3, -1, "Hepatic Panel",1], headers ),
+ RowItemModel( [-4, -1, "Cardiac Enzymes",1], headers ),
+ RowItemModel( [-5, -2, "CXR",1], headers ),
+ RowItemModel( [-6, -2, "RUQ Ultrasound",1], headers ),
+ RowItemModel( [-7, -2, "CT Abdomen/Pelvis",1], headers ),
+ RowItemModel( [-8, -2, "CT PE Thorax",1], headers ),
+ RowItemModel( [-9, -3, "Acetaminophen",1], headers ),
+ RowItemModel( [-10, -3, "Carvedilol",1], headers ),
+ RowItemModel( [-11, -3, "Enoxaparin",1], headers ),
+ RowItemModel( [-12, -3, "Warfarin",1], headers ),
+ RowItemModel( [-13, -3, "Ceftriaxone",1], headers ),
+ RowItemModel( [-14, -4, "Foley Catheter",1], headers ),
+ RowItemModel( [-15, -4, "Strict I&O",1], headers ),
+ RowItemModel( [-16, -4, "Fall Precautions",1], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", dataModel );
+
+ headers = ["patient_item_id","encounter_id","patient_id","clinical_item_id","item_date"];
+ dataModels = \
+ [
+ RowItemModel( [-1, -111, -11111, -4, datetime(2000, 1, 1, 0)], headers ),
+ RowItemModel( [-2, -111, -11111, -10, datetime(2000, 1, 1, 0)], headers ),
+ RowItemModel( [-3, -111, -11111, -8, datetime(2000, 1, 1, 2)], headers ),
+ RowItemModel( [-4, -112, -11111, -10, datetime(2000, 1, 2, 0)], headers ),
+ RowItemModel( [-5, -112, -11111, -12, datetime(2000, 2, 1, 0)], headers ),
+ RowItemModel( [-10, -222, -22222, -7, datetime(2000, 1, 5, 0)], headers ),
+ RowItemModel( [-12, -222, -22222, -6, datetime(2000, 1, 9, 0)], headers ),
+ RowItemModel( [-13, -222, -22222, -11, datetime(2000, 1, 9, 0)], headers ),
+ RowItemModel( [-95, -222, -22222, -9, datetime(2000, 1,10, 0)], headers ),
+ RowItemModel( [-94, -333, -33333, -8, datetime(2000, 1,10, 0)], headers ), # In first window delta unit only
+ RowItemModel( [-14, -333, -33333, -6, datetime(2000, 2, 9, 0)], headers ),
+ RowItemModel( [-15, -333, -33333, -2, datetime(2000, 2,11, 0)], headers ), # Will set clinical_item_link inheritances to this item to only record certain associations
+ RowItemModel( [-16, -333, -33333, -11, datetime(2000, 2,11, 0)], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("patient_item", dataModel );
+
+
+ headers = ["clinical_item_id","linked_item_id"];
+ dataModels = \
+ [ # Don't have direct, but instead demonstrate inherited relationship from 6 to 2 will still be recognized
+ RowItemModel( [-6, -4], headers ),
+ RowItemModel( [-4, -2], headers ),
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("clinical_item_link", dataModel );
+
+ self.decayAnalyzer = DecayingWindows() # DecayingWindows instance to test on, *** remember to change database to medinfo_copy
+ self.dataManager = DataManager();
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ log.info("Purge test records from the database")
+
+ DBUtil.execute("delete from clinical_item_link where clinical_item_id < 0");
+ DBUtil.execute("delete from clinical_item_association where clinical_item_id < 0");
+ DBUtil.execute("delete from patient_item where patient_item_id < 0");
+ DBUtil.execute("delete from clinical_item where clinical_item_id < 0");
+ DBUtil.execute("delete from clinical_item_category where clinical_item_category_id in (%s)" % str.join(",", self.clinicalItemCategoryIdStrList) );
+
+ # Purge temporary buffer files. May not match exact name if modified for other purpose
+ for filename in os.listdir("."):
+ if filename.startswith(TEMP_FILENAME):
+ os.remove(filename);
+
+ DBTestCase.tearDown(self);
+
+ def test_decayingWindowsFromBuffer(self):
+
+ associationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ count_0, count_3600, count_86400, count_604800,
+ count_2592000, count_7776000, count_31536000,
+ count_any
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+
+ decayAnalysisOptions = DecayAnalysisOptions()
+ decayAnalysisOptions.startD = datetime(2000,1,9)
+ decayAnalysisOptions.endD = datetime(2000,2,11)
+ #decayAnalysisOptions.windowLength = 10
+ decayAnalysisOptions.decay = 0.9
+ decayAnalysisOptions.delta = timedelta(weeks=4)
+ decayAnalysisOptions.patientIds = [-22222, -33333]
+ decayAnalysisOptions.outputFile = TEMP_FILENAME;
+
+ self.decayAnalyzer.decayAnalyzePatientItems(decayAnalysisOptions)
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9], # Note that decaying windows approach will not try to update counts for time periods longer than the delta period
+ [-11, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [-11, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted. Consider future upgrade. Don't train on all time ever, but train on two deltas at a time, sliding / shifting window so do catch the overlap ranges
+ [-11, -6, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -9,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -9, -9, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -9, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -9, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -8,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -8, -9, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -8, -8, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -8, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -6,-11, 0.9, 0.9, 0.9, 1.9, 1.9, 0, 0, 1.9],
+ [ -6, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -6, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -6, -6, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ #for row in expectedAssociationStats:
+ # print >> sys.stderr, row;
+ #print >> sys.stderr, "============"
+ #for row in associationStats:
+ # print >> sys.stderr, row;
+ #print >> sys.stderr, "============"
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ expectedItemBaseCountById = \
+ {
+ -1: 0,
+ -2: 0,
+ -3: 0,
+ -4: 0,
+ -5: 0,
+ -6: 1.9,
+ -7: 0,
+ -8: 0.9,
+ -9: 0.9,
+ -10: 0,
+ -11: 1.9,
+ -12: 0,
+ -13: 0,
+ -14: 0,
+ -15: 0,
+ -16: 0,
+ }
+ itemBaseCountById = self.dataManager.loadClinicalItemBaseCountByItemId();
+ #print >> sys.stderr, itemBaseCountById;
+ self.assertEqualDict(expectedItemBaseCountById, itemBaseCountById);
+
+
+ ######## Reset the model data and rerun with different decay parameters
+ self.dataManager.resetAssociationModel()
+
+ decayAnalysisOptions = DecayAnalysisOptions()
+ decayAnalysisOptions.startD = datetime(2000,1,9)
+ decayAnalysisOptions.endD = datetime(2000,2,11)
+ decayAnalysisOptions.windowLength = 4; # Just specify window length, then should calculate decay parameter
+ #decayAnalysisOptions.decay = 0.9
+ decayAnalysisOptions.delta = timedelta(weeks=4)
+ decayAnalysisOptions.patientIds = [-22222, -33333]
+ decayAnalysisOptions.outputFile = TEMP_FILENAME;
+
+ self.decayAnalyzer.decayAnalyzePatientItems(decayAnalysisOptions)
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 1.75, 1.75, 1.75, 1.75, 1.75, 0, 0, 1.75],
+ [-11, -9, 0.0, 0.0, 0.75, 0.75, 0.75, 0, 0, 0.75],
+ [-11, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [-11, -6, 0.75, 0.75, 0.75, 0.75, 0.75, 0, 0, 0.75],
+ [ -9,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -9, -9, 0.75, 0.75, 0.75, 0.75, 0.75, 0, 0, 0.75],
+ [ -9, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -9, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -8,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -8, -9, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -8, -8, 0.75, 0.75, 0.75, 0.75, 0.75, 0, 0, 0.75],
+ [ -8, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -6,-11, 0.75, 0.75, 0.75, 1.75, 1.75, 0, 0, 1.75],
+ [ -6, -9, 0.0, 0.0, 0.75, 0.75, 0.75, 0, 0, 0.75],
+ [ -6, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -6, -6, 1.75, 1.75, 1.75, 1.75, 1.75, 0, 0, 1.75],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery);
+ #for row in expectedAssociationStats:
+ # print >> sys.stderr, row;
+ #print >> sys.stderr, "============"
+ #for row in associationStats:
+ # print >> sys.stderr, row;
+ #print >> sys.stderr, "============"
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ expectedItemBaseCountById = \
+ {
+ -1: 0,
+ -2: 0,
+ -3: 0,
+ -4: 0,
+ -5: 0,
+ -6: 1.75,
+ -7: 0,
+ -8: 0.75,
+ -9: 0.75,
+ -10: 0,
+ -11: 1.75,
+ -12: 0,
+ -13: 0,
+ -14: 0,
+ -15: 0,
+ -16: 0,
+ }
+ itemBaseCountById = self.dataManager.loadClinicalItemBaseCountByItemId(acceptCache=False); # Don't use cache, otherwise will get prior results
+ #print >> sys.stderr, itemBaseCountById;
+ self.assertEqualDict(expectedItemBaseCountById, itemBaseCountById);
+
+
+ def test_decayingWindows(self):
+ # Muthu's function to test DecayingWindows module
+
+ associationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
+ patient_count_2592000, patient_count_7776000, patient_count_31536000,
+ patient_count_any
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+
+
+ decayAnalysisOptions = DecayAnalysisOptions()
+ decayAnalysisOptions.startD = datetime(2000,1,9)
+ decayAnalysisOptions.endD = datetime(2000,2,11)
+ decayAnalysisOptions.windowLength = 10
+ decayAnalysisOptions.decay = 0.9
+ decayAnalysisOptions.delta = timedelta(weeks=4)
+ decayAnalysisOptions.patientIds = [-22222, -33333]
+
+ self.decayAnalyzer.decayAnalyzePatientItems (decayAnalysisOptions)
+
+ expectedAssociationStats = \
+ [
+ [-11,-11, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9], # Note that decaying windows approach will not try to update counts for time periods longer than the delta period
+ [-11, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [-11, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted. Consider future upgrade. Don't train on all time ever, but train on two deltas at a time, sliding / shifting window so do catch the overlap ranges. Problem here is buffer based algorithm, won't be recording analyze_dates as go, so will end up with duplicate counts of items each month?
+ [-11, -6, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -9,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -9, -9, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -9, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -9, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0],
+ [ -8,-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -8, -9, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -8, -8, 0.9, 0.9, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -8, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -6,-11, 0.9, 0.9, 0.9, 1.9, 1.9, 0, 0, 1.9],
+ [ -6, -9, 0.0, 0.0, 0.9, 0.9, 0.9, 0, 0, 0.9],
+ [ -6, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0], # 8 not in same delta as other items so co-occurence not gettign counted.
+ [ -6, -6, 1.9, 1.9, 1.9, 1.9, 1.9, 0, 0, 1.9],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery)
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+ #DBUtil.execute("delete from clinical_item_association")
+
+ # Add another training period then should get a second decay multiplier for older data?
+ # Weird in that incrementally building on prior data that is getting decayed, even though new training data actually occurred before chronologic time of data
+ decayAnalysisOptions = DecayAnalysisOptions();
+ decayAnalysisOptions.startD = datetime(2000,1,1)
+ decayAnalysisOptions.endD = datetime(2000,2,12)
+ decayAnalysisOptions.windowLength = 10
+ decayAnalysisOptions.decay = 0.9
+ decayAnalysisOptions.delta = timedelta(weeks=4)
+ decayAnalysisOptions.patientIds = [-22222, -33333]
+
+ self.decayAnalyzer.decayAnalyzePatientItems (decayAnalysisOptions)
+
+ expectedAssociationStats = \
+ [
+ [-11, -11, 1.539, 1.539, 1.539, 1.539, 1.539, 0.0, 0.0, 1.539],
+ [-11, -9, 0.0, 0.0, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
+ [-11, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-11, -7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-11, -6, 0.729, 0.729, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
+ [-9, -11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-9, -9, 0.729, 0.729, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
+ [-9, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-9, -7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-9, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-8, -11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-8, -9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-8, -8, 0.729, 0.729, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
+ [-8, -6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-7, -11, 0.0, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.9],
+ [-7, -9, 0.0, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.9],
+ [-7, -7, 0.9, 0.9, 0.9, 0.9, 0.9, 0.0, 0.0, 0.9],
+ [-7, -6, 0.0, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.9],
+ [-6, -11, 0.729, 0.729, 0.729, 1.539, 1.539, 0.0, 0.0, 1.539],
+ [-6, -9, 0.0, 0.0, 0.729, 0.729, 0.729, 0.0, 0.0, 0.729],
+ [-6, -8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-6, -7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [-6, -6, 1.539, 1.539, 1.539, 1.539, 1.539, 0.0, 0.0, 1.539],
+ ];
+
+ associationStats = DBUtil.execute(associationQuery)
+ #for row in expectedAssociationStats:
+ # print >> sys.stderr, row;
+ #print >> sys.stderr, "============"
+ #for row in associationStats:
+ # print >> sys.stderr, row;
+ #print >> sys.stderr, "============"
+ self.assertEqualTable( expectedAssociationStats, associationStats, precision=3 );
+
+
+ def test_resetModel(self):
+ associationQuery = \
+ """
+ select
+ clinical_item_id, subsequent_item_id,
+ patient_count_0, patient_count_3600, patient_count_86400, patient_count_604800,
+ patient_count_2592000, patient_count_7776000, patient_count_31536000,
+ patient_count_any
+ from
+ clinical_item_association
+ where
+ clinical_item_id < 0
+ order by
+ clinical_item_id, subsequent_item_id
+ """;
+
+ associationQueryDate = \
+ """
+ select
+ patient_item_id, analyze_date
+ from
+ patient_item
+ where
+ patient_item_id < 0
+ order by
+ patient_item_id
+ """;
+
+ # fill up the association table with something
+ decayAnalysisOptions = DecayAnalysisOptions()
+ decayAnalysisOptions.startD = datetime(2000,1,9)
+ decayAnalysisOptions.endD = datetime(2000,2,11)
+ decayAnalysisOptions.windowLength = 10
+ decayAnalysisOptions.decay = 0.9
+ decayAnalysisOptions.patientIds = [-22222, -33333]
+ self.decayAnalyzer.decayAnalyzePatientItems (decayAnalysisOptions)
+
+ # then clear the table
+ self.dataManager.resetAssociationModel()
+
+ expectedAssociationStats = \
+ [
+ ];
+ associationStats = DBUtil.execute(associationQuery)
+ self.assertEqualTable(expectedAssociationStats, associationStats, precision=3 )
+
+ # Set as NULL
+ expectedAssociationStatsDate = \
+ [[-95, None],[-94, None],[-16, None], [-15, None], [-14, None], [-13, None], [-12, None], [-10, None], [-5, None], [-4, None], [-3, None], [-2, None], [-1, None]
+ ];
+ associationStatsDate = DBUtil.execute(associationQueryDate)
+ #print >> sys.stderr, associationStatsDate
+ self.assertEqualTable(expectedAssociationStatsDate, associationStatsDate)
def suite():
- """Returns the suite of tests to run for this test class / module.
- Use unittest.makeSuite methods which simply extracts all of the
- methods for the given class whose name starts with "test"
- """
- suite = unittest.TestSuite();
- #suite.addTest(TestDecayingWindows('test_decayingWindows'))
- #suite.addTest(TestDecayingWindows('test_decayingWindowsFromBuffer'))
- #suite.addTest(TestDecayingWindows('test_resetModel'))
- suite.addTest(unittest.makeSuite(TestDecayingWindows));
-
- return suite;
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ suite = unittest.TestSuite();
+ #suite.addTest(TestDecayingWindows('test_decayingWindows'))
+ #suite.addTest(TestDecayingWindows('test_decayingWindowsFromBuffer'))
+ #suite.addTest(TestDecayingWindows('test_resetModel'))
+ suite.addTest(unittest.makeSuite(TestDecayingWindows));
+
+ return suite;
if __name__=="__main__":
- unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/cpoe/test/TestItemRecommender.py b/medinfo/cpoe/test/TestItemRecommender.py
index 155549f9..b5a843d7 100644
--- a/medinfo/cpoe/test/TestItemRecommender.py
+++ b/medinfo/cpoe/test/TestItemRecommender.py
@@ -2,12 +2,12 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime, timedelta;
import unittest
-from Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
-from Util import log;
+from .Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.common.Util import ProgressDots;
@@ -27,6 +27,8 @@ class TestItemRecommender(DBTestCase):
def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
log.info("Populate the database with test data")
@@ -312,12 +314,12 @@ def assertEqualRecommendedData(self, expectedData, recommendedData, query):
lastScore = None;
for expectedItem, recommendedItem in zip(expectedData, recommendedData):
# Ensure derived statistics are populated to enable comparisons
- ItemAssociationRecommender.populateDerivedStats( recommendedItem, expectedItem.keys() );
+ ItemAssociationRecommender.populateDerivedStats( recommendedItem, list(expectedItem.keys()) );
self.assertEqualDict(expectedItem, recommendedItem, ["clinical_item_id"]);
- for key in expectedItem.iterkeys(): # If specified, then verify a specific values
+ for key in expectedItem.keys(): # If specified, then verify a specific values
if isinstance(expectedItem[key],float):
- self.assertAlmostEquals(expectedItem[key], recommendedItem[key], 5);
+ self.assertAlmostEqual(expectedItem[key], recommendedItem[key], 5);
else:
self.assertEqual(expectedItem[key], recommendedItem[key]);
if lastScore is not None:
@@ -375,7 +377,7 @@ def assertEqualRecommendedDataStats(self, expectedData, recommendedData, headers
expectedValue = expectedItem[header];
recommendedValue = recommendedItem[header];
msg = 'Dicts diff with key (%s). Verify = %s, Sample = %s' % (header, expectedValue, recommendedValue);
- self.assertAlmostEquals(expectedValue, recommendedValue, 3, msg);
+ self.assertAlmostEqual(expectedValue, recommendedValue, 3, msg);
def test_recommender_stats_commandline(self):
# Run the recommender against the mock test data above and verify expected stats calculations
@@ -410,7 +412,7 @@ def assertEqualRecommendedDataStatsTextOutput(self, expectedData, textOutput, he
"""
recommendedData = list();
for dataRow in TabDictReader(textOutput):
- for key,value in dataRow.iteritems():
+ for key,value in dataRow.items():
if key in headers:
dataRow[key] = float(value); # Parse into numerical values for comparison
recommendedData.append(dataRow);
@@ -450,13 +452,13 @@ def test_dataCache(self):
self.assertEqual( baselineQueryCount, newQueryCount );
# Repeat multiple times, should still have no new query activity
- prog = ProgressDots(10,1,"repeats");
- for iRepeat in xrange(10):
+ # prog = ProgressDots(10,1,"repeats");
+ for iRepeat in range(10):
newData = self.recommender( query );
newQueryCount = self.recommender.dataManager.queryCount;
self.assertEqualRecommendedData( baselineData, newData, query );
self.assertEqual( baselineQueryCount, newQueryCount );
- prog.update();
+ # prog.update();
# prog.printStatus();
# Query for subset should still yield no new query
diff --git a/medinfo/cpoe/test/TestOrderSetRecommender.py b/medinfo/cpoe/test/TestOrderSetRecommender.py
index c91fe636..86831322 100644
--- a/medinfo/cpoe/test/TestOrderSetRecommender.py
+++ b/medinfo/cpoe/test/TestOrderSetRecommender.py
@@ -2,12 +2,12 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime, timedelta;
import unittest
-from Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
-from Util import log;
+from .Const import LOGGER_LEVEL, RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.common.Util import ProgressDots;
@@ -27,6 +27,8 @@ class TestOrderSetRecommender(DBTestCase):
def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
log.info("Populate the database with test data")
@@ -340,9 +342,9 @@ def assertEqualRecommendedData(self, expectedData, recommendedData, query):
"""
lastScore = None;
for expectedItem, recommendedItem in zip(expectedData, recommendedData):
- for key in expectedItem.iterkeys(): # If specified, then verify a specific values
+ for key in expectedItem.keys(): # If specified, then verify a specific values
if isinstance(expectedItem[key],float):
- self.assertAlmostEquals(expectedItem[key], recommendedItem[key], 5);
+ self.assertAlmostEqual(expectedItem[key], recommendedItem[key], 5);
else:
self.assertEqual(expectedItem[key], recommendedItem[key]);
if lastScore is not None:
diff --git a/medinfo/cpoe/test/TestTopicModel.py b/medinfo/cpoe/test/TestTopicModel.py
index 2f09c1e8..8d5914b6 100644
--- a/medinfo/cpoe/test/TestTopicModel.py
+++ b/medinfo/cpoe/test/TestTopicModel.py
@@ -2,12 +2,12 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.common.Const import NULL_STRING;
from medinfo.db.test.Util import DBTestCase;
@@ -27,6 +27,8 @@ def setUp(self):
DBTestCase.setUp(self);
log.info("Populate the database with test data")
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
self.clinicalItemCategoryIdStrList = list();
headers = ["clinical_item_category_id","source_table"];
@@ -151,7 +153,7 @@ def assertExpectedTopItems(self, expectedDocCountByWordId, model, topTopicFile):
expectedTFIDF = score * expectedDocCountByWordId[None] / expectedDocCountByWordId[itemId];
#print >> sys.stderr, topicId, itemId, score, tfidf, expectedDocCountByWordId[itemId]
- self.assertAlmostEqual(expectedTFIDF, tfidf);
+ self.assertAlmostEqual(expectedTFIDF, tfidf, places=5);
if topicId not in topScoreByItemIdByTopicId:
topScoreByItemIdByTopicId[topicId] = dict();
@@ -159,9 +161,9 @@ def assertExpectedTopItems(self, expectedDocCountByWordId, model, topTopicFile):
itemsChecked += 1;
self.assertTrue( itemsChecked > 0 ); # Make sure an actual test happened
- for topicId, topScoreByItemId in topScoreByItemIdByTopicId.iteritems():
+ for topicId, topScoreByItemId in topScoreByItemIdByTopicId.items():
scoreByItemId = scoreByItemIdByTopicId[topicId];
- self.assertAlmostEqualsDict( topScoreByItemId, scoreByItemId );
+ self.assertAlmostEqualsDict( topScoreByItemId, scoreByItemId, places=5 );
def suite():
"""Returns the suite of tests to run for this test class / module.
diff --git a/medinfo/cpoe/test/TestTripleAssociationAnalysis.py b/medinfo/cpoe/test/TestTripleAssociationAnalysis.py
index 1f3ad29c..16aa3f3b 100644
--- a/medinfo/cpoe/test/TestTripleAssociationAnalysis.py
+++ b/medinfo/cpoe/test/TestTripleAssociationAnalysis.py
@@ -2,12 +2,12 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
@@ -22,6 +22,8 @@ def setUp(self):
DBTestCase.setUp(self);
log.info("Populate the database with test data")
+ from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
self.clinicalItemCategoryIdStrList = list();
headers = ["clinical_item_category_id","source_table"];
diff --git a/medinfo/cpoe/test/Util.py b/medinfo/cpoe/test/Util.py
index 7cf7241c..5d858e08 100644
--- a/medinfo/cpoe/test/Util.py
+++ b/medinfo/cpoe/test/Util.py
@@ -1,7 +1,8 @@
-import Const
+from . import Const
import sys, os
import logging
-import cgi, UserDict
+import cgi
+from collections import UserDict
import unittest
from medinfo.db.test.Util import DBTestCase;
diff --git a/medinfo/dataconversion/Const.py b/medinfo/dataconversion/Const.py
index e1d3227a..507656e9 100644
--- a/medinfo/dataconversion/Const.py
+++ b/medinfo/dataconversion/Const.py
@@ -2,7 +2,7 @@
import sys;
import logging
-import Env
+from . import Env
"""Application name","for example to identify a common logger object"""
APPLICATION_NAME = "medinfo.cpoe.app"
diff --git a/medinfo/dataconversion/DataExtractor.py b/medinfo/dataconversion/DataExtractor.py
index 22f8f638..79650ad7 100644
--- a/medinfo/dataconversion/DataExtractor.py
+++ b/medinfo/dataconversion/DataExtractor.py
@@ -6,7 +6,7 @@
from optparse import OptionParser
import sys, os;
import time;
-from cStringIO import StringIO;
+from io import StringIO;
from datetime import datetime, timedelta;
import numpy as np;
from heapq import heappush, heappop;
@@ -18,10 +18,10 @@
from medinfo.db import DBUtil;
from medinfo.db.Model import SQLQuery, RowItemModel, modelListFromTable, modelDictFromList, columnFromModelList;
from medinfo.db.ResultsFormatter import TextResultsFormatter, TabDictReader;
-from Util import log;
-import Util;
+from .Util import log;
+from . import Util;
-from Const import SENTINEL_RESULT_VALUE;
+from .Const import SENTINEL_RESULT_VALUE;
class DataExtractor:
def __init__(self):
@@ -244,7 +244,7 @@ def parseClinicalItemData_singlePatient(self, itemRowIter, patientId=None, patie
itemTimes = None;
itemTimesByPatientId = self.parseClinicalItemData(itemRowIter, patientIdCol, timeCol);
if patientId is None: # Then assume first one encountered is the patient ID of interest
- patientIds = itemTimesByPatientId.keys();
+ patientIds = list(itemTimesByPatientId.keys());
if patientIds:
patientId = patientIds[0];
if patientId in itemTimesByPatientId:
@@ -257,7 +257,7 @@ def generateClinicalItemIndexTimes(self, itemTimesByPatientId, patientById, colN
"""
patientEpisodeByIndexTimeById = dict();
newColNames = list(); # Keep track of newly added columns
- for patientId, itemTimes in itemTimesByPatientId.iteritems():
+ for patientId, itemTimes in itemTimesByPatientId.items():
patient = patientById[patientId];
(patientEpisodeByIndexTimeById[patientId], newColNames) = self.generateClinicalItemIndexTimes_singleRecord(itemTimes, patient, colNames, preDays, postDays);
colNames.extend(newColNames);
@@ -272,13 +272,13 @@ def generateClinicalItemIndexTimes_singleRecord(self, itemTimes, patient, preDay
for itemTime in itemTimes:
itemDay = datetime(itemTime.year, itemTime.month, itemTime.day); # Capture at day resolution
- for iPreDay in xrange(preDays):
+ for iPreDay in range(preDays):
keyDay = itemDay + timedelta(-iPreDay);
patientCopy = dict(patientById[patientId]);
patientCopy["index_time"] = keyDay;
patientEpisodeByIndexTime[keyDay] = patientCopy;
- for iPostDay in xrange(+1,postDays+1):
+ for iPostDay in range(+1,postDays+1):
keyDay = itemDay + timedelta(+iPostDay);
patientCopy = dict(patientById[patientId]);
patientCopy["index_time"] = keyDay;
@@ -288,7 +288,7 @@ def generateClinicalItemIndexTimes_singleRecord(self, itemTimes, patient, preDay
def addTimeCycleFeatures_singlePatient(self, patientEpisodeByIndexTime, timeCol, timeAttr):
colNames = None;
- for patientEpisode in patientEpisodeByIndexTime.itervalues():
+ for patientEpisode in patientEpisodeByIndexTime.values():
colNames = self.addTimeCycleFeatures_singleEpisode(patientEpisode, timeCol, timeAttr);
return colNames;
@@ -326,7 +326,7 @@ def addClinicalItemFeatures(self, itemTimesByPatientId, patientEpisodeByIndexTim
If not specified, then default to list from medinfo.cpoe.Const.DELTA_NAME_BY_DAYS;
"""
newColNames = list(); # Keep track of newly added columns
- for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.iteritems():
+ for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.items():
itemTimes = None;
if patientId in itemTimesByPatientId: # Have items to lookup against
itemTimes = itemTimesByPatientId[patientId];
@@ -342,7 +342,7 @@ def addClinicalItemFeatures_singlePatient(self, itemTimes, patientEpisodeByIndex
If not specified, then default to list from medinfo.cpoe.Const.DELTA_NAME_BY_DAYS;
"""
if daysBins is None:
- daysBins = DELTA_NAME_BY_DAYS.keys();
+ daysBins = list(DELTA_NAME_BY_DAYS.keys());
daysBins.sort();
# Find items most proximate before and after the index item for each patient
@@ -353,7 +353,7 @@ def addClinicalItemFeatures_singlePatient(self, itemTimes, patientEpisodeByIndex
preLabel = "%s.pre" % itemLabel;
postLabel = "%s.post" % itemLabel;
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
# Initialize values to null for not found
patient[preTimeLabel] = None;
patient[postTimeLabel] = None;
@@ -440,7 +440,7 @@ def queryFlowsheet(self, flowsheetNames, patientIds, outputFile):
if outputFile is not None: # Stream output to formatter to avoid keeping all results in memory
formatter = TextResultsFormatter(outputFile);
- colNames = ["pat_anon_id","flo_meas_id","flowsheet_name","flowsheet_value","shifted_record_dt_tm"];
+ colNames = ["pat_anon_id","flo_meas_id","flowsheet_name","flowsheet_value","shifted_dt_tm"];
patientIdStrs = list();
for patientId in patientIds:
@@ -453,7 +453,7 @@ def queryFlowsheet(self, flowsheetNames, patientIds, outputFile):
query.addWhereIn("flowsheet_name", flowsheetNames );
query.addWhereIn("pat_anon_id", patientIdStrs );
query.addOrderBy("pat_anon_id");
- query.addOrderBy("shifted_record_dt_tm");
+ query.addOrderBy("shifted_dt_tm");
return DBUtil.execute( query, includeColumnNames=True, formatter=formatter );
@@ -520,7 +520,7 @@ def parseResultsData_singlePatient(self, resultRowIter, patientIdCol, nameCol, v
resultsByName = None;
resultsByNameByPatientId = self.parseResultsData(resultRowIter, patientIdCol, nameCol, valueCol, datetimeCol);
if patientId is None: # Then assume first one encountered is the patient ID of interest
- patientIds = resultsByNameByPatientId.keys();
+ patientIds = list(resultsByNameByPatientId.keys());
if patientIds:
patientId = patientIds[0];
if patientId in resultsByNameByPatientId:
@@ -544,7 +544,7 @@ def addResultFeatures(self, patientEpisodeByIndexTimeById, patientIdResultsByNam
# Separate loop to verify all patient records addressed, even if no results available (like an outer join)
resultsByName = None;
- for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.iteritems():
+ for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.items():
newColNames = self.addResultFeatures_singlePatient(patientEpisodeByIndexTime, resultsByName, baseNames, valueCol, datetimeCol, preTimeDelta, postTimeDelta);
colNames.extend(newColNames);
@@ -566,7 +566,7 @@ def addResultFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByNa
postTimeDays = postTimeDelta.days;
# Init summary values to null for all results
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
for baseName in baseNames:
if resultsByName is not None or ("%s.%s_%s.count" % (baseName,preTimeDays,postTimeDays)) not in patient:
# Default to null for all values
@@ -587,7 +587,7 @@ def addResultFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByNa
patient["%s.%s_%s.proximateTimeDays" % (baseName,preTimeDays,postTimeDays)] = None;
if resultsByName is not None: # Have results available for this patient
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
# Time range limits on labs to consider
preTimeLimit = None;
@@ -676,21 +676,21 @@ def addLabFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByName,
return self.addResultFeatures_singlePatient(patientEpisodeByIndexTime, resultsByName, baseNames, "ord_num_value", "result_time", preTimeDelta, postTimeDelta);
def parseFlowsheetFile(self, resultFile):
- for result in self.parseResultsFile(resultFile, "pat_anon_id","flowsheet_name","flowsheet_value","shifted_record_dt_tm"):
+ for result in self.parseResultsFile(resultFile, "pat_anon_id","flowsheet_name","flowsheet_value","shifted_dt_tm"):
yield result;
def parseFlowsheetData(self, resultRowIter):
- return self.parseResultsData(resultRowIter, "pat_anon_id","flowsheet_name","flowsheet_value","shifted_record_dt_tm");
+ return self.parseResultsData(resultRowIter, "pat_anon_id","flowsheet_name","flowsheet_value","shifted_dt_tm");
def parseFlowsheetData_singlePatient(self, resultRowIter, patientId=None):
- return self.parseResultsData_singlePatient(resultRowIter, "pat_anon_id","flowsheet_name","flowsheet_value","shifted_record_dt_tm", patientId);
+ return self.parseResultsData_singlePatient(resultRowIter, "pat_anon_id","flowsheet_name","flowsheet_value","shifted_dt_tm", patientId);
def addFlowsheetFeatures(self, patientEpisodeByIndexTimeById, patientIdResultsByNameGenerator, baseNames, preTimeDelta, postTimeDelta, colNames):
#log.info("Sort flowsheet by time for each patient and find items within specified time period to aggregate");
- return self.addResultFeatures(patientEpisodeByIndexTimeById, patientIdResultsByNameGenerator, baseNames, "flowsheet_value","shifted_record_dt_tm", preTimeDelta, postTimeDelta, colNames)
+ return self.addResultFeatures(patientEpisodeByIndexTimeById, patientIdResultsByNameGenerator, baseNames, "flowsheet_value","shifted_dt_tm", preTimeDelta, postTimeDelta, colNames)
def addFlowsheetFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByName, baseNames, preTimeDelta, postTimeDelta):
- return self.addResultFeatures_singlePatient(patientEpisodeByIndexTime, resultsByName, baseNames, "flowsheet_value","shifted_record_dt_tm", preTimeDelta, postTimeDelta);
+ return self.addResultFeatures_singlePatient(patientEpisodeByIndexTime, resultsByName, baseNames, "flowsheet_value","shifted_dt_tm", preTimeDelta, postTimeDelta);
def queryIVFluids(self, ivfMedIds, patientIds, outputFile):
"""Can get sets of IVFluid medication IDs from medinfo/dataconversion/mapdata/Medication.IVFluids.tab
@@ -764,14 +764,14 @@ def addIVFluidFeatures(self, patientEpisodeByIndexTimeById, ivFluidsByPatientId,
"""
log.info("Run though IV Fluid orders for each patient and calculate accumulate amounts for different threshold volumes and checkpoint times");
firstPass = True;
- for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.iteritems():
+ for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.items():
# Custom rebuild IV fluid item list so infusion end times are their own (negative) events
expandedIVFluidItems = list();
if patientId in ivFluidsByPatientId:
expandedIVFluidItems = self.expandIVFluidItems(ivFluidsByPatientId[patientId]);
- for indexTime, patient in patientEpisodeByIndexTime.iteritems(): # If have multiple index times per patient, will be repeated calculations here since restart volume accumulation counts for each index time
+ for indexTime, patient in patientEpisodeByIndexTime.items(): # If have multiple index times per patient, will be repeated calculations here since restart volume accumulation counts for each index time
# First build up accumulating fluid time point information
timepoints = [0]; # Track time points (seconds relative to index time) evaluated
preBolusVolumes = [0.0]; # Track total volume (mL) accumulated up to each time point, before any boluses that occur at this timepoint
@@ -844,7 +844,7 @@ def expandIVFluidItems(self, ivFluidItems):
for ivFluidItem in ivFluidItems:
nextTime = ivFluidItem["start_taking_time"];
while infusionEndItemHeap and infusionEndItemHeap[0][0] <= nextTime: # See if passed any infusion end times, then record an entry for those
- (endTime, infusionEndItem) = heappop(infusionEndItemHeap);
+ (endTime, infusionEndItem_str, infusionEndItem) = heappop(infusionEndItemHeap);
expandedIVFluidItems.append(infusionEndItem);
expandedIVFluidItems.append(ivFluidItem);
if ivFluidItem["min_rate"] is not None: # Looks like a continuous infusion
@@ -852,17 +852,20 @@ def expandIVFluidItems(self, ivFluidItems):
infusionEndItem = dict(ivFluidItem);
infusionEndItem["start_taking_time"] = infusionEndItem["end_taking_time"];
infusionEndItem["min_rate"] = -infusionEndItem["min_rate"];
- heappush(infusionEndItemHeap, (ivFluidItem["end_taking_time"], infusionEndItem) ); # Keep track of infusion end time
+ # Keep track of infusion end time
+ # Using str() to avoid comparing infusionEndItems if end_taking_times are equal
+ # TODO what happens if str() are equal?
+ heappush(infusionEndItemHeap, (ivFluidItem["end_taking_time"], str(infusionEndItem), infusionEndItem))
# Final check if any end infusion items left to account for
while infusionEndItemHeap:
- (endTime, infusionEndItem) = heappop(infusionEndItemHeap);
+ (endTime, infusionEndItem_str, infusionEndItem) = heappop(infusionEndItemHeap);
expandedIVFluidItems.append(infusionEndItem);
return expandedIVFluidItems;
def filterPatients(patientById):
#log.info("Deidentify patient IDs and build data list with adequate data");
patientResults = list();
- for iPatient, patient in enumerate(patientById.itervalues()):
+ for iPatient, patient in enumerate(patientById.values()):
# Further deidentify patients by applying sequential ID
patient["pat_id"] = patient["patient_id"] = iPatient;
# Only accept patients where an index item and times were found
diff --git a/medinfo/dataconversion/FeatureExtractor.py b/medinfo/dataconversion/FeatureExtractor.py
new file mode 100644
index 00000000..5287dc52
--- /dev/null
+++ b/medinfo/dataconversion/FeatureExtractor.py
@@ -0,0 +1,616 @@
+"""
+Defines all feature extractors used by featurizers. A feature extractor is a
+self contained module that takes in a cohort table and appends to or creates a
+long form feature matrix in a temporary bigquery table with the following schema
+Columns:
+ observation_id -- integer
+ index_time -- timestamp
+ feature_type -- string
+ feature_time -- timestamp
+ feature_id -- string
+ feature -- string
+ feature_value -- numeric
+"""
+from google.cloud import bigquery
+from google.cloud.exceptions import NotFound
+import pandas as pd
+
+REPLACE_TABLE = True
+
+class FlowsheetBinsExtractor():
+ """
+ Defines logic to extract vitals from flowsheets
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id,
+ flowsheet_descriptions, look_back_days=3, bins=5,
+ project_id='som-nero-phi-jonc101', dataset='shc_core_2021'):
+ """
+ Tokenizes flowsheets into bins and then writes or appends to temp
+ dataset.
+ Args:
+ cohort_table: name of cohort table -- used to join to features
+ temp_dataset: name of temp dataset with cohort table
+ flowsheet_descriptions: list of row_disp_names used for flowsheet
+ descriptions
+ project_id: name of project you are extracting data from
+ dataset: name of dataset you are extracting data from
+ Returns:
+ df_lup : dataframe with bin thresholds
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.client = bigquery.Client()
+ self.look_back_days = look_back_days
+ self.project_id = project_id
+ self.dataset = dataset
+ self.flowsheet_descriptions = "("
+ for i, flow in enumerate(flowsheet_descriptions):
+ if i == len(flowsheet_descriptions) - 1:
+ self.flowsheet_descriptions += f"'{flow}')"
+ else:
+ self.flowsheet_descriptions += f"'{flow}', "
+
+ def __call__(self):
+ """
+ Executes queries and returns all
+ """
+ query = f"""
+ WITH flowsheet_vals AS (
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Vitals' as feature_type,
+ f.recorded_time_utc as feature_time,
+ GENERATE_UUID() as feature_id,
+ f.row_disp_name as feature,
+ CAST(f.numerical_val_1 AS float64) as value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.flowsheet f
+ ON
+ labels.anon_id = f.anon_id
+ WHERE
+ f.recorded_time_utc < labels.index_time
+ AND
+ TIMESTAMP_ADD(f.recorded_time_utc,
+ INTERVAL 24*{self.look_back_days} HOUR)
+ >= labels.index_time
+ AND
+ f.row_disp_name in {self.flowsheet_descriptions}
+ AND
+ f.numerical_val_1 IS NOT NULL
+ ),
+
+ ranked as (
+ SELECT DISTINCT
+ observation_id, index_time, feature_type,
+ feature_time, feature_id, feature,
+ PERCENT_RANK() OVER (PARTITION BY feature ORDER BY value) value
+ FROM
+ flowsheet_vals
+ )
+
+ SELECT DISTINCT
+ observation_id, index_time, feature_type,
+ feature_time, feature_id,
+ CASE WHEN value < 0.2 THEN CONCAT(feature, '_0')
+ WHEN value < 0.4 THEN CONCAT(feature, '_1')
+ WHEN value < 0.6 THEN CONCAT(feature, '_2')
+ WHEN value < 0.8 THEN CONCAT(feature, '_3')
+ ELSE CONCAT(feature, '_4')
+ END feature,
+ 1 value
+ FROM
+ ranked
+ """
+ query = add_create_or_append_logic(query, self.feature_table_id)
+ query_job = self.client.query(query)
+ query_job.result()
+ df_lup = self.get_bin_thresholds()
+ return df_lup
+
+ def get_bin_thresholds(self):
+ query = f"""
+ WITH flowsheet_vals AS (
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Vitals' as feature_type,
+ f.recorded_time_utc as feature_time,
+ GENERATE_UUID() as feature_id,
+ f.row_disp_name as feature,
+ CAST(f.numerical_val_1 AS float64) as value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.flowsheet f
+ ON
+ labels.anon_id = f.anon_id
+ WHERE
+ f.recorded_time_utc < labels.index_time
+ AND
+ TIMESTAMP_ADD(f.recorded_time_utc,
+ INTERVAL 24*{self.look_back_days} HOUR)
+ >= labels.index_time
+ AND
+ f.row_disp_name in {self.flowsheet_descriptions}
+ AND
+ f.numerical_val_1 IS NOT NULL
+ )
+
+ SELECT DISTINCT
+ feature,
+ PERCENTILE_DISC(value, 0.2) OVER(PARTITION BY feature) min_bin_1,
+ PERCENTILE_DISC(value, 0.4) OVER(PARTITION BY feature) min_bin_2,
+ PERCENTILE_DISC(value, 0.6) OVER(PARTITION BY feature) min_bin_3,
+ PERCENTILE_DISC(value, 0.8) OVER(PARTITION BY feature) min_bin_4,
+ FROM
+ flowsheet_vals
+ """
+ df = pd.read_gbq(query)
+ return df
+
+class LabResultBinsExtractor():
+ """
+ Defines logic to extract lab results orders,
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id,
+ base_names, bins=5, look_back_days=14,
+ project_id='som-nero-phi-jonc101', dataset='shc_core_2021'):
+ """
+ Args:
+ cohort_table: name of cohort table -- used to join to features
+ temp_dataset: name of temp dataset with cohort table
+ project_id: name of project you are extracting data from
+ dataset: name of dataset you are extracting data from
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.client = bigquery.Client()
+ self.num_bins = bins
+ self.look_back_days = look_back_days
+ self.project_id = project_id
+ self.dataset = dataset
+ self.base_name_string = "("
+ for i, base_name in enumerate(base_names):
+ if i == len(base_names) - 1:
+ self.base_name_string += f"'{base_name}')"
+ else:
+ self.base_name_string += f"'{base_name}', "
+
+ def __call__(self):
+ """
+ Executes queries and returns all
+ """
+ query = f"""
+ WITH labresults_values AS (
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Lab Results' as feature_type,
+ lr.result_time_utc as feature_time,
+ CAST(lr.order_id_coded AS STRING) as feature_id,
+ lr.base_name as feature,
+ lr.ord_num_value as value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.lab_result lr
+ ON
+ labels.anon_id = lr.anon_id
+ WHERE
+ lr.result_time_utc < labels.index_time
+ AND
+ TIMESTAMP_ADD(lr.result_time_utc,
+ INTERVAL 24*{self.look_back_days} HOUR)
+ >= labels.index_time
+ AND
+ lr.base_name in {self.base_name_string}
+ AND
+ lr.ord_num_value IS NOT NULL
+ ),
+
+ ranked as (
+ SELECT DISTINCT
+ observation_id, index_time, feature_type,
+ feature_time, feature_id, feature,
+ PERCENT_RANK() OVER (PARTITION BY feature ORDER BY value) value
+ FROM
+ labresults_values
+ )
+
+ SELECT DISTINCT
+ observation_id, index_time, feature_type,
+ feature_time, feature_id,
+ CASE WHEN value < 0.2 THEN CONCAT(feature, '_0')
+ WHEN value < 0.4 THEN CONCAT(feature, '_1')
+ WHEN value < 0.6 THEN CONCAT(feature, '_2')
+ WHEN value < 0.8 THEN CONCAT(feature, '_3')
+ ELSE CONCAT(feature, '_4')
+ END feature,
+ 1 value
+ FROM
+ ranked
+ """
+ query = add_create_or_append_logic(query, self.feature_table_id)
+ query_job = self.client.query(query)
+ query_job.result()
+ df_lup = self.get_bin_thresholds()
+ return df_lup
+
+ def get_bin_thresholds(self):
+ query = f"""
+ WITH labresults_values AS (
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Lab Results' as feature_type,
+ lr.result_time_utc as feature_time,
+ CAST(lr.order_id_coded AS STRING) as feature_id,
+ lr.base_name as feature,
+ lr.ord_num_value as value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.lab_result lr
+ ON
+ labels.anon_id = lr.anon_id
+ WHERE
+ lr.result_time_utc < labels.index_time
+ AND
+ TIMESTAMP_ADD(lr.result_time_utc,
+ INTERVAL 24*{self.look_back_days} HOUR)
+ >= labels.index_time
+ AND
+ lr.base_name in {self.base_name_string}
+ AND
+ lr.ord_num_value IS NOT NULL
+ )
+
+ SELECT DISTINCT
+ feature,
+ PERCENTILE_DISC(value, 0.2) OVER(PARTITION BY feature) min_bin_1,
+ PERCENTILE_DISC(value, 0.4) OVER(PARTITION BY feature) min_bin_2,
+ PERCENTILE_DISC(value, 0.6) OVER(PARTITION BY feature) min_bin_3,
+ PERCENTILE_DISC(value, 0.8) OVER(PARTITION BY feature) min_bin_4,
+ FROM
+ labresults_values
+ """
+ df = pd.read_gbq(query)
+ return df
+
+class MedicationExtractor():
+ """
+ Defines logic to extract medication orders
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id,
+ look_back_days=28, project_id='som-nero-phi-jonc101',
+ dataset='shc_core_2021'):
+ """
+ Args:
+ cohort_table: name of cohort table -- used to join to features
+ project_id: name of project you are extracting data from
+ dataset: name of dataset you are extracting data from
+ """
+ self.cohort_table_id = cohort_table_id
+ self.look_back_days = look_back_days
+ self.project_id = project_id
+ self.dataset = dataset
+ self.feature_table_id = feature_table_id
+ self.client = bigquery.Client()
+
+ def __call__(self):
+ """
+ Executes queries and returns all
+ """
+ query = f"""
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Medications' as feature_type,
+ meds.order_inst_utc as feature_time,
+ CAST(meds.order_med_id_coded as STRING) as feature_id,
+ meds.med_description as feature,
+ 1 as value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.order_med meds
+ ON
+ labels.anon_id = meds.anon_id
+ WHERE
+ CAST(meds.order_inst_utc as TIMESTAMP) < labels.index_time
+ AND
+ TIMESTAMP_ADD(meds.order_inst_utc,
+ INTERVAL 24*{self.look_back_days} HOUR)
+ >= labels.index_time
+ """
+ query = add_create_or_append_logic(query, self.feature_table_id)
+ query_job = self.client.query(query)
+ query_job.result()
+
+class PatientProblemExtractor():
+ """
+ Defines logic to extract diagnoses on the patient's problem list
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id,
+ project_id='som-nero-phi-jonc101', dataset='shc_core_2021'):
+ """
+ Args:
+ cohort_table: name of cohort table -- used to join to features
+ project_id: name of project you are extracting data from
+ dataset: name of dataset you are extracting data from
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.client = bigquery.Client()
+ self.project_id = project_id
+ self.dataset = dataset
+
+ def __call__(self):
+ """
+ Executes queries and returns all
+ """
+ query = f"""
+ SELECT
+ labels.observation_id,
+ labels.index_time,
+ 'Diagnoses' as feature_type,
+ CAST(dx.start_date_utc as TIMESTAMP) as feature_time,
+ GENERATE_UUID() as feature_id,
+ dx.icd10 as feature,
+ 1 value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.diagnosis dx
+ ON
+ labels.anon_id = dx.anon_id
+ WHERE
+ CAST(dx.start_date_utc as TIMESTAMP) < labels.index_time
+ AND
+ source = 2 --problem list only
+ """
+ query = add_create_or_append_logic(query, self.feature_table_id)
+ query_job = self.client.query(query)
+ query_job.result()
+
+class SexExtractor():
+ """
+ Defines logic to extract sex as feature from dataset
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id,
+ project_id='som-nero-phi-jonc101', dataset='shc_core_2021'):
+ """
+ Args:
+ cohort_table: name of cohort table -- used to join to features
+ project_id: name of project you are extracting data from
+ dataset: name of dataset you are extracting data from
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.client = bigquery.Client()
+ self.project_id = project_id
+ self.dataset = dataset
+
+ def __call__(self):
+ """
+ Executes queries and returns all
+ """
+ query = f"""
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Demographics' as feature_type,
+ labels.index_time as feature_time,
+ GENERATE_UUID() as feature_id,
+ CASE WHEN demo.GENDER is NULL then 'sex_missing'
+ ELSE CONCAT('sex_', demo.GENDER) END feature,
+ 1 value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.demographic demo
+ ON
+ labels.anon_id = demo.ANON_ID
+ """
+ query = add_create_or_append_logic(query, self.feature_table_id)
+ query_job = self.client.query(query)
+ query_job.result()
+
+class RaceExtractor():
+ """
+ Defines logic to extract race as feature from dataset
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id,
+ project_id='som-nero-phi-jonc101', dataset='shc_core_2021'):
+ """
+ Args:
+ cohort_table: name of cohort table -- used to join to features
+ project_id: name of project you are extracting data from
+ dataset: name of dataset you are extracting data from
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.client = bigquery.Client()
+ self.project_id = project_id
+ self.dataset = dataset
+
+ def __call__(self):
+ """
+ Executes queries and returns all
+ """
+ query = f"""
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Demographics' as feature_type,
+ labels.index_time as feature_time,
+ GENERATE_UUID() as feature_id,
+ CASE WHEN demo.CANONICAL_RACE is NULL then 'race_missing'
+ ELSE CONCAT('race_', demo.CANONICAL_RACE) END feature,
+ 1 value
+ FROM
+ {self.cohort_table_id}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.demographic demo
+ ON
+ labels.anon_id = demo.ANON_ID
+ """
+ query = add_create_or_append_logic(query, self.feature_table_id)
+ query_job = self.client.query(query)
+ query_job.result()
+
+class AgeExtractor():
+ """
+ Defines logic to extract age as feature from dataset
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id, bins=5,
+ project_id='som-nero-phi-jonc101', dataset='shc_core_2021'):
+ """
+ Args:
+ cohort_table: name of cohort table -- used to join to features
+ project_id: name of project you are extracting data from
+ dataset: name of dataset you are extracting data from
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.client = bigquery.Client()
+ self.num_bins = bins
+ self.project_id = project_id
+ self.dataset = dataset
+
+ def __call__(self):
+ """
+ Executes queries and returns all
+ """
+ query = f"""
+ WITH age_values as (
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Demographics' as feature_type,
+ labels.index_time as feature_time,
+ GENERATE_UUID() as feature_id,
+ 'Age' as feature,
+ DATE_DIFF(
+ CAST(labels.index_time AS date), demo.BIRTH_DATE_JITTERED, YEAR)
+ as value
+ FROM
+ {self.cohort_table_id}
+ labels
+ INNER JOIN
+ {self.project_id}.{self.dataset}.demographic demo
+ ON
+ labels.anon_id = demo.ANON_ID
+ ),
+ ranked as (
+ SELECT DISTINCT
+ observation_id, index_time, feature_type,
+ feature_time, feature_id, feature,
+ PERCENT_RANK() OVER (PARTITION BY feature ORDER BY value) value
+ FROM
+ age_values
+ )
+
+ SELECT DISTINCT
+ observation_id, index_time, feature_type,
+ feature_time, feature_id,
+ CASE WHEN value < 0.2 THEN CONCAT(feature, '_0')
+ WHEN value < 0.4 THEN CONCAT(feature, '_1')
+ WHEN value < 0.6 THEN CONCAT(feature, '_2')
+ WHEN value < 0.8 THEN CONCAT(feature, '_3')
+ ELSE CONCAT(feature, '_4')
+ END feature,
+ 1 value
+ FROM
+ ranked
+ """
+ query = add_create_or_append_logic(query, self.feature_table_id)
+ query_job = self.client.query(query)
+ query_job.result()
+ df_lup = self.get_bin_thresholds()
+ return df_lup
+
+ def get_bin_thresholds(self):
+ query = f"""
+ WITH age_values as (
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Demographics' as feature_type,
+ labels.index_time as feature_time,
+ GENERATE_UUID() as feature_id,
+ 'Age' as feature,
+ DATE_DIFF(
+ CAST(labels.index_time AS date), demo.BIRTH_DATE_JITTERED, YEAR)
+ as value
+ FROM
+ {self.cohort_table_id}
+ labels
+ INNER JOIN
+ {self.project_id}.{self.dataset}.demographic demo
+ ON
+ labels.anon_id = demo.ANON_ID
+ )
+
+ SELECT DISTINCT
+ feature,
+ PERCENTILE_DISC(value, 0.2) OVER(PARTITION BY feature) min_bin_1,
+ PERCENTILE_DISC(value, 0.4) OVER(PARTITION BY feature) min_bin_2,
+ PERCENTILE_DISC(value, 0.6) OVER(PARTITION BY feature) min_bin_3,
+ PERCENTILE_DISC(value, 0.8) OVER(PARTITION BY feature) min_bin_4,
+ FROM
+ age_values
+ """
+ df = pd.read_gbq(query)
+ return df
+
+def table_exists(feature_table_id):
+ """
+ Check if table exists
+ """
+ client = bigquery.Client()
+ try:
+ client.get_table(f'{feature_table_id}')
+ return True
+ except NotFound:
+ return False
+
+def add_create_or_append_logic(query, feature_table_id):
+ """
+ Adds SQL logic to either append or create a new feature matrix from result
+ of user supplied SQL query.
+ """
+ global REPLACE_TABLE
+ exists = table_exists(feature_table_id)
+ if exists and REPLACE_TABLE == False:
+ query = f"""
+ INSERT INTO
+ {feature_table_id}
+ {query}
+ """
+ else:
+ query = f"""
+ CREATE OR REPLACE TABLE {feature_table_id} AS (
+ {query}
+ )
+ """
+ REPLACE_TABLE = False
+ return query
diff --git a/medinfo/dataconversion/FeatureMatrix.py b/medinfo/dataconversion/FeatureMatrix.py
new file mode 100644
index 00000000..3e912e4f
--- /dev/null
+++ b/medinfo/dataconversion/FeatureMatrix.py
@@ -0,0 +1,393 @@
+#!/usr/bin/python
+"""
+Abstract class for building raw feature matrices.
+This class should take care of the business logic of interacting
+with FeatureMatrixFactory and FeatureMatrixIO, allowing subclasses
+to just worry about defining parameters for matrix construction.
+"""
+
+import os
+import datetime
+
+from medinfo.dataconversion.FeatureMatrixIO import FeatureMatrixIO
+
+import LocalEnv
+from medinfo.dataconversion.FeatureMatrixFactory import FeatureMatrixFactory
+from medinfo.db import DBUtil
+from .Util import log
+
+class FeatureMatrix:
+ def __init__(self, variable, num_data_points, params=None):
+ # Process arguments.
+ self._var = variable
+ self._num_rows = num_data_points
+ if params is None:
+ self._params = {}
+ else:
+ self._params = params
+
+ # Initialize FeatureMatrixFactory.
+ self._factory = FeatureMatrixFactory()
+
+ # Initialize DB connection.
+ self._connection = DBUtil.connection()
+
+ def _query_patient_episodes(self, query, pat_id_col=None, index_time_col=None):
+ # Initialize DB cursor.
+ cursor = self._connection.cursor()
+
+ # Fetch and return results.
+ log.info('query: %s' % str(query))
+
+ if isinstance(query, str):
+ cursor.execute(query)
+ else:
+ log.info('query.params: %s' % str(query.params))
+ cursor.execute(str(query), query.params)
+
+ # Parse arguments.
+ if pat_id_col is None:
+ pat_id_col = 'pat_id'
+ if index_time_col is None:
+ index_time_col = 'index_time'
+
+ self._factory.setPatientEpisodeInput(cursor, pat_id_col, index_time_col)
+ num_episodes = self._factory.processPatientEpisodeInput()
+
+ return num_episodes
+
+ def _querystr_patient_episodes(self, querystr, pat_id_col=None, index_time_col=None):
+ # Initialize DB cursor.
+ cursor = self._connection.cursor()
+
+ # Fetch and return results.
+ log.info('query: %s' % querystr)
+ cursor.execute(querystr)
+
+ # Parse arguments.
+ if pat_id_col is None:
+ pat_id_col = 'pat_id'
+ if index_time_col is None:
+ index_time_col = 'index_time'
+
+ self._factory.setPatientEpisodeInput(cursor, pat_id_col, index_time_col)
+ num_episodes = self._factory.processPatientEpisodeInput()
+
+ return num_episodes
+
+ def _add_features(self, index_time_col=None):
+
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ self._add_time_features(index_time_col)
+ self._add_demographic_features()
+ self._add_treatment_team_features()
+ self._add_comorbidity_features()
+ self._add_flowsheet_features()
+ self._add_lab_component_features()
+ else:
+ # elif LocalEnv.DATASET_SOURCE_NAME == 'UMich':
+ self._add_time_features(index_time_col)
+ self._add_demographic_features()
+ self._add_comorbidity_features()
+ self._add_lab_component_features()
+
+ if LocalEnv.DATASET_SOURCE_NAME == 'UCSF':
+ self._add_treatment_team_features()
+ self._add_flowsheet_features()
+
+ def _add_time_features(self, index_time_col=None):
+ log.info('Adding admit date features...')
+ # Add admission date.
+ ADMIT_DX_CATEGORY_ID = 2
+
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ self._factory.addClinicalItemFeaturesByCategory([ADMIT_DX_CATEGORY_ID], \
+ dayBins=[], label='AdmitDxDate', features='pre')
+ else:
+ #elif LocalEnv.DATASET_SOURCE_NAME == 'UMich':
+ self._factory.addClinicalItemFeaturesByCategory_UMich([ADMIT_DX_CATEGORY_ID], \
+ dayBins=[], label='AdmitDxDate', features='pre', tableName='encounters')
+
+
+
+ # Add time cycle features.
+ log.info('Adding time cycle features...')
+ if index_time_col is None:
+ index_time_col = 'index_time'
+ self._factory.addTimeCycleFeatures(index_time_col, 'month')
+ self._factory.addTimeCycleFeatures(index_time_col, 'hour')
+
+ def _add_demographic_features(self):
+ log.info('Adding demographic features...')
+ # Add birth and death.
+ self._add_lifespan_features()
+ # Add sex features.
+ self._add_sex_features()
+ # Add race features.
+ self._add_race_features()
+
+ def _add_lifespan_features(self):
+ log.info('Adding lifespan features...')
+
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE': # TODO
+ self._factory.addClinicalItemFeatures(['Birth'], dayBins=[], features="pre")
+ self._factory.addClinicalItemFeatures(['Death'], dayBins=[], features="post")
+ else:
+ #elif LocalEnv.DATASET_SOURCE_NAME == 'UMich':
+ self._factory.addClinicalItemFeatures_UMich(['Birth'], dayBins=[], features="pre",
+ clinicalItemType=None, clinicalItemTime='Birth',
+ tableName='pt_info')
+
+ def _add_sex_features(self):
+ log.info('Adding sex features...')
+ SEX_FEATURES = ["Male", "Female"]
+ for feature in SEX_FEATURES:
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE': # TODO
+ self._factory.addClinicalItemFeatures([feature], dayBins=[], features="pre")
+ else:
+ #elif LocalEnv.DATASET_SOURCE_NAME == 'UMich':
+ self._factory.addClinicalItemFeatures_UMich([feature], dayBins=[], features="pre",
+ clinicalItemType='GenderName', clinicalItemTime=None, tableName="demographics")
+ def _add_race_features(self):
+ log.info('Adding race features...')
+ for feature in self._factory.queryAllRaces():
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE': # TODO
+ self._factory.addClinicalItemFeatures([feature], dayBins=[], features="pre")
+ else:
+ #elif LocalEnv.DATASET_SOURCE_NAME == 'UMich':
+ self._factory.addClinicalItemFeatures_UMich([feature], dayBins=[], features="pre",
+ clinicalItemType='RaceName', clinicalItemTime=None, tableName='demographics')
+
+ def _add_treatment_team_features(self):
+ log.info('Adding treatment team features...')
+ self._factory.addTreatmentTeamFeatures(features="pre")
+
+ def _add_comorbidity_features(self):
+ log.info('Adding comorbidity features...')
+ self._factory.addCharlsonComorbidityFeatures(features='pre')
+
+ def _add_flowsheet_features(self):
+ log.info('Adding flowsheet features...')
+ # Look at flowsheet results from the previous days
+ FLOW_PRE_TIME_DELTAS = [ datetime.timedelta(-3) ]
+ # Don't look into the future, otherwise cheating the prediction
+ FLOW_POST_TIME_DELTA = datetime.timedelta(0)
+ # Add flowsheet features for a variety of generally useful vitals.
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ BASIC_FLOWSHEET_FEATURES = [
+ "BP_High_Systolic", "BP_Low_Diastolic", "FiO2",
+ "Glasgow Coma Scale Score", "Pulse", "Resp", "Temp", "Urine"
+ ]
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UCSF':
+ BASIC_FLOWSHEET_FEATURES = [
+ 'SBP', 'DBP', 'FiO2', 'Pulse', 'Resp', 'Temp', 'o2flow'
+ ]
+ for pre_time_delta in FLOW_PRE_TIME_DELTAS:
+ log.info('\t\tpreTimeDelta: %s' % pre_time_delta)
+ self._factory.addFlowsheetFeatures(BASIC_FLOWSHEET_FEATURES, \
+ pre_time_delta, FLOW_POST_TIME_DELTA)
+
+ def _add_lab_component_features(self):
+ # Look for lab data 90 days before each episode, but never after self.
+ # Look at lab results from the previous days
+ LAB_PRE_TIME_DELTAS = [ datetime.timedelta(-14) ]
+ # Don't look into the future, otherwise cheating the prediction
+ LAB_POST_TIME_DELTA = datetime.timedelta(0)
+
+ # Add result features for a variety of generally useful components.
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ BASIC_LAB_COMPONENTS = [
+ 'WBC', # White Blood Cell
+ 'HCT', # Hematocrit
+ 'PLT', # Platelet Count
+ 'NA', # Sodium, Whole Blood
+ 'K', # Potassium, Whole Blood
+ 'CO2', # CO2, Serum/Plasma
+ 'BUN', # Blood Urea Nitrogen
+ 'CR', # Creatinine
+ 'TBIL', # Total Bilirubin
+ 'ALB', # Albumin
+ 'CA', # Calcium
+ 'LAC', # Lactic Acid
+ 'ESR', # Erythrocyte Sedimentation Rate
+ 'CRP', # C-Reactive Protein
+ 'TNI', # Troponin I
+ 'PHA', # Arterial pH
+ 'PO2A', # Arterial pO2
+ 'PCO2A', # Arterial pCO2
+ 'PHV', # Venous pH
+ 'PO2V', # Venous pO2
+ 'PCO2V' # Venous pCO2
+ ]
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UMich':
+ BASIC_LAB_COMPONENTS = [
+ 'WBC', # White Blood Cell
+ 'HCT', # Hematocrit
+ 'PLT', # Platelet Count
+ 'SOD', # Sodium, Whole Blood
+ 'POT', # Potassium, Whole Blood
+ 'CO2', # CO2, Serum/Plasma
+ 'UN', # Blood Urea Nitrogen
+ 'CREAT', # Creatinine
+ 'TBIL', # Total Bilirubin
+ 'ALB', # Albumin
+ 'CAL', # Calcium
+ 'LACTA', # Lactic Acid; LACTA & LACTV are more frequent
+ "WEST", # Erythrocyte Sedimentation Rate
+ 'CRP', # C-Reactive Protein
+ 'TROP', # Troponin I
+ 'pHA', # Arterial pH
+ 'PO2AA', # Arterial pO2
+ 'PCOAA2', # Arterial pCO2
+ 'pHV', # Venous pH
+ 'pO2V', # Venous pO2
+ 'pCO2V', # Venous pCO2
+ ]
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UCSF':
+ BASIC_LAB_COMPONENTS = [
+ 'WBC', # White Blood Cell
+ 'HCT', # Hematocrit
+ 'PLT', # Platelet Count
+ 'NAWB', # Sodium, Whole Blood
+ 'K', # Potassium, Whole Blood
+ 'CO2', # CO2, Serum/Plasma
+ 'BUN', # Blood Urea Nitrogen
+ 'CREAT', # Creatinine
+ 'TBILI', # Total Bilirubin
+ 'ALB', # Albumin
+ 'CA', # Calcium
+ 'LACTWB', # Lactic Acid; LACTA & LACTV are more frequent
+ "ESR", # Erythrocyte Sedimentation Rate
+ 'CRP', # C-Reactive Protein
+ 'TRPI', # Troponin I
+ 'PH37', # Arterial pH
+ 'PO2', # Arterial pO2
+ 'PCO2' # Arterial pCO2
+ # 'pHV', # Venous pH
+ # 'pO2V', # Venous pO2
+ # 'pCO2V', # Venous pCO2
+ ]
+ log.info('Adding lab component features...')
+ for component in BASIC_LAB_COMPONENTS:
+ log.info('\t%s' % component)
+ for preTimeDelta in LAB_PRE_TIME_DELTAS:
+ log.info('\t\t%s' % preTimeDelta)
+ self._factory.addLabResultFeatures([component], False, preTimeDelta, LAB_POST_TIME_DELTA)
+
+ def _build_matrix(self, header=None, dest_path=None):
+ log.info('Building matrix...')
+ self._factory.buildFeatureMatrix(header, dest_path)
+
+ def write_matrix(self, dest_path, header=None):
+ log.info('Writing matrix file...')
+ fm_io = FeatureMatrixIO()
+ # Get old matrix file.
+ source_path = self._factory.getMatrixFileName()
+ # Write to new matrix filee.
+ matrix_file = open(dest_path, 'w')
+ # for line in header:
+ # matrix_file.write('# %s\n' % line)
+ for line in open(source_path, 'r'):
+ if line[0] != '#':
+ matrix_file.write(line)
+ # Delete old matrix file.
+ os.remove(source_path)
+
+ def _build_matrix_header(self, params=None):
+ # params['include_lab_suffix_summary'] = True/False
+ # params['include_clinical_item_suffix_summary'] = True/False
+ # params['data_overview'] = str description.
+ # params['field_summary'] = str description
+ header = list()
+
+ file_summary = self._build_file_summary(params['matrix_path'], \
+ params['matrix_module'])
+ header.extend(file_summary)
+ header.extend([''])
+
+ if params.get('data_overview'):
+ header.extend(params['data_overview'])
+ header.extend([''])
+ if params.get('field_summary'):
+ header.extend(params['field_summary'])
+ header.extend([''])
+ if params.get('include_clinical_item_suffix_summary'):
+ ci_suffix_summary = self._build_clinical_item_suffix_summary()
+ header.extend(ci_suffix_summary)
+ header.extend([''])
+ if params.get('include_lab_suffix_summary'):
+ lab_suffix_summary = self._build_flowsheet_and_lab_result_suffix_summary()
+ header.extend(lab_suffix_summary)
+ header.extend([''])
+
+ return header
+
+ def _build_file_summary(self, matrix_path, matrix_module):
+ summary = list()
+
+ #
+ matrix_name = matrix_path.split('/')[-1]
+ summary.append(matrix_name)
+ # Created:
+ timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
+ summary.append('Created: %s' % timestamp)
+ # Source: __name__
+ module_name = matrix_module.split('/')[-1]
+ summary.append('Source: %s' % module_name)
+ # Command: Pipeline()
+ class_name = module_name.split('.')[0]
+ args = [self._var, str(self._num_rows)]
+ for key, value in self._params:
+ args.append('%s=%s' % (key, value))
+ command = '%s(%s)' % (class_name, ', '.join(args))
+ summary.append('Command: %s' % command)
+
+ return summary
+
+ def _build_clinical_item_suffix_summary(self):
+ summary = list()
+ # [clinical_item] fields may have the following suffixes:
+ summary.append(' [clinical_item] fields may have the following suffixes:')
+ # ___.pre - how many times has this occurred before order_time?
+ summary.append(' ___.pre - how many times has this occurred before order_time?')
+ # ___.pre.Xd - how many times has this occurred within X days before index_time?
+ summary.append(' ___.pre.Xd - how many times has this occurred within X days before index_time?')
+ # ___.preTimeDays - how many days before order_time was last occurrence?
+ summary.append(' ___.preTimeDays - how many days before order_time was last occurrence?')
+
+ return summary
+
+ def _build_flowsheet_and_lab_result_suffix_summary(self):
+ summary = list()
+ # [flowsheet] and [lab_result] fields may have the following suffixes:
+ summary.append(' [flowsheet] and [lab_result] fields may have the following suffixes:')
+ # ___.X_Y.count - # of result values between X and Y days of index_time.
+ summary.append(' ___.X_Y.count - # of result values between X and Y days of index_time.')
+ # ___.X_Y.countInRange - # of result values in normal range.
+ summary.append(' ___.X_Y.countInRange - # of result values in normal range.')
+ # ___.X_Y.min - minimum result value.
+ summary.append(' ___.X_Y.min - minimum result value.')
+ # ___.X_Y.max - maximum result value.
+ summary.append(' ___.X_Y.max - maximum result value.')
+ # ___.X_Y.median - median result value.
+ summary.append(' ___.X_Y.median - median result value.')
+ # ___.X_Y.std - standard deviation of result values.
+ summary.append(' ___.X_Y.std - standard deviation of result values.')
+ # ___.X_Y.first - first result value.
+ summary.append(' ___.X_Y.first - first result value.')
+ # ___.X_Y.last - last result value.
+ summary.append(' ___.X_Y.last - last result value.')
+ # ___.X_Y.diff - difference between penultimate and proximate values.
+ summary.append(' ___.X_Y.diff - difference between penultimate and proximate values.')
+ # ___.X_Y.slope - slope between penultimate and proximate values.
+ summary.append(' ___.X_Y.slope - slope between penultimate and proximate values.')
+ # ___.X_Y.proximate - closest result value to order_time.
+ summary.append(' ___.X_Y.proximate - closest result value to order_time.')
+ # ___.X_Y.firstTimeDays - time between first and order_time.
+ summary.append(' ___.X_Y.firstTimeDays - time between first and order_time.')
+ # ___.X_Y.lastTimeDays - time between last and order_time.
+ summary.append(' ___.X_Y.lastTimeDays - time between last and order_time.')
+ # ___.X_Y.proximateTimeDays - time between proximate and order_time.
+ summary.append(' ___.X_Y.proximateTimeDays - time between proximate and order_time.')
+
+ return summary
diff --git a/medinfo/dataconversion/FeatureMatrixFactory.py b/medinfo/dataconversion/FeatureMatrixFactory.py
index 2e8125be..dd76922d 100644
--- a/medinfo/dataconversion/FeatureMatrixFactory.py
+++ b/medinfo/dataconversion/FeatureMatrixFactory.py
@@ -14,25 +14,37 @@
import csv
import datetime
+from io import IOBase
import numpy as np
import os
import time
-from Const import SENTINEL_RESULT_VALUE
+from .Const import SENTINEL_RESULT_VALUE
+from medinfo.common.Env import LAB_TYPE
from medinfo.common.Const import NULL_STRING
from medinfo.cpoe.Const import SECONDS_PER_DAY, DELTA_NAME_BY_DAYS
from medinfo.db import DBUtil
from medinfo.db.Model import columnFromModelList, SQLQuery, modelListFromTable
from medinfo.db.ResultsFormatter import TabDictReader, TextResultsFormatter
-from psycopg2.extensions import cursor
-from Util import log
+
+# For NonStanford data, we use sqlite database to allow creating database onsite
+import LocalEnv
+if LocalEnv.DATABASE_CONNECTOR_NAME == 'psycopg2':
+ from psycopg2.extensions import cursor
+elif LocalEnv.DATABASE_CONNECTOR_NAME == 'sqlite3':
+ from sqlite3 import Cursor as cursor
+
+# from Util import log
+from medinfo.common.Util import log
+from . import Util
+
class FeatureMatrixFactory:
FEATURE_MATRIX_COLUMN_NAMES = [
"patient_id"
]
- def __init__(self, cacheDBResults = True):
+ def __init__(self, cacheDBResults = True, PID=None):
self.dbCache = None
self.patientListInput = None
self.patientIdColumn = None
@@ -41,12 +53,26 @@ def __init__(self, cacheDBResults = True):
self._patientItemTimeColumn = None
self.timestampColumn = None
+ self._isLabPanel = True if LAB_TYPE == 'panel' else False # 'component'
+ self._labTypeCol = lambda isLabPanel: 'proc_code' if isLabPanel else 'base_name'
+
self.patientsProcessed = None
- self._patientListTempFileName = "fmf.patient_list.tsv"
- self._patientEpisodeTempFileName = "fmf.patient_episodes.tsv"
- self._patientItemTempFileNameFormat = "fmf.patient_%s.tsv"
- self._patientResultTempFileNameFormat = "fmf.patient_%s_%s_%s.tsv"
+ if not PID: # Allow checking existing tmp files
+ self.PID = str(os.getpid())
+ else:
+ self.PID = str(PID)
+
+ # When debugging, do not create so many Tempfiles in the working folder.
+ self._folderTempFiles = "fmfTempFolder"
+ if not os.path.exists(self._folderTempFiles):
+ os.mkdir(self._folderTempFiles)
+
+ self._patientListTempFileName = self._folderTempFiles + '/' + "fmf.patient_list_" + self.PID + ".tsv"
+ self._patientEpisodeTempFileName = self._folderTempFiles + '/' + "fmf.patient_episodes_" + self.PID + ".tsv"
+ self._patientItemTempFileNameFormat = self._folderTempFiles + '/' + "fmf.patient_%s_" + self.PID + ".tsv"
+ self._patientTimeCycleTempFileNameFormat = self._folderTempFiles + '/' + "fmf.patient_%s_%s_" + self.PID + ".tsv"
+ self._patientResultTempFileNameFormat = self._folderTempFiles + '/' + "fmf.patient_%s_%s_%s_" + self.PID + ".tsv"
self._matrixFileName = None
# Look at lab results from the previous days
@@ -62,8 +88,7 @@ def __init__(self, cacheDBResults = True):
if cacheDBResults:
self.dbCache = dict()
- def setPatientListInput(self, patientListInput, \
- patientIdColumn = "patient_id"):
+ def setPatientListInput(self, patientListInput, patientIdColumn = "patient_id"):
"""
Define the input patient list for the feature matrix.
patientListInput: TSV file descriptor or DB cursor
@@ -71,7 +96,7 @@ def setPatientListInput(self, patientListInput, \
"""
# Verify patientListInput is TSV file or DB cursor.
if not isinstance(patientListInput, cursor) and \
- not isinstance(patientListInput, file):
+ not isinstance(patientListInput, IOBase):
raise TypeError("patientListInput must be DB cursor or TSV file.")
self.patientListInput = patientListInput
@@ -87,7 +112,7 @@ def processPatientListInput(self):
if isinstance(self.patientListInput, cursor):
return self._processPatientListDbCursor()
- elif isinstance(self.patientListInput, file):
+ elif isinstance(self.patientListInput, IOBase):
return self._processPatientListTsvFile()
def _processPatientListDbCursor(self):
@@ -98,7 +123,7 @@ def _processPatientListDbCursor(self):
self._pipeDbCursorToTsvFile(self.patientListInput, patientListTempFile)
patientListTempFile.close()
- def _pipeDbCursorToTsvFile(self, dbCursor, tsvFile):
+ def _pipeDbCursorToTsvFile(self, dbCursor, tsvFile, include_columns=True):
"""
Pipe any arbitrary DB cursor to a TSV file.
"""
@@ -106,19 +131,22 @@ def _pipeDbCursorToTsvFile(self, dbCursor, tsvFile):
columns = dbCursor.description
numColumns = len(columns)
- # Write TSV header.
- for i in range(numColumns - 1):
- # 0th index is column name.
- tsvFile.write("%s\t" % columns[i][0])
- tsvFile.write("%s\n" % columns[numColumns - 1][0])
+ if include_columns:
+ # Write TSV header.
+ for i in range(numColumns - 1):
+ # 0th index is column name.
+ tsvFile.write("%s\t" % columns[i][0])
+ tsvFile.write("%s\n" % columns[numColumns - 1][0])
# By default, cursor iterates through both header and data rows.
+ self._numRows = 0
row = dbCursor.fetchone()
while row is not None:
for i in range(numColumns - 1):
tsvFile.write("%s\t" % row[i])
tsvFile.write("%s\n" % row[numColumns - 1])
row = dbCursor.fetchone()
+ self._numRows += 1
def _processPatientListTsvFile(self):
"""
@@ -152,7 +180,7 @@ def setPatientEpisodeInput(self, patientEpisodeInput, \
"""
# Verify patientEpisodeInput is TSV file or DB cursor.
if not isinstance(patientEpisodeInput, cursor) and \
- not isinstance(patientEpisodeInput, file):
+ not isinstance(patientEpisodeInput, IOBase):
raise TypeError("patientEpisodeInput must be DB cursor or TSV file.")
self.patientEpisodeInput = patientEpisodeInput
@@ -168,11 +196,9 @@ def processPatientEpisodeInput(self):
if isinstance(self.patientEpisodeInput, cursor):
return self._processPatientEpisodeDbCursor()
- elif isinstance(self.patientEpisodeInput, file):
+ elif isinstance(self.patientEpisodeInput, IOBase):
return self._processPatientEpisodeTsvFile()
-
-
def _processPatientEpisodeDbCursor(self):
"""
Convert self.patientEpisodeInput from DB cursor to TSV file.
@@ -183,6 +209,13 @@ def _processPatientEpisodeDbCursor(self):
patientEpisodeTempFile.close()
self.patientsProcessed = True
+ if LocalEnv.DATABASE_CONNECTOR_NAME == 'psycopg2':
+ return self.patientEpisodeInput.rowcount
+ elif LocalEnv.DATABASE_CONNECTOR_NAME == 'sqlite3':
+ # In sqlite3, rowcount is somehow "always" -1; See for details:
+ # https://docs.python.org/3.0/library/sqlite3.html#sqlite3.Cursor.rowcount
+ return self._numRows #self.patientEpisodeInput.rowcount
+
def _processPatientEpisodeTsvFile(self):
pass
@@ -192,6 +225,47 @@ def getPatientEpisodeIterator(self):
"""
return TabDictReader(open(self._patientEpisodeTempFileName, "r"))
+ '''
+ New version, adapt to the new split_by_patient pipeline
+ '''
+ def obtain_baseline_results(self, raw_matrix_path, random_state, isHoldOut=False):
+ from medinfo.dataconversion.FeatureMatrixIO import FeatureMatrixIO
+ fm_io = FeatureMatrixIO()
+
+ processed_matrix_path = raw_matrix_path.replace('-raw','-processed')
+
+ '''
+ get prevalence from the train set
+ '''
+ processed_matrix_train = fm_io.read_file_to_data_frame(processed_matrix_path.replace('-matrix', '-train-matrix'))
+ if self._isLabPanel:
+ y_label = 'all_components_normal'
+ else:
+ y_label = 'component_normal'
+
+ prevalence = float(processed_matrix_train[y_label].values.sum())/float(processed_matrix_train.shape[0])
+
+ processed_matrix_test = fm_io.read_file_to_data_frame(processed_matrix_path.replace('-matrix', '-test-matrix'))
+ pats_test = set(processed_matrix_test['pat_id'].values.tolist())
+ raw_matrix = fm_io.read_file_to_data_frame(raw_matrix_path)
+ raw_matrix_test = raw_matrix[raw_matrix['pat_id'].isin(pats_test)]
+ raw_matrix_test = raw_matrix_test.sort_values(['pat_id', 'order_time']).reset_index()
+ raw_matrix_test['predict_proba'] = raw_matrix_test[y_label].apply(lambda x: prevalence)
+
+ for i in range(1, raw_matrix_test.shape[0]):
+ if raw_matrix_test.ix[i - 1, 'pat_id'] == raw_matrix_test.ix[i, 'pat_id']:
+ raw_matrix_test.ix[i, 'predict_proba'] = raw_matrix_test.ix[i - 1, y_label]
+
+ baseline_comparisons = raw_matrix_test[['predict_proba', y_label]]
+ baseline_comparisons = baseline_comparisons.rename(columns={y_label:'actual',
+ 'predict_proba':'predict'})
+
+ baseline_folder = '/'.join(raw_matrix_path.split('/')[:-1])
+ baseline_filepath = os.path.join(baseline_folder, 'baseline_comparisons.csv')
+ # os.rename(baseline_filepath, baseline_filepath.replace('baseline_comparisons', 'baseline_comparisons_prev')) # existing ones
+ baseline_comparisons.to_csv(baseline_filepath)
+
+
def _getPatientEpisodeByIndexTimeById(self):
"""
Return dictionary containing patientId : episodeTime : {} map.
@@ -210,26 +284,105 @@ def _getPatientEpisodeByIndexTimeById(self):
return patientEpisodeByIndexTimeById
- def addClinicalItemFeatures(self, clinicalItemNames, dayBins=None):
+ def addClinicalItemFeatures(self, clinicalItemNames, dayBins=None, column=None, operator=None, label=None, features=None, isLabPanel=True):
+ """
+ Query patient_item for the clinical item orders and results for each
+ patient, and aggregate by episode timestamp.
+ column: determines column in clinical_item to match clinicalItemNames.
+ operator: determines how to match clinicalItemNames against column.
+ label: sets the column prefix in the final feature matrix.
+ features: determines whether to include "pre", "post" or "all".
+ """
+ # Verify patient list and/or patient episode has been processed.
+ if not self.patientsProcessed:
+ raise ValueError("Must process patients before clinical item.")
+
+ if isLabPanel:
+ clinicalItemEvents = self._queryClinicalItemsByName(clinicalItemNames, column=column, operator=operator)
+ else:
+ clinicalItemEvents = self._queryComponentItemsByName(clinicalItemNames)
+ itemTimesByPatientId = self._getItemTimesByPatientId(clinicalItemEvents)
+
+ # Read clinical item features to temp file.
+ patientEpisodes = self.getPatientEpisodeIterator()
+ self._processClinicalItemEvents(patientEpisodes, itemTimesByPatientId, \
+ clinicalItemNames, dayBins, label=label, features=features)
+
+ # Updated this core function for Component and Non-Stanford data. Responsible for creating features of:
+ # lab_panel, component (for counting "order times"), birth/death, sex, race, comorbidity
+ def addClinicalItemFeatures_NonStanford(self, clinicalItemNames, dayBins=None, label=None, features=None
+ , clinicalItemType=None, clinicalItemTime=None, tableName=None):
"""
Query patient_item for the clinical item orders and results for each
patient, and aggregate by episode timestamp.
+ column: determines column in clinical_item to match clinicalItemNames.
+ operator: determines how to match clinicalItemNames against column.
+ label: sets the column prefix in the final feature matrix.
+ features: determines whether to include "pre", "post" or "all".
+ """
+ # Verify patient list and/or patient episode has been processed.
+ if not self.patientsProcessed:
+ raise ValueError("Must process patients before clinical item.")
+
+ # For adapting to NonStanford data, instead of creating intermediate tables clinical_items
+ # and patient_items, we directly query "raw" tables from the NonStanford.db
+ clinicalItemEvents = self._queryNonStanfordItemsByName(clinicalItemNames=clinicalItemNames, clinicalItemType=clinicalItemType,
+ tableName=tableName, clinicalItemTime=clinicalItemTime)
+ itemTimesByPatientId = self._getItemTimesByPatientId(clinicalItemEvents)
+ # Read clinical item features to temp file.
+ patientEpisodes = self.getPatientEpisodeIterator()
+ self._processClinicalItemEvents(patientEpisodes, itemTimesByPatientId, \
+ clinicalItemNames, dayBins, label=label, features=features)
+ def addClinicalItemFeaturesByCategory(self, categoryIds, label=None, dayBins=None, features=None):
+ """
+ Query patient_item for the clinical item orders and results for each
+ patient (based on clinical item category ID instead of item name), and
+ aggregate by episode timestamp.
+ features: determines whether to include "pre", "post" or "all".
"""
# Verify patient list and/or patient episode has been processed.
if not self.patientsProcessed:
raise ValueError("Must process patients before clinical item.")
- clinicalItemEvents = self._queryClinicalItemsByName(clinicalItemNames)
+ if label is None:
+ label = "-".join(categoryIds)
+
+ clinicalItemEvents = self._queryClinicalItemsByCategory(categoryIds)
itemTimesByPatientId = self._getItemTimesByPatientId(clinicalItemEvents)
# Read clinical item features to temp file.
patientEpisodes = self.getPatientEpisodeIterator()
self._processClinicalItemEvents(patientEpisodes, itemTimesByPatientId, \
- clinicalItemNames, dayBins)
+ categoryIds, dayBins, label=label, features=features)
- def _queryClinicalItemsByName(self, clinicalItemNames):
+ # This function is only used for handling the feature of AdmitDxDate
+ def addClinicalItemFeaturesByCategory_NonStanford(self, categoryIds, label=None, dayBins=None, features=None,
+ tableName=None):
+ """
+ Query patient_item for the clinical item orders and results for each
+ patient (based on clinical item category ID instead of item name), and
+ aggregate by episode timestamp.
+ features: determines whether to include "pre", "post" or "all".
+ """
+ # Verify patient list and/or patient episode has been processed.
+ if not self.patientsProcessed:
+ raise ValueError("Must process patients before clinical item.")
+
+ if label is None:
+ label = "-".join(categoryIds)
+
+ # For NonStanford data, directly query label='AdmitDxDate' from the raw table
+ clinicalItemEvents = self._queryNonStanfordItemsByCategory(label,tableName) #
+ itemTimesByPatientId = self._getItemTimesByPatientId(clinicalItemEvents)
+
+ # Read clinical item features to temp file.
+ patientEpisodes = self.getPatientEpisodeIterator()
+ self._processClinicalItemEvents(patientEpisodes, itemTimesByPatientId, \
+ categoryIds, dayBins, label=label, features=features)
+
+ def _queryClinicalItemsByName(self, clinicalItemNames, column=None, operator=None):
"""
Query clinicalItemInput for all item times for all patients.
@@ -248,8 +401,10 @@ def _queryClinicalItemsByName(self, clinicalItemNames):
if self.dbCache is not None and cacheKey in self.dbCache:
clinicalItemIds = self.dbCache[cacheKey]
else:
- column = "name"
- operator = "LIKE"
+ if column is None:
+ column = "name"
+ if operator is None:
+ operator = "LIKE"
query = SQLQuery()
query.addSelect("clinical_item_id")
@@ -257,7 +412,15 @@ def _queryClinicalItemsByName(self, clinicalItemNames):
nameClauses = list()
for itemName in clinicalItemNames:
- nameClauses.append("%s %s %%s" % (column, operator))
+ if LocalEnv.DATABASE_CONNECTOR_NAME == 'psycopg2':
+ nameClauses.append("%s %s %%s" % (column, operator))
+
+ elif LocalEnv.DATABASE_CONNECTOR_NAME == 'sqlite3':
+ # For postgres, placeholder is %s
+ # For sqlite, place holder is ?
+ # TODO: %s or %%s for postgres
+ # nameClauses.append("%s %s %%s" % (column, operator))
+ nameClauses.append("%s %s " % (column, operator) + DBUtil.SQL_PLACEHOLDER) #
query.params.append(itemName)
query.addWhere(str.join(" or ", nameClauses))
@@ -269,6 +432,154 @@ def _queryClinicalItemsByName(self, clinicalItemNames):
return self.queryClinicalItems(clinicalItemIds)
+ def _queryMichiganItemsByName(self, clinicalItemNames, clinicalItemType, tableName, clinicalItemTime):
+ # """
+ # Query ComponentItemInput for all item times for all patients.
+ #
+ # Done by directly querying the stride_order_XXX tables,
+ # without using pre-assembled tables like clinical_item.
+ # Might do this in the future to boost efficiency.
+ # """
+ patientIds = set()
+ patientEpisodes = self.getPatientEpisodeIterator()
+ for episode in patientEpisodes:
+ patientIds.add(episode[self.patientEpisodeIdColumn])
+
+ # clinicalItemNames can be specific examples like CBCD, anything, male,
+ # clinicalItemCategory can be column names like proc_code, birth, sex,
+ # clinicalItemTime can be column names like order_time, birth, birth ...
+
+ query_str = "SELECT CAST(pat_id AS BIGINT) AS pat_id "
+ if clinicalItemTime:
+ query_str += ", %s " % clinicalItemTime
+
+ query_str += "FROM %s " % tableName
+
+ if clinicalItemType:
+ query_str += "WHERE %s IN (" % (clinicalItemType)
+ for clinicalItemName in clinicalItemNames:
+ query_str += '"%s",' % clinicalItemName
+ query_str = query_str[:-1] + ") AND "
+ else:
+ query_str += "WHERE "
+
+ query_str += "pat_id IN "
+ pat_list_str = "("
+ for pat_id in patientIds:
+ pat_list_str += str(pat_id) + ","
+ pat_list_str = pat_list_str[:-1] + ") "
+ query_str += pat_list_str
+ query_str += "GROUP BY pat_id "
+ if clinicalItemTime:
+ query_str += ", %s " % clinicalItemTime
+
+ query_str += "ORDER BY pat_id "
+ if clinicalItemTime:
+ query_str += ", %s " % clinicalItemTime
+
+ _cursor = DBUtil.connection().cursor()
+ _cursor.execute(query_str)
+ results = _cursor.fetchall()
+
+ componentItemEvents = [list(row) for row in results]
+ if not clinicalItemTime:
+ componentItemEvents = [x + [datetime.datetime(1900, 1, 1)] for x in componentItemEvents]
+
+ return componentItemEvents
+
+
+ def _queryComponentItemsByName(self, clinicalItemNames): # sx
+ # """
+ # Query ComponentItemInput for all item times for all patients.
+ #
+ # Done by directly querying the stride_order_XXX tables,
+ # without using pre-assembled tables like clinical_item.
+ # Might do this in the future to boost efficiency.
+ # """
+
+ query = SQLQuery()
+ query.addSelect('CAST(pat_id AS BIGINT) AS pat_id')
+ query.addSelect('order_time')
+ query.addFrom('stride_order_proc AS sop')
+ query.addFrom('stride_order_results AS sor')
+ query.addWhere('sop.order_proc_id = sor.order_proc_id')
+ query.addWhereIn("base_name", clinicalItemNames)
+ query.addGroupBy('pat_id')
+ query.addGroupBy('order_time')
+ query.addOrderBy('pat_id')
+ query.addOrderBy('order_time')
+
+ results = DBUtil.execute(query)
+ componentItemEvents = [row for row in results]
+ return componentItemEvents
+
+ def _queryMichiganItemsByCategory(self, label, tableName): #
+ """
+ Query for all patient items that match with the given clinical item
+ category ID.
+ """
+ # Identify which columns to pull from patient_item table.
+
+ # return sth like
+ # clinicalItemEvents=[[-3384542270496665494, u'2009-07-07 13:00:00'], [1262980084096039344, u'2003-01-22 12:29:00'], ...]
+ self._patientItemIdColumn = "pat_id"
+ self._patientItemTimeColumn = label
+
+ patientIds = set()
+ patientEpisodes = self.getPatientEpisodeIterator()
+ for episode in patientEpisodes:
+ patientIds.add(episode[self.patientEpisodeIdColumn])
+
+ query_str = "SELECT %s, %s " % (self._patientItemIdColumn, self._patientItemTimeColumn)
+
+ query_str += " FROM %s " % tableName
+
+ query_str += "WHERE pat_id IN "
+ pat_list_str = "("
+ for pat_id in patientIds:
+ pat_list_str += str(pat_id) + ","
+ pat_list_str = pat_list_str[:-1] + ") "
+ query_str += pat_list_str
+
+ query_str += "ORDER BY pat_id, %s " % label
+
+ results = DBUtil.connection().cursor().execute(query_str).fetchall()
+
+ clinicalItemEvents = [list(row) for row in results]
+ return clinicalItemEvents
+
+
+ def _queryClinicalItemsByCategory(self, categoryIds):
+ """
+ Query for all patient items that match with the given clinical item
+ category ID.
+ """
+ # Identify which columns to pull from patient_item table.
+ self._patientItemIdColumn = "patient_id"
+ self._patientItemTimeColumn = "item_date"
+
+ clinicalItemIds = None
+
+ # If possible, return cached results.
+ cacheKey = str(categoryIds)
+ if self.dbCache is not None and cacheKey in self.dbCache:
+ clinicalItemIds = self.dbCache[cacheKey]
+ else:
+ column = "clinical_item_category_id"
+
+ query = SQLQuery()
+ query.addSelect("clinical_item_id")
+ query.addFrom("clinical_item")
+ query.addWhereIn(column, categoryIds)
+
+ results = DBUtil.execute(query)
+ clinicalItemIds = [row[0] for row in results]
+
+ if len(clinicalItemIds) == 0:
+ return list()
+
+ return self.queryClinicalItems(clinicalItemIds)
+
def queryClinicalItems(self, clinicalItemIds):
"""
Query for all patient items that match with the given clinical item IDs.
@@ -298,22 +609,29 @@ def queryClinicalItems(self, clinicalItemIds):
clinicalItemEvents = [row for row in results]
return clinicalItemEvents
- def _processClinicalItemEvents(self, patientEpisodes, itemTimesByPatientId, clinicalItemNames, dayBins):
+ def _processClinicalItemEvents(self, patientEpisodes, itemTimesByPatientId, clinicalItemNames, dayBins, label=None, features=None):
"""
Convert temp file containing all (patient_item, item_date) pairs
for a given set of clinical_item_ids into temp file containing
patient_id, order_time, clinical_item.pre, clinical_item.post, etc.
+ features: determines whether to include "pre", "post" or "all".
"""
- if len(clinicalItemNames) > 1:
- itemLabel = "-".join([itemName for itemName in clinicalItemNames])
+ if label:
+ itemLabel = label
else:
- itemLabel = clinicalItemNames[0]
+ if len(clinicalItemNames) > 1:
+ itemLabel = "-".join([itemName for itemName in clinicalItemNames])
+ else:
+ itemLabel = clinicalItemNames[0]
tempFileName = self._patientItemTempFileNameFormat % itemLabel
tempFile = open(tempFileName, "w")
+ if features is None:
+ features = "all"
+
# Determine time buckets for clinical item times.
if dayBins is None:
- dayBins = DELTA_NAME_BY_DAYS.keys()
+ dayBins = list(DELTA_NAME_BY_DAYS.keys())
dayBins.sort()
# Find items most proximate before and after the index item per patient
@@ -325,14 +643,21 @@ def _processClinicalItemEvents(self, patientEpisodes, itemTimesByPatientId, clin
postLabel = "%s.post" % itemLabel
# Write header fields to tempFile.
- tempFile.write("patient_id\tepisode_time\t")
- tempFile.write("%s\t" % preTimeDaysLabel)
- tempFile.write("%s\t" % preLabel)
- tempFile.write("\t".join("%s.%dd" % (preLabel, dayBin) for dayBin in dayBins))
- tempFile.write("\t")
- tempFile.write("%s\t" % postTimeDaysLabel)
- tempFile.write("%s\t" % postLabel)
- tempFile.write("\t".join("%s.%dd" % (postLabel, dayBin) for dayBin in dayBins))
+ tempFile.write("patient_id\tepisode_time")
+ # Include counts for events before episode_time.
+ if features != "post":
+ tempFile.write("\t%s" % preTimeDaysLabel)
+ tempFile.write("\t%s" % preLabel)
+ if len(dayBins) > 0:
+ tempFile.write("\t")
+ tempFile.write("\t".join("%s.%dd" % (preLabel, dayBin) for dayBin in dayBins))
+ # Include counts for events after episode_time.
+ if features != "pre":
+ tempFile.write("\t%s" % postTimeDaysLabel)
+ tempFile.write("\t%s" % postLabel)
+ if len(dayBins) > 0:
+ tempFile.write("\t")
+ tempFile.write("\t".join("%s.%dd" % (postLabel, dayBin) for dayBin in dayBins))
tempFile.write("\n")
# Write patient episode data to tempFile.
@@ -359,6 +684,11 @@ def _processClinicalItemEvents(self, patientEpisodes, itemTimesByPatientId, clin
itemTimes = itemTimesByPatientId[patientId]
if itemTimes is not None:
for itemTime in itemTimes:
+ # Need this extra check because if a given event
+ # has not occurred yet, but will occur, itemTime will
+ # be none while itemTimes is not None.
+ if (itemTime is None) or (not isinstance(itemTime, datetime.datetime)):
+ continue
timeDiffSeconds = (itemTime - episodeTime).total_seconds()
timeDiffDays = timeDiffSeconds / SECONDS_PER_DAY
# If event occurred before index time...
@@ -385,39 +715,53 @@ def _processClinicalItemEvents(self, patientEpisodes, itemTimesByPatientId, clin
episodeData["%s.%dd" % (postLabel, dayBin)] += 1
# Write data to tempFile.
- tempFile.write("%s\t%s\t" % (patientId, episodeTime))
- tempFile.write("%s\t" % episodeData[preTimeDaysLabel])
- tempFile.write("%s\t" % episodeData[preLabel])
- tempFile.write("\t".join([str(episodeData["%s.%dd" % (preLabel, dayBin)]) for dayBin in dayBins]))
- tempFile.write("\t")
- tempFile.write("%s\t" % episodeData[postTimeDaysLabel])
- tempFile.write("%s\t" % episodeData[postLabel])
- tempFile.write("\t".join([str(episodeData["%s.%dd" % (postLabel, dayBin)]) for dayBin in dayBins]))
+ tempFile.write("%s\t%s" % (patientId, episodeTime))
+ # Include counts for events before episode_time.
+ if features != "post":
+ tempFile.write("\t%s" % episodeData[preTimeDaysLabel])
+ tempFile.write("\t%s" % episodeData[preLabel])
+ if len(dayBins) > 0:
+ tempFile.write("\t")
+ tempFile.write("\t".join([str(episodeData["%s.%dd" % (preLabel, dayBin)]) for dayBin in dayBins]))
+ # Include counts for events after episode_time.
+ if features != "pre":
+ tempFile.write("\t%s" % episodeData[postTimeDaysLabel])
+ tempFile.write("\t%s" % episodeData[postLabel])
+ if len(dayBins) > 0:
+ tempFile.write("\t")
+ tempFile.write("\t".join([str(episodeData["%s.%dd" % (postLabel, dayBin)]) for dayBin in dayBins]))
tempFile.write("\n")
tempFile.close()
# Add tempFileName to list of feature temp files.
self._featureTempFileNames.append(tempFileName)
- def addLabResultFeatures(self, labBaseNames, preTimeDelta = None, postTimeDelta = None):
+ def addLabResultFeatures(self, labNames, labIsPanel = True, preTimeDelta = None, postTimeDelta = None):
"""
Query stride_order_proc and stride_order_results for the lab orders and
results for each patient, and aggregate by episode timestamp.
+ Set labIsPanel = False to signify that the labNames are components,
+ rather than panels.
"""
# Verify patient list and/or patient episode has been processed.
if not self.patientsProcessed:
raise ValueError("Must process patients before lab result.")
# Open temp file.
- if len(labBaseNames) > 1:
- resultLabel = "-".join([baseName for baseName in labBaseNames])
+ # For multi-component labels, the first element becomes None
+ labNames = [x for x in labNames if x is not None]
+
+ if len(labNames) > 1:
+ resultLabel = "-".join([labName for labName in labNames])[:64]
else:
- resultLabel = labBaseNames[0]
- tempFileName = self._patientResultTempFileNameFormat % (resultLabel, str(preTimeDelta), str(postTimeDelta))
+ resultLabel = labNames[0]
+
+ # Hack to account for fact that Windows filenames can't include ':'.
+ tempFileName = self._patientResultTempFileNameFormat % (resultLabel, str(preTimeDelta.days), str(postTimeDelta.days))
tempFile = open(tempFileName, "w")
# Query lab results for the individuals of interest.
- labResults = self._queryLabResultsByName(labBaseNames)
+ labResults = self._queryLabResultsByName(labNames, labIsPanel)
resultsByNameByPatientId = self._parseResultsData(labResults, "pat_id",
"base_name", "ord_num_value", "result_time")
@@ -433,7 +777,7 @@ def addLabResultFeatures(self, labBaseNames, preTimeDelta = None, postTimeDelta
patientEpisodeByIndexTimeById = self._getPatientEpisodeByIndexTimeById()
self._processResultEvents(patientEpisodeByIndexTimeById,
resultsByNameByPatientId,
- labBaseNames,
+ labNames,
"ord_num_value",
"result_time",
preTimeDelta,
@@ -441,7 +785,7 @@ def addLabResultFeatures(self, labBaseNames, preTimeDelta = None, postTimeDelta
# Write column headers to temp file.
tempFile.write("%s\t%s\t" % (self.patientEpisodeIdColumn, self.patientEpisodeTimeColumn))
- columnNames = self.colsFromBaseNames(labBaseNames, preTimeDays, postTimeDays)
+ columnNames = self.colsFromBaseNames(labNames, preTimeDays, postTimeDays)
tempFile.write("\t".join(columnNames))
tempFile.write("\n")
@@ -454,7 +798,7 @@ def addLabResultFeatures(self, labBaseNames, preTimeDelta = None, postTimeDelta
tempFile.write("%s\t%s\t" % (patientId, indexTime))
# Need to generate columnNames again because colsFromBaseNames
# returns generator, which can only be read once.
- columnNames = self.colsFromBaseNames(labBaseNames, preTimeDays, postTimeDays)
+ columnNames = self.colsFromBaseNames(labNames, preTimeDays, postTimeDays)
tempFile.write("\t".join(str(episodeLabData[columnName]) for columnName in columnNames))
tempFile.write("\n")
@@ -477,14 +821,15 @@ def addFlowsheetFeatures(self, flowsheetBaseNames, preTimeDelta = None, postTime
resultLabel = "-".join([baseName for baseName in flowsheetBaseNames])
else:
resultLabel = flowsheetBaseNames[0]
- tempFileName = self._patientItemTempFileNameFormat % (resultLabel)
+ # Hack to account for fact that Windows filenames can't include ':'.
+ tempFileName = self._patientResultTempFileNameFormat % (resultLabel, str(preTimeDelta.days), str(postTimeDelta.days))
tempFile = open(tempFileName, "w")
# Query flowsheet results.
flowsheetResults = self._queryFlowsheetResultsByName(flowsheetBaseNames)
resultsByNameByPatientId = self._parseResultsData(flowsheetResults, \
"pat_id", "flowsheet_name", "flowsheet_value", \
- "shifted_record_dt_tm")
+ "shifted_dt_tm")
# Define how far in advance of each episode to look at lab results.
preTimeDays = None
@@ -500,7 +845,7 @@ def addFlowsheetFeatures(self, flowsheetBaseNames, preTimeDelta = None, postTime
resultsByNameByPatientId,
flowsheetBaseNames,
"flowsheet_value",
- "shifted_record_dt_tm",
+ "shifted_dt_tm",
preTimeDelta,
postTimeDelta)
@@ -544,19 +889,55 @@ def _queryFlowsheetResultsByName(self, flowsheetBaseNames):
patientIds.add(episode[self.patientEpisodeIdColumn])
# Build SQL query.
- colNames = ["pat_anon_id AS pat_id", "flo_meas_id", "flowsheet_name", \
- "flowsheet_value", "shifted_record_dt_tm"]
- query = SQLQuery()
- for col in colNames:
- query.addSelect(col)
- query.addFrom("stride_flowsheet")
- query.addWhereIn("flowsheet_name", flowsheetBaseNames)
- query.addWhereIn("pat_anon_id", patientIds)
- query.addOrderBy("pat_anon_id")
- query.addOrderBy("shifted_record_dt_tm")
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ pat_col = "pat_anon_id"
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UCSF':
+ pat_col = "pat_id"
+
+ colNames = ["%s AS pat_id"%pat_col, "flo_meas_id", "flowsheet_name", \
+ "flowsheet_value", "shifted_dt_tm"]
+
+ query_str = "SELECT "
+ for colName in colNames:
+ query_str += colName + ','
+ query_str = query_str[:-1]
+
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ query_str += " FROM stride_flowsheet "
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UCSF':
+ query_str += " FROM vitals "
+ # Note that UMich does not have vitals info
+
+ query_str += " WHERE flowsheet_name IN ("
+ for flowsheetBaseName in flowsheetBaseNames:
+ query_str += "'" + flowsheetBaseName + "',"
+ query_str = query_str[:-1] + ')'
+
+ query_str += " AND %s IN (" % pat_col
+
+ for patientId in patientIds:
+ query_str += patientId + ','
+ query_str = query_str[:-1] + ')'
+
+ query_str += " ORDER BY %s, shifted_dt_tm" % pat_col
+
+ log.debug(query_str)
+
+ cur = DBUtil.connection().cursor()
+ cur.execute(query_str)
+
+ results = []
+ colNames = DBUtil.columnNamesFromCursor(cur)
+ results.append(colNames)
+
+ dataTable = list(cur.fetchall())
+ for i, row in enumerate(dataTable):
+ dataTable[i] = list(row);
+ results.extend(dataTable);
# Execute query.
- return modelListFromTable(DBUtil.execute(query, includeColumnNames=True))
+ # return modelListFromTable(DBUtil.execute(query, includeColumnNames=True))
+ return modelListFromTable(results)
def colsFromBaseNames(self, baseNames, preTimeDays, postTimeDays):
"""Enumerate derived column/feature names given a set of (lab) result base names"""
@@ -585,7 +966,7 @@ def _processResultEvents(self, patientEpisodeByIndexTimeById, resultsByNameByPat
"""
# Use results generator as outer loop as will not be able to random
# access the contents.
- for patientId, resultsByName in resultsByNameByPatientId.iteritems():
+ for patientId, resultsByName in resultsByNameByPatientId.items():
# Skip results if not in our list of patients of interest
if patientId in patientEpisodeByIndexTimeById:
patientEpisodeByIndexTime = patientEpisodeByIndexTimeById[patientId]
@@ -597,7 +978,7 @@ def _processResultEvents(self, patientEpisodeByIndexTimeById, resultsByNameByPat
# Separate loop to verify all patient records addressed, even if no
# results available (like an outer join).
resultsByName = None
- for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.iteritems():
+ for patientId, patientEpisodeByIndexTime in patientEpisodeByIndexTimeById.items():
self._addResultFeatures_singlePatient(patientEpisodeByIndexTime, \
resultsByName, resultNames, valueCol, datetimeCol, preTimeDelta, \
postTimeDelta)
@@ -622,7 +1003,7 @@ def _addResultFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByN
postTimeDays = postTimeDelta.days
# Init summary values to null for all results
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
for baseName in baseNames:
if resultsByName is not None or ("%s.%s_%s.count" % (baseName, preTimeDays, postTimeDays)) not in patient:
# Default to null for all values
@@ -644,7 +1025,7 @@ def _addResultFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByN
# Have results available for this patient?
if resultsByName is not None:
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
# Time range limits on labs to consider
preTimeLimit = None;
postTimeLimit = None;
@@ -666,17 +1047,18 @@ def _addResultFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByN
filteredResults = list()
for result in resultsByName[baseName]:
resultTime = result[datetimeCol]
- if (preTimeLimit is None or preTimeLimit <= resultTime) \
- and (postTimeLimit is None or resultTime < postTimeLimit):
- # Occurs within timeframe of interest, so record valueCol
- filteredResults.append(result)
-
- if firstItem is None or resultTime < firstItem[datetimeCol]:
- firstItem = result
- if lastItem is None or lastItem[datetimeCol] < resultTime:
- lastItem = result
- if proximateItem is None or (abs(resultTime - indexTime) < abs(proximateItem[datetimeCol] - indexTime)):
- proximateItem = result
+ if resultTime is not None:
+ if (preTimeLimit is None or preTimeLimit <= resultTime) \
+ and (postTimeLimit is None or resultTime < postTimeLimit):
+ # Occurs within timeframe of interest, so record valueCol
+ filteredResults.append(result)
+
+ if firstItem is None or resultTime < firstItem[datetimeCol]:
+ firstItem = result
+ if lastItem is None or lastItem[datetimeCol] < resultTime:
+ lastItem = result
+ if proximateItem is None or (abs(resultTime - indexTime) < abs(proximateItem[datetimeCol] - indexTime)):
+ proximateItem = result
if len(filteredResults) > 0:
# Count up number of values specifically labeled "in range"
@@ -702,7 +1084,8 @@ def _addResultFeatures_singlePatient(self, patientEpisodeByIndexTime, resultsByN
return
- def _queryLabResultsByName(self, labBaseNames):
+ # TODO(sbala): Fix isLabPanel arg declaration to be None by default.
+ def _queryLabResultsByName(self, labNames, isLabPanel = True):
"""
Query for all lab results that match with the given result base names.
"""
@@ -714,28 +1097,77 @@ def _queryLabResultsByName(self, labBaseNames):
# Filtering by patient ID drags down substantially until preloaded
# table by doing a count on the SQR table?
columnNames = [
- "CAST(pat_id AS bigint)", "base_name", "ord_num_value",
- "result_flag", "result_in_range_yn", "sor.result_time"
+ "CAST(pat_id AS bigint) as pat_id", "base_name", "ord_num_value",
+ "result_flag", "result_in_range_yn"
]
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ columnNames += ["sor.result_time"]
+ else:
+ columnNames += ["result_time"]
# Identify which patients to query.
patientIds = set()
patientEpisodes = self.getPatientEpisodeIterator()
for episode in patientEpisodes:
patientIds.add(episode[self.patientEpisodeIdColumn])
-
# Construct query to pull from stride_order_results, stride_order_proc
- query = SQLQuery()
- for column in columnNames:
- query.addSelect(column)
- query.addFrom("stride_order_results AS sor, stride_order_proc AS sop")
- query.addWhere("sor.order_proc_id = sop.order_proc_id")
- query.addWhereIn("base_name", labBaseNames)
- query.addWhereIn("pat_id", patientIds)
- query.addOrderBy("pat_id")
- query.addOrderBy("sor.result_time")
- return modelListFromTable(DBUtil.execute(query, includeColumnNames=True))
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ query = SQLQuery()
+ for column in columnNames:
+ query.addSelect(column)
+ query.addFrom("stride_order_results AS sor, stride_order_proc AS sop")
+ query.addWhere("sor.order_proc_id = sop.order_proc_id")
+
+ query.addWhereIn(self._labTypeCol(isLabPanel), labNames)
+
+ query.addWhereIn("pat_id", patientIds)
+ query.addOrderBy("pat_id")
+ query.addOrderBy("sor.result_time")
+
+ log.debug(query)
+ return modelListFromTable(DBUtil.execute(query, includeColumnNames=True))
+
+
+ else:
+
+ query_str = "SELECT "
+ for column in columnNames:
+ query_str += column + ","
+ query_str = query_str[:-1] + " FROM labs "
+
+ query_str += "WHERE %s IN (" % (self._labTypeCol(isLabPanel))
+ for labName in labNames:
+ query_str += "'%s'," % labName
+ query_str = query_str[:-1] + ") "
+
+ query_str += "AND pat_id IN "
+ pat_list_str = "("
+ for pat_id in patientIds:
+ pat_list_str += str(pat_id) + ","
+ pat_list_str = pat_list_str[:-1] + ") "
+ query_str += pat_list_str
+
+ query_str += "ORDER BY pat_id"
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ query_str += ", sor.result_time"
+ else: # Implemented for UMich and UCSF
+ query_str += ", result_time"
+
+ cur = DBUtil.connection().cursor()
+ cur.execute(query_str)
+
+ results = []
+ colNames = DBUtil.columnNamesFromCursor(cur)
+ results.append(colNames)
+
+ dataTable = list(cur.fetchall())
+ for i, row in enumerate(dataTable):
+ dataTable[i] = list(row);
+ results.extend(dataTable);
+
+ return modelListFromTable(results)
+
def _parseResultsData(self, resultRowIter, patientIdCol, nameCol, valueCol, datetimeCol):
"""
@@ -760,7 +1192,13 @@ def _parseResultsDataGenerator(self, resultRowIter, patientIdCol, nameCol, value
if result[valueCol] is not None and result[valueCol] != NULL_STRING:
patientId = int(result[patientIdCol])
baseName = result[nameCol]
- resultValue = float(result[valueCol])
+ try:
+ resultValue = float(result[valueCol])
+ except Exception as e:
+ print("In _parseResultsDataGenerator, " \
+ "weird values of ord_num_value cannot be converted.. " \
+ "Exception:", e)
+ continue
resultTime = DBUtil.parseDateValue(result[datetimeCol])
# Skip apparent placeholder values
@@ -838,13 +1276,161 @@ def processClinicalItemInput(self, clinicalItemName):
patientEpisodes = self._readPatientEpisodesFile()
pass
- def _queryClinicalItemInput():
- pass
+ def addTimeCycleFeatures(self, timeCol, timeAttr):
+ """
+ Look for a datetime value in the patientEpisode identified by timeCol.
+ Add features to the patientEpisode based on the timeAttr string
+ ("month","day","hour","minute","second"), including the sine and cosine
+ of the timeAttr value relative to the maximum possible value to reflect
+ cyclical time patterns (e.g. seasonal patterns over months in a year,
+ or daily cycle patterns over hours in a day).
+ """
+ # Verify patient list and/or patient episode has been processed.
+ if not self.patientsProcessed:
+ raise ValueError("Must process patients before lab result.")
- def _parseClinicalItems():
- pass
+ # Open temp file.
+ self._patientTimeCycleTempFileNameFormat
+ tempFileName = self._patientTimeCycleTempFileNameFormat % (timeCol, timeAttr)
+ tempFile = open(tempFileName, "w")
- def buildFeatureMatrix(self):
+ # Write header fields to tempFile.
+ tempFile.write("patient_id\tepisode_time\t")
+ tempFile.write("%s.%s\t" % (timeCol, timeAttr))
+ tempFile.write("%s.%s.sin\t" % (timeCol, timeAttr))
+ tempFile.write("%s.%s.cos\n" % (timeCol, timeAttr))
+
+ # Compute and write time cycle features.
+ patientEpisodes = self.getPatientEpisodeIterator()
+ for episode in patientEpisodes:
+ timeObj = DBUtil.parseDateValue(episode[timeCol])
+ # Use introspection (getattr) to extract some time feature from the
+ # time object, as well as the maximum and minimum possible values
+ # to set the cycle range.
+ maxValue = getattr(timeObj.max, timeAttr)
+ thisValue = getattr(timeObj, timeAttr)
+ minValue = getattr(timeObj.min, timeAttr)
+
+ radians = 2*np.pi * (thisValue-minValue) / (maxValue+1-minValue)
+
+ # Write values to tempFile.
+ tempFile.write("%s\t" % episode[self.patientEpisodeIdColumn])
+ tempFile.write("%s\t" % episode[self.patientEpisodeTimeColumn])
+ tempFile.write("%s\t" % thisValue)
+ tempFile.write("%s\t" % np.sin(radians))
+ tempFile.write("%s\n" % np.cos(radians))
+
+ # Close tempFile.
+ self._featureTempFileNames.append(tempFileName)
+ tempFile.close()
+
+ def loadMapData(self,filename):
+ """
+ Read the named file's contents through TabDictReader to enable data
+ extraction. If cannot find file by absolute filename, then look under
+ default mapdata directory.
+ """
+ try:
+ return TabDictReader(open(filename))
+ except IOError:
+ # Unable to open file directly. See if it's in the mapdata directory
+ appDir = os.path.dirname(Util.__file__)
+ defaultFilename = os.path.join(appDir, "mapdata", filename)
+ try:
+ return TabDictReader(open(defaultFilename))
+ except IOError:
+ # May need to add default extension as well
+ defaultFilename = defaultFilename + ".tab"
+ return TabDictReader(open(defaultFilename))
+
+ def addCharlsonComorbidityFeatures(self, features=None):
+ """
+ For each of a predefined set of comorbidity categories, add features
+ summarizing occurrence of the associated ICD9 problems.
+ """
+ # Extract ICD9 prefixes per disease category
+ icdprefixesByDisease = dict()
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ for row in self.loadMapData("CharlsonComorbidity-ICD9CM"):
+ (disease, icd9prefix) = (row["charlson"], row["icd9cm"])
+ if disease not in icdprefixesByDisease:
+ icdprefixesByDisease[disease] = list()
+ icdprefixesByDisease[disease].append("^ICD9." + icd9prefix)
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UMich':
+ for row in self.loadMapData("CharlsonComorbidity-ICD9CM"):
+ (disease, icd9prefix) = (row["charlson"], row["icd9cm"])
+ if disease not in icdprefixesByDisease:
+ icdprefixesByDisease[disease] = list()
+ icdprefixesByDisease[disease].append(icd9prefix)
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UCSF':
+ for row in self.loadMapData("CharlsonComorbidity-ICD10"):
+ (disease, icd10prefix) = (row["Category"], row["Code"])
+ if disease not in icdprefixesByDisease:
+ icdprefixesByDisease[disease] = list()
+ icdprefixesByDisease[disease].append("^ICD10." + icd10prefix)
+ icdprefixesByDisease[disease].append(icd10prefix)
+
+
+ for disease, icdprefixes in icdprefixesByDisease.items():
+ disease = disease.translate(None," ()-/") # Strip off punctuation
+ log.debug('Adding %s comorbidity features...' % disease)
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ self.addClinicalItemFeatures(icdprefixes, operator="~*", \
+ label="Comorbidity." + disease, features=features)
+ else:
+ self.addClinicalItemFeatures_NonStanford(icdprefixes,
+ tableName = 'diagnoses',
+ clinicalItemType='diagnose_code',
+ clinicalItemTime='diagnose_time',
+ label="Comorbidity."+disease,
+ features=features)
+
+ def addTreatmentTeamFeatures(self, features=None):
+ """
+ For each of a predefined set of specialty categories, add features
+ summarizing the makeup of the treatment team.
+ """
+ # Extract out lists of treatment team names per care category
+ teamNameByCategory = dict()
+
+ if LocalEnv.DATASET_SOURCE_NAME == 'STRIDE':
+ for row in self.loadMapData("TreatmentTeamGroups"):
+ (category, teamName) = (row["team_category"], row["treatment_team"])
+ if category not in teamNameByCategory:
+ teamNameByCategory[category] = list()
+ teamNameByCategory[category].append(teamName)
+
+ for category, teamNames in teamNameByCategory.items():
+ log.debug('Adding %s treatment team features...' % category)
+ self.addClinicalItemFeatures(teamNames, column="description", \
+ label="Team." + category, features=features)
+
+ elif LocalEnv.DATASET_SOURCE_NAME == 'UCSF':
+ for row in self.loadMapData("TreatmentTeamGroups_UCSF"):
+ (category, teamName) = (row["team_category"], row["treatment_team"])
+ if category not in teamNameByCategory:
+ teamNameByCategory[category] = list()
+ teamNameByCategory[category].append(teamName)
+
+ for category, teamNames in teamNameByCategory.items():
+ log.debug('Adding %s treatment team features...' % category)
+ # TODO sx: rename
+ self.addClinicalItemFeatures_NonStanford(teamNames, \
+ tableName='labs', clinicalItemTime = 'order_time',
+ label="Team."+category, features=features)
+
+ def addSexFeatures(self):
+ SEX_FEATURES = ["Male", "Female"]
+ for feature in SEX_FEATURES:
+ self.addClinicalItemFeatures([feature], dayBins=[], \
+ features="pre")
+
+ def addRaceFeatures(self):
+ for feature in self.queryAllRaces():
+ self.addClinicalItemFeatures([feature], dayBins=[], \
+ features="pre")
+
+ def buildFeatureMatrix(self, header=None, matrixFileName=None):
"""
Given a set of factory inputs, build a feature matrix which
can then be output.
@@ -855,10 +1441,21 @@ def buildFeatureMatrix(self):
self._parseFooInput()
"""
# Initialize feature matrix file.
- timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H.%M")
- matrixFileName = "feature-matrix_%s.tab" % timestamp
- matrixFile = open(matrixFileName, "w")
+ if matrixFileName is None:
+ timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S")
+ matrixFileName = "feature-matrix_%s.tab" % timestamp
+ self._matrixFileName = matrixFileName
+ if header is None:
+ # file_name.tab
+ # Created: timestamp
+ timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
+ header = [
+ '%s' % self._matrixFileName,
+ 'Created: %s' % timestamp
+ ]
self._matrixFileName = matrixFileName
+ matrixFile = open(self._matrixFileName, "w")
+
# Read arbitrary number of input temp files.
# Use csv tab reader so we can just read the lists while being agnostic
@@ -874,6 +1471,10 @@ def buildFeatureMatrix(self):
tempFiles.append(tempFile)
tempFileReaders.append(tempFileReader)
+ # Write header to matrix file.
+ for line in header:
+ matrixFile.write('# %s\n' % line)
+
# Write data to matrix file.
for patientEpisode in patientEpisodeReader:
matrixData = list()
@@ -882,15 +1483,21 @@ def buildFeatureMatrix(self):
# Each tempFile has the patientId and episodeTime fields.
# Don't write these to the matrix file.
for tempFileReader in tempFileReaders:
- tempData = tempFileReader.next()
+ tempData = next(tempFileReader)
matrixData.extend(tempData[2:])
# Write data to matrixFile, with trailing \n.
matrixFile.write("\t".join(matrixData))
matrixFile.write("\n")
+ self.cleanTempFiles()
+
+ def cleanTempFiles(self):
# Close temp files.
- [tempFile.close() for tempFile in tempFiles]
+ try:
+ [tempFile.close() for tempFile in tempFiles]
+ except:
+ pass
# Clean up temp files.
for tempFileName in self._featureTempFileNames:
try:
@@ -920,3 +1527,6 @@ def readFeatureMatrixFile(self):
def getMatrixFileName(self):
return self._matrixFileName
+
+ def getNumRows(self):
+ return self._numRows
diff --git a/medinfo/dataconversion/FeatureMatrixIO.py b/medinfo/dataconversion/FeatureMatrixIO.py
new file mode 100644
index 00000000..577d4b52
--- /dev/null
+++ b/medinfo/dataconversion/FeatureMatrixIO.py
@@ -0,0 +1,66 @@
+#!/usr/bin/python
+"""
+Utility class for reading and writing feature matrix files.
+"""
+
+import datetime
+import os
+import numpy as np
+from pandas import read_csv
+
+class FeatureMatrixIO:
+ def __init__(self):
+ pass
+
+ def read_file_to_data_frame(self, in_file_path, datetime_col_index=None):
+ if datetime_col_index is None:
+ datetime_col_index = 1
+ data_frame = read_csv(in_file_path, sep='\t', comment='#', \
+ parse_dates=[datetime_col_index], na_values=['None'],
+ dtype={'death_date': str})
+
+ return data_frame
+
+ def write_data_frame_to_file(self, data_frame, out_file_path, header=None):
+ columns = list(data_frame.columns.values)
+ if header is None:
+ header = []
+
+ # Open out_file.
+ out_file = open(out_file_path, 'w')
+
+ # Write header.
+ for line in header:
+ out_file.write('# %s\n' % line)
+
+ # Write columns.
+ column_list = '\t'.join(columns)
+ out_file.write('%s\n' % column_list)
+
+ # Write data.
+ row_list = list()
+ for index, row in data_frame.iterrows():
+ row_str = '\t'.join([str(row[column]) for column in columns])
+ out_file.write('%s\n' % row_str)
+
+ def strip_header(self, in_file_path, out_file_path=None):
+ # Set default out_file_path if none provided.
+ if out_file_path is None:
+ template = '%s.stripped-header.tab'
+ out_file_path = template % in_file_path
+
+ # Copies file and strips header from copy.
+ in_file = open(in_file_path, 'r')
+ out_file = open(out_file_path, 'w')
+
+ # Copy line by line, ignoring header.
+ for line in in_file:
+ if line[0] == '#':
+ continue
+ else:
+ out_file.write(line)
+
+ in_file.close()
+ out_file.close()
+
+ return out_file_path
diff --git a/medinfo/dataconversion/FeatureMatrixTransform.py b/medinfo/dataconversion/FeatureMatrixTransform.py
new file mode 100644
index 00000000..de8f127e
--- /dev/null
+++ b/medinfo/dataconversion/FeatureMatrixTransform.py
@@ -0,0 +1,335 @@
+#!/usr/bin/python
+"""
+Module for transforming the values within an existing feature matrix.
+"""
+
+import numpy as np
+import pandas as pd
+
+from scipy.stats import norm
+from sklearn.impute import SimpleImputer
+from .Util import log
+from math import isnan
+
+class FeatureMatrixTransform:
+ IMPUTE_STRATEGY_MEAN = 'mean'
+ IMPUTE_STRATEGY_MEDIAN = 'median'
+ IMPUTE_STRATEGY_MODE = 'most-frequent'
+ IMPUTE_STRATEGY_ZERO = 'zero'
+ IMPUTE_STRATEGY_DISTRIBUTION = 'distribution'
+
+ LOG_BASE_10 = 'log-base-10'
+ LOG_BASE_E = 'log-base-e'
+
+ ALL_FEATURES = 'all-features'
+
+ def __init__(self):
+ self._matrix = None
+
+ def set_input_matrix(self, matrix):
+ if type(matrix) != pd.core.frame.DataFrame:
+ raise ValueError('Input matrix must be pandas DataFrame.')
+
+ self._matrix = pd.DataFrame.copy(matrix)
+
+ def fetch_matrix(self):
+ return self._matrix
+
+ def impute(self, feature=None, strategy=None, distribution=None):
+ if self._matrix is None:
+ raise ValueError('Must call set_input_matrix() before impute().')
+ # If user does not specify which feature to impute, impute values
+ # for all columns in the matrix.
+ if feature is None:
+ feature = FeatureMatrixTransform.ALL_FEATURES
+
+ # If an imputation strategy is not specified, default to mean.
+ if strategy is None:
+ strategy = FeatureMatrixTransform.IMPUTE_STRATEGY_MEAN
+
+ # If distribution is not specified, default to norm.
+ if distribution is None:
+ distribution = norm.rvs
+
+ # TODO sxu: modify other modules to also return stuff
+ if feature == FeatureMatrixTransform.ALL_FEATURES:
+ self._impute_all_features(strategy, distribution=distribution)
+ else:
+ return self._impute_single_feature(feature, strategy, distribution=distribution)
+
+ def do_impute_sx(self, matrix, means):
+ '''
+ sxu new implementation
+
+ Input: train_df, but does not change it
+ Output: dictionary {order_proc_id: {feature: imputation value}}
+ '''
+ import datetime
+ # TODO: alert: changes row order and indices of matrix!
+
+ datetime_format = "%Y-%m-%d %H:%M:%S"
+
+ matrix_sorted = matrix.sort_values(['pat_id', 'order_time']).reset_index()
+ count_time_suffixs = ['preTimeDays', 'postTimeDays'] # TODO: postTimeDays should really not appear!
+ stats_numeric_suffixs = ['min', 'max', 'median', 'mean', 'std', 'first', 'last', 'diff', 'slope',
+ 'proximate']
+ stats_time_suffixs = ['firstTimeDays', 'lastTimeDays', 'proximateTimeDays']
+
+ impute_train = {}
+
+ nega_inf_days = -1000000
+ for i in range(0, matrix_sorted.shape[0]):
+ cur_episode_id = matrix_sorted.ix[i, 'order_proc_id']
+ impute_train[cur_episode_id] = {}
+ for column in matrix_sorted.columns.values.tolist():
+ '''
+ Value not missing
+ '''
+ if matrix_sorted.ix[i, column] == matrix_sorted.ix[i, column]:
+ continue
+
+ '''
+ Value missing
+ '''
+ column_tail = column.split('.')[-1].strip()
+
+ if column in means:
+ popu_mean = means[column] # TODO: pre-compute with dict
+
+ if column_tail in stats_numeric_suffixs:
+ '''
+ impute with the previous episode if available; otherwise population mean
+ '''
+ if i == 0 or (matrix_sorted.ix[i, 'pat_id'] != matrix_sorted.ix[i - 1, 'pat_id']) or (
+ matrix_sorted.ix[i - 1, column] != matrix_sorted.ix[i - 1, column]):
+ matrix_sorted.ix[i, column] = popu_mean # impute_train[cur_episode_id][column] = popu_mean
+ else:
+ matrix_sorted.ix[i, column] = matrix_sorted.ix[
+ i - 1, column] # impute_train[cur_episode_id][column] = train_df_sorted.ix[i-1, column]
+
+ elif column_tail in stats_time_suffixs:
+ '''
+ use the previous + time difference if available; otherwise -infinite
+ '''
+ if i == 0 or (matrix_sorted.ix[i, 'pat_id'] != matrix_sorted.ix[i - 1, 'pat_id']) or (
+ matrix_sorted.ix[i - 1, column] != matrix_sorted.ix[i - 1, column]):
+ # impute_train[cur_episode_id][column] = nega_inf_days
+ matrix_sorted.ix[i, column] = nega_inf_days
+ else:
+ day_diff = (datetime.datetime.strptime(matrix_sorted.ix[i, 'order_time'], datetime_format) -
+ datetime.datetime.strptime(matrix_sorted.ix[i - 1, 'order_time'],
+ datetime_format)).days
+ # impute_train[cur_episode_id][column] = train_df_sorted.ix[i-1, column] - day_diff # TODO!
+
+ matrix_sorted.ix[i, column] = matrix_sorted.ix[i - 1, column] - day_diff
+
+ elif column_tail in count_time_suffixs:
+ '''
+ -infinite
+ '''
+ # impute_train[cur_episode_id][column] = nega_inf_days
+ matrix_sorted.ix[i, column] = nega_inf_days
+
+ else:
+ '''
+ In all other cases, just use mean to impute
+ '''
+ matrix_sorted.ix[i, column] = popu_mean
+ pass
+
+ return matrix_sorted.set_index('index')
+
+ def _impute_all_features(self, strategy, distribution=None):
+ for column in self._matrix:
+ self._impute_single_feature(column, strategy, distribution=distribution)
+
+ # TODO sxu: modify other modules to also return stuff
+ def _impute_single_feature(self, feature, strategy, distribution=None):
+ if strategy == FeatureMatrixTransform.IMPUTE_STRATEGY_MEAN:
+ self._matrix[feature] = self._matrix[feature].fillna(self._matrix[feature].mean(0))
+ return self._matrix[feature].mean(0)
+ elif strategy == FeatureMatrixTransform.IMPUTE_STRATEGY_MODE:
+ self._matrix[feature] = self._matrix[feature].fillna(self._matrix[feature].mode().iloc[0])
+ elif strategy == FeatureMatrixTransform.IMPUTE_STRATEGY_ZERO:
+ self._matrix[feature] = self._matrix[feature].fillna(0.0)
+ elif strategy == FeatureMatrixTransform.IMPUTE_STRATEGY_MEDIAN:
+ self._matrix[feature] = self._matrix[feature].fillna(self._matrix[feature].median())
+ elif strategy == FeatureMatrixTransform.IMPUTE_STRATEGY_DISTRIBUTION:
+ self._matrix[feature] = self._matrix[feature].apply(lambda x: distribution() if pd.isnull(x) else x)
+
+ def drop_null_features(self):
+ for feature in self._matrix.columns.values:
+ if self._matrix[feature].isnull().all():
+ self.remove_feature(feature)
+
+ def remove_feature(self, feature):
+ try:
+ del self._matrix[feature]
+ except KeyError:
+ log.info('Cannot remove non-existent feature "%s".' % feature)
+
+ def filter_on_feature(self, feature, value):
+ # remove rows where feature == value
+ if pd.isnull(value): # nan is not comparable, so need different syntax
+ rows_to_remove = self._matrix[pd.isnull(self._matrix[feature])].index
+ else:
+ try:
+ rows_to_remove = self._matrix[self._matrix[feature] == value].index
+ except TypeError:
+ log.info('Cannot filter %s on %s; types are not comparable.' % (feature, str(value)))
+ return
+
+ self._matrix.drop(rows_to_remove, inplace = True)
+ self._matrix.reset_index(drop=True, inplace = True)
+
+ # return number of rows remaining
+ return self._matrix.shape[0]
+
+ def add_logarithm_feature(self, base_feature, logarithm=None):
+ if logarithm is None:
+ logarithm = FeatureMatrixTransform.LOG_BASE_E
+
+ col_index = self._matrix.columns.get_loc(base_feature)
+
+ if logarithm == FeatureMatrixTransform.LOG_BASE_E:
+ log_feature = 'ln(' + base_feature + ')'
+ new_col = self._matrix[base_feature].apply(np.log)
+ self._matrix.insert(col_index + 1, log_feature, new_col)
+ elif logarithm == FeatureMatrixTransform.LOG_BASE_10:
+ log_feature = 'log10(' + base_feature + ')'
+ new_col = self._matrix[base_feature].apply(np.log10)
+ self._matrix.insert(col_index, log_feature, new_col)
+
+ return log_feature
+
+ def add_indicator_feature(self, base_feature, boolean_indicator=None):
+ # boolean: determines whether to add True/False labels or 1/0
+ if boolean_indicator is None or boolean_indicator is False:
+ indicator = self._numeric_indicator
+ else:
+ indicator = self._boolean_indicator
+
+ col_index = self._matrix.columns.get_loc(base_feature)
+ indicator_feature = 'I(' + base_feature + ')'
+ new_col = self._matrix[base_feature].apply(indicator)
+ self._matrix.insert(col_index + 1, indicator_feature, new_col)
+
+ return indicator_feature
+
+ def add_threshold_feature(self, base_feature, lower_bound=None, upper_bound=None):
+ # Add feature which indicates whether base_feature is >= lower_bound
+ # and <= upper_bound.
+ if lower_bound is None and upper_bound is None:
+ raise ValueError('Must specify either lower_bound or upper_bound.')
+ elif lower_bound is None:
+ # base_feature <= upper_bound
+ threshold_feature = 'I(%s<=%s)' % (base_feature, upper_bound)
+ indicator = lambda x: 1 if x <= upper_bound else 0
+ elif upper_bound is None:
+ # base_feature >= lower_bound
+ threshold_feature = 'I(%s>=%s)' % (base_feature, lower_bound)
+ indicator = lambda x: 1 if x >= lower_bound else 0
+ else:
+ # lower_bound <= base_feature <= upper_bound
+ threshold_feature = 'I(%s<=%s<=%s)' % (lower_bound, base_feature, upper_bound)
+ indicator = lambda x: 1 if x <= upper_bound and x >= lower_bound else 0
+
+ col_index = self._matrix.columns.get_loc(base_feature)
+ new_col = self._matrix[base_feature].apply(indicator)
+ self._matrix.insert(col_index + 1, threshold_feature, new_col)
+
+ return threshold_feature
+
+ def drop_duplicate_rows(self):
+ self._matrix.drop_duplicates(inplace=True)
+
+ def remove_low_signal_features(self):
+ # Prune obviously unhelpful fields.
+ # in theory, FeatureSelector should be able to prune these
+ # automatically, but no harm in helping out given it has to sift
+ # through ~3000 features.
+ LOW_SIGNAL_FEATURES = [
+ 'index_time',
+ 'Birth.pre', 'Death.post'
+ 'Male.preTimeDays', 'Female.preTimeDays',
+ 'RaceWhiteHispanicLatino.preTimeDays',
+ 'RaceWhiteNonHispanicLatino.preTimeDays',
+ 'RaceHispanicLatino.preTimeDays',
+ 'RaceAsian.preTimeDays',
+ 'RaceBlack.preTimeDays',
+ 'RacePacificIslander.preTimeDays',
+ 'RaceNativeAmerican.preTimeDays',
+ 'RaceOther.preTimeDays',
+ 'RaceUnknown.preTimeDays'
+ ]
+ for feature in LOW_SIGNAL_FEATURES:
+ self.remove_feature(feature)
+
+ def _numeric_indicator(self, value):
+ return 1 if pd.notnull(value) else 0
+
+ def _boolean_indicator(self, value):
+ return pd.notnull(value)
+
+ def add_change_feature(self, method, param, feature_old, feature_new):
+ # Add column unchanged_yn describing whether feature_new is 'unchanged'
+ # relative to feature_old
+
+ if method == "percent":
+ change_col = self._matrix.apply(self._percent_change, \
+ args=(feature_old, feature_new, param), axis = 1)
+ elif method == "interval":
+ change_col = self._matrix.apply(self._interval_change, \
+ args=(feature_old, feature_new, param), axis = 1)
+ elif method == "sd": #TODO (raikens): finish this
+ k = 300 #TODO (raikens): make this user-specified
+ n = self._matrix.shape[0]
+ if (n <= k):
+ raise ValueError("Not enough data to estimate sd")
+
+ # estimate sd from sample and drop sample rows
+ sample_rows = np.random.choice(n, k, replace = False)
+ sd = np.std(self._matrix.loc[sample_rows, feature_new], ddof = 1)
+ self._matrix.drop(sample_rows, inplace = True)
+ self._matrix.reset_index(drop=True, inplace = True)
+ margin = param*sd
+
+ change_col = self._matrix.apply(self._interval_change, \
+ args=(feature_old, feature_new, margin), axis = 1)
+
+ else:
+ raise ValueError("Must specify a supported method for change calculation")
+
+ # add new column to matrix
+ # TODO (raikens): since new column is always "unchange_yn," only one
+ # change feature can be added.
+ col_index = self._matrix.columns.get_loc(feature_new)
+ self._matrix.insert(col_index + 1, "unchanged_yn", change_col)
+ return "unchanged_yn"
+
+ def _is_numeric(self, x):
+ try:
+ float(x)
+ return (not isnan(x))
+ except ValueError:
+ return False
+
+ def _percent_change(self, row, feature_old, feature_new, param):
+ # Return 1 if new value has changed by more than percent
+ # of old value, else return 0.
+ # If either old or new value is missing, returns 9999999.
+ if not (self._is_numeric(row[feature_old]) and self._is_numeric(row[feature_new])):
+ return 9999999
+ elif row[feature_old] == 0.0:
+ return 1
+ else:
+ return int(abs(1.0-float(row[feature_new])/float(row[feature_old])) < param)
+
+ def _interval_change(self, row, feature_old, feature_new, param):
+ # Return 1 if new value has changed by more than from old value,
+ # else return 0.
+ # If either old or new value is missing, returns 9999999.
+ if not (self._is_numeric(row[feature_old]) and self._is_numeric(row[feature_new])):
+ return 9999999
+ else:
+ return int(abs(float(row[feature_new])-float(row[feature_old])) < param)
diff --git a/medinfo/dataconversion/ProviderRotationConversion.py b/medinfo/dataconversion/ProviderRotationConversion.py
new file mode 100644
index 00000000..d1ffb530
--- /dev/null
+++ b/medinfo/dataconversion/ProviderRotationConversion.py
@@ -0,0 +1,243 @@
+#!/usr/bin/env python
+import sys, os
+import time;
+from datetime import datetime;
+from optparse import OptionParser
+from medinfo.common.Util import stdOpen, ProgressDots;
+from medinfo.db import DBUtil;
+from medinfo.db.Model import SQLQuery;
+from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList;
+
+from .Util import log;
+from .Env import DATE_FORMAT;
+
+DEFAULT_SOURCE_TABLE = "jchi_accesslog_script";
+NULL_GROUP_ID = 0; # Metric Group ID to assign if null/None indicated
+NULL_GROUP_NAME = "Null Group";
+
+class ProviderRotationConversion:
+ """Data conversion module to take manually prepped provider (physician)
+ scheduling data into a common provider_rotation data table content.
+ Accomodate multiple sources from attending, resident, and student schedules.
+ """
+ connFactory = None; # Allow specification of alternative DB connection source
+
+ sourceTableName = None;
+
+ # Local caches to track lookup values
+ userBySID = None;
+ metricLineDescriptionsById = None;
+ metricById = None;
+ metricGroupById = None;
+
+ def __init__(self):
+ """Default constructor"""
+ self.connFactory = DBUtil.ConnectionFactory(); # Default connection source
+
+ self.sourceTableName = DEFAULT_SOURCE_TABLE; # Customizable parameter to facilitate test cases
+
+ self.userBySID = dict();
+ self.metricLineDescriptionsById = dict();
+ self.metricById = dict();
+ self.metricGroupById = dict();
+
+ def convertSourceItems(self, userSIDs=None, limit=None, offset=None):
+ """Primary run function to process the contents of the source table
+ and convert them into normalized data table entries.
+ """
+ log.info("Conversion for patients: %s" % userSIDs);
+ progress = ProgressDots();
+ conn = self.connFactory.connection();
+ try:
+ for i, sourceItem in enumerate(self.querySourceItems(userSIDs, limit, offset, progress=progress, conn=conn)):
+ self.convertSourceItem(sourceItem, conn=conn);
+ progress.Update();
+
+ # Go through accumulated metric description lines into single entries for the metric table
+ self.updateMetricDescriptionLines();
+ finally:
+ conn.close();
+ # progress.PrintStatus();
+
+
+ def querySourceItems(self, userSIDs, limit=None, offset=None, progress=None, conn=None):
+ """Query the database for list of all AccessLogs
+ and yield the results one at a time. If userSIDs provided, only return items matching those IDs.
+ """
+ extConn = conn is not None;
+ if not extConn:
+ conn = self.connFactory.connection();
+
+ # Column headers to query for that map to respective fields in analysis table
+ headers = ["user_id", "user_name", "de_pat_id", "access_datetime", "metric_id", "metric_name", "line_count", "description", "metric_group_num", "metric_group_name"];
+
+ query = SQLQuery();
+ for header in headers:
+ query.addSelect( header );
+ query.addFrom(self.sourceTableName);
+ if userSIDs is not None:
+ query.addWhereIn("user_id", userSIDs);
+ query.setLimit(limit);
+ query.setOffset(offset);
+
+ # Query to get an estimate of how long the process will be
+ if progress is not None:
+ progress.total = DBUtil.execute(query.totalQuery(), conn=conn)[0][0];
+
+ cursor = conn.cursor();
+ # Do one massive query, but yield data for one item at a time.
+ cursor.execute( str(query), tuple(query.params) );
+
+ row = cursor.fetchone();
+ while row is not None:
+ rowModel = RowItemModel( row, headers );
+ yield rowModel;
+ row = cursor.fetchone();
+
+ # Slight risk here. Normally DB connection closing should be in finally of a try block,
+ # but using the "yield" generator construct forbids us from using a try, finally construct.
+ cursor.close();
+
+ if not extConn:
+ conn.close();
+
+ def convertSourceItem(self, sourceItem, conn=None):
+ """Given an individual sourceItem record, produce / convert it into an equivalent
+ item record in the analysis database.
+ """
+ extConn = conn is not None;
+ if not extConn:
+ conn = self.connFactory.connection();
+ try:
+ # Normalize sourceItem data into hierachical components (metric group -> metric -> metric line and user -> access_log).
+ # Expect relatively small number of lookup values, so these should only have to be instantiated
+ # in a first past, with subsequent calls just yielding back in memory cached copies
+ user = self.userFromSourceItem(sourceItem, conn=conn);
+ metricGroup = self.metricGroupFromSourceItem(sourceItem, conn=conn);
+ metric = self.metricFromSourceItem(sourceItem, metricGroup, conn=conn);
+ metricLine = self.metricLineFromSourceItem(sourceItem, metric, conn=conn);
+ accessLog = self.accessLogFromSourceItem(sourceItem, user, metric, metricLine, conn=conn);
+ finally:
+ if not extConn:
+ conn.close();
+
+ def userFromSourceItem(self, sourceItem, conn):
+ # Load or produce a user record model for the given sourceItem
+ userSID = sourceItem["user_id"];
+ if userSID not in self.userBySID:
+ # User does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ userId = int(userSID[1:]); # Trim out leading S and parse remainder of SID as integer
+ user = \
+ RowItemModel \
+ ( { "user_id": userId, # Somewhat confusing remap of "user_id" in source data to "sid" to reserve user_id for the integer component
+ "sid": userSID,
+ "name": sourceItem["user_name"],
+ }
+ );
+ (userId, isNew) = DBUtil.findOrInsertItem("user", user, conn=conn);
+ self.userBySID[userSID] = user;
+ return self.userBySID[userSID];
+
+ def metricGroupFromSourceItem(self, sourceItem, conn):
+ # Load or produce a metricGroup record model for the given sourceItem
+ metricGroupId = sourceItem["metric_group_num"]; # Map num to Id
+ metricGroupName = sourceItem["metric_group_name"];
+ if metricGroupId is None:
+ metricGroupId = NULL_GROUP_ID;
+ metricGroupName = NULL_GROUP_NAME;
+ if metricGroupId not in self.metricGroupById:
+ # MetricGroup does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ metricGroup = \
+ RowItemModel \
+ ( { "metric_group_id": metricGroupId,
+ "name": metricGroupName,
+ }
+ );
+ (metricGroupId, isNew) = DBUtil.findOrInsertItem("metric_group", metricGroup, conn=conn);
+ self.metricGroupById[metricGroupId] = metricGroup;
+ return self.metricGroupById[metricGroupId];
+
+ def metricFromSourceItem(self, sourceItem, metricGroup, conn):
+ metricId = sourceItem["metric_id"];
+ if metricId not in self.metricById:
+ metric = \
+ RowItemModel \
+ ( { "metric_id": metricId,
+ "metric_group_id": metricGroup["metric_group_id"],
+ "name": sourceItem["metric_name"],
+ }
+ );
+ (metricId, isNew) = DBUtil.findOrInsertItem("metric", metric, conn=conn);
+ self.metricById[metricId] = metric;
+ return self.metricById[metricId];
+
+ def metricLineFromSourceItem(self, sourceItem, metric, conn):
+ metricId = sourceItem["metric_id"];
+ targetLine = sourceItem["line_count"];
+ iTargetLine = targetLine-1; # Change from 1 to 0-based indexing
+
+ if metricId not in self.metricLineDescriptionsById:
+ self.metricLineDescriptionsById[metricId] = list();
+ nCurrentLines = len(self.metricLineDescriptionsById[metricId]);
+ nMissingLines = targetLine - nCurrentLines;
+ for i in range(nMissingLines):
+ self.metricLineDescriptionsById[metricId].append('XXX'); # Placeholder values
+
+ self.metricLineDescriptionsById[metricId][iTargetLine] = sourceItem["description"];
+
+ return targetLine;
+
+ def accessLogFromSourceItem(self, sourceItem, user, metric, metricLine, conn):
+ # Produce an access log for the given sourceItem with links to the lookup user and metric
+ # Only record once for multi-line descriptions, so check the line number
+ accessLog = None;
+ if metricLine == 1:
+ accessLog = \
+ RowItemModel \
+ ( { "user_id": user["user_id"],
+ "de_pat_id": sourceItem["de_pat_id"],
+ "metric_id": metric["metric_id"],
+ "access_datetime": sourceItem["access_datetime"],
+ }
+ );
+ insertQuery = DBUtil.buildInsertQuery("access_log", list(accessLog.keys()) );
+ insertParams= list(accessLog.values());
+ DBUtil.execute( insertQuery, insertParams, conn=conn );
+ return accessLog;
+
+ def updateMetricDescriptionLines(self):
+ for metricId, descriptionLines in self.metricLineDescriptionsById.items():
+ description = str.join(' ', descriptionLines);
+ DBUtil.updateRow("metric", {"description": description}, metricId );
+
+ def main(self, argv):
+ """Main method, callable from command line"""
+ usageStr = "usage: %prog [options]\n"
+ parser = OptionParser(usage=usageStr)
+ parser.add_option("-i", "--userSIDs", dest="userSIDs", metavar="", help="Comma separated list of user SIDs to convert AccessLog data for. Leave blank to attempt conversion for all available");
+ parser.add_option("-l", "--limit", dest="limit", metavar="", help="Number of records to process before stopping");
+ parser.add_option("-o", "--offset", dest="offset", metavar="", help="Number of records to skip before start converting");
+ (options, args) = parser.parse_args(argv[1:])
+
+ log.info("Starting: "+str.join(" ", argv))
+ timer = time.time();
+
+ userSIDs = None;
+ if options.userSIDs is not None:
+ userSIDs = options.userSIDs.split(",");
+
+ limit = None;
+ if options.limit is not None:
+ limit = int(options.limit);
+ offset = None;
+ if options.offset is not None:
+ offset = int(options.offset);
+
+ self.convertSourceItems(userSIDs, limit, offset);
+
+ timer = time.time() - timer;
+ log.info("%.3f seconds to complete",timer);
+
+if __name__ == "__main__":
+ instance = ProviderRotationConversion();
+ instance.main(sys.argv);
diff --git a/medinfo/dataconversion/ResidentScheduleFormat.py b/medinfo/dataconversion/ResidentScheduleFormat.py
index a2259869..50c55ec4 100644
--- a/medinfo/dataconversion/ResidentScheduleFormat.py
+++ b/medinfo/dataconversion/ResidentScheduleFormat.py
@@ -3,16 +3,19 @@
import time;
import csv;
from datetime import datetime, timedelta;
+from operator import itemgetter
from optparse import OptionParser
from medinfo.common.Util import stdOpen, ProgressDots;
from medinfo.db import DBUtil;
from medinfo.db.ResultsFormatter import TextResultsFormatter;
from medinfo.db.Model import RowItemModel, RowItemFieldComparator, modelListFromTable, modelDictFromList;
-from Util import log;
+from .Util import log;
-BASE_YEAR = 2013; # Year expect dates to start in
CHANGE_HOUR = 7; # Designate 7am as changeover time rather than midnight, otherwise night shift behavior on change dates will be misinterpreted
+DEFAULT_INDEX_PREFIX_LENGTH = 3; # Default number of first letters (prefix) of a provider's name to count as equal / equivalent when guessing provider IDs
+PLACEHOLDER_ID_TEMPLATE = "S%03d"; # Template for fake / placeholder provider ID to generate as needed
+PLACEHOLDER_ID_BASE_COUNTER = -1000; # Initial value for fake ID sequence counter in negative values
class ResidentScheduleFormat:
"""Data conversion module to take Resident Schedule Excel spreadsheet
@@ -20,17 +23,27 @@ class ResidentScheduleFormat:
"""
def __init__(self):
"""Default constructor"""
- self.baseYear = BASE_YEAR;
self.changeHour = CHANGE_HOUR;
+ self.indexPrefixLength = None;
+ self.providersByNamePrefix = None;
+ self.placeholderIdCounter = PLACEHOLDER_ID_BASE_COUNTER;
- def parseScheduleItems(self, scheduleFile):
+ def parseScheduleItems(self, scheduleFile, baseYear):
"""Given a file reference, parse through contents to generate a list of
relational (dictionary) schedule items representing each dated user-rotation schedule component.
"""
reader = csv.reader(scheduleFile, dialect=csv.excel_tab); # Assume tab delimited file
- dateRanges = self.parseDateRanges(reader.next()); # Expect first line to be the primary date ranges
- splitDates = self.parseSplitDates(reader.next()); # Expect next line to be mid-rotation split dates
+ # Iterate through header lines until find one that looks like key date row
+ # Expect first key line to be the primary date ranges
+ row = next(reader);
+ while row[-1].isalnum() or row[-1].find("-") < 0: # Expect date rows formatted like "5/25 - 6/24" so look for a non-alphanumeric row with a '-'' in the middle
+ row = next(reader);
+ dateRanges = self.parseDateRanges(row, baseYear);
+
+ # Expect next line to be mid-rotation split dates
+ row = next(reader);
+ splitDates = self.parseSplitDates(row, baseYear);
scheduleItems = list();
lastResident = None;
@@ -50,6 +63,8 @@ def parseScheduleItems(self, scheduleFile):
def parseResidentScheduleItems(self, resident, resTextChunksList, dateRanges, splitDates):
"""Parse just the text chunks for an individual resident, being aware of potential for list of multiple rows
"""
+ provId = self.inferProvIdFromName(resident);
+
for iBlock, dateRange in enumerate(dateRanges): # Iterate through each major rotation block
dateRange = dateRanges[iBlock];
splitDate = splitDates[iBlock];
@@ -58,6 +73,7 @@ def parseResidentScheduleItems(self, resident, resTextChunksList, dateRanges, sp
scheduleItems = list();
for iRow, resTextChunks in enumerate(resTextChunksList):
textChunk = resTextChunks[iBlock].strip();
+ #print >> sys.stderr, iRow, textChunk
if textChunk != "" and textChunk[-1].isdigit(): # Ends with a number, must be a date specification
subChunks = textChunk.split(); # Separate out date
dateRangeText = subChunks.pop(-1);
@@ -67,7 +83,7 @@ def parseResidentScheduleItems(self, resident, resTextChunksList, dateRanges, sp
rotation = str.join(' ', subChunks); # Reconstruct rotation name
- scheduleItem = {"resident": resident, "rotation": rotation, "start": startDate, "end": endDate};
+ scheduleItem = {"prov_id": provId, "name": resident, "rotation": rotation, "start_date": startDate, "end_date": endDate};
scheduleItems.append(scheduleItem);
# Second pass to look for rotations without dates specified based on standard dates
@@ -80,44 +96,79 @@ def parseResidentScheduleItems(self, resident, resTextChunksList, dateRanges, sp
rotation = subChunks[0].strip();
if rotation[0].isalpha(): # Ensure starts with a letter, and not special character for blank placeholder
(startDate, endDate) = self.compressDateRange( dateRange[0], splitDate, scheduleItems ); # End split date
- scheduleItem = {"resident": resident, "rotation": rotation, "start": startDate, "end": endDate};
+ scheduleItem = {"prov_id": provId, "name": resident, "rotation": rotation, "start_date": startDate, "end_date": endDate};
scheduleItems.append(scheduleItem);
rotation = subChunks[-1].strip();
if rotation[0].isalpha(): # Ensure starts with a letter, and not special character for blank placeholder
(startDate, endDate) = self.compressDateRange( splitDate, dateRange[-1], scheduleItems ); # Start on split date
- scheduleItem = {"resident": resident, "rotation": rotation, "start": startDate, "end": endDate};
+ scheduleItem = {"prov_id": provId, "name": resident, "rotation": rotation, "start_date": startDate, "end_date": endDate};
scheduleItems.append(scheduleItem);
else: # Single rotation spanning the full block
rotation = subChunks[0].strip();
if rotation[0].isalpha(): # Ensure starts with a letter, and not special character for blank placeholder
(startDate, endDate) = self.compressDateRange( dateRange[0], dateRange[-1], scheduleItems );
- scheduleItem = {"resident": resident, "rotation": rotation, "start": startDate, "end": endDate};
+ scheduleItem = {"prov_id": provId, "name": resident, "rotation": rotation, "start_date": startDate, "end_date": endDate};
scheduleItems.append(scheduleItem);
# Now yield / generate results, but keep sorted in chronologic order
- scheduleItems.sort( RowItemFieldComparator("start") );
+ scheduleItems.sort(key=itemgetter("start_date"));
for item in scheduleItems:
yield item;
+ def loadProviderModels( self, providerModels, indexPrefixLength=DEFAULT_INDEX_PREFIX_LENGTH ):
+ """Store a copy of the given provider models (expect each to be a dictionary with prov_id, last_name, first_name combinations).
+ Prepare an index around these based on first X characters of each name to use when trying to back track
+ provider names to prov_ids.
+ """
+ self.indexPrefixLength = indexPrefixLength;
+ self.providersByNamePrefix = dict();
+ for provider in providerModels:
+ namePrefix = (provider["last_name"][:indexPrefixLength] +","+ provider["first_name"][:indexPrefixLength]).upper();
+ if namePrefix not in self.providersByNamePrefix:
+ self.providersByNamePrefix[namePrefix] = list(); # Store a collection to track collisions between multiple providers who have the same first and last name (prefixes)
+ self.providersByNamePrefix[namePrefix].append(provider);
+
+ def inferProvIdFromName(self, name):
+ """Assume name is separated by comma into "LastName, FirstName"
+ Look through providersByNamePrefix dictionary to look for a best match within first X characters of first and last name
+ to back track provider ID. If none found, then fill in a fake ID value.
+ """
+ provIdsStr = None;
+
+ if self.providersByNamePrefix is not None and self.indexPrefixLength is not None:
+ chunks = name.split(",");
+ lastName = chunks[0].strip();
+ firstName = chunks[-1].strip();
+ namePrefix = (lastName[:self.indexPrefixLength] +","+ firstName[:self.indexPrefixLength]).upper();
+
+ if namePrefix in self.providersByNamePrefix:
+ providers = self.providersByNamePrefix[namePrefix];
+ provIdsStr = str.join(",", [provider["prov_id"] for provider in providers])
+
+ if provIdsStr is None: # Unable to lookup provider IDs. Just makeup a sequential value then
+ self.placeholderIdCounter -= 1; # Decrement counter as working with negative values
+ provIdsStr = PLACEHOLDER_ID_TEMPLATE % self.placeholderIdCounter;
+ return provIdsStr;
+
def compressDateRange( self, startDate, endDate, scheduleItems ):
"""Given a list of schedule item with specific date ranges,
modify the given start and end date range to avoid overlap with any existing ones.
Simplifying assumption that overlaps will be at ends, not in middle of range or spanning entirety
"""
for item in scheduleItems:
- if item["start"] < endDate and startDate < item["end"]: # Overlap
- if startDate < item["start"] : # Overlap trim at end
- endDate = item["start"];
- elif item["end"] < endDate: # Overlap trim at start
- startDate = item["end"];
+ if item["start_date"] < endDate and startDate < item["end_date"]: # Overlap
+ if startDate < item["start_date"] : # Overlap trim at end
+ endDate = item["start_date"];
+ elif item["end_date"] < endDate: # Overlap trim at start
+ startDate = item["end_date"];
return (startDate, endDate);
- def parseDateRanges(self, textChunks):
+ def parseDateRanges(self, textChunks, baseYear):
textChunks = textChunks[1:]; # Discard first chunk, expect to be an unused label
dateRanges = list();
- lastDate = datetime(self.baseYear,1,1); # Start with the expected base year
+ lastDate = datetime(baseYear,1,1); # Start with the expected base year
for chunk in textChunks:
(startText, endText) = chunk.split("-"); # Separate out start from end date
lastDate = startDate = self.parseDateText( startText, lastDate, 0 );
@@ -139,11 +190,11 @@ def parseDateText( self, dateText, lastDate, incrementDays=0 ):
dateObj += timedelta(incrementDays);
return dateObj;
- def parseSplitDates(self, textChunks):
+ def parseSplitDates(self, textChunks, baseYear):
textChunks = textChunks[1:]; # Discard first chunk, expect to be an unused label
splitDates = list();
- lastDate = datetime(self.baseYear,1,1); # Start with the expected base year
+ lastDate = datetime(baseYear,1,1); # Start with the expected base year
for chunk in textChunks:
dateText = chunk.replace("(","").replace(")","").strip(); # Drop flanking parantheses
lastDate = splitDate = self.parseDateText( dateText, lastDate );
@@ -153,17 +204,26 @@ def parseSplitDates(self, textChunks):
def main(self, argv):
"""Main method, callable from command line"""
usageStr = "usage: %prog \n"+\
- " Tab-delimited input file taken from schedule Excel file. Expect first row to have dates as in test case example. Weird space characters should be converted to regular ASCII characters\n"+\
+ " Tab-delimited input file taken from schedule Excel file. Example data format as seen in test case examples. See support/extractExcelSheets.py for help on pulling out Excel sheets into tab-delimited data files.\n"+\
" File to output results to. Designate '-' for stdout.";
parser = OptionParser(usage=usageStr)
+ parser.add_option("-i", "--providerIdFilename", dest="providerIdFilename", help="Name of provider ID CSV file. If provided, then add column for prov_id based on resident first_name and last_name, match within first "+DEFAULT_INDEX_PREFIX_LENGTH+" characters, or generate ID value if no match found");
+ parser.add_option("-y", "--baseYear", dest="baseYear", help="Year expect dates to start in.");
+ parser.add_option("-t", "--changeTime", dest="changeTime", default=CHANGE_TIME, help="Hour of day that count as delimiter between rotations. Likely should NOT be midnight = 0, because night shifts span midnight. Default to 7 = 7am.");
(options, args) = parser.parse_args(argv[1:])
- if len(args) >= 2:
+ if len(args) >= 2 and options.baseYear:
log.info("Starting: "+str.join(" ", argv))
timer = time.time();
+ baseYear = int(options.baseYear);
+
+ if options.providerIdFilename is not None:
+ providerReader = csv.DictReader(open(options.providerIdFilename));
+ self.loadProviderModels( providerReader );
+
inFile = stdOpen(args[0]);
- scheduleItems = self.parseScheduleItems(inFile);
+ scheduleItems = self.parseScheduleItems(inFile, baseYear);
outFile = stdOpen(args[1],"w");
formatter = TextResultsFormatter(outFile);
diff --git a/medinfo/dataconversion/STRIDEAccessLogConversion.py b/medinfo/dataconversion/STRIDEAccessLogConversion.py
index ad69d0ee..f1d73012 100644
--- a/medinfo/dataconversion/STRIDEAccessLogConversion.py
+++ b/medinfo/dataconversion/STRIDEAccessLogConversion.py
@@ -8,8 +8,8 @@
from medinfo.db.Model import SQLQuery;
from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList;
-from Util import log;
-from Env import DATE_FORMAT;
+from .Util import log;
+from .Env import DATE_FORMAT;
DEFAULT_SOURCE_TABLE = "jchi_accesslog_script";
NULL_GROUP_ID = 0; # Metric Group ID to assign if null/None indicated
@@ -20,21 +20,21 @@ class STRIDEAccessLogConversion:
into normalized structured data tables to facilitate subsequent analysis.
"""
connFactory = None; # Allow specification of alternative DB connection source
-
+
sourceTableName = None;
-
+
# Local caches to track lookup values
userBySID = None;
metricLineDescriptionsById = None;
metricById = None;
metricGroupById = None;
-
+
def __init__(self):
"""Default constructor"""
self.connFactory = DBUtil.ConnectionFactory(); # Default connection source
self.sourceTableName = DEFAULT_SOURCE_TABLE; # Customizable parameter to facilitate test cases
-
+
self.userBySID = dict();
self.metricLineDescriptionsById = dict();
self.metricById = dict();
@@ -56,11 +56,11 @@ def convertSourceItems(self, userSIDs=None, limit=None, offset=None):
self.updateMetricDescriptionLines();
finally:
conn.close();
- progress.PrintStatus();
+ # progress.PrintStatus();
def querySourceItems(self, userSIDs, limit=None, offset=None, progress=None, conn=None):
- """Query the database for list of all AccessLogs
+ """Query the database for list of all AccessLogs
and yield the results one at a time. If userSIDs provided, only return items matching those IDs.
"""
extConn = conn is not None;
@@ -69,7 +69,7 @@ def querySourceItems(self, userSIDs, limit=None, offset=None, progress=None, con
# Column headers to query for that map to respective fields in analysis table
headers = ["user_id", "user_name", "de_pat_id", "access_datetime", "metric_id", "metric_name", "line_count", "description", "metric_group_num", "metric_group_name"];
-
+
query = SQLQuery();
for header in headers:
query.addSelect( header );
@@ -136,7 +136,7 @@ def userFromSourceItem(self, sourceItem, conn):
(userId, isNew) = DBUtil.findOrInsertItem("user", user, conn=conn);
self.userBySID[userSID] = user;
return self.userBySID[userSID];
-
+
def metricGroupFromSourceItem(self, sourceItem, conn):
# Load or produce a metricGroup record model for the given sourceItem
metricGroupId = sourceItem["metric_group_num"]; # Map num to Id
@@ -162,7 +162,7 @@ def metricFromSourceItem(self, sourceItem, metricGroup, conn):
metric = \
RowItemModel \
( { "metric_id": metricId,
- "metric_group_id": metricGroup["metric_group_id"],
+ "metric_group_id": metricGroup["metric_group_id"],
"name": sourceItem["metric_name"],
}
);
@@ -174,14 +174,14 @@ def metricLineFromSourceItem(self, sourceItem, metric, conn):
metricId = sourceItem["metric_id"];
targetLine = sourceItem["line_count"];
iTargetLine = targetLine-1; # Change from 1 to 0-based indexing
-
+
if metricId not in self.metricLineDescriptionsById:
self.metricLineDescriptionsById[metricId] = list();
nCurrentLines = len(self.metricLineDescriptionsById[metricId]);
nMissingLines = targetLine - nCurrentLines;
- for i in xrange(nMissingLines):
+ for i in range(nMissingLines):
self.metricLineDescriptionsById[metricId].append('XXX'); # Placeholder values
-
+
self.metricLineDescriptionsById[metricId][iTargetLine] = sourceItem["description"];
return targetLine;
@@ -199,13 +199,13 @@ def accessLogFromSourceItem(self, sourceItem, user, metric, metricLine, conn):
"access_datetime": sourceItem["access_datetime"],
}
);
- insertQuery = DBUtil.buildInsertQuery("access_log", accessLog.keys() );
- insertParams= accessLog.values();
+ insertQuery = DBUtil.buildInsertQuery("access_log", list(accessLog.keys()) );
+ insertParams= list(accessLog.values());
DBUtil.execute( insertQuery, insertParams, conn=conn );
return accessLog;
def updateMetricDescriptionLines(self):
- for metricId, descriptionLines in self.metricLineDescriptionsById.iteritems():
+ for metricId, descriptionLines in self.metricLineDescriptionsById.items():
description = str.join(' ', descriptionLines);
DBUtil.updateRow("metric", {"description": description}, metricId );
@@ -231,7 +231,7 @@ def main(self, argv):
offset = None;
if options.offset is not None:
offset = int(options.offset);
-
+
self.convertSourceItems(userSIDs, limit, offset);
timer = time.time() - timer;
diff --git a/medinfo/dataconversion/STRIDECultureMicroConversion.py b/medinfo/dataconversion/STRIDECultureMicroConversion.py
new file mode 100644
index 00000000..e7ed6314
--- /dev/null
+++ b/medinfo/dataconversion/STRIDECultureMicroConversion.py
@@ -0,0 +1,252 @@
+#!/usr/bin/env python
+import sys, os
+import time;
+from datetime import datetime;
+from optparse import OptionParser
+from medinfo.common.Util import stdOpen, ProgressDots;
+from medinfo.db import DBUtil;
+from medinfo.db.Model import SQLQuery;
+from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList, RowItemFieldComparator;
+
+from .Util import log;
+from .Env import DATE_FORMAT;
+
+
+SOURCE_TABLE = "stride_culture_micro";
+CATEGORY_TEMPLATE = "Microculture Susceptibility General";
+
+class STRIDECultureMicroConversion:
+ """Data conversion module to take STRIDE data
+ into the structured data analysis tables to facilitate subsequent analysis.
+ """
+
+ def __init__(self):
+ """Default constructor"""
+ self.connFactory = DBUtil.ConnectionFactory(); # Default connection source, but Allow specification of alternative DB connection source
+
+ self.categoryBySourceDescr = dict(); # Local cache to track the clinical item category table contents
+ self.clinicalItemByCompositeKey = dict(); # Local cache to track clinical item table contents
+
+ def convertSourceItems(self, convOptions):
+ """Primary run function to process the contents of the raw source
+ table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
+ Should look for redundancies after the fact to catch repeated conversions.
+
+ startDate - If provided, only return items whose ordering_date is on or after that date.
+ endDate - If provided, only return items whose ordering_date is before that date.
+ """
+ log.info("Conversion for items dated %s to %s" % (convOptions.startDate, convOptions.endDate));
+ progress = ProgressDots();
+ conn = self.connFactory.connection();
+ try:
+ # Next round for medications directly from order_med table not addressed in medmix
+ for sourceItem in self.querySourceItems(convOptions, progress=progress, conn=conn):
+ self.convertSourceItem(sourceItem, conn=conn);
+ progress.Update();
+
+ finally:
+ conn.close();
+ progress.PrintStatus();
+
+
+ def querySourceItems(self, convOptions, progress=None, conn=None):
+ """Query the database for list of all source clinical items (culture results, etc.)
+ and yield the results one at a time. If startDate provided, only return items whose
+ occurence date is on or after that date.
+ """
+ extConn = conn is not None;
+ if not extConn:
+ conn = self.connFactory.connection();
+
+ # Column headers to query for that map to respective fields in analysis table
+ headers = ["order_proc_anon_id","pat_anon_id","pat_enc_csn_anon_id","proc_code","organism_name","antibiotic_name","suseptibility", "shifted_result_time"];
+
+ query = SQLQuery();
+ for header in headers:
+ query.addSelect( header );
+ query.addFrom("stride_culture_micro");
+ # TODO: FIGURE OUT WHY CAN"T DO >= OPERATION HERE
+ # if convOptions.startDate is not None:
+ # query.addWhereOp("shifted_result_time",">=", convOptions.startDate);
+ # if convOptions.endDate is not None:
+ # query.addWhereOp("shifted_result_time","<", convOptions.endDate); # Still use begin date as common filter value
+
+
+ # Query to get an estimate of how long the process will be
+ if progress is not None:
+ progress.total = DBUtil.execute(query.totalQuery(), conn=conn)[0][0];
+
+ cursor = conn.cursor();
+ # Do one massive query, but yield data for one item at a time.
+ cursor.execute( str(query), tuple(query.params) );
+
+ row = cursor.fetchone();
+ while row is not None:
+ rowModel = RowItemModel( row, headers );
+
+ if rowModel['shifted_result_time'] is None: # Don't add if no result time given
+ row = cursor.fetchone();
+ continue
+
+ if rowModel['organism_name'] is not None: # if positive culture but results uninterpretable, don't add feature
+ if rowModel['suseptibility'] is None or rowModel['antibiotic_name'] == 'Method' or rowModel['antibiotic_name'] is None:
+ row = cursor.fetchone();
+ continue
+
+ try:
+ # So that we don't run into directory issues later when writing temp files
+ rowModel['antibiotic_name'] = rowModel['antibiotic_name'].replace('/', '-')
+
+ # Change susceptibility features to either susc or not
+ if rowModel['suseptibility'] is not None:
+ if rowModel['suseptibility'] == 'Susceptible' or rowModel['suseptibility'] == 'Positive':
+ rowModel['suseptibility'] = 'Susceptible'
+ else:
+ rowModel['suseptibility'] = "Not_Susceptible"
+ except: # When antibiotic name is none
+ pass
+
+ yield rowModel; # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
+ row = cursor.fetchone();
+
+ # Slight risk here. Normally DB connection closing should be in finally of a try block,
+ # but using the "yield" generator construct forbids us from using a try, finally construct.
+ cursor.close();
+
+ if not extConn:
+ conn.close();
+
+
+ def convertSourceItem(self, sourceItem, conn=None):
+ """Given an individual sourceItem record, produce / convert it into an equivalent
+ item record in the analysis database.
+ """
+ extConn = conn is not None;
+ if not extConn:
+ conn = self.connFactory.connection();
+ try:
+ # Normalize sourceItem data into hierachical components (category -> clinical_item -> patient_item).
+ # Relatively small / finite number of categories and clinical_items, so these should only have to be instantiated
+ # in a first pass, with subsequent calls just yielding back in memory cached copies
+ category = self.categoryFromSourceItem(sourceItem, conn=conn);
+ clinicalItem = self.clinicalItemFromSourceItem(sourceItem, category, conn=conn);
+ patientItem = self.patientItemFromSourceItem(sourceItem, clinicalItem, conn=conn);
+
+ finally:
+ if not extConn:
+ conn.close();
+
+
+
+ def categoryFromSourceItem(self, sourceItem, conn):
+ # Load or produce a clinical_item_category record model for the given sourceItem
+ # In this case, always Microculture Susceptibility
+ categoryDescription = CATEGORY_TEMPLATE;
+ categoryKey = (SOURCE_TABLE, categoryDescription);
+ if categoryKey not in self.categoryBySourceDescr:
+ # Category does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ category = \
+ RowItemModel \
+ ( { "source_table": SOURCE_TABLE,
+ "description": categoryDescription,
+ }
+ );
+ (categoryId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", category, conn=conn);
+ category["clinical_item_category_id"] = categoryId;
+ self.categoryBySourceDescr[categoryKey] = category;
+ return self.categoryBySourceDescr[categoryKey];
+
+ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
+ # Load or produce a clinical_item record model for the given sourceItem
+ sourceItem_description = "%s:%s" % (sourceItem['antibiotic_name'], sourceItem['suseptibility'])
+ clinicalItemKey = (category["clinical_item_category_id"], sourceItem_description); ########## TODO probably needs to change
+ if clinicalItemKey not in self.clinicalItemByCompositeKey:
+ # Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ if sourceItem['antibiotic_name'] is None and sourceItem['suseptibility'] is None: # we only get here if no bacteria grew
+ name = "Negative Culture"
+ description ="Microculture Grew No Bacteria"
+ else:
+ name = "%s:%s" % (sourceItem['antibiotic_name'], sourceItem['suseptibility'])
+ description = "%s TO %s" % (sourceItem['suseptibility'], sourceItem['antibiotic_name'])
+
+
+ clinicalItem = \
+ RowItemModel \
+ ( { "clinical_item_category_id": category["clinical_item_category_id"],
+ "external_id": None,
+ "name": name,
+ "description": description
+ }
+ );
+ (clinicalItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", clinicalItem, conn=conn);
+ clinicalItem["clinical_item_id"] = clinicalItemId;
+ self.clinicalItemByCompositeKey[clinicalItemKey] = clinicalItem;
+ return self.clinicalItemByCompositeKey[clinicalItemKey];
+
+ def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
+ # Produce a patient_item record model for the given sourceItem
+ patientItem = \
+ RowItemModel \
+ ( { "external_id": sourceItem["order_proc_anon_id"],
+ "patient_id": sourceItem["pat_anon_id"],
+ "encounter_id": sourceItem["pat_enc_csn_anon_id"],
+ "clinical_item_id": clinicalItem["clinical_item_id"],
+ "item_date": sourceItem["shifted_result_time"],
+ }
+ );
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()) );
+ insertParams= list(patientItem.values());
+ try:
+ # Optimistic insert of a new unique item
+ DBUtil.execute( insertQuery, insertParams, conn=conn );
+ patientItem["patient_item_id"] = DBUtil.execute( DBUtil.identityQuery("patient_item"), conn=conn )[0][0];
+ except conn.IntegrityError as err:
+ # If turns out to be a duplicate, okay, pull out existing ID and continue to insert whatever else is possible
+ # log.info(err); # Lookup just by the composite key components to avoid attempting duplicate insertion again
+ searchPatientItem = \
+ { "patient_id": patientItem["patient_id"],
+ "clinical_item_id": patientItem["clinical_item_id"],
+ "item_date": patientItem["item_date"],
+ }
+ (patientItem["patient_item_id"], isNew) = DBUtil.findOrInsertItem("patient_item", searchPatientItem, conn=conn);
+ return patientItem;
+
+ def main(self, argv):
+ """Main method, callable from command line"""
+ usageStr = "usage: %prog [options]\n"
+ parser = OptionParser(usage=usageStr)
+ parser.add_option("-s", "--startDate", dest="startDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with start time on or after this date.");
+ parser.add_option("-e", "--endDate", dest="endDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with start time before this date.");
+ (options, args) = parser.parse_args(argv[1:])
+
+ log.info("Starting: "+str.join(" ", argv))
+ timer = time.time();
+
+ convOptions = ConversionOptions();
+ convOptions.extractParserOptions(options);
+
+ self.convertSourceItems(convOptions);
+
+ timer = time.time() - timer;
+ log.info("%.3f seconds to complete",timer);
+
+class ConversionOptions:
+ """Simple struct to contain multiple program options"""
+ def __init__(self):
+ self.startDate = None;
+ self.endDate = None;
+
+ def extractParserOptions(self, options):
+ if options.startDate is not None:
+ # Parse out the start date parameter
+ timeTuple = time.strptime(options.startDate, DATE_FORMAT);
+ self.startDate = datetime(*timeTuple[0:3]);
+
+ if options.endDate is not None:
+ # Parse out the end date parameter
+ timeTuple = time.strptime(options.endDate, DATE_FORMAT);
+ self.endDate = datetime(*timeTuple[0:3]);
+
+if __name__ == "__main__":
+ instance = STRIDECultureMicroConversion();
+ instance.main(sys.argv);
diff --git a/medinfo/dataconversion/STRIDEDemographicsConversion.py b/medinfo/dataconversion/STRIDEDemographicsConversion.py
index 5ceb7040..9a410a27 100644
--- a/medinfo/dataconversion/STRIDEDemographicsConversion.py
+++ b/medinfo/dataconversion/STRIDEDemographicsConversion.py
@@ -5,13 +5,11 @@
from optparse import OptionParser
from medinfo.common.Util import stdOpen, ProgressDots;
from medinfo.db import DBUtil;
-from medinfo.db.DBUtil import DB_CONNECTOR_MODULE;
-IntegrityError = DB_CONNECTOR_MODULE.IntegrityError;
from medinfo.db.Model import SQLQuery;
from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList;
-from Util import log;
-from Env import DATE_FORMAT;
+from .Util import log;
+from .Env import DATE_FORMAT;
SOURCE_TABLE = "stride_patient";
@@ -21,45 +19,60 @@
{
None: "Unknown",
"": "Unknown",
+ "American Indian or Alaska Native": "Native American",
"AMERICAN INDIAN OR ALASKA NATIVE": "Native American",
"ASIAN - HISTORICAL CONV": "Asian",
+ "Asian": "Asian",
"ASIAN": "Asian",
"ASIAN, HISPANIC": "Asian",
+ "Asian, non-Hispanic": "Asian",
"ASIAN, NON-HISPANIC": "Asian",
+ "Black or African American": "Black",
"BLACK OR AFRICAN AMERICAN": "Black",
+ "Black, Hispanic": "Black",
"BLACK, HISPANIC": "Black",
+ "Black, non-Hispanic": "Black",
"BLACK, NON-HISPANIC": "Black",
"NATIVE AMERICAN, HISPANIC": "Native American",
+ "Native American, non-Hispanic": "Native American",
"NATIVE AMERICAN, NON-HISPANIC": "Native American",
+ "Native Hawaiian or Other Pacific Islander": "Pacific Islander",
"NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER": "Pacific Islander",
"NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER ": "Pacific Islander",
+ "Other": "Other",
"OTHER": "Other",
+ "Other, Hispanic": "Hispanic/Latino",
"OTHER, HISPANIC": "Hispanic/Latino",
+ "Other, non-Hispanic": "Other",
"OTHER, NON-HISPANIC": "Other",
+ "Pacific Islander, non-Hispanic": "Pacific Islander",
"PACIFIC ISLANDER, NON-HISPANIC": "Pacific Islander",
+ "Patient Refused": "Unknown",
"PATIENT REFUSED": "Unknown",
+ "Race and Ethnicity Unknown": "Unknown",
"RACE AND ETHNICITY UNKNOWN": "Unknown",
+ "Unknown": "Unknown",
"UNKNOWN": "Unknown",
+ "White": "White (%s)",
"WHITE": "White (%s)", # Subset by ethnicity Hispanic/Latino
+ "White, Hispanic": "White (Hispanic/Latino)",
"WHITE, HISPANIC": "White (Hispanic/Latino)",
+ "White, non-Hispanic": "White (Non-Hispanic/Latino)",
"WHITE, NON-HISPANIC": "White (Non-Hispanic/Latino)",
HISPANIC_LATINO_ETHNICITY: "Hispanic/Latino"
}
-
class STRIDEDemographicsConversion:
"""Data conversion module to take STRIDE provided patient demographics data
into the structured data tables to facilitate subsequent analysis.
-
- Capturing death date for now as an event. Should eventually incorporate
- patient age and gender into data, though less clear what item event date
- to assign to these to make them useful.
+
+ Capturing death date for now as an event.
"""
connFactory = None; # Allow specification of alternative DB connection source
-
+
categoryBySourceDescr = None; # Local cache to track the clinical item category table contents
clinicalItemByCategoryIdExtId = None; # Local cache to track clinical item table contents
-
+
def __init__(self):
"""Default constructor"""
self.connFactory = DBUtil.ConnectionFactory(); # Default connection source
@@ -71,7 +84,7 @@ def convertSourceItems(self, patientIds=None):
"""Primary run function to process the contents of the stride_patient
table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
Should look for redundancies to avoid repeating conversion.
-
+
patientIds - If provided, only process items for patient IDs matching those provided
"""
log.info("Conversion for patients: %s" % patientIds);
@@ -82,12 +95,12 @@ def convertSourceItems(self, patientIds=None):
self.convertSourceItem(sourceItem, conn=conn);
finally:
conn.close();
- progress.PrintStatus();
+ # progress.PrintStatus();
def querySourceItems(self, patientIds=None, progress=None, conn=None):
- """Query the database for list of all patient demographics
- and yield the results one at a time. If patientIds provided, only return items
+ """Query the database for list of all patient demographics
+ and yield the results one at a time. If patientIds provided, only return items
matching those IDs.
"""
extConn = conn is not None;
@@ -96,7 +109,7 @@ def querySourceItems(self, patientIds=None, progress=None, conn=None):
# Column headers to query for that map to respective fields in analysis table
headers = ["pat_id","birth_year","gender","death_date","race","ethnicity"];
-
+
query = SQLQuery();
for header in headers:
query.addSelect( header );
@@ -127,7 +140,7 @@ def querySourceItems(self, patientIds=None, progress=None, conn=None):
yield rowModel;
# Record another at resolution of decade
- decade = (rowModel["birth_year"] / 10) * 10;
+ decade = (rowModel["birth_year"] // 10) * 10;
rowModel["itemDate"] = datetime(rowModel["birth_year"],1,1);
rowModel["name"] = "Birth%ds" % decade;
rowModel["description"] = "Birth Decade %ds" % decade;
@@ -136,7 +149,7 @@ def querySourceItems(self, patientIds=None, progress=None, conn=None):
# Summarize race and ethnicity information into single field of interest
raceEthnicity = self.summarizeRaceEthnicity(rowModel);
rowModel["itemDate"] = datetime(rowModel["birth_year"],1,1);
- rowModel["name"] = "Race"+(raceEthnicity.translate(None," ()-/")); # Strip off punctuation
+ rowModel["name"] = "Race"+(raceEthnicity.translate(str.maketrans('', '', " ()-/"))) # Strip off punctuation
rowModel["description"] = "Race/Ethnicity: %s" % raceEthnicity;
yield rowModel;
@@ -150,8 +163,8 @@ def querySourceItems(self, patientIds=None, progress=None, conn=None):
rowModel["name"] = "Death";
rowModel["description"] = "Death Date";
rowModel["itemDate"] = rowModel["death_date"];
- yield rowModel;
-
+ yield rowModel;
+
row = cursor.fetchone();
progress.Update();
@@ -167,7 +180,7 @@ def summarizeRaceEthnicity(self, rowModel):
raceEthnicity = RACE_MAPPINGS[rowModel["race"]];
if raceEthnicity in UNSPECIFIED_RACE_ETHNICITY and rowModel["ethnicity"] == HISPANIC_LATINO_ETHNICITY:
raceEthnicity = RACE_MAPPINGS[HISPANIC_LATINO_ETHNICITY]; # Use Hispanic/Latino as basis if no other information
- if raceEthnicity.find("%s") >= 0: # Found replacement string. Look to ethnicity for more information
+ if raceEthnicity.find("%s") >= 0: # Found replacement string. Look to ethnicity for more information
if rowModel["ethnicity"] == HISPANIC_LATINO_ETHNICITY:
raceEthnicity = raceEthnicity % RACE_MAPPINGS[HISPANIC_LATINO_ETHNICITY];
else:
@@ -189,7 +202,7 @@ def convertSourceItem(self, sourceItem, conn=None):
categoryModel = self.categoryFromSourceItem(sourceItem, conn=conn);
clinicalItemModel = self.clinicalItemFromSourceItem(sourceItem, categoryModel, conn=conn);
patientItemModel = self.patientItemModelFromSourceItem(sourceItem, clinicalItemModel, conn=conn);
-
+
finally:
if not extConn:
conn.close();
@@ -209,7 +222,7 @@ def categoryFromSourceItem(self, sourceItem, conn):
category["clinical_item_category_id"] = categoryId;
self.categoryBySourceDescr[categoryKey] = category;
return self.categoryBySourceDescr[categoryKey];
-
+
def clinicalItemFromSourceItem(self, sourceItem, category, conn):
# Load or produce a clinical_item record model for the given sourceItem
clinicalItemKey = (category["clinical_item_category_id"], sourceItem["name"]);
@@ -218,7 +231,7 @@ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
clinicalItem = \
RowItemModel \
( { "clinical_item_category_id": category["clinical_item_category_id"],
- "external_id": None,
+ "external_id": None,
"name": sourceItem["name"],
"description": sourceItem["description"],
}
@@ -227,7 +240,7 @@ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
clinicalItem["clinical_item_id"] = clinicalItemId;
self.clinicalItemByCategoryIdExtId[clinicalItemKey] = clinicalItem;
return self.clinicalItemByCategoryIdExtId[clinicalItemKey];
-
+
def patientItemModelFromSourceItem(self, sourceItem, clinicalItem, conn):
# Produce a patient_item record model for the given sourceItem
patientItem = \
@@ -239,12 +252,12 @@ def patientItemModelFromSourceItem(self, sourceItem, clinicalItem, conn):
"item_date": sourceItem["itemDate"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item", patientItem.keys() );
- insertParams= patientItem.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()) );
+ insertParams= list(patientItem.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
log.info(err);
diff --git a/medinfo/dataconversion/STRIDEDxListConversion.py b/medinfo/dataconversion/STRIDEDxListConversion.py
index 57a559d9..a0c9e8de 100644
--- a/medinfo/dataconversion/STRIDEDxListConversion.py
+++ b/medinfo/dataconversion/STRIDEDxListConversion.py
@@ -8,46 +8,44 @@
from medinfo.db.Model import SQLQuery;
from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList;
-from medinfo.db.DBUtil import DB_CONNECTOR_MODULE;
-IntegrityError = DB_CONNECTOR_MODULE.IntegrityError;
-
-from Util import log;
-from Env import DATE_FORMAT;
+from .Util import log;
+from .Env import DATE_FORMAT;
SOURCE_TABLE = "stride_dx_list";
SUBCODE_DELIM = "."; # Delimiter for ICD9 codes to distinguish main categorization vs. detail descriptions
class STRIDEDxListConversion:
- """Data conversion module to take STRIDE provided diagnosis / problem list
+ """Data conversion module to take STRIDE provided diagnosis / problem list
data into the structured data tables to facilitate subsequent analysis.
-
+
Renormalizes denormalized data back out to order types (clinical_item_category),
orders (clinical_item), and individual elements (patient_item).
-
+
Only count for new diagnoses with "noted" dates attached. Historical problem
list items and encounter diagnoses without dates attached are unclear when or
where to assign dates.
"""
connFactory = None; # Allow specification of alternative DB connection source
-
+
categoryBySourceDescr = None; # Local cache to track the clinical item category table contents
clinicalItemByCategoryIdExtId = None; # Local cache to track clinical item table contents
-
+
icd9StrByCode = None; # Local cache to facilitate rapid lookups
-
+
def __init__(self):
"""Default constructor"""
self.connFactory = DBUtil.ConnectionFactory(); # Default connection source
self.categoryBySourceDescr = dict();
self.clinicalItemByCategoryIdExtId = dict();
- self.icd9StrByCode = None;
+ self.icd9_str_by_code = None
+ self.icd10_str_by_code = None
def convertSourceItems(self, startDate=None, endDate=None):
- """Primary run function to process the contents of the source table
+ """Primary run function to process the contents of the source table
and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
Should look for redundancies to avoid repeating conversion.
-
+
startDate - If provided, only return items whose noted_date is on or after that date.
endDate - If provided, only return items whose noted_date is before that date.
"""
@@ -63,32 +61,33 @@ def convertSourceItems(self, startDate=None, endDate=None):
def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=None):
- """Query the database for list of all source clinical items (diagnosed probelms in this case)
- and yield the results one at a time. If startDate provided, only return items
+ """Query the database for list of all source clinical items (diagnosed probelms in this case)
+ and yield the results one at a time. If startDate provided, only return items
whose noted_date is on or after that date.
"""
extConn = conn is not None;
if not extConn:
conn = self.connFactory.connection();
- # Facilitate rapid lookup of ICD9 codes
- if self.icd9StrByCode is None:
- self.prepareICD9Lookup(conn=conn);
+ # Facilitate rapid lookup of ICD9/ICD10 codes
+ if self.icd9_str_by_code is None:
+ self.prepare_icd9_lookup(conn=conn)
+ if self.icd10_str_by_code is None:
+ self.prepare_icd10_lookup(conn=conn)
# Column headers to query for that map to respective fields in analysis table
- headers = ["pat_id","pat_enc_csn_id","noted_date","resolved_date","dx_icd9_code","data_source"];
-
+ headers = ["pat_id","pat_enc_csn_id","noted_date","resolved_date","dx_icd9_code","dx_icd9_code_list","dx_icd10_code_list","data_source"];
+
query = SQLQuery();
for header in headers:
query.addSelect( header );
query.addFrom("stride_dx_list as dx");
query.addWhere("noted_date is not null"); # Only work with elements that have dates assigned for now
- query.addWhere("dx_icd9_code is not null"); # Can't process nullcodes
if startDate is not None:
query.addWhereOp("noted_date",">=", startDate);
if endDate is not None:
query.addWhereOp("noted_date","<", endDate);
-
+
# Query to get an estimate of how long the process will be
if progress is not None:
progress.total = DBUtil.execute(query.totalQuery(), conn=conn)[0][0];
@@ -99,29 +98,83 @@ def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=Non
row = cursor.fetchone();
while row is not None:
- rowModel = RowItemModel( row, headers );
-
- # Lookup ICD9 string, otherwise default to ICD9 code
- rowModel["icd9_str"] = rowModel["dx_icd9_code"];
- if rowModel["dx_icd9_code"] in self.icd9StrByCode:
- rowModel["icd9_str"] = self.icd9StrByCode[rowModel["dx_icd9_code"]];
-
- yield rowModel; # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
-
- origCode = rowModel["dx_icd9_code"];
- if SUBCODE_DELIM in origCode:
- # Insert copies of item for parent node codes to aggregate component diagnoses into general categories
- while rowModel["dx_icd9_code"][-1] != SUBCODE_DELIM:
- rowModel["dx_icd9_code"] = rowModel["dx_icd9_code"][:-1]; # Truncate off one trailing digit
- if rowModel["dx_icd9_code"] in self.icd9StrByCode:
- rowModel["icd9_str"] = self.icd9StrByCode[rowModel["dx_icd9_code"]];
- yield rowModel; # Found a matching parent code, so yield this version
- # One more cycle to get parent node with no subcode delimiter at all
- rowModel["dx_icd9_code"] = rowModel["dx_icd9_code"][:-1]; # Truncate off SUBCODE_DELIM
- if rowModel["dx_icd9_code"] in self.icd9StrByCode:
- rowModel["icd9_str"] = self.icd9StrByCode[rowModel["dx_icd9_code"]];
- yield rowModel; # Found a matching parent code, so yield this version
-
+ row_model = RowItemModel( row, headers );
+
+ # 2014-2017 data does not have dx_icd9_code. Instead, has
+ # both dx_icd9_code_list and dx_icd10_code_list. For these items,
+ # there is a one:many mapping of source item to converted item.
+ # Collect icd10 codes.
+ icd10_codes = set()
+ if row_model['dx_icd10_code_list'] not in ['', None]:
+ codes = row_model['dx_icd10_code_list'].split(',')
+ for code in codes:
+ icd10_codes.add(code)
+ # Collect icd9 codes.
+ icd9_codes = set()
+ if row_model['dx_icd9_code'] not in ['', None]:
+ icd9_codes.add(row_model['dx_icd9_code'])
+ else:
+ if row_model['dx_icd9_code_list'] not in ['', None]:
+ codes = row_model['dx_icd9_code_list'].split(',')
+ for code in codes:
+ icd9_codes.add(code)
+
+ # If there are no ICD codes, skip to next row.
+ if len(icd9_codes) == 0 and len(icd10_codes) == 0:
+ row = cursor.fetchone()
+ continue
+
+ # Process ICD codes.
+ # Build a temporary dictionary so that a single loop can take care
+ # of both ICD9 and ICD10 without mixing the data.
+ icd_versions = {
+ 'ICD9': {
+ 'codes': icd9_codes,
+ 'lookup': self.icd9_str_by_code
+ },
+ 'ICD10': {
+ 'codes': icd10_codes,
+ 'lookup': self.icd10_str_by_code
+ }
+ }
+
+ for version, info in icd_versions.items():
+ icd_codes = info['codes']
+ icd_lookup = info['lookup']
+
+ for icd_code in icd_codes:
+ # Look up string. Otherwise default to ICD code.
+ row_model['icd_str'] = icd_code
+ if icd_code in icd_lookup:
+ row_model['icd_str'] = icd_lookup[icd_code]
+ row_model['dx_icd_code'] = version + '.' + icd_code
+
+ # Yield one row worth of data at a time to avoid having to keep
+ # the whole result set in memory.
+ yield row_model
+
+ orig_code = icd_code
+ if SUBCODE_DELIM in orig_code:
+ # Insert copies of item for parent node codes to aggregate
+ # component diagnoses into general categories.
+ while icd_code[-1] != SUBCODE_DELIM:
+ icd_code = icd_code[:-1] # Truncate trailing digit
+ if icd_code in icd_lookup:
+ # Found a a matching parent code, so yield this
+ # version.
+ row_model['icd_str'] = icd_lookup[icd_code]
+ row_model['dx_icd_code'] = version + '.' + icd_code
+ yield row_model
+
+ # One more cycle to get parent node with no subcode
+ # delimiter at all.
+ icd_code = icd_code[:-1] # Truncate off SUBCODE_DELIM
+ if icd_code in icd_lookup:
+ row_model['icd_str'] = icd_lookup[icd_code]
+ row_model['dx_icd_code'] = version + '.' + icd_code
+
+ yield row_model
+
row = cursor.fetchone();
progress.Update();
@@ -145,9 +198,9 @@ def convertSourceItem(self, sourceItem, conn=None):
# Relatively small / finite number of categories and clinical_items, so these should only have to be instantiated
# in a first past, with subsequent calls just yielding back in memory cached copies
categoryModel = self.categoryFromSourceItem(sourceItem, conn=conn);
- clinicalItemModel = self.clinicalItemFromSourceItem(sourceItem, categoryModel, conn=conn);
- patientItemModel = self.patientItemModelFromSourceItem(sourceItem, clinicalItemModel, conn=conn);
-
+ clinicalItem = self.clinicalItemFromSourceItem(sourceItem, categoryModel, conn=conn);
+ patientItem = self.patientItemModelFromSourceItem(sourceItem, clinicalItem, conn=conn);
+
finally:
if not extConn:
conn.close();
@@ -168,25 +221,26 @@ def categoryFromSourceItem(self, sourceItem, conn):
category["clinical_item_category_id"] = categoryId;
self.categoryBySourceDescr[categoryKey] = category;
return self.categoryBySourceDescr[categoryKey];
-
+
def clinicalItemFromSourceItem(self, sourceItem, category, conn):
# Load or produce a clinical_item record model for the given sourceItem
- clinicalItemKey = (category["clinical_item_category_id"], sourceItem["dx_icd9_code"]);
+ clinicalItemKey = (category["clinical_item_category_id"], sourceItem['dx_icd_code']);
+
if clinicalItemKey not in self.clinicalItemByCategoryIdExtId:
# Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
clinicalItem = \
RowItemModel \
( { "clinical_item_category_id": category["clinical_item_category_id"],
- "external_id": None,
- "name": "ICD9.%(dx_icd9_code)s" % sourceItem,
- "description": "%(icd9_str)s" % sourceItem,
+ "external_id": None,
+ "name": "%s" % sourceItem['dx_icd_code'],
+ "description": "%(icd_str)s" % sourceItem,
}
);
(clinicalItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", clinicalItem, conn=conn);
clinicalItem["clinical_item_id"] = clinicalItemId;
self.clinicalItemByCategoryIdExtId[clinicalItemKey] = clinicalItem;
- return self.clinicalItemByCategoryIdExtId[clinicalItemKey];
-
+ return self.clinicalItemByCategoryIdExtId[clinicalItemKey]
+
def patientItemModelFromSourceItem(self, sourceItem, clinicalItem, conn):
# Produce a patient_item record model for the given sourceItem
patientItem = \
@@ -198,24 +252,40 @@ def patientItemModelFromSourceItem(self, sourceItem, clinicalItem, conn):
"item_date": sourceItem["noted_date"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item", patientItem.keys() );
- insertParams= patientItem.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()) );
+ insertParams= list(patientItem.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
log.info(err);
pass;
- def prepareICD9Lookup(self,conn):
- """One big query for ICD9 lookup table at one time so don't have to keep repeating
+ def prepare_icd9_lookup(self, conn):
"""
- self.icd9StrByCode = dict();
- results = DBUtil.execute("select code, str from stride_icd9_cm where tty in ('HT','PT')", conn=conn);
+ One big query for ICD9 lookup table at one time so don't have to keep
+ repeating.
+ """
+ query = "SELECT code, str FROM stride_icd9_cm WHERE tty IN ('HT','PT')"
+ results = DBUtil.execute(query, conn=conn)
+
+ self.icd9_str_by_code = dict()
+ for (code, str) in results:
+ self.icd9_str_by_code[code] = str
+
+ def prepare_icd10_lookup(self, conn):
+ """
+ One big query for ICD10 lookup table at one time so don't have to keep
+ repeating.
+ """
+ query = "SELECT icd10_code, full_description FROM stride_icd10_cm"
+ results = DBUtil.execute(query, conn=conn)
+
+ self.icd10_str_by_code = dict()
for (code, str) in results:
- self.icd9StrByCode[code] = str;
-
+ self.icd10_str_by_code[code] = str
+
def main(self, argv):
"""Main method, callable from command line"""
usageStr = "usage: %prog [options]\n"
diff --git a/medinfo/dataconversion/STRIDEOrderMedConversion.py b/medinfo/dataconversion/STRIDEOrderMedConversion.py
index e6f4671e..2ecff928 100644
--- a/medinfo/dataconversion/STRIDEOrderMedConversion.py
+++ b/medinfo/dataconversion/STRIDEOrderMedConversion.py
@@ -1,19 +1,19 @@
#!/usr/bin/env python
import sys, os
+import hashlib
import time;
from datetime import datetime;
+from operator import itemgetter
from optparse import OptionParser
from medinfo.common.Util import stdOpen, ProgressDots;
from medinfo.db import DBUtil;
-from medinfo.db.DBUtil import DB_CONNECTOR_MODULE;
-IntegrityError = DB_CONNECTOR_MODULE.IntegrityError;
from medinfo.db.Model import SQLQuery;
from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList, RowItemFieldComparator;
-from Util import log;
-from Const import TEMPLATE_MEDICATION_ID, TEMPLATE_MEDICATION_PREFIX;
-from Const import COLLECTION_TYPE_ORDERSET;
-from Env import DATE_FORMAT;
+from .Util import log;
+from .Const import TEMPLATE_MEDICATION_ID, TEMPLATE_MEDICATION_PREFIX;
+from .Const import COLLECTION_TYPE_ORDERSET;
+from .Env import DATE_FORMAT;
SOURCE_TABLE = "stride_order_med";
CATEGORY_TEMPLATE = "Med (%s)"; # For this data source, item category will be a Medication subscripted by medication route
@@ -24,18 +24,18 @@ class STRIDEOrderMedConversion:
"""Data conversion module to take STRIDE provided computerized physician order entry data
(medications specifically)
into the structured data analysis tables to facilitate subsequent analysis.
-
+
For combination medications (usually same medication but with "1.5x" dosing like
Metoprolol 75mg ordered as combination of 50mg + 25mg tabs), just record as the
first component in the mixture.
-
+
Ignore PRN orders for now to simplify data set and focus on standing orders.
"""
-
+
def __init__(self):
"""Default constructor"""
self.connFactory = DBUtil.ConnectionFactory(); # Default connection source, but Allow specification of alternative DB connection source
-
+
self.categoryBySourceDescr = dict(); # Local cache to track the clinical item category table contents
self.clinicalItemByCategoryIdCode = dict(); # Local cache to track clinical item table contents
self.itemCollectionByKeyStr = dict(); # Local cache to track item collections
@@ -45,7 +45,7 @@ def convertSourceItems(self, convOptions):
"""Primary run function to process the contents of the stride_order_med
table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
Should look for redundancies after the fact to catch repeatEd conversions.
-
+
startDate - If provided, only return items whose ordering_date is on or after that date.
endDate - If provided, only return items whose ordering_date is before that date.
"""
@@ -55,11 +55,11 @@ def convertSourceItems(self, convOptions):
try:
# Load up the medication mapping table to facilitate subsequent conversions
rxcuiDataByMedId = self.loadRXCUIData(conn=conn);
-
+
# Keep track of which order meds have already been converted based on mixture components (don't repeat for the aggregate order then)
# Can be a lot to store in local memory for large conversions, so may need to batch smaller sub-processes
convertedOrderMedIds = set();
-
+
# First round for medication combinations that must be extracted from order_medmixinfo table
for sourceItem in self.queryMixSourceItems(rxcuiDataByMedId, convOptions, progress=progress, conn=conn):
self.convertSourceItem(sourceItem, conn=conn);
@@ -71,7 +71,7 @@ def convertSourceItems(self, convOptions):
if sourceItem["order_med_id"] not in convertedOrderMedIds: # Don't repeat conversion if mixture components already addressed
self.convertSourceItem(sourceItem, conn=conn);
progress.Update();
-
+
finally:
conn.close();
progress.PrintStatus();
@@ -87,7 +87,7 @@ def loadRXCUIData(self, conn=None):
conn = self.connFactory.connection();
try:
rxcuiDataByMedId = dict();
-
+
query = \
"""select medication_id, rxcui, active_ingredient
from stride_mapped_meds
@@ -102,9 +102,9 @@ def loadRXCUIData(self, conn=None):
if medId not in rxcuiDataByMedId:
rxcuiDataByMedId[medId] = dict();
rxcuiDataByMedId[medId][rxcui] = ingredient;
-
+
row = cursor.fetchone();
-
+
return rxcuiDataByMedId;
finally:
@@ -112,8 +112,8 @@ def loadRXCUIData(self, conn=None):
conn.close();
def querySourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn=None):
- """Query the database for list of all source clinical items (medications, etc.)
- and yield the results one at a time. If startDate provided, only return items whose
+ """Query the database for list of all source clinical items (medications, etc.)
+ and yield the results one at a time. If startDate provided, only return items whose
ordering_date is on or after that date.
"""
extConn = conn is not None;
@@ -123,7 +123,7 @@ def querySourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn=No
# Column headers to query for that map to respective fields in analysis table
queryHeaders = ["med.order_med_id", "pat_id", "pat_enc_csn_id", "med.medication_id", "med.description", "ordering_date", "med_route","number_of_doses","protocol_id","protocol_name","section_name","smart_group"];
headers = ["order_med_id", "pat_id", "pat_enc_csn_id", "medication_id", "description", "ordering_date", "med_route","number_of_doses","protocol_id","protocol_name","section_name","smart_group"];
-
+
query = SQLQuery();
for header in queryHeaders:
query.addSelect( header );
@@ -158,8 +158,8 @@ def querySourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn=No
conn.close();
def queryMixSourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn=None):
- """Query the database for list of source clinical items (medications from mixes, etc.)
- and yield the results one at a time.
+ """Query the database for list of source clinical items (medications from mixes, etc.)
+ and yield the results one at a time.
"""
extConn = conn is not None;
if not extConn:
@@ -168,7 +168,7 @@ def queryMixSourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn
# Column headers to query for that map to respective fields in analysis table
queryHeaders = ["med.order_med_id", "med.pat_id", "med.pat_enc_csn_id", "mix.medication_id", "mix.medication_name", "mix.ingredient_type", "med.ordering_date", "med.med_route", "med.number_of_doses","protocol_id","protocol_name","section_name","smart_group"];
headers = ["order_med_id", "pat_id", "pat_enc_csn_id", "medication_id", "description", "ingredient_type", "ordering_date", "med_route", "number_of_doses","protocol_id","protocol_name","section_name","smart_group"];
-
+
query = SQLQuery();
for header in queryHeaders:
query.addSelect( header );
@@ -194,7 +194,7 @@ def queryMixSourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn
# Accumulate mixture components one item at a time
mixByOrderMedId = dict();
-
+
row = cursor.fetchone();
while row is not None:
rowModel = RowItemModel( row, headers );
@@ -221,7 +221,7 @@ def queryMixSourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn
def normalizeMixData(self, rxcuiDataByMedId, mixByOrderMedId, convOptions):
"""Look through the mixture components to compile a consolidated set of medication data
"""
- for orderMedId, mixList in mixByOrderMedId.iteritems():
+ for orderMedId, mixList in mixByOrderMedId.items():
mixSize = len(mixList);
ingredientIds = set();
@@ -255,7 +255,7 @@ def normalizeMixData(self, rxcuiDataByMedId, mixByOrderMedId, convOptions):
yield ingredientModel;
elif convOptions.maxMixtureCount is None or ingredientCount <= convOptions.maxMixtureCount:
# Composite into single denormalized item
- ingredientList.sort( RowItemFieldComparator("description") ); # Ensure stable sort order
+ ingredientList.sort(key=itemgetter("description")) # Ensure stable sort order
idStrList = list();
descriptionList = list();
@@ -264,10 +264,13 @@ def normalizeMixData(self, rxcuiDataByMedId, mixByOrderMedId, convOptions):
idStrList.append(str(medId));
descriptionList.append(ingredientModel["description"]);
idComposite = str.join(",", idStrList );
- descriptionComposite = str.join("-",descriptionList );
+ descriptionComposite = str.join("-",descriptionList );
# Build on last mix item's row model
- rowModel["medication_id"] = hash(tuple(idStrList)); # Arbitrary integer, hash to try to be unique
+ # Create arbitrary integer, hash to try to be unique
+ # https://stackoverflow.com/questions/16008670/python-how-to-hash-a-string-into-8-digits
+ number = int(hashlib.sha1(idComposite.encode()).hexdigest(), 16) % (10 ** 12)
+ rowModel["medication_id"] = number
rowModel["code"] = RXCUI_CODE_TEMPLATE % idComposite;
# Hard to trace back to Order_Med.medication_id from here, since working with Order_Med_MixInfo records
#rowModel["code"] = GENERIC_CODE_TEMPLATE % rowModel["medication_id"];
@@ -295,7 +298,7 @@ def normalizeMedIngredients(self, rxcuiDataByMedId, rowModel, convOptions):
Specifically, look for common active ingredients to simplify the data.
If the medication is actually a compound of multiple active ingredients,
then break out into active ingredients.
-
+
If normalizeMixtures set, then will yield out multiple items to reflect each active ingredient.
If normalizeMixtures not set, will yield a single item with name being a composite of the active ingredients.
"""
@@ -312,7 +315,11 @@ def normalizeMedIngredients(self, rxcuiDataByMedId, rowModel, convOptions):
ingredientByRxcui = rxcuiDataByMedId[medId];
if len(ingredientByRxcui) <= 1 or convOptions.normalizeMixtures:
# Single ingredient or want component active ingredients to each have one record
- for (rxcui, ingredient) in ingredientByRxcui.iteritems():
+ for (rxcui, ingredient) in ingredientByRxcui.items():
+ # ~250/15000 RxCUI's don't have a defined active ingredient.
+ if ingredient is None:
+ continue
+
normalizedModel = RowItemModel(rowModel);
normalizedModel["medication_id"] = rxcui;
normalizedModel["code"] = RXCUI_CODE_TEMPLATE % normalizedModel["medication_id"];
@@ -324,17 +331,20 @@ def normalizeMedIngredients(self, rxcuiDataByMedId, rowModel, convOptions):
else:
# Mixture of multiple ingredients and want to keep denormalized
# Extract out the active ingredient names to make a composite based only on that unique combination
- ingredientRxcuiList = [ (ingredient, rxcui) for (rxcui, ingredient) in ingredientByRxcui.iteritems()];
+ ingredientRxcuiList = [ (ingredient, rxcui) for (rxcui, ingredient) in ingredientByRxcui.items()];
ingredientRxcuiList.sort(); # Ensure consistent order
-
+
rxcuiStrList = list();
ingredientList = list();
for (ingredient, rxcui) in ingredientRxcuiList:
+ # ~250/15000 RxCUI's don't have a defined active ingredient.
+ if ingredient is None:
+ continue
rxcuiStrList.append(str(rxcui));
ingredientList.append(ingredient.title());
rxcuiComposite = str.join(",", rxcuiStrList );
- ingredientComposite = str.join("-",ingredientList );
-
+ ingredientComposite = str.join("-",ingredientList );
+
#rowModel["medication_id"] = hash(tuple(rxcuiList)); # Arbitrary integer, hash to try to be unique
#rowModel["code"] = RXCUI_CODE_TEMPLATE % rxcuiComposite;
# Nah, just stick to medication_id instead of creating a new hash number
@@ -343,7 +353,7 @@ def normalizeMedIngredients(self, rxcuiDataByMedId, rowModel, convOptions):
if convOptions.includeRouteInDescription:
rowModel["description"] += " (%s)" % (rowModel["med_route"]);
yield rowModel;
-
+
def convertSourceItem(self, sourceItem, conn=None):
"""Given an individual sourceItem record, produce / convert it into an equivalent
@@ -365,7 +375,7 @@ def convertSourceItem(self, sourceItem, conn=None):
itemCollection = self.itemCollectionFromSourceItem(sourceItem, conn=conn);
itemCollectionItem = self.itemCollectionItemFromSourceItem(sourceItem, itemCollection, clinicalItem, conn=conn);
patientItemCollectionLink = self.patientItemCollectionLinkFromSourceItem(sourceItem, itemCollectionItem, patientItem, conn=conn);
-
+
finally:
if not extConn:
conn.close();
@@ -389,7 +399,7 @@ def categoryFromSourceItem(self, sourceItem, conn):
category["clinical_item_category_id"] = categoryId;
self.categoryBySourceDescr[categoryKey] = category;
return self.categoryBySourceDescr[categoryKey];
-
+
def clinicalItemFromSourceItem(self, sourceItem, category, conn):
# Load or produce a clinical_item record model for the given sourceItem
clinicalItemKey = (category["clinical_item_category_id"], sourceItem["code"]);
@@ -407,17 +417,17 @@ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
clinicalItem["clinical_item_id"] = clinicalItemId;
self.clinicalItemByCategoryIdCode[clinicalItemKey] = clinicalItem;
else:
- # Clinical Item does exist, but check for redundancies and opportunities to
+ # Clinical Item does exist, but check for redundancies and opportunities to
# simplify different descriptions for the same medication
priorClinicalItem = self.clinicalItemByCategoryIdCode[clinicalItemKey];
priorDescription = priorClinicalItem["description"];
if sourceItem["description"] < priorDescription or priorDescription.startswith(TEMPLATE_MEDICATION_PREFIX):
- # Prior medication recorded description either a generic template,
+ # Prior medication recorded description either a generic template,
# or a longer version than necessary, that can be replaced with the current one
priorClinicalItem["description"] = sourceItem["description"];
DBUtil.updateRow("clinical_item", priorClinicalItem, priorClinicalItem["clinical_item_id"], conn=conn);
return self.clinicalItemByCategoryIdCode[clinicalItemKey];
-
+
def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
# Produce a patient_item record model for the given sourceItem
patientItem = \
@@ -429,13 +439,13 @@ def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
"item_date": sourceItem["ordering_date"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item", patientItem.keys() );
- insertParams= patientItem.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()) );
+ insertParams= list(patientItem.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
patientItem["patient_item_id"] = DBUtil.execute( DBUtil.identityQuery("patient_item"), conn=conn )[0][0];
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, pull out existint ID and continue to insert whatever else is possible
log.info(err); # Lookup just by the composite key components to avoid attempting duplicate insertion again
searchPatientItem = \
@@ -470,7 +480,7 @@ def itemCollectionFromSourceItem(self, sourceItem, conn):
collection["item_collection_id"] = collectionId;
self.itemCollectionByKeyStr[collectionKey] = collection;
return self.itemCollectionByKeyStr[collectionKey];
-
+
def itemCollectionItemFromSourceItem(self, sourceItem, itemCollection, clinicalItem, conn):
# Load or produce an item_collection_item record model for the given sourceItem
itemKey = (itemCollection["item_collection_id"], clinicalItem["clinical_item_id"]);
@@ -487,7 +497,7 @@ def itemCollectionItemFromSourceItem(self, sourceItem, itemCollection, clinicalI
collectionItem["item_collection_item_id"] = collectionItemId;
self.itemCollectionItemByCollectionIdItemId[itemKey] = collectionItem;
return self.itemCollectionItemByCollectionIdItemId[itemKey];
-
+
def patientItemCollectionLinkFromSourceItem(self, sourceItem, collectionItem, patientItem, conn):
# Produce a patient_item_collection_link record model for the given sourceItem
patientItemCollectionLink = \
@@ -496,12 +506,12 @@ def patientItemCollectionLinkFromSourceItem(self, sourceItem, collectionItem, pa
"item_collection_item_id": collectionItem["item_collection_item_id"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item_collection_link", patientItemCollectionLink.keys() );
- insertParams= patientItemCollectionLink.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item_collection_link", list(patientItemCollectionLink.keys()) );
+ insertParams= list(patientItemCollectionLink.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
log.info(err);
@@ -514,7 +524,7 @@ def main(self, argv):
parser.add_option("-e", "--endDate", dest="endDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time before this date.");
parser.add_option("-n", "--normalizeMixtures", dest="normalizeMixtures", action="store_true", help="If set, when find medication mixtures, will unravel / normalize into separate entries, one for each ingredient");
parser.add_option("-m", "--maxMixtureCount", dest="maxMixtureCount", help="If not normalizing mixtures, then this is the maximum number of mixture components will itemize for a mixture. If more than this, just use the summary label.");
- parser.add_option("-d", "--doseCountLimit", dest="doseCountLimit", help="Medication orders with a finite number of doses specified less than this limit will be labeled as different items than those without a number specified, or whose number is >= to this limit.");
+ parser.add_option("-d", "--doseCountLimit", dest="doseCountLimit", help="Medication orders with a finite number of doses specified less than this limit will be labeled as different items than those without a number specified, or whose number is >= to this limit. Intended to distinguish things like IV single bolus / use vs. continuous infusions and standing medication orders");
(options, args) = parser.parse_args(argv[1:])
log.info("Starting: "+str.join(" ", argv))
@@ -522,7 +532,7 @@ def main(self, argv):
convOptions = ConversionOptions();
convOptions.extractParserOptions(options);
-
+
self.convertSourceItems(convOptions);
timer = time.time() - timer;
@@ -548,10 +558,10 @@ def extractParserOptions(self, options):
# Parse out the end date parameter
timeTuple = time.strptime(options.endDate, DATE_FORMAT);
self.endDate = datetime(*timeTuple[0:3]);
-
+
if options.maxMixtureCount is not None:
self.maxMixtureCount = int(options.maxMixtureCount);
-
+
if options.doseCountLimit is not None:
self.doseCountLimit = int(options.doseCountLimit);
diff --git a/medinfo/dataconversion/STRIDEOrderProcConversion.py b/medinfo/dataconversion/STRIDEOrderProcConversion.py
index 9698a70a..b2dec4ce 100644
--- a/medinfo/dataconversion/STRIDEOrderProcConversion.py
+++ b/medinfo/dataconversion/STRIDEOrderProcConversion.py
@@ -5,33 +5,43 @@
from optparse import OptionParser
from medinfo.common.Util import stdOpen, ProgressDots;
from medinfo.db import DBUtil;
-from medinfo.db.DBUtil import DB_CONNECTOR_MODULE;
-IntegrityError = DB_CONNECTOR_MODULE.IntegrityError;
from medinfo.db.Model import SQLQuery;
from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList;
-from Util import log;
-from Env import DATE_FORMAT;
-from Const import COLLECTION_TYPE_ORDERSET;
+from .Util import log;
+from .Env import DATE_FORMAT;
+from .Const import COLLECTION_TYPE_ORDERSET;
SOURCE_TABLE = "stride_order_proc";
class STRIDEOrderProcConversion:
"""Data conversion module to take STRIDE provided computerized physician order entry data
into the structured data analysis tables to facilitate subsequent analysis.
-
+
Renormalizes denormalized data back out to order types (clinical_item_category),
orders (clinical_item), and actual individual patient orders (patient_item).
Ignores records with instantiated_time not null, so will only be interested
in originally ordered parent orders, not spawned child orders.
- Consider Ignore PRN orders for now to simplify data set and focus on standing orders
+ Consider Ignore PRN orders for now to simplify data set and focus on standing orders
(but a small minority for these orders anyway)
+
+ Beware of usage of this module and how it accounts for new unique clinical_items (probably applies to all the conversion scripts)
+ # This should be what determines a new unique clinical_item.
+ # Some debate about whether to distinguish by proc_id or proc_code, but there are many labs and other procs
+ # that use different proc_ids even though they are obviously the same. Go link in STRIDE_ORDER_PROC for examples like LABA1C.
+ # The self.clinicalItemByCategoryIdExtId is supposed to keep track of which clinical_items we're already aware of,
+ # but not that it starts blank when this module runs.
+ # So you in theory should only run this conversion process on a database once
+ # (otherwise it will not be aware that a bunch of duplicate clinical_items already exist in the database).
+ # Alternatively, this module should be updated, so that it initializes this key tracker with whatever is already in the database.
+
+
"""
def __init__(self):
"""Default constructor"""
self.connFactory = DBUtil.ConnectionFactory(); # Default connection source, but Allow specification of alternative DB connection source
-
+
self.categoryBySourceDescr = dict(); # Local cache to track the clinical item category table contents
self.clinicalItemByCategoryIdExtId = dict(); # Local cache to track clinical item table contents
self.itemCollectionByKeyStr = dict(); # Local cache to track item collections
@@ -41,7 +51,7 @@ def convertSourceItems(self, startDate=None, endDate=None):
"""Primary run function to process the contents of the stride_order_proc
table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
Should look for redundancies to avoid repeating conversion.
-
+
startDate - If provided, only return items whose ordering_date is on or after that date.
endDate - If provided, only return items whose ordering_date is before that date.
"""
@@ -58,7 +68,7 @@ def convertSourceItems(self, startDate=None, endDate=None):
def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=None):
- """Query the database for list of all source clinical items (orders, etc.)
+ """Query the database for list of all source clinical items (orders, etc.)
and yield the results one at a time. If startDate provided, only return items whose order_time is on or after that date.
Ignore entries with instantiated_time not null, as those represent child orders spawned from an original order,
whereas we are more interested in the decision making to enter the original order.
@@ -70,7 +80,7 @@ def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=Non
# Column headers to query for that map to respective fields in analysis table
queryHeaders = ["op.order_proc_id", "pat_id", "pat_enc_csn_id", "op.order_type", "op.proc_id", "op.proc_code", "description", "order_time","protocol_id","protocol_name","section_name","smart_group"];
headers = ["order_proc_id", "pat_id", "pat_enc_csn_id", "order_type", "proc_id", "proc_code", "description", "order_time","protocol_id","protocol_name","section_name","smart_group"];
-
+
query = SQLQuery();
for header in queryHeaders:
query.addSelect( header );
@@ -119,7 +129,7 @@ def convertSourceItem(self, sourceItem, conn=None):
category = self.categoryFromSourceItem(sourceItem, conn=conn);
clinicalItem = self.clinicalItemFromSourceItem(sourceItem, category, conn=conn);
patientItem = self.patientItemFromSourceItem(sourceItem, clinicalItem, conn=conn);
-
+
if sourceItem["protocol_id"] is not None:
# Similarly build up item collection (order set) hierarchy and link
itemCollection = self.itemCollectionFromSourceItem(sourceItem, conn=conn);
@@ -145,10 +155,18 @@ def categoryFromSourceItem(self, sourceItem, conn):
category["clinical_item_category_id"] = categoryId;
self.categoryBySourceDescr[categoryKey] = category;
return self.categoryBySourceDescr[categoryKey];
-
+
def clinicalItemFromSourceItem(self, sourceItem, category, conn):
# Load or produce a clinical_item record model for the given sourceItem
- clinicalItemKey = (category["clinical_item_category_id"], sourceItem["proc_id"]);
+ clinicalItemKey = (category["clinical_item_category_id"], sourceItem["proc_code"]);
+ # This should be what determines a new unique clinical_item.
+ # Some debate about whether to distinguish by proc_id or proc_code, but there are many labs and other procs
+ # that use different proc_ids even though they are obviously the same. Go link in STRIDE_ORDER_PROC for examples like LABA1C.
+ # The self.clinicalItemByCategoryIdExtId is supposed to keep track of which clinical_items we're already aware of,
+ # but not that it starts blank when this module runs.
+ # So you in theory should only run this conversion process on a database once
+ # (otherwise it will not be aware that a bunch of duplicate clinical_items already exist in the database).
+ # Alternatively, this module should be updated, so that it initializes this key tracker with whatever is already in the database.
if clinicalItemKey not in self.clinicalItemByCategoryIdExtId:
# Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
clinicalItem = \
@@ -163,7 +181,7 @@ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
clinicalItem["clinical_item_id"] = clinicalItemId;
self.clinicalItemByCategoryIdExtId[clinicalItemKey] = clinicalItem;
return self.clinicalItemByCategoryIdExtId[clinicalItemKey];
-
+
def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
# Produce a patient_item record model for the given sourceItem
patientItem = \
@@ -175,15 +193,15 @@ def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
"item_date": sourceItem["order_time"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item", patientItem.keys() );
- insertParams= patientItem.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()) );
+ insertParams= list(patientItem.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
patientItem["patient_item_id"] = DBUtil.execute( DBUtil.identityQuery("patient_item"), conn=conn )[0][0];
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, pull out existint ID and continue to insert whatever else is possible
- log.info(err); # Lookup just by the composite key components to avoid attempting duplicate insertion again
+ log.info(err); # Lookup just by the composite key components to avoid attempting duplicate insertion again
searchPatientItem = \
{ "patient_id": patientItem["patient_id"],
"clinical_item_id": patientItem["clinical_item_id"],
@@ -216,7 +234,7 @@ def itemCollectionFromSourceItem(self, sourceItem, conn):
collection["item_collection_id"] = collectionId;
self.itemCollectionByKeyStr[collectionKey] = collection;
return self.itemCollectionByKeyStr[collectionKey];
-
+
def itemCollectionItemFromSourceItem(self, sourceItem, itemCollection, clinicalItem, conn):
# Load or produce an item_collection_item record model for the given sourceItem
itemKey = (itemCollection["item_collection_id"], clinicalItem["clinical_item_id"]);
@@ -233,7 +251,7 @@ def itemCollectionItemFromSourceItem(self, sourceItem, itemCollection, clinicalI
collectionItem["item_collection_item_id"] = collectionItemId;
self.itemCollectionItemByCollectionIdItemId[itemKey] = collectionItem;
return self.itemCollectionItemByCollectionIdItemId[itemKey];
-
+
def patientItemCollectionLinkFromSourceItem(self, sourceItem, collectionItem, patientItem, conn):
# Produce a patient_item_collection_link record model for the given sourceItem
patientItemCollectionLink = \
@@ -242,19 +260,20 @@ def patientItemCollectionLinkFromSourceItem(self, sourceItem, collectionItem, pa
"item_collection_item_id": collectionItem["item_collection_item_id"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item_collection_link", patientItemCollectionLink.keys() );
- insertParams= patientItemCollectionLink.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item_collection_link", list(patientItemCollectionLink.keys()) );
+ insertParams= list(patientItemCollectionLink.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
log.info(err);
def main(self, argv):
"""Main method, callable from command line"""
- usageStr = "usage: %prog [options]\n"
+ usageStr = "usage: %prog [options]\n"+\
+ "Beware that this module is intended to be run only ONCE ever on a database. Currently will end up with duplicate clinical item keys if you try to run it in parallel or even serially."
parser = OptionParser(usage=usageStr)
parser.add_option("-s", "--startDate", dest="startDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time on or after this date.");
parser.add_option("-e", "--endDate", dest="endDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time before this date.");
diff --git a/medinfo/dataconversion/STRIDEOrderResultsConversion.py b/medinfo/dataconversion/STRIDEOrderResultsConversion.py
index 73031881..d19c619a 100644
--- a/medinfo/dataconversion/STRIDEOrderResultsConversion.py
+++ b/medinfo/dataconversion/STRIDEOrderResultsConversion.py
@@ -6,23 +6,21 @@
from optparse import OptionParser
from medinfo.common.Util import stdOpen, ProgressDots;
from medinfo.db import DBUtil;
-from medinfo.db.DBUtil import DB_CONNECTOR_MODULE;
-IntegrityError = DB_CONNECTOR_MODULE.IntegrityError;
from medinfo.db.Model import SQLQuery;
from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList;
-from Util import log;
-from Env import DATE_FORMAT;
+from .Util import log;
+from .Env import DATE_FORMAT;
-from Const import SENTINEL_RESULT_VALUE, Z_SCORE_LIMIT;
-from Const import FLAG_IN_RANGE, FLAG_HIGH, FLAG_LOW, FLAG_RESULT, FLAG_ABNORMAL;
+from .Const import SENTINEL_RESULT_VALUE, Z_SCORE_LIMIT;
+from .Const import FLAG_IN_RANGE, FLAG_HIGH, FLAG_LOW, FLAG_RESULT, FLAG_ABNORMAL;
SOURCE_TABLE = "stride_order_results";
class STRIDEOrderResultsConversion:
"""Data conversion module to take STRIDE provided (lab) results data
into the structured data tables to facilitate subsequent analysis.
-
+
Renormalizes denormalized data back out to order types (clinical_item_category),
orders (clinical_item), and actual individual (lab) results (patient_item).
@@ -30,10 +28,10 @@ class STRIDEOrderResultsConversion:
for this result, then just record as a generic "Result" event.
"""
connFactory = None; # Allow specification of alternative DB connection source
-
+
categoryBySourceDescr = None; # Local cache to track the clinical item category table contents
clinicalItemByCategoryIdExtId = None; # Local cache to track clinical item table contents
-
+
def __init__(self):
"""Default constructor"""
self.connFactory = DBUtil.ConnectionFactory(); # Default connection source
@@ -46,7 +44,7 @@ def convertSourceItems(self, startDate=None, endDate=None):
"""Primary run function to process the contents of the stride_order_proc
table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
Should look for redundancies to avoid repeating conversion.
-
+
startDate - If provided, only return items whose ordering_date is on or after that date.
endDate - If provided, only return items whose ordering_date is before that date.
"""
@@ -63,8 +61,8 @@ def convertSourceItems(self, startDate=None, endDate=None):
def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=None):
- """Query the database for list of all source clinical items (lab results in this case)
- and yield the results one at a time. If startDate provided, only return items
+ """Query the database for list of all source clinical items (lab results in this case)
+ and yield the results one at a time. If startDate provided, only return items
whose result_time is on or after that date.
Only include results records where the result_flag is set to an informative value,
to focus only on abnormal lab results (including would be a ton more relatively uninformative
@@ -76,7 +74,7 @@ def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=Non
# Column headers to query for that map to respective fields in analysis table
headers = ["sor.order_proc_id", "pat_id", "pat_enc_csn_id", "order_type", "proc_id", "proc_code", "base_name", "component_name", "common_name", "ord_num_value", "result_flag", "result_in_range_yn", "sor.result_time"];
-
+
query = SQLQuery();
for header in headers:
query.addSelect( header );
@@ -88,7 +86,7 @@ def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=Non
query.addWhereOp("sor.result_time",">=", startDate);
if endDate is not None:
query.addWhereOp("sor.result_time","<", endDate);
-
+
# Query to get an estimate of how long the process will be
if progress is not None:
progress.total = DBUtil.execute(query.totalQuery(), conn=conn)[0][0];
@@ -101,11 +99,15 @@ def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=Non
while row is not None:
rowModel = RowItemModel( row, headers );
# Normalize qualified labels
- rowModel["order_proc_id"] = rowModel["sor.order_proc_id"];
- rowModel["result_time"] = rowModel["sor.result_time"];
-
+ rowModel["order_proc_id"] = rowModel["sor.order_proc_id"];
+ rowModel["result_time"] = rowModel["sor.result_time"];
+
+ if rowModel['base_name'] is None:
+ row = cursor.fetchone()
+ continue
+
self.populateResultFlag(rowModel,conn=conn);
-
+
yield rowModel; # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
row = cursor.fetchone();
@@ -133,6 +135,12 @@ def populateResultFlag(self, resultModel, conn=None):
# No specific result flag or (numerical) value provided. Just record that some result was generated at all
resultModel["result_flag"] = FLAG_RESULT;
return;
+ elif resultModel['base_name'] is None:
+ # With 2014-2017 data, there are fields with a null base_name.
+ # We can't build summary stats around this case, so just return
+ # FLAG_RESULT.
+ resultModel['result_flag'] = FLAG_RESULT
+ return
#else: # General case, no immediately available result flags
extConn = conn is not None;
@@ -144,11 +152,11 @@ def populateResultFlag(self, resultModel, conn=None):
dataTable = DBUtil.execute("select * from order_result_stat", includeColumnNames=True, conn=conn);
dataModels = modelListFromTable(dataTable);
self.resultStatsByBaseName = modelDictFromList(dataModels, "base_name");
-
+
if resultModel["base_name"] not in self.resultStatsByBaseName:
# Result stats not already in cache. Query from DB and store in cache for future use.
statModel = self.calculateResultStats( resultModel["base_name"], conn=conn );
-
+
# Store results back in cache to facilitate future lookups
self.resultStatsByBaseName[resultModel["base_name"]] = statModel;
DBUtil.insertRow("order_result_stat", statModel, conn=conn );
@@ -175,12 +183,12 @@ def populateResultFlag(self, resultModel, conn=None):
resultModel["result_flag"] = FLAG_HIGH;
else: # |zScore| < Z_SCORE_LIMIT
resultModel["result_flag"] = FLAG_IN_RANGE;
- except ValueError, exc:
+ except ValueError as exc:
# Math error, probably stdev = 0 or variance < 0, just treat as an unspecified result
resultModel["result_flag"] = FLAG_RESULT;
else: # No value distribution, just record as a non-specific result
resultModel["result_flag"] = FLAG_RESULT;
-
+
if not extConn:
conn.close();
@@ -202,7 +210,7 @@ def calculateResultStats(self, baseName, conn):
dataModels = modelListFromTable(dataTable);
statModel = dataModels[0]; # Assume that exactly 1 row item will exist
statModel["base_name"] = baseName;
-
+
return statModel;
def convertSourceItem(self, sourceItem, conn=None):
@@ -219,7 +227,7 @@ def convertSourceItem(self, sourceItem, conn=None):
categoryModel = self.categoryFromSourceItem(sourceItem, conn=conn);
clinicalItemModel = self.clinicalItemFromSourceItem(sourceItem, categoryModel, conn=conn);
patientItemModel = self.patientItemModelFromSourceItem(sourceItem, clinicalItemModel, conn=conn);
-
+
finally:
if not extConn:
conn.close();
@@ -240,7 +248,7 @@ def categoryFromSourceItem(self, sourceItem, conn):
category["clinical_item_category_id"] = categoryId;
self.categoryBySourceDescr[categoryKey] = category;
return self.categoryBySourceDescr[categoryKey];
-
+
def clinicalItemFromSourceItem(self, sourceItem, category, conn):
# Load or produce a clinical_item record model for the given sourceItem
# Make unique by lab component name, not by proc_id / panel, since interested in result, not which panel it came from
@@ -260,7 +268,7 @@ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
clinicalItem["clinical_item_id"] = clinicalItemId;
self.clinicalItemByCategoryIdExtId[clinicalItemKey] = clinicalItem;
return self.clinicalItemByCategoryIdExtId[clinicalItemKey];
-
+
def patientItemModelFromSourceItem(self, sourceItem, clinicalItem, conn):
# Produce a patient_item record model for the given sourceItem
patientItem = \
@@ -273,12 +281,12 @@ def patientItemModelFromSourceItem(self, sourceItem, clinicalItem, conn):
"num_value": sourceItem["ord_num_value"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item", patientItem.keys() );
- insertParams= patientItem.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()) );
+ insertParams= list(patientItem.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
log.info(err);
diff --git a/medinfo/dataconversion/STRIDEPreAdmitMedConversion.py b/medinfo/dataconversion/STRIDEPreAdmitMedConversion.py
deleted file mode 100644
index 23d561b6..00000000
--- a/medinfo/dataconversion/STRIDEPreAdmitMedConversion.py
+++ /dev/null
@@ -1,339 +0,0 @@
-#!/usr/bin/env python
-import sys, os
-import time;
-from datetime import datetime;
-from optparse import OptionParser
-from medinfo.common.Util import stdOpen, ProgressDots;
-from medinfo.db import DBUtil;
-from medinfo.db.DBUtil import DB_CONNECTOR_MODULE;
-IntegrityError = DB_CONNECTOR_MODULE.IntegrityError;
-from medinfo.db.Model import SQLQuery;
-from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList, RowItemFieldComparator;
-
-from Util import log;
-from Const import TEMPLATE_MEDICATION_ID, TEMPLATE_MEDICATION_PREFIX;
-from Const import COLLECTION_TYPE_ORDERSET;
-from Env import DATE_FORMAT;
-
-SOURCE_TABLE = "stride_preadmit_med";
-CATEGORY_TEMPLATE = "Preadmit Med"; # For this data source, item category will be a Preadmission Medication
-GENERIC_CODE_TEMPLATE = "MED%s"; # Template for generic medication code reference if detailed RXCUI values not available
-RXCUI_CODE_TEMPLATE = "RXCUI%s"; # Template for medication code references when detailed RXCUI values available
-
-class STRIDEPreAdmitMedConversion:
- """Data conversion module to take STRIDE data
- into the structured data analysis tables to facilitate subsequent analysis.
- """
-
- def __init__(self):
- """Default constructor"""
- self.connFactory = DBUtil.ConnectionFactory(); # Default connection source, but Allow specification of alternative DB connection source
-
- self.categoryBySourceDescr = dict(); # Local cache to track the clinical item category table contents
- self.clinicalItemByCategoryIdCode = dict(); # Local cache to track clinical item table contents
-
- def convertSourceItems(self, convOptions):
- """Primary run function to process the contents of the raw source
- table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
- Should look for redundancies after the fact to catch repeated conversions.
-
- startDate - If provided, only return items whose ordering_date is on or after that date.
- endDate - If provided, only return items whose ordering_date is before that date.
- """
- log.info("Conversion for items dated %s to %s" % (convOptions.startDate, convOptions.endDate));
- progress = ProgressDots();
- conn = self.connFactory.connection();
- try:
- # Load up the medication mapping table to facilitate subsequent conversions
- rxcuiDataByMedId = self.loadRXCUIData(conn=conn);
-
- # Next round for medications directly from order_med table not addressed in medmix
- for sourceItem in self.querySourceItems(rxcuiDataByMedId, convOptions, progress=progress, conn=conn):
- self.convertSourceItem(sourceItem, conn=conn);
- progress.Update();
-
- finally:
- conn.close();
- progress.PrintStatus();
-
-
- def loadRXCUIData(self, conn=None):
- """Load up the full contents of the stride_mapped_meds table into
- memory (only a few thousand records) to facilitate rapid lookup resolution
- of common medication ingredient data.
- """
- extConn = conn is not None;
- if not extConn:
- conn = self.connFactory.connection();
- try:
- rxcuiDataByMedId = dict();
-
- query = \
- """select medication_id, rxcui, active_ingredient, thera_class
- from stride_mapped_meds
- """;
-
- cursor = conn.cursor();
- cursor.execute( query );
-
- row = cursor.fetchone();
- while row is not None:
- (medId, rxcui, ingredient, theraClass) = row; # Unpack the data tuple
- if medId not in rxcuiDataByMedId:
- rxcuiDataByMedId[medId] = dict();
- rxcuiDataByMedId[medId][rxcui] = (ingredient, theraClass);
-
- row = cursor.fetchone();
-
- return rxcuiDataByMedId;
-
- finally:
- if not extConn:
- conn.close();
-
- def querySourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn=None):
- """Query the database for list of all source clinical items (medications, etc.)
- and yield the results one at a time. If startDate provided, only return items whose
- occurence date is on or after that date.
- """
- extConn = conn is not None;
- if not extConn:
- conn = self.connFactory.connection();
-
- # Column headers to query for that map to respective fields in analysis table
- headers = ["stride_preadmit_med_id","pat_anon_id","contact_date","medication_id","description","thera_class","pharm_class","pharm_subclass"];
-
- query = SQLQuery();
- for header in headers:
- query.addSelect( header );
- query.addFrom("stride_preadmit_med");
- if convOptions.startDate is not None:
- query.addWhereOp("contact_date",">=", convOptions.startDate);
- if convOptions.endDate is not None:
- query.addWhereOp("contact_date","<", convOptions.endDate);
-
- # Query to get an estimate of how long the process will be
- if progress is not None:
- progress.total = DBUtil.execute(query.totalQuery(), conn=conn)[0][0];
-
- cursor = conn.cursor();
- # Do one massive query, but yield data for one item at a time.
- cursor.execute( str(query), tuple(query.params) );
-
- row = cursor.fetchone();
- while row is not None:
- rowModel = RowItemModel( row, headers );
- for normalizedModel in self.normalizeMedIngredients(rxcuiDataByMedId, rowModel, convOptions, conn=conn):
- yield normalizedModel; # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
- row = cursor.fetchone();
-
- # Slight risk here. Normally DB connection closing should be in finally of a try block,
- # but using the "yield" generator construct forbids us from using a try, finally construct.
- cursor.close();
-
- if not extConn:
- conn.close();
-
- def normalizeMedIngredients(self, rxcuiDataByMedId, rowModel, convOptions, conn=None):
- """Given a rowModel of medication data, normalize it further.
- Specifically, look for common active ingredients to simplify the data.
- If the medication is actually a compound of multiple active ingredients,
- then break out into active ingredients.
-
- If normalizeMixtures set, then will yield out multiple items to reflect each active ingredient.
- If normalizeMixtures not set, will yield a single item with name being a composite of the active ingredients.
- """
- extConn = conn is not None;
- if not extConn:
- conn = self.connFactory.connection();
-
- medId = rowModel["medication_id"]
-
- if medId not in rxcuiDataByMedId:
- # No mapping entry found, just use the available generic medication data then
- rowModel["code"] = GENERIC_CODE_TEMPLATE % rowModel["medication_id"];
- yield rowModel;
-
- else:
- # Mapping entry found, yield a normalized model for each active ingredient found
- # (will usually be a 1-to-1 relation, but sometimes multiple
- ingredientTheraClassByRxcui = rxcuiDataByMedId[medId];
- if len(ingredientTheraClassByRxcui) <= 1 or convOptions.normalizeMixtures:
- # Single ingredient or want component active ingredients to each have one record
- for (rxcui, (ingredient, theraClass)) in ingredientTheraClassByRxcui.iteritems():
- normalizedModel = RowItemModel(rowModel);
- normalizedModel["medication_id"] = rxcui;
- normalizedModel["code"] = RXCUI_CODE_TEMPLATE % rxcui;
- normalizedModel["description"] = ingredient.title();
-
- yield normalizedModel;
- elif convOptions.maxMixtureCount is not None and len(ingredientTheraClassByRxcui) > convOptions.maxMixtureCount:
- # Plan to denormalize, but excessively large mixture. Forget it.
- rowModel["code"] = GENERIC_CODE_TEMPLATE % rowModel["medication_id"];
- yield rowModel;
- else:
- # Mixture of multiple ingredients and want to keep denormalized
- # Extract out the active ingredient names to make a composite based only on that unique combination
- ingredientRxcuiList = [ (ingredient, rxcui) for (rxcui, (ingredient, theraClass)) in ingredientTheraClassByRxcui.iteritems()];
- ingredientRxcuiList.sort(); # Ensure consistent order
-
- rxcuiStrList = list();
- ingredientList = list();
- for (ingredient, rxcui) in ingredientRxcuiList:
- rxcuiStrList.append(str(rxcui));
- ingredientList.append(ingredient.title());
- rxcuiComposite = str.join(",", rxcuiStrList );
- ingredientComposite = str.join("-",ingredientList );
-
- #rowModel["medication_id"] = hash(rxcuiComposite); # No, just stick to existing medication ID
- rowModel["code"] = GENERIC_CODE_TEMPLATE % medId;
- rowModel["description"] = ingredientComposite;
- yield rowModel;
-
- # Do some extra work here to see if we can figure out therapeutic / pharaceutical class labels based on available data
- if rowModel["thera_class"] is not None:
- theraClassNeedsPopulation = False;
- for (rxcui, (ingredient, theraClass)) in ingredientTheraClassByRxcui.iteritems():
- if theraClass is None:
- # Don't have a previously populated class labels for this medication ID, but just found it with this data. Populate then.
- theraClass = rowModel["thera_class"];
- ingredientTheraClassByRxcui[rxcui] = (ingredient, theraClass);
- theraClassNeedsPopulation = True;
- if theraClassNeedsPopulation:
- rowDict = {"thera_class": rowModel["thera_class"], "pharm_class": rowModel["pharm_class"], "pharm_subclass": rowModel["pharm_subclass"],}
- DBUtil.updateRow("stride_mapped_meds", rowDict, medId, idCol="medication_id", conn=conn);
-
- if not extConn:
- conn.close();
-
- def convertSourceItem(self, sourceItem, conn=None):
- """Given an individual sourceItem record, produce / convert it into an equivalent
- item record in the analysis database.
- """
- extConn = conn is not None;
- if not extConn:
- conn = self.connFactory.connection();
- try:
- # Normalize sourceItem data into hierachical components (category -> clinical_item -> patient_item).
- # Relatively small / finite number of categories and clinical_items, so these should only have to be instantiated
- # in a first pass, with subsequent calls just yielding back in memory cached copies
- category = self.categoryFromSourceItem(sourceItem, conn=conn);
- clinicalItem = self.clinicalItemFromSourceItem(sourceItem, category, conn=conn);
- patientItem = self.patientItemFromSourceItem(sourceItem, clinicalItem, conn=conn);
-
- finally:
- if not extConn:
- conn.close();
-
-
-
- def categoryFromSourceItem(self, sourceItem, conn):
- # Load or produce a clinical_item_category record model for the given sourceItem
- # In this case, always Medication
- categoryDescription = CATEGORY_TEMPLATE;
- categoryKey = (SOURCE_TABLE, categoryDescription);
- if categoryKey not in self.categoryBySourceDescr:
- # Category does not yet exist in the local cache. Check if in database table (if not, persist a new record)
- category = \
- RowItemModel \
- ( { "source_table": SOURCE_TABLE,
- "description": categoryDescription,
- }
- );
- (categoryId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", category, conn=conn);
- category["clinical_item_category_id"] = categoryId;
- self.categoryBySourceDescr[categoryKey] = category;
- return self.categoryBySourceDescr[categoryKey];
-
- def clinicalItemFromSourceItem(self, sourceItem, category, conn):
- # Load or produce a clinical_item record model for the given sourceItem
- clinicalItemKey = (category["clinical_item_category_id"], sourceItem["code"]);
- if clinicalItemKey not in self.clinicalItemByCategoryIdCode:
- # Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
- clinicalItem = \
- RowItemModel \
- ( { "clinical_item_category_id": category["clinical_item_category_id"],
- "external_id": sourceItem["medication_id"],
- "name": sourceItem["code"],
- "description": sourceItem["description"],
- }
- );
- (clinicalItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", clinicalItem, conn=conn);
- clinicalItem["clinical_item_id"] = clinicalItemId;
- self.clinicalItemByCategoryIdCode[clinicalItemKey] = clinicalItem;
- return self.clinicalItemByCategoryIdCode[clinicalItemKey];
-
- def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
- # Produce a patient_item record model for the given sourceItem
- patientItem = \
- RowItemModel \
- ( { "external_id": sourceItem["stride_preadmit_med_id"],
- "patient_id": sourceItem["pat_anon_id"],
- "encounter_id": None,
- "clinical_item_id": clinicalItem["clinical_item_id"],
- "item_date": sourceItem["contact_date"],
- }
- );
- insertQuery = DBUtil.buildInsertQuery("patient_item", patientItem.keys() );
- insertParams= patientItem.values();
- try:
- # Optimistic insert of a new unique item
- DBUtil.execute( insertQuery, insertParams, conn=conn );
- patientItem["patient_item_id"] = DBUtil.execute( DBUtil.identityQuery("patient_item"), conn=conn )[0][0];
- except IntegrityError, err:
- # If turns out to be a duplicate, okay, pull out existing ID and continue to insert whatever else is possible
- log.info(err); # Lookup just by the composite key components to avoid attempting duplicate insertion again
- searchPatientItem = \
- { "patient_id": patientItem["patient_id"],
- "clinical_item_id": patientItem["clinical_item_id"],
- "item_date": patientItem["item_date"],
- }
- (patientItem["patient_item_id"], isNew) = DBUtil.findOrInsertItem("patient_item", searchPatientItem, conn=conn);
- return patientItem;
-
- def main(self, argv):
- """Main method, callable from command line"""
- usageStr = "usage: %prog [options]\n"
- parser = OptionParser(usage=usageStr)
- parser.add_option("-s", "--startDate", dest="startDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time on or after this date.");
- parser.add_option("-e", "--endDate", dest="endDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time before this date.");
- parser.add_option("-n", "--normalizeMixtures", dest="normalizeMixtures", action="store_true", help="If set, when find medication mixtures, will unravel / normalize into separate entries, one for each ingredient");
- parser.add_option("-m", "--maxMixtureCount", dest="maxMixtureCount", help="If not normalizing mixtures, then this is the maximum number of mixture components will itemize for a mixture. If more than this, just use the summary label.");
- (options, args) = parser.parse_args(argv[1:])
-
- log.info("Starting: "+str.join(" ", argv))
- timer = time.time();
-
- convOptions = ConversionOptions();
- convOptions.extractParserOptions(options);
-
- self.convertSourceItems(convOptions);
-
- timer = time.time() - timer;
- log.info("%.3f seconds to complete",timer);
-
-class ConversionOptions:
- """Simple struct to contain multiple program options"""
- def __init__(self):
- self.startDate = None;
- self.endDate = None;
- self.normalizeMixtures = False;
- self.maxMixtureCount = None;
-
- def extractParserOptions(self, options):
- if options.startDate is not None:
- # Parse out the start date parameter
- timeTuple = time.strptime(options.startDate, DATE_FORMAT);
- self.startDate = datetime(*timeTuple[0:3]);
-
- if options.endDate is not None:
- # Parse out the end date parameter
- timeTuple = time.strptime(options.endDate, DATE_FORMAT);
- self.endDate = datetime(*timeTuple[0:3]);
-
- if options.maxMixtureCount is not None:
- self.maxMixtureCount = int(options.maxMixtureCount);
-
-if __name__ == "__main__":
- instance = STRIDEPreAdmitMedConversion();
- instance.main(sys.argv);
diff --git a/medinfo/dataconversion/STRIDETreatmentTeamConversion.py b/medinfo/dataconversion/STRIDETreatmentTeamConversion.py
index 0204eec0..545d07a4 100644
--- a/medinfo/dataconversion/STRIDETreatmentTeamConversion.py
+++ b/medinfo/dataconversion/STRIDETreatmentTeamConversion.py
@@ -5,18 +5,16 @@
from optparse import OptionParser
from medinfo.common.Util import stdOpen, ProgressDots;
from medinfo.db import DBUtil;
-from medinfo.db.DBUtil import DB_CONNECTOR_MODULE;
-IntegrityError = DB_CONNECTOR_MODULE.IntegrityError;
from medinfo.db.Model import SQLQuery;
from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList, RowItemFieldComparator;
-from Util import log;
-from Const import TEMPLATE_MEDICATION_ID, TEMPLATE_MEDICATION_PREFIX;
-from Const import COLLECTION_TYPE_ORDERSET;
-from Env import DATE_FORMAT;
+from .Util import log;
+from .Const import TEMPLATE_MEDICATION_ID, TEMPLATE_MEDICATION_PREFIX;
+from .Const import COLLECTION_TYPE_ORDERSET;
+from .Env import DATE_FORMAT;
SOURCE_TABLE = "stride_treatment_team";
-CATEGORY_TEMPLATE = "Treatment Team";
+CATEGORY_TEMPLATE = "Treatment Team";
KEY_PROVIDER_PREFIXES = ("TT ","CON "); # Name Prefixes indicating a special (team) provider
TEAM_PREFIXES = ("Primary", "Consulting");
@@ -32,11 +30,11 @@ class STRIDETreatmentTeamConversion:
"""Data conversion module to take STRIDE data
into the structured data analysis tables to facilitate subsequent analysis.
"""
-
+
def __init__(self):
"""Default constructor"""
self.connFactory = DBUtil.ConnectionFactory(); # Default connection source, but Allow specification of alternative DB connection source
-
+
self.categoryBySourceDescr = dict(); # Local cache to track the clinical item category table contents
self.clinicalItemByCompositeKey = dict(); # Local cache to track clinical item table contents
@@ -44,7 +42,7 @@ def convertSourceItems(self, convOptions):
"""Primary run function to process the contents of the raw source
table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
Should look for redundancies after the fact to catch repeated conversions.
-
+
startDate - If provided, only return items whose ordering_date is on or after that date.
endDate - If provided, only return items whose ordering_date is before that date.
"""
@@ -56,15 +54,15 @@ def convertSourceItems(self, convOptions):
for sourceItem in self.querySourceItems(convOptions, progress=progress, conn=conn):
self.convertSourceItem(sourceItem, conn=conn);
progress.Update();
-
+
finally:
conn.close();
progress.PrintStatus();
def querySourceItems(self, convOptions, progress=None, conn=None):
- """Query the database for list of all source clinical items (medications, etc.)
- and yield the results one at a time. If startDate provided, only return items whose
+ """Query the database for list of all source clinical items (medications, etc.)
+ and yield the results one at a time. If startDate provided, only return items whose
occurence date is on or after that date.
"""
extConn = conn is not None;
@@ -73,7 +71,7 @@ def querySourceItems(self, convOptions, progress=None, conn=None):
# Column headers to query for that map to respective fields in analysis table
headers = ["stride_treatment_team_id","pat_id","pat_enc_csn_id","trtmnt_tm_begin_date","trtmnt_tm_end_date","treatment_team","prov_name"];
-
+
query = SQLQuery();
for header in headers:
query.addSelect( header );
@@ -94,8 +92,7 @@ def querySourceItems(self, convOptions, progress=None, conn=None):
row = cursor.fetchone();
while row is not None:
rowModel = RowItemModel( row, headers );
- for normalizedModel in self.normalizeRowModel(rowModel, convOptions, conn=conn):
- yield normalizedModel; # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
+ yield self.normalizeRowModel(rowModel, convOptions) # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
row = cursor.fetchone();
# Slight risk here. Normally DB connection closing should be in finally of a try block,
@@ -105,39 +102,32 @@ def querySourceItems(self, convOptions, progress=None, conn=None):
if not extConn:
conn.close();
- def normalizeRowModel(self, rowModel, convOptions, conn=None):
+ def normalizeRowModel(self, rowModel, convOptions):
"""Given a rowModel of data, normalize it further.
Specifically, look for aggregate data items (e.g., multiple Gen Med treatment teams, report as one)
"""
- extConn = conn is not None;
- if not extConn:
- conn = self.connFactory.connection();
-
(teamAcronym, teamName) = self.cleanName(rowModel["treatment_team"], convOptions);
(provAcronym, provName) = self.cleanName(rowModel["prov_name"], convOptions, keyPrefixes=KEY_PROVIDER_PREFIXES);
provName = provName.title();
- rowModel["code"] = teamAcronym;
- rowModel["description"] = teamName;
-
if provAcronym != "":
rowModel["code"] = "%s (%s)" % (provAcronym, teamAcronym);
rowModel["description"] = "%s (%s)" % (provName, teamName);
+ else:
+ rowModel["code"] = teamAcronym;
+ rowModel["description"] = teamName;
if rowModel["trtmnt_tm_begin_date"] is None:
# Don't know how to use event information with a timestamp
pass;
- yield rowModel;
-
- if not extConn:
- conn.close();
+ return rowModel;
def cleanName(self, inputName, convOptions, keyPrefixes=None):
"""Given an input name (e.g., treatment team or provider)
Return a 2-ple (acronym, cleaned) with an acronym version
and a cleaned up version (discard extra punctuation, phone/pager numbers, etc.)
- If keyPrefixes specified, then only accept input names that start with one of them
+ If keyPrefixes specified, then only accept input names that start with one of them
(e.g., "TT" or "CON" for provider names, to only look at team names instead of named individuals.
"""
isPrefixAcceptable = True;
@@ -146,11 +136,11 @@ def cleanName(self, inputName, convOptions, keyPrefixes=None):
for keyPrefix in keyPrefixes:
if inputName is not None and inputName.startswith(keyPrefix):
isPrefixAcceptable = True;
-
+
# Default to blanks
acronym = "";
cleanedName = "";
-
+
if isPrefixAcceptable and inputName is not None:
acronymList = list();
wordList = list();
@@ -159,32 +149,32 @@ def cleanName(self, inputName, convOptions, keyPrefixes=None):
if chunk[-1] == ",": # Strip any commass
chunk = chunk[:-1];
- if convOptions.aggregate and i == 0 and chunk in (TEAM_PREFIXES):
- # Aggregating mixed records, so just use batch team prefix if exists
- acronymList.append(chunk[0]);
- wordList.append(chunk);
- break;
+ if convOptions.aggregate and i == 0 and chunk in TEAM_PREFIXES:
+ # Aggregating mixed records, so just use batch team prefix if exists
+ acronymList.append(chunk[0]);
+ wordList.append(chunk);
+ break
elif convOptions.aggregate and chunk.upper() in SUB_LABEL_WORDS:
# Sub label word not interested when aggregating data, so just ignore it
- pass;
+ continue
elif convOptions.aggregate and len(chunk) == 1:
# A short number or letter sub-label, ignore if aggregating
- pass;
+ continue
elif convOptions.aggregate and len(chunk) <= 2 and (chunk[0].isdigit() or chunk[-1].isdigit()):
# A short number or letter sub-label, ignore if aggregating
- pass;
+ continue
elif len(chunk) <= 2 and not chunk[0].isalnum() and not chunk[-1].isalnum():
# Short non-alphanumeric sequence, probably punctuation
- pass;
+ continue
elif not chunk[0].isalnum() and len(chunk) >1 and chunk[1].isdigit():
# Probably just a pager/phone number
- pass;
+ continue
elif len(chunk) > 1 and chunk[0].isdigit() and chunk[-1].isdigit():
# Looks like a number, probably pager or phone. Don't include
- pass;
+ continue
elif chunk in DISCARD_WORDS:
# Probably just pager link, not interested
- pass;
+ continue
else:
if chunk[0].isalnum():
acronymList.append(chunk[0])
@@ -198,7 +188,7 @@ def cleanName(self, inputName, convOptions, keyPrefixes=None):
# Override specific provider names as generic primary team members
(acronym, cleanedName) = ("P","Primary");
- return (acronym, cleanedName);
+ return (acronym, cleanedName);
@@ -216,7 +206,7 @@ def convertSourceItem(self, sourceItem, conn=None):
category = self.categoryFromSourceItem(sourceItem, conn=conn);
clinicalItem = self.clinicalItemFromSourceItem(sourceItem, category, conn=conn);
patientItem = self.patientItemFromSourceItem(sourceItem, clinicalItem, conn=conn);
-
+
finally:
if not extConn:
conn.close();
@@ -240,7 +230,7 @@ def categoryFromSourceItem(self, sourceItem, conn):
category["clinical_item_category_id"] = categoryId;
self.categoryBySourceDescr[categoryKey] = category;
return self.categoryBySourceDescr[categoryKey];
-
+
def clinicalItemFromSourceItem(self, sourceItem, category, conn):
# Load or produce a clinical_item record model for the given sourceItem
clinicalItemKey = (category["clinical_item_category_id"], sourceItem["description"]);
@@ -258,7 +248,7 @@ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
clinicalItem["clinical_item_id"] = clinicalItemId;
self.clinicalItemByCompositeKey[clinicalItemKey] = clinicalItem;
return self.clinicalItemByCompositeKey[clinicalItemKey];
-
+
def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
# Produce a patient_item record model for the given sourceItem
patientItem = \
@@ -270,13 +260,13 @@ def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
"item_date": sourceItem["trtmnt_tm_begin_date"],
}
);
- insertQuery = DBUtil.buildInsertQuery("patient_item", patientItem.keys() );
- insertParams= patientItem.values();
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()) );
+ insertParams= list(patientItem.values());
try:
# Optimistic insert of a new unique item
DBUtil.execute( insertQuery, insertParams, conn=conn );
patientItem["patient_item_id"] = DBUtil.execute( DBUtil.identityQuery("patient_item"), conn=conn )[0][0];
- except IntegrityError, err:
+ except conn.IntegrityError as err:
# If turns out to be a duplicate, okay, pull out existing ID and continue to insert whatever else is possible
log.info(err); # Lookup just by the composite key components to avoid attempting duplicate insertion again
searchPatientItem = \
@@ -301,7 +291,7 @@ def main(self, argv):
convOptions = ConversionOptions();
convOptions.extractParserOptions(options);
-
+
self.convertSourceItems(convOptions);
timer = time.time() - timer;
@@ -324,9 +314,9 @@ def extractParserOptions(self, options):
# Parse out the end date parameter
timeTuple = time.strptime(options.endDate, DATE_FORMAT);
self.endDate = datetime(*timeTuple[0:3]);
-
+
self.aggregate = options.aggregate;
-
+
if __name__ == "__main__":
instance = STRIDETreatmentTeamConversion();
instance.main(sys.argv);
diff --git a/medinfo/dataconversion/Util.py b/medinfo/dataconversion/Util.py
index ed8f9355..34df2d14 100644
--- a/medinfo/dataconversion/Util.py
+++ b/medinfo/dataconversion/Util.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""Miscellaneous utility functions used across the application
"""
-import Const, Env
+from . import Const, Env
import sys, os
import logging
@@ -12,4 +12,4 @@
formatter = logging.Formatter(Const.LOGGER_FORMAT)
handler.setFormatter(formatter)
-log.addHandler(handler)
+# log.addHandler(handler)
diff --git a/medinfo/dataconversion/cohorts.py b/medinfo/dataconversion/cohorts.py
new file mode 100644
index 00000000..bf7df546
--- /dev/null
+++ b/medinfo/dataconversion/cohorts.py
@@ -0,0 +1,87 @@
+"""
+Definition of CohortBuilder - a class to construct a cohort (set of examples)
+"""
+import decimal
+import pandas as pd
+
+class CohortBuilder(object):
+ """
+ A class for constructing a cohort table and saving to a bigquery project.
+ A cohort table should have at minimum three columns:
+ 1. anon_id : the patient id
+ 2. observation_id : a unique identifier for each observation
+ 3. index_time : prediction time for each observation
+ 4. `label` : binary or multiclass indicating class membership of the
+ observations. This may be multiple columns (if in multlilabel
+ setting) and will have column names as specified in `label_columns`
+ attribute.
+ """
+
+ def __init__(self, dataset_name, table_name, label_columns,
+ working_project_id='mining-clinical-decisions'):
+ """
+ Initializes dataset_name and table_name for where cohort table will be
+ saved on bigquery
+ """
+ self.project_id = working_project_id
+ self.dataset_name = dataset_name
+ self.table_name = table_name
+ self.label_columns = label_columns
+
+ def build_cohort(self, query, transform=lambda x: x):
+ """
+ Uses provided query and transformation function to construct a dataframe
+ representation of the cohort. Query will vary from task to task and is
+ user supplied, as is the transform function. The transform function
+ exists so that the user can apply additional logic in python to result
+ of query to generate the final cohort dataframe. By default transform
+ is an identity function, meaning the result from query will be the
+ cohort dataframe.
+
+ Args:
+ query : a SQL query to collect a cohort of interest
+ transform : a python function to be applied ot result of query
+ to construct final cohort table
+ """
+ self.df = pd.read_gbq(query,
+ project_id=self.project_id,
+ progress_bar_type='tqdm')
+ self.df = transform(self.df)
+
+ # Check for required columns
+ try:
+ assert 'anon_id' in self.df.columns
+ assert 'observation_id' in self.df.columns
+ assert 'index_time' in self.df.columns
+ for label in self.label_columns:
+ assert label in self.df.columns
+ except:
+ print("Unexpected columns")
+ for col in self.df.columns:
+ print(col)
+
+ # Older version of pandas_gbq reads in numeric column as decimal
+ if isinstance(self.df.observation_id.values[0], decimal.Decimal):
+ self.df = self.df.assign(observation_id=lambda x:
+ [int(str(d).split('.')[0]) for d in x.observation_id]
+ )
+
+ def write_cohort_table(self, overwrite=False, schema=None):
+ """
+ Writes the cohort dataframe to specified bigquery project, dataset,
+ and table with appropriate table schema.
+
+ Args:
+ overwrite: if true overwrite existing table
+ schema: dictionary of table schema, if None detect automatically.
+ """
+ if overwrite:
+ if_exists = 'replace'
+ else:
+ if_exists = 'fail'
+ self.df.to_gbq(
+ destination_table=f"{self.dataset_name}.{self.table_name}",
+ project_id=self.project_id,
+ if_exists=if_exists,
+ table_schema=schema
+ )
diff --git a/medinfo/dataconversion/constants.py b/medinfo/dataconversion/constants.py
new file mode 100644
index 00000000..b75f1225
--- /dev/null
+++ b/medinfo/dataconversion/constants.py
@@ -0,0 +1,49 @@
+# Constants to import
+
+DEFAULT_DEPLOY_CONFIG = {
+ 'Categorical': {
+ 'Sex': [{'look_back' : None}],
+ 'Race': [{'look_back' : None}],
+ 'Diagnoses': [{'look_back' : None}],
+ 'Medications': [{'look_back' : 28}]
+ },
+ 'Numerical': {
+ 'Age': [{'look_back': None, 'num_bins': 5}],
+ 'LabResults': [{'look_back': 14, 'num_bins': 5}],
+ #'Vitals': [{'look_back': 3, 'num_bins': 5}]
+ }
+}
+
+DEFAULT_LAB_COMPONENT_IDS = [
+ 'WBC', # White Blood Cell
+ 'HCT', # Hematocrit
+ 'PLT', # Platelet Count
+ 'NA', # Sodium, Whole Blood
+ 'K', # Potassium, Whole Blood
+ 'CO2', # CO2, Serum/Plasma
+ 'BUN', # Blood Urea Nitrogen
+ 'CR', # Creatinine
+ 'TBIL', # Total Bilirubin
+ 'ALB', # Albumin
+ 'CA', # Calcium
+ 'LAC', # Lactic Acid
+ 'ESR', # Erythrocyte Sedimentation Rate
+ 'CRP', # C-Reactive Protein
+ 'TNI', # Troponin I
+ 'PHA', # Arterial pH
+ 'PO2A', # Arterial pO2
+ 'PCO2A', # Arterial pCO2
+ 'PHV', # Venous pH
+ 'PO2V', # Venous pO2
+ 'PCO2V' # Venous pCO2
+]
+
+
+DEFAULT_FLOWSHEET_FEATURES = [
+ "Heart Rate",
+ "Temp",
+ "Resp",
+ "SpO2",
+ 'BP_High_Systolic',
+ "BP_Low_Diastolic"
+]
diff --git a/medinfo/dataconversion/featurizers.py b/medinfo/dataconversion/featurizers.py
new file mode 100644
index 00000000..78bc4de8
--- /dev/null
+++ b/medinfo/dataconversion/featurizers.py
@@ -0,0 +1,1185 @@
+"""
+Definition of BagOfWordsFeaturizer
+TODO: Definition of SummaryStatsFeaturizer
+TODO: Definition of TimelineFeaturizer
+"""
+import json
+import os
+from re import S
+from typing_extensions import Self
+import pandas as pd
+import pickle
+from google.cloud import bigquery
+import numpy as np
+from tqdm import tqdm
+from scipy.sparse import csr_matrix
+from scipy.sparse import save_npz
+
+from constants import DEFAULT_DEPLOY_CONFIG
+from constants import DEFAULT_LAB_COMPONENT_IDS
+from constants import DEFAULT_FLOWSHEET_FEATURES
+import FeatureExtractor as fextractors
+
+import pdb
+
+class SequenceFeaturizer():
+ """
+ Uses FeatureExtractors to generate a set of variable lengh sequences
+ for each observation. Saves these sequences as invididual numpy arrays in
+ npz format. The npz contains the following data elements
+ NPZ structure:
+ sequence: array of tokens - continuous features must be binned
+ time_deltas: array with same length as sequence, hours to index time
+ label: list of labels corresponding to seq (len=1 if only one label).
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id, train_years,
+ val_years, test_years, label_columns, outpath='./features',
+ project='som-nero-phi-jonc101', dataset='shc_core_2021',
+ feature_config=None):
+ """
+ Args:
+ cohort_table_id: ex 'mining-clinical-decisions.conor_db.table_name'
+ feature_table_id: ex
+ 'mining-clinical-decisions.conor_db.feature_table'
+ train_years: list of years to include in training set
+ val_years: list of years to include in validation set
+ test_years: list of years to include in the test set
+ label_columns: list of columns desingated as labels in cohort table
+ outpath: path to dump feature matrices
+ project: bq project id to extract data from
+ dataset: bq dataset with project to extract data from
+ feature_config: dictionary with feature types, bins and look back
+ windows.
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.outpath = outpath
+ self.project = project
+ self.dataset = dataset
+ if feature_config is None:
+ self.feature_config = DEFAULT_DEPLOY_CONFIG
+ else:
+ self.feature_config = feature_config
+ self.client = bigquery.Client()
+ self.train_years = [int(y) for y in train_years]
+ self.val_years = [int(y) for y in val_years]
+ self.test_years = [int(y) for y in test_years]
+ self.label_columns = label_columns
+
+ def __call__(self):
+ """
+ Generates sequence feature vectors and saves to outpath
+ """
+ label_cols = ', '.join([f"c.{l}" for l in self.label_columns])
+ self.construct_feature_timeline()
+ query = f"""
+ SELECT
+ f.*, {label_cols}
+ FROM
+ {self.feature_table_id} f
+ INNER JOIN
+ {self.cohort_table_id} c
+ USING
+ (observation_id)
+ ORDER BY
+ observation_id, feature_time
+ """
+ df = pd.read_gbq(query, progress_bar_type='tqdm')
+
+ # Get time deltas in hours from index time
+ df = df.assign(time_deltas=lambda x:
+ (x.index_time - x.feature_time).astype('timedelta64[D]')
+ )
+
+ # Split into train, val and test and ensure only terms in train are used
+ train_seqs = df[df['index_time'].dt.year.isin(
+ self.train_years)]
+ vocab = train_seqs.feature.unique()
+ vocab_set = set([s for s in vocab])
+ val_seqs = df[df['index_time'].dt.year.isin(
+ self.val_years)].query("feature in @vocab_set", engine='python')
+ test_seqs = df[df['index_time'].dt.year.isin(
+ self.test_years)].query("feature in @vocab_set", engine='python')
+ seq_dict = {'train' : train_seqs, 'val' : val_seqs, 'test' : test_seqs}
+
+ # Create working directory if does not already exist and save features
+ for dataset, seqs in seq_dict.items():
+ os.makedirs(os.path.join(self.outpath, dataset), exist_ok=True)
+ for obs in seqs.observation_id.unique():
+ example = seqs[seqs['observation_id']==obs]
+ sequence = example.feature.values
+ time_deltas = example.time_deltas.values
+ labels = example[self.label_columns].values
+ np.savez(os.path.join(self.outpath, dataset, f"{obs}.npz"),
+ sequence=sequence,
+ time_deltas=time_deltas,
+ labels=labels)
+
+ # Save feature vocab
+ np.savez(os.path.join(self.outpath, dataset, 'feature_vocab.npz'),
+ vocab=vocab)
+
+ # Save bin thresholds if they exist
+ self.df_lup = pd.DataFrame()
+ for lup in self.lups:
+ if lup is not None:
+ self.df_lup = pd.concat([self.df_lup, lup])
+ if not self.df_lup.empty:
+ self.df_lup.to_csv(os.path.join(self.outpath, 'bin_lup.csv'),
+ index=None)
+
+ # Save feature_config
+ with open(os.path.join(self.outpath, 'feature_config.json'), 'w') as f:
+ json.dump(self.feature_config, f)
+
+ def construct_feature_timeline(self):
+ """
+ Executes all logic to iteratively append rows to the biq query long form
+ feature matrix destination table. Does this by iteratively joining
+ cohort table to tables with desired features, filtering for events
+ that occur within each look up range, and then transforming into bag of
+ words style representations. Features with numerical values are binned
+ into buckets to enable bag of words repsesentation.
+ """
+ extractors = []
+ # Get categorical features
+ if 'Sex' in self.feature_config['Categorical']:
+ se = fextractors.SexExtractor(
+ self.cohort_table_id, self.feature_table_id)
+ extractors.append(se)
+ if 'Race' in self.feature_config['Categorical']:
+ re = fextractors.RaceExtractor(self.cohort_table_id,
+ self.feature_table_id)
+ extractors.append(re)
+ if 'Diagnoses' in self.feature_config['Categorical']:
+ pe = fextractors.PatientProblemExtractor(
+ self.cohort_table_id, self.feature_table_id)
+ extractors.append(pe)
+ if 'Medications' in self.feature_config['Categorical']:
+ me = fextractors.MedicationExtractor(
+ self.cohort_table_id, self.feature_table_id)
+ extractors.append(me)
+
+ # Get numerical features
+ if 'Age' in self.feature_config['Numerical']:
+ ae = fextractors.AgeExtractor(
+ self.cohort_table_id,
+ self.feature_table_id,
+ bins=self.feature_config['Numerical']['Age'][0]['num_bins'])
+ extractors.append(ae)
+ if 'LabResults' in self.feature_config['Numerical']:
+ lre = fextractors.LabResultBinsExtractor(
+ self.cohort_table_id,
+ self.feature_table_id,
+ bins=self.feature_config['Numerical']
+ ['LabResults'][0]['num_bins'],
+ base_names=DEFAULT_LAB_COMPONENT_IDS)
+ extractors.append(lre)
+ if 'Vitals' in self.feature_config['Numerical']:
+ fbe = fextractors.FlowsheetBinsExtractor(
+ self.cohort_table_id,
+ self.feature_table_id,
+ bins=self.feature_config['Numerical']['Vitals'][0]['num_bins'],
+ base_names=DEFAULT_FLOWSHEET_FEATURES)
+ extractors.append(fbe)
+
+ # Call extractors and collect any look up tables
+ self.lups = []
+ for extractor in tqdm(extractors):
+ self.lups.append(extractor())
+
+
+class BagOfWordsFeaturizerLight():
+ """
+ Bag of words but uses FeatureExtractors instead of burying all SQL logic
+ as in implementation below.
+ """
+
+ def __init__(self, cohort_table_id, feature_table_id, outpath='./features',
+ project='som-nero-phi-jonc101', dataset='shc_core_2021',
+ feature_config=None):
+ """
+ Args:
+ cohort_table_id: ex 'mining-clinical-decisions.conor_db.table_name'
+ feature_table_id: ex
+ 'mining-clinical-decisions.conor_db.feature_table'
+ outpath: path to dump feature matrices
+ project: bq project id to extract data from
+ dataset: bq dataset with project to extract data from
+ feature_config: dictionary with feature types, bins and look back
+ windows.
+ """
+ self.cohort_table_id = cohort_table_id
+ self.feature_table_id = feature_table_id
+ self.outpath = outpath
+ self.project = project
+ self.dataset = dataset
+ if feature_config is None:
+ self.feature_config = DEFAULT_DEPLOY_CONFIG
+ else:
+ self.feature_config = feature_config
+ self.client = bigquery.Client()
+ # Get data splits (default last year of data held out as test set)
+ split_query = f"""
+ SELECT DISTINCT
+ EXTRACT(YEAR FROM index_time) year
+ FROM
+ {self.cohort_table_id}
+ """
+ df = pd.read_gbq(split_query).sort_values('year')
+ self.train_years = df.year.values[:-1]
+ self.test_years = [df.year.values[-1]]
+ self.replace_table = True
+
+ def __call__(self):
+ """
+ Executes all logic to construct features and labels and saves all info
+ user specified working directory.
+ """
+ self.construct_feature_timeline()
+ self.construct_bag_of_words_rep()
+ query = f"""
+ SELECT
+ *
+ FROM
+ {self.feature_table_id}_bow
+ ORDER BY
+ observation_id
+ """
+ df = pd.read_gbq(query, progress_bar_type='tqdm')
+ train_features = df[df['index_time'].dt.year.isin(self.train_years)]
+ apply_features = df[~df['index_time'].dt.year.isin(self.train_years)]
+ train_csr, train_ids, train_vocab = self.construct_sparse_matrix(
+ train_features, train_features)
+ test_csr, test_ids, test_vocab = self.construct_sparse_matrix(
+ train_features, apply_features)
+
+ # Query cohort table for labels
+ q_cohort = f"""
+ SELECT
+ *
+ FROM
+ {self.cohort_table_id}
+ ORDER BY
+ observation_id
+ """
+ df_cohort = pd.read_gbq(q_cohort, progress_bar_type='tqdm')
+ train_labels = df_cohort[df_cohort['index_time'].dt.year.isin(
+ self.train_years)]
+ test_labels = df_cohort[~df_cohort['index_time'].dt.year.isin(
+ self.train_years)]
+
+ # Sanity check - make sure ids from labels and features in same order
+ for a, b in zip(train_labels['observation_id'].values, train_ids):
+ try:
+ assert a == b
+ except:
+ pdb.set_trace()
+ for a, b in zip(test_labels['observation_id'].values, test_ids):
+ assert a == b
+
+ # Create working directory if does not already exist and save features
+ os.makedirs(self.outpath, exist_ok=True)
+ save_npz(os.path.join(self.outpath, 'train_features.npz'), train_csr)
+ save_npz(os.path.join(self.outpath, 'test_features.npz'), test_csr)
+ print(f"Feature matrix generated with {train_csr.shape[1]} features")
+
+ # Save labels
+ train_labels.to_csv(os.path.join(self.outpath, 'train_labels.csv'),
+ index=None)
+ test_labels.to_csv(os.path.join(self.outpath, 'test_labels.csv'),
+ index=None)
+
+ # Save feature order
+ df_vocab = pd.DataFrame(data={
+ 'features': [t for t in train_vocab],
+ 'indices': [train_vocab[t] for t in train_vocab]
+ })
+ df_vocab.to_csv(os.path.join(self.outpath, 'feature_order.csv'),
+ index=None)
+
+ # Save bin thresholds if they exist
+ self.df_lup = pd.DataFrame()
+ for lup in self.lups:
+ if lup is not None:
+ self.df_lup = pd.concat([self.df_lup, lup])
+ if not self.df_lup.empty:
+ self.df_lup.to_csv(os.path.join(self.outpath, 'bin_lup.csv'),
+ index=None)
+
+ # Save feature_config
+ with open(os.path.join(self.outpath, 'feature_config.json'), 'w') as f:
+ json.dump(self.feature_config, f)
+
+ def construct_feature_timeline(self):
+ """
+ Executes all logic to iteratively append rows to the biq query long form
+ feature matrix destination table. Does this by iteratively joining
+ cohort table to tables with desired features, filtering for events
+ that occur within each look up range, and then transforming into bag of
+ words style representations. Features with numerical values are binned
+ into buckets to enable bag of words repsesentation.
+ """
+ extractors = []
+ # Get categorical features
+ if 'Sex' in self.feature_config['Categorical']:
+ se = fextractors.SexExtractor(
+ self.cohort_table_id, self.feature_table_id)
+ extractors.append(se)
+ if 'Race' in self.feature_config['Categorical']:
+ re = fextractors.RaceExtractor(self.cohort_table_id,
+ self.feature_table_id)
+ extractors.append(re)
+ if 'Diagnoses' in self.feature_config['Categorical']:
+ pe = fextractors.PatientProblemExtractor(
+ self.cohort_table_id, self.feature_table_id)
+ extractors.append(pe)
+ if 'Medications' in self.feature_config['Categorical']:
+ me = fextractors.MedicationExtractor(
+ self.cohort_table_id, self.feature_table_id)
+ extractors.append(me)
+
+ # Get numerical features
+ if 'Age' in self.feature_config['Numerical']:
+ ae = fextractors.AgeExtractor(
+ self.cohort_table_id,
+ self.feature_table_id,
+ bins=self.feature_config['Numerical']['Age'][0]['num_bins'])
+ extractors.append(ae)
+ if 'LabResults' in self.feature_config['Numerical']:
+ lre = fextractors.LabResultBinsExtractor(self.cohort_table_id,
+ self.feature_table_id,
+ bins=self.feature_config['Numerical']
+ ['LabResults'][0]['num_bins'],
+ base_names=DEFAULT_LAB_COMPONENT_IDS)
+ extractors.append(lre)
+ if 'Vitals' in self.feature_config['Numerical']:
+ fbe = fextractors.FlowsheetBinsExtractor(
+ self.cohort_table_id,
+ self.feature_table_id,
+ bins=self.feature_config['Numerical']['Vitals'][0]['num_bins'],
+ base_names=DEFAULT_FLOWSHEET_FEATURES)
+ extractors.append(fbe)
+
+ # Call extractors and collect any look up tables
+ self.lups = []
+ for extractor in tqdm(extractors):
+ self.lups.append(extractor())
+
+ # Call extractors and collect any look up tables
+ self.lups = []
+ for extractor in tqdm(extractors):
+ self.lups.append(extractor())
+
+ def construct_bag_of_words_rep(self):
+ """
+ Transforms long form feature timeline into a bag of words feature
+ matrix. Stores as a new table in the given bigquery database but also
+ constructs local sparse matrices that can be fed into various sklearn
+ style classifiers.
+ """
+
+ # Go from timeline to counts
+ query = f"""
+ CREATE OR REPLACE TABLE {self.feature_table_id}_bow AS (
+ SELECT
+ observation_id, index_time, feature_type, feature, COUNT(*) value
+ FROM
+ {self.feature_table_id}
+ WHERE
+ feature_type IS NOT NULL
+ AND
+ feature IS NOT NULL
+ GROUP BY
+ observation_id, index_time, feature_type, feature
+ )
+ """
+ query_job = self.client.query(query)
+ query_job.result()
+
+ def construct_sparse_matrix(self, train_features, apply_features):
+ """
+ Takes long form feature timeline matrix and builds up a scipy csr
+ matrix without the costly pivot operation.
+ """
+ train_features = (train_features
+ .groupby('observation_id')
+ .agg({'feature': lambda x: list(x),
+ 'value': lambda x: list(x)})
+ .reset_index()
+ )
+ train_feature_names = [doc for doc in train_features.feature.values]
+ train_feature_values = [doc for doc in train_features['value'].values]
+ train_obs_id = [id_ for id_ in train_features.observation_id.values]
+
+ apply_features = (apply_features
+ .groupby('observation_id')
+ .agg({'feature': lambda x: list(x),
+ 'value': lambda x: list(x)})
+ .reset_index()
+ )
+ apply_features_names = [doc for doc in apply_features.feature.values]
+ apply_features_values = [doc for doc in apply_features['value'].values]
+ apply_obs_id = [id_ for id_ in apply_features.observation_id.values]
+
+ vocabulary = self._build_vocab(train_feature_names)
+ indptr = [0]
+ indices = []
+ data = []
+ for i, d in enumerate(apply_features_names):
+ for j, term in enumerate(d):
+ if term not in vocabulary:
+ continue
+ else:
+ indices.append(vocabulary[term])
+ data.append(apply_features_values[i][j])
+ if j == 0:
+ # Add zero to data and max index in vocabulary to indices in
+ # case max feature indice isn't in apply features.
+ indices.append(len(vocabulary)-1)
+ data.append(0)
+ indptr.append(len(indices))
+
+ csr_data = csr_matrix((data, indices, indptr), dtype=float)
+
+ return csr_data, apply_obs_id, vocabulary
+
+ def _build_vocab(self, data):
+ """
+ Builds vocabulary of terms from the data. Assigns each unique term
+ to a monotonically increasing integer
+ """
+ vocabulary = {}
+ for i, d in enumerate(data):
+ for j, term in enumerate(d):
+ vocabulary.setdefault(term, len(vocabulary))
+ return vocabulary
+
+
+class BagOfWordsFeaturizer(object):
+ """
+ A class containing all logic to construct a bag of words feature matrix
+ given a cohort and user provided feature configurations.
+
+ This featurizer supports the construction of a bag of words style feature
+ matrix where each column in the resulting matrix is the number of times a
+ certain event (ex lab order, diagnosis code, medication order) occurs
+ in the patients timeline in a given time window prior to index time.
+
+ Categorical variables are trivial to represent in bag of words style.
+ Numerical variables (ie lab results, vital signs, age) are first binned into
+ user specified number of buckets so that they can be represented in similar
+ fashion.
+
+ Feature matrices are constructed as csr matrices (sparse matrices) to allow
+ for feature representations that would otherwise use ungodly amounts of
+ RAM. Sparse matrices are constructed directly from a long form feature
+ matrix representation to avoid the costly pivot operation.
+
+ The user is able to specify various desired feature types and their look
+ back windows in a provided configuration dictionary.
+ """
+
+ def __init__(self, cohort_table, label_columns, working_dataset_name,
+ table_name, project_id='mining-clinical-decisions',
+ outpath='./features', dataset='shc_core_2021',
+ working_project_id='mining-clinical-decisions',
+ feature_config=None):
+ """
+ Initializes featurizer
+ Args:
+ cohort_table: location of cohort table {dataset_name}.{table_name}
+ label_columns: which columns in cohort table used as labels
+ dataset_name: big query dataset name - where to save long form
+ feature matrix.
+ table_name: big query table name - where to save long form feature
+ matrix
+ project_id: id of big query project
+ feature_config: configure which features types to extract and their
+ look back windows. If none uses default defined below
+ """
+ self.df_lup = pd.DataFrame()
+ self.outpath = outpath
+ self.cohort_table = cohort_table
+ self.label_columns = label_columns
+ self.dataset_name = working_dataset_name
+ self.dataset = dataset
+ self.table_name = table_name
+ self.project_id = project_id
+ self.working_proj_id = working_project_id
+ self.client = bigquery.Client()
+ self.create_table = True # starts true then append
+ if feature_config is None:
+ self.feature_config = DEFAULT_DEPLOY_CONFIG
+ else:
+ self.feature_config = feature_config
+ ### TODO : write code to test whether user specified config is
+ ### adequate
+
+ # Get data splits (default last year of data held out as test set)
+ split_query = f"""
+ SELECT DISTINCT
+ EXTRACT(YEAR FROM index_time) year
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ """
+ df = pd.read_gbq(split_query).sort_values('year')
+ self.train_years = df.year.values[:-1]
+ self.test_years = [df.year.values[-1]]
+
+ self.feature_timeline_schema = [
+ {'name': 'observation_id', 'type': 'INTEGER'},
+ {'name': 'index_time', 'type': 'TIMESTAMP'},
+ {'name': 'feature_type', 'type': 'STRING'},
+ {'name': 'feature_time', 'type': 'TIMESTAMP'},
+ {'name': 'feature_id', 'type': 'INTEGER'},
+ {'name': 'feature', 'type': 'STRING'},
+ {'name': 'value', 'type': 'INTEGER'}
+ ]
+
+ def __call__(self):
+ """
+ Executes all logic to construct features and labels and saves all info
+ user specified working directory.
+ """
+ self.construct_feature_timeline()
+ self.construct_bag_of_words_rep()
+ query = f"""
+ SELECT
+ *
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.table_name}_bow
+ ORDER BY
+ observation_id
+ """
+ df = pd.read_gbq(query, progress_bar_type='tqdm')
+ train_features = df[df['index_time'].dt.year.isin(self.train_years)]
+ apply_features = df[~df['index_time'].dt.year.isin(self.train_years)]
+ train_csr, train_ids, train_vocab = self.construct_sparse_matrix(
+ train_features, train_features)
+ test_csr, test_ids, test_vocab = self.construct_sparse_matrix(
+ train_features, apply_features)
+
+ # Query cohort table for labels
+ q_cohort = f"""
+ SELECT
+ *
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ ORDER BY
+ observation_id
+ """
+ df_cohort = pd.read_gbq(q_cohort, progress_bar_type='tqdm')
+ train_labels = df_cohort[df_cohort['index_time'].dt.year.isin(
+ self.train_years)]
+ test_labels = df_cohort[~df_cohort['index_time'].dt.year.isin(
+ self.train_years)]
+
+ # Sanity check - make sure ids from labels and features in same order
+ for a, b in zip(train_labels['observation_id'].values, train_ids):
+ try:
+ assert a == b
+ except:
+ pdb.set_trace()
+ for a, b in zip(test_labels['observation_id'].values, test_ids):
+ assert a == b
+
+ # Create working directory if does not already exist and save features
+ os.makedirs(self.outpath, exist_ok=True)
+ save_npz(os.path.join(self.outpath, 'train_features.npz'), train_csr)
+ save_npz(os.path.join(self.outpath, 'test_features.npz'), test_csr)
+ print(f"Feature matrix generated with {train_csr.shape[1]} features")
+
+ # Save labels
+ train_labels.to_csv(os.path.join(self.outpath, 'train_labels.csv'),
+ index=None)
+ test_labels.to_csv(os.path.join(self.outpath, 'test_labels.csv'),
+ index=None)
+
+ # Save feature order
+ df_vocab = pd.DataFrame(data={
+ 'features': [t for t in train_vocab],
+ 'indices': [train_vocab[t] for t in train_vocab]
+ })
+ df_vocab.to_csv(os.path.join(self.outpath, 'feature_order.csv'),
+ index=None)
+
+ # Save bin thresholds if they exist
+ if not self.df_lup.empty:
+ self.df_lup.to_csv(os.path.join(self.outpath, 'bin_lup.csv'),
+ index=None)
+
+ # Save feature_config
+ with open(os.path.join(self.outpath, 'feature_config.json'), 'w') as f:
+ json.dump(self.feature_config, f)
+
+ def construct_feature_timeline(self):
+ """
+ Executes all logic to iteratively append rows to the biq query long form
+ feature matrix destination table. Does this by iteratively joining
+ cohort table to tables with desired features, filtering for events
+ that occur within each look up range, and then transforming into bag of
+ words style representations. Features with numerical values are binned
+ into buckets to enable bag of words repsesentation.
+ """
+
+ # Get categorical features
+ if 'Sex' in self.feature_config['Categorical']:
+ self._get_sex_features()
+ if 'Race' in self.feature_config['Categorical']:
+ self._get_race_features()
+ if 'Diagnoses' in self.feature_config['Categorical']:
+ self._get_diagnoses_features()
+ if 'Medications' in self.feature_config['Categorical']:
+ self._get_medication_features()
+
+ # Get numerical features
+ if 'Age' in self.feature_config['Numerical']:
+ self._get_age_features()
+ if 'LabResults' in self.feature_config['Numerical']:
+ self._get_lab_results_features()
+ if 'Vitals' in self.feature_config['Numerical']:
+ self._get_vital_sign_features()
+
+ # Add token which is one if no features are present for a patient
+ self._get_missingness_features()
+
+ def construct_bag_of_words_rep(self):
+ """
+ Transforms long form feature timeline into a bag of words feature
+ matrix. Stores as a new table in the given bigquery database but also
+ constructs local sparse matrices that can be fed into various sklearn
+ style classifiers.
+ """
+
+ # Go from timeline to counts
+ query = f"""
+ CREATE OR REPLACE TABLE
+ {self.working_proj_id}.{self.dataset_name}.{self.table_name}_bow AS (
+
+ SELECT
+ observation_id, index_time, feature_type, feature, COUNT(*) value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.table_name}
+ WHERE
+ feature_type IS NOT NULL
+ AND
+ feature IS NOT NULL
+ GROUP BY
+ observation_id, index_time, feature_type, feature
+ )
+ """
+ query_job = self.client.query(query)
+ query_job.result()
+
+ def construct_sparse_matrix(self, train_features, apply_features):
+ """
+ Takes long form feature timeline matrix and builds up a scipy csr
+ matrix without the costly pivot operation.
+ """
+ train_features = (train_features
+ .groupby('observation_id')
+ .agg({'feature': lambda x: list(x),
+ 'value': lambda x: list(x)})
+ .reset_index()
+ )
+ train_feature_names = [doc for doc in train_features.feature.values]
+ train_feature_values = [doc for doc in train_features['value'].values]
+ train_obs_id = [id_ for id_ in train_features.observation_id.values]
+
+ apply_features = (apply_features
+ .groupby('observation_id')
+ .agg({'feature': lambda x: list(x),
+ 'value': lambda x: list(x)})
+ .reset_index()
+ )
+ apply_features_names = [doc for doc in apply_features.feature.values]
+ apply_features_values = [doc for doc in apply_features['value'].values]
+ apply_obs_id = [id_ for id_ in apply_features.observation_id.values]
+
+ vocabulary = self._build_vocab(train_feature_names)
+ indptr = [0]
+ indices = []
+ data = []
+ for i, d in enumerate(apply_features_names):
+ for j, term in enumerate(d):
+ if term not in vocabulary:
+ continue
+ else:
+ indices.append(vocabulary[term])
+ data.append(apply_features_values[i][j])
+ if j == 0:
+ # Add zero to data and max index in vocabulary to indices in
+ # case max feature indice isn't in apply features.
+ indices.append(len(vocabulary)-1)
+ data.append(0)
+ indptr.append(len(indices))
+
+ csr_data = csr_matrix((data, indices, indptr), dtype=float)
+
+ return csr_data, apply_obs_id, vocabulary
+
+ def _build_vocab(self, data):
+ """
+ Builds vocabulary of terms from the data. Assigns each unique term
+ to a monotonically increasing integer
+ """
+ vocabulary = {}
+ for i, d in enumerate(data):
+ for j, term in enumerate(d):
+ vocabulary.setdefault(term, len(vocabulary))
+ return vocabulary
+
+ def get_binned_features(self, df_train, df_apply, num_bins):
+ """
+ Bins numerical features into specified number of bins based on
+ percentile values. Uses training set to define cutoffs values across
+ each bin.
+
+ Args:
+ df_train: dataframe of long form feature timeline for numerical
+ features for observations in the training set
+ df_apply: dataframe of long form feature timeline for numerical
+ features for osbervations in th test set
+ Returns:
+ df_binned : dataframe of long form feature timeline where the bin
+ associated with feature is specified in feature name and the
+ value is 1
+ """
+ def _get_appropriate_bin(feature, val, lut):
+ """
+ Helper to map value to bin
+ """
+ try:
+ mins = lut[feature]['min']
+ except: # feature not found in training set
+ return 0 # removed in downstream processing
+ for i in range(len(mins)-1):
+ if i == 0 and val < mins[i]:
+ return i
+ if val >= mins[i] and val < mins[i+1]:
+ return i
+ return len(mins) - 1 # in last bin
+
+ ranks = df_train.groupby('feature')['value'].rank(pct=True).values
+ df_train = (df_train
+ .assign(bins=[int(r * num_bins) for r in ranks])
+ )
+ df_lup = (df_train
+ .groupby(['feature', 'bins'])
+ .agg(bin_min=('value', 'min'), bin_max=('value', 'max'))
+ .reset_index()
+ )
+
+ # Append to look up table we'll save later
+ self.df_lup = pd.concat([self.df_lup, df_lup])
+
+ # Convert df_lup to dictionary for faster bin look up.
+ lut_dict = {}
+ for feature in df_lup.feature.unique():
+ df_lup_feature = df_lup[df_lup['feature'] == feature]
+ for bin in df_lup_feature.bins.unique():
+ if feature not in lut_dict:
+ lut_dict[feature] = {}
+ lut_dict[feature]['min'] = []
+ lut_dict[feature]['max'] = []
+ lut_dict[feature]['min'].append(df_lup_feature
+ .query("bins == @bin", engine='python')
+ ['bin_min'].values[0]
+ )
+ lut_dict[feature]['max'].append(df_lup_feature
+ .query("bins == @bin", engine='python')
+ ['bin_max'].values[0]
+ )
+
+ df_binned = (df_apply
+ .assign(bins=lambda x:
+ [_get_appropriate_bin(a, b, lut_dict)
+ for a, b in zip(x.feature, x.value)]
+ )
+ .assign(feature=lambda x:
+ [f"{a}_{b}" for a, b in zip(x.feature, x.bins)],
+ value=1
+ )
+ .drop('bins', axis=1)
+ )
+
+ return df_binned
+
+ def _get_missingness_features(self):
+ """
+ Finds patients that exist in cohort but not current feature matrix,
+ adds token 'missing' feature which takes value 1.
+ """
+ query=f"""
+ INSERT INTO
+ {self.working_proj_id}.{self.dataset_name}.{self.table_name}
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ "Missing indicator" feature_type,
+ labels.index_time feature_time,
+ UNIX_DATE(CAST(labels.index_time as DATE)) as feature_id,
+ 'no features' as feature,
+ 1 as value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ LEFT JOIN
+ {self.working_proj_id}.{self.dataset_name}.{self.table_name} feats
+ USING
+ (observation_id)
+ WHERE
+ feats.observation_id IS NULL
+ """
+ query_job = self.client.query(query)
+ query_job.result()
+
+ def _get_sex_features(self):
+ """
+ Get's sex demographic features for patients in cohort and appends to
+ long form feature matrix on bigquery.
+ """
+ if self.create_table:
+ prefix = (
+ f"CREATE OR REPLACE TABLE {self.working_proj_id}."
+ f"{self.dataset_name}.{self.table_name} AS("
+ )
+ suffix = ")"
+ else:
+ prefix = (
+ f"INSERT INTO {self.working_proj_id}.{self.dataset_name}"
+ f".{self.table_name}"
+ )
+ suffix = ""
+
+ query = f"""
+ {prefix}
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Demographics' as feature_type,
+ labels.index_time as feature_time,
+ 1 as feature_id,
+ CASE WHEN demo.GENDER is NULL then 'sex_missing'
+ ELSE CONCAT('sex_', demo.GENDER) END feature,
+ 1 value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.demographic demo
+ ON
+ labels.anon_id = demo.ANON_ID
+ {suffix}
+ """
+ print("Featurizing sex")
+ query_job = self.client.query(query)
+ query_job.result()
+ self.create_table = False
+
+ def _get_race_features(self):
+ """
+ Get's race demographic features for each patient in cohort and appends
+ to long form feature matrix on bigquery.
+ """
+ if self.create_table:
+ prefix = (
+ f"CREATE OR REPLACE TABLE {self.working_proj_id}."
+ f"{self.dataset_name}.{self.table_name} AS("
+ )
+ suffix = ")"
+ else:
+ prefix = (
+ f"INSERT INTO {self.working_proj_id}.{self.dataset_name}"
+ f".{self.table_name}"
+ )
+ suffix = ""
+
+ query = f"""
+ {prefix}
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Demographics' as feature_type,
+ labels.index_time as feature_time,
+ 1 as feature_id,
+ CASE WHEN demo.CANONICAL_RACE is NULL then 'race_missing'
+ ELSE CONCAT('race_', demo.CANONICAL_RACE) END feature,
+ 1 value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.demographic demo
+ ON
+ labels.anon_id = demo.ANON_ID
+ {suffix}
+ """
+ print("Featurizing race")
+ query_job = self.client.query(query)
+ query_job.result()
+ self.create_table = False
+
+ def _get_diagnoses_features(self):
+ """
+ Gets diagnosis code features for patients in cohort table and appends to
+ long form bigquery table. Only selects diagnosis codes on the patient's
+ problem list -- ie source = 2.
+ """
+ if self.create_table:
+ prefix = (
+ f"CREATE OR REPLACE TABLE {self.working_proj_id}."
+ f"{self.dataset_name}.{self.table_name} AS("
+ )
+ suffix = ")"
+ else:
+ prefix = (
+ f"INSERT INTO {self.working_proj_id}.{self.dataset_name}"
+ f".{self.table_name}"
+ )
+ suffix = ""
+
+ query = f"""
+ {prefix}
+ SELECT
+ labels.observation_id,
+ labels.index_time,
+ 'Diagnoses' as feature_type,
+ CAST(dx.start_date_utc as TIMESTAMP) as feature_time,
+ UNIX_DATE(CAST(dx.start_date_utc as DATE)) as feature_id,
+ dx.icd10 as feature,
+ 1 value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.diagnosis dx
+ ON
+ labels.anon_id = dx.anon_id
+ WHERE
+ CAST(dx.start_date_utc as TIMESTAMP) < labels.index_time
+ AND
+ source = 2
+ {suffix}
+ """
+ print("Featurizing diagnosis codes")
+ query_job = self.client.query(query)
+ query_job.result()
+ self.create_table = False
+
+ def _get_medication_features(self):
+ """
+ Gets medication order features for patients in cohort table and appends
+ to long form bigquery table
+ """
+ max_look_back_time = 0
+ for lb in DEFAULT_DEPLOY_CONFIG['Categorical']['Medications']:
+ max_look_back_time = max(
+ lb['look_back'], max_look_back_time)
+
+ if self.create_table:
+ prefix = (
+ f"CREATE OR REPLACE TABLE {self.working_proj_id}."
+ f"{self.dataset_name}.{self.table_name} AS("
+ )
+ suffix = ")"
+ else:
+ prefix = (
+ f"INSERT INTO {self.working_proj_id}.{self.dataset_name}"
+ f".{self.table_name}"
+ )
+ suffix = ""
+
+ query = f"""
+ {prefix}
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Medications' as feature_type,
+ meds.order_inst_utc as feature_time,
+ meds.order_med_id_coded as feature_id,
+ meds.med_description as feature,
+ 1 as value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.order_med meds
+ ON
+ labels.anon_id = meds.anon_id
+ WHERE
+ CAST(meds.order_inst_utc as TIMESTAMP) < labels.index_time
+ AND
+ TIMESTAMP_ADD(meds.order_inst_utc,
+ INTERVAL 24*{max_look_back_time} HOUR)
+ >= labels.index_time
+ {suffix}
+ """
+ print("Featurizing medication orders")
+ query_job = self.client.query(query)
+ query_job.result()
+ self.create_table = False
+
+ def _get_age_features(self):
+ """
+ Get's age features for patients in cohort table, bins them and puts
+ them in feature timeline table.
+ """
+ query = f"""
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Demographics' as feature_type,
+ labels.index_time as feature_time,
+ 1 as feature_id,
+ 'Age' as feature,
+ DATE_DIFF(
+ CAST(labels.index_time AS date), demo.BIRTH_DATE_JITTERED, YEAR)
+ as value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ INNER JOIN
+ {self.project_id}.{self.dataset}.demographic demo
+ ON
+ labels.anon_id = demo.ANON_ID
+ """
+ print("Featurizing age")
+ df = pd.read_gbq(query)
+ df_train = df[df['index_time'].dt.year.isin(self.train_years)]
+ num_bins = self.feature_config['Numerical']['Age'][0]['num_bins']
+ df_binned = self.get_binned_features(df_train, df, num_bins)
+
+ # Write feature timeline in long form to bigquery dataset.table_name
+ df_binned.to_gbq(
+ destination_table=f"{self.dataset_name}.{self.table_name}",
+ project_id=self.working_proj_id,
+ if_exists='append',
+ table_schema=self.feature_timeline_schema
+ )
+ self.create_table = False
+
+ def _get_lab_results_features(self):
+ """
+ Collects lab result features for patients in cohort for select lab
+ components.
+ """
+ # Format list of lab component ids to grab
+ base_name_string = "("
+ for i, base_name in enumerate(DEFAULT_LAB_COMPONENT_IDS):
+ if i == len(DEFAULT_LAB_COMPONENT_IDS) - 1:
+ base_name_string += f"'{base_name}')"
+ else:
+ base_name_string += f"'{base_name}', "
+
+ # Get max look back time
+ max_look_back_time = 0
+ for look_back in DEFAULT_DEPLOY_CONFIG['Numerical']['LabResults']:
+ max_look_back_time = max(
+ look_back['look_back'], max_look_back_time)
+
+ query = f"""
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Lab Results' as feature_type,
+ lr.result_time_utc as feature_time,
+ CAST(lr.order_id_coded AS INTEGER) as feature_id,
+ lr.base_name as feature,
+ lr.ord_num_value as value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.lab_result lr
+ ON
+ labels.anon_id = lr.anon_id
+ WHERE
+ lr.result_time_utc < labels.index_time
+ AND
+ TIMESTAMP_ADD(lr.result_time_utc,
+ INTERVAL 24*{max_look_back_time} HOUR)
+ >= labels.index_time
+ AND
+ lr.base_name in {base_name_string}
+ AND
+ lr.ord_num_value IS NOT NULL
+ """
+ print("Featurizing lab results")
+ df = pd.read_gbq(query, progress_bar_type='tqdm')
+ df = df.astype({'value': float})
+ df_train = df[df['index_time'].dt.year.isin(self.train_years)]
+ num_bins = self.feature_config['Numerical']['LabResults'][0]['num_bins']
+ df_binned = self.get_binned_features(df_train, df, num_bins)
+
+ # Write feature matrix in long form to bigquery dataset.table_name
+ df_binned.to_gbq(
+ destination_table=f"{self.dataset_name}.{self.table_name}",
+ project_id=self.working_proj_id,
+ if_exists='append',
+ table_schema=self.feature_timeline_schema
+ )
+ self.create_table = False
+
+ def _get_vital_sign_features(self):
+ """
+ Collects flowsheet features for patients in cohort.
+ """
+ # Format list of lab component ids to grab
+ base_name_string = "("
+ for i, base_name in enumerate(DEFAULT_FLOWSHEET_FEATURES):
+ if i == len(DEFAULT_FLOWSHEET_FEATURES) - 1:
+ base_name_string += f"'{base_name}')"
+ else:
+ base_name_string += f"'{base_name}', "
+
+ # Get max look back time
+ max_look_back_time = 0
+ for look_back in DEFAULT_DEPLOY_CONFIG['Numerical']['Vitals']:
+ max_look_back_time = max(
+ look_back['look_back'], max_look_back_time)
+
+ query = f"""
+ SELECT DISTINCT
+ labels.observation_id,
+ labels.index_time,
+ 'Vitals' as feature_type,
+ f.recorded_time_utc as feature_time,
+ UNIX_SECONDS(f.recorded_time_utc) as feature_id,
+ f.row_disp_name as feature,
+ f.numerical_val_1 as value
+ FROM
+ {self.working_proj_id}.{self.dataset_name}.{self.cohort_table}
+ labels
+ LEFT JOIN
+ {self.project_id}.{self.dataset}.flowsheet f
+ ON
+ labels.anon_id = f.anon_id
+ WHERE
+ f.recorded_time_utc < labels.index_time
+ AND
+ TIMESTAMP_ADD(f.recorded_time_utc,
+ INTERVAL 24*{max_look_back_time} HOUR)
+ >= labels.index_time
+ AND
+ f.row_disp_name in {base_name_string}
+ AND
+ f.numerical_val_1 IS NOT NULL
+ """
+ print("Featurizing Vitals")
+ df = pd.read_gbq(query, progress_bar_type='tqdm')
+ df = df.astype({'value': float})
+ df_train = df[df['index_time'].dt.year.isin(self.train_years)]
+ num_bins = self.feature_config['Numerical']['Vitals'][0]['num_bins']
+ df_binned = self.get_binned_features(df_train, df, num_bins)
+
+ # Write feature matrix in long form to bigquery dataset.table_name
+ df_binned.to_gbq(
+ destination_table=f"{self.dataset_name}.{self.table_name}",
+ project_id=self.working_proj_id,
+ if_exists='append',
+ table_schema=self.feature_timeline_schema
+ )
+ self.create_table = False
diff --git a/medinfo/dataconversion/mapdata/2018_I10gem.tab.gz b/medinfo/dataconversion/mapdata/2018_I10gem.tab.gz
new file mode 100644
index 00000000..a01bee1b
Binary files /dev/null and b/medinfo/dataconversion/mapdata/2018_I10gem.tab.gz differ
diff --git a/medinfo/dataconversion/mapdata/2018_I9gem.tab.gz b/medinfo/dataconversion/mapdata/2018_I9gem.tab.gz
new file mode 100644
index 00000000..385bd010
Binary files /dev/null and b/medinfo/dataconversion/mapdata/2018_I9gem.tab.gz differ
diff --git a/medinfo/dataconversion/mapdata/CharlsonComorbidity-ICD10.tab b/medinfo/dataconversion/mapdata/CharlsonComorbidity-ICD10.tab
new file mode 100644
index 00000000..101f6c61
--- /dev/null
+++ b/medinfo/dataconversion/mapdata/CharlsonComorbidity-ICD10.tab
@@ -0,0 +1,290 @@
+Code Category Code_Type Source
+I21 MI ICD10 MHCP_Charlson
+I22 MI ICD10 MHCP_Charlson
+I252 MI ICD10 MHCP_Charlson
+I43 CHF ICD10 MHCP_Charlson
+I50 CHF ICD10 MHCP_Charlson
+I099 CHF ICD10 MHCP_Charlson
+I110 CHF ICD10 MHCP_Charlson
+I130 CHF ICD10 MHCP_Charlson
+I132 CHF ICD10 MHCP_Charlson
+I255 CHF ICD10 MHCP_Charlson
+I420 CHF ICD10 MHCP_Charlson
+I425 CHF ICD10 MHCP_Charlson
+I426 CHF ICD10 MHCP_Charlson
+I427 CHF ICD10 MHCP_Charlson
+I428 CHF ICD10 MHCP_Charlson
+I429 CHF ICD10 MHCP_Charlson
+P290 CHF ICD10 MHCP_Charlson
+I70 PeripheralVascular ICD10 MHCP_Charlson
+I71 PeripheralVascular ICD10 MHCP_Charlson
+I731 PeripheralVascular ICD10 MHCP_Charlson
+I738 PeripheralVascular ICD10 MHCP_Charlson
+I739 PeripheralVascular ICD10 MHCP_Charlson
+I771 PeripheralVascular ICD10 MHCP_Charlson
+I790 PeripheralVascular ICD10 MHCP_Charlson
+I792 PeripheralVascular ICD10 MHCP_Charlson
+K551 PeripheralVascular ICD10 MHCP_Charlson
+K558 PeripheralVascular ICD10 MHCP_Charlson
+K559 PeripheralVascular ICD10 MHCP_Charlson
+Z958 PeripheralVascular ICD10 MHCP_Charlson
+Z959 PeripheralVascular ICD10 MHCP_Charlson
+G45 Cerebrovascular ICD10 MHCP_Charlson
+G46 Cerebrovascular ICD10 MHCP_Charlson
+I60 Cerebrovascular ICD10 MHCP_Charlson
+I61 Cerebrovascular ICD10 MHCP_Charlson
+I62 Cerebrovascular ICD10 MHCP_Charlson
+I63 Cerebrovascular ICD10 MHCP_Charlson
+I64 Cerebrovascular ICD10 MHCP_Charlson
+I65 Cerebrovascular ICD10 MHCP_Charlson
+I66 Cerebrovascular ICD10 MHCP_Charlson
+I67 Cerebrovascular ICD10 MHCP_Charlson
+I68 Cerebrovascular ICD10 MHCP_Charlson
+I69 Cerebrovascular ICD10 MHCP_Charlson
+H340 Cerebrovascular ICD10 MHCP_Charlson
+F00 Dementia ICD10 MHCP_Charlson
+F01 Dementia ICD10 MHCP_Charlson
+F02 Dementia ICD10 MHCP_Charlson
+F03 Dementia ICD10 MHCP_Charlson
+G30 Dementia ICD10 MHCP_Charlson
+F051 Dementia ICD10 MHCP_Charlson
+G311 Dementia ICD10 MHCP_Charlson
+J40 COPD ICD10 MHCP_Charlson
+J41 COPD ICD10 MHCP_Charlson
+J42 COPD ICD10 MHCP_Charlson
+J43 COPD ICD10 MHCP_Charlson
+J44 COPD ICD10 MHCP_Charlson
+J45 COPD ICD10 MHCP_Charlson
+J46 COPD ICD10 MHCP_Charlson
+J47 COPD ICD10 MHCP_Charlson
+J60 COPD ICD10 MHCP_Charlson
+J61 COPD ICD10 MHCP_Charlson
+J62 COPD ICD10 MHCP_Charlson
+J63 COPD ICD10 MHCP_Charlson
+J64 COPD ICD10 MHCP_Charlson
+J65 COPD ICD10 MHCP_Charlson
+J66 COPD ICD10 MHCP_Charlson
+J67 COPD ICD10 MHCP_Charlson
+I278 COPD ICD10 MHCP_Charlson
+I279 COPD ICD10 MHCP_Charlson
+J684 COPD ICD10 MHCP_Charlson
+J701 COPD ICD10 MHCP_Charlson
+J703 COPD ICD10 MHCP_Charlson
+M05 Rheumatic ICD10 MHCP_Charlson
+M32 Rheumatic ICD10 MHCP_Charlson
+M33 Rheumatic ICD10 MHCP_Charlson
+M34 Rheumatic ICD10 MHCP_Charlson
+M06 Rheumatic ICD10 MHCP_Charlson
+M315 Rheumatic ICD10 MHCP_Charlson
+M351 Rheumatic ICD10 MHCP_Charlson
+M353 Rheumatic ICD10 MHCP_Charlson
+M360 Rheumatic ICD10 MHCP_Charlson
+K25 Peptic Ulcer ICD10 MHCP_Charlson
+K26 Peptic Ulcer ICD10 MHCP_Charlson
+K27 Peptic Ulcer ICD10 MHCP_Charlson
+K28 Peptic Ulcer ICD10 MHCP_Charlson
+B18 Liver Mild ICD10 MHCP_Charlson
+K73 Liver Mild ICD10 MHCP_Charlson
+K74 Liver Mild ICD10 MHCP_Charlson
+K700 Liver Mild ICD10 MHCP_Charlson
+K701 Liver Mild ICD10 MHCP_Charlson
+K702 Liver Mild ICD10 MHCP_Charlson
+K703 Liver Mild ICD10 MHCP_Charlson
+K709 Liver Mild ICD10 MHCP_Charlson
+K717 Liver Mild ICD10 MHCP_Charlson
+K713 Liver Mild ICD10 MHCP_Charlson
+K714 Liver Mild ICD10 MHCP_Charlson
+K715 Liver Mild ICD10 MHCP_Charlson
+K760 Liver Mild ICD10 MHCP_Charlson
+K762 Liver Mild ICD10 MHCP_Charlson
+K763 Liver Mild ICD10 MHCP_Charlson
+K764 Liver Mild ICD10 MHCP_Charlson
+K768 Liver Mild ICD10 MHCP_Charlson
+K769 Liver Mild ICD10 MHCP_Charlson
+Z944 Liver Mild ICD10 MHCP_Charlson
+E100 Diabetes ICD10 MHCP_Charlson
+E101 Diabetes ICD10 MHCP_Charlson
+E106 Diabetes ICD10 MHCP_Charlson
+E108 Diabetes ICD10 MHCP_Charlson
+E109 Diabetes ICD10 MHCP_Charlson
+E110 Diabetes ICD10 MHCP_Charlson
+E111 Diabetes ICD10 MHCP_Charlson
+E116 Diabetes ICD10 MHCP_Charlson
+E118 Diabetes ICD10 MHCP_Charlson
+E119 Diabetes ICD10 MHCP_Charlson
+E120 Diabetes ICD10 MHCP_Charlson
+E121 Diabetes ICD10 MHCP_Charlson
+E126 Diabetes ICD10 MHCP_Charlson
+E128 Diabetes ICD10 MHCP_Charlson
+E129 Diabetes ICD10 MHCP_Charlson
+E130 Diabetes ICD10 MHCP_Charlson
+E131 Diabetes ICD10 MHCP_Charlson
+E136 Diabetes ICD10 MHCP_Charlson
+E138 Diabetes ICD10 MHCP_Charlson
+E139 Diabetes ICD10 MHCP_Charlson
+E140 Diabetes ICD10 MHCP_Charlson
+E141 Diabetes ICD10 MHCP_Charlson
+E146 Diabetes ICD10 MHCP_Charlson
+E148 Diabetes ICD10 MHCP_Charlson
+E149 Diabetes ICD10 MHCP_Charlson
+E102 DiabetesComplications ICD10 MHCP_Charlson
+E103 DiabetesComplications ICD10 MHCP_Charlson
+E104 DiabetesComplications ICD10 MHCP_Charlson
+E105 DiabetesComplications ICD10 MHCP_Charlson
+E107 DiabetesComplications ICD10 MHCP_Charlson
+E112 DiabetesComplications ICD10 MHCP_Charlson
+E113 DiabetesComplications ICD10 MHCP_Charlson
+E114 DiabetesComplications ICD10 MHCP_Charlson
+E115 DiabetesComplications ICD10 MHCP_Charlson
+E117 DiabetesComplications ICD10 MHCP_Charlson
+E122 DiabetesComplications ICD10 MHCP_Charlson
+E123 DiabetesComplications ICD10 MHCP_Charlson
+E124 DiabetesComplications ICD10 MHCP_Charlson
+E125 DiabetesComplications ICD10 MHCP_Charlson
+E127 DiabetesComplications ICD10 MHCP_Charlson
+E132 DiabetesComplications ICD10 MHCP_Charlson
+E133 DiabetesComplications ICD10 MHCP_Charlson
+E134 DiabetesComplications ICD10 MHCP_Charlson
+E135 DiabetesComplications ICD10 MHCP_Charlson
+E137 DiabetesComplications ICD10 MHCP_Charlson
+E142 DiabetesComplications ICD10 MHCP_Charlson
+E143 DiabetesComplications ICD10 MHCP_Charlson
+E144 DiabetesComplications ICD10 MHCP_Charlson
+E145 DiabetesComplications ICD10 MHCP_Charlson
+E147 DiabetesComplications ICD10 MHCP_Charlson
+G81 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G82 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G041 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G114 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G801 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G802 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G830 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G831 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G832 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G833 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G834 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+G839 Hemiplegia Paraplegia ICD10 MHCP_Charlson
+N18 Renal ICD10 MHCP_Charlson
+N19 Renal ICD10 MHCP_Charlson
+N052 Renal ICD10 MHCP_Charlson
+N053 Renal ICD10 MHCP_Charlson
+N054 Renal ICD10 MHCP_Charlson
+N055 Renal ICD10 MHCP_Charlson
+N056 Renal ICD10 MHCP_Charlson
+N057 Renal ICD10 MHCP_Charlson
+N250 Renal ICD10 MHCP_Charlson
+I120 Renal ICD10 MHCP_Charlson
+I131 Renal ICD10 MHCP_Charlson
+N032 Renal ICD10 MHCP_Charlson
+N033 Renal ICD10 MHCP_Charlson
+N034 Renal ICD10 MHCP_Charlson
+N035 Renal ICD10 MHCP_Charlson
+N036 Renal ICD10 MHCP_Charlson
+N037 Renal ICD10 MHCP_Charlson
+Z490 Renal ICD10 MHCP_Charlson
+Z491 Renal ICD10 MHCP_Charlson
+Z492 Renal ICD10 MHCP_Charlson
+Z940 Renal ICD10 MHCP_Charlson
+Z992 Renal ICD10 MHCP_Charlson
+C00 Malignancy ICD10 MHCP_Charlson
+C01 Malignancy ICD10 MHCP_Charlson
+C02 Malignancy ICD10 MHCP_Charlson
+C03 Malignancy ICD10 MHCP_Charlson
+C04 Malignancy ICD10 MHCP_Charlson
+C05 Malignancy ICD10 MHCP_Charlson
+C06 Malignancy ICD10 MHCP_Charlson
+C07 Malignancy ICD10 MHCP_Charlson
+C08 Malignancy ICD10 MHCP_Charlson
+C09 Malignancy ICD10 MHCP_Charlson
+C10 Malignancy ICD10 MHCP_Charlson
+C11 Malignancy ICD10 MHCP_Charlson
+C12 Malignancy ICD10 MHCP_Charlson
+C13 Malignancy ICD10 MHCP_Charlson
+C14 Malignancy ICD10 MHCP_Charlson
+C15 Malignancy ICD10 MHCP_Charlson
+C16 Malignancy ICD10 MHCP_Charlson
+C17 Malignancy ICD10 MHCP_Charlson
+C18 Malignancy ICD10 MHCP_Charlson
+C19 Malignancy ICD10 MHCP_Charlson
+C20 Malignancy ICD10 MHCP_Charlson
+C21 Malignancy ICD10 MHCP_Charlson
+C22 Malignancy ICD10 MHCP_Charlson
+C23 Malignancy ICD10 MHCP_Charlson
+C24 Malignancy ICD10 MHCP_Charlson
+C25 Malignancy ICD10 MHCP_Charlson
+C26 Malignancy ICD10 MHCP_Charlson
+C30 Malignancy ICD10 MHCP_Charlson
+C31 Malignancy ICD10 MHCP_Charlson
+C32 Malignancy ICD10 MHCP_Charlson
+C33 Malignancy ICD10 MHCP_Charlson
+C34 Malignancy ICD10 MHCP_Charlson
+C37 Malignancy ICD10 MHCP_Charlson
+C38 Malignancy ICD10 MHCP_Charlson
+C39 Malignancy ICD10 MHCP_Charlson
+C40 Malignancy ICD10 MHCP_Charlson
+C41 Malignancy ICD10 MHCP_Charlson
+C43 Malignancy ICD10 MHCP_Charlson
+C45 Malignancy ICD10 MHCP_Charlson
+C46 Malignancy ICD10 MHCP_Charlson
+C47 Malignancy ICD10 MHCP_Charlson
+C48 Malignancy ICD10 MHCP_Charlson
+C49 Malignancy ICD10 MHCP_Charlson
+C50 Malignancy ICD10 MHCP_Charlson
+C51 Malignancy ICD10 MHCP_Charlson
+C52 Malignancy ICD10 MHCP_Charlson
+C53 Malignancy ICD10 MHCP_Charlson
+C54 Malignancy ICD10 MHCP_Charlson
+C55 Malignancy ICD10 MHCP_Charlson
+C56 Malignancy ICD10 MHCP_Charlson
+C57 Malignancy ICD10 MHCP_Charlson
+C58 Malignancy ICD10 MHCP_Charlson
+C60 Malignancy ICD10 MHCP_Charlson
+C61 Malignancy ICD10 MHCP_Charlson
+C62 Malignancy ICD10 MHCP_Charlson
+C63 Malignancy ICD10 MHCP_Charlson
+C64 Malignancy ICD10 MHCP_Charlson
+C65 Malignancy ICD10 MHCP_Charlson
+C66 Malignancy ICD10 MHCP_Charlson
+C67 Malignancy ICD10 MHCP_Charlson
+C68 Malignancy ICD10 MHCP_Charlson
+C69 Malignancy ICD10 MHCP_Charlson
+C70 Malignancy ICD10 MHCP_Charlson
+C71 Malignancy ICD10 MHCP_Charlson
+C72 Malignancy ICD10 MHCP_Charlson
+C73 Malignancy ICD10 MHCP_Charlson
+C74 Malignancy ICD10 MHCP_Charlson
+C75 Malignancy ICD10 MHCP_Charlson
+C76 Malignancy ICD10 MHCP_Charlson
+C81 Malignancy ICD10 MHCP_Charlson
+C82 Malignancy ICD10 MHCP_Charlson
+C83 Malignancy ICD10 MHCP_Charlson
+C84 Malignancy ICD10 MHCP_Charlson
+C85 Malignancy ICD10 MHCP_Charlson
+C88 Malignancy ICD10 MHCP_Charlson
+C90 Malignancy ICD10 MHCP_Charlson
+C91 Malignancy ICD10 MHCP_Charlson
+C92 Malignancy ICD10 MHCP_Charlson
+C93 Malignancy ICD10 MHCP_Charlson
+C94 Malignancy ICD10 MHCP_Charlson
+C95 Malignancy ICD10 MHCP_Charlson
+C96 Malignancy ICD10 MHCP_Charlson
+C97 Malignancy ICD10 MHCP_Charlson
+K704 Liver ModSevere ICD10 MHCP_Charlson
+K711 Liver ModSevere ICD10 MHCP_Charlson
+K721 Liver ModSevere ICD10 MHCP_Charlson
+K729 Liver ModSevere ICD10 MHCP_Charlson
+K765 Liver ModSevere ICD10 MHCP_Charlson
+K766 Liver ModSevere ICD10 MHCP_Charlson
+K767 Liver ModSevere ICD10 MHCP_Charlson
+I850 Liver ModSevere ICD10 MHCP_Charlson
+I859 Liver ModSevere ICD10 MHCP_Charlson
+I864 Liver ModSevere ICD10 MHCP_Charlson
+I982 Liver ModSevere ICD10 MHCP_Charlson
+C77 Malignancy Metastatic ICD10 MHCP_Charlson
+C78 Malignancy Metastatic ICD10 MHCP_Charlson
+C79 Malignancy Metastatic ICD10 MHCP_Charlson
+C80 Malignancy Metastatic ICD10 MHCP_Charlson
+B20 AIDS/HIV ICD10 MHCP_Charlson
+B21 AIDS/HIV ICD10 MHCP_Charlson
+B22 AIDS/HIV ICD10 MHCP_Charlson
+B24 AIDS/HIV ICD10 MHCP_Charlson
\ No newline at end of file
diff --git a/medinfo/dataconversion/mapdata/LabResultMap.tab.gz b/medinfo/dataconversion/mapdata/LabResultMap.tab.gz
new file mode 100644
index 00000000..1025e667
Binary files /dev/null and b/medinfo/dataconversion/mapdata/LabResultMap.tab.gz differ
diff --git a/medinfo/dataconversion/mapdata/TreatmentTeamGroups_UCSF.tab b/medinfo/dataconversion/mapdata/TreatmentTeamGroups_UCSF.tab
new file mode 100644
index 00000000..383cf6d4
--- /dev/null
+++ b/medinfo/dataconversion/mapdata/TreatmentTeamGroups_UCSF.tab
@@ -0,0 +1,122 @@
+# Aggregate primary Treatment Team designations into broad care categories
+treatment_team team_category
+PROV_NAME team_category
+CARDIOLOGY D, ROUNDING TEAM Cardiology
+GI/BILIARY, ROUNDING TEAM Medicine
+MEDICINE D3, ROUNDING TEAM Medicine
+NEURO IR, ROUNDING TEAM Interventional
+NEUROSURGERY TUMOR B, ROUNDING SurgerySpecialty
+ORTHO SPORTS, ROUNDING TEAM SurgerySpecialty
+PROCEDURE, ROUNDING TEAM SurgerySpecialty
+GYNE-ONCOLOGY, ROUNDING TEAM HemeOnc
+KIDNEY TRANSPLANT, ROUNDING TEAM TransplantSpeciality
+MEDICINE C2, ROUNDING TEAM Medicine
+MEDICINE G2, ROUNDING TEAM Medicine
+ORTHO SERVICE, ROUNDING TEAM SurgerySpecialty
+UROLOGY PARNASSUS, ROUNDING TEAM SurgerySpecialty
+VASCULAR SURG, ROUNDING TEAM SurgerySpecialty
+CARDIOLOGY E, ROUNDING TEAM Cardiology
+CHF, ROUNDING TEAM Cardiology
+GENERAL SURGERY-GALANTE, ROUNDING TEAM SurgerySpecialty
+GOLDMAN MED #5, ROUNDING TEAM Medicine
+GOLDMAN MED #6, ROUNDING TEAM Medicine
+MALIGNANT HEMATOLOGY TEAM 0, ROUNDING TEAM HemeOnc
+MEDICINE H2, ROUNDING TEAM Medicine
+OMFS, ROUNDING TEAM SurgerySpecialty
+OPHTHALMOLOGY, ROUNDING TEAM Interventional
+PAIN - ACUTE M-L, ROUNDING TEAM Medicine
+SURGICAL ONCOLOGY, ROUNDING TEAM SurgerySpecialty
+UROLOGY MISSION BAY, ROUNDING TEAM SurgerySpecialty
+ACUTE CARE SURGERY, ROUNDING TEAM SurgerySpecialty
+ADV LUNG DISEASE - MEDICINE Medicine
+CARDIOLOGY B, ROUNDING TEAM Cardiology
+CARDIOLOGY C, ROUNDING TEAM Cardiology
+CRITICAL CARE MISSION BAY, ROUNDING TEAM ICU
+GYNECOLOGY, ROUNDING TEAM OBGYN
+IP3, ROUNDING TEAM Pediatrics
+MALIGNANT HEMATOLOGY B1, ROUNDING TEAM HemeOnc
+MEDICINE C3, ROUNDING TEAM Medicine
+MEDICINE F1, ROUNDING TEAM Medicine
+MEDICINE NIGHT ATTENDING 2, ROUNDING TEAM(GOLD 4 &EAGLE) Medicine
+NEONATOLOGY BRIDGE, ROUNDING TEAM Pediatrics
+NEUROLOGY, ROUNDING TEAM Neurology
+NEUROSURGERY TUMOR A, ROUNDING SurgerySpecialty
+NEUROVASCULAR A, ROUNDING TEAM Neurology
+ORTHO ARTHROPL, ROUNDING TEAM SurgerySpecialty
+PLASTIC SURG MISSION BAY, ROUNDING TEAM SurgerySpecialty
+THORACIC SURG, ROUNDING TEAM SurgerySpecialty
+ACUTE/CHRONIC PAIN, IP3 ROUNDING TEAM Medicine
+CARDIOLOGY CCU B2, ROUNDING TEAM ICU
+COLORECTAL SURGERY, ROUNDING TEAM SurgerySpecialty
+EP, ROUNDING TEAM Cardiology
+IR, ROUNDING TEAM Interventional
+LIVER TRANSPLANT, ROUNDING TEAM TransplantSpeciality
+MALIGNANT HEMATOLOGY C2, ROUNDING TEAM HemeOnc
+MEDICINE B3, ROUNDING TEAM Medicine
+MEDICINE E1, ROUNDING TEAM Medicine
+MEDICINE G1, ROUNDING TEAM Medicine
+MEDICINE G3, ROUNDING TEAM Medicine
+MEDICINE I, ROUNDING TEAM Medicine
+MEDICINE NIGHT RESIDENT 2, ROUNDING TEAM(WOLF) Medicine
+NEONATOLOGY REDWOOD, ROUNDING TEAM Pediatrics
+ORAL & MAXILLOFACIAL SURGERY, ROUNDING TEAM SurgerySpecialty
+ORTHO TRAUMA, ROUNDING TEAM SurgerySpecialty
+PALLATIVE CARE/COMPASS CARE, IP3 ROUNDING TEAM Medicine
+ROUNDING TEAM 13ICU ICU
+BREAST SURG, ROUNDING TEAM SurgerySpecialty
+CARDIOLOGY, CCU A2, ROUNDING TEAM ICU
+GASTROENTEROL, ROUNDING TEAM Medicine
+GOLDMAN MED #1, ROUNDING TEAM Medicine
+GOLDMAN MED #3, ROUNDING TEAM Medicine
+MALIGNANT HEMATOLOGY B2, ROUNDING TEAM HemeOnc
+MEDICINE B1, ROUNDING TEAM Medicine
+MEDICINE D1, ROUNDING TEAM Medicine
+MEDICINE SWING RESIDENT 1, ROUNDING TEAM (BAT) Medicine
+NEUROSURGERY SPINE A, ROUNDING SurgerySpecialty
+OBSTETRICS, ROUNDING TEAM OBGYN
+OHNS MISSION BAY, ROUNDING TEAM SurgerySpecialty
+ORTHO HAND, ROUNDING TEAM SurgerySpecialty
+ORTHO SPINE, ROUNDING TEAM SurgerySpecialty
+ROUNDING TEAM 10ICU ICU
+ROUNDING TEAM 11ICU ICU
+ADV LUNG DISEASE - SURGERY SurgerySpecialty
+CARDIAC SURG ICU, ROUNDING TEAM SurgerySpecialty
+CARDIOLOGY CCU D2, ROUNDING TEAM ICU
+GENERAL SURGERY-DUNPHY, ROUNDING TEAM SurgerySpecialty
+GOLDMAN MED #4, ROUNDING TEAM Medicine
+HEME/ONC CONS, ROUNDING TEAM HemeOnc
+HEPATOBILIARY, ROUNDING TEAM Medicine
+MALIGNANT HEMATOLOGY A2, ROUNDING TEAM HemeOnc
+MALIGNANT HEMATOLOGY C1, ROUNDING TEAM HemeOnc
+MEDICINE A1, ROUNDING TEAM Medicine
+MEDICINE B2, ROUNDING TEAM Medicine
+MEDICINE C1, ROUNDING TEAM Medicine
+MEDICINE D2, ROUNDING TEAM Medicine
+MEDICINE E2, ROUNDING TEAM Medicine
+MEDICINE E3, ROUNDING TEAM Medicine
+MEDICINE F3, ROUNDING TEAM Medicine
+MEDICINE H1, ROUNDING TEAM Medicine
+MEDICINE NIGHT ATTENDING 1, ROUNDING TEAM(HAWK) Medicine
+MEDICINE NIGHT RESIDENT 1, ROUNDING TEAM(BADGER) Medicine
+NEONATOLOGY PACIFIC, ROUNDING TEAM Pediatrics
+OHNS PARNASSUS, ROUNDING TEAM SurgerySpecialty
+PLASTIC SURG, ROUNDING TEAM SurgerySpecialty
+ROUNDING TEAM 09ICU ICU
+ROUNDING TEAM PED TCU BLUE Pediatrics
+ROUNDING TEAM PED TCU YELLOW Pediatrics
+CARDIAC SURGERY ACUTE CARE FLOOR, ROUNDING TEAM SurgerySpecialty
+CARDIOLOGY A, ROUNDING TEAM Cardiology
+CARDIOLOGY CCU C2, ROUNDING TEAM ICU
+CRITICAL CARE TRIAGE, ROUNDING TEAM ICU
+GOLDMAN MED #2, ROUNDING TEAM Medicine
+MALIGNANT HEMATOLOGY A1, ROUNDING TEAM HemeOnc
+MEDICINE A2, ROUNDING TEAM Medicine
+MEDICINE A3, ROUNDING TEAM Medicine
+MEDICINE F2, ROUNDING TEAM Medicine
+MEDICINE H3, ROUNDING TEAM Medicine
+NEPHROLOGY, ROUNDING TEAM Medicine
+NEUROSURGERY SPINE B, ROUNDING SurgerySpecialty
+NEUROSURGERY VASCULAR, ROUNDIN SurgerySpecialty
+OBSTETRICS (ANTEPARTUM), ROUNDING TEAM OBGYN
+ORTHO ONCOLOGY, ROUNDING TEAM SurgerySpecialty
+ROUNDING TEAM 08ICU ICU
diff --git a/medinfo/dataconversion/mapdata/ahrq_ccsr.diagnosis_code.tab.gz b/medinfo/dataconversion/mapdata/ahrq_ccsr.diagnosis_code.tab.gz
new file mode 100644
index 00000000..3d1f7796
Binary files /dev/null and b/medinfo/dataconversion/mapdata/ahrq_ccsr.diagnosis_code.tab.gz differ
diff --git a/medinfo/dataconversion/mapdata/ahrq_ccsr.procedure_code.tab.gz b/medinfo/dataconversion/mapdata/ahrq_ccsr.procedure_code.tab.gz
new file mode 100644
index 00000000..7e44f201
Binary files /dev/null and b/medinfo/dataconversion/mapdata/ahrq_ccsr.procedure_code.tab.gz differ
diff --git a/medinfo/dataconversion/mapdata/ahrq_citation.txt b/medinfo/dataconversion/mapdata/ahrq_citation.txt
new file mode 100644
index 00000000..203bdb8a
--- /dev/null
+++ b/medinfo/dataconversion/mapdata/ahrq_citation.txt
@@ -0,0 +1,7 @@
+A copy of the mapping files should be gzipped in this folder and also loaded into the shared database to facilitate reuse
+
+# ICD10 diagnosis
+https://www.hcup-us.ahrq.gov/toolssoftware/ccsr/ccs_refined.jsp
+
+# ICD10 procedural
+https://www.hcup-us.ahrq.gov/toolssoftware/ccs10/ccs10.jsp
diff --git a/medinfo/dataconversion/mapdata/icd_gems_citation.txt b/medinfo/dataconversion/mapdata/icd_gems_citation.txt
new file mode 100644
index 00000000..d83f508c
--- /dev/null
+++ b/medinfo/dataconversion/mapdata/icd_gems_citation.txt
@@ -0,0 +1,5 @@
+General Equivalence Mapping files between ICD9 and ICD10 codes
+Download the respective GEMS ZIP file for more documentation
+A copy of the mapping files should be gzipped in this folder and also loaded into the shared database to facilitate reuse
+
+https://www.cms.gov/Medicare/Coding/ICD10/2018-ICD-10-CM-and-GEMs
diff --git a/medinfo/dataconversion/starr_conv/STARRDemographicsConversion.py b/medinfo/dataconversion/starr_conv/STARRDemographicsConversion.py
new file mode 100644
index 00000000..686e7d70
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/STARRDemographicsConversion.py
@@ -0,0 +1,367 @@
+#!/usr/bin/env python
+
+import sys, os
+import tempfile
+import time
+
+from itertools import islice
+from datetime import datetime
+from optparse import OptionParser
+from medinfo.common.Util import ProgressDots
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery
+from medinfo.db.Model import RowItemModel
+from medinfo.dataconversion.starr_conv import STARRUtil
+
+from medinfo.dataconversion.Util import log
+from medinfo.db.bigquery import bigQueryUtil
+
+from google.cloud import bigquery
+
+SOURCE_TABLE = 'starr_datalake2018.demographic'
+
+UNSPECIFIED_RACE_ETHNICITY = ("Unknown", "Other")
+HISPANIC_LATINO_ETHNICITY = "HISPANIC/LATINO"
+RACE_MAPPINGS = {
+ None: "Unknown",
+ "": "Unknown",
+ "American Indian or Alaska Native": "Native American",
+ "AMERICAN INDIAN OR ALASKA NATIVE": "Native American",
+ "ASIAN - HISTORICAL CONV": "Asian",
+ "Asian": "Asian",
+ "ASIAN": "Asian",
+ "ASIAN, HISPANIC": "Asian",
+ "Asian, non-Hispanic": "Asian",
+ "ASIAN, NON-HISPANIC": "Asian",
+ "Black": "Black",
+ "Black or African American": "Black",
+ "BLACK OR AFRICAN AMERICAN": "Black",
+ "Black, Hispanic": "Black",
+ "BLACK, HISPANIC": "Black",
+ "Black, non-Hispanic": "Black",
+ "BLACK, NON-HISPANIC": "Black",
+ "Native American": "Native American",
+ "NATIVE AMERICAN, HISPANIC": "Native American",
+ "Native American, non-Hispanic": "Native American",
+ "NATIVE AMERICAN, NON-HISPANIC": "Native American",
+ "Native Hawaiian or Other Pacific Islander": "Pacific Islander",
+ "NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER": "Pacific Islander",
+ "NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER ": "Pacific Islander",
+ "Other": "Other",
+ "OTHER": "Other",
+ "Other, Hispanic": "Hispanic/Latino",
+ "OTHER, HISPANIC": "Hispanic/Latino",
+ "Other, non-Hispanic": "Other",
+ "OTHER, NON-HISPANIC": "Other",
+ "Pacific Islander": "Pacific Islander",
+ "Pacific Islander, non-Hispanic": "Pacific Islander",
+ "PACIFIC ISLANDER, NON-HISPANIC": "Pacific Islander",
+ "Patient Refused": "Unknown",
+ "PATIENT REFUSED": "Unknown",
+ "Race and Ethnicity Unknown": "Unknown",
+ "RACE AND ETHNICITY UNKNOWN": "Unknown",
+ "Unknown": "Unknown",
+ "UNKNOWN": "Unknown",
+ "White": "White (%s)",
+ "WHITE": "White (%s)", # Subset by ethnicity Hispanic/Latino
+ "White, Hispanic": "White (Hispanic/Latino)",
+ "WHITE, HISPANIC": "White (Hispanic/Latino)",
+ "White, non-Hispanic": "White (Non-Hispanic/Latino)",
+ "WHITE, NON-HISPANIC": "White (Non-Hispanic/Latino)",
+ HISPANIC_LATINO_ETHNICITY: "Hispanic/Latino"
+}
+
+
+class STARRDemographicsConversion:
+ """Data conversion module to take STARR provided patient demographics data
+ into the structured data tables to facilitate subsequent analysis.
+
+ Capturing death date for now as an event.
+ """
+ connFactory = None # Allow specification of alternative DB connection source
+
+ categoryBySourceDescr = None # Local cache to track the clinical item category table contents
+ clinicalItemByCategoryIdExtId = None # Local cache to track clinical item table contents
+
+ def __init__(self):
+ """Default constructor"""
+ self.bqConn = bigQueryUtil.connection()
+ self.bqClient = bigQueryUtil.BigQueryClient()
+ self.connFactory = DBUtil.ConnectionFactory() # Default connection source
+
+ self.starrUtil = STARRUtil.StarrCommonUtils(self.bqClient)
+
+ self.categoryBySourceDescr = dict()
+ self.clinicalItemByCategoryIdExtId = dict()
+
+ def convertItemsByBatch(self, patientIdsFile, batchSize=250000, tempDir=tempfile.gettempdir(), removeCsvs=True,
+ targetDatasetId='clinical_item2018', skipFirstLine=True, startBatch=0):
+ # split pat ids into blocks
+ # for each split
+ # convert to local postgres db
+ # dump local postgres db to csv
+ # upload csv to BQ clinical item
+ # clean up
+
+ log.info('Batch size is %s \n\n' % batchSize)
+
+ def get_batch(input_file, num_lines):
+ return [line.strip() for line in islice(input_file, num_lines)]
+
+ with open(patientIdsFile, 'r') as f:
+ if skipFirstLine:
+ ignored_first_line = f.readline()
+
+ batch_counter = 0
+
+ # skip to required startBatch
+ while batch_counter <= startBatch:
+ ids_batch = get_batch(f, batchSize)
+ batch_counter += 1
+
+ while ids_batch:
+ log.info('Processing batch %s' % batch_counter)
+ log.info('Batch %s contains ids %s to %s' % (
+ batch_counter,
+ (batchSize * (batch_counter - 1) + 1),
+ min(batchSize * batch_counter, batchSize * (batch_counter - 1) + len(ids_batch))
+ ))
+
+ self.convertSourceItems(ids_batch)
+ self.starrUtil.dumpPatientItemToCsv(tempDir, batch_counter)
+
+ self.bqClient.reconnect_client() # refresh bq client connection
+ self.starrUtil.uploadPatientItemCsvToBQ(tempDir, targetDatasetId, batch_counter)
+
+ if removeCsvs:
+ self.starrUtil.removePatientItemCsv(tempDir, batch_counter)
+
+ self.starrUtil.removePatientItemAddedLines(SOURCE_TABLE)
+
+ log.info('Finished with batch %s \n\n' % batch_counter)
+ ids_batch = get_batch(f, batchSize)
+ batch_counter += 1
+
+ # For now keep the clinical_* tables, upload them once all tables have been converted
+ self.starrUtil.dumpClinicalTablesToCsv(tempDir)
+ self.starrUtil.uploadClinicalTablesCsvToBQ(tempDir, targetDatasetId)
+ self.starrUtil.removeClinicalTablesCsv(tempDir)
+ self.starrUtil.removeClinicalTablesAddedLines(SOURCE_TABLE)
+
+ def convertSourceItems(self, patientIds=None):
+ """Primary run function to process the contents of the starr_datalake2018.demographic
+ table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
+ Should look for redundancies to avoid repeating conversion.
+
+ patientIds - If provided, only process items for patient IDs matching those provided
+ """
+ log.info("Conversion for patients starting with: %s, %s total" % (patientIds[:5], len(patientIds)))
+ progress = ProgressDots()
+
+ with self.connFactory.connection() as conn:
+ category_model = self.categoryFromSourceItem(conn) # only 1 category - no need to have it in the loop
+ for sourceItem in self.querySourceItems(patientIds, progress):
+ self.convertSourceItem(category_model, sourceItem, conn)
+
+ def convertSourceItem(self, categoryModel, sourceItem, conn=None):
+ """Given an individual sourceItem record, produce / convert it into an equivalent
+ item record in the analysis database.
+ """
+ # Normalize sourceItem data into hierarchical components (category -> clinical_item -> patient_item).
+ # Relatively small / finite number of categories and clinical_items, so these should only have to be instantiated
+ # in a first past, with subsequent calls just yielding back in memory cached copies
+ clinicalItemModel = self.clinicalItemFromSourceItem(sourceItem, categoryModel, conn)
+ ignoredPatientItemModel = self.patientItemModelFromSourceItem(sourceItem, clinicalItemModel, conn)
+
+ def querySourceItems(self, patientIds=None, progress=None, debug=False):
+ """Query the database for list of all patient demographics
+ and yield the results one at a time. If patientIds provided, only return items
+ matching those IDs.
+ """
+ # Column headers to query for that map to respective fields in analysis table
+ headers = ["rit_uid", "birth_date_jittered", "gender", "death_date_jittered", "canonical_race",
+ "canonical_ethnicity"]
+
+ '''
+ query = SQLQuery()
+ for header in headers:
+ query.addSelect( header )
+ query.addFrom(SOURCE_TABLE + " as dem")
+ if patientIds is not None:
+ query.addWhereIn("dem.rit_uid", patientIds)
+ '''
+
+ query = '''
+ SELECT rit_uid,birth_date_jittered,gender,death_date_jittered,canonical_race,canonical_ethnicity
+ FROM {} as dem
+ WHERE dem.rit_uid IN UNNEST(@pat_ids)
+ ORDER BY rit_uid;
+ '''.format(SOURCE_TABLE)
+
+ query_params = [
+ bigquery.ArrayQueryParameter('pat_ids', 'STRING', patientIds)
+ ]
+
+ if debug:
+ print(query)
+ print(query_params)
+
+ query_job = self.bqClient.queryBQ(str(query), query_params=query_params, location='US', batch_mode=False,
+ verbose=True)
+
+ previous_rit_uid = None
+ rows_fetched = 0
+ for row in query_job: # API request - fetches results
+ rows_fetched += 1
+ # Row values can be accessed by field name or index
+ # assert row[0] == row.name == row["name"]
+ rowModel = RowItemModel(list(row.values()), headers)
+
+ # skip this record if we already processed this rit_uid
+ if rowModel["rit_uid"] == previous_rit_uid:
+ continue
+
+ if rowModel["birth_date_jittered"] is None:
+ # Blank values, doesn't make sense. Skip it
+ log.warning(rowModel)
+ else:
+ # Record birth at resolution of year
+ rowModel["itemDate"] = datetime(rowModel["birth_date_jittered"].year, 1, 1)
+ rowModel["name"] = "Birth"
+ rowModel["description"] = "Birth Year"
+ yield rowModel
+
+ # Record another at resolution of decade
+ decade = (rowModel["birth_date_jittered"].year // 10) * 10
+ rowModel["itemDate"] = datetime(rowModel["birth_date_jittered"].year, 1, 1)
+ rowModel["name"] = "Birth%ds" % decade
+ rowModel["description"] = "Birth Decade %ds" % decade
+ yield rowModel
+
+ # Summarize race and ethnicity information into single field of interest
+ raceEthnicity = self.summarizeRaceEthnicity(rowModel["canonical_race"], rowModel["canonical_ethnicity"])
+ rowModel["itemDate"] = datetime(rowModel["birth_date_jittered"].year, 1, 1)
+ rowModel["name"] = "Race" + (raceEthnicity.translate(str.maketrans('', '', " ()-/"))) # Strip off punctuation
+ rowModel["description"] = "Race/Ethnicity: %s" % raceEthnicity
+ yield rowModel
+
+ gender = rowModel["gender"].title()
+ rowModel["name"] = gender
+ rowModel["description"] = "%s Gender" % gender
+ yield rowModel
+
+ if rowModel["death_date_jittered"] is not None:
+ rowModel["name"] = "Death"
+ rowModel["description"] = "Death Date"
+ rowModel["itemDate"] = rowModel["death_date_jittered"]
+ yield rowModel
+
+ previous_rit_uid = rowModel["rit_uid"]
+
+ progress.Update()
+
+ log.debug("fetched {} rows".format(rows_fetched))
+
+ def summarizeRaceEthnicity(self, canonical_race, canonical_ethnicity):
+ """Given row model with patient information, return a single string to summarize the patient's race and ethnicity information"""
+ race_ethnicity = RACE_MAPPINGS[canonical_race]
+ if race_ethnicity in UNSPECIFIED_RACE_ETHNICITY and canonical_ethnicity == HISPANIC_LATINO_ETHNICITY:
+ race_ethnicity = RACE_MAPPINGS[
+ HISPANIC_LATINO_ETHNICITY] # Use Hispanic/Latino as basis if no other information
+ if race_ethnicity.find("%s") >= 0: # Found replacement string. Look to ethnicity for more information
+ if canonical_ethnicity == HISPANIC_LATINO_ETHNICITY:
+ race_ethnicity = race_ethnicity % RACE_MAPPINGS[HISPANIC_LATINO_ETHNICITY]
+ else:
+ race_ethnicity = race_ethnicity % ("Non-" + RACE_MAPPINGS[HISPANIC_LATINO_ETHNICITY])
+ return race_ethnicity
+
+ def categoryFromSourceItem(self, conn):
+ # Load or produce a clinical_item_category record model for the given sourceItem
+ category_key = (SOURCE_TABLE, "Demographics")
+ if category_key not in self.categoryBySourceDescr:
+ # Category does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ category = RowItemModel(
+ {
+ "source_table": SOURCE_TABLE,
+ "description": "Demographics",
+ }
+ )
+
+ (categoryId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", category, conn=conn)
+ category["clinical_item_category_id"] = categoryId
+ self.categoryBySourceDescr[category_key] = category
+ return self.categoryBySourceDescr[category_key]
+
+ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
+ # Load or produce a clinical_item record model for the given sourceItem
+ clinicalItemKey = (category["clinical_item_category_id"], sourceItem["name"])
+ if clinicalItemKey not in self.clinicalItemByCategoryIdExtId:
+ # Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ clinicalItem = RowItemModel(
+ {
+ "clinical_item_category_id": category["clinical_item_category_id"],
+ "external_id": None,
+ "name": sourceItem["name"],
+ "description": sourceItem["description"],
+ }
+ )
+ (clinicalItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", clinicalItem, conn=conn)
+ clinicalItem["clinical_item_id"] = clinicalItemId
+ self.clinicalItemByCategoryIdExtId[clinicalItemKey] = clinicalItem
+ return self.clinicalItemByCategoryIdExtId[clinicalItemKey]
+
+ def patientItemModelFromSourceItem(self, sourceItem, clinicalItem, conn):
+ # Produce a patient_item record model for the given sourceItem
+ patient_item = RowItemModel(
+ {
+ "external_id": None,
+ "patient_id": int(sourceItem["rit_uid"][2:], 16),
+ "encounter_id": None,
+ "clinical_item_id": clinicalItem["clinical_item_id"],
+ "item_date": str(sourceItem["itemDate"]), # without str(), the time is being converted in postgres
+ "item_date_utc": None, # it's a date - so, no need to have a duplicate here
+ }
+ )
+ insert_query = DBUtil.buildInsertQuery("patient_item", list(patient_item.keys()))
+ insert_params = list(patient_item.values())
+ try:
+ # Optimistic insert of a new unique item
+ DBUtil.execute(insert_query, insert_params, conn=conn)
+ except conn.IntegrityError as err:
+ # If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
+ log.warn(err)
+
+ def main(self, argv):
+ """Main method, callable from command line"""
+ usage_str = "usage: %prog [options]\n"
+ parser = OptionParser(usage=usage_str)
+ parser.add_option("-f", "--patient-ids-file", dest="patient_ids_file",
+ help="File containing ids of patients to convert")
+ (options, args) = parser.parse_args(argv[1:])
+
+ log.info("Starting: " + str.join(" ", argv))
+ timer = time.time()
+
+ conv_options = ConversionOptions()
+ conv_options.extract_parser_options(options)
+
+ self.convertItemsByBatch(conv_options.patient_ids_file)
+
+ timer = time.time() - timer
+ log.info("%.3f seconds to complete", timer)
+
+
+class ConversionOptions:
+ """Simple struct to contain multiple program options"""
+
+ def __init__(self):
+ self.patient_ids_file = None
+
+ def extract_parser_options(self, options):
+ if options.patient_ids_file is not None:
+ self.patient_ids_file = options.patient_ids_file
+
+
+if __name__ == "__main__":
+ instance = STARRDemographicsConversion()
+ instance.main(sys.argv)
diff --git a/medinfo/dataconversion/starr_conv/STARROrderMedConversion.py b/medinfo/dataconversion/starr_conv/STARROrderMedConversion.py
new file mode 100644
index 00000000..96c55d58
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/STARROrderMedConversion.py
@@ -0,0 +1,490 @@
+#!/usr/bin/env python
+import sys, os
+import hashlib
+import math
+import tempfile
+import time
+import logging
+
+from datetime import datetime
+from optparse import OptionParser
+from medinfo.common.Util import stdOpen, ProgressDots
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery
+from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList, RowItemFieldComparator
+
+from medinfo.dataconversion.Util import log
+from medinfo.dataconversion.Const import TEMPLATE_MEDICATION_ID, TEMPLATE_MEDICATION_PREFIX
+from medinfo.dataconversion.Const import COLLECTION_TYPE_ORDERSET
+from medinfo.dataconversion.Env import DATE_FORMAT
+
+from medinfo.db.bigquery import bigQueryUtil
+from medinfo.dataconversion.starr_conv import STARRUtil
+
+from google.cloud import bigquery
+
+SOURCE_TABLE = "starr_datalake2018.order_med"
+ORDERSET_TABLE = "starr_datalake2018.med_orderset"
+
+CATEGORY_TEMPLATE = "Med ({}) ({})" # For this data source, item category will be a Medication subscripted by medication route
+GENERIC_CODE_TEMPLATE = "MED{}" # Template for generic medication code reference if detailed RXCUI values not available
+RXCUI_CODE_TEMPLATE = "RXCUI{}" # Template for medication code references when detailed RXCUI values available
+
+
+class STARROrderMedConversion:
+ """Data conversion module to take STARR provided computerized physician order entry data
+ (medications specifically)
+ into the structured data analysis tables to facilitate subsequent analysis.
+
+ For combination medications (usually same medication but with "1.5x" dosing like
+ Metoprolol 75mg ordered as combination of 50mg + 25mg tabs), just record as the
+ first component in the mixture.
+
+ Ignore PRN orders for now to simplify data set and focus on standing orders.
+ """
+
+ def __init__(self):
+ """Default constructor"""
+ self.bqConn = bigQueryUtil.connection()
+ self.bqClient = bigQueryUtil.BigQueryClient()
+ self.connFactory = DBUtil.ConnectionFactory() # Default connection source, but Allow specification of alternative DB connection source
+
+ self.categoryBySourceDescr = dict() # Local cache to track the clinical item category table contents
+ self.clinicalItemByCategoryIdCode = dict() # Local cache to track clinical item table contents
+ self.itemCollectionByKeyStr = dict() # Local cache to track item collections
+ self.itemCollectionItemByCollectionIdItemId = dict() # Local cache to track item collection items
+
+ def convertAndUpload(self, convOptions, tempDir=tempfile.gettempdir(), removeCsvs=True, target_dataset_id='clinical_item2018'):
+ """
+ Wrapper around primary run function, does conversion locally and uploads to BQ
+ No batching done for treatment team since converted table is small
+ """
+ starrUtil = STARRUtil.StarrCommonUtils(self.bqClient)
+ self.convertSourceItems(convOptions)
+
+ batchCounter = 99999 # TODO (nodir) why not 0?
+ self.bqClient.reconnect_client() # refresh bq client connection
+ starrUtil.dumpPatientItemCollectionLinkToCsv(tempDir, batchCounter)
+ starrUtil.uploadPatientItemCollectionLinkCsvToBQ(tempDir, target_dataset_id, batchCounter)
+ if removeCsvs:
+ starrUtil.removePatientItemCollectionLinkCsv(tempDir, batchCounter)
+ starrUtil.removePatientItemCollectionLinkAddedLines(SOURCE_TABLE)
+
+ # For now keep the clinical_* tables, upload them them once all tables have been converted
+ starrUtil.dumpItemCollectionTablesToCsv(tempDir)
+ starrUtil.uploadItemCollectionTablesCsvToBQ(tempDir, target_dataset_id)
+ if removeCsvs:
+ starrUtil.removeItemCollectionTablesCsv(tempDir)
+ starrUtil.removeItemCollectionTablesAddedLines(SOURCE_TABLE)
+
+ starrUtil.dumpPatientItemToCsv(tempDir, batchCounter)
+ starrUtil.uploadPatientItemCsvToBQ(tempDir, target_dataset_id, batchCounter)
+ if removeCsvs:
+ starrUtil.removePatientItemCsv(tempDir, batchCounter)
+ starrUtil.removePatientItemAddedLines(SOURCE_TABLE)
+
+ # For now keep the clinical_* tables, upload them them once all tables have been converted
+ starrUtil.dumpClinicalTablesToCsv(tempDir)
+ starrUtil.uploadClinicalTablesCsvToBQ(tempDir, target_dataset_id)
+ if removeCsvs:
+ starrUtil.removeClinicalTablesCsv(tempDir)
+ starrUtil.removeClinicalTablesAddedLines(SOURCE_TABLE)
+
+ def convertSourceItems(self, convOptions):
+ """Primary run function to process the contents of the order_med
+ table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
+ Should look for redundancies after the fact to catch repeatEd conversions.
+
+ startDate - If provided, only return items whose order_time_jittered is on or after that date.
+ endDate - If provided, only return items whose order_time_jittered is before that date.
+ """
+ log.info("Conversion for items dated {} to {}".format(convOptions.startDate, convOptions.endDate))
+ progress = ProgressDots()
+ conn = self.connFactory.connection()
+ try:
+ # Load up the medication mapping table to facilitate subsequent conversions
+ rxcuiDataByMedId = self.loadRXCUIData()
+
+ # Next round for medications directly from order_med table not addressed in medmix
+ for sourceItem in self.querySourceItems(rxcuiDataByMedId, convOptions, progress=progress, conn=conn):
+ self.convertSourceItem(sourceItem, conn=conn)
+ progress.Update()
+
+ finally:
+ conn.close()
+ progress.PrintStatus()
+
+ def loadRXCUIData(self):
+ """Load up the full contents of the stride_mapped_meds table into
+ memory (only a few thousand records) to facilitate rapid lookup resolution
+ of common medication ingredient data.
+ """
+ rxcuiDataByMedId = dict()
+
+ query = \
+ """select medication_id, rxcui, active_ingredient
+ from starr_datalake2018.mapped_meds
+ """
+
+ query_job = self.bqClient.queryBQ(query, verbose=True)
+
+ for row in query_job: # API request - fetches results
+ (medId, rxcui, ingredient) = row # Unpack the data tuple
+ if medId not in rxcuiDataByMedId:
+ rxcuiDataByMedId[medId] = dict()
+ rxcuiDataByMedId[medId][rxcui] = ingredient
+
+ return rxcuiDataByMedId
+
+ def querySourceItems(self, rxcuiDataByMedId, convOptions, progress=None, conn=None):
+ """Query the database for list of all source clinical items (medications, etc.)
+ and yield the results one at a time. If startDate provided, only return items whose
+ order_time_jittered is on or after that date.
+ """
+ # Column headers to query for that map to respective fields in analysis table
+ queryHeaders = ["med.order_med_id_coded", "jc_uid", "med.pat_enc_csn_id_coded", "med.medication_id",
+ "med.med_description", "order_time_jittered", "order_time_jittered_utc", "med_route",
+ "number_of_times", "protocol_id", "protocol_name", "ss_section_id", "ss_section_name",
+ "ss_sg_key", "ss_sg_name", "ordering_mode"]
+
+ headers = ["order_med_id_coded", "jc_uid", "pat_enc_csn_id_coded", "medication_id",
+ "med_description", "order_time_jittered", "order_time_jittered_utc", "med_route",
+ "number_of_times", "protocol_id", "protocol_name", "ss_section_id", "ss_section_name",
+ "ss_sg_key", "ss_sg_name", "ordering_mode"]
+
+ # TODO original query - need to figure out how to pass date to query in BQ using SQLQuery object
+ # query = SQLQuery()
+ # for header in queryHeaders:
+ # query.addSelect(header)
+ # query.addFrom("stride_order_med as med left outer join stride_orderset_order_med as os on med.order_med_id = os.order_med_id") # Grab order set links if they exist
+ # query.addWhere("med.medication_id <> %s" % TEMPLATE_MEDICATION_ID)
+ # query.addWhere("freq_name not like '%%PRN'") # Ignore PRN orders
+ # if convOptions.startDate is not None:
+ # query.addWhereOp("ordering_date",">=", convOptions.startDate)
+ # if convOptions.endDate is not None:
+ # query.addWhereOp("ordering_date","<", convOptions.endDate)
+
+ query = "SELECT {} FROM {} as med left outer join {} as os on med.order_med_id_coded = os.order_med_id_coded".format(', '.join(queryHeaders), SOURCE_TABLE, ORDERSET_TABLE)
+
+ # TODO only 20 records with medication_id = TEMPLATE_MEDICATION_ID (whereas stride has 67041 such rows)
+ query += " where med.medication_id <> {}".format(TEMPLATE_MEDICATION_ID)
+ query += " and (freq_name is NULL or freq_name not like '%PRN')" # Ignore PRN orders
+ if convOptions.startDate is not None:
+ query += " and order_time_jittered >= @startDate"
+ if convOptions.endDate is not None:
+ query += " and order_time_jittered < @endDate"
+ query += " order by order_time_jittered, med.order_med_id_coded, jc_uid, med.pat_enc_csn_id_coded, med.medication_id"
+ query += ';'
+
+ query_params = [
+ bigquery.ScalarQueryParameter(
+ 'startDate',
+ 'DATETIME',
+ convOptions.startDate,
+ ),
+ bigquery.ScalarQueryParameter(
+ 'endDate',
+ 'DATETIME',
+ convOptions.endDate,
+ )
+ ]
+
+ # TODO Query to get an estimate of how long the process will be
+ # if progress is not None:
+ # progress.total = DBUtil.execute(query.totalQuery(), conn=conn)[0][0]
+
+ query_job = self.bqClient.queryBQ(query, query_params=query_params, verbose=True)
+
+ for row in query_job: # API request - fetches results
+ rowModel = RowItemModel(list(row.values()), headers)
+ log.debug("rowModel: {}".format(rowModel))
+ for normalizedModel in self.normalizeMedData(rxcuiDataByMedId, rowModel, convOptions):
+ yield normalizedModel # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
+
+ def normalizeMedData(self, rxcuiDataByMedId, rowModel, convOptions):
+ """Normalize medication data by active ingredient mixtures and number of doses"""
+ for rowModel in self.normalizeMedIngredients(rxcuiDataByMedId, rowModel, convOptions):
+ if convOptions.doseCountLimit is not None and rowModel["number_of_times"] is not None:
+ if rowModel["number_of_times"] < convOptions.doseCountLimit:
+ rowModel["code"] += " (<{})".format(convOptions.doseCountLimit)
+ rowModel["med_description"] += " (<{} doses)".format(convOptions.doseCountLimit)
+ yield rowModel
+
+ @staticmethod
+ def normalizeMedIngredients(rxcuiDataByMedId, rowModel, convOptions):
+ """Given a rowModel of medication data, normalize it further.
+ Specifically, look for common active ingredients to simplify the data.
+ If the medication is actually a compound of multiple active ingredients,
+ then break out into active ingredients.
+
+ If normalizeMixtures set, then will yield out multiple items to reflect each active ingredient.
+ If normalizeMixtures not set, will yield a single item with name being a composite of the active ingredients.
+ """
+ medId = rowModel["medication_id"]
+
+ if medId not in rxcuiDataByMedId:
+ # No mapping entry found, just use the available generic medication data then
+ rowModel["code"] = GENERIC_CODE_TEMPLATE.format(rowModel["medication_id"])
+ yield rowModel
+
+ else:
+ # Mapping entry found, yield a normalized model for each active ingredient found
+ # (will usually be a 1-to-1 relation, but sometimes multiple
+ ingredientByRxcui = rxcuiDataByMedId[medId]
+ if len(ingredientByRxcui) <= 1 or convOptions.normalizeMixtures:
+ # Single ingredient or want component active ingredients to each have one record
+ for (rxcui, ingredient) in ingredientByRxcui.items():
+ # ~250/15000 RxCUI's don't have a defined active ingredient.
+ if ingredient is None:
+ # No mapping entry found, just use the available generic medication data then
+ rowModel["code"] = GENERIC_CODE_TEMPLATE.format(rowModel["medication_id"])
+ yield rowModel
+ else:
+ normalizedModel = RowItemModel(rowModel)
+ normalizedModel["medication_id"] = rxcui
+ normalizedModel["code"] = RXCUI_CODE_TEMPLATE.format(normalizedModel["medication_id"])
+ normalizedModel["med_description"] = ingredient.title()
+ if convOptions.includeRouteInDescription:
+ normalizedModel["med_description"] += " {}".format(normalizedModel["med_route"])
+
+ yield normalizedModel
+ else:
+ # Mixture of multiple ingredients and want to keep denormalized
+ # Extract out the active ingredient names to make a composite based only on that unique combination
+ ingredientRxcuiList = [(ingredient, rxcui) for (rxcui, ingredient) in ingredientByRxcui.items()]
+ # Ensure consistent order
+ ingredientRxcuiList.sort(key=lambda x: x if x[0] is not None else ('', x[1])) # Python2 sort keeps None at the top while Python3 doesn't allow NoneType and int comparison)
+
+ rxcuiStrList = list()
+ ingredientList = list()
+ for (ingredient, rxcui) in ingredientRxcuiList:
+ # ~250/15000 RxCUI's don't have a defined active ingredient.
+ if ingredient is None:
+ continue
+ rxcuiStrList.append(str(rxcui))
+ ingredientList.append(ingredient.title())
+ rxcuiComposite = str.join(",", rxcuiStrList)
+ ingredientComposite = str.join("-", ingredientList)
+
+ #rowModel["medication_id"] = hash(tuple(rxcuiList)) # Arbitrary integer, hash to try to be unique
+ #rowModel["code"] = RXCUI_CODE_TEMPLATE.format(rxcuiComposite)
+ # Nah, just stick to medication_id instead of creating a new hash number
+ rowModel["code"] = GENERIC_CODE_TEMPLATE.format(rowModel["medication_id"])
+ rowModel["med_description"] = ingredientComposite
+ if convOptions.includeRouteInDescription:
+ rowModel["med_description"] += " {}".format(rowModel["med_route"])
+ yield rowModel
+
+ def convertSourceItem(self, sourceItem, conn=None):
+ """Given an individual sourceItem record, produce / convert it into an equivalent
+ item record in the analysis database.
+ """
+ extConn = conn is not None
+ if not extConn:
+ conn = self.connFactory.connection()
+ try:
+ # Normalize sourceItem data into hierarchical components (category -> clinical_item -> patient_item).
+ # Relatively small / finite number of categories and clinical_items, so these should only have to be instantiated
+ # in a first pass, with subsequent calls just yielding back in memory cached copies
+ category = self.categoryFromSourceItem(sourceItem, conn=conn)
+ clinicalItem = self.clinicalItemFromSourceItem(sourceItem, category, conn=conn)
+ patientItem = self.patientItemFromSourceItem(sourceItem, clinicalItem, conn=conn)
+
+ if sourceItem["protocol_id"] is not None:
+ # Similarly build up item collection (order set) hierarchy and link
+ itemCollection = self.itemCollectionFromSourceItem(sourceItem, conn=conn)
+ itemCollectionItem = self.itemCollectionItemFromSourceItem(sourceItem, itemCollection, clinicalItem, conn=conn)
+ patientItemCollectionLink = self.patientItemCollectionLinkFromSourceItem(sourceItem, itemCollectionItem, patientItem, conn=conn)
+
+ finally:
+ if not extConn:
+ conn.close()
+
+ def categoryFromSourceItem(self, sourceItem, conn):
+ # Load or produce a clinical_item_category record model for the given sourceItem
+ # In this case, always Medication
+ categoryDescription = CATEGORY_TEMPLATE.format(sourceItem["med_route"], sourceItem["ordering_mode"])
+ categoryKey = (SOURCE_TABLE, categoryDescription)
+ if categoryKey not in self.categoryBySourceDescr:
+ # Category does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ category = RowItemModel(
+ {
+ "source_table": SOURCE_TABLE,
+ "description": categoryDescription,
+ }
+ )
+ (categoryId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", category, conn=conn)
+ category["clinical_item_category_id"] = categoryId
+ self.categoryBySourceDescr[categoryKey] = category
+ return self.categoryBySourceDescr[categoryKey]
+
+ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
+ # Load or produce a clinical_item record model for the given sourceItem
+ clinicalItemKey = (category["clinical_item_category_id"], sourceItem["code"])
+ if clinicalItemKey not in self.clinicalItemByCategoryIdCode:
+ # Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ clinicalItem = RowItemModel(
+ {
+ "clinical_item_category_id": category["clinical_item_category_id"],
+ "external_id": sourceItem["medication_id"],
+ "name": sourceItem["code"],
+ "description": sourceItem["med_description"],
+ }
+ )
+ (clinicalItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", clinicalItem, conn=conn)
+ clinicalItem["clinical_item_id"] = clinicalItemId
+ self.clinicalItemByCategoryIdCode[clinicalItemKey] = clinicalItem
+ else:
+ # Clinical Item does exist, but check for redundancies and opportunities to
+ # simplify different descriptions for the same medication
+ priorClinicalItem = self.clinicalItemByCategoryIdCode[clinicalItemKey]
+ priorDescription = priorClinicalItem["description"]
+ if len(sourceItem["med_description"]) < len(priorDescription) or priorDescription.startswith(TEMPLATE_MEDICATION_PREFIX):
+ # Prior medication recorded description either a generic template,
+ # or a longer version than necessary, that can be replaced with the current one
+ priorClinicalItem["description"] = sourceItem["med_description"]
+ DBUtil.updateRow("clinical_item", priorClinicalItem, priorClinicalItem["clinical_item_id"], conn=conn)
+ return self.clinicalItemByCategoryIdCode[clinicalItemKey]
+
+ def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
+ # Produce a patient_item record model for the given sourceItem
+ patientItem = RowItemModel(
+ {
+ "external_id": sourceItem["order_med_id_coded"],
+ "patient_id": int(sourceItem["jc_uid"][2:], 16),
+ "encounter_id": sourceItem["pat_enc_csn_id_coded"],
+ "clinical_item_id": clinicalItem["clinical_item_id"],
+ "item_date": sourceItem["order_time_jittered"],
+ "item_date_utc": str(sourceItem["order_time_jittered_utc"]), # without str(), the time is being converted in postgres
+ }
+ )
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()))
+ insertParams = list(patientItem.values())
+ try:
+ # Optimistic insert of a new unique item
+ DBUtil.execute(insertQuery, insertParams, conn=conn)
+ patientItem["patient_item_id"] = DBUtil.execute(DBUtil.identityQuery("patient_item"), conn=conn)[0][0]
+ except conn.IntegrityError as err:
+ # If turns out to be a duplicate, okay, pull out existint ID and continue to insert whatever else is possible
+ log.info(err) # Lookup just by the composite key components to avoid attempting duplicate insertion again
+ searchPatientItem = {
+ "patient_id": patientItem["patient_id"],
+ "clinical_item_id": patientItem["clinical_item_id"],
+ "item_date": patientItem["item_date"],
+ }
+ (patientItem["patient_item_id"], isNew) = DBUtil.findOrInsertItem("patient_item", searchPatientItem, conn=conn)
+ return patientItem
+
+ def itemCollectionFromSourceItem(self, sourceItem, conn):
+ # Load or produce an item_collection record model for the given sourceItem
+ if sourceItem["protocol_id"] is None:
+ # No order set link to this item, so nothing to return
+ return None
+
+ key = {
+ "protocol_id": sourceItem["protocol_id"],
+ "ss_section_id": sourceItem["ss_section_id"],
+ "ss_sg_key": sourceItem["ss_sg_key"].strip().upper() if sourceItem["ss_sg_key"] is not None else None
+ }
+
+ collection_key = "%(protocol_id)d-%(ss_section_id)s-%(ss_sg_key)s" % key
+ if collection_key not in self.itemCollectionByKeyStr:
+ # Collection does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ collection = RowItemModel(
+ {
+ "external_id": sourceItem["protocol_id"],
+ "name": sourceItem["protocol_name"],
+ "section": sourceItem["ss_section_name"],
+ "subgroup": sourceItem["ss_sg_name"],
+ }
+ )
+ (collectionId, isNew) = DBUtil.findOrInsertItem("item_collection", collection, conn=conn)
+ collection["item_collection_id"] = collectionId
+ self.itemCollectionByKeyStr[collection_key] = collection
+ return self.itemCollectionByKeyStr[collection_key]
+
+ def itemCollectionItemFromSourceItem(self, sourceItem, itemCollection, clinicalItem, conn):
+ # Load or produce an item_collection_item record model for the given sourceItem
+ itemKey = (itemCollection["item_collection_id"], clinicalItem["clinical_item_id"])
+ if itemKey not in self.itemCollectionItemByCollectionIdItemId:
+ # Item Collection Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ collectionItem = RowItemModel(
+ {
+ "item_collection_id": itemCollection["item_collection_id"],
+ "clinical_item_id": clinicalItem["clinical_item_id"],
+ "collection_type_id": COLLECTION_TYPE_ORDERSET,
+ }
+ )
+ (collectionItemId, isNew) = DBUtil.findOrInsertItem("item_collection_item", collectionItem, conn=conn)
+ collectionItem["item_collection_item_id"] = collectionItemId
+ self.itemCollectionItemByCollectionIdItemId[itemKey] = collectionItem
+ return self.itemCollectionItemByCollectionIdItemId[itemKey]
+
+ def patientItemCollectionLinkFromSourceItem(self, sourceItem, collectionItem, patientItem, conn):
+ # Produce a patient_item_collection_link record model for the given sourceItem
+ patientItemCollectionLink = RowItemModel(
+ {
+ "patient_item_id": patientItem["patient_item_id"],
+ "item_collection_item_id": collectionItem["item_collection_item_id"],
+ }
+ )
+ insertQuery = DBUtil.buildInsertQuery("patient_item_collection_link", list(patientItemCollectionLink.keys()))
+ insertParams = list(patientItemCollectionLink.values())
+ try:
+ # Optimistic insert of a new unique item
+ DBUtil.execute(insertQuery, insertParams, conn=conn)
+ except conn.IntegrityError as err:
+ # If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
+ log.info(err)
+
+ def main(self, argv):
+ """Main method, callable from command line"""
+ log.setLevel(logging.FATAL)
+
+ usage_str = "usage: %prog [options]\n"
+ parser = OptionParser(usage=usage_str)
+ parser.add_option("-s", "--startDate", dest="startDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time on or after this date.")
+ parser.add_option("-e", "--endDate", dest="endDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time before this date.")
+ parser.add_option("-n", "--normalizeMixtures", dest="normalizeMixtures", action="store_true", help="If set, when find medication mixtures, will unravel / normalize into separate entries, one for each ingredient")
+ parser.add_option("-d", "--doseCountLimit", dest="doseCountLimit", help="Medication orders with a finite number of doses specified less than this limit will be labeled as different items than those without a number specified, or whose number is >= to this limit. Intended to distinguish things like IV single bolus / use vs. continuous infusions and standing medication orders")
+ (options, args) = parser.parse_args(argv[1:])
+
+ log.info("Starting: " + str.join(" ", argv))
+ timer = time.time()
+
+ conv_options = ConversionOptions()
+ conv_options.extract_parser_options(options)
+
+ self.convertAndUpload(conv_options)
+
+ timer = time.time() - timer
+ log.info("%.3f seconds to complete", timer)
+
+
+class ConversionOptions:
+ """Simple struct to contain multiple program options"""
+ def __init__(self):
+ self.startDate = None
+ self.endDate = None
+ self.normalizeMixtures = False
+ self.doseCountLimit = None
+ self.includeRouteInDescription = True
+
+ def extract_parser_options(self, options):
+ if options.startDate is not None:
+ # Parse out the start date parameter
+ time_tuple = time.strptime(options.startDate, DATE_FORMAT)
+ self.startDate = datetime(*time_tuple[0:3])
+
+ if options.endDate is not None:
+ # Parse out the end date parameter
+ time_tuple = time.strptime(options.endDate, DATE_FORMAT)
+ self.endDate = datetime(*time_tuple[0:3])
+
+ if options.doseCountLimit is not None:
+ self.doseCountLimit = int(options.doseCountLimit)
+
+
+if __name__ == "__main__":
+ instance = STARROrderMedConversion()
+ instance.main(sys.argv)
diff --git a/medinfo/dataconversion/starr_conv/STARROrderProcConversion.py b/medinfo/dataconversion/starr_conv/STARROrderProcConversion.py
new file mode 100644
index 00000000..6d28b686
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/STARROrderProcConversion.py
@@ -0,0 +1,424 @@
+#!/usr/bin/env python
+
+import sys, os
+import logging
+import re
+import tempfile
+import time
+
+from datetime import datetime
+from datetime import timedelta
+from optparse import OptionParser
+from medinfo.common.Util import stdOpen, ProgressDots
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery
+from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList
+
+from medinfo.dataconversion.Util import log
+from medinfo.dataconversion.Const import COLLECTION_TYPE_ORDERSET
+from medinfo.dataconversion.Env import DATE_FORMAT
+
+from medinfo.db.bigquery import bigQueryUtil
+from medinfo.dataconversion.starr_conv import STARRUtil
+
+from google.cloud import bigquery
+
+SOURCE_TABLE = "starr_datalake2018.order_proc"
+ORDERSET_TABLE = "starr_datalake2018.proc_orderset"
+TARGET_DATASET_ID = "clinical_item2018"
+
+
+class STARROrderProcConversion:
+ """Data conversion module to take STRIDE provided computerized physician order entry data
+ into the structured data analysis tables to facilitate subsequent analysis.
+
+ Renormalizes denormalized data back out to order types (clinical_item_category),
+ orders (clinical_item), and actual individual patient orders (patient_item).
+ Ignores records with instantiated_time not null, so will only be interested
+ in originally ordered parent orders, not spawned child orders.
+
+ Consider Ignore PRN orders for now to simplify data set and focus on standing orders
+ (but a small minority for these orders anyway)
+
+ Beware of usage of this module and how it accounts for new unique clinical_items (probably applies to all the conversion scripts)
+ # This should be what determines a new unique clinical_item.
+ # Some debate about whether to distinguish by proc_id or proc_code, but there are many labs and other procs
+ # that use different proc_ids even though they are obviously the same. Go link in STRIDE_ORDER_PROC for examples like LABA1C.
+ # The self.clinicalItemByCategoryIdExtId is supposed to keep track of which clinical_items we're already aware of,
+ # but not that it starts blank when this module runs.
+ # So you in theory should only run this conversion process on a database once
+ # (otherwise it will not be aware that a bunch of duplicate clinical_items already exist in the database).
+ # Alternatively, this module should be updated, so that it initializes this key tracker with whatever is already in the database.
+ """
+ def __init__(self):
+ """Default constructor"""
+ self.bqConn = bigQueryUtil.connection()
+ self.bqClient = bigQueryUtil.BigQueryClient()
+ self.connFactory = DBUtil.ConnectionFactory() # Default connection source, but Allow specification of alternative DB connection source
+
+ self.starrUtil = STARRUtil.StarrCommonUtils(self.bqClient)
+
+ self.categoryBySourceDescr = dict() # Local cache to track the clinical item category table contents
+ self.clinicalItemByCategoryIdExtId = dict() # Local cache to track clinical item table contents
+
+ self.itemCollectionByKeyStr = dict() # Local cache to track item collections
+ self.itemCollectionItemByCollectionIdItemId = dict() # Local cache to track item collection items
+
+ self.patient_items = dict() # Local cache of processed patient items
+ self.patient_item_collection_links = set() # Local cache of processed patient item collection links
+
+ def convertAndUpload(self, startDate=None, endDate=None, tempDir=tempfile.gettempdir(), removeCsvs=True):
+ """
+ Wrapper around primary run function, does conversion locally and uploads to BQ
+ No batching done for treatment team since converted table is small
+ """
+ self.convertSourceItems(startDate, endDate)
+
+ batchCounter = 99999 # TODO (nodir) why not 0?
+ self.bqClient.reconnect_client() # refresh bq client connection
+ self.starrUtil.dumpPatientItemCollectionLinkToCsv(tempDir, batchCounter)
+ self.starrUtil.uploadPatientItemCollectionLinkCsvToBQ(tempDir, TARGET_DATASET_ID, batchCounter)
+ if removeCsvs:
+ self.starrUtil.removePatientItemCollectionLinkCsv(tempDir, batchCounter)
+ self.starrUtil.removePatientItemCollectionLinkAddedLines(SOURCE_TABLE)
+
+ self.starrUtil.dumpPatientItemToCsv(tempDir, batchCounter)
+ self.starrUtil.uploadPatientItemCsvToBQ(tempDir, TARGET_DATASET_ID, batchCounter)
+ if removeCsvs:
+ self.starrUtil.removePatientItemCsv(tempDir, batchCounter)
+ self.starrUtil.removePatientItemAddedLines(SOURCE_TABLE)
+
+ def move_clinical_and_item_collection_to_bq(self, tempDir=tempfile.gettempdir(), removeCsvs=True):
+ # For now keep the clinical_* tables, upload them them once all tables have been converted
+ self.starrUtil.dumpItemCollectionTablesToCsv(tempDir)
+ self.starrUtil.uploadItemCollectionTablesCsvToBQ(tempDir, TARGET_DATASET_ID)
+ if removeCsvs:
+ self.starrUtil.removeItemCollectionTablesCsv(tempDir)
+ self.starrUtil.removeItemCollectionTablesAddedLines(SOURCE_TABLE)
+ # For now keep the clinical_* tables, upload them them once all tables have been converted
+ self.starrUtil.dumpClinicalTablesToCsv(tempDir)
+ self.starrUtil.uploadClinicalTablesCsvToBQ(tempDir, TARGET_DATASET_ID)
+ if removeCsvs:
+ self.starrUtil.removeClinicalTablesCsv(tempDir)
+ self.starrUtil.removeClinicalTablesAddedLines(SOURCE_TABLE)
+
+ def convertSourceItems(self, startDate=None, endDate=None):
+ """Primary run function to process the contents of the stride_order_proc
+ table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
+ Should look for redundancies to avoid repeating conversion.
+
+ startDate - If provided, only return items whose ordering_date is on or after that date.
+ endDate - If provided, only return items whose ordering_date is before that date.
+ """
+ log.info("Conversion for items dated {} to {}".format(startDate, endDate))
+ progress = ProgressDots()
+ conn = self.connFactory.connection()
+ try:
+ for sourceItem in self.querySourceItems(startDate, endDate, progress=progress, conn=conn):
+ self.convertSourceItem(sourceItem, conn=conn)
+ progress.Update()
+ finally:
+ conn.close()
+ progress.PrintStatus()
+
+ def querySourceItems(self, startDate=None, endDate=None, progress=None, conn=None):
+ """Query the database for list of all source clinical items (orders, etc.)
+ and yield the results one at a time. If startDate provided, only return items whose order_time is on or after that date.
+ Ignore entries with instantiated_time not null, as those represent child orders spawned from an original order,
+ whereas we are more interested in the decision making to enter the original order.
+ """
+ extConn = conn is not None
+ if not extConn:
+ conn = self.connFactory.connection()
+
+ # Column headers to query for that map to respective fields in analysis table
+ queryHeaders = ["op.order_proc_id_coded", "jc_uid", "op.pat_enc_csn_id_coded", "op.order_type", "op.proc_id",
+ "op.proc_code", "description", "order_time_jittered", "order_time_jittered_utc",
+ "ordering_mode", "protocol_id", "protocol_name", "ss_section_id", "ss_section_name",
+ "ss_sg_key", "ss_sg_name"]
+ headers = ["order_proc_id_coded", "jc_uid", "pat_enc_csn_id_coded", "order_type", "proc_id",
+ "proc_code", "description", "order_time_jittered", "order_time_jittered_utc",
+ "ordering_mode", "protocol_id", "protocol_name", "ss_section_id", "ss_section_name",
+ "ss_sg_key", "ss_sg_name"]
+
+ # TODO original query - need to figure out how to pass date to query in BQ using SQLQuery object
+ # query = SQLQuery()
+ # for header in queryHeaders:
+ # query.addSelect(header)
+ # query.addFrom("stride_order_proc as op left outer join stride_orderset_order_proc as os on op.order_proc_id = os.order_proc_id")
+ # query.addWhere("order_time is not null") # Rare cases of "comment" orders with no date/time associated
+ # query.addWhere("instantiated_time is null")
+ # query.addWhere("(stand_interval is null or stand_interval not like '%%PRN')") # Ignore PRN orders to simplify somewhat
+ # if startDate is not None:
+ # query.addWhereOp("order_time", ">=", startDate)
+ # if endDate is not None:
+ # query.addWhereOp("order_time", "<", endDate)
+
+ query = "SELECT {} FROM {} as op left outer join {} as os on op.order_proc_id_coded = os.order_proc_id_coded" \
+ .format(', '.join(queryHeaders), SOURCE_TABLE, ORDERSET_TABLE)
+
+ query += " where order_time_jittered is not null" # Rare cases of "comment" orders with no date/time associated
+ query += " and (stand_interval is NULL or stand_interval not like '%PRN')" # Ignore PRN orders to simplify somewhat
+ if startDate is not None:
+ query += " and order_time_jittered >= @startDate"
+ if endDate is not None:
+ query += " and order_time_jittered < @endDate"
+ query += " order by order_time_jittered"
+ # query += " order by op.order_proc_id_coded, jc_uid, op.pat_enc_csn_id_coded, op.proc_id"
+ query += ';'
+
+ query_params = [
+ bigquery.ScalarQueryParameter(
+ 'startDate',
+ 'DATETIME',
+ startDate,
+ ),
+ bigquery.ScalarQueryParameter(
+ 'endDate',
+ 'DATETIME',
+ endDate,
+ )
+ ]
+
+ # TODO Query to get an estimate of how long the process will be
+ # if progress is not None:
+ # progress.total = DBUtil.execute(query.totalQuery(), conn=conn)[0][0]
+
+ query_job = self.bqClient.queryBQ(query, query_params=query_params, verbose=True)
+
+ for row in query_job: # API request - fetches results
+ rowModel = RowItemModel(list(row.values()), headers)
+ log.debug("rowModel: {}".format(rowModel))
+ yield rowModel # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
+
+ if not extConn:
+ conn.close()
+
+ def convertSourceItem(self, sourceItem, conn=None):
+ """Given an individual sourceItem record, produce / convert it into an equivalent
+ item record in the analysis database.
+ """
+ extConn = conn is not None
+ if not extConn:
+ conn = self.connFactory.connection()
+ try:
+ if sourceItem["proc_code"] is None:
+ # Some 10000 rows don't have proc_code given, so the clinical_item can't be created out of them.
+ # We could use description column, but the same description can have multiple proc_codes,
+ # so we'll just ignore those records.
+ return
+
+ # Normalize sourceItem data into hierarchical components (category -> clinical_item -> patient_item).
+ # Relatively small / finite number of categories and clinical_items, so these should only have to be instantiated
+ # in a first past, with subsequent calls just yielding back in memory cached copies
+ category = self.categoryFromSourceItem(sourceItem, conn=conn)
+ clinicalItem = self.clinicalItemFromSourceItem(sourceItem, category, conn=conn)
+ patientItem = self.patientItemFromSourceItem(sourceItem, clinicalItem, conn=conn)
+
+ if sourceItem["protocol_id"] is not None \
+ and (sourceItem["ss_section_id"] is not None or sourceItem["ss_section_name"] is not None) \
+ and sourceItem["ss_sg_key"] is not None:
+ # Similarly build up item collection (order set) hierarchy and link
+ itemCollection = self.itemCollectionFromSourceItem(sourceItem, conn=conn)
+ itemCollectionItem = self.itemCollectionItemFromSourceItem(sourceItem, itemCollection, clinicalItem, conn=conn)
+ patientItemCollectionLink = self.patientItemCollectionLinkFromSourceItem(sourceItem, itemCollectionItem, patientItem, conn=conn)
+ finally:
+ if not extConn:
+ conn.close()
+
+ def categoryFromSourceItem(self, sourceItem, conn):
+ # Load or produce a clinical_item_category record model for the given sourceItem
+ categoryKey = (SOURCE_TABLE, sourceItem["order_type"], sourceItem["ordering_mode"])
+ if categoryKey not in self.categoryBySourceDescr:
+ # Category does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ category = RowItemModel(
+ {
+ "source_table": SOURCE_TABLE,
+ "description": "{} ({})".format(sourceItem["order_type"], sourceItem["ordering_mode"])
+ }
+ )
+ (categoryId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", category, conn=conn)
+ category["clinical_item_category_id"] = categoryId
+ self.categoryBySourceDescr[categoryKey] = category
+ return self.categoryBySourceDescr[categoryKey]
+
+ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
+ # Load or produce a clinical_item record model for the given sourceItem
+ clinicalItemKey = (category["clinical_item_category_id"], sourceItem["proc_code"])
+ # This should be what determines a new unique clinical_item.
+ # Some debate about whether to distinguish by proc_id or proc_code, but there are many labs and other procs
+ # that use different proc_ids even though they are obviously the same. Go link in STRIDE_ORDER_PROC for examples like LABA1C.
+ # The self.clinicalItemByCategoryIdExtId is supposed to keep track of which clinical_items we're already aware of,
+ # but not that it starts blank when this module runs.
+ # So you in theory should only run this conversion process on a database once
+ # (otherwise it will not be aware that a bunch of duplicate clinical_items already exist in the database).
+ # Alternatively, this module should be updated, so that it initializes this key tracker with whatever is already in the database.
+ if clinicalItemKey not in self.clinicalItemByCategoryIdExtId:
+ # Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ clinicalItem = RowItemModel(
+ {
+ "clinical_item_category_id": category["clinical_item_category_id"],
+ "external_id": sourceItem["proc_id"],
+ "name": sourceItem["proc_code"],
+ "description": sourceItem["description"],
+ }
+ )
+ (clinicalItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", clinicalItem, conn=conn)
+ clinicalItem["clinical_item_id"] = clinicalItemId
+ self.clinicalItemByCategoryIdExtId[clinicalItemKey] = clinicalItem
+ return self.clinicalItemByCategoryIdExtId[clinicalItemKey]
+
+ def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
+ # Produce a patient_item record model for the given sourceItem
+ patientItem = RowItemModel(
+ {
+ "external_id": sourceItem["order_proc_id_coded"],
+ "patient_id": int(sourceItem["jc_uid"][2:], 16),
+ "encounter_id": sourceItem["pat_enc_csn_id_coded"],
+ "clinical_item_id": clinicalItem["clinical_item_id"],
+ "item_date": sourceItem["order_time_jittered"],
+ "item_date_utc": str(sourceItem["order_time_jittered_utc"]), # without str(), the time is being converted in postgres
+ }
+ )
+
+ key_hash = hash('{}{}{}'.format(patientItem["patient_id"], patientItem["clinical_item_id"],
+ patientItem["item_date"]))
+ if key_hash in self.patient_items:
+ return self.patient_items[key_hash]
+
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()))
+ insertParams = list(patientItem.values())
+ try:
+ # Optimistic insert of a new unique item
+ DBUtil.execute(insertQuery, insertParams, conn=conn)
+ patientItem["patient_item_id"] = DBUtil.execute(DBUtil.identityQuery("patient_item"), conn=conn)[0][0]
+ self.patient_items[key_hash] = patientItem
+ except conn.IntegrityError as err:
+ # If turns out to be a duplicate, okay, pull out existint ID and continue to insert whatever else is possible
+ log.warn(err) # Lookup just by the composite key components to avoid attempting duplicate insertion again
+ searchPatientItem = {
+ "patient_id": patientItem["patient_id"],
+ "clinical_item_id": patientItem["clinical_item_id"],
+ "item_date": patientItem["item_date"],
+ }
+ (patientItem["patient_item_id"], isNew) = DBUtil.findOrInsertItem("patient_item", searchPatientItem, conn=conn)
+ self.patient_items[key_hash] = patientItem
+
+ return patientItem
+
+ def itemCollectionFromSourceItem(self, sourceItem, conn):
+ sourceItem["ss_section_identifier"] = sourceItem["ss_section_id"] if sourceItem["ss_section_id"] is not None \
+ else sourceItem["ss_section_name"].lower()
+
+ collectionKey = "%(protocol_id)d-%(ss_section_identifier)s-%(ss_sg_key)s" % sourceItem
+ if collectionKey not in self.itemCollectionByKeyStr:
+ # Collection does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ collection = RowItemModel(
+ {
+ "external_id": sourceItem["protocol_id"],
+ "name": sourceItem["protocol_name"],
+ "section": sourceItem["ss_section_name"],
+ "subgroup": sourceItem["ss_sg_name"],
+ }
+ )
+ (collectionId, isNew) = DBUtil.findOrInsertItem("item_collection", collection, conn=conn)
+ collection["item_collection_id"] = collectionId
+ self.itemCollectionByKeyStr[collectionKey] = collection
+ return self.itemCollectionByKeyStr[collectionKey]
+
+ def itemCollectionItemFromSourceItem(self, sourceItem, itemCollection, clinicalItem, conn):
+ # Load or produce an item_collection_item record model for the given sourceItem
+ itemKey = (itemCollection["item_collection_id"], clinicalItem["clinical_item_id"])
+ if itemKey not in self.itemCollectionItemByCollectionIdItemId:
+ # Item Collection Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ collectionItem = RowItemModel(
+ {
+ "item_collection_id": itemCollection["item_collection_id"],
+ "clinical_item_id": clinicalItem["clinical_item_id"],
+ "collection_type_id": COLLECTION_TYPE_ORDERSET,
+ }
+ )
+ (collectionItemId, isNew) = DBUtil.findOrInsertItem("item_collection_item", collectionItem, conn=conn)
+ collectionItem["item_collection_item_id"] = collectionItemId
+ self.itemCollectionItemByCollectionIdItemId[itemKey] = collectionItem
+ return self.itemCollectionItemByCollectionIdItemId[itemKey]
+
+ def patientItemCollectionLinkFromSourceItem(self, sourceItem, collectionItem, patientItem, conn):
+ hash_key = hash('{}{}'.format(patientItem["patient_item_id"], collectionItem["item_collection_item_id"]))
+ if hash_key in self.patient_item_collection_links:
+ return
+
+ # Produce a patient_item_collection_link record model for the given sourceItem
+ patientItemCollectionLink = RowItemModel(
+ {
+ "patient_item_id": patientItem["patient_item_id"],
+ "item_collection_item_id": collectionItem["item_collection_item_id"],
+ }
+ )
+ insertQuery = DBUtil.buildInsertQuery("patient_item_collection_link", list(patientItemCollectionLink.keys()))
+ insertParams = list(patientItemCollectionLink.values())
+ try:
+ # Optimistic insert of a new unique item
+ DBUtil.execute(insertQuery, insertParams, conn=conn)
+ self.patient_item_collection_links.add(hash_key)
+ except conn.IntegrityError as err:
+ # If turns out to be a duplicate, okay, just note it and continue to insert whatever else is possible
+ log.warn(err)
+ self.patient_item_collection_links.add(hash_key)
+
+ def main(self, argv):
+ """Main method, callable from command line"""
+ usageStr = "usage: %prog [options]\n" + \
+ "Beware that this module is intended to be run only ONCE ever on a database. Currently will end up with duplicate clinical item keys if you try to run it in parallel or even serially."
+ parser = OptionParser(usage=usageStr)
+ parser.add_option("-s", "--startDate", dest="startDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time on or after this date.")
+ parser.add_option("-e", "--endDate", dest="endDate", metavar="", help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with ordering time before this date.")
+ (options, args) = parser.parse_args(argv[1:])
+
+ log.info("Starting: " + str.join(" ", argv))
+ timer = time.time()
+
+ maxMinDatesQuery = """
+ select min(extract(date from order_time_jittered)), max(extract(date from order_time_jittered))
+ from {};
+ """.format(SOURCE_TABLE)
+ maxMinDates = self.bqClient.queryBQ(maxMinDatesQuery, verbose=True)
+ min_date = None
+ max_date = None
+ for row in maxMinDates:
+ min_date = list(row.values())[0]
+ max_date = list(row.values())[1]
+
+ if options.startDate is not None:
+ # Parse out the start date parameter
+ timeTuple = time.strptime(options.startDate, DATE_FORMAT)
+ startDate = datetime(*timeTuple[0:3])
+ else:
+ startDate = datetime.combine(min_date, datetime.min.time())
+
+ if options.endDate is not None:
+ # Parse out the end date parameter
+ timeTuple = time.strptime(options.endDate, DATE_FORMAT)
+ endDate = datetime(*timeTuple[0:3])
+ else:
+ endDate = datetime.combine(max_date + timedelta(days=1), datetime.min.time())
+
+ date = startDate
+ while date < endDate:
+ endDateBracket = min(date + timedelta(days=7), endDate)
+ log.info('Converting {} - {}'.format(date, endDateBracket))
+ self.convertAndUpload(date, endDateBracket)
+ date += timedelta(days=7)
+
+ self.patient_items.clear()
+ self.patient_item_collection_links.clear()
+
+ self.move_clinical_and_item_collection_to_bq()
+
+ timer = time.time() - timer
+ log.info("%.3f seconds to complete", timer)
+
+
+if __name__ == "__main__":
+ instance = STARROrderProcConversion()
+ instance.main(sys.argv)
diff --git a/medinfo/dataconversion/starr_conv/STARRTreatmentTeamConversion.py b/medinfo/dataconversion/starr_conv/STARRTreatmentTeamConversion.py
new file mode 100644
index 00000000..2dfef11b
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/STARRTreatmentTeamConversion.py
@@ -0,0 +1,379 @@
+#!/usr/bin/env python
+import sys, os
+import tempfile
+import time
+import re
+
+from datetime import datetime
+from optparse import OptionParser
+from medinfo.common.Util import stdOpen, ProgressDots
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery
+from medinfo.db.Model import RowItemModel, modelListFromTable, modelDictFromList, RowItemFieldComparator
+
+from medinfo.dataconversion.Util import log
+from medinfo.dataconversion.Env import DATE_FORMAT
+
+from medinfo.db.bigquery import bigQueryUtil
+from medinfo.dataconversion.starr_conv import STARRUtil
+
+from google.cloud import bigquery
+
+SOURCE_TABLE = 'starr_datalake2018.treatment_team'
+
+CATEGORY_TEMPLATE = "Treatment Team"
+KEY_PROVIDER_PREFIXES = ("TT ", "CON ") # Name Prefixes indicating a special (team) provider
+
+TEAM_PREFIXES = ("Primary", "Consulting")
+ADDITIONAL_PRIMARY_PROVIDERS = ("Nurse Practitioner", "Physician's Assistant",
+ "Physician Assistant") # Provider types to also count as "Primary" team
+
+# Words to discard from team labels, such as pager and phones
+DISCARD_WORDS = ("PAGER", "PGR", "PRG", "SPECTRAS")
+
+# Words to identify as some kind of sublabel to ignore for aggregation purposes
+SUB_LABEL_WORDS = (
+ "GOLD", "RED", "WHITE", "BLUE", "GREEN", "ATTENDING", "ONLY", "INTERN", "RESIDENT", "RES", "NP", "NON", "RESI")
+
+
+class STARRTreatmentTeamConversion:
+ """Data conversion module to take STARR data
+ into the structured data analysis tables to facilitate subsequent analysis.
+ """
+
+ # Column headers to query for that map to respective fields in analysis table
+ HEADERS = ['prov_map_id', 'rit_uid', 'pat_enc_csn_id_coded', 'trtmnt_tm_begin_dt_jittered',
+ 'trtmnt_tm_end_dt_jittered', 'name', 'prov_name', 'trtmnt_tm_begin_dt_jittered_utc']
+
+ def __init__(self):
+ """Default constructor"""
+ self.bqConn = bigQueryUtil.connection()
+ self.bqClient = bigQueryUtil.BigQueryClient()
+ self.connFactory = DBUtil.ConnectionFactory() # Default connection source, but Allow specification of alternative DB connection source
+
+ self.categoryBySourceDescr = dict() # Local cache to track the clinical item category table contents
+ self.clinicalItemByCompositeKey = dict() # Local cache to track clinical item table contents
+
+ def convertAndUpload(self, convOptions, tempDir=tempfile.gettempdir(), removeCsvs=True, targetDatasetId='clinical_item2018'):
+ """
+ Wrapper around primary run function, does conversion locally and uploads to BQ
+ No batching done for treatment team since converted table is small
+ """
+ conn = self.connFactory.connection()
+ starrUtil = STARRUtil.StarrCommonUtils(self.bqClient)
+ self.convertSourceItems(convOptions, conn)
+
+ batchCounter = 99999 # TODO (nodir) why not 0?
+ starrUtil.dumpPatientItemToCsv(tempDir, batchCounter)
+ self.bqClient.reconnect_client() # refresh bq client connection
+ starrUtil.uploadPatientItemCsvToBQ(tempDir, targetDatasetId, batchCounter)
+ if removeCsvs:
+ starrUtil.removePatientItemCsv(tempDir, batchCounter)
+ starrUtil.removePatientItemAddedLines(SOURCE_TABLE)
+
+ # For now keep the clinical_* tables, upload them them once all tables have been converted
+ starrUtil.dumpClinicalTablesToCsv(tempDir)
+ starrUtil.uploadClinicalTablesCsvToBQ(tempDir, targetDatasetId)
+ if removeCsvs:
+ starrUtil.removeClinicalTablesCsv(tempDir)
+ starrUtil.removeClinicalTablesAddedLines(SOURCE_TABLE)
+
+ def convertSourceItems(self, convOptions, conn=None):
+ """Primary run function to process the contents of the raw source
+ table and convert them into equivalent patient_item, clinical_item, and clinical_item_category entries.
+ Should look for redundancies after the fact to catch repeated conversions.
+
+ startDate - If provided, only return items whose ordering_date is on or after that date.
+ endDate - If provided, only return items whose ordering_date is before that date.
+ """
+ log.info("Conversion for items dated %s to %s" % (convOptions.startDate, convOptions.endDate))
+ progress = ProgressDots()
+
+ extConn = conn is not None
+ if not extConn:
+ conn = self.connFactory.connection()
+
+ try:
+ # Next round for medications directly from order_med table not addressed in medmix TODO (nodir) seems like an unrelated comment?
+ category = self.categoryFromSourceItem(conn)
+ for sourceItem in self.querySourceItems(convOptions):
+ log.debug('sourceItem: {}'.format(sourceItem))
+ self.convertSourceItem(category, sourceItem, conn=conn)
+ progress.Update()
+
+ finally:
+ conn.close()
+
+ progress.PrintStatus()
+
+ def querySourceItems(self, convOptions):
+ """Query the database for list of all source clinical items (medications, etc.)
+ and yield the results one at a time. If startDate provided, only return items whose
+ occurrence date is on or after that date.
+ """
+ # TODO need to figure out how to pass date to query in BQ using SQLQuery object
+ query = "SELECT {} FROM {}".format(', '.join(self.HEADERS), SOURCE_TABLE)
+
+ if convOptions.startDate is not None:
+ query += ' WHERE trtmnt_tm_begin_dt_jittered >= @startDate '
+ if convOptions.endDate is not None:
+ query += ' WHERE ' if convOptions.startDate is None else 'AND'
+ query += ' trtmnt_tm_begin_dt_jittered < @endDate'
+
+ query += ' ORDER BY trtmnt_tm_begin_dt_jittered'
+ query += ';'
+
+ query_params = [
+ bigquery.ScalarQueryParameter(
+ 'startDate',
+ 'TIMESTAMP',
+ convOptions.startDate,
+ ),
+ bigquery.ScalarQueryParameter(
+ 'endDate',
+ 'TIMESTAMP',
+ convOptions.endDate,
+ )
+ ]
+
+ query_job = self.bqClient.queryBQ(str(query), query_params=query_params, location='US', batch_mode=False,
+ verbose=True)
+
+ for row in query_job: # API request - fetches results
+ rowModel = RowItemModel(list(row.values()), self.HEADERS)
+ log.debug("rowModel: {}".format(rowModel))
+ yield self.normalizeRowModel(rowModel, convOptions) # Yield one row worth of data at a time to avoid having to keep the whole result set in memory
+
+ def normalizeRowModel(self, rowModel, convOptions):
+ """Given a rowModel of data, normalize it further.
+ Specifically, look for aggregate data items (e.g., multiple Gen Med treatment teams, report as one)
+ """
+ (teamAcronym, teamName) = self.cleanName(rowModel["name"], convOptions)
+ (provAcronym, provName) = self.cleanName(rowModel["prov_name"], convOptions, keyPrefixes=KEY_PROVIDER_PREFIXES)
+ provName = provName.title()
+
+ if provAcronym != "":
+ rowModel["code"] = "%s (%s)" % (provAcronym, teamAcronym)
+ rowModel["description"] = "%s (%s)" % (provName, teamName)
+ else:
+ rowModel["code"] = teamAcronym
+ rowModel["description"] = teamName
+
+ if rowModel["trtmnt_tm_begin_dt_jittered"] is None:
+ # Don't know how to use event information without a timestamp
+ pass
+
+ return rowModel
+
+ # TODO (nodir) is it possible to separate the logic for team and provider?
+ def cleanName(self, inputName, convOptions, keyPrefixes=None):
+ """Given an input name (e.g., treatment team or provider)
+ Return a 2-ple (acronym, cleaned) with an acronym version
+ and a cleaned up version (discard extra punctuation, phone/pager numbers, etc.)
+ If keyPrefixes specified, then only accept input names that start with one of them
+ (e.g., "TT" or "CON" for provider names, to only look at team names instead of named individuals.
+ """
+ isPrefixAcceptable = True
+ if keyPrefixes is not None:
+ isPrefixAcceptable = False
+ for keyPrefix in keyPrefixes:
+ if inputName is not None and inputName.startswith(keyPrefix):
+ isPrefixAcceptable = True
+
+ # Default to blanks
+ acronym = ""
+ cleanedName = ""
+
+ if isPrefixAcceptable and inputName is not None:
+ acronymList = list()
+ wordList = list()
+ chunks = inputName.split()
+ for i, chunk in enumerate(chunks):
+ if chunk[-1] == ",": # Strip any commas
+ chunk = chunk[:-1]
+
+ if convOptions.aggregate and i == 0 and chunk in TEAM_PREFIXES:
+ # Aggregating mixed records, so just use batch team prefix if exists
+ acronymList.append(chunk[0])
+ wordList.append(chunk)
+ break
+ elif convOptions.aggregate and chunk.upper() in SUB_LABEL_WORDS:
+ # Sub label word not interested when aggregating data, so just ignore it
+ continue
+ elif convOptions.aggregate and len(chunk) == 1:
+ # A short number or letter sub-label, ignore if aggregating
+ continue
+ elif convOptions.aggregate and len(chunk) <= 2 and (chunk[0].isdigit() or chunk[-1].isdigit()):
+ # A short number or letter sub-label, ignore if aggregating
+ continue
+ elif len(chunk) <= 2 and not chunk[0].isalnum() and not chunk[-1].isalnum():
+ # Short non-alphanumeric sequence, probably punctuation
+ continue
+ elif not chunk[0].isalnum() and len(chunk) > 1 and chunk[1].isdigit():
+ # Probably just a pager/phone number
+ continue
+ elif len(chunk) > 1 and chunk[0].isdigit() and chunk[-1].isdigit():
+ # Looks like a number, probably pager or phone. Don't include
+ continue
+ elif chunk in DISCARD_WORDS:
+ # Probably just pager link, not interested
+ continue
+ else:
+ if chunk[0].isalnum():
+ acronymList.append(chunk[0])
+ else: # Get the next character if first was not alphanumeric, probably an open parantheses "("
+ acronymList.append(chunk[1])
+ wordList.append(chunk)
+ acronym = str.join("", acronymList)
+ cleanedName = str.join(" ", wordList)
+
+ if convOptions.aggregate and inputName in ADDITIONAL_PRIMARY_PROVIDERS:
+ # Override specific provider names as generic primary team members
+ (acronym, cleanedName) = ("P", "Primary")
+
+ return (acronym, cleanedName)
+
+ def convertSourceItem(self, category, sourceItem, conn=None):
+ """Given an individual sourceItem record, produce / convert it into an equivalent
+ item record in the analysis database.
+ """
+ extConn = conn is not None
+ if not extConn:
+ conn = self.connFactory.connection()
+
+ try:
+ # Normalize sourceItem data into hierarchical components (category -> clinical_item -> patient_item).
+ # Relatively small / finite number of categories and clinical_items, so these should only have to be instantiated
+ # in a first pass, with subsequent calls just yielding back in memory cached copies
+ clinicalItem = self.clinicalItemFromSourceItem(sourceItem, category, conn=conn)
+ ignoredPatientItem = self.patientItemFromSourceItem(sourceItem, clinicalItem, conn=conn)
+
+ finally:
+ if not extConn:
+ conn.close()
+
+ def categoryFromSourceItem(self, conn):
+ # Load or produce a clinical_item_category record model for the given sourceItem
+ # In this case, always Medication
+ categoryDescription = CATEGORY_TEMPLATE
+ categoryKey = (SOURCE_TABLE, categoryDescription)
+ if categoryKey not in self.categoryBySourceDescr:
+ # Category does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ category = RowItemModel(
+ {
+ "source_table": SOURCE_TABLE,
+ "description": categoryDescription,
+ }
+ )
+ (categoryId, isNew) = DBUtil.findOrInsertItem("clinical_item_category", category, conn=conn)
+ category["clinical_item_category_id"] = categoryId
+ self.categoryBySourceDescr[categoryKey] = category
+ return self.categoryBySourceDescr[categoryKey]
+
+ def clinicalItemFromSourceItem(self, sourceItem, category, conn):
+ # Load or produce a clinical_item record model for the given sourceItem
+ clinicalItemKey = (category["clinical_item_category_id"], sourceItem["description"])
+ if clinicalItemKey not in self.clinicalItemByCompositeKey:
+ # Clinical Item does not yet exist in the local cache. Check if in database table (if not, persist a new record)
+ clinicalItem = RowItemModel(
+ {
+ "clinical_item_category_id": category["clinical_item_category_id"],
+ "external_id": None,
+ "name": sourceItem["code"],
+ "description": sourceItem["description"],
+ }
+ )
+ (clinicalItemId, isNew) = DBUtil.findOrInsertItem("clinical_item", clinicalItem, conn=conn)
+ clinicalItem["clinical_item_id"] = clinicalItemId
+ self.clinicalItemByCompositeKey[clinicalItemKey] = clinicalItem
+ return self.clinicalItemByCompositeKey[clinicalItemKey]
+
+ def patientItemFromSourceItem(self, sourceItem, clinicalItem, conn):
+ # some prov_map_id values are NULL in starr_datalake2018
+ if sourceItem["prov_map_id"] is not None:
+ # prov_map_id starts with letters, we're interested only in number parts
+ external_id = int(re.sub("[A-Z]+(\\d+)", "\\1", sourceItem["prov_map_id"]), 16)
+ else:
+ external_id = None
+
+ # Produce a patient_item record model for the given sourceItem
+ patientItem = RowItemModel(
+ {
+ "external_id": external_id,
+ "patient_id": int(sourceItem["rit_uid"][2:], 16),
+ "encounter_id": sourceItem["pat_enc_csn_id_coded"],
+ "clinical_item_id": clinicalItem["clinical_item_id"],
+ "item_date": str(sourceItem["trtmnt_tm_begin_dt_jittered"]), # without str(), the time is being converted in postgres
+ "item_date_utc": str(sourceItem["trtmnt_tm_begin_dt_jittered_utc"]) # without str(), the time is being converted in postgres
+ }
+ )
+
+ insertQuery = DBUtil.buildInsertQuery("patient_item", list(patientItem.keys()))
+ insertParams = list(patientItem.values())
+ try:
+ # Optimistic insert of a new unique item
+ DBUtil.execute(insertQuery, insertParams, conn=conn)
+ # Retrieve id of just inserted row
+ patientItem["patient_item_id"] = DBUtil.execute(DBUtil.identityQuery("patient_item"), conn=conn)[0][0]
+ except conn.IntegrityError as err:
+ # If turns out to be a duplicate, okay, pull out existing ID and continue to insert whatever else is possible
+ log.info(err) # Lookup just by the composite key components to avoid attempting duplicate insertion again
+
+ searchPatientItem = {
+ "patient_id": patientItem["patient_id"],
+ "clinical_item_id": patientItem["clinical_item_id"],
+ "item_date": patientItem["item_date"],
+ }
+ (patientItem["patient_item_id"], isNew) = DBUtil.findOrInsertItem("patient_item", searchPatientItem,
+ conn=conn)
+ return patientItem
+
+ def main(self, argv):
+ """Main method, callable from command line"""
+ usageStr = "usage: %prog [options]\n"
+ parser = OptionParser(usage=usageStr)
+ parser.add_option("-s", "--startDate", dest="startDate", metavar="",
+ help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with start time on or after this date.")
+ parser.add_option("-e", "--endDate", dest="endDate", metavar="",
+ help="Date string (e.g., 2011-12-15), if provided, will only run conversion on items with start time before this date.")
+ parser.add_option("-a", "--aggregate", dest="aggregate", action="store_true",
+ help="If set, will try to aggregate data so Med Univ A1, A2, A3 will all be counted as Med Univ and Primary Team, Intern, Resident will all just be counted as Primary.")
+ (options, args) = parser.parse_args(argv[1:])
+
+ log.info("Starting: " + str.join(" ", argv))
+ timer = time.time()
+
+ convOptions = ConversionOptions()
+ convOptions.extractParserOptions(options)
+
+ self.convertAndUpload(convOptions)
+
+ timer = time.time() - timer
+ log.info("%.3f seconds to complete", timer)
+
+
+class ConversionOptions:
+ """Simple struct to contain multiple program options"""
+
+ def __init__(self):
+ self.startDate = None
+ self.endDate = None
+ self.aggregate = True
+
+ def extractParserOptions(self, options):
+ if options.startDate is not None:
+ # Parse out the start date parameter
+ timeTuple = time.strptime(options.startDate, DATE_FORMAT)
+ self.startDate = datetime(*timeTuple[0:3])
+
+ if options.endDate is not None:
+ # Parse out the end date parameter
+ timeTuple = time.strptime(options.endDate, DATE_FORMAT)
+ self.endDate = datetime(*timeTuple[0:3])
+
+ self.aggregate = options.aggregate
+
+
+if __name__ == "__main__":
+ instance = STARRTreatmentTeamConversion()
+ instance.main(sys.argv)
diff --git a/medinfo/dataconversion/starr_conv/STARRUtil.py b/medinfo/dataconversion/starr_conv/STARRUtil.py
new file mode 100644
index 00000000..ead60132
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/STARRUtil.py
@@ -0,0 +1,300 @@
+import csv
+import os
+import pytz
+import random
+import subprocess
+import sys
+import time
+
+from medinfo.common.Util import stdOpen
+from medinfo.db import DBUtil
+from medinfo.dataconversion.Util import log
+from medinfo.db.bigquery import bigQueryUtil
+from google.cloud import bigquery
+
+
+class StarrCommonUtils:
+
+ def __init__(self, bqClient=None, pgConn=None):
+ self.bqClient = bqClient
+ self.pgConn = pgConn
+
+ @staticmethod
+ def convertPatIdToSTRIDE(starr_pat_id):
+ return int(starr_pat_id[2:], 16)
+
+ '''
+ BigQuery SQL conversion e.g.
+ https://stackoverflow.com/questions/46664776
+
+ CREATE TEMP FUNCTION HexToInt(hex_string STRING) AS (
+ IFNULL(SAFE_CAST(CONCAT('0x', REPLACE(hex_string, ' ', '')) AS INT64), 0)
+ );
+
+ SELECT HexToInt(SUBSTR('JCcdf815', 3));
+ '''
+
+ @staticmethod
+ def convertPatIdToSTARR(stride_pat_id):
+ return 'JC' + hex(stride_pat_id)
+
+ '''
+ BigQuery SQL conversion e.g.
+ https://stackoverflow.com/questions/51600209
+
+ CREATE TEMP FUNCTION IntToHex(x INT64) AS (
+ LTRIM(
+ (SELECT STRING_AGG(FORMAT('%02x', x >> (byte * 8) & 0xff),
+ '' ORDER BY byte DESC)
+ FROM UNNEST(GENERATE_ARRAY(0, 7)) AS byte),
+ '0'
+ )
+ );
+
+ SELECT CONCAT('JC', IntToHex(13498389));
+ '''
+
+ @staticmethod
+ def random_period():
+ start_date = random.randint(1, int(time.time()))
+ end_date = random.randint(start_date, int(time.time()))
+ return start_date, end_date
+
+ @staticmethod
+ def dump_test_data_to_csv(header, test_data, csv_file):
+ with open(csv_file, 'w', newline='') as test_data_file:
+ csv_writer = csv.writer(test_data_file)
+ csv_writer.writerow(header)
+ csv_writer.writerows(test_data)
+
+ '''
+ Retrieves schema for given table from the given BQ client.
+ It is possible to filter out only required fields.
+ The resulting schema, in this case, will be sorted according to the filter order.
+ '''
+ def get_schema_filtered(self, dataset, table, fields_to_keep_in_schema=None):
+ schema = self.bqClient.client.get_table('mining-clinical-decisions.{}.{}'.format(dataset, table)).schema
+
+ if fields_to_keep_in_schema:
+ # filter out only fields we need
+ schema = list([field for field in schema if field.name in fields_to_keep_in_schema])
+ # sort schema fields according to the header
+ schema.sort(key=lambda field: fields_to_keep_in_schema.index(field.name))
+
+ return schema
+
+ def upload_csv_to_bigquery(self, schema_dataset, schema_table, dest_dataset, dest_table, csv_file,
+ schema_fields=None):
+ schema = self.get_schema_filtered(schema_dataset, schema_table, schema_fields)
+
+ self.bqClient.load_csv_to_table(
+ dest_dataset,
+ dest_table,
+ csv_file,
+ False,
+ schema,
+ 1
+ )
+
+ def dumpPatientItemCollectionLinkToCsv(self, tempDir, batchCounter=999):
+ log.info('Dumping patient_item_collection_link for batch {} to CSV'.format(batchCounter))
+
+ DBUtil.dumpTableToCsv('patient_item_collection_link',
+ '{}/{}_patient_item_collection_link.csv'.format(tempDir, batchCounter))
+
+ def dumpItemCollectionTablesToCsv(self, tempDir):
+ log.info('Dumping item_collection_item and item_collection to CSV')
+
+ DBUtil.dumpTableToCsv('item_collection_item', '{}/item_collection_item.csv'.format(tempDir))
+ DBUtil.dumpTableToCsv('item_collection', '{}/item_collection.csv'.format(tempDir))
+
+ def uploadPatientItemCollectionLinkCsvToBQ(self, tempDir, datasetId, batchCounter=999):
+ log.info('Uploading patient_item CSV to BQ dataset {} for batch {}'.format(datasetId, batchCounter))
+ patient_item_collection_link_schema = self.get_schema_filtered('clinical_item2018',
+ 'patient_item_collection_link')
+
+ csv_path = tempDir + os.path.sep + str(batchCounter) + '_patient_item_collection_link.csv'
+
+ bigQueryUtil.headerChecker(csv_path, [sf.name for sf in patient_item_collection_link_schema])
+
+ self.bqClient.load_csv_to_table(datasetId, 'patient_item_collection_link', csv_path, skip_rows=1,
+ append_to_table=True, auto_detect_schema=False,
+ schema=patient_item_collection_link_schema)
+
+ def uploadItemCollectionTablesCsvToBQ(self, tempDir, datasetId):
+ log.info('Uploading item_collection CSV to BQ dataset {}'.format(datasetId))
+ item_collection_schema = self.get_schema_filtered('clinical_item2018', 'item_collection')
+
+ item_collection_csv_path = tempDir + '/item_collection.csv'
+
+ bigQueryUtil.headerChecker(item_collection_csv_path, [sf.name for sf in item_collection_schema])
+
+ self.bqClient.load_csv_to_table(datasetId, 'item_collection', item_collection_csv_path, skip_rows=1,
+ append_to_table=True, auto_detect_schema=False, schema=item_collection_schema)
+
+ log.info('Uploading item_collection_item CSV to BQ dataset {}'.format(datasetId))
+ item_collection_item_schema = self.get_schema_filtered('clinical_item2018', 'item_collection_item')
+
+ item_collection_item_csv_path = tempDir + '/item_collection_item.csv'
+
+ bigQueryUtil.headerChecker(item_collection_item_csv_path, [sf.name for sf in item_collection_item_schema])
+
+ self.bqClient.load_csv_to_table(datasetId, 'item_collection_item', item_collection_item_csv_path, skip_rows=1,
+ append_to_table=True, auto_detect_schema=False,
+ schema=item_collection_item_schema)
+
+ def removePatientItemCollectionLinkCsv(self, temp_dir, batchCounter=999):
+ log.info('Removing patient_item_collection_link CSV for batch {}'.format(batchCounter))
+ self.remove_file(temp_dir + os.path.sep + str(batchCounter) + '_patient_item_collection_link.csv')
+
+ def removeItemCollectionTablesCsv(self, temp_dir):
+ log.info('Removing item_collection and item_collection_item CSVs')
+ self.remove_file(temp_dir + '/item_collection.csv')
+ self.remove_file(temp_dir + '/item_collection_item.csv')
+
+ def removePatientItemCollectionLinkAddedLines(self, source_table):
+ """delete added records"""
+ log.info('Removing patient_item_collection_link added lines in PSQL DB')
+
+ DBUtil.execute(
+ """delete from patient_item_collection_link pi
+ using item_collection_item ici, clinical_item ci, clinical_item_category cic
+ where pi.item_collection_item_id = ici.item_collection_item_id
+ and ici.clinical_item_id = ci.clinical_item_id
+ and ci.clinical_item_category_id = cic.clinical_item_category_id
+ and cic.source_table = '{}';
+ """.format(source_table), conn=self.pgConn
+ )
+
+ def removeItemCollectionTablesAddedLines(self, source_table):
+ """delete added records"""
+ log.info('Removing item_collection_item and item_collection added lines in PSQL DB')
+
+ DBUtil.execute(
+ """delete from item_collection_item ici
+ using clinical_item ci, clinical_item_category cic
+ where ici.clinical_item_id = ci.clinical_item_id
+ and ci.clinical_item_category_id = cic.clinical_item_category_id
+ and cic.source_table = '{}';
+ """.format(source_table), conn=self.pgConn
+ )
+
+ # TODO should be using source_table also
+ DBUtil.execute("delete from item_collection where true;", conn=self.pgConn)
+
+ def dumpPatientItemToCsv(self, tempDir, batchCounter=999):
+ log.info('Dumping patient_item for batch {} to CSV'.format(batchCounter))
+
+ DBUtil.dumpTableToCsv('patient_item', '{}/{}_patient_item.csv'.format(tempDir, batchCounter))
+
+ def dumpClinicalTablesToCsv(self, tempDir):
+ log.info('Dumping clinical_item and clinical_item_category to CSV')
+
+ DBUtil.dumpTableToCsv('clinical_item', '{}/clinical_item.csv'.format(tempDir))
+ DBUtil.dumpTableToCsv('clinical_item_category', '{}/clinical_item_category.csv'.format(tempDir))
+
+ def uploadPatientItemCsvToBQ(self, tempDir, datasetId, batchCounter=999):
+ log.info('Uploading patient_item CSV to BQ dataset %s for batch %s' % (datasetId, batchCounter))
+ patient_item_schema = [bigquery.SchemaField('patient_item_id', 'INT64', 'REQUIRED', None, ()),
+ bigquery.SchemaField('external_id', 'INT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('patient_id', 'INT64', 'REQUIRED', None, ()),
+ bigquery.SchemaField('clinical_item_id', 'INT64', 'REQUIRED', None, ()),
+ bigquery.SchemaField('item_date', 'TIMESTAMP', 'REQUIRED', None, ()),
+ bigquery.SchemaField('analyze_date', 'TIMESTAMP', 'NULLABLE', None, ()),
+ bigquery.SchemaField('encounter_id', 'INT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('text_value', 'STRING', 'NULLABLE', None, ()),
+ bigquery.SchemaField('num_value', 'FLOAT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('source_id', 'INT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('item_date_utc', 'TIMESTAMP', 'NULLABLE', None, ())]
+
+ csv_path = tempDir + os.path.sep + str(batchCounter) + '_patient_item.csv'
+
+ bigQueryUtil.headerChecker(csv_path, [sf.name for sf in patient_item_schema])
+
+ self.bqClient.load_csv_to_table(datasetId, 'patient_item', csv_path, schema=patient_item_schema, skip_rows=1,
+ append_to_table=True)
+ # auto_detect_schema=False, schema=patient_item_schema)
+
+ def uploadClinicalTablesCsvToBQ(self, tempDir, datasetId):
+ log.info('Uploading clinical_item_category CSV to BQ dataset %s' % datasetId)
+ clinical_item_category_schema = [
+ bigquery.SchemaField('clinical_item_category_id', 'INT64', 'REQUIRED', None, ()),
+ bigquery.SchemaField('source_table', 'STRING', 'REQUIRED', None, ()),
+ bigquery.SchemaField('description', 'STRING', 'NULLABLE', None, ()),
+ bigquery.SchemaField('default_recommend', 'INT64', 'NULLABLE', None, ())]
+
+ clinical_item_category_csv_path = tempDir + '/clinical_item_category.csv'
+
+ bigQueryUtil.headerChecker(clinical_item_category_csv_path, [sf.name for sf in clinical_item_category_schema])
+
+ self.bqClient.load_csv_to_table(datasetId, 'clinical_item_category', clinical_item_category_csv_path,
+ schema=clinical_item_category_schema, skip_rows=1, append_to_table=True)
+ # auto_detect_schema=False, schema=clinical_item_category_schema)
+
+ log.info('Uploading clinical_item CSV to BQ dataset %s' % datasetId)
+ clinical_item_schema = [bigquery.SchemaField('clinical_item_id', 'INT64', 'REQUIRED', None, ()),
+ bigquery.SchemaField('clinical_item_category_id', 'INT64', 'REQUIRED', None, ()),
+ bigquery.SchemaField('external_id', 'INT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('name', 'STRING', 'REQUIRED', None, ()),
+ bigquery.SchemaField('description', 'STRING', 'NULLABLE', None, ()),
+ bigquery.SchemaField('default_recommend', 'INT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('item_count', 'FLOAT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('patient_count', 'FLOAT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('encounter_count', 'FLOAT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('analysis_status', 'INT64', 'NULLABLE', None, ()),
+ bigquery.SchemaField('outcome_interest', 'INT64', 'NULLABLE', None, ())]
+
+ clinical_item_csv_path = tempDir + '/clinical_item.csv'
+
+ bigQueryUtil.headerChecker(clinical_item_csv_path, [sf.name for sf in clinical_item_schema])
+
+ self.bqClient.load_csv_to_table(datasetId, 'clinical_item', clinical_item_csv_path,
+ schema=clinical_item_schema, skip_rows=1, append_to_table=True)
+ # auto_detect_schema=False, schema=clinical_item_schema)
+
+ def removePatientItemCsv(self, temp_dir, batchCounter=999):
+ log.info('Removing patient_item CSV for batch {}'.format(batchCounter))
+ self.remove_file(temp_dir + os.path.sep + str(batchCounter) + '_patient_item.csv')
+
+ def removeClinicalTablesCsv(self, temp_dir):
+ log.info('Removing clinical_item and clinical_item_category CSVs')
+ self.remove_file(temp_dir + '/clinical_item.csv')
+ self.remove_file(temp_dir + '/clinical_item_category.csv')
+
+ @staticmethod
+ def remove_file(file_path):
+ if os.path.exists(file_path):
+ os.remove(file_path)
+ else:
+ log.warning('{} does not exist'.format(file_path))
+
+ def removePatientItemAddedLines(self, source_table):
+ """delete added records"""
+ log.info('Removing patient_item added lines in PSQL DB')
+
+ DBUtil.execute(
+ """delete from patient_item
+ where clinical_item_id in
+ ( select clinical_item_id
+ from clinical_item as ci, clinical_item_category as cic
+ where ci.clinical_item_category_id = cic.clinical_item_category_id
+ and cic.source_table = '{}'
+ );
+ """.format(source_table), conn=self.pgConn
+ )
+
+ def removeClinicalTablesAddedLines(self, source_table):
+ """delete added records"""
+ log.info('Removing clinical_item and clinical_item_category added lines in PSQL DB')
+
+ DBUtil.execute(
+ """delete from clinical_item
+ where clinical_item_category_id in
+ ( select clinical_item_category_id
+ from clinical_item_category
+ where source_table = '{}'
+ );
+ """.format(source_table), conn=self.pgConn
+ )
+ DBUtil.execute("delete from clinical_item_category where source_table = '{}';".format(source_table),
+ conn=self.pgConn)
diff --git a/medinfo/dataconversion/starr_conv/__init__.py b/medinfo/dataconversion/starr_conv/__init__.py
new file mode 100644
index 00000000..4e16c564
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/__init__.py
@@ -0,0 +1 @@
+# Nothing much for now, just enable importing of various modules as a common package
diff --git a/medinfo/dataconversion/starr_conv/test/TestSTARRDemographicsConversion.py b/medinfo/dataconversion/starr_conv/test/TestSTARRDemographicsConversion.py
new file mode 100644
index 00000000..f36a0198
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/test/TestSTARRDemographicsConversion.py
@@ -0,0 +1,271 @@
+#!/usr/bin/env python
+"""
+Test case for respective module in application package
+Setup credentials in environment variable GOOGLE_APPLICATION_CREDENTIALS (See LocalEnv)
+"""
+
+import string
+
+import os
+import csv
+import pytz
+import random
+import logging
+import tempfile
+
+from datetime import datetime
+from datetime import date
+from datetime import time
+import unittest
+
+from medinfo.dataconversion.starr_conv import STARRDemographicsConversion
+from medinfo.dataconversion.starr_conv.STARRUtil import StarrCommonUtils
+from medinfo.dataconversion.test.Const import RUNNER_VERBOSITY
+from medinfo.dataconversion.Util import log
+
+from medinfo.db.test.Util import DBTestCase
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery, RowItemModel
+
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader
+
+from medinfo.db.bigquery import bigQueryUtil
+
+TEST_SOURCE_TABLE = 'test_dataset.starr_demographic'
+TEST_DEST_DATASET = 'test_dataset'
+
+GENDER = ['Male', 'Female', 'Unknown']
+RACE = ['Black', 'White', 'Asian', 'Other', 'Unknown', 'Pacific Islander', 'Native American']
+ETHNICITY = ['Non-Hispanic', 'Hispanic/Latino', 'Unknown']
+MARITAL_STATUS = [None, 'Separated', 'Single', 'Married', 'Unknown', 'Widowed', 'Divorced', 'Life Partner', 'Other',
+ 'Legally Separated']
+RELIGION = [None, 'Christian', 'Muslim', 'Buddhist', 'Other'] # only major religions - real table has much more values
+LANGUAGE = [None, 'English', 'Chinese', 'French', 'Russian', 'Arabic', 'Spanish'] # UN official languages
+PAT_STATUS = [None, 'Alive', 'Deceased']
+
+
+class TestSTARRDemographicsConversion(DBTestCase):
+ TEST_DATA_SIZE = 50
+ BATCH_SIZE = 10
+ STARTING_BATCH = 4
+
+ header = ['rit_uid', 'birth_date_jittered', 'death_date_jittered', 'gender', 'canonical_race',
+ 'canonical_ethnicity', 'marital_status', 'religion', 'language', 'intrptr_needed_yn',
+ 'insurance_payor_name', 'cur_pcp_prov_map_id', 'recent_conf_enc_jittered', 'recent_ht_in_cms',
+ 'recent_wt_in_kgs', 'bmi', 'charlson_score', 'n_hospitalizations', 'days_in_hospital',
+ 'pat_status']
+
+ patientIds = []
+ test_data = []
+ expected_data = []
+
+ test_data_csv = tempfile.gettempdir() + '/test_starr_demographic_dummy_data.csv'
+ pat_id_csv = tempfile.gettempdir() + '/tmp_test_pat_id.csv'
+
+ bqConn = bigQueryUtil.connection()
+ converter = STARRDemographicsConversion.STARRDemographicsConversion() # Instance to test on
+ starrUtil = StarrCommonUtils(converter.bqClient)
+
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self)
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata()
+
+ # point the converter to dummy source table
+ STARRDemographicsConversion.SOURCE_TABLE = TEST_SOURCE_TABLE
+
+ log.warning("Removing test table if it exists: {}".format(TEST_SOURCE_TABLE))
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_SOURCE_TABLE))
+
+ log.info("Generating test source data")
+ self.generate_test_and_expected_data(self.TEST_DATA_SIZE)
+ self.starrUtil.dump_test_data_to_csv(self.header, self.test_data, self.test_data_csv)
+ self.starrUtil.upload_csv_to_bigquery('starr_datalake2018', 'demographic',
+ 'test_dataset', 'starr_demographic', self.test_data_csv, self.header)
+ self.dump_patient_ids_to_test_to_csv(self.pat_id_csv)
+
+ def generate_test_and_expected_data(self, test_data_size):
+ for curr_row in range(test_data_size):
+ patient_id = 'JC' + format(curr_row, '06')
+ self.patientIds.append(patient_id)
+ test_data_row = self.generate_test_data_row(curr_row, StarrCommonUtils.random_period(), patient_id)
+ self.test_data.append(test_data_row)
+
+ # prepare expected data starting from requested batch
+ if curr_row >= self.STARTING_BATCH * self.BATCH_SIZE:
+ self.generate_expected_data_rows(test_data_row, self.expected_data)
+
+ self.expected_data.sort(key=lambda tup: (-tup[1], tup[5])) # patient_id desc, name asc
+
+ def dump_patient_ids_to_test_to_csv(self, pat_id_csv):
+ with open(pat_id_csv, 'w') as f:
+ for rit_uid in ['rit_uid'] + self.patientIds:
+ f.write("%s\n" % rit_uid)
+
+ @staticmethod
+ def generate_test_data_row(curr_row, lifespan, patient_id):
+ import time # required to get current timestamp - it is here to not clash with datetime.time
+
+ return (patient_id,
+ date.fromtimestamp(lifespan[0]),
+ [None, date.fromtimestamp(lifespan[1])][random.randint(0, 1)],
+ GENDER[random.randint(0, len(GENDER) - 1)],
+ RACE[random.randint(0, len(RACE) - 1)],
+ ETHNICITY[random.randint(0, len(ETHNICITY) - 1)],
+ MARITAL_STATUS[random.randint(0, len(MARITAL_STATUS) - 1)],
+ RELIGION[random.randint(0, len(RELIGION) - 1)],
+ LANGUAGE[random.randint(0, len(LANGUAGE) - 1)],
+ [None, 'N', 'Y'][random.randint(0, 2)],
+ ''.join(random.choice(string.ascii_uppercase) for _ in range(10)),
+ 'SS' + format(curr_row, '07'),
+ date.fromtimestamp(random.randint(1, int(time.time()))),
+ random.randint(150, 210),
+ random.randint(50, 150),
+ random.randint(18, 24),
+ random.randint(1, 27),
+ random.randint(0, 300),
+ random.randint(0, 1000),
+ PAT_STATUS[random.randint(0, len(PAT_STATUS) - 1)])
+
+ def generate_expected_data_rows(self, row, expected_data):
+ birth_list = [
+ None,
+ StarrCommonUtils.convertPatIdToSTRIDE(row[0]),
+ None,
+ "Demographics",
+ None,
+ "Birth",
+ "Birth Year",
+ datetime(row[1].year, 1, 1, tzinfo=pytz.UTC)
+ ]
+
+ expected_data.append(tuple(birth_list))
+ expected_data.append(self.birth_decade_tuple_from(birth_list, row))
+ expected_data.append(self.race_tuple_from(birth_list, row))
+ expected_data.append(self.gender_tuple_from(birth_list, row))
+
+ if row[2]:
+ expected_data.append(self.death_date_tuple_from(birth_list, row))
+
+ @staticmethod
+ def birth_decade_tuple_from(birth_list, row):
+ birth_decade_list = list(birth_list)
+ decade = (row[1].year // 10) * 10
+ birth_decade_list[5] = "Birth%ds" % decade
+ birth_decade_list[6] = "Birth Decade %ds" % decade
+ return tuple(birth_decade_list)
+
+ def race_tuple_from(self, birth_list, row):
+ race_list = list(birth_list)
+ race_ethnicity = self.converter.summarizeRaceEthnicity(row[4], row[5])
+ race_list[5] = "Race%s" % race_ethnicity.translate(str.maketrans('', '', " ()-/"))
+ race_list[6] = "Race/Ethnicity: %s" % race_ethnicity
+ return tuple(race_list)
+
+ @staticmethod
+ def gender_tuple_from(birth_list, row):
+ gender_list = list(birth_list)
+ gender_list[5] = row[3]
+ gender_list[6] = "%s Gender" % row[3]
+ return tuple(gender_list)
+
+ @staticmethod
+ def death_date_tuple_from(birth_list, row):
+ death_list = list(birth_list)
+ death_list[5] = "Death"
+ death_list[6] = "Death Date"
+ death_list[7] = datetime.combine(row[2], time.min).replace(tzinfo=pytz.UTC)
+ return tuple(death_list)
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ log.info("Purge test records from the database")
+
+ os.remove(self.pat_id_csv)
+ os.remove(self.test_data_csv)
+
+ DBUtil.execute(
+ """delete from patient_item
+ where clinical_item_id in
+ ( select clinical_item_id
+ from clinical_item as ci, clinical_item_category as cic
+ where ci.clinical_item_category_id = cic.clinical_item_category_id
+ and cic.source_table = '%s'
+ );
+ """ % TEST_SOURCE_TABLE
+ )
+ DBUtil.execute(
+ """delete from clinical_item
+ where clinical_item_category_id in
+ ( select clinical_item_category_id
+ from clinical_item_category
+ where source_table = '%s'
+ );
+ """ % TEST_SOURCE_TABLE
+ )
+ DBUtil.execute("delete from clinical_item_category where source_table = '%s';" % TEST_SOURCE_TABLE)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DELETE FROM %s.patient_item WHERE true;' % TEST_DEST_DATASET)
+ bq_cursor.execute('DELETE FROM %s.clinical_item WHERE true;' % TEST_DEST_DATASET)
+ bq_cursor.execute('DELETE FROM %s.clinical_item_category WHERE true;' % TEST_DEST_DATASET)
+
+ bq_cursor.execute('DROP TABLE %s;' % TEST_SOURCE_TABLE)
+
+ DBTestCase.tearDown(self)
+
+ def test_batchDataConversion(self):
+ # Run the data conversion on the same data and look for expected records
+ log.debug("Run the batch conversion process, and upload to test dataset in BigQuery...")
+ self.converter.convertItemsByBatch(self.pat_id_csv, self.BATCH_SIZE, targetDatasetId=TEST_DEST_DATASET,
+ startBatch=self.STARTING_BATCH)
+
+ # Just query back for the same data, de-normalizing the data back to a general table
+ test_query = \
+ """
+ select
+ pi.external_id as pi_external_id,
+ pi.patient_id,
+ pi.encounter_id,
+ cic.description as cic_description,
+ ci.external_id as ci_external_id,
+ ci.name,
+ ci.description as ci_description,
+ pi.item_date
+ from
+ %s.patient_item as pi,
+ %s.clinical_item as ci,
+ %s.clinical_item_category as cic
+ where
+ pi.clinical_item_id = ci.clinical_item_id and
+ ci.clinical_item_category_id = cic.clinical_item_category_id and
+ cic.source_table = '%s'
+ order by
+ pi.patient_id desc, ci.name
+ """ % (TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_SOURCE_TABLE)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute(test_query)
+ actual_data = [list(row.values()) for row in bq_cursor.fetchall()]
+
+ log.debug('actual data %s' % actual_data)
+ log.debug('expected data %s' % self.expected_data)
+
+ self.assertEqualTable(self.expected_data, actual_data)
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestSTARRDemographicsConversion))
+
+ return suite
+
+
+if __name__ == "__main__":
+ log.setLevel(logging.INFO) # without this no logs are printed
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/starr_conv/test/TestSTARROrderMedConversion.py b/medinfo/dataconversion/starr_conv/test/TestSTARROrderMedConversion.py
new file mode 100644
index 00000000..fe871c02
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/test/TestSTARROrderMedConversion.py
@@ -0,0 +1,1577 @@
+#!/usr/bin/env python
+"""Test case for respective module in application package"""
+
+import sys, os
+import logging
+import pytz
+import random
+import tempfile
+import time
+
+from datetime import datetime
+
+import unittest
+
+from parameterized import parameterized
+from medinfo.dataconversion.test.Const import RUNNER_VERBOSITY
+from medinfo.dataconversion.Const import TEMPLATE_MEDICATION_PREFIX
+from medinfo.dataconversion.Util import log
+
+from medinfo.db.test.Util import DBTestCase
+
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader
+
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery, RowItemModel
+
+from medinfo.dataconversion.starr_conv import STARROrderMedConversion
+from medinfo.dataconversion.starr_conv import STARRUtil
+
+TEST_SOURCE_TABLE = 'test_dataset.starr_order_med'
+TEST_ORDERSET_TABLE = 'test_dataset.starr_med_orderset'
+
+TEST_DEST_DATASET = 'test_dataset'
+
+
+ORDERING_MODES = [
+ 'Inpatient',
+ 'Outpatient'
+]
+
+MED_ROUTES = [
+ None,
+ "Intramuscular",
+ "Inhalation",
+ "Topical",
+ "Left Eye",
+ "Right Eye",
+ "Vaginal",
+ "Injection",
+ "Ophthalmic",
+ "G Tube",
+ "Transdermal",
+ "Swish & Swallow",
+ "RT Inhalation",
+ "Intra-articular",
+ "J Tube",
+ "Buccal",
+ "Rectal",
+ "NG Tube",
+ "Intrathecal",
+ "Intravitreal",
+ "Intradermal",
+ "Otic",
+ "Surgical Site Intra-Op Only",
+ "Right Ear",
+ "In Vitro",
+ "Other",
+ "Tendon Sheath Injection",
+ "Intrauterine",
+ "Intra-Catheter",
+ "Mucous Membrane",
+ "Not Applicable",
+ "DELETE5",
+ "Percutaneous",
+ "Intrapleural",
+ "Intranasal",
+ "Intracavernosal",
+ "Intralesional",
+ "Implant",
+ "Drain",
+ "Apheresis",
+ "Left Nostril",
+ "Infiltration",
+ "Intra-amniotic",
+ "OG Tube",
+ "Intraventricular",
+ "Endotracheal",
+ "Right Nostril",
+ "Intra-arterial",
+ "Intracardiac",
+ "Nerve Block",
+ "intravesical irrigation",
+ "Hemodialysis",
+ "Intraventricular CNS",
+ "Thru Sheath",
+ "Intrabursal",
+ "Subtenons",
+ "Juxtascleral",
+ "Cervical",
+ "Intratracheal",
+ "intraocular injection",
+ "Thru Peripheral IV",
+ "Intrasynovial",
+ "Periodontal",
+ "interscalene",
+ "Subconjunctival",
+ "Continuous Epidural",
+ "Continuous Nebulization",
+ "Stoma",
+ "Contin. Intrathecal Infusion",
+ "Transtracheal",
+ "Subcutaneous via CO2 Activated Syringe",
+ "Intra-urethral",
+ "Oral",
+ "Misc.(Non-Drug; Combo Route)",
+ "Intravenous",
+ "Subcutaneous",
+ "Both Eyes",
+ "Intraperitoneal",
+ "Sublingual",
+ "Feeding Tube",
+ "Nasal",
+ "Swish & Spit",
+ "CRRT",
+ "Nebulization",
+ "Translingual",
+ "Intravesical",
+ "Both Nostrils",
+ "Left Ear",
+ "Irrigation",
+ "Both Ears",
+ "PEG-J Tube",
+ "Bladder Instillation",
+ "Urethral",
+ "Continuous IV Infusion",
+ "Intravenous/Intramuscular",
+ "Dental",
+ "Topical ocular use",
+ "Intraocular",
+ "Subdermal",
+ "Submucosal Injection",
+ "Epidural",
+ "Base of the eyelashes",
+ "scalp",
+ "Feeding Tube (FTub)",
+ "Mouth/Throat",
+ "Intracavity",
+ "local intranasal application",
+ "O2 Aerosolization",
+ "DELETE19",
+ "Contin. Subcutaneous Infusion",
+ "Gums",
+ "Extracorporeal",
+ "Intraconjunctival",
+ "adductor canal block",
+ "Wound irrigation",
+ "Neonatal Feeding",
+ "Intra-lesional",
+ "intravenous push",
+ "Local Infiltration",
+ "Perfusion",
+ "DELETE20",
+ "Intraosseous",
+ "Intraspinal",
+ "urinary catheter irrigation",
+ "intratympanic",
+ "Hand Bulb Nebulizer",
+ "IPPB",
+ "Ostomy",
+ "Combination",
+ "abdominal subcutaneous",
+ "Subgingival-Local",
+ "Intrathoracic",
+ "intraocular irrigation",
+ "INTRAVARICEAL",
+ "Intracoronary",
+ "subcutaneous (via wearable injector)",
+ "central line irrigation",
+ "Intrapericardial",
+ "Submucosal Inj",
+ "Laryngotracheal",
+ "Retrobulbar",
+ "Tendon Sheath Inj",
+ "Osteochondrial",
+ "Intradetrusor",
+ "Intraductal",
+ "Cont Nebulization",
+ "hemodialysis port injection"
+]
+
+MED_DESCRIPTIONS = [
+ "ONDANSETRON HCL (PF) 4 MG/2 ML INJ SOLN",
+ "FENTANYL (PF) 50 MCG/ML INJECTION",
+ "SODIUM CHLORIDE 0.9 % 0.9 % IV SOLP",
+ "MIDAZOLAM 1 MG/ML INJ SOLN",
+ "ACETAMINOPHEN 325 MG PO TABS",
+ "NS IV BOLUS",
+ "TPN ADULT STANDARD",
+ "HEPARIN, PORCINE (PF) 100 UNIT/ML IV SYRG",
+ "DIPHENHYDRAMINE HCL 50 MG/ML INJ SOLN",
+ "OXYCODONE 5 MG PO TABS",
+ "NALOXONE 0.4 MG/ML INJ SOLN",
+ "PROPOFOL 10 MG/ML IV INJECTION",
+ "LACTATED RINGERS IV SOLP",
+ "LORAZEPAM 2 MG/ML INJ SOLN",
+ "DIPHENHYDRAMINE HCL 25 MG PO CAPS",
+ "HYDROCODONE-ACETAMINOPHEN 5-325 MG PO TABS",
+ "LORAZEPAM 0.5 MG PO TABS",
+ "TRIPLE MIX",
+ "HYDROCODONE-ACETAMINOPHEN 5-500 MG PO TABS",
+ "HYDROMORPHONE (PF) 2 MG/ML INJ SOLN",
+ "LIDOCAINE (PF) 10 MG/ML (1 %) INJ SOLN",
+ "PROMETHAZINE 25 MG/ML INJ SOLN",
+ "DEXAMETHASONE SODIUM PHOSPHATE 4 MG/ML INJ SOLN",
+ "FUROSEMIDE 10 MG/ML INJ SOLN",
+ "LORAZEPAM 1 MG PO TABS",
+ "FENTANYL CITRATE (PF) 50 MCG/ML INJ SOLN",
+ "DOCUSATE SODIUM 100 MG PO CAPS",
+ "PANTOPRAZOLE 40 MG PO TBEC",
+ "POLYETHYLENE GLYCOL 3350 17 GRAM PO PWPK",
+ "ACETAMINOPHEN 500 MG PO TABS",
+ "ONDANSETRON HCL 8 MG PO TABS",
+ "ASPIRIN 81 MG PO TBEC",
+ "TPN BMT",
+ "DOCUSATE SODIUM 250 MG PO CAPS",
+ "SENNOSIDES 8.6 MG PO TABS",
+ "GABAPENTIN 300 MG PO CAPS",
+ "HYDROMORPHONE 1 MG/ML INJ SYRG",
+ "ALTEPLASE 2 MG INTRA-CATHET SOLR",
+ "OXYCODONE-ACETAMINOPHEN 5-325 MG PO TABS",
+ "MAGNESIUM OXIDE-MG AA CHELATE 133 MG PO TABS",
+ "CEFAZOLIN 1 GRAM INJ SOLR",
+ "DEXAMETHASONE 4 MG PO TABS",
+ "BISACODYL 10 MG PR SUPP",
+ "METOCLOPRAMIDE HCL 5 MG/ML INJ SOLN",
+ "ONDANSETRON 4 MG PO TBDL",
+ "AMLODIPINE 5 MG PO TABS",
+ "ZOLPIDEM 5 MG PO TABS",
+ "ACETAMINOPHEN 1,000 MG/100 ML (10 MG/ML) IV SOLN",
+ "LOPERAMIDE 2 MG PO CAPS",
+ "CEFAZOLIN IN DEXTROSE (ISO-OS) 1 GRAM/50 ML IV PGBK",
+ "METHYLPREDNISOLONE SOD SUC(PF) 125 MG/2 ML INJ SOLR",
+ "LIDOCAINE HCL 10 MG/ML (1 %) INJ SOLN",
+ "POTASSIUM CHLORIDE 20 MEQ PO TBTQ",
+ "SODIUM CHLORIDE 0.9 % IV SOLP",
+ "DEXTROSE 50 % IN WATER (D50W) IV SYRG",
+ "FLUTICASONE 50 MCG/ACTUATION NASAL SPSN",
+ "EPINEPHRINE 1 MG/ML (1 ML) INJ SOLN",
+ "ALBUTEROL SULFATE 90 MCG/ACTUATION INH HFAA",
+ "LIDOCAINE (PF) 20 MG/ML (2 %) INJ SOLN",
+ "MAGNESIUM SULFATE IN 0.9 %NACL 2 GRAM/50 ML IV PGBK",
+ "HYDROCORTISONE SOD SUCC (PF) 100 MG/2 ML INJ SOLR",
+ "HYDROCHLOROTHIAZIDE 25 MG PO TABS",
+ "ROCURONIUM 10 MG/ML IV SOLN",
+ "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS",
+ "TRAMADOL 50 MG PO TABS",
+ "ALUM-MAG HYDROXIDE-SIMETH 200-200-20 MG/5 ML PO SUSP",
+ "PHENYLEPHRINE HCL 10 MG/ML INJ SOLN",
+ "METOPROLOL TARTRATE 25 MG PO TABS",
+ "OMEPRAZOLE 20 MG PO CPDR",
+ "FAMOTIDINE 20 MG PO TABS",
+ "HEPARIN, PORCINE (PF) 5,000 UNIT/0.5 ML INJ SOLN",
+ "ACETAMINOPHEN 650 MG/20.3 ML PO SOLN",
+ "HYDROMORPHONE 2 MG/ML INJ SYRG",
+ "LABETALOL 5 MG/ML IV SOLN",
+ "VANCOMYCIN IVPB (CUSTOM DOSE)",
+ "METOCLOPRAMIDE 5 MG/ML INJ SOLN",
+ "ATORVASTATIN 40 MG PO TABS",
+ "HEPARIN (PORCINE) 1,000 UNIT/ML INJ SOLN",
+ "FUROSEMIDE 20 MG PO TABS",
+ "TPN ADULT CYCLIC",
+ "INSULIN LISPRO 100 UNIT/ML SC SOLN",
+ "MAGNESIUM SULFATE IV SCALE ",
+ "MAGNESIUM SULFATE IN 0.9 %NACL 1 GRAM/50 ML IV PGBK",
+ "ALBUMIN, HUMAN 5 % 5 % IV SOLP",
+ "NITRIC OXIDE GAS 800 PPM INH GAS",
+ "LISINOPRIL 10 MG PO TABS",
+ "METOPROLOL TARTRATE 5 MG/5 ML IV SOLN",
+ "ENOXAPARIN 40 MG/0.4 ML SC SYRG",
+ "GLYCOPYRROLATE 0.2 MG/ML INJ SOLN",
+ "HYDRALAZINE 20 MG/ML INJ SOLN",
+ "MEPERIDINE (PF) 25 MG/ML INJ SYRG",
+ "HYDROMORPHONE 1 MG/ML IV PCA",
+ "POTASSIUM CHLORIDE IV SCALE",
+ "IBUPROFEN 600 MG PO TABS",
+ "CEPHALEXIN 500 MG PO CAPS",
+ "ATORVASTATIN 10 MG PO TABS",
+ "MAGNESIUM HYDROXIDE 400 MG/5 ML PO SUSP",
+ "ATORVASTATIN 20 MG PO TABS",
+ "TRAZODONE 50 MG PO TABS",
+ "EPHEDRINE SULFATE 50 MG/ML INJ SOLN",
+ "METFORMIN 500 MG PO TABS",
+ "PREDNISONE 20 MG PO TABS",
+ "SIMVASTATIN 20 MG PO TABS",
+ "ASPIRIN 81 MG PO CHEW",
+ "DIAZEPAM 5 MG PO TABS",
+ "PANTOPRAZOLE 40 MG IV SOLR",
+ "GLUCOSE 4 GRAM PO CHEW",
+ "ZOLPIDEM 10 MG PO TABS",
+ "POTASSIUM CHLORIDE ORAL SCALE",
+ "TAMSULOSIN 0.4 MG PO CP24",
+ "PREDNISONE 10 MG PO TABS",
+ "INSULIN REGULAR HUMAN 100 UNIT/ML INJ SOLN",
+ "FAMOTIDINE (PF) 20 MG/2 ML IV SOLN",
+ "AMLODIPINE 10 MG PO TABS",
+ "IPRATROPIUM-ALBUTEROL 0.5 MG-3 MG(2.5 MG BASE)/3 ML INH NEBU",
+ "REMIFENTANIL 2 MG IV SOLR",
+ "PROCHLORPERAZINE MALEATE 10 MG PO TABS",
+ "ASPIRIN 325 MG PO TABS",
+ "POTASSIUM CHLORIDE 10 MEQ PO TBTQ",
+ "LISINOPRIL 20 MG PO TABS",
+ "MORPHINE 2 MG/ML INJ SYRG",
+ "POTASSIUM CHLORIDE ORAL TABLET REPLACEMENT SCALE",
+ "DEXTROSE 5 % IN WATER (D5W) IV SOLP",
+ "CEFAZOLIN IN DEXTROSE (ISO-OS) 2 GRAM/100 ML IV PGBK",
+ "SULFAMETHOXAZOLE-TRIMETHOPRIM 800-160 MG PO TABS",
+ "POTASSIUM CHLORIDE IV REPLACEMENT SCALE",
+ "AMOXICILLIN-POT CLAVULANATE 875-125 MG PO TABS",
+ "METOPROLOL SUCCINATE 25 MG PO TB24",
+ "HEPARIN, PORCINE (PF) 1,000 UNIT/ML INJ SOLN",
+ "MORPHINE 4 MG/ML INJ SYRG",
+ "CLOPIDOGREL 75 MG PO TABS",
+ "GABAPENTIN 100 MG PO CAPS",
+ "FUROSEMIDE 40 MG PO TABS",
+ "TACROLIMUS 1 MG PO CAPS",
+ "LOSARTAN 50 MG PO TABS",
+ "GLYCERIN-DIMETHICONE-PETRO, WH TP CREA",
+ "OTHER DRUG",
+ "AZITHROMYCIN 250 MG PO TABS",
+ "SODIUM BICARBONATE 8.4 % IV SOLN",
+ "POTASSIUM CHLORIDE 10 MEQ/100 ML IV PGBK",
+ "PREDNISONE 5 MG PO TABS",
+ "FAT EMULSION 20 % IV EMUL",
+ "HYDROMORPHONE (PF) 1 MG/ML INJ SYRG",
+ "LIDOCAINE 4 % TP CREA",
+ "CEFAZOLIN 2 G IVPB",
+ "ONDANSETRON (+DEXAMETHASONE) IVPB",
+ "LEVOTHYROXINE 50 MCG PO TABS",
+ "FERROUS SULFATE 325 MG (65 MG IRON) PO TABS",
+ "CALCIUM GLUCONATE IN 0.9% NACL 1 GRAM/50 ML IV SOLN",
+ "LIDOCAINE-EPINEPHRINE 1 %-1:100,000 INJ SOLN",
+ "CIPROFLOXACIN HCL 500 MG PO TABS",
+ "ALBUTEROL SULFATE 2.5 MG /3 ML (0.083 %) INH NEBU",
+ "KETOROLAC 30 MG/ML (1 ML) INJ SOLN",
+ "LISINOPRIL 5 MG PO TABS",
+ "ONDANSETRON HCL 4 MG PO TABS",
+ "NITROGLYCERIN 0.4 MG SL SUBL",
+ "DIPHTH,PERTUS(ACELL),TETANUS 2.5-8-5 LF-MCG-LF/0.5ML IM SUSP (UHA)",
+ "METOPROLOL SUCCINATE 50 MG PO TB24",
+ "CIPROFLOXACIN 500 MG PO TABS",
+ "PACLITAXEL IV CHEMO INFUSION",
+ "SODIUM CHLORIDE 0.9 % IRRIG SOLN",
+ "VITAMIN D3 PO",
+ "1/2 NS WITH KCL AND MAGNESIUM SULFATE (+MANNITOL) IV INFUSION",
+ "SPIRONOLACTONE 25 MG PO TABS",
+ "PROAIR HFA 90 MCG/ACTUATION INH HFAA",
+ "FOLIC ACID 1 MG PO TABS",
+ "SUCCINYLCHOLINE CHLORIDE 20 MG/ML INJ SOLN",
+ "POTASSIUM PHOSPHATE IVPB",
+ "FILGRASTIM 300 MCG/0.5 ML INJ SYRG",
+ "ATENOLOL 25 MG PO TABS",
+ "POTASSIUM CHLORID-D5-0.45%NACL 20 MEQ/L IV SOLP",
+ "GEMCITABINE IV CHEMO INFUSION",
+ "MELATONIN 3 MG PO TABS",
+ "BUPIVACAINE (PF) 0.25 % (2.5 MG/ML) INJ SOLN",
+ "METFORMIN 1,000 MG PO TABS",
+ "CARBOPLATIN (AUC DOSING) IV CHEMO INFUSION",
+ "LEVOTHYROXINE 75 MCG PO TABS",
+ "FLUMAZENIL 0.1 MG/ML IV SOLN",
+ "LEVOTHYROXINE 100 MCG PO TABS",
+ "MONTELUKAST 10 MG PO TABS",
+ "ACYCLOVIR 400 MG PO TABS",
+ "LIDOCAINE HCL 2 % VISCOUS ORAL SOLN",
+ "VANCOMYCIN IN D5W 1 GRAM/200 ML IV PGBK",
+ "AMIODARONE 200 MG PO TABS",
+ "DEXTROSE 50% IN WATER (D50W) IV SYRG",
+ "SUCRALFATE 1 GRAM PO TABS",
+ "CYCLOBENZAPRINE 10 MG PO TABS",
+ "CLONAZEPAM 0.5 MG PO TABS",
+ "SIMVASTATIN 40 MG PO TABS",
+ "METOPROLOL TARTRATE 50 MG PO TABS",
+ "LACTATED RINGERS IV BOLUS",
+ "LIDOCAINE HCL 20 MG/ML (2 %) INJ SOLN",
+ "IBUPROFEN 800 MG PO TABS",
+ "MORPHINE INJECTABLE SYRINGE",
+ "PPN ADULT STANDARD",
+ "PIPERACILLIN-TAZOBACTAM-DEXTRS 3.375 GRAM/50 ML IV PGBK",
+ "WARFARIN 5 MG PO TABS",
+ "CHLORHEXIDINE GLUCONATE 0.12 % MM MWSH",
+ "LOSARTAN 25 MG PO TABS",
+ "NS IV BOLUS - 1000 ML"
+]
+
+PROTOCOL_NAME = [
+ " AMB URO URODYNAMICS",
+ "(RETIRED PLEASE USE ORDERSET (SURGERY GENERAL POSTOP 801) IP SUR CHOLECYSTECTOMY",
+ "(RETIRED) IP PICC LINE PLACEMENT / EXCHANGE",
+ "AMB ALG XOLAIR MMC",
+ "AMB AWCC WOUND CARE",
+ "AMB CAR ATRIAL FIBRILLATION",
+ "AMB CAR CONGESTIVE HEART FAILURE",
+ "AMB CAR IC NEW",
+ "AMB DERM ACNE",
+ "AMB DERM DERMATITIS MMC",
+ "AMB DERM EXCISION MMC",
+ "AMB DERM PSORIASIS ",
+ "AMB DERM SKIN BIOPSY",
+ "AMB DERM SURG PRE-OPERATIVE CHECK SHEET",
+ "AMB DERM SURG PROCEDURES",
+ "AMB DIGESTIVE HEALTH INFLAMMATORY BOWEL DISEASE",
+ "AMB DIGESTIVE HEALTH STOMACH",
+ "AMB END DIABETES TYPE 1",
+ "AMB END DIABETES TYPE 2",
+ "AMB END THYROGEN STUDIES",
+ "AMB ENDO DIABETES TYPE 1 MMC",
+ "AMB ENDO DIABETES TYPE 2 MMC",
+ "AMB ENDO THYROGEN STUDIES MMC",
+ "AMB FLU CLINIC",
+ "AMB GI ABDOMINAL PAIN",
+ "AMB GI DIARRHEA MMC",
+ "AMB GI PRE-OPERATIVE EVALUATION",
+ "AMB GYN AMENORRHEA ",
+ "AMB GYN ANNUAL WELL WOMAN EXAM",
+ "AMB GYN COLPOSCOPY MMC",
+ "AMB GYN MEDICAL AB VISIT #1",
+ "AMB GYN ROUTINE ADOLESCENT EXAM",
+ "AMB GYN VAGINITIS",
+ "AMB HC CAR HYPERTENSION CENTER",
+ "AMB HEART TRANSPLANT ANNUAL STANFORD RN ORDERS",
+ "AMB HEART TRANSPLANT OUTPATIENT CLINIC EVALUATION STANFORD",
+ "AMB HEART TRANSPLANT ROUTINE STANFORD RN ORDERS",
+ "AMB HEP C TREATMENT PROTOCOL LAB ORDERS",
+ "AMB HEP CHRONIC HEPATITIS C",
+ "AMB HEP HEPATITIS B",
+ "AMB HM SHC SUPER SMARTSET",
+ "AMB HM UHA SUPER SMARTSET",
+ "AMB IFD SKIN AND SOFT TISSUE INFECTION",
+ "AMB IM ANNUAL FEMAL EXAM MMC",
+ "AMB IM ANNUAL MALE EXAM MMC",
+ "AMB IM COUGH/BRONCHITIS MMC",
+ "AMB IM UPPER RESPIRATORY INFECTION MMC",
+ "AMB IMM 19-49 YRS IMMUNIZATIONS",
+ "AMB IMM 50-64 YRS IMMUNIZATIONS",
+ "AMB IMM >=65 YRS IMMUNIZATIONS",
+ "AMB IMM ADULT",
+ "AMB IMM PEDS 11-12 YRS IMMUNIZATIONS",
+ "AMB IMM PEDS 12 MO IMMUNIZATIONS",
+ "AMB IMM PEDS 13-14, 16-18 YRS IMMUNIZATIONS (OVERDUE)",
+ "AMB IMM PEDS 15 MO IMMUNIZATIONS",
+ "AMB IMM PEDS 15 YRS IMMUNIZATIONS",
+ "AMB IMM PEDS 18-23 MO IMMUNIZATIONS",
+ "AMB IMM PEDS 2 MO IMMUNIZATIONS",
+ "AMB IMM PEDS 2-3 YRS IMMUNIZATIONS",
+ "AMB IMM PEDS 4 MONTH IMMUNIZATIONS",
+ "AMB IMM PEDS 4-6 YRS IMMUNIZATIONS",
+ "AMB IMM PEDS 6 MO IMMUNIZATIONS",
+ "AMB IMM PEDS 7-10 YRS IMMUNIZATIONS",
+ "AMB IMM PEDS BIRTH TO 1 MO IMMUNIZATIONS",
+ "AMB IMM TRAVEL IMMUNIZATIONS",
+ "AMB LAB TRANSFUSION SERVICE, STANDARD",
+ "AMB LIV PRE-OP ORDERS",
+ "AMB NEU CONCUSSION FOLLOW UP VISIT",
+ "AMB NEU LUMBAR PUNCTURE",
+ "AMB NEU MOVE PARKINSON'S",
+ "AMB NEU MULTIPLE SCLEROSIS",
+ "AMB NEU STROKE GENERAL",
+ "AMB NEUROSCIENCE BOTOX SMARTSET",
+ "AMB OAC ENCOUNTER",
+ "AMB OPH CATARACT POST OP",
+ "AMB OPH CLINIC GLAUCOMA LASER PROCEDURES",
+ "AMB OPH CLINIC LASER PROCEDURES",
+ "AMB OPH CORNEA ULCER",
+ "AMB OPH INJECTIONS",
+ "AMB OPH INTRAVITREAL AVASTIN INJECTION BOTH EYES",
+ "AMB OPH INTRAVITREAL AVASTIN INJECTION LEFT EYE",
+ "AMB OPH INTRAVITREAL AVASTIN INJECTION RIGHT EYE",
+ "AMB OPH INTRAVITREAL AVASTIN/LUCENTIS INJECTION ",
+ "AMB OPH INTRAVITREAL INJ LEFT EYE",
+ "AMB OPH INTRAVITREAL INJ RIGHT EYE",
+ "AMB OPH INTRAVITREAL INJ VISIT",
+ "AMB OPH INTRAVITREAL LUCENTIS INJECTION BOTH EYES",
+ "AMB OPH INTRAVITREAL LUCENTIS INJECTION LEFT EYE",
+ "AMB OPH INTRAVITREAL LUCENTIS INJECTION RIGHT EYE",
+ "AMB OPH INTRAVITREAL LUCENTIS/AVASTIN INJECTION",
+ "AMB OPH INTRAVITREAL TRIESENCE INJECTION LEFT EYE",
+ "AMB OPH INTRAVITREAL TRIESENCE INJECTION RIGHT EYE",
+ "AMB OPH NEURO GENERAL",
+ "AMB OPH POST OP RET LT EYE",
+ "AMB OPH PRE OP VISIT",
+ "AMB OPH PREOP CORNEA TRANSPLANT",
+ "AMB OPH RET INJ",
+ "AMB OPH RET POSTOP",
+ "AMB OPH RETINA MASTER",
+ "AMB OPHTH LASER",
+ "AMB OPHTH LASER LASIK",
+ "AMB OPHTH LASER LASIK ENHANCED",
+ "AMB OPHTH LASER PRK",
+ "AMB ORDER TRANSMITTAL PRINTING",
+ "AMB ORT ARTHROCENTESIS MMC",
+ "AMB ORT FOOT AND ANKLE INJECTION",
+ "AMB ORT FOOT_ANKLE",
+ "AMB ORT HAND ARTHRITIS",
+ "AMB ORT HAND INJECTION",
+ "AMB ORT HAND SOFT TISSUE",
+ "AMB ORT HAND TRAUMA",
+ "AMB ORT HAND_WRIST",
+ "AMB ORT HUNT FOOT_ANKLE",
+ "AMB ORT INJECTIONS HAND",
+ "AMB ORT INJECTIONS JOINT",
+ "AMB ORT INJECTIONS SPINE",
+ "AMB ORT INJECTIONS SPORTS MED",
+ "AMB ORT INJECTIONS TUMOR",
+ "AMB ORT JOINT HIP",
+ "AMB ORT JOINT HIP_GOODMAN",
+ "AMB ORT JOINT INJECTION",
+ "AMB ORT JOINT KNEE",
+ "AMB ORT JOINT KNEE_GOODMAN",
+ "AMB ORT PMR",
+ "AMB ORT SHOULDER_ELBOW",
+ "AMB ORT SPINE",
+ "AMB ORT SPINE INJECTION",
+ "AMB ORT SPINE PMR",
+ "AMB ORT SPORTS INJECTION",
+ "AMB ORT SPORTS MEDICINE_FANTON",
+ "AMB ORT SPORTS MEDICINE_SAFRAN",
+ "AMB ORT SPORTS_ELBOW",
+ "AMB ORT SPORTS_FRACTURES",
+ "AMB ORT SPORTS_HAND/WRIST",
+ "AMB ORT SPORTS_HIP/THIGH",
+ "AMB ORT SPORTS_KNEE",
+ "AMB ORT SPORTS_LEG/ANKLE/FOOT",
+ "AMB ORT SPORTS_SHOULDER",
+ "AMB ORT SPORTS_SPINE",
+ "AMB ORT TRAUMA _KNEE",
+ "AMB ORT TRAUMA_HIP",
+ "AMB ORT TRAUMA_INFECTION",
+ "AMB ORT TRAUMA_PELVIS FX",
+ "AMB ORT TUMOR BIOPSY/INJECTION",
+ "AMB ORT TUMOR_SOFT TISSUE",
+ "AMB PAIN BURSA INJECTION",
+ "AMB PAIN INTRATHECAL PUMP REFILL / ADJUSTMENT",
+ "AMB PAIN KETAMINE INFUSION",
+ "AMB PAIN LIDOCAINE INFUSION",
+ "AMB PAIN MANAGEMENT CHEMODENERVATION WITH BOTOX FOR EXTREMITIES/TRUNK",
+ "AMB PAIN MANAGEMENT CHEMODENERVATION WITH BOTOX FOR HEAD/FACE",
+ "AMB PAIN MANAGEMENT CHEMODENERVATION WITH BOTOX FOR NECK",
+ "AMB PAIN MANAGEMENT INIITAL/OFFICE VISIT",
+ "AMB PAIN MANAGEMENT PROCEDURE VISIT",
+ "AMB PAIN OCCIPITAL NERVE BLOCK",
+ "AMB PAIN PERIPHERAL NERVE BLOCK INJECTION",
+ "AMB PAIN PREEMPT INJECTION FOR CHRONIC MIGRAINE",
+ "AMB PAIN SCAR INJECTION WITH ALCOHOL",
+ "AMB PAIN SCAR INJECTION WITH BOTOX",
+ "AMB PAIN SCAR INJECTION WITH LOCAL ANESTHETIC",
+ "AMB PAIN SCAR INJECTION WITH STEROID",
+ "AMB PAIN TRIGGERPOINT INJECTION WITH BOTOX",
+ "AMB PAIN TRIGGERPOINT INJECTION WITHOUT BOTOX",
+ "AMB PC GEN ABDOMINAL PAIN",
+ "AMB PC GEN ALLERGIC RHINITIS",
+ "AMB PC GEN ANKLE SPRAIN",
+ "AMB PC GEN ANNUAL FEMALE EXAM",
+ "AMB PC GEN ANNUAL MALE EXAM",
+ "AMB PC GEN ANXIETY",
+ "AMB PC GEN ASTHMA (ADULT)",
+ "AMB PC GEN BACK PAIN",
+ "AMB PC GEN CERUMEN IMPACTION",
+ "AMB PC GEN CHEST PAIN",
+ "AMB PC GEN CHRONIC OBSTRUCTIVE PULMONARY DISEASE (COPD)",
+ "AMB PC GEN CONGESTIVE HEART FAILURE",
+ "AMB PC GEN CONJUNCTIVITIS",
+ "AMB PC GEN CONSTIPATION",
+ "AMB PC GEN CONTRACEPTIVE VISIT",
+ "AMB PC GEN COUGH / BRONCHITIS",
+ "AMB PC GEN DEPRESSION",
+ "AMB PC GEN DIABETES MELLITUS TYPE 2",
+ "AMB PC GEN DIVERTICULITIS",
+ "AMB PC GEN DIZZINESSS",
+ "AMB PC GEN ELBOW PAIN",
+ "AMB PC GEN ESOPHAGEAL REFLUX",
+ "AMB PC GEN FOREIGN BODY",
+ "AMB PC GEN GASTROENTERITIS",
+ "AMB PC GEN HEADACHE",
+ "AMB PC GEN HEMORRHOID",
+ "AMB PC GEN HIP PAIN",
+ "AMB PC GEN HYPERLIPIDEMIA",
+ "AMB PC GEN HYPERTENSION",
+ "AMB PC GEN HYPOTHYROIDISM",
+ "AMB PC GEN KNEE PAIN",
+ "AMB PC GEN NAUSEA/VOMITING",
+ "AMB PC GEN NECK PAIN",
+ "AMB PC GEN OTITIS EXTERNA",
+ "AMB PC GEN OTITIS MEDIA",
+ "AMB PC GEN PALPITATIONS",
+ "AMB PC GEN PERIPHERAL VASCULAR DISEASE"
+]
+
+SS_SECTION_NAME = [
+ None,
+ " ",
+ " ",
+ "2A. High Risk of Delirium: Management",
+ "2A. High risk of delirium: Management",
+ "2A. Hyperactive delirium: Management",
+ "2B. Hyperactive Delirium: Management",
+ "2B. Hyperactive delirium: Management",
+ "2B. Hypoactive delirium: Management ",
+ "2C. Hypoactive delirium: Management ",
+ "ADULT MEDICATIONS",
+ "ANALGESICS",
+ "ANTI-EMETICS",
+ "ANTIBIOTICS",
+ "ANTICOAGULANTS",
+ "APPLY TO WOUND",
+ "Acute Ischemic Stroke",
+ "Ad-hoc Orders",
+ "Additional Medications",
+ "Adjunction/Alternative Headache Treatments",
+ "Adult Medications",
+ "Adult Protocol",
+ "After Visit Medications",
+ "Allergy Testing",
+ "Ambulatory Orders",
+ "Analgesics",
+ "Anti- Emetics",
+ "Anti-rejection Medications",
+ "Antibiotics",
+ "Antibiotics - Community Acquired (Severe Sepsis)",
+ "Antibiotics - Community Acquired (Severe Sepsis) ",
+ "Antibiotics - Community Acquired (Severe sepsis)",
+ "Antibiotics - Community Acquired (Simple Sepsis)",
+ "Antibiotics - Healthcare Associated or Immunocompromised Sepsis ",
+ "Antibiotics - Healthcare Associated or Immunocompromised Sepsis (Simple/Severe)",
+ "Anticoagulants",
+ "Antipsychotics ",
+ "Anxiety/Agitation",
+ "Approved Albumin Indications",
+ "Argatroban - Left Ventricular Assist Device (LVAD) protocol",
+ "Argatroban - Specific Infusion Parameters per MD",
+ "Argatroban - Standard Protocol",
+ "Ascites",
+ "Aspirin",
+ "BASAL/PRANDIAL/CORRECTIVE SCALES FOR CONTINUOUS FEEDS/NPO",
+ "BASAL/PRANDIAL/CORRECTIVE SCALES FOR ORAL DIET/BOLUS FEEDS",
+ "BASAL/PRANDIAL/CORRECTIVE Scales For Continuous FEEDS/NPO",
+ "BASAL/PRANDIAL/CORRECTIVE Scales For Oral DIET/BOLUS Feeds",
+ "BLOOD TRANSFUSION",
+ "BOLUS",
+ "Basal/Prandial/Corrective Scales For Continuous Feeds/NPO",
+ "Basal/Prandial/Corrective Scales For Oral Diet/Bolus Feeds",
+ "Basal/Prandial/Corrective Scales for Continuous Feeds/NPO",
+ "Basal/Prandial/Corrective Scales for Continuous Feeds/NPO/TPN",
+ "Basal/Prandial/Corrective Scales for Oral Diet/Bolus Feeds",
+ "Blood Transfusion",
+ "Bolus",
+ "Bowel Regimen",
+ "CONTINUOUS INTRAVENOUS INSULIN INFUSION",
+ "CSF Leak Orders",
+ "Calcium ",
+ "Catch-up Orders",
+ "Clinic-Administered Medications",
+ "Cluster Headache",
+ "Community Acquired Pneumonia",
+ "Continuous Intravenous Insulin Infusion",
+ "Contrast",
+ "DEXAMETHASONE",
+ "DIABETIC SUPPLIES",
+ "DISCHARGE INSTRUCTIONS",
+ "DISCHARGE ORDERS",
+ "DISCONTINUE PREVIOUS INSULIN/ORAL ANTIDIABETIC ORDERS",
+ "DVT PROPHYLAXIS",
+ "Day of Surgery Orders",
+ "Delirium",
+ "Dexamethasone",
+ "Dialysis Medications",
+ "Dialysis Solutions",
+ "Diptheria tetanus toxoid pertussis vaccine",
+ "Discharge",
+ "Discharge Orders",
+ "ECMO Circuit Respiratory Parameters",
+ "ELECTROLYTE REPLACEMENT",
+ "EMERGENCY RELEASE BLOOD PRODUCTS",
+ "Electrolyte Replacement",
+ "Emergency Medications",
+ "Encephalopathy",
+ "Extremity Swelling/Deformity/or Open Fracture",
+ "FLUID RESUSCITATION",
+ "FULL INTENSITY HEPARIN PROTOCOL",
+ "Fluid Resuscitation",
+ "Fluids",
+ "For Pharmacist Use ONLY",
+ "Future Orders",
+ "GI Bleeding",
+ "General",
+ "General Medications",
+ "General Perioperative Orders",
+ "HEMATOPOIETIC CELL INFUSION",
+ "HEPARIN - ACUTE CORONARY SYNDROME",
+ "HEPARIN - ATRIAL FIB",
+ "HEPARIN - CARDIO ELECTROPHYSIOLOGY",
+ "HEPARIN - DVT/PE",
+ "HEPARIN - HIGH BLEEDING RISK",
+ "HEPARIN - MECHANICAL HEART VALVE",
+ "HEPARIN - NEURO",
+ "HEPARIN - SPECIFIC BOLUS & INFUSION PARAMETERS PER MD ",
+ "HEPARIN - VASCULAR SURGERY",
+ "HYDROCORTISONE",
+ "HYPOGLYCEMIA CONTROL",
+ "HYPOGLYCEMIA CONTROL FOR INSULIN TRANSITION OFF IV INFUSION PROTOCOL",
+ "HYPOGLYCEMIA CONTROL FOR SUBCUTANEOUS INSULIN PUMP PROTOCOL",
+ "HYPOGLYCEMIA PROTOCOL FOR DKA",
+ "HYPOGLYCEMIC PROTOCOL FOR IV INSULIN INFUSION",
+ "Heparin - Acute Coronary Syndrome",
+ "Heparin - Atrial FIB",
+ "Heparin - Cardio Electrophysiology",
+ "Heparin - DVT/PE",
+ "Heparin - High Bleeding Risk",
+ "Heparin - Left Ventricular Assist Device (LVAD)",
+ "Heparin - Mechanical Heart Valve",
+ "Heparin - Neuro",
+ "Heparin - Specific Bolus & Infusion Parameters Per MD ",
+ "Heparin - Vascular Surgery",
+ "Heparin Infusion Protocols",
+ "Hepatitis B vaccine. Administer40 mcg IM",
+ "Hospital Acquired Or Ventilator Associated Pneumonia",
+ "Hypoglycemia Control",
+ "Hypoglycemia Control For Insulin Transition Off IV Infusion Protocol",
+ "Hypoglycemia Control For Subcutaneous Insulin Pump Protocol",
+ "Hypoglycemia Protocol For DKA",
+ "Hypoglycemia Treatment",
+ "Hypoglycemic Protocol For IV Insulin Infusion",
+ "ICU Admission",
+ "IMMUNIZATION",
+ "IMMUNIZATIONS",
+ "INFUSION",
+ "INITIAL INTRAVENOUS FLUID AND KCL THERAPY",
+ "INJECTION/MEDICATIONS",
+ "INR = 1.2 to 1.5",
+ "INR > Or = 1.6",
+ "INR > or = 1.6",
+ "INSULIN BASAL, PRANDIAL AND CORRECTIVE SCALES",
+ "INSULIN BASAL, PRANDIAL AND CORRECTIVE SCALES (ORAL DIET/BOLUS FEEDS)",
+ "INSULIN BASAL, PRANDIAL AND CORRECTIVE SCALES - CONTINUOUS FEEDS/NPO ",
+ "INSULIN BASAL, PRANDIAL AND CORRECTIVE SUBCUTANEOUS SCALES",
+ "INSULIN BASAL, PRANDIAL AND CORRECTIVE SUBCUTANEOUS SCALES",
+ "INSULIN BASAL, PRANDIAL AND CORRECTIVE SUBCUTANEOUS SCALES ",
+ "INSULIN BASAL, PRANDIAL AND CORRRECTIVE SUBCUTANTEOUS SCALES",
+ "INSULIN BASAL,PRANDIAL AND CORRECTIVE SUBCUTANEOUS SCALES",
+ "INSULIN BASAL/PRANDIAL/CORRECTIVE SCALES FOR NPO PATIENT REMAINING NPO",
+ "INSULIN BASAL/PRANDIAL/CORRECTIVE SCALES FOR NPO PATIENT TRANSITIONING TO ORAL DIET",
+ "INSULIN BASAL/PRANDIAL/CORRECTIVE SCALES FOR PATIENT ON CONTINUOUS TUBE FEEDS BEFORE/AFTER TRANSITION OFF DRIP",
+ "INSULIN BOLUS AND INFUSION",
+ "INSULIN INFUSION AND BOLUS",
+ "INSULIN INFUSION HYPOGLYCEMIC PROTOCOL",
+ "INSULIN PUMP",
+ "INTRA PROCEDURE",
+ "INTRATHECAL CLONIDINE",
+ "INTUBATION MEDICATIONS",
+ "IP INSULIN CONTINUOUS IV INFUSION (For Cardiac Transplant)",
+ "IP Insulin Continuous IV Infusion",
+ "IP Insulin Continuous IV Infusion (For Cardiac Transplant)",
+ "IV FLUID",
+ "IV FLUIDS",
+ "IV Fluid",
+ "IV Fluids",
+ "IV Fluids (age 65+)",
+ "IV Fluids and Saline Lock",
+ "IV SOLUTIONS",
+ "IV Solutions",
+ "IVIG Therapy",
+ "If Patient to be Treated as an Inpatient",
+ "If Patient to be Treated as an Outpatient",
+ "Imaging",
+ "Imm/Injections",
+ "Immunization/Injection",
+ "Immunizations",
+ "Immunizations/Injections",
+ "Influenza",
+ "Influenza Treatment",
+ "Influenza Vaccine 6-35 months",
+ "Influenza Vaccine =>3 Years Old",
+ "Initial INR 1.4 -1.6",
+ "Initial INR 1.5 -1.6",
+ "Initial INR 1.7 -1.9",
+ "Initial INR > or = 2",
+ "Initial IV Fluids",
+ "Initial Intravenous Fluid And KCL Therapy",
+ "Injectible Meds",
+ "Injection/Medications",
+ "Injections",
+ "Injections/Medications",
+ "Inpatient Admission",
+ "Inpatient Pre-Op IV Fluids",
+ "Inpatient Pre-Op Medications",
+ "Inpatient Pre-Op VTE Prophylaxis",
+ "Inpatient Pre-op Orders",
+ "Insulin",
+ "Insulin BASAL/PRANDIAL/CORRECTIVE Scales For NPO Patient REMAINING NPO"
+]
+
+SS_SG_NAME = [
+ None,
+ " ",
+ " PCP Prophylaxis auto",
+ " PONV TREATMENT ON THE FLOOR: Please see PONV guidelines and if criteria are met, give one 5HT-3 Q12 Hr (max 48hr) and metoclopramide:",
+ " PONV Treatment on the Floor:",
+ " PONV Treatment on the Floor: Please see PONV guidelines and if criteria are met, give one 5HT-3 Q12 Hr (max 48hr) and metoclopramide:",
+ " Phosphate-Lowering Agents",
+ " Regular Insulin Traditional Scales- Continuous Feeds/NPO (Non-ICU)",
+ "(Adult) Blood Product and Transfuse Orders (weight greater than 50 kg)",
+ "(Adult) Emergency Release Blood Products (weight greater than 50 kg)",
+ "(Aliquot) Blood Product and Transfuse Orders (weight less than 50 kg)",
+ "19-49 YRS IMMUNIZATIONS",
+ "50-64 YRS IMMUNIZATIONS",
+ ">=65 YRS IMMUNIZATIONS",
+ "ABORTIFACIENT",
+ "AC Chemotherapy",
+ "ACE INHIBITORS",
+ "ACE Inhibitor (ACEI)",
+ "ACE Inhibitors",
+ "ACEI or ARB or ARNI ",
+ "ACEI: (Publicly reported indicator)",
+ "ADULT IMMUNIZATIONS",
+ "ADULT IMMUNIZATIONS FOR UHA DEPARTMENTS",
+ "ADULT SERIES IMMUNIZATIONS",
+ "ADULT SERIES IMMUNIZATIONS ",
+ "ADULT SERIES IMMUNIZATIONS UHA",
+ "ALL pre-op antibiotics will be administered by Anesthesiologists",
+ "AMB IMM/INJ PED ORDERS ",
+ "AMB IMM/INJ PED QUICK VISIT ",
+ "AMB IMM/INJ PED WCC 15/18 MONTHS ",
+ "AMB IMM/INJ PED WCC 4/5/6 YEARS",
+ "AMB IMM/INJ PED WCC 4/5/6 YEARS ",
+ "AMB IMM/INJ PED WCC 4/5/6 YEARS UHA",
+ "AMB MED OPHTH LASER LASIK",
+ "AMB MED OPHTH LASER PRK",
+ "AMB MED OPHTH POST PROCEDURE",
+ "AMB MED OPHTH PRE PROCEDURE",
+ "AMB MED ORT SPORTS MEDICINE",
+ "AMB MED PEDS VITAMINS DROPS 2WEEKS/1MONTH MMC",
+ "AMB MED PEDS VITAMINS MMC",
+ "AMB MED PEDS Vitamins Drops",
+ "AMB MED REI VERBAL INTRA PROCEDURE MEDS",
+ "AMB MED SLEEP STUDY",
+ "AMB OPH ORDERS RET INJ",
+ "AMB OPH RX RET POSTOP",
+ "AMB PRO PED WCC 3 YEARS",
+ "AMB PRO PED WCC 3-11 YEARS",
+ "AMB PRO PED WCC 3/4/5/6 YEARS ",
+ "AMB PRO REI INTRA-PROCEDURE MEDS",
+ "AMB PRO REI PRE-PROCEDURE NURSING/MEDS",
+ "AMB SNHC ALLERGY CLINIC ASPIRIN",
+ "AMB SNHC ALLERGY CLINIC PREMEDS",
+ "AMB SNHC ALLERGY CLINIC PRN MEDS",
+ "ANALGESIC URINARY",
+ "ANGIOTENSIN 2 RECEPTOR BLOCKERS",
+ "ANTIACNE",
+ "ANTIBIOTIC CEPHALOSPORINS",
+ "ANTIBIOTIC MACROLIDES",
+ "ANTIBIOTIC MACROLIDES MMC",
+ "ANTIBIOTIC OTIC AGENTS",
+ "ANTIBIOTIC PENICILLINS",
+ "ANTIBIOTIC QUINOLONES",
+ "ANTIBIOTIC QUINOLONES ",
+ "ANTIBIOTIC, CEPHALOSPORIN",
+ "ANTIBIOTIC, CEPHALOSPORINS",
+ "ANTIBIOTIC, PENICILLIN",
+ "ANTIBIOTICS MISC",
+ "ANTIBIOTICS OCULAR",
+ "ANTICATAPLETIC",
+ "ANTIDEPRESSANTS (NON SSRI'S)",
+ "ANTIDEPRESSANTS (SSRI'S)",
+ "ANTIDIARRHEALS",
+ "ANTIDIZZINESS MEDS",
+ "ANTIEMETIC",
+ "ANTIFUNGALS",
+ "ANTIHISTAMINES",
+ "ANTIHISTAMINES ALLERGY",
+ "ANTIHISTAMINICS",
+ "ANTILIPEMIC",
+ "ANTIPRURITICS",
+ "ANTIRETROVIRAL",
+ "ANTITUSSIVES",
+ "ANTITUSSIVES ",
+ "ANTITUSSIVES MMC",
+ "ANXIOLYTIC",
+ "ANXIOLYTICS",
+ "ARB: (Publicly reported indicator if ACEI contraindicated)",
+ "ASPIRIN",
+ "ATG",
+ "AVASTIN",
+ "Abatacept Infusion",
+ "Abdominal",
+ "Abdominal Cramp Medications",
+ "Acetaminophen",
+ "Acetylcysteine",
+ "Acute Complicated UTI/Pyelonephritis",
+ "Acute MI",
+ "Acute Uncomplicated UTI",
+ "Additional Diabetic Supplies",
+ "Additional Medications",
+ "Additional Meds",
+ "Additional Post-Op Analgesics",
+ "Additional treatments for Refractory Pain/Chronic Pain",
+ "Aditional Analgesics",
+ "Adjucnt Analgesics",
+ "Adjunct Analgesic",
+ "Adjunct Analgesics",
+ "Adjunct Medications for Blood Pressure",
+ "Adjunct Procedural Medications",
+ "Adjunct Therapies",
+ "Adjunct Therapies - Initiate only after GI consult",
+ "Adjunctive Treatment:",
+ "Adrenergic Agents",
+ "Adult Antibiotics",
+ "Adult Influenza Vaccination",
+ "Adult Injectable Antibiotics",
+ "Adult Oral Antibiotics",
+ "Adult Tdap Vaccine",
+ "Adult Tdap or Td Vaccine",
+ "Afrin and Silver Nitrate",
+ "After Visit / Pre-Admission Orders",
+ "After Visit Orders",
+ "Afterload reduction in cases of severe renal insufficiency:",
+ "Agitation/delirium",
+ "Albumin Prime",
+ "Albumin Replacement (GREATER THAN 4 L removed with documented cirrhosis or any amount removed if creatinine is GREATER THAN 1.5 gm/dL) ",
+ "Alcohol Withdrawal Therapy",
+ "Alcohol Withdrawal Therapy (long-acting regimens)",
+ "Alcohol Withdrawal Therapy (long-acting) - recommend long acting benzodiazepines for initial control of withdrawal symptoms",
+ "Alcohol Withdrawal Therapy (short-acting regimens)",
+ "Alcohol withdrawal therapy (short-acting) --recommend shorter acting agents for the elderly, patients with severe or decompensated liver disease, or for maintenance for patients whose withdrawal syndrome is mostly controlled, PO prefered over IV. Using",
+ "Alcohol withdrawal therapy (short-acting) --recommend shorter acting agents for the elderly, patients with severe or decompensated liver disease, or for maintenance for patients whose withdrawal syndrome is mostly controlled, PO prefered over IV. Using the CIWA scale and symptom-triggered therapy reduces the duration of therapy and the total dose needed.",
+ "Aldosterone Antagonist",
+ "Alkali Therapy",
+ "All Patients on Steroids before surgery",
+ "All patients on Steroids before surgery",
+ "Allergic Reaction",
+ "Allo Routine Medications",
+ "Alpha 1 Blocker",
+ "Alpha 2 Receptor Agonists",
+ "Alpha-2 Agonist agents",
+ "Alteplase Protocol for Arterial and DVT Thrombolysis: High Dose (0.05 mg/mL)",
+ "Alteplase Protocol for Arterial and DVT Thrombolysis: High-Volume; Low-Dose (0.01 mg/mL)",
+ "Alteplase Protocol for Arterial and DVT Thrombolysis: High-Volume; Low-Dose (0.01mg/mL)",
+ "Alteplase Protocol for Arterial and DVT Thrombolysis: Low-Volume; Low-Dose (0.02 mg/mL)",
+ "Amb Pre-Operative Skin Preparation",
+ "Aminoglycoside Therapy",
+ "Amiodarone",
+ "Ampicillin",
+ "Anagesia/Sedation",
+ "Analgesia",
+ "Analgesia/Antipyretics",
+ "Analgesia/Sedation",
+ "Analgesia/Sedation/Paralysis",
+ "Analgesic",
+ "Analgesic Agents",
+ "Analgesic/Antipyretic",
+ "Analgesics",
+ "Analgesics ",
+ "Analgesics & Anti-Anxiety",
+ "Analgesics & Anti-emetics",
+ "Analgesics (Post-Intubation)",
+ "Analgesics and Rescue Agents",
+ "Analgesics/Antipyretic",
+ "Analgesics/Antipyretics",
+ "Analgesics/Sedatives",
+ "Ancillary Medications",
+ "Anemia Prevention",
+ "Anesthetic for Foley Catheter Insertion",
+ "Anesthetic for Venipuncture",
+ "Anesthetics for Venipuncture",
+ "Angiotensin Receptor Blockers",
+ "Angiotensin-Converting Enzyme Inhibitors",
+ "Angiotensin-Receptor Blockers",
+ "Anit-infectives",
+ "Antacid",
+ "Antacids",
+ "Antacids ",
+ "Antacids/PPI",
+ "Anti Inflammatory:",
+ "Anti Ulcer Agents: Histamine-2 Receptor Antagonists",
+ "Anti- depressants: Non-SSRI",
+ "Anti-Anxiety",
+ "Anti-Anxiety & Anti-Nausea",
+ "Anti-Anxiety & Nausea",
+ "Anti-Anxiety/Hypnotics",
+ "Anti-Anxiety: Benzodiazepines",
+ "Anti-Arrhythmic",
+ "Anti-Coagulants: Low-Molecular Weight Heparins ",
+ "Anti-Coagulation",
+ "Anti-Diarrhea",
+ "Anti-Emetic",
+ "Anti-Emetics",
+ "Anti-Emetics ",
+ "Anti-Emetics/GI",
+ "Anti-Epileptic Agents",
+ "Anti-Epileptics",
+ "Anti-Fungals",
+ "Anti-Hypertensives",
+ "Anti-Hypoglycemic Agents"
+]
+
+FREQ_NAMES = [
+ None,
+ "ONCE",
+ "DAILY",
+ "PRN",
+ "2 TIMES DAILY",
+ "EVERY 6 HOURS PRN",
+ "EVERY 4 HOURS PRN",
+ "CONTINUOUS",
+ "PACU ONLY MULTIPLE PRN",
+ "CONTINUOUS PARENTERAL NUTR",
+ "ONCE PRN",
+ "EVERY BEDTIME",
+ "3 TIMES DAILY",
+ "EVERY 8 HOURS",
+ "EVERY 6 HOURS",
+ "EVERY 12 HOURS",
+ "PACU ONLY ONCE PRN",
+ "ANESTHESIA CONTINUOUS",
+ "EVERY 24 HOURS",
+ "DAILY PRN",
+ "EVERY BEDTIME PRN",
+ "PACU ONLY CONTINUOUS",
+ "EVERY 8 HOURS PRN",
+ "PRE-OP ONCE",
+ "4 TIMES DAILY",
+ "ENDOSCOPY MULTIPLE PRN",
+ "2 TIMES DAILY PRN",
+ "5 TIMES DAILY PRN",
+ "EVERY MORNING",
+ "AS DIRECTED",
+ "4 TIMES DAILY PRN",
+ "EVERY 2 MIN PRN",
+ "EVERY MORNING BEFORE BREAKFAST",
+ "2 TIMES DAILY WITH MEALS",
+ "EVERY EVENING",
+ "ONCE TBD",
+ "ONCE PRN, MAY REPEAT X1",
+ "EVERY 2 HOURS PRN",
+ "3 TIMES DAILY PRN",
+ "EVERY MORNING WITH BREAKFAST",
+ "EVERY NIGHT",
+ "EVERY 3 HOURS PRN",
+ "RADIOLOGY ONCE",
+ "EVERY 7 DAYS",
+ "EVERY 15 MIN PRN",
+ "4 TIMES DAILY BEFORE MEALS & BEDTIME",
+ "ENDOSCOPY CONTINUOUS",
+ "EVERY 4 HOURS",
+ "EVERY HOUR PRN",
+ "3 TIMES DAILY WITH MEALS",
+ "EVERY 12 HOURS PRN",
+ "CATH ANGIO MULTIPLE PRN",
+ "PRE-OP MULTIPLE",
+ "PCA - Lockout 15 Minutes",
+ "EVERY 1 HOUR",
+ "EVERY 4-6 HOURS PRN",
+ "3 TIMES DAILY BEFORE MEALS",
+ "DIALYSIS ONCE",
+ "ENDOSCOPY ONCE",
+ "ONCE, MAY REPEAT X1",
+ "DAILY AT BEDTIME",
+ "ON CALL",
+ "EVERY OTHER DAY",
+ "2 TIMES DAILY BEFORE MEALS",
+ "EVERY M W F",
+ "ENDOSCOPY EVERY 2 MIN PRN",
+ "DIALYSIS CONTINUOUS",
+ "INTRA-OP ONCE",
+ "PCA - Lockout 10 Minutes",
+ "EVERY 5 MIN PRN",
+ "EVERY HOUR",
+ "PER PHARMACY PROTOCOL",
+ "EVERY 2 HOURS",
+ "EVERY 4 HOURS WHILE AWAKE",
+ "SEE INSTRUCTIONS",
+ "ED ONCE PRN, MAY REPEAT X1",
+ "5 TIMES DAILY",
+ "EVERY 72 HOURS",
+ "EVERY 3 DAYS",
+ "PRE-OP CONTINUOUS",
+ "2 TIMES WEEKLY",
+ "EVERY 48 HOURS",
+ "PRIOR TO DISCHARGE",
+ "DAILY WITH DINNER",
+ "PRE-OP MULTIPLE PRN",
+ "EVERY BEDTIME PRN, MR X 1",
+ "3 TIMES WEEKLY",
+ "ED EVERY 5 MIN PRN",
+ "EVERY 22 HOURS",
+ "PACU ONLY ONCE",
+ "Once (code)",
+ "4 TIMES DAILY WITH MEALS & BEDTIME",
+ "DAILY BEFORE DINNER",
+ "EVERY 3-4 HOURS PRN",
+ "ONCE A WEEK",
+ "6 TIMES DAILY",
+ "4 TIMES DAILY AFTER MEALS & BEDTIME",
+ "EVERY 3 MONTHS",
+ "DAILY AT NIGHT",
+ "EVENING",
+ "EVERY 3 HOURS",
+ "APHERESIS CONTINUOUS",
+ "EVERY 2 WEEKS",
+ "AM",
+ "EVERY MONTH",
+ "EVERY 30 MIN PRN",
+ "EVERY 5 MIN",
+ "MORNING",
+ "2 TIMES PER WEEK",
+ "3 TIMES DAILY AFTER MEALS",
+ "EVERY 30 DAYS",
+ "PCA - Lockout 20 Minutes",
+ "CONTINUOUS PARENTERAL NUTR (VC)",
+ "EVERY 14 DAYS",
+ "Continuous (code)",
+ "2 TIMES DAILY (FOR PAIN COCKTAILS)",
+ "EVERY 28 DAYS",
+ "EVERY 6-8 HOURS PRN",
+ "DAILY AM WITH FOOD",
+ "EVERY 30 MIN",
+ "ED EVERY 15 MIN PRN",
+ "ENDOSCOPY ONCE PRN, MAY REPEAT X1",
+ "EVERY 2 HOURS WHILE AWAKE",
+ "EVERY 24 HOURS PRN",
+ "E1PRN",
+ "2 TIMES DAILY AFTER MEALS",
+ "EVERY 6 HOURS WHILE AWAKE",
+ "EVERY 10 MIN PRN",
+ "EVERY MORNING AFTER BREAKFAST",
+ "EVERY SA SU BID",
+ "EVERY 12 WEEKS",
+ "EVERY 4 HOURS WHILE AWAKE RT",
+ "OR Continuous ",
+ "PROCEDURE ONLY MULTIPLE PRN",
+ "PM",
+ "3 TIMES DAILY WITH SNACKS",
+ "EVERY 3 DAYS PRN",
+ "EVERY 15 MIN",
+ "EVERY 20 MIN PRN",
+ "2 TIMES DAILY (0800,2200)",
+ "2 TIMES DAILY RT",
+ "EVERY M TH",
+ "EVERY TU TH SA",
+ "PCA - Lockout 12 Minutes",
+ "MEDROL DOSEPAK BID BREAKFAST AND BEDTIME",
+ "PCA - Lockout 30 Minutes",
+ "EVERY 4-6 HOURS",
+ "MEDROL DOSEPAK BID LUNCH AND DINNER",
+ "EVERY SUNDAY",
+ "EVERY FRIDAY",
+ "E1ONCE",
+ "DAILY WITH LUNCH",
+ "PACU ONLY MULTIPLE",
+ "EVERY MONDAY",
+ "RX CUSTOM FREQUENCY",
+ "2 TIMES DAILY FOR 7 DAYS",
+ "EVERY 10 MIN",
+ "PRE-OP ONCE PRN",
+ "TID After Meals",
+ "DIALYSIS MULTIPLE PRN",
+ "2 TIMES DAILY FOR 10 DAYS",
+ "QID (0900,1300,1700,2100)",
+ "EVERY TU TH SA SU",
+ "EVERY WEDNESDAY",
+ "E1CONTINUOUS",
+ "MEDROL DOSEPAK DAILY WITH BREAKFAST",
+ "BEFORE MEALS",
+ "EVERY SATURDAY",
+ "1/2 HOUR BEFORE MEALS AND BEDTIME",
+ "EVERY 8-12 HOURS PRN",
+ "FIVE TIMES A WEEK",
+ "EVERY 4 HOURS RT",
+ "APPLY AS DIRECTED",
+ "2 TIMES DAILY FOR 14 DAYS",
+ "EVERY THURSDAY",
+ "EVERY TUESDAY",
+ "DAILY RT",
+ "CYCLIC PARENTERAL NUTR (VC)",
+ "RADIOLOGY MULTIPLE",
+ "EVERY 3 WEEKS",
+ "ONCE AFTER DIALYSIS",
+ "DIALYSIS ONCE PRN",
+ "PROCEDURE ONLY ONCE PRN",
+ "EVERY SA SU",
+ "3 TIMES DAILY FOR 7 DAYS",
+ "EVERY 6 HOURS RT",
+ "4 TIMES DAILY FOR 7 DAYS",
+ "MEDROL DOSEPAK TID BRKFAST, LUNCH, BEDTIME",
+ "MEDROL DOSEPAK DAILY AT BEDTIME",
+ "BEFORE MEALS AND AT BEDTIME",
+ "2 TIMES DAILY ON MO, WED & FR",
+ "APHERESIS ONLY MULTIPLE PRN",
+ "3 TIMES DAILY FOR 10 DAYS",
+ "ED PRN",
+ "EVERY M F",
+ "EVERY 4 DAYS",
+ "EVERY 3 HOURS WHILE AWAKE",
+ "DAILY BEFORE LUNCH",
+ "EVERY M W F SU",
+ "EVERY 56 DAYS"
+]
+
+
+class TestSTARROrderMedConversion(DBTestCase):
+ TEST_DATA_SIZE = 2 * len(MED_ROUTES) # at least 2 rows per med route combined with inpatient vs outpatient
+
+ ORDER_MED_HEADER = ['order_med_id_coded', 'jc_uid', 'pat_enc_csn_id_coded', 'medication_id', 'med_description',
+ 'order_time_jittered', 'med_route', 'number_of_times', 'ordering_mode', 'freq_name',
+ 'order_time_jittered_utc']
+ MED_ORDERSET_HEADER = ['order_med_id_coded', 'protocol_id', 'protocol_name', 'ss_section_id', 'ss_section_name',
+ 'ss_sg_key', 'ss_sg_name']
+
+ test_data = []
+ orderset_data = []
+ clinical_items = {}
+ expected_data = []
+ expected_orderset_data = []
+
+ test_data_csv = tempfile.gettempdir() + '/test_starr_order_med_dummy_data.csv'
+ orderset_data_csv = tempfile.gettempdir() + '/test_starr_order_med_orderset_data.csv'
+
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self)
+
+ log.info("Sourcing from BigQuery DB")
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata()
+
+ self.converter = STARROrderMedConversion.STARROrderMedConversion() # Instance to test on
+ self.bqConn = self.converter.bqConn
+ self.starrUtil = STARRUtil.StarrCommonUtils(self.converter.bqClient)
+
+ # point the converter to dummy source table
+ STARROrderMedConversion.SOURCE_TABLE = TEST_SOURCE_TABLE
+ STARROrderMedConversion.ORDERSET_TABLE = TEST_ORDERSET_TABLE
+
+ log.warning("Removing test tables, if they exist: {} and {}".format(TEST_SOURCE_TABLE, TEST_ORDERSET_TABLE))
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_SOURCE_TABLE))
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_ORDERSET_TABLE))
+
+ def generate_test_and_expected_data(self, test_data_size, conv_options):
+ # preload mapped_meds table
+ rxcuiDataByMedId = self.converter.loadRXCUIData()
+
+ self.generate_ordermed_and_orderset_data(test_data_size, rxcuiDataByMedId)
+
+ # need to sort data to use the same clinical_item.descriptions as the duplicate clinical_items are not stored
+ self.test_data.sort(key=lambda tup: (tup[0], tup[1], tup[2], tup[3]))
+ self.orderset_data.sort(key=lambda row: row[0])
+
+ # join test order_med and med_orderset data to create a test row
+ joined_test_data = self.left_join_ordermed_and_orderset_data()
+
+ for joined_test_data_row in joined_test_data:
+ self.generate_expected_data_rows(joined_test_data_row[0], joined_test_data_row[1], rxcuiDataByMedId, conv_options)
+
+ # pi.external_id desc, ci.external_id desc, pi.encounter_id, ci.external_id desc
+ self.expected_data.sort(key=lambda tup: (-tup[0], tup[1], tup[2], -tup[4]))
+
+ # pi.external_id, ci.external_id (medication_id), cic.description, ci.name, ci.description, ic.external_id (protocol_id)
+ self.expected_orderset_data.sort(key=lambda tup: (tup[0], tup[1], tup[2], tup[3], tup[4], tup[5]))
+
+ def left_join_ordermed_and_orderset_data(self):
+ joined_test_data = []
+ for test_data_row in self.test_data:
+ if self.ignore_row(test_data_row[3], test_data_row[9]):
+ continue
+
+ found_join_row = False
+ for test_orderset_row in self.orderset_data:
+ if test_data_row[0] == test_orderset_row[0]:
+ found_join_row = True
+ joined_test_data.append((test_data_row, test_orderset_row))
+ if not found_join_row:
+ joined_test_data.append((test_data_row, None))
+ return joined_test_data
+
+ def generate_ordermed_and_orderset_data(self, test_data_size, rxcuiDataByMedId):
+ seen_test_data_rows = set()
+ while len(self.test_data) < test_data_size:
+ curr_row = len(self.test_data)
+ patient_id = 'JC' + format(curr_row, '06')
+
+ test_data_row = self.generate_test_data_row(curr_row, patient_id, rxcuiDataByMedId)
+
+ test_data_row_unique_key = (test_data_row[0], test_data_row[1], test_data_row[2], test_data_row[3])
+ if test_data_row_unique_key not in seen_test_data_rows:
+ seen_test_data_rows.add(test_data_row_unique_key)
+ self.test_data.append(test_data_row)
+
+ # should generate at most 1 row of med_orderset per order_med row (tested code does LEFT OUTER JOIN)
+ should_generate_orderset_row = random.randint(0, 1)
+ if should_generate_orderset_row:
+ orderset_row = self.generate_orderset_row(test_data_row[0])
+ self.orderset_data.append(orderset_row)
+
+ @staticmethod
+ def ignore_row(medication_id, freq_name):
+ # process only rows where med.medication_id <> 9000000 and freq_name not like '%PRN'
+ return medication_id == 9000000 or (freq_name is not None and freq_name.endswith('PRN'))
+
+ @staticmethod
+ def generate_test_data_row(curr_row, patient_id, rxcuiDataByMedId):
+ use_rxcui = random.randint(1, 5)
+ if use_rxcui % 5 == 0:
+ # use mapped_meds 20% of the time
+ medication_id = list(rxcuiDataByMedId.keys())[random.randint(0, len(rxcuiDataByMedId) - 1)]
+ else:
+ # several times less than the test records count to have some medication_ids occur multiple times
+ medication_id = random.randint(0, len(MED_ROUTES) // 5)
+
+ order_time_jittered = random.randint(1, int(time.time()))
+ return (
+ random.randint(0, len(MED_ROUTES) // 10), # order_med_id_coded - want some of them to repeat
+ patient_id,
+ curr_row, # pat_enc_csn_id_coded
+ medication_id,
+ MED_DESCRIPTIONS[random.randint(0, len(MED_DESCRIPTIONS) - 1)],
+ datetime.fromtimestamp(order_time_jittered),
+ MED_ROUTES[random.randint(0, len(MED_ROUTES) - 1)],
+ random.randint(1, 180), # number_of_times
+ ORDERING_MODES[random.randint(0, len(ORDERING_MODES) - 1)], # ordering_modes
+ FREQ_NAMES[random.randint(0, len(FREQ_NAMES) - 1)],
+ datetime.fromtimestamp(order_time_jittered, tz=pytz.UTC),
+ )
+
+ @staticmethod
+ def generate_orderset_row(order_med_id_coded):
+ protocol_id = random.randint(1, len(PROTOCOL_NAME))
+ ss_section_id = random.randint(0, len(SS_SECTION_NAME) - 1)
+ ss_sg_key = random.randint(0, len(SS_SG_NAME) - 1)
+
+ return (
+ order_med_id_coded, # to match the given order_med_row
+ -protocol_id,
+ PROTOCOL_NAME[protocol_id - 1],
+ ss_section_id,
+ SS_SECTION_NAME[ss_section_id],
+ str(ss_sg_key),
+ SS_SG_NAME[ss_sg_key]
+ )
+
+ def generate_expected_data_rows(self, row, orderset_row, rxcuiDataByMedId, conv_options):
+ row_model = RowItemModel()
+ row_model["medication_id"] = row[3]
+ row_model["med_description"] = row[4]
+ row_model["number_of_times"] = row[7]
+ row_model["med_route"] = row[6]
+
+ normalized_med_data = list(self.converter.normalizeMedData(rxcuiDataByMedId, row_model, conv_options))
+
+ cic_description = STARROrderMedConversion.CATEGORY_TEMPLATE.format(row_model["med_route"], row[8])
+
+ for normalized_model in normalized_med_data:
+ ci_key = (TEST_SOURCE_TABLE, cic_description, normalized_model["code"])
+
+ if ci_key not in self.clinical_items \
+ or len(normalized_model["med_description"]) < len(self.clinical_items[ci_key]) \
+ or self.clinical_items[ci_key].startswith(TEMPLATE_MEDICATION_PREFIX):
+ self.clinical_items[ci_key] = normalized_model["med_description"]
+
+ # replace previous ci_descriptions in expected_data
+ for i in range(len(self.expected_data)):
+ if self.expected_data[i][3] == cic_description and self.expected_data[i][5] == normalized_model["code"]:
+ self.expected_data[i] = self.expected_data[i][:6] + (self.clinical_items[ci_key], ) + self.expected_data[i][7:]
+
+ # replace previous ci_descriptions in expected_orderset_data
+ for i in range(len(self.expected_orderset_data)):
+ if self.expected_orderset_data[i][2] == cic_description and self.expected_orderset_data[i][3] == normalized_model["code"]:
+ self.expected_orderset_data[i] = self.expected_orderset_data[i][:4] + (self.clinical_items[ci_key],) + self.expected_orderset_data[i][5:]
+
+ ci_description = self.clinical_items[ci_key]
+
+ expected_row = (
+ row[0], # external_id
+ self.starrUtil.convertPatIdToSTRIDE(row[1]), # patient_id
+ row[2], # encounter_id
+ cic_description, # cic_description
+ normalized_model["medication_id"], # ci_external_id
+ normalized_model["code"], # ci_name
+ ci_description, # ci_description
+ row[5], # pi_item_date
+ row[10].replace(tzinfo=pytz.UTC) # pi.item_date_utc
+ )
+ if expected_row not in self.expected_data:
+ self.expected_data.append(expected_row)
+
+ if orderset_row is not None:
+ # generate expected data for orderset - in %item_collection% tables
+ expected_orderset_row = (
+ row[0],
+ normalized_model["medication_id"],
+ cic_description,
+ normalized_model["code"], # ci_name
+ ci_description,
+ orderset_row[1], # protocol_id
+ orderset_row[2], # protocol_name
+ orderset_row[4], # ss_section_name
+ orderset_row[6] # ss_sg_name
+ )
+ self.expected_orderset_data.append(expected_orderset_row)
+
+ @staticmethod
+ def prepare_conv_options(dose_count_limit, include_route_in_description, normalize_mixtures):
+ conv_options = STARROrderMedConversion.ConversionOptions()
+ conv_options.normalizeMixtures = normalize_mixtures
+ conv_options.doseCountLimit = dose_count_limit
+ conv_options.includeRouteInDescription = include_route_in_description
+ return conv_options
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ self.test_data[:] = []
+ self.orderset_data[:] = []
+ self.expected_data[:] = []
+ self.expected_orderset_data[:] = []
+ self.clinical_items.clear()
+
+ self.starrUtil.remove_file(self.test_data_csv)
+ self.starrUtil.remove_file(self.orderset_data_csv)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DELETE FROM {}.patient_item_collection_link WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.item_collection_item WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.item_collection WHERE true;'.format(TEST_DEST_DATASET))
+
+ bq_cursor.execute('DELETE FROM {}.patient_item WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.clinical_item WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.clinical_item_category WHERE true;'.format(TEST_DEST_DATASET))
+
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_SOURCE_TABLE))
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_ORDERSET_TABLE))
+
+ DBTestCase.tearDown(self)
+
+ @parameterized.expand([
+ ["with_denormalizeMixtures_noDoseCountLimit_includeRoute", False, None, True],
+ ])
+ def test_row_with_no_ingredient_is_processed(self, name, normalize_mixtures, dose_count_limit, include_route_in_description):
+ log.info("Test the output is not empty even if active_ingredient is None in mapped_meds with since ingredient")
+
+ # { medication_id -> { rxcui -> active_ingredient } }
+ rxcuiDataByMedId = {1: {2: None}}
+
+ row_model = RowItemModel()
+ row_model["medication_id"] = 1
+ row_model["med_description"] = "Med description"
+ row_model["number_of_times"] = 10
+ row_model["med_route"] = "Intravenous"
+
+ conv_options = self.prepare_conv_options(dose_count_limit, include_route_in_description, normalize_mixtures)
+ normalized_med_data = list(self.converter.normalizeMedData(rxcuiDataByMedId, row_model, conv_options))
+ self.assertTrue(normalized_med_data)
+
+ @parameterized.expand([
+ ["with_denormalizeMixtures_noDoseCountLimit_includeRoute", False, None, True],
+ ["with_denormalizeMixtures_noDoseCountLimit_excludeRoute", False, None, False],
+ ["with_denormalizeMixtures_DoseCountLimit_includeRoute", False, 100, True],
+ ["with_denormalizeMixtures_DoseCountLimit_excludeRoute", False, 100, False],
+ ["with_normalizeMixtures_noDoseCountLimit_includeRoute", True, None, True],
+ ["with_normalizeMixtures_noDoseCountLimit_excludeRoute", True, None, False],
+ ["with_normalizeMixtures_DoseCountLimit_includeRoute", True, 100, True],
+ ["with_normalizeMixtures_DoseCountLimit_excludeRoute", True, 100, False],
+ ])
+ def test_data_conversion(self, name, normalize_mixtures, dose_count_limit, include_route_in_description):
+ log.info("Generating test source data")
+
+ conv_options = self.prepare_conv_options(dose_count_limit, include_route_in_description, normalize_mixtures)
+
+ self.generate_test_and_expected_data(self.TEST_DATA_SIZE, conv_options)
+
+ # upload med_orderset
+ self.starrUtil.dump_test_data_to_csv(self.MED_ORDERSET_HEADER, self.orderset_data, self.orderset_data_csv)
+ self.starrUtil.upload_csv_to_bigquery('starr_datalake2018', 'med_orderset', TEST_DEST_DATASET,
+ 'starr_med_orderset', self.orderset_data_csv, self.MED_ORDERSET_HEADER)
+
+ # upload order_med
+ self.starrUtil.dump_test_data_to_csv(self.ORDER_MED_HEADER, self.test_data, self.test_data_csv)
+ self.starrUtil.upload_csv_to_bigquery('starr_datalake2018', 'order_med', TEST_DEST_DATASET,
+ 'starr_order_med', self.test_data_csv, self.ORDER_MED_HEADER)
+
+ log.debug("Run the conversion process...")
+ temp_dir = tempfile.gettempdir()
+ self.converter.convertAndUpload(conv_options, tempDir=temp_dir, target_dataset_id=TEST_DEST_DATASET, removeCsvs=True)
+
+ # Just query back for the same data, de-normalizing the data back to a general table
+ test_query = \
+ """
+ select
+ pi.external_id as pi_external_id,
+ pi.patient_id,
+ pi.encounter_id,
+ cic.description as cic_description,
+ ci.external_id as ci_external_id,
+ ci.name,
+ ci.description as ci_description,
+ pi.item_date,
+ pi.item_date_utc
+ from
+ {}.patient_item as pi,
+ {}.clinical_item as ci,
+ {}.clinical_item_category as cic
+ where
+ pi.clinical_item_id = ci.clinical_item_id and
+ ci.clinical_item_category_id = cic.clinical_item_category_id and
+ cic.source_table = '{}'
+ order by
+ pi.external_id desc, pi.patient_id, pi.encounter_id, ci.external_id desc
+ """.format(TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_SOURCE_TABLE)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute(test_query)
+ # remove timezone info in pi.item_date from coming from bigquery - we're storing datetime without timezone
+ actual_data = [tuple(row.values())[:7] + (list(row.values())[7].replace(tzinfo=None), list(row.values())[8],) for row in bq_cursor.fetchall()]
+
+ log.debug('actual data: {}'.format(actual_data))
+ log.debug('expected data: {}'.format(self.expected_data))
+ self.assertEqualTable(self.expected_data, actual_data)
+
+ # Query for orderset links
+ test_orderset_query = \
+ """
+ select
+ pi.external_id as pi_external_id,
+ ci.external_id as ci_external_id,
+ cic.description as cic_description,
+ ci.name as ci_name,
+ ci.description,
+ ic.external_id,
+ ic.name,
+ ic.section,
+ ic.subgroup
+ from
+ {}.patient_item as pi,
+ {}.clinical_item as ci,
+ {}.clinical_item_category as cic,
+ {}.patient_item_collection_link as picl,
+ {}.item_collection_item as ici,
+ {}.item_collection as ic
+ where
+ pi.clinical_item_id = ci.clinical_item_id and
+ ci.clinical_item_category_id = cic.clinical_item_category_id and
+ cic.source_table = '{}' and
+ pi.patient_item_id = picl.patient_item_id and
+ picl.item_collection_item_id = ici.item_collection_item_id and
+ ici.item_collection_id = ic.item_collection_id
+ order by
+ pi.external_id, ci.external_id, cic.description, ci.name, ci.description, ic.external_id
+ """.format(TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET,
+ TEST_DEST_DATASET, TEST_SOURCE_TABLE)
+
+ bq_cursor.execute(test_orderset_query)
+ actual_orderset_data = [list(row.values()) for row in bq_cursor.fetchall()]
+
+ log.debug('actual orderset data: {}'.format(actual_orderset_data))
+ log.debug('expected orderset data: {}'.format(self.expected_orderset_data))
+ self.assertEqualTable(self.expected_orderset_data, actual_orderset_data)
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(unittest.makeSuite(TestSTARROrderMedConversion))
+
+ return test_suite
+
+
+if __name__ == "__main__":
+ log.setLevel(logging.DEBUG) # without this no logs are printed
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/starr_conv/test/TestSTARROrderProcConversion.py b/medinfo/dataconversion/starr_conv/test/TestSTARROrderProcConversion.py
new file mode 100644
index 00000000..80c26156
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/test/TestSTARROrderProcConversion.py
@@ -0,0 +1,1651 @@
+#!/usr/bin/env python
+"""Test case for respective module in application package"""
+
+import sys, os
+import logging
+import pytz
+import random
+import tempfile
+import time
+
+from datetime import datetime, timedelta
+
+import unittest
+
+from parameterized import parameterized
+from medinfo.dataconversion.test.Const import RUNNER_VERBOSITY
+from medinfo.dataconversion.Const import TEMPLATE_MEDICATION_PREFIX
+from medinfo.dataconversion.Util import log
+
+from medinfo.db.test.Util import DBTestCase
+
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader
+
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery, RowItemModel
+
+from medinfo.dataconversion.starr_conv import STARROrderProcConversion
+from medinfo.dataconversion.starr_conv import STARRUtil
+
+TEST_SOURCE_TABLE = 'test_dataset.starr_order_proc'
+TEST_ORDERSET_TABLE = 'test_dataset.starr_proc_orderset'
+
+TEST_DEST_DATASET = 'test_dataset'
+
+
+ORDERING_MODES = [
+ 'Inpatient',
+ 'Outpatient'
+]
+
+ORDER_TYPES = [
+ None,
+ "Pharmacy Consult",
+ "Sleep Center",
+ "HB Chargeables",
+ "Code Status",
+ "Pathology",
+ "GI",
+ "Evercore",
+ "Nursing Referral",
+ "Respiratory Care",
+ "Cardiac Angio",
+ "Pharmacy Supplies",
+ "Bedside Procedure",
+ "Therapeutic Recreation Orderables",
+ "PR Charge",
+ "Procedures",
+ "PT",
+ "OT",
+ "Cast Room",
+ "Bronchoscopy",
+ "Manual Entry Imaging",
+ "Manual Entry Cardiac Angio",
+ "Lab",
+ "Blood Bank",
+ "PFT",
+ "Vascular Ultrasound",
+ "IVF Labs",
+ "SLP",
+ "Diet Communication",
+ "Manual Entry Procedures",
+ "Imaging Non-Reportable",
+ "Nursing",
+ "Diet",
+ "Precaution",
+ "Immunization/Injection",
+ "Zeiss",
+ "General Supply",
+ "Legal",
+ "Manual Entry Bronchoscopy",
+ "Lab Panel",
+ "Charge",
+ "Imaging",
+ "Cath Angio",
+ "Device Check",
+ "Notify Physician",
+ "ENT",
+ "Manual Entry Lab",
+ "Manual Entry ECHO",
+ "Radiation Oncology",
+ "Point of Care Testing",
+ "ECHO",
+ "Lab Only",
+ "Microbiology",
+ "Generic Surgical History",
+ "Admission",
+ "Reference Labs",
+ "NSG PICC Refer",
+ "Transfer",
+ "NOURISHMENTS",
+ "OB Ultrasound",
+ "Restraints",
+ "Ophthalmology",
+ "Nursing Transfusion",
+ "HIV Lab Non-Restricted",
+ "Isolation",
+ "Other Order Scanned Report",
+ "Manual Entry HIV Lab Restricted",
+ "Microbiology Culture",
+ "ECG",
+ "Consult",
+ "Outpatient Referral",
+ "Neurology",
+ "MyHealth Questionnaire Assignment",
+ "Transport",
+ "Transfusion Communication",
+ "Electrophysiology",
+ "Vaultstream",
+ "filter exclude all",
+ "Consult to Cardiology ",
+ "REHAB",
+ "BB Call Slip",
+ "HIV Lab Restricted",
+ "Discharge",
+ "Surgical Procedures",
+ "Language Services"
+]
+
+PROC_CODES = [
+ "NUR1025",
+ "LABPOCGLU",
+ "LABCBCD",
+ "POC14",
+ "LABMETC",
+ "NUR1018",
+ "LABMETB",
+ "99146543",
+ "NUR1019",
+ "LABMGN",
+ "NUR1044",
+ "LABCBCO",
+ "LABPT",
+ "LAB234",
+ "99146537",
+ "NUR1106",
+ "EKG5",
+ "RT109",
+ "LABSPR",
+ "LABPTT",
+ "NUR1940",
+ "99146539",
+ "LABTSH",
+ "LABPHOS",
+ "NUR194000",
+ "NUR762",
+ "NUR1068",
+ "NUR1613",
+ "LABPCG3",
+ "LABUA",
+ "ADT12",
+ "NUR1043",
+ "146543",
+ "LABA1C",
+ "NUR1022",
+ "NUR764",
+ "IMGDXCH1",
+ "LABTYPSNI",
+ "NUR1013",
+ "DIET990",
+ "NUR301",
+ "LABBBPRBC",
+ "NUR1094",
+ "LABCAI",
+ "LABURNC",
+ "NUR810",
+ "LABABG",
+ "LABSURG",
+ "NUR350",
+ "LABLPD",
+ "LABHFP",
+ "LABUAPRN",
+ "DIET102",
+ "LABK",
+ "NUR30024",
+ "99146535",
+ "IMGDXCH2",
+ "NUR30022",
+ "COD2",
+ "LABLPDC",
+ "LABFT4",
+ "LABFK506L",
+ "LABLDH",
+ "LABTNI",
+ "99146541",
+ "RT108",
+ "NUR1664",
+ "NUR4030",
+ "146535",
+ "LABVD25H",
+ "LABARI",
+ "LABESRP",
+ "LABBLC",
+ "NUR1231",
+ "LAB230",
+ "LABCRP",
+ "LABDATACONV",
+ "LABCR",
+ "ECH15",
+ "NURSE 1500",
+ "2500147414",
+ "PT4",
+ "NUR1016",
+ "TRN2",
+ "LABASI",
+ "PHX0003",
+ "LABTBP",
+ "LABVBG",
+ "NUR4067",
+ "99214",
+ "LABURIC",
+ "146541",
+ "LABOSR",
+ "LABHCTX",
+ "LABBLC2",
+ "NUR1588",
+ "NUR1024",
+ "99245",
+ "LABALT",
+ "LABMB",
+ "ADT100",
+ "NUR1012",
+ "LABNA",
+ "LABFER",
+ "99215",
+ "OT1",
+ "DC3",
+ "NUR324",
+ "LABLIPS",
+ "LABCBCS",
+ "DC8",
+ "LABTSLIP",
+ "NUR1373",
+ "99205",
+ "LABLACWB",
+ "DC1",
+ "LABAST",
+ "NUR372",
+ "LABPSA",
+ "DC5",
+ "NUR775",
+ "ADT1",
+ "LABB12",
+ "LABCK",
+ "ADT7",
+ "IMGDXCH1P",
+ "PT6",
+ "LABLAC",
+ "IMGXR0023",
+ "LABVANPRL",
+ "LABROMRS",
+ "LABNTBNP",
+ "416543",
+ "PATH10",
+ "RT101",
+ "146537",
+ "880100004",
+ "LABPCTNI",
+ "LABTBP1",
+ "IMGXR0031",
+ "OT2",
+ "LABHBSAG",
+ "416542",
+ "LABHEPAR",
+ "RT104",
+ "LABTRFS",
+ "LABTRIG",
+ "NUR1448",
+ "LABHCVA",
+ "NUR30020",
+ "LABPLTS",
+ "DIET101",
+ "LABPCCR",
+ "NUR2241",
+ "LABGYN",
+ "NUR1060",
+ "LABCA",
+ "NUR3511",
+ "NUR700",
+ "REF94",
+ "LABBBPPLT",
+ "IMGCTH",
+ "NUR323",
+ "NUR4005",
+ "NUR1066",
+ "POC24",
+ "LABBBPFFP",
+ "LABTSHFT4",
+ "NUR4044",
+ "LABTBIL",
+ "NUR811",
+ "LABPCCG4V",
+ "NUR1991",
+ "LABBUN",
+ "LABGGT",
+ "LABALB",
+ "LAB219",
+ "IMGDXAB1",
+ "LABUALB",
+ "LABGLF",
+ "NUR4077",
+ "NUR1293",
+ "LABBMT1",
+ "445875",
+ "GICOLO",
+ "RT72",
+ "DC2",
+ "LABCHOL",
+ "LABPCEG7",
+ "NUR716",
+ "RES5",
+ "LABCDTPCR",
+ "RT100",
+ "IMGBI0008",
+ "RT82",
+ "LABCMVQT",
+ "DIET122",
+ "DIET131",
+ "LABLCLPD",
+ "POC17"
+]
+
+DESCRIPTIONS = [
+ "VITAL SIGNS",
+ "GLUCOSE BY METER",
+ "POC GLUCOSE BY METER",
+ "METABOLIC PANEL, COMPREHENSIVE",
+ "CBC WITH DIFFERENTIAL",
+ "MONITOR INTAKE AND OUTPUT",
+ "METABOLIC PANEL, BASIC",
+ "CBC WITH DIFF",
+ "HX OTH ORD SCAN REPORT",
+ "INCENTIVE SPIROMETER (WHILE AWAKE)",
+ "MAGNESIUM, SERUM/PLASMA",
+ "NURSING PULSE OXIMETRY (SPOT CHECK)",
+ "PROTHROMBIN TIME",
+ "HX LAB PROC SCAN REPORT",
+ "ASSESSMENT FREQUENCY (PSYCH UNIT)",
+ "NURSING COMMUNICATION",
+ "ECG 12-LEAD",
+ "RESP - NEBULIZER",
+ "SPECIMEN REMARK",
+ "PTT PARTIAL THROMBOPLASTIN TIME",
+ "CBC",
+ "HX IMAGING PROC SCAN REPORT",
+ "TSH",
+ "PHOSPHORUS, SERUM/PLASMA",
+ "NEUROLOGICAL CHECKS",
+ "WEIGHT",
+ "ISTAT G3+, ARTERIAL",
+ "CBC W/O DIFF",
+ "URINALYSIS WITH MICROSCOPIC",
+ "DISCHARGE PATIENT",
+ "NURSING PULSE OXIMETRY",
+ "PERIPHERAL IV INSERTION CARE",
+ "NURSING COMMUNICATION(FOR ORDERSET ONLY)",
+ "OTHER ORDER SCANNED REPORT",
+ "HEMOGLOBIN A1C",
+ "RESPIRATORY RATE",
+ "XR CHEST 1V",
+ "TYPE AND SCREEN",
+ "OOB/UP IN CHAIR WITH ASSIST",
+ "DIET REGULAR",
+ "NEUROVASCULAR ASSESSMENT",
+ "SEQUENTIAL COMPRESSION DEVICE (SCD)",
+ "RED BLOOD CELLS",
+ "AMBULATE WITH ASSISTANCE",
+ "URINE CULTURE",
+ "SURGICAL PROCEDURE",
+ "NOTIFY MD:",
+ "HEPATIC FUNCTION PANEL A",
+ "DIET NPO",
+ "POTASSIUM, SERUM/PLASMA",
+ "DISCHARGE PATIENT WHEN CRITERIA MET",
+ "HX ECG PROC SCAN REPORT",
+ "XR CHEST 2V",
+ "FULL CODE",
+ "ADMIT TO PHASE",
+ "LIPID PANEL WITH CALCULATED LDL",
+ "I&O DRAINS OUPUT",
+ "T4, FREE",
+ "CALCIUM IONIZED, SERUM/PLASMA",
+ "TACROLIMUS (FK506)",
+ "LIPID PANEL WITH DIRECT LDL",
+ "LDH TOTAL, SERUM / PLASMA",
+ "TROPONIN I",
+ "HX OTH PROC SCAN REPORT",
+ "RESP - MDI",
+ "SALINE LOCK AND FLUSH",
+ "OXYGEN: NASAL CANNULA(NURSING ONLY)",
+ "ECG PROCEDURE SCANNED REPORT",
+ "CARDIAC MONITOR",
+ "VITAMIN D, 25-HYDROXYVITAMIN",
+ "ABO/RH (ARI)",
+ "SEDIMENTATION RATE (ESR)",
+ "MANUAL DIFFERENTIAL/SLIDE REVIEW",
+ "BLOOD GASES, ARTERIAL",
+ "C - REACTIVE PROTEIN",
+ "HISTORICAL RESULT",
+ "CREATININE, SERUM/PLASMA",
+ "NOTIFY MD:VITAL SIGNS",
+ "UHA LAB - SCANNED",
+ "PT EVALUATE AND TREAT",
+ "MEASURE URINARY OUTPUT",
+ "ADMIT TO INPATIENT",
+ "ECHO - TRANSTHORACIC ECHO +DOPPLER",
+ "PATIENT TRANSPORT",
+ "AB SCREEN (ASI)",
+ "URINALYSIS SCREEN, CULTURE IF POSITIVE",
+ "TRANSCHART CONVERTED LAB DATA",
+ "TRANSFUSION BLOOD PRODUCT 1",
+ "BLOOD GASES, VENOUS",
+ "OXYGEN ADMINISTRATION",
+ "EVAL/MGMT OF EST PATIENT LEVEL 4",
+ "URIC ACID, SERUM / PLASMA",
+ "OTHER PROCEDURE SCANNED REPORT",
+ "OUTSIDE SLIDE REVIEW",
+ "HEMATOCRIT",
+ "BLOOD CULTURE (2 AEROBIC BOTTLES)",
+ "OOB",
+ "VITAL SIGNS PER PROTOCOL",
+ "OFFICE CONSLTJ 80 MIN",
+ "ALT, SERUM/PLASMA",
+ "CK, MB (MASS)",
+ "OOB/UP IN CHAIR",
+ "SODIUM, SERUM / PLASMA",
+ "FERRITIN",
+ "EVAL/MGMT OF EST PATIENT LEVEL 5",
+ "OT EVALUATE AND TREAT",
+ "PHYSICAL ACTIVITY",
+ "PAIN ASSESSMENT",
+ "LIPASE",
+ "FOLLOW UP INSTRUCTIONS",
+ "EVAL/MGMT OF NEW PATIENT LEVEL 5",
+ "LACTATE, WHOLE BLOOD",
+ "DISCHARGE DIET",
+ "BLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLES)",
+ "AST, SERUM/PLASMA",
+ "PSA",
+ "REASON TO CALL YOUR PHYSICIAN",
+ "WOUND CARE",
+ "ARTERIAL BLOOD GAS",
+ "VITAMIN B12",
+ "CREATINE KINASE, TOTAL",
+ "TRANSFUSION SERVICE CALL SLIP",
+ "XR CHEST 1V PORTABLE",
+ "PT ONGOING TREATMENT",
+ "LACTIC ACID",
+ "XR CHEST 1 VIEW",
+ "FOLEY RETENTION CATHETER",
+ "CBC WITH DIFF AND SLIDE REVIEW",
+ "VANCOMYCIN TROUGH LEVEL",
+ "NT - PROBNP",
+ "UHA FLU SHOT PROTOCOL AUTHORIZATION",
+ "BLOOD TYPE VERIFICATION",
+ "RESP - FLUTTER/PEP THERAPY",
+ "LAB PROCEDURE SCANNED REPORT",
+ "URINALYSIS, SCREEN FOR CULTURE",
+ "SIMPLE AIRWAY",
+ "ISTAT TROPONIN I",
+ "TRANSFUSION BLOOD PRODUCT 2",
+ "MRSA SCREEN",
+ "LIPID PANEL",
+ "XR CHEST 2 VIEWS",
+ "OT ONGOING TREATMENT",
+ "UHA FLU SHOT PROTOCOL AUTHORIZATION 2017-2018",
+ "RESP - VENTILATOR SETTINGS",
+ "TRANSFERRIN SATURATION",
+ "TRIGLYCERIDES, SERUM / PLASMA",
+ "JACKSON PRATT DRAIN",
+ "RASS SEDATION ASSESSMENT",
+ "PLATELET COUNT",
+ "DIET CLEAR LIQUID",
+ "CDU VITAL SIGNS",
+ "ISTAT CREATININE",
+ "UP AD LIB",
+ "PAP SMEAR",
+ "EARLY AMBULATION",
+ "CALCIUM, SERUM/PLASMA",
+ "RISK FOR VENOUS THROMBOEMBOLISM - VTE RISK ASSESSMENT",
+ "TRANSFUSE RED BLOOD CELLS",
+ "TRANSFER PATIENT",
+ "REFERRAL TO PHYSICAL THERAPY",
+ "PLATELET APHERESIS PRODUCT",
+ "CT HEAD",
+ "TEMPERATURE THERAPY",
+ "DRAIN CARE",
+ "TURN, COUGH, DEEP BREATHE",
+ "POC ISTAT TROPONIN I",
+ "FRESH FROZEN PLASMA PRODUCT",
+ "TSH W/ REFLEX FT4",
+ "WEAN O2 THERAPY",
+ "BILIRUBIN TOTAL, SERUM/PLASMA",
+ "HBSAG",
+ "IRRIGATE TUBE/DRAIN",
+ "ISTAT CG4,VENOUS",
+ "UREA NITROGEN, SERUM/PLASMA",
+ "GAMMA - GLUTAMYL TRANSFERASE",
+ "ALBUMIN, SERUM/PLASMA",
+ "XR ABDOMEN 1V",
+ "HEPATITIS C AB IGG",
+ "ALBUMIN WITH CREATININE, URINE (RANDOM)",
+ "GLUCOSE FASTING",
+ "TREATMENT PARAMETERS 1",
+ "D/C BY ESCORT IF D/C CRITERIA IS MET",
+ "ADMIT/PLACE PATIENT",
+ "BMT PANEL 1",
+ "POPULATION HEALTH PROTOCOL AUTHORIZATION",
+ "RESP - CHEST PHYSIOTHERAPY",
+ "DISCHARGE WOUND CARE",
+ "CHOLESTEROL TOTAL, SERUM/PLASMA",
+ "ISTAT EG7, ARTERIAL",
+ "POC URINE DIPSTICK",
+ "BLOOD CULTURE (AEROBIC & ANAEROBIC BOTTLE)",
+ "DC IV",
+ "RAINBOW DRAW (FOR ED/RRT/CODE BLUE ONLY)",
+ "RESP - INTRAPULMONARY PERCUSSIVE VENTILATION",
+ "MAMMO BREAST SCREENING",
+ "RESP - UNLISTED RESPIRATORY CARE ORDER",
+ "CALCIUM IONIZED, WHOLE BLOOD",
+ "CHECK TUBE FEEDING",
+ "DIET NUTRITIONAL SUPPLEMENTS",
+ "DIET NPO AFTER MIDNIGHT"
+]
+
+PROTOCOL_NAMES = [
+ "IP GENERAL DISCHARGE ORDER SET",
+ "IP MED GENERAL ADMIT",
+ "ANE PACU ",
+ "PRE-ADMISSION/PRE-OP ORDERS",
+ "IP GI ENDOSCOPY PRE/POSTOP PROCEDURE",
+ "RETIRED ANE PACU (OUTPATIENT)",
+ "IP/ED GENERAL TRANSFUSION",
+ "IP ICU/CCU GENERAL ADMIT",
+ "RETIRED P CTS ICU CARDIAC SURGERY POSTOP",
+ "IP ORT TOTAL JOINT REPLACEMENT",
+ "IP GEN HEPARIN INFUSION PROTOCOLS",
+ "IP SUR GENERAL ADMIT",
+ "IP INTERAGENCY DISCHARGE ORDERS",
+ "IP PAI PATIENT CONTROLLED ANALGESIA (PCA)",
+ "IP SUBCUTANEOUS INSULIN ORDER SET",
+ "IP CAR CARDIOLOGY POST PROCEDURE - INPATIENT",
+ "IP RAD INTERVENTIONAL RADIOLOGY POSTOP (SAME DAY DISCHARGE)",
+ "IP NSR ICU NEUROSURGERY POSTOPERATIVE",
+ "IP GEN INTERAGENCY DISCHARGE ORDERS",
+ "IP CAR CARDIOLOGY PRE PROCEDURE",
+ "IP ORT TRAUMA",
+ "IP NSR NEUROSURGERY ADMISSION/POST-OP",
+ "IP RAD INTERVENTIONAL RADIOLOGY PRE-PROCEDURE",
+ "RETIRED IP CTS CARDIAC SURGERY TRANSFER",
+ "IP INSULIN CONTINUOUS IV INFUSION",
+ "INTRA-OPERATIVE BLOOD PRODUCT AND TRANSFUSION ORDERS",
+ "IP PAI EPIDURAL ANALGESIA POSTOP",
+ "IP PSY PSYCHIATRY ADMIT",
+ "IP ICU SUR/TRAUMA ADMIT",
+ "SHC AMB ONC BMT",
+ "ED GENERAL COMPLAINT",
+ "NURSING TRIAGE SEPSIS NURSING PROTOCOL",
+ "AMB ALG IMMUNOTHERAPY MMC",
+ "IP VAST RN POST PLACEMENT (VAST RN ONLY)",
+ "IP NEU GENERAL WARD ADMIT",
+ "IP CAR GENERAL ADMIT",
+ "AMB PED IMMUNIZATIONS MMC",
+ "ED CHEST PAIN",
+ "RETIRED IP PAMF ORTHO THA",
+ "IP CTS LUNG RESECTION POSTOP",
+ "CDU CHEST PAIN OBSERVATION",
+ "IP SUR COLON/RECTAL/SMALL BOWEL RESECTION POSTOP",
+ "IP RAD NEURORADIOLOGY PRE-PROCEDURE",
+ "ED ABDOMINAL PAIN ",
+ "IP ANE ANESTHESIA PREOP",
+ "IP CTS CARDIAC SURGERY ADMISSION",
+ "IP CAR ICD/PACEMAKER IMPLANT (POST-PROCEDURE)",
+ "CDU GENERAL PROTOCOL OBSERVATION",
+ "SVC ANE PACU",
+ "IP ENT HEAD AND NECK POSTOP",
+ "AMB SLEEP OFFICE VISIT",
+ "(RETIRED) IP PICC LINE PLACEMENT / EXCHANGE",
+ "IP CAR EPS/ABLATION (PRE-PROCEDURE)",
+ "CC HEME BONE MARROW BIOPSY AND ASPIRATE",
+ "OPH CATARACT PERIOPERATIVE ORDERS RIGHT EYE",
+ "OPH CATARACT PERIOPERATIVE ORDERS LEFT EYE",
+ "IP SUR GENERAL POSTOP",
+ "IP PULM RH CATH POST",
+ "AMB HM UHA SUPER SMARTSET",
+ "ED TRAUMA 97",
+ "NURSING TRIAGE CARDIAC COMPLAINTS PROTOCOL",
+ "CC RAD ONC PRE-SIMULATION",
+ "CC BMT BONE MARROW BIOPSY AND ASPIRATE",
+ "IP REN HEMODIALYSIS",
+ "IP PULM RH CATH PREOP",
+ "IP CAR ICD/PACEMAKER IMPLANT(PRE-PROCEDURE)",
+ "AMB LIV PRE-TRANSPLANT STANFORD DEFAULTED WISH LIST ORDERS",
+ "IP RAD NEURORADIOLOGY POST-PROCEDURE",
+ "IP PAI PERIPHERAL NERVE CATHETER/REGIONAL ANALGESIA ADMIT",
+ "ED FLOOR HOLDING ORDERS",
+ "SVC IP GEN GENERAL ADMIT",
+ "IP CAR EPS/ABLATION (POST-PROCEDURE)",
+ "AMB HM SHC SUPER SMARTSET",
+ "IP GYN GENERAL ADMISSION",
+ "IP MED CYSTIC FIBROSIS ADMIT",
+ "IP CTS ICU CARDIAC SURGERY POSTOP",
+ "IP SUR BARIATRIC SURGERY POSTOP",
+ "IP SUR DAY OF SURGERY ORDERS",
+ "ED ADMIT",
+ "IP GU RADICAL CYSTECTOMY POSTOP",
+ "IP CAPR CARDIOVERSION",
+ "UHA IMM ADULT",
+ "NURSING TRIAGE ABDOMINAL PAIN PROTOCOL",
+ "RETIRED IP ORT SPINAL FUSION POSTOP",
+ "IP SUBCUTANEOUS INSULIN ADJUSTMENT ORDER SET",
+ "IP GEN BRONCHOSCOPY PRE/INTRA/POST",
+ "AMB SLEEP ATTENDINGS SLEEP STUDY",
+ "IP GEN COMFORT CARE - NON ICU UNITS",
+ "ED TIA PATHWAY",
+ "CC APHERESIS HPC-A COLLECTION",
+ "PRE-ADMISSION/PRE-OP ORDERS CV SURGERY",
+ "PEDIATRIC IMMUNIZATIONS FOR UHA",
+ "SVC IP GEN DISCHARGE",
+ "NURSING TRIAGE STROKE PROTOCOL",
+ "RETIRED IP NSR NEUROSURGERY TRANSFER ORDERS",
+ "IP ENT MAXILLOFACIAL SURGERY POSTOP",
+ "RETIRED IP NSR NEURO SPINE",
+ "SVC IP GI ENDOSCOPY PRE/POST PROCEDURE",
+ "IP PSY ASC ECT",
+ "IP PLS GENERAL POSTOP",
+ "SVC SUR PRE-ADMISSION/PRE-OP",
+ "IP RAD INTERVENTIONAL RADIOLOGY POSTOP (WITH ADMISSION)",
+ "AMB ORT HAND_WRIST",
+ "IP ORT SHOULDER ELBOW ADMISSION POSTOP",
+ "IP VAS GENERAL ADMIT",
+ "IP TRS LIVER TRANSPLANT POSTOP",
+ "INPT/AMB BMT DONOR/AUTOLOGOUS PT VIROLOGY",
+ "IP INSULIN TRANSITION OFF IV INFUSION",
+ "ED SHORTNESS OF BREATH",
+ "SHC AMB ONC LYMPHOMA ONCOLOGY",
+ "OPH OCULOPLASTICS PERIOPERATIVE ORDERS",
+ "IP PLS BREAST RECONSTRUCT UNILAT/BILATERAL FREE TRAM FLAP",
+ "IP GU RADICAL PROSTATECTOMY POSTOP",
+ "IP LAB SPECIMEN TESTING, CSF",
+ "IP TRS KIDNEY/PANCREASE TRANSPLANT RECIPIENT PREOP",
+ "AMB HEART TRANSPLANT ANNUAL STANFORD RN ORDERS",
+ "AMB POSITIVE CARE HIV/AIDS DIAGNOSIS",
+ "AMB NEU MULTIPLE SCLEROSIS",
+ "IP NEU STROKE ADMISSION",
+ "IP VAD ICU POST OP",
+ "IP LAB SPECIMEN TESTING, BLOOD CULTURE - INFECTIOUS AGENT DETECTION",
+ "IP TRS KIDNEY AND/-OR PANCREAS RECIPIENT POSTOP",
+ "IP VAS GENERAL POSTOP",
+ "RETIRED IP ENT GENERAL POSTOP",
+ "IP LABS CULTURES",
+ "IP REH PHASE I EPILEPSY ADMIT",
+ "IP NEU ICU STROKE ISCHEMIC/INTRACEREBRAL HEMORRHAGE ADMIT",
+ "IP GEN TUBE FEEDING",
+ "IP BMT ALLOGENEIC READMISSION",
+ "AMB REI P - FEMALE ORDER SET",
+ "ED PSYCH/DRUG PROBLEM",
+ "ED TRAUMA RADIOLOGY",
+ "IP TRS HEART TRANSPLANT POSTOP",
+ "IP TRANSESOPHAGEAL ECHO (TEE) ORDER SET",
+ "RETIRED IP GEN PACU ORDERS",
+ "CC APHERESIS THERAPEUTIC PLASMA EXCHANGE",
+ "AMB AWCC WOUND CARE",
+ " AMB URO URODYNAMICS",
+ "CDU TIA",
+ "IP GYN MINIMALLY INVASIVE SURGERY POSTOP",
+ "IP CTS TAVR CV POSTOP",
+ "IP GU GENERAL ADMIT",
+ "SVC IP ANE ANESTHESIA PREOP",
+ "NURSING TRIAGE PAIN MANAGEMENT PROTOCOL",
+ "AMB LUNG/HEART-LUNG PRE-EVALUATION STUDIES",
+ "IP ENT GENERAL ADMISSION",
+ "IP CTS CARDIAC SURGERY TRANSFER",
+ "AMB HEART TRANSPLANT ROUTINE STANFORD RN ORDERS",
+ "CC APHERESIS EXTRACORPOREAL PHOTOPHERESIS (ECP)",
+ "RETIRED IP PAI SINGLE SHOT INTRATHECAL NARCOTICS POSTOP",
+ "IP CAR CONGESTIVE HEART FAILURE",
+ "RETIRED IP PAMF ORTHO SPINE",
+ "CDU ABDOMINAL PAIN OBSERVATION",
+ "IP TRS LUNG, HEART-LUNG TRANSPLANT POSTOP",
+ "IP GYN EXLAP/TAH/BSO GENERAL",
+ "IP LAB SPECIMEN TESTING, RESPIRATORY SECRETIONS",
+ "AMB REI P - PHYSICIAN ORDER FOR RETRIEVAL / TRANSFER PROCEDURE",
+ "OP TRANSFUSION ORDERS RECURRING",
+ "OPH RETINA PERIOPERATIVE ORDERS LEFT EYE",
+ "RETIRED OP TRANSFUSION ORDERS ONE TIME",
+ "IP GU TURP/TURBT POSTOP",
+ "SVC IP NB NEWBORN NURSERY ADMISSION",
+ "OPH RETINA PERIOPERATIVE ORDERS RIGHT EYE",
+ "RETIRED IP LAB TRANSFUSION SERVICE, SPECIAL NEEDS",
+ "IP NSR CERVICAL AND LUMBAR FUSIONS",
+ "ED TRAUMA 99",
+ "IP SUR BREAST PROCEDURES POSTOP",
+ "AMB IGM ACUPUNCTURE WITHOUT E & M CODES",
+ "AMB REI P - IVF LAB ORDERS",
+ "AMB ORT SPINE PMR",
+ "AMB IMM ADULT",
+ "IP GEN TPN/PPN ADULT PROTOCOL",
+ "IP ICU END OF LIFE CARE",
+ "PED ADOLESCENT WELL FEMALE UHA",
+ "IP REN CONTINUOUS RENAL REPLACEMENT THERAPY(CRRT)",
+ "AMB FLU CLINIC",
+ "CDU SYNCOPE OBSERVATION",
+ "IP POST PROCEDURE ORDERS PARACENTESIS",
+ "RETIRED IP OPH RETINA POSTOP ",
+ "SVC IP OB INTRAPARTUM ADMISSION",
+ "SHC AMB INFLUENZA VACCINE MASTER",
+ "IP GEN INSULIN INFUSION ICU",
+ "SVC IP ANE OB LABOR EPIDURAL",
+ "RETIRED IP NSR NEURO SPINE TRANSFER",
+ "IP/ED INSULIN - DIABETIC KETOACIDOSIS (DKA)/ HYPEROSMOLAR HYPERGLYCEMIC STATE (HHS)",
+ "AMB PED ADOLESCENT WELL MALE UHA",
+ "ED FEVER/NEUTROPENIA",
+ "RETIRED IP GYN LAPAROSCOPY POSTOP",
+ "IP INSULIN PUMP (CONTINUOUS SUBCUTANEOUS INSULIN INFUSION (CSII))",
+ "ANE ECT PACU ORDERS",
+ "IP BMT AUTOLOGOUS READMISSION ORDERS",
+ "RETIRED IP ENT - HEAD AND NECK ADMISSION-PREOP",
+ "IP RXWARFARIN PROTOCOL (PHARMACY USE ONLY)",
+ "IP TRS HEART TRANSPLANT PREOP",
+ "IP ORT TUMOR POSTOP",
+ "IP CAR CARDIOLOGY POST PROCEDURE - OUTPATIENT",
+ "NURSING TRIAGE SUICIDAL/HOMICIDAL COMPLAINTS PROTOCOL",
+ "SHC TXP KIDNEY EVALUATION",
+ "RETIRED IP POST-PROCEDURE ORDERS THORACENTESIS",
+ "RETIRED IP PAMF ORTHO TKA"
+]
+
+SS_SECTION_NAMES = [
+ None,
+ " "
+ "Nursing",
+ "NURSING",
+ "General",
+ "Laboratory",
+ "Discharge Orders",
+ "LABORATORY",
+ "DISCHARGE ORDERS",
+ "Vital Signs",
+ "VITAL SIGNS",
+ "Pre-op (Day of Surgery) Orders",
+ "Notify Physician",
+ "NOTIFY PHYSICIAN",
+ "Admission/Transfer",
+ "Orders",
+ "Pre-Admission Orders",
+ "VTE Prophylaxis",
+ "Transfusion Orders",
+ "Activity",
+ "ACTIVITY",
+ "ADMISSION/TRANSFER",
+ "LABORATORY/ECG",
+ "NUTRITION",
+ "Immunizations",
+ "Nutrition",
+ "VTE PROPHYLAXIS",
+ "RESPIRATORY",
+ "Admission Orders",
+ "Consults",
+ "Respiratory",
+ "Code Status",
+ "CODE STATUS",
+ "Glucose Checks",
+ "CONSULTS",
+ "IMMUNIZATIONS",
+ "Follow Up Instructions",
+ "ORDERS",
+ "VITALS",
+ "Intra-Operative Blood Product and Transfusion Orders (By Product)",
+ "Facility Orders",
+ "PRE-OP (DAY OF SURGERY) ORDERS",
+ "IMAGING",
+ "Nursing Orders",
+ "Laboratory/ECG",
+ "Ad-hoc Orders",
+ "DISCHARGE INSTRUCTIONS",
+ "Discharge Instructions",
+ "PROCEDURES",
+ "Imaging",
+ "MEDICATIONS",
+ "Trauma 97 Initial ED Orders",
+ "After Visit Orders",
+ "PRE-ADMISSION ORDERS",
+ "Interagency Referrals",
+ "THERAPY REFERRALS",
+ "Intra-Operative Labs",
+ "Labs",
+ "Procedures",
+ "Orders - Labs, X-rays, Procedures",
+ "Other Tests",
+ "Protocol",
+ "Nursing ",
+ "Medications",
+ "Hypoglycemia Control",
+ "Insulin Adjustments ",
+ "OTHER TESTS",
+ "Monitoring",
+ "Dressing",
+ "MICROBIOLOGY TESTS",
+ "PICC Insertion/Exchange",
+ "Notify MD",
+ "Pain Medication Regimens",
+ "Inpatient Pre-op Orders",
+ "Stroke Symptoms",
+ "Vitals",
+ "GLUCOSE CHECKS",
+ "ADMISSION",
+ "OTHER LAB TESTS",
+ "Therapy Referrals ",
+ "Cultures",
+ "Home Orders",
+ "Orders (Labs,Procedures,Images,Referrals)",
+ "MONITORING",
+ "HYPOGLYCEMIA CONTROL",
+ "Transfusion",
+ "DRESSING",
+ "Trauma Radiology",
+ "TRANSFUSION",
+ "Isolation/Precautions",
+ "PICC INSERTION/EXCHANGE",
+ "Orders - (labs, imaging, referrals)",
+ "Orders - (Labs, Procedures, Injections, Images, Referrals)",
+ "LABS",
+ "Vitals/Nursing",
+ "Hypoglycemic Protocol For IV Insulin Infusion",
+ "Treatment Procedures",
+ "Post-Operative Admit Panel",
+ "Colon Cancer Screening",
+ "NURSING ORDERS",
+ "INTERAGENCY REFERRALS",
+ "Referrals",
+ "Pre Procedure ",
+ "Patient Preparation",
+ "SPECIAL NEEDS CROSSMATCH",
+ "Visit for Flu Vaccine",
+ "INSULIN ADJUSTMENTS ",
+ "INFLUENZA VACCINE ORDER PANELS",
+ "Assessment and Privileges",
+ "Standard Labs",
+ "Pre- Procedure",
+ "Rehabilitation/ Home Care",
+ "Trauma 99 Initial ED Orders",
+ "Routine Orders",
+ "DISCONTINUE PREVIOUS INSULIN/ORAL ANTIDIABETIC ORDERS",
+ "IV Fluids",
+ "Post Procedure",
+ "Tube Feeding ",
+ "Injections",
+ "Hepatitis C Screening",
+ "Vital/Nursing",
+ "PICC Line",
+ "STANDARD LABS",
+ "Precaution",
+ "Vascular Access Team Services",
+ "SPECIAL NEEDS BLOOD PRODUCTS",
+ "Diabetes Management",
+ "IV FLUIDS",
+ "INSULIN BASAL, PRANDIAL AND CORRECTIVE SUBCUTANEOUS SCALES",
+ "PRE PROCEDURE ",
+ "Post Procedure ",
+ "Precautions",
+ "Outpatient Orders",
+ "Pathology",
+ "PATIENT PREPARATION",
+ "HYPOGLYCEMIC PROTOCOL FOR IV INSULIN INFUSION",
+ "Breast Cancer Screening",
+ "Procedure Orders",
+ "BASIC BLOOD PRODUCTS",
+ "GENERAL LABS",
+ "Orders - Labs, Procedures, Referrals, etc",
+ "Wounds",
+ "Nursing PRE-PROCEDURE",
+ "Physician Charging",
+ "Medication Management",
+ "Cervical Cancer Screening",
+ "General Labs",
+ "Cytogenetics",
+ "Pre-Dialysis Laboratory",
+ "POST PROCEDURE ",
+ "Virology",
+ "ORTHO NURSING",
+ "MICROBIOLOGY",
+ "PROCEDURES/ORDERS",
+ "Trauma 95 Initial ED Orders",
+ "SPUTUM INDUCED",
+ "Flow Cytometry",
+ "Trauma",
+ "MEDICATION",
+ "FULL INTENSITY HEPARIN PROTOCOL",
+ "Nurse Communication",
+ "Nursing POST-PROCEDURE",
+ "Day of Surgery Orders",
+ "SPUTUM,EXPECTORATED",
+ "PICC LINE",
+ "LOW INTENSITY HEPARIN INFUSION PROTOCOL",
+ "Influenza Vaccine =>3 Years Old",
+ "Insulin Bolus And Infusion",
+ "PATHOLOGY",
+ "Injectible Meds",
+ "Admission",
+ "Retrieval Orders",
+ "CYTOGENETICS",
+ "Blood Products",
+ "Cardiac Event Monitor",
+ "ADMIT ORDERS",
+ "Sleep Apnea Orders",
+ "CONSULT",
+ "PRE-DIALYSIS LABORATORY",
+ "HLA Recipient Kit Request",
+ "INSULIN INFUSION HYPOGLYCEMIC PROTOCOL",
+ "PRECAUTIONS",
+ "HLA Kit Request",
+ "DME",
+ "Massive Transfusion Adult (>50 KG)",
+ "TRAUMA",
+ "Wound Care for SNF or Home Care",
+ "Fluoro Procedures",
+ "Recipient Testing PRE-TRANSPLANT",
+ "1. Delirium General Management",
+ "ANCILLARY STUDIES",
+ "Admisison Orders",
+ "IP Insulin Continuous IV Infusion (For Cardiac Transplant)",
+ "Case Request",
+ "PRE PROCEDURE",
+ "Laboratory Phase I ",
+ "Hypoglycemia Control For Insulin Transition Off IV Infusion Protocol",
+ "PRIVILEGES",
+ "Recipient Testing",
+ "TUBE FEEDING CHOICES"
+]
+
+SS_SG_NAMES = [
+ None,
+ "Nursing",
+ "Vital Signs",
+ "Orders",
+ "Notify Physician",
+ "Admission",
+ "Activity",
+ "Chemistry",
+ "Hematology",
+ "Nutrition",
+ "Pre-procedure",
+ "Notify MD",
+ "Labs",
+ "Code Status",
+ "VTE Prophylaxis",
+ "Respiratory",
+ "Discharge",
+ "Consults",
+ "Intra/Post Procedure",
+ "Laboratory",
+ "Pre-Admission Lab Studies",
+ "Discharge Patient",
+ "Post Procedure",
+ "Monitor",
+ "Instructions",
+ "Protocol Labs",
+ "Order Blood Products (NOT AN ORDER TO TRANFUSE)",
+ "Monitoring",
+ "Discharge Instructions",
+ "Admission Orders",
+ "Transfuse Blood Products (DOES NOT ORDER PRODUCT)",
+ "Glucose Checks",
+ "Interventions",
+ "Assessment",
+ "ADMINISTRATION MMC",
+ "IMM/INJ PED ORDERS MMC",
+ "Intervention",
+ "Procedures",
+ "ECG",
+ "Therapy Referrals",
+ "Type and Screen",
+ "Day of Surgery IV insertion w PRN lidocaine and TKO fluid rate",
+ "POC",
+ "Day of Surgery Low Risk DVT/PE Prophylaxis: (<5% risk of DVT: Patient <40 years old and minor surgery and no additional risk factors)",
+ "Xray",
+ "Interagency Referrals",
+ "Hypoglycemic Treatment",
+ "Prepare and Send Blood Products",
+ "Moderate Risk DVT/PE Prophylaxis (10-20% risk of DVT: age 40-60 years old with no additional risk factors or minor surgery in patients with additional risk factors)",
+ "Low Risk DVT/PE Prophylaxis(<5% risk of DVT)Patient <40 yrs old and minor surgery and no additional risk factors.",
+ "Dressing",
+ "One Time Labs - Prior to Heparin",
+ "Pre-Admission Ancillary Studies",
+ "Insulin Adjustments",
+ "TRAUMA 97",
+ "IV Fluids",
+ "Intra-Operative Labs",
+ "Day of Surgery Nursing",
+ "Point of Care (POC) Labs",
+ "Medication Side Effects Management",
+ "Order Blood Products",
+ "Microbiology",
+ "Immunizations",
+ "Day of Surgery Nursing Orders",
+ "Consult",
+ "Precautions",
+ "Notify Pain Service",
+ "Order Blood Products (NOT AN ORDER TO TRANSFUSE)",
+ "Day of Surgery Lab Studies",
+ "Lab",
+ "Transfuse Blood Products",
+ "Pre-Admission Type and Screen",
+ "Transfuse Blood Products (DOES NOT ORDER PRODUCT)",
+ "ADULT IMMUNIZATIONS FOR UHA DEPARTMENTS",
+ "Facility Nursing",
+ "Referrals",
+ "Glucose PRN",
+ "Nursing Orders",
+ "Basic Microbiology",
+ "Urine Studies",
+ "VTE Prophylaxis Regimen",
+ "ICU Hemodynamic Monitoring",
+ "PICC Nursing Communication",
+ "Vital Sign",
+ "Day of Surgery Skin Preparation",
+ "AMB PRO SLEEP FOR ATTENDINGS ONLY",
+ "Nursing Communications",
+ "Pre-transplant Labs for Recipient",
+ "BMT Donor Tests",
+ "IN-LAB SLEEP STUDY (AGE 19 OR OLDER)",
+ "Discharge Orders",
+ "Moderate Risk DVT/PE Prophylaxis (10-20% risk of DVT: Patient 40-60 years old with no additional risk factors or minor surgery in patients with additional risk factors)",
+ "Hemodialysis",
+ "LABS - Single Orders (Stanford Draw)",
+ "ADMIT",
+ "Labs POC",
+ "Vital signs",
+ "Laboratory/ECG",
+ "Vitals/Nursing",
+ "Low Risk DVT/PE Prophylaxis: (<5% risk of DVT: Patient <40 years old and minor surgery and no additional risk factors)",
+ "Pharmacologic VTE Prophyalxis Contraindicated",
+ "Pre-Admission Urine Studies",
+ "Pre-Admission Chlorhexidine Orders",
+ "High Risk DVT/PE Prophylaxis (20-40% risk of DVT: surgery in patients > 60 years old or age >40 years with additional risk factors)",
+ "Basic Chemistry/Hematology",
+ "Deep Vein Thrombosis Prevention",
+ "Home Nursing",
+ "UHA AMB PRO PED WCC 3-11 YEARS",
+ "Precaution",
+ "Isolation/Precautions",
+ "Daily Labs",
+ "High Risk DVT/PE Prophylaxis: (20-40% risk of DVT: Surgery in patients >60 years old or age >40 years with additional risk factors)",
+ "Saline Lock",
+ "Hypoglycemic Protocol: BG less than 70 mg/dL",
+ "PRO PED ADOL WCC MMC",
+ "Day of Surgery DVT Prophylaxis",
+ "Neurological Checks",
+ "Pre Procedure",
+ "PICC Insertion/Exchange",
+ "Wean Ventilator",
+ "Hypoglycemia Control",
+ "Drains and Tubes",
+ "General Nursing",
+ "Cardiac markers",
+ "Neurovascular",
+ "Urine Output Protocol",
+ "Post-Operative Panel (Trauma)",
+ "Tube Feeding Formula",
+ "PICC Line",
+ "Day of Surgery Deep Vein Thrombosis Prevention",
+ "Pre-Operative Skin Preparation ",
+ "Debridement",
+ " Procedures",
+ "LAB - Standard Orders",
+ "PRO URODYNAMICS",
+ "During Visit Orders",
+ "Imaging",
+ "Bone Marrow Biopsy, Aspirate Testing",
+ "Flow Cytometry",
+ "INFLUENZA VACCINE",
+ "ADULT IMMUNIZATIONS",
+ "Upper Abdominal Pain",
+ "Virology",
+ "Day of Surgery Antibiotics",
+ "Lab Work",
+ "Order Basic Blood Products",
+ "Pre-Operative Skin Preparation",
+ "Rehabilitation/Home Care",
+ "General Labs",
+ "TRAUMA RADIOLOGY",
+ "Oral Care",
+ "Patient Preparation",
+ "Nursing Interventions",
+ "Nursing ",
+ "WARFARIN BY PHARMACY PROTOCOL PT/INR/LFT CHECK MARKING",
+ "Cardiac Monitor",
+ "Notify Pain Service Physician",
+ "PRO ACUPUNCTURE",
+ "Consents",
+ "X-ray",
+ "Cardiology",
+ "Vital Signs ",
+ "Order, Send, and Transfuse Blood Products",
+ "Transfusion Order",
+ "Screening Colonoscopy",
+ "LABS ROUTINE/HIV - STANFORD LABS",
+ "Wound",
+ "AMB IMM/INJ PED ORDERS ",
+ "Labs:Fluid",
+ "AMB PRO SLEEP ORD",
+ "Hepatitis C Screening",
+ "Standard Transplant Evaluation Tests",
+ "Vitals",
+ "Rehabilitation /SNF ",
+ "XRay",
+ "After Visit Orders",
+ "Nursing Assessment",
+ "Nursing Routine",
+ "Discharge Instrcutions",
+ "EVALUATION LAB WORK PHASE I",
+ "Orthopat",
+ "Sedation Assessment",
+ "PROCEDURES",
+ "Basic Microbiology - Always order BOTH tests",
+ "Trauma Radiology",
+ "Tetanus, Diptheria and Pertusis Vaccines",
+ "Nursing Triage Order Set Initiated",
+ "OUT-OF-CENTER TESTING (PORTABLE MONITORING)",
+ "Extended Microbiology",
+ "Transfer",
+ "Outpatient Orders",
+ "Pre-Procedure (NSG)",
+ "Hypoglycemic Protocol: (BG<70)",
+ "ED Trauma 99",
+ "Nursing Protocols",
+ "IMAGING",
+ "Day of Surgery Pharmacologic VTE Prophyalxis Contraindicated",
+ "Respiratory/Ventilator",
+ "Collection",
+ "Labs: Fluid"
+]
+
+STAND_INTERVALS = [
+ None,
+ "LAB ONE TIME",
+ "ONCE",
+ "CONTINUOUS",
+ "PRN",
+ "PROCEDURE ONCE",
+ "TODAY",
+ "QAM LAB",
+ "TID",
+ "AS SPECIFIED",
+ "EVERY 4 HOURS",
+ "INAM LAB",
+ "DAILY",
+ "EVERY HOUR",
+ "EVERY 6 HOURS",
+ "TOMORROW ",
+ "EVERY 2 HOURS",
+ "LAB ADD ON",
+ "EVERY 15 MIN",
+ "EVERY 8 HOURS",
+ "EVERY 12 HOURS",
+ "Transfuse 1 unit",
+ "4 TIMES DAILY BEFORE MEALS & AT BEDTIME",
+ "EVERY 2 HOURS WHILE AWAKE (ORDERS)",
+ "Transfuse 2 units",
+ "VS PER ED POLICY",
+ "THREE TIMES A WEEK INFO",
+ "QPM LAB",
+ "Per Treatment Parameters - Manual Release",
+ "QAM RAD",
+ "INPM LAB",
+ "FOUR TIMES A WEEK INFO",
+ "FIVE TIMES A WEEK INFO",
+ "Once a Week",
+ "PER PROTOCOL",
+ "Once Every 4 Weeks",
+ "Q4HR-PRN",
+ "Per Treatment Parameters",
+ "EVERY 7 DAYS",
+ "EVERY MONDAY",
+ "Lab One Time",
+ "Once a Day",
+ "Every 1 Week",
+ "Q4H",
+ "EVERY MO,TH",
+ "Every 1 Week - Manual Release",
+ "Every 4 Weeks",
+ "Every 4 Weeks - Manual Release",
+ "EVERY 4 HOURS WHILE AWAKE",
+ "EVERY MWF",
+ "TWO TIMES A WEEK INFO",
+ "Q6H",
+ "TWICE A DAY",
+ "2 TIMES DAILY",
+ "EVERY 30 MIN",
+ "2 TIMES A DAY",
+ "Q12H",
+ "Once Every 12 Weeks",
+ "EVERY OTHER DAY AT 0600",
+ "Q8H",
+ "Once Every 3 Weeks",
+ "Every 12 Weeks",
+ "Three Times a Week",
+ "Q6 PRN",
+ "Once Every 2 Weeks",
+ "Every 12 Weeks - Manual Release",
+ "LAB ONE TIME (IN 15 MIN)",
+ "Five Times a Week",
+ "EVERY 4 DAYS",
+ "Every 2 Weeks - Manual Release",
+ "SEVEN TIMES A WEEK INFO",
+ "2 Times a Week",
+ "4 TIMES DAILY",
+ "DAILY INFO",
+ "TID CHECKS",
+ "EVERY MORNING",
+ "Once",
+ "Every 3 Weeks - Manual Release",
+ "EVERY MON, WED & FRI",
+ "EVERY OTHER DAY",
+ "Every 6 Months",
+ "EVERY TUE THUR SUN",
+ "Daily",
+ "EVERY MON WED FRI SAT",
+ "Transfuse 4 units",
+ "3 Times a Week",
+ "Four Times a Week",
+ "Every 8 Weeks",
+ "Every 2 Weeks",
+ "SIX TIMES A WEEK INFO",
+ "Today, 2 Months, 6 Months",
+ "EVERY 5 MINUTES",
+ "Every 6 MONTHS - Manual Release",
+ "Tomorrow",
+ "WEEKLY",
+ "EVERY SHIFT",
+ "Once Every 8 Weeks",
+ "Every 6 MONTHS",
+ "AT BEDTIME",
+ "EVERY THIRD DAY",
+ "Q4 HR W/A (0900,1300,1700,2100)",
+ "Q4 HR W/A (0800,1200,1600,2000)",
+ "QNOC",
+ "MONTHLY",
+ "EVERY 3 HOURS",
+ "Twice a Week",
+ "EVERY 1 WEEK",
+ "3 TIMES PER DAY",
+ "Q2HR-PRN",
+ "INAM RAD",
+ "Two Times a Week",
+ "Twice a Week - Manual Release",
+ "Once a Day - Manual Release",
+ "WEEKLY INFO",
+ "Continuous",
+ "BID 0800,1800",
+ "Every 8 Weeks - Manual Release",
+ "3 TIMES DAILY",
+ "BID + PRN",
+ "IN AM",
+ "EVERY SUNDAY",
+ "SIX TIMES DAILY",
+ "Q6 HR W/A 0900,1500,2100",
+ "EVERY OTHER WEDNESDAY",
+ "5 TIMES DAILY BEFORE MEALS & AT BEDTIME AND 0200",
+ "EVERY 6 HOURS WHILE AWAKE",
+ "Q0200",
+ "2 TIMES DAILY (0900,1900)",
+ "Three Times a Week - Manual Release",
+ "Q2H",
+ "DAILY AND AS NEEDED",
+ "EVERY WEDNESDAY",
+ "RESP PRN",
+ "Once Every 6 Weeks",
+ "EVERY THURSDAY",
+ "WITH VITAL SIGNS",
+ "Q4 HR W/A PRN",
+ "2 TIMES DAILY (0800,1800)",
+ "QID-PRN",
+ "Six Times a Week",
+ "Seven Times a Week",
+ "Every Weekday",
+ "EVERY TUESDAY",
+ "FREE WATER FOR TUBE FEEDING TID",
+ "Blood - Once",
+ "Every 3 Weeks",
+ "Today",
+ "Transfuse 6 units",
+ "BID-PRN",
+ "Every 6 Weeks - Manual Release",
+ "Q1H",
+ "TWICE A DAY INFO",
+ "QID",
+ "Every 2 Hours While Awake",
+ "EVERY MON & FRI",
+ "Transfusion",
+ "EVERY THIRD DAY AT 0600",
+ "Transfuse 3 units",
+ "Every other day at 0600",
+ "QAM LAB (0600)",
+ "EVERY 2 WEEKS",
+ "Q30 Min",
+ "EVERY 72 HOURS",
+ "BID 0900,1900",
+ "Every 6 Weeks",
+ "4 Times a Week",
+ "Q4 HR W/A (0600,1000,1400,1800)",
+ "ONE TIME",
+ "EVERY 10 MIN ",
+ "3 TIMES DAILY BEFORE MEALS",
+ "EVERY FRIDAY",
+ "Transfuse 8 units",
+ "TID (0000, 0800, 1600)",
+ "EVERY MON AND THUR",
+ "BID",
+ "EVERY TUE THUR SAT",
+ "Once Every 9 Weeks",
+ "2 TIMES DAILY AFTER MEALS",
+ "Weekly",
+ "THREE TIMES A WEEK",
+ "4 TIMES DAILY AND AS NEEDED",
+ "EVERY MON & THU",
+ "Every 72 hrs",
+ "Twice A Day",
+ "Twice a Day",
+ "Q6 HR W/A 0800,1400,2000",
+ "FIVE TIMES A WEEK",
+ "TID-PRN",
+ "FOUR TIMES A WEEK",
+ "DAILY (0800)",
+ "Today, 2 Months, 6 Months Manual Release",
+ "Q15 Min",
+ "EVERY 8 HOURS (0600, 1400, 2200)",
+ "Q3H",
+ "Q Week",
+ "EVERY HOUR (0100, 0200, ETC)",
+ "Every 9 Weeks",
+ "EVERY TUE, THU & SAT",
+ "EVERY 4 HOURS AND AS NEEDED",
+ "EVERY SUNDAY (2000) "
+]
+
+
+class TestSTARROrderProcConversion(DBTestCase):
+ TEST_DATA_SIZE = 2 * len(ORDER_TYPES) # at least 2 rows per med route combined with inpatient vs outpatient
+
+ ORDER_PROC_HEADER = ['order_proc_id_coded', 'jc_uid', 'pat_enc_csn_id_coded', 'order_type', 'proc_id', 'proc_code',
+ 'description', 'order_time_jittered', 'ordering_mode', 'stand_interval',
+ 'order_time_jittered_utc']
+ PROC_ORDERSET_HEADER = ['order_proc_id_coded', 'protocol_id', 'protocol_name', 'ss_section_id', 'ss_section_name',
+ 'ss_sg_key', 'ss_sg_name']
+
+ test_data = []
+ orderset_data = []
+ clinical_items = {}
+ expected_data = []
+ expected_orderset_data = []
+
+ test_data_csv = tempfile.gettempdir() + '/test_starr_order_proc_dummy_data.csv'
+ orderset_data_csv = tempfile.gettempdir() + '/test_starr_order_proc_orderset_data.csv'
+
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self)
+
+ log.info("Sourcing from BigQuery DB")
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata()
+
+ self.converter = STARROrderProcConversion.STARROrderProcConversion() # Instance to test on
+ self.bqConn = self.converter.bqConn
+ self.starrUtil = STARRUtil.StarrCommonUtils(self.converter.bqClient)
+
+ # point the converter to dummy source table
+ STARROrderProcConversion.SOURCE_TABLE = TEST_SOURCE_TABLE
+ STARROrderProcConversion.ORDERSET_TABLE = TEST_ORDERSET_TABLE
+ STARROrderProcConversion.TARGET_DATASET_ID = TEST_DEST_DATASET
+
+ log.warn("Removing test tables, if they exist: {} and {}".format(TEST_SOURCE_TABLE, TEST_ORDERSET_TABLE))
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_SOURCE_TABLE))
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_ORDERSET_TABLE))
+
+ def generate_test_and_expected_data(self, test_data_size):
+ self.generate_orderproc_and_orderset_data(test_data_size)
+
+ # need to sort data to use the same clinical_item.descriptions as the duplicate clinical_items are not stored
+ self.test_data.sort(key=lambda tup: (tup[0], tup[1], tup[2], tup[3]))
+ self.orderset_data.sort(key=lambda row: row[0])
+
+ # join test order_proc and proc_orderset data to create a test row
+ joined_test_data = self.left_join_orderproc_and_orderset_data()
+
+ for joined_test_data_row in joined_test_data:
+ self.generate_expected_data_rows(joined_test_data_row[0], joined_test_data_row[1])
+
+ # pi.external_id desc, pi.patient_id, pi.encounter_id, ci.external_id desc
+ self.expected_data.sort(key=lambda tup: (-tup[0], tup[1], tup[2], -tup[4]))
+
+ # pi.external_id, ci.external_id, cic.description, ci.name, ci.description
+ self.expected_orderset_data.sort(key=lambda tup: (tup[0], tup[1], tup[2], tup[3], tup[4]))
+
+ def left_join_orderproc_and_orderset_data(self):
+ joined_test_data = []
+ for test_data_row in self.test_data:
+ if self.ignore_row(test_data_row[9]):
+ continue
+
+ found_join_row = False
+ for test_orderset_row in self.orderset_data:
+ if test_data_row[0] == test_orderset_row[0]:
+ found_join_row = True
+ joined_test_data.append((test_data_row, test_orderset_row))
+ if not found_join_row:
+ joined_test_data.append((test_data_row, None))
+ return joined_test_data
+
+ def generate_orderproc_and_orderset_data(self, test_data_size):
+ seen_test_data_rows = set()
+ while len(self.test_data) < test_data_size:
+ curr_row = len(self.test_data)
+ patient_id = 'JC' + format(curr_row, '06')
+
+ test_data_row = self.generate_test_data_row(curr_row, patient_id)
+ self.test_data.append(test_data_row)
+
+ # should generate at most 1 row of proc_orderset per order_proc row (tested code does LEFT OUTER JOIN)
+ should_generate_orderset_row = random.randint(0, 10) # 10 times more likely to generate than not
+ if should_generate_orderset_row:
+ orderset_row = self.generate_orderset_row(test_data_row[0])
+ self.orderset_data.append(orderset_row)
+
+ @staticmethod
+ def ignore_row(stand_interval):
+ # process only rows where op.stand_interval not like '%PRN'
+ return stand_interval is not None and stand_interval.endswith('PRN')
+
+ @staticmethod
+ def generate_test_data_row(curr_row, patient_id):
+ proc_id = random.randint(0, len(PROC_CODES) - 1)
+ order_time_jittered = random.randint(int(time.mktime((datetime.now() - timedelta(days=14)).timetuple())), int(time.time()))
+ return (
+ curr_row, # order_proc_id_coded
+ patient_id,
+ random.randint(0, curr_row // 2), # pat_enc_csn_id_coded - want some of them to be repeated
+ ORDER_TYPES[random.randint(0, len(ORDER_TYPES) - 1)],
+ proc_id,
+ PROC_CODES[proc_id],
+ DESCRIPTIONS[random.randint(0, len(DESCRIPTIONS) - 1)],
+ datetime.fromtimestamp(order_time_jittered),
+ ORDERING_MODES[random.randint(0, len(ORDERING_MODES) - 1)], # ordering_modes
+ STAND_INTERVALS[random.randint(0, len(STAND_INTERVALS) - 1)],
+ datetime.fromtimestamp(order_time_jittered, tz=pytz.UTC),
+ )
+
+ @staticmethod
+ def generate_orderset_row(order_proc_id_coded):
+ protocol_id = random.randint(1, len(PROTOCOL_NAMES))
+ ss_section_id = random.randint(0, len(SS_SECTION_NAMES) - 1)
+ ss_sg_key = random.randint(0, len(SS_SG_NAMES) - 1)
+
+ return (
+ order_proc_id_coded, # to match the given order_proc_row
+ -protocol_id,
+ PROTOCOL_NAMES[protocol_id - 1],
+ ss_section_id,
+ SS_SECTION_NAMES[ss_section_id],
+ str(ss_sg_key),
+ SS_SG_NAMES[ss_sg_key]
+ )
+
+ def generate_expected_data_rows(self, row, orderset_row):
+ cic_description = "{} ({})".format(row[3], row[8])
+ ci_description = row[6]
+ proc_code = row[5]
+
+ ci_key = (TEST_SOURCE_TABLE, cic_description, proc_code)
+
+ if ci_key not in self.clinical_items:
+ # TODO for now put just the description.
+ # We might need also cic_description, external_id = proc_id, name = proc_code.
+ self.clinical_items[ci_key] = ci_description
+
+ ci_description = self.clinical_items[ci_key]
+
+ expected_row = (
+ row[0], # external_id
+ self.starrUtil.convertPatIdToSTRIDE(row[1]), # patient_id
+ row[2], # encounter_id
+ cic_description, # cic_description
+ row[4], # ci_external_id
+ proc_code, # ci_name
+ ci_description, # ci_description
+ row[7], # pi_item_date
+ row[10].replace(tzinfo=pytz.UTC), # pi.item_date_utc
+ )
+
+ if expected_row not in self.expected_data:
+ self.expected_data.append(expected_row)
+
+ if orderset_row is not None:
+ # generate expected data for orderset - in %item_collection% tables
+ expected_orderset_row = (
+ row[0], # pi_external_id
+ row[4],
+ cic_description,
+ proc_code, # ci_name
+ ci_description,
+ orderset_row[1], # protocol_id
+ orderset_row[2], # protocol_name
+ orderset_row[4], # ss_section_name
+ orderset_row[6] # ss_sg_name
+ )
+ self.expected_orderset_data.append(expected_orderset_row)
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ self.test_data[:] = []
+ self.orderset_data[:] = []
+ self.expected_data[:] = []
+ self.expected_orderset_data[:] = []
+ self.clinical_items.clear()
+
+ self.starrUtil.remove_file(self.test_data_csv)
+ self.starrUtil.remove_file(self.orderset_data_csv)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DELETE FROM {}.patient_item_collection_link WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.item_collection_item WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.item_collection WHERE true;'.format(TEST_DEST_DATASET))
+
+ bq_cursor.execute('DELETE FROM {}.patient_item WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.clinical_item WHERE true;'.format(TEST_DEST_DATASET))
+ bq_cursor.execute('DELETE FROM {}.clinical_item_category WHERE true;'.format(TEST_DEST_DATASET))
+
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_SOURCE_TABLE))
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_ORDERSET_TABLE))
+
+ DBTestCase.tearDown(self)
+
+ def test_data_conversion(self):
+ log.info("Generating test source data")
+
+ self.generate_test_and_expected_data(self.TEST_DATA_SIZE)
+
+ # upload proc_orderset
+ self.starrUtil.dump_test_data_to_csv(self.PROC_ORDERSET_HEADER, self.orderset_data, self.orderset_data_csv)
+ self.starrUtil.upload_csv_to_bigquery('starr_datalake2018', 'proc_orderset', TEST_DEST_DATASET,
+ 'starr_proc_orderset', self.orderset_data_csv, self.PROC_ORDERSET_HEADER)
+
+ # upload order_proc
+ self.starrUtil.dump_test_data_to_csv(self.ORDER_PROC_HEADER, self.test_data, self.test_data_csv)
+ self.starrUtil.upload_csv_to_bigquery('starr_datalake2018', 'order_proc', TEST_DEST_DATASET,
+ 'starr_order_proc', self.test_data_csv, self.ORDER_PROC_HEADER)
+
+ log.debug("Run the conversion process...")
+ # temp_dir = tempfile.gettempdir()
+ # self.converter.convertAndUpload(tempDir=temp_dir, target_dataset_id=TEST_DEST_DATASET, removeCsvs=True)
+ self.converter.main(["test_order_proc"])
+
+ # Just query back for the same data, de-normalizing the data back to a general table
+ test_query = \
+ """
+ select
+ pi.external_id as pi_external_id,
+ pi.patient_id,
+ pi.encounter_id,
+ cic.description as cic_description,
+ ci.external_id as ci_external_id,
+ ci.name,
+ ci.description as ci_description,
+ pi.item_date,
+ pi.item_date_utc
+ from
+ {}.patient_item as pi,
+ {}.clinical_item as ci,
+ {}.clinical_item_category as cic
+ where
+ pi.clinical_item_id = ci.clinical_item_id and
+ ci.clinical_item_category_id = cic.clinical_item_category_id and
+ cic.source_table = '{}'
+ order by
+ pi.external_id desc, pi.patient_id, pi.encounter_id, ci.external_id desc
+ """.format(TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_SOURCE_TABLE)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute(test_query)
+ # remove timezone info in pi.item_date from coming from bigquery - we're storing datetime without timezone
+ actual_data = [tuple(row.values())[:7] + (list(row.values())[7].replace(tzinfo=None), list(row.values())[8],) for row in bq_cursor.fetchall()]
+
+ log.debug('actual data: {}'.format(actual_data))
+ log.debug('expected data: {}'.format(self.expected_data))
+ self.assertEqualTable(self.expected_data, actual_data)
+
+ # Query for orderset links
+ test_orderset_query = \
+ """
+ select
+ pi.external_id as pi_external_id,
+ ci.external_id as ci_external_id,
+ cic.description as cic_description,
+ ci.name as ci_name,
+ ci.description,
+ ic.external_id,
+ ic.name,
+ ic.section,
+ ic.subgroup
+ from
+ {}.patient_item as pi,
+ {}.clinical_item as ci,
+ {}.clinical_item_category as cic,
+ {}.patient_item_collection_link as picl,
+ {}.item_collection_item as ici,
+ {}.item_collection as ic
+ where
+ pi.clinical_item_id = ci.clinical_item_id and
+ ci.clinical_item_category_id = cic.clinical_item_category_id and
+ cic.source_table = '{}' and
+ pi.patient_item_id = picl.patient_item_id and
+ picl.item_collection_item_id = ici.item_collection_item_id and
+ ici.item_collection_id = ic.item_collection_id
+ order by
+ pi.external_id, ci.external_id, cic.description, ci.name, ci.description
+ """.format(TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET,
+ TEST_DEST_DATASET, TEST_SOURCE_TABLE)
+
+ bq_cursor.execute(test_orderset_query)
+ actual_orderset_data = [list(row.values()) for row in bq_cursor.fetchall()]
+
+ log.debug('actual orderset data: {}'.format(actual_orderset_data))
+ log.debug('expected orderset data: {}'.format(self.expected_orderset_data))
+ self.assertEqualTable(self.expected_orderset_data, actual_orderset_data)
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(unittest.makeSuite(TestSTARROrderProcConversion))
+
+ return test_suite
+
+
+if __name__ == "__main__":
+ log.setLevel(logging.INFO) # without this no logs are printed
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/starr_conv/test/TestSTARRTreatmentTeamConversion.py b/medinfo/dataconversion/starr_conv/test/TestSTARRTreatmentTeamConversion.py
new file mode 100644
index 00000000..57fef223
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/test/TestSTARRTreatmentTeamConversion.py
@@ -0,0 +1,726 @@
+#!/usr/bin/env python
+"""Test case for respective module in application package"""
+
+import sys, os
+import logging
+import pytz
+import random
+import tempfile;
+
+from datetime import datetime
+
+import unittest
+
+from parameterized import parameterized
+from medinfo.dataconversion.test.Const import RUNNER_VERBOSITY
+from medinfo.dataconversion.Util import log
+
+from medinfo.db.test.Util import DBTestCase
+
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader
+
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery, RowItemModel
+
+from medinfo.dataconversion.starr_conv import STARRTreatmentTeamConversion
+from medinfo.dataconversion.starr_conv import STARRUtil
+
+TEST_SOURCE_TABLE = 'test_dataset.starr_treatment_team'
+TEST_DEST_DATASET = 'test_dataset'
+
+NAME_TO_ACRONYM = {
+ 'Intern': 'I',
+ 'Cross Cover Intern': 'CCI',
+ 'Wound/Ostomy/Continence RN': 'WR',
+ 'Primary Intern': 'PI',
+ 'Primary Resident': 'PR',
+ 'Cross Cover Attending': 'CCA',
+ 'Student Nurse': 'SN',
+ 'Clinical Pharmacist': 'CP',
+ 'Medical Assistant': 'MA',
+ 'Licensed Vocational Nurse': 'LVN',
+ 'Clinical Nurse Specialist': 'CNS',
+ 'Cross Cover Fellow': 'CCF',
+ 'ED Unit Secretary': 'EUS',
+ 'Primary Fellow': 'PF',
+ 'Cross Cover Resident': 'CCR',
+ 'Consulting Attending': 'CA',
+ 'Consulting Fellow': 'CF',
+ 'Spiritual Care': 'SC',
+ 'Consulting Med Student': 'CMS',
+ 'Primary Advanced Practice Provider': 'PAPP',
+ 'Physician Assistant': 'PA',
+ 'Consulting Resident': 'CR',
+ 'Nurse Coordinator': 'NC',
+ 'Fellow': 'F',
+ 'Consulting Intern': 'CI',
+ 'Co-Attending': 'C',
+ 'Surgeon': 'S',
+ 'Primary Med Student': 'PMS',
+ 'ED Tech': 'ET',
+ 'Resident': 'R',
+ 'Chief Resident': 'CR',
+ 'Medical Student': 'MS',
+ 'Primary Medical Student': 'PMS',
+ 'Pulmonologist': 'P',
+ 'Pediatrician': 'P',
+ 'Hematologist': 'H',
+ 'Primary Care Physician': 'PCP',
+ 'Primary Physician Assistant': 'PPA',
+ 'Cardiologist': 'C',
+ 'Triage Nurse': 'TN',
+ 'Transplant Social Worker': 'TSW',
+ 'Additional Communicating Provider': 'ACP',
+ 'ED Registrar': 'ER',
+ 'Gastroenterologist': 'G',
+ 'Medical Oncologist': 'MO',
+ 'Primary Sub-Intern': 'PS',
+ 'Lactation Consultant': 'LC',
+ 'Trauma Attending': 'TA',
+ 'Post-Transplant Nurse': 'PN',
+ 'Cross Cover Advanced Practice Provider ': 'CCAPP',
+ 'Internist': 'I',
+ 'Nephrologist': 'N',
+ 'Research Coordinator': 'RC',
+ 'Infectious Disease': 'ID',
+ 'Trauma Resident ': 'TR',
+ 'Primary Sub-intern': 'PS',
+ 'Neurologist': 'N',
+ 'Transplant Surgeon': 'TS',
+ 'Consulting Medical Oncologist': 'CMO',
+ 'Family Practitioner': 'FP',
+ 'Dermatologist': 'D',
+ 'Aging Adult Services Coordinator': 'AASC',
+ 'Transplant Nephrologist': 'TN',
+ 'Post-Transplant Nephrologist': 'PN',
+ 'Consulting Surgical Oncologist': 'CSO',
+ 'Surgical Oncologist': 'SO',
+ 'Nursery Nurse': 'NN',
+ 'Transplant Pharmacist': 'TP',
+ 'Psychologist': 'P',
+ 'Restorative Aide': 'RA',
+ 'Child Life Specialist': 'CLS',
+ 'Consulting Hematologist': 'CH',
+ 'Endocrinologist': 'E',
+ 'Electrophysiologist': 'E',
+ 'Anesthesiologist': 'A',
+ 'Transplant Dietitian': 'TD',
+ 'Urologist': 'U',
+ 'stop0': 's',
+ 'Radiation Oncologist': 'RO',
+ 'Referring Provider': 'RP',
+ 'Activity Therapist': 'AT',
+ 'Transplant Pulmonologist': 'TP',
+ 'Obstetrician': 'O',
+ 'Heart Failure Cardiologist': 'HFC',
+ 'Post RN Coordinator': 'PRC',
+ 'Delivery Assist': 'DA',
+ 'Referring Nephrologist': 'RN',
+ 'Hepatologist': 'H',
+ 'Case Manager': 'CM',
+ 'Primary Team': 'PT',
+ 'Social Worker': 'SW',
+ 'Care Coordinator': 'CC',
+ 'Registered Nurse': 'RN',
+ 'Speech Therapist': 'ST',
+ 'Nursing Assistant': 'NA',
+ 'Clinical Dietitian': 'CD',
+ 'Consulting Service': 'CS',
+ 'Emergency Resident': 'ER',
+ 'Nurse Practitioner': 'NP',
+ 'Physical Therapist': 'PT',
+ 'Occupational Therapist': 'OT',
+ 'Physical Therapist Assistant': 'PTA',
+ 'Respiratory Care Practitioner': 'RCP',
+ 'Independent Living Donor Advocate': 'ILDA',
+ 'Pre RN Coordinator': 'PRC',
+ 'Dietician Intern': 'DI',
+ 'Survivorship Provider': 'SP',
+ 'Consulting Reconstructive Surgeon': 'CRS',
+ 'Referring Pulmonologist': 'RP'
+}
+
+PROV_TO_CLEAN_ACRONYM = {
+ 'SMITH, JOHN': ('', ''),
+ 'SMITH, JANE': ('', ''),
+ 'DOE, JOHN': ('', ''),
+ 'DOE, JANE': ('', ''),
+ 'CON CARDIOLOGY': ('CON CARDIOLOGY', 'CC'),
+ 'CON MEDICINE': ('CON MEDICINE', 'CM'),
+ 'CON PULMONARY': ('CON PULMONARY', 'CP'),
+ 'CON NEURO ICU': ('CON NEURO ICU', 'CNI'),
+ 'CON CARDIOL ARRHYTHMIA': ('CON CARDIOL ARRHYTHMIA', 'CCA'),
+ 'CON NEURO EPILEPSY CONSULT': ('CON NEURO EPILEPSY CONSULT', 'CNEC'),
+ 'CON NEPHROLOGY JAMISON': ('CON NEPHROLOGY JAMISON', 'CNJ'),
+ 'CON CARDIAC SURGERY': ('CON CARDIAC SURGERY', 'CCS'),
+ 'TT CVICU TEAM 2 - SPECTRAS 1-2345, 2-3456': ('TT CVICU TEAM 2', 'TCT2'),
+ 'CON PAIN': ('CON PAIN', 'CP'),
+ 'CON ONCOLOGY': ('CON ONCOLOGY', 'CO'),
+ 'CON NEUROLOGY GENERAL': ('CON NEUROLOGY GENERAL', 'CNG'),
+ 'CON NEURO STROKE': ('CON NEURO STROKE', 'CNS'),
+ 'TT NEUROSURGERY C SPINE FLOOR, PGR 12345': ('TT NEUROSURGERY C SPINE FLOOR', 'TNCSF'),
+ 'CON NEPHROLOGY TRANSPLANT': ('CON NEPHROLOGY TRANSPLANT', 'CNT'),
+ 'TT ACUTE CARE SURGERY TRAUMA, PGR 12345': ('TT ACUTE CARE SURGERY TRAUMA', 'TACST'),
+ 'CON INTERNAL MEDICINE CONSULT': ('CON INTERNAL MEDICINE CONSULT', 'CIMC'),
+ 'CON ICU': ('CON ICU', 'CI'),
+ 'CON ALLERGY IMMUNOLOGY CONSULT': ('CON ALLERGY IMMUNOLOGY CONSULT', 'CAIC'),
+ 'TT CVICU TEAM 1 - SPECTRAS 1-2345, 2-3456': ('TT CVICU TEAM 1', 'TCT1'),
+ 'TT NEUROSURGERY A VASCULAR FLOOR, PGR 12345': ('TT NEUROSURGERY A VASCULAR FLOOR', 'TNAVF'),
+ 'CON HEMATOLOGY': ('CON HEMATOLOGY', 'CH'),
+ 'CON ORTHOPEDICS HOSPITALIST': ('CON ORTHOPEDICS HOSPITALIST', 'COH'),
+ 'TT COLORECTAL SURGERY, PGR 12345': ('TT COLORECTAL SURGERY', 'TCS'),
+ 'CON THORACIC SURGERY': ('CON THORACIC SURGERY', 'CTS'),
+ 'TT NEUROSURGERY B TUMOR FLOOR, PGR 12345': ('TT NEUROSURGERY B TUMOR FLOOR', 'TNBTF'),
+ 'CON PULM TRANSPLANT': ('CON PULM TRANSPLANT', 'CPT'),
+ 'TT NEUROSURGERY B TUMOR ICU, PGR 12345': ('TT NEUROSURGERY B TUMOR ICU', 'TNBTI'),
+ 'CON HEPATOLOGY': ('CON HEPATOLOGY', 'CH'),
+ 'TT NEUROSURGERY C SPINE ICU, PGR 12345': ('TT NEUROSURGERY C SPINE ICU', 'TNCSI'),
+ 'TT PAIN, .': ('TT PAIN', 'TP'),
+ 'TT MICU GREEN RESIDENT A -- PGR 12345': ('TT MICU GREEN RESIDENT A', 'TMGRA'),
+ 'CON NEPHROLOGY MAFFLY': ('CON NEPHROLOGY MAFFLY', 'CNM'),
+ 'CON VASCULAR SURGERY': ('CON VASCULAR SURGERY', 'CVS'),
+ 'TT MED TX HEP RES B, PGR 12345': ('TT MED TX HEP RES B', 'TMTHRB'),
+ 'TT GEN SURG WHITE - PAGER 12345': ('TT GEN SURG WHITE', 'TGSW'),
+ 'CON PULMONARY REHAB CONSULT': ('CON PULMONARY REHAB CONSULT', 'CPRC'),
+ 'CON PAMF MEDICINE': ('CON PAMF MEDICINE', 'CPM'),
+ 'TT MED TX HEP RES A, PGR 12345': ('TT MED TX HEP RES A', 'TMTHRA'),
+ 'CON PALLIATIVE CARE - PGR 12345': ('CON PALLIATIVE CARE', 'CPC'),
+ 'TT INTERVENTIONAL RADIOLOGY, .': ('TT INTERVENTIONAL RADIOLOGY', 'TIR'),
+ 'CON INTERVENT RAD': ('CON INTERVENT RAD', 'CIR'),
+ 'CON PULM HYPERTENSION': ('CON PULM HYPERTENSION', 'CPH'),
+ 'CON MICU CONSULT': ('CON MICU CONSULT', 'CMC'),
+ 'CON PRIMARY CARE': ('CON PRIMARY CARE', 'CPC'),
+ 'TT CARDIOLOGY 5A, .': ('TT CARDIOLOGY 5A', 'TC5'),
+ 'TT NEURO EPILEPSY MONITOR UNIT, .': ('TT NEURO EPILEPSY MONITOR UNIT', 'TNEMU'),
+ 'CON TRANSPLANT SURGERY': ('CON TRANSPLANT SURGERY', 'CTS'),
+ 'TT MICU BLUE RESIDENT A -- PGR 12345': ('TT MICU BLUE RESIDENT A', 'TMBRA'),
+ 'TT MED TX-HEP, .': ('TT MED TX-HEP', 'TMT'),
+ 'CON PSYCHIATRY': ('CON PSYCHIATRY', 'CP'),
+ 'TT BMT, .': ('TT BMT', 'TB'),
+ 'TT CARDIOLOGY 6B, .': ('TT CARDIOLOGY 6B', 'TC6'),
+ 'TT ORTHO TRAUMA, .': ('TT ORTHO TRAUMA', 'TOT'),
+ 'TT MED PAMF NON RESI': ('TT MED PAMF NON RESI', 'TMPNR'),
+ 'TT GEN SURG RED - PAGER 12345': ('TT GEN SURG RED', 'TGSR'),
+ 'TT CARDIOLOGY 6B INTERN -- PGR 12345': ('TT CARDIOLOGY 6B INTERN', 'TC6I'),
+ 'TT NEUROLOGY, .': ('TT NEUROLOGY', 'TN'),
+ 'TT CARDIOLOGY 5B, .': ('TT CARDIOLOGY 5B', 'TC5'),
+ 'TT ONCOLOGY, .': ('TT ONCOLOGY', 'TO'),
+ 'TT MED DAY B, PGR 12345': ('TT MED DAY B', 'TMDB'),
+ 'CON GASTROENTEROLOGY': ('CON GASTROENTEROLOGY', 'CG'),
+ 'TT CARDIOLOGY 6A, .': ('TT CARDIOLOGY 6A', 'TC6'),
+ 'CON COLORECTAL SURGERY': ('CON COLORECTAL SURGERY', 'CCS'),
+ 'TT CARDIOLOGY INTERVENTIONAL -- PGR 12345': ('TT CARDIOLOGY INTERVENTIONAL', 'TCI'),
+ 'TT NEUROSURGERY A VASCULAR ICU, PGR 12345': ('TT NEUROSURGERY A VASCULAR ICU', 'TNAVI'),
+ 'TT GYN, .': ('TT GYN', 'TG'),
+ 'CON NEURO ONCOLOGY': ('CON NEURO ONCOLOGY', 'CNO'),
+ 'TT GYN ONC, .': ('TT GYN ONC', 'TGO'),
+ 'TT GEN SURG GOLD - PAGER 12345': ('TT GEN SURG GOLD', 'TGSG'),
+ 'CON GERIATRICS': ('CON GERIATRICS', 'CG'),
+ 'TT HEMATOLOGY, .': ('TT HEMATOLOGY', 'TH'),
+ 'CON GYNECOLOGY': ('CON GYNECOLOGY', 'CG'),
+ 'CON ENDOCRINOLOGY': ('CON ENDOCRINOLOGY', 'CE'),
+ 'CON CRITICAL CARE CONSULT': ('CON CRITICAL CARE CONSULT', 'CCCC'),
+ 'TT NEUROSURGERY, .': ('TT NEUROSURGERY', 'TN'),
+ 'TT MED DAY A, PGR 12345': ('TT MED DAY A', 'TMDA'),
+ 'CON GENERAL SURGERY': ('CON GENERAL SURGERY', 'CGS'),
+ 'TT ONCOLOGY NP, PGR 12345': ('TT ONCOLOGY NP', 'TON'),
+ 'TT HEMATOLOGY NP A, PGR 12345': ('TT HEMATOLOGY NP A', 'THNA'),
+ 'TT PULMONARY TRANSPLANT, .': ('TT PULMONARY TRANSPLANT', 'TPT'),
+ 'CON KIDNEY TRANSPLANT': ('CON KIDNEY TRANSPLANT', 'CKT'),
+ 'CON CARD INTERVEN/AMI CONSULT': ('CON CARD INTERVEN/AMI CONSULT', 'CCIC'),
+ 'CON CARDIOL TRANSPLANT': ('CON CARDIOL TRANSPLANT', 'CCT'),
+ 'TT ORTHO SURGERY, .': ('TT ORTHO SURGERY', 'TOS'),
+ 'CON CARDIOLOGY ADMISSION REQUEST': ('CON CARDIOLOGY ADMISSION REQUEST', 'CCAR'),
+ 'TT PLASTIC SURGERY, .': ('TT PLASTIC SURGERY', 'TPS'),
+ 'TT HEART LUNG TRANSPLANT, .': ('TT HEART LUNG TRANSPLANT', 'THLT'),
+ 'TT UROLOGY, .': ('TT UROLOGY', 'TU'),
+ 'CON CYSTIC FIBROSIS ADULT': ('CON CYSTIC FIBROSIS ADULT', 'CCFA'),
+ 'TT CARDIOLOGY INTERVENTIONAL, .': ('TT CARDIOLOGY INTERVENTIONAL', 'TCI'),
+ 'TT CYSTIC FIBROSIS ADULT, .': ('TT CYSTIC FIBROSIS ADULT', 'TCFA'),
+ 'TT ENT HEAD NECK, .': ('TT ENT HEAD NECK', 'TEHN'),
+ 'TT ORTHO SPINE, .': ('TT ORTHO SPINE', 'TOS'),
+ 'TT NEUROSURGERY C, .': ('TT NEUROSURGERY C', 'TNC'),
+ 'TT NEUROSURGERY B, .': ('TT NEUROSURGERY B', 'TNB'),
+ 'TT ENT SPECIALTY, .': ('TT ENT SPECIALTY', 'TES'),
+ 'TT HEART TRANSPLANT/VAD -- PGR 12345': ('TT HEART TRANSPLANT/VAD', 'THT'),
+ 'TT CARDIOLOGY ARRHYTHMIA, .': ('TT CARDIOLOGY ARRHYTHMIA', 'TCA'),
+ 'TT ORTHO JOINT, .': ('TT ORTHO JOINT', 'TOJ'),
+ 'TT ORTHO FOOT & ANKLE, .': ('TT ORTHO FOOT ANKLE', 'TOFA'),
+ 'TT PAIN RESIDENT 2 -- PGR 12345': ('TT PAIN RESIDENT 2', 'TPR2'),
+ 'CON NEUROSURGERY': ('CON NEUROSURGERY', 'CN'),
+ 'CON CARDIOTHROACIC SURGERY': ('CON CARDIOTHROACIC SURGERY', 'CCS'),
+ 'TT HAND SURGERY, .': ('TT HAND SURGERY', 'THS'),
+ 'TT ORTHO TUMOR, .': ('TT ORTHO TUMOR', 'TOT'),
+ 'CON LIVER TRANSPLANT': ('CON LIVER TRANSPLANT', 'CLT'),
+ 'TT NEUROSURGERY A, .': ('TT NEUROSURGERY A', 'TNA'),
+ 'CON ENT': ('CON ENT', 'CE'),
+ 'CON HOSPICE CONSULT': ('CON HOSPICE CONSULT', 'CHC'),
+ 'CON PLASTIC SURGERY': ('CON PLASTIC SURGERY', 'CPS'),
+ 'CON NEURO IR': ('CON NEURO IR', 'CNI'),
+ 'CON INF DIS': ('CON INF DIS', 'CID'),
+ 'CON INF DIS IMMUNOCOMP': ('CON INF DIS IMMUNOCOMP', 'CIDI'),
+ 'CON DERMATOLOGY': ('CON DERMATOLOGY', 'CD'),
+ 'CON OPHTHALMOLOGY': ('CON OPHTHALMOLOGY', 'CO'),
+ 'CON RHEUMATOLOGY': ('CON RHEUMATOLOGY', 'CR'),
+ 'CON UROLOGY': ('CON UROLOGY', 'CU'),
+ 'CON HAND SURGERY': ('CON HAND SURGERY', 'CHS'),
+ 'CON WOUND/OSTOMY/CONTINENCE RN': ('CON WOUND/OSTOMY/CONTINENCE RN', 'CWR'),
+ 'CON NEPHROLOGY ATTENDING': ('CON NEPHROLOGY ATTENDING', 'CNA'),
+ 'CON MEDICINE ADMISSION REQUEST': ('CON MEDICINE ADMISSION REQUEST', 'CMAR'),
+ 'CON ORTHOPEDICS': ('CON ORTHOPEDICS', 'CO'),
+ 'CON OBSTETRICS': ('CON OBSTETRICS', 'CO'),
+ 'CON NEURO ENDOCRINE CONSULT': ('CON NEURO ENDOCRINE CONSULT', 'CNEC'),
+ 'CON SPINE TRAUMA': ('CON SPINE TRAUMA', 'CST'),
+ 'CON MICU ADMISSION REQUEST': ('CON MICU ADMISSION REQUEST', 'CMAR'),
+ 'CON MEDICAL GENETICS': ('CON MEDICAL GENETICS', 'CMG'),
+ 'CON SURGERY CONSULT': ('CON SURGERY CONSULT', 'CSC'),
+ 'TT PAMF NON RESIDENT SURGERY': ('TT PAMF NON RESIDENT SURGERY', 'TPNRS'),
+ 'CON CARDIOL INTERVENT-AMI': ('CON CARDIOL INTERVENT-AMI', 'CCI'),
+ 'CON INF DIS POSTITIVE CARE': ('CON INF DIS POSTITIVE CARE', 'CIDPC'),
+ 'CON SLEEP': ('CON SLEEP', 'CS'),
+ 'CON ANESTHESIA CONSULT ADULT': ('CON ANESTHESIA CONSULT ADULT', 'CACA')
+}
+
+
+AGGR_NAME_TO_ACRONYM = {
+ 'Intern': ('', ''),
+ 'Cross Cover Intern': ('Cross Cover', 'CC'),
+ 'Wound/Ostomy/Continence RN': ('Wound/Ostomy/Continence RN', 'WR'),
+ 'Primary Intern': ('Primary', 'P'),
+ 'Primary Resident': ('Primary', 'P'),
+ 'Cross Cover Attending': ('Cross Cover', 'CC'),
+ 'Student Nurse': ('Student Nurse', 'SN'),
+ 'Clinical Pharmacist': ('Clinical Pharmacist', 'CP'),
+ 'Medical Assistant': ('Medical Assistant', 'MA'),
+ 'Licensed Vocational Nurse': ('Licensed Vocational Nurse', 'LVN'),
+ 'Clinical Nurse Specialist': ('Clinical Nurse Specialist', 'CNS'),
+ 'Cross Cover Fellow': ('Cross Cover Fellow', 'CCF'),
+ 'ED Unit Secretary': ('ED Unit Secretary', 'EUS'),
+ 'Primary Fellow': ('Primary', 'P'),
+ 'Cross Cover Resident': ('Cross Cover', 'CC'),
+ 'Consulting Attending': ('Consulting', 'C'),
+ 'Consulting Fellow': ('Consulting', 'C'),
+ 'Spiritual Care': ('Spiritual Care', 'SC'),
+ 'Consulting Med Student': ('Consulting', 'C'),
+ 'Primary Advanced Practice Provider': ('Primary', 'P'),
+ 'Physician Assistant': ('Primary', 'P'),
+ 'Consulting Resident': ('Consulting', 'C'),
+ 'Nurse Coordinator': ('Nurse Coordinator', 'NC'),
+ 'Fellow': ('Fellow', 'F'),
+ 'Consulting Intern': ('Consulting', 'C'),
+ 'Co-Attending': ('Co-Attending', 'C'),
+ 'Surgeon': ('Surgeon', 'S'),
+ 'Primary Med Student': ('Primary', 'P'),
+ 'ED Tech': ('ED Tech', 'ET'),
+ 'Resident': ('', ''),
+ 'Chief Resident': ('Chief', 'C'),
+ 'Medical Student': ('Medical Student', 'MS'),
+ 'Primary Medical Student': ('Primary', 'P'),
+ 'Pulmonologist': ('Pulmonologist', 'P'),
+ 'Pediatrician': ('Pediatrician', 'P'),
+ 'Hematologist': ('Hematologist', 'H'),
+ 'Primary Care Physician': ('Primary', 'P'),
+ 'Primary Physician Assistant': ('Primary', 'P'),
+ 'Cardiologist': ('Cardiologist', 'C'),
+ 'Triage Nurse': ('Triage Nurse', 'TN'),
+ 'Transplant Social Worker': ('Transplant Social Worker', 'TSW'),
+ 'Additional Communicating Provider': ('Additional Communicating Provider', 'ACP'),
+ 'ED Registrar': ('ED Registrar', 'ER'),
+ 'Gastroenterologist': ('Gastroenterologist', 'G'),
+ 'Medical Oncologist': ('Medical Oncologist', 'MO'),
+ 'Primary Sub-Intern': ('Primary', 'P'),
+ 'Lactation Consultant': ('Lactation Consultant', 'LC'),
+ 'Trauma Attending': ('Trauma', 'T'),
+ 'Post-Transplant Nurse': ('Post-Transplant Nurse', 'PN'),
+ 'Cross Cover Advanced Practice Provider ': ('Cross Cover Advanced Practice Provider', 'CCAPP'),
+ 'Internist': ('Internist', 'I'),
+ 'Nephrologist': ('Nephrologist', 'N'),
+ 'Research Coordinator': ('Research Coordinator', 'RC'),
+ 'Infectious Disease': ('Infectious Disease', 'ID'),
+ 'Trauma Resident ': ('Trauma', 'T'),
+ 'Primary Sub-intern': ('Primary', 'P'),
+ 'Neurologist': ('Neurologist', 'N'),
+ 'Transplant Surgeon': ('Transplant Surgeon', 'TS'),
+ 'Consulting Medical Oncologist': ('Consulting', 'C'),
+ 'Family Practitioner': ('Family Practitioner', 'FP'),
+ 'Dermatologist': ('Dermatologist', 'D'),
+ 'Aging Adult Services Coordinator': ('Aging Adult Services Coordinator', 'AASC'),
+ 'Transplant Nephrologist': ('Transplant Nephrologist', 'TN'),
+ 'Post-Transplant Nephrologist': ('Post-Transplant Nephrologist', 'PN'),
+ 'Consulting Surgical Oncologist': ('Consulting', 'C'),
+ 'Surgical Oncologist': ('Surgical Oncologist', 'SO'),
+ 'Nursery Nurse': ('Nursery Nurse', 'NN'),
+ 'Transplant Pharmacist': ('Transplant Pharmacist', 'TP'),
+ 'Psychologist': ('Psychologist', 'P'),
+ 'Restorative Aide': ('Restorative Aide', 'RA'),
+ 'Child Life Specialist': ('Child Life Specialist', 'CLS'),
+ 'Consulting Hematologist': ('Consulting', 'C'),
+ 'Endocrinologist': ('Endocrinologist', 'E'),
+ 'Electrophysiologist': ('Electrophysiologist', 'E'),
+ 'Anesthesiologist': ('Anesthesiologist', 'A'),
+ 'Transplant Dietitian': ('Transplant Dietitian', 'TD'),
+ 'Urologist': ('Urologist', 'U'),
+ 'stop0': ('stop0', 's'),
+ 'Radiation Oncologist': ('Radiation Oncologist', 'RO'),
+ 'Referring Provider': ('Referring Provider', 'RP'),
+ 'Activity Therapist': ('Activity Therapist', 'AT'),
+ 'Transplant Pulmonologist': ('Transplant Pulmonologist', 'TP'),
+ 'Obstetrician': ('Obstetrician', 'O'),
+ 'Heart Failure Cardiologist': ('Heart Failure Cardiologist', 'HFC'),
+ 'Post RN Coordinator': ('Post RN Coordinator', 'PRC'),
+ 'Delivery Assist': ('Delivery Assist', 'DA'),
+ 'Referring Nephrologist': ('Referring Nephrologist', 'RN'),
+ 'Hepatologist': ('Hepatologist', 'H'),
+ 'Case Manager': ('Case Manager', 'CM'),
+ 'Primary Team': ('Primary', 'P'),
+ 'Social Worker': ('Social Worker', 'SW'),
+ 'Care Coordinator': ('Care Coordinator', 'CC'),
+ 'Registered Nurse': ('Registered Nurse', 'RN'),
+ 'Speech Therapist': ('Speech Therapist', 'ST'),
+ 'Nursing Assistant': ('Nursing Assistant', 'NA'),
+ 'Clinical Dietitian': ('Clinical Dietitian', 'CD'),
+ 'Consulting Service': ('Consulting', 'C'),
+ 'Emergency Resident': ('Emergency', 'E'),
+ 'Nurse Practitioner': ('Primary', 'P'),
+ 'Physical Therapist': ('Physical Therapist', 'PT'),
+ 'Occupational Therapist': ('Occupational Therapist', 'OT'),
+ 'Physical Therapist Assistant': ('Physical Therapist Assistant', 'PTA'),
+ 'Respiratory Care Practitioner': ('Respiratory Care Practitioner', 'RCP'),
+ 'Independent Living Donor Advocate': ('Independent Living Donor Advocate', 'ILDA'),
+ 'Pre RN Coordinator': ('Pre RN Coordinator', 'PRC'),
+ 'Dietician Intern': ('Dietician', 'D'),
+ 'Survivorship Provider': ('Survivorship Provider', 'SP'),
+ 'Consulting Reconstructive Surgeon': ('Consulting', 'C'),
+ 'Referring Pulmonologist': ('Referring Pulmonologist', 'RP')
+}
+
+AGGR_PROV_TO_CLEAN_ACRONYM = {
+ 'SMITH, JOHN': ('', ''),
+ 'SMITH, JANE': ('', ''),
+ 'DOE, JOHN': ('', ''),
+ 'DOE, JANE': ('', ''),
+ 'CON CARDIOLOGY': ('CON CARDIOLOGY', 'CC'),
+ 'CON MEDICINE': ('CON MEDICINE', 'CM'),
+ 'CON PULMONARY': ('CON PULMONARY', 'CP'),
+ 'CON NEURO ICU': ('CON NEURO ICU', 'CNI'),
+ 'CON CARDIOL ARRHYTHMIA': ('CON CARDIOL ARRHYTHMIA', 'CCA'),
+ 'CON NEURO EPILEPSY CONSULT': ('CON NEURO EPILEPSY CONSULT', 'CNEC'),
+ 'CON NEPHROLOGY JAMISON': ('CON NEPHROLOGY JAMISON', 'CNJ'),
+ 'CON CARDIAC SURGERY': ('CON CARDIAC SURGERY', 'CCS'),
+ 'TT CVICU TEAM 2 - SPECTRAS 1-2345, 2-3456': ('TT CVICU TEAM', 'TCT'),
+ 'CON PAIN': ('CON PAIN', 'CP'),
+ 'CON ONCOLOGY': ('CON ONCOLOGY', 'CO'),
+ 'CON NEUROLOGY GENERAL': ('CON NEUROLOGY GENERAL', 'CNG'),
+ 'CON NEURO STROKE': ('CON NEURO STROKE', 'CNS'),
+ 'TT NEUROSURGERY C SPINE FLOOR, PGR 12345': ('TT NEUROSURGERY SPINE FLOOR', 'TNSF'),
+ 'CON NEPHROLOGY TRANSPLANT': ('CON NEPHROLOGY TRANSPLANT', 'CNT'),
+ 'TT ACUTE CARE SURGERY TRAUMA, PGR 12345': ('TT ACUTE CARE SURGERY TRAUMA', 'TACST'),
+ 'CON INTERNAL MEDICINE CONSULT': ('CON INTERNAL MEDICINE CONSULT', 'CIMC'),
+ 'CON ICU': ('CON ICU', 'CI'),
+ 'CON ALLERGY IMMUNOLOGY CONSULT': ('CON ALLERGY IMMUNOLOGY CONSULT', 'CAIC'),
+ 'TT CVICU TEAM 1 - SPECTRAS 1-2345, 2-3456': ('TT CVICU TEAM', 'TCT'),
+ 'TT NEUROSURGERY A VASCULAR FLOOR, PGR 12345': ('TT NEUROSURGERY VASCULAR FLOOR', 'TNVF'),
+ 'CON HEMATOLOGY': ('CON HEMATOLOGY', 'CH'),
+ 'CON ORTHOPEDICS HOSPITALIST': ('CON ORTHOPEDICS HOSPITALIST', 'COH'),
+ 'TT COLORECTAL SURGERY, PGR 12345': ('TT COLORECTAL SURGERY', 'TCS'),
+ 'CON THORACIC SURGERY': ('CON THORACIC SURGERY', 'CTS'),
+ 'TT NEUROSURGERY B TUMOR FLOOR, PGR 12345': ('TT NEUROSURGERY TUMOR FLOOR', 'TNTF'),
+ 'CON PULM TRANSPLANT': ('CON PULM TRANSPLANT', 'CPT'),
+ 'TT NEUROSURGERY B TUMOR ICU, PGR 12345': ('TT NEUROSURGERY TUMOR ICU', 'TNTI'),
+ 'CON HEPATOLOGY': ('CON HEPATOLOGY', 'CH'),
+ 'TT NEUROSURGERY C SPINE ICU, PGR 12345': ('TT NEUROSURGERY SPINE ICU', 'TNSI'),
+ 'TT PAIN, .': ('TT PAIN', 'TP'),
+ 'TT MICU GREEN RESIDENT A -- PGR 12345': ('TT MICU', 'TM'),
+ 'CON NEPHROLOGY MAFFLY': ('CON NEPHROLOGY MAFFLY', 'CNM'),
+ 'CON VASCULAR SURGERY': ('CON VASCULAR SURGERY', 'CVS'),
+ 'TT MED TX HEP RES B, PGR 12345': ('TT MED TX HEP', 'TMTH'),
+ 'TT GEN SURG WHITE - PAGER 12345': ('TT GEN SURG', 'TGS'),
+ 'CON PULMONARY REHAB CONSULT': ('CON PULMONARY REHAB CONSULT', 'CPRC'),
+ 'CON PAMF MEDICINE': ('CON PAMF MEDICINE', 'CPM'),
+ 'TT MED TX HEP RES A, PGR 12345': ('TT MED TX HEP', 'TMTH'),
+ 'CON PALLIATIVE CARE - PGR 12345': ('CON PALLIATIVE CARE', 'CPC'),
+ 'TT INTERVENTIONAL RADIOLOGY, .': ('TT INTERVENTIONAL RADIOLOGY', 'TIR'),
+ 'CON INTERVENT RAD': ('CON INTERVENT RAD', 'CIR'),
+ 'CON PULM HYPERTENSION': ('CON PULM HYPERTENSION', 'CPH'),
+ 'CON MICU CONSULT': ('CON MICU CONSULT', 'CMC'),
+ 'CON PRIMARY CARE': ('CON PRIMARY CARE', 'CPC'),
+ 'TT CARDIOLOGY 5A, .': ('TT CARDIOLOGY', 'TC'),
+ 'TT NEURO EPILEPSY MONITOR UNIT, .': ('TT NEURO EPILEPSY MONITOR UNIT', 'TNEMU'),
+ 'CON TRANSPLANT SURGERY': ('CON TRANSPLANT SURGERY', 'CTS'),
+ 'TT MICU BLUE RESIDENT A -- PGR 12345': ('TT MICU', 'TM'),
+ 'TT MED TX-HEP, .': ('TT MED TX-HEP', 'TMT'),
+ 'CON PSYCHIATRY': ('CON PSYCHIATRY', 'CP'),
+ 'TT BMT, .': ('TT BMT', 'TB'),
+ 'TT CARDIOLOGY 6B, .': ('TT CARDIOLOGY', 'TC'),
+ 'TT ORTHO TRAUMA, .': ('TT ORTHO TRAUMA', 'TOT'),
+ 'TT MED PAMF NON RESI': ('TT MED PAMF', 'TMP'),
+ 'TT GEN SURG RED - PAGER 12345': ('TT GEN SURG', 'TGS'),
+ 'TT CARDIOLOGY 6B INTERN -- PGR 12345': ('TT CARDIOLOGY', 'TC'),
+ 'TT NEUROLOGY, .': ('TT NEUROLOGY', 'TN'),
+ 'TT CARDIOLOGY 5B, .': ('TT CARDIOLOGY', 'TC'),
+ 'TT ONCOLOGY, .': ('TT ONCOLOGY', 'TO'),
+ 'TT MED DAY B, PGR 12345': ('TT MED DAY', 'TMD'),
+ 'CON GASTROENTEROLOGY': ('CON GASTROENTEROLOGY', 'CG'),
+ 'TT CARDIOLOGY 6A, .': ('TT CARDIOLOGY', 'TC'),
+ 'CON COLORECTAL SURGERY': ('CON COLORECTAL SURGERY', 'CCS'),
+ 'TT CARDIOLOGY INTERVENTIONAL -- PGR 12345': ('TT CARDIOLOGY INTERVENTIONAL', 'TCI'),
+ 'TT NEUROSURGERY A VASCULAR ICU, PGR 12345': ('TT NEUROSURGERY VASCULAR ICU', 'TNVI'),
+ 'TT GYN, .': ('TT GYN', 'TG'),
+ 'CON NEURO ONCOLOGY': ('CON NEURO ONCOLOGY', 'CNO'),
+ 'TT GYN ONC, .': ('TT GYN ONC', 'TGO'),
+ 'TT GEN SURG GOLD - PAGER 12345': ('TT GEN SURG', 'TGS'),
+ 'CON GERIATRICS': ('CON GERIATRICS', 'CG'),
+ 'TT HEMATOLOGY, .': ('TT HEMATOLOGY', 'TH'),
+ 'CON GYNECOLOGY': ('CON GYNECOLOGY', 'CG'),
+ 'CON ENDOCRINOLOGY': ('CON ENDOCRINOLOGY', 'CE'),
+ 'CON CRITICAL CARE CONSULT': ('CON CRITICAL CARE CONSULT', 'CCCC'),
+ 'TT NEUROSURGERY, .': ('TT NEUROSURGERY', 'TN'),
+ 'TT MED DAY A, PGR 12345': ('TT MED DAY', 'TMD'),
+ 'CON GENERAL SURGERY': ('CON GENERAL SURGERY', 'CGS'),
+ 'TT ONCOLOGY NP, PGR 12345': ('TT ONCOLOGY', 'TO'),
+ 'TT HEMATOLOGY NP A, PGR 12345': ('TT HEMATOLOGY', 'TH'),
+ 'TT PULMONARY TRANSPLANT, .': ('TT PULMONARY TRANSPLANT', 'TPT'),
+ 'CON KIDNEY TRANSPLANT': ('CON KIDNEY TRANSPLANT', 'CKT'),
+ 'CON CARD INTERVEN/AMI CONSULT': ('CON CARD INTERVEN/AMI CONSULT', 'CCIC'),
+ 'CON CARDIOL TRANSPLANT': ('CON CARDIOL TRANSPLANT', 'CCT'),
+ 'TT ORTHO SURGERY, .': ('TT ORTHO SURGERY', 'TOS'),
+ 'CON CARDIOLOGY ADMISSION REQUEST': ('CON CARDIOLOGY ADMISSION REQUEST', 'CCAR'),
+ 'TT PLASTIC SURGERY, .': ('TT PLASTIC SURGERY', 'TPS'),
+ 'TT HEART LUNG TRANSPLANT, .': ('TT HEART LUNG TRANSPLANT', 'THLT'),
+ 'TT UROLOGY, .': ('TT UROLOGY', 'TU'),
+ 'CON CYSTIC FIBROSIS ADULT': ('CON CYSTIC FIBROSIS ADULT', 'CCFA'),
+ 'TT CARDIOLOGY INTERVENTIONAL, .': ('TT CARDIOLOGY INTERVENTIONAL', 'TCI'),
+ 'TT CYSTIC FIBROSIS ADULT, .': ('TT CYSTIC FIBROSIS ADULT', 'TCFA'),
+ 'TT ENT HEAD NECK, .': ('TT ENT HEAD NECK', 'TEHN'),
+ 'TT ORTHO SPINE, .': ('TT ORTHO SPINE', 'TOS'),
+ 'TT NEUROSURGERY C, .': ('TT NEUROSURGERY', 'TN'),
+ 'TT NEUROSURGERY B, .': ('TT NEUROSURGERY', 'TN'),
+ 'TT ENT SPECIALTY, .': ('TT ENT SPECIALTY', 'TES'),
+ 'TT HEART TRANSPLANT/VAD -- PGR 12345': ('TT HEART TRANSPLANT/VAD', 'THT'),
+ 'TT CARDIOLOGY ARRHYTHMIA, .': ('TT CARDIOLOGY ARRHYTHMIA', 'TCA'),
+ 'TT ORTHO JOINT, .': ('TT ORTHO JOINT', 'TOJ'),
+ 'TT ORTHO FOOT & ANKLE, .': ('TT ORTHO FOOT ANKLE', 'TOFA'),
+ 'TT PAIN RESIDENT 2 -- PGR 12345': ('TT PAIN', 'TP'),
+ 'CON NEUROSURGERY': ('CON NEUROSURGERY', 'CN'),
+ 'CON CARDIOTHROACIC SURGERY': ('CON CARDIOTHROACIC SURGERY', 'CCS'),
+ 'TT HAND SURGERY, .': ('TT HAND SURGERY', 'THS'),
+ 'TT ORTHO TUMOR, .': ('TT ORTHO TUMOR', 'TOT'),
+ 'CON LIVER TRANSPLANT': ('CON LIVER TRANSPLANT', 'CLT'),
+ 'TT NEUROSURGERY A, .': ('TT NEUROSURGERY', 'TN'),
+ 'CON ENT': ('CON ENT', 'CE'),
+ 'CON HOSPICE CONSULT': ('CON HOSPICE CONSULT', 'CHC'),
+ 'CON PLASTIC SURGERY': ('CON PLASTIC SURGERY', 'CPS'),
+ 'CON NEURO IR': ('CON NEURO IR', 'CNI'),
+ 'CON INF DIS': ('CON INF DIS', 'CID'),
+ 'CON INF DIS IMMUNOCOMP': ('CON INF DIS IMMUNOCOMP', 'CIDI'),
+ 'CON DERMATOLOGY': ('CON DERMATOLOGY', 'CD'),
+ 'CON OPHTHALMOLOGY': ('CON OPHTHALMOLOGY', 'CO'),
+ 'CON RHEUMATOLOGY': ('CON RHEUMATOLOGY', 'CR'),
+ 'CON UROLOGY': ('CON UROLOGY', 'CU'),
+ 'CON HAND SURGERY': ('CON HAND SURGERY', 'CHS'),
+ 'CON WOUND/OSTOMY/CONTINENCE RN': ('CON WOUND/OSTOMY/CONTINENCE RN', 'CWR'),
+ 'CON NEPHROLOGY ATTENDING': ('CON NEPHROLOGY', 'CN'),
+ 'CON MEDICINE ADMISSION REQUEST': ('CON MEDICINE ADMISSION REQUEST', 'CMAR'),
+ 'CON ORTHOPEDICS': ('CON ORTHOPEDICS', 'CO'),
+ 'CON OBSTETRICS': ('CON OBSTETRICS', 'CO'),
+ 'CON NEURO ENDOCRINE CONSULT': ('CON NEURO ENDOCRINE CONSULT', 'CNEC'),
+ 'CON SPINE TRAUMA': ('CON SPINE TRAUMA', 'CST'),
+ 'CON MICU ADMISSION REQUEST': ('CON MICU ADMISSION REQUEST', 'CMAR'),
+ 'CON MEDICAL GENETICS': ('CON MEDICAL GENETICS', 'CMG'),
+ 'CON SURGERY CONSULT': ('CON SURGERY CONSULT', 'CSC'),
+ 'TT PAMF NON RESIDENT SURGERY': ('TT PAMF SURGERY', 'TPS'),
+ 'CON CARDIOL INTERVENT-AMI': ('CON CARDIOL INTERVENT-AMI', 'CCI'),
+ 'CON INF DIS POSTITIVE CARE': ('CON INF DIS POSTITIVE CARE', 'CIDPC'),
+ 'CON SLEEP': ('CON SLEEP', 'CS'),
+ 'CON ANESTHESIA CONSULT ADULT': ('CON ANESTHESIA CONSULT ADULT', 'CACA')
+}
+
+
+class TestSTARRTreatmentTeamConversion(DBTestCase):
+ TEST_DATA_SIZE = 50
+
+ test_data = []
+ expected_data = []
+
+ test_data_csv = tempfile.gettempdir() + '/test_starr_treatment_team_dummy_data.csv'
+
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self)
+
+ log.info("Sourcing from BigQuery DB")
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata()
+
+ self.converter = STARRTreatmentTeamConversion.STARRTreatmentTeamConversion() # Instance to test on
+ self.bqConn = self.converter.bqConn
+ self.starrUtil = STARRUtil.StarrCommonUtils(self.converter.bqClient)
+
+ # point the converter to dummy source table
+ STARRTreatmentTeamConversion.SOURCE_TABLE = TEST_SOURCE_TABLE
+
+ log.warn("Removing test table, if exists: {}".format(TEST_SOURCE_TABLE))
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DROP TABLE IF EXISTS {};'.format(TEST_SOURCE_TABLE))
+
+ def generate_test_and_expected_data(self, test_data_size, aggregate):
+ for curr_row in range(test_data_size):
+ patient_id = 'JC' + format(curr_row, '06')
+ test_data_row = self.generate_test_data_row(curr_row, self.starrUtil.random_period(), patient_id)
+ self.test_data.append(test_data_row)
+ self.generate_expected_data_rows(test_data_row, self.expected_data, aggregate)
+
+ # pi.external_id desc (ci.external_id is always None, so not included here)
+ self.expected_data.sort(key=lambda tup: (-tup[0]))
+
+ log.debug('test_data: {}'.format(self.test_data))
+ log.debug('expected_data: {}'.format(self.expected_data))
+
+ @staticmethod
+ def generate_test_data_row(curr_row, treatment_period, patient_id):
+ return (
+ 'SS' + format(curr_row, '07'),
+ patient_id,
+ curr_row,
+ datetime.fromtimestamp(treatment_period[0]),
+ datetime.fromtimestamp(treatment_period[1]),
+ list(NAME_TO_ACRONYM.keys())[random.randint(0, len(NAME_TO_ACRONYM) - 1)],
+ list(PROV_TO_CLEAN_ACRONYM.keys())[random.randint(0, len(PROV_TO_CLEAN_ACRONYM) - 1)],
+ datetime.fromtimestamp(treatment_period[0], tz=pytz.UTC),
+ )
+
+ def generate_expected_data_rows(self, row, expected_data, aggregate):
+ if not aggregate:
+ expected_row = (
+ self.starrUtil.convertPatIdToSTRIDE(row[0]),
+ self.starrUtil.convertPatIdToSTRIDE(row[1]),
+ row[2],
+ STARRTreatmentTeamConversion.CATEGORY_TEMPLATE,
+ None,
+ NAME_TO_ACRONYM[row[5]] if PROV_TO_CLEAN_ACRONYM[row[6]][1] == ''
+ else PROV_TO_CLEAN_ACRONYM[row[6]][1] + ' (' + NAME_TO_ACRONYM[row[5]] + ')',
+ row[5].strip() if PROV_TO_CLEAN_ACRONYM[row[6]][1] == ''
+ else PROV_TO_CLEAN_ACRONYM[row[6]][0].title() + ' (' + row[5].strip() + ')',
+ row[3].replace(tzinfo=pytz.UTC),
+ row[7].replace(tzinfo=pytz.UTC),
+ )
+ else:
+ expected_row = (
+ self.starrUtil.convertPatIdToSTRIDE(row[0]),
+ self.starrUtil.convertPatIdToSTRIDE(row[1]),
+ row[2],
+ STARRTreatmentTeamConversion.CATEGORY_TEMPLATE,
+ None,
+ AGGR_NAME_TO_ACRONYM[row[5]][1]
+ if AGGR_PROV_TO_CLEAN_ACRONYM[row[6]][1] == ''
+ else AGGR_PROV_TO_CLEAN_ACRONYM[row[6]][1] + ' (' + AGGR_NAME_TO_ACRONYM[row[5]][1] + ')',
+ AGGR_NAME_TO_ACRONYM[row[5]][0]
+ if AGGR_PROV_TO_CLEAN_ACRONYM[row[6]][1] == ''
+ else AGGR_PROV_TO_CLEAN_ACRONYM[row[6]][0].title() + ' (' + AGGR_NAME_TO_ACRONYM[row[5]][0] + ')',
+ row[3].replace(tzinfo=pytz.UTC),
+ row[7].replace(tzinfo=pytz.UTC)
+ )
+
+ expected_data.append(expected_row)
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ self.test_data[:] = []
+ self.expected_data[:] = []
+ os.remove(self.test_data_csv)
+
+ log.info("Purge test records from the database")
+
+ DBUtil.execute(
+ """delete from patient_item
+ where clinical_item_id in
+ ( select clinical_item_id
+ from clinical_item as ci, clinical_item_category as cic
+ where ci.clinical_item_category_id = cic.clinical_item_category_id
+ and cic.source_table = '%s'
+ )
+ """ % TEST_SOURCE_TABLE
+ )
+ DBUtil.execute(
+ """delete from clinical_item
+ where clinical_item_category_id in
+ ( select clinical_item_category_id
+ from clinical_item_category
+ where source_table = '%s'
+ )
+ """ % TEST_SOURCE_TABLE
+ )
+ DBUtil.execute("delete from clinical_item_category where source_table = '%s';" % TEST_SOURCE_TABLE)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute('DELETE FROM %s.patient_item WHERE true;' % TEST_DEST_DATASET)
+ bq_cursor.execute('DELETE FROM %s.clinical_item WHERE true;' % TEST_DEST_DATASET)
+ bq_cursor.execute('DELETE FROM %s.clinical_item_category WHERE true;' % TEST_DEST_DATASET)
+
+ bq_cursor.execute('DROP TABLE %s;' % TEST_SOURCE_TABLE)
+
+ DBTestCase.tearDown(self)
+
+ @parameterized.expand([
+ ["without_aggregation", False],
+ ["with_aggregation", True]
+ ])
+ def test_dataConversion(self, name, aggregation):
+ log.info("Generating test source data")
+ self.generate_test_and_expected_data(self.TEST_DATA_SIZE, aggregate=aggregation)
+ self.starrUtil.dump_test_data_to_csv(self.converter.HEADERS, self.test_data, self.test_data_csv)
+ self.starrUtil.upload_csv_to_bigquery('starr_datalake2018', 'treatment_team', TEST_DEST_DATASET,
+ 'starr_treatment_team', self.test_data_csv, self.converter.HEADERS)
+
+ log.debug("Run the conversion process...")
+ conv_options = STARRTreatmentTeamConversion.ConversionOptions()
+ conv_options.aggregate = aggregation
+ temp_dir = tempfile.gettempdir()
+ self.converter.convertAndUpload(conv_options, tempDir=temp_dir, targetDatasetId=TEST_DEST_DATASET)
+
+ # Just query back for the same data, de-normalizing the data back to a general table
+ test_query = \
+ """
+ select
+ pi.external_id as pi_external_id,
+ pi.patient_id,
+ pi.encounter_id,
+ cic.description as cic_description,
+ ci.external_id as ci_external_id,
+ ci.name,
+ ci.description as ci_description,
+ pi.item_date,
+ pi.item_date_utc
+ from
+ %s.patient_item as pi,
+ %s.clinical_item as ci,
+ %s.clinical_item_category as cic
+ where
+ pi.clinical_item_id = ci.clinical_item_id and
+ ci.clinical_item_category_id = cic.clinical_item_category_id and
+ cic.source_table = '%s'
+ order by
+ pi.external_id desc, ci.external_id desc
+ """ % (TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_DEST_DATASET, TEST_SOURCE_TABLE)
+
+ bq_cursor = self.bqConn.cursor()
+ bq_cursor.execute(test_query)
+ actual_data = [list(row.values()) for row in bq_cursor.fetchall()]
+ log.debug('actual data: {}'.format(actual_data))
+ log.debug('expected data: {}'.format(self.expected_data))
+ self.assertEqualTable(self.expected_data, actual_data)
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ test_suite = unittest.TestSuite()
+ test_suite.addTest(unittest.makeSuite(TestSTARRTreatmentTeamConversion))
+
+ return test_suite
+
+
+if __name__ == "__main__":
+ log.setLevel(logging.INFO) # without this no logs are printed
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/starr_conv/test/__init__.py b/medinfo/dataconversion/starr_conv/test/__init__.py
new file mode 100644
index 00000000..4e16c564
--- /dev/null
+++ b/medinfo/dataconversion/starr_conv/test/__init__.py
@@ -0,0 +1 @@
+# Nothing much for now, just enable importing of various modules as a common package
diff --git a/medinfo/dataconversion/support/__init__.py b/medinfo/dataconversion/support/__init__.py
new file mode 100644
index 00000000..4e16c564
--- /dev/null
+++ b/medinfo/dataconversion/support/__init__.py
@@ -0,0 +1 @@
+# Nothing much for now, just enable importing of various modules as a common package
diff --git a/medinfo/dataconversion/support/extractExcelSheets.py b/medinfo/dataconversion/support/extractExcelSheets.py
new file mode 100644
index 00000000..66d4f30e
--- /dev/null
+++ b/medinfo/dataconversion/support/extractExcelSheets.py
@@ -0,0 +1,42 @@
+"""Quick support script to input an Excel file and then dump out all of the worksheet data as separate tab delimited files
+"""
+
+import sys, os;
+import openpyxl; # Open source library for reading Excel files in Python. Install with "python -m pip install openpyxl"
+import csv;
+
+
+def extractExcelSheets(inFilename):
+ # Open the Excel workbook
+ wb = openpyxl.load_workbook(inFilename)
+ generatedFileList = list();
+ for sheetName in wb.get_sheet_names():
+ # Pull out one worksheet at a time
+ ws = wb.get_sheet_by_name(sheetName);
+
+ # Create a separate output file, name based on input file and worksheet name, to dump contents as CSV
+ outFilename = os.path.splitext(inFilename)[0] +"."+ sheetName +".tsv";
+ fileout = open(outFilename,"w");
+ writer = csv.writer(fileout, dialect=csv.excel_tab);
+
+ # Iterate through worksheet data values and output to TSV file
+ for row in ws.values:
+ #print row
+ row = list(row); # Convert to a modifiable list
+ for i, value in enumerate(row):
+ if isinstance(value, str): # Clean up string values by replacing non-ascii characters (e.g., \xa0 = non-breaking space)
+ row[i] = value.replace('\xa0', ' ');
+ writer.writerow(row);
+
+ fileout.close();
+ generatedFileList.append(outFilename);
+ return generatedFileList;
+
+def main(argv):
+ inFilename = argv[1];
+ generatedFileList = extractExcelSheets(inFilename);
+ for item in generatedFileList:
+ print(item);
+
+if __name__ == "__main__":
+ main(sys.argv);
\ No newline at end of file
diff --git a/medinfo/dataconversion/support/patchHeader.py b/medinfo/dataconversion/support/patchHeader.py
index cfa07b57..67ecf0eb 100644
--- a/medinfo/dataconversion/support/patchHeader.py
+++ b/medinfo/dataconversion/support/patchHeader.py
@@ -22,7 +22,7 @@
## Example Usage:
python patchHeader.py originalFile.txt headerFile.txt
<<>>
-python patchHEader.py originalFile.txt patchedFile.txt headerFile.txt
+python patchHeader.py originalFile.txt patchedFile.txt headerFile.txt
"""
import sys;
diff --git a/medinfo/dataconversion/test/EventDigraphTestData.py b/medinfo/dataconversion/test/EventDigraphTestData.py
new file mode 100644
index 00000000..a6ec4b5e
--- /dev/null
+++ b/medinfo/dataconversion/test/EventDigraphTestData.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+"""
+Test input and output for EventDigraph.
+"""
+
+from medinfo.db import DBUtil
+
+# { 'test_db_table' : 'test_data' }
+ED_TEST_INPUT_TABLES = {
+ 'clinical_item_category' :
+ "clinical_item_category_id\tsource_table\tdescription\n\
+ -100\tTestTable\tTest Category 1\n\
+ -200\tTestTable\tTest Category 2\n\
+ -300\tTestTable\tTest Category 3\n\
+ -400\tTestTable\tTest Category 4\n\
+ -500\tTestTable\tTest Category 5\n",
+ 'clinical_item' :
+ "clinical_item_id\tname\tdescription\tclinical_item_category_id\n\
+ -100\tTest Item 100\tTest Item 100\t-100\n\
+ -200\tTest Item 200\tTest Item 200\t-100\n\
+ -300\tTest Item 300\tTest Item 300\t-200\n\
+ -400\tTest Item 400\tTest Item 400\t-200\n\
+ -500\tTest Item 500\tTest Item 500\t-300\n\
+ -600\tTest Item 600\tTest Item 600\t-300\n\
+ -700\tTest Item 700\tTest Item 700\t-400\n\
+ -800\tTest Item 800\tTest Item 800\t-400\n\
+ -900\tTest Item 900\tTest Item 900\t-500\n\
+ -1000\tTest Item 1000\tTest Item 1000\t-500\n",
+ 'patient_item' :
+ "patient_item_id\tpatient_id\tclinical_item_id\titem_date\n\
+ -100\t-123\t-1000\t1/6/2113 10:20\n\
+ -200\t-234\t-900\t2/6/2113 11:20\n\
+ -300\t-345\t-800\t3/7/2113 11:20\n\
+ -400\t-123\t-1000\t4/6/2113 10:20\n\
+ -500\t-234\t-900\t5/6/2113 11:20\n\
+ -600\t-345\t-800\t6/6/2113 12:40\n\
+ -700\t-456\t-700\t7/7/2113 12:40\n\
+ -800\t-123\t-600\t8/8/2113 12:40\n\
+ -900\t-234\t-900\t9/9/2113 12:40\n\
+ -1000\t-345\t-800\t10/10/2113 12:40\n\
+ -1100\t-456\t-700\t11/11/2113 12:40\n\
+ -1200\t-567\t-600\t12/12/2113 12:40\n\
+ -1300\t-678\t-500\t1/13/2114 12:40\n\
+ -1400\t-789\t-400\t2/14/2114 12:40\n\
+ -1500\t-789\t-300\t3/15/2114 12:40\n\
+ -1600\t-678\t-200\t4/16/2114 12:40\n\
+ -1700\t-567\t-500\t5/17/2114 12:40\n\
+ -1800\t-456\t-300\t6/18/2114 12:40\n\
+ -1900\t-345\t-400\t7/19/2114 12:40\n\
+ -2000\t-567\t-100\t8/20/2114 12:40\n"
+}
+
+# { 'test_function_name' : { 'test_assertion' : 'test_output' } }
+ED_TEST_OUTPUT_TABLES = {
+ 'test_init' : {
+ 'category_nodes' : [
+ ('Test Category 1', {'count': 2}),
+ ('Test Category 2', {'count': 4}),
+ ('Test Category 3', {'count': 4}),
+ ('Test Category 4', {'count': 5}),
+ ('Test Category 5', {'count': 5})
+ ],
+ 'category_edges' : [
+ (('Test Category 2', 'Test Category 2'), {'count': 1}),
+ (('Test Category 3', 'Test Category 1'), {'count': 2}),
+ (('Test Category 3', 'Test Category 3'), {'count': 1}),
+ (('Test Category 4', 'Test Category 2'), {'count': 2}),
+ (('Test Category 4', 'Test Category 4'), {'count': 3}),
+ (('Test Category 5', 'Test Category 3'), {'count': 1}),
+ (('Test Category 5', 'Test Category 5'), {'count': 3})
+ ],
+ 'item_nodes' : [
+ ('Test Item 100', {'count': 1}),
+ ('Test Item 1000', {'count': 2}),
+ ('Test Item 200', {'count': 1}),
+ ('Test Item 300', {'count': 2}),
+ ('Test Item 400', {'count': 2}),
+ ('Test Item 500', {'count': 2}),
+ ('Test Item 600', {'count': 2}),
+ ('Test Item 700', {'count': 2}),
+ ('Test Item 800', {'count': 3}),
+ ('Test Item 900', {'count': 3})
+ ],
+ 'item_edges' : [
+ (('Test Item 1000', 'Test Item 1000'), {'count': 1}),
+ (('Test Item 1000', 'Test Item 600'), {'count': 1}),
+ (('Test Item 400', 'Test Item 300'), {'count': 1}),
+ (('Test Item 500', 'Test Item 100'), {'count': 1}),
+ (('Test Item 500', 'Test Item 200'), {'count': 1}),
+ (('Test Item 600', 'Test Item 500'), {'count': 1}),
+ (('Test Item 700', 'Test Item 300'), {'count': 1}),
+ (('Test Item 700', 'Test Item 700'), {'count': 1}),
+ (('Test Item 800', 'Test Item 400'), {'count': 1}),
+ (('Test Item 800', 'Test Item 800'), {'count': 2}),
+ (('Test Item 900', 'Test Item 900'), {'count': 2})
+
+
+ ]
+ }
+}
diff --git a/medinfo/dataconversion/test/FMTransformTestData.py b/medinfo/dataconversion/test/FMTransformTestData.py
new file mode 100644
index 00000000..10f7e27f
--- /dev/null
+++ b/medinfo/dataconversion/test/FMTransformTestData.py
@@ -0,0 +1,299 @@
+#!/usr/bin/python
+"""
+Test input and output for FeatureMatrixTransform.
+"""
+
+import pandas as pd
+
+MANUAL_FM_TEST_CASE = {
+ # Ensure input matrix has each of the following data types:
+ # * integer
+ # * float
+ # * True/False
+ # * string
+ # * timestamp
+ 'input': pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, None, 3.0, 3.5, None, 4.5, 5.0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_remove_feature: Remove f2.
+ "test_remove_feature": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_filter_on_feature: Filter out 'None' from f2
+ 'test_filter_on_feature': pd.DataFrame({
+ 'patient_id': [1, 2, 3, 2, 3, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'N', 'Y', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 500, 600, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, 3.0, 3.5, 4.5, 5.0],
+ 'f3': [True, None, True, True, False, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', None, 'Baz', 'Bar', None]
+ }),
+ # test_mean_data_imputation: Impute mean of f2.
+ "test_mean_data_imputation": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, 2.9285714286, 3.0, 3.5, 2.9285714286, 4.5, 5.0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_mode_data_imputation: Impute mode of f4.
+ "test_mode_data_imputation_single_feature": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, None, 3.0, 3.5, None, 4.5, 5.0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', 'Foo', 'Baz', 'Foo', 'Bar', 'Foo']
+ }),
+ "test_mode_data_imputation_all_features": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, 1.0, 3.0, 3.5, 1.0, 4.5, 5.0],
+ 'f3': [True, True, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', 'Foo', 'Baz', 'Foo', 'Bar', 'Foo']
+ }),
+ # test_add_logarithm_feature: Add log(f2).
+ "test_add_logarithm_feature": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, 2.9285714286, 3.0, 3.5, 2.9285714286, 4.5, 5.0],
+ 'ln(f2)': [0.0, 0.40546510810816438, 0.69314718055994529,
+ 1.0745147370988053, 1.0986122886681098, 1.2527629684953681,
+ 1.0745147370988053, 1.5040773967762742, 1.6094379124341003],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_add_indicator_feature: Add indicator(f2).
+ "test_add_indicator_feature": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, None, 3.0, 3.5, None, 4.5, 5.0],
+ 'I(f2)': [1, 1, 1, 0, 1, 1, 0, 1, 1],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_add_threshold_feature: Add threshold(f2, upper_bound=3.5)
+ 'test_add_threshold_feature': pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, None, 3.0, 3.5, None, 4.5, 5.0],
+ 'I(f2<=3.5)': [1, 1, 1, 0, 1, 1, 0, 0, 0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_add_change_interval_feature: Add change(interval, 0.5, patient_id, f2)
+ 'test_add_change_interval_feature': pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, None, 3.0, 3.5, None, 4.5, 5.0],
+ 'unchanged_yn': [1, 0, 0, 9999999, 0, 0, 9999999, 0, 0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_add_change_percent_feature: Add change(percent, 0.35, patient_id, f2)
+ 'test_add_change_percent_feature': pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, None, 3.0, 3.5, None, 4.5, 5.0],
+ 'unchanged_yn': [1, 1, 1, 9999999, 0, 1, 9999999, 0, 0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_add_change_sd_feature: Add change(sd, 1, patient_id, f2)
+ 'test_add_change_sd_feature': pd.DataFrame({
+ 'patient_id': [2, 3, 1, 2, 1, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'N', 'Y', 'N', 'N', 'Y'],
+ 'f1': [200, 300, 400, 500, 700, 900],
+ 'f2': [1.5, 2.0, None, 3.0, None, 5.0],
+ 'unchanged_yn': [1, 0, 9999999, 0, 9999999, 0],
+ 'f3': [None, True, False, True, True, True],
+ 'f4': ['Bar', 'Baz', 'Foo', None, 'Foo', None]
+ }),
+ # test_zero_data_imputation: Impute zero(f2).
+ "test_zero_data_imputation": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, 0.0, 3.0, 3.5, 0.0, 4.5, 5.0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ # test_median_data_imputation: Impute zero(f2).
+ "test_median_data_imputation": pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, 3.0, 3.0, 3.5, 3.0, 4.5, 5.0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ }),
+ 'test_distribution_data_imputation': pd.DataFrame({
+ 'patient_id': [1, 2, 3, 1, 2, 3, 1, 2, 3],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 01:00:00'),
+ pd.Timestamp('2018-01-02 02:00:00'),
+ pd.Timestamp('2018-01-03 03:00:00'),
+ pd.Timestamp('2018-01-04 04:00:00'),
+ pd.Timestamp('2018-01-05 05:00:00'),
+ pd.Timestamp('2018-01-06 06:00:00'),
+ pd.Timestamp('2018-01-07 07:00:00'),
+ pd.Timestamp('2018-01-08 08:00:00'),
+ pd.Timestamp('2018-01-09 09:00:00')],
+ 'output': ['Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'Y', 'Y'],
+ 'f1': [100, 200, 300, 400, 500, 600, 700, 800, 900],
+ 'f2': [1.0, 1.5, 2.0, 0.60648508830534575, 3.0, 3.5, 0.60648508830534575, 4.5, 5.0],
+ 'f3': [True, None, True, False, True, False, True, False, True],
+ 'f4': ['Foo', 'Bar', 'Baz', 'Foo', None, 'Baz', 'Foo', 'Bar', None]
+ })
+}
diff --git a/medinfo/dataconversion/test/FeatureMatrixIOTestData.py b/medinfo/dataconversion/test/FeatureMatrixIOTestData.py
new file mode 100644
index 00000000..1db72766
--- /dev/null
+++ b/medinfo/dataconversion/test/FeatureMatrixIOTestData.py
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+"""
+Test data for TestFeatureMatrixIO.
+"""
+
+import datetime
+import pandas as pd
+
+MANUAL_TEST_CASE = {
+ 'custom_header': [
+ 'test-matrix-with-header.tab',
+ '',
+ 'This matrix file is for testing only.',
+ "Doesn't contain anything of value."
+ ],
+ 'default_header': [
+ 'header-temp-file.tab',
+ 'Created: %s' % datetime.datetime.today().date()
+ ],
+ 'matrix_no_header': pd.DataFrame({
+ 'patient_id': [1, 2, 3, 4, 5],
+ 'index_time': [
+ pd.Timestamp('2018-01-01 12:00:00'),
+ pd.Timestamp('2018-01-01 12:00:00'),
+ pd.Timestamp('2018-01-01 12:00:00'),
+ pd.Timestamp('2018-01-01 12:00:00'),
+ pd.Timestamp('2018-01-01 12:00:00'),
+ ],
+ 'label': [True, False, True, False, True],
+ 'f1': [1.0, 2.0, 3.0, 4.0, 5.0],
+ 'f2': [1, 0, 1, 1, 0],
+ 'f3': [False, True, False, True, False],
+ 'f4': ["Foo", "Bar", "Baz", "Foo", "Bar"]
+ },
+ # Specify ordering of columns because pandas alphabetizes by default.
+ columns=['patient_id', 'index_time', 'label', 'f1', 'f2', 'f3', 'f4'])
+}
diff --git a/medinfo/dataconversion/test/FeatureMatrixTestData.py b/medinfo/dataconversion/test/FeatureMatrixTestData.py
index 37c018b6..442427f6 100644
--- a/medinfo/dataconversion/test/FeatureMatrixTestData.py
+++ b/medinfo/dataconversion/test/FeatureMatrixTestData.py
@@ -160,7 +160,7 @@
-4000\t1\t10/5/2213 17:00\tBaz\t10\tMed\tN\n",
"stride_flowsheet" :
"pat_anon_id\tflo_meas_id\tflowsheet_name\tflowsheet_value\t\
- shifted_record_dt_tm\n\
+ shifted_dt_tm\n\
-123\t-1\tFiO2\t0.2\t4/6/2009 6:36\n\
-123\t-1\tFiO2\t0\t4/6/2009 16:34\n\
-123\t-2\tGlasgow Coma Scale Score\t2.1\t4/6/2009 15:12\n\
@@ -292,7 +292,7 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38198.8472222", "1",
+ "38198.84722222222", "1",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -315,7 +315,7 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38228.8055556", "1",
+ "38228.805555555555", "1",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -338,7 +338,7 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38209.2222222", "1",
+ "38209.22222222222", "1",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -361,7 +361,7 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38210.2222222", "1",
+ "38210.22222222222", "1",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -374,7 +374,7 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38168.8055556", "1",
+ "38168.805555555555", "1",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -397,7 +397,7 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38180.1805556", "1",
+ "38180.180555555555", "1",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -420,7 +420,7 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38167.8055556", "2",
+ "38167.805555555555", "2",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -430,7 +430,113 @@
"0", "0", "0",
"0", "0", "0",
"0", "0",
- "38167.8472222", "1",
+ "38167.84722222222", "1",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0"
+ ]
+ ],
+ "test_buildFeatureMatrix_prePostFeatures" : [
+ [
+ "pat_id", "order_proc_id", "proc_code", "order_time", "normal_results",
+ "TestItem100.preTimeDays", "TestItem100.pre",
+ "TestItem100.pre.1d", "TestItem100.pre.2d", "TestItem100.pre.4d",
+ "TestItem100.pre.7d", "TestItem100.pre.14d", "TestItem100.pre.30d",
+ "TestItem100.pre.90d", "TestItem100.pre.180d", "TestItem100.pre.365d",
+ "TestItem100.pre.730d", "TestItem100.pre.1460d",
+ "TestItem200.postTimeDays", "TestItem200.post",
+ "TestItem200.post.1d", "TestItem200.post.2d", "TestItem200.post.4d",
+ "TestItem200.post.7d", "TestItem200.post.14d", "TestItem200.post.30d",
+ "TestItem200.post.90d", "TestItem200.post.180d", "TestItem200.post.365d",
+ "TestItem200.post.730d", "TestItem200.post.1460d"
+ ],
+ [
+ "-789", "-900", "LABMETB", "2009-05-06 15:00:00", "0",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0",
+ "38198.84722222222", "1",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0"
+ ],
+ [
+ "-789", "-800", "LABMETB", "2009-04-06 16:00:00", "0",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0",
+ "38228.805555555555", "1",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0"
+ ],
+ [
+ "-789", "-750", "LABMETB", "2009-04-26 06:00:00", "1",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0",
+ "38209.22222222222", "1",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0"
+ ],
+ [
+ "-789", "-700", "LABMETB", "2009-04-25 06:00:00", "1",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0",
+ "38210.22222222222", "1",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0"
+ ],
+ [
+ "-456", "-600", "LABMETB", "2009-05-06 15:00:00", "1",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0"
+ ],
+ [
+ "-456", "-400", "LABMETB", "2009-04-25 06:00:00", "1",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0"
+ ],
+ [
+ "-123", "-300", "LABMETB", "2009-04-06 15:00:00", "0",
+ "None", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0", "0",
+ "0", "0",
+ "38167.84722222222", "1",
"0", "0", "0",
"0", "0", "0",
"0", "0", "0",
@@ -537,9 +643,9 @@
"None", "None", "None", "None", "None",
"None", "None", "None", "None",
"None",
- "3", "2", "0.3", "1.0", "0.7",
- "0.666666666667", "0.286744175568", "1.0", "0.7", "-0.3",
- "-0.0151898734177", "0.7", "-30.125", "-10.375", "-10.375",
+ 3, 2, 0.3, 1.0, 0.7,
+ 0.6666666666666666, 0.28674417556808757, 1.0, 0.7, -0.3,
+ -0.0151898734177, 0.7, -30.125, -10.375, -10.375,
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None"
@@ -550,9 +656,9 @@
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None",
- "1", "0", "1.0", "1.0", "1.0",
- "1.0", "0.0", "1.0", "1.0", "0.0",
- "0.0", "1.0", "-0.166666666667", "-0.166666666667", "-0.166666666667",
+ 1, 0, 1.0, 1.0, 1.0,
+ 1.0, 0.0, 1.0, 1.0, 0.0,
+ 0.0, 1.0, -0.166666666667, -0.166666666667, -0.166666666667,
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None"
@@ -563,9 +669,9 @@
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None",
- "2", "1", "0.3", "1.0", "0.65",
- "0.65", "0.35", "1.0", "0.3", "-0.7",
- "-0.0368421052632", "0.3", "-19.75", "-0.75", "-0.75",
+ 2, 1, 0.3, 1.0, 0.65,
+ 0.65, 0.35, 1.0, 0.3, -0.7,
+ -0.0368421052632, 0.3, -19.75, -0.75, -0.75,
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None"
@@ -576,9 +682,9 @@
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None",
- "1", "0", "1.0", "1.0", "1.0",
- "1.0", "0.0", "1.0", "1.0", "0.0",
- "0.0", "1.0", "-18.75", "-18.75", "-18.75",
+ 1, 0, 1.0, 1.0, 1.0,
+ 1.0, 0.0, 1.0, 1.0, 0.0,
+ 0.0, 1.0, -18.75, -18.75, -18.75,
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None"
@@ -612,9 +718,9 @@
[
"-123", "-300", "LABMETB", "2009-04-06 15:00:00",
"0",
- "1", "0", "0.2", "0.2", "0.2",
- "0.2", "0.0", "0.2", "0.2", "0.0",
- "0.0", "0.2", "-0.35", "-0.35", "-0.35",
+ 1, 0, 0.2, 0.2, 0.2,
+ 0.2, 0.0, 0.2, 0.2, 0.0,
+ 0.0, 0.2, -0.35, -0.35, -0.35,
"0", "0", "None", "None", "None",
"None", "None", "None", "None", "None",
"None", "None", "None", "None", "None",
@@ -666,8 +772,8 @@
"None", "None", "None", "None", "None", "None",
"0", "0", "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None",
- "3", "0", "0.3", "1.0", "0.7", "0.666666666667", "0.286744175568", "1.0",
- "0.7", "-0.3", "-0.0151898734177", "0.7", "-30.125", "-10.375", "-10.375"
+ 3, 0, 0.3, 1.0, 0.7, 0.6666666666666666, 0.28674417556808757, 1.0,
+ 0.7, -0.3, -0.0151898734177, 0.7, -30.125, -10.375, -10.375
],
[
"-789", "-800", "LABMETB", "2009-04-06 16:00:00",
@@ -676,8 +782,8 @@
"None", "None", "None", "None", "None", "None",
"0", "0", "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None",
- "1", "0", "1.0", "1.0", "1.0", "1.0", "0.0", "1.0", "1.0", "0.0",
- "0.0", "1.0", "-0.166666666667", "-0.166666666667", "-0.166666666667"
+ 1, 0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
+ 0.0, 1.0, -0.166666666667, -0.166666666667, -0.166666666667
],
[
"-789", "-750", "LABMETB", "2009-04-26 06:00:00",
@@ -686,8 +792,8 @@
"None", "None", "None", "None", "None", "None",
"0", "0", "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None",
- "2", "0", "0.3", "1.0", "0.65", "0.65", "0.35", "1.0", "0.3",
- "-0.7", "-0.0368421052632", "0.3", "-19.75", "-0.75", "-0.75"
+ 2, 0, 0.3, 1.0, 0.65, 0.65, 0.35, 1.0, 0.3,
+ -0.7, -0.0368421052632, 0.3, -19.75, -0.75, -0.75
],
[
"-789", "-700", "LABMETB", "2009-04-25 06:00:00",
@@ -695,8 +801,8 @@
"None", "None", "None", "None", "None", "None", "None",
"0", "0", "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None",
- "1", "0", "1.0", "1.0", "1.0", "1.0", "0.0", "1.0", "1.0", "0.0",
- "0.0", "1.0", "-18.75", "-18.75", "-18.75"
+ 1, 0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
+ 0.0, 1.0, -18.75, -18.75, -18.75
],
[
"-456", "-600", "LABMETB", "2009-05-06 15:00:00",
@@ -705,7 +811,7 @@
"None", "None", "None", "None", "None", "None", "None",
"0", "0", "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None",
- "0", "0", "None", "None", "None", "None", "None", "None", "None",
+ 0, 0, "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None"
],
[
@@ -715,7 +821,7 @@
"None", "None", "None", "None", "None", "None",
"0", "0", "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None",
- "0", "0", "None", "None", "None", "None", "None", "None", "None",
+ 0, 0, "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None"
],
[
@@ -725,9 +831,40 @@
"None", "None", "None", "None", "None", "None",
"1", "0", "0.2", "0.2", "0.2", "0.2", "0.0", "0.2", "0.2", "0.0",
"0.0", "0.2", "-0.35", "-0.35", "-0.35",
- "0", "0", "None", "None", "None", "None", "None", "None", "None",
+ 0, 0, "None", "None", "None", "None", "None", "None", "None",
"None", "None", "None", "None", "None", "None"
]
]
+ },
+ "test_addTimeCycleFeatures" : {
+ "expectedMatrix" : [
+ [
+ "pat_id", "order_proc_id", "proc_code", "order_time",
+ "normal_results", "order_time.month", "order_time.month.sin",
+ "order_time.month.cos", "order_time.hour",
+ "order_time.hour.sin", "order_time.hour.cos"
+ ],
+ [ "-789", "-900", "LABMETB", "2009-05-06 15:00:00", "0",
+ "5", 0.8660254037844388, -0.4999999999999998,
+ "15", -0.7071067811865471, -0.7071067811865479 ],
+ [ "-789", "-800", "LABMETB", "2009-04-06 16:00:00", "0",
+ "4", 1.0, 6.123233995736766e-17,
+ "16", -0.8660254037844384, -0.5000000000000004 ],
+ [ "-789", "-750", "LABMETB", "2009-04-26 06:00:00", "1",
+ "4", 1.0, 6.123233995736766e-17,
+ "6", 1.0, 6.123233995736766e-17 ],
+ [ "-789", "-700", "LABMETB", "2009-04-25 06:00:00", "1",
+ "4", 1.0, 6.123233995736766e-17,
+ "6", 1.0, 6.123233995736766e-17 ],
+ [ "-456", "-600", "LABMETB", "2009-05-06 15:00:00", "1",
+ "5", 0.8660254037844388, -0.4999999999999998,
+ "15", -0.7071067811865471, -0.7071067811865479 ],
+ [ "-456", "-400", "LABMETB", "2009-04-25 06:00:00", "1",
+ "4", 1.0, 6.123233995736766e-17,
+ "6", 1.0, 6.123233995736766e-17 ],
+ [ "-123", "-300", "LABMETB", "2009-04-06 15:00:00", "0",
+ "4", 1.0, 6.123233995736766e-17,
+ "15", -0.7071067811865471, -0.7071067811865479 ]
+ ]
}
}
diff --git a/medinfo/dataconversion/test/TestDataExtractor.py b/medinfo/dataconversion/test/TestDataExtractor.py
index b098c4e8..003f6f33 100644
--- a/medinfo/dataconversion/test/TestDataExtractor.py
+++ b/medinfo/dataconversion/test/TestDataExtractor.py
@@ -2,16 +2,18 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime, timedelta;
import unittest
-from Const import RUNNER_VERBOSITY, LOGGER_LEVEL, APPLICATION_NAME;
-from Util import log;
+from .Const import RUNNER_VERBOSITY, LOGGER_LEVEL, APPLICATION_NAME;
+from .Util import log;
import logging
from medinfo.common.Const import NULL_STRING;
from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel, modelListFromTable;
@@ -26,8 +28,10 @@ def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
- self.purgeTestRecords();
log.info("Populate the database with test data")
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+ #self.purgeTestRecords();
dataTextStr = \
"""clinical_item_category_id\tsource_table\tdescription
@@ -84,7 +88,7 @@ def setUp(self):
DBUtil.insertFile( StringIO(dataTextStr), "stride_order_results", delim="\t", dateColFormats={"result_time": None} );
dataTextStr = \
-"""pat_anon_id\tflo_meas_id\tflowsheet_name\tflowsheet_value\tshifted_record_dt_tm
+"""pat_anon_id\tflo_meas_id\tflowsheet_name\tflowsheet_value\tshifted_dt_tm
-123\t-1\tFiO2\t0.2\t4/6/2009 6:36
-123\t-1\tFiO2\t0\t4/6/2009 16:34
-123\t-2\tGlasgow Coma Scale Score\t2.1\t4/6/2009 15:12
@@ -97,7 +101,7 @@ def setUp(self):
-789\t-2\tGlasgow Coma Scale Score\t1\t4/6/2009 12:00
-789\t-3\tBP_High_Systolic\t151\t5/6/2009 15:12
"""
- DBUtil.insertFile( StringIO(dataTextStr), "stride_flowsheet", delim="\t", dateColFormats={"shifted_record_dt_tm": None} );
+ DBUtil.insertFile( StringIO(dataTextStr), "stride_flowsheet", delim="\t", dateColFormats={"shifted_dt_tm": None} );
dataTextStr = \
"""order_med_id\tpat_id\tmedication_id\tdescription\tstart_taking_time\tend_taking_time\tfreq_name\tmin_discrete_dose\tmin_rate
@@ -303,7 +307,7 @@ def test_generateDateRangeIndexTimes(self):
-456: {"patient_id": -456, "start_time":DBUtil.parseDateValue("11/5/2113 10:20"), "end_time":DBUtil.parseDateValue("11/5/2113 10:20")},
-789: {"patient_id": -789, "start_time":DBUtil.parseDateValue("1/5/2113 10:20"), "end_time":DBUtil.parseDateValue("1/2/2113 10:20")},
}
- patientList = patientById.values();
+ patientList = list(patientById.values());
colNames = list();
patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("start_time","end_time", patientList, colNames);
@@ -316,8 +320,8 @@ def test_generateDateRangeIndexTimes(self):
-789: {}, # Can't find a valid index time if start date is after end date
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData[patientId]), len(patientEpisodeByIndexTime) )
self.assertEqual( len(expectedData), len(actualData) );
@@ -335,8 +339,8 @@ def test_generateDateRangeIndexTimes(self):
-789: {}, # Can't find a valid index time if start date is after end date
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, patientId, indexTime, patient;
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData[patientId]), len(patientEpisodeByIndexTime) )
@@ -352,8 +356,8 @@ def test_generateDateRangeIndexTimes(self):
-789: {}, # Can't find a valid index time if start date is after end date
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, patientId, indexTime, patient;
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData[patientId]), len(patientEpisodeByIndexTime) )
@@ -379,8 +383,8 @@ def test_generateDateRangeIndexTimes_repeatPatient(self):
},
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, patientId, indexTime, patient;
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData[patientId]), len(patientEpisodeByIndexTime) )
@@ -398,8 +402,8 @@ def test_generateDateRangeIndexTimes_repeatPatient(self):
},
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, patientId, indexTime, patient;
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData[patientId]), len(patientEpisodeByIndexTime) )
@@ -422,7 +426,7 @@ def test_addTimeCycleFeatures(self):
expectedColNames = ["index_time.month","index_time.month.sin","index_time.month.cos", "index_time.hour","index_time.hour.sin","index_time.hour.cos"];
colNames = None;
- for patientId, patientEpisode in patientById.iteritems():
+ for patientId, patientEpisode in patientById.items():
colNames = list();
# Generate index time points copies for the patient
colNames.extend(self.extractor.addTimeCycleFeatures_singleEpisode(patientEpisode, "index_time", "month"));
@@ -430,7 +434,7 @@ def test_addTimeCycleFeatures(self):
#print >> sys.stderr, patientEpisode;
self.assertAlmostEqualsDict( expectedDataByPatientId[patientId], patientEpisode );
- self.assertEquals(expectedColNames, colNames);
+ self.assertEqual(expectedColNames, colNames);
def test_addClinicalItemFeatures(self):
log.debug("Setup clinical item feature data file first...");
@@ -446,7 +450,7 @@ def test_addClinicalItemFeatures(self):
# Extract out item contents and link to patient data
colNames = list();
- patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", patientById.values(), colNames);
+ patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", list(patientById.values()), colNames);
itemTimesByPatientId = self.extractor.parseClinicalItemFile(StringIO(outFile.getvalue()));
self.extractor.addClinicalItemFeatures(itemTimesByPatientId, patientEpisodeByIndexTimeById, colNames, "TestItem");
@@ -458,8 +462,8 @@ def test_addClinicalItemFeatures(self):
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, key, value;
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData), len(actualData) );
@@ -481,7 +485,7 @@ def test_addClinicalItemFeatures_perPatient(self):
};
colNames = None;
- for patientId, basePatient in patientById.iteritems():
+ for patientId, basePatient in patientById.items():
colNames = list();
# Generate index time points copies for the patient
(patientEpisodeByIndexTime, newColNames) = self.extractor.generateDateRangeIndexTimes_singlePatient("index_time","index_time", basePatient);
@@ -495,7 +499,7 @@ def test_addClinicalItemFeatures_perPatient(self):
colNames.extend(newColNames);
actualData = patientEpisodeByIndexTime;
- for indexTime, patient in actualData.iteritems():
+ for indexTime, patient in actualData.items():
#print >> sys.stderr, patient;
self.assertAlmostEqualsDict( expectedDataByPatientId[patientId][indexTime], patient );
self.assertEqual( len(expectedDataByPatientId[patientId]), len(actualData) );
@@ -537,11 +541,11 @@ def test_labResults(self):
{"pat_id": -123, "base_name":"CR", "ord_num_value":2.1, "result_flag": "High", "result_in_range_yn":"N", "result_time": DBUtil.parseDateValue("4/6/2009 15:12") },
{"pat_id": -123, "base_name":"TNI", "ord_num_value":0, "result_flag": None, "result_in_range_yn":"Y", "result_time": DBUtil.parseDateValue("4/6/2009 16:34") },
];
- self.assertEqualDictList( expectedData, actualData, expectedData[0].keys() );
+ self.assertEqualDictList( expectedData, actualData, list(expectedData[0].keys()) );
# Parse back the results and load into patient data
colNames = list();
- patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", patientById.values(), colNames);
+ patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", list(patientById.values()), colNames);
preTimeDelta = timedelta(-90); # Any time in the past 90
postTimeDelta = timedelta(0); # Only look for past items
@@ -555,8 +559,8 @@ def test_labResults(self):
-999: {DBUtil.parseDateValue("7/6/2009 12:00"): {"patient_id": -999, "index_time":DBUtil.parseDateValue("7/6/2009 12:00"),"days_until_end": 0.0, "TNI.-90_0.count":0, "TNI.-90_0.countInRange":0, "TNI.-90_0.min":None, "TNI.-90_0.max":None, "TNI.-90_0.median":None, "TNI.-90_0.mean":None, "TNI.-90_0.std":None, "TNI.-90_0.first":None, "TNI.-90_0.last":None, "TNI.-90_0.diff":None, "TNI.-90_0.slope":None, "TNI.-90_0.proximate":None, "TNI.-90_0.firstTimeDays":None, "TNI.-90_0.lastTimeDays":None, "TNI.-90_0.proximateTimeDays":None, "CR.-90_0.count":0, "CR.-90_0.countInRange":0, "CR.-90_0.min":None, "CR.-90_0.max":None, "CR.-90_0.median":None, "CR.-90_0.mean":None, "CR.-90_0.std":None, "CR.-90_0.first":None, "CR.-90_0.last":None, "CR.-90_0.diff":None, "CR.-90_0.slope":None, "CR.-90_0.proximate":None, "CR.-90_0.firstTimeDays":None, "CR.-90_0.lastTimeDays":None, "CR.-90_0.proximateTimeDays":None, "LAC.-90_0.count":0, "LAC.-90_0.countInRange":0, "LAC.-90_0.min":None, "LAC.-90_0.max":None, "LAC.-90_0.median":None, "LAC.-90_0.mean":None, "LAC.-90_0.std":None, "LAC.-90_0.first":None, "LAC.-90_0.last":None, "LAC.-90_0.diff":None, "LAC.-90_0.slope":None, "LAC.-90_0.proximate":None, "LAC.-90_0.firstTimeDays":None, "LAC.-90_0.lastTimeDays":None, "LAC.-90_0.proximateTimeDays":None, }},
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, patientId, patient;
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData), len(actualData) );
@@ -595,7 +599,7 @@ def test_labResults_perPatient(self):
};
colNames = None;
- for patientId, basePatient in patientById.iteritems():
+ for patientId, basePatient in patientById.items():
colNames = list();
(patientEpisodeByIndexTime, newColNames) = self.extractor.generateDateRangeIndexTimes_singlePatient("index_time","index_time", basePatient);
colNames.extend(newColNames);
@@ -607,7 +611,7 @@ def test_labResults_perPatient(self):
expectedData = expectedDataByPatientId[patientId];
expectedKeys = None;
if len(expectedData) > 0:
- expectedKeys = expectedData[0].keys();
+ expectedKeys = list(expectedData[0].keys());
self.assertEqualDictList( expectedData, actualData, expectedKeys );
# Parse back the results and load into patient data
@@ -620,7 +624,7 @@ def test_labResults_perPatient(self):
expectedpatientEpisodeByIndexTime = expectedpatientEpisodeByIndexTimeById[patientId];
actualData = patientEpisodeByIndexTime;
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, patientId, patient["CR.None_0.count"], patient;
self.assertAlmostEqualsDict( expectedpatientEpisodeByIndexTime[indexTime], patient );
self.assertEqual( len(expectedpatientEpisodeByIndexTime), len(actualData) );
@@ -645,7 +649,7 @@ def test_flowsheet(self):
row["num_value"] = None;
if row["flowsheet_value"] is not None and row["flowsheet_value"] != NULL_STRING:
row["num_value"] = float(row["flowsheet_value"]);
- row["result_time"] = DBUtil.parseDateValue(row["shifted_record_dt_tm"]);
+ row["result_time"] = DBUtil.parseDateValue(row["shifted_dt_tm"]);
#print >> sys.stderr, "%(pat_id)s, %(base_name)s, %(num_value)s, %(result_time)s" % row;
@@ -665,11 +669,11 @@ def test_flowsheet(self):
{"pat_id": -123, "base_name":"Glasgow Coma Scale Score", "num_value":2.1, "result_time": DBUtil.parseDateValue("4/6/2009 15:12") },
{"pat_id": -123, "base_name":"FiO2", "num_value":0, "result_time": DBUtil.parseDateValue("4/6/2009 16:34") },
];
- self.assertEqualDictList( expectedData, actualData, expectedData[0].keys() );
+ self.assertEqualDictList( expectedData, actualData, list(expectedData[0].keys()) );
# Parse back the results and load into patient data
colNames = list();
- patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", patientById.values(), colNames);
+ patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", list(patientById.values()), colNames);
preTimeDelta = None; # Any time in the past
postTimeDelta = timedelta(0); # Only look for past items
@@ -683,8 +687,8 @@ def test_flowsheet(self):
-999: {DBUtil.parseDateValue("7/6/2009 12:00"): {"patient_id": -999, "index_time":DBUtil.parseDateValue("7/6/2009 12:00"), "days_until_end": 0.0, "FiO2.None_0.count":0, "FiO2.None_0.countInRange":0, "FiO2.None_0.min":None, "FiO2.None_0.max":None, "FiO2.None_0.median":None, "FiO2.None_0.mean":None, "FiO2.None_0.std":None, "FiO2.None_0.first":None, "FiO2.None_0.last":None, "FiO2.None_0.diff":None, "FiO2.None_0.slope":None, "FiO2.None_0.proximate":None, "FiO2.None_0.firstTimeDays":None, "FiO2.None_0.lastTimeDays":None, "FiO2.None_0.proximateTimeDays":None, "Glasgow Coma Scale Score.None_0.count":0, "Glasgow Coma Scale Score.None_0.countInRange":0, "Glasgow Coma Scale Score.None_0.min":None, "Glasgow Coma Scale Score.None_0.max":None, "Glasgow Coma Scale Score.None_0.median":None, "Glasgow Coma Scale Score.None_0.mean":None, "Glasgow Coma Scale Score.None_0.std":None, "Glasgow Coma Scale Score.None_0.first":None, "Glasgow Coma Scale Score.None_0.last":None, "Glasgow Coma Scale Score.None_0.diff":None, "Glasgow Coma Scale Score.None_0.slope":None, "Glasgow Coma Scale Score.None_0.proximate":None, "Glasgow Coma Scale Score.None_0.firstTimeDays":None, "Glasgow Coma Scale Score.None_0.lastTimeDays":None, "Glasgow Coma Scale Score.None_0.proximateTimeDays":None, "Resp.None_0.count":0, "Resp.None_0.countInRange":0, "Resp.None_0.min":None, "Resp.None_0.max":None, "Resp.None_0.median":None, "Resp.None_0.mean":None, "Resp.None_0.std":None, "Resp.None_0.first":None, "Resp.None_0.last":None, "Resp.None_0.diff":None, "Resp.None_0.slope":None, "Resp.None_0.proximate":None, "Resp.None_0.firstTimeDays":None, "Resp.None_0.lastTimeDays":None, "Resp.None_0.proximateTimeDays":None, }},
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#print >> sys.stderr, key, value;
self.assertAlmostEqualsDict( expectedData[patientId][indexTime], patient );
self.assertEqual( len(expectedData), len(actualData) );
@@ -729,12 +733,12 @@ def test_ivFluids(self):
-123\t4318\t4/6/2009 17:00\t4/6/2009 18:00\tCONTINUOUS\tNone\t1000
""");
expectedData = self.extractor.parseIVFluidFile(expectedDataFile);
- self.assertEqualDictList( expectedData[-123], actualData[-123], expectedData[-123][0].keys() );
+ self.assertEqualDictList( expectedData[-123], actualData[-123], list(expectedData[-123][0].keys()) );
# Parse back the results and load into patient data
colNames = ["patient_id"];
- patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", patientById.values(), colNames);
+ patientEpisodeByIndexTimeById = self.extractor.generateDateRangeIndexTimes("index_time","index_time", list(patientById.values()), colNames);
thresholdVolumes = [500,1000,2000,3000,4000,5000]; # Volumes (mL) of fluid interested in time until encountering
checkpointTimes = [0, 0.5*60*60, 1*60*60, 2*60*60, 3*60*60, 4*60*60, 4.5*60*60, 5*60*60, 6*60*60, 7*60*60]; # Time checkpoints (seconds) interested in accumulated fluid volume by that time
@@ -767,8 +771,8 @@ def test_ivFluids(self):
},
};
actualData = patientEpisodeByIndexTimeById;
- for patientId, patientEpisodeByIndexTime in actualData.iteritems():
- for indexTime, patient in patientEpisodeByIndexTime.iteritems():
+ for patientId, patientEpisodeByIndexTime in actualData.items():
+ for indexTime, patient in patientEpisodeByIndexTime.items():
#keys = patient.keys();
#keys.sort();
#for key in keys:
@@ -777,6 +781,7 @@ def test_ivFluids(self):
self.assertEqual(set(expectedData[patientId][indexTime].keys()), set(colNames));
self.assertEqual( len(expectedData), len(actualData) );
+
def suite():
"""Returns the suite of tests to run for this test class / module.
Use unittest.makeSuite methods which simply extracts all of the
@@ -787,12 +792,14 @@ def suite():
#suite.addTest(TestDataExtractor("test_generateDateRangeIndexTimes_repeatPatient"));
#suite.addTest(TestDataExtractor('test_labResults_perPatient'));
#suite.addTest(TestDataExtractor('test_labResults'));
+ #suite.addTest(TestDataExtractor('test_flowsheet'));
#suite.addTest(TestDataExtractor('test_addTimeCycleFeatures'));
suite.addTest(unittest.makeSuite(TestDataExtractor));
return suite;
-if __name__=="__main__":
- log = logging.getLogger("CDSS")
- log.setLevel(logging.DEBUG)
+
+if __name__ == "__main__":
+ #log = logging.getLogger("CDSS")
+ #log.setLevel(logging.DEBUG)
unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/test/TestFeatureMatrixFactory.py b/medinfo/dataconversion/test/TestFeatureMatrixFactory.py
index 03d75a5a..916f488a 100644
--- a/medinfo/dataconversion/test/TestFeatureMatrixFactory.py
+++ b/medinfo/dataconversion/test/TestFeatureMatrixFactory.py
@@ -4,29 +4,38 @@
"""
import datetime
-import os
+import sys, os
import time
import unittest
-from Const import RUNNER_VERBOSITY
-from cStringIO import StringIO
-from FeatureMatrixTestData import FM_TEST_INPUT_TABLES, FM_TEST_OUTPUT
+from .Const import RUNNER_VERBOSITY
+from io import StringIO
+from .FeatureMatrixTestData import FM_TEST_INPUT_TABLES, FM_TEST_OUTPUT
from medinfo.dataconversion.DataExtractor import DataExtractor
from medinfo.dataconversion.FeatureMatrixFactory import FeatureMatrixFactory
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel, modelListFromTable
from medinfo.db.ResultsFormatter import TextResultsFormatter
from medinfo.db.test.Util import DBTestCase
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+
+from .Util import log
-from Util import log
class TestFeatureMatrixFactory(DBTestCase):
def setUp(self):
"""Prepare state for test cases."""
- DBTestCase.setUp(self);
+ DBTestCase.setUp(self)
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+
self._deleteTestRecords()
self._insertTestRecords()
+ self.factory = FeatureMatrixFactory()
+ self.connection = DBUtil.connection(); # Setup a common connection for test cases to work with, can catch in finally tearDown method to close/cleanup
+
def _insertTestRecords(self):
"""Populate database for with patient data."""
# Populate clinical_item_category.
@@ -58,7 +67,7 @@ def _insertTestRecords(self):
testRecords = FM_TEST_INPUT_TABLES.get("stride_flowsheet")
DBUtil.insertFile(StringIO(testRecords), "stride_flowsheet", \
delim="\t", \
- dateColFormats={"shifted_record_dt_tm": None})
+ dateColFormats={"shifted_dt_tm": None})
# Populate stride_order_med.
testRecords = FM_TEST_INPUT_TABLES.get("stride_order_med")
@@ -82,8 +91,29 @@ def _deleteTestRecords(self):
def tearDown(self):
"""Restore state from any setUp or test steps."""
- self._deleteTestRecords();
- DBTestCase.tearDown(self);
+ self._deleteTestRecords()
+
+ # Clean up files that might have lingered from failed tests.
+ try:
+ os.remove("patient_list.tsv")
+ except:
+ pass
+ try:
+ self.factory.cleanTempFiles()
+ except:
+ pass
+ try:
+ os.remove(self.factory.getMatrixFileName())
+ except:
+ pass
+ try:
+ os.remove("extractor.feature_matrix.tab.gz")
+ except:
+ pass
+
+ self.connection.close();
+
+ DBTestCase.tearDown(self)
def test_dbCache(self):
"""Test database result caching."""
@@ -95,17 +125,13 @@ def test_dbCache(self):
def test_processPatientListInput(self):
"""Test processPatientListInput()."""
- # Initialize FeatureMatrixFactory.
- factory = FeatureMatrixFactory()
-
# Verify FeatureMatrixFactory throws Error if patientListInput
# has not been set.
with self.assertRaises(ValueError):
- factory.processPatientListInput()
+ self.factory.processPatientListInput()
# Initialize DB cursor.
- connection = DBUtil.connection()
- cursor = connection.cursor()
+ cursor = self.connection.cursor()
# Build SQL query for list of patients.
patientListQuery = SQLQuery()
@@ -117,15 +143,16 @@ def test_processPatientListInput(self):
cursor.execute(str(patientListQuery), patientListQuery.params)
# Set and process patientListInput.
- factory.setPatientListInput(cursor, "pat_id")
- factory.processPatientListInput()
- resultPatientIterator = factory.getPatientListIterator()
+ self.factory.setPatientListInput(cursor, "pat_id")
+ self.factory.processPatientListInput()
+ resultPatientIterator = self.factory.getPatientListIterator()
# Verify results.
expectedPatientList = ["-789", "-456", "-123"]
for expectedPatientId in expectedPatientList:
- resultPatientId = resultPatientIterator.next()['pat_id']
+ resultPatientId = next(resultPatientIterator)['pat_id']
self.assertEqual(resultPatientId, expectedPatientId)
+ resultPatientIterator.close();
# Build TSV file for list of patients.
patientList = \
@@ -140,19 +167,21 @@ def test_processPatientListInput(self):
patientListTsv.close()
# Initialize new FeatureMatrixFactory.
- factory = FeatureMatrixFactory()
+ self.factory = FeatureMatrixFactory()
# Set and process patientListInput.
patientListTsv = open("patient_list.tsv", "r")
- factory.setPatientListInput(patientListTsv, "patient_id")
- factory.processPatientListInput()
- resultPatientIterator = factory.getPatientListIterator()
+ self.factory.setPatientListInput(patientListTsv, "patient_id")
+ self.factory.processPatientListInput()
+ resultPatientIterator = self.factory.getPatientListIterator()
# Verify results.
expectedPatientList = ["-123", "-123", "-123", "-456", "-789"]
for expectedPatientId in expectedPatientList:
- resultPatientId = resultPatientIterator.next()['patient_id']
+ resultPatientId = next(resultPatientIterator)['patient_id']
self.assertEqual(resultPatientId, expectedPatientId)
+ patientListTsv.close();
+ resultPatientIterator.close();
# Clean up patient_list.
try:
@@ -162,18 +191,13 @@ def test_processPatientListInput(self):
pass
def test_buildFeatureMatrix_multiClinicalItem(self):
- """Test _buildFeatureMatrix()."""
- # Initialize FeatureMatrixFactory.
- factory = FeatureMatrixFactory()
-
# Verify FeatureMatrixFactory throws Error if patientEpisodeInput
# has not been set.
with self.assertRaises(ValueError):
- factory.processPatientEpisodeInput()
+ self.factory.processPatientEpisodeInput()
# Initialize DB cursor.
- connection = DBUtil.connection()
- cursor = connection.cursor()
+ cursor = self.connection.cursor()
# Build SQL query for list of patient episodes.
patientEpisodeQuery = SQLQuery()
@@ -191,9 +215,9 @@ def test_buildFeatureMatrix_multiClinicalItem(self):
cursor.execute(str(patientEpisodeQuery), patientEpisodeQuery.params)
# Set and process patientEpisodeInput.
- factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
- factory.processPatientEpisodeInput()
- resultEpisodeIterator = factory.getPatientEpisodeIterator()
+ self.factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
+ self.factory.processPatientEpisodeInput()
+ resultEpisodeIterator = self.factory.getPatientEpisodeIterator()
resultPatientEpisodes = list()
for episode in resultEpisodeIterator:
episode["pat_id"] = int(episode["pat_id"])
@@ -205,29 +229,76 @@ def test_buildFeatureMatrix_multiClinicalItem(self):
self.assertEqualList(resultPatientEpisodes, expectedPatientEpisodes)
# Add TestItem100 and TestItem200 clinical item data.
- factory.addClinicalItemFeatures(["TestItem100"])
- factory.addClinicalItemFeatures(["TestItem200"])
- factory.buildFeatureMatrix()
- resultMatrix = factory.readFeatureMatrixFile()
+ self.factory.addClinicalItemFeatures(["TestItem100"])
+ self.factory.addClinicalItemFeatures(["TestItem200"])
+ self.factory.buildFeatureMatrix()
+ resultMatrix = self.factory.readFeatureMatrixFile()
expectedMatrix = FM_TEST_OUTPUT["test_buildFeatureMatrix_multiClinicalItem"]
- self.assertEqualList(resultMatrix, expectedMatrix)
+ self.assertEqualList(resultMatrix[2:], expectedMatrix)
+
+ def test_buildFeatureMatrix_prePostFeatures(self):
+ """
+ Test features parameter in addClinicalItemFeatures which allows
+ client to specify they only want .pre* or .post* columns in feature
+ matrix.
+ """
+ # Verify FeatureMatrixFactory throws Error if patientEpisodeInput
+ # has not been set.
+ with self.assertRaises(ValueError):
+ self.factory.processPatientEpisodeInput()
+
+ # Initialize DB cursor.
+ cursor = self.connection.cursor()
+
+ # Build SQL query for list of patient episodes.
+ patientEpisodeQuery = SQLQuery()
+ patientEpisodeQuery.addSelect("CAST(pat_id AS bigint)")
+ patientEpisodeQuery.addSelect("sop.order_proc_id AS order_proc_id")
+ patientEpisodeQuery.addSelect("proc_code")
+ patientEpisodeQuery.addSelect("order_time")
+ patientEpisodeQuery.addSelect("COUNT(CASE result_in_range_yn WHEN 'Y' THEN 1 ELSE null END) AS normal_results")
+ patientEpisodeQuery.addFrom("stride_order_proc AS sop")
+ patientEpisodeQuery.addFrom("stride_order_results AS sor")
+ patientEpisodeQuery.addWhere("sop.order_proc_id = sor.order_proc_id")
+ patientEpisodeQuery.addWhereEqual("proc_code", "LABMETB")
+ patientEpisodeQuery.addGroupBy("pat_id, sop.order_proc_id, proc_code, order_time")
+ patientEpisodeQuery.addOrderBy("pat_id, sop.order_proc_id, proc_code, order_time")
+ cursor.execute(str(patientEpisodeQuery), patientEpisodeQuery.params)
+
+ # Set and process patientEpisodeInput.
+ self.factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
+ self.factory.processPatientEpisodeInput()
+ resultEpisodeIterator = self.factory.getPatientEpisodeIterator()
+ resultPatientEpisodes = list()
+ for episode in resultEpisodeIterator:
+ episode["pat_id"] = int(episode["pat_id"])
+ episode["order_time"] = DBUtil.parseDateValue(episode["order_time"])
+ resultPatientEpisodes.append(episode)
+
+ # Add TestItem100 and TestItem200 clinical item data.
+ self.factory.addClinicalItemFeatures(["TestItem100"], features="pre")
+ self.factory.addClinicalItemFeatures(["TestItem200"], features="post")
+ self.factory.buildFeatureMatrix()
+ resultMatrix = self.factory.readFeatureMatrixFile()
+ expectedMatrix = FM_TEST_OUTPUT["test_buildFeatureMatrix_prePostFeatures"]
+
+ self.assertEqualList(resultMatrix[2:], expectedMatrix)
def test_build_FeatureMatrix_multiLabTest(self):
"""
Test buildFeatureMatrix() and addLabFeatures().
"""
# Initialize FeatureMatrixFactory.
- factory = FeatureMatrixFactory()
+ self.factory = FeatureMatrixFactory()
# Verify FeatureMatrixFactory throws Error if patientEpisodeInput
# has not been set.
with self.assertRaises(ValueError):
- factory.processPatientEpisodeInput()
+ self.factory.processPatientEpisodeInput()
# Initialize DB cursor.
- connection = DBUtil.connection()
- cursor = connection.cursor()
+ cursor = self.connection.cursor()
# Build SQL query for list of patient episodes.
patientEpisodeQuery = SQLQuery()
@@ -245,9 +316,9 @@ def test_build_FeatureMatrix_multiLabTest(self):
cursor.execute(str(patientEpisodeQuery), patientEpisodeQuery.params)
# Set and process patientEpisodeInput.
- factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
- factory.processPatientEpisodeInput()
- resultEpisodeIterator = factory.getPatientEpisodeIterator()
+ self.factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
+ self.factory.processPatientEpisodeInput()
+ resultEpisodeIterator = self.factory.getPatientEpisodeIterator()
resultPatientEpisodes = list()
for episode in resultEpisodeIterator:
episode["pat_id"] = int(episode["pat_id"])
@@ -263,30 +334,30 @@ def test_build_FeatureMatrix_multiLabTest(self):
# Look for lab data 90 days before each episode, but never afterself.
preTimeDelta = datetime.timedelta(-90)
postTimeDelta = datetime.timedelta(0)
- factory.addLabResultFeatures(labBaseNames, preTimeDelta, postTimeDelta)
- factory.buildFeatureMatrix()
- resultMatrix = factory.readFeatureMatrixFile()
+ self.factory.addLabResultFeatures(labBaseNames, False, preTimeDelta, postTimeDelta)
+ self.factory.buildFeatureMatrix()
+ resultMatrix = self.factory.readFeatureMatrixFile()
# Verify results.
expectedMatrix = FM_TEST_OUTPUT["test_buildFeatureMatrix_multiLabTest"]["expectedMatrix"]
- self.assertEqualList(resultMatrix, expectedMatrix)
+ self.assertEqualTable(expectedMatrix, resultMatrix[2:], precision=5)
+
+ try:
+ os.remove(self.factory.getMatrixFileName())
+ except OSError:
+ pass
def test_buildFeatureMatrix_multiFlowsheet(self):
"""
Test buildFeatureMatrix and addFlowsheet.
"""
-
- # Initialize FeatureMatrixFactory.
- factory = FeatureMatrixFactory()
-
# Verify FeatureMatrixFactory throws Error if patientEpisodeInput
# has not been set.
with self.assertRaises(ValueError):
- factory.processPatientEpisodeInput()
+ self.factory.processPatientEpisodeInput()
# Initialize DB cursor.
- connection = DBUtil.connection()
- cursor = connection.cursor()
+ cursor = self.connection.cursor()
# Build SQL query for list of patient episodes.
patientEpisodeQuery = SQLQuery()
@@ -304,9 +375,9 @@ def test_buildFeatureMatrix_multiFlowsheet(self):
cursor.execute(str(patientEpisodeQuery), patientEpisodeQuery.params)
# Set and process patientEpisodeInput.
- factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
- factory.processPatientEpisodeInput()
- resultEpisodeIterator = factory.getPatientEpisodeIterator()
+ self.factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
+ self.factory.processPatientEpisodeInput()
+ resultEpisodeIterator = self.factory.getPatientEpisodeIterator()
resultPatientEpisodes = list()
for episode in resultEpisodeIterator:
episode["pat_id"] = int(episode["pat_id"])
@@ -322,25 +393,88 @@ def test_buildFeatureMatrix_multiFlowsheet(self):
# Look for lab data 90 days before each episode, but never afterself.
preTimeDelta = datetime.timedelta(-90)
postTimeDelta = datetime.timedelta(0)
- factory.addFlowsheetFeatures(flowsheetNames, preTimeDelta, postTimeDelta)
- factory.buildFeatureMatrix()
- resultMatrix = factory.readFeatureMatrixFile()
+ self.factory.addFlowsheetFeatures(flowsheetNames, preTimeDelta, postTimeDelta)
+ self.factory.buildFeatureMatrix()
+ resultMatrix = self.factory.readFeatureMatrixFile()
# Verify results.
expectedMatrix = FM_TEST_OUTPUT["test_buildFeatureMatrix_multiFlowsheet"]["expectedMatrix"]
- self.assertEqualList(resultMatrix, expectedMatrix)
+ self.assertEqualTable(expectedMatrix, resultMatrix[2:], precision=5);
+
+ try:
+ os.remove(self.factory.getMatrixFileName())
+ except OSError:
+ pass
+
+ def test_addTimeCycleFeatures(self):
+ """
+ Test .addTimeCycleFeatures()
+ """
+ # Initialize DB cursor.
+ cursor = self.connection.cursor()
+
+ # Build SQL query for list of patient episodes.
+ patientEpisodeQuery = SQLQuery()
+ patientEpisodeQuery.addSelect("CAST(pat_id AS bigint)")
+ patientEpisodeQuery.addSelect("sop.order_proc_id AS order_proc_id")
+ patientEpisodeQuery.addSelect("proc_code")
+ patientEpisodeQuery.addSelect("order_time")
+ patientEpisodeQuery.addSelect("COUNT(CASE result_in_range_yn WHEN 'Y' THEN 1 ELSE null END) AS normal_results")
+ patientEpisodeQuery.addFrom("stride_order_proc AS sop")
+ patientEpisodeQuery.addFrom("stride_order_results AS sor")
+ patientEpisodeQuery.addWhere("sop.order_proc_id = sor.order_proc_id")
+ patientEpisodeQuery.addWhereEqual("proc_code", "LABMETB")
+ patientEpisodeQuery.addGroupBy("pat_id, sop.order_proc_id, proc_code, order_time")
+ patientEpisodeQuery.addOrderBy("pat_id, sop.order_proc_id, proc_code, order_time")
+ cursor.execute(str(patientEpisodeQuery), patientEpisodeQuery.params)
+
+ # Set and process patientEpisodeInput.
+ self.factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
+ self.factory.processPatientEpisodeInput()
+
+ # Add time cycle features.
+ self.factory.addTimeCycleFeatures("order_time", "month")
+ self.factory.addTimeCycleFeatures("order_time", "hour")
+
+ # Verify output.
+ self.factory.buildFeatureMatrix()
+ resultMatrix = self.factory.readFeatureMatrixFile()
+ expectedMatrix = FM_TEST_OUTPUT["test_addTimeCycleFeatures"]["expectedMatrix"]
+ self.assertEqualTable(expectedMatrix, resultMatrix[2:], precision=5);
+
+ # Clean up feature matrix.
+ try:
+ os.remove(self.factory.getMatrixFileName())
+ except OSError:
+ pass
+
+ def test_loadMapData(self):
+ self.factory = FeatureMatrixFactory()
+
+ # Depends on external data file
+ reader = self.factory.loadMapData("CharlsonComorbidity-ICD9CM")
+ charlsonByICD9 = dict()
+
+ for row in reader:
+ charlsonByICD9[row["icd9cm"]] = row["charlson"]
+
+ self.assertEqual("Dementia", charlsonByICD9["294.1"])
+ self.assertEqual("Dementia", charlsonByICD9["331.2"])
+ self.assertEqual("COPD", charlsonByICD9["490"])
+ self.assertEqual("COPD", charlsonByICD9["416.8"])
+ self.assertEqual("Malignancy Metastatic", charlsonByICD9["199"])
+ self.assertEqual("AIDS/HIV", charlsonByICD9["042"])
def test_performance(self):
"""
Test performance against DataExtractor.
"""
# Initialize DB cursor.
- connection = DBUtil.connection()
- cursor = connection.cursor()
+ cursor = self.connection.cursor()
# Initialize FeatureMatrixFactory.
factoryStart = time.time()
- factory = FeatureMatrixFactory()
+ self.factory = FeatureMatrixFactory()
# Build SQL query for list of patient episodes.
patientEpisodeQuery = SQLQuery()
@@ -358,29 +492,29 @@ def test_performance(self):
cursor.execute(str(patientEpisodeQuery), patientEpisodeQuery.params)
# Set and process patientEpisodeInput.
- factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
- factory.processPatientEpisodeInput()
+ self.factory.setPatientEpisodeInput(cursor, "pat_id", "order_time")
+ self.factory.processPatientEpisodeInput()
# Look for lab data 90 days before each episode, but never afterself.
preTimeDelta = datetime.timedelta(-90)
postTimeDelta = datetime.timedelta(0)
# Add clinical item features.
- factory.addClinicalItemFeatures(["PerfItem300"])
- factory.addClinicalItemFeatures(["PerfItem400"])
- factory.addClinicalItemFeatures(["PerfItem500"])
+ self.factory.addClinicalItemFeatures(["PerfItem300"])
+ self.factory.addClinicalItemFeatures(["PerfItem400"])
+ self.factory.addClinicalItemFeatures(["PerfItem500"])
# Add lab result features.
- factory.addLabResultFeatures(["Foo"], preTimeDelta, postTimeDelta)
- factory.addLabResultFeatures(["Bar"], preTimeDelta, postTimeDelta)
- factory.addLabResultFeatures(["Baz"], preTimeDelta, postTimeDelta)
- factory.addLabResultFeatures(["Qux"], preTimeDelta, postTimeDelta)
+ self.factory.addLabResultFeatures(["Foo"], False, preTimeDelta, postTimeDelta)
+ self.factory.addLabResultFeatures(["Bar"], False, preTimeDelta, postTimeDelta)
+ self.factory.addLabResultFeatures(["Baz"], False, preTimeDelta, postTimeDelta)
+ self.factory.addLabResultFeatures(["Qux"], False, preTimeDelta, postTimeDelta)
# Add flowsheet features.
- factory.addFlowsheetFeatures(["Perflow"], preTimeDelta, postTimeDelta)
+ self.factory.addFlowsheetFeatures(["Perflow"], preTimeDelta, postTimeDelta)
# Build matrix.
- factory.buildFeatureMatrix()
+ self.factory.buildFeatureMatrix()
# Stop timer.
factoryStop = time.time()
@@ -523,7 +657,7 @@ def test_performance(self):
formatter.formatTuple(colNames)
# Print out patient (episode) data (one row per episode)
- formatter.formatResultDicts(patientEpisodeByIndexTime.values(), colNames)
+ formatter.formatResultDicts(list(patientEpisodeByIndexTime.values()), colNames)
if lastPatientId is None or lastPatientId != patientId:
# Prepare to aggregate patient episode record per patient
@@ -594,7 +728,7 @@ def test_performance(self):
patientEpisodeByIndexTime, labsByBaseName, ["Qux"], \
preTimeDelta, postTimeDelta))
- formatter.formatResultDicts(patientEpisodeByIndexTime.values(), colNames)
+ formatter.formatResultDicts(list(patientEpisodeByIndexTime.values()), colNames)
# Close file.
outFile.close()
@@ -613,10 +747,11 @@ def test_performance(self):
except OSError:
pass
try:
- os.remove(factory.getMatrixFileName())
+ os.remove(self.factory.getMatrixFileName())
except OSError:
pass
+
def suite():
"""
Returns the suite of tests to run for this test class / module.
@@ -624,8 +759,14 @@ def suite():
methods for the given class whose name starts with "test".
"""
suite = unittest.TestSuite()
+ #suite.addTest(TestFeatureMatrixFactory("test_addTimeCycleFeatures"));
+ #suite.addTest(TestFeatureMatrixFactory("test_buildFeatureMatrix_multiFlowsheet"));
+ #suite.addTest(TestFeatureMatrixFactory("test_build_FeatureMatrix_multiLabTest"));
+ #suite.addTest(TestFeatureMatrixFactory("test_processPatientListInput"));
+ #suite.addTest(TestFeatureMatrixFactory("test_buildFeatureMatrix_multiClinicalItem"));
suite.addTest(unittest.makeSuite(TestFeatureMatrixFactory))
return suite
+
if __name__=="__main__":
unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/test/TestFeatureMatrixIO.py b/medinfo/dataconversion/test/TestFeatureMatrixIO.py
new file mode 100644
index 00000000..373eaad1
--- /dev/null
+++ b/medinfo/dataconversion/test/TestFeatureMatrixIO.py
@@ -0,0 +1,110 @@
+#!/usr/bin/python
+"""
+Test suite for FeatureMatrixIO.
+"""
+
+import filecmp
+import inspect
+import os
+from pandas import read_csv
+from pandas.testing import assert_frame_equal
+import unittest
+
+from LocalEnv import TEST_RUNNER_VERBOSITY
+from medinfo.common.test.Util import make_test_suite, MedInfoTestCase
+from medinfo.dataconversion.FeatureMatrixIO import FeatureMatrixIO
+from medinfo.dataconversion.test.FeatureMatrixIOTestData import MANUAL_TEST_CASE
+
+class TestFeatureMatrixIO(MedInfoTestCase):
+ def setUp(self):
+ # Set up temp files.
+ self._no_header_temp_file_path = '_no_header_temp_file_path'
+ self._with_header_temp_file_path = '_with_header_temp_file_path'
+ self._stripped_header_file_path = '_stripped_header_file_path'
+
+ def tearDown(self):
+ # Clean up temp files.
+ temp_files = [
+ self._no_header_temp_file_path,
+ self._with_header_temp_file_path,
+ self._stripped_header_file_path
+ ]
+ for temp_file in temp_files:
+ try:
+ os.remove(temp_file)
+ except OSError:
+ pass
+
+ def test_strip_header(self):
+ # Initialize FeatureMatrixIO.
+ fm_io = FeatureMatrixIO()
+
+ # Build paths for test files.
+ app_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+ no_header_file_name = 'test-matrix-no-header.tab'
+ with_header_file_name = 'test-matrix-with-header.tab'
+ no_header_file_path = os.path.join(app_dir, no_header_file_name)
+ with_header_file_path = os.path.join(app_dir, with_header_file_name)
+
+ # Strip header.
+ matrix_with_header = fm_io.read_file_to_data_frame(with_header_file_path)
+ self._stripped_header_file_path = fm_io.strip_header(with_header_file_path)
+
+ # Validate matrix data.
+ expected_matrix = MANUAL_TEST_CASE['matrix_no_header']
+ actual_matrix = fm_io.read_file_to_data_frame(self._stripped_header_file_path, \
+ datetime_col_index=1)
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+ def test_read_file_to_data_frame(self):
+ # Initialize FeatureMatrixIO.
+ fm_io = FeatureMatrixIO()
+
+ # Build paths for test files.
+ app_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+ no_header_file_name = 'test-matrix-no-header.tab'
+ with_header_file_name = 'test-matrix-with-header.tab'
+ no_header_file_path = os.path.join(app_dir, no_header_file_name)
+ with_header_file_path = os.path.join(app_dir, with_header_file_name)
+
+ # Read files into data frames.
+ matrix_stripped_header = fm_io.read_file_to_data_frame(with_header_file_path)
+ matrix_no_header = fm_io.read_file_to_data_frame(no_header_file_path)
+
+ # Verify that FeatureMatrixIO correctly stripped the header.
+ expected_matrix = MANUAL_TEST_CASE['matrix_no_header']
+ assert_frame_equal(expected_matrix, matrix_stripped_header)
+ assert_frame_equal(expected_matrix, matrix_no_header)
+
+ def test_write_data_frame_to_file(self):
+ # Initialize FeatureMatrixIO.
+ fm_io = FeatureMatrixIO()
+
+ # Build paths for test files.
+ app_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+ no_header_file_name = 'test-matrix-no-header.tab'
+ with_header_file_name = 'test-matrix-with-header.tab'
+ no_header_file_path = os.path.join(app_dir, no_header_file_name)
+ with_header_file_path = os.path.join(app_dir, with_header_file_name)
+
+ # Read data frames from test files.
+ matrix_no_header = MANUAL_TEST_CASE['matrix_no_header']
+ matrix_header = MANUAL_TEST_CASE['custom_header']
+
+ # Write data frame without header.
+ no_header_temp_file_name = 'no-header-temp-file.tab'
+ self._no_header_temp_file_path = os.path.join(app_dir, no_header_temp_file_name)
+ fm_io.write_data_frame_to_file(matrix_no_header, self._no_header_temp_file_path)
+
+ # Write data frame with header.
+ with_header_temp_file_name = 'header-temp-file.tab'
+ self._with_header_temp_file_path = os.path.join(app_dir, with_header_temp_file_name)
+ fm_io.write_data_frame_to_file(matrix_no_header, self._with_header_temp_file_path, matrix_header)
+
+ # Validate output files.
+ self.assertTrue(filecmp.cmp(no_header_file_path, self._no_header_temp_file_path))
+ self.assertTrue(filecmp.cmp(with_header_file_path, self._with_header_temp_file_path))
+
+if __name__=="__main__":
+ suite = make_test_suite(TestFeatureMatrixIO)
+ unittest.TextTestRunner(verbosity=TEST_RUNNER_VERBOSITY).run(suite)
diff --git a/medinfo/dataconversion/test/TestFeatureMatrixTransform.py b/medinfo/dataconversion/test/TestFeatureMatrixTransform.py
new file mode 100644
index 00000000..e5193ec0
--- /dev/null
+++ b/medinfo/dataconversion/test/TestFeatureMatrixTransform.py
@@ -0,0 +1,198 @@
+#!/usr/bin/python
+
+from pandas.testing import assert_frame_equal
+from scipy.stats import powerlaw
+import unittest
+import numpy as np
+import sys
+
+from LocalEnv import TEST_RUNNER_VERBOSITY
+from medinfo.common.test.Util import MedInfoTestCase, make_test_suite
+from medinfo.dataconversion.FeatureMatrixTransform import FeatureMatrixTransform
+from medinfo.dataconversion.test.FMTransformTestData import MANUAL_FM_TEST_CASE
+
+class TestFeatureMatrixTransform(MedInfoTestCase):
+ def setUp(self):
+ self.fmt = FeatureMatrixTransform()
+ input_matrix = MANUAL_FM_TEST_CASE['input']
+ self.fmt.set_input_matrix(input_matrix)
+
+ def tearDown(self):
+ pass
+
+ def test_mean_data_imputation(self):
+ # Impute data.
+ self.fmt.impute(feature="f2", strategy=FeatureMatrixTransform.IMPUTE_STRATEGY_MEAN)
+
+ # Verify output.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_mean_data_imputation']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+ def test_mode_data_imputation_single_feature(self):
+ # Impute single feature.
+ self.fmt.impute(feature='f4', strategy=FeatureMatrixTransform.IMPUTE_STRATEGY_MODE)
+
+ # Verify single feature imputation.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_mode_data_imputation_single_feature']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+ def test_mode_data_imputation_all_features(self):
+ # Impute all features.
+ self.fmt.impute(strategy=FeatureMatrixTransform.IMPUTE_STRATEGY_MODE)
+
+ # Verify all feature imputation.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_mode_data_imputation_all_features']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+ def test_add_logarithm_feature(self):
+ # Impute mean(f2) and add ln(f2) feature.
+ self.fmt.impute(feature="f2")
+ self.fmt.add_logarithm_feature('f2')
+
+ # Hack: pandas automatically sorts the columns of a DataFrame on
+ # init. To make the test data match our intended behavior, need to
+ # rearrange the columns here so that ln(f2) follows f2.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_add_logarithm_feature']
+ cols = list(expected_matrix.columns)
+ cols.insert(2, cols.pop(5))
+ expected_matrix = expected_matrix[cols]
+
+ # Verify feature addition.
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix.sort_index(axis=1), actual_matrix.sort_index(axis=1))
+
+ def test_remove_feature(self):
+ # Remove f2.
+ self.fmt.remove_feature('f2')
+
+ # Verify feature removal.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_remove_feature']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+ def test_filter_on_feature(self):
+ # Exclude all rows where f2 == None
+ nrows = self.fmt.filter_on_feature('f2', np.nan)
+
+ # Verify correct rows removed
+ expected_matrix = MANUAL_FM_TEST_CASE['test_filter_on_feature']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+ self.assertEqual(expected_matrix.shape[0], nrows)
+
+ def test_add_indicator_feature(self):
+ # Add indicator feature.
+ self.fmt.add_indicator_feature('f2')
+
+ # Hack: pandas automatically sorts the columns of a DataFrame on
+ # init. To make the test data match our intended behavior, need to
+ # rearrange the columns here so that ln(f2) follows f2.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_add_indicator_feature']
+ cols = list(expected_matrix.columns)
+ cols.insert(2, cols.pop(0))
+ expected_matrix = expected_matrix[cols]
+
+ # Verify feature addition.
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix.sort_index(axis=1), actual_matrix.sort_index(axis=1))
+
+ def test_add_threshold_feature(self):
+ # Add threshold feature.
+ self.fmt.add_threshold_feature('f2', upper_bound=3.5)
+
+ # Hack: pandas automatically sorts the columns of a DataFrame on
+ # init. To make the test data match our intended behavior, need to
+ # rearrange the columns here so that I(f2<=3.5) follows f2.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_add_threshold_feature']
+ cols = list(expected_matrix.columns)
+ cols.insert(2, cols.pop(0))
+ expected_matrix = expected_matrix[cols]
+
+ # Verify feature addition.
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix.sort_index(axis=1), actual_matrix.sort_index(axis=1))
+
+ def test_add_change_interval_feature(self):
+ # Add change feature.
+ self.fmt.add_change_feature('interval', 0.5, 'patient_id', 'f2')
+
+ expected_matrix = MANUAL_FM_TEST_CASE['test_add_change_interval_feature']
+ cols = list(expected_matrix.columns)
+ cols.insert(2, cols.pop())
+ expected_matrix = expected_matrix[cols]
+
+ # Verify feature addition.
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix.sort_index(axis=1), actual_matrix.sort_index(axis=1))
+
+ def test_add_change_percent_feature(self):
+ # Add change feature.
+ self.fmt.add_change_feature('percent', 0.35, 'patient_id', 'f2')
+
+ expected_matrix = MANUAL_FM_TEST_CASE['test_add_change_percent_feature']
+ cols = list(expected_matrix.columns)
+ cols.insert(2, cols.pop())
+ expected_matrix = expected_matrix[cols]
+
+ # Verify feature addition.
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix.sort_index(axis=1), actual_matrix.sort_index(axis=1))
+
+ """
+ add_change_feature with 'sd' is not meant to run on matrices smaller than 301
+ rows. To run a test of this function, uncomment this test function and
+ set k = 3 in the body of add_change_feature in FeatureMatrixTransform.py
+ (normal value is 300).
+
+ def test_add_change_sd_feature(self):
+ # add change feature
+ np.random.seed(123)
+ sample = self.fmt.add_change_feature('sd', 0.5, 'patient_id', 'f2')
+
+ expected_matrix = MANUAL_FM_TEST_CASE['test_add_change_sd_feature']
+ cols = list(expected_matrix.columns)
+ cols.insert(2, cols.pop())
+ expected_matrix = expected_matrix[cols]
+
+ # Verify feature addition
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+ """
+
+ def test_zero_data_imputation(self):
+ # Impute zero(f2).
+ self.fmt.impute(feature="f2", strategy=FeatureMatrixTransform.IMPUTE_STRATEGY_ZERO)
+
+ # Verify feature addition.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_zero_data_imputation']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+ def test_median_data_imputation(self):
+ # Impute median(f2).
+ self.fmt.impute(feature="f2", strategy=FeatureMatrixTransform.IMPUTE_STRATEGY_MEDIAN)
+
+ # Verify feature addition.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_median_data_imputation']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+ def _power_law_dist(self):
+ return powerlaw.rvs(1.66, random_state=2)
+
+ def test_distrbution_data_imputation(self):
+ # Impute distribution(f2).
+ self.fmt.impute(feature="f2", distribution=self._power_law_dist, \
+ strategy=FeatureMatrixTransform.IMPUTE_STRATEGY_DISTRIBUTION)
+
+ # Verify feature addition.
+ expected_matrix = MANUAL_FM_TEST_CASE['test_distribution_data_imputation']
+ actual_matrix = self.fmt.fetch_matrix()
+ assert_frame_equal(expected_matrix, actual_matrix)
+
+if __name__=="__main__":
+ suite = make_test_suite(TestFeatureMatrixTransform)
+ unittest.TextTestRunner(verbosity=TEST_RUNNER_VERBOSITY).run(suite)
diff --git a/medinfo/dataconversion/test/TestProviderRotationConversion.py b/medinfo/dataconversion/test/TestProviderRotationConversion.py
new file mode 100644
index 00000000..66cd4649
--- /dev/null
+++ b/medinfo/dataconversion/test/TestProviderRotationConversion.py
@@ -0,0 +1,146 @@
+#!/usr/bin/env python
+"""Test case for respective module in application package"""
+
+import sys, os
+from io import StringIO
+from datetime import datetime;
+import unittest
+
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
+
+from medinfo.db.test.Util import DBTestCase;
+
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery, RowItemModel, generatePlaceholders;
+
+from medinfo.dataconversion.ProviderRotationConversion import ProviderRotationConversion;
+
+TEST_SOURCE_TABLE = "test_accesslog_script";
+
+class TestProviderRotationConversion(DBTestCase):
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self);
+
+ log.info("Populate the database with test data (Assumes MySQL data structure)")
+ DBUtil.execute \
+ ("""create table %s
+ (
+ USER_ID varchar(255),
+ USER_NAME varchar(255),
+ DE_PAT_ID bigint,
+ ACCESS_DATETIME datetime,
+ METRIC_ID integer,
+ METRIC_NAME text,
+ LINE_COUNT integer,
+ DESCRIPTION text,
+ METRIC_GROUP_NUM integer,
+ METRIC_GROUP_NAME text
+ );
+ """ % TEST_SOURCE_TABLE
+ );
+
+ self.testUserIDs = list();
+ headers = ["user_id","user_name","de_pat_id","access_datetime","metric_id","metric_name","line_count","description","metric_group_num","metric_group_name"];
+ dataModels = \
+ [
+ RowItemModel( ['S-7', 'CJ', None, '2013-10-14 08:44:47', '33006', 'ME_IBGLANCE', '1', 'IN BASKET GLANCE PLUGIN ACCESSED IN RADAR', '33000', 'Radar'], headers ),
+ RowItemModel( ['S-7', 'CJ', '3289034', '2014-03-20 00:40:18', '34127', 'IP_ORDERSSECTION', '1', 'Inpatient Orders section opened ', '17001', 'PATIENT CLINICAL INFO'], headers ),
+ RowItemModel( ['S-7', 'CJ', None, '2014-01-01 10:10:56', '20008', 'AC_IB_CREATEMSG', '1', 'In Basket message of any type created.', '20000', 'In Basket Report'], headers ),
+ RowItemModel( ['S-7', 'CJ', None, '2014-01-01 10:10:56', '20008', 'AC_IB_CREATEMSG', '2', '(Created messages counted.) ', '20000', 'In Basket Report'], headers ),
+ RowItemModel( ['S-7', 'CJ', '1853397', '2013-06-29 11:25:02', '20075', 'AC_DOCUMENTLIST_SUBC', '1', 'Prelude Documents list accessed for patient.', None, None], headers ),
+ RowItemModel( ['S-4', 'AB', '3133593', '2013-10-22 06:46:29', '17008', 'MR_REPORTS', '1', 'A report with patient data accessed.', '17001', 'PATIENT CLINICAL INFO'], headers ),
+ RowItemModel( ['S-4', 'AB', '3047429', '2014-03-16 20:56:54', '17016', 'MR_RESULTS_REVIEW', '1', 'Results Review activity accessed.', '17002', 'Patient Chart Review'], headers ),
+ RowItemModel( ['S-4', 'AB', '3408732', '2014-04-08 08:47:38', '17016', 'MR_RESULTS_REVIEW', '1', 'Results Review activity accessed.', '17002', 'Patient Chart Review'], headers ),
+ RowItemModel( ['S-4', 'AB', None, '2014-02-26 19:27:48', '34140', 'IP_SYSTEM_LIST', '1', 'Inpatient system list accessed.', '20001', 'PATIENT DEMOGRAPHICS'], headers ),
+ RowItemModel( ['S-4', 'AB', '2487184', '2013-10-11 08:45:46', '17008', 'MR_REPORTS', '1', 'A report with patient data accessed.', '17001', 'PATIENT CLINICAL INFO'], headers ),
+
+ ];
+ for dataModel in dataModels:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem(TEST_SOURCE_TABLE, dataModel, retrieveCol="user_id" );
+ userID = int(dataItemId[1:]); # Trim leading S and parse remainder as an integer
+ self.testUserIDs.append(userID);
+
+ self.converter = ProviderRotationConversion(); # Instance to test on
+ self.converter.sourceTableName = TEST_SOURCE_TABLE;
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ log.info("Purge test records from the database")
+ query = SQLQuery();
+ query.delete = True;
+ query.addFrom("access_log");
+ query.addWhereIn("user_id", self.testUserIDs );
+ DBUtil.execute( query );
+
+ query = SQLQuery();
+ query.delete = True;
+ query.addFrom("user");
+ query.addWhereIn("user_id", self.testUserIDs );
+ DBUtil.execute( query );
+
+ DBUtil.execute("drop table %s;" % TEST_SOURCE_TABLE);
+ DBTestCase.tearDown(self);
+
+ # def test_dataConversion(self):
+ # # Run the data conversion on the same data and look for expected records
+ # log.debug("Run the conversion process...");
+ # self.converter.convertSourceItems();
+ #
+ # # Just query back for the same data, de-normalizing the data back to a general table
+ # testQuery = \
+ # """
+ # select
+ # u.name,
+ # al.de_pat_id,
+ # al.access_datetime,
+ # m.name,
+ # m.description,
+ # mg.name
+ # from
+ # access_log as al,
+ # user as u,
+ # metric as m,
+ # metric_group as mg
+ # where
+ # al.user_id = u.user_id and
+ # al.metric_id = m.metric_id and
+ # m.metric_group_id = mg.metric_group_id and
+ # al.user_id in (%s)
+ # order by
+ # al.access_datetime
+ # """ % generatePlaceholders(len(self.testUserIDs));
+ #
+ # expectedData = \
+ # [
+ # ['CJ', 1853397, datetime(2013, 6, 29, 11, 25, 2), 'AC_DOCUMENTLIST_SUBC', 'Prelude Documents list accessed for patient.', 'Null Group'], # Put placeholder for null group to avoid having to do outer join
+ # ['AB', 2487184, datetime(2013, 10, 11, 8, 45, 46), 'MR_REPORTS', 'A report with patient data accessed.', 'PATIENT CLINICAL INFO'],
+ # ['CJ', None, datetime(2013, 10, 14, 8, 44, 47), 'ME_IBGLANCE', 'IN BASKET GLANCE PLUGIN ACCESSED IN RADAR', 'Radar'],
+ # ['AB', 3133593, datetime(2013, 10, 22, 6, 46, 29), 'MR_REPORTS', 'A report with patient data accessed.', 'PATIENT CLINICAL INFO'],
+ # ['CJ', None, datetime(2014, 1, 1, 10, 10, 56), 'AC_IB_CREATEMSG', 'In Basket message of any type created. (Created messages counted.) ', 'In Basket Report'],
+ # ['AB', None, datetime(2014, 2, 26, 19, 27, 48), 'IP_SYSTEM_LIST', 'Inpatient system list accessed.', 'PATIENT DEMOGRAPHICS'],
+ # ['AB', 3047429, datetime(2014, 3, 16, 20, 56, 54), 'MR_RESULTS_REVIEW', 'Results Review activity accessed.', 'Patient Chart Review'],
+ # ['CJ', 3289034, datetime(2014, 3, 20, 0, 40, 18), 'IP_ORDERSSECTION', 'Inpatient Orders section opened ', 'PATIENT CLINICAL INFO'],
+ # ['AB', 3408732, datetime(2014, 4, 8, 8, 47, 38), 'MR_RESULTS_REVIEW', 'Results Review activity accessed.', 'Patient Chart Review'],
+ # ];
+ # actualData = DBUtil.execute(testQuery, self.testUserIDs);
+ # self.assertEqualTable( expectedData, actualData );
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ suite = unittest.TestSuite();
+ #suite.addTest(TestProviderRotationConversion("test_incColNamesAndTypeCodes"));
+ #suite.addTest(TestProviderRotationConversion("test_insertFile_skipErrors"));
+ #suite.addTest(TestProviderRotationConversion('test_executeIterator'));
+ #suite.addTest(TestProviderRotationConversion('test_findOrInsertItem'));
+ suite.addTest(unittest.makeSuite(TestProviderRotationConversion));
+
+ return suite;
+
+if __name__=="__main__":
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/test/TestResidentScheduleFormat.py b/medinfo/dataconversion/test/TestResidentScheduleFormat.py
index 907d374e..bd1b93aa 100644
--- a/medinfo/dataconversion/test/TestResidentScheduleFormat.py
+++ b/medinfo/dataconversion/test/TestResidentScheduleFormat.py
@@ -2,196 +2,214 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
-from medinfo.db.test.Util import DBTestCase;
+from medinfo.common.test.Util import MedInfoTestCase;
-from medinfo.db import DBUtil
-from medinfo.db.Model import SQLQuery, RowItemModel, generatePlaceholders;
+from medinfo.db.Model import RowItemModel;
from medinfo.dataconversion.ResidentScheduleFormat import ResidentScheduleFormat;
-class TestResidentScheduleFormat(DBTestCase):
+class TestResidentScheduleFormat(MedInfoTestCase):
def setUp(self):
"""Prepare state for test cases"""
- DBTestCase.setUp(self);
+ MedInfoTestCase.setUp(self);
+
+ self.BASE_YEAR = 2013; # Expected base/start year that the test data represents
self.R1_DATA = \
- """Dates\t6/25 - 7/19\t7/20 - 8/16\t8/17 - 9/13\t9/14 - 10/11\t10/12 - 11/8\t11/9 - 12/6\t12/7 - 1/3\t1/4 - 1/31\t2/1 - 2/28\t3/1 - 3/28\t3/29 - 4/25\t4/26 - 5/23\t5/24 - 6/24
-Split\t(7/6)\t(8/3)\t(8/31)\t(9/28)\t(10/26)\t(11/23)\t(12/21)\t(1/18)\t(2/15)\t(3/15)\t(4/12)\t(5/10)\t(6/7)
-"R1VA"\tStanford Wards\tOncology\tStanford Wards\tVA ICU\tVA Night Team | Vacation\tStanford ED\tStanford Wards\tGastroenterology Inpatient | Gastroenterology Outpatient\tGeneral Cardiology\tSCV Wards\tVA Wards\tGeriatrics | VA Night Team\tPulmonology SUH | Vacation
-"R1KC"\tVA ICU\tGeneral Cardiology\tStanford Wards\tSCV Wards\tStanford Night Team | Vacation\tOncology\tVA Wards\tStanford Wards\tHematology\tStanford ED\tInfectious Disease VA | Pulmonology SUH\tStanford Wards\tVacation | Geriatrics
-"R1AC"\tSCV Wards\tVA ICU\tVA Wards\tStanford Wards\tVA Night Team | Vacation\tStanford Wards\tVA Wards\tGeneral Cardiology\tGastroenterology Inpatient | Gastroenterology Outpatient\tPulmonology SUH | Vacation\tStanford Wards\tStanford Night Team | Geriatrics\tOncology
+ """Split dates in '( )'\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13
+\t6/25 - 7/19\t7/20 - 8/16\t8/17 - 9/13\t9/14 - 10/11\t10/12 - 11/8\t11/9 - 12/6\t12/7 - 1/3\t1/4 - 1/31\t2/1 - 2/28\t3/1 - 3/28\t3/29 - 4/25\t4/26 - 5/23\t5/24 - 6/24
+\t(7/6)\t(8/3)\t(8/31)\t(9/28)\t(10/26)\t(11/23)\t(12/21)\t(1/18)\t(2/15)\t(3/15)\t(4/12)\t(5/10)\t(6/7)
+"R1, VA"\tStanford Wards\tOncology\tStanford Wards\tVA ICU\tVA Night Team | Vacation\tStanford ED\tStanford Wards\tGastroenterology Inpatient | Gastroenterology Outpatient\tGeneral Cardiology\tSCV Wards\tVA Wards\tGeriatrics | VA Night Team\tPulmonology SUH | Vacation
+"R1, KC"\tVA ICU\tGeneral Cardiology\tStanford Wards\tSCV Wards\tStanford Night Team | Vacation\tOncology\tVA Wards\tStanford Wards\tHematology\tStanford ED\tInfectious Disease VA | Pulmonology SUH\tStanford Wards\tVacation | Geriatrics
+"R1, AC"\tSCV Wards\tVA ICU\tVA Wards\tStanford Wards\tVA Night Team | Vacation\tStanford Wards\tVA Wards\tGeneral Cardiology\tGastroenterology Inpatient | Gastroenterology Outpatient\tPulmonology SUH | Vacation\tStanford Wards\tStanford Night Team | Geriatrics\tOncology
""";
self.R2_DATA = \
- """Dates\t7/1 - 7/26\t7/27 - 8/23\t8/24 - 9/20\t9/21 - 10/18\t10/19 - 11/15\t11/16 - 12/27\t12/28 - 1/10\t1/11 - 2/7\t2/8 - 3/7\t3/8 - 4/4\t4/5 - 5/2\t5/3 - 5/30\t5/31 - 6/30
-Split\t(7/13)\t(8/10)\t(9/7)\t(10/5)\t(11/2)\t(12/7)\t(1/5)\t(1/25)\t(2/22)\t(3/22)\t(4/19)\t(5/17)\t(6/14)
-"R2AA"\tStanford ICU\tVA Night Team | Palliative Care VA\tStanford Night Team | Global Health Elective\tCCU Heart Failure\tVA Vacation | Willow Block\tGastroenterology Outpatient | Rheumatology\tHoliday 12/28-1/1\tOutpatient Oncology | Johnson & Johnson\tJohnson & Johnson\tOutpatient Neuro | Nephrology Outpatient\tVA Vacation | Endocrinology\tSCV Wards\tVA Wards
+ """Split dates in '( )'\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13
+\t7/1 - 7/26\t7/27 - 8/23\t8/24 - 9/20\t9/21 - 10/18\t10/19 - 11/15\t11/16 - 12/27\t12/28 - 1/10\t1/11 - 2/7\t2/8 - 3/7\t3/8 - 4/4\t4/5 - 5/2\t5/3 - 5/30\t5/31 - 6/30
+\t(7/13)\t(8/10)\t(9/7)\t(10/5)\t(11/2)\t(12/7)\t(1/5)\t(1/25)\t(2/22)\t(3/22)\t(4/19)\t(5/17)\t(6/14)
+"R2, AA"\tStanford ICU\tVA Night Team | Palliative Care VA\tStanford Night Team | Global Health Elective\tCCU Heart Failure\tVA Vacation | Willow Block\tGastroenterology Outpatient | Rheumatology\tHoliday 12/28-1/1\tOutpatient Oncology | Johnson & Johnson\tJohnson & Johnson\tOutpatient Neuro | Nephrology Outpatient\tVA Vacation | Endocrinology\tSCV Wards\tVA Wards
\t\t\t\t\t\t\tPulmonology SUH\t\t\t\t\t\t
-"R2MB"\tCCU Heart Failure\tStanford ICU\tStanford Wards\tWomen's Health | VA Ambulatory\tVA Wards\tHoliday 12/23-12/27\t\t\t\tSIM Block 4/2-4/4\tOutpatient Neuro | Stanford Night Team\tStanford Night Team | Menlo Clinic\tNephrology Outpatient 6/23-6/30
+"R2, MB"\tCCU Heart Failure\tStanford ICU\tStanford Wards\tWomen's Health | VA Ambulatory\tVA Wards\tHoliday 12/23-12/27\t\t\t\tSIM Block 4/2-4/4\tOutpatient Neuro | Stanford Night Team\tStanford Night Team | Menlo Clinic\tNephrology Outpatient 6/23-6/30
\t\t\t\t\t\tOutpatient Oncology | Outpatient Hematology\t\t\t\t--\t\t\tWomen's Health | Vacation
-"R2DL"\tCCU Heart Failure\tGastroenterology Inpatient | Gastroenterology Outpatient\tResearch\tVA Wards\tNephrology Outpatient | Nephrology Inpatient\tVacation 11/30-12/13\tOncology\tVA Wards\tStanford ICU\tVA Night Team | Vacation\tStanford ED\tPulmonology SUH | Rheumatology\tHIV | VA Night Team
+"R2, DL"\tCCU Heart Failure\tGastroenterology Inpatient | Gastroenterology Outpatient\tResearch\tVA Wards\tNephrology Outpatient | Nephrology Inpatient\tVacation 11/30-12/13\tOncology\tVA Wards\tStanford ICU\tVA Night Team | Vacation\tStanford ED\tPulmonology SUH | Rheumatology\tHIV | VA Night Team
\t\t\t\t\t\tHomeless 12/14-12/22\t\t\t\t\t\t\t
\t\t\t\t\t\tHoliday 12/23-12/27\t\t\t\t\t\t\t
\t\t\t\t\t\tNephrology Inpatient\t\t\t\t\t\t\t
-"R2TS"\tOutpatient Hematology | Outpatient Oncology\t-\t\t- | VA Night Team\tCCU Heart Failure\tHoliday 12/23-12/27\tSCV Wards\tPalliative Care VA | VA Night Team\tVacation | Hepatology\tStanford ICU\tVA Wards\tEndocrinology | Stanford Night Team\tVacation | HIV
+"R2, TS"\tOutpatient Hematology | Outpatient Oncology\t-\t\t- | VA Night Team\tCCU Heart Failure\tHoliday 12/23-12/27\tSCV Wards\tPalliative Care VA | VA Night Team\tVacation | Hepatology\tStanford ICU\tVA Wards\tEndocrinology | Stanford Night Team\tVacation | HIV
\t\t\t\t\t\tHomeless | Neurology\t\t\t\t\t\t\t
""";
self.converter = ResidentScheduleFormat(); # Instance to test on
+ self.converter.loadProviderModels \
+ (
+ [
+ {"prov_id":"S001", "last_name":"R1", "first_name":"VA"},
+ {"prov_id":"S002", "last_name":"R1", "first_name":"KC"},
+ {"prov_id":"S003", "last_name":"R1", "first_name":"AC"},
+ {"prov_id":"S004", "last_name":"R2", "first_name":"AA"},
+ {"prov_id":"S005", "last_name":"R2", "first_name":"MB"},
+ {"prov_id":"S006", "last_name":"R2", "first_name":"DL"},
+ #{"prov_id":"S007", "last_name":"R2", "first_name":"TS"}, # Deliberately missing an entry to test robustness if missing lookup
+ {"prov_id":"S008", "last_name":"R3", "first_name":"AB"},
+ {"prov_id":"S009", "last_name":"R3", "first_name":"CD"},
+ {"prov_id":"S010", "last_name":"R3", "first_name":"EF"},
+ ]
+ );
def tearDown(self):
"""Restore state from any setUp or test steps"""
- DBTestCase.tearDown(self);
+ MedInfoTestCase.tearDown(self);
def test_dataConversion(self):
# Run the data conversion on the same data and look for expected records
log.debug("Run the formatting process for R1s");
- headers = ["resident","rotation","start","end"];
+ headers = ["prov_id","name","rotation","start_date","end_date"];
expectedData = \
[
- RowItemModel( ['R1VA', 'Stanford Wards', datetime(2013, 6, 25, 7, 0), datetime(2013, 7, 20, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Oncology', datetime(2013, 7, 20, 7, 0), datetime(2013, 8, 17, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Stanford Wards', datetime(2013, 8, 17, 7, 0), datetime(2013, 9, 14, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'VA ICU', datetime(2013, 9, 14, 7, 0), datetime(2013, 10, 12, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'VA Night Team', datetime(2013, 10, 12, 7, 0), datetime(2013, 10, 26, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Vacation', datetime(2013, 10, 26, 7, 0), datetime(2013, 11, 9, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Stanford ED', datetime(2013, 11, 9, 7, 0), datetime(2013, 12, 7, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Stanford Wards', datetime(2013, 12, 7, 7, 0), datetime(2014, 1, 4, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Gastroenterology Inpatient', datetime(2014, 1, 4, 7, 0), datetime(2014, 1, 18, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Gastroenterology Outpatient', datetime(2014, 1, 18, 7, 0), datetime(2014, 2, 1, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'General Cardiology', datetime(2014, 2, 1, 7, 0), datetime(2014, 3, 1, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'SCV Wards', datetime(2014, 3, 1, 7, 0), datetime(2014, 3, 29, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'VA Wards', datetime(2014, 3, 29, 7, 0), datetime(2014, 4, 26, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Geriatrics', datetime(2014, 4, 26, 7, 0), datetime(2014, 5, 10, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'VA Night Team', datetime(2014, 5, 10, 7, 0), datetime(2014, 5, 24, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Pulmonology SUH', datetime(2014, 5, 24, 7, 0), datetime(2014, 6, 7, 7, 0)], headers ),
- RowItemModel( ['R1VA', 'Vacation', datetime(2014, 6, 7, 7, 0), datetime(2014, 6, 25, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'VA ICU', datetime(2013, 6, 25, 7, 0), datetime(2013, 7, 20, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'General Cardiology', datetime(2013, 7, 20, 7, 0), datetime(2013, 8, 17, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Stanford Wards', datetime(2013, 8, 17, 7, 0), datetime(2013, 9, 14, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'SCV Wards', datetime(2013, 9, 14, 7, 0), datetime(2013, 10, 12, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Stanford Night Team', datetime(2013, 10, 12, 7, 0), datetime(2013, 10, 26, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Vacation', datetime(2013, 10, 26, 7, 0), datetime(2013, 11, 9, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Oncology', datetime(2013, 11, 9, 7, 0), datetime(2013, 12, 7, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'VA Wards', datetime(2013, 12, 7, 7, 0), datetime(2014, 1, 4, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Stanford Wards', datetime(2014, 1, 4, 7, 0), datetime(2014, 2, 1, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Hematology', datetime(2014, 2, 1, 7, 0), datetime(2014, 3, 1, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Stanford ED', datetime(2014, 3, 1, 7, 0), datetime(2014, 3, 29, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Infectious Disease VA', datetime(2014, 3, 29, 7, 0), datetime(2014, 4, 12, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Pulmonology SUH', datetime(2014, 4, 12, 7, 0), datetime(2014, 4, 26, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Stanford Wards', datetime(2014, 4, 26, 7, 0), datetime(2014, 5, 24, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Vacation', datetime(2014, 5, 24, 7, 0), datetime(2014, 6, 7, 7, 0)], headers ),
- RowItemModel( ['R1KC', 'Geriatrics', datetime(2014, 6, 7, 7, 0), datetime(2014, 6, 25, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'SCV Wards', datetime(2013, 6, 25, 7, 0), datetime(2013, 7, 20, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'VA ICU', datetime(2013, 7, 20, 7, 0), datetime(2013, 8, 17, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'VA Wards', datetime(2013, 8, 17, 7, 0), datetime(2013, 9, 14, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Stanford Wards', datetime(2013, 9, 14, 7, 0), datetime(2013, 10, 12, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'VA Night Team', datetime(2013, 10, 12, 7, 0), datetime(2013, 10, 26, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Vacation', datetime(2013, 10, 26, 7, 0), datetime(2013, 11, 9, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Stanford Wards', datetime(2013, 11, 9, 7, 0), datetime(2013, 12, 7, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'VA Wards', datetime(2013, 12, 7, 7, 0), datetime(2014, 1, 4, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'General Cardiology', datetime(2014, 1, 4, 7, 0), datetime(2014, 2, 1, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Gastroenterology Inpatient', datetime(2014, 2, 1, 7, 0), datetime(2014, 2, 15, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Gastroenterology Outpatient', datetime(2014, 2, 15, 7, 0), datetime(2014, 3, 1, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Pulmonology SUH', datetime(2014, 3, 1, 7, 0), datetime(2014, 3, 15, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Vacation', datetime(2014, 3, 15, 7, 0), datetime(2014, 3, 29, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Stanford Wards', datetime(2014, 3, 29, 7, 0), datetime(2014, 4, 26, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Stanford Night Team', datetime(2014, 4, 26, 7, 0), datetime(2014, 5, 10, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Geriatrics', datetime(2014, 5, 10, 7, 0), datetime(2014, 5, 24, 7, 0)], headers ),
- RowItemModel( ['R1AC', 'Oncology', datetime(2014, 5, 24, 7, 0), datetime(2014, 6, 25, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Stanford Wards', datetime(2013, 6, 25, 7, 0), datetime(2013, 7, 20, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Oncology', datetime(2013, 7, 20, 7, 0), datetime(2013, 8, 17, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Stanford Wards', datetime(2013, 8, 17, 7, 0), datetime(2013, 9, 14, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'VA ICU', datetime(2013, 9, 14, 7, 0), datetime(2013, 10, 12, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'VA Night Team', datetime(2013, 10, 12, 7, 0), datetime(2013, 10, 26, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Vacation', datetime(2013, 10, 26, 7, 0), datetime(2013, 11, 9, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Stanford ED', datetime(2013, 11, 9, 7, 0), datetime(2013, 12, 7, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Stanford Wards', datetime(2013, 12, 7, 7, 0), datetime(2014, 1, 4, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Gastroenterology Inpatient', datetime(2014, 1, 4, 7, 0), datetime(2014, 1, 18, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Gastroenterology Outpatient', datetime(2014, 1, 18, 7, 0), datetime(2014, 2, 1, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'General Cardiology', datetime(2014, 2, 1, 7, 0), datetime(2014, 3, 1, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'SCV Wards', datetime(2014, 3, 1, 7, 0), datetime(2014, 3, 29, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'VA Wards', datetime(2014, 3, 29, 7, 0), datetime(2014, 4, 26, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Geriatrics', datetime(2014, 4, 26, 7, 0), datetime(2014, 5, 10, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'VA Night Team', datetime(2014, 5, 10, 7, 0), datetime(2014, 5, 24, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Pulmonology SUH', datetime(2014, 5, 24, 7, 0), datetime(2014, 6, 7, 7, 0)], headers ),
+ RowItemModel( ['S001', 'R1, VA', 'Vacation', datetime(2014, 6, 7, 7, 0), datetime(2014, 6, 25, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'VA ICU', datetime(2013, 6, 25, 7, 0), datetime(2013, 7, 20, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'General Cardiology', datetime(2013, 7, 20, 7, 0), datetime(2013, 8, 17, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Stanford Wards', datetime(2013, 8, 17, 7, 0), datetime(2013, 9, 14, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'SCV Wards', datetime(2013, 9, 14, 7, 0), datetime(2013, 10, 12, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Stanford Night Team', datetime(2013, 10, 12, 7, 0), datetime(2013, 10, 26, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Vacation', datetime(2013, 10, 26, 7, 0), datetime(2013, 11, 9, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Oncology', datetime(2013, 11, 9, 7, 0), datetime(2013, 12, 7, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'VA Wards', datetime(2013, 12, 7, 7, 0), datetime(2014, 1, 4, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Stanford Wards', datetime(2014, 1, 4, 7, 0), datetime(2014, 2, 1, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Hematology', datetime(2014, 2, 1, 7, 0), datetime(2014, 3, 1, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Stanford ED', datetime(2014, 3, 1, 7, 0), datetime(2014, 3, 29, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Infectious Disease VA', datetime(2014, 3, 29, 7, 0), datetime(2014, 4, 12, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Pulmonology SUH', datetime(2014, 4, 12, 7, 0), datetime(2014, 4, 26, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Stanford Wards', datetime(2014, 4, 26, 7, 0), datetime(2014, 5, 24, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Vacation', datetime(2014, 5, 24, 7, 0), datetime(2014, 6, 7, 7, 0)], headers ),
+ RowItemModel( ['S002', 'R1, KC', 'Geriatrics', datetime(2014, 6, 7, 7, 0), datetime(2014, 6, 25, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'SCV Wards', datetime(2013, 6, 25, 7, 0), datetime(2013, 7, 20, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'VA ICU', datetime(2013, 7, 20, 7, 0), datetime(2013, 8, 17, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'VA Wards', datetime(2013, 8, 17, 7, 0), datetime(2013, 9, 14, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Stanford Wards', datetime(2013, 9, 14, 7, 0), datetime(2013, 10, 12, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'VA Night Team', datetime(2013, 10, 12, 7, 0), datetime(2013, 10, 26, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Vacation', datetime(2013, 10, 26, 7, 0), datetime(2013, 11, 9, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Stanford Wards', datetime(2013, 11, 9, 7, 0), datetime(2013, 12, 7, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'VA Wards', datetime(2013, 12, 7, 7, 0), datetime(2014, 1, 4, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'General Cardiology', datetime(2014, 1, 4, 7, 0), datetime(2014, 2, 1, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Gastroenterology Inpatient', datetime(2014, 2, 1, 7, 0), datetime(2014, 2, 15, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Gastroenterology Outpatient', datetime(2014, 2, 15, 7, 0), datetime(2014, 3, 1, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Pulmonology SUH', datetime(2014, 3, 1, 7, 0), datetime(2014, 3, 15, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Vacation', datetime(2014, 3, 15, 7, 0), datetime(2014, 3, 29, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Stanford Wards', datetime(2014, 3, 29, 7, 0), datetime(2014, 4, 26, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Stanford Night Team', datetime(2014, 4, 26, 7, 0), datetime(2014, 5, 10, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Geriatrics', datetime(2014, 5, 10, 7, 0), datetime(2014, 5, 24, 7, 0)], headers ),
+ RowItemModel( ['S003', 'R1, AC', 'Oncology', datetime(2014, 5, 24, 7, 0), datetime(2014, 6, 25, 7, 0)], headers ),
];
- actualData = self.converter.parseScheduleItems( StringIO(self.R1_DATA) );
+ actualData = self.converter.parseScheduleItems( StringIO(self.R1_DATA), self.BASE_YEAR );
self.assertEqualList( expectedData, actualData );
log.debug("Run the formatting process for R2s");
- headers = ["resident","rotation","start","end"];
+ headers = ["prov_id","name","rotation","start_date","end_date"];
expectedData = \
[
- RowItemModel( ['R2AA','Stanford ICU',datetime(2013,7,1,7),datetime(2013,7,27,7)], headers),
- RowItemModel( ['R2AA','VA Night Team',datetime(2013,7,27,7),datetime(2013,8,10,7)], headers),
- RowItemModel( ['R2AA','Palliative Care VA',datetime(2013,8,10,7),datetime(2013,8,24,7)], headers),
- RowItemModel( ['R2AA','Stanford Night Team',datetime(2013,8,24,7),datetime(2013,9,7,7)], headers),
- RowItemModel( ['R2AA','Global Health Elective',datetime(2013,9,7,7),datetime(2013,9,21,7)], headers),
- RowItemModel( ['R2AA','CCU Heart Failure',datetime(2013,9,21,7),datetime(2013,10,19,7)], headers),
- RowItemModel( ['R2AA','VA Vacation',datetime(2013,10,19,7),datetime(2013,11,2,7)], headers),
- RowItemModel( ['R2AA','Willow Block',datetime(2013,11,2,7),datetime(2013,11,16,7)], headers),
- RowItemModel( ['R2AA','Gastroenterology Outpatient',datetime(2013,11,16,7),datetime(2013,12,7,7)], headers),
- RowItemModel( ['R2AA','Rheumatology',datetime(2013,12,7,7),datetime(2013,12,28,7)], headers),
- RowItemModel( ['R2AA','Holiday',datetime(2013,12,28,7),datetime(2014,1,2,7)], headers),
- RowItemModel( ['R2AA','Pulmonology SUH',datetime(2014,1,2,7),datetime(2014,1,11,7)], headers),
- RowItemModel( ['R2AA','Outpatient Oncology',datetime(2014,1,11,7),datetime(2014,1,25,7)], headers),
- RowItemModel( ['R2AA','Johnson & Johnson',datetime(2014,1,25,7),datetime(2014,2,8,7)], headers),
- RowItemModel( ['R2AA','Johnson & Johnson',datetime(2014,2,8,7),datetime(2014,3,8,7)], headers),
- RowItemModel( ['R2AA','Outpatient Neuro',datetime(2014,3,8,7),datetime(2014,3,22,7)], headers),
- RowItemModel( ['R2AA','Nephrology Outpatient',datetime(2014,3,22,7),datetime(2014,4,5,7)], headers),
- RowItemModel( ['R2AA','VA Vacation',datetime(2014,4,5,7),datetime(2014,4,19,7)], headers),
- RowItemModel( ['R2AA','Endocrinology',datetime(2014,4,19,7),datetime(2014,5,3,7)], headers),
- RowItemModel( ['R2AA','SCV Wards',datetime(2014,5,3,7),datetime(2014,5,31,7)], headers),
- RowItemModel( ['R2AA','VA Wards',datetime(2014,5,31,7),datetime(2014,7,1,7)], headers),
- RowItemModel( ['R2MB','CCU Heart Failure',datetime(2013,7,1,7),datetime(2013,7,27,7)], headers),
- RowItemModel( ['R2MB','Stanford ICU',datetime(2013,7,27,7),datetime(2013,8,24,7)], headers),
- RowItemModel( ['R2MB','Stanford Wards',datetime(2013,8,24,7),datetime(2013,9,21,7)], headers),
- RowItemModel( ['R2MB','Women\'s Health',datetime(2013,9,21,7),datetime(2013,10,5,7)], headers),
- RowItemModel( ['R2MB','VA Ambulatory',datetime(2013,10,5,7),datetime(2013,10,19,7)], headers),
- RowItemModel( ['R2MB','VA Wards',datetime(2013,10,19,7),datetime(2013,11,16,7)], headers),
- RowItemModel( ['R2MB','Outpatient Oncology',datetime(2013,11,16,7),datetime(2013,12,7,7)], headers),
- RowItemModel( ['R2MB','Outpatient Hematology',datetime(2013,12,7,7),datetime(2013,12,23,7)], headers),
- RowItemModel( ['R2MB','Holiday',datetime(2013,12,23,7),datetime(2013,12,28,7)], headers),
- RowItemModel( ['R2MB','SIM Block',datetime(2014,4,2,7),datetime(2014,4,5,7)], headers),
- RowItemModel( ['R2MB','Outpatient Neuro',datetime(2014,4,5,7),datetime(2014,4,19,7)], headers),
- RowItemModel( ['R2MB','Stanford Night Team',datetime(2014,4,19,7),datetime(2014,5,3,7)], headers),
- RowItemModel( ['R2MB','Stanford Night Team',datetime(2014,5,3,7),datetime(2014,5,17,7)], headers),
- RowItemModel( ['R2MB','Menlo Clinic',datetime(2014,5,17,7),datetime(2014,5,31,7)], headers),
- RowItemModel( ['R2MB','Women\'s Health',datetime(2014,5,31,7),datetime(2014,6,14,7)], headers),
- RowItemModel( ['R2MB','Vacation',datetime(2014,6,14,7),datetime(2014,6,23,7)], headers),
- RowItemModel( ['R2MB','Nephrology Outpatient',datetime(2014,6,23,7),datetime(2014,7,1,7)], headers),
- RowItemModel( ['R2DL','CCU Heart Failure',datetime(2013,7,1,7),datetime(2013,7,27,7)], headers),
- RowItemModel( ['R2DL','Gastroenterology Inpatient',datetime(2013,7,27,7),datetime(2013,8,10,7)], headers),
- RowItemModel( ['R2DL','Gastroenterology Outpatient',datetime(2013,8,10,7),datetime(2013,8,24,7)], headers),
- RowItemModel( ['R2DL','Research',datetime(2013,8,24,7),datetime(2013,9,21,7)], headers),
- RowItemModel( ['R2DL','VA Wards',datetime(2013,9,21,7),datetime(2013,10,19,7)], headers),
- RowItemModel( ['R2DL','Nephrology Outpatient',datetime(2013,10,19,7),datetime(2013,11,2,7)], headers),
- RowItemModel( ['R2DL','Nephrology Inpatient',datetime(2013,11,2,7),datetime(2013,11,16,7)], headers),
- RowItemModel( ['R2DL','Nephrology Inpatient',datetime(2013,11,16,7),datetime(2013,11,30,7)], headers),
- RowItemModel( ['R2DL','Vacation',datetime(2013,11,30,7),datetime(2013,12,14,7)], headers),
- RowItemModel( ['R2DL','Homeless',datetime(2013,12,14,7),datetime(2013,12,23,7)], headers),
- RowItemModel( ['R2DL','Holiday',datetime(2013,12,23,7),datetime(2013,12,28,7)], headers),
- RowItemModel( ['R2DL','Oncology',datetime(2013,12,28,7),datetime(2014,1,11,7)], headers),
- RowItemModel( ['R2DL','VA Wards',datetime(2014,1,11,7),datetime(2014,2,8,7)], headers),
- RowItemModel( ['R2DL','Stanford ICU',datetime(2014,2,8,7),datetime(2014,3,8,7)], headers),
- RowItemModel( ['R2DL','VA Night Team',datetime(2014,3,8,7),datetime(2014,3,22,7)], headers),
- RowItemModel( ['R2DL','Vacation',datetime(2014,3,22,7),datetime(2014,4,5,7)], headers),
- RowItemModel( ['R2DL','Stanford ED',datetime(2014,4,5,7),datetime(2014,5,3,7)], headers),
- RowItemModel( ['R2DL','Pulmonology SUH',datetime(2014,5,3,7),datetime(2014,5,17,7)], headers),
- RowItemModel( ['R2DL','Rheumatology',datetime(2014,5,17,7),datetime(2014,5,31,7)], headers),
- RowItemModel( ['R2DL','HIV',datetime(2014,5,31,7),datetime(2014,6,14,7)], headers),
- RowItemModel( ['R2DL','VA Night Team',datetime(2014,6,14,7),datetime(2014,7,1,7)], headers),
- RowItemModel( ['R2TS','Outpatient Hematology',datetime(2013,7,1,7),datetime(2013,7,13,7)], headers),
- RowItemModel( ['R2TS','Outpatient Oncology',datetime(2013,7,13,7),datetime(2013,7,27,7)], headers),
- RowItemModel( ['R2TS','VA Night Team',datetime(2013,10,5,7),datetime(2013,10,19,7)], headers),
- RowItemModel( ['R2TS','CCU Heart Failure',datetime(2013,10,19,7),datetime(2013,11,16,7)], headers),
- RowItemModel( ['R2TS','Homeless',datetime(2013,11,16,7),datetime(2013,12,7,7)], headers),
- RowItemModel( ['R2TS','Neurology',datetime(2013,12,7,7),datetime(2013,12,23,7)], headers),
- RowItemModel( ['R2TS','Holiday',datetime(2013,12,23,7),datetime(2013,12,28,7)], headers),
- RowItemModel( ['R2TS','SCV Wards',datetime(2013,12,28,7),datetime(2014,1,11,7)], headers),
- RowItemModel( ['R2TS','Palliative Care VA',datetime(2014,1,11,7),datetime(2014,1,25,7)], headers),
- RowItemModel( ['R2TS','VA Night Team',datetime(2014,1,25,7),datetime(2014,2,8,7)], headers),
- RowItemModel( ['R2TS','Vacation',datetime(2014,2,8,7),datetime(2014,2,22,7)], headers),
- RowItemModel( ['R2TS','Hepatology',datetime(2014,2,22,7),datetime(2014,3,8,7)], headers),
- RowItemModel( ['R2TS','Stanford ICU',datetime(2014,3,8,7),datetime(2014,4,5,7)], headers),
- RowItemModel( ['R2TS','VA Wards',datetime(2014,4,5,7),datetime(2014,5,3,7)], headers),
- RowItemModel( ['R2TS','Endocrinology',datetime(2014,5,3,7),datetime(2014,5,17,7)], headers),
- RowItemModel( ['R2TS','Stanford Night Team',datetime(2014,5,17,7),datetime(2014,5,31,7)], headers),
- RowItemModel( ['R2TS','Vacation',datetime(2014,5,31,7),datetime(2014,6,14,7)], headers),
- RowItemModel( ['R2TS','HIV',datetime(2014,6,14,7),datetime(2014,7,1,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Stanford ICU',datetime(2013,7,1,7),datetime(2013,7,27,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','VA Night Team',datetime(2013,7,27,7),datetime(2013,8,10,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Palliative Care VA',datetime(2013,8,10,7),datetime(2013,8,24,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Stanford Night Team',datetime(2013,8,24,7),datetime(2013,9,7,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Global Health Elective',datetime(2013,9,7,7),datetime(2013,9,21,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','CCU Heart Failure',datetime(2013,9,21,7),datetime(2013,10,19,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','VA Vacation',datetime(2013,10,19,7),datetime(2013,11,2,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Willow Block',datetime(2013,11,2,7),datetime(2013,11,16,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Gastroenterology Outpatient',datetime(2013,11,16,7),datetime(2013,12,7,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Rheumatology',datetime(2013,12,7,7),datetime(2013,12,28,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Holiday',datetime(2013,12,28,7),datetime(2014,1,2,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Pulmonology SUH',datetime(2014,1,2,7),datetime(2014,1,11,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Outpatient Oncology',datetime(2014,1,11,7),datetime(2014,1,25,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Johnson & Johnson',datetime(2014,1,25,7),datetime(2014,2,8,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Johnson & Johnson',datetime(2014,2,8,7),datetime(2014,3,8,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Outpatient Neuro',datetime(2014,3,8,7),datetime(2014,3,22,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Nephrology Outpatient',datetime(2014,3,22,7),datetime(2014,4,5,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','VA Vacation',datetime(2014,4,5,7),datetime(2014,4,19,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','Endocrinology',datetime(2014,4,19,7),datetime(2014,5,3,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','SCV Wards',datetime(2014,5,3,7),datetime(2014,5,31,7)], headers),
+ RowItemModel( ['S004', 'R2, AA','VA Wards',datetime(2014,5,31,7),datetime(2014,7,1,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','CCU Heart Failure',datetime(2013,7,1,7),datetime(2013,7,27,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Stanford ICU',datetime(2013,7,27,7),datetime(2013,8,24,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Stanford Wards',datetime(2013,8,24,7),datetime(2013,9,21,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Women\'s Health',datetime(2013,9,21,7),datetime(2013,10,5,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','VA Ambulatory',datetime(2013,10,5,7),datetime(2013,10,19,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','VA Wards',datetime(2013,10,19,7),datetime(2013,11,16,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Outpatient Oncology',datetime(2013,11,16,7),datetime(2013,12,7,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Outpatient Hematology',datetime(2013,12,7,7),datetime(2013,12,23,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Holiday',datetime(2013,12,23,7),datetime(2013,12,28,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','SIM Block',datetime(2014,4,2,7),datetime(2014,4,5,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Outpatient Neuro',datetime(2014,4,5,7),datetime(2014,4,19,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Stanford Night Team',datetime(2014,4,19,7),datetime(2014,5,3,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Stanford Night Team',datetime(2014,5,3,7),datetime(2014,5,17,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Menlo Clinic',datetime(2014,5,17,7),datetime(2014,5,31,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Women\'s Health',datetime(2014,5,31,7),datetime(2014,6,14,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Vacation',datetime(2014,6,14,7),datetime(2014,6,23,7)], headers),
+ RowItemModel( ['S005', 'R2, MB','Nephrology Outpatient',datetime(2014,6,23,7),datetime(2014,7,1,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','CCU Heart Failure',datetime(2013,7,1,7),datetime(2013,7,27,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Gastroenterology Inpatient',datetime(2013,7,27,7),datetime(2013,8,10,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Gastroenterology Outpatient',datetime(2013,8,10,7),datetime(2013,8,24,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Research',datetime(2013,8,24,7),datetime(2013,9,21,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','VA Wards',datetime(2013,9,21,7),datetime(2013,10,19,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Nephrology Outpatient',datetime(2013,10,19,7),datetime(2013,11,2,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Nephrology Inpatient',datetime(2013,11,2,7),datetime(2013,11,16,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Nephrology Inpatient',datetime(2013,11,16,7),datetime(2013,11,30,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Vacation',datetime(2013,11,30,7),datetime(2013,12,14,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Homeless',datetime(2013,12,14,7),datetime(2013,12,23,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Holiday',datetime(2013,12,23,7),datetime(2013,12,28,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Oncology',datetime(2013,12,28,7),datetime(2014,1,11,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','VA Wards',datetime(2014,1,11,7),datetime(2014,2,8,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Stanford ICU',datetime(2014,2,8,7),datetime(2014,3,8,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','VA Night Team',datetime(2014,3,8,7),datetime(2014,3,22,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Vacation',datetime(2014,3,22,7),datetime(2014,4,5,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Stanford ED',datetime(2014,4,5,7),datetime(2014,5,3,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Pulmonology SUH',datetime(2014,5,3,7),datetime(2014,5,17,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','Rheumatology',datetime(2014,5,17,7),datetime(2014,5,31,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','HIV',datetime(2014,5,31,7),datetime(2014,6,14,7)], headers),
+ RowItemModel( ['S006', 'R2, DL','VA Night Team',datetime(2014,6,14,7),datetime(2014,7,1,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Outpatient Hematology',datetime(2013,7,1,7),datetime(2013,7,13,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Outpatient Oncology',datetime(2013,7,13,7),datetime(2013,7,27,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','VA Night Team',datetime(2013,10,5,7),datetime(2013,10,19,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','CCU Heart Failure',datetime(2013,10,19,7),datetime(2013,11,16,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Homeless',datetime(2013,11,16,7),datetime(2013,12,7,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Neurology',datetime(2013,12,7,7),datetime(2013,12,23,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Holiday',datetime(2013,12,23,7),datetime(2013,12,28,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','SCV Wards',datetime(2013,12,28,7),datetime(2014,1,11,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Palliative Care VA',datetime(2014,1,11,7),datetime(2014,1,25,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','VA Night Team',datetime(2014,1,25,7),datetime(2014,2,8,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Vacation',datetime(2014,2,8,7),datetime(2014,2,22,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Hepatology',datetime(2014,2,22,7),datetime(2014,3,8,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Stanford ICU',datetime(2014,3,8,7),datetime(2014,4,5,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','VA Wards',datetime(2014,4,5,7),datetime(2014,5,3,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Endocrinology',datetime(2014,5,3,7),datetime(2014,5,17,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Stanford Night Team',datetime(2014,5,17,7),datetime(2014,5,31,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','Vacation',datetime(2014,5,31,7),datetime(2014,6,14,7)], headers),
+ RowItemModel( ['S-1001', 'R2, TS','HIV',datetime(2014,6,14,7),datetime(2014,7,1,7)], headers),
];
- actualData = self.converter.parseScheduleItems( StringIO(self.R2_DATA) );
+ actualData = self.converter.parseScheduleItems( StringIO(self.R2_DATA), self.BASE_YEAR );
self.assertEqualList( expectedData, actualData );
diff --git a/medinfo/dataconversion/test/TestSTRIDEAccessLogConversion.py b/medinfo/dataconversion/test/TestSTRIDEAccessLogConversion.py
index b133de80..59c57e1b 100644
--- a/medinfo/dataconversion/test/TestSTRIDEAccessLogConversion.py
+++ b/medinfo/dataconversion/test/TestSTRIDEAccessLogConversion.py
@@ -2,12 +2,12 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
@@ -83,6 +83,7 @@ def tearDown(self):
DBUtil.execute("drop table %s;" % TEST_SOURCE_TABLE);
DBTestCase.tearDown(self);
+ ### Disable these tests for now, as they refer to a different (old) Access Log dataset that is not being actively used (JonC, 7/6/2018)
# def test_dataConversion(self):
# # Run the data conversion on the same data and look for expected records
# log.debug("Run the conversion process...");
diff --git a/medinfo/dataconversion/test/TestSTRIDECultureMicroConversion.py b/medinfo/dataconversion/test/TestSTRIDECultureMicroConversion.py
new file mode 100644
index 00000000..0e6f10e2
--- /dev/null
+++ b/medinfo/dataconversion/test/TestSTRIDECultureMicroConversion.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python
+"""Test case for respective module in application package"""
+
+import sys, os
+from io import StringIO
+from datetime import datetime;
+import unittest
+
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
+
+from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+
+from medinfo.db import DBUtil
+from medinfo.db.Model import SQLQuery, RowItemModel;
+from medinfo.db.ResultsFormatter import TabDictReader;
+
+from medinfo.dataconversion.STRIDECultureMicroConversion import STRIDECultureMicroConversion, ConversionOptions;
+
+TEST_START_DATE = datetime(2100,1,1); # Date in far future to start checking for test records to avoid including existing data in database
+
+class TestSTRIDECultureMicroConversion(DBTestCase):
+ def setUp(self):
+ """Prepare state for test cases"""
+ DBTestCase.setUp(self);
+
+ log.info("Populate the database with test data")
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+
+ ###### PREPARE SOME FAKE INPUT DATA TO BE CONVERTED ##############
+ ###### PREPARE SOME FAKE INPUT DATA TO BE CONVERTED ##############
+ ###### PREPARE SOME FAKE INPUT DATA TO BE CONVERTED ##############
+ ###### PREPARE SOME FAKE INPUT DATA TO BE CONVERTED ##############
+ ###### PREPARE SOME FAKE INPUT DATA TO BE CONVERTED ##############
+
+ dataTextStr = \
+"""order_proc_anon_id,pat_anon_id,pat_enc_csn_anon_id,proc_code,organism_name,antibiotic_name,suseptibility,shifted_result_time
+-10,1,2,LABBLC,BACTEROIDES FRAGILIS,Clindamycin,Intermediate,9/10/2111 13:15
+-11,2,3,LABBLC,COAG NEGATIVE STAPHYLOCOCCUS,Vancomycin,Susceptible,4/26/2109 9:49
+-12,3,4,LABBLC,COAG NEGATIVE STAPHYLOCOCCUS,Oxacillin,Resistant,4/18/2109 4:48
+-13,4,5,LABBLC,COAG NEGATIVE STAPHYLOCOCCUS,Vancomycin,Susceptible,3/28/2109 23:21
+-14,5,6,LABBLC,ENTEROCOCCUS FAECALIS,Amoxicillin/Clavulanic Acid,Susceptible,6/3/2109 17:07
+-14,5,6,LABBLC,ENTEROCOCCUS FAECALIS,Amoxicillin/Clavulanic Acid,Susceptible,6/3/2109 17:07
+-20,10,11,LABBLC,ENTEROCOCCUS FAECALIS,Method,,6/10/2109 17:07
+-15,6,7,LABBLC2,,,,6/4/2109 17:07
+-16,7,8,LABBLC2,,,,
+-17,10,10,LABBLC2,ENTEROCOCCUS FAECALIS,Penicillin,,6/8/2109 17:07
+-17,10,10,LABBLC2,ENTEROCOCCUS FAECALIS,,Intermediate,6/11/2109 17:07
+-18,11,11,LABBLC2,ENTEROCOCCUS FAECALIS,Amikacin,Positive,6/11/2111 18:07
+"""
+ # Parse into DB insertion object
+ # DBUtil.insertFile( StringIO(dataTextStr), "stride_culture_micro", delim=" ", dateColFormats={"trtmnt_tm_begin_date": None, "trtmnt_tm_end_date": None} );
+ DBUtil.insertFile( StringIO(dataTextStr), "stride_culture_micro", delim=",", dateColFormats={"shifted_result_time": None} );
+
+
+ self.converter = STRIDECultureMicroConversion(); # Instance to test on
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ log.info("Purge test records from the database")
+
+ ######FIX THIS TO CLEANUP YOUR TEST DATA .... May be don't have to, since superclass will just drop the whole database anyway
+ DBUtil.execute \
+ ( """delete from patient_item
+ where clinical_item_id in
+ ( select clinical_item_id
+ from clinical_item as ci, clinical_item_category as cic
+ where ci.clinical_item_category_id = cic.clinical_item_category_id
+ and cic.source_table = 'stride_culture_micro'
+ );
+ """
+ );
+ DBUtil.execute \
+ ( """delete from clinical_item
+ where clinical_item_category_id in
+ ( select clinical_item_category_id
+ from clinical_item_category
+ where source_table = 'strid_culture_micro'
+ );
+ """
+ );
+ DBUtil.execute("delete from clinical_item_category where source_table = 'stride_culture_micro ';");
+
+ DBUtil.execute("delete from stride_culture_micro where order_proc_anon_id < 0");
+
+ DBTestCase.tearDown(self);
+
+ def test_dataConversion(self):
+ # Run the data conversion on the same data and look for expected records
+ log.debug("Run the conversion process...");
+ convOptions = ConversionOptions();
+ convOptions.startDate = TEST_START_DATE;
+ self.converter.convertSourceItems(convOptions);
+
+ # Just query back for the same data, de-normalizing the data back to a general table
+ testQuery = \
+ """
+ select
+ pi.external_id,
+ pi.patient_id,
+ pi.encounter_id,
+ cic.description,
+ ci.name,
+ ci.description,
+ pi.item_date
+ from
+ patient_item as pi,
+ clinical_item as ci,
+ clinical_item_category as cic
+ where
+ pi.clinical_item_id = ci.clinical_item_id and
+ ci.clinical_item_category_id = cic.clinical_item_category_id and
+ cic.source_table = 'stride_culture_micro'
+ order by
+ pi.external_id desc
+ """;
+ expectedData = \
+ [ ##### CHANGE to the actual expected data
+[-10, 1, 2, "Microculture Susceptibility General", "Clindamycin:Not_Susceptible", "Not_Susceptible TO Clindamycin", DBUtil.parseDateValue("9/10/2111 13:15"),],
+[-11, 2, 3, "Microculture Susceptibility General", "Vancomycin:Susceptible", "Susceptible TO Vancomycin", DBUtil.parseDateValue("4/26/2109 9:49"),],
+[-12, 3, 4, "Microculture Susceptibility General", "Oxacillin:Not_Susceptible", "Not_Susceptible TO Oxacillin", DBUtil.parseDateValue("4/18/2109 4:48"),],
+[-13, 4, 5, "Microculture Susceptibility General", "Vancomycin:Susceptible", "Susceptible TO Vancomycin", DBUtil.parseDateValue("3/28/2109 23:21"),],
+[-14, 5, 6, "Microculture Susceptibility General", "Amoxicillin-Clavulanic Acid:Susceptible", "Susceptible TO Amoxicillin-Clavulanic Acid", DBUtil.parseDateValue("6/3/2109 17:07")],
+[-15, 6, 7, "Microculture Susceptibility General", "Negative Culture", "Microculture Grew No Bacteria", DBUtil.parseDateValue("6/4/2109 17:07")],
+[-18, 11, 11, "Microculture Susceptibility General", "Amikacin:Susceptible", "Susceptible TO Amikacin", DBUtil.parseDateValue("6/11/2111 18:07")]
+];
+ actualData = DBUtil.execute(testQuery);
+ self.assertEqualTable( expectedData, actualData );
+
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ suite = unittest.TestSuite();
+ #suite.addTest(TestSTRIDECultureMicroConversion("test_incColNamesAndTypeCodes"));
+ #suite.addTest(TestSTRIDECultureMicroConversion("test_insertFile_skipErrors"));
+ #suite.addTest(TestSTRIDECultureMicroConversion('test_executeIterator'));
+ #suite.addTest(TestSTRIDECultureMicroConversion('test_dataConversion_aggregate'));
+ suite.addTest(unittest.makeSuite(TestSTRIDECultureMicroConversion));
+
+ return suite;
+
+if __name__=="__main__":
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/test/TestSTRIDEDemographicsConversion.py b/medinfo/dataconversion/test/TestSTRIDEDemographicsConversion.py
index 00ca1f90..485d2ad7 100644
--- a/medinfo/dataconversion/test/TestSTRIDEDemographicsConversion.py
+++ b/medinfo/dataconversion/test/TestSTRIDEDemographicsConversion.py
@@ -2,22 +2,25 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
+
+
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel;
from medinfo.dataconversion.STRIDEDemographicsConversion import STRIDEDemographicsConversion;
TEST_SOURCE_TABLE = "stride_patient";
-TEMP_SOURCE_TABLE = "PreTest_patient";
class TestSTRIDEDemographicsConversion(DBTestCase):
def setUp(self):
@@ -25,75 +28,73 @@ def setUp(self):
DBTestCase.setUp(self);
log.info("Populate the database with test data")
-
- # Relabel any existing data to not interfere with the new test data that will be produced
- DBUtil.execute("update clinical_item_category set source_table = '%s' where source_table = '%s';" % (TEMP_SOURCE_TABLE,TEST_SOURCE_TABLE) );
-
- # Use fake age_yrs in negative values to easily identify test data to purge later
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+
dataTextStr = \
-"""pat_id\tage_yrs\tsex\tdeath_date\tbirth_year\tgender\trace\tethnicity
--100\t-56\tMale\tNone\t1958\tMALE\tAMERICAN INDIAN OR ALASKA NATIVE\tNON-HISPANIC/NON-LATINO
--200\t-22\tMale\tNone\t1992\tMALE\tAMERICAN INDIAN OR ALASKA NATIVE\tHISPANIC/LATINO
--300\t-21\tFemale\tNone\t1993\tFEMALE\tASIAN\tNON-HISPANIC/NON-LATINO
--400\t-17\tFemale\t2011-09-28\t1997\tFEMALE\tASIAN\tHISPANIC/LATINO
--500\t-62\tMale\tNone\t1952\tMALE\tASIAN\tPATIENT REFUSED
--600\t-30\tMale\tNone\t1984\tMALE\tASIAN\tUNKNOWN
--700\t-23\tFemale\tNone\t1991\tFEMALE\tASIAN - HISTORICAL CONV\tNON-HISPANIC/NON-LATINO
--800\t-52\tMale\tNone\t1962\tMALE\tASIAN, HISPANIC\tUNKNOWN
--900\t-42\tMale\tNone\t1972\tMALE\tASIAN, HISPANIC\tHISPANIC/LATINO
--1000\t-44\tMale\tNone\t1970\tMALE\tASIAN, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
--1100\t-13\tFemale\tNone\t2001\tFEMALE\tASIAN, NON-HISPANIC\tUNKNOWN
--1200\t-45\tFemale\tNone\t1969\tFEMALE\tBLACK OR AFRICAN AMERICAN\tNON-HISPANIC/NON-LATINO
--1300\t-69\tFemale\tNone\t1945\tFEMALE\tBLACK OR AFRICAN AMERICAN\tHISPANIC/LATINO
--1400\t-69\tFemale\tNone\t1945\tFEMALE\tBLACK OR AFRICAN AMERICAN\tUNKNOWN
--1500\t-58\tMale\t2012-05-02\t1956\tMALE\tBLACK OR AFRICAN AMERICAN\tPATIENT REFUSED
--1600\t-33\tFemale\tNone\t1981\tFEMALE\tBLACK, HISPANIC\tHISPANIC/LATINO
--1700\t-29\tFemale\tNone\t1985\tFEMALE\tBLACK, HISPANIC\tUNKNOWN
--1800\t-82\tMale\tNone\t1932\tMALE\tBLACK, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
--1900\t-60\tMale\tNone\t1954\tMALE\tBLACK, NON-HISPANIC\tUNKNOWN
--2000\t-82\tMale\tNone\t1932\tMALE\tNATIVE AMERICAN, HISPANIC\tHISPANIC/LATINO
--2100\t-53\tFemale\tNone\t1961\tFEMALE\tNATIVE AMERICAN, NON-HISPANIC\tUNKNOWN
--2200\t-40\tMale\tNone\t1974\tMALE\tNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER \tNON-HISPANIC/NON-LATINO
--2300\t-61\tFemale\tNone\t1953\tFEMALE\tNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER \tHISPANIC/LATINO
--2400\t-71\tFemale\tNone\t1943\tFEMALE\tNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER \tUNKNOWN
--2500\t-51\tFemale\tNone\t1963\tFEMALE\tOTHER\tHISPANIC/LATINO
--2600\t-40\tMale\tNone\t1974\tMALE\tOTHER\tNON-HISPANIC/NON-LATINO
--2700\t-51\tFemale\tNone\t1963\tFEMALE\tOTHER\tPATIENT REFUSED
--2800\t-9\tFemale\tNone\t2005\tFEMALE\tOTHER\tUNKNOWN
--2900\t-18\tMale\tNone\t1996\tMALE\tOTHER, HISPANIC\tUNKNOWN
--3000\t-62\tMale\tNone\t1952\tMALE\tOTHER, HISPANIC\tHISPANIC/LATINO
--3100\t-31\tFemale\tNone\t1983\tFEMALE\tOTHER, HISPANIC\tNON-HISPANIC/NON-LATINO
--3200\t-43\tFemale\tNone\t1971\tFEMALE\tOTHER, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
--3300\t-38\tMale\tNone\t1976\tMALE\tOTHER, NON-HISPANIC\tUNKNOWN
--3400\t-19\tFemale\tNone\t1995\tFEMALE\tOTHER, NON-HISPANIC\tHISPANIC/LATINO
--3500\t-32\tMale\tNone\t1982\tMALE\tPACIFIC ISLANDER, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
--3600\t-74\tMale\tNone\t1940\tMALE\tPACIFIC ISLANDER, NON-HISPANIC\tUNKNOWN
--3700\t-80\tMale\tNone\t1934\tMALE\tPATIENT REFUSED\tPATIENT REFUSED
--3800\t-33\tFemale\tNone\t1981\tFEMALE\tPATIENT REFUSED\tNON-HISPANIC/NON-LATINO
--3900\t-16\tMale\tNone\t1998\tMALE\tPATIENT REFUSED\tHISPANIC/LATINO
--4000\t-36\tMale\tNone\t1978\tMALE\tRACE AND ETHNICITY UNKNOWN\tUNKNOWN
--4100\t-81\tFemale\tNone\t1933\tFEMALE\tRACE AND ETHNICITY UNKNOWN\tNON-HISPANIC/NON-LATINO
--4200\t-17\tFemale\tNone\t1997\tFEMALE\tUNKNOWN\tUNKNOWN
--4300\t-82\tMale\tNone\t1932\tMALE\tUNKNOWN\tNON-HISPANIC/NON-LATINO
--4400\t-67\tFemale\t2012-11-13\t1947\tFEMALE\tUNKNOWN\tHISPANIC/LATINO
--4500\t-82\tMale\tNone\t1932\tMALE\tUNKNOWN\tPATIENT REFUSED
--4600\t-78\tMale\tNone\t1936\tMALE\tUNKNOWN\t
--4700\t-21\tFemale\tNone\t1993\tFEMALE\tWHITE\tNON-HISPANIC/NON-LATINO
--4800\t-66\tMale\tNone\t1948\tMALE\tWHITE\tHISPANIC/LATINO
--4900\t-46\tMale\tNone\t1968\tMALE\tWHITE\tUNKNOWN
--5000\t-11\tFemale\tNone\t2003\tFEMALE\tWHITE\tPATIENT REFUSED
--5100\t-44\tMale\tNone\t1970\tMALE\tWHITE\t
--5200\t-16\tMale\tNone\t1998\tMALE\tWHITE, HISPANIC\tHISPANIC/LATINO
--5300\t-28\tMale\tNone\t1986\tMALE\tWHITE, HISPANIC\tUNKNOWN
--5400\t-17\tFemale\tNone\t1997\tFEMALE\tWHITE, HISPANIC\tNON-HISPANIC/NON-LATINO
--5500\t-50\tMale\tNone\t1964\tMALE\tWHITE, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
--5600\t-74\tMale\tNone\t1940\tMALE\tWHITE, NON-HISPANIC\tUNKNOWN
--5700\t-52\tMale\tNone\t1962\tMALE\tWHITE, NON-HISPANIC\tHISPANIC/LATINO
--5800\t-83\tFemale\tNone\t1931\tFEMALE\tNone\tNone
--5900\t-23\tFemale\tNone\t1991\tFEMALE\tNone\tNON-HISPANIC/NON-LATINO
--6000\t-41\tFemale\tNone\t1973\tFEMALE\tNone\tUNKNOWN
--6050\tNone\tNone\tNone\tNone\tNone\tNone\tNone
--6100\t-61\tFemale\tNone\t1953\tFEMALE\tNone\tHISPANIC/LATINO
+"""pat_id\tdeath_date\tbirth_year\tgender\trace\tethnicity
+-100\tNone\t1958\tMALE\tAMERICAN INDIAN OR ALASKA NATIVE\tNON-HISPANIC/NON-LATINO
+-200\tNone\t1992\tMALE\tAMERICAN INDIAN OR ALASKA NATIVE\tHISPANIC/LATINO
+-300\tNone\t1993\tFEMALE\tASIAN\tNON-HISPANIC/NON-LATINO
+-400\t2011-09-28\t1997\tFEMALE\tASIAN\tHISPANIC/LATINO
+-500\tNone\t1952\tMALE\tASIAN\tPATIENT REFUSED
+-600\tNone\t1984\tMALE\tASIAN\tUNKNOWN
+-700\tNone\t1991\tFEMALE\tASIAN - HISTORICAL CONV\tNON-HISPANIC/NON-LATINO
+-800\tNone\t1962\tMALE\tASIAN, HISPANIC\tUNKNOWN
+-900\tNone\t1972\tMALE\tASIAN, HISPANIC\tHISPANIC/LATINO
+-1000\tNone\t1970\tMALE\tASIAN, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
+-1100\tNone\t2001\tFEMALE\tASIAN, NON-HISPANIC\tUNKNOWN
+-1200\tNone\t1969\tFEMALE\tBLACK OR AFRICAN AMERICAN\tNON-HISPANIC/NON-LATINO
+-1300\tNone\t1945\tFEMALE\tBLACK OR AFRICAN AMERICAN\tHISPANIC/LATINO
+-1400\tNone\t1945\tFEMALE\tBLACK OR AFRICAN AMERICAN\tUNKNOWN
+-1500\t2012-05-02\t1956\tMALE\tBLACK OR AFRICAN AMERICAN\tPATIENT REFUSED
+-1600\tNone\t1981\tFEMALE\tBLACK, HISPANIC\tHISPANIC/LATINO
+-1700\tNone\t1985\tFEMALE\tBLACK, HISPANIC\tUNKNOWN
+-1800\tNone\t1932\tMALE\tBLACK, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
+-1900\tNone\t1954\tMALE\tBLACK, NON-HISPANIC\tUNKNOWN
+-2000\tNone\t1932\tMALE\tNATIVE AMERICAN, HISPANIC\tHISPANIC/LATINO
+-2100\tNone\t1961\tFEMALE\tNATIVE AMERICAN, NON-HISPANIC\tUNKNOWN
+-2200\tNone\t1974\tMALE\tNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER \tNON-HISPANIC/NON-LATINO
+-2300\tNone\t1953\tFEMALE\tNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER \tHISPANIC/LATINO
+-2400\tNone\t1943\tFEMALE\tNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER \tUNKNOWN
+-2500\tNone\t1963\tFEMALE\tOTHER\tHISPANIC/LATINO
+-2600\tNone\t1974\tMALE\tOTHER\tNON-HISPANIC/NON-LATINO
+-2700\tNone\t1963\tFEMALE\tOTHER\tPATIENT REFUSED
+-2800\tNone\t2005\tFEMALE\tOTHER\tUNKNOWN
+-2900\tNone\t1996\tMALE\tOTHER, HISPANIC\tUNKNOWN
+-3000\tNone\t1952\tMALE\tOTHER, HISPANIC\tHISPANIC/LATINO
+-3100\tNone\t1983\tFEMALE\tOTHER, HISPANIC\tNON-HISPANIC/NON-LATINO
+-3200\tNone\t1971\tFEMALE\tOTHER, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
+-3300\tNone\t1976\tMALE\tOTHER, NON-HISPANIC\tUNKNOWN
+-3400\tNone\t1995\tFEMALE\tOTHER, NON-HISPANIC\tHISPANIC/LATINO
+-3500\tNone\t1982\tMALE\tPACIFIC ISLANDER, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
+-3600\tNone\t1940\tMALE\tPACIFIC ISLANDER, NON-HISPANIC\tUNKNOWN
+-3700\tNone\t1934\tMALE\tPATIENT REFUSED\tPATIENT REFUSED
+-3800\tNone\t1981\tFEMALE\tPATIENT REFUSED\tNON-HISPANIC/NON-LATINO
+-3900\tNone\t1998\tMALE\tPATIENT REFUSED\tHISPANIC/LATINO
+-4000\tNone\t1978\tMALE\tRACE AND ETHNICITY UNKNOWN\tUNKNOWN
+-4100\tNone\t1933\tFEMALE\tRACE AND ETHNICITY UNKNOWN\tNON-HISPANIC/NON-LATINO
+-4200\tNone\t1997\tFEMALE\tUNKNOWN\tUNKNOWN
+-4300\tNone\t1932\tMALE\tUNKNOWN\tNON-HISPANIC/NON-LATINO
+-4400\t2012-11-13\t1947\tFEMALE\tUNKNOWN\tHISPANIC/LATINO
+-4500\tNone\t1932\tMALE\tUNKNOWN\tPATIENT REFUSED
+-4600\tNone\t1936\tMALE\tUNKNOWN\t
+-4700\tNone\t1993\tFEMALE\tWHITE\tNON-HISPANIC/NON-LATINO
+-4800\tNone\t1948\tMALE\tWHITE\tHISPANIC/LATINO
+-4900\tNone\t1968\tMALE\tWHITE\tUNKNOWN
+-5000\tNone\t2003\tFEMALE\tWHITE\tPATIENT REFUSED
+-5100\tNone\t1970\tMALE\tWHITE\t
+-5200\tNone\t1998\tMALE\tWHITE, HISPANIC\tHISPANIC/LATINO
+-5300\tNone\t1986\tMALE\tWHITE, HISPANIC\tUNKNOWN
+-5400\tNone\t1997\tFEMALE\tWHITE, HISPANIC\tNON-HISPANIC/NON-LATINO
+-5500\tNone\t1964\tMALE\tWHITE, NON-HISPANIC\tNON-HISPANIC/NON-LATINO
+-5600\tNone\t1940\tMALE\tWHITE, NON-HISPANIC\tUNKNOWN
+-5700\tNone\t1962\tMALE\tWHITE, NON-HISPANIC\tHISPANIC/LATINO
+-5800\tNone\t1931\tFEMALE\tNone\tNone
+-5900\tNone\t1991\tFEMALE\tNone\tNON-HISPANIC/NON-LATINO
+-6000\tNone\t1973\tFEMALE\tNone\tUNKNOWN
+-6050\tNone\tNone\tNone\tNone\tNone
+-6100\tNone\t1953\tFEMALE\tNone\tHISPANIC/LATINO
"""
self.patientIds = ["-100","-200","-300","-400","-500","-600","-700","-800","-900","-1000","-1100","-1200","-1300","-1400","-1500","-1600","-1700","-1800","-1900","-2000","-2100","-2200","-2300","-2400","-2500","-2600","-2700","-2800","-2900","-3000","-3100","-3200","-3300","-3400","-3500","-3600","-3700","-3800","-3900","-4000","-4100","-4200","-4300","-4400","-4500","-4600","-4700","-4800","-4900","-5000","-5100","-5200","-5300","-5400","-5500","-5600","-5700","-5800","-5900","-6000","-6050","-6100"];
@@ -126,12 +127,11 @@ def tearDown(self):
""" % TEST_SOURCE_TABLE
);
DBUtil.execute("delete from clinical_item_category where source_table = '%s';" % TEST_SOURCE_TABLE);
- DBUtil.execute("update clinical_item_category set source_table = '%s' where source_table = '%s';" % (TEST_SOURCE_TABLE,TEMP_SOURCE_TABLE) ); # Reset labels of any prior data
query = SQLQuery();
query.delete = True;
query.addFrom("stride_patient");
- query.addWhere("age_yrs < 0");
+ query.addWhere("pat_id < 0");
DBUtil.execute( query );
DBTestCase.tearDown(self);
diff --git a/medinfo/dataconversion/test/TestSTRIDEDxListConversion.py b/medinfo/dataconversion/test/TestSTRIDEDxListConversion.py
index ff8c234a..a7a518af 100644
--- a/medinfo/dataconversion/test/TestSTRIDEDxListConversion.py
+++ b/medinfo/dataconversion/test/TestSTRIDEDxListConversion.py
@@ -2,14 +2,17 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
+from pprint import pprint
from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel;
@@ -17,48 +20,51 @@
from medinfo.dataconversion.STRIDEDxListConversion import STRIDEDxListConversion;
TEST_SOURCE_TABLE = "stride_dx_list";
-TEMP_SOURCE_TABLE = "PreTest_dx_list";
TEST_START_DATE = datetime(2100,1,1); # Date in far future to start checking for test records to avoid including existing data in database
class TestSTRIDEDxListConversion(DBTestCase):
def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
-
+
log.info("Populate the database with test data")
-
- # Relabel any existing data to not interfere with the new test data that will be produced
- DBUtil.execute("update clinical_item_category set source_table = '%s' where source_table = '%s';" % (TEMP_SOURCE_TABLE,TEST_SOURCE_TABLE) );
-
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+
self.patientIdStrList = list();
- headers = ["pat_id","pat_enc_csn_id","noted_date","resolved_date","dx_icd9_code","data_source"];
+ headers = ["pat_id","pat_enc_csn_id","noted_date","resolved_date","dx_icd9_code","dx_icd9_code_list","dx_icd10_code_list","data_source"];
dataModels = \
- [
- RowItemModel( ["-126500", -131017780655, "2111-10-14", None, "-431.00", "PROBLEM_LIST"], headers ),
-
- RowItemModel( ["-126268", -131015534571, "2111-05-04", None, "-0285", "PROBLEM_LIST"], headers ),
- RowItemModel( ["-126268", -131015534571, None, None, "-272.4", "PROBLEM_LIST"], headers ),
- RowItemModel( ["-126268", -131015534571, None, None, "-309.9", "ENC_Dx"], headers ),
- RowItemModel( ["-126268", -131015534571, "2111-05-18", None, "-785", "ADMIT_DX"], headers ),
- RowItemModel( ["-126472", -131015404439, None, None, "-719.46", "ENC_Dx"], headers ),
+ [
+ RowItemModel( ["-126500", -131017780655, "2111-10-14", None, "-431.00", "-431.00,-432","","PROBLEM_LIST"], headers ),
+ RowItemModel( ["-126268", -131015534571, "2111-05-04", None, "-0285", "-0285,-0286","","PROBLEM_LIST"], headers ),
+ RowItemModel( ["-126268", -131015534571, None, None, "-272.4", "-272.4,-273","","PROBLEM_LIST"], headers ),
+ RowItemModel( ["-126268", -131015534571, None, None, "-309.9", "-309.9,-310","","ENC_Dx"], headers ),
+ RowItemModel( ["-126268", -131015534571, "2111-05-18", None, "-785", "-785,-786","","ADMIT_DX"], headers ),
+ RowItemModel( ["-126472", -131015404439, None, None, "-719.46", "-719.46,-720","","ENC_Dx"], headers ),
# Repeat, but under different encounter, should be ignored, just base on noted date
- RowItemModel( ["-126500", -131000000000, "2111-10-14", None, "-431.00", "PROBLEM_LIST"], headers ),
-
- RowItemModel( ["-126798", -131014753610, None, None, "-482.9", "ENC_Dx"], headers ),
- RowItemModel( ["-126798", -131014753610, "2111-03-08", None, "-780", "ADMIT_DX"], headers ),
- RowItemModel( ["-126798", -131016557370, "2111-07-26", None, "-780.97", "ADMIT_DX"], headers ), # No matching diagnosis code, will just make up a label then
-
+ RowItemModel( ["-126500", -131000000000, "2111-10-14", None, "-431.00", "-431.00,-432","","PROBLEM_LIST"], headers ),
+ RowItemModel( ["-126798", -131014753610, None, None, "-482.9", "-482.9,-483","","ENC_Dx"], headers ),
+ RowItemModel( ["-126798", -131014753610, "2111-03-08", None, "-780", "-780,-781","","ADMIT_DX"], headers ),
+ RowItemModel( ["-126798", -131016557370, "2111-07-26", None, "-780.97", "-780.97,-781","","ADMIT_DX"], headers ), # No matching diagnosis code, will just make up a label then
+
+ # Different patient, but using ICD9 list instead of ICD9 code
+ # If there is no ICD9 list, and only ICD10 list, we will need
+ # to add special logic and decide whether to try to
+ # cross-reference with ICD9-based Dx'es
+ RowItemModel( ["-2126500", -135000000000, "2111-10-14", None, "", "-431.00,-432","-10431.00,-10432","PROBLEM_LIST"], headers ),
+ RowItemModel( ["-2126798", -135014753610, "2111-06-06", None, "", "-482.9,-483","-10482.9,-10483","PROBLEM_LIST"], headers ),
+ RowItemModel( ["-2126798", -135014753610, "2111-03-08", None, "", "-780","-10780","ADMIT_DX"], headers ),
];
for dataModel in dataModels:
(dataItemId, isNew) = DBUtil.findOrInsertItem("stride_dx_list", dataModel, retrieveCol="pat_id" );
self.patientIdStrList.append( str(dataItemId) );
-
+
self.icd9CUIdStrList = list();
headers = ["cui","ispref","aui","tty","code","str","suppress"];
dataModels = \
- [
+ [
RowItemModel( ["-C1", "Y", "-A1", "PT", "-0285", "Diagnosis 1","N"], headers ),
RowItemModel( ["-C2b","Y", "-A2b","PT", "-431.0", "Diagnosis 2b","N"], headers ), # Parent diagnoses
RowItemModel( ["-C2", "Y", "-A2", "PT", "-431.00", "Diagnosis 2","N"], headers ),
@@ -72,6 +78,20 @@ def setUp(self):
(dataItemId, isNew) = DBUtil.findOrInsertItem("stride_icd9_cm", dataModel, retrieveCol="cui" );
self.icd9CUIdStrList.append( str(dataItemId) );
+ self.icd10_order_number_str_list = list()
+ headers = [
+ 'order_number', 'icd10', 'hipaa_covered',
+ 'short_description','full_description','icd10_code'
+ ]
+ data_models = [
+ RowItemModel([-1, '-1043100', 1, 'Diagnosis 2', 'Diagnosis 2 Full', '-10431.00'], headers),
+ RowItemModel([-2, '-104310', 0, 'Diagnosis 2b', 'Diagnosis 2b Full', '-10431.0'], headers),
+ RowItemModel([-6, '-10780', 0, 'Diagnosis 5', 'Diagnosis 5 Full', '-10780'], headers)
+ ]
+ for data_model in data_models:
+ (dataItemId, isNew) = DBUtil.findOrInsertItem("stride_icd10_cm", data_model, retrieveCol='order_number');
+ self.icd10_order_number_str_list.append( str(dataItemId) );
+
self.converter = STRIDEDxListConversion(); # Instance to test on
def tearDown(self):
@@ -79,8 +99,8 @@ def tearDown(self):
log.info("Purge test records from the database")
DBUtil.execute \
- ( """delete from patient_item
- where clinical_item_id in
+ ( """delete from patient_item
+ where clinical_item_id in
( select clinical_item_id
from clinical_item as ci, clinical_item_category as cic
where ci.clinical_item_category_id = cic.clinical_item_category_id
@@ -89,16 +109,15 @@ def tearDown(self):
""" % TEST_SOURCE_TABLE
);
DBUtil.execute \
- ( """delete from clinical_item
- where clinical_item_category_id in
- ( select clinical_item_category_id
- from clinical_item_category
+ ( """delete from clinical_item
+ where clinical_item_category_id in
+ ( select clinical_item_category_id
+ from clinical_item_category
where source_table = '%s'
);
""" % TEST_SOURCE_TABLE
);
DBUtil.execute("delete from clinical_item_category where source_table = '%s';" % TEST_SOURCE_TABLE);
- DBUtil.execute("update clinical_item_category set source_table = '%s' where source_table = '%s';" % (TEST_SOURCE_TABLE,TEMP_SOURCE_TABLE) ); # Reset labels of any prior data
query = SQLQuery();
query.delete = True;
@@ -112,6 +131,13 @@ def tearDown(self):
query.addWhereIn("cui", self.icd9CUIdStrList );
DBUtil.execute( query );
+
+ query = SQLQuery();
+ query.delete = True;
+ query.addFrom("stride_icd10_cm");
+ query.addWhereIn("order_number", self.icd10_order_number_str_list );
+ DBUtil.execute( query );
+
DBTestCase.tearDown(self);
def test_dataConversion(self):
@@ -122,7 +148,7 @@ def test_dataConversion(self):
# Just query back for the same data, de-normalizing the data back to a general table
testQuery = \
"""
- select
+ select
pi.external_id,
pi.patient_id,
pi.encounter_id,
@@ -140,7 +166,7 @@ def test_dataConversion(self):
ci.clinical_item_category_id = cic.clinical_item_category_id and
cic.source_table = '%s'
order by
- pi.patient_id desc, ci.name
+ pi.patient_id desc, ci.name, pi.item_date
""" % TEST_SOURCE_TABLE;
expectedData = \
[ # Expected data should be updated once we have ICD9 - Name conversion tables
@@ -149,12 +175,24 @@ def test_dataConversion(self):
[None, -126500, -131017780655, "Diagnosis (PROBLEM_LIST)", None, "ICD9.-431.0", "Diagnosis 2b", datetime(2111,10,14)],
[None, -126500, -131017780655, "Diagnosis (PROBLEM_LIST)", None, "ICD9.-431.00", "Diagnosis 2", datetime(2111,10,14)],
-
- [None, -126798, -131014753610, "Diagnosis (ADMIT_DX)", None, "ICD9.-780", "Diagnosis 5", datetime(2111,3,8)],
+ [None, -126798, -131014753610, "Diagnosis (ADMIT_DX)", None, "ICD9.-780", "Diagnosis 5", datetime(2111,3,8)],
[None, -126798, -131016557370, "Diagnosis (ADMIT_DX)", None, "ICD9.-780", "Diagnosis 5", datetime(2111,7,26)],
[None, -126798, -131016557370, "Diagnosis (ADMIT_DX)", None, "ICD9.-780.9", "Diagnosis 6a", datetime(2111,7,26)],
[None, -126798, -131016557370, "Diagnosis (ADMIT_DX)", None, "ICD9.-780.97", "Diagnosis 6", datetime(2111,7,26)],
+
+ [None, -2126500, -135000000000, 'Diagnosis (PROBLEM_LIST)', None, 'ICD10.-10431.0', 'Diagnosis 2b Full', datetime(2111, 10, 14, 0, 0)],
+ [None, -2126500, -135000000000, 'Diagnosis (PROBLEM_LIST)', None, 'ICD10.-10431.00', 'Diagnosis 2 Full', datetime(2111, 10, 14, 0, 0)],
+ [None, -2126500, -135000000000, 'Diagnosis (PROBLEM_LIST)', None, 'ICD10.-10432', '-10432', datetime(2111, 10, 14, 0, 0)],
+ [None, -2126500, -135000000000, 'Diagnosis (PROBLEM_LIST)', None, 'ICD9.-431.0', 'Diagnosis 2b', datetime(2111, 10, 14, 0, 0)],
+ [None, -2126500, -135000000000, 'Diagnosis (PROBLEM_LIST)', None, 'ICD9.-431.00', 'Diagnosis 2', datetime(2111, 10, 14, 0, 0)],
+ [None, -2126500, -135000000000, 'Diagnosis (PROBLEM_LIST)', None, 'ICD9.-432', '-432', datetime(2111, 10, 14, 0, 0)],
+ [None, -2126798, -135014753610, 'Diagnosis (PROBLEM_LIST)', None, 'ICD10.-10482.9', '-10482.9', datetime(2111, 6, 6, 0, 0)],
+ [None, -2126798, -135014753610, 'Diagnosis (PROBLEM_LIST)', None, 'ICD10.-10483', '-10483', datetime(2111, 6, 6, 0, 0)],
+ [None, -2126798, -135014753610, 'Diagnosis (ADMIT_DX)', None, 'ICD10.-10780', 'Diagnosis 5 Full', datetime(2111, 3, 8, 0, 0)],
+ [None, -2126798, -135014753610, 'Diagnosis (PROBLEM_LIST)', None, 'ICD9.-482.9', '-482.9', datetime(2111, 6, 6, 0, 0)],
+ [None, -2126798, -135014753610, 'Diagnosis (PROBLEM_LIST)', None, 'ICD9.-483', '-483', datetime(2111, 6, 6, 0, 0)],
+ [None, -2126798, -135014753610, 'Diagnosis (ADMIT_DX)', None, 'ICD9.-780', 'Diagnosis 5', datetime(2111, 3, 8, 0, 0)],
];
actualData = DBUtil.execute(testQuery);
self.assertEqualTable( expectedData, actualData );
@@ -170,8 +208,8 @@ def suite():
#suite.addTest(TestSTRIDEDxListConversion('test_executeIterator'));
#suite.addTest(TestSTRIDEDxListConversion('test_findOrInsertItem'));
suite.addTest(unittest.makeSuite(TestSTRIDEDxListConversion));
-
+
return suite;
-
+
if __name__=="__main__":
unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/test/TestSTRIDEOrderMedConversion.py b/medinfo/dataconversion/test/TestSTRIDEOrderMedConversion.py
index a33f4aa9..248ab13e 100644
--- a/medinfo/dataconversion/test/TestSTRIDEOrderMedConversion.py
+++ b/medinfo/dataconversion/test/TestSTRIDEOrderMedConversion.py
@@ -2,14 +2,16 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel;
@@ -22,12 +24,11 @@ class TestSTRIDEOrderMedConversion(DBTestCase):
def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
-
- # Relabel any existing data to not interfere with the new test data that will be produced
- DBUtil.execute("update clinical_item_category set source_table = 'PreTest_order_med' where source_table = 'stride_order_med';");
-
+
log.info("Populate the database with test data")
-
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
+
self.orderMedIdStrList = list();
headers = ["order_med_id", "pat_id", "pat_enc_csn_id", "ordering_date", "medication_id", "description","freq_name","med_route","number_of_doses"];
dataModels = \
@@ -43,14 +44,14 @@ def setUp(self):
RowItemModel( [ -414321352, "3036588", 777, datetime(2111,12,14, 8,30), -5007, "ZZZ IMS TEMPLATE","ONCE","IV", 1], headers ),
# Simple mixture in unimportant base
- RowItemModel( [ -395900000, "1234567", 888, datetime(2111, 1, 2, 3, 0), -520102, "CEFEPIME 2 GM IVPB","ONCE","IV", 1], headers ),
+ RowItemModel( [ -395900000, "1234567", 888, datetime(2111, 1, 2, 3, 0), -520102, "CEFEPIME 2 GM IVPB","ONCE","IV", 1], headers ),
RowItemModel( [ -395800000, "1234567", 888, datetime(2111, 1,10, 3, 0), -520102, "CEFEPIME 2 GM IVPB","q8h","IV", 6], headers ), # Fixed number of doses
RowItemModel( [ -395700000, "1234567", 888, datetime(2111, 3,10, 3, 0), -520102, "CEFEPIME 2 GM IVPB","q8h","IV", None], headers ), # No dose limit specified
# Complex mixtures
- RowItemModel( [ -392000000, "1234567", 888, datetime(2111, 4, 1, 3, 0), -530000, "IVF Mix","ONCE","IV", 1], headers ),
- RowItemModel( [ -391000000, "1234567", 888, datetime(2111, 4, 2, 3, 0), -540000, "Mini TPN","ONCE","IV", 1], headers ),
- RowItemModel( [ -390000000, "1234567", 888, datetime(2111, 5, 2, 3, 0), -550000, "TPN Adult","Continuous","IV", None], headers ),
+ RowItemModel( [ -392000000, "1234567", 888, datetime(2111, 4, 1, 3, 0), -530000, "IVF Mix","ONCE","IV", 1], headers ),
+ RowItemModel( [ -391000000, "1234567", 888, datetime(2111, 4, 2, 3, 0), -540000, "Mini TPN","ONCE","IV", 1], headers ),
+ RowItemModel( [ -390000000, "1234567", 888, datetime(2111, 5, 2, 3, 0), -550000, "TPN Adult","Continuous","IV", None], headers ),
];
for dataModel in dataModels:
(dataItemId, isNew) = DBUtil.findOrInsertItem("stride_order_med", dataModel, retrieveCol="order_med_id" );
@@ -70,7 +71,7 @@ def setUp(self):
RowItemModel( [ -395800000, 2, -2364, "DEXTROSE 5 % IN WATER (D5W) IV SOLP", 1, "Base",], headers ),
RowItemModel( [ -395700000, 1, -87114, "CEFEPIME 2 GRAM IV SOLR", 3, "Medications",], headers ),
RowItemModel( [ -395700000, 2, -2364, "DEXTROSE 5 % IN WATER (D5W) IV SOLP", 1, "Base",], headers ),
-
+
# IVF Mix
RowItemModel( [ -392000000, 2, -2367, "DEXTROSE 70 % IN WATER (D70W) IV SOLP", 1, "Base",], headers ),
RowItemModel( [ -392000000, 3, -7322, "SODIUM CHLORIDE 4 MEQ/ML IV SOLP", 2, "Additives",], headers ),
@@ -93,13 +94,13 @@ def setUp(self):
RowItemModel( [ -390000000, 8, -8047, "TRACE ELEM ZN-CUPRIC CL-MN-CR 0.8-0.2-0.16 MG IV SOLN", 2, "Additives",], headers ),
RowItemModel( [ -390000000, 9, -124215, "MVI, ADULT NO.1 WITH VIT K 3,300 UNIT- 150 MCG/10 ML IV SOLN", 2, "Additives",], headers ),
RowItemModel( [ -390000000, 10,-540571, "INSULIN REG HUMAN 100 UNITS/ML INJ", 2, "Additives",], headers ),
-
+
];
for dataModel in dataModels:
(dataItemId, isNew) = DBUtil.findOrInsertItem("stride_order_medmixinfo", dataModel, retrieveCol="order_med_id" );
# Mapping table to simplify dose
- headers = ["medication_id", "medication_name", "rxcui", "active_ingredient"];
+ headers = ["medication_id", "name", "rxcui", "active_ingredient"];
dataModels = \
[ # If multiple active ingredients in a combo, unravel to active components
RowItemModel( [ -96559, "PIPERACILLIN-TAZOBACTAM-DEXTRS 3.375 GRAM/50 ML IV PGBK", -1001, "Piperacillin"], headers ),
@@ -115,7 +116,7 @@ def setUp(self):
# Simple mixture
RowItemModel( [ -87114, "CEFEPIME 2 GRAM IV SOLR", -20481, "cefepime"], headers ),
RowItemModel( [ -2364, "DEXTROSE 5% IN WATER (D5W) IV SOLP", -4850, "Glucose"], headers ),
-
+
# Additional medication level mapping should probably ignored if have mixture components
RowItemModel( [ -520102, "CEFEPIME 2 GM IVPB", -20481, "cefepime"], headers ),
@@ -156,14 +157,14 @@ def setUp(self):
# Certain items drawn from order sets
headers = ["order_med_id", "protocol_id","protocol_name","section_name","smart_group"];
dataModels = \
- [
+ [
RowItemModel( [ -418436145, -111, "General Admit", "Medications", "Stool Softeners",], headers ),
RowItemModel( [ -421032269, -111, "General Admit", "Medications", "Antibiotics",], headers ),
RowItemModel( [ -391000000, -222, "Nutrition", "Infusions", "TPN",], headers ),
];
for dataModel in dataModels:
(dataItemId, isNew) = DBUtil.findOrInsertItem("stride_orderset_order_med", dataModel, retrieveCol="order_med_id" );
-
+
self.converter = STRIDEOrderMedConversion(); # Instance to test on
def tearDown(self):
@@ -172,7 +173,7 @@ def tearDown(self):
DBUtil.execute \
( """delete from patient_item_collection_link
- where item_collection_item_id in
+ where item_collection_item_id in
( select item_collection_item_id
from item_collection_item as ici, item_collection as ic
where ici.item_collection_id = ic.item_collection_id
@@ -182,7 +183,7 @@ def tearDown(self):
);
DBUtil.execute \
( """delete from item_collection_item
- where item_collection_id in
+ where item_collection_id in
( select item_collection_id
from item_collection as ic
where ic.external_id < 0
@@ -192,8 +193,8 @@ def tearDown(self):
DBUtil.execute("delete from item_collection where external_id < 0;");
DBUtil.execute \
- ( """delete from patient_item
- where clinical_item_id in
+ ( """delete from patient_item
+ where clinical_item_id in
( select clinical_item_id
from clinical_item as ci, clinical_item_category as cic
where ci.clinical_item_category_id = cic.clinical_item_category_id
@@ -202,16 +203,15 @@ def tearDown(self):
"""
);
DBUtil.execute \
- ( """delete from clinical_item
- where clinical_item_category_id in
- ( select clinical_item_category_id
- from clinical_item_category
+ ( """delete from clinical_item
+ where clinical_item_category_id in
+ ( select clinical_item_category_id
+ from clinical_item_category
where source_table = 'stride_order_med'
);
"""
);
DBUtil.execute("delete from clinical_item_category where source_table = 'stride_order_med';");
- DBUtil.execute("update clinical_item_category set source_table = 'stride_order_med' where source_table = 'PreTest_order_med';"); # Reset labels of any prior data
DBUtil.execute("delete from stride_orderset_order_med where order_med_id in (%s)" % str.join(",", self.orderMedIdStrList) );
DBUtil.execute("delete from stride_mapped_meds where rxcui < 0");
@@ -232,7 +232,7 @@ def test_dataConversion_normalized(self):
# Just query back for the same data, de-normalizing the data back to a general table
testQuery = \
"""
- select
+ select
pi.external_id,
pi.patient_id,
pi.encounter_id,
@@ -266,66 +266,66 @@ def test_dataConversion_normalized(self):
[ -414321352, 3036588, 777, "Med (IV)", -5007, "MED-5007 (<5)", "METOPROLOL TARTRATE 5 MG/5 ML IV SOLN (<5 doses)", datetime(2111,12,14,8,30) ],
# Simple mixture with different dosing counts
- [ -395900000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481 (<5)", "Cefepime (IV) (<5 doses)", datetime(2111, 1, 2, 3, 0)],
- [ -395800000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 1,10, 3, 0)],
- [ -395700000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 3,10, 3, 0)],
+ [ -395900000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481 (<5)", "Cefepime (IV) (<5 doses)", datetime(2111, 1, 2, 3, 0)],
+ [ -395800000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 1,10, 3, 0)],
+ [ -395700000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 3,10, 3, 0)],
# IVF Mix
- [ -392000000, 1234567, 888, "Med (IV)", -9863, 'RXCUI-9863 (<5)', 'Sodium Chloride (IV) (<5 doses)', datetime(2111, 4, 1, 3, 0)],
- [ -392000000, 1234567, 888, "Med (IV)", -8591, 'RXCUI-8591 (<5)', 'Potassium Chloride (IV) (<5 doses)', datetime(2111, 4, 1, 3, 0)],
- [ -392000000, 1234567, 888, "Med (IV)", -4850, 'RXCUI-4850 (<5)', 'Glucose (IV) (<5 doses)', datetime(2111, 4, 1, 3, 0)],
+ [ -392000000, 1234567, 888, "Med (IV)", -9863, 'RXCUI-9863 (<5)', 'Sodium Chloride (IV) (<5 doses)', datetime(2111, 4, 1, 3, 0)],
+ [ -392000000, 1234567, 888, "Med (IV)", -8591, 'RXCUI-8591 (<5)', 'Potassium Chloride (IV) (<5 doses)', datetime(2111, 4, 1, 3, 0)],
+ [ -392000000, 1234567, 888, "Med (IV)", -4850, 'RXCUI-4850 (<5)', 'Glucose (IV) (<5 doses)', datetime(2111, 4, 1, 3, 0)],
# Mini-Mix
- [ -391000000, 1234567, 888, "Med (IV)", -236719, 'RXCUI-236719 (<5)', 'Sodium Phosphate, Dibasic (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -235496, 'RXCUI-235496 (<5)', 'Sodium Phosphate, Monobasic (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -11115, 'RXCUI-11115 (<5)', 'Valine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -10962, 'RXCUI-10962 (<5)', 'Tyrosine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -10898, 'RXCUI-10898 (<5)', 'Tryptophan (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -10524, 'RXCUI-10524 (<5)', 'Threonine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -9863, 'RXCUI-9863 (<5)', 'Sodium Chloride (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -9671, 'RXCUI-9671 (<5)', 'Serine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -8737, 'RXCUI-8737 (<5)', 'Proline (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -8156, 'RXCUI-8156 (<5)', 'Phenylalanine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -6837, 'RXCUI-6837 (<5)', 'Methionine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -6536, 'RXCUI-6536 (<5)', 'Lysine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -6308, 'RXCUI-6308 (<5)', 'Leucine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -6033, 'RXCUI-6033 (<5)', 'Isoleucine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -5340, 'RXCUI-5340 (<5)', 'Histidine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -4919, 'RXCUI-4919 (<5)', 'Glycine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -4850, 'RXCUI-4850 (<5)', 'Glucose (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -1091, 'RXCUI-1091 (<5)', 'Arginine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
- [ -391000000, 1234567, 888, "Med (IV)", -426, 'RXCUI-426 (<5)', 'Alanine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -236719, 'RXCUI-236719 (<5)', 'Sodium Phosphate, Dibasic (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -235496, 'RXCUI-235496 (<5)', 'Sodium Phosphate, Monobasic (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -11115, 'RXCUI-11115 (<5)', 'Valine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -10962, 'RXCUI-10962 (<5)', 'Tyrosine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -10898, 'RXCUI-10898 (<5)', 'Tryptophan (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -10524, 'RXCUI-10524 (<5)', 'Threonine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -9863, 'RXCUI-9863 (<5)', 'Sodium Chloride (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -9671, 'RXCUI-9671 (<5)', 'Serine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -8737, 'RXCUI-8737 (<5)', 'Proline (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -8156, 'RXCUI-8156 (<5)', 'Phenylalanine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -6837, 'RXCUI-6837 (<5)', 'Methionine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -6536, 'RXCUI-6536 (<5)', 'Lysine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -6308, 'RXCUI-6308 (<5)', 'Leucine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -6033, 'RXCUI-6033 (<5)', 'Isoleucine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -5340, 'RXCUI-5340 (<5)', 'Histidine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -4919, 'RXCUI-4919 (<5)', 'Glycine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -4850, 'RXCUI-4850 (<5)', 'Glucose (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -1091, 'RXCUI-1091 (<5)', 'Arginine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
+ [ -391000000, 1234567, 888, "Med (IV)", -426, 'RXCUI-426 (<5)', 'Alanine (IV) (<5 doses)', datetime(2111, 4, 2, 3, 0)],
# Complex mixture
- [ -390000000, 1234567, 888, "Med (IV)", -253182, 'RXCUI-253182', 'Regular Insulin, Human (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -236719, 'RXCUI-236719', 'Sodium Phosphate, Dibasic (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -235496, 'RXCUI-235496', 'Sodium Phosphate, Monobasic (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -89905, 'RXCUI-89905', 'Multivitamin Preparation (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -39937, 'RXCUI-39937', 'Zinc Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -29261, 'RXCUI-29261', 'Manganese Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -21579, 'RXCUI-21579', 'Copper Sulfate (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -21032, 'RXCUI-21032', 'Chromous Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -11115, 'RXCUI-11115', 'Valine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -10962, 'RXCUI-10962', 'Tyrosine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -10898, 'RXCUI-10898', 'Tryptophan (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -10524, 'RXCUI-10524', 'Threonine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -9863, 'RXCUI-9863', 'Sodium Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -9671, 'RXCUI-9671', 'Serine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -8737, 'RXCUI-8737', 'Proline (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -8591, 'RXCUI-8591', 'Potassium Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -8308, 'RXCUI-8308', 'Vitamin K 1 (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -8156, 'RXCUI-8156', 'Phenylalanine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -6837, 'RXCUI-6837', 'Methionine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -6585, 'RXCUI-6585', 'Magnesium Sulfate (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -6536, 'RXCUI-6536', 'Lysine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -6308, 'RXCUI-6308', 'Leucine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -6033, 'RXCUI-6033', 'Isoleucine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -5340, 'RXCUI-5340', 'Histidine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -4919, 'RXCUI-4919', 'Glycine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -4850, 'RXCUI-4850', 'Glucose (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -1908, 'RXCUI-1908', 'Calcium Gluconate (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -1091, 'RXCUI-1091', 'Arginine (IV)', datetime(2111, 5, 2, 3, 0)],
- [ -390000000, 1234567, 888, "Med (IV)", -426, 'RXCUI-426', 'Alanine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -253182, 'RXCUI-253182', 'Regular Insulin, Human (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -236719, 'RXCUI-236719', 'Sodium Phosphate, Dibasic (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -235496, 'RXCUI-235496', 'Sodium Phosphate, Monobasic (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -89905, 'RXCUI-89905', 'Multivitamin Preparation (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -39937, 'RXCUI-39937', 'Zinc Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -29261, 'RXCUI-29261', 'Manganese Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -21579, 'RXCUI-21579', 'Copper Sulfate (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -21032, 'RXCUI-21032', 'Chromous Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -11115, 'RXCUI-11115', 'Valine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -10962, 'RXCUI-10962', 'Tyrosine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -10898, 'RXCUI-10898', 'Tryptophan (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -10524, 'RXCUI-10524', 'Threonine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -9863, 'RXCUI-9863', 'Sodium Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -9671, 'RXCUI-9671', 'Serine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -8737, 'RXCUI-8737', 'Proline (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -8591, 'RXCUI-8591', 'Potassium Chloride (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -8308, 'RXCUI-8308', 'Vitamin K 1 (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -8156, 'RXCUI-8156', 'Phenylalanine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -6837, 'RXCUI-6837', 'Methionine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -6585, 'RXCUI-6585', 'Magnesium Sulfate (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -6536, 'RXCUI-6536', 'Lysine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -6308, 'RXCUI-6308', 'Leucine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -6033, 'RXCUI-6033', 'Isoleucine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -5340, 'RXCUI-5340', 'Histidine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -4919, 'RXCUI-4919', 'Glycine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -4850, 'RXCUI-4850', 'Glucose (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -1908, 'RXCUI-1908', 'Calcium Gluconate (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -1091, 'RXCUI-1091', 'Arginine (IV)', datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -426, 'RXCUI-426', 'Alanine (IV)', datetime(2111, 5, 2, 3, 0)],
];
actualData = DBUtil.execute(testQuery);
self.assertEqualTable( expectedData, actualData );
@@ -335,7 +335,7 @@ def test_dataConversion_normalized(self):
# Query for orderset links
testQuery = \
"""
- select
+ select
pi.external_id,
ci.description,
ic.external_id,
@@ -366,25 +366,25 @@ def test_dataConversion_normalized(self):
[ -418436145, "Bisacodyl (PR)", -111,"General Admit","Medications","Stool Softeners"],
# Mini-Mix
- [ -391000000, 'Sodium Phosphate, Dibasic (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Sodium Phosphate, Monobasic (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Valine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Tyrosine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Tryptophan (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Threonine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Sodium Chloride (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Serine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Proline (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Phenylalanine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Methionine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Lysine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Leucine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Isoleucine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Histidine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Glycine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Glucose (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Arginine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
- [ -391000000, 'Alanine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Sodium Phosphate, Dibasic (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Sodium Phosphate, Monobasic (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Valine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Tyrosine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Tryptophan (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Threonine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Sodium Chloride (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Serine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Proline (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Phenylalanine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Methionine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Lysine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Leucine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Isoleucine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Histidine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Glycine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Glucose (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Arginine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Alanine (IV) (<5 doses)', -222, "Nutrition","Infusions","TPN"],
];
actualData = DBUtil.execute(testQuery);
self.assertEqualTable( expectedData, actualData );
@@ -403,7 +403,7 @@ def test_dataConversion_denormalized(self):
# Just query back for the same data, de-normalizing the data back to a general table
testQuery = \
"""
- select
+ select
pi.external_id,
pi.patient_id,
pi.encounter_id,
@@ -437,18 +437,18 @@ def test_dataConversion_denormalized(self):
[ -414321352, 3036588, 777, "Med (IV)", -5007, "MED-5007 (<5)", "METOPROLOL TARTRATE 5 MG/5 ML IV SOLN (<5 doses)", datetime(2111,12,14,8,30) ],
# Simple mixture with different dosing counts
- [ -395900000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481 (<5)", "Cefepime (IV) (<5 doses)", datetime(2111, 1, 2, 3, 0)],
- [ -395800000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 1,10, 3, 0)],
- [ -395700000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 3,10, 3, 0)],
+ [ -395900000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481 (<5)", "Cefepime (IV) (<5 doses)", datetime(2111, 1, 2, 3, 0)],
+ [ -395800000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 1,10, 3, 0)],
+ [ -395700000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 3,10, 3, 0)],
# IVF Mixture, composite ingredient description
- [ -392000000, 1234567, 888, "Med (IV)", -888699365, "RXCUI-4850,-8591,-9863 (<5)", "Glucose-Potassium Chloride-Sodium Chloride (IV) (<5 doses)", datetime(2111, 4, 1, 3, 0)],
+ [ -392000000, 1234567, 888, "Med (IV)", 786930457607, "RXCUI-4850,-8591,-9863 (<5)", "Glucose-Potassium Chloride-Sodium Chloride (IV) (<5 doses)", datetime(2111, 4, 1, 3, 0)],
# Mini mixture. Too many components, just use summary description
[ -391000000, 1234567, 888, "Med (IV)", -540000, "MED-540000 (<5)", "Mini TPN (<5 doses)", datetime(2111, 4, 2, 3, 0)], # Still aggregated because breaking up into component amino acids results in too many
# Complex mixture
- [ -390000000, 1234567, 888, "Med (IV)", -550000, "MED-550000", "TPN Adult", datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -550000, "MED-550000", "TPN Adult", datetime(2111, 5, 2, 3, 0)],
];
actualData = DBUtil.execute(testQuery);
@@ -458,7 +458,7 @@ def test_dataConversion_denormalized(self):
# Query for orderset links
testQuery = \
"""
- select
+ select
pi.external_id,
ci.description,
ic.external_id,
@@ -488,7 +488,7 @@ def test_dataConversion_denormalized(self):
[ -418436145, "Bisacodyl (PR)", -111,"General Admit","Medications","Stool Softeners"],
# Mini-Mix
- [ -391000000, 'Mini TPN (<5 doses)', -222, "Nutrition","Infusions","TPN"],
+ [ -391000000, 'Mini TPN (<5 doses)', -222, "Nutrition","Infusions","TPN"],
];
actualData = DBUtil.execute(testQuery);
self.assertEqualTable( expectedData, actualData );
@@ -506,7 +506,7 @@ def test_dataConversion_maxMixtureCount(self):
# Just query back for the same data, de-normalizing the data back to a general table
testQuery = \
"""
- select
+ select
pi.external_id,
pi.patient_id,
pi.encounter_id,
@@ -540,22 +540,22 @@ def test_dataConversion_maxMixtureCount(self):
[ -414321352, 3036588, 777, "Med (IV)", -5007, "MED-5007 (<5)", "METOPROLOL TARTRATE 5 MG/5 ML IV SOLN (<5 doses)", datetime(2111,12,14,8,30) ],
# Simple mixture with different dosing counts
- [ -395900000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481 (<5)", "Cefepime (IV) (<5 doses)", datetime(2111, 1, 2, 3, 0)],
- [ -395800000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 1,10, 3, 0)],
- [ -395700000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 3,10, 3, 0)],
+ [ -395900000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481 (<5)", "Cefepime (IV) (<5 doses)", datetime(2111, 1, 2, 3, 0)],
+ [ -395800000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 1,10, 3, 0)],
+ [ -395700000, 1234567, 888, "Med (IV)", -20481, "RXCUI-20481", "Cefepime (IV)", datetime(2111, 3,10, 3, 0)],
# IVF Mixture, composite ingredient description
- [ -392000000, 1234567, 888, "Med (IV)", -530000, "MED-530000 (<5)", "IVF Mix (<5 doses)", datetime(2111, 4, 1, 3, 0)],
+ [ -392000000, 1234567, 888, "Med (IV)", -530000, "MED-530000 (<5)", "IVF Mix (<5 doses)", datetime(2111, 4, 1, 3, 0)],
# Mini mixture. Too many components, just use summary description
[ -391000000, 1234567, 888, "Med (IV)", -540000, "MED-540000 (<5)", "Mini TPN (<5 doses)", datetime(2111, 4, 2, 3, 0)], # Still aggregated because breaking up into component amino acids results in too many
# Complex mixture
- [ -390000000, 1234567, 888, "Med (IV)", -550000, "MED-550000", "TPN Adult", datetime(2111, 5, 2, 3, 0)],
+ [ -390000000, 1234567, 888, "Med (IV)", -550000, "MED-550000", "TPN Adult", datetime(2111, 5, 2, 3, 0)],
];
actualData = DBUtil.execute(testQuery);
-
+
self.assertEqualTable( expectedData, actualData );
def suite():
@@ -569,8 +569,8 @@ def suite():
#suite.addTest(TestSTRIDEOrderMedConversion('test_executeIterator'));
#suite.addTest(TestSTRIDEOrderMedConversion('test_dataConversion_maxMixtureCount'));
suite.addTest(unittest.makeSuite(TestSTRIDEOrderMedConversion));
-
+
return suite;
-
+
if __name__=="__main__":
unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/test/TestSTRIDEOrderProcConversion.py b/medinfo/dataconversion/test/TestSTRIDEOrderProcConversion.py
index 6a163592..98b5a039 100644
--- a/medinfo/dataconversion/test/TestSTRIDEOrderProcConversion.py
+++ b/medinfo/dataconversion/test/TestSTRIDEOrderProcConversion.py
@@ -2,14 +2,16 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel;
@@ -24,9 +26,8 @@ def setUp(self):
DBTestCase.setUp(self);
log.info("Populate the database with test data")
-
- # Relabel any existing data to not interfere with the new test data that will be produced
- DBUtil.execute("update clinical_item_category set source_table = 'PreTest_order_proc' where source_table = 'stride_order_proc';");
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
self.orderProcIdStrList = list();
headers = ["order_proc_id", "pat_id", "pat_enc_csn_id", "order_type", "proc_id", "proc_code", "description", "order_time", "instantiated_time","stand_interval"];
@@ -41,6 +42,7 @@ def setUp(self):
RowItemModel( [ -417843774, "2648748", 555, "Nursing", 1508, "NUR1068", "WEIGHT", "2111-12-08", None, "ONCE"], headers ),
RowItemModel( [ -419268931, "3039254", 666, "Lab", 1721, "LABPTT", "PTT PARTIAL THROMBOPLASTIN TIME", "2112-01-04", None, "DAILY"], headers ),
RowItemModel( [ -419268231, "3039254", 666, "Lab", 1721, "LABPTT", "PTT PARTIAL THROMBOPLASTIN TIME", "2112-01-04", "2112-01-06", "Q6H PRN"], headers ), # Ignore instantiated / spawned child orders
+ RowItemModel( [ -419268937, "3039254", 666, "Lab", 9991721, "LABPTT", "PTT (PARTIAL THROMBOPLASTIN TIME)", "2112-01-05", None, "DAILY"], headers ), # Different proc_id, but same proc_Code. Treat like the same
RowItemModel( [ -419268935, "3039254", 777, "Lab", 1721, "LABPTT", "PTT PARTIAL THROMBOPLASTIN TIME", "2112-01-04", "2112-01-07", "ONCE"], headers ), # Primarily only interested in the decision point with the original order
];
for dataModel in dataModels:
@@ -107,7 +109,6 @@ def tearDown(self):
"""
);
DBUtil.execute("delete from clinical_item_category where source_table = 'stride_order_proc';");
- DBUtil.execute("update clinical_item_category set source_table = 'stride_order_proc' where source_table = 'PreTest_order_proc';"); # Reset labels of any prior data
DBUtil.execute("delete from stride_orderset_order_proc where order_proc_id in (%s)" % str.join(",", self.orderProcIdStrList) );
DBUtil.execute("delete from stride_order_proc where order_proc_id in (%s)" % str.join(",", self.orderProcIdStrList) );
@@ -144,8 +145,9 @@ def test_dataConversion(self):
""";
expectedData = \
[
- [ -419697343, 3042640, 222, "Point of Care Testing", 1001, "LABPOCGLU", "GLUCOSE BY METER", datetime(2112,01,13) ],
- [ -419268931, 3039254, 666, "Lab", 1721, "LABPTT", "PTT PARTIAL THROMBOPLASTIN TIME", datetime(2112,01,04) ],
+ [ -419697343, 3042640, 222, "Point of Care Testing", 1001, "LABPOCGLU", "GLUCOSE BY METER", datetime(2112,1,13) ],
+ [ -419268937, 3039254, 666, "Lab", 1721, "LABPTT", "PTT PARTIAL THROMBOPLASTIN TIME", datetime(2112,1,5) ],
+ [ -419268931, 3039254, 666, "Lab", 1721, "LABPTT", "PTT PARTIAL THROMBOPLASTIN TIME", datetime(2112,1,4) ],
[ -418928388, -1612899, 333, "Point of Care Testing", 1001, "LABPOCGLU", "GLUCOSE BY METER", datetime(2111,12,28) ],
[ -418045499, 2087083, 444, "Nursing", 1428, "NUR1018", "MONITOR INTAKE AND OUTPUT", datetime(2111,12,11) ],
[ -417974686, 380873, 111, "Nursing", 1453, "NUR1043", "NURSING PULSE OXIMETRY", datetime(2111,12,10) ],
diff --git a/medinfo/dataconversion/test/TestSTRIDEOrderResultsConversion.py b/medinfo/dataconversion/test/TestSTRIDEOrderResultsConversion.py
index a90c9620..0e1faa59 100644
--- a/medinfo/dataconversion/test/TestSTRIDEOrderResultsConversion.py
+++ b/medinfo/dataconversion/test/TestSTRIDEOrderResultsConversion.py
@@ -2,14 +2,16 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel;
@@ -25,10 +27,8 @@ def setUp(self):
DBTestCase.setUp(self);
log.info("Populate the database with test data")
-
- # Relabel any existing data to not interfere with the new test data that will be produced
- DBUtil.execute("update clinical_item_category set source_table = 'PreTest_order_results' where source_table = '%s';" % TEST_SOURCE_TABLE);
- DBUtil.execute("update order_result_stat set base_name = 'PreTest_' || base_name;");
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
dataTextStr = """order_proc_id\tpat_id\tpat_enc_csn_id\torder_type\tproc_id\tproc_code\tdescription
-30560253\t-7803\t-1772\tLab\t471521\tLABACETA\tACETAMINOPHEN, SERUM
@@ -127,10 +127,8 @@ def tearDown(self):
""" % TEST_SOURCE_TABLE
);
DBUtil.execute("delete from clinical_item_category where source_table = '%s';" % TEST_SOURCE_TABLE);
- DBUtil.execute("update clinical_item_category set source_table = '%s' where source_table = 'PreTest_order_results';" % TEST_SOURCE_TABLE); # Reset labels of any prior data
DBUtil.execute("delete from order_result_stat where base_name not like 'PreTest_%%';");
- DBUtil.execute("update order_result_stat set base_name = right( base_name,length(base_name)-length('PreTest_') );"); # Reset labels of any prior data
DBUtil.execute("delete from stride_order_results where order_proc_id < 0" );
DBUtil.execute("delete from stride_order_proc where order_proc_id < 0" );
diff --git a/medinfo/dataconversion/test/TestSTRIDEPreAdmitMedConversion.py b/medinfo/dataconversion/test/TestSTRIDEPreAdmitMedConversion.py
deleted file mode 100644
index 3e60a027..00000000
--- a/medinfo/dataconversion/test/TestSTRIDEPreAdmitMedConversion.py
+++ /dev/null
@@ -1,358 +0,0 @@
-#!/usr/bin/env python
-"""Test case for respective module in application package"""
-
-import sys, os
-from cStringIO import StringIO
-from datetime import datetime;
-import unittest
-
-from Const import RUNNER_VERBOSITY;
-from Util import log;
-
-from medinfo.db.test.Util import DBTestCase;
-
-from medinfo.db import DBUtil
-from medinfo.db.Model import SQLQuery, RowItemModel;
-
-from medinfo.dataconversion.STRIDEPreAdmitMedConversion import STRIDEPreAdmitMedConversion, ConversionOptions;
-
-TEST_START_DATE = datetime(2100,1,1); # Date in far future to start checking for test records to avoid including existing data in database
-
-class TestSTRIDEPreAdmitMedConversion(DBTestCase):
- def setUp(self):
- """Prepare state for test cases"""
- DBTestCase.setUp(self);
-
- # Relabel any existing data to not interfere with the new test data that will be produced
- DBUtil.execute("update clinical_item_category set source_table = 'PreTest_preadmit_med' where source_table = 'stride_preadmit_med';");
-
- log.info("Populate the database with test data")
-
- headers = ["stride_preadmit_med_id","pat_anon_id","contact_date","medication_id","description","thera_class","pharm_class","pharm_subclass"];
- dataModels = \
- [ # Deliberately design dates in far future to facilitate isolated testing
- RowItemModel([-100, -1000, datetime(2113, 7, 6), -5680, "NORVASC 5 MG PO TABS", "CARDIAC DRUGS", "CALCIUM CHANNEL BLOCKING AGENTS", "Calcium Channel Blockers - Dihydropyridines"], headers ),
- RowItemModel([-110, -2000, datetime(2110, 3, 8), -6540, "PRILOSEC 20 MG PO CPDR", "GASTROINTESTINAL", "PROTON-PUMP INHIBITORS", "Gastric Acid Secretion Reducing Agents - Proton Pump Inhibitors (PPIs)"], headers ),
- RowItemModel([-120, -2000, datetime(2110, 3, 8), -8113, "TRIAMCINOLONE 0.1% CREAM", "SKIN PREPS", "TOPICAL ANTI-INFLAMMATORY STEROIDAL", "Dermatological - Glucocorticoid"], headers ),
- # Multiple or no mappings
- RowItemModel([-130, -3000, datetime(2109, 9,20),-126745, "NORETHINDRN ESTRADIOL", "CONTRACEPTIVES", "CONTRACEPTIVES,ORAL", "Contraceptive Oral - Monophasic"], headers ),
- RowItemModel([-140, -4000, datetime(2110, 5, 4), -28384, "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS", "ANALGESICS", "ANALGESICS, NARCOTICS", "Analgesic Narcotic Hydrocodone Combinations"], headers ),
- # Excessively complex mapping
- RowItemModel([-150, -5000, datetime(2108, 8, 6), -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("stride_preadmit_med", dataModel, retrieveCol="pat_anon_id" );
-
- # Mapping table to simplify dose
- headers = ["medication_id", "medication_name", "rxcui", "active_ingredient"];
- dataModels = \
- [ # Mappings to active ingredients
- RowItemModel( [ -5680, "NORVASC 5 MG PO TABS", -17767, "Amlodipine"], headers ),
- RowItemModel( [ -6540, "PRILOSEC 20 MG PO CPDR", -7646, "Omeprazole"], headers ),
- RowItemModel( [ -8113, "TRIAMCINOLONE ACETONIDE 0.1 % TP CREA", -10759, "Triamcinolone"], headers ),
- # If multiple active ingredients in a combo, unravel to active components
- RowItemModel( [ -28384, "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS", -161, "Acetaminophen"], headers ),
- RowItemModel( [ -28384, "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS", -5489, "Hydrocodone"], headers ),
- # No mapping entries for Norethindrone+Estradiol
- # Excessive mappings for pneumovax
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854930, "pneumococcal capsular polysaccharide type 1 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854932, "pneumococcal capsular polysaccharide type 10A vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854934, "pneumococcal capsular polysaccharide type 11A vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854936, "pneumococcal capsular polysaccharide type 12F vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854938, "pneumococcal capsular polysaccharide type 14 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854940, "pneumococcal capsular polysaccharide type 15B vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854942, "pneumococcal capsular polysaccharide type 17F vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854944, "pneumococcal capsular polysaccharide type 18C vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854946, "pneumococcal capsular polysaccharide type 19A vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854948, "pneumococcal capsular polysaccharide type 19F vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854950, "pneumococcal capsular polysaccharide type 2 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854952, "pneumococcal capsular polysaccharide type 20 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854954, "pneumococcal capsular polysaccharide type 22F vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854956, "pneumococcal capsular polysaccharide type 23F vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854958, "pneumococcal capsular polysaccharide type 3 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854960, "pneumococcal capsular polysaccharide type 33F vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854962, "pneumococcal capsular polysaccharide type 4 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854964, "pneumococcal capsular polysaccharide type 5 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854966, "pneumococcal capsular polysaccharide type 6B vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854968, "pneumococcal capsular polysaccharide type 7F vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854970, "pneumococcal capsular polysaccharide type 8 vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854972, "pneumococcal capsular polysaccharide type 9N vaccine"], headers ),
- RowItemModel( [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854974, "pneumococcal capsular polysaccharide type 9V vaccine"], headers ),
- ];
- for dataModel in dataModels:
- (dataItemId, isNew) = DBUtil.findOrInsertItem("stride_mapped_meds", dataModel, retrieveCol="rxcui" );
-
- self.converter = STRIDEPreAdmitMedConversion(); # Instance to test on
-
- def tearDown(self):
- """Restore state from any setUp or test steps"""
- log.info("Purge test records from the database")
-
- DBUtil.execute \
- ( """delete from patient_item
- where clinical_item_id in
- ( select clinical_item_id
- from clinical_item as ci, clinical_item_category as cic
- where ci.clinical_item_category_id = cic.clinical_item_category_id
- and cic.source_table = 'stride_preadmit_med'
- );
- """
- );
- DBUtil.execute \
- ( """delete from clinical_item
- where clinical_item_category_id in
- ( select clinical_item_category_id
- from clinical_item_category
- where source_table = 'stride_preadmit_med'
- );
- """
- );
- DBUtil.execute("delete from clinical_item_category where source_table = 'stride_preadmit_med';");
- DBUtil.execute("update clinical_item_category set source_table = 'stride_preadmit_med' where source_table = 'PreTest_preadmit_med';"); # Reset labels of any prior data
-
- DBUtil.execute("delete from stride_mapped_meds where rxcui < 0");
- DBUtil.execute("delete from stride_preadmit_med where stride_preadmit_med_id < 0");
-
- DBTestCase.tearDown(self);
-
- def test_dataConversion_normalized(self):
- # Run the data conversion on the same data and look for expected records
- log.debug("Run the conversion process...");
- convOptions = ConversionOptions();
- convOptions.startDate = TEST_START_DATE;
- convOptions.normalizeMixtures = True;
- self.converter.convertSourceItems(convOptions);
-
- # Just query back for the same data, de-normalizing the data back to a general table
- testQuery = \
- """
- select
- pi.external_id,
- pi.patient_id,
- pi.encounter_id,
- cic.description,
- ci.external_id,
- ci.name,
- ci.description,
- pi.item_date
- from
- patient_item as pi,
- clinical_item as ci,
- clinical_item_category as cic
- where
- pi.clinical_item_id = ci.clinical_item_id and
- ci.clinical_item_category_id = cic.clinical_item_category_id and
- cic.source_table = 'stride_preadmit_med'
- order by
- pi.external_id desc, ci.external_id desc
- """;
- expectedData = \
- [ # Simple mappings
- [-100, -1000, None, "Preadmit Med", -17767, "RXCUI-17767", "Amlodipine", datetime(2113, 7, 6) ],
- [-110, -2000, None, "Preadmit Med", -7646, "RXCUI-7646", "Omeprazole", datetime(2110, 3, 8) ],
- [-120, -2000, None, "Preadmit Med", -10759, "RXCUI-10759", "Triamcinolone", datetime(2110, 3, 8) ],
- # No mappings
- [-130, -3000, None, "Preadmit Med", -126745, "MED-126745", "NORETHINDRN ESTRADIOL", datetime(2109, 9, 20) ],
- # Multiple mappings
- [-140, -4000, None, "Preadmit Med", -161, "RXCUI-161", "Acetaminophen", datetime(2110, 5, 4) ],
- [-140, -4000, None, "Preadmit Med", -5489, "RXCUI-5489", "Hydrocodone", datetime(2110, 5, 4) ],
- # Excessively complex mapping
- [-150, -5000, None, "Preadmit Med", -854930, "RXCUI-854930", "Pneumococcal Capsular Polysaccharide Type 1 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854932, "RXCUI-854932", "Pneumococcal Capsular Polysaccharide Type 10A Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854934, "RXCUI-854934", "Pneumococcal Capsular Polysaccharide Type 11A Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854936, "RXCUI-854936", "Pneumococcal Capsular Polysaccharide Type 12F Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854938, "RXCUI-854938", "Pneumococcal Capsular Polysaccharide Type 14 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854940, "RXCUI-854940", "Pneumococcal Capsular Polysaccharide Type 15B Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854942, "RXCUI-854942", "Pneumococcal Capsular Polysaccharide Type 17F Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854944, "RXCUI-854944", "Pneumococcal Capsular Polysaccharide Type 18C Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854946, "RXCUI-854946", "Pneumococcal Capsular Polysaccharide Type 19A Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854948, "RXCUI-854948", "Pneumococcal Capsular Polysaccharide Type 19F Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854950, "RXCUI-854950", "Pneumococcal Capsular Polysaccharide Type 2 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854952, "RXCUI-854952", "Pneumococcal Capsular Polysaccharide Type 20 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854954, "RXCUI-854954", "Pneumococcal Capsular Polysaccharide Type 22F Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854956, "RXCUI-854956", "Pneumococcal Capsular Polysaccharide Type 23F Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854958, "RXCUI-854958", "Pneumococcal Capsular Polysaccharide Type 3 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854960, "RXCUI-854960", "Pneumococcal Capsular Polysaccharide Type 33F Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854962, "RXCUI-854962", "Pneumococcal Capsular Polysaccharide Type 4 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854964, "RXCUI-854964", "Pneumococcal Capsular Polysaccharide Type 5 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854966, "RXCUI-854966", "Pneumococcal Capsular Polysaccharide Type 6B Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854968, "RXCUI-854968", "Pneumococcal Capsular Polysaccharide Type 7F Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854970, "RXCUI-854970", "Pneumococcal Capsular Polysaccharide Type 8 Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854972, "RXCUI-854972", "Pneumococcal Capsular Polysaccharide Type 9N Vaccine", datetime(2108, 8, 6) ],
- [-150, -5000, None, "Preadmit Med", -854974, "RXCUI-854974", "Pneumococcal Capsular Polysaccharide Type 9V Vaccine", datetime(2108, 8, 6) ],
- ];
- actualData = DBUtil.execute(testQuery);
- self.assertEqualTable( expectedData, actualData );
-
- # Query for medication class label population
- testQuery = \
- """
- select
- medication_id,
- medication_name,
- rxcui,
- active_ingredient,
- thera_class,
- pharm_class,
- pharm_subclass
- from stride_mapped_meds as map
- where
- medication_id < 0 and rxcui < 0
- order by
- medication_id desc, rxcui desc
- """;
- expectedData = \
- [
- [ -5680, "NORVASC 5 MG PO TABS", -17767, "Amlodipine", "CARDIAC DRUGS", "CALCIUM CHANNEL BLOCKING AGENTS", "Calcium Channel Blockers - Dihydropyridines"],
- [ -6540, "PRILOSEC 20 MG PO CPDR", -7646, "Omeprazole", "GASTROINTESTINAL", "PROTON-PUMP INHIBITORS", "Gastric Acid Secretion Reducing Agents - Proton Pump Inhibitors (PPIs)"],
- [ -8113, "TRIAMCINOLONE ACETONIDE 0.1 % TP CREA", -10759, "Triamcinolone", "SKIN PREPS", "TOPICAL ANTI-INFLAMMATORY STEROIDAL", "Dermatological - Glucocorticoid"],
- # If multiple active ingredients in a combo, unravel to active components
- [ -28384, "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS", -161, "Acetaminophen", "ANALGESICS", "ANALGESICS, NARCOTICS", "Analgesic Narcotic Hydrocodone Combinations"],
- [ -28384, "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS", -5489, "Hydrocodone", "ANALGESICS", "ANALGESICS, NARCOTICS", "Analgesic Narcotic Hydrocodone Combinations"],
- # No mapping entries for Norethindrone+Estradiol
- # Excessive mappings for pneumovax
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854930, "pneumococcal capsular polysaccharide type 1 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854932, "pneumococcal capsular polysaccharide type 10A vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854934, "pneumococcal capsular polysaccharide type 11A vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854936, "pneumococcal capsular polysaccharide type 12F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854938, "pneumococcal capsular polysaccharide type 14 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854940, "pneumococcal capsular polysaccharide type 15B vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854942, "pneumococcal capsular polysaccharide type 17F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854944, "pneumococcal capsular polysaccharide type 18C vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854946, "pneumococcal capsular polysaccharide type 19A vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854948, "pneumococcal capsular polysaccharide type 19F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854950, "pneumococcal capsular polysaccharide type 2 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854952, "pneumococcal capsular polysaccharide type 20 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854954, "pneumococcal capsular polysaccharide type 22F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854956, "pneumococcal capsular polysaccharide type 23F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854958, "pneumococcal capsular polysaccharide type 3 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854960, "pneumococcal capsular polysaccharide type 33F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854962, "pneumococcal capsular polysaccharide type 4 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854964, "pneumococcal capsular polysaccharide type 5 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854966, "pneumococcal capsular polysaccharide type 6B vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854968, "pneumococcal capsular polysaccharide type 7F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854970, "pneumococcal capsular polysaccharide type 8 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854972, "pneumococcal capsular polysaccharide type 9N vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854974, "pneumococcal capsular polysaccharide type 9V vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- ];
- actualData = DBUtil.execute(testQuery);
- self.assertEqualTable( expectedData, actualData );
-
-
- def test_dataConversion_maxMixtureCount(self):
- # Run the data conversion on the same data and look for expected records
- log.debug("Run the conversion process...");
- convOptions = ConversionOptions();
- convOptions.startDate = TEST_START_DATE;
- convOptions.normalizeMixtures = False;
- convOptions.maxMixtureCount = 5;
- self.converter.convertSourceItems(convOptions);
-
- # Just query back for the same data, de-normalizing the data back to a general table
- testQuery = \
- """
- select
- pi.external_id,
- pi.patient_id,
- pi.encounter_id,
- cic.description,
- ci.external_id,
- ci.name,
- ci.description,
- pi.item_date
- from
- patient_item as pi,
- clinical_item as ci,
- clinical_item_category as cic
- where
- pi.clinical_item_id = ci.clinical_item_id and
- ci.clinical_item_category_id = cic.clinical_item_category_id and
- cic.source_table = 'stride_preadmit_med'
- order by
- pi.external_id desc, ci.external_id desc
- """;
- expectedData = \
- [ # Simple mappings
- [-100, -1000, None, "Preadmit Med", -17767, "RXCUI-17767", "Amlodipine", datetime(2113, 7, 6) ],
- [-110, -2000, None, "Preadmit Med", -7646, "RXCUI-7646", "Omeprazole", datetime(2110, 3, 8) ],
- [-120, -2000, None, "Preadmit Med", -10759, "RXCUI-10759", "Triamcinolone", datetime(2110, 3, 8) ],
- # No mappings
- [-130, -3000, None, "Preadmit Med", -126745, "MED-126745", "NORETHINDRN ESTRADIOL", datetime(2109, 9, 20) ],
- # Multiple mappings
- [-140, -4000, None, "Preadmit Med", -28384, "MED-28384", "Acetaminophen-Hydrocodone", datetime(2110, 5, 4) ],
- # Excessively complex mapping
- [-150, -5000, None, "Preadmit Med", -95140, "MED-95140", "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", datetime(2108, 8, 6) ],
- ];
- actualData = DBUtil.execute(testQuery);
- self.assertEqualTable( expectedData, actualData );
-
- # Query for medication class label population
- testQuery = \
- """
- select
- medication_id,
- medication_name,
- rxcui,
- active_ingredient,
- thera_class,
- pharm_class,
- pharm_subclass
- from stride_mapped_meds as map
- where
- medication_id < 0 and rxcui < 0
- order by
- medication_id desc, rxcui desc
- """;
- expectedData = \
- [
- [ -5680, "NORVASC 5 MG PO TABS", -17767, "Amlodipine", "CARDIAC DRUGS", "CALCIUM CHANNEL BLOCKING AGENTS", "Calcium Channel Blockers - Dihydropyridines"],
- [ -6540, "PRILOSEC 20 MG PO CPDR", -7646, "Omeprazole", "GASTROINTESTINAL", "PROTON-PUMP INHIBITORS", "Gastric Acid Secretion Reducing Agents - Proton Pump Inhibitors (PPIs)"],
- [ -8113, "TRIAMCINOLONE ACETONIDE 0.1 % TP CREA", -10759, "Triamcinolone", "SKIN PREPS", "TOPICAL ANTI-INFLAMMATORY STEROIDAL", "Dermatological - Glucocorticoid"],
- # If multiple active ingredients in a combo, unravel to active components
- [ -28384, "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS", -161, "Acetaminophen", "ANALGESICS", "ANALGESICS, NARCOTICS", "Analgesic Narcotic Hydrocodone Combinations"],
- [ -28384, "HYDROCODONE-ACETAMINOPHEN 10-325 MG PO TABS", -5489, "Hydrocodone", "ANALGESICS", "ANALGESICS, NARCOTICS", "Analgesic Narcotic Hydrocodone Combinations"],
- # No mapping entries for Norethindrone+Estradiol
- # Excessive mappings for pneumovax
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854930, "pneumococcal capsular polysaccharide type 1 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854932, "pneumococcal capsular polysaccharide type 10A vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854934, "pneumococcal capsular polysaccharide type 11A vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854936, "pneumococcal capsular polysaccharide type 12F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854938, "pneumococcal capsular polysaccharide type 14 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854940, "pneumococcal capsular polysaccharide type 15B vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854942, "pneumococcal capsular polysaccharide type 17F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854944, "pneumococcal capsular polysaccharide type 18C vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854946, "pneumococcal capsular polysaccharide type 19A vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854948, "pneumococcal capsular polysaccharide type 19F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854950, "pneumococcal capsular polysaccharide type 2 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854952, "pneumococcal capsular polysaccharide type 20 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854954, "pneumococcal capsular polysaccharide type 22F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854956, "pneumococcal capsular polysaccharide type 23F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854958, "pneumococcal capsular polysaccharide type 3 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854960, "pneumococcal capsular polysaccharide type 33F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854962, "pneumococcal capsular polysaccharide type 4 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854964, "pneumococcal capsular polysaccharide type 5 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854966, "pneumococcal capsular polysaccharide type 6B vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854968, "pneumococcal capsular polysaccharide type 7F vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854970, "pneumococcal capsular polysaccharide type 8 vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854972, "pneumococcal capsular polysaccharide type 9N vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- [ -95140, "PNEUMOCOCCAL 23-VALPS VACCINE 25 MCG/0.5 ML INJ INJ", -854974, "pneumococcal capsular polysaccharide type 9V vaccine", "BIOLOGICALS", "GRAM POSITIVE COCCI VACCINES", "Vaccine Bacterial - Gram Positive Cocci"],
- ];
- actualData = DBUtil.execute(testQuery);
- self.assertEqualTable( expectedData, actualData );
-
-def suite():
- """Returns the suite of tests to run for this test class / module.
- Use unittest.makeSuite methods which simply extracts all of the
- methods for the given class whose name starts with "test"
- """
- suite = unittest.TestSuite();
- #suite.addTest(TestSTRIDEPreAdmitMedConversion("test_incColNamesAndTypeCodes"));
- #suite.addTest(TestSTRIDEPreAdmitMedConversion("test_insertFile_skipErrors"));
- #suite.addTest(TestSTRIDEPreAdmitMedConversion('test_executeIterator'));
- #suite.addTest(TestSTRIDEPreAdmitMedConversion('test_dataConversion_maxMixtureCount'));
- suite.addTest(unittest.makeSuite(TestSTRIDEPreAdmitMedConversion));
-
- return suite;
-
-if __name__=="__main__":
- unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
diff --git a/medinfo/dataconversion/test/TestSTRIDETreatmentTeamConversion.py b/medinfo/dataconversion/test/TestSTRIDETreatmentTeamConversion.py
index 90ea63fc..9ee581ce 100644
--- a/medinfo/dataconversion/test/TestSTRIDETreatmentTeamConversion.py
+++ b/medinfo/dataconversion/test/TestSTRIDETreatmentTeamConversion.py
@@ -2,14 +2,16 @@
"""Test case for respective module in application package"""
import sys, os
-from cStringIO import StringIO
+from io import StringIO
from datetime import datetime;
import unittest
-from Const import RUNNER_VERBOSITY;
-from Util import log;
+from .Const import RUNNER_VERBOSITY;
+from .Util import log;
from medinfo.db.test.Util import DBTestCase;
+from stride.core.StrideLoader import StrideLoader;
+from stride.clinical_item.ClinicalItemDataLoader import ClinicalItemDataLoader;
from medinfo.db import DBUtil
from medinfo.db.Model import SQLQuery, RowItemModel;
@@ -24,10 +26,9 @@ def setUp(self):
"""Prepare state for test cases"""
DBTestCase.setUp(self);
- # Relabel any existing data to not interfere with the new test data that will be produced
- DBUtil.execute("update clinical_item_category set source_table = 'PreTest_treatment_team' where source_table = 'stride_treatment_team';");
-
log.info("Populate the database with test data")
+ StrideLoader.build_stride_psql_schemata()
+ ClinicalItemDataLoader.build_clinical_item_psql_schemata();
dataTextStr = \
"""stride_treatment_team_id\tpat_id\tpat_enc_csn_id\ttrtmnt_tm_begin_date\ttrtmnt_tm_end_date\ttreatment_team\tprov_name
@@ -330,7 +331,6 @@ def tearDown(self):
"""
);
DBUtil.execute("delete from clinical_item_category where source_table = 'stride_treatment_team';");
- DBUtil.execute("update clinical_item_category set source_table = 'stride_treatment_team' where source_table = 'PreTest_treatment_team';"); # Reset labels of any prior data
DBUtil.execute("delete from stride_treatment_team where stride_treatment_team_id < 0");
diff --git a/medinfo/dataconversion/test/UMichFeatureMatrixTestData.py b/medinfo/dataconversion/test/UMichFeatureMatrixTestData.py
new file mode 100644
index 00000000..c7c0956d
--- /dev/null
+++ b/medinfo/dataconversion/test/UMichFeatureMatrixTestData.py
@@ -0,0 +1,474 @@
+#!/usr/bin/env python
+"""
+Test input and output for FeatureMatrixFactory.
+"""
+
+from medinfo.db import DBUtil
+
+# Dictionary mapping from database table name to test data.
+FM_TEST_INPUT_TABLES = {
+ "labs_columns" : ['pat_id','order_proc_id','order_time','result_time','proc_code','base_name','ord_num_value','result_flag','result_in_range_yn'],
+ "labs_column_types" : ['INTEGER', 'INTEGER', 'TIMESTAMP', 'TIMESTAMP', 'TEXT', 'TEXT', 'TEXT','TEXT','TEXT'],
+ 'labs_data':[
+ # stats within one week:
+ [1, 1, '2050-01-05 09:44:00', '2050-01-05 09:44:00', 'CBCP', 'WBC', 6, 'N', 'Y'],
+ [1, 2, '2050-01-07 12:44:00', '2050-01-07 12:44:00', 'CBCP', 'WBC', 5, 'N', 'Y'],
+ [1, 3, '2050-01-09 23:44:00', '2050-01-09 23:44:00', 'CBCP', 'WBC', 3, 'L', 'N'],
+
+ [1, 4, '2050-01-04 09:44:00', '2050-01-05 09:23:00', 'COMP', 'CO2', 6, 'N', 'Y'],
+ [1, 5, '2050-01-07 13:44:00', '2050-01-07 14:44:00', 'COMP', 'CO2', 5, 'N', 'Y'],
+
+ [1, 6, '2050-01-08 23:44:00', '2050-01-09 23:44:00', 'CBCP', 'HCT', 3, 'H', 'N'],
+
+ [2, 7, '2050-01-04 23:44:00', '2050-01-05 11:44:00', 'CBCP', 'CO2', 3, 'N', 'Y'],
+ [2, 8, '2050-01-05 23:44:00', '2050-01-06 11:44:00', 'CBCP', 'CO2', 10, 'H', 'N'],
+ [2, 9, '2050-01-06 23:44:00', '2050-01-07 11:44:00', 'CBCP', 'CO2', 3, 'N', 'Y'],
+
+ [3, 11, '2050-01-05 09:44:00', '2050-01-05 09:44:00', 'CBCP', 'WBC', 6, 'N', 'Y'],
+ [3, 12, '2050-01-07 12:44:00', '2050-01-07 12:44:00', 'CBCP', 'WBC', 5, 'N', 'Y'],
+
+ [4, 23, '2050-01-09 23:44:00', '2050-01-09 23:44:00', 'CBCP', 'WBC', 3, 'L', 'N'],
+ [4, 24, '2050-01-04 09:44:00', '2050-01-05 09:44:00', 'COMP', 'CO2', 6, 'N', 'Y']
+ ],
+
+ 'pt_info_columns' : ['pat_id','Birth'],
+ "pt_info_column_types" : ['INTEGER','TIMESTAMP'],
+ "pt_info_data" : [
+ [1, '1986-04-23 00:00:00']
+ ],
+
+ 'encounters_columns' : ['pat_id','order_proc_id','AdmitDxDate'],
+ "encounters_column_types" : ['INTEGER','INTEGER','TIMESTAMP'],
+ "encounters_data" : [
+ [1, 1, '2050-01-05 08:00:00'],
+ [1, 2, '2050-01-07 10:44:00'],
+ [1, 3, '2050-01-09 13:44:00']
+ ],
+
+ 'diagnoses_columns' : ['pat_id', 'order_proc_id', 'diagnose_time', 'diagnose_code'],
+ "diagnoses_column_types" : ['INTEGER','INTEGER','TIMESTAMP','TEXT'],
+ "diagnoses_data" : [
+ [1, 114, '2050-01-05 09:00:00', '151.3'],
+ [1, 115, '2050-01-07 11:44:00', '404.01'],
+ [1, 116, '2050-01-09 15:44:00', '185']
+ ],
+
+ 'demographics_columns' : ['pat_id','GenderName', 'RaceName'],
+ 'demographics_column_types': ['INTEGER','TEXT','TEXT'],
+ 'demographics_data' : [
+ [1, 'Male', 'Caucasian'],
+ [2, 'Female', 'Native Hawaiian and Other Pacific Islander'],
+ [3, 'Male', 'Hispanic']
+ ]
+}
+
+# Dictionary mapping from test function to expected output.
+FM_TEST_OUTPUT = {
+ "OUTPUT_RAW_TABLE":[
+ ['pat_id', 'order_time', 'CBCP.preTimeDays', 'CBCP.pre', 'CBCP.pre.1d', 'CBCP.pre.2d', 'CBCP.pre.4d',
+ 'CBCP.pre.7d', 'CBCP.pre.14d', 'CBCP.pre.30d', 'CBCP.pre.90d', 'CBCP.pre.180d', 'CBCP.pre.365d', 'CBCP.pre.730d',
+ 'CBCP.pre.1460d', 'CBCP.postTimeDays', 'CBCP.post', 'CBCP.post.1d', 'CBCP.post.2d', 'CBCP.post.4d',
+ 'CBCP.post.7d', 'CBCP.post.14d', 'CBCP.post.30d', 'CBCP.post.90d', 'CBCP.post.180d', 'CBCP.post.365d',
+ 'CBCP.post.730d', 'CBCP.post.1460d', 'WCB.preTimeDays', 'WCB.pre', 'WCB.pre.1d', 'WCB.pre.2d', 'WCB.pre.4d',
+ 'WCB.pre.7d', 'WCB.pre.14d', 'WCB.pre.30d', 'WCB.pre.90d', 'WCB.pre.180d', 'WCB.pre.365d', 'WCB.pre.730d',
+ 'WCB.pre.1460d', 'WCB.postTimeDays', 'WCB.post', 'WCB.post.1d', 'WCB.post.2d', 'WCB.post.4d', 'WCB.post.7d',
+ 'WCB.post.14d', 'WCB.post.30d', 'WCB.post.90d', 'WCB.post.180d', 'WCB.post.365d', 'WCB.post.730d',
+ 'WCB.post.1460d', 'HCT.preTimeDays', 'HCT.pre', 'HCT.pre.1d', 'HCT.pre.2d', 'HCT.pre.4d', 'HCT.pre.7d',
+ 'HCT.pre.14d', 'HCT.pre.30d', 'HCT.pre.90d', 'HCT.pre.180d', 'HCT.pre.365d', 'HCT.pre.730d', 'HCT.pre.1460d',
+ 'HCT.postTimeDays', 'HCT.post', 'HCT.post.1d', 'HCT.post.2d', 'HCT.post.4d', 'HCT.post.7d', 'HCT.post.14d',
+ 'HCT.post.30d', 'HCT.post.90d', 'HCT.post.180d', 'HCT.post.365d', 'HCT.post.730d', 'HCT.post.1460d',
+ 'Male.preTimeDays', 'Male.pre', 'Male.pre.1d', 'Male.pre.2d', 'Male.pre.4d', 'Male.pre.7d', 'Male.pre.14d',
+ 'Male.pre.30d', 'Male.pre.90d', 'Male.pre.180d', 'Male.pre.365d', 'Male.pre.730d', 'Male.pre.1460d',
+ 'Male.postTimeDays', 'Male.post', 'Male.post.1d', 'Male.post.2d', 'Male.post.4d', 'Male.post.7d', 'Male.post.14d',
+ 'Male.post.30d', 'Male.post.90d', 'Male.post.180d', 'Male.post.365d', 'Male.post.730d', 'Male.post.1460d',
+ 'Caucasian.preTimeDays', 'Caucasian.pre', 'Caucasian.pre.1d', 'Caucasian.pre.2d', 'Caucasian.pre.4d',
+ 'Caucasian.pre.7d', 'Caucasian.pre.14d', 'Caucasian.pre.30d', 'Caucasian.pre.90d', 'Caucasian.pre.180d',
+ 'Caucasian.pre.365d', 'Caucasian.pre.730d', 'Caucasian.pre.1460d', 'Caucasian.postTimeDays', 'Caucasian.post',
+ 'Caucasian.post.1d', 'Caucasian.post.2d', 'Caucasian.post.4d', 'Caucasian.post.7d', 'Caucasian.post.14d',
+ 'Caucasian.post.30d', 'Caucasian.post.90d', 'Caucasian.post.180d', 'Caucasian.post.365d', 'Caucasian.post.730d',
+ 'Caucasian.post.1460d', 'Hispanic.preTimeDays', 'Hispanic.pre', 'Hispanic.pre.1d', 'Hispanic.pre.2d',
+ 'Hispanic.pre.4d', 'Hispanic.pre.7d', 'Hispanic.pre.14d', 'Hispanic.pre.30d', 'Hispanic.pre.90d',
+ 'Hispanic.pre.180d', 'Hispanic.pre.365d', 'Hispanic.pre.730d', 'Hispanic.pre.1460d', 'Hispanic.postTimeDays',
+ 'Hispanic.post', 'Hispanic.post.1d', 'Hispanic.post.2d', 'Hispanic.post.4d', 'Hispanic.post.7d',
+ 'Hispanic.post.14d', 'Hispanic.post.30d', 'Hispanic.post.90d', 'Hispanic.post.180d', 'Hispanic.post.365d',
+ 'Hispanic.post.730d', 'Hispanic.post.1460d', 'Birth.preTimeDays', 'Birth.pre', 'Birth.pre.1d', 'Birth.pre.2d',
+ 'Birth.pre.4d', 'Birth.pre.7d', 'Birth.pre.14d', 'Birth.pre.30d', 'Birth.pre.90d', 'Birth.pre.180d',
+ 'Birth.pre.365d', 'Birth.pre.730d', 'Birth.pre.1460d', 'Birth.postTimeDays', 'Birth.post', 'Birth.post.1d',
+ 'Birth.post.2d', 'Birth.post.4d', 'Birth.post.7d', 'Birth.post.14d', 'Birth.post.30d', 'Birth.post.90d',
+ 'Birth.post.180d', 'Birth.post.365d', 'Birth.post.730d', 'Birth.post.1460d', 'AdmitDxDate.preTimeDays',
+ 'AdmitDxDate.pre', 'Comorbidity.LiverModSevere.preTimeDays', 'Comorbidity.LiverModSevere.pre',
+ 'Comorbidity.LiverModSevere.pre.1d', 'Comorbidity.LiverModSevere.pre.2d', 'Comorbidity.LiverModSevere.pre.4d',
+ 'Comorbidity.LiverModSevere.pre.7d', 'Comorbidity.LiverModSevere.pre.14d', 'Comorbidity.LiverModSevere.pre.30d',
+ 'Comorbidity.LiverModSevere.pre.90d', 'Comorbidity.LiverModSevere.pre.180d',
+ 'Comorbidity.LiverModSevere.pre.365d', 'Comorbidity.LiverModSevere.pre.730d',
+ 'Comorbidity.LiverModSevere.pre.1460d', 'Comorbidity.Rheumatic.preTimeDays', 'Comorbidity.Rheumatic.pre',
+ 'Comorbidity.Rheumatic.pre.1d', 'Comorbidity.Rheumatic.pre.2d', 'Comorbidity.Rheumatic.pre.4d',
+ 'Comorbidity.Rheumatic.pre.7d', 'Comorbidity.Rheumatic.pre.14d', 'Comorbidity.Rheumatic.pre.30d',
+ 'Comorbidity.Rheumatic.pre.90d', 'Comorbidity.Rheumatic.pre.180d', 'Comorbidity.Rheumatic.pre.365d',
+ 'Comorbidity.Rheumatic.pre.730d', 'Comorbidity.Rheumatic.pre.1460d', 'Comorbidity.CHF.preTimeDays',
+ 'Comorbidity.CHF.pre', 'Comorbidity.CHF.pre.1d', 'Comorbidity.CHF.pre.2d', 'Comorbidity.CHF.pre.4d',
+ 'Comorbidity.CHF.pre.7d', 'Comorbidity.CHF.pre.14d', 'Comorbidity.CHF.pre.30d', 'Comorbidity.CHF.pre.90d',
+ 'Comorbidity.CHF.pre.180d', 'Comorbidity.CHF.pre.365d', 'Comorbidity.CHF.pre.730d', 'Comorbidity.CHF.pre.1460d',
+ 'Comorbidity.COPD.preTimeDays', 'Comorbidity.COPD.pre', 'Comorbidity.COPD.pre.1d', 'Comorbidity.COPD.pre.2d',
+ 'Comorbidity.COPD.pre.4d', 'Comorbidity.COPD.pre.7d', 'Comorbidity.COPD.pre.14d', 'Comorbidity.COPD.pre.30d',
+ 'Comorbidity.COPD.pre.90d', 'Comorbidity.COPD.pre.180d', 'Comorbidity.COPD.pre.365d', 'Comorbidity.COPD.pre.730d',
+ 'Comorbidity.COPD.pre.1460d', 'Comorbidity.Renal.preTimeDays', 'Comorbidity.Renal.pre',
+ 'Comorbidity.Renal.pre.1d', 'Comorbidity.Renal.pre.2d', 'Comorbidity.Renal.pre.4d', 'Comorbidity.Renal.pre.7d',
+ 'Comorbidity.Renal.pre.14d', 'Comorbidity.Renal.pre.30d', 'Comorbidity.Renal.pre.90d',
+ 'Comorbidity.Renal.pre.180d', 'Comorbidity.Renal.pre.365d', 'Comorbidity.Renal.pre.730d',
+ 'Comorbidity.Renal.pre.1460d', 'Comorbidity.PepticUlcer.preTimeDays', 'Comorbidity.PepticUlcer.pre',
+ 'Comorbidity.PepticUlcer.pre.1d', 'Comorbidity.PepticUlcer.pre.2d', 'Comorbidity.PepticUlcer.pre.4d',
+ 'Comorbidity.PepticUlcer.pre.7d', 'Comorbidity.PepticUlcer.pre.14d', 'Comorbidity.PepticUlcer.pre.30d',
+ 'Comorbidity.PepticUlcer.pre.90d', 'Comorbidity.PepticUlcer.pre.180d', 'Comorbidity.PepticUlcer.pre.365d',
+ 'Comorbidity.PepticUlcer.pre.730d', 'Comorbidity.PepticUlcer.pre.1460d', 'Comorbidity.Malignancy.preTimeDays',
+ 'Comorbidity.Malignancy.pre', 'Comorbidity.Malignancy.pre.1d', 'Comorbidity.Malignancy.pre.2d',
+ 'Comorbidity.Malignancy.pre.4d', 'Comorbidity.Malignancy.pre.7d', 'Comorbidity.Malignancy.pre.14d',
+ 'Comorbidity.Malignancy.pre.30d', 'Comorbidity.Malignancy.pre.90d', 'Comorbidity.Malignancy.pre.180d',
+ 'Comorbidity.Malignancy.pre.365d', 'Comorbidity.Malignancy.pre.730d', 'Comorbidity.Malignancy.pre.1460d',
+ 'Comorbidity.MI.preTimeDays', 'Comorbidity.MI.pre', 'Comorbidity.MI.pre.1d', 'Comorbidity.MI.pre.2d',
+ 'Comorbidity.MI.pre.4d', 'Comorbidity.MI.pre.7d', 'Comorbidity.MI.pre.14d', 'Comorbidity.MI.pre.30d',
+ 'Comorbidity.MI.pre.90d', 'Comorbidity.MI.pre.180d', 'Comorbidity.MI.pre.365d', 'Comorbidity.MI.pre.730d',
+ 'Comorbidity.MI.pre.1460d', 'Comorbidity.PeripheralVascular.preTimeDays', 'Comorbidity.PeripheralVascular.pre',
+ 'Comorbidity.PeripheralVascular.pre.1d', 'Comorbidity.PeripheralVascular.pre.2d',
+ 'Comorbidity.PeripheralVascular.pre.4d', 'Comorbidity.PeripheralVascular.pre.7d',
+ 'Comorbidity.PeripheralVascular.pre.14d', 'Comorbidity.PeripheralVascular.pre.30d',
+ 'Comorbidity.PeripheralVascular.pre.90d', 'Comorbidity.PeripheralVascular.pre.180d',
+ 'Comorbidity.PeripheralVascular.pre.365d', 'Comorbidity.PeripheralVascular.pre.730d',
+ 'Comorbidity.PeripheralVascular.pre.1460d', 'Comorbidity.Cerebrovascular.preTimeDays',
+ 'Comorbidity.Cerebrovascular.pre', 'Comorbidity.Cerebrovascular.pre.1d', 'Comorbidity.Cerebrovascular.pre.2d',
+ 'Comorbidity.Cerebrovascular.pre.4d', 'Comorbidity.Cerebrovascular.pre.7d', 'Comorbidity.Cerebrovascular.pre.14d',
+ 'Comorbidity.Cerebrovascular.pre.30d', 'Comorbidity.Cerebrovascular.pre.90d',
+ 'Comorbidity.Cerebrovascular.pre.180d', 'Comorbidity.Cerebrovascular.pre.365d',
+ 'Comorbidity.Cerebrovascular.pre.730d', 'Comorbidity.Cerebrovascular.pre.1460d',
+ 'Comorbidity.DiabetesComplications.preTimeDays', 'Comorbidity.DiabetesComplications.pre',
+ 'Comorbidity.DiabetesComplications.pre.1d', 'Comorbidity.DiabetesComplications.pre.2d',
+ 'Comorbidity.DiabetesComplications.pre.4d', 'Comorbidity.DiabetesComplications.pre.7d',
+ 'Comorbidity.DiabetesComplications.pre.14d', 'Comorbidity.DiabetesComplications.pre.30d',
+ 'Comorbidity.DiabetesComplications.pre.90d', 'Comorbidity.DiabetesComplications.pre.180d',
+ 'Comorbidity.DiabetesComplications.pre.365d', 'Comorbidity.DiabetesComplications.pre.730d',
+ 'Comorbidity.DiabetesComplications.pre.1460d', 'Comorbidity.HemiplegiaParaplegia.preTimeDays',
+ 'Comorbidity.HemiplegiaParaplegia.pre', 'Comorbidity.HemiplegiaParaplegia.pre.1d',
+ 'Comorbidity.HemiplegiaParaplegia.pre.2d', 'Comorbidity.HemiplegiaParaplegia.pre.4d',
+ 'Comorbidity.HemiplegiaParaplegia.pre.7d', 'Comorbidity.HemiplegiaParaplegia.pre.14d',
+ 'Comorbidity.HemiplegiaParaplegia.pre.30d', 'Comorbidity.HemiplegiaParaplegia.pre.90d',
+ 'Comorbidity.HemiplegiaParaplegia.pre.180d', 'Comorbidity.HemiplegiaParaplegia.pre.365d',
+ 'Comorbidity.HemiplegiaParaplegia.pre.730d', 'Comorbidity.HemiplegiaParaplegia.pre.1460d',
+ 'Comorbidity.MalignancyMetastatic.preTimeDays', 'Comorbidity.MalignancyMetastatic.pre',
+ 'Comorbidity.MalignancyMetastatic.pre.1d', 'Comorbidity.MalignancyMetastatic.pre.2d',
+ 'Comorbidity.MalignancyMetastatic.pre.4d', 'Comorbidity.MalignancyMetastatic.pre.7d',
+ 'Comorbidity.MalignancyMetastatic.pre.14d', 'Comorbidity.MalignancyMetastatic.pre.30d',
+ 'Comorbidity.MalignancyMetastatic.pre.90d', 'Comorbidity.MalignancyMetastatic.pre.180d',
+ 'Comorbidity.MalignancyMetastatic.pre.365d', 'Comorbidity.MalignancyMetastatic.pre.730d',
+ 'Comorbidity.MalignancyMetastatic.pre.1460d', 'Comorbidity.AIDSHIV.preTimeDays', 'Comorbidity.AIDSHIV.pre',
+ 'Comorbidity.AIDSHIV.pre.1d', 'Comorbidity.AIDSHIV.pre.2d', 'Comorbidity.AIDSHIV.pre.4d',
+ 'Comorbidity.AIDSHIV.pre.7d', 'Comorbidity.AIDSHIV.pre.14d', 'Comorbidity.AIDSHIV.pre.30d',
+ 'Comorbidity.AIDSHIV.pre.90d', 'Comorbidity.AIDSHIV.pre.180d', 'Comorbidity.AIDSHIV.pre.365d',
+ 'Comorbidity.AIDSHIV.pre.730d', 'Comorbidity.AIDSHIV.pre.1460d', 'Comorbidity.Dementia.preTimeDays',
+ 'Comorbidity.Dementia.pre', 'Comorbidity.Dementia.pre.1d', 'Comorbidity.Dementia.pre.2d',
+ 'Comorbidity.Dementia.pre.4d', 'Comorbidity.Dementia.pre.7d', 'Comorbidity.Dementia.pre.14d',
+ 'Comorbidity.Dementia.pre.30d', 'Comorbidity.Dementia.pre.90d', 'Comorbidity.Dementia.pre.180d',
+ 'Comorbidity.Dementia.pre.365d', 'Comorbidity.Dementia.pre.730d', 'Comorbidity.Dementia.pre.1460d',
+ 'Comorbidity.LiverMild.preTimeDays', 'Comorbidity.LiverMild.pre', 'Comorbidity.LiverMild.pre.1d',
+ 'Comorbidity.LiverMild.pre.2d', 'Comorbidity.LiverMild.pre.4d', 'Comorbidity.LiverMild.pre.7d',
+ 'Comorbidity.LiverMild.pre.14d', 'Comorbidity.LiverMild.pre.30d', 'Comorbidity.LiverMild.pre.90d',
+ 'Comorbidity.LiverMild.pre.180d', 'Comorbidity.LiverMild.pre.365d', 'Comorbidity.LiverMild.pre.730d',
+ 'Comorbidity.LiverMild.pre.1460d', 'Comorbidity.Diabetes.preTimeDays', 'Comorbidity.Diabetes.pre',
+ 'Comorbidity.Diabetes.pre.1d', 'Comorbidity.Diabetes.pre.2d', 'Comorbidity.Diabetes.pre.4d',
+ 'Comorbidity.Diabetes.pre.7d', 'Comorbidity.Diabetes.pre.14d', 'Comorbidity.Diabetes.pre.30d',
+ 'Comorbidity.Diabetes.pre.90d', 'Comorbidity.Diabetes.pre.180d', 'Comorbidity.Diabetes.pre.365d',
+ 'Comorbidity.Diabetes.pre.730d', 'Comorbidity.Diabetes.pre.1460d', 'WCB.-3_0.count', 'WCB.-3_0.countInRange',
+ 'WCB.-3_0.min', 'WCB.-3_0.max', 'WCB.-3_0.median', 'WCB.-3_0.mean', 'WCB.-3_0.std', 'WCB.-3_0.first',
+ 'WCB.-3_0.last', 'WCB.-3_0.diff', 'WCB.-3_0.slope', 'WCB.-3_0.proximate', 'WCB.-3_0.firstTimeDays',
+ 'WCB.-3_0.lastTimeDays', 'WCB.-3_0.proximateTimeDays', 'CO2.-3_0.count', 'CO2.-3_0.countInRange', 'CO2.-3_0.min',
+ 'CO2.-3_0.max', 'CO2.-3_0.median', 'CO2.-3_0.mean', 'CO2.-3_0.std', 'CO2.-3_0.first', 'CO2.-3_0.last',
+ 'CO2.-3_0.diff', 'CO2.-3_0.slope', 'CO2.-3_0.proximate', 'CO2.-3_0.firstTimeDays', 'CO2.-3_0.lastTimeDays',
+ 'CO2.-3_0.proximateTimeDays'],
+ ['1', '2050-01-05 09:44:00', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0.0', '4', '1',
+ '1', '3', '4', '4', '4', '4', '4', '4', '4', '4', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '3.58333333333', '1', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1',
+ '-54791.4055556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '-54791.4055556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-23268.4055556',
+ '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '-0.0722222222222', '1', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '1', '1', '6.0', '6.0',
+ '6.0', '6.0', '0.0', '6.0', '6.0', '0.0', '0.0', '6.0', '-0.0145833333333', '-0.0145833333333',
+ '-0.0145833333333'],
+ ['1', '2050-01-07 12:44:00', '-2.125', '1', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0.0', '3', '1',
+ '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '1.45833333333', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
+ '-54793.5305556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '-54793.5305556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-23270.5305556',
+ '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '-0.0833333333333', '2', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '1', '1', '6.0', '6.0',
+ '6.0', '6.0', '0.0', '6.0', '6.0', '0.0', '0.0', '6.0', '-2.13958333333', '-2.13958333333', '-2.13958333333'],
+ ['1', '2050-01-09 23:44:00', '-1.0', '3', '1', '1', '2', '3', '3', '3', '3', '3', '3', '3', '3', '0.0', '1', '1',
+ '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1.0', '1', '1', '1', '1', '1', '1',
+ '1', '1', '1', '1', '1', '1', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '-54795.9888889', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '-54795.9888889', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-23272.9888889',
+ '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '-0.416666666667', '3', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '1', '1', '5.0', '5.0', '5.0',
+ '5.0', '0.0', '5.0', '5.0', '0.0', '0.0', '5.0', '-2.375', '-2.375', '-2.375'],
+ ['1', '2050-01-04 09:44:00', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.0', '4', '1',
+ '1', '2', '4', '4', '4', '4', '4', '4', '4', '4', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '4.58333333333', '1', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1',
+ '-54790.4055556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '-54790.4055556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-23267.4055556',
+ '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '0', '0', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None'],
+ ['1', '2050-01-07 13:44:00', '-0.0416666666667', '2', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2',
+ '1.41666666667', '2', '0', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.41666666667', '1', '0', '1', '1', '1', '1', '1', '1',
+ '1', '1', '1', '1', '-54793.5722222', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-54793.5722222', '1', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '-23270.5722222', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '-0.125', '2', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '1', '1', '6.0',
+ '6.0', '6.0', '6.0', '0.0', '6.0', '6.0', '0.0', '0.0', '6.0', '-2.18125', '-2.18125', '-2.18125'],
+ ['1', '2050-01-08 23:44:00', '-1.45833333333', '2', '0', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '0.0',
+ '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0.0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
+ '-54794.9888889', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '-54794.9888889', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-23271.9888889',
+ '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '-1.54166666667', '2', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '1', '1', '5.0', '5.0', '5.0',
+ '5.0', '0.0', '5.0', '5.0', '0.0', '0.0', '5.0', '-1.375', '-1.375', '-1.375'],
+ ['2', '2050-01-04 23:44:00', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0.0', '3', '2',
+ '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None'],
+ ['2', '2050-01-05 23:44:00', '-1.0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0.0', '2', '2',
+ '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', '1', '1', '3.0', '3.0', '3.0', '3.0', '0.0', '3.0', '3.0', '0.0', '0.0', '3.0', '-0.5',
+ '-0.5', '-0.5'],
+ ['2', '2050-01-06 23:44:00', '-1.0', '2', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '0.0', '1', '1',
+ '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', '2', '1', '3.0', '10.0', '6.5', '6.5', '3.5', '3.0', '10.0', '7.0', '7.0', '10.0', '-1.5',
+ '-0.5', '-0.5'],
+ ['3', '2050-01-05 09:44:00', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0.0', '2', '1',
+ '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '-54791.4055556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-54791.4055556', '1', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '0', '0', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None'],
+ ['3', '2050-01-07 12:44:00', '-2.125', '1', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0.0', '1', '1',
+ '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '-54793.5305556', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-54793.5305556', '1', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', '0', '0', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None'],
+ ['4', '2050-01-09 23:44:00', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0.0', '1', '1',
+ '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None'],
+ ['4', '2050-01-04 09:44:00', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '5.58333333333',
+ '1', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', 'None', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None', '0', '0', 'None', 'None', 'None', 'None', 'None', 'None', 'None', 'None',
+ 'None', 'None', 'None', 'None', 'None']
+ ]
+}
diff --git a/medinfo/dataconversion/test/Util.py b/medinfo/dataconversion/test/Util.py
index c97691a2..151ee8ab 100644
--- a/medinfo/dataconversion/test/Util.py
+++ b/medinfo/dataconversion/test/Util.py
@@ -1,7 +1,8 @@
-import Const
+from . import Const
import sys, os
import logging
-import cgi, UserDict
+import cgi
+from collections import UserDict
import unittest
sys.path.append('../../../..')
diff --git a/medinfo/dataconversion/test/test-matrix-no-header.tab b/medinfo/dataconversion/test/test-matrix-no-header.tab
new file mode 100644
index 00000000..46471fa1
--- /dev/null
+++ b/medinfo/dataconversion/test/test-matrix-no-header.tab
@@ -0,0 +1,6 @@
+patient_id index_time label f1 f2 f3 f4
+1 2018-01-01 12:00:00 True 1.0 1 False Foo
+2 2018-01-01 12:00:00 False 2.0 0 True Bar
+3 2018-01-01 12:00:00 True 3.0 1 False Baz
+4 2018-01-01 12:00:00 False 4.0 1 True Foo
+5 2018-01-01 12:00:00 True 5.0 0 False Bar
diff --git a/medinfo/dataconversion/test/test-matrix-with-header.tab b/medinfo/dataconversion/test/test-matrix-with-header.tab
new file mode 100644
index 00000000..9ac5f119
--- /dev/null
+++ b/medinfo/dataconversion/test/test-matrix-with-header.tab
@@ -0,0 +1,10 @@
+# test-matrix-with-header.tab
+#
+# This matrix file is for testing only.
+# Doesn't contain anything of value.
+patient_id index_time label f1 f2 f3 f4
+1 2018-01-01 12:00:00 True 1.0 1 False Foo
+2 2018-01-01 12:00:00 False 2.0 0 True Bar
+3 2018-01-01 12:00:00 True 3.0 1 False Baz
+4 2018-01-01 12:00:00 False 4.0 1 True Foo
+5 2018-01-01 12:00:00 True 5.0 0 False Bar
diff --git a/medinfo/dataconversion/trainers.py b/medinfo/dataconversion/trainers.py
new file mode 100644
index 00000000..905b1edb
--- /dev/null
+++ b/medinfo/dataconversion/trainers.py
@@ -0,0 +1,191 @@
+"""
+Definition of ModelTrainer, SequenceTrainer
+"""
+import os
+import json
+from typing_extensions import dataclass_transform
+import pandas as pd
+import pickle
+import numpy as np
+from sklearn.ensemble import RandomForestClassifier
+from sklearn.metrics import roc_auc_score
+from scipy.sparse import load_npz
+import torch
+from torch.optim import Adam
+from torch.utils.tensorboard import SummaryWriter
+from tqdm import tqdm
+
+from constants import DEFAULT_LAB_COMPONENT_IDS
+from constants import DEFAULT_FLOWSHEET_FEATURES
+
+class SequenceTrainer():
+ """
+ Used to train models that leverage SequenceFeaturizer. Example model
+ classes include GRUs, LSTMs, Transformers.
+ """
+
+ def __init__(self, outpath, model, criterion, optimizer,
+ train_dataloader, val_dataloader, test_dataloader, stopping_metric,
+ num_epochs=100, scheduler=None):
+ self.outpath = outpath
+ self.model = model
+ self.criterion = criterion
+ self.optimizer = optimizer
+ self.train_dataloader = train_dataloader
+ self.val_dataloader = val_dataloader
+ self.test_dataloader = test_dataloader
+ self.stopping_metric = stopping_metric
+ self.num_epochs = num_epochs
+ self.scheduler = scheduler
+ self.writer = SummaryWriter(self.outpath)
+
+ def __call__(self):
+ best_stopping_metric = 0
+ tolerance_counter = 0
+ for epoch in range(self.num_epochs):
+ train_metrics = self.train()
+ val_metrics = self.evaluate()
+ self.writer.add_scalar('Loss/train', train_metrics['loss'], epoch)
+ self.writer.add_scalar('Loss/val', val_metrics['loss'], epoch)
+ self.writer.add_scalar('AUC/train', train_metrics['auc'], epoch)
+ self.writer.add_scalar('AUC/val', val_metrics['auc'], epoch)
+
+ if tolerance_counter == self.stopping_tolerance:
+ break
+
+ if epoch == 0:
+ best_stopping_metric = val_metrics[self.stopping_metric]
+ torch.save(self.model.state_dict(),
+ os.path.join(self.working_directory, f'model_{epoch}.pt'))
+ elif val_metrics[self.stopping_metric] > best_stopping_metric:
+ best_stopping_metric = val_metrics[self.stopping_metric]
+ tolerance_counter = 0
+ torch.save(self.model.state_dict(),
+ os.path.join(self.working_directory, f'model_{epoch}.pt'))
+ else:
+ tolerance_counter += 1
+
+ def train(self):
+ self.model.train()
+ train_loss = 0
+ predictions, labels = [], []
+ for batch in tqdm(self.train_dataloader):
+ self.model.zero_grad()
+ output = self.model(batch['X'].to(self.device))
+ loss = self.criterion(output, batch['y'].to(self.device))
+ train_loss += loss.item()
+ loss.backward()
+ self.optimizer.step()
+ predictions.append(output.cpu().detach().numpy())
+ labels.append(batch['y'].cpu().detach().numpy())
+
+ train_loss /= len(self.train_dataloader)
+ predictions = np.asarray(predictions)
+ labels = np.asarray(labels)
+ auc = roc_auc_score(labels, predictions)
+
+ train_metrics = {
+ 'loss' : train_loss,
+ 'auc' : auc
+ }
+ return train_metrics
+
+ def evaluate(self, test=False):
+ self.model.eval()
+ total_loss = 0
+ if test:
+ dataloader = self.test_dataloader
+ else:
+ dataloader = self.val_dataloader
+ predictions, labels = [], []
+ for batch in tqdm(dataloader):
+ output = self.model(batch['X'].to(self.device))
+ loss = self.criterion(output, batch['y'].to(self.device))
+ total_loss += loss.item()
+ predictions.append(output.cpu().detach().numpy())
+ labels.append(batch['y'].cpu().detach().numpy())
+ total_loss /= len(dataloader)
+ predictions = np.asarray(predictions)
+ labels = np.asarray(labels)
+ auc = roc_auc_score(labels, predictions)
+ metrics = {
+ 'loss' : total_loss,
+ 'auc' : auc
+ }
+ return metrics
+
+class BaselineModelTrainer(object):
+ """
+ Implements the most basic ML pipeline imagineable. Trains a random forest
+ with default hyperparameters using features and labels saved in working
+ directory from a Featurizer in featurizers.py
+
+ Generates a deployment config file used in deploy.py that tells us which
+ EPIC/FHIR APIs to call, how to construct and order features, and saves
+ the model itself.
+ """
+
+ def __init__(self, working_dir):
+ self.working_dir = working_dir
+ self.task = None # useful in multilable scenario
+
+ def __call__(self, task):
+ """
+ Trains a model, saves predictions, saves a config file.
+ Args:
+ task : column for the binary label
+ """
+ self.task = task
+ self.clf = RandomForestClassifier()
+ X_train = load_npz(os.path.join(
+ self.working_dir, 'train_features.npz'))
+ X_test = load_npz(os.path.join(self.working_dir, 'test_features.npz'))
+ y_train = pd.read_csv(
+ os.path.join(self.working_dir, 'train_labels.csv'))
+ y_test = pd.read_csv(
+ os.path.join(self.working_dir, 'test_labels.csv'))
+
+ self.clf.fit(X_train, y_train[self.task])
+ predictions = self.clf.predict_proba(X_test)[:, 1]
+ auc = roc_auc_score(y_test[self.task], predictions)
+ print(f"AUC: {round(auc, 2)}")
+
+ df_yhats = pd.DataFrame(data={
+ 'labels': y_test[self.task].values,
+ 'predictions': predictions
+ })
+ yhats_path = f"{self.task}_yhats"
+ df_yhats.to_csv(os.path.join(self.working_dir, yhats_path), index=None)
+ self.generate_deploy_config()
+
+ def generate_deploy_config(self):
+ """
+ Generates the config file used by the deployment module. Contains
+ all information needed for deployment module to create feature vectors
+ compatible with the model using EPIC and FHIR APIs. This includes
+ 1. model: the model itself
+ 2. feature_order: order of features in feature vector
+ 3. bin_map: numerical features and min value for each bin
+ 4. feature_config: dictionary containing which features types used
+ in model and their corresponding look back windows.
+ """
+ deploy = {}
+ deploy['model'] = self.clf
+ feature_order = pd.read_csv(os.path.join(self.working_dir,
+ 'feature_order.csv'))
+ deploy['feature_order'] = [f for f in feature_order.features]
+ if os.path.exists(os.path.join(self.working_dir, 'bin_lup.csv')):
+ bin_map = pd.read_csv(os.path.join(self.working_dir, 'bin_lup.csv'),
+ na_filter=False)
+ else:
+ bin_map = None
+ deploy['bin_map'] = bin_map
+ with open(os.path.join(self.working_dir, 'feature_config.json'),
+ 'r') as f:
+ feature_config = json.load(f)
+ deploy['feature_config'] = feature_config
+ deploy['lab_base_names'] = DEFAULT_LAB_COMPONENT_IDS
+ deploy['vital_base_names'] = DEFAULT_FLOWSHEET_FEATURES
+ with open(os.path.join(self.working_dir, f'{self.task}_deploy.pkl'),
+ 'wb') as w:
+ pickle.dump(deploy, w)
diff --git a/medinfo/db/Const.py b/medinfo/db/Const.py
index 1d032e18..8ca41c21 100644
--- a/medinfo/db/Const.py
+++ b/medinfo/db/Const.py
@@ -2,7 +2,7 @@
import sys;
import logging
-import Env
+from . import Env
"""Delimiter of SQL commands in a DB script file"""
SQL_DELIM = ";"
diff --git a/medinfo/db/DBUtil.py b/medinfo/db/DBUtil.py
index 3a7f7833..17403283 100644
--- a/medinfo/db/DBUtil.py
+++ b/medinfo/db/DBUtil.py
@@ -12,12 +12,13 @@
If using different DB-API modules, this module should
be edited in the following places...
- module import statements
- - SQL_PLACEHOLDER (in Env.py file)
+ - Env.SQL_PLACEHOLDER (in Env.py file)
- connection method (including references to Env constants)
- identityQuery method
"""
import sys, os
+import subprocess
import time;
from datetime import datetime;
import json;
@@ -27,12 +28,12 @@
from medinfo.common.Const import EST_INPUT, COMMENT_TAG, TOKEN_END, NULL_STRING;
from medinfo.common.Util import stdOpen, isStdFile, fileLineCount, ProgressDots;
from medinfo.common.Util import parseDateValue, asciiSafeStr;
-from Model import SQLQuery, RowItemModel;
-from Model import modelListFromTable, modelDictFromList;
-from Const import DEFAULT_ID_COL_SUFFIX, SQL_DELIM;
-from Env import DB_PARAM; # Default connection parameters
-from ResultsFormatter import TextResultsFormatter, TabDictReader;
-from Util import log;
+from .Model import SQLQuery, RowItemModel;
+from .Model import modelListFromTable, modelDictFromList;
+from .Const import DEFAULT_ID_COL_SUFFIX, SQL_DELIM;
+from .Env import DB_PARAM; # Default connection parameters
+from .ResultsFormatter import TextResultsFormatter, TabDictReader;
+from .Util import log;
from medinfo.db import Util;
DOUBLE_TOKEN_END = TOKEN_END+TOKEN_END;
@@ -41,48 +42,8 @@
######### BEGIN Database Specific Stuff ###########
###################################################
-from Env import SQL_PLACEHOLDER, DATABASE_CONNECTOR_NAME;
-
-#import mx.ODBC.Windows # DB-API for ODBC databases like MS Access. See http://www.egenix.com/files/python/mxODBC.html for installation
-#from mx.ODBC.Windows import NUMBER, STRING, DATETIME, BIT as BOOLEAN; # Abstract DBAPITypes to check column type codes against
-
-# MySQL pure Python DB connector
-if DATABASE_CONNECTOR_NAME == "mysql.connector":
- import mysql.connector;
- DB_CONNECTOR_MODULE = mysql.connector;
- BOOLEAN = 1; # MySQLdb doesn't seem to have a built-in type code constant for BOOLEAN datatype
-
-# MySQL database connector
-if DATABASE_CONNECTOR_NAME == "MySQLdb":
- import MySQLdb;
- DB_CONNECTOR_MODULE = MySQLdb;
- BOOLEAN = 1; # MySQLdb doesn't seem to have a built-in type code constant for BOOLEAN datatype
-
-# PostgreSQL interface. See http://www.initd.org/tracker/psycopg
-if DATABASE_CONNECTOR_NAME == "psycopg2":
- import psycopg2;
- DB_CONNECTOR_MODULE = psycopg2;
- BOOLEAN = 16; # Psycopg2 doesn't seem to have a built-in type code constant for BOOLEAN datatype
-
-if DATABASE_CONNECTOR_NAME == "cx_Oracle":
- import cx_Oracle;
- DB_CONNECTOR_MODULE = cx_Oracle;
- BOOLEAN = 1;
-
-if DATABASE_CONNECTOR_NAME == "sqlite3":
- import sqlite3;
- DB_CONNECTOR_MODULE = sqlite3;
-
-# Abstract DBAPITypes to check column type codes against
-NUMBER = None;
-STRING = None;
-DATETIME = None;
-
-if DATABASE_CONNECTOR_NAME != "sqlite3":
- # SQLite doesn't have these respective data type entries
- NUMBER = DB_CONNECTOR_MODULE.NUMBER;
- STRING = DB_CONNECTOR_MODULE.STRING;
- DATETIME = DB_CONNECTOR_MODULE.DATETIME;
+from . import Env;
+SQL_PLACEHOLDER = Env.SQL_PLACEHOLDER;
def connection( connParams=None ):
"""Return a connection to the application database.
@@ -90,11 +51,11 @@ def connection( connParams=None ):
database is being interfaced to.
"""
Util.numConnections += 1;
-
+
if connParams is None:
connParams = DB_PARAM;
- if not connParams.has_key("PWD"):
+ if "PWD" not in connParams:
connParams["PWD"] = getpass("Enter password for %s on %s@%s: " % (connParams["UID"], connParams["DSN"], connParams["HOST"]) );
if connParams["PWD"] == "":
connParams["PWD"] = None; # Special meaning, no password needed
@@ -103,16 +64,19 @@ def connection( connParams=None ):
log.info("Preparing DB Connection to %(DSN)s@%(HOST)s as %(UID)s" % connParams );
# MySQLdb
- if DATABASE_CONNECTOR_NAME == "mysql.connector":
+ if Env.DATABASE_CONNECTOR_NAME == "mysql.connector":
+ import mysql.connector;
conn = mysql.connector.Connect(user=connParams["UID"], password=connParams["PWD"], host=connParams["HOST"], database=connParams["DSN"], buffered=True);
return conn;
- if DATABASE_CONNECTOR_NAME == "MySQLdb":
+ if Env.DATABASE_CONNECTOR_NAME == "MySQLdb":
+ import MySQLdb;
conn = MySQLdb.connect( host=connParams["HOST"], user=connParams["UID"], passwd=connParams["PWD"], db=connParams["DSN"]);
return conn;
# PostgreSQL: psycopg2 has slightly different syntax.., need to know if no pass needed..?
- if DATABASE_CONNECTOR_NAME == "psycopg2":
+ if Env.DATABASE_CONNECTOR_NAME == "psycopg2":
+ import psycopg2;
if (connParams["PWD"] is None):
if "PORT" in connParams and connParams["PORT"] is not None:
return psycopg2.connect(host=connParams["HOST"], port=connParams["PORT"], database=connParams["DSN"], user=connParams["UID"]);
@@ -124,30 +88,23 @@ def connection( connParams=None ):
else:
return psycopg2.connect(host=connParams["HOST"], database=connParams["DSN"], user=connParams["UID"], password=connParams["PWD"]);
- if DATABASE_CONNECTOR_NAME == "cx_Oracle":
+ if Env.DATABASE_CONNECTOR_NAME == "cx_Oracle":
+ import cx_Oracle;
connStr = "%(UID)s/%(PWD)s@%(HOST)s/%(DSN)s" % connParams;
if "PORT" in connParams:
connStr = "%(UID)s/%(PWD)s@%(HOST)s:%(PORT)s/%(DSN)s" % connParams;
return cx_Oracle.connect(connStr);
- if DATABASE_CONNECTOR_NAME == "sqlite3":
- return sqlite3.connect(connParams["DSN"]);
+ if Env.DATABASE_CONNECTOR_NAME == "sqlite3":
+ import sqlite3;
+ return sqlite3.connect(os.path.join(connParams["DATAPATH"], connParams["DSN"]));
+ if Env.DATABASE_CONNECTOR_NAME == "bigquery":
+ import google.cloud.bigquery.dbapi;
+ return google.cloud.bigquery.dbapi.connect(); # Depends on environment variables to identify right connection
- # ODBC (Access)
- #connStr = formatDBConnectString( connParams );
- #return mx.ODBC.Windows.DriverConnect( connStr );
-
- # PgSQL
- #if "PORT" in connParams and connParams["PORT"] is not None:
- # return PgSQL.connect( host=connParams["HOST"], port=connParams["PORT"], database=connParams["DSN"], user=connParams["UID"], password=connParams["PWD"])
- #else:
- # return PgSQL.connect( host=connParams["HOST"], database=connParams["DSN"], user=connParams["UID"], password=connParams["PWD"])
- #print( connParams);
-
-
def identityQuery( tableName , pgSeqName=None):
"""Given a table name, return the SQL query that will return the
last auto-generated primary key value (i.e. sequences) from that table.
@@ -156,10 +113,10 @@ def identityQuery( tableName , pgSeqName=None):
Added pgSeqName b/c with long table names the sequence name gets truncated.
Want to make sure can send in the correct sequence to grab.
"""
- if DATABASE_CONNECTOR_NAME in ("mysql.connector", "MySQLdb"):
+ if Env.DATABASE_CONNECTOR_NAME in ("mysql.connector", "MySQLdb"):
return "select last_insert_id()";
- if DATABASE_CONNECTOR_NAME == "psycopg2":
+ if Env.DATABASE_CONNECTOR_NAME == "psycopg2":
if pgSeqName is None:
# currently, NAMEDATALEN is set to 64, so the largest name can be 63 characters
# the name for a sequence gets cropped before the _seq portion
@@ -178,6 +135,50 @@ def sequenceName( tableName ):
pgSeqName = tableName[:29] + "_" + idCol[:29] + "_seq"
return pgSeqName; #PostgreSQL auto generated object name for sequence
+def createDatabase( dbParams ):
+ """Create a database based on the DSN name specified in the dbParams.
+ Will likely require logging in first as the user-password specified in the dbParams.
+ """
+ if Env.DATABASE_CONNECTOR_NAME == "psycopg2":
+ # For PostgreSQL, have to connect to some database first before can create a new one. Connect to default "postgres" database to start.
+ defaultParams = dict(dbParams);
+ defaultParams["DSN"] = "postgres";
+ defaultConn = connection(defaultParams);
+ defaultConn.autocommit = True; # Create/Drop Database not allowed in transaction blocks
+ try:
+ execute("CREATE DATABASE %s" % dbParams["DSN"], conn=defaultConn);
+ finally:
+ defaultConn.close();
+ elif Env.DATABASE_CONNECTOR_NAME == "sqlite3":
+ defaultParams = dict(dbParams);
+ # Sqlite3 automatically creates a database upon connection
+ defaultConn = connection(defaultParams);
+ # None for autocommit mode
+ defaultConn.isolation_level = None
+ defaultConn.close()
+
+def dropDatabase( dbParams ):
+ """Drop the database specified by the DSN name specified in the dbParams.
+ Will likely require logging in first as the user-password specified.
+ """
+ if Env.DATABASE_CONNECTOR_NAME == "psycopg2":
+ # For PostgreSQL, cannot drop database while connected to it, so connect to default "postgres" database to start.
+ defaultParams = dict(dbParams);
+ defaultParams["DSN"] = "postgres";
+ defaultConn = connection(defaultParams);
+ defaultConn.autocommit = True; # Create/Drop Database not allowed in transaction blocks
+ try:
+ execute("DROP DATABASE %s" % dbParams["DSN"], conn=defaultConn);
+ finally:
+ defaultConn.close();
+ elif Env.DATABASE_CONNECTOR_NAME == "sqlite3":
+ defaultParams = dict(dbParams);
+ # Sqlite3 automatically creates a database upon connection
+ try:
+ os.remove(os.path.join(defaultParams['DATAPATH'], defaultParams["DSN"]))
+ except:
+ pass
+
###################################################
######### END Database Specific Stuff ###########
###################################################
@@ -233,25 +234,27 @@ def execute( query, parameters=None, includeColumnNames=False, incTypeCodes=Fals
is NOT supplied.
"""
# Look for an explicitly specified external connection
- extConn = ( conn is not None );
+ extConn = conn is not None
if conn is None:
# If no specific connection object provided, look for a connection factory
# to produce one
if connFactory is not None:
- conn = connFactory.connection();
+ conn = connFactory.connection()
else:
# No connection or factory specified, just fall back on default connection then
- conn = connection();
-
- if parameters is None:
- parameters = ();
+ conn = connection()
- cur = conn.cursor()
-
- if isinstance(query,SQLQuery):
- parameters = tuple(query.getParams());
- query = str(query);
+ cur = conn.cursor()
+ if isinstance(query, SQLQuery):
+ if parameters is None:
+ parameters = tuple(query.getParams())
+ else:
+ parameters = tuple(parameters)
+ query = str(query)
+ elif parameters is None:
+ parameters = ()
+
#log.debug(parameterizeQueryString(query,parameters));
returnValue = None
@@ -259,7 +262,7 @@ def execute( query, parameters=None, includeColumnNames=False, incTypeCodes=Fals
timer = time.time();
try:
cur.execute( query, parameters )
- except Exception, err:
+ except Exception as err:
log.error(err);
#log.error(parameterizeQueryString(query,parameters));
if (not extConn) or autoCommit:
@@ -365,7 +368,7 @@ def runDBScript( scriptFile, skipErrors = False ):
# any previous commands as well
if skipErrors:
conn.commit()
- except Exception, err:
+ except Exception as err:
conn.rollback(); # Reset changes and connection state
log.warning("Error Executing in Script: "+ sql )
log.warning(err)
@@ -424,7 +427,7 @@ def insertFile( sourceFile, tableName, columnNames=None, delim=None, idFile=None
if dateColFormats is not None:
# Ensure column keys are normalized
- dateCols = dateColFormats.keys();
+ dateCols = list(dateColFormats.keys());
for dateCol in dateCols:
normalCol = normalizeColName(dateCol);
dateColFormats[normalCol] = dateColFormats[dateCol];
@@ -449,7 +452,7 @@ def insertFile( sourceFile, tableName, columnNames=None, delim=None, idFile=None
sqlParts.append("values")
sqlParts.append("(")
for i in range(len(columnNames)):
- sqlParts.append( SQL_PLACEHOLDER ) # Parameter placeholder, depends on DB-API
+ sqlParts.append( Env.SQL_PLACEHOLDER ) # Parameter placeholder, depends on DB-API
sqlParts.append(",")
sqlParts.pop(); # Remove extra end comma
sqlParts.append(")")
@@ -482,7 +485,7 @@ def insertFile( sourceFile, tableName, columnNames=None, delim=None, idFile=None
else:
cur.execute(identityQuery(tableName));
rowId = cur.fetchone()[0];
- print >> idFile, rowId;
+ print(rowId, file=idFile);
# Need to "auto-commit" after each command,
# otherwise a skipped error will rollback
@@ -492,7 +495,7 @@ def insertFile( sourceFile, tableName, columnNames=None, delim=None, idFile=None
progress.Update()
- except Exception, err:
+ except Exception as err:
log.info(sql);
log.info(tuple(params))
conn.rollback(); # Reset any changes since the last commit
@@ -555,19 +558,19 @@ def updateFromFile( sourceFile, tableName, columnNames=None, nIdCols=1, delim=No
sql.append("set");
# Data Columns
- for i in xrange(nIdCols,nCols):
+ for i in range(nIdCols,nCols):
sql.append(columnNames[i]);
sql.append("=");
- sql.append(SQL_PLACEHOLDER);
+ sql.append(Env.SQL_PLACEHOLDER);
sql.append(",");
sql.pop(); # Remove extra comma at end
# ID Columns
sql.append("where")
- for i in xrange(nIdCols):
+ for i in range(nIdCols):
sql.append(columnNames[i]);
sql.append("=");
- sql.append(SQL_PLACEHOLDER);
+ sql.append(Env.SQL_PLACEHOLDER);
sql.append("and");
sql.pop(); # Remove extra comma at end
@@ -584,7 +587,7 @@ def updateFromFile( sourceFile, tableName, columnNames=None, nIdCols=1, delim=No
params = line.split(delim);
# Special handling for null / None string
- for iParam in xrange(len(params)):
+ for iParam in range(len(params)):
if params[iParam] == "" or params[iParam] == NULL_STRING: # Treat blank strings as NULL
params[iParam] = None;
@@ -605,7 +608,7 @@ def updateFromFile( sourceFile, tableName, columnNames=None, nIdCols=1, delim=No
progress.Update()
- except Exception, err:
+ except Exception as err:
conn.rollback(); # Reset changes and connection state
log.critical(sql);
log.critical(paramTuple);
@@ -624,6 +627,19 @@ def updateFromFile( sourceFile, tableName, columnNames=None, nIdCols=1, delim=No
return 0
+
+def dumpTableToCsv(table_name, file_name, conn_params=None):
+ if conn_params is None:
+ conn_params = DB_PARAM
+
+ psql_env = os.environ.copy()
+ psql_env["PGPASSWORD"] = conn_params["PWD"]
+ process = subprocess.Popen(['psql', '-U', conn_params["UID"], '-d', conn_params["DSN"],
+ '-c', '\\COPY {} TO \'{}\' DELIMITER \',\' CSV HEADER;'.format(table_name, file_name)],
+ env=psql_env)
+ process.wait()
+
+
def findOrInsertItem(tableName, searchDict, insertDict=None, retrieveCol=None, forceUpdate=False, autoCommit=True, conn=None, connFactory=None):
"""Search the named table in database for a row whose attributes match the key-value pairs specified in searchDict.
@@ -665,7 +681,7 @@ def findOrInsertItem(tableName, searchDict, insertDict=None, retrieveCol=None, f
searchQuery.addSelect(retrieveCol);
searchQuery.addFrom(tableName)
- for i, (col, value) in enumerate(searchDict.iteritems()):
+ for i, (col, value) in enumerate(searchDict.items()):
if value is not None:
searchQuery.addWhereEqual(col, value);
else:
@@ -689,7 +705,7 @@ def findOrInsertItem(tableName, searchDict, insertDict=None, retrieveCol=None, f
if ( rowExisted ):
if forceUpdate:
# Item already exists, but want to force an update with the insertDict contents
- updateRow( tableName, insertDict, searchDict.values(), searchDict.keys(), conn=conn );
+ updateRow( tableName, insertDict, list(searchDict.values()), list(searchDict.keys()), conn=conn );
cur.execute( searchQuery, searchParams );
result = cur.fetchone()
return (result[0], not rowExisted)
@@ -727,8 +743,8 @@ def insertRow(tableName, insertDict, conn=None, cursor=None):
if cursor is None:
cursor = conn.cursor();
try:
- insertQuery = buildInsertQuery( tableName, insertDict.keys() );
- insertParams= insertDict.values();
+ insertQuery = buildInsertQuery( tableName, list(insertDict.keys()) );
+ insertParams= list(insertDict.values());
# Convert component list into string
log.debug( parameterizeQueryString( insertQuery, insertParams ) );
@@ -757,9 +773,9 @@ def updateRow(tableName, rowDict, idValue, idCol=None, conn=None):
if not isinstance( idValue, list ): idValue = [idValue]; # Convert to list of size 1
if not isinstance( idCol, list ): idCol = [idCol];
- query = buildUpdateQuery(tableName, rowDict.keys(), idCol, idValue );
+ query = buildUpdateQuery(tableName, list(rowDict.keys()), idCol, idValue );
params = [];
- params.extend( rowDict.values() );
+ params.extend( list(rowDict.values()) );
params.extend( idValue );
try:
@@ -791,7 +807,7 @@ def deleteRows(tableName, idValues, idCol=None, conn=None):
cursor = conn.cursor()
params = idValues;
- paramPlaceholders = str.join(",", [SQL_PLACEHOLDER]*len(params) );
+ paramPlaceholders = str.join(",", [Env.SQL_PLACEHOLDER]*len(params) );
query = """delete from %s where %s in (%s)""" % (tableName, idCol, paramPlaceholders);
@@ -819,8 +835,9 @@ def parseValue(chunk,colName,dateColFormats=None,escapeStrings=False):
returnValue = parseDateValue(chunk,dateFormat);
elif chunk is not None and escapeStrings:
# Generic string value, but run through escape encoder so weird non-ascii characters don't make DB process crash
- returnValue = chunk.encode('string_escape');
- #returnValue = asciiSafeStr(chunk); # Clean up any weird unicode characters
+ returnValue = chunk.encode('unicode_escape').decode('utf-8')
+ # returnValue = chunk.encode('string_escape'); # doesn't work in Python3
+ # returnValue = asciiSafeStr(chunk); # Clean up any weird unicode characters
return returnValue;
@@ -898,7 +915,7 @@ def buildUpdateQuery(tableName, colNames, idColName=None, idValue=None):
for col in colNames:
sql.append(col);
sql.append("=");
- sql.append(SQL_PLACEHOLDER);
+ sql.append(Env.SQL_PLACEHOLDER);
sql.append(",");
sql.pop(); # Remove extra comma at end
@@ -911,7 +928,7 @@ def buildUpdateQuery(tableName, colNames, idColName=None, idValue=None):
else:
# Equals operator doesn't work for null values
sql.append("is");
- sql.append(SQL_PLACEHOLDER);
+ sql.append(Env.SQL_PLACEHOLDER);
sql.append("and");
sql.pop(); # Remove extra "and" at end
@@ -933,7 +950,7 @@ def buildInsertQuery(tableName, colNames):
# Value placeholders
query.append("values (");
for col in colNames:
- query.append("%s" % SQL_PLACEHOLDER);
+ query.append("%s" % Env.SQL_PLACEHOLDER);
query.append(",");
query[-1] = ")";
@@ -943,7 +960,7 @@ def buildInsertQuery(tableName, colNames):
def parameterizeQueryString( query, params=None ):
"""Given a SQL query string and tuple of parameters,
- replace all of the SQL_PLACEHOLDER strings in the query
+ replace all of the Env.SQL_PLACEHOLDER strings in the query
with the respective representation of the parameters.
For the most part, this will just be the string representation
of the parameter except in the case of str objects which
@@ -962,8 +979,8 @@ def parameterizeQueryString( query, params=None ):
params = query.getParams();
query = str(query);
- # Make sure all of the SQL_PLACEHOLDERS are Python string replacement vars
- query = query.replace(SQL_PLACEHOLDER,"%s");
+ # Make sure all of the Env.SQL_PLACEHOLDERS are Python string replacement vars
+ query = query.replace(Env.SQL_PLACEHOLDER,"%s");
# Modify parameter list if any text-based variables to replace
if params:
@@ -990,7 +1007,7 @@ def loadRecordModelById( tableName, idValue, idCol=None, conn=None, connFactory=
"""
if idCol is None:
idCol = defaultIDColumn(tableName);
- query = "select * from %s where %s = %s" % (tableName, idCol, SQL_PLACEHOLDER);
+ query = "select * from %s where %s = %s" % (tableName, idCol, Env.SQL_PLACEHOLDER);
params = (idValue,);
dataTable = execute( query, params, includeColumnNames=True, conn=conn, connFactory=connFactory);
dataModels = modelListFromTable(dataTable);
@@ -1063,7 +1080,7 @@ def main(argv):
if options.incCommand:
summaryData = {"argv": argv};
- print >> outFile, COMMENT_TAG, json.dumps(summaryData);
+ print(COMMENT_TAG, json.dumps(summaryData), file=outFile);
textFormatter = TextResultsFormatter(outFile, options.delim)
diff --git a/medinfo/db/Env.py b/medinfo/db/Env.py
index 05a304a1..222c5efc 100644
--- a/medinfo/db/Env.py
+++ b/medinfo/db/Env.py
@@ -5,6 +5,7 @@
import sys, os;
import logging
+import LocalEnv;
"""Default level for application logging. Modify these for different scenarios.
See Python logging package documentation for more information"""
@@ -19,8 +20,9 @@
Read the DB-API 2.0 specs for more info. (http://www.python.org/peps/pep-0249.html)
Oracle expects sequential or named items like &1, &2, or :1, :2...
"""
-#SQL_PLACEHOLDER = "?" # "qmark"
-SQL_PLACEHOLDER = "%s" # "format" and "pyFormat"
+# #SQL_PLACEHOLDER = "?" # "qmark"
+# SQL_PLACEHOLDER = "%s" # "format" and "pyFormat"
+SQL_PLACEHOLDER = LocalEnv.SQL_PLACEHOLDER
"""Strings to use for boolean parameters."""
BOOLEAN_STR = dict();
@@ -31,29 +33,21 @@
#BOOLEAN_STR[True] = str(-1);
#BOOLEAN_STR[False]= str(0);
-"""Designate the DB being used, which will afect some DB specific setup steps"""
-#DATABASE_CONNECTOR_NAME = "mysql.connector";
-#DATABASE_CONNECTOR_NAME = "MySQLdb";
-DATABASE_CONNECTOR_NAME = "psycopg2";
-#DATABASE_CONNECTOR_NAME = "cx_Oracle";
-#DATABASE_CONNECTOR_NAME = "sqlite3";
-
+# """Designate the DB being used, which will afect some DB specific setup steps"""
+# #DATABASE_CONNECTOR_NAME = "mysql.connector";
+# #DATABASE_CONNECTOR_NAME = "MySQLdb";
+# DATABASE_CONNECTOR_NAME = "psycopg2";
+# #DATABASE_CONNECTOR_NAME = "cx_Oracle";
+# #DATABASE_CONNECTOR_NAME = "sqlite3";
+DATABASE_CONNECTOR_NAME = LocalEnv.DATABASE_CONNECTOR_NAME
"""Parameters needed to open a connection to the database.
Dependent upon particular connection interface and database implementation
+
+Note that Env.py reads database, user, and password specifications from LocalEnv.py
"""
DB_PARAM = {}
-#DB_PARAM["HOST"] = "medinfo-5year-time-assoc2010-2013.cxkturzva06i.us-east-1.rds.amazonaws.com"
-#DB_PARAM["HOST"] = "inpatient5year.cxkturzva06i.us-east-1.rds.amazonaws.com"
-DB_PARAM["HOST"] = "localhost"
-#DB_PARAM["DSN"] = "medicare"
-DB_PARAM["DSN"] = "stride"
-#DB_PARAM["DSN"] = "resident-access-log-2017"
-#DB_PARAM["DSN"] = "/Users/angelicaperez/Documents/JonChen/sqlite_db/dave_chan2.sqlite"
-#DB_PARAM["DSN"] = "medinfo5yr"
-DB_PARAM["UID"] = "jwang198"
-DB_PARAM["PWD"] = ""
-
+DB_PARAM = LocalEnv.LOCAL_PROD_DB_PARAM
# Opioid Notes DB
#DB_PARAM["HOST"] = "cci-db-p03";
@@ -66,21 +60,19 @@
Dependent upon particular connection interface and database implementation
"""
TEST_DB_PARAM = {}
-#TEST_DB_PARAM["HOST"] = "inpatient5year.cxkturzva06i.us-east-1.rds.amazonaws.com"
-TEST_DB_PARAM["HOST"] = "localhost"
-TEST_DB_PARAM["DSN"] = "testdb"
-TEST_DB_PARAM["UID"] = "sbala"
-TEST_DB_PARAM["PWD"] = "1234"
+TEST_DB_PARAM = LocalEnv.LOCAL_TEST_DB_PARAM
#TEST_DB_PARAM["DSN"] = "c:\Box Sync\NoSync\VAAlerts\dave_chan2.sqlite";
#TEST_DB_PARAM["DSN"] = "/Users/angelicaperez/Documents/JonChen/sqlite_db/dave_chan2.sqlite"
-"""Parameters on whether to do additional pre-processing when parsing text / CSV files"""
-CSV_EXPAND_QUOTES = False;
+"""Parameters on whether to do additional pre-processing when parsing text / CSV files.
+Seems necessary for STRIDE 2008-2014-2017 Order Proc dumps?
+"""
+CSV_EXPAND_QUOTES = True;
def formatDBConnectString( dbParamDict ):
connStr = ""
- for key, value in dbParamDict.iteritems():
+ for key, value in dbParamDict.items():
connStr += "%s=%s;" % (key,value);
return connStr;
diff --git a/medinfo/db/Model.py b/medinfo/db/Model.py
index e389a7da..566fc481 100644
--- a/medinfo/db/Model.py
+++ b/medinfo/db/Model.py
@@ -1,6 +1,6 @@
"""Common objects / base classes used to support DB interactions.
"""
-from Env import SQL_PLACEHOLDER;
+from .Env import SQL_PLACEHOLDER;
class RowItemModel(dict):
"""Generic object class to model rows from database tables.
@@ -36,21 +36,22 @@ def __init__(self,initData=None,dataKeys=None):
dict.__init__(self);
self.update(initData,dataKeys)
- def update(self,initData=None,dataKeys=None):
+ def update(self, initData=None, dataKeys=None):
"""Same like the constructor but can do at any time to update (overwrite)
or extend the data already in the model.
"""
- if initData != None:
- if dataKeys != None:
+ if initData is not None:
+ if dataKeys is not None:
# Have both initData and dataKeys. Expect these to be lists of data and names / keys
- for key, value in zip(dataKeys,initData):
+ for key, value in zip(dataKeys, initData):
self[key] = value
else:
# Only have initData, expect this to be a dictionary. Copy over contents
- for key, value in initData.iteritems():
+ for key, value in initData.items():
self[key] = value
+ return self
- def valuesByName(self,columnNames):
+ def valuesByName(self, columnNames):
"""Return the values in the dictionary as a list. Unlike the basic
dict.values() method, can provide a list of columnNames to only return
the values keyed by the names provided in that list, and in that order.
@@ -96,7 +97,7 @@ def modelDictFromList(modelList,columnName,listValues=False):
for model in modelList:
key = model[columnName];
if listValues:
- if not modelDict.has_key(key):
+ if key not in modelDict:
modelDict[key] = []; # Create a new list
modelDict[key].append(model);
else:
@@ -163,7 +164,7 @@ def __call__(self, item1, item2):
for fieldName in self.fieldNames:
values2.append(item2[fieldName]);
- result = cmp(values1, values2);
+ result = (values1 > values2) - (values1 < values2)
if self.desc:
result *= -1;
return result;
diff --git a/medinfo/db/ResultsFormatter.py b/medinfo/db/ResultsFormatter.py
index 284a3ecd..31047be4 100644
--- a/medinfo/db/ResultsFormatter.py
+++ b/medinfo/db/ResultsFormatter.py
@@ -3,12 +3,12 @@
of results arrays (usually from database calls).
"""
import sys;
-import urllib;
+import urllib.request, urllib.parse, urllib.error;
import csv; # Does a lot of text table parsing and formatting already
import re;
-from Model import RowItemModel;
+from .Model import RowItemModel;
from medinfo.common.Const import COMMENT_TAG, NULL_STRING;
-from Env import CSV_EXPAND_QUOTES;
+from .Env import CSV_EXPAND_QUOTES;
class ResultsFormatter:
"""Abstract class defining what methods a formatter class should implement
@@ -60,7 +60,7 @@ def formatResultDicts(self, resultDicts, columnNames=None, addHeaderRow=False):
for self.currRow, rowDict in enumerate(resultDicts):
if columnNames == None:
# If column set and order is not specified, just print all columns alphabetically
- columnNames = rowDict.keys()
+ columnNames = list(rowDict.keys())
columnNames.sort()
if addHeaderRow:
@@ -93,6 +93,10 @@ class TextResultsFormatter(ResultsFormatter):
Defaults to tab-delimited, but can customize.
Option to escape / URL quote content text to avoid
special characters (tabs, new lines, etc.) compromising formatting.
+
+ This is mostly redundant with built-in package:
+ csv.DictWriter( dialect=csv.excel_tab )
+
"""
mDelim = None;
quoteContents = None;
@@ -122,11 +126,11 @@ def formatTuple( self, tuple, lastTuple=None ):
if not continueGrouping:
itemText = str(item);
if self.quoteContents:
- itemText = urllib.quote(itemText); # URL quoting to avoid unsafe characters for formatting like tabs or newlines
+ itemText = urllib.parse.quote(itemText); # URL quoting to avoid unsafe characters for formatting like tabs or newlines
self.outFile.write(itemText);
if i < (tupleLength-1): # Only add delimiters up to the last item
self.outFile.write(self.mDelim);
- print >> self.outFile # New line
+ print(file=self.outFile) # New line
class HtmlResultsFormatter(ResultsFormatter):
"""Formatter for displaying database output in a web table.
@@ -173,21 +177,21 @@ def formatTuple( self, tuple, lastTuple=None ):
lineClass = "softLine";
if isinstance(self.lineSeparators, str):
lineClass = self.lineSeparators;
- print >> self.outFile, ' |
' % lineClass;
- print >> self.outFile, "" % (valign, align);
+ print('
|
' % lineClass, file=self.outFile);
+ print("" % (valign, align), file=self.outFile);
for i, item in enumerate(tuple):
if self.headerRow:
self.outFile.write(" <%s>" % self.headerRowFormat)
self.outFile.write(str(item))
self.outFile.write("")
- print >> self.outFile
+ print(file=self.outFile)
else:
if self.groupColumns and lastTuple is not None and continueGrouping:
if item != lastTuple[i]:
# Non-match. Don't try to group anymore
continueGrouping = False;
else:
- print >> self.outFile, " | ";
+ print(" | ", file=self.outFile);
if not continueGrouping:
#rowspan = self.__determineRowspan(i);
if i == 0:
@@ -197,8 +201,8 @@ def formatTuple( self, tuple, lastTuple=None ):
if item is not None or self.printNone:
self.outFile.write(str(item))
self.outFile.write("")
- print >> self.outFile
- print >> self.outFile, "
"
+ print(file=self.outFile)
+ print("", file=self.outFile)
self.headerRow = False # Only the first tuple should be the "header"
@@ -210,6 +214,7 @@ class TabDictReader(csv.DictReader):
strip any flanking whitespace.
"""
def __init__(self, f, fieldnames=None, restkey=None, restval=None, dialect=None, delimiter=None, *args, **kwds):
+ self.infile = f;
self.commentLines = list(); # Track comment lines
self.firstLine = None; # Track the first non-comment line
@@ -220,6 +225,9 @@ def __init__(self, f, fieldnames=None, restkey=None, restval=None, dialect=None,
lineGenerator = self.lineGenerator(f, delimiter);
csv.DictReader.__init__(self, lineGenerator, fieldnames=fieldnames, restkey=restkey, restval=restval, dialect=dialect, delimiter=delimiter, *args, **kwds);
+ def close(self):
+ self.infile.close();
+
def lineGenerator(self, f, delimiter):
# Generator expression to drop lines that start with comment tag
# http://stackoverflow.com/questions/14158868/python-skip-comment-lines-marked-with-in-csv-dictreader
@@ -243,6 +251,9 @@ def lineGenerator(self, f, delimiter):
def pandas_read_table(infile, *args, **kwds):
"""Simple wrapper function for default arguments to read a pandas dataframe
from a tab-delimited file and ignoring comment lines.
+
+ Beware that using something like a '#' comment tag means that data elements that include '#' in the string
+ will result in the remainder of the row's contents being ignored as a comment
"""
import pandas as pd; # Only import as needed
return pd.read_table(infile, comment=COMMENT_TAG, na_values=[NULL_STRING], *args, **kwds);
@@ -290,7 +301,7 @@ def sanitizeNames(names):
newNameSet.add(newName);
return newNames;
-def pandas_to_sqlconn(df, tableName="data", conn=None):
+def pandas_to_sqlconn(df, tableName="data", conn=None, *args, **kwds):
"""Turning pandas dataframe into SQL queryable in memory object
Column names will be cleaned up as per sanitizeNames.
https://plot.ly/python/big-data-analytics-with-pandas-and-sqlite/
@@ -307,12 +318,12 @@ def pandas_to_sqlconn(df, tableName="data", conn=None):
df.to_sql(tableName, conn, if_exists='replace');
return conn;
-def df2sql(df, tableName="data", conn=None):
+def df2sql(df, tableName="data", conn=None, *args, **kwds):
"""Synonym function that may be more intuitive"""
- return pandas_to_sqlconn(df, tableName, conn);
+ return pandas_to_sqlconn(df, tableName, conn, *args, **kwds);
-def pandas_read_sql_query(query, conn):
+def pandas_read_sql_query(query, conn, *args, **kwds):
"""To query dataframes back out,
just enter a SQL query, using "data" as the source table name
(unless a different one was specified in the dataframe_to_sqlconn) process.
@@ -323,9 +334,9 @@ def pandas_read_sql_query(query, conn):
limit 10
"""
import pandas as pd; # Only Import as needed
- return pd.read_sql_query(query, conn);
+ return pd.read_sql_query(query, conn, *args, **kwds);
-def sql2df(query, conn):
+def sql2df(query, conn, *args, **kwds):
"""Synonym function that may be more intuitive"""
- return pandas_read_sql_query(query, conn);
+ return pandas_read_sql_query(query, conn, *args, **kwds);
diff --git a/medinfo/db/Util.py b/medinfo/db/Util.py
index 6490631f..8453d98f 100644
--- a/medinfo/db/Util.py
+++ b/medinfo/db/Util.py
@@ -1,10 +1,10 @@
#!/usr/bin/env python
"""Miscellaneous utility functions used across the application
"""
-import Const, Env
+from . import Const, Env
import sys, os
import logging
-import urllib;
+import urllib.request, urllib.parse, urllib.error;
import time;
import math;
@@ -14,7 +14,7 @@
formatter = logging.Formatter(Const.LOGGER_FORMAT)
handler.setFormatter(formatter)
-log.addHandler(handler)
+# log.addHandler(handler)
# Global Support variable to monitor how may connections have been created
numConnections = 0;
diff --git a/medinfo/db/bigquery/__init__.py b/medinfo/db/bigquery/__init__.py
new file mode 100644
index 00000000..4e16c564
--- /dev/null
+++ b/medinfo/db/bigquery/__init__.py
@@ -0,0 +1 @@
+# Nothing much for now, just enable importing of various modules as a common package
diff --git a/medinfo/db/bigquery/bigQueryUtil.py b/medinfo/db/bigquery/bigQueryUtil.py
new file mode 100644
index 00000000..fe70803d
--- /dev/null
+++ b/medinfo/db/bigquery/bigQueryUtil.py
@@ -0,0 +1,309 @@
+'''
+create a BigQuery connection object
+Setup credentials in environment variable GOOGLE_APPLICATION_CREDENTIALS (See LocalEnv)
+
+client object methods
+ connect to BQ using json token
+ create new dataset
+ create new table
+ create new table by uploading CSV
+ create schema/table-type from postgres /d output
+ get row count of table
+ get query result
+'''
+
+from google.cloud import bigquery
+from google.cloud.exceptions import NotFound
+from google.cloud.bigquery import dbapi
+
+from medinfo.dataconversion.Util import log
+
+import re
+import time
+import os
+import csv
+
+def connection( client=None ):
+ '''
+ use this to create a BQ connection object
+ to use functions from DBUtil
+
+ in BQ, close() and commit() are no-op
+
+ client does not need to be specified
+ '''
+ conn = dbapi.connect(client)
+ return conn
+
+def headerChecker(csv_path, header_list):
+ with open(csv_path) as f:
+ reader = csv.reader(f)
+ csv_header = next(reader)
+
+ if csv_header != header_list:
+ raise NonMatchingHeadersException('headers from %r do not match' % csv_path)
+
+class NonMatchingHeadersException(Exception):
+ pass
+
+class BigQueryClient:
+ '''
+ methods to perform using client object
+ '''
+
+ def __init__(self):
+ self.client = bigquery.Client()
+ assert self.client is not None, 'Did not connect to BQ, check credentials env(GOOGLE_APPLICATION_CREDENTIALS)'
+
+ def reconnect_client(self):
+ self.client = bigquery.Client()
+
+ def create_new_dataset(self, dataset_id):
+ '''
+ https://cloud.google.com/bigquery/docs/datasets#create-dataset
+
+ :param dataset_id: dataset name
+ :return: None
+ '''
+
+ dataset_ref = self.client.dataset(dataset_id)
+
+ try:
+ # Check if the dataset with specified ID already exists
+ self.client.get_dataset(dataset_ref)
+ log.info('Dataset {} already exists! Skipping create operation.'.format(dataset_id))
+ #print(f'Dataset {dataset_id} already exists! Skipping create operation.')
+ except NotFound:
+ # Construct a full Dataset object to send to the API.
+ dataset = bigquery.Dataset(dataset_ref)
+ dataset.location = 'US'
+ dataset = self.client.create_dataset(dataset) # API request
+ log.info('Dataset {} created successfully project: {}.'.format(dataset.dataset_id, self.client.project))
+ #print(f'Dataset {dataset.dataset_id} created successfully project: {self.client.project}.')
+
+ def create_new_table_from_schema(self, dataset_id, table_id,
+ schema):
+ '''
+ https://cloud.google.com/bigquery/docs/tables#create-table
+
+ :param dataset_id: dataset name
+ :param table_id: table name
+ :param schema:
+ schema = [
+ bigquery.SchemaField('full_name', 'STRING', mode='REQUIRED', description='blah'),
+ bigquery.SchemaField('age', 'INTEGER', mode='REQUIRED'),
+ ]
+ :return: None
+ '''
+
+ dataset_ref = self.client.dataset(dataset_id)
+ table_ref = dataset_ref.table(table_id)
+
+ try:
+ self.client.get_table(table_ref)
+ #print(f'Table {table_id} in dataset {dataset_id} already exists! Skipping create operation.')
+ except NotFound:
+ # Construct a full Table object to send to the API.
+ table = bigquery.Table(table_ref, schema=schema)
+ table = self.client.create_table(table) # API request
+ log.info('''
+ Table {} in dataset {}
+ created successfully project: {}.
+ '''.format(table.table_id, dataset_id, self.client.project))
+ '''
+ print(
+ f'Table {table.table_id} in dataset {dataset_id}'
+ f'created successfully project: {self.client.project}.'
+ )
+ '''
+
+ def _stream_csv_to_table(self, dataset_id, table_id, csv_path, batch_size = 1000):
+ '''
+ FYI: Streaming is NOT free
+ https://cloud.google.com/bigquery/pricing#streaming_pricing
+
+ :param dataset_id: dataset name
+ :param table_id: table name
+ :param csv_path: path to CSV from SQL
+ :param batch_size: rows per insert (default 1000)
+ :return: None
+ '''
+
+ table_ref = self.client.dataset(dataset_id).table(table_id)
+ table = self.client.get_table(table_ref) # API request
+
+ with open(csv_path, 'w') as infile, open(csv_path + '_errors', 'w') as outfile:
+ for line in infile:
+ rows_to_insert = []
+ row = line.split(',')
+ # TODO validate row
+ rows_to_insert.append(row)
+
+ if len(rows_to_insert) == batch_size:
+ errors = self.client.insert_rows(table, rows_to_insert) # API request
+ assert errors == []
+ rows_to_insert = []
+
+ if rows_to_insert:
+ errors = self.client.insert_rows(table, rows_to_insert) # API request
+ assert errors == []
+
+ def load_csv_to_table(self, dataset_id, table_id, csv_path, auto_detect_schema = True,
+ schema = [], skip_rows = 0, append_to_table=False):
+ '''
+ :param dataset_id: dataset name
+ :param table_id: table name
+ :param csv_path: path to exported csv file
+ :param auto_detect_schema: auto detect schema types from CSV (default True)
+ :param schema: (default None)
+ schema = [
+ bigquery.SchemaField('full_name', 'STRING', mode='REQUIRED', description='blah'),
+ bigquery.SchemaField('age', 'INTEGER', mode='REQUIRED'),
+ ]
+ :param skip_rows: how many rows in CSV to skip (default 0)
+ :return: None
+
+ Details on loading local data
+ https://cloud.google.com/bigquery/docs/loading-data-local
+ '''
+
+ location = 'US'
+
+ dataset_ref = self.client.get_dataset(dataset_id)
+ table_ref = dataset_ref.table(table_id)
+ dataset = bigquery.Dataset(dataset_ref)
+ dataset.location = location
+
+ job_config = bigquery.LoadJobConfig()
+ job_config.source_format = bigquery.SourceFormat.CSV
+ # https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv#overwriting_a_table_with_csv_data
+ #job_config.write_disposition = bigquery.WriteDisposition.WRITE_EMPTY
+ job_config.skip_leading_rows = skip_rows
+ job_config.quote_character = '\"'
+
+ if not append_to_table:
+ job_config.write_disposition = bigquery.WriteDisposition.WRITE_EMPTY
+
+ if auto_detect_schema:
+ assert schema == [], 'Auto-detect is True, but schema is specified'
+ job_config.autodetect = True
+ else:
+ job_config.autodetect = False
+ assert schema != [], 'Auto-detect is False, but no schema specified'
+ job_config.schema = schema
+
+ with open(csv_path, 'rb') as csv_file:
+ load_table_job = self.client.load_table_from_file(
+ csv_file,
+ table_ref,
+ location=location,
+ job_config=job_config,
+ ) # API request
+
+ log.info('Uploading table... ')
+ #print('Uploading table... ')
+ try:
+ load_table_job.result() # Wait for load to complete
+ except:
+ errors = load_table_job.errors
+ log.error(errors)
+ return errors
+ print(load_table_job.error_result)
+ table = self.client.get_table(table_ref)
+ log.info('''
+ {} rows loaded into
+ table {} in dataset {}
+ in project: {}.
+ '''.format(load_table_job.output_rows, table.table_id, dataset_id, self.client.project))
+ '''
+ print(
+ f'{load_table_job.output_rows} rows loaded into '
+ f'table {table.table_id} in dataset {dataset_id} '
+ f'in project: {self.client.project}.'
+ )
+ '''
+
+ def read_table_types(self, table_types_path):
+ '''
+ reads in lines, deliminited by "|", e.g.:
+ | | | |
+
+ :param table_types_path:
+ :return: list of bigquery.SchemaField
+ '''
+
+ type_mapping = {
+ 'TINYINT' : 'INT64',
+ 'SMALLINT' : 'INT64',
+ 'MEDIUMINT' : 'INT64',
+ 'INT' : 'INT64',
+ 'INTEGER' : 'INT64',
+ 'BIGINT' : 'INT64',
+ 'DECIMAL' : 'NUMERIC',
+ 'NUMERIC' : 'NUMERIC',
+ 'REAL' : 'FLOAT64',
+ 'DOUBLE PRECISION': 'FLOAT64',
+ 'BOOLEAN' : 'BOOL',
+ 'CHAR' : 'STRING',
+ 'CHARACTER': 'STRING',
+ 'CHARACTER VARYING': 'STRING',
+ 'VARCHAR' : 'STRING',
+ 'BYTEA' : 'BYTES',
+ 'TINYTEXT' : 'STRING',
+ 'TEXT' : 'STRING',
+ 'MEDIUMTEXT': 'STRING',
+ 'LONGTEXT' : 'STRING',
+ 'DATE' : 'DATE',
+ 'TIME' : 'TIME',
+ 'TIMESTAMP' : 'TIMESTAMP',
+ 'TIMESTAMP WITHOUT TIME ZONE': 'TIMESTAMP'
+ }
+
+ schema_fields = []
+
+ with open(table_types_path, 'r') as type_table_f:
+ for line in type_table_f:
+ column, pg_type, collation, nullable, default = [item.strip() for item in line.split('|')]
+ pg_type_ = re.sub(r'\(.*\)', '', pg_type).upper()
+ bq_type = type_mapping[pg_type_]
+ mode = 'REQUIRED' if nullable == 'not null' else 'NULLABLE'
+ schema_fields.append(bigquery.SchemaField(column, bq_type, mode=mode))
+
+ return schema_fields
+
+ def get_row_count(self, full_table_name):
+
+ query_job = self.client.query('SELECT COUNT(*) FROM ' + full_table_name, location='US')
+ results = query_job.result()
+ results_list = [row for row in results]
+
+ return results_list[0][0]
+
+ def queryBQ(self, query_str, query_params=None, location ='US', batch_mode = False, dry_run = False,
+ verbose = False):
+
+ job_config = bigquery.QueryJobConfig()
+ job_config.dry_run = dry_run
+
+ if batch_mode:
+ # Run at batch priority, which won't count toward concurrent rate limit.
+ job_config.priority = bigquery.QueryPriority.BATCH
+
+ if query_params:
+ job_config.query_parameters = query_params
+
+ query_job = self.client.query(query_str, location=location, job_config=job_config)
+
+ if batch_mode: # wait until job is done
+ while query_job.state != 'DONE':
+ query_job = self.client.get_job(query_job.job_id, location=location)
+ log.info('Job {} is currently in state {}'.format(query_job.job_id, query_job.state))
+ #print('Job {} is currently in state {}'.format(query_job.job_id, query_job.state))
+ time.sleep(5)
+
+ if verbose:
+ log.info('This query will process {} bytes:'.format(query_job.total_bytes_processed)) # TODO (nodir) always None - query isn't processed yet
+ log.info('Query: ' + query_str)
+ #print('This query will process {} bytes.'.format(query_job.total_bytes_processed))
+
+ return query_job
diff --git a/medinfo/db/bigquery/test/__init__.py b/medinfo/db/bigquery/test/__init__.py
new file mode 100644
index 00000000..4e16c564
--- /dev/null
+++ b/medinfo/db/bigquery/test/__init__.py
@@ -0,0 +1 @@
+# Nothing much for now, just enable importing of various modules as a common package
diff --git a/medinfo/db/bigquery/test/test_bigQueryUtil.py b/medinfo/db/bigquery/test/test_bigQueryUtil.py
new file mode 100644
index 00000000..da6a9645
--- /dev/null
+++ b/medinfo/db/bigquery/test/test_bigQueryUtil.py
@@ -0,0 +1,122 @@
+'''
+need a delete list to remove from GCP after testing (do this in web GUI)
+'''
+import os
+import unittest
+import csv
+import tempfile;
+
+from medinfo.dataconversion.test.Const import RUNNER_VERBOSITY
+from medinfo.dataconversion.Util import log
+from medinfo.db.bigquery import bigQueryUtil
+from medinfo.common.test.Util import MedInfoTestCase
+from medinfo.db.Model import RowItemModel
+
+from google.cloud import bigquery
+
+TEST_DEST_DATASET = 'test_dataset'
+TEST_TABLE_ID = 'unittest_bigQueryUtil'
+TMP_DIR = tempfile.gettempdir();
+
+
+class test_bigQueryUtil(MedInfoTestCase):
+
+ def setUp(self):
+ """Prepare state for test cases"""
+
+ # create dummy CSV
+ self.tmp_dummy_csv_path = TMP_DIR + '/unittest_bq_dummy.csv'
+ self.dummy_table = lines = [['num', 'char']] + [[n, chr(ord('a')+n)] for n in range(26)]
+ with open(self.tmp_dummy_csv_path, 'w', newline='') as csvfile:
+ writer = csv.writer(csvfile, delimiter=',')
+ writer.writerows(lines)
+
+ self.tmp_csv_path = TMP_DIR + '/unittest_bq.csv'
+
+ self.bqConn = bigQueryUtil.connection()
+ self.bqClient = bigQueryUtil.BigQueryClient()
+
+ def tearDown(self):
+ """Restore state from any setUp or test steps"""
+ log.info("Purge test records from the database")
+
+ bqCursor = self.bqConn.cursor()
+ bqCursor.execute('DELETE FROM %s.%s WHERE true;' % (TEST_DEST_DATASET, TEST_TABLE_ID))
+
+ log.info("Removing tmp CSV files")
+ if os.path.exists(self.tmp_csv_path):
+ os.remove(self.tmp_csv_path)
+ if os.path.exists(self.tmp_dummy_csv_path):
+ os.remove(self.tmp_dummy_csv_path)
+
+ def test_create_table_from_schema(self):
+ schema = [bigquery.SchemaField('num', 'INTEGER', 'REQUIRED', None, ()),
+ bigquery.SchemaField('char', 'STRING', 'NULLABLE', None, ())]
+
+ self.bqClient.create_new_table_from_schema(TEST_DEST_DATASET, TEST_TABLE_ID, schema)
+
+ table_ref = self.bqClient.client.dataset(TEST_DEST_DATASET).table(TEST_TABLE_ID)
+ table = self.bqClient.client.get_table(table_ref)
+ bq_schema = table.schema
+
+ for ref_schema_field, cmp_schema_field in zip(schema, bq_schema):
+ print((ref_schema_field.to_api_repr(), cmp_schema_field.to_api_repr()))
+ assert ref_schema_field.name == cmp_schema_field.name
+ assert ref_schema_field.field_type == cmp_schema_field.field_type
+ assert ref_schema_field.is_nullable == cmp_schema_field.is_nullable
+
+ def _test_query_from_bq_table(self):
+ '''skipping this for now, need to create a permanent test table to query from'''
+
+ query = '''
+ SELECT stride_treatment_team_id, pat_enc_csn_id, treatment_team
+ FROM stride_2008_2017.stride_treatment_team
+ WHERE stride_treatment_team_id IN UNNEST(@tt_ids);
+ '''
+
+ headers = ['stride_treatment_team_id', 'pat_enc_csn_id', 'treatment_team']
+ treatment_team_ids = list(range(2141155, 2141205))
+ query_params = [
+ bigquery.ArrayQueryParameter('tt_ids', 'INT64', treatment_team_ids)
+ ]
+
+ query_job = self.bqClient.queryBQ(str(query), query_params=query_params, location='US', batch_mode=False,
+ verbose=True)
+
+ actual_data = []
+ with open(self.tmp_csv_path, 'wb') as csvfile:
+ writer = csv.writer(csvfile)
+ for row in query_job:
+ writer.writerow(list(row.values()))
+ actual_data.append(row.values)
+
+ # TODO fill expected data
+ expected_data = []
+ self.assertEqualTable(expected_data, actual_data)
+
+ def test_load_csv_to_table(self):
+ self.bqClient.load_csv_to_table(TEST_DEST_DATASET, TEST_TABLE_ID, self.tmp_dummy_csv_path, skip_rows=1,
+ append_to_table=True)
+ query = 'SELECT * FROM {}.{}'.format(TEST_DEST_DATASET, TEST_TABLE_ID)
+
+ query_job = self.bqClient.queryBQ(str(query), location='US', batch_mode=False,
+ verbose=True)
+
+ actual_data = [['num', 'char']]
+ for row in query_job:
+ actual_data.append([row.num, row.char])
+ self.assertEqualTable(self.dummy_table, actual_data)
+
+def suite():
+ """Returns the suite of tests to run for this test class / module.
+ Use unittest.makeSuite methods which simply extracts all of the
+ methods for the given class whose name starts with "test"
+ """
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(test_bigQueryUtil))
+
+ return suite
+
+
+if __name__ == "__main__":
+ unittest.TextTestRunner(verbosity=RUNNER_VERBOSITY).run(suite())
\ No newline at end of file
diff --git a/medinfo/db/definition/cpoeSimultation.sql b/medinfo/db/definition/cpoeSimulation.sql
similarity index 98%
rename from medinfo/db/definition/cpoeSimultation.sql
rename to medinfo/db/definition/cpoeSimulation.sql
index 04a8eb2a..059954a1 100644
--- a/medinfo/db/definition/cpoeSimultation.sql
+++ b/medinfo/db/definition/cpoeSimulation.sql
@@ -1,198 +1,196 @@
--- Basic simultation user tracking information
-CREATE TABLE sim_user
-(
- sim_user_id SERIAL NOT NULL,
- name TEXT NOT NULL
---How many years since you received your medical degree (MD/DO)?
---What is your primary area / specialty of clinical practice?
---List your current or prior medical training and board certifications:
---What percentage of your time in the past year has been spent practicing outpatient / clinic medicine?
---What percentage of your time in the past year has been spent practicing inpatient / hospital medicine?
---Approximately how many patients have you admitted to an inpatient hospital service in the past year?
-
-);
-ALTER TABLE sim_user ADD CONSTRAINT sim_user_pkey PRIMARY KEY (sim_user_id);
--- INSERT INTO sim_user(sim_user_id,name) VALUES (0,'Default User');
-
--- Basic simulated patient information
-CREATE TABLE sim_patient
-(
- sim_patient_id SERIAL NOT NULL,
- name TEXT NOT NULL,
- age_years INTEGER NOT NULL,
- gender TEXT NOT NULL
-);
-ALTER TABLE sim_patient ADD CONSTRAINT sim_patient_pkey PRIMARY KEY (sim_patient_id);
-
--- Model patient states with transition options
-CREATE TABLE sim_state
-(
- sim_state_id SERIAL NOT NULL,
- name TEXT NOT NULL,
- description TEXT
-);
-ALTER TABLE sim_state ADD CONSTRAINT sim_state_pkey PRIMARY KEY (sim_state_id);
--- INSERT INTO sim_state(sim_state_id,name, description) VALUES (0,'Default','Default State Info');
-
--- Record when a patient enters a given state
-CREATE TABLE sim_patient_state
-(
- sim_patient_state_id SERIAL NOT NULL,
- sim_patient_id BIGINT NOT NULL,
- sim_state_id BIGINT NOT NULL,
- relative_time_start INTEGER NOT NULL,
- relative_time_end INTEGER -- Redundant to store end-time when can infer from start time of next record, but having both recorded makes for easier retrieval queries
-);
-ALTER TABLE sim_patient_state ADD CONSTRAINT sim_patient_state_pkey PRIMARY KEY (sim_patient_state_id);
-ALTER TABLE sim_patient_state ADD CONSTRAINT sim_patient_state_patient_fkey FOREIGN KEY (sim_patient_id) REFERENCES sim_patient(sim_patient_id);
-ALTER TABLE sim_patient_state ADD CONSTRAINT sim_patient_state_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
-CREATE INDEX index_sim_patient_state_patient ON sim_patient_state(sim_patient_id,relative_time_start,relative_time_end);
-CREATE INDEX index_sim_patient_state_state ON sim_patient_state(sim_state_id);
-
--- State transition triggers
-CREATE TABLE sim_state_transition
-(
- sim_state_transition_id SERIAL NOT NULL,
- pre_state_id BIGINT NOT NULL,
- post_state_id BIGINT NOT NULL,
- clinical_item_id BIGINT, -- Clinical Item that occurs in pre-state to trigger transition to post-state
- time_trigger INTEGER, -- Alternatively, amount of time (seconds) to pass before triggering state transition
- description TEXT
-);
-ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_pkey PRIMARY KEY (sim_state_transition_id);
-ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_unique_key UNIQUE (pre_state_id, clinical_item_id);
-ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_pre_state_fkey FOREIGN KEY (pre_state_id) REFERENCES sim_state(sim_state_id);
-ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_post_state_fkey FOREIGN KEY (post_state_id) REFERENCES sim_state(sim_state_id);
-ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
-CREATE INDEX index_sim_state_transition_pre_state ON sim_state_transition(pre_state_id,clinical_item_id); -- Should be created implicitly by UNIQUE constraint
-CREATE INDEX index_sim_state_transition_post_state ON sim_state_transition(post_state_id,clinical_item_id);
-
--- Code Table to record note type information. For brevity, also track author and service types (Treatment Team?) here
-CREATE TABLE sim_note_type
-(
- sim_note_type_id INTEGER NOT NULL,
- name TEXT NOT NULL,
- priority INTEGER,
- description TEXT
-);
-ALTER TABLE sim_note_type ADD CONSTRAINT sim_note_type_pkey PRIMARY KEY (sim_note_type_id);
-
--- Patient Notes
-CREATE TABLE sim_note
-(
- sim_note_id SERIAL NOT NULL,
- sim_state_id BIGINT NOT NULL,
- note_type_id INTEGER,
- author_type_id INTEGER,
- service_type_id INTEGER,
- relative_state_time INTEGER NOT NULL, -- Seconds relative to the simulated patient state's relative_time_start
- content TEXT NOT NULL
-);
-ALTER TABLE sim_note ADD CONSTRAINT sim_note_pkey PRIMARY KEY (sim_note_id);
-ALTER TABLE sim_note ADD CONSTRAINT sim_note_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
-ALTER TABLE sim_note ADD CONSTRAINT sim_note_note_type_fkey FOREIGN KEY (note_type_id) REFERENCES sim_note_type(sim_note_type_id);
-ALTER TABLE sim_note ADD CONSTRAINT sim_note_author_type_fkey FOREIGN KEY (author_type_id) REFERENCES sim_note_type(sim_note_type_id);
-ALTER TABLE sim_note ADD CONSTRAINT sim_note_service_type_fkey FOREIGN KEY (service_type_id) REFERENCES sim_note_type(sim_note_type_id);
-CREATE INDEX index_sim_note_state ON sim_note(sim_state_id,relative_state_time);
-
--- Result data, primarily labs and imaging, with either numeric or text values. Lookup / code table to organize types of results
--- Format group_string as cascading categories necessary for sorting and subgrouping (e.g., Labs>Hematology>Automated Blood Count)
--- Use priority as master sorting index rather than sorting by each category grouping, as alphabetical may not always be desired sort option
-CREATE TABLE sim_result
-(
- sim_result_id SERIAL NOT NULL,
- name TEXT NOT NULL,
- description TEXT,
- group_string TEXT,
- priority INTEGER
-);
-ALTER TABLE sim_result ADD CONSTRAINT sim_result_pkey PRIMARY KEY (sim_result_id);
-
--- Specific values for individual patient states, map to clinical_items reflecting laboratory results
--- Include flowsheet (vitals) through here as well and just separate out by result group_strings
-CREATE TABLE sim_state_result
-(
- sim_state_result_id SERIAL NOT NULL,
- sim_state_id INTEGER NOT NULL, -- Simulated Patient State identifier that this result should be available for. Don't assign to specific patients, assign patients to a state that these reflect
- sim_result_id BIGINT NOT NULL,
- clinical_item_id BIGINT, -- Map to clinical_items reflecting (laboratory) results
- num_value FLOAT,
- num_value_noise FLOAT, -- Option to add +/- noise to reported value in case of repeated testing
- text_value TEXT,
- result_flag TEXT
-);
-ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_pkey PRIMARY KEY (sim_state_result_id);
-ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
-ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_sim_result_fkey FOREIGN KEY (sim_result_id) REFERENCES sim_result(sim_result_id);
-ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
-CREATE INDEX index_sim_state_result_state ON sim_state_result(sim_state_id);
-CREATE INDEX index_sim_state_result_sim_result ON sim_state_result(sim_result_id,num_value);
-CREATE INDEX index_sim_state_result_clinical_item ON sim_state_result(clinical_item_id);
-
--- Many-to-Many mapping to indicate which (lab) orders (referenced as clinical_item_ids) can trigger which results
--- That way can prespecify what lab results are expected for a simulated patient, but do not release
--- that information until user orders a respective laboratory test.
-CREATE TABLE sim_order_result_map
-(
- sim_order_result_map_id SERIAL NOT NULL,
- clinical_item_id BIGINT NOT NULL, -- Precedent item / Triggering order
- sim_result_id BIGINT NOT NULL,
- turnaround_time INTEGER -- Seconds from the order time until expect to have/release the result
-);
-ALTER TABLE sim_order_result_map ADD CONSTRAINT sim_order_result_map_pkey PRIMARY KEY (sim_order_result_map_id);
-ALTER TABLE sim_order_result_map ADD CONSTRAINT sim_order_result_map_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
-ALTER TABLE sim_order_result_map ADD CONSTRAINT sim_order_result_map_sim_result_fkey FOREIGN KEY (sim_result_id) REFERENCES sim_result(sim_result_id);
-CREATE INDEX index_sim_order_result_map_sim_result ON sim_order_result_map(sim_result_id);
-CREATE INDEX index_sim_order_result_map_clinical_item ON sim_order_result_map(clinical_item_id);
-
--- Clinical item orders for patients, keyed with start and end dates
-CREATE TABLE sim_patient_order
-(
- sim_patient_order_id SERIAL NOT NULL,
- sim_user_id BIGINT NOT NULL,
- sim_patient_id BIGINT NOT NULL,
- clinical_item_id BIGINT NOT NULL,
- relative_time_start INTEGER NOT NULL, -- Relative to base / zero time of simulated case that the order occurred / started
- relative_time_end INTEGER -- Relative to base / zero time of simulated case that order concludes or was discontinued
-);
-ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_pkey PRIMARY KEY (sim_patient_order_id);
-ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_sim_user_fkey FOREIGN KEY (sim_user_id) REFERENCES sim_user(sim_user_id);
-ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_sim_patient_fkey FOREIGN KEY (sim_patient_id) REFERENCES sim_patient(sim_patient_id);
-ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
-CREATE INDEX index_sim_patient_order_sim_user_patient_date ON sim_patient_order(sim_user_id, sim_patient_id, relative_time_start); -- Natural sorting option to order by user, patient, then in chronological order of clinical items
-CREATE INDEX index_sim_patient_order_sim_clinical_item ON sim_patient_order(sim_patient_id, clinical_item_id); -- Natural sorting option to order by patient, then in chronological order of clinical items
--- Record patient state at the time of the order.
--- Denormalized information that could be derived from sim_patient_state, but makes future joins a hassle using relative time information
-ALTER TABLE sim_patient_order ADD COLUMN sim_state_id BIGINT NOT NULL DEFAULT 0;
-ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
-
-
--- Populate sim_order_result_map and sim_result with existing data based on queries like below
-
--- select
--- sop.proc_cat_name, sop.proc_id, sop.proc_code, sop.description,
--- sor.base_name, sor.component_name,
--- count(ord_num_value) as countValue,
--- sum(ord_num_value) as sumValue,
--- sum(ord_num_value*ord_num_value) as sumSquaresValue,
--- count(extract(epoch from sop.result_time-proc_start_time)) countTurnaround,
--- sum(extract(epoch from sop.result_time-proc_start_time)) sumTurnaround,
--- sum( extract(epoch from sop.result_time-proc_start_time) ^2 ) sumSquaresTurnaround
--- from stride_order_proc as sop, stride_order_results as sor
--- where sop.order_proc_id = sor.order_proc_id
--- group by
--- sop.proc_cat_name, sop.proc_id, sop.proc_code, sop.description,
--- sor.base_name, sor.component_name
-
--- select
--- flo_meas_id, flowsheet_name,
--- count(flowsheet_value) as countValue, sum(flowsheet_value) as sumValue, sum(flowsheet_value^2) as sumSquaresValue
--- from stride_flowsheet
--- group by
--- flo_meas_id, flowsheet_name
---
-
--- Calculate result distribution summary statistics
--- python scripts\CDSS\populateOrderResultStats.py
-
-
+-- Basic simultation user tracking information
+CREATE TABLE sim_user
+(
+ sim_user_id SERIAL NOT NULL,
+ name TEXT NOT NULL
+--How many years since you received your medical degree (MD/DO)?
+--What is your primary area / specialty of clinical practice?
+--List your current or prior medical training and board certifications:
+--What percentage of your time in the past year has been spent practicing outpatient / clinic medicine?
+--What percentage of your time in the past year has been spent practicing inpatient / hospital medicine?
+--Approximately how many patients have you admitted to an inpatient hospital service in the past year?
+
+);
+ALTER TABLE sim_user ADD CONSTRAINT sim_user_pkey PRIMARY KEY (sim_user_id);
+-- INSERT INTO sim_user(sim_user_id,name) VALUES (0,'Default User');
+
+-- Basic simulated patient information
+CREATE TABLE sim_patient
+(
+ sim_patient_id SERIAL NOT NULL,
+ name TEXT NOT NULL,
+ age_years INTEGER NOT NULL,
+ gender TEXT NOT NULL
+);
+ALTER TABLE sim_patient ADD CONSTRAINT sim_patient_pkey PRIMARY KEY (sim_patient_id);
+
+-- Model patient states with transition options
+CREATE TABLE sim_state
+(
+ sim_state_id SERIAL NOT NULL,
+ name TEXT NOT NULL,
+ description TEXT
+);
+ALTER TABLE sim_state ADD CONSTRAINT sim_state_pkey PRIMARY KEY (sim_state_id);
+-- INSERT INTO sim_state(sim_state_id,name, description) VALUES (0,'Default','Default State Info');
+
+-- Record when a patient enters a given state
+CREATE TABLE sim_patient_state
+(
+ sim_patient_state_id SERIAL NOT NULL,
+ sim_patient_id BIGINT NOT NULL,
+ sim_state_id BIGINT NOT NULL,
+ relative_time_start INTEGER NOT NULL,
+ relative_time_end INTEGER -- Redundant to store end-time when can infer from start time of next record, but having both recorded makes for easier retrieval queries
+);
+ALTER TABLE sim_patient_state ADD CONSTRAINT sim_patient_state_pkey PRIMARY KEY (sim_patient_state_id);
+ALTER TABLE sim_patient_state ADD CONSTRAINT sim_patient_state_patient_fkey FOREIGN KEY (sim_patient_id) REFERENCES sim_patient(sim_patient_id);
+ALTER TABLE sim_patient_state ADD CONSTRAINT sim_patient_state_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
+CREATE INDEX index_sim_patient_state_patient ON sim_patient_state(sim_patient_id,relative_time_start,relative_time_end);
+CREATE INDEX index_sim_patient_state_state ON sim_patient_state(sim_state_id);
+
+-- State transition triggers
+CREATE TABLE sim_state_transition
+(
+ sim_state_transition_id SERIAL NOT NULL,
+ pre_state_id BIGINT NOT NULL,
+ post_state_id BIGINT NOT NULL,
+ clinical_item_id BIGINT, -- Clinical Item that occurs in pre-state to trigger transition to post-state
+ time_trigger INTEGER, -- Alternatively, amount of time (seconds) to pass before triggering state transition
+ description TEXT
+);
+ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_pkey PRIMARY KEY (sim_state_transition_id);
+ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_unique_key UNIQUE (pre_state_id, clinical_item_id);
+ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_pre_state_fkey FOREIGN KEY (pre_state_id) REFERENCES sim_state(sim_state_id);
+ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_post_state_fkey FOREIGN KEY (post_state_id) REFERENCES sim_state(sim_state_id);
+ALTER TABLE sim_state_transition ADD CONSTRAINT sim_state_transition_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
+CREATE INDEX index_sim_state_transition_pre_state ON sim_state_transition(pre_state_id,clinical_item_id); -- Should be created implicitly by UNIQUE constraint
+CREATE INDEX index_sim_state_transition_post_state ON sim_state_transition(post_state_id,clinical_item_id);
+
+-- Code Table to record note type information. For brevity, also track author and service types (Treatment Team?) here
+CREATE TABLE sim_note_type
+(
+ sim_note_type_id INTEGER NOT NULL,
+ name TEXT NOT NULL,
+ priority INTEGER,
+ description TEXT
+);
+ALTER TABLE sim_note_type ADD CONSTRAINT sim_note_type_pkey PRIMARY KEY (sim_note_type_id);
+
+-- Patient Notes
+CREATE TABLE sim_note
+(
+ sim_note_id SERIAL NOT NULL,
+ sim_state_id BIGINT NOT NULL,
+ note_type_id INTEGER,
+ author_type_id INTEGER,
+ service_type_id INTEGER,
+ relative_state_time INTEGER NOT NULL, -- Seconds relative to the simulated patient state's relative_time_start
+ content TEXT NOT NULL
+);
+ALTER TABLE sim_note ADD CONSTRAINT sim_note_pkey PRIMARY KEY (sim_note_id);
+ALTER TABLE sim_note ADD CONSTRAINT sim_note_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
+ALTER TABLE sim_note ADD CONSTRAINT sim_note_note_type_fkey FOREIGN KEY (note_type_id) REFERENCES sim_note_type(sim_note_type_id);
+ALTER TABLE sim_note ADD CONSTRAINT sim_note_author_type_fkey FOREIGN KEY (author_type_id) REFERENCES sim_note_type(sim_note_type_id);
+ALTER TABLE sim_note ADD CONSTRAINT sim_note_service_type_fkey FOREIGN KEY (service_type_id) REFERENCES sim_note_type(sim_note_type_id);
+CREATE INDEX index_sim_note_state ON sim_note(sim_state_id,relative_state_time);
+
+-- Result data, primarily labs and imaging, with either numeric or text values. Lookup / code table to organize types of results
+-- Format group_string as cascading categories necessary for sorting and subgrouping (e.g., Labs>Hematology>Automated Blood Count)
+-- Use priority as master sorting index rather than sorting by each category grouping, as alphabetical may not always be desired sort option
+CREATE TABLE sim_result
+(
+ sim_result_id SERIAL NOT NULL,
+ name TEXT NOT NULL,
+ description TEXT,
+ group_string TEXT,
+ priority INTEGER
+);
+ALTER TABLE sim_result ADD CONSTRAINT sim_result_pkey PRIMARY KEY (sim_result_id);
+
+-- Specific values for individual patient states, map to clinical_items reflecting laboratory results
+-- Include flowsheet (vitals) through here as well and just separate out by result group_strings
+CREATE TABLE sim_state_result
+(
+ sim_state_result_id SERIAL NOT NULL,
+ sim_state_id INTEGER NOT NULL, -- Simulated Patient State identifier that this result should be available for. Don't assign to specific patients, assign patients to a state that these reflect
+ sim_result_id BIGINT NOT NULL,
+ clinical_item_id BIGINT, -- Map to clinical_items reflecting (laboratory) results
+ num_value FLOAT,
+ num_value_noise FLOAT, -- Option to add +/- noise to reported value in case of repeated testing
+ text_value TEXT,
+ result_flag TEXT
+);
+ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_pkey PRIMARY KEY (sim_state_result_id);
+ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
+ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_sim_result_fkey FOREIGN KEY (sim_result_id) REFERENCES sim_result(sim_result_id);
+ALTER TABLE sim_state_result ADD CONSTRAINT sim_state_result_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
+CREATE INDEX index_sim_state_result_state ON sim_state_result(sim_state_id);
+CREATE INDEX index_sim_state_result_sim_result ON sim_state_result(sim_result_id,num_value);
+CREATE INDEX index_sim_state_result_clinical_item ON sim_state_result(clinical_item_id);
+
+-- Many-to-Many mapping to indicate which (lab) orders (referenced as clinical_item_ids) can trigger which results
+-- That way can prespecify what lab results are expected for a simulated patient, but do not release
+-- that information until user orders a respective laboratory test.
+CREATE TABLE sim_order_result_map
+(
+ sim_order_result_map_id SERIAL NOT NULL,
+ clinical_item_id BIGINT NOT NULL, -- Precedent item / Triggering order
+ sim_result_id BIGINT NOT NULL,
+ turnaround_time INTEGER -- Seconds from the order time until expect to have/release the result
+);
+ALTER TABLE sim_order_result_map ADD CONSTRAINT sim_order_result_map_pkey PRIMARY KEY (sim_order_result_map_id);
+ALTER TABLE sim_order_result_map ADD CONSTRAINT sim_order_result_map_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
+ALTER TABLE sim_order_result_map ADD CONSTRAINT sim_order_result_map_sim_result_fkey FOREIGN KEY (sim_result_id) REFERENCES sim_result(sim_result_id);
+CREATE INDEX index_sim_order_result_map_sim_result ON sim_order_result_map(sim_result_id);
+CREATE INDEX index_sim_order_result_map_clinical_item ON sim_order_result_map(clinical_item_id);
+
+-- Clinical item orders for patients, keyed with start and end dates
+CREATE TABLE sim_patient_order
+(
+ sim_patient_order_id SERIAL NOT NULL,
+ sim_user_id BIGINT NOT NULL,
+ sim_patient_id BIGINT NOT NULL,
+ clinical_item_id BIGINT NOT NULL,
+ relative_time_start INTEGER NOT NULL, -- Relative to base / zero time of simulated case that the order occurred / started
+ relative_time_end INTEGER -- Relative to base / zero time of simulated case that order concludes or was discontinued
+);
+ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_pkey PRIMARY KEY (sim_patient_order_id);
+ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_sim_user_fkey FOREIGN KEY (sim_user_id) REFERENCES sim_user(sim_user_id);
+ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_sim_patient_fkey FOREIGN KEY (sim_patient_id) REFERENCES sim_patient(sim_patient_id);
+ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_clinical_item_fkey FOREIGN KEY (clinical_item_id) REFERENCES clinical_item(clinical_item_id);
+CREATE INDEX index_sim_patient_order_sim_user_patient_date ON sim_patient_order(sim_user_id, sim_patient_id, relative_time_start); -- Natural sorting option to order by user, patient, then in chronological order of clinical items
+CREATE INDEX index_sim_patient_order_sim_clinical_item ON sim_patient_order(sim_patient_id, clinical_item_id); -- Natural sorting option to order by patient, then in chronological order of clinical items
+-- Record patient state at the time of the order.
+-- Denormalized information that could be derived from sim_patient_state, but makes future joins a hassle using relative time information
+ALTER TABLE sim_patient_order ADD COLUMN sim_state_id BIGINT NOT NULL DEFAULT 0;
+ALTER TABLE sim_patient_order ADD CONSTRAINT sim_patient_order_state_fkey FOREIGN KEY (sim_state_id) REFERENCES sim_state(sim_state_id);
+
+
+-- Populate sim_order_result_map and sim_result with existing data based on queries like below
+
+-- select
+-- sop.proc_cat_name, sop.proc_id, sop.proc_code, sop.description,
+-- sor.base_name, sor.component_name,
+-- count(ord_num_value) as countValue,
+-- sum(ord_num_value) as sumValue,
+-- sum(ord_num_value*ord_num_value) as sumSquaresValue,
+-- count(extract(epoch from sop.result_time-proc_start_time)) countTurnaround,
+-- sum(extract(epoch from sop.result_time-proc_start_time)) sumTurnaround,
+-- sum( extract(epoch from sop.result_time-proc_start_time) ^2 ) sumSquaresTurnaround
+-- from stride_order_proc as sop, stride_order_results as sor
+-- where sop.order_proc_id = sor.order_proc_id
+-- group by
+-- sop.proc_cat_name, sop.proc_id, sop.proc_code, sop.description,
+-- sor.base_name, sor.component_name
+
+-- select
+-- flo_meas_id, flowsheet_name,
+-- count(flowsheet_value) as countValue, sum(flowsheet_value) as sumValue, sum(flowsheet_value^2) as sumSquaresValue
+-- from stride_flowsheet
+-- group by
+-- flo_meas_id, flowsheet_name
+--
+
+-- Calculate result distribution summary statistics
+-- python scripts\CDSS\populateOrderResultStats.py
diff --git a/medinfo/db/definition/opioidrx.sql b/medinfo/db/definition/opiodrx.sql
similarity index 97%
rename from medinfo/db/definition/opioidrx.sql
rename to medinfo/db/definition/opiodrx.sql
index 43e2ede1..cd5ebc2b 100644
--- a/medinfo/db/definition/opioidrx.sql
+++ b/medinfo/db/definition/opiodrx.sql
@@ -1,279 +1,279 @@
--- Mapping Table for Medications to Common Active Ingredients
-create table stride_mapped_meds
-(
- medication_id integer,
- medication_name text,
- rxcui integer,
- active_ingredient text
-);
-CREATE INDEX index_stride_mapped_meds_medication_id ON stride_mapped_meds(medication_id);
-ALTER TABLE stride_mapped_meds ADD COLUMN analysis_status INTEGER DEFAULT 1;
-ALTER TABLE stride_mapped_meds ADD COLUMN morphine_po_equivalent FLOAT;
-
--- Medication Order Data Table. Source headers need " removed, lower-case, and make sure refills column is numeric
--- Remove " marks and lower-case header lines
--- (Refills should be numeric 0 not char o. Just swap "o" for "0") (Entry 436981419... refills should be numeric, not "prn")
-create table stride_order_med
-(
- order_med_id bigint not null,
- pat_id text,
- pat_enc_csn_id bigint,
- ordering_datetime datetime,
- hosp_admsn_time datetime,
- hosp_dischrg_time datetime,
- order_class text,
- medication_id integer,
- description text,
- sig text,
- quantity text,
- refills integer,
- start_date datetime,
- end_date datetime,
- dispense_as_written_yn text,
- reason_for_discontinuation text,
- enc_type_c integer,
- encounter_type text,
- patient_location text,
- login_department text,
- display_name text,
- hv_hospitalist_yn text,
- med_route text,
- discontinue_time datetime,
- changed_from_order_med_id bigint,
- reason_pended_med_refused text,
- hv_discr_freq_id bigint,
- discr_freq_name text,
- discr_freq_display_name text,
- discr_freq_type text,
- discr_freq_number_of_times integer,
- freq_time_unit text,
- prn_yn text,
- freq_duplicate_dose_interval integer,
- freq_missed_dose_interval integer,
- freqency_or_period text,
- hv_discrete_dose text,
- hv_dose_unit text,
- non_formulary_yn text,
- order_status text,
- min_discrete_dose float,
- max_discrete_dose float,
- dose_unit text,
- is_pending_ord_yn text,
- modify_track text,
- med_comments text,
- usr_select_medicn_id integer,
- lastdose text,
- amb_med_disp_name text,
- refills_remaining integer,
- rule_based_order_transmittl_yn text,
- outpat_orderstat_before_admsn text,
- last_dose_time text,
- pend_approve_flag text,
- prn_comment text,
- med_dis_disp_qty integer,
- med_dis_disp_unit text
-);
-ALTER TABLE stride_order_med ADD CONSTRAINT stride_order_med_pkey PRIMARY KEY (order_med_id);
-CREATE INDEX index_stride_order_med_pat_id ON stride_order_med(pat_id (16));
-CREATE INDEX index_stride_order_med_ordering_datetime ON stride_order_med(ordering_datetime);
-CREATE INDEX index_stride_order_med_pat_enc_csn_id ON stride_order_med(pat_enc_csn_id);
-CREATE INDEX index_stride_order_med_medication_id ON stride_order_med(medication_id);
-
-
--- Drug Screen Results
--- Header row: Remove " marks and lower-case header lines
-create table stride_order_proc_drug_screen
-(
- order_proc_id bigint,
- pat_id text,
- pat_enc_csn_id bigint,
- ordering_date datetime,
- proc_id integer,
- proc_code text,
- description text,
- quantity integer,
- order_status_c text,
- order_status text,
- reason_for_cancellation text,
- future_or_stand text,
- standing_exp_date datetime,
- future_expected_compltn_date datetime,
- standing_occurs integer,
- stand_orig_occur integer,
- rfl_priority text,
- order_priority text,
- stand_interval text,
- instantiated_time datetime,
- ordering_mode text,
- is_pending_ord_yn text,
- proc_start_time datetime,
- proc_end_time datetime,
- id_of_replaced_order_proc_id bigint,
- patient_location text,
- login_department text,
- specimen_taken_time datetime,
- specimen_recv_time datetime,
- result_line integer,
- component_id integer,
- component_name text,
- ord_value text,
- ref_normal_vals text
-);
-CREATE INDEX index_stride_order_proc_drug_screen_compkey ON stride_order_proc_drug_screen(order_proc_id, result_line);
-CREATE INDEX index_stride_order_proc_drug_screen_pat_id ON stride_order_proc_drug_screen(pat_id (16));
-CREATE INDEX index_stride_order_proc_drug_screen_pat_enc_csn_id ON stride_order_proc_drug_screen(pat_enc_csn_id);
-CREATE INDEX index_stride_order_proc_drug_screen_component_id ON stride_order_proc_drug_screen(component_id);
-
--- Patient ID list with birth date, gender, race
--- Header: Lower-case
-create table stride_patient
-(
- pat_id text,
- pat_mrn_id bigint,
- birth_date datetime,
- gender text,
- primary_race text
-);
-CREATE INDEX index_patient_pat_id ON stride_patient(pat_id (16));
-CREATE INDEX index_patient_pat_mrn_id ON stride_patient(pat_mrn_id);
--- Get rid of identifying information
-ALTER TABLE stride_patient ADD COLUMN birth_year INTEGER;
-UPDATE stride_patient SET birth_year = YEAR(birth_date);
-ALTER TABLE stride_patient DROP COLUMN birth_date;
-ALTER TABLE stride_patient DROP COLUMN pat_mrn_id;
-
--- Populate oncology label based on patient_possible_onco.csv
-ALTER TABLE stride_patient ADD COLUMN possible_oncology INTEGER DEFAULT 0;
-
-
-
--- Referrals and Consults, includes patient location and login department (lots of inpatient data too)
--- Header: Lower-case, remove " marks
--- Look for rfl_priority is not null and ordering_mode = 'Outpatient' to isolate relevant referrals
-CREATE TABLE stride_order_proc_referrals_n_consults
-(
- order_proc_id bigint,
- pat_id text,
- pat_enc_csn_id bigint,
- ordering_date datetime,
- proc_id bigint,
- proc_code text,
- description text,
- quantity integer,
- order_status_c integer,
- order_status text,
- reason_for_cancellation text,
- future_or_stand text,
- standing_exp_date datetime,
- future_expected_compltn_date datetime,
- standing_occurs integer,
- stand_orig_occur integer,
- rfl_priority text,
- hv_hospitalist_yn text,
- prov_status text,
- order_priority text,
- stand_interval text,
- instantiated_time datetime,
- ordering_mode text,
- is_pending_ord_yn text,
- proc_start_time datetime,
- proc_ending_time datetime,
- id_of_replaced_order_proc_id bigint,
- patient_location text,
- login_department text,
- requested_provider_specialty text,
- reason_for_rferral text,
- num_visits_authorized_by_rfl integer,
- requested_department_specialty text
-);
-CREATE INDEX index_stride_order_proc_referrals_n_consults_order_proc_id ON stride_order_proc_referrals_n_consults(order_proc_id);
-CREATE INDEX index_stride_order_proc_referrals_n_consults_pat_id ON stride_order_proc_referrals_n_consults(pat_id (16));
-CREATE INDEX index_stride_order_proc_referrals_n_consults_pat_enc_csn_id ON stride_order_proc_referrals_n_consults(pat_enc_csn_id);
-CREATE INDEX index_stride_order_proc_referrals_n_consults_proc_id ON stride_order_proc_referrals_n_consults(proc_id);
-
-
--- Encounter dates, types, department. Lots of inpatient data
--- Header: Lower-case and remove " marks
-CREATE TABLE stride_pat_enc
-(
- pat_id text,
- pat_enc_csn_id bigint,
- contact_date datetime,
- enc_type text,
- department_name text,
- appt_status text,
- visit_type text,
- cancel_reason text,
- hosp_admdn_type text,
- surgical_service text,
- phone_reminder_status text,
- appt_time datetime,
- er_arrival_time datetime,
- hosp_admsn_time datetime,
- hosp_dischrg_time datetime,
- adm_for_surg_yn text,
- outgoing_call_yn text,
- is_walk_in_yn text,
- cancel_reason_cmt text,
- admission_confirmation_status text,
- discharge_confirmation_status text,
- inpatient_data_id bigint
-);
-CREATE INDEX index_stride_pat_enc_pat_id ON stride_pat_enc(pat_id (16));
-CREATE INDEX index_stride_pat_enc_pat_enc_csn_id ON stride_pat_enc(pat_enc_csn_id);
-CREATE INDEX index_stride_pat_enc_contact_date ON stride_pat_enc(contact_date);
-CREATE INDEX index_stride_pat_enc_inpatient_data_id ON stride_pat_enc(inpatient_data_id);
-
--- Patient problem lists
--- Header: Lower-case and remove " marks
--- Remove comments with quote marks ("cartilage","gastritis",""Nonocclusive...","Stanford Psych...,"Depression/anxiety...) confounded with comma delimiters
-CREATE TABLE stride_problem_list
-(
- problem_list_id bigint,
- pat_id text,
- dx_id bigint,
- dx_name text,
- dx_group text,
- ref_bill_code text,
- description text,
- noted_date datetime,
- resolved_date datetime,
- problem_cmt text,
- chronic_yn text,
- principal_pl_yn text
-);
-CREATE INDEX index_stride_problem_list_problem_list_id ON stride_problem_list(problem_list_id);
-CREATE INDEX index_stride_problem_list_pat_id ON stride_problem_list(pat_id (16));
-CREATE INDEX index_stride_problem_list_dx_id ON stride_problem_list(dx_id);
-CREATE INDEX index_stride_problem_list_dx_name ON stride_problem_list(dx_name (16));
-CREATE INDEX index_stride_problem_list_noted_date ON stride_problem_list(noted_date);
-
-ALTER TABLE stride_problem_list ADD COLUMN base_bill_code TEXT;
-CREATE INDEX index_stride_problem_list_ref_bill_code ON stride_problem_list(ref_bill_code (16));
-CREATE INDEX index_stride_problem_list_base_bill_code ON stride_problem_list(base_bill_code (16));
-
-
--- pat_enc_dx.csv -- Encounter diagnoses (may be multiple per encounter)
--- pat_enc_profee_dx_px.csv -- Encounter procedures and linked diagnosis and department
--- pat_enc_dept.csv -- Encounter department (redundant with pat_enc)
-
-
--- Hospital account encounter data
--- pat_enc_hsp_acct_cpt_codes.csv
--- pat_enc_hsp_acct_dx.csv
--- pat_enc_hsp_acct_icd_px.csv
-
-
-
--- ICD9 mapping
-CREATE TABLE stride_icd9_cm
-(
- cui TEXT,
- ispref TEXT,
- aui TEXT,
- tty TEXT,
- code TEXT,
- str TEXT,
- suppress TEXT
-);
-CREATE INDEX index_stride_icd9_cm_code ON stride_icd9_cm(code (16));
+-- Mapping Table for Medications to Common Active Ingredients
+create table stride_mapped_meds
+(
+ medication_id integer,
+ medication_name text,
+ rxcui integer,
+ active_ingredient text
+);
+CREATE INDEX index_stride_mapped_meds_medication_id ON stride_mapped_meds(medication_id);
+ALTER TABLE stride_mapped_meds ADD COLUMN analysis_status INTEGER DEFAULT 1;
+ALTER TABLE stride_mapped_meds ADD COLUMN morphine_po_equivalent FLOAT;
+
+-- Medication Order Data Table. Source headers need " removed, lower-case, and make sure refills column is numeric
+-- Remove " marks and lower-case header lines
+-- (Refills should be numeric 0 not char o. Just swap "o" for "0") (Entry 436981419... refills should be numeric, not "prn")
+create table stride_order_med
+(
+ order_med_id bigint not null,
+ pat_id text,
+ pat_enc_csn_id bigint,
+ ordering_datetime datetime,
+ hosp_admsn_time datetime,
+ hosp_dischrg_time datetime,
+ order_class text,
+ medication_id integer,
+ description text,
+ sig text,
+ quantity text,
+ refills integer,
+ start_date datetime,
+ end_date datetime,
+ dispense_as_written_yn text,
+ reason_for_discontinuation text,
+ enc_type_c integer,
+ encounter_type text,
+ patient_location text,
+ login_department text,
+ display_name text,
+ hv_hospitalist_yn text,
+ med_route text,
+ discontinue_time datetime,
+ changed_from_order_med_id bigint,
+ reason_pended_med_refused text,
+ hv_discr_freq_id bigint,
+ discr_freq_name text,
+ discr_freq_display_name text,
+ discr_freq_type text,
+ discr_freq_number_of_times integer,
+ freq_time_unit text,
+ prn_yn text,
+ freq_duplicate_dose_interval integer,
+ freq_missed_dose_interval integer,
+ freqency_or_period text,
+ hv_discrete_dose text,
+ hv_dose_unit text,
+ non_formulary_yn text,
+ order_status text,
+ min_discrete_dose float,
+ max_discrete_dose float,
+ dose_unit text,
+ is_pending_ord_yn text,
+ modify_track text,
+ med_comments text,
+ usr_select_medicn_id integer,
+ lastdose text,
+ amb_med_disp_name text,
+ refills_remaining integer,
+ rule_based_order_transmittl_yn text,
+ outpat_orderstat_before_admsn text,
+ last_dose_time text,
+ pend_approve_flag text,
+ prn_comment text,
+ med_dis_disp_qty integer,
+ med_dis_disp_unit text
+);
+ALTER TABLE stride_order_med ADD CONSTRAINT stride_order_med_pkey PRIMARY KEY (order_med_id);
+CREATE INDEX index_stride_order_med_pat_id ON stride_order_med(pat_id (16));
+CREATE INDEX index_stride_order_med_ordering_datetime ON stride_order_med(ordering_datetime);
+CREATE INDEX index_stride_order_med_pat_enc_csn_id ON stride_order_med(pat_enc_csn_id);
+CREATE INDEX index_stride_order_med_medication_id ON stride_order_med(medication_id);
+
+
+-- Drug Screen Results
+-- Header row: Remove " marks and lower-case header lines
+create table stride_order_proc_drug_screen
+(
+ order_proc_id bigint,
+ pat_id text,
+ pat_enc_csn_id bigint,
+ ordering_date datetime,
+ proc_id integer,
+ proc_code text,
+ description text,
+ quantity integer,
+ order_status_c text,
+ order_status text,
+ reason_for_cancellation text,
+ future_or_stand text,
+ standing_exp_date datetime,
+ future_expected_compltn_date datetime,
+ standing_occurs integer,
+ stand_orig_occur integer,
+ rfl_priority text,
+ order_priority text,
+ stand_interval text,
+ instantiated_time datetime,
+ ordering_mode text,
+ is_pending_ord_yn text,
+ proc_start_time datetime,
+ proc_end_time datetime,
+ id_of_replaced_order_proc_id bigint,
+ patient_location text,
+ login_department text,
+ specimen_taken_time datetime,
+ specimen_recv_time datetime,
+ result_line integer,
+ component_id integer,
+ component_name text,
+ ord_value text,
+ ref_normal_vals text
+);
+CREATE INDEX index_stride_order_proc_drug_screen_compkey ON stride_order_proc_drug_screen(order_proc_id, result_line);
+CREATE INDEX index_stride_order_proc_drug_screen_pat_id ON stride_order_proc_drug_screen(pat_id (16));
+CREATE INDEX index_stride_order_proc_drug_screen_pat_enc_csn_id ON stride_order_proc_drug_screen(pat_enc_csn_id);
+CREATE INDEX index_stride_order_proc_drug_screen_component_id ON stride_order_proc_drug_screen(component_id);
+
+-- Patient ID list with birth date, gender, race
+-- Header: Lower-case
+create table stride_patient
+(
+ pat_id text,
+ pat_mrn_id bigint,
+ birth_date datetime,
+ gender text,
+ primary_race text
+);
+CREATE INDEX index_patient_pat_id ON stride_patient(pat_id (16));
+CREATE INDEX index_patient_pat_mrn_id ON stride_patient(pat_mrn_id);
+-- Get rid of identifying information
+ALTER TABLE stride_patient ADD COLUMN birth_year INTEGER;
+UPDATE stride_patient SET birth_year = YEAR(birth_date);
+ALTER TABLE stride_patient DROP COLUMN birth_date;
+ALTER TABLE stride_patient DROP COLUMN pat_mrn_id;
+
+-- Populate oncology label based on patient_possible_onco.csv
+ALTER TABLE stride_patient ADD COLUMN possible_oncology INTEGER DEFAULT 0;
+
+
+
+-- Referrals and Consults, includes patient location and login department (lots of inpatient data too)
+-- Header: Lower-case, remove " marks
+-- Look for rfl_priority is not null and ordering_mode = 'Outpatient' to isolate relevant referrals
+CREATE TABLE stride_order_proc_referrals_n_consults
+(
+ order_proc_id bigint,
+ pat_id text,
+ pat_enc_csn_id bigint,
+ ordering_date datetime,
+ proc_id bigint,
+ proc_code text,
+ description text,
+ quantity integer,
+ order_status_c integer,
+ order_status text,
+ reason_for_cancellation text,
+ future_or_stand text,
+ standing_exp_date datetime,
+ future_expected_compltn_date datetime,
+ standing_occurs integer,
+ stand_orig_occur integer,
+ rfl_priority text,
+ hv_hospitalist_yn text,
+ prov_status text,
+ order_priority text,
+ stand_interval text,
+ instantiated_time datetime,
+ ordering_mode text,
+ is_pending_ord_yn text,
+ proc_start_time datetime,
+ proc_ending_time datetime,
+ id_of_replaced_order_proc_id bigint,
+ patient_location text,
+ login_department text,
+ requested_provider_specialty text,
+ reason_for_rferral text,
+ num_visits_authorized_by_rfl integer,
+ requested_department_specialty text
+);
+CREATE INDEX index_stride_order_proc_referrals_n_consults_order_proc_id ON stride_order_proc_referrals_n_consults(order_proc_id);
+CREATE INDEX index_stride_order_proc_referrals_n_consults_pat_id ON stride_order_proc_referrals_n_consults(pat_id (16));
+CREATE INDEX index_stride_order_proc_referrals_n_consults_pat_enc_csn_id ON stride_order_proc_referrals_n_consults(pat_enc_csn_id);
+CREATE INDEX index_stride_order_proc_referrals_n_consults_proc_id ON stride_order_proc_referrals_n_consults(proc_id);
+
+
+-- Encounter dates, types, department. Lots of inpatient data
+-- Header: Lower-case and remove " marks
+CREATE TABLE stride_pat_enc
+(
+ pat_id text,
+ pat_enc_csn_id bigint,
+ contact_date datetime,
+ enc_type text,
+ department_name text,
+ appt_status text,
+ visit_type text,
+ cancel_reason text,
+ hosp_admdn_type text,
+ surgical_service text,
+ phone_reminder_status text,
+ appt_time datetime,
+ er_arrival_time datetime,
+ hosp_admsn_time datetime,
+ hosp_dischrg_time datetime,
+ adm_for_surg_yn text,
+ outgoing_call_yn text,
+ is_walk_in_yn text,
+ cancel_reason_cmt text,
+ admission_confirmation_status text,
+ discharge_confirmation_status text,
+ inpatient_data_id bigint
+);
+CREATE INDEX index_stride_pat_enc_pat_id ON stride_pat_enc(pat_id (16));
+CREATE INDEX index_stride_pat_enc_pat_enc_csn_id ON stride_pat_enc(pat_enc_csn_id);
+CREATE INDEX index_stride_pat_enc_contact_date ON stride_pat_enc(contact_date);
+CREATE INDEX index_stride_pat_enc_inpatient_data_id ON stride_pat_enc(inpatient_data_id);
+
+-- Patient problem lists
+-- Header: Lower-case and remove " marks
+-- Remove comments with quote marks ("cartilage","gastritis",""Nonocclusive...","Stanford Psych...,"Depression/anxiety...) confounded with comma delimiters
+CREATE TABLE stride_problem_list
+(
+ problem_list_id bigint,
+ pat_id text,
+ dx_id bigint,
+ dx_name text,
+ dx_group text,
+ ref_bill_code text,
+ description text,
+ noted_date datetime,
+ resolved_date datetime,
+ problem_cmt text,
+ chronic_yn text,
+ principal_pl_yn text
+);
+CREATE INDEX index_stride_problem_list_problem_list_id ON stride_problem_list(problem_list_id);
+CREATE INDEX index_stride_problem_list_pat_id ON stride_problem_list(pat_id (16));
+CREATE INDEX index_stride_problem_list_dx_id ON stride_problem_list(dx_id);
+CREATE INDEX index_stride_problem_list_dx_name ON stride_problem_list(dx_name (16));
+CREATE INDEX index_stride_problem_list_noted_date ON stride_problem_list(noted_date);
+
+ALTER TABLE stride_problem_list ADD COLUMN base_bill_code TEXT;
+CREATE INDEX index_stride_problem_list_ref_bill_code ON stride_problem_list(ref_bill_code (16));
+CREATE INDEX index_stride_problem_list_base_bill_code ON stride_problem_list(base_bill_code (16));
+
+
+-- pat_enc_dx.csv -- Encounter diagnoses (may be multiple per encounter)
+-- pat_enc_profee_dx_px.csv -- Encounter procedures and linked diagnosis and department
+-- pat_enc_dept.csv -- Encounter department (redundant with pat_enc)
+
+
+-- Hospital account encounter data
+-- pat_enc_hsp_acct_cpt_codes.csv
+-- pat_enc_hsp_acct_dx.csv
+-- pat_enc_hsp_acct_icd_px.csv
+
+
+
+-- ICD9 mapping
+CREATE TABLE stride_icd9_cm
+(
+ cui TEXT,
+ ispref TEXT,
+ aui TEXT,
+ tty TEXT,
+ code TEXT,
+ str TEXT,
+ suppress TEXT
+);
+CREATE INDEX index_stride_icd9_cm_code ON stride_icd9_cm(code (16));
diff --git a/medinfo/db/definition/simdata/dumpSimTables.bat b/medinfo/db/definition/simdata/dumpSimTables.bat
deleted file mode 100644
index 7eb07a1d..00000000
--- a/medinfo/db/definition/simdata/dumpSimTables.bat
+++ /dev/null
@@ -1,21 +0,0 @@
-rem For backup purposes, core adapted tables (original raw tables from STRIDE separated)
-
-set DB_HOST=localhost
-set DB_PORT=5432
-set DB_DSN=medinfo-5year-time
-set DB_USER=jonc101
-
-rem Initialization data on general patient simulation models, deposit into medinfo/db/definition/simdata
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_note_type -f sim_note_type.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_note -f sim_note.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_result -f sim_result.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_state_result -f sim_state_result.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_order_result_map -f sim_order_result_map.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_state_transition -f sim_state_transition.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_state -f sim_state.dump.sql %DB_DSN%
-
-rem Specific user records
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_patient -f sim_patient.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_patient_state -f sim_patient_state.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_user -f sim_user.dump.sql %DB_DSN%
-pg_dump -i -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -a -F p -x -O -t sim_patient_order -f sim_patient_order.dump.sql %DB_DSN%
diff --git a/medinfo/db/definition/simdata/restoreSimTables.bat b/medinfo/db/definition/simdata/restoreSimTables.bat
deleted file mode 100644
index e94a640f..00000000
--- a/medinfo/db/definition/simdata/restoreSimTables.bat
+++ /dev/null
@@ -1,15 +0,0 @@
-set DB_HOST=127.0.0.1
-set DB_DSN=medinfo-5year-time
-set DB_USER=jonc101
-
-rem psql -f sim_state.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-rem psql -f sim_note_type.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-rem psql -f sim_note.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-rem psql -f sim_result.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-rem psql -f sim_order_result_map.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-rem psql -f sim_state_result.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-rem psql -f sim_state_transition.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-rem psql -f sim_user.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-psql -f sim_patient.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-psql -f sim_patient_order.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
-psql -f sim_patient_state.dump.sql -h %DB_HOST% -U %DB_USER% %DB_DSN%
diff --git a/medinfo/db/definition/simdata/sim_note.dump.sql b/medinfo/db/definition/simdata/sim_note.dump.sql
deleted file mode 100644
index 5f3d9c14..00000000
--- a/medinfo/db/definition/simdata/sim_note.dump.sql
+++ /dev/null
@@ -1,47 +0,0 @@
---
--- PostgreSQL database dump
---
-
-SET statement_timeout = 0;
-SET client_encoding = 'UTF8';
-SET standard_conforming_strings = on;
-SET check_function_bodies = false;
-SET client_min_messages = warning;
-
-SET search_path = public, pg_catalog;
-
---
--- Data for Name: sim_note; Type: TABLE DATA; Schema: public; Owner: -
---
-
-COPY sim_note (sim_note_id, note_type_id, author_type_id, service_type_id, relative_state_time, content, sim_state_id) FROM stdin;
-1 1 2001 1500 0 Mr. "B" is a 72 yo man with h/o CHF and CAD, who presented with increasing lower\nextremity edema and weight gain.\n HPI: Mr. "B" has a long history of CHF subsequent to multiple MI's\nlast in 1991. Cardiac cath at that time revealed occlusions in LAD, OMB, and\ncirc with EF of 50%%. ECHO in 1996 showed a dilated LV, EF of 20-25%%, diffuse\nregional wall motion abnormalities, 2+MR and trace TR. His CHF has been managed\nmedically with captopril, lasix, metolazone, and digoxin. Over the past 6mos\nhe has required increasing doses of lasix to control his edema. He was seen\n2 wks ago by his Cardiologist, at which time he was noted to have leg, scrotal\nand penile edema. His lasix dose was increaed to 120 bid without relief of his\nswelling.\n
\n\nOver the past week he and his wife have noticed an increase in his LE edema which then became markedly worse in the past two days. The swelling was accompanied by a weight gain of 10lb in 2 days (175 to 185lb) as well as a decrease in his exercise tolerance. He now becomes dyspneic when rising to get out of bed and has to rest due to SOB when walking on flat ground. He has 2 pillow orthopnea, denies PND. His chronic cough has worsened and is now productive of "transparent" sputum with no hemoptysis. He has occ audible wheeze. Denies CP/pressure/palpitations/diaphoresis. Occ nausea/no vomiting. He eats limited quantities but does not salt or fluid restrict--eating canned soup and drinking 6-8 glasses liquid/day. He has increased urinary freq. but decreased amount. He states he has been taking all prescribed medications.
\n\n
\n\t\n\t\t\n\t\t| \n\t\t\tPMH:\n\t\t | \n\t\t\n\t\t\n\t\t\tCHF: as above \n\t\t\tMI \n\t\t\tAfib: on coumadin \n\t\t\tPacemaker placed in 3/93 for afib/flutter and slow ventricular response \n\t\t\tHTN \n\t\t\tChronic renal insufficiency: BUN/Cr stable on 1/21/98, 52/1.4 \n\t\t\tDM: controlled with glyburide. Admitted for hypoglycemia in 9/97.\n\t\t | \n\t
\n\t\n\t
\n\t\t\n\t\t| \n\t\t\tPSH:\n\t\t | \n\t\t\n\t\t\n\t\t\tTonsillectomy\n\t\t | \n\t
\n\n\t
\n\t\t\n\t\t| \n\t\t\tMED:\n\t\t | \n\t\t\n\t\t\n\t\t\tLasix 120 mg BID \n\t\t\tMetolazone 5 mg gd \n\t\t\tCaptopril 50 mg TID \n\t\t\tDigoxin 0.125 mg qd \n\t\t\tKCl \n\t\t\tcoumadin 4mg qd \n\t\t\tGlyburide 2.5 mg BID \n\t\t\tColace 100 mg BID\n\t\t | \n\t
\n\n\t
\n\t\t\n\t\t\n| ALLERGIES: | \n\t\t\n\t\t\n No Known Drug Allergies | \n\t
\n\n\t\t
\n\t| SMOKING\n\t\n\t | \n\tNone | \n\t
\n\t\n\t| ALCOHOL\n\t\n\t | \n\tNone | \n\t
\n\t\n\t| OTHER SUBSTANCE USE\n\t\n\t | \n\tNone | \n\t
\n\t\t\n\t\t\n| SOCIAL HISTORY: | \n\t\t\n\t\t\n Married for 45 years, sexual active with wife. Three children, 2 grandchildren,\nall healthy and well; all live within 50 miles. Retired school teacher.\nEnjoys model car building. Walks around home, shopping but otherwise not\nphysically active. | \n\t
\n\t\n\t\t\n\t\t\n| FAMILY HISTORY | \n\t\t\n\t\t\n + sister and mother with DM, father with CAD, age onset 50. Brother\nwith leukemia. | \n\t
\n\n\t
\n\t\t\n\t\t| \n\t\t\tROS\n\t\t | \n\t\t\n\t\t\n\t\t\tIf written, would be present here.\n\t\t | \n\t
\n\n\t
\n\t\t\n\t\t| \n\t\t\tPE:\n\t\t | \n\t\t\n\t\t\n\t\t\tVS: T 97.1, P65, BP 116/66, O2Sat 98%% on 2L NC \n\t\t\tGEN: elderly man lying in bed with head up, NAD \n\t\t\tHEENT: NCAT, multiple telangiectasias on face and nose, EOMi, PERRL, OP-benign \n\t\t\tNECK: thyroid not palpable, no LAD, carotic pulse 2+B, no bruits, no JVD \n\t\t\tRESP: +dullness to perc at right base, +ant wheezes, +crackles 1/2 way up chest bilat. \n\t\t\tCOR: rrr, +2/6 holosystolic murmur at apex radiating to axilla, no gallops \n\t\t\tABD: +BS, distended, nontender, no HSM, liver percussed to 9cm at MCL \n\t\t\tPULSES: 2+femoral B, 1+ PT/DP B \n\t\t\tEXT: 3+ edema to lower back, abdomen including genitals, hyperemia over ant., legs bilat,\n\t\t\t\twarm, non-tender; non clubbing, cyanosis \n\t\t\tSKIN: 4 cm ulcer on R buttock with central scabbing, non-tender, no discharge \n\t\t\tNEURO: AOX3; difficulty remembering events, dates; remainder of exam nonfocal\n\t\t | \n\t
\n\n\t
\n\t\t\n\t\t\n\t\t\tLABS/ \n\t\t\tDATA:\n\t\t | \n\t\t\n\t\t\n\t\t\tNa 138, C1 96, BUn 59, Glu 92, K 4.4, CO2 40.8, CR 1.4, WBC 7.9, PLT 349, HCT 43.9, pulses P73 L16 E3 B0 Alk phos 72, Tot prot 5.6, Alb 2.5 T Bili 0.5, AlT 17, AST 52, LDH 275, CPK 229CXR: mildly prominent vessels. Minimal interstitial congestion. Cardiomegaly, no infiltrates. \nECHO 1/27: 1. LV mild dilated (ED=6.0 cm) severaly depressed global systolic function with EF 20-25%%. Extensive area thinning and akinesis: anterior, anteroseptal, anterolateral c/w old infarct |