#include <ClusterShape.h>
Public Member Functions | |
ClusterShape () | |
void | determineShape (const PixelGeomDetUnit &pixelDet, const SiPixelRecHit &recHit, ClusterData &data) |
~ClusterShape () | |
Private Member Functions | |
int | getDirection (int low, int hig, int olow, int ohig) |
bool | processColumn (std::pair< int, int > pos, bool inTheLoop) |
Private Attributes | |
int | hig |
int | low |
int | odir |
int | ohig |
int | olow |
int | x [2] |
int | y [2] |
Definition at line 10 of file ClusterShape.h.
ClusterShape::ClusterShape | ( | ) |
Definition at line 15 of file ClusterShape.cc.
{ }
ClusterShape::~ClusterShape | ( | ) |
Definition at line 20 of file ClusterShape.cc.
{ }
void ClusterShape::determineShape | ( | const PixelGeomDetUnit & | pixelDet, |
const SiPixelRecHit & | recHit, | ||
ClusterData & | data | ||
) |
Definition at line 97 of file ClusterShape.cc.
References SiPixelRecHit::cluster(), ClusterData::hasBigPixelsOnlyInside, ClusterData::isComplete, PixelTopology::isItBigPixelInX(), PixelTopology::isItBigPixelInY(), PixelTopology::isItEdgePixelInX(), PixelTopology::isItEdgePixelInY(), ClusterData::isStraight, pos, asciidump::s, ClusterData::size, python::multivaluedict::sort(), PixelGeomDetUnit::specificTopology(), x, and detailsBasic3DVector::y.
{ // Topology const PixelTopology * theTopology = (&(pixelDet.specificTopology())); // Initialize data.isStraight = true; data.isComplete = true; x[0] = -1; x[1] = -1; y[0] = -1; y[1] = -1; olow = -2; ohig = -2; odir = 0; low = 0; hig = 0; pair<int,int> pos; // Get sorted pixels vector<SiPixelCluster::Pixel> pixels = recHit.cluster()->pixels(); sort(pixels.begin(),pixels.end(),lessPixel()); // Look at all the pixels for(vector<SiPixelCluster::Pixel>::const_iterator pixel = pixels.begin(); pixel!= pixels.end(); pixel++) { // Position pos.first = (int)pixel->x; pos.second = (int)pixel->y; // Check if at the edge or big if(theTopology->isItEdgePixelInX(pos.first) || theTopology->isItEdgePixelInY(pos.second)) { data.isComplete = false; } // break; } // Check if straight if(pos.first > x[1]) { // column ready if(processColumn(pos, true) == false) { data.isStraight = false; } // break; } } else { // increasing column if(pos.second > hig+1) // at least a pixel is missing { data.isStraight = false; } // break; } hig = pos.second; } } // Check if straight, process last column if(processColumn(pos, false) == false) data.isStraight = false; // Treat clusters with big pixel(s) inside for(int ix = recHit.cluster()->minPixelRow() + 1; ix < recHit.cluster()->maxPixelRow(); ix++) if(theTopology->isItBigPixelInX(ix)) x[1]++; for(int iy = recHit.cluster()->minPixelCol() + 1; iy < recHit.cluster()->maxPixelCol(); iy++) if(theTopology->isItBigPixelInY(iy)) y[1]++; // Treat clusters with bix pixel(s) outside, FIXME FIXME int px = 0; if(theTopology->isItBigPixelInX(recHit.cluster()->minPixelRow())) px++; if(theTopology->isItBigPixelInX(recHit.cluster()->maxPixelRow())) px++; int py = 0; if(theTopology->isItBigPixelInY(recHit.cluster()->minPixelCol())) py++; if(theTopology->isItBigPixelInY(recHit.cluster()->maxPixelCol())) py++; if(px > 0 || py > 0) data.hasBigPixelsOnlyInside = false; else data.hasBigPixelsOnlyInside = true; if( (px > 0 || py > 0) && odir == 0) { // if outside and don't know the direction FIXME? data.isComplete = false; } // else { // FIXME do it for(int ax = 0; ax <= px; ax++) for(int ay = 0; ay <= py; ay++) { int dx = x[1] - x[0] + ax; int dy = y[1] - y[0] + ay; if(odir != 0) dy *= odir; pair<int,int> s(dx,dy); data.size.push_back(s); } } }
int ClusterShape::getDirection | ( | int | low, |
int | hig, | ||
int | olow, | ||
int | ohig | ||
) | [private] |
bool ClusterShape::processColumn | ( | std::pair< int, int > | pos, |
bool | inTheLoop | ||
) | [private] |
Definition at line 35 of file ClusterShape.cc.
References dir, x, and detailsBasic3DVector::y.
{ if(x[1] > -1) { // Process previous column if(low < y[0] || x[1] == x[0]) y[0] = low; if(hig > y[1] || x[1] == x[0]) y[1] = hig; if(x[1] > x[0]) { // Determine direction int dir = getDirection(low,hig, olow,ohig); // no direction if(dir == -2) return false; if(x[1] > x[0]+1) { // Check if direction changes if(odir*dir == -1) { odir = -2; return false; } } if(x[1] <= x[0]+1 || odir == 0) odir = dir; } olow = low; ohig = hig; } else { // Very first column, initialize x[0] = pos.first; } // Open new column if(inTheLoop) { x[1] = pos.first; low = pos.second; hig = pos.second; } return(true); }
int ClusterShape::hig [private] |
Definition at line 31 of file ClusterShape.h.
int ClusterShape::low [private] |
Definition at line 31 of file ClusterShape.h.
int ClusterShape::odir [private] |
Definition at line 31 of file ClusterShape.h.
int ClusterShape::ohig [private] |
Definition at line 31 of file ClusterShape.h.
int ClusterShape::olow [private] |
Definition at line 31 of file ClusterShape.h.
int ClusterShape::x[2] [private] |
Definition at line 31 of file ClusterShape.h.
int ClusterShape::y[2] [private] |
Definition at line 31 of file ClusterShape.h.