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

mMuiSlowSim.cxx

Go to the documentation of this file.
00001 
00002 //
00003 // Utility class: mMuiSlowSim:
00004 // Author: J.Nagle, 
00005 // major changes made 9Jul03 by Chun Zhang 
00006 // comments added by Donald Hornback
00007 // Date: 6/23/03
00008 // Description: Convert PISA to detector hits in MUID
00009 //              
00011 
00020 // MUIOO headers
00021 #include <mMuiSlowSim.h>
00022 #include <mMuiSlowSimPar.h>
00023 #include <TMutNode.h>
00024 #include <MUIOO.h>
00025 
00026 // PISA hit table,
00027 #include <root_ptrk.h>
00028 #include <rootAnc.h>
00029 
00030 // Geometry modules
00031 #include <MuiGeomClasses.hh>
00032 
00033 // PHENIX headers
00034 #include <PHGeometryObject.h>
00035 #include <PHVector.h>
00036 #include <PHException.h>
00037 #include <PHTimer.h>
00038 //#include <gufld.h>
00039 
00042 // STL/BOOST
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 // Destructor
00055 
00056 mMuiSlowSim::~mMuiSlowSim() { }
00057 
00058 // Event method.
00059 
00060 PHBoolean mMuiSlowSim::event(PHCompositeNode* top_node)
00061 {
00062 
00063   _timer.get()->restart(); 
00064   
00065   try { 
00066     // Reset IOC pointers
00067     //
00068     set_interface_ptrs(top_node);    
00069 
00070     // Do the conversion of PISA hits to TMuiMCHit objects
00071     //
00072     digitize();
00073 
00074     // Do the association between MCMuiHit and MCTrack,
00075     // MuTr slowsim has to been run first.
00076     //
00077     associate_mctrk();
00078 
00079   } catch(std::exception& e) {
00080     // MODULE CODE GOES HERE
00081     //
00082     MUTOO::TRACE(e.what());
00083     return False;
00084   }  
00085   
00086   // If verbose dump the contents of the cluster map
00087   // Verbosity methods declared in TMuiParBase
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   // module runtime parameters
00100   //
00101   _mod_par = TMutNode<mMuiSlowSimPar>::find_node(top_node,"mMuiSlowSimPar");
00102 
00103   // Interface Object Container pointers for muid MC hits.
00104   //
00105   _mc_hit_map = TMutNode<TMuiMCHitMapO>::find_node(top_node,"TMuiMCHitMapO");
00106 
00107   // Interface Object Containter pointers for MC tracks.
00108   // 
00109   _mc_trk_map = TMutNode<TMutMCTrkMap>::find_node(top_node,"TMutMCTrkMap");
00110 
00111   // PISA input in wrapped STAF table form here.  Use of wrapped STAF tables
00112   // has been depreciated -- this interface will eventually go away.
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   // Loop through the PISA hits, and add twopacks to the dMuiRaw table.
00125   // ==================================================================
00126   
00127   for (int hit=0; hit<_munhits_h.nok; hit++) {
00128     
00129     // Determine the arm and gap number from the PISA plane number.
00130     // PISA convention:  2001-2006 are South Arm, 1001-1006 are North.
00131     short PisaPlane = _munhits[hit].plane_num;   //staf table   
00132     /*plane_num is data memeber of munhits struct*/
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     //divide 1001 through 1006 each by 1000 taken remainder subtract by 1
00143     
00144     if ( (iArm<0) || (iArm>=TMuiChannelId::kArmsTotal) ||
00145          (iPlane<0) || (iPlane>=TMuiChannelId::kPlanesPerArm) ) {
00146       continue;
00147     } //sanity check
00148     
00149     TMuiMCHitMapO::iterator mc_hit_iter = _mc_hit_map->insert_new(iArm,iPlane);
00150     //mc_hit_iter is the pointer to the interface object (TMuiHitO the MC Hit Object)
00151     //insert_new methid is declared in file: TMuiMCHitMapO.h
00152     /* ONLY insert arm and plane information since there is NOT any panel or orientation
00153        information in PISA for the MuID */
00154     /* Set the location of the MCHit object */
00155     mc_hit_iter->get()->set_arm(iArm);    
00156     mc_hit_iter->get()->set_plane(iPlane);    
00157     
00158     /*the following seven set_* methods are defined in TMuiMCHitO */
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       /* the get()->set_* takes pisa information and puts it into the interface object (here TMuiMCHitO) which has already had its pointer inserted into the container (here the the MCHitMap) */      
00169     
00170     // rhit and phit originate in the MuID PISA file: 
00171     // simulation/pisa2000/src/phnxcore/encodeRootEvntMui.cc
00172     Hep3Vector X(_munhits[hit].rhit[0],     //rhit is the PISA MuID HIT position
00173                  _munhits[hit].rhit[1],     //...position GVect
00174                  _munhits[hit].rhit[2]);
00175     // make a unite vector from phit.
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     /* need clarification 
00183     Hep3Vector V(_munhits[hit].phit[0],     //phit is the MuID PISA momentum 
00184                  _munhits[hit].phit[1],     //...unit vector DirVect
00185                  _munhits[hit].phit[2]);
00186     */
00187     Hep3Vector V(v1,v2,v3);
00188     std::vector<TMuiChannelId> twoPackList;
00189     //TMuiChannelId located at offline/packages/muigeom
00190     
00191     twoPackList = TMuiGeometry::Geom()->findTwoPacks(iArm,iPlane,X,V);      
00192     //TMuiGeometry located at offline/packages/muigeom
00193     
00194     //for above "findTwoPacks" accessor method declared in TMuiGeometry.hh
00195     // Find two-packs in the specified plane that lie along a trajectory.
00196     // The trajectory is given by the position GVect and the unit vector
00197     // DirVect in global coordinates.
00198     /* findTwoPacks(const short& Arm, const short& Plane, const Hep3Vector& GVect,
00199        const Hep3Vector &DirVect); */
00200     if (twoPackList.size() > 0) { /* size() is method of STL vector class */
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         /*  Panel(), Orient(), TwoPack() are TMuiChannelId accessor methods  */
00208         /*  add_two_pack is a TMuiMCHitO method */
00209         /* now the interface object contains the two_pack information */
00210       }
00211     }
00212   }
00213   //  cout << "mMuiReadout-I8  finished looping through PISA data" << endl;
00214 }
00215 
00216 void 
00217 mMuiSlowSim::associate_mctrk() 
00218 {
00219   // Loop over TMuiMCHitMap [
00220   //   Loop over TMutMCTrkMap [
00221   //     if(the trkid from mctrk map matches trkid of muimchit map) [
00222   //       associate muimchit and mctrk.
00223   //       set association flag true
00224   //     ]
00225   //   ]
00226   //   if(association flag is not true) [
00227   //       make a new mctrk and insert it in map.
00228   //       fill the fields of new mctrk object.
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   // Get the parent MC track information via a pisa call according to 
00251   //   the track id. 
00252   // Insert a new mctrk into mctrkmap.
00253   // Fill in the fields.
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   // Insert an new TMutMCTrk into map
00261   //
00262   TMutMCTrkMap::iterator mctrk_iter = _mc_trk_map->insert_new(mc_hit_ptr->get()->get_arm());
00263 
00264   // Make the PISA call to get track data
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   // Fill in the fields.
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   // UBER-kludge -- don't know how to get charge info -- set correctly
00284   // for muon/pion/kaon/proton at least. -- This kludge was made by sean,
00285   // not by chun, the smarter guy.
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   // Do the association
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 

MUIOO: PHENIX Muon Identifier Analysis Framework. Documentation by doxygen
Last modified: