00001
00271 #include "Stiostream.h"
00272 #include <stdlib.h>
00273 #include <string>
00274 #include <algorithm>
00275 #ifndef ST_NO_NAMESPACES
00276 using std::string;
00277 using std::sort;
00278 using std::find;
00279 #endif
00280
00281 #include "TStyle.h"
00282 #include "TCanvas.h"
00283 #include "StMcEventMaker.h"
00284
00285 #include "PhysicalConstants.h"
00286 #include "SystemOfUnits.h"
00287 #include "StGlobals.hh"
00288 #include "StMessMgr.h"
00289 #include "StMemoryInfo.hh"
00290 #include "StTimer.hh"
00291
00292 #include "StThreeVectorF.hh"
00293 #include "StParticleDefinition.hh"
00294
00295 #include "St_DataSet.h"
00296 #include "St_DataSetIter.h"
00297
00298 #include "tables/St_g2t_event_Table.h"
00299 #include "tables/St_g2t_ftp_hit_Table.h"
00300 #include "tables/St_g2t_rch_hit_Table.h"
00301 #include "tables/St_g2t_ctf_hit_Table.h"
00302 #include "tables/St_g2t_mtd_hit_Table.h"
00303 #include "tables/St_g2t_svt_hit_Table.h"
00304 #include "tables/St_g2t_ssd_hit_Table.h"
00305 #include "tables/St_g2t_tpc_hit_Table.h"
00306 #include "tables/St_g2t_emc_hit_Table.h"
00307 #include "tables/St_g2t_pix_hit_Table.h"
00308 #include "tables/St_g2t_ist_hit_Table.h"
00309 #include "tables/St_g2t_fgt_hit_Table.h"
00310 #include "tables/St_g2t_etr_hit_Table.h"
00311 #include "tables/St_g2t_track_Table.h"
00312 #include "tables/St_g2t_vertex_Table.h"
00313 #include "tables/St_particle_Table.h"
00314
00315 #include "StMcEventTypes.hh"
00316
00317 #include "StEmcUtil/geometry/StEmcGeom.h"
00318
00319
00320 #include "StEEmcUtil/EEmcMC/EEmcMCData.h"
00321
00322 static double vertexCut = .0000025;
00323 struct vertexFlag {
00324 StMcVertex* vtx;
00325 int primaryFlag; };
00326
00327 static const char rcsid[] = "$Id: StMcEventMaker.cxx,v 1.76 2012/03/22 01:20:55 perev Exp $";
00328 ClassImp(StMcEventMaker)
00329 #define AddHit2Track(G2Type,DET) \
00330 Int_t iTrkId = ( G2Type ## HitTable[ihit].track_p) - 1; \
00331 if (iTrkId >= 0 && iTrkId < NTracks ) { \
00332 th->setParentTrack(ttemp[iTrkId]); \
00333 ttemp[iTrkId]->add ## DET ## Hit(th); \
00334 }
00335 #define AddHits(G2Type,det,DET) \
00336 if (doUse ## DET) { \
00337 if (g2t_ ## G2Type ## _hitTablePointer) { \
00338 StMc ## DET ## Hit* th = 0; \
00339 Int_t NHits = g2t_ ## G2Type ## _hitTablePointer->GetNRows(); \
00340 for(Int_t ihit=0; ihit<NHits; ihit++) { \
00341 th = new StMc ## DET ## Hit(& G2Type ## HitTable[ihit]); \
00342 mCurrentMcEvent-> det ## HitCollection()->addHit(th); \
00343 AddHit2Track(G2Type,DET); \
00344 } \
00345 if (Debug()) cout << "Filled " << mCurrentMcEvent-> det ## HitCollection()->numberOfHits() << #DET << " Hits" << endl; \
00346 } else if (Debug()) cout << "No " << #DET << "/" << #det << " Hits in this event" << endl; \
00347 }
00348
00349
00350
00351
00352 StMcEventMaker::StMcEventMaker(const char*name, const char * title) :
00353 StMaker(name,title),
00354 doPrintEventInfo (kFALSE),
00355 doPrintMemoryInfo(kFALSE),
00356 doPrintCpuInfo (kFALSE),
00357 doUseTpc (kTRUE),
00358 doUseSvt (kTRUE),
00359 doUseSsd (kTRUE),
00360 doUseFtpc (kTRUE),
00361 doUseRich (kTRUE),
00362 doUseBemc (kTRUE),
00363 doUseBsmd (kTRUE),
00364 doUseCtb (kTRUE),
00365 doUseTofp (kFALSE),
00366 doUseTof (kTRUE),
00367 doUseMtd (kTRUE),
00368 doUseEemc (kTRUE),
00369 doUseFpd (kTRUE),
00370 doUseFsc (kTRUE),
00371 doUsePixel (kTRUE),
00372 doUseIst (kTRUE),
00373 doUseFgt (kTRUE),
00374 doUseEtr (kTRUE),
00375 ttemp(),
00376 ttempParticle(),
00377 mCurrentMcEvent(0)
00378 {
00379
00380
00381
00382 }
00383
00384 StMcEventMaker::~StMcEventMaker()
00385 {
00386
00387 if (Debug()>=2) cout << "Inside ReaderMaker Destructor" << endl;
00388
00389
00390 }
00391
00392
00393
00394
00395 void StMcEventMaker::Clear(const char*)
00396 {
00397 if (doPrintMemoryInfo) StMemoryInfo::instance()->snapshot();
00398
00399 if (mCurrentMcEvent) {
00400
00401 mCurrentMcEvent = 0;
00402 }
00403 if (doPrintMemoryInfo) {
00404 StMemoryInfo::instance()->snapshot();
00405 StMemoryInfo::instance()->print();
00406 }
00407 StMaker::Clear();
00408 }
00409
00410
00411
00412 Int_t StMcEventMaker::Finish()
00413 {
00414
00415
00416
00417
00418
00419 return StMaker::Finish();
00420 }
00421
00422
00423
00424 Int_t StMcEventMaker::Init()
00425 {
00426 if (Debug()>=1) cout << "This is StMcEventMaker::Init() - by Ming" << endl;
00427 return StMaker::Init();
00428 }
00429
00430
00431 Int_t StMcEventMaker::Make()
00432 {
00433
00434 StTimer timer;
00435 if (doPrintCpuInfo) timer.start();
00436 if (doPrintMemoryInfo) StMemoryInfo::instance()->snapshot();
00437
00438 if (Debug()>=1) cout << "Inside StMcEventMaker::Make()" << endl;
00439
00440
00441 const Char_t* geaTmp[3]={"geant","event/geant/Event","bfcTree/geantBranch"};
00442 St_DataSet* dsGeant = 0;
00443 for(UInt_t i=0; i<3; i++){
00444 dsGeant = GetDataSet(geaTmp[i]);
00445 if(!dsGeant || !dsGeant->GetList()) {
00446 gMessMgr->Warning() << "Could not find dataset " << geaTmp[i] << endm;
00447 dsGeant = GetDataSet("event/geant/Event");
00448 } else {
00449 if (Debug()) gMessMgr->Info() << "Get Geant info from dataset " << geaTmp[i] << endm;
00450 break;
00451 }
00452 }
00453 if(!dsGeant) return kStWarn;;
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476 St_DataSetIter geantDstI(dsGeant);
00477
00478
00479
00480
00481
00482 St_g2t_event *g2t_eventTablePointer = (St_g2t_event *) geantDstI("g2t_event");
00483 St_g2t_vertex *g2t_vertexTablePointer = (St_g2t_vertex *) geantDstI("g2t_vertex");
00484 St_g2t_track *g2t_trackTablePointer = (St_g2t_track *) geantDstI("g2t_track");
00485 St_g2t_tpc_hit *g2t_tpc_hitTablePointer = (St_g2t_tpc_hit *) geantDstI("g2t_tpc_hit");
00486 St_g2t_svt_hit *g2t_svt_hitTablePointer = (St_g2t_svt_hit *) geantDstI("g2t_svt_hit");
00487 St_g2t_ssd_hit *g2t_ssd_hitTablePointer = (St_g2t_ssd_hit *) geantDstI("g2t_ssd_hit");
00488 St_g2t_ftp_hit *g2t_ftp_hitTablePointer = (St_g2t_ftp_hit *) geantDstI("g2t_ftp_hit");
00489 St_g2t_rch_hit *g2t_rch_hitTablePointer = (St_g2t_rch_hit *) geantDstI("g2t_rch_hit");
00490 St_g2t_emc_hit *g2t_emc_hitTablePointer = (St_g2t_emc_hit *) geantDstI("g2t_emc_hit");
00491 St_g2t_emc_hit *g2t_smd_hitTablePointer = (St_g2t_emc_hit *) geantDstI("g2t_smd_hit");
00492 St_g2t_ctf_hit *g2t_ctb_hitTablePointer = (St_g2t_ctf_hit *) geantDstI("g2t_ctb_hit");
00493 St_g2t_ctf_hit *g2t_tof_hitTablePointer = (St_g2t_ctf_hit *) geantDstI("g2t_tof_hit");
00494 St_g2t_ctf_hit *g2t_tfr_hitTablePointer = (St_g2t_ctf_hit *) geantDstI("g2t_tfr_hit");
00495 St_g2t_mtd_hit *g2t_mtd_hitTablePointer = (St_g2t_mtd_hit *) geantDstI("g2t_mtd_hit");
00496 St_g2t_emc_hit *g2t_eem_hitTablePointer = (St_g2t_emc_hit *) geantDstI("g2t_eem_hit");
00497 St_g2t_emc_hit *g2t_esm_hitTablePointer = (St_g2t_emc_hit *) geantDstI("g2t_esm_hit");
00498 St_g2t_emc_hit *g2t_fpd_hitTablePointer = (St_g2t_emc_hit *) geantDstI("g2t_fpd_hit");
00499 St_g2t_emc_hit *g2t_fsc_hitTablePointer = (St_g2t_emc_hit *) geantDstI("g2t_fsc_hit");
00500 St_g2t_pix_hit *g2t_pix_hitTablePointer = (St_g2t_pix_hit *) geantDstI("g2t_pix_hit");
00501 St_g2t_ist_hit *g2t_ist_hitTablePointer = (St_g2t_ist_hit *) geantDstI("g2t_ist_hit");
00502 St_g2t_fgt_hit *g2t_fgt_hitTablePointer = (St_g2t_fgt_hit *) geantDstI("g2t_fgt_hit");
00503 St_g2t_etr_hit *g2t_etr_hitTablePointer = (St_g2t_etr_hit *) geantDstI("g2t_etr_hit");
00504 St_particle *particleTablePointer = (St_particle *) geantDstI("particle");
00505
00506
00507 TDataSet *dst = GetDataSet("dst");
00508 if (dst) {
00509 St_DataSetIter dstDstI(dst);
00510 if (!particleTablePointer)
00511 particleTablePointer = (St_particle *) dstDstI("particle");
00512 if (!g2t_rch_hitTablePointer)
00513 g2t_rch_hitTablePointer = (St_g2t_rch_hit *) dstDstI("g2t_rch_hit");
00514 }
00515
00516
00517 if (g2t_vertexTablePointer && g2t_trackTablePointer){
00518
00519
00520
00521
00522 g2t_event_st *eventTable = 0;
00523
00524
00525 if (g2t_eventTablePointer)
00526 eventTable = g2t_eventTablePointer->GetTable();
00527 else
00528 if (Debug()) cerr << "Table g2t_event Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00529
00530
00531 if(!g2t_eventTablePointer->GetNRows()) {
00532 cout << "Event Table is EMPTY!! " << endl;
00533 PR(g2t_eventTablePointer->GetNRows());
00534 PR(eventTable)
00535 }
00536
00537
00538
00539 g2t_vertex_st *vertexTable = g2t_vertexTablePointer->GetTable();
00540 g2t_track_st *trackTable = g2t_trackTablePointer->GetTable();
00541
00542
00543
00544
00545 g2t_tpc_hit_st *tpcHitTable = 0;
00546 if (g2t_tpc_hitTablePointer)
00547 tpcHitTable = g2t_tpc_hitTablePointer->GetTable();
00548 else
00549 if (Debug()) cerr << "Table g2t_tpc_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00550
00551
00552
00553 g2t_ftp_hit_st *ftpHitTable = 0;
00554 if (g2t_ftp_hitTablePointer)
00555 ftpHitTable = g2t_ftp_hitTablePointer->GetTable();
00556 else
00557 if (Debug()) cerr << "Table g2t_ftp_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00558
00559
00560
00561
00562 g2t_svt_hit_st *svtHitTable = 0;
00563 if (g2t_svt_hitTablePointer)
00564 svtHitTable = g2t_svt_hitTablePointer->GetTable();
00565 else
00566 if (Debug()) cerr << "Table g2t_svt_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00567
00568
00569
00570
00571 g2t_ssd_hit_st *ssdHitTable = 0;
00572 if (g2t_ssd_hitTablePointer)
00573 ssdHitTable = g2t_ssd_hitTablePointer->GetTable();
00574 else
00575 if (Debug()) cerr << "Table g2t_ssd_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00576
00577
00578
00579
00580 g2t_rch_hit_st *rchHitTable = 0;
00581 if (g2t_rch_hitTablePointer)
00582 rchHitTable = g2t_rch_hitTablePointer->GetTable();
00583 else
00584 if (Debug()) cerr << "Table g2t_rch_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00585
00586
00587
00588 g2t_ctf_hit_st *ctbHitTable = 0;
00589 if (g2t_ctb_hitTablePointer)
00590 ctbHitTable = g2t_ctb_hitTablePointer->GetTable();
00591 else
00592 if (Debug()) cerr << "Table g2t_rch_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00593
00594
00595
00596 g2t_ctf_hit_st *tofHitTable = 0;
00597 if (g2t_tof_hitTablePointer)
00598 tofHitTable = g2t_tof_hitTablePointer->GetTable();
00599 else
00600 if (Debug()) cerr << "Table g2t_tof_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00601
00602 g2t_ctf_hit_st *tfrHitTable = 0;
00603 if (g2t_tfr_hitTablePointer)
00604 tfrHitTable = g2t_tfr_hitTablePointer->GetTable();
00605 else
00606 if (Debug()) cerr << "Table g2t_tfr_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00607
00608
00609
00610 g2t_mtd_hit_st *mtdHitTable = 0;
00611 if (g2t_mtd_hitTablePointer)
00612 mtdHitTable = g2t_mtd_hitTablePointer->GetTable();
00613 else
00614 if (Debug()) cerr << "Table g2t_mtd_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00615
00616
00617
00618
00619 g2t_emc_hit_st *emcHitTable = 0;
00620 if (g2t_emc_hitTablePointer)
00621 emcHitTable = g2t_emc_hitTablePointer->GetTable();
00622 else
00623 if (Debug()) cerr << "Table g2t_emc_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00624
00625
00626
00627
00628 g2t_emc_hit_st *smdHitTable = 0;
00629 if (g2t_smd_hitTablePointer)
00630 smdHitTable = g2t_smd_hitTablePointer->GetTable();
00631 else
00632 if (Debug()) cerr << "Table g2t_smd_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00633
00634
00635
00636
00637 g2t_emc_hit_st *eemHitTable = 0;
00638 if (g2t_eem_hitTablePointer)
00639 eemHitTable = g2t_eem_hitTablePointer->GetTable();
00640 else
00641 if (Debug()) cerr << "Table g2t_eem_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00642
00643
00644
00645
00646 g2t_emc_hit_st *esmHitTable = 0;
00647 if (g2t_esm_hitTablePointer)
00648 esmHitTable = g2t_esm_hitTablePointer->GetTable();
00649 else
00650 if (Debug()) cerr << "Table g2t_esm_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00651
00652
00653
00654
00655 g2t_emc_hit_st* fpdHitTable = 0;
00656 if (g2t_fpd_hitTablePointer)
00657 fpdHitTable = g2t_fpd_hitTablePointer->GetTable();
00658 else
00659 if (Debug()) cout << "Table g2t_fpd_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00660
00661
00662
00663
00664 g2t_emc_hit_st* fscHitTable = 0;
00665 if (g2t_fsc_hitTablePointer)
00666 fscHitTable = g2t_fsc_hitTablePointer->GetTable();
00667 else
00668 if (Debug()) cout << "Table g2t_fsc_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00669
00670
00671
00672
00673 g2t_pix_hit_st *pixHitTable=0;
00674 if (g2t_pix_hitTablePointer)
00675 pixHitTable = g2t_pix_hitTablePointer->GetTable();
00676 else
00677 if (Debug()) cerr << "Table g2t_pix_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00678
00679
00680
00681
00682 g2t_ist_hit_st *istHitTable=0;
00683 if (g2t_ist_hitTablePointer)
00684 istHitTable = g2t_ist_hitTablePointer->GetTable();
00685 else
00686 if (Debug()) cerr << "Table g2t_ist_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00687
00688
00689
00690 g2t_fgt_hit_st *fgtHitTable=0;
00691 if (g2t_fgt_hitTablePointer)
00692 fgtHitTable = g2t_fgt_hitTablePointer->GetTable();
00693 else
00694 if (Debug()) cerr << "Table g2t_fgt_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00695
00696
00697
00698
00699 g2t_etr_hit_st *etrHitTable=0;
00700 if (g2t_etr_hitTablePointer)
00701 etrHitTable = g2t_etr_hitTablePointer->GetTable();
00702 if (Debug()) cerr << "Table g2t_etr_hit found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00703 else
00704 if (Debug()) cerr << "Table g2t_etr_hit Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00705
00706
00707
00708
00709 particle_st *particleTable = 0;
00710 if (particleTablePointer)
00711 particleTable = particleTablePointer->GetTable();
00712 else
00713 if (Debug()) cerr << "Table particle Not found in Dataset " << geantDstI.Pwd()->GetName() << endl;
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765 if (eventTable)
00766 mCurrentMcEvent = new StMcEvent(eventTable);
00767 else {
00768 gMessMgr->Warning() << "StMcEventMaker::Make(): g2t_event Table not found. Using default constructor." << endm;
00769 mCurrentMcEvent = new StMcEvent;
00770 }
00771
00772 if (mCurrentMcEvent) {
00773 if (Debug()) cout << "**** Created new StMcEvent, Event No. " << mCurrentMcEvent->eventNumber() << endl;
00774 }
00775 else {
00776 gMessMgr->Warning() << "Could not create StMcEvent! Exit from StMcEventMaker." << endm;
00777 return kStWarn;
00778 }
00779 AddData(mCurrentMcEvent);
00780
00781
00782
00783 long NVertices = g2t_vertexTablePointer->GetNRows();
00784
00785 #ifndef ST_NO_TEMPLATE_DEF_ARGS
00786 vector<vertexFlag> vtemp(NVertices);
00787 #else
00788 vector<vertexFlag, allocator<vertexFlag> > vtemp(NVertices);
00789 #endif
00790
00791 if (Debug()>=1) cout << "Preparing to process and fill VERTEX information ....." << endl;
00792 StMcVertex* v = 0;
00793
00794
00795
00796
00797 v = new StMcVertex(&(vertexTable[0]));
00798 mCurrentMcEvent->vertices().push_back(v);
00799 vtemp[vertexTable[0].id - 1].vtx = v;
00800 vtemp[vertexTable[0].id - 1].primaryFlag = 1;
00801 mCurrentMcEvent->setPrimaryVertex(v);
00802
00803 StThreeVectorF primVertexPos = v->position();
00804
00805 StThreeVectorF testVertexPos;
00806 int nThrownVertices = 0;
00807 for (long ivtx=1; ivtx<NVertices; ivtx++)
00808 {
00809 v = new StMcVertex(&(vertexTable[ivtx]));
00810
00811
00812 testVertexPos = v->position();
00813
00814 if (vertexTable[ivtx].eg_label == 0 ||
00815 abs(primVertexPos - testVertexPos) > vertexCut ) {
00816
00817 mCurrentMcEvent->vertices().push_back(v);
00818 vtemp[vertexTable[ivtx].id - 1].primaryFlag = 0;
00819 vtemp[vertexTable[ivtx].id - 1].vtx = v;
00820 }
00821 else {
00822 nThrownVertices++;
00823 vtemp[vertexTable[ivtx].id - 1].primaryFlag = 1;
00824
00825 delete v;
00826 vtemp[vertexTable[ivtx].id - 1].vtx = mCurrentMcEvent->primaryVertex();
00827 }
00828 }
00829 if (nThrownVertices)
00830 gMessMgr->Warning() << "StMcEventMaker::Make(): Throwing " << nThrownVertices
00831 << " that are the same as the primary vertex." << endm;
00832
00833
00834
00835
00836 long NTracks = g2t_trackTablePointer->GetNRows();
00837 size_t usedTracksG2t = 0;
00838 long NGeneratorTracks = (particleTablePointer) ? particleTablePointer->GetNRows() : 0;
00839 size_t usedTracksEvGen = 0;
00840 ttemp.resize(NTracks);
00841 ttempParticle.resize(NGeneratorTracks);
00842 if (Debug()>=1) cout << "Preparing to process and fill TRACK information ....." << endl;
00843 StMcTrack* egTrk = 0;
00844 size_t nParticlesInBothTables = 0;
00845 if (Debug()>=1) cout << "Event Generator Tracks..." << endl;
00846
00847
00848
00849
00850
00851 long motherIndex = -1;
00852 {for (long gtrk=0; gtrk<NGeneratorTracks; gtrk++) {
00853
00854 egTrk = new StMcTrack(&(particleTable[gtrk]));
00855 egTrk->setEventGenLabel(gtrk+1);
00856 egTrk->setPrimary(0);
00857 ttempParticle[gtrk] = egTrk;
00858 mCurrentMcEvent->tracks().push_back(egTrk);
00859 usedTracksEvGen++;
00860
00861 }}
00862
00863 StMcTrack* t = 0;
00864 long iStartVtxId = 0;
00865 long iStopVtxId = 0;
00866 long iItrmdVtxId = 0;
00867
00868 int nThrownTracks = 0;
00869 if (Debug()>=1) cout << "g2t Tracks..." << endl;
00870
00871 {for (long itrk=0; itrk<NTracks; itrk++) {
00872 iStopVtxId = (trackTable[itrk].stop_vertex_p) - 1;
00873
00874 if (iStopVtxId >= 0) {
00875 if (vtemp[iStopVtxId].primaryFlag == 1) {
00876
00877 nThrownTracks++;
00878 continue;
00879
00880 }
00881 }
00882
00883 if (trackTable[itrk].e<trackTable[itrk].ptot)
00884 trackTable[itrk].ptot=trackTable[itrk].e;
00885
00886 if (trackTable[itrk].ge_pid<0) trackTable[itrk].ge_pid=0;
00887 if (trackTable[itrk].ge_pid>0xffff) trackTable[itrk].ge_pid=0;
00888
00889 t = new StMcTrack(&(trackTable[itrk]));
00890 usedTracksG2t++;
00891 ttemp[ trackTable[itrk].id - 1 ] = t;
00892
00893
00894 mCurrentMcEvent->tracks().push_back(t);
00895
00896
00897
00898 if (iStopVtxId >= 0) {
00899 t->setStopVertex(vtemp[iStopVtxId].vtx);
00900 vtemp[iStopVtxId].vtx->setParent(t);
00901 }
00902
00903
00904
00905
00906
00907 iStartVtxId = trackTable[itrk].start_vertex_p - 1;
00908
00909 v = vtemp[iStartVtxId].vtx;
00910
00911 t->setStartVertex(v);
00912 t->setPrimary(t->startVertex() == mCurrentMcEvent->primaryVertex() ? kTRUE : kFALSE);
00913 v->addDaughter(t);
00914
00915
00916
00917
00918
00919 iItrmdVtxId = (trackTable[itrk].itrmd_vertex_p) - 1;
00920
00921 if (iItrmdVtxId >= 0) {
00922 t->intermediateVertices().push_back(vtemp[iItrmdVtxId].vtx);
00923
00924 vtemp[iItrmdVtxId].vtx->setParent(t);
00925
00926
00927
00928 while(vertexTable[iItrmdVtxId].next_itrmd_p != 0) {
00929 iItrmdVtxId = (vertexTable[iItrmdVtxId].next_itrmd_p) - 1;
00930 t->intermediateVertices().push_back(vtemp[iItrmdVtxId].vtx);
00931 vtemp[iItrmdVtxId].vtx->setParent(t);
00932 }
00933
00934
00935 }
00936
00937
00938
00939 long iEventGeneratorLabel = (trackTable[itrk].eg_label) - 1;
00940 if (iEventGeneratorLabel >=0 ) {
00941
00942
00943
00944
00945 if (iEventGeneratorLabel < NGeneratorTracks) {
00946
00947
00948
00949
00950
00951 nParticlesInBothTables++;
00952 if (Debug()>=2) {
00953 if (particleTable[iEventGeneratorLabel].jmohep[0] && !(ttempParticle[particleTable[iEventGeneratorLabel].jmohep[0]])) {
00954 cout << "There should be a parent and there isn't one!\n";
00955 PR(iEventGeneratorLabel);
00956 PR(particleTable[iEventGeneratorLabel].jmohep[0]);
00957 PR(ttempParticle[particleTable[iEventGeneratorLabel].jmohep[0]]);
00958
00959 }
00960 }
00961 if (particleTable[iEventGeneratorLabel].jmohep[0])
00962 t->setParent(ttempParticle[particleTable[iEventGeneratorLabel].jmohep[0]]);
00963 StMcTrackIterator trkToErase = find (mCurrentMcEvent->tracks().begin(),
00964 mCurrentMcEvent->tracks().end(),
00965 ttempParticle[iEventGeneratorLabel]);
00966 delete *trkToErase;
00967 mCurrentMcEvent->tracks().erase(trkToErase);
00968
00969 ttempParticle[iEventGeneratorLabel] = t;
00970 }
00971
00972 }
00973 else {
00974
00975
00976 motherIndex = trackTable[itrk].next_parent_p;
00977 if ((motherIndex > 0) && (motherIndex < NTracks)) {
00978 if (motherIndex > itrk) {
00979 if (Debug()) {
00980 gMessMgr->Warning()
00981 << "Wrong ordering! Track " << itrk+1 << "from particle table: "
00982 << "Can't assign mother track " << motherIndex
00983 << "because it has not been created yet!" << endm;
00984 }
00985 }
00986 else {t->setParent(ttemp[motherIndex-1]);}
00987 } }
00988
00989 }}
00990 {for (long gtrk=0; gtrk<NGeneratorTracks; gtrk++) {
00991
00992 motherIndex = particleTable[gtrk].jmohep[0];
00993 if ((motherIndex > 0) && (motherIndex < NGeneratorTracks)) {
00994 if (motherIndex > gtrk) {
00995 if (Debug()) {
00996 gMessMgr->Warning()
00997 << "Wrong ordering! Track " << gtrk+1 << " from particle table: "
00998 << "Can't assign mother track " << motherIndex
00999 << " to track with index " << gtrk << endm;
01000 }
01001 }
01002 else ttempParticle[gtrk]->setParent(ttempParticle[motherIndex-1]);
01003 if (Debug()>=2) {
01004 cout << "Particle table (generator) track " << gtrk << ", key " << ttempParticle[gtrk]->key() << endl;
01005 cout << "Mother Index-1 (off-by-1) " << motherIndex-1 << endl;
01006 cout << "PDG ID of generator track " << particleTable[gtrk].idhep << endl;
01007 cout << "PDG ID of mother track " << particleTable[motherIndex-1].idhep << endl;
01008 if (ttempParticle[gtrk]->particleDefinition())
01009 cout << "particle " << ttempParticle[gtrk]->particleDefinition()->name() << endl;
01010 if (ttempParticle[gtrk]->parent() && ttempParticle[gtrk]->parent()->particleDefinition())
01011 cout << "parent " << ttempParticle[gtrk]->parent()->particleDefinition()->name() << endl;
01012
01013 if (motherIndex && !(ttempParticle[gtrk]->parent())) {
01014 cout << "Error in assigning parent to particle table!\n There should be a parent and there isn't one!\n";
01015 PR(particleTable[gtrk].jmohep[0]);
01016 PR(ttempParticle[gtrk]->parent());
01017 }
01018 }
01019 }
01020 }}
01021 if (nThrownTracks)
01022 gMessMgr->Warning() << "StMcEventMaker::Make(): Throwing " << nThrownTracks
01023 << " whose stop vertex is the same as primary vertex." << endm;
01024 if (Debug()>=2) {
01025
01026 for (long gtrk=0; gtrk<NGeneratorTracks; gtrk++)
01027 if (ttempParticle[gtrk]->parent() && ttempParticle[gtrk]->parent() != ttempParticle[particleTable[gtrk].jmohep[0]-1]) {
01028 cout << "The indexing got screwed up!" << endl;
01029 PR(ttempParticle[gtrk]->eventGenLabel());
01030 PR(ttempParticle[gtrk]->key());
01031 PR(ttempParticle[gtrk]->parent());
01032 PR(ttempParticle[particleTable[gtrk].jmohep[0]-1]);
01033 if (ttempParticle[gtrk]->particleDefinition()) cout << "particle " << ttempParticle[gtrk]->particleDefinition()->name() << endl;
01034 if (ttempParticle[gtrk]->parent() && ttempParticle[gtrk]->parent()->particleDefinition()) cout << "parent " << ttempParticle[gtrk]->parent()->particleDefinition()->name() << endl;
01035
01036 }
01037 cout << "Used tracks from g2t_track table: " << usedTracksG2t << endl;
01038 cout << "Avail. tracks from g2t_track table: " << NTracks << endl;
01039 cout << "Used tracks from particle table: " << usedTracksEvGen << endl;
01040 cout << "Avail. tracks from particle table: " << NGeneratorTracks << endl;
01041 cout << "Tracks appearing in both tables : " << nParticlesInBothTables << endl;
01042 cout << "Total tracks in StMcEvent : " << mCurrentMcEvent->tracks().size() << endl;
01043 }
01044 vtemp.clear();
01045 ttempParticle.clear();
01046
01047
01048
01049
01050 if (Debug()) cout << "Preparing to process and fill HIT information ....." << endl;
01051
01052
01053
01054
01055
01056 if (doUseTpc) {
01057 if (g2t_tpc_hitTablePointer) {
01058 StMcTpcHit* th = 0;
01059 long NHits = g2t_tpc_hitTablePointer->GetNRows();
01060 long nBadVolId = 0;
01061 long nPseudoPadrow = 0;
01062 long ihit;
01063 for(ihit=0; ihit<NHits; ihit++) {
01064 if (tpcHitTable[ihit].volume_id < 101 || tpcHitTable[ihit].volume_id > 2445) {
01065 if (tpcHitTable[ihit].volume_id <= 202445 &&
01066 tpcHitTable[ihit].volume_id > 2445) nPseudoPadrow++;
01067 else nBadVolId++;
01068 continue;
01069 }
01070
01071 th = new StMcTpcHit(&tpcHitTable[ihit]);
01072
01073 if(!mCurrentMcEvent->tpcHitCollection()->addHit(th)) {
01074 nBadVolId++;
01075 delete th;
01076 th = 0;
01077 continue;
01078 }
01079
01080
01081 AddHit2Track(tpc,Tpc);
01082 }
01083 if (Debug()) {
01084 cout << "Filled " << mCurrentMcEvent->tpcHitCollection()->numberOfHits() << " TPC Hits" << endl;
01085 cout << "Found " << nPseudoPadrow << " Hits in Pseudo-Padrows." << endl;
01086 if (nBadVolId) {gMessMgr->Warning() << "StMcEventMaker::Make(): cannot store " << nBadVolId
01087 << " TPC hits, wrong Volume Id." << endm;}
01088 }
01089
01090 for (unsigned int iSector=0;
01091 iSector<mCurrentMcEvent->tpcHitCollection()->numberOfSectors(); iSector++)
01092 for (unsigned int iPadrow=0;
01093 iPadrow<mCurrentMcEvent->tpcHitCollection()->sector(iSector)->numberOfPadrows();
01094 iPadrow++) {
01095 StSPtrVecMcTpcHit& tpcHits = mCurrentMcEvent->tpcHitCollection()->sector(iSector)->padrow(iPadrow)->hits();
01096 if (Debug() > 2) {
01097 Int_t nhits = tpcHits.size();
01098 cout << "Tpc hits before sort" << endl;
01099 for (int i = 0; i < nhits; i++) {
01100 cout << *(tpcHits[i]) << endl;
01101 }
01102 }
01103 sort (tpcHits.begin(), tpcHits.end(), compMcHit() );
01104 if (Debug() > 2) {
01105 Int_t nhits = tpcHits.size();
01106 cout << "Tpc hits after sort" << endl;
01107 for (int i = 0; i < nhits; i++) {
01108 cout << *(tpcHits[i]) << endl;
01109 }
01110 }
01111
01112 }
01113 }
01114 else {
01115 if (Debug()) cout << "No TPC Hits in this event" << endl;
01116 }
01117 }
01118
01119
01120
01121
01122 if (doUseSvt) {
01123 if (g2t_svt_hitTablePointer) {
01124 StMcSvtHit* th = 0;
01125 long NHits = g2t_svt_hitTablePointer->GetNRows();
01126 long nBadVolId = 0;
01127 long ihit;
01128 for(ihit=0; ihit<NHits; ihit++) {
01129 if (svtHitTable[ihit].volume_id < 1101 || svtHitTable[ihit].volume_id > 9000) {
01130 nBadVolId++;
01131 continue;
01132 }
01133 th = new StMcSvtHit(&svtHitTable[ihit]);
01134 if (!mCurrentMcEvent->svtHitCollection()->addHit(th)) {
01135 nBadVolId++;
01136 delete th;
01137 th = 0;
01138 continue;
01139 }
01140
01141
01142
01143 AddHit2Track(svt,Svt);
01144 }
01145 if (Debug()) {
01146 cout << "Filled " << mCurrentMcEvent->svtHitCollection()->numberOfHits() << " SVT Hits" << endl;
01147 cout << "Nhits, " << NHits << " rows from table" << endl;
01148 if (nBadVolId)
01149 gMessMgr->Warning() << "StMcEventMaker::Make(): cannot store " << nBadVolId
01150 << " SVT hits, wrong Volume Id." << endm;
01151 }
01152
01153 for (unsigned int iBarrel=0;
01154 iBarrel<mCurrentMcEvent->svtHitCollection()->numberOfBarrels(); iBarrel++)
01155 for (unsigned int iLadder=0;
01156 iLadder<mCurrentMcEvent->svtHitCollection()->barrel(iBarrel)->numberOfLadders();
01157 iLadder++)
01158 for (unsigned int iWafer=0;
01159 iWafer<mCurrentMcEvent->svtHitCollection()->barrel(iBarrel)->ladder(iLadder)->numberOfWafers();
01160 iWafer++) {
01161 StSPtrVecMcSvtHit& svtHits = mCurrentMcEvent->svtHitCollection()->barrel(iBarrel)->ladder(iLadder)->wafer(iWafer)->hits();
01162 sort (svtHits.begin(), svtHits.end(), compMcHit() );
01163
01164 }
01165
01166 }
01167 else {
01168 if (Debug()) cout << "No SVT Hits in this event" << endl;
01169 }
01170 }
01171
01172
01173
01174
01175 if (doUseSsd) {
01176 if (g2t_ssd_hitTablePointer) {
01177 StMcSsdHit* th = 0;
01178 long NHits = g2t_ssd_hitTablePointer->GetNRows();
01179 long nBadVolId = 0;
01180 long ihit;
01181 for(ihit=0; ihit<NHits; ihit++) {
01182 if (ssdHitTable[ihit].volume_id < 7000 || ssdHitTable[ihit].volume_id > 9000) {
01183 nBadVolId++;
01184 continue;
01185 }
01186 th = new StMcSsdHit(&ssdHitTable[ihit]);
01187 if (!mCurrentMcEvent->ssdHitCollection()->addHit(th)) {
01188 nBadVolId++;
01189 delete th;
01190 th = 0;
01191 continue;
01192 }
01193
01194
01195
01196 AddHit2Track(ssd,Ssd);
01197 }
01198 if (Debug()) {
01199 cout << "Filled " << mCurrentMcEvent->ssdHitCollection()->numberOfHits() << " SSD Hits" << endl;
01200 cout << "Nhits, " << NHits << " rows from table" << endl;
01201 if (nBadVolId)
01202 gMessMgr->Warning() << "StMcEventMaker::Make(): cannot store " << nBadVolId
01203 << " SSD hits, wrong Volume Id." << endm;
01204 }
01205
01206 }
01207 else {
01208 if (Debug()) cout << "No SSD Hits in this event" << endl;
01209 }
01210 }
01211
01212
01213
01214
01215
01216 if (doUseFtpc) {
01217 if (g2t_ftp_hitTablePointer) {
01218 StMcFtpcHit* th = 0;
01219 long NHits = g2t_ftp_hitTablePointer->GetNRows();
01220 long nBadVolId = 0;
01221 long ihit;
01222 for(ihit=0; ihit<NHits; ihit++) {
01223
01224
01225
01226
01227 if (ftpHitTable[ihit].volume_id < 101 || ftpHitTable[ihit].volume_id > 2906) {
01228 nBadVolId++;
01229 continue;
01230 }
01231
01232 th = new StMcFtpcHit(&ftpHitTable[ihit]);
01233
01234 if (!mCurrentMcEvent->ftpcHitCollection()->addHit(th)){
01235 nBadVolId++;
01236 delete th;
01237 th = 0;
01238 continue;
01239 }
01240
01241
01242 AddHit2Track(ftp,Ftpc);
01243 }
01244 if (Debug()) {
01245 cout << "Filled " << mCurrentMcEvent->ftpcHitCollection()->numberOfHits() << " FTPC Hits" << endl;
01246 if (nBadVolId)
01247 gMessMgr->Warning() << "StMcEventMaker::Make(): cannot store " << nBadVolId
01248 << " FTPC hits, wrong Volume Id." << endm;
01249 }
01250
01251 for (unsigned int iPlane=0;
01252 iPlane<mCurrentMcEvent->ftpcHitCollection()->numberOfPlanes(); iPlane++) {
01253 StSPtrVecMcFtpcHit& ftpcHits = mCurrentMcEvent->ftpcHitCollection()->plane(iPlane)->hits();
01254 sort (ftpcHits.begin(), ftpcHits.end(), compMcFtpcHit() );
01255
01256 }
01257 }
01258 else {
01259 if (Debug()) cout << "No FTPC Hits in this event" << endl;
01260 }
01261 }
01262 AddHits(rch,rich,Rich);
01263 AddHits(ctb,ctb,Ctb);
01264 AddHits(tof,tof,Tof);
01265 AddHits(tfr,tof,Tof);
01266 AddHits(mtd,mtd,Mtd);
01267 AddHits(pix,pixel,Pixel);
01268 AddHits(ist,ist,Ist);
01269 AddHits(fgt,fgt,Fgt);
01270 AddHits(etr,etr,Etr);
01271
01272
01273 if (doUseBemc) fillBemc(g2t_emc_hitTablePointer);
01274
01275
01276 if (doUseBsmd) fillBsmd(g2t_smd_hitTablePointer);
01277
01278
01279 if (doUseEemc) fillEemc(g2t_eem_hitTablePointer,g2t_esm_hitTablePointer);
01280
01281
01282 if (doUseFpd) fillFpd(g2t_fpd_hitTablePointer);
01283
01284
01285 if (doUseFsc) fillFsc(g2t_fsc_hitTablePointer);
01286
01287 ttemp.clear();
01288
01289
01290
01291
01292 }
01293
01294
01295 if (!g2t_vertexTablePointer)
01296 gMessMgr->Warning() << "StMcEventMaker: g2t_vertex Table Not found " << endm;
01297 if (!g2t_trackTablePointer)
01298 gMessMgr->Warning() << "StMcEventMaker: g2t_track Table Not found " << endm;
01299 if (!g2t_tpc_hitTablePointer)
01300 gMessMgr->Info() << "StMcEventMaker: g2t_tpc_hit Table Not found " << endm;
01301 if (!particleTablePointer)
01302 gMessMgr->Info() << "StMcEventMaker: particle Table Not found " << endm;
01303
01304 if (doPrintEventInfo) printEventInfo();
01305 if (doPrintMemoryInfo) {
01306 StMemoryInfo::instance()->snapshot();
01307 StMemoryInfo::instance()->print();
01308 }
01309 if (doPrintCpuInfo) {
01310 timer.stop();
01311 cout << "CPU time for StMcEventMaker::Make(): "
01312 << timer.elapsedTime() << " sec\n" << endl;
01313 }
01314
01315 return kStOK;
01316
01317 }
01318
01319
01320 void StMcEventMaker::fillBemc(St_g2t_emc_hit* g2t_emc_hitTablePointer)
01321 {
01322 if (g2t_emc_hitTablePointer == 0) {
01323 if (Debug()) cout << "No BEMC and BPRS Hits in this event" << endl;
01324 return;
01325 }
01326
01327 g2t_emc_hit_st* emcHitTable = g2t_emc_hitTablePointer->GetTable();
01328 StEmcGeom *geomBemc = StEmcGeom::getEmcGeom(1);
01329 int module, eta, sub, detector;
01330 float de;
01331 StMcTrack *tr;
01332 StMcCalorimeterHit *emchBemc, *emchBprs;
01333
01334 StMcEmcHitCollection *bemcColl=mCurrentMcEvent->bemcHitCollection();
01335 StMcEmcHitCollection *bprsColl=mCurrentMcEvent->bprsHitCollection();
01336 long NHits = g2t_emc_hitTablePointer->GetNRows();
01337
01338 for(long ihit=0; ihit<NHits; ihit++,emcHitTable++) {
01339
01340 geomBemc->getVolIdBemc(emcHitTable->volume_id, module,eta,sub,detector);
01341
01342
01343
01344
01345
01346
01347 tr = ttemp[emcHitTable->track_p - 1];
01348 de = emcHitTable->de;
01349
01350 if (detector == 1 || detector == 2) {
01351 emchBemc = new StMcCalorimeterHit(module,eta,sub,de, tr);
01352 emchBprs = 0;
01353 StMcEmcHitCollection::EAddHit bemcNew = bemcColl->addHit(emchBemc);
01354
01355 if (bemcNew == StMcEmcHitCollection::kNew){
01356 tr->addBemcHit(emchBemc);
01357 if(detector == 2) emchBprs = new StMcCalorimeterHit(module,eta,sub,de, tr);
01358 }
01359 else if(bemcNew == StMcEmcHitCollection::kAdd){
01360 emchBprs = emchBemc;
01361 }
01362 else if(bemcNew == StMcEmcHitCollection::kErr){
01363 delete emchBemc;
01364 emchBemc = 0;
01365 gMessMgr->Warning()<<"<E> Bad hit in Bemc collection " << endm;
01366 }
01367 else {
01368 delete emchBemc;
01369 emchBemc = 0;
01370 emchBprs = 0;
01371 gMessMgr->Warning()<<"<E> Funny return value! EAddHit = " << static_cast<int>(bemcNew) <<endm;
01372 }
01373
01374 if (detector == 2 && emchBprs) {
01375 StMcEmcHitCollection::EAddHit bprsNew = bprsColl->addHit(emchBprs);
01376 if (bprsNew == StMcEmcHitCollection::kNew) {
01377 tr->addBprsHit(emchBprs);
01378 }
01379 else {
01380 delete emchBprs;
01381 emchBprs = 0;
01382 }
01383 }
01384 else if(emchBprs) {
01385 delete emchBprs;
01386 emchBprs = 0;
01387 }
01388 }
01389 else {
01390 gMessMgr->Warning() << "<E> Bad EMC detector number " << detector << " volume_id "
01391 << emcHitTable->volume_id << " detector "<< detector << endm;
01392 }
01393 }
01394 if (Debug()) {
01395 cout << "Filled " << mCurrentMcEvent->bemcHitCollection()->numberOfHits() << " BEMC Hits" << endl;
01396 cout << "Filled " << mCurrentMcEvent->bprsHitCollection()->numberOfHits() << " BPRS Hits" << endl;
01397 }
01398 }
01399
01400
01401 void StMcEventMaker::fillBsmd(St_g2t_emc_hit* g2t_smd_hitTablePointer)
01402 {
01403 if (g2t_smd_hitTablePointer == 0) {
01404 if (Debug()) cout << "No BSMDE and BSMDP Hits in this event" << endl;
01405 return;
01406 }
01407
01408 g2t_emc_hit_st* smdHitTable = g2t_smd_hitTablePointer->GetTable();
01409 StEmcGeom *geomBsmd = StEmcGeom::getEmcGeom(3);
01410 int module, eta, sub, detector;
01411 float de;
01412 StMcTrack *tr;
01413 StMcCalorimeterHit *emchBsmde, *emchBsmdp;
01414
01415 StMcEmcHitCollection *bsmdeColl=mCurrentMcEvent->bsmdeHitCollection();
01416 StMcEmcHitCollection *bsmdpColl=mCurrentMcEvent->bsmdpHitCollection();
01417 long NHits = g2t_smd_hitTablePointer->GetNRows();
01418 for(long ihit=0; ihit<NHits; ihit++,smdHitTable++) {
01419 geomBsmd->getVolIdBsmd(smdHitTable->volume_id, module,eta,sub,detector);
01420 tr = ttemp[smdHitTable->track_p - 1];
01421 de = smdHitTable->de;
01422
01423 if (detector == 3) {
01424 emchBsmde = new StMcCalorimeterHit(module,eta,sub,de, tr);
01425 StMcEmcHitCollection::EAddHit bsmdeNew = bsmdeColl->addHit(emchBsmde);
01426 if (bsmdeNew == StMcEmcHitCollection::kNew) {
01427 tr->addBsmdeHit(emchBsmde);
01428 }
01429 else {
01430 delete emchBsmde;
01431 emchBsmde = 0;
01432 }
01433 }
01434 else if (detector == 4) {
01435 emchBsmdp = new StMcCalorimeterHit(module,eta,sub,de, tr);
01436 StMcEmcHitCollection::EAddHit bsmdpNew = bsmdpColl->addHit(emchBsmdp);
01437 if (bsmdpNew == StMcEmcHitCollection::kNew) {
01438 tr->addBsmdpHit(emchBsmdp);
01439 }
01440 else {
01441 delete emchBsmdp;
01442 emchBsmdp = 0;
01443 }
01444 }
01445 else {
01446 gMessMgr->Warning() << "<E> Bad SMD detector number " << detector << " volume_id "
01447 << smdHitTable->volume_id << " detector "<< detector << endm;
01448 }
01449 }
01450 if (Debug()) {
01451 cout << "Filled " << mCurrentMcEvent->bsmdeHitCollection()->numberOfHits() << " BSMDE Hits" << endl;
01452 cout << "Filled " << mCurrentMcEvent->bsmdpHitCollection()->numberOfHits() << " BSMDP Hits" << endl;
01453 }
01454 }
01455
01456
01457 void StMcEventMaker::fillEemc(St_g2t_emc_hit* g2t_tile, St_g2t_emc_hit* g2t_smd){
01458 if (Debug()) {
01459 gMessMgr->Info() << GetName() << "fillEemc() called" << endm;
01460 }
01461 EEmcMCData mEemcGeant;
01462 mEemcGeant.unpackGeantHits(g2t_tile, g2t_smd);
01463 if (Debug()>1) {
01464 mEemcGeant.print();
01465 }
01466
01467 StMcEmcHitCollection *eemcColl=mCurrentMcEvent->eemcHitCollection();
01468 StMcEmcHitCollection *eprsColl=mCurrentMcEvent->eprsHitCollection();
01469 StMcEmcHitCollection *esmduColl=mCurrentMcEvent->esmduHitCollection();
01470 StMcEmcHitCollection *esmdvColl=mCurrentMcEvent->esmdvHitCollection();
01471
01472 if (!eemcColl || !eprsColl || !esmduColl || !esmdvColl) {
01473 gMessMgr->Warning()<<GetName() <<"::fillEemc(), sth wrong with StMcEEmcCollection,\n skip EEMC GEANT hits"<<endm;
01474 return;
01475 }
01476
01477
01478 int nHit;
01479 const EEmcMCHit *h = mEemcGeant.getGeantHits(nHit);
01480 for(Int_t i=0; i<nHit; i++,h++) {
01481 int detId=h->detector;
01482 assert(h->track_p>0);
01483 StMcTrack *tr = ttemp[h->track_p - 1];
01484 int Beta=0,Bsub=0,Bmodule=0;
01485
01486
01487
01488
01489
01490
01491
01492 Bmodule=h->sector;
01493 int off=0;
01494 StMcCalorimeterHit * stMcHit=0;
01495 StMcEmcHitCollection::EAddHit addRet=StMcEmcHitCollection::kErr;
01496 if (Debug()>1) printf("StMcAdd:detID=%d iHit=%d de=%g\n",detId,i,h->de);
01497
01498 switch(detId) {
01499
01500 case EEmcMCData::kEEmcMCTowerId:
01501 Beta=h->tower.eta;
01502 Bsub=h->tower.ssec;
01503 stMcHit = new StMcCalorimeterHit(Bmodule,Beta,Bsub,h->de,tr);
01504 addRet = eemcColl->addHit(stMcHit);
01505 if(addRet==StMcEmcHitCollection::kNew) tr->addEemcHit(stMcHit);
01506 break;
01507
01508
01509 case EEmcMCData::kEEmcMCPostShowerId: off++;
01510 case EEmcMCData::kEEmcMCPreShower2Id: off++;
01511 case EEmcMCData::kEEmcMCPreShower1Id:
01512 Beta=h->tower.eta;
01513 Bsub=h->tower.ssec +5*off;
01514 stMcHit = new StMcCalorimeterHit(Bmodule,Beta,Bsub,h->de,tr);
01515 addRet = eprsColl->addHit(stMcHit);
01516 if(addRet==StMcEmcHitCollection::kNew) tr->addEprsHit(stMcHit);
01517 break;
01518
01519 case EEmcMCData::kEEmcMCSmdUStripId:
01520 Beta=h->strip;
01521 Bsub=1;
01522 stMcHit = new StMcCalorimeterHit(Bmodule,Beta,Bsub,h->de,tr);
01523 addRet = esmduColl->addHit(stMcHit);
01524 if(addRet==StMcEmcHitCollection::kNew) tr->addEsmduHit(stMcHit);
01525 break;
01526
01527 case EEmcMCData::kEEmcMCSmdVStripId:
01528 Beta=h->strip;
01529 Bsub=1;
01530 stMcHit = new StMcCalorimeterHit(Bmodule,Beta,Bsub,h->de,tr);
01531 addRet = esmdvColl->addHit(stMcHit);
01532 if(addRet==StMcEmcHitCollection::kNew) tr->addEsmdvHit(stMcHit);
01533 break;
01534 default:
01535 gMessMgr->Warning()<<GetName() <<"::fillEemc(), wrong detectorId=" << detId << " from EEmcMCHit. iHit="<<i<<"\n It is fatal - bug in the code, fix it, JB"<<endm;
01536 assert(1==2);
01537 break;
01538 }
01539
01540
01541 switch (addRet ){
01542 case StMcEmcHitCollection::kNew: break;
01543 case StMcEmcHitCollection::kAdd: delete stMcHit; break;
01544 case StMcEmcHitCollection::kErr:
01545 gMessMgr->Warning()<<"<E> Bad hit in Eemc collection" << endm;
01546 delete stMcHit;
01547 break;
01548 default:
01549 gMessMgr->Warning()<<"<E> Funny return value! EAddHit = " << static_cast<int>(addRet) << endm;
01550 delete stMcHit;
01551 break;
01552 }
01553 }
01554 if (Debug()) gMessMgr->Info()<<GetName() <<"::fillEemc() done, nHit="<<nHit<<endm;
01555 }
01556
01557
01558 void StMcEventMaker::fillFpd(St_g2t_emc_hit* g2t_fpd_hitTablePointer)
01559 {
01560 if (!g2t_fpd_hitTablePointer) {
01561 if (Debug()) cout << "No FPD Hits in this event" << endl;
01562 return;
01563 }
01564
01565 g2t_emc_hit_st* fpdHitTable = g2t_fpd_hitTablePointer->GetTable();
01566 StMcEmcHitCollection* fpdColl = mCurrentMcEvent->fpdHitCollection();
01567
01568 for (int iHit = 0; iHit < g2t_fpd_hitTablePointer->GetNRows(); ++iHit) {
01569 g2t_emc_hit_st& hit = fpdHitTable[iHit];
01570
01571 int volume_id = hit.volume_id;
01572 int ch = volume_id % 1000;
01573 volume_id /= 1000;
01574 int nstb = volume_id % 10;
01575 int ew = volume_id / 10;
01576 StMcTrack* track = ttemp[hit.track_p - 1];
01577
01578 StMcCalorimeterHit* fpdHit = new StMcCalorimeterHit(ew,ch,nstb,hit.de,track);
01579 StMcEmcHitCollection::EAddHit fpdNew = fpdColl->addHit(fpdHit);
01580 if (fpdNew == StMcEmcHitCollection::kNew) {
01581 track->addFpdHit(fpdHit);
01582 } else {
01583 delete fpdHit; fpdHit = 0;
01584 }
01585 }
01586
01587 if (Debug()) cout << "Filled " << mCurrentMcEvent->fpdHitCollection()->numberOfHits() << " FPD Hits" << endl;
01588 }
01589
01590
01591 void StMcEventMaker::fillFsc(St_g2t_emc_hit* g2t_fsc_hitTablePointer)
01592 {
01593 if (!g2t_fsc_hitTablePointer) {
01594 if (Debug()) cout << "No FSC Hits in this event" << endl;
01595 return;
01596 }
01597
01598 g2t_emc_hit_st* fscHitTable = g2t_fsc_hitTablePointer->GetTable();
01599 StMcEmcHitCollection* fscColl = mCurrentMcEvent->fscHitCollection();
01600
01601 for (int iHit = 0; iHit < g2t_fsc_hitTablePointer->GetNRows(); ++iHit) {
01602 g2t_emc_hit_st& hit = fscHitTable[iHit];
01603
01604 int volume_id = hit.volume_id;
01605
01606 int module = 1;
01607 int eta = floor(float(volume_id) / float(80));
01608 int sub = volume_id % 80;
01609 StMcTrack* track = ttemp[hit.track_p - 1];
01610
01611 StMcCalorimeterHit* fscHit = new StMcCalorimeterHit(module,eta,sub,hit.de,track);
01612 StMcEmcHitCollection::EAddHit fscNew = fscColl->addHit(fscHit);
01613 if (fscNew == StMcEmcHitCollection::kNew) {
01614 track->addFscHit(fscHit);
01615 } else {
01616 delete fscHit; fscHit = 0;
01617 }
01618 }
01619
01620 if (Debug()) cout << "Filled " << mCurrentMcEvent->fscHitCollection()->numberOfHits() << " FSC Hits" << endl;
01621 }
01622
01623
01624
01625 void StMcEventMaker::printEventInfo()
01626 {
01627 cout << "---------------------------------------------------------" << endl;
01628 cout << "StMcEvent at " << (void*) mCurrentMcEvent << endl;
01629 cout << "---------------------------------------------------------" << endl;
01630 if (! mCurrentMcEvent) return;
01631 cout << *mCurrentMcEvent << endl;
01632 mCurrentMcEvent->Print("");
01633 }