/* This file is part of MAUS: http://micewww.pp.rl.ac.uk/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . */ #include "src/common_cpp/DataStructure/SciFiEvent.hh" namespace MAUS { SciFiEvent::SciFiEvent() { _scifidigits.resize(0); _scificlusters.resize(0); _scifispacepoints.resize(0); _scifiseeds.resize(0); _scifistraightprtracks.resize(0); _scifihelicalprtracks.resize(0); _scifitracks.resize(0); } SciFiEvent::SciFiEvent(const SciFiEvent& old_event) { *this = old_event; } SciFiEvent& SciFiEvent::operator=(const SciFiEvent& rhs) { if (this == &rhs) { return *this; } // Deep copy the digits _scifidigits.resize(rhs._scifidigits.size()); for (unsigned int i = 0; i < rhs._scifidigits.size(); ++i) { _scifidigits[i] = new SciFiDigit(*rhs._scifidigits[i]); } // Deep copy the clusters _scificlusters.resize(rhs._scificlusters.size()); for (unsigned int i = 0; i < rhs._scificlusters.size(); ++i) { _scificlusters[i] = new SciFiCluster(*rhs._scificlusters[i]); // Now set cross-pointers so they point to correct place in the new copy of the datastructure SciFiDigitPArray new_digits(rhs._scificlusters[i]->get_digits()->GetLast() + 1); for (unsigned int j = 0; j < new_digits.size(); ++j) { new_digits[j] = NULL; for (unsigned int k = 0; k < rhs._scifidigits.size(); ++k) { if (rhs._scificlusters[i]->get_digits()->At(j) == rhs._scifidigits[k]) { new_digits[j] = _scifidigits[k]; break; } } } _scificlusters[i]->set_digits_pointers(new_digits); } // Deep copy the spacepoints _scifispacepoints.resize(rhs._scifispacepoints.size()); for (unsigned int i = 0; i < rhs._scifispacepoints.size(); ++i) { _scifispacepoints[i] = new SciFiSpacePoint(*rhs._scifispacepoints[i]); // Now set cross-pointers so they point to correct place in the new copy of the datastructure SciFiClusterPArray new_clusters(rhs._scifispacepoints[i]->get_channels()->GetLast() + 1); for (unsigned int j = 0; j < new_clusters.size(); ++j) { new_clusters[j] = NULL; for (unsigned int k = 0; k < rhs._scificlusters.size(); ++k) { if (rhs._scifispacepoints[i]->get_channels()->At(j) == rhs._scificlusters[k]) { new_clusters[j] = _scificlusters[k]; break; } } } _scifispacepoints[i]->set_channels_pointers(new_clusters); } // Deep copy the seeds _scifiseeds.resize(rhs._scifiseeds.size()); for (unsigned int i = 0; i < rhs._scifiseeds.size(); ++i) { _scifiseeds[i] = new SciFiSpacePoint(*rhs._scifiseeds[i]); // Now set cross-pointers so they point to correct place in the new copy of the datastructure SciFiClusterPArray new_clusters(rhs._scifiseeds[i]->get_channels()->GetLast() + 1); for (unsigned int j = 0; j < new_clusters.size(); ++j) { new_clusters[j] = NULL; for (unsigned int k = 0; k < rhs._scificlusters.size(); ++k) { if (rhs._scifiseeds[i]->get_channels()->At(j) == rhs._scificlusters[k]) { new_clusters[j] = _scificlusters[k]; break; } } } _scifiseeds[i]->set_channels_pointers(new_clusters); } // Deep copy the straight pattern recognition tracks _scifistraightprtracks.resize(rhs._scifistraightprtracks.size()); for (unsigned int i = 0; i < rhs._scifistraightprtracks.size(); ++i) { _scifistraightprtracks[i] = new SciFiStraightPRTrack(*rhs._scifistraightprtracks[i]); // Now set cross-pointers so they point to correct place in the new copy of the datastructure SciFiSpacePointPArray new_sps(rhs._scifistraightprtracks[i]->get_spacepoints()->GetLast()+1); for (unsigned int j = 0; j < new_sps.size(); ++j) { new_sps[j] = NULL; for (unsigned int k = 0; k < rhs._scifispacepoints.size(); ++k) { if (rhs._scifistraightprtracks[i]->get_spacepoints_pointers()[j] == rhs._scifispacepoints[k]) { new_sps[j] = _scifispacepoints[k]; break; } } } _scifistraightprtracks[i]->set_spacepoints_pointers(new_sps); } // Deep copy the helical pattern recognition tracks _scifihelicalprtracks.resize(rhs._scifihelicalprtracks.size()); for (unsigned int i = 0; i < rhs._scifihelicalprtracks.size(); ++i) { _scifihelicalprtracks[i] = new SciFiHelicalPRTrack(*rhs._scifihelicalprtracks[i]); // Now set cross-pointers so they point to correct place in the new copy of the datastructure SciFiSpacePointPArray new_sps(rhs._scifihelicalprtracks[i]->get_spacepoints()->GetLast() + 1); for (unsigned int j = 0; j < new_sps.size(); ++j) { new_sps[j] = NULL; for (unsigned int k = 0; k < rhs._scifispacepoints.size(); ++k) { if (rhs._scifihelicalprtracks[i]->get_spacepoints()->At(j) == rhs._scifispacepoints[k]) { new_sps[j] = _scifispacepoints[k]; break; } } } _scifihelicalprtracks[i]->set_spacepoints_pointers(new_sps); } // Deep copy the kalman tracks _scifitracks.resize(rhs._scifitracks.size()); for (unsigned int iTrk = 0; iTrk < rhs._scifitracks.size(); ++iTrk) { _scifitracks[iTrk] = new SciFiTrack(*rhs._scifitracks[iTrk]); // Now set the cross-pointer to the PR track within the track so that it points to correct // place in the new copy of the datastructure, by searching for the PR track index in rhs // event, which matches the pointer address of the PR track in the rhs track. Use this to set // new track PR track to pointer to the correct PR track in the new event. SciFiBasePRTrack* new_pr_track = NULL; if (_scifitracks[iTrk]->GetAlgorithmUsed() == 0) { for (unsigned int iRst = 0; iRst < rhs._scifistraightprtracks.size(); ++iRst) { if (rhs._scifitracks[iTrk]->pr_track_pointer() == rhs._scifistraightprtracks[iRst]) { new_pr_track = _scifistraightprtracks[iRst]; break; } } } else { for (unsigned int iRhe = 0; iRhe < rhs._scifihelicalprtracks.size(); ++iRhe) { if (rhs._scifitracks[iTrk]->pr_track_pointer() == rhs._scifihelicalprtracks[iRhe]) { new_pr_track = _scifihelicalprtracks[iRhe]; break; } } } _scifitracks[iTrk]->set_pr_track_pointer(new_pr_track); } return *this; } SciFiEvent::~SciFiEvent() { std::vector::iterator digit; for (digit = _scifidigits.begin(); digit!= _scifidigits.end(); ++digit) { delete (*digit); } std::vector::iterator cluster; for (cluster = _scificlusters.begin(); cluster!= _scificlusters.end(); ++cluster) { delete (*cluster); } std::vector::iterator spoint; for (spoint = _scifispacepoints.begin(); spoint!= _scifispacepoints.end(); ++spoint) { delete (*spoint); } std::vector::iterator seed; for (seed = _scifiseeds.begin(); seed!= _scifiseeds.end(); ++seed) { delete (*seed); } std::vector::iterator strack; for (strack = _scifistraightprtracks.begin(); strack!= _scifistraightprtracks.end(); ++strack) { delete (*strack); } std::vector::iterator htrack; for (htrack = _scifihelicalprtracks.begin(); htrack!= _scifihelicalprtracks.end(); ++htrack) { delete (*htrack); } std::vector::iterator track; for (track = _scifitracks.begin(); track!= _scifitracks.end(); ++track) { delete (*track); } } void SciFiEvent::set_spacepoints_used_flag(bool flag) { for ( unsigned int i = 0; i < _scifispacepoints.size(); ++i ) { _scifispacepoints[i]->set_used(flag); } } } // ~namespace MAUS