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

mMuiRoadFinder1 Class Reference
[Analysis Modules]

Class to construct roads from or TMuiClustersO. More...

#include <mMuiRoadFinder1.h>

List of all members.

Public Methods

 mMuiRoadFinder1 ()
 ~mMuiRoadFinder1 ()
PHBoolean event (PHCompositeNode *baseNode)

Private Methods

PHBoolean find_1droads ()
PHBoolean find_2droads ()
PHBoolean cut_1droads ()
int track_seed (TMui1DRoadMapO::pointer road1dptr, int iLoop, int iSearch)
void set_interface_ptrs (PHCompositeNode *baseNode)
int mMuiRoadFinder1::make2d (TMuiRoadMapO::pointer cRoad, TMui1DRoadMapO::pointer pRoadH, TMui1DRoadMapO::pointer pRoadV)
int fit1d (TMui1DRoadMapO::pointer road1dptr)
double ClusterDistance (TMui1DRoadMapO::pointer road1dptr, TMuiClusterMapO::pointer clustptr)
bool intersectionOK (TMuiClusterMapO::const_pointer clustH, TMuiClusterMapO::const_pointer clustV) const
int flag_golden ()

Private Attributes

const mMuiRoadFinder1Par_mod_par
TMuiRoadMapO_roadmap
TMui1DRoadMapO_road1dmap
TMuiClusterMapO_clustermap
PHTimeServer::timer _timer


Detailed Description

Class to construct roads from or TMuiClustersO.

\

Definition at line 20 of file mMuiRoadFinder1.h.


Constructor & Destructor Documentation

mMuiRoadFinder1  
 

Constructor.

Definition at line 45 of file mMuiRoadFinder1.cxx.

00045                                  :
00046    _roadmap(0),
00047    _road1dmap(0),
00048    _clustermap(0),
00049    _timer( PHTimeServer::get()->insert_new("mMuiRoadFinder1") )
00050 
00051 {
00052   name = "mMuiRoadFinder1";
00053 }

~mMuiRoadFinder1  
 

Destructor.

Definition at line 55 of file mMuiRoadFinder1.cxx.

00055 {}


Member Function Documentation

double ClusterDistance TMui1DRoadMapO::pointer    road1dptr,
TMuiClusterMapO::pointer    clustptr
[private]
 

Definition at line 786 of file mMuiRoadFinder1.cxx.

Referenced by track_seed.

00787 {
00788   PHVector dirV = road1dptr->get()->get_fit_par().get_tangent();
00789   dirV.normalize();
00790   PHPoint panelX
00791   = TMuiGeometry::Geom()->FindIntersection(
00792                                            road1dptr->get()->get_arm(),
00793                                            clustptr->get()->get_plane(),
00794                                            clustptr->get()->get_panel(),
00795                                            road1dptr->get()->get_fit_par().get_point(),
00796                                            dirV
00797                                            );
00798 
00799   double distance = (road1dptr->get()->get_orientation()==0)
00800     ? abs(panelX.getY() - clustptr->get()->get_centroidpos().getY())
00801     : abs(panelX.getX() - clustptr->get()->get_centroidpos().getX());
00802 
00803   return distance;
00804 }

PHBoolean cut_1droads   [private]
 

Definition at line 96 of file mMuiRoadFinder1.cxx.

References _mod_par, _road1dmap, TMui1DRoadMapO::get, mMuiRoadFinder1Par::get_max_xref_1d, mMuiRoadFinder1Par::get_max_yref_1d, mMuiRoadFinder1Par::get_min_fired_gaps, and mMuiRoadFinder1Par::get_min_last_gap_1d.

Referenced by event.

00097 {
00098   for(int iArm = 0; iArm < TMuiChannelId::kArmsTotal; iArm++)
00099   {
00100   //Now we have a list of roads tracked all the way through the
00101   //detector. Before we add them to the 1D Road Container
00102   //perform all the 1DRoad Cuts except the Duplicate cut.
00103 
00104 
00105     TMui1DRoadMapO::iterator iRoad1 = _road1dmap->get(iArm);
00106 
00107     while(TMui1DRoadMapO::pointer pRoad1 = iRoad1.next())
00108     {
00109 
00110       // Ok we found a road already, we need to know
00111       // whether we should save it or not
00112       // check road quality...
00113       //
00114 #ifdef MUIOO_DEBUG
00115       cout<<"Checking Road: "<<endl;
00116       pRoad1->get()->print();
00117 #endif
00118       // 1. last plane of the road
00119       bool LastPlaneOK = false;
00120       if ( pRoad1->get()->get_depth() >= _mod_par->get_min_last_gap_1d() )
00121       {
00122         LastPlaneOK = true;
00123       }
00124 
00125       // 2. positon at reference plane
00126       bool VertexCutOK = false;
00127 
00128       TMutFitPar roadfit = pRoad1->get()->get_fit_par();
00129      if(pRoad1->get()->get_orientation()==0)
00130       {
00131         if ( fabs(roadfit.get_y()) <= _mod_par->get_max_yref_1d() )
00132         {
00133           VertexCutOK = true;
00134         }
00135       } else {
00136         if ( fabs(roadfit.get_x()) <= _mod_par->get_max_xref_1d() )
00137         {
00138           VertexCutOK = true;
00139         }
00140       }
00141 
00142      // 3. number of gaps contain hits
00143      bool FiredGapsOK = false;
00144 #ifdef MUIOO_DEBUG
00145      cout<<"Testing FiredGaps: G "
00146          << pRoad1->get()->get_gapbit()
00147        << " N " << pRoad1->get()->get_numfired() <<endl;
00148 #endif
00149       if ( pRoad1->get()->get_numfired() > _mod_par->get_min_fired_gaps())
00150       {
00151         FiredGapsOK = true;
00152       }
00153 
00154       // Here is our criteria for a candidate road
00155       // at this stage.
00156       // i.e. 1) There are at least two gaps containing hits
00157       //      2) LastPlane of the road passes last plane cut
00158       //      3) Reference position passes vertex cut
00159 
00160 
00161       // At this point we are only cutting exact duplicates
00162       // resulting from the multiple seed loops
00163 
00164       if ( LastPlaneOK && VertexCutOK&& FiredGapsOK ){
00165         int NumHits1 = 0;
00166         int NumHits2 = 0;
00167         TMui1DRoadMapO::iterator iRoad2 = iRoad1;
00168         while(TMui1DRoadMapO::pointer pRoad2 = iRoad2.next()){
00169           if(pRoad1->get()->get_orientation() != pRoad2->get()->get_orientation()){
00170             continue;
00171           }
00172           TMuiClusterMapO::const_key_iterator iclust1
00173             =pRoad1->get()->get_associated<TMuiClusterO>();
00174           TMuiClusterMapO::const_key_iterator iclust2
00175             =pRoad2->get()->get_associated<TMuiClusterO>();
00176           
00177           NumHits1 = iclust1.count();
00178           NumHits2 = iclust2.count();
00179           
00180           if(NumHits1!=NumHits2){
00181             continue;
00182           }
00183           short SharedHits1D = 0;  
00184           while(TMuiClusterMapO::const_pointer clust1 = iclust1.next()){
00185 #ifdef MUIOO_DEBUG
00186             clust1->get()->get_key().print();
00187 #endif
00188             iclust2.reset(); 
00189             while(TMuiClusterMapO::const_pointer clust2 = iclust2.next()){
00190 #ifdef MUIOO_DEBUG
00191               clust2->get()->get_key().print();
00192 #endif
00193               if(clust1->get()->get_key()==clust2->get()->get_key()) {
00194                 SharedHits1D++;
00195               }
00196             }
00197           }
00198 #ifdef MUIOO_DEBUG          
00199           if(pRoad1->get()->get_panel()==pRoad1->get()->get_panel()){
00200             cout<<"Checked for duplicate: SharedHits("<<SharedHits1D<<") "
00201                 <<NumHits1<<"/"<<NumHits2<<endl;
00202             pRoad1->get()->print();
00203             pRoad2->get()->print();         
00204           }
00205 #endif          
00206           if(SharedHits1D==NumHits1){
00207 #ifdef MUIOO_DEBUG
00208             cout<<"Duplicate road found with "<<SharedHits1D<<" shared hits"<<endl;
00209             pRoad1->get()->print();
00210             pRoad2->get()->print();
00211 #endif
00212             // Instead of erasing now.  Lets flagit by
00213             // setting its depth to 0.
00214             // Later we'll come back and erase all.
00215             pRoad2->get()->set_depth(0);
00216           }// if SharedHits1D==NumHits1
00217         }//while(pRoad2
00218       }else{//if(VtxOk ...)
00219 #ifdef MUIOO_DEBUG        
00220         cout<<"Cutting 1d road: " << "LastPlaneOK "<<LastPlaneOK
00221             <<" VertexCutOK " << VertexCutOK
00222             <<" FiredGapsOK " <<FiredGapsOK
00223             <<endl;
00224 #endif
00225         // Instead of erasing now.  Lets flagit by
00226         // setting its depth to 0.
00227         // Later we'll come back and erase all.
00228         pRoad1->get()->set_depth(0);
00229       }
00230       
00231     }//while(pRoad1
00232     iRoad1 = _road1dmap->get(iArm);
00233     while(TMui1DRoadMapO::pointer pRoad1 = iRoad1.next())
00234     {
00235       if(pRoad1->get()->get_depth()==0)
00236       {
00237         _road1dmap->erase(pRoad1->get()->get_key());
00238       }
00239     }
00240   }//for(iArm..
00241   return 0;
00242 }

PHBoolean event PHCompositeNode *    baseNode
 

Definition at line 58 of file mMuiRoadFinder1.cxx.

References _road1dmap, _roadmap, _timer, cut_1droads, find_1droads, find_2droads, flag_golden, TMuiRoadMapO::get, TMui1DRoadMapO::get, and set_interface_ptrs.

00058                                                 {
00059 
00060   _timer.get()->restart();
00061 
00062 #ifdef MUIOO_DEBUG
00063   cout<<"Begin mMuiRoadFinder1."<<endl;
00064 #endif
00065   set_interface_ptrs(top_node);
00066 
00067   find_1droads();
00068 
00069   cut_1droads();
00070 
00071   find_2droads();
00072 
00073   flag_golden();
00074   
00075 #ifdef MUIOO_DEBUG  
00076   TMui1DRoadMapO::iterator iroad = _road1dmap->get(0);
00077   cout<<" Finished road finding with "<< iroad.count() << " 1d roads.\n";  
00078   while(TMui1DRoadMapO::pointer roadptr = iroad.next())
00079   {
00080     roadptr->get()->print();
00081   }
00082 
00083   TMuiRoadMapO::iterator iroad2 = _roadmap->get(0);
00084   cout<<" Finished road finding with "<< iroad2.count() << " 2d roads.\n";
00085   while(TMuiRoadMapO::pointer roadptr = iroad2.next())
00086   {
00087     roadptr->get()->print();
00088   }
00089 #endif
00090 
00091   _timer.get()->stop();
00092   return 0;
00093 }

PHBoolean find_1droads   [private]
 

Definition at line 245 of file mMuiRoadFinder1.cxx.

References _clustermap, _mod_par, _road1dmap, fit1d, TMuiClusterMapO::get, mMuiRoadFinder1Par::get_max_occupancy_per_arm, mMuiRoadFinder1Par::get_num_seed_loops, mMuiRoadFinder1Par::get_search_order, TMui1DRoadMapO::insert_new, and track_seed.

Referenced by event.

00245                               {
00246   
00247   // We have all of the input and output parameters now, so do
00248   // something useful with them!
00249 
00250   //
00251   // Now find some roads!
00252   //
00253 
00254   short Count0,iPlane0, iPlane1;
00255   EOrient_t orient;
00256  int rawcountperarm[2] = {0};
00257 
00258   rawcountperarm[0] = _clustermap->get(0).count();
00259   // JLN - the index below is now fixed 07/25/03
00260   rawcountperarm[1] = _clustermap->get(1).count();
00261 
00262   for (short iArm=0; iArm<TMuiChannelId::kArmsTotal; iArm++) {
00263 
00264     if(rawcountperarm[iArm]>_mod_par->get_max_occupancy_per_arm())
00265     {
00266       cout<<PHWHERE<<" Skipping analysis of arm "<<iArm<<" with too many hits "<<rawcountperarm[iArm]<<endl;
00267       continue;
00268     }
00269     
00270     for (short iorient=0; iorient<TMuiChannelId::kOrientations; iorient++){
00271 
00272       if(iorient==0)
00273         orient = kHORIZ;
00274       else
00275         orient = kVERT;
00276 
00277       for( short iLoop=0; iLoop<_mod_par->get_num_seed_loops(); iLoop++){
00278 
00279         // checkout the seed gap(s) from search order
00280         
00281         iPlane0 = _mod_par->get_search_order(iLoop,0);
00282         iPlane1 = _mod_par->get_search_order(iLoop,1);
00283 
00284         //Create a temporary list of roads for this search order.
00285         //list<TMui1DRoad*> roadList;
00286 
00287         short TotalPanel0;
00288         if (iPlane0 == -1){
00289           // one-seed-gap method, by pass iPlane0
00290           TotalPanel0 = 1;
00291         } else {
00292           // two-seed-gap method
00293           TotalPanel0 = TMuiChannelId::kPanelsPerPlane;
00294         }
00295 
00296         for (short iPanel0=0; iPanel0<TotalPanel0; iPanel0++) {
00297 
00298           TMuiClusterMapO::iterator iclust0;
00299           if (iPlane0 != -1){
00300             iclust0 = _clustermap->get(iArm,iPlane0,iPanel0,orient);
00301           }
00302           Count0 = (iPlane0 == -1)? (1) : iclust0.count();
00303           
00304           for (short idClust0=0; idClust0<Count0; idClust0++) {
00305             TMuiClusterMapO::pointer clust0ptr = iclust0.next();
00306             //iclust0->current() will either point to the first cluster or nothing
00307             
00308             for (short iPanel1=0; 
00309                  iPanel1<TMuiChannelId::kPanelsPerPlane; iPanel1++) {
00310 
00311               TMuiClusterMapO::iterator iclust1
00312                      = _clustermap->get(iArm,iPlane1,iPanel1,orient);;
00313        
00314               while(TMuiClusterMapO::pointer pC1 = iclust1.next()) {
00315           
00316                 if (!(pC1->get())) {
00317                   cout << PHWHERE << " plane " << iPlane1 
00318                        << " null pointer" << endl;
00319                 } else {
00320 
00321                   // Found seed cluster(s), create a new 1D road
00322                   // object, and attach cluster pC1 (and pC0, if 2 seed gaps)
00323 
00324                   TMui1DRoadMapO::pointer road1D = 
00325                     (_road1dmap->insert_new(iArm,iPanel1,orient)).current();
00326 
00327                   if (!(road1D->get())) {
00328                     cout << PHWHERE
00329                          << ":failed to create 1D road!"  << endl;
00330                     continue;
00331                   }
00332 
00333                   if (iPlane0 != -1 ) {
00334                     //If Two Gap seed set vertex weight to 0
00335                     PHKey::associate(road1D, clust0ptr);
00336                     road1D->get()->set_fitweight(0, 0.0);
00337                   }else{
00338                     //If One Seed gap method use vertex in fits.
00339                     road1D->get()->set_fitweight(0, 1.0);
00340                   }
00341 
00342                   PHKey::associate(road1D, pC1);
00343 #ifdef MUIOO_DEBUG
00344                   cout<<"Begin tracking seed: iLoop("<< iLoop
00345                     << ") Panel ("<<iPanel1
00346                     <<")"<<endl;
00347                   road1D->get()->print();
00348                   pC1->get()->print();
00349 #endif                  
00350                   track_seed(road1D,iLoop,2);
00351 
00352                   fit1d(road1D);                  
00353                 } // if (!pC1)
00354               }//for (iClust1)
00355             }//for(iPanel1)
00356           }//for(iClust0)
00357         }//for(iPanel0)        
00358       } //short (short iLoop ...)      
00359     } // for (short iorient ...)
00360   }  // for(iArm ...)
00361   return True;
00362 }

PHBoolean find_2droads   [private]
 

Definition at line 365 of file mMuiRoadFinder1.cxx.

References _mod_par, _road1dmap, _roadmap, TMui1DRoadMapO::get, mMuiRoadFinder1Par::get_max_del_last_gap, mMuiRoadFinder1Par::get_max_del_total_hits, mMuiRoadFinder1Par::get_max_xchisq, mMuiRoadFinder1Par::get_max_xref_2d, mMuiRoadFinder1Par::get_max_ychisq, mMuiRoadFinder1Par::get_max_yref_2d, mMuiRoadFinder1Par::get_min_last_gap_2d, TMuiRoadMapO::insert_new, and intersectionOK.

Referenced by event.

00365                               {
00366 
00367   // We found all possible horizontal and vertical roads in both arms
00368   // and now it is time to construct 2D roads base on those 1D roads
00369   for (short iArm=0; iArm<TMuiChannelId::kArmsTotal; iArm++)
00370   {
00371     
00372     TMui1DRoadMapO::iterator iRoadH = _road1dmap->get(iArm);
00373     while(TMui1DRoadMapO::pointer pRoadH = iRoadH.next())
00374     {
00375       if(pRoadH->get()->get_orientation()==1) continue;
00376       TMui1DRoadMapO::iterator iRoadV = _road1dmap->get(iArm);
00377       while(TMui1DRoadMapO::pointer pRoadV = iRoadV.next())
00378       {
00379         if(pRoadV->get()->get_orientation()==0) continue;
00380 
00381 
00382         // What are our criteria for accepting a road
00383         // as valid?  Check them here.
00384         // 1. difference of total number clusters in vRoad and in hRoad
00385         // 2. difference of last gaps in vRoad and hRoad
00386         // 3. InterSection OK or not (if X Y clusters in each gap are
00387         //                            in same panel or overlap region)
00388         // 4. Reference position check
00389         // 5. Chisquare check
00390         // 6. Last Plane check
00391         // 7. Duplicate road check
00392 
00393         // JLN - bug fix - added fabs around the depth differenece 07/25/03
00394         bool LastGapDeltaOK = false;
00395         if (abs(pRoadH->get()->get_depth() - pRoadV->get()->get_depth()) <= _mod_par->get_max_del_last_gap() )
00396         {
00397           LastGapDeltaOK = true;
00398         }
00399         // JLN - bug fix - added fabs around the hits differenece 07/25/03
00400         bool TotalHitsDeltaOK = false;
00401         if(abs(pRoadH->get()->get_nhit() - pRoadV->get()->get_nhit()) <= _mod_par->get_max_del_total_hits() )
00402         {
00403           TotalHitsDeltaOK = true;
00404         }
00405 
00406         bool IntersectionOK = true;
00407         TMuiClusterMapO::const_key_iterator iClustH
00408           =pRoadH->get()->get_associated<TMuiClusterO>();
00409         while(TMuiClusterMapO::const_pointer pClustH = iClustH.next())
00410         {
00411           TMuiClusterMapO::const_key_iterator iClustV
00412             =pRoadV->get()->get_associated<TMuiClusterO>();
00413           while(TMuiClusterMapO::const_pointer pClustV = iClustV.next())
00414           {
00415             if(pClustH->get()->get_plane()!=pClustV->get()->get_plane())
00416             {
00417               continue;
00418             }
00419             
00420             if( !(intersectionOK(pClustH,pClustV)) ){
00421               IntersectionOK = false;
00422               break;
00423             }
00424           }
00425         }
00426 
00427         bool VertexCutOK = false;
00428         TMutFitPar fitH = pRoadH->get()->get_fit_par();
00429         TMutFitPar fitV = pRoadV->get()->get_fit_par();
00430         
00431         if ( fabs(fitH.get_y()) <= _mod_par->get_max_yref_2d() &&
00432              fabs(fitV.get_x()) <= _mod_par->get_max_xref_2d() ) VertexCutOK = true;
00433 
00434         bool ChiSquareCutOK = false;
00435         if ( fitV.get_chi_square() <= _mod_par->get_max_xchisq()
00436              &&  fitH.get_chi_square() <= _mod_par->get_max_ychisq() )
00437         {
00438           ChiSquareCutOK = true;
00439         }
00440         
00441         bool minLastGapOK = false;
00442         if (pRoadH->get()->get_depth() >= _mod_par->get_min_last_gap_2d()
00443             || pRoadV->get()->get_depth() >= _mod_par->get_min_last_gap_2d())
00444         {
00445           minLastGapOK = true;
00446         }
00447         if ( LastGapDeltaOK &&
00448              TotalHitsDeltaOK &&
00449              IntersectionOK &&
00450              VertexCutOK &&
00451              ChiSquareCutOK &&
00452              minLastGapOK
00453              ) {
00454           TMuiRoadMapO::iterator iRoad = _roadmap->insert_new(iArm);
00455           make2d(iRoad.current(),pRoadH,pRoadV);
00456         }// if(pass cuts ..
00457       } // for ( vRoad ..
00458     } // for ( hRoad ..
00459   }//for(iArm ...
00460   return 0;
00461 }

int fit1d TMui1DRoadMapO::pointer    road1dptr [private]
 

Definition at line 696 of file mMuiRoadFinder1.cxx.

References _mod_par, mMuiRoadFinder1Par::get_weight_par_1d, mMuiRoadFinder1Par::get_xvert, mMuiRoadFinder1Par::get_yvert, mMuiRoadFinder1Par::get_zvert, and mMuiRoadFinder1Par::NUMFITPOINTS.

Referenced by find_1droads, and track_seed.

00697 {
00698 
00699   float z[mMuiRoadFinder1Par::NUMFITPOINTS+1]={0.0};
00700   float x[mMuiRoadFinder1Par::NUMFITPOINTS+1]={0.0};
00701   float w[mMuiRoadFinder1Par::NUMFITPOINTS+1]={0.0};
00702   int npoints = 0;
00703   float slope = 0.0,
00704     intercept = 0.0,
00705     chisq = 0.0,
00706     sigma_slope = 0.0,
00707     sigma_intercept = 0.0,
00708     hit_zmin = 1E10,
00709     hit_zmax = 0.0;
00710 
00711   z[npoints] = _mod_par->get_zvert();
00712   x[npoints] = (road1dptr->get()->get_orientation()==0)
00713                  ? _mod_par->get_yvert() : _mod_par->get_xvert();
00714   w[npoints] = _mod_par->get_weight_par_1d(0);
00715   npoints++;
00716   
00717   TMuiClusterMapO::const_key_iterator iclust
00718      =road1dptr->get()->get_associated<TMuiClusterO>();
00719 #ifdef MUIOO_DEBUG
00720   cout << "mMuiRoadFinder1::fit1d" <<endl;
00721   road1dptr->get()->print();
00722   cout << "Associated cluster count("
00723        << iclust.count() <<")"<<endl;
00724 #endif 
00725   road1dptr->get()->set_nhit(iclust.count());
00726   
00727   while(TMuiClusterMapO::const_pointer clustptr = iclust.next())
00728   {
00729     PHPoint centroid = clustptr->get()->get_centroidpos();
00730     PHPoint sigma = clustptr->get()->get_centroidsigma();
00731     road1dptr->get()->set_gapbit( road1dptr->get()->get_gapbit() | (0x1<<clustptr->get()->get_plane()));
00732 
00733     if(road1dptr->get()->get_depth() < clustptr->get()->get_plane())
00734     {
00735       road1dptr->get()->set_depth(clustptr->get()->get_plane());
00736     }
00737       
00738     z[npoints]  = centroid.getZ();
00739     if(abs(z[npoints])<abs(hit_zmin))
00740     {
00741       hit_zmin = z[npoints];
00742     }
00743     if(abs(z[npoints])>abs(hit_zmax))
00744     {
00745       hit_zmax = z[npoints];
00746     }
00747     if (road1dptr->get()->get_orientation() == 0) {
00748       x[npoints] = centroid.getY();
00749       w[npoints] = 1.0/(sigma.getY()*sigma.getY());
00750     } else {
00751       x[npoints] = centroid.getX();
00752       w[npoints] = 1.0/(sigma.getX()*sigma.getX());
00753     }
00754     npoints++;
00755     if(npoints>6) break;
00756   }
00757 
00758   int status = utiLineFit(z,x,w,npoints,&slope,&intercept,&chisq,
00759                           &sigma_slope,&sigma_intercept);
00760   if(status!= 0 )
00761   {
00762     cout<<PHWHERE<<" Unable to fit MuID road." << endl;
00763     return -1;
00764   }
00765   double dydz, dxdz, xint, yint;
00766   if (road1dptr->get()->get_orientation() == 0)
00767   {
00768     dydz = slope;
00769     dxdz = 0.0;
00770     yint = intercept;
00771     xint = 0.0;
00772   } else {
00773     dydz = 0.0;
00774     dxdz = slope;
00775     yint = 0.0;
00776     xint = intercept;
00777   }
00778   TMutFitPar fitpar1d(xint,yint,0.0,dxdz,dydz,chisq);
00779   fitpar1d.set_z_begin(hit_zmin);
00780   fitpar1d.set_z_end(hit_zmax);
00781   road1dptr->get()->set_fit_par(fitpar1d);
00782   
00783   return 0;
00784 }

int flag_golden   [private]
 

Definition at line 879 of file mMuiRoadFinder1.cxx.

References _mod_par, _roadmap, TMuiRoadOGroup::AttachRoad, TMuiRoadMapO::get, mMuiRoadFinder1Par::get_mui_window, mMuiRoadFinder1Par::get_mut_window, mMuiRoadFinder1Par::get_mut_z_north, mMuiRoadFinder1Par::get_mut_z_south, TMuiRoadOGroup::MergeGroup, and TMuiRoadOGroup::SetGroup.

Referenced by event.

00880 {
00881   //Loop over arms
00882   for (short iArm=0; iArm<TMuiChannelId::kArmsTotal; iArm++)
00883   {
00884     // Reject ghost by grouping the roads
00885     vector<TMuiRoadOGroup*> pGroup;
00886     vector<TMuiRoadOGroup*>::iterator ig;
00887     
00888     TMuiRoadOGroup* iGroup;
00889     TMuiRoadMapO::iterator iRoad = _roadmap->get(iArm);
00890     while(TMuiRoadMapO::pointer road2D = iRoad.next())
00891     {
00892       bool InGroup = false;
00893       iGroup=NULL;
00894       for(ig=pGroup.begin();ig!=pGroup.end();ig++){
00895         if ((*ig)->IsGroup(road2D)){
00896           if(!InGroup)
00897           {
00898             //This is the first group associated with the road
00899             (*ig)->AttachRoad(road2D);
00900             iGroup = (*ig);
00901           }else{
00902             // This road has already been associated with a road
00903             // Instead of adding it to two groups lets merge this into the first
00904             // then remove the first group
00905             // cout<<"Merging MuidGroups ..."<<endl;
00906             iGroup->MergeGroup(*ig);
00907             TMuiRoadOGroup* removedGroup = (*ig);
00908             delete removedGroup;  // Delete the new TMuiRoadOGroup object
00909             pGroup.erase(ig);  // Remove the Group pointer from the list.
00910             ig--; // Decrement the iterator since erase incremented
00911           }
00912           InGroup = true;
00913         }
00914       }
00915       if( !InGroup){
00916         // This road doesn't belong to any group, create a new group
00917         float MutrZ;
00918         if(iArm == 0){
00919           MutrZ = _mod_par->get_mut_z_south();
00920         } else {
00921           MutrZ = _mod_par->get_mut_z_north();
00922         }
00923         iGroup = new TMuiRoadOGroup(iArm,MutrZ,_mod_par->get_mut_window(),_mod_par->get_mui_window());
00924         iGroup->AttachRoad(road2D);
00925         pGroup.push_back(iGroup);
00926       }
00927     }
00928     
00929 #ifdef MUIOO_DEBUG
00930   cout<<PHWHERE<<" Mark Golden Roads"<< endl;
00931 #endif
00932 
00933     // set group index and golden mark for each road object
00934     // The golden flags are saved in the TMui2DRoads
00935     short ngroup = pGroup.size();
00936     for(short i=0; i<ngroup; i++){
00937       iGroup = pGroup[i];
00938       iGroup->SetGroup(i);
00939     }
00940 
00941 #ifdef MUIOO_DEBUG
00942     cout<<PHWHERE<<" Destroy Group Objects"<< endl;
00943 #endif
00944 
00945     // destroy the all group objects
00946     for(short i=0; i<ngroup; i++){
00947       delete pGroup[i];
00948     }
00949 
00950   }//for(iArm...
00951   return 0;
00952 }

bool intersectionOK TMuiClusterMapO::const_pointer    clustH,
TMuiClusterMapO::const_pointer    clustV
const [private]
 

Definition at line 852 of file mMuiRoadFinder1.cxx.

Referenced by find_2droads.

00854 {
00855   TMuiGeometry* geom = TMuiGeometry::Geom();
00856   // Is the intersection point inside the panel(s) containing the H and
00857   // V clusters?
00858   TMuiPanelGeo* ph = geom->getPanel(clustH->get()->get_arm(),
00859                                     clustH->get()->get_plane(),
00860                                     clustH->get()->get_panel());
00861   TMuiPanelGeo* pv = geom->getPanel(clustV->get()->get_arm(),
00862                                     clustV->get()->get_plane(),
00863                                     clustV->get()->get_panel());
00864 
00865   PHPoint hpoint = clustH->get()->get_centroidpos();
00866   PHPoint vpoint = clustV->get()->get_centroidpos();
00867 
00868   PHPoint h1_local = ph->TransformToPanel(hpoint);
00869   PHPoint v1_local = ph->TransformToPanel(vpoint);
00870 
00871   PHPoint h2_local = pv->TransformToPanel(hpoint);
00872   PHPoint v2_local = pv->TransformToPanel(vpoint);
00873 
00874   return (ph->IsInPanel(v1_local.getX(), h1_local.getY(), 0.0) &&
00875           pv->IsInPanel(v2_local.getX(), h2_local.getY(), 0.0)   );
00876   
00877 }

int mMuiRoadFinder1::make2d TMuiRoadMapO::pointer    cRoad,
TMui1DRoadMapO::pointer    pRoadH,
TMui1DRoadMapO::pointer    pRoadV
[private]
 

void set_interface_ptrs PHCompositeNode *    baseNode [private]
 

Definition at line 806 of file mMuiRoadFinder1.cxx.

References _clustermap, _mod_par, _road1dmap, _roadmap, and MUIOO::TRACE.

Referenced by event.

00807 {
00808   // module runtime parameters
00809   try {
00810     _mod_par = TMutNode<mMuiRoadFinder1Par>::find_node(top_node,"mMuiRoadFinder1Par");
00811   }
00812   catch(std::exception& e){
00813     MUIOO::TRACE(e.what());
00814     return;
00815   }
00816 
00817   //Find the TMuiRoadO IOC
00818   try{
00819     _roadmap = TMutNode<TMuiRoadMapO>::find_node(top_node,"TMuiRoadMapO");
00820   } catch(std::exception& e){
00821 MUIOO::TRACE(e.what());
00822     return;
00823 //    TMutNode<TMuiRoadMapO>::new_node(muiNode,"TMuiRoadMapO");
00824 //    _roadmap = TMutNode<TMuiRoadMapO>::find_node(muiNode,"TMuiRoadMapO");
00825 //    _roadmap->make_persistent(dstNode,"TMuiRoadO");
00826   }
00827 
00828   //Find the TMui1DRoadO IOC
00829   try{
00830     _road1dmap = TMutNode<TMui1DRoadMapO>::find_node(top_node,"TMui1DRoadMapO");
00831   } catch(std::exception& e){
00832 MUIOO::TRACE(e.what());
00833     return;
00834 //    TMutNode<TMui1DRoadMapO>::new_node(muiNode,"TMui1DRoadMapO");
00835 //    _road1dmap = TMutNode<TMui1DRoadMapO>::find_node(muiNode,"TMui1DRoadMapO");
00836 //    _road1dmap->make_persistent(dstNode,"TMui1DRoadO");
00837   }
00838 
00839   //Find the new TMuiClusterO IOC
00840   try{
00841     _clustermap = TMutNode<TMuiClusterMapO>::find_node(top_node,"TMuiClusterMapO");
00842   } catch(std::exception& e){
00843 MUIOO::TRACE(e.what());
00844     return;
00845  //   TMutNode<TMuiClusterMapO>::new_node(muiNode,"TMuiClusterMapO");
00846  //   _clustermap = TMutNode<TMuiClusterMapO>::find_node(muiNode,"TMuiClusterMapO");
00847  //   _clustermap->make_persistent(dstNode,"TMuiClusterO");
00848   }
00849   
00850 }

int track_seed TMui1DRoadMapO::pointer    road1dptr,
int    iLoop,
int    iSearch
[private]
 

Definition at line 463 of file mMuiRoadFinder1.cxx.

References _clustermap, _mod_par, _road1dmap, ClusterDistance, muioo_cluster_distance::distance, fit1d, TMuiClusterMapO::get, mMuiRoadFinder1Par::get_max_clusters_per_gap_search, mMuiRoadFinder1Par::get_mui_window, mMuiRoadFinder1Par::get_num_seed_loops, mMuiRoadFinder1Par::get_search_length, mMuiRoadFinder1Par::get_search_order, TMui1DRoadMapO::insert_new, and muioo_cluster_distance::pCluster.

Referenced by find_1droads.

00465 {
00466 
00467   double Win = _mod_par->get_mui_window();
00468   if(road1dptr->get()->get_associated<TMuiClusterO>().count() == 1)
00469     Win = 2.0 * Win;
00470   
00471   //Invalid iLoop
00472   if(iLoop>=_mod_par->get_num_seed_loops()) return 0;
00473 
00474   // End this recursion loop over search planes
00475   if(iSearch>=_mod_par->get_search_length(iLoop)) return 0;
00476 #ifdef MUIOO_DEBUG
00477   cout<<"Tracking seed: iLoop("<<iLoop<<") iSearch("<<iSearch<<")\n";
00478 #endif
00479   //First get list of clusters in panel
00480   // and order them by their distance from seed projection
00481   TMuiClusterMapO::iterator iclusts =
00482     _clustermap->get(road1dptr->get()->get_arm(),
00483                      _mod_par->get_search_order(iLoop, iSearch),
00484                      road1dptr->get()->get_panel(),
00485                      road1dptr->get()->get_orientation()
00486                      );
00487 
00488 
00489 
00490   fit1d(road1dptr);
00491   
00492   // Loop over all clusters in the panel
00493   // and project the road to the current panel;
00494   // if in the window append to local copy
00495   // then sort by distance
00496   std::vector<muioo_cluster_distance> clusterList;
00497   muioo_cluster_distance tmp_cd;
00498   double clust_dist = 0.0;
00499   bool clustInPanel = false;
00500 
00501   while(TMuiClusterMapO::pointer clustptr = iclusts.next())
00502 
00503   {
00504     clust_dist = ClusterDistance(road1dptr,clustptr);
00505     // JLN - this was MuidWindow, but changed to use Win (as defined above to double in case of first hit) - 07/25/03
00506     if(clust_dist < Win)
00507     {
00508       tmp_cd.distance = clust_dist;
00509       tmp_cd.pCluster = clustptr;
00510       clusterList.push_back(tmp_cd);
00511     }
00512   }
00513   
00514   // If there's no cluster found
00515   // lets look for clusters in the adjacent panels, but
00516   // continue to consider a candidate with no hit in the
00517   // current panel, ie Hardware Inefficiency
00518 #ifdef MUIOO_DEBUG
00519   cout<<"Found "<<clusterList.size()<<" in the current panel "<<endl;
00520 #endif
00521   if(clusterList.size()>0)
00522   {
00523     clustInPanel=true;
00524   }
00525 
00526   if(!clustInPanel)
00527   {
00528     for (short iPanel=0;
00529          iPanel<TMuiChannelId::kPanelsPerPlane; iPanel++) {
00530 
00531       if(!(
00532          (iPanel = ((iPanel + 1)% TMuiChannelId::kPanelsPerPlane))
00533          ||((iPanel + TMuiChannelId::kPanelsPerPlane - 1)% TMuiChannelId::kPanelsPerPlane)
00534         )) continue; //Skip non-adjacent panels
00535       
00536       TMuiClusterMapO::iterator iclustsNA =
00537         _clustermap->get(road1dptr->get()->get_arm(),
00538                          _mod_par->get_search_order(iLoop, iSearch),
00539                          iPanel,
00540                          road1dptr->get()->get_orientation()
00541                          );
00542 
00543       while(TMuiClusterMapO::pointer clustptr = iclustsNA.next())
00544       {
00545 
00546         if(!clustptr)
00547         {
00548           cout <<PHWHERE << ": null "
00549                << "cluster pointer"   << endl;
00550           break;
00551         }else{
00552 
00553           // Get the displacement of cluster pc to road1D
00554           clust_dist  = ClusterDistance(road1dptr,clustptr);
00555 
00556           // Consider all of the clusters within the window
00557           // JLN - again MuidWindow -> Win - 07/25/03
00558           if ( clust_dist < Win )
00559           {
00560             tmp_cd.pCluster=clustptr;
00561             tmp_cd.distance = clust_dist;
00562             clusterList.push_back(tmp_cd);
00563           }
00564         }//if(!pC)
00565       } //while(iClust)
00566     }//if(iPanel ...
00567   }//  if(!clustInPanel)
00568   
00569   //Let's sort the list by the distance from projection
00570   sort(clusterList.begin(), clusterList.end(), muioo_cluster_distance_sort());
00571 
00572   // First case: No clusters in any panel so go to next search gap
00573   if((!clustInPanel&& (clusterList.size()==0)))
00574   {
00575     track_seed(road1dptr , iLoop, iSearch+1);
00576   }else if(!clustInPanel)
00577   {
00578     //Second case: no clust in current panel but in adjacent
00579     // track a copy without clusters
00580     TMui1DRoadMapO::pointer new1droadptr = (_road1dmap->insert_new(road1dptr)).current();
00581 #ifdef MUIOO_DEBUG
00582     cout<<"Copied 1DRoad\n";
00583     cout<<"Original:\n";
00584     road1dptr->get()->print();
00585     cout<<"Copy:\n";
00586     new1droadptr->get()->print();
00587 #endif    
00588     track_seed(new1droadptr, iLoop, iSearch+1);
00589   }
00590 
00591   // In any case,
00592   // Loop over all clusters up to maxClustersPerGapSearch
00593   // Create a copy (if not last)
00594   // Add cluster to copy and track_seed
00595   int newRoadCount = 0;
00596   vector<muioo_cluster_distance>::iterator lastEntry =
00597     clusterList.end();
00598   lastEntry--;
00599   for(vector<muioo_cluster_distance>::iterator iClustCand = clusterList.begin();
00600       iClustCand != clusterList.end(); iClustCand++){
00601     if(iClustCand == lastEntry ||
00602        (newRoadCount == _mod_par->get_max_clusters_per_gap_search()-1)){
00603       PHKey::associate(road1dptr,(*iClustCand).pCluster);
00604       track_seed(road1dptr, iLoop, iSearch+1);
00605       break;
00606     }else{
00607       TMui1DRoadMapO::pointer new1droadptr = (_road1dmap->insert_new(road1dptr)).current();
00608 #ifdef MUIOO_DEBUG
00609       cout<<"Copied 1DRoad\n";
00610       cout<<"Original:\n";
00611       road1dptr->get()->print();
00612       cout<<"Copy:\n";
00613       new1droadptr->get()->print();
00614       return 0;
00615 #endif
00616       PHKey::associate(new1droadptr,(*iClustCand).pCluster);
00617       track_seed(road1dptr, iLoop, iSearch+1);
00618       newRoadCount++;
00619     }
00620   }
00621   clusterList.clear();
00622   return 0;
00623 }


Member Data Documentation

TMuiClusterMapO* _clustermap [private]
 

Definition at line 61 of file mMuiRoadFinder1.h.

Referenced by find_1droads, set_interface_ptrs, and track_seed.

const mMuiRoadFinder1Par* _mod_par [private]
 

Definition at line 58 of file mMuiRoadFinder1.h.

Referenced by cut_1droads, find_1droads, find_2droads, fit1d, flag_golden, set_interface_ptrs, and track_seed.

TMui1DRoadMapO* _road1dmap [private]
 

Definition at line 60 of file mMuiRoadFinder1.h.

Referenced by cut_1droads, event, find_1droads, find_2droads, set_interface_ptrs, and track_seed.

TMuiRoadMapO* _roadmap [private]
 

Definition at line 59 of file mMuiRoadFinder1.h.

Referenced by event, find_2droads, flag_golden, and set_interface_ptrs.

PHTimeServer::timer _timer [private]
 

Definition at line 62 of file mMuiRoadFinder1.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: