Warning, file /geant4/examples/advanced/dna/moleculardna/src/ChromosomeMapper.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include "ChromosomeMapper.hh"
0030
0031 #include "ChromosomeMessenger.hh"
0032 #include "DNAHashing.hh"
0033 #include "VirtualChromosome.hh"
0034
0035 #include <fstream>
0036 #include <sstream>
0037
0038
0039
0040 ChromosomeMapper::ChromosomeMapper() : fChromosomes({})
0041 {
0042 fpChromosomeMessenger = new ChromosomeMessenger(this);
0043 fpChromosomeFactory = new ChromosomeFactory();
0044 }
0045
0046
0047
0048 ChromosomeMapper::~ChromosomeMapper()
0049 {
0050 delete fpChromosomeMessenger;
0051 delete fpChromosomeFactory;
0052 }
0053
0054
0055
0056 [[maybe_unused]] G4String ChromosomeMapper::GetCurrentChromosomeKey(const G4ThreeVector& pos) const
0057 {
0058 G4String key = "";
0059 for (const auto& Chromosome : fChromosomes) {
0060 if (Chromosome.second->PointInChromosome(pos)) {
0061
0062 key = Chromosome.second->GetName();
0063 break;
0064 }
0065 }
0066 return key;
0067 }
0068
0069
0070
0071 [[maybe_unused]] VirtualChromosome* ChromosomeMapper::GetChromosome(const G4ThreeVector& pos) const
0072 {
0073 for (const auto& fChromosome : fChromosomes) {
0074 if (fChromosome.second->PointInChromosome(pos)) {
0075 return fChromosome.second;
0076 }
0077 }
0078 return nullptr;
0079 }
0080
0081
0082
0083 [[maybe_unused]] VirtualChromosome* ChromosomeMapper::GetChromosome(const G4String& key) const
0084 {
0085 uint32_t key_i = G4::hashing::crc32::Hash(key);
0086
0087 try {
0088 return fChromosomes.at(key_i);
0089 }
0090 catch (const std::out_of_range& oor) {
0091 G4cout << "Chromosome does not exist with key: " << key << G4endl;
0092 return nullptr;
0093 }
0094 }
0095
0096
0097
0098 void ChromosomeMapper::AddChromosome(const G4String& key, const std::vector<G4String>& commands)
0099 {
0100 uint32_t key_i = G4::hashing::crc32::Hash(key);
0101
0102 auto it = fChromosomes.find(key_i);
0103
0104 if (it == fChromosomes.end()) {
0105 auto* newChromosome = ChromosomeFactory::MakeChromosome(key, commands);
0106 fChromosomes.emplace(key_i, newChromosome);
0107 }
0108 else {
0109 G4ExceptionDescription errmsg;
0110 errmsg << "ChromosomeMapper:: "
0111 << "Chromosome already exists with key: " << key << G4endl;
0112 G4Exception("ChromosomeMapper::AddChromosome", "", FatalException, errmsg);
0113 }
0114 }
0115
0116
0117
0118 void ChromosomeMapper::SavePlotData(const G4String& filename)
0119 {
0120 std::fstream fs(filename, std::fstream::in | std::fstream::out | std::fstream::trunc);
0121 for (auto& fChromosome : fChromosomes) {
0122 fs << fChromosome.second->Plot();
0123 }
0124 fs.close();
0125 }
0126
0127
0128 [[maybe_unused]] std::vector<G4String> ChromosomeMapper::GetChromosomeKeys() const
0129 {
0130 std::vector<G4String> keys;
0131 for (const auto& fChromosome : fChromosomes) {
0132 keys.push_back(fChromosome.second->GetName());
0133 }
0134 return keys;
0135 }
0136
0137
0138
0139 void ChromosomeMapper::Test()
0140 {
0141 fpChromosomeFactory->Test();
0142 }