Program Listing for File BreakCondition.cpp

Return to documentation for file (src/module/BreakCondition.cpp)

#include "crpropa/module/BreakCondition.h"
#include "crpropa/ParticleID.h"
#include "crpropa/Units.h"

#include <sstream>

namespace crpropa {

MaximumTrajectoryLength::MaximumTrajectoryLength(double maxLength) :
                maxLength(maxLength) {
}

void MaximumTrajectoryLength::setMaximumTrajectoryLength(double length) {
        maxLength = length;
}

double MaximumTrajectoryLength::getMaximumTrajectoryLength() const {
        return maxLength;
}

void MaximumTrajectoryLength::addObserverPosition(const Vector3d& position) {
        observerPositions.push_back(position);
}

const std::vector<Vector3d>& MaximumTrajectoryLength::getObserverPositions() const {
        return observerPositions;
}

std::string MaximumTrajectoryLength::getDescription() const {
        std::stringstream s;
        s << "Maximum trajectory length: " << maxLength / Mpc << " Mpc, ";
        s << "Flag: '" << rejectFlagKey << "' -> '" << rejectFlagValue << "', ";
        s << "MakeInactive: " << (makeRejectedInactive ? "yes" : "no");
        if (rejectAction.valid())
                s << ", Action: " << rejectAction->getDescription();
        s << "\n  Observer positions: \n";
        for (size_t i = 0; i < observerPositions.size(); i++)
                s << "    - " << observerPositions[i] / Mpc << " Mpc\n";
        return s.str();
}

void MaximumTrajectoryLength::process(Candidate *c) const {
        double length = c->getTrajectoryLength();
        Vector3d position = c->current.getPosition();

        if(observerPositions.size()) {
                bool inRange = false;
                for (size_t i = 0; i < observerPositions.size(); i++) {
                        double distance = position.getDistanceTo(observerPositions[i]);
                        if (distance + length < maxLength)
                                inRange = true;
                }
                if (!inRange) {
                        reject(c);
                        return;
                }
        }

        if (length >= maxLength) {
                reject(c);
        } else {
                c->limitNextStep(maxLength - length);
        }
}

//*****************************************************************************
MinimumEnergy::MinimumEnergy(double minEnergy) :
                minEnergy(minEnergy) {
}

void MinimumEnergy::setMinimumEnergy(double energy) {
        minEnergy = energy;
}

double MinimumEnergy::getMinimumEnergy() const {
        return minEnergy;
}

void MinimumEnergy::process(Candidate *c) const {
        if (c->current.getEnergy() > minEnergy)
                return;
        else
                reject(c);
}

std::string MinimumEnergy::getDescription() const {
        std::stringstream s;
        s << "Minimum energy: " << minEnergy / EeV << " EeV, ";
        s << "Flag: '" << rejectFlagKey << "' -> '" << rejectFlagValue << "', ";
        s << "MakeInactive: " << (makeRejectedInactive ? "yes" : "no");
        if (rejectAction.valid())
                s << ", Action: " << rejectAction->getDescription();
        return s.str();
}

//*****************************************************************************
MinimumRigidity::MinimumRigidity(double minRigidity) :
                minRigidity(minRigidity) {
}

void MinimumRigidity::setMinimumRigidity(double minRigidity) {
        this->minRigidity = minRigidity;
}

double MinimumRigidity::getMinimumRigidity() const {
        return minRigidity;
}

void MinimumRigidity::process(Candidate *c) const {
        if (c->current.getRigidity() < minRigidity)
                reject(c);
}

std::string MinimumRigidity::getDescription() const {
        std::stringstream s;
        s << "Minimum rigidity: " << minRigidity / EeV << " EeV, ";
        s << "Flag: '" << rejectFlagKey << "' -> '" << rejectFlagValue << "', ";
        s << "MakeInactive: " << (makeRejectedInactive ? "yes" : "no");
        if (rejectAction.valid())
                s << ", Action: " << rejectAction->getDescription();
        return s.str();
}

//*****************************************************************************
MinimumRedshift::MinimumRedshift(double zmin) :
                zmin(zmin) {
}

void MinimumRedshift::setMinimumRedshift(double z) {
        zmin = z;
}

double MinimumRedshift::getMinimumRedshift() {
        return zmin;
}

void MinimumRedshift::process(Candidate* c) const {
        if (c->getRedshift() > zmin)
                return;
        else
                reject(c);
}

std::string MinimumRedshift::getDescription() const {
        std::stringstream s;
        s << "Minimum redshift: " << zmin << ", ";
        s << "Flag: '" << rejectFlagKey << "' -> '" << rejectFlagValue << "', ";
        s << "MakeInactive: " << (makeRejectedInactive ? "yes" : "no");
        if (rejectAction.valid())
                s << ", Action: " << rejectAction->getDescription();
        return s.str();
}

//*****************************************************************************
MinimumChargeNumber::MinimumChargeNumber(int minChargeNumber) :
                minChargeNumber(minChargeNumber) {
}

void MinimumChargeNumber::setMinimumChargeNumber(int chargeNumber) {
        minChargeNumber = chargeNumber;
}

int MinimumChargeNumber::getMinimumChargeNumber() const {
        return minChargeNumber;
}

void MinimumChargeNumber::process(Candidate *c) const {
        if (chargeNumber(c->current.getId()) > minChargeNumber)
                return;
        else
                reject(c);
}

std::string MinimumChargeNumber::getDescription() const {
        std::stringstream s;
        s << "Minimum charge number: " << minChargeNumber;
        s << "Flag: '" << rejectFlagKey << "' -> '" << rejectFlagValue << "', ";
        s << "MakeInactive: " << (makeRejectedInactive ? "yes" : "no");
        if (rejectAction.valid())
                s << ", Action: " << rejectAction->getDescription();
        return s.str();
}

//*****************************************************************************
MinimumEnergyPerParticleId::MinimumEnergyPerParticleId(double minEnergyOthers) {
        setMinimumEnergyOthers(minEnergyOthers);
}

void MinimumEnergyPerParticleId::add(int id, double energy) {
        particleIds.push_back(id);
        minEnergies.push_back(energy);
}

void MinimumEnergyPerParticleId::setMinimumEnergyOthers(double energy) {
        minEnergyOthers = energy;
}

double MinimumEnergyPerParticleId::getMinimumEnergyOthers() const {
        return minEnergyOthers;
}

void MinimumEnergyPerParticleId::process(Candidate *c) const {
        for (int i = 0; i < particleIds.size(); i++) {
                if (c->current.getId() == particleIds[i]) {
                        if (c->current.getEnergy() < minEnergies[i])
                                reject(c);
                        else
                                return;
                }
        }

        if (c->current.getEnergy() < minEnergyOthers)
                reject(c);
        else
                return;
}

std::string MinimumEnergyPerParticleId::getDescription() const {
        std::stringstream s;
        s << "Minimum energy for non-specified particles: " << minEnergyOthers / eV << " eV";
        for (int i = 0; i < minEnergies.size(); i++) {
                s << "  for particle " << particleIds[i] << " : " << minEnergies[i] / eV << " eV";
        }
        s << "Flag: '" << rejectFlagKey << "' -> '" << rejectFlagValue << "', ";
        s << "MakeInactive: " << (makeRejectedInactive ? "yes" : "no");
        if (rejectAction.valid())
                s << ", Action: " << rejectAction->getDescription();
        return s.str();
}

//*****************************************************************************
DetectionLength::DetectionLength(double detLength) :
                detLength(detLength) {
}

void DetectionLength::setDetectionLength(double length) {
        detLength = length;
}

double DetectionLength::getDetectionLength() const {
        return detLength;
}


std::string DetectionLength::getDescription() const {
        std::stringstream s;
        s << "Detection length: " << detLength / kpc << " kpc, ";
        s << "Flag: '" << rejectFlagKey << "' -> '" << rejectFlagValue << "', ";
        s << "MakeInactive: " << (makeRejectedInactive ? "yes" : "no");
        if (rejectAction.valid())
                s << ", Action: " << rejectAction->getDescription();
        return s.str();
}

void DetectionLength::process(Candidate *c) const {
        double length = c->getTrajectoryLength();
        double step = c->getCurrentStep();

        if (length >= detLength && length - step < detLength) {
                reject(c);
        } else {
                c->limitNextStep(detLength - length);
        }
}


} // namespace crpropa