Program Listing for File ParticleCollector.cpp

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

#include "crpropa/module/ParticleCollector.h"
#include "crpropa/module/TextOutput.h"
#include "crpropa/Units.h"

namespace crpropa {

ParticleCollector::ParticleCollector() : nBuffer(10e6), clone(false), recursive(false)  {
        container.reserve(nBuffer); // for 1e6 candidates ~ 500MB of RAM
}

ParticleCollector::ParticleCollector(const std::size_t nBuffer) : clone(false), recursive(false)  {
        container.reserve(nBuffer);
}

ParticleCollector::ParticleCollector(const std::size_t nBuffer, const bool clone) : recursive(false) {
        container.reserve(nBuffer);
}

ParticleCollector::ParticleCollector(const std::size_t nBuffer, const bool clone, const bool recursive) {
        container.reserve(nBuffer);
}

void ParticleCollector::process(Candidate *c) const {
#pragma omp critical
        {
                if(clone)
                        container.push_back(c->clone(recursive));
                else
                        container.push_back(c);
        }
}

void ParticleCollector::process(ref_ptr<Candidate> c) const {
        ParticleCollector::process((Candidate*) c);
}

void ParticleCollector::reprocess(Module *action) const {
        for (ParticleCollector::iterator itr = container.begin(); itr != container.end(); ++itr){
                if (clone)
                        action->process((*(itr->get())).clone(false));
                else
                        action->process(itr->get());
        }
}

void ParticleCollector::dump(const std::string &filename) const {
        TextOutput output(filename.c_str(), Output::Everything);
        reprocess(&output);
        output.close();
}

void ParticleCollector::load(const std::string &filename){
        TextOutput::load(filename.c_str(), this);
}

ParticleCollector::~ParticleCollector() {
        clearContainer();
}

std::size_t ParticleCollector::size() const {
        return container.size();
}

ref_ptr<Candidate> ParticleCollector::operator[](const std::size_t i) const {
        return container[i];
}

void ParticleCollector::clearContainer() {
        container.clear();
}

std::vector<ref_ptr<Candidate> >& ParticleCollector::getContainer() const {
        return container;
}

void ParticleCollector::setClone(bool b) {
        clone = b;
}

bool ParticleCollector::getClone() const {
        return clone;
}

std::string ParticleCollector::getDescription() const {
        return "ParticleCollector";
}

ParticleCollector::iterator ParticleCollector::begin() {
        return container.begin();
}

ParticleCollector::const_iterator ParticleCollector::begin() const {
        return container.begin();
}

ParticleCollector::iterator ParticleCollector::end() {
        return container.end();
}

ParticleCollector::const_iterator ParticleCollector::end() const {
        return container.end();
}

void ParticleCollector::getTrajectory(ModuleList* mlist, std::size_t i, Module *output) const {
        ref_ptr<Candidate> c_tmp = container[i]->clone();

        c_tmp->restart();

        mlist->add(output);
        mlist->run(c_tmp);
        mlist->remove(mlist->size()-1);
}

void ParticleCollector::getTrajectory(ref_ptr<ModuleList> mlist, std::size_t i, ref_ptr<Module> output) const {
        ParticleCollector::getTrajectory((ModuleList*) mlist, i, (Module*) output);
}

} // namespace crpropa