CMS 3D CMS Logo

CSCSegAlgoPreClustering Class Reference

#include <RecoLocalMuon/CSCSegment/src/CSCSegAlgoPreClustering.h>

List of all members.

Public Types

typedef std::vector< const
CSCRecHit2D * > 
ChamberHitContainer

Public Member Functions

std::vector< std::vector
< const CSCRecHit2D * > > 
clusterHits (const CSCChamber *aChamber, ChamberHitContainer rechits)
 clusterize
 CSCSegAlgoPreClustering (const edm::ParameterSet &ps)
 constructor
 ~CSCSegAlgoPreClustering ()
 destructor

Private Attributes

bool debug
double dXclusBoxMax
double dYclusBoxMax
float err_x
float err_y
float mean_x
float mean_y
const CSCChambertheChamber


Detailed Description

Definition at line 20 of file CSCSegAlgoPreClustering.h.


Member Typedef Documentation

typedef std::vector<const CSCRecHit2D*> CSCSegAlgoPreClustering::ChamberHitContainer

Definition at line 24 of file CSCSegAlgoPreClustering.h.


Constructor & Destructor Documentation

CSCSegAlgoPreClustering::CSCSegAlgoPreClustering ( const edm::ParameterSet ps  )  [explicit]

constructor

Definition at line 31 of file CSCSegAlgoPreClustering.cc.

References debug, dXclusBoxMax, dYclusBoxMax, edm::ParameterSet::getParameter(), and edm::ParameterSet::getUntrackedParameter().

00031                                                                           {
00032   dXclusBoxMax           = ps.getParameter<double>("dXclusBoxMax");
00033   dYclusBoxMax           = ps.getParameter<double>("dYclusBoxMax");
00034   debug                  = ps.getUntrackedParameter<bool>("CSCSegmentDebug");
00035 }

CSCSegAlgoPreClustering::~CSCSegAlgoPreClustering (  ) 

destructor

Definition at line 41 of file CSCSegAlgoPreClustering.cc.

00041                                                  {
00042 
00043 }


Member Function Documentation

std::vector< std::vector< const CSCRecHit2D * > > CSCSegAlgoPreClustering::clusterHits ( const CSCChamber aChamber,
ChamberHitContainer  rechits 
)

clusterize

Definition at line 50 of file CSCSegAlgoPreClustering.cc.

References begin, GenMuonPlsPt100GeV_cfg::cout, dXclusBoxMax, dYclusBoxMax, end, lat::endl(), err_x, err_y, i, mean_x, mean_y, size, pyDBSRunClass::temp, theChamber, x, and y.

Referenced by CSCSegAlgoDF::run().

00050                                                                                              {
00051 
00052   theChamber = aChamber;
00053 
00054   std::vector<ChamberHitContainer> rechits_clusters; // this is a collection of groups of rechits
00055 
00056   float dXclus = 0.0;
00057   float dYclus = 0.0;
00058   float dXclus_box = 0.0;
00059   float dYclus_box = 0.0;
00060 
00061   std::vector<const CSCRecHit2D*> temp;
00062 
00063   std::vector< ChamberHitContainer > seeds;
00064 
00065   std::vector<float> running_meanX;
00066   std::vector<float> running_meanY;
00067 
00068   std::vector<float> seed_minX;
00069   std::vector<float> seed_maxX;
00070   std::vector<float> seed_minY;
00071   std::vector<float> seed_maxY;
00072 
00073   // split rechits into subvectors and return vector of vectors:
00074   // Loop over rechits 
00075   // Create one seed per hit
00076     for(unsigned int i = 0; i < rechits.size(); ++i) {
00077 
00078         temp.clear();
00079 
00080         temp.push_back(rechits[i]);
00081 
00082         seeds.push_back(temp);
00083 
00084         // First added hit in seed defines the mean to which the next hit is compared
00085         // for this seed.
00086 
00087         running_meanX.push_back( rechits[i]->localPosition().x() );
00088         running_meanY.push_back( rechits[i]->localPosition().y() );
00089         
00090         // set min/max X and Y for box containing the hits in the precluster:
00091         seed_minX.push_back( rechits[i]->localPosition().x() );
00092         seed_maxX.push_back( rechits[i]->localPosition().x() );
00093         seed_minY.push_back( rechits[i]->localPosition().y() );
00094         seed_maxY.push_back( rechits[i]->localPosition().y() );
00095     }
00096     
00097     // merge clusters that are too close
00098     // measure distance between final "running mean"
00099       for(uint NNN = 0; NNN < seeds.size(); ++NNN) {
00100         
00101         for(uint MMM = NNN+1; MMM < seeds.size(); ++MMM) {
00102           if(running_meanX[MMM] == 999999. || running_meanX[NNN] == 999999. ) {
00103             std::cout<<"We should never see this line now!!!"<<std::endl;
00104             continue; //skip seeds that have been used 
00105           }
00106           
00107           // calculate cut criteria for simple running mean distance cut:
00108           dXclus = fabs(running_meanX[NNN] - running_meanX[MMM]);
00109           dYclus = fabs(running_meanY[NNN] - running_meanY[MMM]);
00110 
00111           // calculate minmal distance between precluster boxes containing the hits:
00112           if ( running_meanX[NNN] > running_meanX[MMM] ) dXclus_box = seed_minX[NNN] - seed_maxX[MMM];
00113           else                                           dXclus_box = seed_minX[MMM] - seed_maxX[NNN];
00114           if ( running_meanY[NNN] > running_meanY[MMM] ) dYclus_box = seed_minY[NNN] - seed_maxY[MMM];
00115           else                                           dYclus_box = seed_minY[MMM] - seed_maxY[NNN];
00116           
00117           
00118           if( dXclus_box < dXclusBoxMax && dYclus_box < dYclusBoxMax ) {
00119             // merge clusters!
00120             // merge by adding seed NNN to seed MMM and erasing seed NNN
00121             
00122             // calculate running mean for the merged seed:
00123             running_meanX[MMM] = (running_meanX[NNN]*seeds[NNN].size() + running_meanX[MMM]*seeds[MMM].size()) / (seeds[NNN].size()+seeds[MMM].size());
00124             running_meanY[MMM] = (running_meanY[NNN]*seeds[NNN].size() + running_meanY[MMM]*seeds[MMM].size()) / (seeds[NNN].size()+seeds[MMM].size());
00125             
00126             // update min/max X and Y for box containing the hits in the merged cluster:
00127             if ( seed_minX[NNN] <= seed_minX[MMM] ) seed_minX[MMM] = seed_minX[NNN];
00128             if ( seed_maxX[NNN] >  seed_maxX[MMM] ) seed_maxX[MMM] = seed_maxX[NNN];
00129             if ( seed_minY[NNN] <= seed_minY[MMM] ) seed_minY[MMM] = seed_minY[NNN];
00130             if ( seed_maxY[NNN] >  seed_maxY[MMM] ) seed_maxY[MMM] = seed_maxY[NNN];
00131             
00132             // add seed NNN to MMM (lower to larger number)
00133             seeds[MMM].insert(seeds[MMM].end(),seeds[NNN].begin(),seeds[NNN].end());
00134             
00135             // mark seed NNN as used (at the moment just set running mean to 999999.)
00136             running_meanX[NNN] = 999999.;
00137             running_meanY[NNN] = 999999.;
00138             // we have merged a seed (NNN) to the highter seed (MMM) - need to contimue to 
00139             // next seed (NNN+1)
00140             break;
00141           }
00142 
00143         }
00144       }
00145 
00146       // hand over the final seeds to the output
00147       // would be more elegant if we could do the above step with 
00148       // erasing the merged ones, rather than the 
00149       for(uint NNN = 0; NNN < seeds.size(); ++NNN) {
00150         if (running_meanX[NNN] == 999999.) continue; //skip seeds that have been marked as used up in merging
00151         rechits_clusters.push_back(seeds[NNN]);
00152         mean_x = running_meanX[NNN];
00153         mean_y = running_meanY[NNN];
00154         err_x  = (seed_maxX[NNN]-seed_minX[NNN])/3.464101615; // use box size divided by sqrt(12) as position error estimate
00155         err_y  = (seed_maxY[NNN]-seed_minY[NNN])/3.464101615; // use box size divided by sqrt(12) as position error estimate
00156 
00157       }
00158 
00159   return rechits_clusters; 
00160 }


Member Data Documentation

bool CSCSegAlgoPreClustering::debug [private]

Definition at line 36 of file CSCSegAlgoPreClustering.h.

Referenced by CSCSegAlgoPreClustering().

double CSCSegAlgoPreClustering::dXclusBoxMax [private]

Definition at line 37 of file CSCSegAlgoPreClustering.h.

Referenced by clusterHits(), and CSCSegAlgoPreClustering().

double CSCSegAlgoPreClustering::dYclusBoxMax [private]

Definition at line 38 of file CSCSegAlgoPreClustering.h.

Referenced by clusterHits(), and CSCSegAlgoPreClustering().

float CSCSegAlgoPreClustering::err_x [private]

Definition at line 40 of file CSCSegAlgoPreClustering.h.

Referenced by clusterHits().

float CSCSegAlgoPreClustering::err_y [private]

Definition at line 40 of file CSCSegAlgoPreClustering.h.

Referenced by clusterHits().

float CSCSegAlgoPreClustering::mean_x [private]

Definition at line 40 of file CSCSegAlgoPreClustering.h.

Referenced by clusterHits().

float CSCSegAlgoPreClustering::mean_y [private]

Definition at line 40 of file CSCSegAlgoPreClustering.h.

Referenced by clusterHits().

const CSCChamber* CSCSegAlgoPreClustering::theChamber [private]

Definition at line 41 of file CSCSegAlgoPreClustering.h.

Referenced by clusterHits().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:17:25 2009 for CMSSW by  doxygen 1.5.4