give detailed answers and make it according to its marks and make it in pdf
mkdir -p /home/daytona/workspace/biomechanics-exam && ls /home/daytona/workspace/biomechanics-exam/
~/biomechanics-exam/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os
OUTPUT_PATH = "/home/daytona/workspace/biomechanics-exam/Biomechanics_Exam_Answers.pdf"
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
rightMargin=2*cm,
leftMargin=2*cm,
topMargin=2.2*cm,
bottomMargin=2.2*cm,
)
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
'Title', parent=styles['Title'],
fontSize=16, spaceAfter=4, spaceBefore=0,
textColor=colors.HexColor('#1a1a2e'), alignment=TA_CENTER,
fontName='Helvetica-Bold'
)
subtitle_style = ParagraphStyle(
'Subtitle', parent=styles['Normal'],
fontSize=10, spaceAfter=2, spaceBefore=0,
textColor=colors.HexColor('#333333'), alignment=TA_CENTER,
fontName='Helvetica'
)
header_style = ParagraphStyle(
'Header', parent=styles['Normal'],
fontSize=9, spaceAfter=1, spaceBefore=0,
textColor=colors.HexColor('#555555'), alignment=TA_CENTER,
fontName='Helvetica'
)
q_style = ParagraphStyle(
'Question', parent=styles['Normal'],
fontSize=11.5, spaceAfter=5, spaceBefore=14,
textColor=colors.HexColor('#0d3b66'), fontName='Helvetica-Bold',
leftIndent=0, borderPad=4,
backColor=colors.HexColor('#e8f4fd'),
borderColor=colors.HexColor('#0d3b66'),
borderWidth=0,
)
ans_style = ParagraphStyle(
'Answer', parent=styles['Normal'],
fontSize=10.5, spaceAfter=5, spaceBefore=4,
textColor=colors.HexColor('#1a1a1a'), fontName='Helvetica',
leading=16, alignment=TA_JUSTIFY,
leftIndent=8
)
bold_ans_style = ParagraphStyle(
'BoldAns', parent=styles['Normal'],
fontSize=10.5, spaceAfter=3, spaceBefore=5,
textColor=colors.HexColor('#1a1a1a'), fontName='Helvetica-Bold',
leading=15, leftIndent=8
)
bullet_style = ParagraphStyle(
'Bullet', parent=styles['Normal'],
fontSize=10.5, spaceAfter=3, spaceBefore=2,
textColor=colors.HexColor('#1a1a1a'), fontName='Helvetica',
leading=15, leftIndent=20, bulletIndent=8
)
sub_heading = ParagraphStyle(
'SubHeading', parent=styles['Normal'],
fontSize=10.5, spaceAfter=3, spaceBefore=6,
textColor=colors.HexColor('#0d3b66'), fontName='Helvetica-Bold',
leading=14, leftIndent=8
)
formula_style = ParagraphStyle(
'Formula', parent=styles['Normal'],
fontSize=11, spaceAfter=5, spaceBefore=5,
textColor=colors.HexColor('#333333'), fontName='Helvetica-Oblique',
leading=14, leftIndent=30,
backColor=colors.HexColor('#f0f8f0'),
borderColor=colors.HexColor('#2d6a4f'),
borderWidth=1, borderPad=5
)
def q_box(num, text, marks):
return Paragraph(
f"Q{num}. {text} <font color='#c0392b'>[{marks} Marks]</font>",
q_style
)
def p(text, style=None):
if style is None:
style = ans_style
return Paragraph(text, style)
def b(text):
return Paragraph(text, bold_ans_style)
def sh(text):
return Paragraph(text, sub_heading)
def bullet(text):
return Paragraph(f"• {text}", bullet_style)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor('#cccccc'), spaceAfter=4, spaceBefore=4)
story = []
# ---- HEADER ----
story.append(Paragraph("GALGOTIAS UNIVERSITY", title_style))
story.append(Paragraph("School of Medical and Allied Sciences", subtitle_style))
story.append(Paragraph("Bachelor of Physiotherapy | Semester End Examination - Jun 2024", header_style))
story.append(Paragraph("Sem II - L2UA204T / L1UB204T / BHPT2004", header_style))
story.append(Spacer(1, 3))
# Info table
info_data = [
[Paragraph("<b>Subject:</b> Basic Principles of Biomechanics", ans_style),
Paragraph("<b>Max Marks:</b> 100", ans_style),
Paragraph("<b>Duration:</b> 180 Minutes", ans_style)]
]
info_table = Table(info_data, colWidths=[8*cm, 4*cm, 4.5*cm])
info_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#dbeafe')),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d3b66')),
('INNERGRID', (0,0), (-1,-1), 0.3, colors.HexColor('#0d3b66')),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
]))
story.append(info_table)
story.append(Spacer(1, 8))
story.append(HRFlowable(width="100%", thickness=1.5, color=colors.HexColor('#0d3b66'), spaceAfter=6))
# =====================================================================
# Q1 - 2 marks
# =====================================================================
story.append(q_box(1, "What is a 3rd Order Lever?", "K1 - 2"))
story.append(p(
"A <b>lever</b> is a rigid bar that rotates about a fixed point called the <b>fulcrum (F)</b>. "
"Levers are classified into three orders based on the relative positions of the Fulcrum (F), "
"Effort (E), and Load/Resistance (R)."
))
story.append(sh("3rd Order Lever:"))
story.append(p(
"In a <b>third-order lever</b>, the <b>Effort (E) lies between the Fulcrum (F) and the Load (R)</b>."
))
story.append(p("<b>Arrangement:</b> F --- E --- R", formula_style))
story.append(p(
"This type of lever does NOT provide mechanical advantage (the effort arm is shorter than the load arm), "
"meaning more force is required than the load being moved. However, it produces a <b>greater range of "
"motion and speed</b> at the point of load application."
))
story.append(b("Example in the Human Body:"))
story.append(p(
"The most common example is <b>elbow flexion by the biceps brachii</b>: "
"The elbow joint acts as the fulcrum, the biceps muscle inserts just distal to the elbow joint (effort), "
"and the hand/forearm weight is the load at the distal end."
))
story.append(hr())
# =====================================================================
# Q2 - 4 marks
# =====================================================================
story.append(q_box(2, "Explain why your Superman punching bag always pops up again?", "K2 - 4"))
story.append(p(
"This question is based on the principle of <b>Centre of Mass (COM), Stability, and Restoring Forces</b>."
))
story.append(sh("Concept: Stability and Restoring Torque"))
story.append(p(
"A standing punching bag (like a bop bag/Superman bag) has a <b>weighted, rounded base</b>. "
"When Superman punches it, the bag tilts and the COM is displaced from its equilibrium position. "
"However, because the base is curved and heavily weighted at the bottom, the bag always returns upright. "
"This is explained by the following biomechanical principles:"
))
story.append(b("1. Low Centre of Mass:"))
story.append(p(
"The bag has dense ballast (sand/water) placed at its lowest point. A low COM means the bag is "
"<b>highly stable</b> - the moment any tilting force displaces it, the weight distribution immediately "
"creates a restoring torque."
))
story.append(b("2. Restoring Torque / Righting Moment:"))
story.append(p(
"When the bag tilts, the vertical line of gravity from the COM falls <b>inside the base of support</b>. "
"The gravitational force acting downward through the displaced COM generates a torque that acts to "
"<b>rotate the bag back to vertical</b>. The torque = Weight x Horizontal distance of COM from pivot point."
))
story.append(b("3. Curved Base:"))
story.append(p(
"The rounded base allows the bag to rock rather than topple. As it leans, the contact point shifts, "
"always ensuring the line of gravity creates a <b>corrective moment</b>."
))
story.append(b("4. Elasticity and Newton's 3rd Law:"))
story.append(p(
"The punch exerts force on the bag; the bag deforms and stores elastic energy, releasing it as "
"the restoring force to spring back."
))
story.append(p(
"<b>Summary:</b> The bag pops up again because its low COM and curved weighted base always generate "
"a restoring torque greater than the toppling torque of any applied force - a perfect example of "
"stable equilibrium in biomechanics."
))
story.append(hr())
# =====================================================================
# Q3 - 6 marks
# =====================================================================
story.append(q_box(3, "Explain Moment Arm. How does Moment Arm affect the ability of a force to rotate a segment?", "K2 - 6"))
story.append(sh("Definition of Moment Arm:"))
story.append(p(
"The <b>moment arm</b> (also called the <b>lever arm</b> or <b>perpendicular distance</b>) is defined as "
"the <b>perpendicular (shortest) distance</b> from the axis of rotation (fulcrum/joint) to the "
"<b>line of action</b> of the applied force."
))
story.append(p("<b>Moment Arm (d) = Perpendicular distance from joint axis to line of force action</b>", formula_style))
story.append(sh("Torque (Moment of Force):"))
story.append(p(
"The rotational effect of a force is called <b>Torque (T)</b>. It is the product of the applied force "
"and the moment arm:"
))
story.append(p("<b>Torque (T) = Force (F) × Moment Arm (d)</b>", formula_style))
story.append(sh("How Moment Arm Affects Rotational Ability:"))
story.append(b("1. Directly Proportional Relationship:"))
story.append(p(
"Torque is directly proportional to the moment arm. If the moment arm is <b>longer</b>, the same force "
"produces a <b>greater torque</b> and more rotation. If the moment arm is <b>shorter</b>, the same force "
"produces <b>less torque</b>."
))
story.append(b("2. Effect of Joint Angle:"))
story.append(p(
"The moment arm of a muscle changes with joint angle. A muscle has its maximum moment arm (and thus "
"maximum torque) at the angle where its line of pull is most perpendicular to the bone. As the joint "
"moves away from this optimal angle, the moment arm decreases and so does torque production."
))
story.append(b("3. Mechanical Advantage:"))
story.append(p(
"Mechanical advantage = Effort arm / Resistance arm. A longer moment arm for effort and shorter for "
"resistance = greater mechanical advantage = less force needed for rotation."
))
story.append(b("4. Clinical Relevance:"))
story.append(p(
"In physiotherapy, tools like extension handles, long-handled reachers, or joint mobilisation "
"techniques exploit large moment arms to apply therapeutic rotational forces with less effort. "
"Example: A door handle placed far from the hinge requires less force to open because the moment arm is longer."
))
story.append(b("Practical Example - Biceps Brachii:"))
story.append(p(
"At 90 degrees of elbow flexion, the biceps tendon pulls nearly perpendicular to the forearm, "
"giving the maximum moment arm and therefore maximum flexion torque. At full extension or full "
"flexion, the line of pull is more parallel to the bone, the moment arm decreases, and torque is reduced."
))
story.append(hr())
# =====================================================================
# Q4 - 9 marks
# =====================================================================
story.append(q_box(4, "Classify Eccentric and Concentric Activity of Quadriceps Muscle with Suitable Diagram", "K3 - 9"))
story.append(sh("Muscle Contraction Types - Overview:"))
story.append(p(
"Muscle contractions are classified based on whether the muscle shortens, lengthens, or stays the same "
"length during force production. Quadriceps femoris is the primary knee extensor and acts in both "
"concentric and eccentric modes during daily activities."
))
story.append(b("A. Concentric Contraction of Quadriceps:"))
story.append(p(
"<b>Definition:</b> A concentric contraction occurs when the muscle generates tension while <b>shortening</b>. "
"The muscle force overcomes the external resistance, and the muscle's origin and insertion move closer together."
))
story.append(bullet("The quadriceps <b>shortens</b> while producing force"))
story.append(bullet("Movement: Knee <b>extension</b> occurs (tibia moves forward)"))
story.append(bullet("The torque produced by the muscle <b>exceeds</b> the opposing torque"))
story.append(bullet("Example: <b>Rising from a chair</b>, climbing stairs (push-off phase), kicking a ball"))
story.append(bullet("Energy: Concentric work consumes more metabolic energy (ATP)"))
story.append(b("B. Eccentric Contraction of Quadriceps:"))
story.append(p(
"<b>Definition:</b> An eccentric contraction occurs when the muscle generates tension while <b>lengthening</b>. "
"The external load overcomes the muscle force, but the muscle controls the movement by providing a "
"braking force."
))
story.append(bullet("The quadriceps <b>lengthens</b> while still producing force"))
story.append(bullet("Movement: Knee <b>flexion</b> occurs while quads resist it"))
story.append(bullet("The opposing (gravity/load) torque <b>exceeds</b> the muscle torque"))
story.append(bullet("Example: <b>Sitting down slowly</b>, descending stairs (landing phase), squatting down"))
story.append(bullet("Produces more force per motor unit than concentric; responsible for DOMS"))
story.append(sh("Comparison Table:"))
comp_data = [
[Paragraph("<b>Feature</b>", bold_ans_style),
Paragraph("<b>Concentric</b>", bold_ans_style),
Paragraph("<b>Eccentric</b>", bold_ans_style)],
[p("Muscle Length"), p("Shortens"), p("Lengthens")],
[p("Movement"), p("Knee Extension"), p("Knee Flexion (controlled)")],
[p("Force vs Load"), p("Muscle > Load"), p("Load > Muscle")],
[p("Energy Use"), p("High (ATP consumed)"), p("Lower (energy stored in elastic)"),],
[p("Example Activity"), p("Kicking, rising from chair"), p("Sitting down, descending stairs")],
[p("DOMS Risk"), p("Low"), p("High")],
]
comp_table = Table(comp_data, colWidths=[4.5*cm, 5.5*cm, 5.5*cm])
comp_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d3b66')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#f7faff'), colors.white]),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d3b66')),
('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0c4de')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
]))
story.append(comp_table)
story.append(Spacer(1, 6))
story.append(sh("Diagram Description (Quadriceps Activity):"))
story.append(p(
"<b>Concentric:</b> [Thigh muscles] → Shortening → Knee moves from flexion to extension (0-90°) "
"| e.g., Rising from chair: Q muscles shorten as knee extends against gravity/body weight."
))
story.append(p(
"<b>Eccentric:</b> [Thigh muscles] → Lengthening → Knee moves from extension to flexion (0-90°) "
"| e.g., Sitting down: Q muscles lengthen while controlling the rate of knee flexion against gravity."
))
story.append(hr())
# =====================================================================
# Q5 - 9 marks
# =====================================================================
story.append(q_box(5, "Identify and Draw a Labelled Diagram of Epimysium, Perimysium and Endomysium", "K3 - 9"))
story.append(sh("Connective Tissue Layers of Skeletal Muscle:"))
story.append(p(
"Skeletal muscle is surrounded and organised by three distinct layers of connective tissue (fascia). "
"These layers provide structural support, transmit forces generated by muscle fibres, carry nerves and "
"blood vessels, and allow coordinated movement."
))
story.append(b("1. Epimysium (Outer Layer):"))
story.append(p(
"<b>Definition:</b> The outermost connective tissue sheath that surrounds the <b>entire muscle</b> as a whole."
))
story.append(bullet("Composed of dense irregular collagen fibres"))
story.append(bullet("Continuous with the deep fascia of the body"))
story.append(bullet("Merges with tendons at either end of the muscle"))
story.append(bullet("Function: Protects the muscle, maintains its shape, transmits overall muscular force to tendon"))
story.append(bullet("Example: The epimysium of biceps brachii is the tough outer sheath you see when dissecting the muscle"))
story.append(Spacer(1, 4))
story.append(b("2. Perimysium (Middle Layer):"))
story.append(p(
"<b>Definition:</b> Connective tissue that <b>surrounds bundles of muscle fibres</b> called <b>fascicles</b> "
"(fasciculi)."
))
story.append(bullet("Each fascicle contains 10-100+ individual muscle fibres"))
story.append(bullet("Perimysium is thicker than endomysium but thinner than epimysium"))
story.append(bullet("Contains blood vessels and nerves supplying each fascicle"))
story.append(bullet("Function: Groups fibres into functional units; contributes to elasticity and pennation angle"))
story.append(bullet("The divisions you see as 'grain' in cooked chicken meat represent fascicles separated by perimysium"))
story.append(Spacer(1, 4))
story.append(b("3. Endomysium (Inner Layer):"))
story.append(p(
"<b>Definition:</b> The delicate connective tissue sheath surrounding each <b>individual muscle fibre</b> "
"(myofibre)."
))
story.append(bullet("Composed of fine reticular fibres (type III collagen)"))
story.append(bullet("Intimately associated with the basal lamina of each muscle cell"))
story.append(bullet("Contains capillaries and nerve endings (motor end plates)"))
story.append(bullet("Function: Transmits force from individual fibre to tendon; facilitates diffusion of nutrients"))
story.append(Spacer(1, 5))
story.append(sh("Labelled Diagram (Textual Representation):"))
# ASCII-style diagram as table
diag_data = [
[Paragraph("<b>MUSCLE STRUCTURE - CONNECTIVE TISSUE LAYERS</b>", ParagraphStyle(
'diag_title', parent=styles['Normal'], fontSize=10, fontName='Helvetica-Bold',
alignment=TA_CENTER, textColor=colors.white
))],
[Paragraph(
"""
<b>ENTIRE MUSCLE</b>
┌─────────────────────────────────────────────────────┐
│ EPIMYSIUM (surrounds entire muscle) │
│ ┌─────────────────────────────────────────────┐ │
│ │ FASCICLE (bundle of fibres) │ │
│ │ PERIMYSIUM (surrounds each fascicle) │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ MUSCLE FIBRE (single cell) │ │ │
│ │ │ ENDOMYSIUM (surrounds each fibre) │ │ │
│ │ │ [contains: myofibrils, nuclei, │ │ │
│ │ │ sarcolemma, sarcoplasm] │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
""",
ParagraphStyle('diag', parent=styles['Code'], fontSize=8.5,
fontName='Courier', leftIndent=10, textColor=colors.HexColor('#1a1a1a'))
)]
]
diag_table = Table(diag_data, colWidths=[15.5*cm])
diag_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), colors.HexColor('#0d3b66')),
('BACKGROUND', (0,1), (0,1), colors.HexColor('#f0f4fa')),
('BOX', (0,0), (-1,-1), 1, colors.HexColor('#0d3b66')),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(diag_table)
story.append(hr())
# =====================================================================
# Q6 - 10 marks
# =====================================================================
story.append(q_box(6, "Explain how Immobilization affects Joint Structures", "K5 - 10"))
story.append(p(
"Immobilization refers to restriction of joint movement, either therapeutically (casting, splinting, "
"bed rest) or pathologically (pain-induced guarding). While sometimes clinically necessary, prolonged "
"immobilization has well-documented detrimental effects on all joint structures."
))
story.append(sh("1. Effects on Articular Cartilage:"))
story.append(bullet("Articular cartilage depends on <b>cyclical loading and synovial fluid diffusion</b> for nutrition"))
story.append(bullet("Immobilization causes <b>cartilage atrophy</b> - loss of proteoglycans (especially aggrecan)"))
story.append(bullet("<b>Chondrocyte death</b> and reduction in cartilage matrix occur within weeks"))
story.append(bullet("Fibrofatty connective tissue (pannus) may invade the joint space"))
story.append(bullet("Leads to <b>degenerative joint changes</b> resembling early osteoarthritis"))
story.append(Spacer(1, 3))
story.append(sh("2. Effects on Synovial Membrane and Synovial Fluid:"))
story.append(bullet("Synovial membrane becomes <b>fibrotic and thickened</b>"))
story.append(bullet("Synovial fluid volume <b>decreases</b> and its viscosity changes"))
story.append(bullet("Reduced lubrication increases friction, further damaging cartilage surfaces"))
story.append(bullet("<b>Adhesions</b> form between synovial folds"))
story.append(Spacer(1, 3))
story.append(sh("3. Effects on Ligaments and Joint Capsule:"))
story.append(bullet("<b>Ligaments weaken</b> - up to 40% loss of tensile strength within 8 weeks"))
story.append(bullet("Collagen fibres lose their <b>organised parallel alignment</b> and become randomly orientated"))
story.append(bullet("Collagen turnover increases but quality is poor (weaker cross-links)"))
story.append(bullet("<b>Joint capsule contracts</b> - loss of extensibility leads to joint stiffness"))
story.append(bullet("Insertion sites (entheses) show bone resorption, weakening bone-ligament attachment"))
story.append(Spacer(1, 3))
story.append(sh("4. Effects on Bone (Subchondral and Periarticular):"))
story.append(bullet("<b>Disuse osteoporosis</b> - bone resorption exceeds formation (Wolff's Law reversal)"))
story.append(bullet("Periarticular bone loses mineral density, increasing fracture risk"))
story.append(bullet("Joint space may narrow due to loss of cartilage and subchondral changes"))
story.append(Spacer(1, 3))
story.append(sh("5. Effects on Muscles (Periarticular):"))
story.append(bullet("<b>Type I muscle fibres</b> (slow-twitch) atrophy more rapidly than Type II"))
story.append(bullet("Muscle cross-sectional area decreases - <b>disuse atrophy</b>"))
story.append(bullet("Decreased protein synthesis and increased protein degradation"))
story.append(bullet("Loss of muscle extensibility contributes to further joint stiffness"))
story.append(Spacer(1, 3))
story.append(sh("6. Effects on Neuromuscular Control:"))
story.append(bullet("Proprioceptors (Golgi tendon organs, muscle spindles) in capsule and ligaments become less sensitive"))
story.append(bullet("Reduced joint position sense - <b>proprioceptive deficit</b>"))
story.append(bullet("Increased risk of re-injury after immobilization is removed"))
story.append(Spacer(1, 3))
story.append(sh("Clinical Implications for Physiotherapy:"))
story.append(p(
"Early mobilisation, continuous passive motion (CPM), and progressive active rehabilitation are key "
"strategies to reverse immobilisation effects. The recovery of ligament strength can take 12+ months "
"even after removal of immobilisation."
))
story.append(hr())
# =====================================================================
# Q7 - 12 marks
# =====================================================================
story.append(q_box(7, "Examine OsteoKinematics and Arthrokinematics of Knee Flexion and Extension in Non-Weight Bearing", "K4 - 12"))
story.append(sh("Key Definitions:"))
story.append(p(
"<b>Osteokinematics:</b> Describes the <b>gross movement of bones</b> in space relative to the three cardinal "
"planes and axes. It describes what movement is occurring (flexion, extension, abduction, etc.) and is "
"observable from outside the body."
))
story.append(p(
"<b>Arthrokinematics:</b> Describes the <b>movement occurring between joint surfaces</b> - the micro-motions "
"at the joint interface. These include Roll, Slide (Glide), and Spin."
))
story.append(sh("Arthrokinematic Fundamentals - Convex-Concave Rule:"))
story.append(p(
"The <b>Concave-Convex Rule</b> states:"
))
story.append(bullet("When a <b>convex surface</b> moves on a fixed concave surface → Roll and Slide occur in <b>OPPOSITE directions</b>"))
story.append(bullet("When a <b>concave surface</b> moves on a fixed convex surface → Roll and Slide occur in the <b>SAME direction</b>"))
story.append(p(
"The <b>knee joint</b> is formed by the convex femoral condyles articulating with the relatively concave "
"tibial plateau (with menisci). In <b>Non-Weight Bearing (NWB)</b>, the tibia is the moving bone while "
"the femur is fixed."
))
story.append(sh("A. KNEE FLEXION (Non-Weight Bearing):"))
story.append(b("Osteokinematics:"))
story.append(bullet("Motion: The <b>tibia moves posteriorly</b> (backward) relative to the femur"))
story.append(bullet("Plane: Sagittal plane"))
story.append(bullet("Axis: Mediolateral (horizontal) axis through the knee"))
story.append(bullet("Range: 0° to approximately 135-140°"))
story.append(b("Arthrokinematics:"))
story.append(p(
"In NWB knee flexion, the <b>tibia (concave surface)</b> moves on the fixed <b>femur (convex surface)</b>. "
"By the concave-convex rule, roll and slide occur in the <b>SAME direction</b>:"
))
story.append(bullet("<b>Tibial Roll:</b> The tibial plateau rolls <b>posteriorly</b> on the femoral condyles"))
story.append(bullet("<b>Tibial Slide/Glide:</b> The tibial plateau also slides <b>posteriorly</b>"))
story.append(bullet("Both roll and slide move in the same direction (posterior) → SAME direction rule for concave on convex"))
story.append(bullet("<b>Medial rotation of tibia</b> occurs at terminal flexion (unlocking mechanism)"))
story.append(Spacer(1, 4))
story.append(sh("B. KNEE EXTENSION (Non-Weight Bearing):"))
story.append(b("Osteokinematics:"))
story.append(bullet("Motion: The <b>tibia moves anteriorly</b> (forward) relative to the femur"))
story.append(bullet("Plane: Sagittal plane"))
story.append(bullet("Axis: Mediolateral axis through the knee"))
story.append(bullet("Range: 135° to 0° (full extension)"))
story.append(b("Arthrokinematics:"))
story.append(p(
"In NWB knee extension, the <b>tibia (concave)</b> again moves on fixed <b>femur (convex)</b>. "
"Roll and slide in the SAME direction (anterior):"
))
story.append(bullet("<b>Tibial Roll:</b> The tibial plateau rolls <b>anteriorly</b> on the femoral condyles"))
story.append(bullet("<b>Tibial Slide/Glide:</b> The tibial plateau slides <b>anteriorly</b>"))
story.append(bullet("<b>Screw-home mechanism:</b> At the last 30° of extension, the tibia <b>laterally rotates</b> (external rotation) to lock the knee - this is the 'screw-home' or 'close-pack' mechanism"))
story.append(bullet("The popliteus muscle unlocks the knee by medially rotating the tibia to initiate flexion"))
story.append(Spacer(1, 4))
story.append(sh("Summary Table:"))
kin_data = [
[Paragraph("<b>Parameter</b>", bold_ans_style),
Paragraph("<b>Knee Flexion (NWB)</b>", bold_ans_style),
Paragraph("<b>Knee Extension (NWB)</b>", bold_ans_style)],
[p("Moving Bone"), p("Tibia"), p("Tibia")],
[p("Fixed Bone"), p("Femur"), p("Femur")],
[p("Surface Rule"), p("Concave on Convex"), p("Concave on Convex")],
[p("Roll Direction"), p("Posterior"), p("Anterior")],
[p("Slide Direction"), p("Posterior (same as roll)"), p("Anterior (same as roll)")],
[p("Rotation"), p("Medial tibial rotation at end"), p("Lateral tibial rotation (screw-home)")],
[p("Muscle Action"), p("Hamstrings (biceps, semimemb, semitend)"), p("Quadriceps femoris")],
]
kin_table = Table(kin_data, colWidths=[4*cm, 5.5*cm, 6*cm])
kin_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1a5276')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#eaf4fb'), colors.white]),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d3b66')),
('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#aed6f1')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
]))
story.append(kin_table)
story.append(hr())
# =====================================================================
# Q8 - 15 marks
# =====================================================================
story.append(q_box(8, "Interpret how COM Changes its Position while Bending, Carrying Heavy Weight in Hand on One Side - with Suitable Example", "K5 - 15"))
story.append(sh("Centre of Mass (COM) - Definition:"))
story.append(p(
"The <b>Centre of Mass (COM)</b> - also called the Centre of Gravity (COG) in a uniform gravitational field - "
"is the <b>theoretical point at which the entire body mass is considered to be concentrated</b>, and through "
"which gravity acts. In the anatomical position, the COM is located approximately <b>anterior to S2</b> "
"(55-57% of standing height from the ground, slightly anterior to the sacrum)."
))
story.append(sh("1. COM Changes During Forward Bending (Trunk Flexion):"))
story.append(p(
"<b>Example: Picking up an object from the floor</b>"
))
story.append(bullet("In the anatomical position, COM is inside the body (anterior to S2)"))
story.append(bullet("As the trunk bends forward, the upper body mass shifts forward and downward"))
story.append(bullet("The COM moves <b>anteriorly and inferiorly</b>"))
story.append(bullet("The COM may move <b>outside the body boundaries</b> - it shifts anterior to the base of support"))
story.append(bullet("To maintain equilibrium, compensatory posterior displacement of the hips/pelvis occurs"))
story.append(bullet("If the COM falls outside the base of support → <b>balance is lost</b> → risk of falling"))
story.append(p(
"<b>Example:</b> A person bending at 90° forward has their COM shifted far forward. "
"To compensate, they push their hips backward (like a deadlift stance) to keep the line of gravity "
"within their base of support."
))
story.append(Spacer(1, 4))
story.append(sh("2. COM Changes When Carrying Heavy Weight in One Hand:"))
story.append(p(
"<b>Example: A patient carrying a heavy shopping bag in the right hand</b>"
))
story.append(bullet("Adding a load to one side shifts the system's COM <b>toward the side of the load</b>"))
story.append(bullet("The total COM = weighted average of all segment COMs including the external load"))
story.append(bullet("With a heavy right-hand load, the combined COM shifts <b>to the right</b>"))
story.append(bullet("To prevent tipping over, the body makes compensatory adjustments:"))
story.append(Spacer(1, 2))
story.append(b("Compensatory Strategies:"))
comp2_data = [
[Paragraph("<b>Strategy</b>", bold_ans_style),
Paragraph("<b>Mechanism</b>", bold_ans_style),
Paragraph("<b>Effect on COM</b>", bold_ans_style)],
[p("Lateral trunk lean (away from load)"), p("Trunk leans left (Trendelenburg-like)"), p("Shifts COM back toward midline")],
[p("Contralateral hip abduction"), p("Left hip abductors contract strongly"), p("Raises left side of pelvis")],
[p("Contralateral arm swing"), p("Left arm swings away"), p("Counterbalances right-side load")],
[p("Widening base of support"), p("Feet spread wider"), p("Increases stability margin")],
[p("Loading side knee/hip flexion"), p("Slight crouch on load side"), p("Lowers overall COM - more stable")],
]
comp2_table = Table(comp2_data, colWidths=[4.5*cm, 5.5*cm, 5.5*cm])
comp2_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d3b66')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#f0f8ff'), colors.white]),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d3b66')),
('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0c4de')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
]))
story.append(comp2_table)
story.append(Spacer(1, 5))
story.append(sh("3. Factors Affecting COM Position:"))
story.append(bullet("<b>Body Segment Masses:</b> Heavier segments (trunk, head) have greater influence on COM location"))
story.append(bullet("<b>Posture:</b> Any asymmetric posture displaces COM away from ideal"))
story.append(bullet("<b>External Loads:</b> Backpacks, hand weights, pregnancy all shift COM"))
story.append(bullet("<b>Gender:</b> Women typically have COM slightly lower than men (wider pelvis)"))
story.append(bullet("<b>Age:</b> COM rises relatively in children (large head ratio); COM position shifts in elderly due to stooped posture"))
story.append(Spacer(1, 4))
story.append(sh("Clinical Relevance in Physiotherapy:"))
story.append(p(
"Understanding COM changes is essential for: <b>gait analysis</b> (detecting Trendelenburg gait), "
"<b>ergonomic advice</b> (recommending backpacks over one-sided carrying), <b>fall prevention</b> "
"in elderly patients, <b>post-surgical rehabilitation</b> (hip replacement - Trendelenburg sign), "
"and <b>sports biomechanics</b> (coaching optimal posture)."
))
story.append(hr())
# =====================================================================
# Q9 - 15 marks
# =====================================================================
story.append(q_box(9, "Determine Torque of Muscle if Moment Arm is 0.5m and Force Produced is 50N", "K5 - 15"))
story.append(sh("Concept - Torque (Moment of Force):"))
story.append(p(
"Torque is the rotational equivalent of linear force. It quantifies the ability of a force to cause "
"rotation around an axis. In biomechanics, torque produced by a muscle determines how effectively "
"that muscle can rotate a body segment."
))
story.append(sh("Formula:"))
story.append(p("<b>Torque (T) = Force (F) × Moment Arm (d)</b>", formula_style))
story.append(p(
"Where:"
))
story.append(bullet("<b>T</b> = Torque (measured in Newton-metres, N·m)"))
story.append(bullet("<b>F</b> = Force applied by the muscle (measured in Newtons, N)"))
story.append(bullet("<b>d</b> = Moment arm / Perpendicular distance from joint axis to line of force action (measured in metres, m)"))
story.append(sh("Given Information:"))
story.append(p("<b>Force (F) = 50 N</b>", formula_style))
story.append(p("<b>Moment Arm (d) = 0.5 m</b>", formula_style))
story.append(sh("Calculation:"))
story.append(p(
"<b>T = F × d</b>", formula_style
))
story.append(p(
"<b>T = 50 N × 0.5 m</b>", formula_style
))
story.append(p(
"<b>T = 25 N·m</b>", formula_style
))
story.append(sh("Answer:"))
story.append(p(
"The <b>Torque produced by the muscle = 25 Newton-metres (N·m)</b>"
))
story.append(sh("Extended Explanation and Clinical Interpretation:"))
story.append(p(
"This torque of 25 N·m represents the rotational force available to move the joint segment. "
"To understand this in context:"
))
story.append(b("1. Significance of Moment Arm:"))
story.append(p(
"If the moment arm were doubled to 1.0m while force stayed at 50N, the torque would be 50 N·m. "
"This illustrates why increasing the moment arm is mechanically advantageous - you get more rotation "
"with the same muscular force."
))
story.append(b("2. Comparison with Resistive Torque:"))
story.append(p(
"For movement to occur, the muscle torque must exceed the resistive torque. If the segment weighs "
"30N and its COM is 0.4m from the joint: Resistive torque = 30 × 0.4 = 12 N·m. Since 25 N·m > 12 N·m, "
"the muscle would successfully move the segment."
))
story.append(b("3. Effect of Joint Angle on Torque:"))
story.append(p(
"The moment arm changes with joint angle. At 90° of elbow flexion, the biceps has its maximum moment arm "
"and produces peak torque. As the elbow approaches full extension or full flexion, the moment arm decreases, "
"reducing the torque despite the same muscular force."
))
story.append(b("4. Net Torque and Direction:"))
story.append(p(
"Torque is a vector quantity with direction (clockwise or counterclockwise). When multiple muscles act "
"around a joint, their individual torques are summed algebraically. The net torque determines the "
"direction of joint motion."
))
story.append(b("5. Practical Physiotherapy Example:"))
story.append(p(
"A physiotherapist applying a manual mobilisation force of 50N at a moment arm of 0.5m from the joint "
"generates 25 N·m of therapeutic torque. Increasing the distance from the joint (e.g., applying force "
"more distally on the limb) increases the therapeutic torque without requiring more force."
))
story.append(sh("Related Torque Calculations:"))
torq_data = [
[Paragraph("<b>Force (N)</b>", bold_ans_style),
Paragraph("<b>Moment Arm (m)</b>", bold_ans_style),
Paragraph("<b>Torque (N·m)</b>", bold_ans_style)],
[p("50"), p("0.5"), p("25 N·m ← Our Answer")],
[p("50"), p("0.3"), p("15 N·m")],
[p("50"), p("1.0"), p("50 N·m")],
[p("100"), p("0.5"), p("50 N·m")],
[p("25"), p("0.5"), p("12.5 N·m")],
]
torq_table = Table(torq_data, colWidths=[4.5*cm, 5.5*cm, 5.5*cm])
torq_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d3b66')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('BACKGROUND', (0,1), (-1,1), colors.HexColor('#d4edda')),
('ROWBACKGROUNDS', (0,2), (-1,-1), [colors.HexColor('#f7faff'), colors.white]),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d3b66')),
('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0c4de')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
]))
story.append(torq_table)
story.append(hr())
# =====================================================================
# Q10 - 18 marks
# =====================================================================
story.append(q_box(10, "Discuss Eccentric and Concentric Contractions with the Help of Suitable Examples", "K6 - 18"))
story.append(sh("Introduction to Muscle Contraction Types:"))
story.append(p(
"Muscle contractions are broadly classified as <b>isotonic</b> (muscle changes length) and <b>isometric</b> "
"(muscle length stays constant). Isotonic contractions are further divided into <b>concentric</b> and "
"<b>eccentric</b> based on whether the muscle shortens or lengthens while generating force. "
"Understanding these contraction types is fundamental to physiotherapy practice, exercise prescription, "
"and rehabilitation."
))
story.append(sh("I. CONCENTRIC CONTRACTION:"))
story.append(b("Definition:"))
story.append(p(
"A <b>concentric contraction</b> occurs when a muscle generates force while <b>shortening</b> in length. "
"The muscle's internal force <b>exceeds</b> the external resistance (load), causing the two attachment "
"points (origin and insertion) to move closer together, resulting in visible joint movement in the "
"direction of muscle pull."
))
story.append(b("Mechanism (Cross-Bridge Theory):"))
story.append(p(
"During concentric contraction, calcium released from the sarcoplasmic reticulum binds troponin, "
"exposing actin binding sites. Myosin heads attach to actin, form cross-bridges, and perform the "
"power stroke - pulling actin filaments toward the M-line (H-zone narrows). As multiple sarcomeres "
"shorten simultaneously, the whole muscle shortens."
))
story.append(b("Characteristics:"))
story.append(bullet("Muscle shortens while producing force"))
story.append(bullet("Joint moves in the direction of muscle's torque (agonist direction)"))
story.append(bullet("Requires more ATP - higher metabolic cost"))
story.append(bullet("Lower force production per cross-bridge compared to eccentric"))
story.append(bullet("Produces approximately <b>80-85% of isometric maximum force</b>"))
story.append(bullet("Leads to less muscle soreness"))
story.append(bullet("Motor unit recruitment: More motor units needed for concentric vs eccentric for same external load"))
story.append(Spacer(1, 5))
story.append(b("Detailed Examples of Concentric Contraction:"))
eg_data = [
[Paragraph("<b>Activity</b>", bold_ans_style),
Paragraph("<b>Muscle</b>", bold_ans_style),
Paragraph("<b>Action</b>", bold_ans_style),
Paragraph("<b>Joint Motion</b>", bold_ans_style)],
[p("Lifting a dumbbell (curl)"), p("Biceps Brachii"), p("Shortens"), p("Elbow Flexion")],
[p("Rising from chair"), p("Quadriceps"), p("Shortens"), p("Knee Extension")],
[p("Climbing stairs (push)"), p("Gluteus Maximus"), p("Shortens"), p("Hip Extension")],
[p("Kicking a ball"), p("Quadriceps + Hip flexors"), p("Shortens"), p("Knee/Hip Extension-Flexion")],
[p("Shoulder press"), p("Deltoid + Triceps"), p("Shortens"), p("Shoulder Abduction + Elbow Extension")],
]
eg_table = Table(eg_data, colWidths=[3.8*cm, 3.5*cm, 3*cm, 5.2*cm])
eg_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#2471a3')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#eaf4fb'), colors.white]),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d3b66')),
('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#aed6f1')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
]))
story.append(eg_table)
story.append(Spacer(1, 8))
story.append(sh("II. ECCENTRIC CONTRACTION:"))
story.append(b("Definition:"))
story.append(p(
"An <b>eccentric contraction</b> occurs when a muscle generates force while <b>lengthening</b>. "
"The external resistance (load or gravity) <b>exceeds</b> the muscle force, causing the origin and "
"insertion to move apart - but the muscle <b>controls</b> this lengthening rather than letting it "
"occur passively. It is often described as a 'controlled yielding' or 'braking' mechanism."
))
story.append(b("Mechanism:"))
story.append(p(
"During eccentric contraction, cross-bridges are still formed but the external force stretches the "
"sarcomere while cross-bridges are still attached. The myosin heads resist the lengthening - they act "
"like molecular brakes. Additionally, titin (elastic protein within sarcomeres) stores elastic energy "
"during stretching, contributing significantly to eccentric force. This is why eccentric contractions "
"produce <b>more force with less metabolic cost</b> but cause more muscle damage."
))
story.append(b("Characteristics:"))
story.append(bullet("Muscle lengthens while producing force (controlled lengthening)"))
story.append(bullet("Joint moves <b>opposite</b> to muscle's torque (the load wins)"))
story.append(bullet("Lower metabolic cost (less ATP consumed) than concentric"))
story.append(bullet("Produces <b>up to 120-160% of isometric maximum force</b>"))
story.append(bullet("Causes <b>Delayed Onset Muscle Soreness (DOMS)</b> - peaks at 24-72 hours"))
story.append(bullet("Fewer motor units required than concentric for same external load"))
story.append(bullet("Can cause <b>microtrauma</b> to muscle fibres - important in resistance training adaptations"))
story.append(bullet("Titin protein plays a major role in generating eccentric force"))
story.append(Spacer(1, 5))
story.append(b("Detailed Examples of Eccentric Contraction:"))
eg2_data = [
[Paragraph("<b>Activity</b>", bold_ans_style),
Paragraph("<b>Muscle</b>", bold_ans_style),
Paragraph("<b>Action</b>", bold_ans_style),
Paragraph("<b>Joint Motion</b>", bold_ans_style)],
[p("Sitting down slowly"), p("Quadriceps"), p("Lengthens"), p("Knee Flexion (controlled)")],
[p("Descending stairs"), p("Quadriceps + Gluteus Max"), p("Lengthens"), p("Knee/Hip Flexion")],
[p("Lowering a dumbbell"), p("Biceps Brachii"), p("Lengthens"), p("Elbow Extension (controlled)")],
[p("Heel strike (gait)"), p("Tibialis Anterior"), p("Lengthens"), p("Plantarflexion (controlled)")],
[p("Landing from a jump"), p("Quadriceps, Gastrocnemius"), p("Lengthens"), p("Shock absorption")],
]
eg2_table = Table(eg2_data, colWidths=[3.8*cm, 3.5*cm, 3*cm, 5.2*cm])
eg2_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#922b21')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#fdf2f2'), colors.white]),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#922b21')),
('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#e8a09a')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
]))
story.append(eg2_table)
story.append(Spacer(1, 8))
story.append(sh("III. COMPREHENSIVE COMPARISON TABLE:"))
final_comp = [
[Paragraph("<b>Parameter</b>", bold_ans_style),
Paragraph("<b>Concentric</b>", bold_ans_style),
Paragraph("<b>Eccentric</b>", bold_ans_style)],
[p("Definition"), p("Muscle shortens while active"), p("Muscle lengthens while active")],
[p("Force vs Resistance"), p("Muscle force > External load"), p("External load > Muscle force")],
[p("Direction of joint motion"), p("Same as muscle pull"), p("Opposite to muscle pull")],
[p("Force Production"), p("~80-85% of isometric max"), p("~120-160% of isometric max")],
[p("Metabolic Cost (ATP)"), p("High"), p("Lower")],
[p("Oxygen consumption"), p("Higher"), p("Lower")],
[p("Motor units recruited"), p("More MUs for same load"), p("Fewer MUs for same load")],
[p("DOMS"), p("Minimal"), p("Significant (24-72 hrs)"),],
[p("Muscle damage"), p("Low"), p("Higher (microtrauma)")],
[p("Titin contribution"), p("Minimal"), p("Significant"),],
[p("Clinical use"), p("Strengthening, power, speed"), p("Tendon rehab, deceleration training")],
[p("Example"), p("Standing up, kicking"), p("Sitting down, descending stairs")],
]
final_table = Table(final_comp, colWidths=[4.5*cm, 5.5*cm, 5.5*cm])
final_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1a5276')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#f2f9ff'), colors.white]),
('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d3b66')),
('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0c4de')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
]))
story.append(final_table)
story.append(Spacer(1, 7))
story.append(sh("IV. CLINICAL SIGNIFICANCE IN PHYSIOTHERAPY:"))
story.append(b("Eccentric Training in Tendinopathy:"))
story.append(p(
"Eccentric exercise programmes (e.g., <b>Alfredson protocol</b> for Achilles tendinopathy) are the "
"gold standard rehabilitation approach. Eccentric loading stimulates collagen synthesis and tendon "
"remodelling. The Alfredson protocol: 3 sets x 15 reps, twice daily, 12 weeks - heel drop exercise "
"with bodyweight and progressing to loaded."
))
story.append(b("Concentric vs. Eccentric in Rehabilitation Progression:"))
story.append(p(
"Early rehabilitation after injury typically begins with <b>isometric exercises</b> (no joint movement), "
"progresses to <b>concentric exercises</b> (controlled shortening), and then advances to <b>eccentric exercises</b> "
"(higher load, more functional). This progression matches tissue healing stages and load tolerance."
))
story.append(b("Isokinetic Testing:"))
story.append(p(
"Physiotherapists use isokinetic dynamometers to measure both concentric and eccentric torque. "
"The hamstring:quadriceps ratio (H:Q ratio) is commonly tested. A normal concentric H:Q ratio is "
"~60%. Eccentric H:Q ratios (eccentric hamstrings: concentric quadriceps) should be >1.0 for "
"adequate knee stability during deceleration tasks."
))
story.append(b("DOMS and Training Adaptation:"))
story.append(p(
"DOMS from eccentric exercise is caused by microtrauma to Z-discs, titin disruption, and inflammatory "
"response. With repeated eccentric bouts, the 'repeated bout effect' reduces subsequent DOMS - the "
"muscle adapts by adding sarcomeres in series, shifting the optimum angle for force production."
))
story.append(Spacer(1, 8))
story.append(HRFlowable(width="100%", thickness=1.5, color=colors.HexColor('#0d3b66'), spaceAfter=4))
story.append(Paragraph(
"- End of Answer Sheet - | Galgotias University, School of Medical and Allied Sciences",
ParagraphStyle('footer', parent=styles['Normal'], fontSize=8.5,
textColor=colors.HexColor('#888888'), alignment=TA_CENTER, fontName='Helvetica-Oblique')
))
doc.build(story)
print(f"PDF created: {OUTPUT_PATH}")
cd /home/daytona/workspace/biomechanics-exam && python generate_pdf.py
ls -lh /home/daytona/workspace/biomechanics-exam/Biomechanics_Exam_Answers.pdf
Biomechanics Exam Answers
PDF Document · PDF
| Q | Topic | Marks | What's Covered |
|---|---|---|---|
| 1 | 3rd Order Lever | 2 | Definition, arrangement (F-E-R), body example (biceps) |
| 2 | Superman Punching Bag | 4 | COM, restoring torque, curved base, Newton's 3rd Law |
| 3 | Moment Arm | 6 | Definition, torque formula, joint angle effects, clinical relevance, biceps example |
| 4 | Eccentric & Concentric Quadriceps | 9 | Both defined, mechanisms, characteristics, comparison table with examples |
| 5 | Epimysium, Perimysium, Endomysium | 9 | All 3 layers defined with composition, function, and a labelled structural diagram |
| 6 | Immobilization effects on joints | 10 | Cartilage, synovium, ligaments, bone, muscle, neuromuscular - all 6 structures |
| 7 | OsteoKinematics & Arthrokinematics of Knee (NWB) | 12 | Definitions, concave-convex rule, full analysis of flexion & extension with screw-home mechanism, summary table |
| 8 | COM during bending & unilateral loading | 15 | COM definition, changes during bending, compensatory strategies during unilateral load, clinical relevance |
| 9 | Torque Calculation | 15 | Formula, full worked solution (T = 50 × 0.5 = 25 N·m), extended explanation, comparison table |
| 10 | Eccentric & Concentric Contractions | 18 | In-depth definitions, cross-bridge mechanism, titin role, detailed example tables, full comparison table, clinical significance (Alfredson protocol, DOMS, isokinetic testing) |