#include <RecoLocalMuon/CSCSegment/src/CSCSegAlgoPreClustering.h>
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 CSCChamber * | theChamber |
Definition at line 20 of file CSCSegAlgoPreClustering.h.
typedef std::vector<const CSCRecHit2D*> CSCSegAlgoPreClustering::ChamberHitContainer |
Definition at line 24 of file CSCSegAlgoPreClustering.h.
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 | ( | ) |
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 }
bool CSCSegAlgoPreClustering::debug [private] |
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] |
float CSCSegAlgoPreClustering::err_y [private] |
float CSCSegAlgoPreClustering::mean_x [private] |
float CSCSegAlgoPreClustering::mean_y [private] |
const CSCChamber* CSCSegAlgoPreClustering::theChamber [private] |