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