Classes | Public Member Functions | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Member Functions | List of all members
lar_content::ThreeDKinkBaseTool Class Referenceabstract

ThreeDKinkBaseTool class. More...

#include <ThreeDKinkBaseTool.h>

Inheritance diagram for lar_content::ThreeDKinkBaseTool:
lar_content::TransverseTensorTool lar_content::OvershootTracksTool lar_content::UndershootTracksTool

Classes

class  Modification
 Modification class. More...
 

Public Member Functions

 ThreeDKinkBaseTool (const unsigned int nCommonClusters)
 Constructor. More...
 
virtual ~ThreeDKinkBaseTool ()
 Destructor. More...
 
bool Run (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, TensorType &overlapTensor)
 Run the algorithm tool. More...
 

Protected Types

typedef std::vector< ModificationModificationList
 

Protected Member Functions

virtual bool PassesElementCuts (TensorType::ElementList::const_iterator eIter, const pandora::ClusterSet &usedClusters) const
 Whether a provided (iterator to a) tensor element passes the selection cuts for overshoot identification. More...
 
virtual void GetIteratorListModifications (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const IteratorList &iteratorList, ModificationList &modificationList) const =0
 Get modification objects for a specific elements of the tensor, identifying required splits and merges for clusters. More...
 
float GetXSamplingPoint (const pandora::CartesianVector &splitPosition1, const bool isForwardInX, const TwoDSlidingFitResult &fitResult1, const TwoDSlidingFitResult &fitResult2, const TwoDSlidingFitResult &fitResult3) const
 Get a sampling point in x that is common to sliding linear fit objects in three views. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Static Protected Member Functions

static bool IsALowestInX (const LArPointingCluster &pointingClusterA, const LArPointingCluster &pointingClusterB)
 Whether pointing cluster labelled A extends to lowest x positions (as opposed to that labelled B) More...
 

Protected Attributes

unsigned int m_nCommonClusters
 The number of common clusters. More...
 
bool m_majorityRulesMode
 Whether to run in majority rules mode (always split overshoots, always merge undershoots) More...
 
float m_minMatchedFraction
 The min matched sampling point fraction for use as a key tensor element. More...
 
unsigned int m_minMatchedSamplingPoints
 The min number of matched sampling points for use as a key tensor element. More...
 
float m_minLongitudinalImpactParameter
 The min longitudinal impact parameter for connecting accompanying clusters. More...
 
int m_nLayersForKinkSearch
 The number of sliding fit layers to step in the kink search. More...
 
float m_additionalXStepForKinkSearch
 An additional (safety) step to tack-on when choosing x sampling points. More...
 

Private Member Functions

void GetModifications (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const TensorType &overlapTensor, ModificationList &modificationList) const
 Get modification objects, identifying required splits and merges for clusters. More...
 
void SelectTensorElements (TensorType::ElementList::const_iterator eIter, const TensorType::ElementList &elementList, const pandora::ClusterSet &usedClusters, IteratorList &iteratorList) const
 Select elements representing possible components of interest due to overshoots or undershoots in clustering. More...
 
bool ApplyChanges (ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const ModificationList &modificationList) const
 Apply the changes cached in a modification list and update the tensor accordingly. More...
 

Additional Inherited Members

- Public Types inherited from lar_content::TransverseTensorTool
typedef ThreeViewTransverseTracksAlgorithm::MatchingType::TensorType TensorType
 
typedef std::vector< TensorType::ElementList::const_iteratorIteratorList
 

Detailed Description

ThreeDKinkBaseTool class.

Definition at line 21 of file ThreeDKinkBaseTool.h.

Member Typedef Documentation

Definition at line 50 of file ThreeDKinkBaseTool.h.

Constructor & Destructor Documentation

lar_content::ThreeDKinkBaseTool::ThreeDKinkBaseTool ( const unsigned int  nCommonClusters)

Constructor.

Parameters
nCommonClustersthe number of common clusters to select

Definition at line 22 of file ThreeDKinkBaseTool.cc.

22  :
23  m_nCommonClusters(nCommonClusters),
24  m_majorityRulesMode(false),
30 {
31  if (!((1 == m_nCommonClusters) || (2 == m_nCommonClusters)))
32  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
33 }
unsigned int m_nCommonClusters
The number of common clusters.
int m_nLayersForKinkSearch
The number of sliding fit layers to step in the kink search.
float m_additionalXStepForKinkSearch
An additional (safety) step to tack-on when choosing x sampling points.
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for use as a key tensor element.
bool m_majorityRulesMode
Whether to run in majority rules mode (always split overshoots, always merge undershoots) ...
float m_minLongitudinalImpactParameter
The min longitudinal impact parameter for connecting accompanying clusters.
float m_minMatchedFraction
The min matched sampling point fraction for use as a key tensor element.
lar_content::ThreeDKinkBaseTool::~ThreeDKinkBaseTool ( )
virtual

Destructor.

Definition at line 37 of file ThreeDKinkBaseTool.cc.

38 {
39 }

Member Function Documentation

bool lar_content::ThreeDKinkBaseTool::ApplyChanges ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
const ModificationList modificationList 
) const
private

Apply the changes cached in a modification list and update the tensor accordingly.

Parameters
pAlgorithmaddress of the calling algorithm
modificationListthe modification list
Returns
whether changes to the tensor have been made

Definition at line 188 of file ThreeDKinkBaseTool.cc.

189 {
190  ClusterMergeMap consolidatedMergeMap;
191  SplitPositionMap consolidatedSplitMap;
192 
193  for (const Modification &modification : modificationList)
194  {
195  ClusterList parentClusters;
196  for (const auto &mapEntry : modification.m_clusterMergeMap)
197  parentClusters.push_back(mapEntry.first);
198  parentClusters.sort(LArClusterHelper::SortByNHits);
199 
200  for (const Cluster *const pParentCluster : parentClusters)
201  {
202  const ClusterList &daughterClusters(modification.m_clusterMergeMap.at(pParentCluster));
203 
204  for (const Cluster *const pDaughterCluster : daughterClusters)
205  {
206  if (consolidatedMergeMap.count(pDaughterCluster))
207  throw StatusCodeException(STATUS_CODE_FAILURE);
208  }
209 
210  ClusterList &targetClusterList(consolidatedMergeMap[pParentCluster]);
211  targetClusterList.insert(targetClusterList.end(), daughterClusters.begin(), daughterClusters.end());
212  }
213 
214  ClusterList splitClusters;
215  for (const auto &mapEntry : modification.m_splitPositionMap)
216  splitClusters.push_back(mapEntry.first);
217  splitClusters.sort(LArClusterHelper::SortByNHits);
218 
219  for (const Cluster *const pSplitCluster : splitClusters)
220  {
221  const CartesianPointVector &splitPositions(modification.m_splitPositionMap.at(pSplitCluster));
222 
223  CartesianPointVector &cartesianPointVector(consolidatedSplitMap[pSplitCluster]);
224  cartesianPointVector.insert(cartesianPointVector.end(), splitPositions.begin(), splitPositions.end());
225  }
226  }
227 
228  bool changesMade(false);
229  changesMade |= pAlgorithm->MakeClusterMerges(consolidatedMergeMap);
230  changesMade |= pAlgorithm->MakeClusterSplits(consolidatedSplitMap);
231 
232  return changesMade;
233 }
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
std::unordered_map< const pandora::Cluster *, pandora::CartesianPointVector > SplitPositionMap
std::unordered_map< const pandora::Cluster *, pandora::ClusterList > ClusterMergeMap
virtual void lar_content::ThreeDKinkBaseTool::GetIteratorListModifications ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
const IteratorList iteratorList,
ModificationList modificationList 
) const
protectedpure virtual

Get modification objects for a specific elements of the tensor, identifying required splits and merges for clusters.

Parameters
pAlgorithmaddress of the calling algorithm
iteratorListlist of iterators to relevant tensor elements
modificationListto be populated with modifications

Implemented in lar_content::OvershootTracksTool, and lar_content::UndershootTracksTool.

void lar_content::ThreeDKinkBaseTool::GetModifications ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
const TensorType overlapTensor,
ModificationList modificationList 
) const
private

Get modification objects, identifying required splits and merges for clusters.

Parameters
pAlgorithmaddress of the calling algorithm
overlapTensorthe overlap tensor
modificationListto be populated with modifications

Definition at line 140 of file ThreeDKinkBaseTool.cc.

142 {
143  ClusterSet usedClusters;
144  ClusterVector sortedKeyClusters;
145  overlapTensor.GetSortedKeyClusters(sortedKeyClusters);
146 
147  for (const Cluster *const pKeyCluster : sortedKeyClusters)
148  {
149  if (!pKeyCluster->IsAvailable())
150  continue;
151 
152  unsigned int nU(0), nV(0), nW(0);
153  TensorType::ElementList elementList;
154  overlapTensor.GetConnectedElements(pKeyCluster, true, elementList, nU, nV, nW);
155 
156  if (nU * nV * nW < 2)
157  continue;
158 
159  for (TensorType::ElementList::const_iterator eIter = elementList.begin(); eIter != elementList.end(); ++eIter)
160  {
161  if (!this->PassesElementCuts(eIter, usedClusters))
162  continue;
163 
164  IteratorList iteratorList;
165  this->SelectTensorElements(eIter, elementList, usedClusters, iteratorList);
166 
167  if (iteratorList.size() < 2)
168  continue;
169 
170  ModificationList localModificationList;
171  this->GetIteratorListModifications(pAlgorithm, iteratorList, localModificationList);
172 
173  if (localModificationList.empty())
174  continue;
175 
176  for (ModificationList::const_iterator mIter = localModificationList.begin(), mIterEnd = localModificationList.end(); mIter != mIterEnd; ++mIter)
177  {
178  usedClusters.insert(mIter->m_affectedClusters.begin(), mIter->m_affectedClusters.end());
179  }
180 
181  modificationList.insert(modificationList.end(), localModificationList.begin(), localModificationList.end());
182  }
183  }
184 }
std::vector< Modification > ModificationList
std::vector< TensorType::ElementList::const_iterator > IteratorList
virtual void GetIteratorListModifications(ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const IteratorList &iteratorList, ModificationList &modificationList) const =0
Get modification objects for a specific elements of the tensor, identifying required splits and merge...
intermediate_table::const_iterator const_iterator
void SelectTensorElements(TensorType::ElementList::const_iterator eIter, const TensorType::ElementList &elementList, const pandora::ClusterSet &usedClusters, IteratorList &iteratorList) const
Select elements representing possible components of interest due to overshoots or undershoots in clus...
virtual bool PassesElementCuts(TensorType::ElementList::const_iterator eIter, const pandora::ClusterSet &usedClusters) const
Whether a provided (iterator to a) tensor element passes the selection cuts for overshoot identificat...
std::vector< art::Ptr< recob::Cluster > > ClusterVector
float lar_content::ThreeDKinkBaseTool::GetXSamplingPoint ( const pandora::CartesianVector &  splitPosition1,
const bool  isForwardInX,
const TwoDSlidingFitResult fitResult1,
const TwoDSlidingFitResult fitResult2,
const TwoDSlidingFitResult fitResult3 
) const
protected

Get a sampling point in x that is common to sliding linear fit objects in three views.

Parameters
splitPosition1the split position in view 1
isForwardInXwhether to work forwards (or backwards) in x
fitResult1the sliding fit result in view 1
fitResult2the sliding fit result in view 2
fitResult3the sliding fit result in view 3
Returns
the sampling point

Definition at line 59 of file ThreeDKinkBaseTool.cc.

61 {
62  // Nearest common x position
66  fitResult1.GetMinAndMaxX(xMin1, xMax1);
67  fitResult2.GetMinAndMaxX(xMin2, xMax2);
68  fitResult3.GetMinAndMaxX(xMin3, xMax3);
69 
70  const float commonX(isForwardInX ? std::max(xMin1, std::max(xMin2, xMin3)) : std::min(xMax1, std::min(xMax2, xMax3)));
71 
72  if (isForwardInX && ((commonX > xMax1) || (commonX > xMax2) || (commonX > xMax3)))
73  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
74 
75  if (!isForwardInX && ((commonX < xMin1) || (commonX < xMin2) || (commonX < xMin3)))
76  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
77 
78  // Layer step x position
79  float rL1(0.f), rT1(0.f);
80  fitResult1.GetLocalPosition(splitPosition1, rL1, rT1);
81  const int splitLayer(fitResult1.GetLayer(rL1));
82 
83  const int lowLayer(std::max(fitResult1.GetMinLayer(), std::min(fitResult1.GetMaxLayer(), splitLayer - m_nLayersForKinkSearch)));
84  const int highLayer(std::max(fitResult1.GetMinLayer(), std::min(fitResult1.GetMaxLayer(), splitLayer + m_nLayersForKinkSearch)));
85 
86  CartesianVector minus(0.f, 0.f, 0.f), plus(0.f, 0.f, 0.f);
87  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, fitResult1.GetGlobalFitPosition(fitResult1.GetL(lowLayer), minus));
88  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, fitResult1.GetGlobalFitPosition(fitResult1.GetL(highLayer), plus));
89 
90  if (minus.GetX() > plus.GetX())
91  {
92  CartesianVector temporary(minus);
93  minus = plus;
94  plus = temporary;
95  }
96 
97  const float layerStepX(isForwardInX ? plus.GetX() : minus.GetX());
98 
99  // Final x position selection
100  const float chosenX(isForwardInX ? std::max(layerStepX, commonX) : std::min(layerStepX, commonX));
101  const float finalX(isForwardInX ? chosenX + m_additionalXStepForKinkSearch : chosenX - m_additionalXStepForKinkSearch);
102  return finalX;
103 }
int m_nLayersForKinkSearch
The number of sliding fit layers to step in the kink search.
static int max(int a, int b)
float m_additionalXStepForKinkSearch
An additional (safety) step to tack-on when choosing x sampling points.
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
Definition: statistics.h:55
bool lar_content::ThreeDKinkBaseTool::IsALowestInX ( const LArPointingCluster pointingClusterA,
const LArPointingCluster pointingClusterB 
)
staticprotected

Whether pointing cluster labelled A extends to lowest x positions (as opposed to that labelled B)

Parameters
pointingClusterApointing cluster A
pointingClusterBpointing cluster B

Definition at line 107 of file ThreeDKinkBaseTool.cc.

108 {
109  if ((pointingClusterA.GetInnerVertex().GetPosition().GetX() < pointingClusterB.GetInnerVertex().GetPosition().GetX()) &&
110  (pointingClusterA.GetInnerVertex().GetPosition().GetX() < pointingClusterB.GetOuterVertex().GetPosition().GetX()))
111  {
112  return true;
113  }
114 
115  if ((pointingClusterA.GetOuterVertex().GetPosition().GetX() < pointingClusterB.GetInnerVertex().GetPosition().GetX()) &&
116  (pointingClusterA.GetOuterVertex().GetPosition().GetX() < pointingClusterB.GetOuterVertex().GetPosition().GetX()))
117  {
118  return true;
119  }
120 
121  return false;
122 }
bool lar_content::ThreeDKinkBaseTool::PassesElementCuts ( TensorType::ElementList::const_iterator  eIter,
const pandora::ClusterSet &  usedClusters 
) const
protectedvirtual

Whether a provided (iterator to a) tensor element passes the selection cuts for overshoot identification.

Parameters
eIterthe iterator to the tensor element
usedClustersthe list of used clusters

Definition at line 43 of file ThreeDKinkBaseTool.cc.

44 {
45  if (usedClusters.count(eIter->GetClusterU()) || usedClusters.count(eIter->GetClusterV()) || usedClusters.count(eIter->GetClusterW()))
46  return false;
47 
48  if (eIter->GetOverlapResult().GetMatchedFraction() < m_minMatchedFraction)
49  return false;
50 
51  if (eIter->GetOverlapResult().GetNMatchedSamplingPoints() < m_minMatchedSamplingPoints)
52  return false;
53 
54  return true;
55 }
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for use as a key tensor element.
float m_minMatchedFraction
The min matched sampling point fraction for use as a key tensor element.
StatusCode lar_content::ThreeDKinkBaseTool::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
protected

Definition at line 277 of file ThreeDKinkBaseTool.cc.

278 {
279  PANDORA_RETURN_RESULT_IF_AND_IF(
280  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MajorityRulesMode", m_majorityRulesMode));
281 
282  PANDORA_RETURN_RESULT_IF_AND_IF(
283  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinMatchedFraction", m_minMatchedFraction));
284 
285  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
286  XmlHelper::ReadValue(xmlHandle, "MinMatchedSamplingPoints", m_minMatchedSamplingPoints));
287 
288  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
289  XmlHelper::ReadValue(xmlHandle, "MinLongitudinalImpactParameter", m_minLongitudinalImpactParameter));
290 
291  PANDORA_RETURN_RESULT_IF_AND_IF(
292  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "NLayersForKinkSearch", m_nLayersForKinkSearch));
293 
294  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
295  XmlHelper::ReadValue(xmlHandle, "AdditionalXStepForKinkSearch", m_additionalXStepForKinkSearch));
296 
297  return STATUS_CODE_SUCCESS;
298 }
int m_nLayersForKinkSearch
The number of sliding fit layers to step in the kink search.
float m_additionalXStepForKinkSearch
An additional (safety) step to tack-on when choosing x sampling points.
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for use as a key tensor element.
bool m_majorityRulesMode
Whether to run in majority rules mode (always split overshoots, always merge undershoots) ...
float m_minLongitudinalImpactParameter
The min longitudinal impact parameter for connecting accompanying clusters.
float m_minMatchedFraction
The min matched sampling point fraction for use as a key tensor element.
bool lar_content::ThreeDKinkBaseTool::Run ( ThreeViewTransverseTracksAlgorithm *const  pAlgorithm,
TensorType overlapTensor 
)
virtual

Run the algorithm tool.

Parameters
pAlgorithmaddress of the calling algorithm
overlapTensorthe overlap tensor
Returns
whether changes have been made by the tool

Implements lar_content::TransverseTensorTool.

Definition at line 126 of file ThreeDKinkBaseTool.cc.

127 {
128  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
129  std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
130 
131  ModificationList modificationList;
132  this->GetModifications(pAlgorithm, overlapTensor, modificationList);
133  const bool changesMade(this->ApplyChanges(pAlgorithm, modificationList));
134 
135  return changesMade;
136 }
std::vector< Modification > ModificationList
bool ApplyChanges(ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const ModificationList &modificationList) const
Apply the changes cached in a modification list and update the tensor accordingly.
void GetModifications(ThreeViewTransverseTracksAlgorithm *const pAlgorithm, const TensorType &overlapTensor, ModificationList &modificationList) const
Get modification objects, identifying required splits and merges for clusters.
QTextStream & endl(QTextStream &s)
void lar_content::ThreeDKinkBaseTool::SelectTensorElements ( TensorType::ElementList::const_iterator  eIter,
const TensorType::ElementList elementList,
const pandora::ClusterSet &  usedClusters,
IteratorList iteratorList 
) const
private

Select elements representing possible components of interest due to overshoots or undershoots in clustering.

Parameters
eIteriterator to a candidate element
elementListthe provided element list
usedClustersthe list of used clusters
iteratorListto receive a list of iterators to relevant elements

Definition at line 237 of file ThreeDKinkBaseTool.cc.

239 {
240  iteratorList.push_back(eIter);
241 
242  for (TensorType::ElementList::const_iterator eIter2 = elementList.begin(); eIter2 != elementList.end(); ++eIter2)
243  {
244  if (eIter == eIter2)
245  continue;
246 
247  if (!this->PassesElementCuts(eIter2, usedClusters))
248  continue;
249 
250  for (IteratorList::const_iterator iIter = iteratorList.begin(); iIter != iteratorList.end(); ++iIter)
251  {
252  if ((*iIter) == eIter2)
253  continue;
254 
255  unsigned int nMatchedClusters(0);
256 
257  if ((*iIter)->GetClusterU() == eIter2->GetClusterU())
258  ++nMatchedClusters;
259 
260  if ((*iIter)->GetClusterV() == eIter2->GetClusterV())
261  ++nMatchedClusters;
262 
263  if ((*iIter)->GetClusterW() == eIter2->GetClusterW())
264  ++nMatchedClusters;
265 
266  if (m_nCommonClusters == nMatchedClusters)
267  {
268  iteratorList.push_back(eIter2);
269  return;
270  }
271  }
272  }
273 }
unsigned int m_nCommonClusters
The number of common clusters.
intermediate_table::const_iterator const_iterator
virtual bool PassesElementCuts(TensorType::ElementList::const_iterator eIter, const pandora::ClusterSet &usedClusters) const
Whether a provided (iterator to a) tensor element passes the selection cuts for overshoot identificat...

Member Data Documentation

float lar_content::ThreeDKinkBaseTool::m_additionalXStepForKinkSearch
protected

An additional (safety) step to tack-on when choosing x sampling points.

Definition at line 100 of file ThreeDKinkBaseTool.h.

bool lar_content::ThreeDKinkBaseTool::m_majorityRulesMode
protected

Whether to run in majority rules mode (always split overshoots, always merge undershoots)

Definition at line 95 of file ThreeDKinkBaseTool.h.

float lar_content::ThreeDKinkBaseTool::m_minLongitudinalImpactParameter
protected

The min longitudinal impact parameter for connecting accompanying clusters.

Definition at line 98 of file ThreeDKinkBaseTool.h.

float lar_content::ThreeDKinkBaseTool::m_minMatchedFraction
protected

The min matched sampling point fraction for use as a key tensor element.

Definition at line 96 of file ThreeDKinkBaseTool.h.

unsigned int lar_content::ThreeDKinkBaseTool::m_minMatchedSamplingPoints
protected

The min number of matched sampling points for use as a key tensor element.

Definition at line 97 of file ThreeDKinkBaseTool.h.

unsigned int lar_content::ThreeDKinkBaseTool::m_nCommonClusters
protected

The number of common clusters.

Definition at line 94 of file ThreeDKinkBaseTool.h.

int lar_content::ThreeDKinkBaseTool::m_nLayersForKinkSearch
protected

The number of sliding fit layers to step in the kink search.

Definition at line 99 of file ThreeDKinkBaseTool.h.


The documentation for this class was generated from the following files: