00001
00002
00003 #ifndef SI_CLUSTER_H
00004 #define SI_CLUSTER_H 1
00005
00006 #include "geometry/Point.h"
00007 #include "data/SiData.h"
00008
00009 #include <iostream>
00010
00011 class SiClusters
00012 {
00013 public:
00014 class Cluster;
00015
00016 private:
00017
00018 class Tray
00019 {
00020 private:
00021 friend class SiClusters;
00022
00023 public:
00024
00025 Tray (int m);
00026 ~Tray ();
00027
00028 void flagHit (unsigned int idx);
00029 void flagHit (enum SiData::Axis , unsigned int );
00030 void unflagHit (unsigned int idx);
00031 void unflagHit (enum SiData::Axis , unsigned int );
00032 void clearHitFlags ();
00033
00034
00035
00036 unsigned int module;
00037 std::vector<Cluster *> xhitList;
00038 std::vector<Cluster *> yhitList;
00039 };
00040
00041
00042
00043 public:
00044
00045 class Cluster
00046 {
00047 public:
00048 friend class SiClusters;
00049 Cluster (Point p, int n);
00050 Cluster (Point p, int n, int ns);
00051
00052 int flag;
00053 int number;
00054 int num_noise;
00055 Point pos;
00056 };
00057
00058 public:
00059
00060 explicit SiClusters (int ntrays );
00061
00062 ~SiClusters ();
00063
00064
00065
00066
00067 void loadFrom (const SiData& data);
00068
00069
00070
00071 void clear ();
00072
00073
00074 int nHits (enum SiData::Axis a, int trayNum) const;
00075
00076 Point nextHit (int trayN, int* index);
00077
00078
00079 Point nextHit (enum SiData::Axis a, int trayN, int* index);
00080
00081 Point nearestHitInside( unsigned int trayNum, float dR,
00082 const Point& x0, int* index);
00083
00084 Point nearestHitInside( unsigned int trayNum, float dX, float dY,
00085 const Point& x0, int* index);
00086
00087 Point nearestHitInside( enum SiData::Axis a, unsigned int trayNum,
00088 float dX, const Point& x0, int* index);
00089
00090 Point nearestHitOutside( unsigned int trayNum, float dR,
00091 const Point& x0, int* index);
00092
00093
00094 Point nearestHitOutside( enum SiData::Axis a, unsigned int trayNum,
00095 float dX, const Point& x0, int* index);
00096
00097 Point meanHit (unsigned int trayNum, float* rmsX, float* rmsY);
00098
00099 Point meanHit (enum SiData::Axis axis, unsigned int trayNum, float* rms);
00100
00101
00102 Point meanHitInside (unsigned int trayNum, float dXY, const Point& x0);
00103
00104
00105 int numberOfHitsNear( unsigned int trayNum, float dX, float dY,
00106 const Point& x0);
00107 int numberOfHitsNear( unsigned int trayNum, float dR, const Point& x0);
00108 int numberOfHitsNear( enum SiData::Axis a, unsigned int trayNum, float dR,
00109 const Point& x0);
00110
00111 int clusterSize(enum SiData::Axis a, unsigned int index);
00112
00113 Point clusterPosition(enum SiData::Axis a, unsigned int index);
00114
00115
00116 int clusterNoise(enum SiData::Axis a, unsigned int index);
00117
00118 bool hitFlagged(enum SiData::Axis a, unsigned int index);
00119
00120 void flagHit (unsigned int index);
00121 void flagHit (enum SiData::Axis a, unsigned int index);
00122
00123 void unflagHit (unsigned int index);
00124
00125 void unflagHit (enum SiData::Axis a, unsigned int index);
00126
00127
00128 void clearHitFlags ();
00129
00130 void printOn (std::ostream& cout = std::cout);
00131
00132 static int tower(int indexhit);
00133
00134 private:
00135
00136 SiClusters::Tray* getTrayFor (int lyr, int mod);
00137
00138 void transferData (enum SiData::Axis a, const SiData& data,
00139 int lyr, int start, int stop);
00140
00141
00142
00143 std::vector< std::vector< Tray *> > trayList;
00144
00145 };
00146
00147
00148
00149
00150 inline SiClusters::Tray::Tray (int m) : module(m) {}
00151
00152 inline SiClusters::Tray::~Tray ()
00153 {
00154 std::vector<Cluster *>::iterator it = xhitList.begin();
00155 for ( ; it != xhitList.end(); it++ ) {
00156 delete *it;
00157 }
00158 xhitList.clear();
00159
00160 for ( it = yhitList.begin(); it != yhitList.end(); it++ ) {
00161 delete *it;
00162 }
00163 yhitList.clear();
00164 }
00165
00166
00167
00168 inline SiClusters::Cluster::Cluster (Point p, int n, int ns)
00169 : flag(0), number(n), num_noise(ns), pos(p) {}
00170
00171 inline SiClusters::Cluster::Cluster (Point p, int n)
00172 : flag(0), number(n), num_noise(0), pos(p) {}
00173
00174 #endif
00175