Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

mMuiClusterFinder Class Reference
[Analysis Modules]

Groups raw MuID hits into clusters. More...

#include <mMuiClusterFinder.h>

List of all members.

Public Methods

 mMuiClusterFinder ()
 ~mMuiClusterFinder ()
PHBoolean event (PHCompositeNode *)

Private Methods

void set_interface_ptrs (PHCompositeNode *top_node)
void find_clusters ()
bool associate_hit (TMuiClusterMapO::pointer, TMuiHitMapO::pointer)
void make_new_cluster (TMuiHitMapO::pointer)
void calc_position (TMuiClusterMapO::pointer clus_ptr, TMuiPanelGeo *fpMuiPanelGeo)
void apply_cluster_cuts ()

Private Attributes

const mMuiClusterFinderPar_mod_par
TMuiHitMapO_muihitmap
TMuiClusterMapO_muiclustermap
PHTimeServer::timer _timer


Detailed Description

Groups raw MuID hits into clusters.

\

Definition at line 26 of file mMuiClusterFinder.h.


Constructor & Destructor Documentation

mMuiClusterFinder  
 

Constructor

Definition at line 13 of file mMuiClusterFinder.cxx.

00013                                     :
00014   _timer( PHTimeServer::get()->insert_new("mMuiClusterFinder") )
00015   {}

~mMuiClusterFinder  
 

Destructor

Definition at line 18 of file mMuiClusterFinder.cxx.

00018 {}


Member Function Documentation

void apply_cluster_cuts   [private]
 

Apply run-time specified cluster cut

Definition at line 269 of file mMuiClusterFinder.cxx.

References _mod_par, _muiclustermap, mMuiClusterFinderPar::get_max_cluster_width, and mMuiClusterFinderPar::get_min_cluster_width.

00270 {
00271   TMuiClusterMapO::iterator clus_iter = _muiclustermap->range();
00272   while(TMuiClusterMapO::pointer clus_ptr = clus_iter.next()){
00273     
00274     // If cluster contains less than the required number of
00275     // strips remove from map
00276     //
00277     if(clus_ptr->get()->get_size() < _mod_par->get_min_cluster_width() ) {
00278       _muiclustermap->erase(clus_ptr->get()->get_key());
00279       continue;
00280     }
00281     
00282     if(clus_ptr->get()->get_size() > _mod_par->get_max_cluster_width() ) {
00283       _muiclustermap->erase(clus_ptr->get()->get_key());
00284       continue;
00285     }
00286   }
00287 }

bool associate_hit TMuiClusterMapO::pointer    clus_ptr,
TMuiHitMapO::pointer    hit_ptr
[private]
 

Attempt to associate hit with cluster. Hit is associated if it is adjacent to existing associated strip. Returns true if hit was associated else returns false.

Definition at line 124 of file mMuiClusterFinder.cxx.

Referenced by find_clusters.

00126 {  
00127   // iterator to hits associated with this cluster
00128   //
00129   TMuiHitMapO::key_iterator hit_iter = 
00130     clus_ptr->get()->get_associated<TMuiHitO>();
00131   
00132   // loop over associated hits
00133   //
00134   while(TMuiHitMapO::pointer clus_hit_ptr = hit_iter.next()){
00135 
00136     UShort_t distance = std::abs(clus_hit_ptr->get()->get_twopack() - 
00137                                  hit_ptr->get()->get_twopack()); 
00138     if(distance == 1) {
00139       // strips are adjacent so associate hit with cluster
00140       //      
00141       PHKey::associate(hit_ptr,clus_ptr);
00142       return true;
00143     }
00144   }
00145   // hit was not associated return false
00146   //
00147   return false;
00148 }

void calc_position TMuiClusterMapO::pointer    clus_ptr,
TMuiPanelGeo *    fpMuiPanelGeo
[private]
 

Calculate position of reconstructed clusters

Definition at line 154 of file mMuiClusterFinder.cxx.

References _muiclustermap.

Referenced by find_clusters.

00156 {  
00157   // iterator to hits associated with this cluster
00158   //
00159   TMuiHitMapO::key_iterator hit_iter = 
00160     clus_ptr->get()->get_associated<TMuiHitO>();
00161   
00162   // loop over associated hits and get their positions
00163   //
00164   PHVector clpos;
00165   PHVector clerr;
00166   int clnhit = 0;
00167   EOrient_t orient = kHORIZ;
00168   while(TMuiHitMapO::pointer clus_hit_ptr = hit_iter.next()){
00169     
00170     TMuiChannelId pTPID(clus_hit_ptr->get()->get_arm(),
00171                         clus_hit_ptr->get()->get_plane(),
00172                         clus_hit_ptr->get()->get_panel(),
00173                         (EOrient_t)clus_hit_ptr->get()->get_orientation(),
00174                         clus_hit_ptr->get()->get_twopack());
00175 
00176     orient = (EOrient_t)clus_hit_ptr->get()->get_orientation();
00177     TMuiTwoPackGeo* fpMuiTwoPackGeo = TMuiGeometry::Geom()->getTwoPack(pTPID);
00178     
00179     //Now we need to find the centroid of this tube
00180     if (fpMuiPanelGeo && fpMuiTwoPackGeo) {
00181       float x, y, z, sx, sy, sz;
00182       
00183       fpMuiTwoPackGeo->CenterPos(x, y, z);
00184       fpMuiTwoPackGeo->CenterSigma(sx, sy, sz);
00185       PHVector pos(x, y, z);
00186       PHVector sigma(sx, sy, sz);
00187       PHVector fCentroidPos = fpMuiPanelGeo->TransformToGlobal(pos);
00188       PHVector fCentroidErr = fpMuiPanelGeo->RotateToGlobal(sigma);
00189 
00190       clpos = clpos + fCentroidPos;
00191       clerr = clerr + fCentroidErr;
00192       clnhit++;
00193     }
00194   }
00195 
00196   if (clnhit > 0)
00197     {
00198       clpos = clpos * (1.0/clnhit);
00199       // we should scale the error also
00200       // if vert., the values/errors are the same for the two-packs in y,z 
00201       // if horiz., the values/errors are the same for the two-packs in x,z 
00202       //
00203       if (orient == kHORIZ)
00204         { // horizontal, don't scale y-value
00205           clerr.setX(clerr.getX() *( 1.0/clnhit) );
00206           clerr.setZ(clerr.getZ() *( 1.0/clnhit) );
00207         }
00208       else
00209         { // vertical, don't scale x-value
00210           clerr.setY(clerr.getY() *( 1.0/clnhit) );
00211           clerr.setZ(clerr.getZ() *( 1.0/clnhit) );
00212         }
00213       clus_ptr->get()->set_centroidpos(PHPoint(clpos));
00214       clus_ptr->get()->set_centroidsigma(PHPoint(clerr));
00215       clus_ptr->get()->set_size(clnhit);
00216 
00217       // figure out what the start and end points are also
00218       // using the centroid and sigma info
00219       //
00220       PHPoint startpoint = PHPoint(clpos);
00221       PHPoint endpoint = startpoint;
00222       // from sigma to total range of uncertainty: sqrt(12) conv. factor
00223       // and then we want half the length
00224       double convfactor = sqrt(12.0)*0.5;
00225       PHPoint diff = PHPoint(clerr)*convfactor;
00226 
00227       //
00228       if (orient == kHORIZ)
00229         { // horizontal
00230           startpoint.setX(startpoint.getX() - diff.getX());
00231           endpoint.setX(endpoint.getX() + diff.getX());
00232         }
00233       else
00234         { // vertical
00235           startpoint.setY(startpoint.getY() - diff.getY());
00236           endpoint.setY(endpoint.getY() + diff.getY());
00237         }
00238       // and store the values
00239       clus_ptr->get()->set_coord_end(endpoint);
00240       clus_ptr->get()->set_coord_begin(startpoint);
00241     }
00242   else
00243     { // couldn't locate coordinates of any hits.
00244       // That must be bad. We might as well remove this cluster
00245       _muiclustermap->erase(clus_ptr->get()->get_key());
00246     }
00247   return;
00248 }

PHBoolean event PHCompositeNode *   
 

Find clusters from the raw hits

Definition at line 22 of file mMuiClusterFinder.cxx.

References _timer, find_clusters, set_interface_ptrs, and MUIOO::TRACE.

00023 {
00024   _timer.get()->restart();
00025   try {     
00026     // Reset IOC pointers
00027     //
00028     set_interface_ptrs(top_node);
00029     
00030     // Associate groups of contiguous hits with 
00031     // TMutClus objects
00032     //
00033     find_clusters();
00034         
00035   } catch(std::exception& e) {
00036     MUIOO::TRACE(e.what());
00037     return False;
00038   }
00039   _timer.get()->stop();  
00040   return True;  
00041 }

void find_clusters   [private]
 

Definition at line 61 of file mMuiClusterFinder.cxx.

References _mod_par, _muiclustermap, _muihitmap, associate_hit, calc_position, TMuiClusterMapO::get, TMuiHitMapO::get, mMuiClusterFinderPar::get_clustering_mode, make_new_cluster, mMuiClusterFinderPar::NONE, and mMuiClusterFinderPar::NORMAL.

Referenced by event.

00062 {
00063   // ===================================================================
00064   // Find clusters and fill the cluster container.
00065   // ===================================================================
00066   
00067   // For now just one hit per cluster
00068   // Let's make it optional though, to merge isolated neighboring hits into single clusters
00069   for (short arm=0; arm<TMuiChannelId::kArmsTotal; arm++) {    
00070     for (short plane=0; plane<TMuiChannelId::kPlanesPerArm; plane++) {
00071       for (short panel=0; panel<TMuiChannelId::kPanelsPerPlane; panel++) {
00072 
00073         //Lets get a pointer to this panel's geometry object
00074         TMuiChannelId pPanelId(arm,plane,panel);
00075         TMuiPanelGeo* fpMuiPanelGeo   = TMuiGeometry::Geom()->getPanel(pPanelId);
00076         
00077         for (short orient=0; orient<TMuiChannelId::kOrientations; orient++) {
00078           
00079           TMuiHitMapO::iterator hit_iter = _muihitmap->get(arm,plane,panel,orient);
00080           while(TMuiHitMapO::pointer hit_ptr = hit_iter.next()) {
00081             if (_mod_par->get_clustering_mode() == mMuiClusterFinderPar::NONE) {
00082               // no clustering, just make each hit into its own cluster
00083               make_new_cluster(hit_ptr);
00084             }
00085             else {
00086               // iterator to all clusters with same location as hit
00087               TMuiClusterMapO::iterator clus_iter = _muiclustermap->get(arm, plane, panel, orient);
00088               bool hit_is_added = false;
00089               while(TMuiClusterMapO::pointer clus_ptr = clus_iter.next()){
00090                 if (!hit_is_added || _mod_par->get_clustering_mode() == mMuiClusterFinderPar::NORMAL)
00091                   { // in the 'NORMAL' mode, we can try to add the hit to as many clusters as possible
00092                     // attempt to add hit to cluster
00093                     hit_is_added = associate_hit(clus_ptr,hit_ptr); 
00094                   }
00095               }
00096               // hit was not associated with existing cluster so make
00097               // a new cluster and associate this hit
00098               if(!hit_is_added){
00099                 make_new_cluster(hit_ptr);
00100               }
00101             }            
00102           }//loop over hits in panel/orient
00103 
00104           // Now, the clustering is done. Let's calculate the positions if we found any
00105           TMuiClusterMapO::iterator clus_iter = _muiclustermap->get(arm, plane, panel, orient);
00106           while(TMuiClusterMapO::pointer clus_ptr = clus_iter.next()){
00107             calc_position(clus_ptr, fpMuiPanelGeo);
00108           }
00109 
00110         }//orient
00111       }//panel
00112     }//plane
00113   }//arm
00114   
00115   return;
00116 }

void make_new_cluster TMuiHitMapO::pointer    [private]
 

Definition at line 251 of file mMuiClusterFinder.cxx.

References _muiclustermap, and TMuiClusterMapO::insert_new.

Referenced by find_clusters.

00252 {
00253   // make a new cluster with same location as hit
00254   //
00255   TMuiClusterMapO::iterator clus_iter = 
00256     _muiclustermap->insert_new(hit_ptr->get()->get_arm(),
00257                                hit_ptr->get()->get_plane(),
00258                                hit_ptr->get()->get_panel(),
00259                                hit_ptr->get()->get_orientation());
00260   
00261   // Associate new cluster with hit
00262   //
00263   PHKey::associate(hit_ptr,clus_iter.current());
00264 }

void set_interface_ptrs PHCompositeNode *    top_node [private]
 

Reset IOC and external interface pointers

Definition at line 45 of file mMuiClusterFinder.cxx.

References _mod_par, _muiclustermap, and _muihitmap.

Referenced by event.

00046 {
00047    // module runtime parameters
00048   _mod_par = TMutNode<mMuiClusterFinderPar>::find_node(top_node,"mMuiClusterFinderPar");
00049 
00050   //Find the new TMuiHitO objects
00051   _muihitmap = TMutNode<TMuiHitMapO>::find_node(top_node,"TMuiHitMapO");
00052 
00053   //Find the new TMuiClusterO objects
00054   _muiclustermap = TMutNode<TMuiClusterMapO>::find_node(top_node,"TMuiClusterMapO");
00055 
00056   return;
00057 }


Member Data Documentation

const mMuiClusterFinderPar* _mod_par [private]
 

Definition at line 56 of file mMuiClusterFinder.h.

Referenced by apply_cluster_cuts, find_clusters, and set_interface_ptrs.

TMuiClusterMapO* _muiclustermap [private]
 

Definition at line 58 of file mMuiClusterFinder.h.

Referenced by apply_cluster_cuts, calc_position, find_clusters, make_new_cluster, and set_interface_ptrs.

TMuiHitMapO* _muihitmap [private]
 

Definition at line 57 of file mMuiClusterFinder.h.

Referenced by find_clusters, and set_interface_ptrs.

PHTimeServer::timer _timer [private]
 

Definition at line 60 of file mMuiClusterFinder.h.

Referenced by event.


The documentation for this class was generated from the following files:
MUIOO: PHENIX Muon Identifier Analysis Framework. Documentation by doxygen
Last modified: