Skip to main content

Analyzing a Case

This guide walks you through running a complete case analysis using StartAnalysis. This convenience function handles the entire workflow: uploading evidence, running crash analysis, biomechanics analysis, and computing case analytics.

How It Works

StartAnalysis is a convenience function that orchestrates the entire workflow. You provide image bytes and case data; the SDK handles everything else:

StepWhat the SDK Does Automatically
1Creates a case (or uses existing caseId if provided)
2Uploads your images and EDR files to the API
3Runs crash analysis (Delta-V, PDOF calculations)
4Runs biomechanics analysis (if occupants provided)
5Computes case analytics with scores and insights

What You Get

  • Crash Analysis - Delta-V calculations, PDOF analysis, damage assessment
  • Biomechanics Analysis - Injury mechanism analysis for each occupant (if provided)
  • Case Analytics - Overall score, strengths, weaknesses, recommendations

Field Requirements

FieldRequiredDescription
organizationIdYesOrganization to associate the case with
plaintiff.imagesYesVehicle damage photos (JPEG/PNG)
plaintiff.vehicleMake/Model/YearRecommendedImproves analysis accuracy
defendant.imagesNoDefendant vehicle photos
defendant.vehicleInfoNoDefendant vehicle details
occupantsNoInclude for biomechanics analysis
accidentDescriptionNoContext for the analysis
accidentDateNoDate of accident (YYYY-MM-DD)
edrFileNoEDR data file

Reusing Case Data

Already have a case from a previous analysis? See Running Additional Analyses to learn how to run multiple analysis types on the same case without re-uploading data.

Step 1: Set Up the Client

Initialize the SDK with your API key:

package main

import (
"context"
"fmt"
"log"
"os"
"time"

silentwitness "github.com/silentwitness/go-sdk"
)

func main() {
silentwitness.Key = "sk-your-api-key"
ctx := context.Background()

// ... continue with analysis
}

Step 2: Load Your Evidence

Read the vehicle damage photos into memory. StartAnalysis will upload them automatically when you call it in Step 4.

// Load plaintiff vehicle images
plaintiffFront, err := os.ReadFile("plaintiff-front.jpg")
if err != nil {
log.Fatal("Failed to load image:", err)
}
plaintiffRear, err := os.ReadFile("plaintiff-rear.jpg")
if err != nil {
log.Fatal("Failed to load image:", err)
}

// Optionally load defendant images
defendantFront, _ := os.ReadFile("defendant-front.jpg")
Image Guidelines
  • Include multiple angles: front, rear, sides, and close-ups of damage
  • Higher resolution images produce better analysis
  • 4-8 images per vehicle is ideal
No manual upload needed

Unlike the low-level SDK approach, you don't need to call Files.Upload() separately. Just pass the raw image bytes to StartAnalysis and it handles uploading, case creation, and analysis orchestration for you.

Step 3: Build the Request

Configure the analysis with your case data.

Basic Analysis (Crash Only)

request := &silentwitness.AnalyzeCaseRequest{
OrganizationID: silentwitness.String("org_abc123"),
CaseName: silentwitness.String("Smith v. Jones"),

Plaintiff: &silentwitness.VehicleAnalysisData{
Images: [][]byte{plaintiffFront, plaintiffRear},
VehicleMake: silentwitness.String("Toyota"),
VehicleModel: silentwitness.String("Camry"),
VehicleYear: silentwitness.String("2020"),
},

AccidentDescription: silentwitness.String("Rear-end collision at red light"),
}

Full Analysis (Crash + Biomechanics)

Add occupants to include biomechanics analysis:

request := &silentwitness.AnalyzeCaseRequest{
OrganizationID: silentwitness.String("org_abc123"),
CaseName: silentwitness.String("Smith v. Jones"),

Plaintiff: &silentwitness.VehicleAnalysisData{
Images: [][]byte{plaintiffFront, plaintiffRear},
VehicleMake: silentwitness.String("Toyota"),
VehicleModel: silentwitness.String("Camry"),
VehicleYear: silentwitness.String("2020"),
},

// Add occupants for biomechanics analysis
Occupants: []silentwitness.OccupantAnalysisData{
{
Name: silentwitness.String("John Smith"),
Age: 45,
Gender: "male",
Position: "driver",
AllegedInjuries: []string{
"cervical_spine",
"lumbar_spine",
},
},
},
}

Occupant Field Values

When including occupants, use these values:

Positions: driver, front_passenger, rear_left, rear_center, rear_right

Injury types: head_brain, cervical_spine, thoracic_spine, lumbar_spine, shoulder, hip, knee, foot_ankle

Step 4: Run the Analysis

Start the analysis and wait for results:

// Start the analysis
poller, err := silentwitness.StartAnalysis(ctx, request)
if err != nil {
log.Fatal("Failed to start analysis:", err)
}

// Wait for completion (2-5 minutes)
fmt.Println("Analysis started...")
for !poller.Done() {
fmt.Printf(" Status: %s\n", poller.StatusMessage())
time.Sleep(5 * time.Second)
}

// Get result
result, err := poller.Result()
if err != nil {
log.Fatal("Analysis failed:", err)
}

Step 5: Interpret the Results

The result contains your case analytics and generated reports:

// Overall case strength
fmt.Printf("\n=== Case Analysis Results ===\n")
fmt.Printf("Case ID: %s\n", result.CaseID)
fmt.Printf("Overall Score: %d/100\n", result.Analytics.OverallScore)
fmt.Printf("Category: %s\n", result.Analytics.Category)

// Individual metrics
fmt.Printf("\nMetrics:\n")
for _, metric := range result.Analytics.Metrics {
fmt.Printf(" - %s: %d/100\n", metric.Label, metric.Value)
}

// Strengths and weaknesses
fmt.Printf("\nStrengths:\n")
for _, s := range result.Analytics.Strengths {
fmt.Printf(" + %s\n", s)
}

fmt.Printf("\nWeaknesses:\n")
for _, w := range result.Analytics.Weaknesses {
fmt.Printf(" - %s\n", w)
}

// Recommendations
fmt.Printf("\nRecommendations:\n")
for _, r := range result.Analytics.Recommendations {
fmt.Printf(" > %s\n", r)
}

Example Output

=== Case Analysis Results ===
Case ID: case_abc123xyz
Overall Score: 78/100
Category: Strong Case

Metrics:
- Liability Strength: 85/100
- Evidence Quality: 72/100
- Injury Correlation: 80/100
- Damages Potential: 75/100

Strengths:
+ Clear rear-end collision with established liability
+ Impact severity supports reported injury severity
+ Injury mechanisms are consistent with crash dynamics

Weaknesses:
- Pre-existing cervical condition noted in medical records
- EDR data not available for precise speed analysis

Recommendations:
> Obtain treating physician declaration linking crash to symptoms
> Request defendant's EDR data through discovery

Understanding the Score Categories

ScoreCategoryMeaning
80-100Strong CaseHigh likelihood of favorable outcome
60-79Moderate CaseGood case with some areas to address
40-59Challenging CaseSignificant weaknesses to overcome
0-39Weak CaseMajor obstacles to success

Complete Code Example

Here's the full code putting it all together:

package main

import (
"context"
"fmt"
"log"
"os"
"time"

silentwitness "github.com/silentwitness/go-sdk"
)

func main() {
// Initialize
silentwitness.Key = "sk-your-api-key"
ctx := context.Background()

// Load images
plaintiffFront, _ := os.ReadFile("plaintiff-front.jpg")
plaintiffRear, _ := os.ReadFile("plaintiff-rear.jpg")

// Build request
request := &silentwitness.AnalyzeCaseRequest{
OrganizationID: silentwitness.String("org_abc123"),
CaseName: silentwitness.String("Smith v. Jones"),
Plaintiff: &silentwitness.VehicleAnalysisData{
Images: [][]byte{plaintiffFront, plaintiffRear},
VehicleMake: silentwitness.String("Toyota"),
VehicleModel: silentwitness.String("Camry"),
VehicleYear: silentwitness.String("2020"),
},
Occupants: []silentwitness.OccupantAnalysisData{
{
Age: 45,
Gender: "male",
Position: "driver",
AllegedInjuries: []string{"cervical_spine", "lumbar_spine"},
},
},
}

// Run analysis
poller, err := silentwitness.StartAnalysis(ctx, request)
if err != nil {
log.Fatal(err)
}

// Wait for completion
for !poller.Done() {
fmt.Printf("Status: %s\n", poller.StatusMessage())
time.Sleep(5 * time.Second)
}

result, err := poller.Result()
if err != nil {
log.Fatal(err)
}

// Display results
fmt.Printf("\nScore: %d/100 (%s)\n", result.Analytics.OverallScore, result.Analytics.Category)
}

Next Steps