Newer
Older
TB_Chris / TbAlgorithms / src / .svn / text-base / TbTrackVolume.cpp.svn-base
  1. #include "Event/TbTrack.h"
  2.  
  3. #include "TbTrackVolume.h"
  4.  
  5. //=============================================================================
  6. // Constructor
  7. //=============================================================================
  8. TbTrackVolume::TbTrackVolume(const std::string& vol_shape,
  9. const unsigned int& nPlanes, const double& r,
  10. const double& rY, const double& theta,
  11. const double& thetaY,
  12. const unsigned int& minNClusters)
  13. : m_r(r),
  14. m_rY(rY),
  15. m_r2(r * r),
  16. m_theta(theta),
  17. m_thetaY(thetaY),
  18. m_seed_cluster(NULL),
  19. m_nPlanes(nPlanes),
  20. m_MinNClusters(minNClusters) {
  21.  
  22. if (vol_shape == "cylinder") {
  23. m_3vol_shape = VolShape::Cylinder;
  24. } else if (vol_shape == "diabolo") {
  25. m_3vol_shape = VolShape::Diabolo;
  26. } else if (vol_shape == "sqDiabolo") {
  27. m_3vol_shape = VolShape::SqDiabolo;
  28. } else {
  29. // Use default shape.
  30. m_3vol_shape = VolShape::Cylinder;
  31. }
  32. }
  33.  
  34. //=============================================================================
  35. // Initialise with a given seed cluster.
  36. //=============================================================================
  37. void TbTrackVolume::reset(LHCb::TbCluster* c) {
  38.  
  39. m_clusters.clear();
  40. m_clusters.resize(m_nPlanes, std::vector<LHCb::TbCluster*>());
  41. m_clusters[c->plane()].push_back(c);
  42. m_seed_cluster = c;
  43. m_done = false;
  44. }
  45.  
  46. //=============================================================================
  47. // Check if a given cluster is within the volume.
  48. //=============================================================================
  49. void TbTrackVolume::consider_cluster(LHCb::TbCluster* c) {
  50.  
  51. bool inside = false;
  52. switch (m_3vol_shape) {
  53. case VolShape::Cylinder:
  54. inside = consider_cluster_cylinder(c);
  55. break;
  56. case VolShape::Diabolo:
  57. inside = consider_cluster_diabolo(c);
  58. break;
  59. case VolShape::SqDiabolo:
  60. inside = consider_cluster_sqDiabolo(c);
  61. break;
  62. default:
  63. break;
  64. }
  65. if (inside) {
  66. m_clusters[c->plane()].push_back(c);
  67. }
  68. }
  69.  
  70. //=============================================================================
  71. bool TbTrackVolume::consider_cluster_sqDiabolo(const LHCb::TbCluster* c_out)
  72. const {
  73.  
  74. const double delx = c_out->x() - seed()->x();
  75. const double dely = c_out->y() - seed()->y();
  76. const double dz = fabs(c_out->z() - seed()->z());
  77. const double r_x = dz * m_theta + m_r;
  78. const double r_y = dz * m_thetaY + m_rY;
  79. if (delx < r_x && dely < r_y) return true;
  80. return false;
  81. }
  82.  
  83. //=============================================================================
  84. bool TbTrackVolume::consider_cluster_diabolo(const LHCb::TbCluster* c) const {
  85.  
  86. const double delx = c->x() - seed()->x();
  87. const double dely = c->y() - seed()->y();
  88. const double r_z = m_r + fabs(c->z() - m_seed_cluster->z()) * m_theta;
  89. return (delx * delx + dely * dely < r_z * r_z);
  90. }
  91.  
  92. //=============================================================================
  93. bool TbTrackVolume::notAlreadyConsidered(const LHCb::TbCluster* c) const {
  94. bool result = true;
  95. for (unsigned int i = 0; i < m_clusters[c->plane()].size(); i++) {
  96. if (m_clusters[c->plane()][i]->key() == c->key()) result = false;
  97. }
  98. return result;
  99. }
  100.  
  101. //=============================================================================
  102. bool TbTrackVolume::consider_cluster_cylinder(const LHCb::TbCluster* c) const {
  103. const double delx = c->x() - seed()->x();
  104. const double dely = c->y() - seed()->y();
  105. if ((delx * delx + dely * dely) < m_r2 && notAlreadyConsidered(c)) {
  106. return true;
  107. }
  108. return false;
  109. }
  110.  
  111. //=============================================================================
  112. // Return the number of track combinations that can be made from this volume
  113. //=============================================================================
  114. unsigned int TbTrackVolume::nCombos() {
  115.  
  116. if (m_done) return m_nCombos;
  117. // Remove empty planes.
  118. for (unsigned int i = 0; i < m_clusters.size(); i++) {
  119. if (m_clusters[i].size() == 0) {
  120. m_clusters.erase(m_clusters.begin() + i);
  121. i--;
  122. }
  123. }
  124. m_combo_counters.assign(m_clusters.size(), 0);
  125.  
  126. if (m_clusters.size() < m_MinNClusters) {
  127. m_nCombos = 0;
  128. } else {
  129. m_nCombos = 1;
  130. for (unsigned int i = 0; i < m_clusters.size(); i++) {
  131. m_nCombos *= m_clusters[i].size();
  132. }
  133. }
  134. m_done = true;
  135. return m_nCombos;
  136. }
  137.  
  138. //=============================================================================
  139. // Make a track from the current combination of clusters
  140. //=============================================================================
  141. void TbTrackVolume::get_track_combo(LHCb::TbTrack* track) {
  142.  
  143. for (unsigned int iplane = 0; iplane < m_clusters.size(); iplane++) {
  144. const int ic = m_combo_counters[iplane];
  145. track->addToClusters(m_clusters[iplane][ic]);
  146. }
  147. }
  148.  
  149. //=============================================================================
  150. // Get the next combination of clusters
  151. //=============================================================================
  152. void TbTrackVolume::increment_combo_counters() {
  153. const int n = m_combo_counters.size() - 1;
  154. m_combo_counters[n] += 1;
  155.  
  156. // Adaptive clock.
  157. for (int i = n; i >= 1; i--) {
  158. if (m_combo_counters[i] >= m_clusters[i].size()) {
  159. m_combo_counters[i] = 0;
  160. m_combo_counters[i - 1] += 1;
  161. }
  162. }
  163. }