Skip to content

Commit 1320a40

Browse files
Merge pull request #1133 from liberu-genealogy/sweep/Enhance-DNA-Matching-Job-with-Improved-Error-Handling-and-Output-Management
Enhance DNA Matching Job with Improved Error Handling and Output Management
2 parents 3f26312 + 3eed314 commit 1320a40

2 files changed

Lines changed: 93 additions & 74 deletions

File tree

app/Console/Commands/MatchKitsCommand.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public function handle(): void
3939
'match_id' => $dna2->user_id,
4040
]);
4141

42-
$this->info('DNA kits matched successfully.');
42+
// Return JSON result for the job to process
43+
$this->info(json_encode([
44+
'total_cms' => $totalSharedCm,
45+
'largest_cm' => $largestCmSegment
46+
]));
4347
}
44-
}
48+
}

app/Jobs/DnaMatching.php

Lines changed: 87 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class DnaMatching implements ShouldQueue
1919
use Queueable;
2020
use SerializesModels;
2121

22-
public int $timeout = 0;
22+
public int $timeout = 3600; // Changed from 0 to 1 hour
2323
public int $tries = 1;
2424

2525
/**
@@ -41,85 +41,100 @@ public function handle(): void
4141
$mpath = app_path();
4242

4343
foreach ($dnas as $dna) {
44-
Log::info(json_encode($dna, JSON_THROW_ON_ERROR));
45-
Log::info(storage_path('/app/public/dna/output/shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_'.$this->file_name.'_'.$dna->file_name));
46-
// system('/usr/bin/python3 /home/genealogia/public_html/dna.py ' . $this->var_name . ' ' . $dna->variable_name . ' ' . '/home/genealogia/public_html/storage/app/dna/'. $this->file_name . ' ' . '/home/genealogia/public_html/storage/app/dna/'. $dna->file_name);
47-
// chdir('/home/familytree365/domains/api.familytree365.com/genealogy/app');
48-
chdir($mpath);
49-
$result = \Illuminate\Support\Facades\Artisan::call('dna:match', [
50-
'varName1' => $this->var_name,
51-
'fileName1' => $this->file_name,
52-
'varName2' => $dna->variable_name,
53-
'fileName2' => $dna->file_name,
54-
]);
55-
$resultData = json_decode($result, true, 512, JSON_THROW_ON_ERROR);
56-
// Remove these redundant json_decode calls that could cause issues
57-
// $resultData = json_decode($result, true, 512, JSON_THROW_ON_ERROR);
58-
// $resultData = json_decode($result, true, 512, JSON_THROW_ON_ERROR);
59-
// chmod(storage_path('/app/public/dna/output/shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_'.$this->file_name.'_'.$dna->file_name), 0777);
60-
61-
$dm = new DM();
62-
$dm->user_id = $user->id;
63-
$dm->match_id = $dna->user_id;
64-
$match_name_user = User::with('person')->find($dna->user_id);
65-
$match_name = $match_name_user->person->name;
66-
$dm->match_name = $match_name;
67-
// $dm->image = 'shared_dna_'.$this->var_name.'_'.$dna->variable_name.'.png';
68-
// $dm->image = 'shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.png';
69-
$dm->image = env('APP_URL').'/storage/dna/output/shared_dna_'.$this->var_name.'_'.
70-
$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.png';
71-
// $dm->file1 = 'discordant_snps_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
72-
$dm->file1 = 'discordant_snps_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
73-
// $dm->file2 = 'shared_dna_one_chrom_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
74-
$dm->file2 = 'shared_dna_one_chrom_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.csv';
75-
76-
$dm->total_shared_cm = round($resultData['total_cms'], 2);
77-
$dm->largest_cm_segment = round($resultData['largest_cm'], 2);
78-
79-
$dm->save();
80-
if ($dna->user_id !== $user->id) {
81-
$dm2 = new DM();
82-
$dm2->user_id = $dna->user_id;
83-
$dm2->match_id = $user->id;
44+
try {
45+
Log::info(json_encode($dna, JSON_THROW_ON_ERROR));
46+
Log::info(storage_path('/app/public/dna/output/shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_'.$this->file_name.'_'.$dna->file_name));
47+
48+
chdir($mpath);
49+
50+
// Store output to variable instead of directly decoding
51+
\Illuminate\Support\Facades\Artisan::call('dna:match', [
52+
'varName1' => $this->var_name,
53+
'fileName1' => $this->file_name,
54+
'varName2' => $dna->variable_name,
55+
'fileName2' => $dna->file_name,
56+
]);
57+
58+
// Get the output from the command
59+
$output = \Illuminate\Support\Facades\Artisan::output();
60+
$resultData = json_decode($output, true, 512, JSON_THROW_ON_ERROR);
61+
62+
if (!$resultData) {
63+
Log::error('Failed to decode DNA match result: ' . $output);
64+
continue;
65+
}
66+
67+
// Remove these redundant json_decode calls that could cause issues
68+
// $resultData = json_decode($result, true, 512, JSON_THROW_ON_ERROR);
69+
// $resultData = json_decode($result, true, 512, JSON_THROW_ON_ERROR);
70+
// chmod(storage_path('/app/public/dna/output/shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_'.$this->file_name.'_'.$dna->file_name), 0777);
71+
72+
$dm = new DM();
73+
$dm->user_id = $user->id;
74+
$dm->match_id = $dna->user_id;
8475
$match_name_user = User::with('person')->find($dna->user_id);
85-
$dm2->match_name = $match_name_user->person->name;
76+
$match_name = $match_name_user->person->name;
77+
$dm->match_name = $match_name;
8678
// $dm->image = 'shared_dna_'.$this->var_name.'_'.$dna->variable_name.'.png';
8779
// $dm->image = 'shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.png';
88-
$dm2->image = env('APP_URL').'/storage/dna/output/shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.png';
80+
$dm->image = env('APP_URL').'/storage/dna/output/shared_dna_'.$this->var_name.'_'.
81+
$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.png';
8982
// $dm->file1 = 'discordant_snps_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
90-
$dm2->file1 = 'discordant_snps_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
83+
$dm->file1 = 'discordant_snps_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
9184
// $dm->file2 = 'shared_dna_one_chrom_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
92-
$dm2->file2 = 'shared_dna_one_chrom_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.csv';
85+
$dm->file2 = 'shared_dna_one_chrom_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.csv';
86+
87+
$dm->total_shared_cm = round($resultData['total_cms'], 2);
88+
$dm->largest_cm_segment = round($resultData['largest_cm'], 2);
89+
90+
$dm->save();
91+
if ($dna->user_id !== $user->id) {
92+
$dm2 = new DM();
93+
$dm2->user_id = $dna->user_id;
94+
$dm2->match_id = $user->id;
95+
$match_name_user = User::with('person')->find($dna->user_id);
96+
$dm2->match_name = $match_name_user->person->name;
97+
// $dm->image = 'shared_dna_'.$this->var_name.'_'.$dna->variable_name.'.png';
98+
// $dm->image = 'shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.png';
99+
$dm2->image = env('APP_URL').'/storage/dna/output/shared_dna_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.png';
100+
// $dm->file1 = 'discordant_snps_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
101+
$dm2->file1 = 'discordant_snps_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
102+
// $dm->file2 = 'shared_dna_one_chrom_'.$this->var_name.'_'.$dna->variable_name.'_GRCh37.csv';
103+
$dm2->file2 = 'shared_dna_one_chrom_'.$this->var_name.'_'.$dna->variable_name.'_0p75cM_1100snps_GRCh37_HapMap2.csv';
104+
105+
$dm2->total_shared_cm = round($resultData['total_cms'], 2);
106+
$dm2->largest_cm_segment = round($resultData['largest_cm'], 2);
107+
108+
$dm2->save();
109+
}
110+
// $data = readCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file1), ',');
111+
// array_shift($data);
112+
// $data = writeCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file1), $data);
113+
114+
// $data = readCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file2), ',');
115+
// array_shift($data);
93116

94-
$dm2->total_shared_cm = round($resultData['total_cms'], 2);
95-
$dm2->largest_cm_segment = round($resultData['largest_cm'], 2);
117+
// $temp_data = $data;
118+
// array_shift($temp_data);
119+
// array_shift($temp_data);
120+
// $total_cms = 0;
121+
// $largest_cm = 0;
122+
// foreach ($temp_data as $line) {
123+
// if ($line[4] >= $largest_cm) {
124+
// $largest_cm = $line[4];
125+
// }
126+
// $total_cms = $total_cms + $line[4];
127+
// }
128+
// $dm->user_id = $user->id;
129+
// $dm->total_shared_cm = $total_cms;
130+
// $dm->largest_cm_segment = round($largest_cm, 2);
131+
// $dm->save();
96132

97-
$dm2->save();
133+
// $data = writeCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file2), $data);
134+
} catch (\Exception $e) {
135+
Log::error('Error in DNA matching job: ' . $e->getMessage());
136+
continue; // Skip to next DNA record on error
98137
}
99-
// $data = readCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file1), ',');
100-
// array_shift($data);
101-
// $data = writeCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file1), $data);
102-
103-
// $data = readCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file2), ',');
104-
// array_shift($data);
105-
106-
// $temp_data = $data;
107-
// array_shift($temp_data);
108-
// array_shift($temp_data);
109-
// $total_cms = 0;
110-
// $largest_cm = 0;
111-
// foreach ($temp_data as $line) {
112-
// if ($line[4] >= $largest_cm) {
113-
// $largest_cm = $line[4];
114-
// }
115-
// $total_cms = $total_cms + $line[4];
116-
// }
117-
// $dm->user_id = $user->id;
118-
// $dm->total_shared_cm = $total_cms;
119-
// $dm->largest_cm_segment = round($largest_cm, 2);
120-
// $dm->save();
121-
122-
// $data = writeCSV(storage_path('app'.DIRECTORY_SEPARATOR.'dna'.DIRECTORY_SEPARATOR.'output'.DIRECTORY_SEPARATOR.$dm->file2), $data);
123138
}
124139
}
125140
}

0 commit comments

Comments
 (0)