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