All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Functions
SBNRecoUtils Namespace Reference

Functions

std::vector< geo::BoxBoundedGeoActiveVolumes (const geo::GeometryCore *geometry)
 
std::vector< std::vector
< geo::BoxBoundedGeo > > 
TPCVolumes (const geo::GeometryCore *geometry)
 
geo::BoxBoundedGeo DetectorVolume (const geo::GeometryCore *geometry)
 
double MaxLength (const geo::GeometryCore *geometry)
 
int TrueParticleID (const core::ProviderManager &manager, const art::Ptr< recob::Hit > hit, bool rollup_unsaved_ids=1)
 
int TrueParticleIDFromTotalTrueEnergy (const core::ProviderManager &manager, const std::vector< art::Ptr< recob::Hit > > &hits, bool rollup_unsaved_ids=1)
 
int TrueParticleIDFromTotalRecoCharge (const core::ProviderManager &manager, const std::vector< art::Ptr< recob::Hit > > &hits, bool rollup_unsaved_ids=1)
 
int TrueParticleIDFromTotalRecoHits (const core::ProviderManager &manager, const std::vector< art::Ptr< recob::Hit > > &hits, bool rollup_unsaved_ids=1)
 
bool IsInsideTPC (const core::ProviderManager &manager, TVector3 position, double distance_buffer)
 
double CalculateTrackLength (const core::ProviderManager &manager, const art::Ptr< recob::Track > track)
 
double TrackCompletion (const core::ProviderManager &manager, int mcparticle_id, const std::vector< art::Ptr< recob::Hit >> &reco_track_hits)
 

Function Documentation

std::vector< geo::BoxBoundedGeo > SBNRecoUtils::ActiveVolumes ( const geo::GeometryCore geometry)

Definition at line 3 of file GeoUtil.cc.

3  {
4  std::vector<std::vector<geo::BoxBoundedGeo>> tpc_volumes = TPCVolumes(geometry);;
5  std::vector<geo::BoxBoundedGeo> active_volumes;
6 
7  // make each cryostat volume a box enclosing all tpc volumes
8  for (const std::vector<geo::BoxBoundedGeo> &tpcs: tpc_volumes) {
9  double XMin = std::min_element(tpcs.begin(), tpcs.end(), [](auto &lhs, auto &rhs) { return lhs.MinX() < rhs.MinX(); })->MinX();
10  double YMin = std::min_element(tpcs.begin(), tpcs.end(), [](auto &lhs, auto &rhs) { return lhs.MinY() < rhs.MinY(); })->MinY();
11  double ZMin = std::min_element(tpcs.begin(), tpcs.end(), [](auto &lhs, auto &rhs) { return lhs.MinZ() < rhs.MinZ(); })->MinZ();
12 
13  double XMax = std::max_element(tpcs.begin(), tpcs.end(), [](auto &lhs, auto &rhs) { return lhs.MaxX() < rhs.MaxX(); })->MaxX();
14  double YMax = std::max_element(tpcs.begin(), tpcs.end(), [](auto &lhs, auto &rhs) { return lhs.MaxY() < rhs.MaxY(); })->MaxY();
15  double ZMax = std::max_element(tpcs.begin(), tpcs.end(), [](auto &lhs, auto &rhs) { return lhs.MaxZ() < rhs.MaxZ(); })->MaxZ();
16 
17  active_volumes.emplace_back(XMin, XMax, YMin, YMax, ZMin, ZMax);
18  }
19  return active_volumes;
20 }
std::vector< std::vector< geo::BoxBoundedGeo > > TPCVolumes(const geo::GeometryCore *geometry)
Definition: GeoUtil.cc:49
double SBNRecoUtils::CalculateTrackLength ( const core::ProviderManager manager,
const art::Ptr< recob::Track track 
)

Definition at line 163 of file sbnana/sbnanalysis/ana/SBNOscReco/RecoUtils/RecoUtils.cc.

163  {
164  double length = 0;
165  if (track->NumberTrajectoryPoints()==1) return length; //Nothing to calculate if there is only one point
166 
167  for (size_t i_tp = 0; i_tp < track->NumberTrajectoryPoints()-1; i_tp++){ //Loop from the first to 2nd to last point
168  TVector3 this_point(track->TrajectoryPoint(i_tp).position.X(),track->TrajectoryPoint(i_tp).position.Y(),track->TrajectoryPoint(i_tp).position.Z());
169  if (!SBNRecoUtils::IsInsideTPC(manager, this_point,0)){
170  std::cout<<"SBNRecoUtils::CalculateTrackLength - Current trajectory point not in the TPC volume. Skip over this point in the track length calculation"<<std::endl;
171  continue;
172  }
173  TVector3 next_point(track->TrajectoryPoint(i_tp+1).position.X(),track->TrajectoryPoint(i_tp+1).position.Y(),track->TrajectoryPoint(i_tp+1).position.Z());
174  if (!SBNRecoUtils::IsInsideTPC(manager, next_point,0)){
175  std::cout<<"SBNRecoUtils::CalculateTrackLength - Next trajectory point not in the TPC volume. Skip over this point in the track length calculation"<<std::endl;
176  continue;
177  }
178 
179  length+=(next_point-this_point).Mag();
180  }
181  return length;
182 }
process_name use argoneut_mc_hitfinder track
bool IsInsideTPC(const core::ProviderManager &manager, TVector3 position, double distance_buffer)
BEGIN_PROLOG could also be cout
geo::BoxBoundedGeo SBNRecoUtils::DetectorVolume ( const geo::GeometryCore geometry)

Definition at line 35 of file GeoUtil.cc.

35  {
36  std::vector<geo::BoxBoundedGeo> active_volumes = ActiveVolumes(geometry);
37 
38  double XMin = std::min_element(active_volumes.begin(), active_volumes.end(), [](auto &lhs, auto &rhs) { return lhs.MinX() < rhs.MinX(); })->MinX();
39  double YMin = std::min_element(active_volumes.begin(), active_volumes.end(), [](auto &lhs, auto &rhs) { return lhs.MinY() < rhs.MinY(); })->MinY();
40  double ZMin = std::min_element(active_volumes.begin(), active_volumes.end(), [](auto &lhs, auto &rhs) { return lhs.MinZ() < rhs.MinZ(); })->MinZ();
41 
42  double XMax = std::max_element(active_volumes.begin(), active_volumes.end(), [](auto &lhs, auto &rhs) { return lhs.MaxX() < rhs.MaxX(); })->MaxX();
43  double YMax = std::max_element(active_volumes.begin(), active_volumes.end(), [](auto &lhs, auto &rhs) { return lhs.MaxY() < rhs.MaxY(); })->MaxY();
44  double ZMax = std::max_element(active_volumes.begin(), active_volumes.end(), [](auto &lhs, auto &rhs) { return lhs.MaxZ() < rhs.MaxZ(); })->MaxZ();
45 
46  return geo::BoxBoundedGeo(XMin, XMax, YMin, YMax, ZMin, ZMax);
47 }
std::vector< geo::BoxBoundedGeo > ActiveVolumes(const geo::GeometryCore *geometry)
Definition: GeoUtil.cc:3
A base class aware of world box coordinatesAn object describing a simple shape can inherit from this ...
Definition: BoxBoundedGeo.h:33
bool SBNRecoUtils::IsInsideTPC ( const core::ProviderManager manager,
TVector3  position,
double  distance_buffer 
)

Definition at line 113 of file sbnana/sbnanalysis/ana/SBNOscReco/RecoUtils/RecoUtils.cc.

113  {
114  double vtx[3] = {position.X(), position.Y(), position.Z()};
115  bool inside = false;
116  const geo::GeometryCore* geom = manager.GetGeometryProvider();
117  geo::TPCID idtpc = geom->FindTPCAtPosition(vtx);
118 
119  if (geom->HasTPC(idtpc))
120  {
121  const geo::TPCGeo& tpcgeo = geom->GetElement(idtpc);
122  double minx = tpcgeo.MinX(); double maxx = tpcgeo.MaxX();
123  double miny = tpcgeo.MinY(); double maxy = tpcgeo.MaxY();
124  double minz = tpcgeo.MinZ(); double maxz = tpcgeo.MaxZ();
125 
126  for (size_t c = 0; c < geom->Ncryostats(); c++)
127  {
128  const geo::CryostatGeo& cryostat = geom->Cryostat(c);
129  for (size_t t = 0; t < cryostat.NTPC(); t++)
130  {
131  const geo::TPCGeo& tpcg = cryostat.TPC(t);
132  if (tpcg.MinX() < minx) minx = tpcg.MinX();
133  if (tpcg.MaxX() > maxx) maxx = tpcg.MaxX();
134  if (tpcg.MinY() < miny) miny = tpcg.MinY();
135  if (tpcg.MaxY() > maxy) maxy = tpcg.MaxY();
136  if (tpcg.MinZ() < minz) minz = tpcg.MinZ();
137  if (tpcg.MaxZ() > maxz) maxz = tpcg.MaxZ();
138  }
139  }
140 
141  //x
142  double dista = fabs(minx - position.X());
143  double distb = fabs(position.X() - maxx);
144  if ((position.X() > minx) && (position.X() < maxx) &&
145  (dista > distance_buffer) && (distb > distance_buffer)) inside = true;
146  //y
147  dista = fabs(maxy - position.Y());
148  distb = fabs(position.Y() - miny);
149  if (inside && (position.Y() > miny) && (position.Y() < maxy) &&
150  (dista > distance_buffer) && (distb > distance_buffer)) inside = true;
151  else inside = false;
152  //z
153  dista = fabs(maxz - position.Z());
154  distb = fabs(position.Z() - minz);
155  if (inside && (position.Z() > minz) && (position.Z() < maxz) &&
156  (dista > distance_buffer) && (distb > distance_buffer)) inside = true;
157  else inside = false;
158  }
159 
160  return inside;
161 }
CryostatGeo const & GetElement(geo::CryostatID const &cryoid) const
double MinX() const
Returns the world x coordinate of the start of the box.
Definition: BoxBoundedGeo.h:88
Geometry information for a single TPC.
Definition: TPCGeo.h:38
double MaxX() const
Returns the world x coordinate of the end of the box.
Definition: BoxBoundedGeo.h:91
Geometry information for a single cryostat.
Definition: CryostatGeo.h:43
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
const geo::GeometryCore * GetGeometryProvider() const
geo::TPCID FindTPCAtPosition(double const worldLoc[3]) const
Returns the ID of the TPC at specified location.
double MinZ() const
Returns the world z coordinate of the start of the box.
unsigned int NTPC() const
Number of TPCs in this cryostat.
Definition: CryostatGeo.h:181
CryostatGeo const & Cryostat(geo::CryostatID const &cryoid) const
Returns the specified cryostat.
The data type to uniquely identify a TPC.
Definition: geo_types.h:386
Description of geometry of one entire detector.
double MaxY() const
Returns the world y coordinate of the end of the box.
bool HasTPC(geo::TPCID const &tpcid) const
Returns whether we have the specified TPC.
const TPCGeo & TPC(unsigned int itpc) const
Return the itpc&#39;th TPC in the cryostat.
Definition: CryostatGeo.cxx:93
double MaxZ() const
Returns the world z coordinate of the end of the box.
double MinY() const
Returns the world y coordinate of the start of the box.
double SBNRecoUtils::MaxLength ( const geo::GeometryCore geometry)

Definition at line 22 of file GeoUtil.cc.

22  {
23  std::vector<geo::BoxBoundedGeo> active_volumes = ActiveVolumes(geometry);
24  double max_length = -1;
25  for (const geo::BoxBoundedGeo &vol: active_volumes) {
26  double X = vol.MaxX() - vol.MinX();
27  double Y = vol.MaxY() - vol.MinY();
28  double Z = vol.MaxZ() - vol.MinZ();
29  double this_length = sqrt(X*X + Y*Y + Z*Z);
30  if (this_length > max_length) max_length = this_length;
31  }
32  return max_length;
33 }
std::vector< geo::BoxBoundedGeo > ActiveVolumes(const geo::GeometryCore *geometry)
Definition: GeoUtil.cc:3
then echo echo For and will not be changed by echo further linking echo echo B echo The symbol is in the uninitialized data multiple common symbols may appear with the echo same name If the symbol is defined the common echo symbols are treated as undefined references For more echo details on common see the discussion of warn common echo in *Note Linker see the discussion of warn common echo in *Note Linker such as a global int variable echo as opposed to a large global array echo echo I echo The symbol is an indirect reference to another symbol This echo is a GNU extension to the a out object file format which is echo rarely used echo echo N echo The symbol is a debugging symbol echo echo R echo The symbol is in a read only data section echo echo S echo The symbol is in an uninitialized data section for small echo objects echo echo T echo The symbol is in the the normal defined echo symbol is used with no error When a weak undefined symbol echo is linked and the symbol is not the value of the echo weak symbol becomes zero with no error echo echo W echo The symbol is a weak symbol that has not been specifically echo tagged as a weak object symbol When a weak defined symbol echo is linked with a normal defined the normal defined echo symbol is used with no error When a weak undefined symbol echo is linked and the symbol is not the value of the echo weak symbol becomes zero with no error echo echo echo The symbol is a stabs symbol in an a out object file In echo this the next values printed are the stabs other echo the stabs desc and the stab type Stabs symbols are echo used to hold debugging information For more echo see *Note or object file format specific echo echo For Mac OS X
A base class aware of world box coordinatesAn object describing a simple shape can inherit from this ...
Definition: BoxBoundedGeo.h:33
std::vector< std::vector< geo::BoxBoundedGeo > > SBNRecoUtils::TPCVolumes ( const geo::GeometryCore geometry)

Definition at line 49 of file GeoUtil.cc.

49  {
50  std::vector<std::vector<geo::BoxBoundedGeo>> tpc_volumes;
51  for (auto const &cryo: geometry->IterateCryostats()) {
52  geo::GeometryCore::TPC_iterator iTPC = geometry->begin_TPC(cryo.ID()),
53  tend = geometry->end_TPC(cryo.ID());
54  std::vector<geo::BoxBoundedGeo> this_tpc_volumes;
55  while (iTPC != tend) {
56  geo::TPCGeo const& TPC = *iTPC;
57  this_tpc_volumes.push_back(TPC.ActiveBoundingBox());
58  iTPC++;
59  }
60  tpc_volumes.push_back(std::move(this_tpc_volumes));
61  }
62  return tpc_volumes;
63 }
Geometry information for a single TPC.
Definition: TPCGeo.h:38
geo::BoxBoundedGeo const & ActiveBoundingBox() const
Returns the box of the active volume of this TPC.
Definition: TPCGeo.h:320
BEGIN_PROLOG TPC
TPC_iterator begin_TPC() const
Returns an iterator pointing to the first TPC in the detector.
IteratorBox< cryostat_iterator,&GeometryCore::begin_cryostat,&GeometryCore::end_cryostat > IterateCryostats() const
Enables ranged-for loops on all cryostats of the detector.
Forward iterator browsing all geometry elements in the detector.
Definition: GeometryCore.h:727
TPC_iterator end_TPC() const
Returns an iterator pointing after the last TPC in the detector.
double SBNRecoUtils::TrackCompletion ( const core::ProviderManager manager,
int  mcparticle_id,
const std::vector< art::Ptr< recob::Hit >> &  reco_track_hits 
)

Definition at line 184 of file sbnana/sbnanalysis/ana/SBNOscReco/RecoUtils/RecoUtils.cc.

184  {
185  // get handle to back tracker
187 
188  // get all the IDE's of the truth track
189  const std::vector<const sim::IDE*> mcparticle_ides = bt->TrackIdToSimIDEs_Ps(mcparticle_id);
190  // sum it up
191  double mcparticle_energy = 0.;
192  for (auto const &ide: mcparticle_ides) {
193  mcparticle_energy += ide->energy;
194  }
195 
196  // get all the hits of the reco track that match the truth track
197  const std::vector<art::Ptr<recob::Hit>> matched_reco_track_hits = bt->TrackIdToHits_Ps(mcparticle_id, reco_track_hits);
198 
199  // for each of the hits get the energy coming from the track
200  double matched_reco_energy = 0.;
201  for (auto const &matched_reco_track_hit: matched_reco_track_hits) {
202  std::vector<sim::IDE> this_hit_IDEs = bt->HitToAvgSimIDEs(*matched_reco_track_hit);
203  for (auto const &ide: this_hit_IDEs) {
204  if (ide.trackID == mcparticle_id) {
205  matched_reco_energy += ide.energy;
206  }
207  }
208  }
209 
210  return matched_reco_energy / mcparticle_energy;
211 }
cheat::BackTracker * GetBackTrackerProvider() const
std::vector< art::Ptr< recob::Hit > > TrackIdToHits_Ps(detinfo::DetectorClocksData const &clockData, int tkId, std::vector< art::Ptr< recob::Hit >> const &hitsIn) const
Definition: BackTracker.cc:235
std::vector< const sim::IDE * > TrackIdToSimIDEs_Ps(int const &id) const
Definition: BackTracker.cc:63
std::vector< sim::IDE > HitToAvgSimIDEs(detinfo::DetectorClocksData const &clockData, recob::Hit const &hit) const
Definition: BackTracker.cc:305
int SBNRecoUtils::TrueParticleID ( const core::ProviderManager manager,
const art::Ptr< recob::Hit hit,
bool  rollup_unsaved_ids = 1 
)

Definition at line 3 of file sbnana/sbnanalysis/ana/SBNOscReco/RecoUtils/RecoUtils.cc.

3  {
4  std::map<int,double> id_to_energy_map;
5  const cheat::BackTracker *bt_serv = manager.GetBackTrackerProvider();
6  std::vector<sim::TrackIDE> track_ides = bt_serv->HitToTrackIDEs(hit);
7  for (unsigned int idIt = 0; idIt < track_ides.size(); ++idIt) {
8  int id = track_ides.at(idIt).trackID;
9  if (rollup_unsaved_ids) id = std::abs(id);
10  double energy = track_ides.at(idIt).energy;
11  id_to_energy_map[id]+=energy;
12  }
13  //Now loop over the map to find the maximum contributor
14  double likely_particle_contrib_energy = -99999;
15  int likely_track_id = 0;
16  for (std::map<int,double>::iterator mapIt = id_to_energy_map.begin(); mapIt != id_to_energy_map.end(); mapIt++){
17  double particle_contrib_energy = mapIt->second;
18  if (particle_contrib_energy > likely_particle_contrib_energy){
19  likely_particle_contrib_energy = particle_contrib_energy;
20  likely_track_id = mapIt->first;
21  }
22  }
23  return likely_track_id;
24 }
process_name hit
Definition: cheaterreco.fcl:51
cheat::BackTracker * GetBackTrackerProvider() const
std::vector< sim::TrackIDE > HitToTrackIDEs(detinfo::DetectorClocksData const &clockData, recob::Hit const &hit) const
Definition: BackTracker.cc:178
T abs(T value)
int SBNRecoUtils::TrueParticleIDFromTotalRecoCharge ( const core::ProviderManager manager,
const std::vector< art::Ptr< recob::Hit > > &  hits,
bool  rollup_unsaved_ids = 1 
)

Definition at line 58 of file sbnana/sbnanalysis/ana/SBNOscReco/RecoUtils/RecoUtils.cc.

58  {
59  // Make a map of the tracks which are associated with this object and the charge each contributes
60  std::map<int,double> trackMap;
61  for (std::vector<art::Ptr<recob::Hit> >::const_iterator hitIt = hits.begin(); hitIt != hits.end(); ++hitIt) {
62  art::Ptr<recob::Hit> hit = *hitIt;
63  int trackID = TrueParticleID(manager, hit, rollup_unsaved_ids);
64  trackMap[trackID] += hit->Integral();
65  }
66 
67  // Pick the track with the highest charge as the 'true track'
68  double highestCharge = 0;
69  int objectTrack = -99999;
70  for (std::map<int,double>::iterator trackIt = trackMap.begin(); trackIt != trackMap.end(); ++trackIt) {
71  if (trackIt->second > highestCharge) {
72  highestCharge = trackIt->second;
73  objectTrack = trackIt->first;
74  }
75  }
76  return objectTrack;
77 }
process_name hit
Definition: cheaterreco.fcl:51
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:265
int TrueParticleID(detinfo::DetectorClocksData const &clockData, const art::Ptr< recob::Hit > hit, bool rollup_unsaved_ids=1)
int SBNRecoUtils::TrueParticleIDFromTotalRecoHits ( const core::ProviderManager manager,
const std::vector< art::Ptr< recob::Hit > > &  hits,
bool  rollup_unsaved_ids = 1 
)

Definition at line 81 of file sbnana/sbnanalysis/ana/SBNOscReco/RecoUtils/RecoUtils.cc.

81  {
82  // Make a map of the tracks which are associated with this object and the number of hits they are the primary contributor to
83  std::map<int,int> trackMap;
84  for (std::vector<art::Ptr<recob::Hit> >::const_iterator hitIt = hits.begin(); hitIt != hits.end(); ++hitIt) {
85  art::Ptr<recob::Hit> hit = *hitIt;
86  int trackID = TrueParticleID(manager, hit, rollup_unsaved_ids);
87  trackMap[trackID]++;
88  }
89 
90  // Pick the track which is the primary contributor to the most hits as the 'true track'
91  int objectTrack = -99999;
92  int highestCount = -1;
93  int NHighestCounts = 0;
94  for (std::map<int,int>::iterator trackIt = trackMap.begin(); trackIt != trackMap.end(); ++trackIt) {
95  if (trackIt->second > highestCount) {
96  highestCount = trackIt->second;
97  objectTrack = trackIt->first;
98  NHighestCounts = 1;
99  }
100  else if (trackIt->second == highestCount){
101  NHighestCounts++;
102  }
103  }
104  if (NHighestCounts > 1){
105  std::cout<<"SBNRecoUtils::TrueParticleIDFromTotalRecoHits - There are " << NHighestCounts << " particles which tie for highest number of contributing hits (" << highestCount<<" hits). Using SBNRecoUtils::TrueParticleIDFromTotalTrueEnergy instead."<<std::endl;
106  objectTrack = SBNRecoUtils::TrueParticleIDFromTotalTrueEnergy(manager, hits,rollup_unsaved_ids);
107  }
108  return objectTrack;
109 }
process_name hit
Definition: cheaterreco.fcl:51
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:265
int TrueParticleIDFromTotalTrueEnergy(const core::ProviderManager &manager, const std::vector< art::Ptr< recob::Hit > > &hits, bool rollup_unsaved_ids=1)
BEGIN_PROLOG could also be cout
int TrueParticleID(detinfo::DetectorClocksData const &clockData, const art::Ptr< recob::Hit > hit, bool rollup_unsaved_ids=1)
int SBNRecoUtils::TrueParticleIDFromTotalTrueEnergy ( const core::ProviderManager manager,
const std::vector< art::Ptr< recob::Hit > > &  hits,
bool  rollup_unsaved_ids = 1 
)

Definition at line 28 of file sbnana/sbnanalysis/ana/SBNOscReco/RecoUtils/RecoUtils.cc.

28  {
29  const cheat::BackTracker *bt_serv = manager.GetBackTrackerProvider();
30  std::map<int,double> trackIDToEDepMap;
31  for (std::vector<art::Ptr<recob::Hit> >::const_iterator hitIt = hits.begin(); hitIt != hits.end(); ++hitIt) {
32  art::Ptr<recob::Hit> hit = *hitIt;
33  std::vector<sim::TrackIDE> trackIDs = bt_serv->HitToTrackIDEs(hit);
34  for (unsigned int idIt = 0; idIt < trackIDs.size(); ++idIt) {
35  int id = trackIDs[idIt].trackID;
36  if (rollup_unsaved_ids) id = std::abs(id);
37  trackIDToEDepMap[id] += trackIDs[idIt].energy;
38  }
39  }
40 
41  //Loop over the map and find the track which contributes the highest energy to the hit vector
42  double maxenergy = -1;
43  int objectTrack = -99999;
44  for (std::map<int,double>::iterator mapIt = trackIDToEDepMap.begin(); mapIt != trackIDToEDepMap.end(); mapIt++){
45  double energy = mapIt->second;
46  double trackid = mapIt->first;
47  if (energy > maxenergy){
48  maxenergy = energy;
49  objectTrack = trackid;
50  }
51  }
52 
53  return objectTrack;
54 }
process_name hit
Definition: cheaterreco.fcl:51
cheat::BackTracker * GetBackTrackerProvider() const
std::vector< sim::TrackIDE > HitToTrackIDEs(detinfo::DetectorClocksData const &clockData, recob::Hit const &hit) const
Definition: BackTracker.cc:178
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:265
T abs(T value)