// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bool StationMagnitudeContribution::detachFrom(PublicObject* object) {
	if ( object == NULL ) return false;

	// check all possible parents
	Magnitude* magnitude = Magnitude::Cast(object);
	if ( magnitude != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return magnitude->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			StationMagnitudeContribution* child = magnitude->stationMagnitudeContribution(index());
			if ( child != NULL )
				return magnitude->remove(child);
			else {
				SEISCOMP_DEBUG("StationMagnitudeContribution::detachFrom(Magnitude): stationMagnitudeContribution has not been found");
				return false;
			}
		}
	}

	SEISCOMP_ERROR("StationMagnitudeContribution::detachFrom(%s) -> wrong class type", object->className());
	return false;
}
Esempio n. 2
0
Numerical::Numerical(const FileSystem::Project& file,
                     const Magnitude& mag,
                     const Math::Real timeStep,
                     const Math::Real finalTime)
:   FileSystem::Project(file) {

    if(mag.is<Numerical>()) {
        operator=(*mag.castTo<Numerical>());
        return;
    }
    std::size_t nSteps;
    if (timeStep != 0.0) {
        nSteps = (std::size_t)std::abs(finalTime / timeStep);
    } else {
        nSteps = defaultNumberOfSteps;
        std::cerr << "WARNING @ Numerical: "
                  << "Attempting to build a "
                  << "numerical magnitude with a 0.0 step."
                  << "Using default number of steps instead: " << nSteps
                  << std::endl;
        mag.printInfo();
    }
    std::ofstream out;
    out.open(file.c_str());
    Math::Real time = 0.0;
    for (std::size_t i = 0; i < nSteps; i++) {
        // Determines if neigh values are aligned with current.
        std::vector<std::pair<Math::Real,Math::Real>> preAndPost;
        const Math::Real tPre = time - timeStep;
        const Math::Real tPost = time + timeStep;
        preAndPost.push_back(
            std::pair<Math::Real,Math::Real>(tPre, mag.evaluate(tPre)));
        preAndPost.push_back(
            std::pair<Math::Real,Math::Real>(tPost, mag.evaluate(tPost)));
        const Math::Real interpolated =
            Math::Function::LinearInterpolation<Math::Real,Math::Real>(
                preAndPost)(time);
        const Math::Real current = mag.evaluate(time);
        bool isAligned = Math::Util::equal(current, interpolated,
                0.0, std::numeric_limits<Math::Real>::epsilon());
//        bool isAligned = (current == interpolated);
        //
        if (!isAligned || i == nSteps-1) {
            out <<  time << " " << current << std::endl;
        }
        //
        time += timeStep;
    }
    out.close();

    Magnitude::operator=(
        Magnitude(
            new Math::Function::LinearInterpolation<Math::Real,Math::Real>(
                file)));
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bool StationMagnitudeContribution::attachTo(PublicObject* parent) {
	if ( parent == NULL ) return false;

	// check all possible parents
	Magnitude* magnitude = Magnitude::Cast(parent);
	if ( magnitude != NULL )
		return magnitude->add(this);

	SEISCOMP_ERROR("StationMagnitudeContribution::attachTo(%s) -> wrong class type", parent->className());
	return false;
}
Esempio n. 4
0
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bool Comment::attachTo(PublicObject* parent) {
	if ( parent == NULL ) return false;

	// check all possible parents
	MomentTensor* momentTensor = MomentTensor::Cast(parent);
	if ( momentTensor != NULL )
		return momentTensor->add(this);
	FocalMechanism* focalMechanism = FocalMechanism::Cast(parent);
	if ( focalMechanism != NULL )
		return focalMechanism->add(this);
	Amplitude* amplitude = Amplitude::Cast(parent);
	if ( amplitude != NULL )
		return amplitude->add(this);
	Magnitude* magnitude = Magnitude::Cast(parent);
	if ( magnitude != NULL )
		return magnitude->add(this);
	StationMagnitude* stationMagnitude = StationMagnitude::Cast(parent);
	if ( stationMagnitude != NULL )
		return stationMagnitude->add(this);
	Pick* pick = Pick::Cast(parent);
	if ( pick != NULL )
		return pick->add(this);
	Event* event = Event::Cast(parent);
	if ( event != NULL )
		return event->add(this);
	Origin* origin = Origin::Cast(parent);
	if ( origin != NULL )
		return origin->add(this);
	Parameter* parameter = Parameter::Cast(parent);
	if ( parameter != NULL )
		return parameter->add(this);
	ParameterSet* parameterSet = ParameterSet::Cast(parent);
	if ( parameterSet != NULL )
		return parameterSet->add(this);
	Stream* stream = Stream::Cast(parent);
	if ( stream != NULL )
		return stream->add(this);
	SensorLocation* sensorLocation = SensorLocation::Cast(parent);
	if ( sensorLocation != NULL )
		return sensorLocation->add(this);
	Station* station = Station::Cast(parent);
	if ( station != NULL )
		return station->add(this);
	Network* network = Network::Cast(parent);
	if ( network != NULL )
		return network->add(this);

	SEISCOMP_ERROR("Comment::attachTo(%s) -> wrong class type", parent->className());
	return false;
}
Esempio n. 5
0
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bool Origin::updateChild(Object* child) {
	Comment* commentChild = Comment::Cast(child);
	if ( commentChild != NULL ) {
		Comment* commentElement = comment(commentChild->index());
		if ( commentElement != NULL ) {
			*commentElement = *commentChild;
			return true;
		}
		return false;
	}

	// Do not know how to fetch child of type CompositeTime without an index

	Arrival* arrivalChild = Arrival::Cast(child);
	if ( arrivalChild != NULL ) {
		Arrival* arrivalElement = arrival(arrivalChild->index());
		if ( arrivalElement != NULL ) {
			*arrivalElement = *arrivalChild;
			return true;
		}
		return false;
	}

	StationMagnitude* stationMagnitudeChild = StationMagnitude::Cast(child);
	if ( stationMagnitudeChild != NULL ) {
		StationMagnitude* stationMagnitudeElement
			= StationMagnitude::Cast(PublicObject::Find(stationMagnitudeChild->publicID()));
		if ( stationMagnitudeElement && stationMagnitudeElement->parent() == this ) {
			*stationMagnitudeElement = *stationMagnitudeChild;
			return true;
		}
		return false;
	}

	Magnitude* magnitudeChild = Magnitude::Cast(child);
	if ( magnitudeChild != NULL ) {
		Magnitude* magnitudeElement
			= Magnitude::Cast(PublicObject::Find(magnitudeChild->publicID()));
		if ( magnitudeElement && magnitudeElement->parent() == this ) {
			*magnitudeElement = *magnitudeChild;
			return true;
		}
		return false;
	}

	return false;
}
Esempio n. 6
0
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bool Origin::add(Magnitude* magnitude) {
	if ( magnitude == NULL )
		return false;

	// Element has already a parent
	if ( magnitude->parent() != NULL ) {
		SEISCOMP_ERROR("Origin::add(Magnitude*) -> element has already a parent");
		return false;
	}

	if ( PublicObject::IsRegistrationEnabled() ) {
		Magnitude* magnitudeCached = Magnitude::Find(magnitude->publicID());
		if ( magnitudeCached ) {
			if ( magnitudeCached->parent() ) {
				if ( magnitudeCached->parent() == this )
					SEISCOMP_ERROR("Origin::add(Magnitude*) -> element with same publicID has been added already");
				else
					SEISCOMP_ERROR("Origin::add(Magnitude*) -> element with same publicID has been added already to another object");
				return false;
			}
			else
				magnitude = magnitudeCached;
		}
	}

	// Add the element
	_magnitudes.push_back(magnitude);
	magnitude->setParent(this);

	// Create the notifiers
	if ( Notifier::IsEnabled() ) {
		NotifierCreator nc(OP_ADD);
		magnitude->accept(&nc);
	}

	// Notify registered observers
	childAdded(magnitude);
	
	return true;
}
Esempio n. 7
0
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bool Comment::detachFrom(PublicObject* object) {
	if ( object == NULL ) return false;

	// check all possible parents
	MomentTensor* momentTensor = MomentTensor::Cast(object);
	if ( momentTensor != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return momentTensor->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = momentTensor->comment(index());
			if ( child != NULL )
				return momentTensor->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(MomentTensor): comment has not been found");
				return false;
			}
		}
	}
	FocalMechanism* focalMechanism = FocalMechanism::Cast(object);
	if ( focalMechanism != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return focalMechanism->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = focalMechanism->comment(index());
			if ( child != NULL )
				return focalMechanism->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(FocalMechanism): comment has not been found");
				return false;
			}
		}
	}
	Amplitude* amplitude = Amplitude::Cast(object);
	if ( amplitude != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return amplitude->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = amplitude->comment(index());
			if ( child != NULL )
				return amplitude->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Amplitude): comment has not been found");
				return false;
			}
		}
	}
	Magnitude* magnitude = Magnitude::Cast(object);
	if ( magnitude != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return magnitude->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = magnitude->comment(index());
			if ( child != NULL )
				return magnitude->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Magnitude): comment has not been found");
				return false;
			}
		}
	}
	StationMagnitude* stationMagnitude = StationMagnitude::Cast(object);
	if ( stationMagnitude != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return stationMagnitude->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = stationMagnitude->comment(index());
			if ( child != NULL )
				return stationMagnitude->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(StationMagnitude): comment has not been found");
				return false;
			}
		}
	}
	Pick* pick = Pick::Cast(object);
	if ( pick != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return pick->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = pick->comment(index());
			if ( child != NULL )
				return pick->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Pick): comment has not been found");
				return false;
			}
		}
	}
	Event* event = Event::Cast(object);
	if ( event != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return event->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = event->comment(index());
			if ( child != NULL )
				return event->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Event): comment has not been found");
				return false;
			}
		}
	}
	Origin* origin = Origin::Cast(object);
	if ( origin != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return origin->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = origin->comment(index());
			if ( child != NULL )
				return origin->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Origin): comment has not been found");
				return false;
			}
		}
	}
	Parameter* parameter = Parameter::Cast(object);
	if ( parameter != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return parameter->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = parameter->comment(index());
			if ( child != NULL )
				return parameter->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Parameter): comment has not been found");
				return false;
			}
		}
	}
	ParameterSet* parameterSet = ParameterSet::Cast(object);
	if ( parameterSet != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return parameterSet->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = parameterSet->comment(index());
			if ( child != NULL )
				return parameterSet->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(ParameterSet): comment has not been found");
				return false;
			}
		}
	}
	Stream* stream = Stream::Cast(object);
	if ( stream != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return stream->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = stream->comment(index());
			if ( child != NULL )
				return stream->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Stream): comment has not been found");
				return false;
			}
		}
	}
	SensorLocation* sensorLocation = SensorLocation::Cast(object);
	if ( sensorLocation != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return sensorLocation->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = sensorLocation->comment(index());
			if ( child != NULL )
				return sensorLocation->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(SensorLocation): comment has not been found");
				return false;
			}
		}
	}
	Station* station = Station::Cast(object);
	if ( station != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return station->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = station->comment(index());
			if ( child != NULL )
				return station->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Station): comment has not been found");
				return false;
			}
		}
	}
	Network* network = Network::Cast(object);
	if ( network != NULL ) {
		// If the object has been added already to the parent locally
		// just remove it by pointer
		if ( object == parent() )
			return network->remove(this);
		// The object has not been added locally so it must be looked up
		else {
			Comment* child = network->comment(index());
			if ( child != NULL )
				return network->remove(child);
			else {
				SEISCOMP_DEBUG("Comment::detachFrom(Network): comment has not been found");
				return false;
			}
		}
	}

	SEISCOMP_ERROR("Comment::detachFrom(%s) -> wrong class type", object->className());
	return false;
}