00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00011 
00020 
00021 #include <mMuiSlowSim.h>
00022 #include <mMuiSlowSimPar.h>
00023 #include <TMutNode.h>
00024 #include <MUIOO.h>
00025 
00026 
00027 #include <root_ptrk.h>
00028 #include <rootAnc.h>
00029 
00030 
00031 #include <MuiGeomClasses.hh>
00032 
00033 
00034 #include <PHGeometryObject.h>
00035 #include <PHVector.h>
00036 #include <PHException.h>
00037 #include <PHTimer.h>
00038 
00039 
00042 
00043 
00044 #include <iostream>
00045 #include <string>
00046 
00047 mMuiSlowSim::mMuiSlowSim() : 
00048   _timer( PHTimeServer::get()->insert_new("mMuiSlowSim") )
00049 {
00050   name = "mMuiSlowSim";
00051   MUTOO::TRACE("initializing module " + std::string(name.getString()));  
00052 }
00053 
00054 
00055 
00056 mMuiSlowSim::~mMuiSlowSim() { }
00057 
00058 
00059 
00060 PHBoolean mMuiSlowSim::event(PHCompositeNode* top_node)
00061 {
00062 
00063   _timer.get()->restart(); 
00064   
00065   try { 
00066     
00067     
00068     set_interface_ptrs(top_node);    
00069 
00070     
00071     
00072     digitize();
00073 
00074     
00075     
00076     
00077     associate_mctrk();
00078 
00079   } catch(std::exception& e) {
00080     
00081     
00082     MUTOO::TRACE(e.what());
00083     return False;
00084   }  
00085   
00086   
00087   
00088   
00089   _timer.get()->stop();
00090   if(_mod_par->get_verbosity() >= MUIOO::ALOT) _mc_hit_map->print();
00091   if(_mod_par->get_verbosity() >= MUIOO::SOME) _timer.get()->print();     
00092   return True;
00093 }
00094 
00096 void 
00097 mMuiSlowSim::set_interface_ptrs(PHCompositeNode* top_node)
00098 {  
00099   
00100   
00101   _mod_par = TMutNode<mMuiSlowSimPar>::find_node(top_node,"mMuiSlowSimPar");
00102 
00103   
00104   
00105   _mc_hit_map = TMutNode<TMuiMCHitMapO>::find_node(top_node,"TMuiMCHitMapO");
00106 
00107   
00108   
00109   _mc_trk_map = TMutNode<TMutMCTrkMap>::find_node(top_node,"TMutMCTrkMap");
00110 
00111   
00112   
00113   
00114   munhitsWrapper* munhits_ptr= TMutNode<munhitsWrapper>::find_io_node(top_node,"munhits");
00115   _munhits_h = munhits_ptr->TableHeader();
00116   _munhits = munhits_ptr->TableData();
00117 } 
00118 
00119 
00120 void
00121 mMuiSlowSim::digitize()
00122 {
00123   
00124   
00125   
00126   
00127   for (int hit=0; hit<_munhits_h.nok; hit++) {
00128     
00129     
00130     
00131     short PisaPlane = _munhits[hit].plane_num;   
00132     
00133     
00134     short iArm = -1;
00135     if (PisaPlane > 2000) {
00136       iArm = kSOUTH;
00137     } else {
00138       iArm = kNORTH;
00139     }
00140     
00141     short  iPlane = (PisaPlane%1000) - 1;
00142     
00143     
00144     if ( (iArm<0) || (iArm>=TMuiChannelId::kArmsTotal) ||
00145          (iPlane<0) || (iPlane>=TMuiChannelId::kPlanesPerArm) ) {
00146       continue;
00147     } 
00148     
00149     TMuiMCHitMapO::iterator mc_hit_iter = _mc_hit_map->insert_new(iArm,iPlane);
00150     
00151     
00152     
00153 
00154     
00155     mc_hit_iter->get()->set_arm(iArm);    
00156     mc_hit_iter->get()->set_plane(iPlane);    
00157     
00158     
00159     mc_hit_iter->get()->set_track_id(_munhits[hit].track_num);
00160     mc_hit_iter->get()->set_x(_munhits[hit].rhit[0]);    
00161     mc_hit_iter->get()->set_y(_munhits[hit].rhit[1]);    
00162     mc_hit_iter->get()->set_z(_munhits[hit].rhit[2]);    
00163     mc_hit_iter->get()->set_px(_munhits[hit].phit[0]);    
00164     mc_hit_iter->get()->set_py(_munhits[hit].phit[1]);    
00165     mc_hit_iter->get()->set_pz(_munhits[hit].phit[2]); 
00166     mc_hit_iter->get()->set_pid(_munhits[hit].trk_id);
00167     
00168             
00169     
00170     
00171     
00172     Hep3Vector X(_munhits[hit].rhit[0],     
00173                  _munhits[hit].rhit[1],     
00174                  _munhits[hit].rhit[2]);
00175     
00176     
00177     float r = sqrt(_munhits[hit].phit[0]*_munhits[hit].phit[0]+_munhits[hit].phit[1]*_munhits[hit].phit[1]+_munhits[hit].phit[2]*_munhits[hit].phit[2]);
00178     float v1=_munhits[hit].phit[0]/r;
00179     float v2=_munhits[hit].phit[1]/r;
00180     float v3=_munhits[hit].phit[2]/r;
00181 
00182     
00183 
00184 
00185 
00186 
00187     Hep3Vector V(v1,v2,v3);
00188     std::vector<TMuiChannelId> twoPackList;
00189     
00190     
00191     twoPackList = TMuiGeometry::Geom()->findTwoPacks(iArm,iPlane,X,V);      
00192     
00193     
00194     
00195     
00196     
00197     
00198     
00199 
00200     if (twoPackList.size() > 0) { 
00201             
00202       for (unsigned int i=0; i<twoPackList.size(); i++) {         
00203         short iPanel      = twoPackList[i].Panel();
00204         EOrient_t iOrient = twoPackList[i].Orient();
00205         short iTwoPack    = twoPackList[i].TwoPack();
00206         mc_hit_iter->get()->add_twopack(iOrient, iPanel, iTwoPack);
00207         
00208         
00209         
00210       }
00211     }
00212   }
00213   
00214 }
00215 
00216 void 
00217 mMuiSlowSim::associate_mctrk() 
00218 {
00219   
00220   
00221   
00222   
00223   
00224   
00225   
00226   
00227   
00228   
00229   
00230   
00231 
00232   TMuiMCHitMapO::iterator muimchit_iter = _mc_hit_map->range();
00233   while(TMuiMCHitMapO::pointer muimchit_ptr = muimchit_iter.next()){
00234     TMutMCTrkMap::iterator mctrk_iter = _mc_trk_map->range();
00235     bool is_associated = false;
00236     while(TMutMCTrkMap::pointer mctrk_ptr = mctrk_iter.next()){
00237       if(mctrk_ptr->get()->get_track_id()!=muimchit_ptr->get()->get_track_id())
00238         continue;
00239       is_associated = true;
00240       PHKey::associate(muimchit_ptr,mctrk_ptr);
00241     }
00242     if(is_associated==false) fill_new_mctrk(muimchit_ptr);
00243   }
00244 }
00245 
00246 void 
00247 mMuiSlowSim::fill_new_mctrk(TMuiMCHitMapO::pointer mc_hit_ptr)
00248 {
00249 
00250   
00251   
00252   
00253   
00254   
00255   float ptot=0, ptheta=0, pphi=0, r_vertex=0, z_vertex=0, theta_vertex=0, phi_vertex=0;
00256   int nfile=0, error=0, itparent=0, idparent=0, idpart=0;
00257 
00258   int track_id = mc_hit_ptr->get()->get_track_id();
00259 
00260   
00261   
00262   TMutMCTrkMap::iterator mctrk_iter = _mc_trk_map->insert_new(mc_hit_ptr->get()->get_arm());
00263 
00264   
00265   
00266   dio_ptrkstack(&track_id, &nfile, &error, &ptot, &ptheta, &pphi,
00267                 &r_vertex, &z_vertex, &theta_vertex, &phi_vertex, 
00268                 &itparent, &idparent, &idpart); 
00269   
00270   
00271   
00272   mctrk_iter->get()->set_arm(mc_hit_ptr->get()->get_arm());
00273   mctrk_iter->get()->set_pid(idpart);
00274   mctrk_iter->get()->set_track_id(track_id);
00275   mctrk_iter->get()->set_parent_id(idparent);
00276   mctrk_iter->get()->set_x_orig(r_vertex*sin(theta_vertex*MUIOO::DEG_TO_RAD)*cos(phi_vertex*MUIOO::DEG_TO_RAD));
00277   mctrk_iter->get()->set_y_orig(r_vertex*sin(theta_vertex*MUIOO::DEG_TO_RAD)*sin(phi_vertex*MUIOO::DEG_TO_RAD));
00278   mctrk_iter->get()->set_z_orig(z_vertex);
00279   mctrk_iter->get()->set_px_orig(ptot*sin(ptheta*MUIOO::DEG_TO_RAD)*cos(pphi*MUIOO::DEG_TO_RAD));
00280   mctrk_iter->get()->set_py_orig(ptot*sin(ptheta*MUIOO::DEG_TO_RAD)*sin(pphi*MUIOO::DEG_TO_RAD));
00281   mctrk_iter->get()->set_pz_orig(ptot*cos(ptheta*MUIOO::DEG_TO_RAD));
00282 
00283   
00284   
00285   
00286   
00287   if(idpart==5 || idpart==8 || idpart == 11 || idpart == 14){
00288     mctrk_iter->get()->set_charge(1);
00289   } else if(idpart == 6 || idpart == 9 || idpart == 12 || idpart == 15) {
00290     mctrk_iter->get()->set_charge(-1);
00291   } else {
00292     MUIOO::TRACE("mMuiSlowSim got an unrecognized PID -- setting charge to 0");
00293     mctrk_iter->get()->set_charge(0);
00294   }
00295   
00296   
00297   PHKey::associate(mc_hit_ptr, mctrk_iter.current());
00298 }
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314