{"submission_id":"97529e51-fdcd-4705-a70e-b2be897188b4","submission_revision_id":"ca4224cc-4642-4498-bdaa-08ca7177e80b","revision_version":2,"submission_status":"under_review","submitted_at":"2026-08-16T13:33:09.650934Z","submitter_name":"Aditya Prakash","submitter_email":"prakashadityaap@gmail.com","task":{"status":"submitted","version":2,"extra_fields":{},"submitted_at":"2026-08-16T13:33:09.650934+00:00","industry_domain":"Biomedical Engineering","task_short_name":"ar_overlay_projection","operating_system":"Linux","task_description":"Summary: given per-frame rigid-body poses from a tracking system, compose the transform chain, build the imaging-plane equation, intersect a tracked needle ray with that plane, and project the tip + intersection into the camera's distorted pixel image. Output `result.json`. Full conventions, formulas, and the exact output schema are in `SPEC.md`. I also paste it below for your reference\n\n## Goal\nFor every frame in `scene.json`, compute where a planar imaging probe's plane and a\ntracked needle's trajectory land **in the camera's distorted pixel image**, plus\nseveral 3D quantities. Write results to `result.json`.\n\n## Conventions (fixed)\n- A pose `T_A_to_B` is a 4×4 homogeneous matrix mapping a point in frame `A` to\n  frame `B`: `p_B = T_A_to_B · p_A`. Composition: `T_A_to_C = T_B_to_C · T_A_to_B`.\n- Matrices are **row-major** arrays of 4 rows of 4 doubles. Translation is in **mm**.\n- The `image` frame is in **mm**; its `z = 0` plane is the imaging plane.\n\n## Required transform chain (derive it — it is NOT pre-composed in the input)\n```\nT_tracker_to_cam   = T_camref_to_cam · inv(T_camref_to_tracker)\nT_image_to_tracker = T_proberef_to_tracker · T_transducer_to_proberef · T_image_to_transducer\n```\n\n## Pinhole + distortion (Brown–Conrady)\nGiven a point in camera frame `(X, Y, Z)`:\n- If `Z <= 0` the point does **not** project → output `null`.\n- `x = X/Z`, `y = Y/Z`, `r² = x² + y²`\n- `radial = 1 + k1·r² + k2·r⁴ + k3·r⁶`\n- `x_d = x·radial + 2·p1·x·y + p2·(r² + 2x²)`\n- `y_d = y·radial + p1·(r² + 2y²) + 2·p2·x·y`\n- `u = fx·x_d + cx`, `v = fy·y_d + cy`\n\n## Per-frame computations (input order)\n1. **Imaging-plane equation** `(A,B,C,D)` in tracker frame. Map image-frame points\n   `p0=(0,0,0)`, `p1=(1,0,0)`, `p2=(0,1,0)` through `T_image_to_tracker`; normal\n   `n = (p1−p0) × (p2−p0)` (points along image +z); `D = −n·p0`. Report `n`\n   **normalized** as `(A,B,C)`, and `D` computed with the normalized normal.\n2. **Needle in tracker frame**: `tip = T_needleref_to_tracker · tip_needleref`;\n   `dir = rotation(T_needleref_to_tracker) · axis_needleref`, renormalized to unit.\n3. **signed_distance_mm** `= n̂·tip + D̂` (positive on the normal side).\n4. **Ray–plane intersection**: `s = −(n̂·tip + D̂)/(n̂·dir)`, point `= tip + s·dir`.\n   If `|n̂·dir| < 1e-9`, intersection is `null`.\n5. **Projections** to distorted camera pixels: the needle tip, and the intersection\n   point (`null` if behind the camera per the `Z<=0` rule).\n\n## Input: `scene.json`\n```\n{\n  \"camera\": { \"fx\",\"fy\",\"cx\",\"cy\", \"dist\": {\"k1\",\"k2\",\"p1\",\"p2\",\"k3\"} },\n  \"static\": {\n    \"T_camref_to_cam\":        [[4x4]],\n    \"T_transducer_to_proberef\":[[4x4]],\n    \"T_image_to_transducer\":  [[4x4]],\n    \"needle\": { \"tip_needleref\":[x,y,z], \"axis_needleref\":[x,y,z] }\n  },\n  \"frames\": [\n    { \"id\":0, \"T_camref_to_tracker\":[[4x4]],\n              \"T_proberef_to_tracker\":[[4x4]],\n              \"T_needleref_to_tracker\":[[4x4]] }, ...\n  ]\n}\n```\n\n## Output: `result.json`\nA JSON array, one object per input frame **in input order**, exactly these keys:\n```\n{\n  \"id\": 0,\n  \"plane_tracker\": {\"A\":..,\"B\":..,\"C\":..,\"D\":..},\n  \"tip_tracker\": [x,y,z],\n  \"dir_tracker\": [x,y,z],\n  \"signed_distance_mm\": ..,\n  \"intersection_tracker\": [x,y,z] | null,\n  \"tip_px\": [u,v] | null,\n  \"intersection_px\": [u,v] | null\n}\n```\nAny undefined quantity must be JSON `null`. `(A,B,C)` and `dir_tracker` must be unit\nlength. Implement the geometry yourself with Python 3.11 + NumPy only — no OpenCV or\nother vision library projection/pose calls. No network access.\n","software_licensing":"Free/Open Source","evaluation_criteria":null,"verification_method":"Binary pass/fail via `python grader.py result.json <agent_output_file>`. ALL checks must pass for EVERY frame:\n\n1. Structure: JSON array, one object per input frame in input order; each object has exactly the keys id, plane_tracker{A,B,C,D}, tip_tracker, dir_tracker, signed_distance_mm, intersection_tracker, tip_px, intersection_px.\n\n2. Null agreement: a field is null in the submission iff it is null in the reference.\n\n3. tip_tracker, dir_tracker, intersection_tracker, plane_tracker(A,B,C,D): max abs per-component error <= 1e-4. dir_tracker and (A,B,C) must be unit length to 1e-6. Plane-normal / direction sign is fixed by the image +z convention (flipped = fail).\n\n4. signed_distance_mm: abs error <= 1e-4 mm, sign must match.\n\n5. tip_px, intersection_px: Euclidean pixel error <= 1e-2. No partial credit.","software_and_version":"Python 3.11 with NumPy 1.24+ (standard library only otherwise; no OpenCV/vision libraries)","specific_requirements":null,"expected_completion_time":null},"files":[{"file_id":"1d4887c6-03cc-4da9-82e8-b0603419d970","filename":"SPEC.md","category":"input_materials","content_type":"text/markdown","size_bytes":3239},{"file_id":"79ba025c-2c77-4eff-af92-52dfceb4a49e","filename":"scene.json","category":"input_materials","content_type":"application/json","size_bytes":6937},{"file_id":"85d7dee5-825b-464b-adec-e9698e8e9d1b","filename":"result.json","category":"reference_output","content_type":"application/json","size_bytes":1938},{"file_id":"ac956f9c-b48b-4114-88f3-91df173909b6","filename":"grader.py","category":"reference_output","content_type":"text/x-python","size_bytes":6002}],"deep_review":{"overall_verdict":"Strong Accept","review_text":"**Overall Verdict:** Strong Accept — The submission is complete, internally consistent, objectively gradable, and fully reachable with the declared open-source toolchain.\n\n**Completeness Check:**\n- Instruction: Complete — Transform conventions, geometry formulas, distortion model, null behavior, ordering, tolerances, and exact output schema are explicit.\n- Inputs: Complete — `scene.json` is valid JSON with camera parameters, static calibration, needle geometry, and three well-formed rigid-pose frames.\n- Toolchain: Complete — Python 3.11 and NumPy 1.24+ on Linux are freely obtainable; no network, specialized hardware, or proprietary software is required.\n- Reference output: Complete — `result.json` covers all frames and edge cases, including a parallel ray and a behind-camera tip; independent recomputation matched it to floating-point precision.\n- Rubric: Complete — `grader.py` enforces exact structure, frame order, null agreement, finite numeric values, unit vectors, and the stated component and pixel tolerances.\n\n**File and Task Reachability:**\nThe attachment set is `reachable`, and the end-to-end task is `reachable`. `SPEC.md`, `scene.json`, `result.json`, and `grader.py` were all inspected in full; their actual formats and byte counts match the manifest, and no content remained unreviewed. The review environment lacked the declared Python runtime, so the uploaded grader was statically inspected rather than executed; reference calculations were independently reproduced with a separate local runtime. A solver can read the specification and scene, implement the NumPy geometry, produce the required JSON array, and have it evaluated deterministically against the reference. License keys, accounts, tokens, and other credentials are not required from the contributor. Confidential, proprietary, or internal material may be evaluated as submitted evidence without requiring additional disclosure.\n\n**Special Screening:**\nNone\n\n**Recommended Changes:**\nThe submission provides coherent inputs, meaningful geometric edge cases, a verified reference, and a hardened evaluator. No changes are required.","reviewed_at":"2026-08-16T13:36:39.828590Z"},"claim":null}