public function makeSimulation($caption, $patient, $organ, $model, $protocol, $parameterData, $regionData, $needles) { $numerical_model = NumericalModel::whereName($model)->first(); $protocol = Protocol::whereName($protocol)->whereModalityId($numerical_model->Modality_Id)->first(); $context = Context::byNameFamily($organ, 'organ'); $combinations = $numerical_model->Combinations()->whereProtocolId($protocol->Id)->where(Context::$idField, "=", $context->Id); $combination = $combinations->first(); $simulation = Simulation::create(['Combination_Id' => $combination->Combination_Id, 'Patient_Id' => $patient->Id ?: '00000000-0000-0000-0000-000000000000', 'Caption' => 'Sample Simulation for ' . $caption, 'SegmentationType' => 0, 'Progress' => '0', 'State' => 0, 'Color' => 0, 'Active' => 0]); /* foreach ($regionData as $name => $locations) { $region = Region::whereName($name)->first(); foreach ($locations as $location) $simulation->regions()->attach($region, ['Location' => $location]); } */ $simulation->save(); $simulationNeedles = []; $needleData = []; $needleUserParameters = new Collection(); $n = 0; foreach ($needles as $needleConfig) { $n++; $needle = Needle::whereManufacturer($needleConfig["Manufacturer"])->whereName($needleConfig["Name"])->first(); $needleUserParameters[$needle->Id] = new Collection(); $simulationNeedle = SimulationNeedle::create(['Needle_Id' => $needle->Id, 'Simulation_Id' => $simulation->Id, 'Target_Id' => $this->makePointSet($needleConfig["Parameters"]["NEEDLE_TIP_LOCATION"])->Id, 'Entry_Id' => $this->makePointSet($needleConfig["Parameters"]["NEEDLE_ENTRY_LOCATION"])->Id]); $simulationNeedleId = $simulationNeedle->Id; foreach ($needleConfig["Parameters"] as $paramName => $paramValue) { $parameter = Parameter::whereName($paramName)->first(); $parameter->Value = $paramValue; $needleUserParameters[$needle->Id][$paramName] = $parameter; } $simulationNeedles[] = $needle; } $parameters = new Collection(); foreach ($parameterData as $parameterName => $value) { $parameter = Parameter::whereName($parameterName)->first(); $parameter->Value = $value; $parameters[$parameter->Name] = $parameter; } $incompatibilities = []; $userRequiredParameters = []; list($parameters, $needleParameters) = $combination->compileParameters($parameters, $simulationNeedles, $needleUserParameters, $incompatibilities, $userRequiredParameters); if (count($incompatibilities)) { var_dump($incompatibilities); var_dump($userRequiredParameters); } foreach ($parameters as $parameterName => $parameter) { $simulation->Parameters()->attach($parameter, ['ValueSet' => $parameter->Value]); } $simulation->SimulationNeedles->each(function ($simulationNeedle) use($needleParameters) { if (array_key_exists($simulationNeedle->Needle_Id, $needleParameters)) { $needleParameters[$simulationNeedle->Needle_Id]->each(function ($p) use($simulationNeedle) { $simulationNeedle->Parameters()->attach($p); }); } }); $this->r++; print "Simulation #{$this->r}: " . $simulation->Combination->asString . " [ " . strtoupper($simulation->Id) . " ]\n"; }
/** * Run the database seeds. * * @return void */ public function run() { Eloquent::unguard(); $parameterFields = ['name', 'type', 'widget', 'description', 'units', 'priority', 'restriction']; $attributionFields = ['Name', 'Type', 'Widget', 'Units']; $constantsXmls = File::allFiles(public_path() . '/constants'); foreach ($constantsXmls as $constantsXml) { $dom = new DomDocument(); $dom->load($constantsXml); $root = $dom->documentElement; $class = $root->getAttribute('class'); $name = $root->getAttribute('name'); //FIXME: Not very safe! if (Config::get('gosmart.context_as_enum') && $class == 'Context') { if ($root->hasAttribute('family')) { $family = $root->getAttribute('family'); } else { $family = 'organ'; } $target = Context::byNameFamily($name, $family); } else { $object = new $class(); $objectQuery = $object->whereName($name); if ($root->hasAttribute('family')) { $objectQuery = $objectQuery->whereFamily($root->getAttribute('family')); } $target = $objectQuery->first(); } if (empty($target)) { throw new Exception("Did not find object {$name} ({$class}) for {$constantsXml}"); } foreach ($root->childNodes as $constant) { if (get_class($constant) == 'DOMText') { continue; } if (!$constant->hasAttribute('name')) { throw new Exception("Constant missing name! ({$constantsXml})"); } $present = array_filter($parameterFields, [$constant, 'hasAttribute']); $parameterData = []; array_map(function ($a) use(&$parameterData, $constant) { $parameterData[train_case($a)] = $constant->getAttribute($a); }, $present); if (!$constant->hasAttribute('description')) { $parameterData['Description'] = $parameterData['Name']; } $parameterData['Name'] = preg_replace('/[ -]/', '_', $parameterData['Name']); $parameterData['Name'] = strtoupper($constant->nodeName) . '_' . strtoupper(preg_replace('/[[:^word:]]/', '', $parameterData['Name'])); if (!$constant->hasAttribute('type')) { $parameterData['Type'] = 'float'; } $parameter = Parameter::whereName($parameterData['Name'])->first(); if (empty($parameter)) { $parameter = Parameter::create($parameterData); } else { $parameter->fill($parameterData)->save(); } $id_name = train_case($class) . '_Id'; if ($id_name == "Context_Id") { $id_name = Context::$idField; } $attributionData = array_intersect_key($parameterData, array_flip($attributionFields)); if ($constant->hasAttribute('context')) { //$attributionData[Context::$idField] = Context::byNameFamily($constant->getAttribute('context'), $constant->getAttribute('contextFamily') ?: 'organ')->first()->id; $context = Context::byNameFamily($constant->getAttribute('context'), $constant->getAttribute('contextFamily') ?: 'organ')->first(); } else { $context = null; } if ($constant->hasAttribute('value')) { $attributionData['Value'] = $constant->getAttribute('value'); } else { $attributionData['Value'] = null; } $attribution = $target->attribute($attributionData, $context); } } }