I need a history check list for my osce exam about anal pain
"anal fissure" OR "anorectal pain"
| Suspected diagnosis | Key history points |
|---|---|
| Anal fissure | Pain during and after a hard stool, bright red blood on the paper, posterior midline. Risk factors are constipation, childbirth and surgery. |
| Thrombosed external haemorrhoid | Sudden painful lump after straining, history of prolapse (Fischer's). |
| Perianal or ischiorectal abscess | Constant throbbing pain, swelling, fever, worse on sitting. Often accompanied by anal discharge. |
| Fistula-in-ano | Previous abscess, persistent or recurrent discharge, intermittent pain. |
| Proctalgia fugax | Brief, severe, stabbing rectal pain at night, lasting seconds to minutes, then gone. |
| Levator ani syndrome | Chronic dull ache, worse on sitting, women more often affected. |
| Crohn disease | Diarrhoea, weight loss, abdominal pain, skin tags, multiple or lateral fissures. |
| Anal or rectal cancer | Age over 50, weight loss, bleeding, change in habit, a non-healing ulcer. |
| STI, proctitis or herpes | Sexual history, ulcers, discharge, tenesmus. |
| Pilonidal disease | Pain in the natal cleft rather than the anus itself. |
Make a one-page PDF checklist I can print for revision
ls -la /tmp/workspace/
mkdir -p /tmp/workspace/anal-pain-osce && cat > /tmp/workspace/anal-pain-osce/make.py <<'EOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import ParagraphStyle from reportlab.lib.units import mm from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph, Table, TableStyle, Spacer, KeepTogether OUT = "/tmp/workspace/anal-pain-osce/Anal_Pain_OSCE_History_Checklist.pdf" NAVY = colors.HexColor("#1F3A5F"); RED = colors.HexColor("#B3261E"); LIGHT = colors.HexColor("#EAF0F7") FS = 7.4 body = ParagraphStyle("b", fontName="Helvetica", fontSize=FS, leading=FS+1.9, leftIndent=9, firstLineIndent=-9) sub = ParagraphStyle("s", parent=body, leftIndent=18, firstLineIndent=-9, textColor=colors.HexColor("#333333")) head = ParagraphStyle("h", fontName="Helvetica-Bold", fontSize=8.4, leading=10.5, textColor=colors.white) title = ParagraphStyle("t", fontName="Helvetica-Bold", fontSize=15, leading=18, textColor=NAVY) tag = ParagraphStyle("tg", fontName="Helvetica", fontSize=7.5, leading=9.5, textColor=colors.HexColor("#555555")) foot = ParagraphStyle("f", fontName="Helvetica-Oblique", fontSize=6.4, leading=8, textColor=colors.HexColor("#666666")) BOX = '<font name="ZapfDingbats" size="6.5">o</font> ' def item(t): return Paragraph(BOX + t, body) def subitem(t): return Paragraph(" - " + t, sub) def section(num, name, items, red=False): col = RED if red else NAVY h = Table([[Paragraph(f"{num}. {name}", head)]], colWidths=[88*mm]) h.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),col),("LEFTPADDING",(0,0),(-1,-1),4), ("TOPPADDING",(0,0),(-1,-1),1.5),("BOTTOMPADDING",(0,0),(-1,-1),2)])) fl = [h, Spacer(1,1.5)] for i in items: fl.append(item(i) if isinstance(i,str) else subitem(i[0])) fl.append(Spacer(1,4)) return fl L = [] L += section(1,"Introduction",[ "Wash hands, introduce self, name and DOB, role", "Explain purpose, get consent", "Offer chaperone, privacy, comfort", "Open question: \"What has brought you in today?\""]) L += section(2,"Pain (SOCRATES)",[ "<b>Site:</b> inside anus, margin, deeper perineum", "<b>Onset:</b> sudden/gradual; trigger (hard stool, diarrhoea, anal sex, childbirth, surgery)", "<b>Character:</b> tearing/razor blades (fissure), throbbing (abscess), dull ache (levator ani)", "<b>Radiation:</b> buttock, sacrum, thigh, genitals", "<b>Associated:</b> bleeding, lump, discharge, fever", "<b>Timing:</b> constant vs only with/after defecation (fissure: minutes to hours after BM); brief nocturnal stabs (proctalgia fugax)", "<b>Exacerbating/relieving:</b> defecation, sitting, sitz baths, analgesia, creams", "<b>Severity:</b> /10; effect on sleep, work, daily life"]) L += section(3,"Associated symptoms",[ "<b>Bleeding:</b> bright red on paper/surface vs mixed/dark; amount", "<b>Lump:</b> painful swelling (abscess, thrombosed pile); prolapse, reduces?", "<b>Discharge:</b> pus, mucus, faeces; recurrent after abscess = fistula?", "<b>Systemic:</b> fever, rigors, malaise", "<b>Bowel habit:</b> constipation, straining, diarrhoea, tenesmus, incontinence", "Pruritus ani / soiling", "Urinary retention or dysuria (deep sepsis, neuro cause)"]) L += section(6,"PMH / PSH",[ "Previous haemorrhoids, fissure, abscess, fistula, anorectal surgery", "IBD, diabetes, HIV / immunosuppression", "Pelvic radiotherapy or malignancy", "Obstetric: vaginal deliveries, perineal tears, forceps", "Previous colonoscopy"]) R = [] R += section(4,"RED FLAGS (ask explicitly)",[ "Unintentional weight loss", "Change in bowel habit > 6 weeks", "Rectal bleeding with change in habit", "Night sweats / persistent fever", "Family history of colorectal cancer", "Non-healing fissure or fissure off the midline (Crohn, TB, syphilis, SCC, leukaemia, HIV ulcer)", "Immunosuppressed / neutropenic / diabetic with fever or severe worsening pain = sepsis until proven otherwise"], red=True) R += section(5,"Differential-driven clues",[ "<b>Fissure:</b> pain on/after hard stool, bright red blood, posterior midline (>90%)", "<b>Thrombosed pile:</b> sudden painful lump after straining", "<b>Perianal abscess:</b> constant throbbing, swelling, fever, worse sitting", "<b>Fistula:</b> prior abscess, recurrent discharge", "<b>Proctalgia fugax:</b> seconds to minutes, night, then gone", "<b>Levator ani:</b> chronic dull ache, worse sitting", "<b>Crohn:</b> diarrhoea, weight loss, skin tags, multiple fissures", "<b>Cancer:</b> age > 50, bleeding, weight loss, ulcer", "<b>STI / proctitis / HSV:</b> sexual hx, ulcers, tenesmus", "<b>Pilonidal:</b> natal cleft pain"]) R += section(7,"Drugs and allergies",[ "Opioids, anticholinergics (constipation)", "Anticoagulants / antiplatelets (bleeding)", "Laxatives; topicals tried (GTN, diltiazem, steroids)", "Steroids, immunosuppressants, chemo", "Allergies"]) R += section(8,"Family, social and sexual hx",[ "FH: colorectal cancer/polyps, IBD, coeliac", "Diet: fibre and fluids; smoking, alcohol, drugs", "Occupation (prolonged sitting)", "Sexual hx (ask permission): receptive anal sex, partners, protection, STIs", "Travel if diarrhoea"]) R += section(9,"ICE and close",[ "<b>Ideas:</b> \"What do you think is causing this?\"", "<b>Concerns:</b> often fear of cancer", "<b>Expectations:</b> \"What were you hoping for today?\"", "Summarise back; \"anything I've missed?\"", "Explain next steps (exam, bloods, referral); thank patient; wash hands"]) def build(): W,H = A4; m = 10*mm doc = BaseDocTemplate(OUT, pagesize=A4, leftMargin=m, rightMargin=m, topMargin=m, bottomMargin=m, title="Anal Pain OSCE History Checklist", author="Orris") fr = Frame(m, m, W-2*m, H-2*m, leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0) doc.addPageTemplates([PageTemplate(id="p", frames=[fr])]) t = Table([[Paragraph("Anal Pain: OSCE History Checklist", title)], [Paragraph("Tick each item as you rehearse. Source: Sleisenger and Fordtran's GI and Liver Disease; Fischer's Mastery of Surgery, 8th ed.", tag)]], colWidths=[W-2*m]) t.setStyle(TableStyle([("LINEBELOW",(0,1),(-1,1),1.2,NAVY),("BOTTOMPADDING",(0,1),(-1,1),4), ("LEFTPADDING",(0,0),(-1,-1),0),("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,0),1)])) gap = 4*mm cols = Table([[L, "", R]], colWidths=[88*mm, gap, 88*mm]) cols.setStyle(TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),("LEFTPADDING",(0,0),(-1,-1),0), ("RIGHTPADDING",(0,0),(-1,-1),0),("TOPPADDING",(0,0),(-1,-1),0)])) story = [t, Spacer(1,5), cols, Spacer(1,3), Paragraph("Exam tips: always ask red flags and sexual history. Ask permission before sensitive questions. In painful fissure, avoid DRE unless diagnosis is in doubt. For revision only, not a clinical guideline.", foot)] doc.build(story) build() EOF cd /tmp/workspace/anal-pain-osce && python make.py && python -c " from pypdf import PdfReader; r=PdfReader('Anal_Pain_OSCE_History_Checklist.pdf'); print(len(r.pages)) import pdfplumber with pdfplumber.open('Anal_Pain_OSCE_History_Checklist.pdf') as p: p.pages[0].to_image(resolution=110).save('preview.png') "
cd /tmp/workspace/anal-pain-osce && python -c " import pdfplumber with pdfplumber.open('Anal_Pain_OSCE_History_Checklist.pdf') as p: pg=p.pages[0]; w=pg.extract_words() print(pg.height, max(x['bottom'] for x in w), min(x['x0'] for x in w), max(x['x1'] for x in w), pg.width) print(pg.extract_text()[:600]) "; ls -la
cd /tmp/workspace/anal-pain-osce && sed -i 's/^FS = 7.4/FS = 8.8/; s/fontSize=8.4, leading=10.5/fontSize=9.8, leading=12.2/; s/size="6.5"/size="7.5"/; s/fontSize=7.5, leading=9.5/fontSize=8, leading=10/; s/fontSize=6.4, leading=8/fontSize=7.4, leading=9.2/' make.py && python make.py && python -c " import pdfplumber with pdfplumber.open('Anal_Pain_OSCE_History_Checklist.pdf') as p: print(len(p.pages)); w=p.pages[0].extract_words(); print(max(x['bottom'] for x in w), p.pages[0].height) "
cd /tmp/workspace/anal-pain-osce && sed -i 's/^FS = 8.8/FS = 10.2/; s/fontSize=9.8, leading=12.2/fontSize=11, leading=13.5/; s/size="7.5"/size="8.5"/' make.py && python make.py && python -c " import pdfplumber with pdfplumber.open('Anal_Pain_OSCE_History_Checklist.pdf') as p: print(len(p.pages)); w=p.pages[0].extract_words(); print(max(x['bottom'] for x in w), p.pages[0].height) "
Anal Pain OSCE History Checklist
PDF Document · PDF
I need a history check list for my surgery osce exam about anal pain
Anal Pain OSCE History Checklist
PDF Document · PDF
| Diagnosis | Key history |
|---|---|
| Fissure | Pain during and after a hard stool, bright red blood, usually posterior midline |
| Thrombosed haemorrhoid | Prolapse history, then sudden intense pain and a hard lump |
| External plexus haematoma | Severe anal pain and swelling, self-limiting, resolves over about 5 days |
| Perianal or ischiorectal abscess | Throbbing pain, swelling, fever, worse sitting |
| Fistula-in-ano | Previous abscess, recurrent discharge |
| Strangulated haemorrhoid | Prolapse, then painful and suppurating, with foul discharge |
| Anal cancer | Bleeding, mass, non-healing ulcer, weight loss, age over 50 |
| Crohn perianal disease | Diarrhoea, weight loss, skin tags, multiple fistulae |
Update the PDF checklist with the surgical additions
cd /tmp/workspace/anal-pain-osce && cat > make_v2.py <<'EOF' import sys from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import ParagraphStyle from reportlab.lib.units import mm from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph, Table, TableStyle, Spacer OUT = "/tmp/workspace/anal-pain-osce/Anal_Pain_OSCE_History_Checklist.pdf" NAVY = colors.HexColor("#1F3A5F"); RED = colors.HexColor("#B3261E"); GREEN = colors.HexColor("#2E6B4F") FS = float(sys.argv[1]) if len(sys.argv) > 1 else 8.2 body = ParagraphStyle("b", fontName="Helvetica", fontSize=FS, leading=FS+1.8, leftIndent=9, firstLineIndent=-9) head = ParagraphStyle("h", fontName="Helvetica-Bold", fontSize=FS+1.2, leading=FS+3.4, textColor=colors.white) title = ParagraphStyle("t", fontName="Helvetica-Bold", fontSize=15, leading=18, textColor=NAVY) tag = ParagraphStyle("tg", fontName="Helvetica", fontSize=7.6, leading=9.4, textColor=colors.HexColor("#555555")) foot = ParagraphStyle("f", fontName="Helvetica-Oblique", fontSize=6.8, leading=8.4, textColor=colors.HexColor("#666666")) BOX = '<font name="ZapfDingbats" size="%s">o</font> ' % (FS-0.8) COLW = 88*mm def section(num, name, items, col=NAVY): h = Table([[Paragraph(f"{num}. {name}", head)]], colWidths=[COLW]) h.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),col),("LEFTPADDING",(0,0),(-1,-1),4), ("TOPPADDING",(0,0),(-1,-1),1.5),("BOTTOMPADDING",(0,0),(-1,-1),2)])) fl = [h, Spacer(1,1.5)] + [Paragraph(BOX + i, body) for i in items] + [Spacer(1,3.5)] return fl L = [] L += section(1,"Opening",[ "Wash hands, introduce self, name/DOB, role, consent", "Offer chaperone and privacy", "\"What has brought you in today?\" Let them talk first"]) L += section(2,"Pain (SOCRATES)",[ "<b>Site:</b> anal verge, inside canal, perianal/buttock", "<b>Onset:</b> sudden/gradual; trigger (hard stool, straining, diarrhoea, anal sex, childbirth, surgery)", "<b>Character:</b> tearing/razor blades (fissure); throbbing (abscess); sudden intense + lump (thrombosed pile); dull ache (levator ani)", "<b>Radiation:</b> buttock, sacrum, thigh, genitals", "<b>Associated:</b> bleeding, lump, discharge, fever", "<b>Timing:</b> constant vs with/after defecation; brief nocturnal stabs (proctalgia fugax)", "<b>Exacerbating/relieving:</b> defecation, sitting, sitz baths, analgesia", "<b>Severity:</b> /10; effect on sleep, daily life"]) L += section(3,"Core surgical questions",[ "<b>Bleeding:</b> on paper / dripping into pan / coating stool / mixed in; bright vs dark; <b>painless</b> = internal piles", "<b>Prolapse:</b> anything comes out? Goes back alone (G2), needs pushing back (G3), stays out (G4), never prolapses (G1)", "<b>Lump:</b> sudden painful lump? Skin tags?", "<b>Discharge:</b> pus, mucus, faeces; recurrent = fistula?", "<b>Previous abscess</b> drained/spontaneous (about 30% of anorectal sepsis)", "<b>Sepsis:</b> fever, rigors, malaise, anorexia, weight loss", "<b>Bowel habit:</b> constipation, straining, diarrhoea, tenesmus", "<b>Continence:</b> faecal/flatus incontinence, soiling, pruritus ani", "<b>Urinary:</b> retention, dysuria (deep sepsis)"]) L += section(4,"PMH, PSH, drugs",[ "Prior haemorrhoids, fissure, abscess, fistula, anorectal surgery", "IBD, diabetes, HIV, pelvic radiotherapy", "Obstetric: vaginal deliveries, tears, forceps", "Previous colonoscopy", "<b>Drugs:</b> anticoagulants/antiplatelets; opioids, anticholinergics; laxatives; topicals tried (GTN, diltiazem, steroid); steroids/immunosuppressants", "<b>Allergies</b> incl. latex and local anaesthetic"]) R = [] R += section(5,"RED FLAGS (ask explicitly)",[ "Unintentional weight loss", "Bowel habit change > 6 weeks; bleeding with change in habit", "Night sweats / persistent fever", "FH colorectal cancer", "Non-healing fissure or off midline: Crohn, TB, syphilis, SCC, leukaemia, HIV ulcer", "Massive bleeding (rare from piles alone): polyp, rectal varices, AVM"], RED) R += section(6,"Secondary causes of anorectal sepsis",[ "AIDS / HIV", "Pelvic inflammatory disease", "Crohn disease", "Malignancy", "Previous anal surgery; diabetes, immunosuppression"], RED) R += section(7,"Differential cues",[ "<b>Fissure:</b> pain on/after hard stool, bright blood, posterior midline", "<b>Thrombosed pile:</b> prolapse history, then sudden pain and hard lump", "<b>External plexus haematoma:</b> severe pain + swelling, resolves about 5 days", "<b>Perianal/ischiorectal abscess:</b> throbbing, swelling, fever, worse sitting", "<b>Fistula:</b> prior abscess, recurrent discharge", "<b>Strangulated pile:</b> painful prolapse, suppurating, foul discharge", "<b>Anal cancer:</b> age > 50, bleeding, mass, ulcer, weight loss", "<b>Crohn:</b> diarrhoea, weight loss, skin tags, multiple fistulae", "<b>Proctalgia fugax / levator ani / STI proctitis / pilonidal</b>"]) R += section(8,"Family and social",[ "FH: colorectal cancer/polyps, IBD, coeliac", "Diet (fibre, fluids), smoking, alcohol, drugs", "Occupation (prolonged sitting)", "Sexual hx (ask permission): receptive anal sex, partners, STIs"]) R += section(9,"Fitness for surgery",[ "Previous anaesthetic problems", "Cardiac / respiratory disease", "Diabetes control", "Anticoagulation plan", "Last meal (emergency I&D likely?)"], GREEN) R += section(10,"ICE and close",[ "<b>Ideas:</b> \"What do you think is going on?\"", "<b>Concerns:</b> cancer? fear of surgery?", "<b>Expectations:</b> \"What were you hoping for today?\"", "Summarise, \"anything I've missed?\"; explain next steps (inspection, DRE/proctoscopy, bloods, referral); thank patient; wash hands"]) W,H = A4; m = 9*mm doc = BaseDocTemplate(OUT, pagesize=A4, leftMargin=m, rightMargin=m, topMargin=m, bottomMargin=m, title="Anal Pain Surgery OSCE History Checklist", author="Orris") doc.addPageTemplates([PageTemplate(id="p", frames=[Frame(m, m, W-2*m, H-2*m, leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0)])]) t = Table([[Paragraph("Anal Pain: Surgery OSCE History Checklist", title)], [Paragraph("Sources: Sleisenger and Fordtran's GI and Liver Disease; Fischer's Mastery of Surgery, 8th ed; Mulholland and Greenfield's Surgery, 7e.", tag)]], colWidths=[W-2*m]) t.setStyle(TableStyle([("LINEBELOW",(0,1),(-1,1),1.2,NAVY),("BOTTOMPADDING",(0,1),(-1,1),4), ("LEFTPADDING",(0,0),(-1,-1),0),("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,0),1)])) cols = Table([[L, "", R]], colWidths=[COLW, 4*mm, COLW]) cols.setStyle(TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),("LEFTPADDING",(0,0),(-1,-1),0),("RIGHTPADDING",(0,0),(-1,-1),0),("TOPPADDING",(0,0),(-1,-1),0)])) doc.build([t, Spacer(1,5), cols, Spacer(1,2), Paragraph("Tips: state the likely diagnosis plus 1 to 2 differentials when summarising. Avoid DRE in an acutely painful fissure unless diagnosis is in doubt (EUA is the alternative). Fever plus severe pain = think sepsis and urgent drainage. For revision only, not a clinical guideline.", foot)]) EOF for fs in 9.2 9.6; do python make_v2.py $fs && python -c " import pdfplumber with pdfplumber.open('Anal_Pain_OSCE_History_Checklist.pdf') as p: w=p.pages[0].extract_words(); print($fs, len(p.pages), round(max(x['bottom'] for x in w)), round(p.pages[0].height-9*72/25.4)) "; done
cd /tmp/workspace/anal-pain-osce && python make_v2.py 10 && python -c " import pdfplumber with pdfplumber.open('Anal_Pain_OSCE_History_Checklist.pdf') as p: w=p.pages[0].extract_words(); print(len(p.pages), round(max(x['bottom'] for x in w)), round(p.pages[0].height-9*72/25.4), round(max(x['x1'] for x in w)), round(p.pages[0].width)) "
Anal Pain OSCE History Checklist
PDF Document · PDF