00001 
00002 
00003 
00004 
00006 
00007 
00008 
00009 #include<mMuiEvalO.h>
00010 #include<mMuiEvalOPar.h>
00011 #include<TMuiRoadEval.hh>
00012 #include<TMutNode.h>
00013 #include<PHException.h>
00014 #include<MUIOO.h>
00015 
00016 
00017 #include<string>
00018 #include<iostream>
00019 
00021 mMuiEvalO::mMuiEvalO():
00022   _timer( PHTimeServer::get()->insert_new( "mMuiEvalO" ) )
00023 {
00024   name = "mMuiEvalO";
00025   MUTOO::TRACE("initializing module " + std::string(name.getString()));
00026 }
00027 
00029 mMuiEvalO::~mMuiEvalO(){;}
00030 
00032 PHBoolean 
00033 mMuiEvalO::event(PHCompositeNode* top_node)
00034 {  
00035   _timer.get()->restart(); 
00036 
00037   try {
00038     
00039     
00040     set_interface_ptrs(top_node);
00041 
00042     
00043     
00044     
00045     
00046     
00047     if(_mod_par->get_pr_mode() == mMuiEvalOPar::NORMAL) {
00048       
00049       
00050       associate_mchit();      
00051       if( _mod_par->get_verbosity() >= MUIOO::MAX ) {
00052         MUIOO::PRINT(std::cout, " After associate_mc_hit");
00053         _mctrk_map->print();
00054       }
00055 
00056       
00057       
00058       associate_mctrk();
00059       if( _mod_par->get_verbosity() >= MUIOO::MAX ) {
00060         MUIOO::PRINT(std::cout, " After associate_mc_trk");
00061         _mctrk_map->print();
00062       }      
00063     }
00064 
00065     
00066     
00067     evaluate();
00068     if( _mod_par->get_verbosity() >= MUIOO::MAX ) {
00069       MUIOO::PRINT(std::cout, " After evaluate");
00070       _mctrk_map->print();
00071     }
00072     
00073   } 
00074   catch(std::exception& e) {
00075     MUIOO::TRACE(e.what());
00076     return False;
00077   }
00078   
00079   _timer.get()->stop();
00080   if(_mod_par->get_verbosity() >= MUIOO::SOME) _timer.get()->print();
00081   
00082   
00083   if(_mod_par->get_verbosity() >= MUIOO::ALOT) _eval_map->print();
00084   
00085   return True;
00086 }
00087 
00089 void 
00090 mMuiEvalO::set_interface_ptrs(PHCompositeNode* top_node)
00091 {
00092   
00093   
00094   _mod_par = TMutNode<mMuiEvalOPar>::find_node(top_node,"mMuiEvalOPar");
00095   
00096   
00097   _hit_map = TMutNode<TMuiHitMapO>::find_node(top_node,"TMuiHitMapO");
00098   
00099   
00100   _cluster_map = TMutNode<TMuiClusterMapO>::find_node(top_node,"TMuiClusterMapO");
00101   
00102   
00103   _road_map = TMutNode<TMuiRoadMapO>::find_node(top_node,"TMuiRoadMapO");
00104   
00105   
00106   _mctrk_map = TMutNode<TMutMCTrkMap>::find_node(top_node,"TMutMCTrkMap");
00107   
00108   
00109   _eval_map = TMutNode<TMuiEvalMap>::find_node(top_node,"TMuiEvalMap");
00110 }
00111 
00113 void 
00114 mMuiEvalO::evaluate()
00115 {
00116   
00117   
00118   
00119   
00120   
00121   
00122   
00123   
00124   
00125   
00126   TMutMCTrkMap::iterator mc_trk_iter = _mctrk_map->range();
00127   while(TMutMCTrkMap::pointer mc_trk_ptr = mc_trk_iter.next()){
00128 
00129     TMuiMCHitMapO::key_iterator mc_hit_iter = 
00130       mc_trk_ptr->get()->get_associated<TMuiMCHitO>();
00131     
00132     TMuiRoadMapO::key_iterator road_iter = 
00133       mc_trk_ptr->get()->get_associated<TMuiRoadO>();
00134     
00135     
00136     
00137     
00138     if (!road_iter.count()){
00139       TMuiEvalMap::iterator eval_iter = 
00140         _eval_map->insert_new(mc_trk_ptr->get()->get_arm());
00141       fill_road_eval(0, mc_trk_ptr, eval_iter.current());
00142       PHKey::associate(mc_trk_ptr, eval_iter.current());
00143     }
00144     
00145     
00146     
00147     while(TMuiRoadMapO::pointer road_ptr = road_iter.next()){
00148       TMuiEvalMap::iterator eval_iter = 
00149         _eval_map->insert_new(mc_trk_ptr->get()->get_arm());
00150       fill_road_eval(road_ptr, mc_trk_ptr, eval_iter.current());
00151 
00152       
00153       
00154       fill_eval_res(road_ptr, mc_trk_ptr, eval_iter.current());
00155       
00156       
00157       
00158       PHKey::associate(road_ptr,eval_iter.current());
00159       PHKey::associate(mc_trk_ptr,eval_iter.current());
00160     }
00161   }
00162   return;
00163 }
00164 
00165 void  
00166 mMuiEvalO::associate_mchit()
00167 {
00168   
00169   
00170   
00171   
00172   
00173   
00174   
00175   
00176   
00177   TMuiClusterMapO::iterator cluster_iter = _cluster_map->range();
00178   while(TMuiClusterMapO::pointer cluster_ptr = cluster_iter.next()) {
00179     
00180     TMuiHitMapO::key_iterator hit_iter = cluster_ptr->get()->get_associated<TMuiHitO>();
00181     if(!hit_iter.at_end()){
00182       TMuiHitMapO::pointer hit_ptr = hit_iter.current();
00183       
00184       TMuiMCHitMapO::key_iterator mc_hit_iter = hit_ptr->get()->get_associated<TMuiMCHitO>();
00185       while(TMuiMCHitMapO::pointer mc_hit_ptr = mc_hit_iter.next()){
00186         
00187         
00188         PHKey::associate(mc_hit_ptr,cluster_ptr);
00189       }
00190     }
00191   }
00192   return;
00193 }
00194 
00195 void 
00196 mMuiEvalO::associate_mctrk()
00197 {
00198   typedef std::pair<int, int> roadid_pair;
00199   typedef std::vector<roadid_pair> roadid_list;
00200   
00201   
00202   
00203   TMuiRoadMapO::iterator road_iter = _road_map->range();
00204   
00205   
00206   
00207   
00208   
00209   
00210   
00211   
00212   
00213   
00214   
00215   
00216   
00217 
00218   while(TMuiRoadMapO::pointer road_ptr = road_iter.next()){
00219     TMuiClusterMapO::const_key_iterator cluster_iter = 
00220       road_ptr->get()->get_associated<TMuiClusterO>();
00221 
00222     
00223     
00224     
00225     
00226     
00227     
00228     
00229     roadid_list road_counter;
00230     while(TMuiClusterMapO::const_pointer cluster_ptr = cluster_iter.next()) {
00231 
00232       TMuiMCHitMapO::const_key_iterator mc_hit_iter = 
00233         cluster_ptr->get()->get_associated<TMuiMCHitO>();
00234 
00235       while(TMuiMCHitMapO::const_pointer mc_hit_ptr = mc_hit_iter.next()){
00236 
00237         TMutMCTrkMap::key_iterator mc_trk_iter = 
00238           mc_hit_ptr->get()->get_associated<TMutMCTrk>();
00239 
00240         while(TMutMCTrkMap::pointer mc_trk_ptr=mc_trk_iter.next()){
00241           bool already_in = false;
00242           roadid_list::iterator list_iter = road_counter.begin();
00243 
00244           
00245           
00246           
00247           
00248           
00249           for(; list_iter!=road_counter.end(); ++list_iter) {
00250             
00251             if(list_iter->second==(mc_trk_ptr->get()->get_track_id())){
00252               list_iter->first=list_iter->first+1;
00253               already_in=true;
00254             }
00255           } 
00256           if(already_in==false) {
00257             road_counter.push_back(std::make_pair(1, 
00258                                    mc_trk_ptr->get()->get_track_id()));
00259           }
00260         }
00261       }
00262     }
00263     
00264     
00265     
00266     int max_hit =0;
00267     int max_track_id =0;
00268     roadid_list::iterator list_iter = road_counter.begin();
00269     for(; list_iter!=road_counter.end(); ++list_iter) {
00270 
00271       if(list_iter->first>max_hit) {
00272         max_track_id = list_iter->second;
00273         max_hit = list_iter->first;
00274       }
00275     }
00276     TMutMCTrkMap::iterator mc_trk_iter = _mctrk_map->range();
00277     while(TMutMCTrkMap::pointer mc_trk_ptr =  mc_trk_iter.next()){
00278 
00279       if((mc_trk_ptr->get()->get_track_id())==max_track_id) {
00280         PHKey::associate(mc_trk_ptr, road_ptr);
00281       }
00282     }
00283   }
00284   return;
00285 }
00286 
00287 void 
00288 mMuiEvalO::fill_road_eval(TMuiRoadMapO::pointer road_ptr, 
00289                           TMutMCTrkMap::pointer mctrk_ptr,
00290                           TMuiEvalMap::pointer eval_ptr)
00291 {
00292   
00293   
00294   TMuiRoadEval road_eval;
00295   
00296   
00297   
00298   UShort_t nhits_mc=0;
00299 
00300   
00301   
00302   TMuiMCHitMapO::key_iterator mc_hit_iter = mctrk_ptr->get()->get_associated<TMuiMCHitO>();      
00303   while(TMuiMCHitMapO::pointer mc_hit_ptr = mc_hit_iter.next()){    
00304     
00305     UShort_t plane = mc_hit_ptr->get()->get_plane();            
00306     
00307     
00308     TMuiClusterMapO::key_iterator cluster_iter = mc_hit_ptr->get()->get_associated<TMuiClusterO>();     
00309     while(TMuiClusterMapO::pointer cluster_ptr = cluster_iter.next()){  
00310       
00311       
00312       nhits_mc |= 1 << (plane*MUIOO::MAX_ORIENTATION + cluster_ptr->get()->get_orientation());
00313     }
00314   }
00315   
00316   
00317   
00318   road_eval.set_n_true_hits(nhits_mc);
00319   
00320   
00321   
00322   UShort_t nhits_mask = get_n_maskhit(mctrk_ptr);
00323   road_eval.set_n_masked_hits(nhits_mask);
00324 
00325   
00326   
00327   if (road_ptr) {
00328     
00329     
00330     
00331     std::pair<UShort_t, UShort_t> masks = get_true_hits(road_ptr,mctrk_ptr);
00332     road_eval.set_n_reco_true_hits(masks.first);    
00333     road_eval.set_n_reco_ghost_hits(masks.second);    
00334   }
00335   
00336   
00337   
00338   road_eval.set_px_true_vx(mctrk_ptr->get()->get_px_orig());
00339   road_eval.set_py_true_vx(mctrk_ptr->get()->get_py_orig());
00340   road_eval.set_pz_true_vx(mctrk_ptr->get()->get_pz_orig());
00341   road_eval.set_ptot_true_vx(mctrk_ptr->get()->get_ptot_orig());
00342   
00343   
00344   
00345   eval_ptr->get()->set_road_eval(road_eval);
00346 
00347   return;  
00348 }
00349 
00350 std::pair<UShort_t,UShort_t> 
00351 mMuiEvalO::get_true_hits(TMuiRoadMapO::pointer road_ptr, 
00352                          TMutMCTrkMap::pointer mctrk_ptr)
00353 {
00354   
00355   
00356   
00357   
00358   
00359   
00360   
00361   
00362 
00363   
00364   
00365   
00366   UShort_t n_true_hits=0, n_ghost_hits=0;
00367   TMuiClusterMapO::const_key_iterator clus_iter = road_ptr->get()->get_associated<TMuiClusterO>();
00368   while(TMuiClusterMapO::const_pointer clus_ptr=clus_iter.next()){
00369 
00370     UShort_t mask = clus_ptr->get()->get_plane()*MUIOO::MAX_ORIENTATION+ clus_ptr->get()->get_orientation();
00371 
00372     
00373     
00374     TMuiMCHitMapO::const_key_iterator mchit_iter = clus_ptr->get()->get_associated<TMuiMCHitO>();
00375 
00376     
00377     
00378     if(mchit_iter.count() == 0) n_ghost_hits |= 1 << mask;
00379     while(TMuiMCHitMapO::const_pointer mchit_ptr=mchit_iter.next()){
00380       if( mchit_ptr->get()->get_track_id() == mctrk_ptr->get()->get_track_id() ) {
00381         n_true_hits |= 1<<mask;
00382       } else {
00383         n_ghost_hits |= 1<<mask;
00384       }
00385     }
00386   }
00387   return std::make_pair(n_true_hits,n_ghost_hits);
00388 }
00389 
00390 UShort_t 
00391 mMuiEvalO::get_n_maskhit(TMutMCTrkMap::pointer mctrk_ptr)
00392 {
00393   
00394   
00395   
00396   
00397   
00398   
00399   
00400   UShort_t mask=0;
00401   typedef TMuiMCHitO::twopack_list twopack_list;
00402   typedef TMuiMCHitO::twopack_list::iterator twopack_iterator;
00403   
00404   TMuiMCHitMapO::const_key_iterator mchit_iter = 
00405     mctrk_ptr->get()->get_associated<TMuiMCHitO>();
00406   while(TMuiMCHitMapO::const_pointer mchit_ptr = mchit_iter.next()){
00407 
00408     
00409     
00410     twopack_list* twopacks = mchit_ptr->get()->get_mutable_twopack_list();
00411     twopack_iterator twopack_iter = twopacks->begin();    
00412     for(;twopack_iter!=twopacks->end();++twopack_iter){
00413       if(twopack_iter->get_status() == TMuiMCTwoPack::MASKED) {
00414         UShort_t index = mchit_ptr->get()->get_plane()*MUIOO::MAX_ORIENTATION +
00415           twopack_iter->get_orient();
00416         mask |= 1 << index;
00417      }
00418     }
00419   }
00420   return mask;
00421 }
00422 void 
00423 mMuiEvalO::fill_eval_res(TMuiRoadMapO::pointer road_ptr,
00424                          TMutMCTrkMap::pointer mctrk_ptr,
00425                          TMuiEvalMap::pointer eval_ptr)
00426 {
00427   
00428   
00429   
00430   
00431   
00432   
00433   
00434 
00435   TMuiClusterMapO::const_key_iterator cluster_iter = 
00436     road_ptr->get()->get_associated<TMuiClusterO>();
00437 
00438   while(TMuiClusterMapO::const_pointer cluster_ptr=cluster_iter.next()){
00439     
00440     TMuiMCHitMapO::const_key_iterator mchit_iter = cluster_ptr->get()->get_associated<TMuiMCHitO>();
00441 
00442     if(mchit_iter.count()<1) {
00443       continue;
00444     }
00445 
00446     while(TMuiMCHitMapO::const_pointer mchit_ptr = mchit_iter.next()){
00447       TMuiEvalRes eval_res;
00448       
00450       eval_res.set_arm(cluster_ptr->get()->get_arm());
00451       eval_res.set_plane(cluster_ptr->get()->get_plane());
00452       eval_res.set_panel(cluster_ptr->get()->get_panel());
00453       eval_res.set_orientation(cluster_ptr->get()->get_orientation());
00454 
00456       eval_res.set_x_true(mchit_ptr->get()->get_x());
00457       eval_res.set_y_true(mchit_ptr->get()->get_y());
00458       eval_res.set_z_true(mchit_ptr->get()->get_z());
00459       eval_res.set_px_true(mchit_ptr->get()->get_px());
00460       eval_res.set_py_true(mchit_ptr->get()->get_py());
00461       eval_res.set_pz_true(mchit_ptr->get()->get_pz());
00462       Float_t pt   = sqrt((eval_res.get_px_true())*(eval_res.get_px_true())+
00463                           (eval_res.get_py_true())*(eval_res.get_py_true()));
00464       Float_t ptot = sqrt((eval_res.get_px_true())*(eval_res.get_px_true())+
00465                           (eval_res.get_py_true())*(eval_res.get_py_true())+
00466                           (eval_res.get_pz_true())*(eval_res.get_pz_true()));
00467 
00468       if(pt==0){
00469         eval_res.set_theta_true(0.0);
00470         eval_res.set_phi_true(-999.0);
00471       }
00472       else{
00473         eval_res.set_theta_true(acos((eval_res.get_pz_true())/ptot));
00474         
00475         
00476         if(eval_res.get_py_true()>0){
00477           eval_res.set_phi_true(acos((eval_res.get_px_true())/pt));
00478         }
00479         else{
00480           eval_res.set_phi_true(-1.0*acos((eval_res.get_px_true())/pt));
00481         }
00482       }          
00483       eval_ptr->get()->push_eval_res_list(eval_res);
00484     }
00485   }                     
00486 }