00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00440
00441
00442
00444 #include "St_geant_Maker.h"
00445 #include "TDataSetIter.h"
00446 #include "TTable.h"
00447 #include "Stiostream.h"
00448 #include <stdio.h>
00449 #include <string.h>
00450 #include <string>
00451 #include "TSystem.h"
00452 #include "GtHash.h"
00453 #include "TGeometry.h"
00454 #include "TMaterial.h"
00455 #include "TMixture.h"
00456 #include "TString.h"
00457 #include "TRegexp.h"
00458 #include "TInterpreter.h"
00459 #include "TClassTable.h"
00460 #include "TVolume.h"
00461 #include "TFileSet.h"
00462 #include "TMath.h"
00463 #include "TBRIK.h"
00464 #include "TTRD1.h"
00465 #include "TTRD2.h"
00466 #include "TTRAP.h"
00467 #include "TTUBE.h"
00468 #include "TTUBS.h"
00469 #include "TCONE.h"
00470 #include "TCONS.h"
00471 #include "TSPHE.h"
00472 #include "TPARA.h"
00473 #include "TPGON.h"
00474 #include "TPCON.h"
00475 #include "TELTU.h"
00476
00477 #include "TGTRA.h"
00478 #include "TCTUB.h"
00479
00480 #include "TGeoMaterial.h"
00481 #include "TGeoMatrix.h"
00482 #include "TGeoNode.h"
00483 #include "TGeoManager.h"
00484 #include "TGeoVolume.h"
00485 #include "TGeoPcon.h"
00486 #include "TGeoPgon.h"
00487 #include "TObjString.h"
00488 #ifdef __CC5__
00489 #include <TGiant3.h>
00490 #else
00491 #include "TGiant3.h"
00492 #endif
00493 #include "StarMagField.h"
00494
00495 #include "tables/St_g2t_event_Table.h"
00496 #include "tables/St_g2t_pythia_Table.h"
00497 #include "tables/St_g2t_gepart_Table.h"
00498 #include "tables/St_g2t_vertex_Table.h"
00499 #include "tables/St_g2t_track_Table.h"
00500 #include "tables/St_geom_gdat_Table.h"
00501 #include "StDetectorDbMaker/St_MagFactorC.h"
00502 #include "tables/St_det_user_Table.h"
00503 #include "tables/St_det_hit_Table.h"
00504 #include "tables/St_det_path_Table.h"
00505 #include "tables/St_mfld_mflg_Table.h"
00506 #include "TDataSetIter.h"
00507 #include "TTreeIter.h"
00508
00509 #include "g2t/St_g2t_get_event_Module.h"
00510
00511 #include "g2t/St_g2t_get_pythia_Module.h"
00512
00513 #include "g2t/St_g2t_get_kine_Module.h"
00514 #include "g2t/St_g2t_particle_Module.h"
00515
00516 #include "g2t/St_g2t_svt_Module.h"
00517 #include "g2t/St_g2t_ssd_Module.h"
00518 #include "g2t/St_g2t_pix_Module.h"
00519 #include "g2t/St_g2t_hpd_Module.h"
00520 #include "g2t/St_g2t_ist_Module.h"
00521 #include "g2t/St_g2t_igt_Module.h"
00522 #include "g2t/St_g2t_gem_Module.h"
00523 #include "g2t/St_g2t_fst_Module.h"
00524 #include "g2t/St_g2t_fgt_Module.h"
00525 #include "g2t/St_g2t_tpc_Module.h"
00526 #include "g2t/St_g2t_mwc_Module.h"
00527 #include "g2t/St_g2t_ftp_Module.h"
00528 #include "g2t/St_g2t_ctb_Module.h"
00529 #include "g2t/St_g2t_tof_Module.h"
00530 #include "g2t/St_g2t_tfr_Module.h"
00531 #include "g2t/St_g2t_rch_Module.h"
00532 #include "g2t/St_g2t_emc_Module.h"
00533 #include "g2t/St_g2t_smd_Module.h"
00534 #include "g2t/St_g2t_eem_Module.h"
00535 #include "g2t/St_g2t_esm_Module.h"
00536 #include "g2t/St_g2t_zdc_Module.h"
00537 #include "g2t/St_g2t_vpd_Module.h"
00538 #include "g2t/St_g2t_pmd_Module.h"
00539 #include "g2t/St_g2t_bbc_Module.h"
00540 #include "g2t/St_g2t_fpd_Module.h"
00541 #include "g2t/St_g2t_fsc_Module.h"
00542 #include "g2t/St_g2t_mtd_Module.h"
00543 #include "g2t/St_g2t_etr_Module.h"
00544
00545 #include "St_db_Maker/St_db_Maker.h"
00546 #include "TUnixTime.h"
00547 #include "StarCallf77.h"
00548 #include "StMagF.h"
00549 #include "StMessMgr.h"
00550 #ifdef DetectorIndex
00551 #include "StarDetectorMap.h"
00552 #endif
00553 #ifdef F77_NAME
00554 #define geometry F77_NAME(geometry,GEOMETRY)
00555 #define agstroot F77_NAME(agstroot,AGSTROOT)
00556 #define csaddr F77_NAME(csaddr,CSADDR)
00557 #define csjcal F77_NAME(csjcal,CSJCAL)
00558 #define g2t_volume_id F77_NAME(g2t_volume_id,G2T_VOLUME_ID)
00559 #define g2r_get_sys F77_NAME(g2r_get_sys,G2R_GET_SYS)
00560 #define gfrotm F77_NAME(gfrotm,GFROTM)
00561 #define gfxzrm F77_NAME(gfxzrm,GFXZRM)
00562 #define dzddiv F77_NAME(dzddiv,DZDDIV)
00563 #define agnzgete F77_NAME(agnzgete,AGNZGETE)
00564 #define rootmaptable F77_NAME(rootmaptable,ROOTMAPTABLE)
00565 #define agvolume F77_NAME(agvolume,AGVOLUME)
00566 #define agvoluma F77_NAME(agvoluma,AGVOLUMA)
00567 #define uhtoc F77_NAME(uhtoc,UHTOC)
00568 #define agfpath F77_NAME(agfpath,UHTOC)
00569 #if 0
00570 #define mfldgeo F77_NAME(mfldgeo,MFLDGEO)
00571 #endif
00572 #define agfdig0 F77_NAME(agfdig0,AGFDIG0)
00573 #define agfdpar F77_NAME(agfdpar,AGFDPAR)
00574 #if 0
00575 #define acfromr F77_NAME(acfromr,ACFROMR)
00576 #endif
00577 #define dstkine F77_NAME(dstkine,DSTKINE)
00578 #endif
00579 typedef long int (*addrfun)();
00580 R__EXTERN "C" {
00581 void type_of_call geometry();
00582 Int_t type_of_call agstroot();
00583 void type_of_call *csaddr(char *name, int l77name=0);
00584 long int type_of_call csjcal(
00585 addrfun *fun,
00586 int *narg,
00587 ...);
00588
00589 Int_t type_of_call g2t_volume_id (DEFCHARD, int* DEFCHARL);
00590 void type_of_call g2r_get_sys (DEFCHARD, DEFCHARD, int&, int& DEFCHARL DEFCHARL);
00591 void type_of_call gfrotm (Int_t&,Float_t&,Float_t&,Float_t&,Float_t&,Float_t&,Float_t&);
00592 void type_of_call gfxzrm (Int_t &NLEV_0,Float_t &X,Float_t &Y,Float_t &Z,
00593 Float_t &TET1,Float_t &PHI1,
00594 Float_t &TET2,Float_t &PHI2,
00595 Float_t &TET3,Float_t &PHI3,Float_t &TYPE);
00596 void type_of_call agnzgete (Int_t &ILK,Int_t &IDE,
00597 Int_t &NPART,Int_t &IRUN,Int_t &IEVT,DEFCHARD CGNAM,
00598 Float_t *VERT,Int_t &IWTFL,Float_t &WEIGH DEFCHARL);
00599 void type_of_call dzddiv (Int_t &,Int_t &,DEFCHARD,DEFCHARD,
00600 Int_t &,Int_t &,Int_t &,Int_t & DEFCHARL DEFCHARL);
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612 void type_of_call rootmaptable_(DEFCHARD,DEFCHARD,DEFCHARD, Int_t&,Char_t *
00613 DEFCHARL DEFCHARL DEFCHARL);
00614 Int_t type_of_call agvolume(TVolume*&, Float_t*&, Float_t*&, Float_t*&, Int_t&
00615 ,Int_t&, Float_t*&, Int_t&, int *);
00616 Int_t type_of_call agvoluma(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*);
00617 void type_of_call uhtoc(Int_t&,Int_t &,DEFCHARD,Int_t& DEFCHARL);
00618 int type_of_call agfdig0 (const char*,const char*,int,int);
00619 void type_of_call agfdpar (float &hits,const char *chit, float &alim, float &blim, float &bin, int);
00620 void type_of_call agfpath(Int_t *);
00621 void type_of_call dstkine();
00622 }
00623 Char_t type_of_call *acfromr(Float_t r=8009359);
00624
00625
00626 Quest_t *cquest;
00627 Gclink_t *clink;
00628 Gcflag_t *cflag;
00629 Gcvolu_t *cvolu;
00630 Gcnum_t *cnum;
00631 Int_t *z_iq, *z_lq;
00632 Float_t *z_q;
00633 Gcsets_t *csets;
00634 Int_t nlev;
00635 static Int_t irot = 0;
00636 static TVolume *topnode=0;
00637 typedef struct {
00638 Float_t par[50];
00639 } params;
00640 typedef struct {
00641 Float_t lseen, lstyle, lwidth, lcolor, lfill;
00642 } attributes;
00643
00644 static Int_t ifz = 0;
00645 ClassImp(St_geant_Maker)
00646
00647 TDataSet *St_geant_Maker::fgGeom = 0;
00648 TGiant3 *St_geant_Maker::geant3 = 0;
00649 St_geant_Maker *St_geant_Maker::fgGeantMk = 0;
00650 static TTreeIter *MuDstIter = 0;
00651
00652 St_geant_Maker::St_geant_Maker(const Char_t *name,Int_t nwgeant,Int_t nwpaw, Int_t iwtype):
00653 StMaker(name),
00654 fNwGeant(nwgeant), fNwPaw(nwpaw), fIwType(iwtype),
00655 fVolume(0), fTopGeoVolume(0),
00656 fInputFile(""),fGeoDirectory(0), fEvtHddr(0)
00657 , fRemakeGeometry(kFALSE),mInitialization(""), mFieldOpt("")
00658 {
00659 fgGeantMk = this;
00660 fgGeom = new TDataSet("geom");
00661 m_ConstSet->Add(fgGeom);
00662 SetOutput(fgGeom);
00663 }
00664
00665 TDataSet *St_geant_Maker::FindDataSet (const char* logInput,const StMaker *uppMk,
00666 const StMaker *dowMk) const
00667 {
00668 bool lookupHall = !strcmp(logInput,"HALL");
00669 bool lookupGeoDir = !strcmp(logInput,"GeometryDirectory");
00670
00671 TDataSet *ds = 0;
00672 if ( !(lookupHall || lookupGeoDir) ) {
00673 ds = StMaker::FindDataSet(logInput,uppMk,dowMk);
00674 } else {
00675 if (lookupHall) {
00676 ds = fVolume;
00677 if (!fVolume) {
00678 ((St_geant_Maker *)this)->Work();
00679 ds = fVolume;
00680 if (fVolume) {
00681 if (gGeometry) {
00682 TList *listOfVolume = gGeometry->GetListOfNodes();
00683
00684
00685 listOfVolume->Remove(fVolume);
00686 listOfVolume->Remove(fVolume);
00687 }
00688
00689 ((St_geant_Maker *)this)->AddConst(fVolume);
00690 if (Debug()) fVolume->ls(3);
00691 }
00692 }
00693 } else if (lookupGeoDir) {
00694 if (!fGeoDirectory) {
00695 TString file("pams/geometry");
00696
00697 TFileSet *geoDir = new TFileSet(file.Data());
00698 if (!geoDir->FindByName("geometry.g")) {
00699
00700 delete geoDir;
00701 TString starRoot = "$STAR/" + file;
00702 geoDir = new TFileSet(starRoot.Data());
00703 if (!geoDir->FindByName("geometry.g")) {
00704 LOG_DEBUG << "NO STAR geometry source directory has been found" << endm;
00705 delete geoDir; geoDir = 0;
00706 } else {
00707 TString star("$STAR/pams");
00708 gSystem->ExpandPathName(star);
00709 geoDir->SetTitle(star.Data());
00710 }
00711 } else {
00712 TString wd = gSystem->WorkingDirectory();
00713 wd += "/pams";
00714 geoDir->SetTitle(wd.Data());
00715 }
00716 if (geoDir) {
00717 ((St_geant_Maker *)this)->fGeoDirectory = geoDir;
00718 TDataSet *container = new TDataSet("GeometryDirectory");
00719 container->Add(geoDir);
00720 ds = fGeoDirectory;
00721 ((St_geant_Maker *)this)->AddConst(container);
00722 if (Debug()) fGeoDirectory->ls(3);
00723 }
00724 }
00725 ds = fGeoDirectory;
00726 }
00727 }
00728 return ds;
00729 }
00730
00731 Int_t St_geant_Maker::Init(){
00732
00733 if ( geant3) return kStOK;
00734 PrintInfo();
00735 geant3 = new TGiant3("C++ Interface to Geant3",fNwGeant,fNwPaw,fIwType);
00736 assert(geant3);
00737 cquest = (Quest_t *) geant3->Quest();
00738 clink = (Gclink_t *) geant3->Gclink();
00739 cflag = (Gcflag_t *) geant3->Gcflag();
00740 cvolu = (Gcvolu_t *) geant3->Gcvolu();
00741 cnum = (Gcnum_t *) geant3->Gcnum();
00742 z_iq = (Int_t *) geant3->Iq();
00743 z_lq = (Int_t *) geant3->Lq();
00744 z_q = (Float_t *) geant3->Q();
00745 csets = (Gcsets_t *) geant3->Gcsets();
00746
00747 TString InputFile(fInputFile);
00748 if (fInputFile != "") {
00749
00750 if (Debug()) gMessMgr->Info() << "St_geant_Maker::Init File " << fInputFile.Data() << endm;
00751 TString kuip("");
00752 if (InputFile.Contains(".fz")) {ifz = 1; kuip = "gfile p "; kuip += InputFile;}
00753 else if (InputFile.Contains(".nt")) {kuip = "user/input user "; kuip += InputFile;}
00754 else if (InputFile.Contains(".MuDst")) {
00755 if (! MuDstIter) MuDstIter = new TTreeIter();
00756 MuDstIter->AddFile(InputFile);
00757 kuip = "user/input please MuDst.Dst";
00758 m_Mode = 10*(m_Mode/10);
00759 m_Mode += 1;
00760 SetDatimeFromMuDst();
00761 }
00762 if (kuip != "") {
00763 if (Debug()) gMessMgr->Info() << "St_geant_Maker::Init kuip " << kuip.Data() << endm;
00764 Do(kuip.Data());
00765 if (cquest->iquest[0] > kStOK) {
00766 gMessMgr->Info() << "St_geant_Maker::Init File " << InputFile.Data() << " cannot be opened. Exit!" << endm;
00767 gSystem->Exit(1);
00768 }
00769 InputFile = "";
00770 }
00771 } else {
00772 if (IsActive()) {
00773 Do("subevent 0;");
00774
00775 Do("gkine 80 6 1. 1. -4. 4. 0 6.28 0. 0.;");
00776 Do("mode g2tm prin 1;");
00777
00778
00779 if ((m_Mode/1000)%10 == 1) {
00780 gMessMgr->Info() << "St_geant_Maker::Init switch off physics" << endm;
00781 Do("DCAY 0");
00782 Do("ANNI 0");
00783 Do("BREM 0");
00784 Do("COMP 0");
00785 Do("HADR 0");
00786 Do("MUNU 0");
00787 Do("PAIR 0");
00788 Do("PFIS 0");
00789 Do("PHOT 0");
00790 Do("RAYL 0");
00791 Do("LOSS 4");
00792
00793 Do("DRAY 0");
00794 Do("MULS 0");
00795 Do("STRA 0");
00796
00797 Do("CUTS 1e-3 1e-3 .001 .001 .001 .001 .001 1e-3 .001 .001 50.e-6");
00798 Do("gclose all");
00799 Do("physi");
00800 }
00801 if (Debug() > 1) {
00802 Do("debug on;");
00803 Do("swit 2 2;");
00804 }
00805 }
00806 }
00807 return kStOK;
00808 }
00809
00810 Int_t St_geant_Maker::InitRun(Int_t run){
00811 if (mInitialization != "") {
00812 gMessMgr->Info() << "St_geant_Maker::InitRun -- Do geometry initialization" << endm;
00813 Do(mInitialization.Data());
00814 Geometry();
00815 mInitialization = "";
00816 Do("gclose all");
00817 }
00818 Agstroot();
00819 gMessMgr->Info() << "St_geant_Maker::InitRun -- Do mag.field initialization" << endm;
00820 m_geom_gdat = (St_geom_gdat *) Find(".const/geom/geom_gdat");
00821 if (m_geom_gdat) {
00822 AddRunco(new St_geom_gdat(*m_geom_gdat));
00823 }
00824 if (m_Mode%10 != 1 && IsActive() ) {
00825 fEvtHddr = (StEvtHddr*)GetDataSet("EvtHddr");
00826 if (!fEvtHddr) {
00827 fEvtHddr = new StEvtHddr(m_ConstSet);
00828 fEvtHddr->SetRunNumber(1);
00829 SetOutput(fEvtHddr);
00830 }
00831 if (! ifz ) {
00832
00833
00834
00835 if (! m_geom_gdat) {
00836 m_geom_gdat = new St_geom_gdat("geom_gdat",1);
00837 AddRunco(m_geom_gdat);
00838 geom_gdat_st row = {{0,0}, 1, "gstar"};
00839 m_geom_gdat->AddAt(&row);
00840 }
00841 } else {
00842 if (MuDstIter) {
00843
00844 if (StarMagField::Instance() && StarMagField::Instance()->IsLocked()) {
00845
00846 gMessMgr->Info() << "St_geant_Maker::InitRun passive mode. Don't update Mag.Field from DB" << endm;
00847 } else {
00848 Float_t fScale = St_MagFactorC::instance()->ScaleFactor();
00849 if (TMath::Abs(fScale) < 1e-3) fScale = 1e-3;
00850 gMessMgr->Info() << "St_geant_Maker::InitRun active mode ";
00851 if (! StarMagField::Instance()) {
00852 new StarMagField ( StarMagField::kMapped, fScale);
00853 gMessMgr->Info() << "Initialize STAR magnetic field with scale factor " << fScale << endm;
00854 } else {
00855 StarMagField::Instance()->SetFactor(fScale);
00856 gMessMgr->Info() << "Reset STAR magnetic field with scale factor " << fScale << endm;
00857 }
00858 }
00859 } else {
00860 Float_t mfscale = 1;
00861 if (m_geom_gdat) {
00862 geom_gdat_st *gdat = m_geom_gdat->GetTable();
00863 mfscale = gdat->mfscale;
00864 gMessMgr->Info() << "St_geant_Maker::Init geom_gdata is found in fz-file ! ";
00865 } else {
00866 St_mfld_mflg *mfld_mflg = (St_mfld_mflg *) Find(".const/geom/mfld_mflg");
00867 if (mfld_mflg) {
00868 gMessMgr->Info() << "St_geant_Maker::Init mfld_mflg is found in fz-file ! ";
00869 mfld_mflg_st *s = mfld_mflg->GetTable();
00870 mfscale = s->bfield/5.0;
00871 } else
00872 gMessMgr->Info() << "St_geant_Maker::Init geom_gdata is missing in fz-file ! Use default mag.field scale factor ";
00873 }
00874 gMessMgr->Info() << "St_geant_Maker::Init mfscale = " << mfscale << endm;
00875 struct Field_t {
00876 const Char_t *name;
00877 Float_t scale;
00878 };
00879 const Field_t FieldOptions[5] = {
00880 {"FullMagFNegative", -1.0},
00881 {"FullMagFPositive", 1.0},
00882 {"HalfMagFNegative", -0.5},
00883 {"HalfMagFPositive", 0.5},
00884 {"ZeroMagF", 0.0}
00885 };
00886 TString FieldOption("");
00887 for (Int_t i = 0; i < 5; i++) {
00888 if (TMath::Abs(mfscale - FieldOptions[i].scale) < 2.e-2) {
00889 FieldOption = FieldOptions[i].name;
00890 break;
00891 }
00892 }
00893 if (FieldOption != "") {
00894 SetFlavor(FieldOption.Data(), "MagFactor");
00895 gMessMgr->QAInfo() << "St_geant_Maker::Init SetFlavor(\"" << FieldOption.Data()
00896 << "\",\"MagFactor\")" << endm;
00897 }
00898 if (! StarMagField::Instance()) {
00899 new StarMagField ( StarMagField::kMapped, mfscale, kTRUE);
00900 gMessMgr->QAInfo() << "St_geant_Maker::Init Create StarMagField and lock it"
00901 << endm;
00902 }
00903 else {
00904 StarMagField::Instance()->SetFactor(mfscale);
00905 StarMagField::Instance()->SetLock();
00906 gMessMgr->QAInfo() << "St_geant_Maker::Init Reset StarMagField and lock it"
00907 << endm;
00908 }
00909 }
00910 }
00911 }
00912 return kStOK;
00913 }
00914
00915 Int_t St_geant_Maker::Make()
00916 {
00917
00918 Int_t nhits,nhit1,nhit2,nhit3,nhit4,link=1,ide=1,npart,irun,ievt,iwtfl;
00919 Float_t vert[4],weigh;
00920 if (GetDebug()) { Do("debug on;"); } else {Do("debug off;"); }
00921 int iRes = 0; if(iRes) {};
00922 Do("trig");
00923
00924
00925 if (cquest->iquest[0]) {return kStEOF;}
00926 Int_t Nwhead,Ihead[100];
00927 Int_t Nwbuf;
00928 Float_t Ubuf[100];
00929
00930
00931 St_g2t_event *g2t_event = new St_g2t_event("g2t_event",1);
00932 m_DataSet->Add(g2t_event);
00933
00934 Char_t cgnam[21] = " \0";
00935 Agnzgete(link,ide,npart,irun,ievt,cgnam,vert,iwtfl,weigh);
00936 geant3->Gfhead(Nwhead,Ihead,Nwbuf,Ubuf);
00937 if (m_Mode%10 != 1) {
00938 if (fEvtHddr) {
00939 if (clink->jhead) {
00940 if (fEvtHddr->GetRunNumber() != *(z_iq+clink->jhead+1))
00941 fEvtHddr->SetRunNumber(*(z_iq+clink->jhead+1));
00942 fEvtHddr->SetEventNumber(*(z_iq+clink->jhead+2));
00943 }
00944 if (fInputFile != "") fEvtHddr->SetEventType(TString(gSystem->BaseName(fInputFile.Data()),7));
00945 fEvtHddr->SetProdDateTime();
00946 #if 1
00947 SetDateTime();
00948 #endif
00949 }
00950 }
00951 if (npart>0) {
00952 St_particle *particle = new St_particle("particle",npart);
00953 m_DataSet->Add(particle); iRes = g2t_particle(particle);
00954
00955 if (Debug() > 1) particle->Print(0,10);
00956 particle_st *p = particle->GetTable();
00957
00958
00959
00960
00961 if (m_Mode%10 != 1) {
00962 if ( (p->isthep == 10 && p->idhep == 9999999 && fEvtHddr) ||
00963 (p->isthep >= 11 && p->idhep == 999998 && fEvtHddr)) {
00964
00965 fEvtHddr->SetBImpact (p->phep[0]);
00966 fEvtHddr->SetPhImpact (p->phep[1]);
00967 fEvtHddr->SetCenterOfMassEnergy(p->phep[2]);
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977 if ( m_Mode%100 != 1 &&
00978 p->vhep[0] > 0 && p->vhep[0] < 10000 &&
00979 fEvtHddr->GetRunNumber() != p->vhep[0]) {
00980 fEvtHddr->SetRunNumber((int)p->vhep[0]);
00981
00982 fEvtHddr->SetEventNumber((int)p->vhep[1]);
00983 Int_t id = p->jdahep[0];
00984 Int_t it = p->jdahep[1];
00985
00986 if (id <= 0) id = 19991231;
00987 if (id <= 19000000) id +=19000000;
00988 if (id >= 20500000) id = 19991231;
00989 if (it < 0) it = 235959;
00990 if (it > 246060) it = 235959;
00991 fEvtHddr->SetDateTime(id,it);
00992 }
00993 }
00994 }
00995 }
00996
00997 if (!cnum->nvertx || !cnum->ntrack) return kStErr;
00998 St_g2t_vertex *g2t_vertex = new St_g2t_vertex("g2t_vertex",cnum->nvertx);
00999 m_DataSet->Add(g2t_vertex);
01000 St_g2t_track *g2t_track = new St_g2t_track ("g2t_track",cnum->ntrack);
01001 m_DataSet->Add(g2t_track);
01002
01003 iRes = g2t_get_kine (g2t_vertex,g2t_track);
01004 if (Debug() > 1) {
01005 g2t_vertex->Print(0,10);
01006 g2t_track->Print(0,10);
01007 }
01008
01009 iRes = g2t_get_event(g2t_event);
01010 if (Debug() > 1) {
01011 g2t_event->Print(0,10);
01012 }
01013
01014 if(iRes>=10) {
01015 St_g2t_pythia *g2t_pythia = new St_g2t_pythia("g2t_pythia",1);
01016 m_DataSet->Add(g2t_pythia);
01017 gMessMgr->Info() << "Pythia event header captured" << endm;
01018 iRes = g2t_get_pythia(g2t_pythia);
01019 }
01020
01021
01022 if (m_Mode%10 != 1) {
01023 if(fEvtHddr) {
01024 fEvtHddr->SetAEast((*g2t_event)[0].n_wounded_east);
01025 fEvtHddr->SetAWest((*g2t_event)[0].n_wounded_west);
01026 }
01027 }
01028
01029
01030
01031
01032
01033 nhits = 0;
01034 geant3->Gfnhit("SVTH","SVTD", nhits);
01035 if (nhits>0) {
01036 St_g2t_svt_hit *g2t_svt_hit = new St_g2t_svt_hit("g2t_svt_hit",nhits);
01037 m_DataSet->Add(g2t_svt_hit);
01038
01039 iRes = g2t_svt(g2t_track,g2t_svt_hit); if (Debug() > 1) g2t_svt_hit->Print(0,10);
01040
01041 }
01042
01043 nhits = 0;
01044 geant3->Gfnhit("SISH","SFSD", nhits);
01045 if (nhits>0) {
01046 St_g2t_ssd_hit *g2t_ssd_hit = new St_g2t_ssd_hit("g2t_ssd_hit",nhits);
01047 m_DataSet->Add(g2t_ssd_hit);
01048
01049 iRes = g2t_ssd(g2t_track,g2t_ssd_hit); if (Debug() > 1) g2t_ssd_hit->Print(0,10);
01050
01051 }
01052
01053
01054 nhits = 0;
01055 geant3->Gfnhit("PIXH","PLAC", nhits);
01056
01057 if (nhits>0) {
01058 St_g2t_pix_hit *g2t_pix_hit = new St_g2t_pix_hit("g2t_pix_hit",nhits);
01059 m_DataSet->Add(g2t_pix_hit);
01060
01061 iRes = g2t_pix(g2t_track,g2t_pix_hit); if (Debug() > 1) g2t_pix_hit->Print(0,10);
01062
01063 }
01064
01065 nhits = 0;
01066 geant3->Gfnhit("HPDH","YPLA", nhits);
01067
01068 if (nhits>0) {
01069 St_g2t_hpd_hit *g2t_hpd_hit = new St_g2t_hpd_hit("g2t_hpd_hit",nhits);
01070 m_DataSet->Add(g2t_hpd_hit);
01071
01072 iRes = g2t_hpd(g2t_track,g2t_hpd_hit); if (Debug() > 1) g2t_hpd_hit->Print(0,10);
01073
01074 }
01075
01076 nhits = 0;
01077 geant3->Gfnhit("ISTH","IBSS", nhits);
01078
01079 if (nhits>0) {
01080 St_g2t_ist_hit *g2t_ist_hit = new St_g2t_ist_hit("g2t_ist_hit",nhits);
01081 m_DataSet->Add(g2t_ist_hit);
01082
01083 iRes = g2t_ist(g2t_track,g2t_ist_hit); if (Debug() > 1) g2t_ist_hit->Print(0,10);
01084
01085 }
01086
01087 nhits = 0;
01088 geant3->Gfnhit("GEMH","GMDI", nhits);
01089
01090 if (nhits>0) {
01091 St_g2t_gem_hit *g2t_gem_hit = new St_g2t_gem_hit("g2t_gem_hit",nhits);
01092 m_DataSet->Add(g2t_gem_hit);
01093
01094 iRes = g2t_gem(g2t_track,g2t_gem_hit); if (Debug() > 1) g2t_gem_hit->Print(0,10);
01095
01096 }
01097
01098 nhits = 0;
01099 geant3->Gfnhit("IGTH","IGAL", nhits);
01100
01101 if (nhits>0) {
01102 St_g2t_igt_hit *g2t_igt_hit = new St_g2t_igt_hit("g2t_igt_hit",nhits);
01103 m_DataSet->Add(g2t_igt_hit);
01104
01105 iRes = g2t_igt(g2t_track,g2t_igt_hit); if (Debug() > 1) g2t_igt_hit->Print(0,10);
01106
01107 }
01108
01109 nhits = 0;
01110 geant3->Gfnhit("FSTH","FDSW", nhits);
01111
01112 if (nhits>0) {
01113 St_g2t_fst_hit *g2t_fst_hit = new St_g2t_fst_hit("g2t_fst_hit",nhits);
01114 m_DataSet->Add(g2t_fst_hit);
01115
01116 iRes = g2t_fst(g2t_track,g2t_fst_hit); if (Debug() > 1) g2t_fst_hit->Print(0,10);
01117
01118 }
01119
01120 int myNhits=0;
01121 geant3->Gfnhit("FGTH","FGZC", myNhits);
01122 nhits = myNhits;
01123 geant3->Gfnhit("FGTH","FGZD", myNhits);
01124 nhits+= myNhits;
01125
01126 if (nhits>0) {
01127 St_g2t_fgt_hit *g2t_fgt_hit = new St_g2t_fgt_hit("g2t_fgt_hit",nhits);
01128 m_DataSet->Add(g2t_fgt_hit);
01129
01130 iRes = g2t_fgt(g2t_track,g2t_fgt_hit); if (Debug() > 1) g2t_fgt_hit->Print(0,10);
01131
01132 }
01133
01134 geant3->Gfnhit("TPCH","TPAD", nhits);
01135 if (nhits>0){
01136 St_g2t_tpc_hit *g2t_tpc_hit = new St_g2t_tpc_hit("g2t_tpc_hit",nhits);
01137 m_DataSet->Add(g2t_tpc_hit);
01138
01139 iRes = g2t_tpc(g2t_track,g2t_tpc_hit); if (Debug() > 1) g2t_tpc_hit->Print(0,10);
01140
01141 }
01142
01143
01144 nhits = 0;
01145 geant3->Gfnhit("TPCH","TMSE", nhits);
01146 if (nhits>0) {
01147 St_g2t_mwc_hit *g2t_mwc_hit = new St_g2t_mwc_hit("g2t_mwc_hit",nhits);
01148 m_DataSet->Add(g2t_mwc_hit);
01149 iRes = g2t_mwc(g2t_track,g2t_mwc_hit);if (Debug() > 1) g2t_mwc_hit->Print(0,10);
01150
01151 }
01152
01153 nhits = 0;
01154 geant3->Gfnhit("FTPH","FSEC", nhits);
01155 if (nhits>0){
01156 St_g2t_ftp_hit *g2t_ftp_hit = new St_g2t_ftp_hit("g2t_ftp_hit",nhits);
01157 m_DataSet->Add(g2t_ftp_hit);
01158 iRes = g2t_ftp(g2t_track,g2t_ftp_hit);
01159
01160 }
01161
01162 nhits = 0;
01163 geant3->Gfnhit("BTOH","BXSA", nhits);
01164 if (nhits>0) {
01165 St_g2t_ctf_hit *g2t_ctb_hit = new St_g2t_ctf_hit("g2t_ctb_hit",nhits);
01166 m_DataSet->Add(g2t_ctb_hit);
01167 iRes = g2t_ctb(g2t_track,g2t_ctb_hit); if (Debug() > 1) g2t_ctb_hit->Print(0,10);
01168
01169 }
01170
01171 nhits = 0;
01172 geant3->Gfnhit("BTOH","BCSB", nhits);
01173 if (nhits>0) {
01174 St_g2t_ctf_hit *g2t_tof_hit = new St_g2t_ctf_hit("g2t_tof_hit",nhits);
01175 m_DataSet->Add(g2t_tof_hit);
01176 iRes = g2t_tof(g2t_track,g2t_tof_hit); if (Debug() > 1) g2t_tof_hit->Print(0,10);
01177
01178 }
01179
01180 nhits = 0;
01181 geant3->Gfnhit("BTOH","BRSG", nhits);
01182 if (nhits>0) {
01183 St_g2t_ctf_hit *g2t_tfr_hit = new St_g2t_ctf_hit("g2t_tfr_hit",nhits);
01184 m_DataSet->Add(g2t_tfr_hit);
01185 iRes = g2t_tfr(g2t_track,g2t_tfr_hit); if (Debug() > 1) g2t_tfr_hit->Print(0,10);
01186
01187 }
01188
01189
01190 nhit1 = nhit2 = nhit3 = nhit4 = 0;
01191 geant3->Gfnhit("RICH","RGAP", nhit1);
01192 geant3->Gfnhit("RICH","RCSI", nhit2);
01193 geant3->Gfnhit("RICH","FREO", nhit3);
01194 geant3->Gfnhit("RICH","QUAR", nhit4);
01195
01196 nhits=nhit1+nhit2+nhit3+nhit4;
01197 if (nhits>0) {
01198 St_g2t_rch_hit *g2t_rch_hit = new St_g2t_rch_hit("g2t_rch_hit",nhits);
01199 m_DataSet->Add(g2t_rch_hit);
01200 iRes = g2t_rch(g2t_track,g2t_rch_hit); if (Debug() > 1) g2t_rch_hit->Print(0,10);
01201
01202 }
01203
01204
01205 nhits = 0;
01206 geant3->Gfnhit("CALH","CSUP", nhits);
01207 if (nhits>0) {
01208 St_g2t_emc_hit *g2t_emc_hit = new St_g2t_emc_hit("g2t_emc_hit",nhits);
01209 m_DataSet->Add(g2t_emc_hit);
01210 iRes = g2t_emc(g2t_track,g2t_emc_hit); if (Debug() > 1) g2t_emc_hit->Print(0,10);
01211
01212 }
01213
01214 nhits = 0;
01215 geant3->Gfnhit("CALH","CSDA", nhits);
01216 if (nhits>0) {
01217 St_g2t_emc_hit *g2t_smd_hit = new St_g2t_emc_hit("g2t_smd_hit",nhits);
01218 m_DataSet->Add(g2t_smd_hit);
01219 iRes = g2t_smd(g2t_track,g2t_smd_hit); if (Debug() > 1) g2t_smd_hit->Print(0,10);
01220
01221 }
01222
01223 nhit1 = nhit2 = nhit3 = 0;
01224 geant3->Gfnhit("ECAH","ESCI", nhit1);
01225 geant3->Gfnhit("ECAH","ELGR", nhit2);
01226 geant3->Gfnhit("ECAH","EPCT", nhit3);
01227 nhits = nhit1+nhit2+nhit3;
01228 if (nhits>0) {
01229 St_g2t_emc_hit *g2t_eem_hit = new St_g2t_emc_hit("g2t_eem_hit",nhits);
01230 m_DataSet->Add(g2t_eem_hit);
01231 iRes = g2t_eem(g2t_track,g2t_eem_hit); if (Debug() > 1) g2t_eem_hit->Print(0,10);
01232
01233 }
01234 nhit1 = nhit2 = 0;
01235 geant3->Gfnhit("ECAH","EXSE", nhit1);
01236 geant3->Gfnhit("ECAH","EHMS", nhit2);
01237 nhits = nhit1+nhit2;
01238 if (nhits>0) {
01239 St_g2t_emc_hit *g2t_esm_hit = new St_g2t_emc_hit("g2t_esm_hit",nhits);
01240 m_DataSet->Add(g2t_esm_hit);
01241 iRes = g2t_esm(g2t_track,g2t_esm_hit); if (Debug() > 1) g2t_esm_hit->Print(0,10);
01242
01243 }
01244
01245 nhits = 0;
01246 geant3->Gfnhit("VPDH","VRAD", nhits);
01247 if (nhits>0) {
01248 St_g2t_vpd_hit *g2t_vpd_hit = new St_g2t_vpd_hit("g2t_vpd_hit",nhits);
01249 m_DataSet->Add(g2t_vpd_hit);
01250 iRes = g2t_vpd(g2t_track,g2t_vpd_hit); if (Debug() > 1) g2t_vpd_hit->Print(0,10);
01251
01252 }
01253
01254 nhits = 0;
01255 geant3->Gfnhit("PHMH","PDGS", nhits);
01256 if (nhits>0) {
01257 St_g2t_pmd_hit *g2t_pmd_hit = new St_g2t_pmd_hit("g2t_pmd_hit",nhits);
01258 m_DataSet->Add(g2t_pmd_hit);
01259 iRes = g2t_pmd(g2t_track,g2t_pmd_hit); if (Debug() > 1) g2t_pmd_hit->Print(0,10);
01260
01261 }
01262
01263 nhits = 0;
01264 geant3->Gfnhit("ZCAH","QSCI", nhits);
01265 if (nhits>0) {
01266 St_g2t_emc_hit *g2t_zdc_hit = new St_g2t_emc_hit("g2t_zdc_hit",nhits);
01267 m_DataSet->Add(g2t_zdc_hit);
01268 iRes = g2t_zdc(g2t_track,g2t_zdc_hit); if (Debug() > 1) g2t_zdc_hit->Print(0,10);
01269
01270 }
01271
01272
01273 nhits = 0;
01274 geant3->Gfnhit("BBCH","BPOL", nhits);
01275 if (nhits>0)
01276 {
01277 St_g2t_ctf_hit *g2t_bbc_hit = new St_g2t_ctf_hit("g2t_bbc_hit",nhits);
01278 m_DataSet->Add(g2t_bbc_hit);
01279 iRes = g2t_bbc(g2t_track,g2t_bbc_hit); if (Debug() > 1) g2t_bbc_hit->Print(0,10);
01280
01281 }
01282
01283 nhit1 = nhit2 = 0;
01284 geant3->Gfnhit("FPDH","FLGR",nhit1);
01285 geant3->Gfnhit("FPDH","FLXF",nhit2);
01286 nhits = nhit1+nhit2;
01287 if (nhits>0) {
01288 St_g2t_emc_hit* g2t_fpd_hit = new St_g2t_emc_hit("g2t_fpd_hit",nhits);
01289 m_DataSet->Add(g2t_fpd_hit);
01290 iRes = g2t_fpd(g2t_track,g2t_fpd_hit); if (Debug() > 1) g2t_fpd_hit->Print(0,10);
01291
01292 }
01293
01294 nhits = 0;
01295 geant3->Gfnhit("FSCH","FSCT", nhits);
01296 if (nhits>0) {
01297 St_g2t_emc_hit *g2t_fsc_hit = new St_g2t_emc_hit("g2t_fsc_hit",nhits);
01298 m_DataSet->Add(g2t_fsc_hit);
01299 iRes = g2t_fsc(g2t_track,g2t_fsc_hit); if (Debug() > 1) g2t_fsc_hit->Print(0,10);
01300
01301 }
01302
01303 nhits = 0;
01304 geant3->Gfnhit("MUTH","MGAP", nhits);
01305 if (nhits>0) {
01306 St_g2t_mtd_hit *g2t_mtd_hit = new St_g2t_mtd_hit("g2t_mtd_hit",nhits);
01307 m_DataSet->Add(g2t_mtd_hit);
01308 iRes = g2t_mtd(g2t_track,g2t_mtd_hit); if (Debug() > 1) g2t_mtd_hit->Print(0,10);
01309
01310 }
01311
01312 nhits = 0;
01313 geant3 -> Gfnhit("EIDH","TABD", nhits);
01314 if ( nhits > 0 )
01315 {
01316 St_g2t_etr_hit *g2t_etr_hit = new St_g2t_etr_hit("g2t_etr_hit",nhits);
01317 m_DataSet->Add(g2t_etr_hit);
01318 iRes = g2t_etr( g2t_track, g2t_etr_hit);
01319 if ( Debug() > 1 ) g2t_etr_hit->Print(0,10);
01320 }
01321
01322
01323
01324
01325 #if 0
01326 Char_t *g2t = "g2t_";
01327 Int_t narg = 0;
01328 addrfun address = (addrfun ) csaddr(g2t);
01329 if (address) csjcal(&address,&narg);
01330 #endif
01331
01332 if (cflag->ieorun) return kStEOF;
01333 if (cflag->ieotri) return kStErr;
01334 return kStOK;
01335 }
01336
01337 void St_geant_Maker::LoadGeometry(const Char_t *option){
01338 #if 0
01339 if (strlen(option)) Do (option);
01340 Geometry();
01341 Do("gclose all");
01342 Agstroot();
01343 #else
01344 mInitialization = option;
01345 #endif
01346 }
01347
01348 void St_geant_Maker::Draw(const char* opt)
01349 {
01350 Int_t two = 2;
01351 Int_t zero = 0;
01352 Int_t one = 1;
01353 const char *path = " ";
01354 Dzddiv (two,zero,path,opt,one,zero,one,one);
01355 }
01356
01357 void St_geant_Maker::Do(const Char_t *job)
01358 {
01359 int l=strlen(job);
01360 if (l) geant3->Kuexel(job);
01361 }
01362
01363
01364
01365 TVolume *St_geant_Maker::MakeVolume(TString *name, Int_t ivo, Int_t Nlevel, Int_t *Names, Int_t *Numbers){
01366 TVolume *node = 0;
01367 Int_t jvolum = clink->jvolum;
01368 Int_t jvo = z_lq[jvolum-ivo];
01369 if (jvo) {
01370 node = (TVolume *) topnode->FindObject(name->Data());
01371 if (! node) {
01372 TShape *shape = (TShape *) gGeometry->GetListOfShapes()->FindObject(name->Data());
01373 if (!shape ) {shape = MakeShape(name,ivo);}
01374 node = new TVolume(name->Data(), name->Data(), shape);
01375 }
01376
01377 Int_t nin =(Int_t) z_q[jvo+3];
01378 if (nin > 0)
01379 {
01380 Nlevel++;
01381 for (Int_t in=1; in<= nin; in++)
01382 {
01383 Int_t jin = z_lq[jvo-in];
01384 Int_t ivom = (Int_t) z_q[jin+2];
01385 Int_t nuser = (Int_t) z_q[jin+3];
01386 TString namem((const Char_t *) &(z_iq[jvolum+ivom]), 4);
01387
01388 Names[Nlevel] = z_iq[jvolum+ivom];
01389 Numbers[Nlevel] = nuser;
01390 Int_t nlevv = Nlevel+1;
01391 Int_t Ierr;
01392 Float_t xx[3], theta1,phi1, theta2,phi2, theta3,phi3, type;
01393
01394 Ierr = geant3->Glvolu(nlevv, Names, Numbers);
01395
01396 Gfxzrm(Nlevel, xx[0],xx[1],xx[2],
01397 theta1,phi1, theta2,phi2, theta3,phi3, type);
01398 TVolume *newnode = (TVolume *) topnode->FindObject(namem.Data());
01399
01400 if (!newnode)
01401 { newnode = MakeVolume(&namem, ivom, nlevv, Names, Numbers); }
01402
01403 irot++;
01404 Char_t ss[12];
01405 sprintf(ss,"rotm%i",irot);
01406 TRotMatrix *rotm = new TRotMatrix(ss,ss,
01407 theta1,phi1, theta2,phi2, theta3,phi3);
01408 node->Add(newnode,xx[0],xx[1],xx[2],rotm);
01409 }
01410 }
01411 if (nin < 0) {
01412 Nlevel++;
01413 }
01414 if (nin == 0) {Nlevel--;}
01415 }
01416 return node;
01417 }
01418
01419 TShape *St_geant_Maker::MakeShape(TString *name, Int_t ivo){
01420
01421 typedef enum {BOX=1,TRD1,TRD2,TRAP,TUBE,TUBS,CONE,CONS,SPHE,PARA,
01422 PGON,PCON,ELTU,HYPE,GTRA=28,CTUB} shapes;
01423 Int_t jvolum = clink->jvolum;
01424 Int_t jvo = z_lq[jvolum-ivo];
01425 TShape* t;
01426 shapes shape = (shapes) z_q[jvo+2];
01427 Int_t numed = (Int_t) z_q[jvo+4];
01428 Int_t npar = (Int_t) z_q[jvo+5];
01429 params *p = (params *)&z_q[jvo+7];
01430 attributes *att = (attributes *)(&z_q[jvo+7] + npar);
01431 Int_t jtmed = clink->jtmed;
01432 Int_t jtm = z_lq[jtmed-numed];
01433 Int_t nmat = (int)z_q[jtm+6];
01434 Int_t jmate = clink->jmate;
01435 Int_t jma = z_lq[jmate-nmat];
01436 Int_t nmixt = (Int_t) z_q[jma+11];
01437 Int_t nm = TMath::Abs(nmixt);
01438
01439 Char_t astring[20];
01440 if (nm <= 1) sprintf (astring,"mat%i",nmat);
01441 else sprintf (astring,"mix%i",nmat);
01442
01443 TString Astring(astring);
01444 t = (TShape *) gGeometry->GetListOfShapes()->FindObject(name->Data());
01445 if (!t) {
01446 switch (shape) {
01447 case BOX: t = new TBRIK((Char_t *) name->Data(),"BRIK",(Char_t *) Astring.Data(),
01448 p->par[0],p->par[1],p->par[2]);
01449 break;
01450 case TRD1: t = new TTRD1((Char_t *) name->Data(),"TRD1",(Char_t *) Astring.Data(),
01451 p->par[0],p->par[1],p->par[2],p->par[3]);
01452 break;
01453 case TRD2: t = new TTRD2((Char_t *) name->Data(),"TRD2",(Char_t *) Astring.Data(),
01454 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4]);
01455 break;
01456 case TRAP: t = new TTRAP((Char_t *) name->Data(),"TRAP",(Char_t *) Astring.Data(),
01457 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4],
01458 p->par[5],p->par[6],p->par[7],p->par[8],p->par[9],
01459 p->par[10]);
01460 break;
01461 case TUBE: t = new TTUBE((Char_t *) name->Data(),"TUBE",(Char_t *) Astring.Data(),
01462 p->par[0],p->par[1],p->par[2]);
01463 break;
01464 case TUBS: t = new TTUBS((Char_t *) name->Data(),"TUBS",(Char_t *) Astring.Data(),
01465 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4]);
01466 break;
01467 case CONE: t = new TCONE((Char_t *) name->Data(),"CONE",(Char_t *) Astring.Data(),
01468 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4]);
01469 break;
01470 case CONS: t = new TCONS((Char_t *) name->Data(),"CONS",(Char_t *) Astring.Data(),
01471 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4],
01472 p->par[5],p->par[6]);
01473 break;
01474 case SPHE: t = new TSPHE((Char_t *) name->Data(),"SPHE",(Char_t *) Astring.Data(),
01475 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4],
01476 p->par[5]);
01477 break;
01478 case PARA: t = new TPARA((Char_t *) name->Data(),"PARA",(Char_t *) Astring.Data(),
01479 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4],
01480 p->par[5]);
01481 break;
01482 case PGON: t = new TPGON((Char_t *) name->Data(),"PGON",(Char_t *) Astring.Data(),
01483 p->par[0],p->par[1],(int)p->par[2],(int)p->par[3]);
01484 break;
01485 case PCON: t = new TPCON((Char_t *) name->Data(),"PCON",(Char_t *) Astring.Data(),
01486 p->par[0],p->par[1],(int)p->par[2]);
01487 break;
01488 case ELTU: t = new TELTU((Char_t *) name->Data(),"ELTU",(Char_t *) Astring.Data(),
01489 p->par[0],p->par[1],p->par[2]);
01490 break;
01491
01492
01493
01494 case GTRA: t = new TGTRA((Char_t *) name->Data(),"GTRA",(Char_t *) Astring.Data(),
01495 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4],
01496 p->par[5],p->par[6],p->par[7],p->par[8],p->par[9],
01497 p->par[10],p->par[11]);
01498 break;
01499 case CTUB: t = new TCTUB((Char_t *) name->Data(),"CTUB",(Char_t *) Astring.Data(),
01500 p->par[0],p->par[1],p->par[2],p->par[3],p->par[4],
01501 p->par[5],p->par[6],p->par[7],p->par[8],p->par[9],
01502 p->par[10]);
01503 break;
01504
01505
01506
01507
01508 default: assert(0);
01509
01510 }
01511 if (att->lseen != 1) t->SetVisibility((int)att->lseen);
01512 if (att->lstyle != 1) t->SetLineStyle ((int)att->lstyle);
01513 if (att->lwidth != 1) t->SetLineWidth ((int)att->lwidth);
01514 if (att->lcolor != 1) t->SetLineColor ((int)att->lcolor);
01515 if (att->lfill != 1) t->SetFillStyle ((int)att->lfill);
01516 }
01517 return t;
01518 }
01519
01520 void St_geant_Maker::Call(const Char_t *name)
01521 {
01522 Int_t narg = 0;
01523 addrfun *address = (addrfun *) csaddr_((Char_t *)name, strlen(name));
01524 if (address) csjcal_(address, &narg);
01525 }
01526
01527 void St_geant_Maker::ClearRootGeoms()
01528 {
01529
01530 if (fVolume) {
01531 TDataSet *dataSet = FindByName(".data");
01532 fVolume->Shunt(dataSet);
01533 fVolume = 0;
01534 }
01535 if (fTopGeoVolume) {
01536 LOG_ERROR << "Fix me we !!!. Seg fault danger !!!" <<endm;
01537 delete fTopGeoVolume;
01538 fTopGeoVolume = 0;
01539 }
01540
01541 }
01542
01543 TDataSet *St_geant_Maker::Work()
01544 {
01545 if (mInitialization != "") {
01546 InitRun(-1);
01547 }
01548 struct Medium
01549 { Char_t name[20]; Int_t nmat, isvol, ifield; Float_t fieldm; };
01550 struct Volume
01551 { Char_t name[4],nick[4]; Int_t npar; Float_t par[50]; };
01552 char matName[24];
01553
01554
01555 TVolume *node=0;
01556
01557 Float_t *volu=0, *position=0, *mother=0, *p=0;
01558 Int_t who=0, copy=0, npar=0;
01559 Int_t nvol=cnum->nvolum;
01560 Float_t theta1,phi1, theta2,phi2, theta3,phi3, type;
01561 TObjArray nodes(nvol+1);
01562
01563 if (!gGeometry) new TGeometry("STAR","nash STAR");
01564 GtHash *H = new GtHash;
01565
01566 printf(" looping on agvolume \n");
01567
01568
01569
01570 while (Agvolume(node,volu,position,mother,who,copy,p,npar,matName))
01571 {
01572
01573 typedef enum {BOX=1,TRD1,TRD2,TRAP,TUBE,TUBS,CONE,CONS,SPHE,PARA,
01574 PGON,PCON,ELTU,HYPE,GTRA=28,CTUB} shapes;
01575 TShape* t;
01576 shapes shape = (shapes) volu[1];
01577 Int_t nin = 0;
01578
01579 Int_t np = (Int_t) volu[4];
01580 Float_t* p0 = volu+6;
01581 Float_t* att = p0+np;
01582 Char_t name[] = {0,0,0,0,0};
01583 Char_t nick[] = {0,0,0,0,0};
01584 float xx[3] = {0.,0.,0.};
01585 TVolume *newVolume = 0;
01586 if (mother) nin = (Int_t) mother[2];
01587 TVolume *Hp = 0;
01588
01589 strncpy(nick,(const Char_t*)&cvolu->names[cvolu->nlevel-1],4);
01590 strncpy(name,(const Char_t*)(volu-5),4);
01591
01592 Hp = (TVolume *) H->GetPointer(p,npar+1);
01593 if (Hp) newVolume = Hp;
01594 else
01595 {
01596 switch (shape)
01597 { case BOX: t=new TBRIK(nick,"BRIK",matName,
01598 p[0],p[1],p[2]); break;
01599 case TRD1: t=new TTRD1(nick,"TRD1",matName,
01600 p[0],p[1],p[2],p[3]); break;
01601 case TRD2: t=new TTRD2(nick,"TRD2",matName,
01602 p[0],p[1],p[2],p[3],p[4]); break;
01603 case TRAP: t=new TTRAP(nick,"TRAP",matName,
01604 p[0],p[1],p[2],p[3],p[4],p[5],
01605 p[6],p[7],p[8],p[9],p[10]); break;
01606 case TUBE: t=new TTUBE(nick,"TUBE",matName,
01607 p[0],p[1],p[2]); break;
01608 case TUBS: t=new TTUBS(nick,"TUBS",matName,
01609 p[0],p[1],p[2],p[3],p[4]); break;
01610 case CONE: t=new TCONE(nick,"CONE",matName,
01611 p[0],p[1],p[2],p[3],p[4]); break;
01612 case CONS: t=new TCONS(nick,"CONS",matName,
01613 p[0],p[1],p[2],p[3],p[4],p[5],p[6]); break;
01614
01615 case SPHE: t=new TSPHE(nick,"SPHE",matName,
01616 p[0],p[1],p[2],p[3],p[4],p[5]); break;
01617 case PARA: t=new TPARA(nick,"PARA",matName,
01618 p[0],p[1],p[2],p[3],p[4],p[5]); break;
01619 case PGON: t=new TPGON(nick,"PGON",matName,p[0],p[1],(int)p[2],(int)p[3]);
01620 { Float_t *pp = p+4;
01621 for (Int_t i=0; i<p[3]; i++) {
01622 Float_t z = *pp++;
01623 Float_t rmin = *pp++;
01624 Float_t rmax = *pp++;
01625 ((TPCON *)t)->DefineSection(i,z,rmin,rmax);
01626
01627
01628 }
01629 } break;
01630 case PCON: t=new TPCON(nick,"PCON",matName,p[0],p[1],(int)p[2]);
01631 { Float_t *pp = p+3;
01632 for (Int_t i=0; i<p[2]; i++) {
01633 Float_t z = *pp++;
01634 Float_t rmin = *pp++;
01635 Float_t rmax = *pp++;
01636 ((TPCON *)t)->DefineSection(i,z,rmin,rmax);
01637
01638
01639 }
01640 } break;
01641 case ELTU: t=new TELTU(nick,"ELTU",matName,
01642 p[0],p[1],p[2]); break;
01643
01644
01645 case GTRA: t=new TGTRA(nick,"GTRA",matName,
01646 p[0],p[1],p[2],p[3],p[4],p[5],
01647 p[6],p[7],p[8],p[9],p[10],p[11]); break;
01648 case CTUB: t=new TCTUB(nick,"CTUB",matName,
01649 p[0],p[1],p[2],p[3],p[4],p[5],
01650 p[6],p[7],p[8],p[9],p[10]); break;
01651 default: t=new TBRIK(nick,"BRIK",matName,
01652 p[0],p[1],p[2]); break;
01653 };
01654 t->SetLineColor((int)att[4]);
01655
01656
01657 std::string nickMat = Form("%s(%s)", nick,matName);
01658 newVolume = new TVolume(name,nickMat.c_str(),t);
01659
01660 newVolume -> SetVisibility((TVolume::ENodeSEEN)TVolume::MapGEANT2StNodeVis((int)att[1]));
01661 H->SetPointer(newVolume);
01662 }
01663
01664 if (node)
01665 { Gfxzrm(nlev, xx[0],xx[1],xx[2], theta1,phi1,
01666 theta2,phi2, theta3,phi3, type);
01667 TRotMatrix *matrix=GetMatrix(theta1,phi1,theta2,phi2,theta3,phi3);
01668 node->Add(newVolume,xx[0],xx[1],xx[2],matrix,UInt_t(copy));
01669 }
01670
01671 node = newVolume;
01672 };
01673
01674
01675
01676 delete H;
01677 fVolume=node;
01678 gGeometry->GetListOfNodes()->Add(node);
01679 return GetVolume();
01680 }
01681
01682 void St_geant_Maker::Mark(TVolume *topvol) {
01683 Int_t JSET = clink->jset;
01684 if (JSET <= 0) return;
01685 Int_t NSET=z_iq[JSET-1];
01686 Char_t Uset[5], Udet[5], Uvol[5];
01687 memset (Uset, 0, 5);
01688 memset (Udet, 0, 5);
01689 memset (Uvol, 0, 5);
01690 for (Int_t ISET=1;ISET<=NSET;ISET++) {
01691 Int_t JS=z_lq[JSET-ISET];
01692 if (JS <= 0) continue;
01693 Int_t NDET=z_iq[JS-1];
01694 memcpy (Uset, &z_iq[JSET+ISET], 4);
01695 for (Int_t IDET=1;IDET<=NDET;IDET++) {
01696 Int_t JD=z_lq[JS-IDET];
01697 if (JD <=0) continue;
01698 Int_t NV=z_iq[JD+2];
01699 Int_t NWHI=z_iq[JD+7];
01700 Int_t NWDI=z_iq[JD+8];
01701 memcpy (Udet, &z_iq[JS+IDET], 4);
01702 gMessMgr->QAInfo() << " Set " << Uset << " Detector " << Udet
01703 << " NV " << NV << " NWHI " << NWHI << " NWDI " << NWDI << endm;
01704 Int_t JDU = z_lq[JD-3];
01705 if (JDU > 0) {
01706 Int_t i1 = (int)z_q[JDU+3], i2 = (int)z_q[JDU+5];
01707 gMessMgr->QAInfo() << " Volume/Bits :" << i1 << "/" << i2 << endm;
01708 for (Int_t i=i1;i<i2;i += 3) {
01709 Int_t j = JDU+i;
01710 Int_t iv = (int)z_q[j+1];
01711 Int_t Nmx = (int)z_q[j+2];
01712 Int_t Nam = (int)z_iq[clink->jvolum+iv];
01713 Int_t Nb = (int)z_q[j+3];
01714 memcpy (Uvol, &Nam, 4);
01715 gMessMgr->QAInfo() << "\t" << Uvol << "\t" << Nmx << "\t" << Nb << endm;
01716 }
01717 }
01718 else {
01719 if (NV > 0) {
01720 gMessMgr->QAInfo() << " Volume/Bits ";
01721 for (Int_t I=1; I<=NV; I++) {
01722 memcpy (Uvol, &z_iq[JD+2*I+9], 4);
01723 gMessMgr->QAInfo() << "\t" << Uvol << "/\t" << z_iq[JD+2*I+10];
01724 }
01725 gMessMgr->QAInfo() << endm;
01726 }
01727 }
01728 }
01729 }
01730 #if 0
01731 geant3->Gfinds();
01732 if (csets->iset && csets->idet) {
01733 gMessMgr->QAInfo() << "Set/Det \t" << csets->iset << "/" << csets->idet
01734 << "\tidtype = \t" << csets->idtype
01735 << "\tnvname = \t" << csets->nvname << endm;
01736 Int_t nLev, lNam[15], lNum[15];
01737 Char_t Name[4];
01738 geant3->Gfpath(csets->iset,csets->idet,csets->numbv, nLev, lNam, lNum);
01739 Int_t four = 4;
01740 for (Int_t i=0; i< nLev; i++) {
01741 uhtoc(lNam[i],four,PASSCHARD(Name),four PASSCHARL(Name));
01742 gMessMgr->QAInfo() << "\t" << Name << "\t" << lNum[i];
01743 }
01744 gMessMgr->QAInfo() << endm;
01745 }
01746 #endif
01747 }
01748
01749 static Bool_t CompareMatrix(TRotMatrix &a,TRotMatrix &b)
01750 { double *pa=a.GetMatrix(); double *pb=b.GetMatrix();
01751 for (int i=0; i<9; i++) if (pa[i]!=pb[i]) return kFALSE;
01752 return kTRUE;
01753 }
01754
01755 TRotMatrix *St_geant_Maker::GetMatrix(float thet1, float phii1,
01756 float thet2, float phii2,
01757 float thet3, float phii3)
01758 { char mname[20];
01759 THashList *list = gGeometry->GetListOfMatrices();
01760 int n=list->GetSize(); sprintf(mname,"matrix%d",n+1);
01761 TRotMatrix *pattern=new TRotMatrix(mname,mname,
01762 thet1,phii1,thet2,phii2,thet3,phii3);
01763
01764 TRotMatrix *matrix=0; TIter nextmatrix(list);
01765 while ((matrix=(TRotMatrix *) nextmatrix()))
01766 { if (matrix!=pattern)
01767 { if (CompareMatrix(*matrix,*pattern))
01768 { list->Remove(pattern); delete pattern; return matrix; }
01769 } }
01770 return pattern;
01771 }
01772
01773 TString St_geant_Maker::GetVolumeSrcFile(const char *volumeName) const
01774 {
01775
01776 TDataSet *found = 0;
01777 TString vName = volumeName;
01778 vName.ToUpper();
01779 if (fVolume && volumeName && volumeName[0]) {
01780 const TDataSet *myVolume = fVolume->FindByName(vName.Data());
01781 TFileSet *geoSrc = dynamic_cast<TFileSet*>(GetDataSet("GeometryDirectory"));
01782 if (geoSrc && myVolume ) {
01783 do {
01784
01785 TString pattern = myVolume->GetName();
01786 pattern.ToLower();
01787 pattern += "geo.g";
01788 found = geoSrc->FindByName(pattern.Data());
01789 } while (!found && (myVolume = myVolume->GetParent()) );
01790 }
01791 if (found) {
01792
01793 TString path = found->Path();
01794 Ssiz_t pos = path.Index("/geometry/");
01795 TString topDir = geoSrc->GetTitle();
01796 path.Replace(0,pos,topDir);
01797 return path;
01798 }
01799 }
01800 return "";
01801 }
01802
01803 Int_t St_geant_Maker::SetInputFile(const char *file)
01804 {
01805 fInputFile = file;
01806 return kStOK;
01807 }
01808
01809 Int_t St_geant_Maker::Skip(Int_t Nskip)
01810 {
01811 if (Nskip >= 0) {
01812 Char_t kuip[20];
01813 sprintf (kuip,"trig %i",Nskip);
01814 if (GetDebug()) printf("St_geant_Maker skip %i\n record(s)",Nskip);
01815 Do((const char*)kuip);
01816
01817 if (cquest->iquest[0]) {return kStEOF;}
01818 }
01819 return kStOK;
01820 }
01821
01822 void type_of_call rootmaptable_(const Char_t* cdest,const Char_t* table , const Char_t* spec,
01823 Int_t &k, Char_t *iq,
01824 const int lCdest,const int lTable, const int lSpec)
01825 {
01826 Char_t *Cdest = new char[(lCdest+1)]; strncpy(Cdest,cdest,lCdest); Cdest[lCdest] = 0;
01827 Char_t *Table = new char[(lTable+1)]; strncpy(Table,table,lTable); Table[lTable] = 0;
01828 Char_t *Spec = new char[(lSpec+1)]; strncpy(Spec,spec,lSpec); Spec[lSpec] = 0;
01829 St_geant_Maker::RootMapTable(Cdest,Table,Spec, k, iq);
01830 delete [] Cdest;
01831 delete [] Table;
01832 delete [] Spec;
01833 }
01834
01835 void St_geant_Maker::RootMapTable(Char_t *Cdest,Char_t *Table, Char_t* Spec,
01836 Int_t &k, Char_t *iq)
01837 {
01838 TString TableName(Table);
01839 TString t = TableName.Strip();
01840 t.ToLower();
01841
01842
01843 St_Table *table = St_Table::New(t.Data(),t.Data(),iq,k);
01844 #ifndef __CINT__
01845 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,05,04)
01846 if (table) {fgGeom->Add(table); table->SetBit(TTable::kIsNotOwn);}
01847 #else
01848 if (table) {fgGeom->Add(table); table->SetBit(kIsNotOwn);}
01849 #endif
01850 #endif
01851 if (fgGeantMk->Debug() > 1) {
01852 if (table) {
01853 Int_t N = table->GetNRows();
01854 if (N > 10) N = 10; table->Print(0,N);
01855 }
01856 else gMessMgr->Debug() << "St_geant_Maker::Dictionary for table :" << t.Data()
01857 << " has not been defined yet. Skip it"
01858 << endm;
01859 }
01860 }
01861
01862 Int_t St_geant_Maker::G2t_volume_id(const Char_t *name, Int_t *numbv){
01863 return g2t_volume_id(PASSCHARD(name),numbv PASSCHARL(name));
01864 }
01865
01866 Int_t St_geant_Maker::Agvolume(TVolume *&node, Float_t *&par, Float_t *&pos
01867 ,Float_t *&mot, Int_t &who, Int_t ©
01868 ,Float_t *&par1, Int_t &npar, char matName[24])
01869 {
01870
01871 int ans = agvolume(node,par,pos,mot,who,copy,par1,npar,(int*)matName);
01872 matName[20]=0; char *cc = strstr(matName," "); if (cc) *cc=0;
01873 return ans;
01874
01875 }
01876
01877
01878 void St_geant_Maker::Agnzgete (Int_t &ILK,Int_t &IDE,
01879 Int_t &NPART,Int_t &IRUN,Int_t &IEVT,const Char_t *CGNAM,
01880 Float_t *VERT,Int_t &IWTFL,Float_t &WEIGH){
01881 agnzgete (ILK,IDE,NPART,IRUN,IEVT,PASSCHARD(CGNAM),VERT,IWTFL,WEIGH
01882 PASSCHARL(CGNAM));
01883 }
01884
01885 void St_geant_Maker::Geometry() {
01886
01887 ClearRootGeoms();
01888 if (Remake()) {
01889 LOG_WARN << "The local version of the <libgeometry.so> shared library is to be re-built" << endm;
01890 gSystem->Exec("cons +geometry");
01891 LOG_WARN << "The local version of the <libgeometry.so> shared library has been re-built" << endm;
01892 LOG_WARN << "One has to re-load Geometry browser to see the new geometry" << endm;
01893 LOG_WARN << "Ask Pavel Nevski, \"Why?\"" << endm;
01894
01895 SetRemake(kFALSE);
01896 } else {
01897 geometry();
01898 }
01899 }
01900
01901 Int_t St_geant_Maker::Agstroot() {
01902
01903 return agstroot();
01904 }
01905
01906 void St_geant_Maker::Gfxzrm(Int_t & Nlevel,
01907 Float_t &x, Float_t &y, Float_t &z,
01908 Float_t &Theta1, Float_t & Phi1,
01909 Float_t &Theta2, Float_t & Phi2,
01910 Float_t &Theta3, Float_t & Phi3,
01911 Float_t &Type){
01912 gfxzrm(Nlevel, x, y, z,
01913 Theta1, Phi1,
01914 Theta2, Phi2,
01915 Theta3, Phi3, Type);
01916 }
01917
01918 void St_geant_Maker::Dzddiv(Int_t& idiv ,Int_t &Ldummy,const Char_t* path,const Char_t* opt,
01919 Int_t& one,Int_t &two,Int_t &three,Int_t& iw){
01920 dzddiv (idiv,Ldummy,PASSCHARD(path),PASSCHARD(opt),
01921 one,two,three,iw PASSCHARL(path) PASSCHARL(opt));
01922 }
01923
01924 void St_geant_Maker::SetDateTime(Int_t idat, Int_t itime) {
01925 if ( m_Mode%100 == 1 || ! fEvtHddr ) return;
01926 if (! m_geom_gdat) {
01927 gMessMgr->Info() << "St_geant_Maker:: geom_gdat table is missing. Try to get it from GEANT." << endm;
01928 Int_t jrung = clink->jrung;
01929 if (jrung > 0 && z_iq[jrung-1]>=10) {
01930 Int_t jrunh = z_lq[jrung-1];
01931 if (jrunh > 0) {
01932 Int_t l = z_iq[jrunh-1];
01933 Char_t *buf = new Char_t[4*l+1];
01934 memcpy (buf, &z_iq[jrunh+1], 4*l);
01935 buf[4*l] = '\0';
01936 gMessMgr->Info() << "St_geant_Maker::SetDateTime runh buffer: " << buf << endm;
01937 TString C(buf);
01938 delete [] buf;
01939 Ssiz_t begin, index;
01940 begin = index = 0;
01941 TString version;
01942 Float_t mfscale = 5;
01943
01944 while ( ( begin < C.Length()) && (index != kNPOS) ) {
01945
01946 index = C.Index(';',1, begin,TString::kExact);
01947 if (index > begin) {
01948 TString line(C(begin,index-begin));
01949 line.ToLower();
01950 if (Debug()) gMessMgr->QAInfo() << line << endm;
01951 if (line.Contains("detp")) {
01952 Int_t indx = line.Index("year");
01953 if (indx) {
01954 Int_t end = line.Index(" ",1,indx,TString::kExact);
01955 if (end > indx) {
01956 version = TString(line(indx,end-indx));
01957 }
01958 }
01959 indx = line.Index("field");
01960 if (indx) {
01961 Int_t eq = line.Index("=",indx+4,TString::kExact);
01962 sscanf(line.Data()+eq+1,"%f",&mfscale);
01963 }
01964 }
01965 }
01966 begin = index + 1;
01967 }
01968 if (version.Length()) {
01969 m_geom_gdat = new St_geom_gdat("geom_gdat",1);
01970 AddRunco(m_geom_gdat);
01971 geom_gdat_st gdat;
01972 gdat.system[0] = 0;
01973 gdat.system[1] = 0;
01974 gdat.mfscale = mfscale/5.;
01975 memset (&gdat.gtag[0], 0, 8);
01976 strncpy(&gdat.gtag[0], version.Data(), 8);
01977 m_geom_gdat->AddAt(&gdat);
01978 if (Debug()) m_geom_gdat->Print(0,1);
01979 if (StarMagField::Instance()) StarMagField::Instance()->SetFactor(gdat.mfscale);
01980 }
01981 }
01982 }
01983 }
01984 if (m_geom_gdat) {
01985 geom_gdat_st *gdat = m_geom_gdat->GetTable();
01986 TString version(&gdat->gtag[0],8);
01987 version.Strip();
01988 version.ToLower();
01989 if (version != "") {
01990 Int_t id = St_db_Maker::AliasDate(version.Data());
01991 Int_t it = St_db_Maker::AliasTime(version.Data());
01992 if (id && GetDate() >= 20330101) {
01993 gMessMgr->Info() << "St_geant_Maker::SetDateTime Date/Time = "
01994 << id << "/" << it << "\tas " << version << endm;
01995 fEvtHddr->SetDateTime(id,it);
01996 }
01997 }
01998 }
01999 }
02000
02001 Char_t *acfromr(Float_t r) {
02002 const Char_t *S=" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ";
02003 Char_t *charm = new Char_t[5];
02004 memset (&charm[0], 0, 5);
02005 Int_t k = (int) r;
02006 for (int i = 3; i >= 0; i--) {
02007 int j = 077 & k; k = k >> 6; charm[i] = S[j];
02008
02009 }
02010
02011 return charm;
02012 }
02013
02014 Int_t St_geant_Maker::AgstHits()
02015 {
02016 if (! geant3) return kStErr;
02017 Int_t JSET = clink->jset;
02018 if (JSET <= 0) return kStErr;
02019 Int_t NSET=z_iq[JSET-1];
02020 Char_t Uset[8], Udet[8], Uvol[8];
02021 memset (Uset, 0, 8);
02022 memset (Udet, 0, 8);
02023 memset (Uvol, 0, 8);
02024 TDataSet *m_Detectors = new TDataSet("Detectors"); AddConst(m_Detectors);
02025 for (Int_t ISET=1;ISET<=NSET;ISET++) {
02026 Int_t JS=z_lq[JSET-ISET];
02027 if (JS <= 0) continue;
02028 Int_t NDET=z_iq[JS-1];
02029 memcpy (Uset, &z_iq[JSET+ISET], 4);
02030 TDataSet *set = new TDataSet(Uset);
02031 m_Detectors->Add(set);
02032 for (Int_t IDET=1;IDET<=NDET;IDET++) {
02033 Int_t JD=z_lq[JS-IDET];
02034 if (JD <=0) continue;
02035 Int_t NV=z_iq[JD+2];
02036 Int_t NWHI=z_iq[JD+7];
02037 Int_t NWDI=z_iq[JD+8];
02038 memcpy (Udet, &z_iq[JS+IDET], 4);
02039 if (Debug()) {
02040 gMessMgr->QAInfo() << " Set " << Uset << " Detector " << Udet
02041 << " NV " << NV << " NWHI " << NWHI << " NWDI " << NWDI << endm;
02042 }
02043 Int_t JDU = z_lq[JD-3];
02044 Int_t ivd = 0;
02045 if (JDU > 0) {
02046 TDataSet *det = new TDataSet(Udet);
02047 set->Add(det);
02048 St_det_user *detu = new St_det_user("User",1); det->Add(detu);
02049 det_user_st rowU;
02050 Int_t i;
02051 rowU.i0 = (int) z_q[JDU+1];
02052 rowU.N = (int) z_q[JDU+2];
02053 rowU.i1 = (int) z_q[JDU+3];
02054 rowU.Nva = (int) z_q[JDU+4];
02055 rowU.i2 = (int) z_q[JDU+5];
02056 rowU.Nvb = (int) z_q[JDU+6];
02057 rowU.Goption = (int) z_q[JDU+7];
02058 rowU.Serial = (int) z_q[JDU+8];
02059 rowU.IdType = (int) z_q[JDU+9];
02060 rowU.Iprin = (int) z_q[JDU+10];
02061 detu->AddAt(&rowU);
02062 if (Debug()) {
02063 gMessMgr->QAInfo() << " displacement for hit description part = 10 " << rowU.i0 << endm;
02064 gMessMgr->QAInfo() << " Number of all hit descriptors (both in non- and cum. parts) " << rowU.N << endm;
02065 gMessMgr->QAInfo() << " displacement for volume description part=10+10*Nh " << rowU.i1 << endm;
02066 gMessMgr->QAInfo() << " Number of all volume descriptors (branching or not) " << rowU.Nva << endm;
02067 gMessMgr->QAInfo() << " displacement for the free space = 10+10*Nh+3*Nv " << rowU.i2 << endm;
02068 gMessMgr->QAInfo() << " number of real volume branchings for NUMBV " << rowU.Nvb << endm;
02069 gMessMgr->QAInfo() << " Hit option: 1 - single step, 4 - Calorimetry " << rowU.Goption << endm;
02070 gMessMgr->QAInfo() << " Valid serial number for this subset " << rowU.Serial << endm;
02071 gMessMgr->QAInfo() << " USER detector number " << rowU.IdType << endm;
02072 gMessMgr->QAInfo() << " current print flag both for HITS and DIGI " << rowU.Iprin << endm;
02073 }
02074 St_det_path *detuV = new St_det_path("Path",rowU.Nva);
02075 St_det_hit *detuH = new St_det_hit("Hit",rowU.N);
02076 det->Add(detuV);
02077 det->Add(detuH);
02078 det_path_st rowV;
02079 det_hit_st rowH;
02080 agfdig0(Uset,Udet,strlen(Uset),strlen(Udet));
02081 float hits[15],alim[15],blim[15],bin[15];
02082 memset (&hits[0],0,15*sizeof(float));
02083 memset (&alim[0],0,15*sizeof(float));
02084 memset (&blim[0],0,15*sizeof(float));
02085 memset (&bin[0] ,0,15*sizeof(float));
02086 const char chit[60]="";
02087 agfdpar(hits[0],chit,alim[0],blim[0],bin[0],4);
02088 for (i = 0; i < rowU.N; i++) {
02089 memset(&rowH,0,detuH->GetRowSize());
02090 Int_t j = JDU + rowU.i0 + 10*i;
02091
02092
02093 Char_t *HitName = acfromr(z_q[j+ 1]);
02094 memcpy (&rowH.hit[0], HitName, 4);
02095 delete [] HitName;
02096 rowH.option = (int) z_q[j+ 2];
02097 rowH.Nb = (int) z_q[j+ 3];
02098 rowH.Fmin = z_q[j+ 4];
02099 rowH.Fmax = z_q[j+ 5];
02100 rowH.Origin = z_q[j+ 6];
02101 rowH.Factor = z_q[j+ 7];
02102 rowH.Nbit = (int) z_q[j+ 8];
02103 rowH.Iext = (int) z_q[j+ 9];
02104 rowH.Ifun = (int) z_q[j+10];
02105
02106
02107
02108 if (Debug()) {
02109 if (! i)
02110 gMessMgr->QAInfo() << "\thit \toption \tNb \tFmin \tFmax \tOrigin \tFactor \tNbit \tIext \tIfun" << endm;
02111 gMessMgr->QAInfo() << "\t" << setw(4) << rowH.hit
02112 << "\t" << rowH.option
02113 << "\t" << rowH.Nb
02114 << "\t" << rowH.Fmin
02115 << "\t" << rowH.Fmax
02116 << "\t" << rowH.Origin
02117 << "\t" << rowH.Factor
02118 << "\t" << rowH.Nbit
02119 << "\t" << rowH.Iext
02120 << "\t" << rowH.Ifun
02121 << endm;
02122 }
02123 detuH->AddAt(&rowH);
02124 }
02125 if (Debug()) detuH->Print(0,rowU.N);
02126 for (i = rowU.i1; i < rowU.i2; i += 3) {
02127 memset(&rowV,0,detuV->GetRowSize());
02128 Int_t j = JDU+i;
02129 Int_t iv = (int) z_q[j+1];
02130 rowV.Ncopy = (int) z_q[j+2];
02131 Int_t Nam = (int) z_iq[clink->jvolum+iv];
02132 rowV.Nb = (int) z_q[j+3];
02133 memcpy (&rowV.VName[0], &Nam, 4);
02134 Char_t Udvol[] = " ";
02135 if (rowV.Nb > 0) {
02136 Int_t Namd = (int) z_iq[JD+2*ivd+11]; ivd++;
02137 memcpy (Udvol, &Namd, 4);
02138 }
02139 if (Debug()) {
02140 gMessMgr->QAInfo() << "\t" << setw(4) << rowV.VName << "/" << Udvol
02141 << "\t" << rowV.Ncopy << "\t" << rowV.Nb << endm;
02142 }
02143 detuV->AddAt(&rowV);
02144 }
02145 if (Debug()) {
02146 for (; ivd<NV; ivd++) {
02147 Int_t Namd = (int) z_iq[JD+2*ivd+11]; ivd++;
02148 Char_t Udvol[] = " ";
02149 memcpy (Udvol, &Namd, 4);
02150 gMessMgr->QAInfo() << "\t" << " " << "/" << Udvol << endm;
02151 }
02152 Int_t n = detuV->GetNRows();
02153 detuV->Print(0,n);
02154 }
02155 }
02156 }
02157 }
02158 return kStOK;
02159 }
02160 #ifdef DetectorIndex
02161
02162 void St_geant_Maker::DetSetIndex() {
02163 TString vers = mInitialization;
02164 vers.ReplaceAll("detp geometry ","");
02165 gMessMgr->QAInfo() << "St_geant_Maker::DetSetIndex for geometry version " << vers << endm;
02166 Int_t JSET = clink->jset;
02167 if (JSET <= 0) return;
02168 Int_t NSET=z_iq[JSET-1];
02169 Char_t Uset[5], Udet[5], Uvol[5];
02170 memset (Uset, 0, 5);
02171 memset (Udet, 0, 5);
02172 memset (Uvol, 0, 5);
02173 for (Int_t ISET=1;ISET<=NSET;ISET++) {
02174 Int_t JS=z_lq[JSET-ISET];
02175 if (JS <= 0) continue;
02176 Int_t NDET=z_iq[JS-1];
02177 memcpy (Uset, &z_iq[JSET+ISET], 4);
02178 TString set(Uset);
02179 set.ToLower();
02180 for (Int_t IDET=1;IDET<=NDET;IDET++) {
02181 Int_t JD=z_lq[JS-IDET];
02182 if (JD <=0) continue;
02183 memcpy (Udet, &z_iq[JS+IDET], 4);
02184 agfdig0(Uset,Udet,strlen(Uset),strlen(Udet));
02185 Int_t JDU = z_lq[JD-3];
02186 if (JDU > 0) {
02187 Int_t i1 = (int) z_q[JDU+3];
02188 Int_t i2 = (int) z_q[JDU+5];
02189 Int_t Nva = (int) z_q[JDU+4];
02190 Int_t Nvb = (int) z_q[JDU+6];
02191 gMessMgr->QAInfo() << " Set " << Uset << " Detector " << Udet << "\tNva = " << Nva << "\tNvb = " << Nvb << endm;
02192 TArrayI NVmax(Nvb);
02193 Int_t ivv = 0;
02194 TString fmt("");
02195 for (Int_t i = i1; i < i2; i += 3) {
02196 Int_t j = JDU+i;
02197 Int_t iv = (int) z_q[j+1];
02198 Int_t Ncopy = (int) z_q[j+2];
02199 Int_t Nam = (int) z_iq[clink->jvolum+iv];
02200 Int_t Nb = (int) z_q[j+3];
02201 memcpy (&Uvol[0], &Nam, 4);
02202
02203 fmt += "/";
02204 fmt += Uvol;
02205 if (Nb <= 0) fmt += "_1";
02206 else {NVmax[ivv] = Ncopy; ivv++; fmt += "_%d";}
02207 }
02208 TString CSYS("");
02209 TString Vol(Uvol);
02210 for (Int_t i = 0; i < NoDetectors; i++)
02211 if (TString(Detectors[i].det) == Vol && TString(Detectors[i].set) != "") {
02212 CSYS = Detectors[i].Csys;
02213 break;
02214 }
02215 if (CSYS == "") {
02216 TArrayI Ids0;
02217 DumpIndex(Uvol, vers, fmt, NVmax, Ids0);
02218 continue;
02219 }
02220 Int_t Nelem = 1;
02221 gMessMgr->QAInfo() << "format: " << fmt << endm;
02222 gMessMgr->QAInfo() << "NVmax";
02223 for (Int_t i = 0; i < Nvb; i++) {Nelem *= NVmax[i]; gMessMgr->QAInfo() << "[" << NVmax[i] << "]";}
02224 gMessMgr->QAInfo() << endm;
02225 Int_t numbv[15];
02226 memset (numbv, 0, 15*sizeof(Int_t));
02227 TArrayI Ids(Nelem);
02228 for (Int_t elem = 0; elem < Nelem; elem++) {
02229 Int_t e = elem;
02230 for (Int_t i = Nvb-1; i >= 0; i--) {
02231 numbv[i] = e%NVmax[i] + 1;
02232 e = e/NVmax[i];
02233 }
02234
02235 Int_t volid = G2t_volume_id(CSYS.Data(), numbv);
02236 if (volid < 0) volid = 0;
02237 Ids[elem] = volid;
02238 }
02239 DumpIndex(Uvol, vers, fmt, NVmax, Ids);
02240 }
02241 }
02242 }
02243 return;
02244 }
02245
02246 void St_geant_Maker::DumpIndex(const Char_t *name, const Char_t *vers, const Char_t *fmt, TArrayI &NVmax, TArrayI &Ids) {
02247
02248 TString fOut(name);
02249 fOut += ".";
02250 fOut += vers;
02251 fOut += ".C";
02252 ofstream out;
02253 gMessMgr->QAInfo() << "Create " << fOut << endm;
02254 out.open(fOut.Data());
02255 out << "TDataSet *CreateTable() {" << endl;
02256 out << " if (!gROOT->GetClass(\"StarVMCDetector\")) return 0;" << endl;
02257 Int_t NV = NVmax.GetSize();
02258 Int_t Nelem = Ids.GetSize();
02259 if (NV > 0) {
02260 out << " Int_t NVmax[" << NV << "] = {";
02261 for (Int_t i = 0; i < NV; i++) {
02262 out << NVmax[i];
02263 if (i < NV - 1) out << ",";
02264 else out << "};";
02265 }
02266 out << endl;
02267
02268 if (Nelem > 0) {
02269 out << " Int_t Ids[" << Nelem << "] = {" << endl;
02270 out << "\t";
02271 Int_t nn = 20;
02272 if (Ids[0] > 0 && TMath::Log10(Ids[0]) > 7) nn = 10;
02273 Int_t nvl = NVmax[NV-1];
02274 if (nvl > 5 && nvl < nn) nn = NVmax[NV-1];
02275 if (nn >= nvl) nvl = Nelem;
02276 Int_t j = 0;
02277 for (Int_t i = 0; i < Nelem; i++) {
02278 out << Ids[i];
02279 j++;
02280 if (i < Nelem - 1) {
02281 out << ",";
02282 if (j % nn == 0 || (i+1) % nvl == 0) {out << endl; out << "\t"; j = 0;}
02283 }
02284 else out << "};";
02285 }
02286 out << endl;
02287 }
02288 }
02289 out << " StarVMCDetector *Set = new StarVMCDetector(\"" << name << "\");" << endl;
02290 if (NV > 0) {
02291 out << " Set->SetNVmax(" << NV << ", NVmax);" << endl;
02292 if (Nelem > 0) out << " Set->SetIds(" << Nelem << ", Ids);" << endl;
02293 else out << " Set->SetIds();" << endl;
02294 }
02295 out << " Set->SetFMT(\"" << fmt << "\");" << endl;
02296 out << " return (TDataSet *)Set;" << endl;
02297 out << "}" << endl;
02298 out.close();
02299 }
02300 #endif
02301
02302 void dstkine() {
02303 St_geant_Maker::instance()->KinematicsFromMuDst();
02304 }
02305
02306 Int_t St_geant_Maker::SetDatimeFromMuDst() {
02307 KinematicsFromMuDst(1);
02308 return kStOK;
02309 }
02310
02311 Int_t St_geant_Maker::KinematicsFromMuDst(Int_t flag) {
02312 TTreeIter &muDstIter = *MuDstIter;
02313 static const Int_t*& MuEvent_mEventInfo_mRunId = muDstIter("MuEvent.mEventInfo.mRunId");
02314 static const Int_t*& MuEvent_mEventInfo_mId = muDstIter("MuEvent.mEventInfo.mId");
02315 static const Int_t*& MuEvent_mEventInfo_mTime = muDstIter("MuEvent.mEventInfo.mTime");
02316 static const Int_t*& MuEvent_mEventSummary_mNumberOfTracks = muDstIter("MuEvent.mEventSummary.mNumberOfTracks");
02317 static const Int_t& NoPrimaryVertices = muDstIter("PrimaryVertices");
02318 static const Float_t*& PrimaryVertices_mPosition_mX1 = muDstIter("PrimaryVertices.mPosition.mX1");
02319 static const Float_t*& PrimaryVertices_mPosition_mX2 = muDstIter("PrimaryVertices.mPosition.mX2");
02320 static const Float_t*& PrimaryVertices_mPosition_mX3 = muDstIter("PrimaryVertices.mPosition.mX3");
02321 static const Int_t& NoPrimaryTracks = muDstIter("PrimaryTracks");
02322 static const Int_t*& PrimaryTracks_mIndex2Global = muDstIter("PrimaryTracks.mIndex2Global");
02323 static const Int_t*& PrimaryTracks_mVertexIndex = muDstIter("PrimaryTracks.mVertexIndex");
02324 static const Float_t*& PrimaryTracks_mP_mX1 = muDstIter("PrimaryTracks.mP.mX1");
02325 static const Float_t*& PrimaryTracks_mP_mX2 = muDstIter("PrimaryTracks.mP.mX2");
02326 static const Float_t*& PrimaryTracks_mP_mX3 = muDstIter("PrimaryTracks.mP.mX3");
02327 static const Short_t*& PrimaryTracks_mHelix_mQ = muDstIter("PrimaryTracks.mHelix.mQ");
02328 static const Int_t*& PrimaryTracks_mNSigmaElectron = muDstIter("PrimaryTracks.mNSigmaElectron");
02329 static const Int_t*& PrimaryTracks_mNSigmaPion = muDstIter("PrimaryTracks.mNSigmaPion");
02330 static const Int_t*& PrimaryTracks_mNSigmaKaon = muDstIter("PrimaryTracks.mNSigmaKaon");
02331 static const Int_t*& PrimaryTracks_mNSigmaProton = muDstIter("PrimaryTracks.mNSigmaProton");
02332 static const Short_t*& GlobalTracks_mFlag = muDstIter("GlobalTracks.mFlag");
02333 #define __USE_GLOBAL__
02334 #ifdef __USE_GLOBAL__
02335 static const Int_t& NoGlobalTracks = muDstIter("GlobalTracks");
02336 static const Float_t*& GlobalTracks_mP_mX1 = muDstIter("GlobalTracks.mP.mX1");
02337 static const Float_t*& GlobalTracks_mP_mX2 = muDstIter("GlobalTracks.mP.mX2");
02338 static const Float_t*& GlobalTracks_mP_mX3 = muDstIter("GlobalTracks.mP.mX3");
02339 static const Short_t*& GlobalTracks_mHelix_mQ = muDstIter("GlobalTracks.mHelix.mQ");
02340 static const Float_t*& GlobalTracks_mFirstPoint_mX1 = muDstIter("GlobalTracks.mFirstPoint.mX1");
02341 static const Float_t*& GlobalTracks_mFirstPoint_mX2 = muDstIter("GlobalTracks.mFirstPoint.mX2");
02342 static const Float_t*& GlobalTracks_mFirstPoint_mX3 = muDstIter("GlobalTracks.mFirstPoint.mX3");
02343 static const Int_t*& GlobalTracks_mNSigmaElectron = muDstIter("GlobalTracks.mNSigmaElectron");
02344 static const Int_t*& GlobalTracks_mNSigmaPion = muDstIter("GlobalTracks.mNSigmaPion");
02345 static const Int_t*& GlobalTracks_mNSigmaKaon = muDstIter("GlobalTracks.mNSigmaKaon");
02346 static const Int_t*& GlobalTracks_mNSigmaProton = muDstIter("GlobalTracks.mNSigmaProton");
02347 #endif
02348 static const Double_t __SIGMA_SCALE__ = 1000.;
02349 static Int_t flagS = -1;
02350 if (flagS != 1) {
02351 flagS = flag;
02352 do {
02353 if (! MuDstIter->Next()) {return kStEOF;}
02354 Int_t id, it;
02355 TUnixTime ut(MuEvent_mEventInfo_mTime[0]); ut.GetGTime(id,it);
02356 fEvtHddr = (StEvtHddr*)GetDataSet("EvtHddr");
02357 if (!fEvtHddr) {
02358 fEvtHddr = new StEvtHddr(m_ConstSet);
02359 SetOutput(fEvtHddr);
02360 }
02361 fEvtHddr->SetDateTime(id,it);
02362 fEvtHddr->SetRunNumber(MuEvent_mEventInfo_mRunId[0]);
02363 fEvtHddr->SetEventNumber(MuEvent_mEventInfo_mId[0]);
02364 if (! MuEvent_mEventSummary_mNumberOfTracks[0]) continue;
02365 break;
02366 } while (1);
02367 if (flagS == 1) return kStOK;
02368 }
02369 flagS = flag;
02370 Float_t v[3];
02371 Float_t plab[3];
02372 Int_t nvtx;
02373 Int_t ipart;
02374 static Int_t pId[4][2] = {
02375 { 2, 3},
02376 {11,12},
02377 {14,15},
02378 { 8, 9}
02379 };
02380 for (Int_t l = 0; l < NoPrimaryVertices; l++) {
02381 v[0] = PrimaryVertices_mPosition_mX1[l];
02382 v[1] = PrimaryVertices_mPosition_mX2[l];
02383 v[2] = PrimaryVertices_mPosition_mX3[l];
02384 nvtx = geant3->Gsvert(v, 0, 0);
02385 assert(nvtx == l+1);
02386 for (Int_t k = 0; k < NoPrimaryTracks; k++) {
02387 if (l != PrimaryTracks_mVertexIndex[k]) continue;
02388 Int_t kg = PrimaryTracks_mIndex2Global[k];
02389 if (GlobalTracks_mFlag[kg] < 100) continue;
02390 plab[0] = PrimaryTracks_mP_mX1[k];
02391 plab[1] = PrimaryTracks_mP_mX2[k];
02392 plab[2] = PrimaryTracks_mP_mX3[k];
02393 #ifndef __MUONS__
02394 Double_t nSigma[4] = {
02395 PrimaryTracks_mNSigmaElectron[k]/__SIGMA_SCALE__,
02396 PrimaryTracks_mNSigmaKaon[k]/__SIGMA_SCALE__,
02397 PrimaryTracks_mNSigmaProton[k]/__SIGMA_SCALE__,
02398 PrimaryTracks_mNSigmaPion[k]/__SIGMA_SCALE__};
02399 Int_t s = 0;
02400 if (PrimaryTracks_mHelix_mQ[k] < 0) s = 1;
02401 ipart = pId[3][s];
02402 Double_t nSigmaMin = 1e9;
02403 for (Int_t i = 0; i < 4; i++) {
02404 if (TMath::Abs(nSigma[i]) < nSigmaMin) {
02405 nSigmaMin = TMath::Abs(nSigma[i]);
02406 ipart = pId[i][s];
02407 }
02408 }
02409 if (nSigmaMin > 2) ipart = pId[3][s];
02410 #else
02411 ipart = 5;
02412 if (PrimaryTracks_mHelix_mQ[k] < 0) ipart = 6;
02413 #endif
02414 geant3->Gskine(plab, ipart, nvtx);
02415 }
02416 }
02417 #ifdef __USE_GLOBAL__
02418 for (Int_t kg = 0; kg < NoGlobalTracks; kg++) {
02419 if (GlobalTracks_mFlag[kg] < 100) continue;
02420 Double_t nSigmaMin = 1e9;
02421 Double_t nSigma[4] = {
02422 GlobalTracks_mNSigmaElectron[kg]/__SIGMA_SCALE__,
02423 GlobalTracks_mNSigmaKaon[kg]/__SIGMA_SCALE__,
02424 GlobalTracks_mNSigmaProton[kg]/__SIGMA_SCALE__,
02425 GlobalTracks_mNSigmaPion[kg]/__SIGMA_SCALE__};
02426 Int_t s = 0;
02427 if (GlobalTracks_mHelix_mQ[kg] < 0) s = 1;
02428 for (Int_t k = 0; k < NoPrimaryTracks; k++) {
02429 if (kg == PrimaryTracks_mIndex2Global[k]) {
02430 goto NEXTGL;
02431 }
02432 }
02433 v[0] = GlobalTracks_mFirstPoint_mX1[kg];
02434 v[1] = GlobalTracks_mFirstPoint_mX2[kg];
02435 v[2] = GlobalTracks_mFirstPoint_mX3[kg];
02436 nvtx = geant3->Gsvert(v, 0, 0);
02437 plab[0] = GlobalTracks_mP_mX1[kg];
02438 plab[1] = GlobalTracks_mP_mX2[kg];
02439 plab[2] = GlobalTracks_mP_mX3[kg];
02440 ipart = pId[3][s];
02441 for (Int_t i = 0; i < 4; i++) {
02442 if (TMath::Abs(nSigma[i]) < nSigmaMin) {
02443 nSigmaMin = TMath::Abs(nSigma[i]);
02444 ipart = pId[i][s];
02445 }
02446 }
02447 if (nSigmaMin > 2) ipart = pId[3][s];
02448 geant3->Gskine(plab, ipart, nvtx);
02449 NEXTGL: continue;
02450 }
02451 #endif
02452 if (Debug()) {
02453 Do("gprint vert");
02454 Do("gprint kine");
02455 }
02456 return kStOK;
02457 }
02458