Identification fmt according to narayana Reddy

Reading File
Finding Sources
Finding Sources
Searching the Web

Narayana Reddy forensic medicine identification FMT

Reading Web Page

https://dokumen.pub/the-synopsis-of-forensic-medicine-and-to…

I now have solid content from the Narayana Reddy Synopsis. Here is a comprehensive, well-organized answer on Identification as per K.S. Narayana Reddy's Essentials/Synopsis of Forensic Medicine and Toxicology:

Identification - According to K.S. Narayana Reddy (FMT)

Definition

Identification is the determination of the individuality of a person based on certain physical characteristics - i.e., the exact fixation of personality.

Legal Issues - When Is Identification Necessary?

Persons requiring identification:

  1. Living persons
  2. Recently dead persons
  3. Decomposed bodies
  4. Mutilated bodies
  5. Skeleton

Situations requiring identification:

  1. Criminal cases - persons accused of assault, murder, rape, etc.
  2. Civil cases - disputed wills, identity of heirs, insurance claims
  3. Medicolegal cases - unknown bodies, disasters, mass casualty events

Identification Data (Checklist)

  1. Race and religion
  2. Sex
  3. Age
  4. General development and stature
  5. Complexion and features
  6. External peculiarities - moles, birth marks, scars, tattoos

Primary Characteristics of Identification

(No single feature is reliable alone; a combination is taken)
The primary characteristics are:
  • Sex
  • Age
  • Stature

Methods of Identification

1. RACE

  • Complexion: Indians - brown skin; Europeans - fair; Negroes - black
  • Eyes: Indians - dark-eyed
  • Skull morphology and nasal index also help

2. SEX

Determined by:
  • External genitalia (in living)
  • Skull differences:
    • Male skull: Forehead receding, orbital ridges prominent, orbits square, mastoid process large, muscle ridges marked
    • Female skull: Forehead high, orbital ridges not marked, orbits rounded, mastoid process small, muscle ridges faint
  • Pelvis:
    • Male pelvis: Narrow, heart-shaped inlet, sub-pubic angle acute (<90°)
    • Female pelvis: Wide, oval inlet, sub-pubic angle obtuse (>90°)
  • Chromosomal sex (Barr bodies in females)

3. AGE

  • Teeth eruption - primary (milk) and permanent teeth timing
  • Bone ossification and fusion - epiphyseal union
  • Skin changes - wrinkling, greying of hair
  • Radiological methods - bone age estimation

4. STATURE

  • From long bones using regression formulae (Pearson's formula, Trotter and Gleser formula)
  • Most reliable bone: Femur
  • Stature = 2 x length of femur + 65 cm (approx.)

5. FINGERPRINTS (Dactylography)

  • Developed by Sir Francis Galton and Sir Edward Henry
  • Patterns: Loops (most common ~65%), Whorls (~30%), Arches (~5%)
  • Properties: Permanent, Infallible, Universal, Classifiable
  • Identification established if 12-16 ridge characteristics (minutiae) tally (in India, 8 points suffice)

6. FOOTPRINTS (Podogram)

  • Used at crime scenes
  • Useful for barefoot individuals

7. PALATO PRINTS

  • Rugae of the anterior palate are individual-specific and permanent
  • Used like fingerprints

8. LIP PRINTS (Cheiloscopy)

  • Divided into 8 patterns
  • 24 characteristic details identified
  • Identification established if 7-9 characteristics tally

9. EAR PRINTS

  • Shape of ear lobes and tips of ears are of various types
  • Transparency of ear print at scene overlaid and compared with suspect

10. NOSE PRINTS

  • Lines on the nose and shape of the tip are characteristic

11. DENTAL IDENTIFICATION (Forensic Odontology)

Forensic odontology deals with applying dental science in justice. Dental identification depends on comparison between antemortem records and postmortem findings:
  1. Restorative work
  2. Unusual features
  3. Antemortem vs. postmortem X-ray comparison

Particulars noted for individual dental identification:

  1. Number, spacing, and situation of teeth present:
    • Unerupted and deciduous teeth
    • Permanent teeth
    • Decayed teeth
    • Under/oversized teeth
  2. Number and situation of absent teeth
  3. Extraction evidence - old or recent, healed or unhealed
  4. General condition: erosion, cleanliness
  5. Fillings, crowns, bridges, dentures
  6. Injuries, fractures

12. DNA PROFILING

  • Most definitive method of identification
  • Remains unchanged throughout life
  • Useful in: identification of unknown bodies, disaster victim identification, paternity disputes
  • DNA from blood, semen, hair roots, saliva, teeth, bones

13. CORPUS DELICTI

  • "The body of the offence"
  • Bones are sometimes brought forward to support false charges
  • Conviction does not necessarily depend on corpus delicti if there are eyewitnesses or strong corroborative evidence

Special Methods in Mass Disasters / Decomposed Bodies

  • Visual identification - difficult in fires, explosions, advanced decomposition, mutilation, aircraft accidents, earthquakes
  • Anthropometry (Bertillon System) - measurements of fixed bony parts; now largely replaced by fingerprints
  • Superimposition - skull-photo superimposition (Glaisyer method) to confirm identity
  • Radiological comparison - antemortem vs. postmortem X-rays
  • DNA profiling - gold standard in such situations

Summary Table

FeatureMost Reliable Indicator
Sex from skeletonPelvis (most reliable)
Age from teethMost accurate in young
Stature from boneFemur most reliable
Fingerprint tally points12-16 (India: 8)
Lip print tally7-9 characteristics
Best identification method overallDNA profiling

Source: Based on The Synopsis of Forensic Medicine and Toxicology by Dr. K.S. Narayan Reddy (29th Edition, 2017, Jaypee Publishers) and Essentials of Forensic Medicine and Toxicology (33rd Edition) by K.S. Narayan Reddy & O.P. Murty.

Generate a quick reference PDF on forensic identification for exam prep

Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"

Running Command

mkdir -p /home/daytona/workspace/forensic-id-pdf && python3 -c "from reportlab.lib import colors; print('reportlab OK')"

Writing File

~/forensic-id-pdf/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak

OUTPUT = "/home/daytona/workspace/forensic-id-pdf/Forensic_Identification_Quick_Reference.pdf"

# ── Color palette ──────────────────────────────────────────────
DARK_BLUE   = colors.HexColor("#1A3A5C")
MED_BLUE    = colors.HexColor("#2E6DA4")
LIGHT_BLUE  = colors.HexColor("#D6E8F7")
ACCENT      = colors.HexColor("#E84545")
GOLD        = colors.HexColor("#F0A500")
LIGHT_GREY  = colors.HexColor("#F4F6F9")
MID_GREY    = colors.HexColor("#B0BEC5")
WHITE       = colors.white
BLACK       = colors.black
GREEN       = colors.HexColor("#27AE60")
ORANGE      = colors.HexColor("#E67E22")

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    rightMargin=1.5*cm, leftMargin=1.5*cm,
    topMargin=1.5*cm,   bottomMargin=1.5*cm,
    title="Forensic Identification - Quick Reference",
    author="K.S. Narayana Reddy FMT"
)

W, H = A4
content_width = W - 3*cm

# ── Styles ──────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kw):
    base = styles.get("Normal")
    return ParagraphStyle(name, parent=base, **kw)

title_style = S("Title",
    fontSize=22, leading=28, textColor=WHITE,
    fontName="Helvetica-Bold", alignment=TA_CENTER)

subtitle_style = S("Subtitle",
    fontSize=10, leading=14, textColor=LIGHT_BLUE,
    fontName="Helvetica", alignment=TA_CENTER)

section_header = S("SectionHeader",
    fontSize=12, leading=16, textColor=WHITE,
    fontName="Helvetica-Bold", alignment=TA_LEFT,
    leftIndent=6, spaceAfter=4)

subsection_header = S("SubHeader",
    fontSize=10, leading=14, textColor=DARK_BLUE,
    fontName="Helvetica-Bold", spaceBefore=6, spaceAfter=2)

body = S("Body",
    fontSize=8.5, leading=12, textColor=BLACK,
    fontName="Helvetica", spaceAfter=2)

body_bold = S("BodyBold",
    fontSize=8.5, leading=12, textColor=BLACK,
    fontName="Helvetica-Bold", spaceAfter=2)

bullet = S("Bullet",
    fontSize=8.5, leading=12, textColor=BLACK,
    fontName="Helvetica", leftIndent=12, bulletIndent=4,
    spaceAfter=1)

small = S("Small",
    fontSize=7.5, leading=10, textColor=colors.HexColor("#555555"),
    fontName="Helvetica", spaceAfter=1)

key_fact = S("KeyFact",
    fontSize=8.5, leading=12, textColor=DARK_BLUE,
    fontName="Helvetica-Bold", spaceAfter=1)

highlight = S("Highlight",
    fontSize=8.5, leading=12, textColor=colors.HexColor("#7B0000"),
    fontName="Helvetica-Bold", spaceAfter=1)

# ── Helper builders ─────────────────────────────────────────────
def section_box(text, bg=DARK_BLUE):
    tbl = Table([[Paragraph(text, section_header)]], colWidths=[content_width])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ("RIGHTPADDING",  (0,0), (-1,-1), 8),
        ("ROUNDEDCORNERS", [4]),
    ]))
    return tbl

def info_table(rows, col_widths=None, header_bg=MED_BLUE, alt_bg=LIGHT_GREY):
    """Generic styled table. First row = header."""
    if col_widths is None:
        col_widths = [content_width / len(rows[0])] * len(rows[0])
    tbl = Table(rows, colWidths=col_widths, repeatRows=1)
    style = [
        ("BACKGROUND",    (0, 0), (-1,  0), header_bg),
        ("TEXTCOLOR",     (0, 0), (-1,  0), WHITE),
        ("FONTNAME",      (0, 0), (-1,  0), "Helvetica-Bold"),
        ("FONTSIZE",      (0, 0), (-1,  0), 8.5),
        ("FONTNAME",      (0, 1), (-1, -1), "Helvetica"),
        ("FONTSIZE",      (0, 1), (-1, -1), 8),
        ("LEADING",       (0, 0), (-1, -1), 11),
        ("ALIGN",         (0, 0), (-1, -1), "LEFT"),
        ("VALIGN",        (0, 0), (-1, -1), "TOP"),
        ("TOPPADDING",    (0, 0), (-1, -1), 4),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 4),
        ("LEFTPADDING",   (0, 0), (-1, -1), 6),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 6),
        ("GRID",          (0, 0), (-1, -1), 0.4, MID_GREY),
        ("ROWBACKGROUNDS",(0, 1), (-1, -1), [WHITE, LIGHT_GREY]),
    ]
    tbl.setStyle(TableStyle(style))
    return tbl

def two_col(left_items, right_items, header_left="", header_right=""):
    hw = content_width / 2 - 2
    def make_cell(items, hdr, bg):
        rows = []
        if hdr:
            rows.append(Table([[Paragraph(hdr, S("h", fontSize=8.5, fontName="Helvetica-Bold",
                                                  textColor=WHITE, leading=11))]], 
                              colWidths=[hw],
                              style=[("BACKGROUND",(0,0),(-1,-1),bg),
                                     ("TOPPADDING",(0,0),(-1,-1),3),
                                     ("BOTTOMPADDING",(0,0),(-1,-1),3),
                                     ("LEFTPADDING",(0,0),(-1,-1),6)]))
        for itm in items:
            rows.append(Paragraph(itm, bullet))
        return rows
    left_cell  = make_cell(left_items,  header_left,  MED_BLUE)
    right_cell = make_cell(right_items, header_right, GREEN)
    outer = Table([[left_cell, right_cell]], colWidths=[hw+2, hw+2])
    outer.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),
        ("BOTTOMPADDING",(0,0),(-1,-1),0),
    ]))
    return outer

def badge(text, bg=ACCENT, fg=WHITE):
    p = Paragraph(text, S("b", fontSize=8, fontName="Helvetica-Bold",
                           textColor=fg, leading=10, alignment=TA_CENTER))
    t = Table([[p]], colWidths=[content_width])
    t.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,-1),bg),
        ("TOPPADDING",(0,0),(-1,-1),4),
        ("BOTTOMPADDING",(0,0),(-1,-1),4),
        ("ROUNDEDCORNERS",[3]),
    ]))
    return t

def P(text, style=None):
    return Paragraph(text, style or body)

def SP(n=4):
    return Spacer(1, n)

def HR():
    return HRFlowable(width="100%", thickness=0.5, color=MID_GREY, spaceAfter=4, spaceBefore=4)

# ════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ════════════════════════════════════════════════════════════════
story = []

# ── COVER BANNER ────────────────────────────────────────────────
banner_data = [[
    Paragraph("FORENSIC MEDICINE &amp; TOXICOLOGY", title_style),
    Paragraph("Quick Reference — <b>Identification</b>", 
              S("ts2", fontSize=15, leading=20, textColor=GOLD,
                fontName="Helvetica-Bold", alignment=TA_CENTER)),
    Paragraph("As per K.S. Narayana Reddy | Exam Prep Edition", subtitle_style),
]]
banner = Table([[banner_data[0][0]], [banner_data[0][1]], [banner_data[0][2]]],
               colWidths=[content_width])
banner.setStyle(TableStyle([
    ("BACKGROUND",(0,0),(-1,-1),DARK_BLUE),
    ("TOPPADDING",(0,0),(-1,-1),10),
    ("BOTTOMPADDING",(0,0),(-1,-1),10),
    ("LEFTPADDING",(0,0),(-1,-1),10),
    ("RIGHTPADDING",(0,0),(-1,-1),10),
    ("ROUNDEDCORNERS",[5]),
]))
story += [banner, SP(10)]

# ── SECTION 1: Definition & Legal Issues ────────────────────────
story += [section_box("1.  DEFINITION & LEGAL ISSUES"), SP(4)]

story += [P("<b>Definition:</b> Identification is the determination of the individuality of a person "
            "based on certain physical characteristics — i.e., exact fixation of personality."), SP(4)]

# Two-column: when needed vs. situations
who_rows = [
    "Living persons",
    "Recently dead persons",
    "Decomposed bodies",
    "Mutilated bodies",
    "Skeletal remains",
]
why_rows = [
    "Criminal cases (assault, murder, rape)",
    "Civil cases (wills, insurance, heirs)",
    "Disaster victim identification (DVI)",
    "Identification of unknown bodies",
    "Immigration / impostor detection",
]
story += [two_col(
    ["• " + r for r in who_rows],
    ["• " + r for r in why_rows],
    "WHO needs identification?",
    "WHY / When required?"
), SP(6)]

story += [badge("CORPUS DELICTI = 'Body of the offence' | Conviction does NOT depend solely on corpus delicti "
                "if there are eyewitnesses or strong corroborative evidence", DARK_BLUE, GOLD)]

story += [SP(8)]

# ── SECTION 2: Identification Data ──────────────────────────────
story += [section_box("2.  IDENTIFICATION DATA (Checklist)", MED_BLUE), SP(4)]

id_data = [
    [P("<b>#</b>", small), P("<b>Data Point</b>", small), P("<b>Notes</b>", small)],
    [P("1"), P("Race & Religion"), P("Complexion, facial features, nasal index")],
    [P("2"), P("Sex"), P("Genitalia, pelvis, skull morphology")],
    [P("3"), P("Age"), P("Teeth eruption, bone ossification, skin changes")],
    [P("4"), P("General Development & Stature"), P("Height from long bones; Pearson's / Trotter-Gleser formula")],
    [P("5"), P("Complexion & Features"), P("Skin colour, eye colour, hair")],
    [P("6"), P("External Peculiarities"), P("Moles, birthmarks, scars, tattoos, deformities")],
]
story += [info_table(id_data, col_widths=[0.6*cm, 5*cm, content_width - 5.6*cm - 0.6*cm]), SP(4)]

story += [badge("PRIMARY CHARACTERISTICS (most important triad): SEX  |  AGE  |  STATURE", ACCENT, WHITE)]

story += [SP(10)]

# ── SECTION 3: Sex Determination ────────────────────────────────
story += [section_box("3.  SEX DETERMINATION"), SP(4)]

skull_data = [
    [P("<b>Feature</b>", small), P("<b>MALE Skull</b>", small), P("<b>FEMALE Skull</b>", small)],
    [P("Forehead"),       P("Receding / sloping"),     P("High / vertical")],
    [P("Orbital ridges"), P("Prominent (supraorbital bossing)"), P("Not marked")],
    [P("Orbits"),         P("Square-shaped"),           P("Rounded")],
    [P("Mastoid process"),P("Large"),                   P("Small")],
    [P("Muscle ridges"),  P("Marked / rough"),          P("Faint / smooth")],
    [P("Chin"),           P("Square"),                  P("Pointed")],
    [P("Skull weight"),   P("Heavier"),                 P("Lighter")],
]
story += [P("<b>Skull Differences:</b>", subsection_header)]
story += [info_table(skull_data,
    col_widths=[4*cm, (content_width-4*cm)/2, (content_width-4*cm)/2],
    header_bg=colors.HexColor("#5B4C9A")), SP(6)]

pelvis_data = [
    [P("<b>Feature</b>", small), P("<b>MALE Pelvis</b>", small), P("<b>FEMALE Pelvis</b>", small)],
    [P("General shape"),       P("Narrow, funnel-shaped"),   P("Wide, cylindrical")],
    [P("Pelvic inlet"),        P("Heart-shaped"),             P("Oval / round")],
    [P("Sub-pubic angle"),     P("Acute (<90°)"),             P("Obtuse (>90°)")],
    [P("Obturator foramen"),   P("Round"),                    P("Oval")],
    [P("Acetabulum"),          P("Large, faces laterally"),   P("Small")],
    [P("Greater sciatic notch"),P("Narrow"),                  P("Wide")],
    [P("Sacrum"),              P("Long, narrow, curved"),     P("Short, wide, straight")],
]
story += [P("<b>Pelvis Differences (most reliable bone for sex):</b>", subsection_header)]
story += [info_table(pelvis_data,
    col_widths=[4.5*cm, (content_width-4.5*cm)/2, (content_width-4.5*cm)/2],
    header_bg=colors.HexColor("#5B4C9A")), SP(4)]

story += [badge("PELVIS = Most reliable bone for sex determination | "
                "Accuracy ~95% | Barr bodies for chromosomal sex (females)", GREEN, WHITE)]
story += [SP(10)]

# ── SECTION 4: Age Determination ────────────────────────────────
story += [section_box("4.  AGE DETERMINATION"), SP(4)]

age_teeth = [
    [P("<b>Tooth</b>", small), P("<b>Eruption (Primary)</b>", small), P("<b>Eruption (Permanent)</b>", small)],
    [P("Central incisors"),    P("6–8 months"),    P("6–8 years")],
    [P("Lateral incisors"),    P("8–10 months"),   P("7–9 years")],
    [P("Canines"),             P("16–20 months"),  P("9–12 years")],
    [P("1st Premolars"),       P("—"),             P("10–12 years")],
    [P("2nd Premolars"),       P("—"),             P("11–13 years")],
    [P("1st Molars"),          P("12–16 months"),  P("6–7 years (1st permanent tooth)")],
    [P("2nd Molars"),          P("20–24 months"),  P("12–14 years")],
    [P("3rd Molars (wisdom)"), P("—"),             P("17–25 years")],
]
story += [P("<b>Teeth Eruption:</b>", subsection_header)]
story += [info_table(age_teeth,
    col_widths=[4.5*cm, (content_width-4.5*cm)/2, (content_width-4.5*cm)/2],
    header_bg=ORANGE), SP(4)]

story += [badge("3rd molar = 'Tooth of wisdom' | Erupts 17–25 yrs | Last tooth to erupt | "
                "Used for age in young adults", ORANGE, WHITE)]
story += [SP(6)]

# Bone ossification key facts
story += [P("<b>Bone Ossification (Key Epiphyseal Unions for Age):</b>", subsection_header)]
ossif_data = [
    [P("<b>Bone/Region</b>", small), P("<b>Fusion Age</b>", small), P("<b>Note</b>", small)],
    [P("Iliac crest"),            P("20–25 years"),   P("Last to fuse; useful in young adults")],
    [P("Medial clavicle"),        P("25–30 years"),   P("Last epiphysis to fuse in the body")],
    [P("Elbow (all centres)"),    P("14–16 years"),   P("CRITOE mnemonic")],
    [P("Femur head"),             P("16–18 years"),   P("—")],
    [P("Femur distal"),           P("18–20 years"),   P("—")],
    [P("Wrist (radius distal)"),  P("18–20 years"),   P("—")],
    [P("Vertebral ring"),         P("25 years"),      P("—")],
]
story += [info_table(ossif_data,
    col_widths=[4.5*cm, 3*cm, content_width - 7.5*cm],
    header_bg=ORANGE), SP(4)]

story += [badge("MEDIAL END OF CLAVICLE = Last epiphysis to fuse (~25–30 yrs) — EXAM FAVOURITE", ACCENT, WHITE)]
story += [SP(10)]

# ── SECTION 5: Stature ──────────────────────────────────────────
story += [section_box("5.  STATURE (HEIGHT) ESTIMATION"), SP(4)]

stature_data = [
    [P("<b>Bone</b>", small), P("<b>Reliability</b>", small), P("<b>Formula (approx)</b>", small)],
    [P("Femur"), P("MOST RELIABLE"), P("Height = 2 × femur length + 65 cm")],
    [P("Tibia"), P("2nd most reliable"), P("Trotter & Gleser regression tables")],
    [P("Humerus"), P("Less reliable"), P("Pearson's formula available")],
    [P("Radius / Ulna"), P("Least reliable"), P("Regression formulae used")],
]
story += [info_table(stature_data,
    col_widths=[3.5*cm, 4*cm, content_width - 7.5*cm],
    header_bg=colors.HexColor("#6D4C41")), SP(4)]

story += [P("• <b>Pearson's formula</b>: uses multiple long bones for combined estimate", bullet)]
story += [P("• <b>Trotter & Gleser formula</b>: race- and sex-specific regression equations", bullet)]
story += [P("• <b>Dactylion height</b>: from fingertip to ground when arm is fully extended = body height", bullet)]
story += [SP(10)]

# ── SECTION 6: Fingerprints ─────────────────────────────────────
story += [section_box("6.  FINGERPRINTS (DACTYLOGRAPHY / DACTYLOSCOPY)", MED_BLUE), SP(4)]

fp_data = [
    [P("<b>Pattern</b>", small), P("<b>Frequency</b>", small), P("<b>Key Features</b>", small)],
    [P("Loops"), P("~65% (most common)"), P("Open on one side; enter and exit same side; radial or ulnar")],
    [P("Whorls"), P("~30%"), P("Circular / spiral; two deltas; include plain whorl, central pocket, double loop, accidental")],
    [P("Arches"), P("~5% (least common)"), P("Ridge enters one side, crosses, exits other side; plain or tented")],
]
story += [info_table(fp_data,
    col_widths=[3*cm, 3.5*cm, content_width - 6.5*cm],
    header_bg=MED_BLUE), SP(4)]

story += [P("<b>Properties of Fingerprints (Galton's Laws):</b>", subsection_header)]
props = [
    ("Permanent", "Unchanged from 4th fetal month to decomposition after death"),
    ("Infallible", "No two individuals (including identical twins) have the same prints"),
    ("Universal", "Present in all humans"),
    ("Classifiable", "Can be systematically filed and retrieved"),
]
for k, v in props:
    story += [P(f"• <b>{k}</b>: {v}", bullet)]
story += [SP(4)]

fp_facts = [
    [P("<b>Fact</b>", small), P("<b>Detail</b>", small)],
    [P("Developed by"), P("Sir Francis Galton (classification) + Sir Edward Henry (Henry system, India)")],
    [P("Minutiae (ridge characteristics)"), P("Bifurcation, ending, island, short ridge, enclosure, spur, bridge")],
    [P("Tally points required"), P("12–16 points internationally | 8 points in India (Indian courts)")],
    [P("Latent prints"), P("Invisible; developed by aluminium powder (dark surfaces) / lead carbonate (light surfaces)")],
    [P("Plastic prints"), P("Visible 3D impressions in soft material (wax, putty, blood)")],
    [P("Patent prints"), P("Visible coloured impressions (blood, paint, ink)")],
    [P("Identical twins"), P("Different fingerprints — confirming individuality")],
]
story += [info_table(fp_facts,
    col_widths=[5*cm, content_width - 5*cm],
    header_bg=MED_BLUE), SP(4)]

story += [badge("LOOP (most common 65%) > WHORL (30%) > ARCH (5% least common) — ALWAYS ASKED!", ACCENT, WHITE)]
story += [SP(10)]

# ── SECTION 7: Other Prints ─────────────────────────────────────
story += [section_box("7.  OTHER BIOMETRIC IDENTIFICATION METHODS"), SP(4)]

other_data = [
    [P("<b>Method</b>", small), P("<b>Key Points</b>", small), P("<b>Exam Tip</b>", small)],
    [P("Palato Prints\n(Podogram)"), 
     P("Rugae of anterior palate; permanent & individual-specific; used like fingerprints"),
     P("Survive fires better than fingerprints")],
    [P("Lip Prints\n(Cheiloscopy)"),
     P("8 patterns; 24 characteristic details; if 7–9 tally → identification established"),
     P("7–9 matching points needed")],
    [P("Ear Prints"),
     P("Shape of ear lobes and tips; transparency overlay comparison technique"),
     P("Crime scene ear prints vs. suspect")],
    [P("Nose Prints"),
     P("Lines on nose and shape of nasal tip are characteristic"),
     P("Less commonly tested")],
    [P("Footprints\n(Podoscopy)"),
     P("Plantar skin ridges analysed; useful in barefoot populations; crime scene analysis"),
     P("Similar to fingerprint analysis")],
    [P("Iris Recognition"),
     P("Iris patterns unique and stable; used in biometric ID systems"),
     P("Not a traditional FMT topic but emerging")],
]
story += [info_table(other_data,
    col_widths=[3.5*cm, content_width - 7*cm, 3.5*cm],
    header_bg=colors.HexColor("#6A1B9A")), SP(10)]

# ── SECTION 8: Forensic Odontology ──────────────────────────────
story += [section_box("8.  FORENSIC ODONTOLOGY (DENTAL IDENTIFICATION)", colors.HexColor("#B71C1C")), SP(4)]

story += [P("Forensic odontology applies dental science to aid in the administration of justice. "
            "Dental records survive fire, trauma, and decomposition better than soft tissue.", body), SP(4)]

story += [P("<b>Dental ID depends on comparison of antemortem records vs. postmortem findings:</b>", subsection_header)]
dental_compare = [
    "Restorative work (fillings, crowns, bridges, dentures)",
    "Unusual features (rotations, supernumerary teeth, hypodontia)",
    "Antemortem vs. postmortem X-ray comparison (gold standard)",
]
for d in dental_compare:
    story += [P("• " + d, bullet)]
story += [SP(4)]

story += [P("<b>Particulars Recorded for Dental Identification:</b>", subsection_header)]
dental_data = [
    [P("<b>#</b>", small), P("<b>Feature</b>", small), P("<b>Sub-details</b>", small)],
    [P("1"), P("Teeth present"), P("Unerupted, deciduous, permanent, decayed, under/oversized")],
    [P("2"), P("Absent teeth"), P("Number and location")],
    [P("3"), P("Extractions"), P("Old or recent, healed or unhealed sockets")],
    [P("4"), P("General condition"), P("Erosion, caries, cleanliness, discolouration")],
    [P("5"), P("Restorations"), P("Fillings (amalgam, composite), crowns, bridges, implants")],
    [P("6"), P("Dentures / prostheses"), P("Partial or complete; marked with name if possible")],
    [P("7"), P("Injuries / fractures"), P("Fractured teeth, jaw fractures")],
    [P("8"), P("Bite marks"), P("Compared with suspect's dental cast (forensic bite mark analysis)")],
]
story += [info_table(dental_data,
    col_widths=[0.7*cm, 4.3*cm, content_width - 5*cm],
    header_bg=colors.HexColor("#B71C1C")), SP(4)]

story += [badge("Dental records + X-rays = MOST RELIABLE dental identification method | "
                "Teeth survive 600°C fire and prolonged decomposition", colors.HexColor("#B71C1C"), WHITE)]
story += [SP(10)]

# ── SECTION 9: DNA Profiling ─────────────────────────────────────
story += [section_box("9.  DNA PROFILING (GOLD STANDARD)", GREEN), SP(4)]

dna_data = [
    [P("<b>Aspect</b>", small), P("<b>Detail</b>", small)],
    [P("Definition"), P("Analysis of unique DNA sequences to establish individual identity")],
    [P("Technique"), P("PCR + STR (Short Tandem Repeat) analysis; also RFLP (older method)")],
    [P("Sources"), P("Blood, semen, saliva, hair roots, skin cells, teeth, bones")],
    [P("Properties"), P("Unique to each individual (except identical twins); unchanged throughout life")],
    [P("Uses"), P("Unknown body ID, DVI, paternity disputes, criminal investigations, sexual assault cases")],
    [P("Certainty"), P("Probability of match in unrelated individuals: 1 in 10 billion+")],
    [P("Limitations"), P("Contamination risk; identical twins have identical DNA; requires lab infrastructure")],
    [P("Mtochondrial DNA"), P("Inherited maternally; used when nuclear DNA is degraded (old bones, hair shafts)")],
]
story += [info_table(dna_data,
    col_widths=[4*cm, content_width - 4*cm],
    header_bg=GREEN), SP(6)]

story += [badge("DNA = GOLD STANDARD for identification | Used in DVI, paternity, sexual assault | "
                "Identical twins = same DNA (exception)", GREEN, WHITE)]
story += [SP(10)]

# ── SECTION 10: Anthropometry ────────────────────────────────────
story += [section_box("10. ANTHROPOMETRY (BERTILLON SYSTEM)", colors.HexColor("#4A148C")), SP(4)]

story += [P("<b>Bertillon System</b> (1883): measurements of fixed bony parts in adults. "
            "Now largely replaced by fingerprinting but still tested in exams.", body), SP(4)]
bertillon_items = [
    "Head length and width",
    "Right ear length",
    "Left foot length",
    "Left middle finger length",
    "Left little finger length",
    "Left forearm (cubits) length",
    "Body height (stature)",
    "Sitting height (trunk height)",
    "Width of cheek bones",
]
rows_b = [[P("• " + bertillon_items[i] if i < len(bertillon_items) else ""),
           P("• " + bertillon_items[i+1] if i+1 < len(bertillon_items) else ""),
           P("• " + bertillon_items[i+2] if i+2 < len(bertillon_items) else "")]
          for i in range(0, len(bertillon_items), 3)]
bt = Table(rows_b, colWidths=[content_width/3]*3)
bt.setStyle(TableStyle([
    ("FONTNAME",(0,0),(-1,-1),"Helvetica"),
    ("FONTSIZE",(0,0),(-1,-1),8.5),
    ("LEADING",(0,0),(-1,-1),12),
    ("TOPPADDING",(0,0),(-1,-1),2),
    ("BOTTOMPADDING",(0,0),(-1,-1),2),
    ("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story += [bt, SP(4)]
story += [badge("Bertillon = 9 body measurements | Replaced by fingerprints (more reliable) | "
                "Developed by Alphonse Bertillon, France 1883", colors.HexColor("#4A148C"), WHITE)]
story += [SP(10)]

# ── SECTION 11: Superimposition ──────────────────────────────────
story += [section_box("11. SUPERIMPOSITION (SKULL-PHOTO OVERLAY)", colors.HexColor("#004D40")), SP(4)]

story += [P("Used to confirm identity when a skull is recovered and photographs of a "
            "missing person are available. The skull is photographed at the same angle "
            "as the antemortem photo and images are overlaid.", body), SP(4)]
story += [P("• <b>Glaisyer Method</b>: Optical superimposition using camera and skull", bullet)]
story += [P("• <b>Digital superimposition</b>: Modern photographic software overlay", bullet)]
story += [P("• Landmarks used: orbital margins, nasal bones, dental arcade, zygomatic arch, foramen magnum", bullet)]
story += [P("• Useful in: aircraft accidents, mass graves, identified skeletal remains", bullet)]
story += [SP(10)]

# ── SECTION 12: Quick Exam Memory Box ───────────────────────────
story += [section_box("12. HIGH-YIELD EXAM FACTS — MEMORY TABLE", ACCENT), SP(4)]

hiyield = [
    [P("<b>Question</b>", small), P("<b>Answer</b>", small)],
    [P("Most common fingerprint pattern"),        P("Loop (65%)")],
    [P("Least common fingerprint pattern"),       P("Arch (5%)")],
    [P("Fingerprint tally points (India)"),        P("8 points (12-16 internationally)")],
    [P("Most reliable bone for sex"),              P("Pelvis")],
    [P("Most reliable bone for stature"),          P("Femur")],
    [P("Last epiphysis to fuse"),                  P("Medial end of clavicle (25–30 yrs)")],
    [P("First permanent tooth to erupt"),          P("First molar (6–7 years) / lower central incisor")],
    [P("Last tooth to erupt"),                     P("Third molar / wisdom tooth (17–25 yrs)")],
    [P("Gold standard for identification"),        P("DNA profiling")],
    [P("Lip print ID: tally points needed"),       P("7–9 characteristics")],
    [P("Developed fingerprint classification"),    P("Sir Francis Galton")],
    [P("Henry system of fingerprints (India)"),    P("Sir Edward Henry")],
    [P("Bertillon system"),                        P("9 body measurements; replaced by fingerprints")],
    [P("Superimposition technique"),               P("Skull-photo overlay (Glaisyer Method)")],
    [P("Barr bodies"),                             P("Chromatin mass in females; chromosomal sex determination")],
    [P("Corpus delicti"),                          P("'Body of offence'; conviction possible without it")],
    [P("DNA source when degraded"),                P("Mitochondrial DNA (from bones, hair shafts)")],
    [P("Teeth survive fire up to"),                P("600°C (dental enamel is most heat-resistant tissue)")],
    [P("Primary ID characteristics"),             P("Sex, Age, Stature (SAS)")],
]
story += [info_table(hiyield,
    col_widths=[7*cm, content_width - 7*cm],
    header_bg=ACCENT), SP(8)]

# ── FOOTER NOTE ─────────────────────────────────────────────────
story += [HR()]
story += [P("<i>Quick Reference compiled from: K.S. Narayana Reddy — Essentials of Forensic Medicine &amp; Toxicology "
            "(33rd Ed.) and The Synopsis of Forensic Medicine and Toxicology (29th Ed., 2017). "
            "For exam preparation only. Always cross-reference with your institution's recommended text.</i>",
            S("foot", fontSize=7, leading=10, textColor=MID_GREY, fontName="Helvetica-Oblique",
              alignment=TA_CENTER))]

# ── BUILD ────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF generated: {OUTPUT}")
Running Command

cd /home/daytona/workspace/forensic-id-pdf && python3 generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/forensic-id-pdf/Forensic_Identification_Quick_Reference.pdf

Your PDF is ready! Download it here:

Forensic Identification Quick Reference

PDF Document · PDF


Here's what's packed into the PDF (all based on K.S. Narayana Reddy):
SectionContents
1Definition, Legal Issues, Corpus Delicti
2Identification Data Checklist (6 points)
3Sex Determination - Skull & Pelvis comparison tables
4Age Determination - Teeth eruption table + Bone ossification table
5Stature Estimation - Long bones + formulae
6Fingerprints - Pattern frequencies, Galton's laws, minutiae, latent/patent prints
7Other Biometric Methods - Palato, Lip, Ear, Nose, Foot prints
8Forensic Odontology - Dental ID checklist
9DNA Profiling - Gold standard, sources, uses
10Bertillon Anthropometry - 9 measurements
11Superimposition - Skull-photo overlay
12High-Yield Exam Memory Table - 19 one-liner Q&As
The last section is designed for rapid pre-exam revision with direct one-liner answers to the most commonly asked questions.
This is a shared conversation. Sign in to Orris to start your own chat.