simXmlName = $basePath; $this->simXml = new DomDocument("1.0"); if (file_exists($this->simXmlName)) { @$this->simXml->load($this->simXmlName); $this->simRootEl = $this->simXml->documentElement; } $this->simXP = new domxpath($this->simXml); $this->centerID = $centerID; } function queryDatasets() { return $this->simXP->query("//dataRoot/dataCenter/simulationModel/simulationRegion/runID/dataset"); } function getDatasetFilterPath($dataset) { $datasetID = $dataset->getAttribute('xml:id'); $run = $dataset->parentNode; $runID = $run->getAttribute('xml:id'); $simReg = $run->parentNode; $simRegID = $simReg->getAttribute('xml:id'); $model = $simReg->parentNode; $modelID = $model->getAttribute('xml:id'); $center = $model->parentNode; $centerID = $center->getAttribute('xml:id'); return $centerID.";".$modelID.";".$simRegID.";".$runID.";".$datasetID; } private function getRunFromDataset($dataset) { $run = $dataset->parentNode; return $run; } function getReleaseDate($dataset) { $run = $this->getRunFromDataset($dataset); if (!run || !$run->hasAttribute('ReleaseDate')) return '0'; return strtotime($run->getAttribute('ReleaseDate')); } function getSimulatedRegion($dataset) { if (isset($dataset->parentNode)) $run = $dataset->parentNode; if (isset($run->parentNode)) { if ($run->parentNode->hasAttribute('name')) $simReg = $run->parentNode->getAttribute('name'); return $simReg; } else return false; } function getDatasetAttribute($dataset ,$attribute) { $run = $this->getRunFromDataset($dataset); if (!run || !$run->hasAttribute($attribute)) return ''; return $run->getAttribute($attribute); } } //Get filter result for all simulations bases class FilterResSimu extends FilterRes { protected $arrayFilesMgr; function __construct() { $this->arrayFilesMgr = array(); array_push($this->arrayFilesMgr,new SimuFileMgr(RemoteData."LATMOS/base.xml",'LATMOS')); array_push($this->arrayFilesMgr,new SimuFileMgr(RemoteData."FMI_GUMICS/base.xml",'FMI_GUMICS')); array_push($this->arrayFilesMgr,new SimuFileMgr(RemoteData."FMI_HYBRID/base.xml",'FMI_HYBRID')); array_push($this->arrayFilesMgr,new SimuFileMgr(RemoteData."SINP/base.xml",'SINP')); } function getDataProd($value,$opId) { $result = array(); foreach ($this->arrayFilesMgr as $fileMgr){ if ((($value == $fileMgr->centerID) && ($opId == 'eq')) || (($value != $fileMgr->centerID) && ($opId == 'ne'))) { $datasets = $fileMgr->queryDatasets(); foreach ($datasets as $dataset){ array_push($result,$fileMgr->getDatasetFilterPath($dataset)); } } } return $result; } function getReleaseDate($value,$opId) { $result = array(); $val = strtotime($value); foreach ($this->arrayFilesMgr as $fileMgr) { $datasets = $fileMgr->queryDatasets(); foreach ($datasets as $dataset) { $date = $fileMgr->getReleaseDate($dataset); if (($date == $val) || (($date < $val) && ($opId == 'le')) || (($date > $val) && ($opId == 'ge'))) array_push($result,$fileMgr->getDatasetFilterPath($dataset)); } } return $result; } function getSimuRegion($value,$opId) { $result = array(); foreach ($this->arrayFilesMgr as $fileMgr) { $datasets = $fileMgr->queryDatasets(); foreach ($datasets as $dataset) { if ($fileMgr->getSimulatedRegion($dataset)){ $isSimuRegion = ($fileMgr->getSimulatedRegion($dataset) == $value); if (($isSimuRegion && ($opId == 'eq')) || (!$isSimuRegion && ($opId == 'ne'))) array_push($result,$fileMgr->getDatasetFilterPath($dataset)); } } } return $result; } function getInfoFromRunIDEqual($value,$opId, $attribute) { $result = array(); foreach ($this->arrayFilesMgr as $fileMgr) { $datasets = $fileMgr->queryDatasets(); foreach ($datasets as $dataset) { $isAttribute = ($fileMgr->getDatasetAttribute($dataset, $attribute) == $value); if (($isAttribute && ($opId == 'eq')) || (!$isAttribute && ($opId == 'ne'))) array_push($result,$fileMgr->getDatasetFilterPath($dataset)); } } return $result; } function getInfoFromRunIDComp($value,$opId, $attribute) { $result = array(); $val = floatval($value); foreach ($this->arrayFilesMgr as $fileMgr) { $datasets = $fileMgr->queryDatasets(); foreach ($datasets as $dataset) { $attrVal = floatval($fileMgr->getDatasetAttribute($dataset, $attribute)); if ((($attrVal == $val) || (($attrVal < $val) && ($opId == 'le')) || (($attrVal > $val) && ($opId == 'ge'))) && $attrVal != '') array_push($result,$fileMgr->getDatasetFilterPath($dataset)); } } return $result; } function getAll() { } function getCondResult($cond) { $condId = $cond['condId']; switch($condId) { case 'dprod' : //data productor return $this->getDataProd($cond['value'],$cond['opId']); case 'simt' : //simulation type return $this->getInfoFromRunIDEqual($cond['value'],$cond['opId'], 'SimulationType'); case 'reld' : //release date return $this->getReleaseDate($cond['value'],$cond['opId']); case 'simReg' : //simulated region return $this->getSimuRegion($cond['value'],$cond['opId']); case 'tempDepend' : //Temporal Dependence return $this->getInfoFromRunIDEqual($cond['value'],$cond['opId'], 'TemporalDependence'); case 'rating' : //Likelihood Rating return $this->getInfoFromRunIDEqual($cond['value'],$cond['opId'], 'LikelihoodRating'); case 'GridCellSize_X' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'GridCellSize_X'); case 'GridCellSize_Y' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'GridCellSize_Y'); case 'GridCellSize_Z' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'GridCellSize_Z'); case 'FieldValue_Bx' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'FieldValue_Bx'); case 'FieldValue_By' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'FieldValue_By'); case 'FieldValue_Bz' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'FieldValue_Bz'); case 'Solar_Wind_electrons-Density' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_electrons-Density'); case 'Solar_Wind_electrons-Temperature' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_electrons-Temperature'); case 'Solar_Wind_electrons-FlowSpeed' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_electrons-FlowSpeed'); case 'Solar_Wind_H-Density' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_H-Density'); case 'Solar_Wind_H-Temperature' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_H-Temperature'); case 'Solar_Wind_H-FlowSpeed' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_H-FlowSpeed'); case 'Solar_Wind_He-Density' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_He-Density'); case 'Solar_Wind_He-Temperature' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'Solar_Wind_He-Temperature'); case 'SolarUVFlux' : //Likelihood Rating return $this->getInfoFromRunIDComp($cond['value'],$cond['opId'], 'SolarUVFlux'); } } function getResult($filter,$isEmptyFilter) { if ($isEmptyFilter) return $this->getAll(); $ops = array(); $cond_res = array(); for ($i = 0 ; $i < count($filter); $i++) { $cond = $filter[$i]; $cond_res[$i] = $this->getCondResult($cond); $ops[$i] = $cond['logical']; } for ($i = 1; $i < count($cond_res); $i++) { if ($ops[$i] != 'and') continue; $cond_res[$i-1] = $this->andOp($cond_res[$i-1],$cond_res[$i]); array_splice($cond_res, $i, 1); array_splice($ops, $i, 1); $i--; } for ($i = 1; $i < count($cond_res); $i++) { if ($ops[$i] != 'or') continue; $cond_res[$i-1] = $this->orOp($cond_res[$i-1],$cond_res[$i]); array_splice($cond_res, $i, 1); array_splice($ops, $i, 1); $i--; } return $cond_res[0]; } } ?>