I need a history check list for my osce exam about flank pain
"renal colic"[MeSH Terms] AND "diagnosis"
| Domain | Ask |
|---|---|
| Site | Which side? Left, right or both? Can you point to it? Loin, back or abdomen? |
| Onset | Sudden or gradual? What were you doing? Is this the first episode? |
| Character | Colicky (comes in waves) or constant, dull or sharp? Colicky pain suggests obstruction, such as a stone. Constant dull pain suggests inflammation or capsular distension. |
| Radiation | Does it go to the groin, testis or labia, or inner thigh? Loin to groin suggests a ureteric stone. Does it go to the back or the shoulder tip? |
| Associated symptoms | See sections 3 and 4. |
| Time course | How long has it lasted? Is it constant or does it come and go? Is it getting worse? |
| Exacerbating or relieving factors | Does movement or position change it? Renal colic is typically not relieved by position, and the patient is restless. Musculoskeletal pain is worse with movement and eases with rest. Pleuritic pain is worse on breathing. |
| Severity | Score out of 10. Is it the worst pain of your life? (Think aortic aneurysm.) |
Make a one-page printable PDF of this checklist
ls -la /tmp/workspace/
mkdir -p /tmp/workspace/flank-pain-osce/src /tmp/workspace/flank-pain-osce/output && cat > /tmp/workspace/flank-pain-osce/src/make_pdf.py << 'EOF' from reportlab.lib.pagesizes import A4 from reportlab.lib.units import mm from reportlab.lib import colors from reportlab.lib.styles import ParagraphStyle from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph, Spacer, FrameBreak, KeepTogether, Table, TableStyle OUT = "/tmp/workspace/flank-pain-osce/output/Flank_Pain_OSCE_History_Checklist.pdf" W, H = A4 M = 10*mm HEAD_H = 20*mm FOOT_H = 7*mm GAP = 5*mm colw = (W - 2*M - GAP) / 2 NAVY = colors.HexColor("#1F3A5F") RED = colors.HexColor("#B3261E") LIGHT = colors.HexColor("#E8EEF5") FS = 7.4 LD = 8.9 sec = ParagraphStyle("sec", fontName="Helvetica-Bold", fontSize=8.4, leading=10, textColor=colors.white) item = ParagraphStyle("item", fontName="Helvetica", fontSize=FS, leading=LD, leftIndent=9, firstLineIndent=-9) sub = ParagraphStyle("sub", fontName="Helvetica-Bold", fontSize=FS, leading=LD, textColor=NAVY, spaceBefore=1) redst = ParagraphStyle("red", parent=item, textColor=colors.HexColor("#7A1410")) BOX = '<font name="ZapfDingbats" size="7">q</font> ' def header(text, color=NAVY): t = Table([[Paragraph(text, sec)]], colWidths=[colw]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), color), ("LEFTPADDING", (0,0), (-1,-1), 4), ("RIGHTPADDING", (0,0), (-1,-1), 4), ("TOPPADDING", (0,0), (-1,-1), 1.5), ("BOTTOMPADDING", (0,0), (-1,-1), 2), ])) return t def section(title, items, color=NAVY, style=item): out = [header(title, color), Spacer(1, 1.5)] for it in items: if it.startswith("##"): out.append(Paragraph(it[2:].strip(), sub)) else: out.append(Paragraph(BOX + it, style)) out.append(Spacer(1, 4)) return out left = [] left += section("1. OPENING", [ "Wash hands, introduce self, confirm name + DOB", "Explain role, gain consent, ensure comfort", "Offer analgesia early if in severe pain", "Open question: \"What brought you in today?\"", ]) left += section("2. PAIN (SOCRATES)", [ "<b>Site:</b> which side, loin vs abdomen, point to it", "<b>Onset:</b> sudden or gradual, activity, first episode?", "<b>Character:</b> colicky (waves) vs constant dull/sharp", "<b>Radiation:</b> loin to groin / testis / labia (stone); back; shoulder tip", "<b>Associated:</b> see sections 3 and 4", "<b>Time course:</b> duration, constant vs intermittent, worsening", "<b>Exacerbating/relieving:</b> position or movement; restless in colic, still in peritonism; pleuritic?", "<b>Severity:</b> /10; worst pain ever? (think AAA)", ]) left += section("3. URINARY SYMPTOMS", [ "<b>Haematuria:</b> visible? colour, clots, timing in stream", "Dysuria, frequency, urgency, nocturia", "Cloudy or offensive urine", "<b>Reduced output / anuria</b> (bilateral or solitary kidney)", "Hesitancy, poor stream, incomplete emptying", "Passed gravel or stones; incontinence; catheter", ]) left += section("4. ASSOCIATED SYMPTOMS", [ "##Systemic", "Fever, rigors, sweats, malaise; confusion (elderly)", "Weight loss, night sweats, anorexia", "##GI", "Nausea, vomiting; bowel habit change; PR blood; distension", "##Vascular", "Collapse, syncope, pulsatile sensation (AAA)", "##Other", "Chest pain, cough, pleuritic pain; dermatomal rash (shingles)", "Back pain, leg weakness, saddle numbness, bladder/bowel change", "<b>Women:</b> LMP, pregnancy, PV bleeding/discharge", "<b>Men:</b> testicular pain/swelling, urethral discharge", ]) right = [] right += section("5. PAST MEDICAL HISTORY", [ "##Stones", "Previous stones/colic; family history", "Gout, hyperparathyroidism, IBD, bowel resection, RTA", "Low fluid intake, high salt/protein/oxalate diet, hot job or climate", "##Infection", "Recurrent UTIs, diabetes, immunosuppression, pregnancy", "Catheter, recent instrumentation/surgery, structural abnormality", "##Other", "Known renal disease, single kidney, CKD, hypertension", "CVD, AF (embolic), known aneurysm, malignancy, back trauma", ]) right += section("6. DRUGS + ALLERGIES", [ "Regular + OTC meds (NSAIDs, anticoagulants, antiplatelets)", "Stone-linked: calcium/vit D, diuretics, topiramate, indinavir, antacids", "<b>Allergies</b> (especially NSAIDs); nephrotoxic drugs", ]) right += section("7. FAMILY + SOCIAL HISTORY", [ "FH: stones, polycystic kidneys, renal cancer, aneurysm", "Smoking (RCC, AAA, bladder ca), alcohol", "Occupation, diet, daily fluid intake, recent travel", "Sexual history if indicated; home support", ]) right += section("8. ICE + CLOSE", [ "<b>Ideas:</b> \"What do you think is going on?\"", "<b>Concerns:</b> \"Anything you're worried about?\"", "<b>Expectations:</b> \"What were you hoping for today?\"", "Summarise back; \"Anything else?\"; thank patient", "State next steps: vitals, abdominal + renal angle exam, AAA, urine dip, bloods, imaging", ]) right += section("RED FLAGS (say them out loud)", [ "Fever/rigors + flank pain: infected obstructed system, urosepsis", "Anuria, solitary kidney or bilateral pain: AKI risk", "Shock, collapse, pulsatile mass: ruptured AAA", "Age over 60, first episode, no haematuria: exclude AAA", "Pregnancy: ectopic or obstetric cause", "Neuro deficit / saddle anaesthesia: cauda equina", "Intractable pain or vomiting despite analgesia", ], color=RED, style=redst) right.append(header("DIFFERENTIALS TO KEEP IN MIND")) right.append(Spacer(1, 1.5)) diffs = [ "<b>Urological:</b> ureteric colic, pyelonephritis, pyonephrosis, renal abscess/tumour/infarct, PUJ obstruction, polycystic kidney, loin pain haematuria syndrome", "<b>Vascular:</b> AAA, aortic dissection, renal artery embolism", "<b>GI:</b> appendicitis, cholecystitis, pancreatitis, diverticulitis, bowel obstruction", "<b>Gynae:</b> ectopic, ovarian cyst/torsion", "<b>MSK/neuro:</b> muscle strain, disc/vertebral disease, shingles", "<b>Resp:</b> lower lobe pneumonia, pleurisy", ] for d in diffs: right.append(Paragraph(d, item)) def on_page(c, doc): c.saveState() c.setFillColor(NAVY) c.rect(0, H-HEAD_H, W, HEAD_H, stroke=0, fill=1) c.setFillColor(colors.white) c.setFont("Helvetica-Bold", 16) c.drawString(M, H-10*mm, "OSCE History Checklist: Flank Pain") c.setFont("Helvetica", 8) c.drawString(M, H-15.5*mm, "Tick each item as you rehearse. Order: SOCRATES, urinary, fever/systemic, GI/gynae, PMH, drugs, FH, SH, ICE.") c.setFillColor(colors.HexColor("#555555")) c.setFont("Helvetica-Oblique", 6.5) c.drawString(M, 4*mm, "Study aid for exam practice, not a substitute for clinical judgement. Sources: Textbook of Family Medicine 9e; Campbell-Walsh Urology; Bailey & Love's Short Practice of Surgery.") c.restoreState() doc = BaseDocTemplate(OUT, pagesize=A4, leftMargin=M, rightMargin=M, topMargin=M, bottomMargin=M, title="OSCE History Checklist: Flank Pain", author="Orris") top = H - HEAD_H - 4*mm fh = top - FOOT_H - 2*mm f1 = Frame(M, FOOT_H, colw, fh, leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0, id="l") f2 = Frame(M+colw+GAP, FOOT_H, colw, fh, leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0, id="r") doc.addPageTemplates([PageTemplate(id="p", frames=[f1, f2], onPage=on_page)]) story = left + [FrameBreak()] + right doc.build(story) EOF cd /tmp/workspace/flank-pain-osce && python src/make_pdf.py && python -c " from pypdf import PdfReader r=PdfReader('output/Flank_Pain_OSCE_History_Checklist.pdf');print(len(r.pages))"
cd /tmp/workspace/flank-pain-osce && python -c " import pdfplumber with pdfplumber.open('output/Flank_Pain_OSCE_History_Checklist.pdf') as pdf: p=pdf.pages[0] p.to_image(resolution=80).save('output/preview.png') ws=p.extract_words() print(max(w['bottom'] for w in ws if w['bottom']<p.height-20), p.height) "
cd /tmp/workspace/flank-pain-osce && sed -i 's/^FS = 7.4/FS = 8.8/; s/^LD = 8.9/LD = 10.9/; s/fontSize=8.4, leading=10/fontSize=9.6, leading=11.5/; s/size="7">q/size="8">q/' src/make_pdf.py && python src/make_pdf.py && python -c " import pdfplumber with pdfplumber.open('output/Flank_Pain_OSCE_History_Checklist.pdf') as pdf: print(len(pdf.pages)) p=pdf.pages[0] p.to_image(resolution=80).save('output/preview.png') ws=[w for w in p.extract_words() if w['bottom']<p.height-25] print(max(w['bottom'] for w in ws), p.height) "
cd /tmp/workspace/flank-pain-osce && sed -i 's/^FS = 8.8/FS = 9.5/; s/^LD = 10.9/LD = 11.7/' src/make_pdf.py && python src/make_pdf.py && python -c " import pdfplumber with pdfplumber.open('output/Flank_Pain_OSCE_History_Checklist.pdf') as pdf: print(len(pdf.pages)) p=pdf.pages[0] p.to_image(resolution=90).save('output/preview.png') ws=[w for w in p.extract_words() if w['bottom']<p.height-25] print(max(w['bottom'] for w in ws), p.height) "
cd /tmp/workspace/flank-pain-osce && python -c " import pdfplumber with pdfplumber.open('output/Flank_Pain_OSCE_History_Checklist.pdf') as pdf: p=pdf.pages[0] ws=p.extract_words() print('max x1',max(w['x1'] for w in ws),'page w',p.width) mid=p.width/2 L=[w for w in ws if w['x0']<mid-10 and w['bottom']<p.height-25] R=[w for w in ws if w['x0']>=mid-10 and w['bottom']<p.height-25] print('left bottom',max(w['bottom'] for w in L),'right bottom',max(w['bottom'] for w in R)) " ; ls -la output
Flank Pain OSCE History Checklist
PDF Document · PDF
I need a history check list for my surgery osce exam about flank pain
Make this surgery checklist a one-page printable PDF
mkdir -p /tmp/workspace/flank-pain-osce/src /tmp/workspace/flank-pain-osce/output && cat > /tmp/workspace/flank-pain-osce/src/make_surgery_pdf.py << 'EOF' import sys from reportlab.lib.pagesizes import A4 from reportlab.lib.units import mm from reportlab.lib import colors from reportlab.lib.styles import ParagraphStyle from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph, Spacer, FrameBreak, Table, TableStyle OUT = "/tmp/workspace/flank-pain-osce/output/Surgery_OSCE_Flank_Pain_History_Checklist.pdf" FS = float(sys.argv[1]) if len(sys.argv) > 1 else 8.0 LD = FS * 1.2 W, H = A4 M = 10*mm HEAD_H = 20*mm FOOT_H = 8*mm GAP = 5*mm colw = (W - 2*M - GAP) / 2 NAVY = colors.HexColor("#1F3A5F") RED = colors.HexColor("#B3261E") sec = ParagraphStyle("sec", fontName="Helvetica-Bold", fontSize=FS+1, leading=FS+2.5, textColor=colors.white) item = ParagraphStyle("item", fontName="Helvetica", fontSize=FS, leading=LD, leftIndent=9, firstLineIndent=-9) sub = ParagraphStyle("sub", fontName="Helvetica-Bold", fontSize=FS, leading=LD, textColor=NAVY, spaceBefore=1) redst = ParagraphStyle("red", parent=item, textColor=colors.HexColor("#7A1410")) BOX = '<font name="ZapfDingbats" size="%s">q</font> ' % (FS) def header(text, color=NAVY): t = Table([[Paragraph(text, sec)]], colWidths=[colw]) t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),color), ("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4), ("TOPPADDING",(0,0),(-1,-1),1.5),("BOTTOMPADDING",(0,0),(-1,-1),2)])) return t def section(title, items, color=NAVY, style=item): out = [header(title, color), Spacer(1, 1.5)] for it in items: out.append(Paragraph(it[2:].strip(), sub) if it.startswith("##") else Paragraph(BOX + it, style)) out.append(Spacer(1, 3.5)) return out left = [] left += section("1. OPENING", [ "Wash hands, introduce, confirm name + DOB, consent", "Check comfort; offer analgesia early if severe pain", "Open: \"What has brought you in today?\"", ]) left += section("2. PAIN (SOCRATES) + DISCRIMINATORS", [ "<b>Site:</b> which side; loin vs flank vs abdomen; point to it", "<b>Onset:</b> sudden (AAA, dissection, torsion) or gradual; first episode?", "<b>Character:</b> constant gnawing loin pain = renal pain (capsular distension); lateralised waves lasting 1-2 min = ureteric colic. Can coexist", "<b>Radiation:</b> loin to groin/testis/labium = ureter. NOT to chest or back of leg. Back radiation: AAA, dissection, spine", "<b>Time course:</b> duration, constant vs intermittent, worsening", "<b>Aggravating/relieving:</b> colic = restless, writhing; peritonism = lies still; MSK = movement; pleuritic = breathing", "<b>Severity:</b> /10; worst pain ever?", ]) left += section("3. URINARY SYMPTOMS", [ "<b>Haematuria:</b> visible? colour, clots, timing in stream", "Dysuria, frequency, urgency, nocturia", "Hesitancy, poor stream, incomplete emptying", "Cloudy or offensive urine", "<b>Reduced output / anuria</b> (solitary kidney, bilateral)", "Passed gravel or stones; recent catheter/instrumentation", ]) left += section("4. ASSOCIATED + SURGICAL DIFFERENTIAL SYMPTOMS", [ "<b>Sepsis:</b> fever, rigors, sweats, malaise, confusion", "<b>GI:</b> nausea/vomiting; bowel habit, PR bleeding, flatus; distension", "Migratory RIF pain (appendix); RUQ + fatty foods (biliary); epigastric to back (pancreatitis); LIF + altered bowels (diverticulitis)", "<b>Vascular:</b> collapse, syncope, pulsatile sensation, claudication (AAA: male smoker over 60)", "<b>Women:</b> LMP, pregnancy, PV bleeding/discharge (ectopic, ovarian cyst)", "<b>Men:</b> testicular pain/swelling (torsion), urethral discharge", "<b>Systemic:</b> weight loss, anorexia, night sweats", "<b>Neuro/spine:</b> back pain, leg weakness, saddle numbness, dermatomal rash", "<b>Resp:</b> cough, pleuritic pain (basal pneumonia)", ]) left += section("5. DIFFERENTIALS", [ "<b>Urological:</b> stone, pyelonephritis, pyonephrosis, abscess, tumour, infarct, PUJ obstruction, clot colic, papillary necrosis", "<b>Vascular:</b> ruptured AAA, dissection", "<b>GI:</b> appendicitis, cholecystitis, pancreatitis, diverticulitis, obstruction", "<b>Gynae:</b> ectopic, ovarian cyst/torsion", "<b>Other:</b> MSK, shingles, pneumonia", ]) right = [] right += section("6. PAST MEDICAL + SURGICAL HISTORY", [ "##Stone risk", "Previous stones/colic; family history; gout, hyperparathyroidism, IBD, bowel resection, RTA", "Low fluid intake, high salt/protein diet, hot job or climate", "##Clot colic / papillary necrosis risk", "Anticoagulation, haemophilia, vascular tumours", "Diabetes, regular NSAIDs, sickle cell disease", "##Infection risk", "Recurrent UTIs, diabetes, immunosuppression, pregnancy, catheter, structural abnormality", "##Renal / vascular", "CKD, single kidney, hypertension, known aneurysm, AF, vascular disease", "##Surgical", "Previous abdominal/renal/urological surgery, stents, lithotripsy", "Radiotherapy; recent back/flank trauma; anaesthetic problems", "Cardiac/lung disease and other fitness-for-surgery comorbidities", ]) right += section("7. DRUGS + ALLERGIES", [ "Regular + OTC; anticoagulants, antiplatelets", "NSAIDs (papillary necrosis, CKD risk)", "Stone-linked: calcium/vit D, diuretics, topiramate, indinavir", "<b>Allergies</b> (NSAIDs, contrast); nephrotoxic drugs", ]) right += section("8. FAMILY + SOCIAL HISTORY", [ "FH: stones, polycystic kidneys, renal cancer, aneurysm", "Smoking (AAA, renal/bladder ca), alcohol", "Occupation, diet, daily fluid intake", "Home circumstances + support; <b>last oral intake</b> (theatre?)", ]) right += section("9. ICE + CLOSE", [ "<b>Ideas:</b> \"What do you think is going on?\"", "<b>Concerns:</b> \"Anything you're particularly worried about?\"", "<b>Expectations:</b> \"What were you hoping for today?\"", "Summarise; \"Anything else?\"; thank patient", "Next steps: vitals; abdominal exam (renal angle, pulsatile mass); PV exam in women; testes in men; urine dip + MSU; FBC, U&E, CRP, calcium; pregnancy test; imaging", ]) right += section("RED FLAGS (say them out loud)", [ "Fever/rigors + flank pain: infected obstructed kidney, urgent decompression", "Anuria, solitary kidney, bilateral obstruction: AKI risk", "Shock, collapse, pulsatile mass: ruptured AAA", "Over 60, first episode, no haematuria: exclude AAA", "Pregnancy: ectopic or obstetric cause", "Neuro deficit / saddle anaesthesia: cauda equina", "Intractable pain or vomiting despite analgesia", ], color=RED, style=redst) right += section("OSCE TIPS", [ "Separate renal pain (constant) from ureteric colic (waves) early", "Always raise AAA (older smoker) and ectopic (woman of childbearing age)", "Ask anticoagulant, diabetes and last-meal questions: shows theatre thinking", "Signpost: \"I'd now like to ask about your waterworks.\"", ]) def on_page(c, doc): c.saveState() c.setFillColor(NAVY); c.rect(0, H-HEAD_H, W, HEAD_H, stroke=0, fill=1) c.setFillColor(colors.white) c.setFont("Helvetica-Bold", 16); c.drawString(M, H-10*mm, "Surgery OSCE History Checklist: Flank (Loin) Pain") c.setFont("Helvetica", 8) c.drawString(M, H-15.5*mm, "Tick each item as you rehearse. Flow: SOCRATES, urinary, associated, PMH/surgical, drugs, FH/SH, ICE, close.") c.setFillColor(colors.HexColor("#555555")); c.setFont("Helvetica-Oblique", 6.3) c.drawString(M, 4*mm, "Study aid, not a substitute for clinical judgement. Sources: Bailey & Love's Short Practice of Surgery 28e; S Das, A Manual on Clinical Surgery 13e.") c.restoreState() doc = BaseDocTemplate(OUT, pagesize=A4, leftMargin=M, rightMargin=M, topMargin=M, bottomMargin=M, title="Surgery OSCE History Checklist: Flank Pain", author="Orris") fh = H - HEAD_H - 4*mm - FOOT_H f1 = Frame(M, FOOT_H, colw, fh, 0,0,0,0, id="l") f2 = Frame(M+colw+GAP, FOOT_H, colw, fh, 0,0,0,0, id="r") doc.addPageTemplates([PageTemplate(id="p", frames=[f1, f2], onPage=on_page)]) doc.build(left + [FrameBreak()] + right) EOF cd /tmp/workspace/flank-pain-osce && for fs in 8.6 8.2 7.8 7.4; do python src/make_surgery_pdf.py $fs; python -c " from pypdf import PdfReader print('$fs', len(PdfReader('output/Surgery_OSCE_Flank_Pain_History_Checklist.pdf').pages))"; done
cd /tmp/workspace/flank-pain-osce && best=""; for fs in 9.4 9.2 9.0 8.8 8.6; do python src/make_surgery_pdf.py $fs; n=$(python -c " from pypdf import PdfReader print(len(PdfReader('output/Surgery_OSCE_Flank_Pain_History_Checklist.pdf').pages))"); echo $fs $n; if [ "$n" = "1" ]; then break; fi; done; python -c " import pdfplumber with pdfplumber.open('output/Surgery_OSCE_Flank_Pain_History_Checklist.pdf') as pdf: p=pdf.pages[0]; ws=p.extract_words() print('pages',len(pdf.pages),'max x1',max(w['x1'] for w in ws),'of',p.width) mid=p.width/2 body=[w for w in ws if w['bottom']<p.height-25] print('left bottom',max(w['bottom'] for w in body if w['x0']<mid-10),'right bottom',max(w['bottom'] for w in body if w['x0']>=mid-10),'limit',p.height-10*2.835-8*2.835) "
Surgery OSCE Flank Pain History Checklist
PDF Document · PDF