St_geant_Maker/St_geant_Maker.cxx

00001 // $Id: St_geant_Maker.cxx,v 1.123 2008/10/28 22:28:34 perev Exp $ 00002 // $Log: St_geant_Maker.cxx,v $ 00003 // Revision 1.123 2008/10/28 22:28:34 perev 00004 // FGZD hits added 00005 // 00006 // Revision 1.122 2008/10/21 18:02:50 perev 00007 // FGSC==>FGZC its division, Wei-Ming 00008 // 00009 // Revision 1.121 2008/07/30 15:04:35 fisyak 00010 // Remove custom SetDebug, fix bug #1252 00011 // 00012 // Revision 1.120 2008/06/12 20:35:27 fisyak 00013 // Move creation of TGiant from ctor to Init 00014 // 00015 // Revision 1.119 2007/07/12 20:34:02 fisyak 00016 // use StarLogger 00017 // 00018 // Revision 1.118 2007/05/10 19:15:29 potekhin 00019 // Improved handling of the Pythia event header translation, 00020 // replaced a print statement with a logger call, plus 00021 // a few cosmetic changes 00022 // 00023 // Revision 1.117 2007/04/28 17:56:12 perev 00024 // Redundant StChain.h removed 00025 // 00026 // Revision 1.116 2007/04/26 15:51:31 fisyak 00027 // Move creation of TGiant3 in ctor (fix byg 942) 00028 // 00029 // Revision 1.115 2007/04/26 04:18:27 perev 00030 // Remove StBFChain dependency 00031 // 00032 // Revision 1.114 2007/03/07 16:46:04 fine 00033 // Add the warning 00034 // 00035 // Revision 1.113 2007/03/03 02:30:50 fine 00036 // fix the geometry file name. Thanks P.Nebski 00037 // 00038 // Revision 1.112 2007/03/03 00:35:42 fine 00039 // Fix the leak of the ROOT objects and introduce the method to return the source code filename for the arbitrary geometry node 00040 // 00041 // Revision 1.111 2006/10/31 23:54:13 potekhin 00042 // Corrected a typo in the GEMB hit readout -- credit goes to Ross Corliss 00043 // 00044 // Revision 1.110 2006/10/17 19:24:30 fisyak 00045 // Mode initialization after open input fz-file 00046 // 00047 // Revision 1.109 2006/09/22 21:27:51 potekhin 00048 // Added readout of hits for two R&D detectors, 00049 // GEM and HPD 00050 // 00051 // Revision 1.108 2006/06/19 23:26:03 potekhin 00052 // Need the correct handle on the IDT hits, 00053 // the previous tags were obsolete 00054 // 00055 // Revision 1.107 2005/11/22 23:13:24 fisyak 00056 // Add default kinematics if there is no input fiels and if maker is active 00057 // 00058 // Revision 1.106 2005/10/12 22:58:56 fisyak 00059 // SetDateTime from fz-file if it was not set before 00060 // 00061 // Revision 1.105 2005/10/06 19:23:07 fisyak 00062 // Add set date/time from fz-file 00063 // 00064 // Revision 1.104 2005/08/29 21:47:09 fisyak 00065 // Changes for VMC 00066 // 00067 // Revision 1.103 2005/06/30 22:47:40 potekhin 00068 // Adding the previosuly missing g2t_igt_hit header. 00069 // 00070 // Revision 1.102 2005/06/30 22:32:56 potekhin 00071 // Included the newly developed Inner GEM tracker 00072 // (fresh R&D by Gerrit and Nikolai), and also 00073 // improved debug print statemetns in a few 00074 // newer detectors 00075 // 00076 // Revision 1.101 2005/04/26 23:40:18 potekhin 00077 // As Lilian pointed out, we need to treat the SSD hits separately 00078 // from the SVT in the newer versions of the geometry (we decoupled 00079 // those a while ago). 00080 // 00081 // To this end, we use two separate variables for the number of 00082 // detected hits, and place them into corresponding tables. 00083 // 00084 // Revision 1.100 2005/04/18 23:27:18 potekhin 00085 // Correct the name for the FGT (GEM) hits 00086 // 00087 // Revision 1.99 2005/04/15 14:52:37 potekhin 00088 // Adding an interface for reading the FGT (GEM) hits 00089 // 00090 // Revision 1.98 2005/04/13 22:27:11 fisyak 00091 // Add Hit description extractor (AgstHits) 00092 // 00093 // Revision 1.97 2005/03/23 21:56:30 potekhin 00094 // Added the latest Kai's code for reading hits 00095 // from the IST and FST tables 00096 // 00097 // Revision 1.96 2005/02/07 21:09:20 fisyak 00098 // rename antique TGeant3 to TGiant3 00099 // 00100 // Revision 1.95 2004/11/24 04:09:42 jeromel 00101 // Loss of one GtHash object per call fixed 00102 // 00103 // Revision 1.94 2004/08/05 16:40:12 potekhin 00104 // Propagating Pythia event characterization data 00105 // 00106 // Revision 1.93 2004/07/30 00:29:54 potekhin 00107 // Fixed an old indexing typo 00108 // 00109 // Revision 1.92 2004/03/16 18:37:49 potekhin 00110 // Corrected a typo that caused an out-of-bounds 00111 // array error. 00112 // 00113 // Revision 1.91 2004/03/01 17:29:54 fisyak 00114 // switch to starsim 00115 // 00116 // Revision 1.89 2004/02/25 17:55:05 fine 00117 // An extra protection against of crash with gGeometry == 0 00118 // 00119 // Revision 1.88 2004/02/24 17:16:44 fisyak 00120 // remove creation of empty fVolume 00121 // 00122 // Revision 1.87 2004/02/10 23:16:34 potekhin 00123 // First version of Ag2Geom 00124 // 00125 // Revision 1.86 2003/11/12 22:44:26 potekhin 00126 // Kill a stray debug print statement 00127 // 00128 // Revision 1.85 2003/10/31 23:12:13 potekhin 00129 // Added a piece of code to handle the pixel detector hits. 00130 // Reformatted a few lines and changed some comments. 00131 // 00132 // Revision 1.84 2003/10/02 00:13:03 potekhin 00133 // Added the handling of the gdat structure, for now being 00134 // written into runco are. may want to later augment this 00135 // so that it gets into geant.root file. 00136 // 00137 // Revision 1.83 2003/09/02 17:59:29 perev 00138 // gcc 3.2 updates + WarnOff 00139 // 00140 // Revision 1.82 2003/05/14 22:54:23 potekhin 00141 // Fixing the incompatibilities gradually accumulated, in the 00142 // part that reads and propagates the event header info. 00143 // In particular, the pseudoparticle codes were incorrect. 00144 // FIll the header based on the parsed event record. 00145 // 00146 // Revision 1.81 2003/05/01 20:48:56 jeromel 00147 // This one is ugly ... But needed for root transition again. 00148 // 00149 // Revision 1.80 2003/04/30 20:39:19 perev 00150 // Warnings cleanup. Modified lines marked VP 00151 // 00152 // Revision 1.79 2003/04/18 15:53:26 geurts 00153 // Code added for TOFr (tfr) tables. 00154 // 00155 // Revision 1.78 2002/11/28 02:35:53 jeromel 00156 // Minor correction 00157 // 00158 // Revision 1.77 2002/11/27 21:54:32 potekhin 00159 // Added new naming convention in ESM 00160 // 00161 // Revision 1.76 2002/11/01 03:17:41 fine 00162 // the previous version has been restored. No need of the special flag 00163 // 00164 // Revision 1.74 2002/10/16 20:39:23 kopytin 00165 // Added code to read out BBC GSTAR tables. Needed by StBbcSimulationMaker 00166 // 00167 // Revision 1.72 2002/06/17 16:12:43 perev 00168 // fix wrong geant time 00169 // 00170 // Revision 1.71 2002/04/14 21:57:09 perev 00171 // Obsolete StBroadcast 00172 // 00173 // Revision 1.70 2002/03/12 21:22:38 fisyak 00174 // Set only one StEvtHddr as default option (due to Embedding) 00175 // 00176 // Revision 1.69 2001/11/18 00:58:14 perev 00177 // 00178 // Revision 1.68 2001/07/06 17:34:24 nevski 00179 // type fixed 00180 // 00181 // Revision 1.67 2001/07/03 23:37:25 nevski 00182 // forward pion detector added 00183 // 00184 // Revision 1.66 2001/07/03 15:51:48 nevski 00185 // phmd added 00186 // 00187 // Revision 1.65 2001/06/01 03:03:57 perev 00188 // overloaded GetDataSet -> FindDataSet 00189 // 00190 // Revision 1.64 2000/12/19 18:35:11 fisyak 00191 // make proper allocation for cgnam 00192 // 00193 // Revision 1.63 2000/07/19 16:57:34 fisyak 00194 // Protection against double resetting the same run no. (Sasha) 00195 // 00196 // Revision 1.62 2000/06/23 16:52:12 fisyak 00197 // Add filling of Run/Event no./Type from geant 00198 // 00199 // Revision 1.61 2000/03/26 02:43:22 fine 00200 // adjusted to ROOT 2.24 00201 // 00202 // Revision 1.60 2000/03/03 22:00:53 nevski 00203 // protection against bad track number 00204 // 00205 // Revision 1.59 2000/03/03 20:53:48 nevski 00206 // add protection against corrupted Itrac 00207 // 00208 // Revision 1.58 2000/02/29 22:25:52 lasiuk 00209 // added FREO and QUAR to Rich hits 00210 // 00211 // Revision 1.57 2000/02/03 19:34:40 fisyak 00212 // Clean up St_geant_Maker::Init, move its parameters to ctor 00213 // 00214 // Revision 1.56 2000/02/03 16:14:39 fisyak 00215 // Add Kathy's histograms 00216 // 00217 // Revision 1.55 2000/02/02 21:21:19 fisyak 00218 // Hack for CC5 00219 // 00220 // Revision 1.54 2000/01/23 19:20:53 nevski 00221 // pseudo-doc 00222 // 00223 // Revision 1.53 2000/01/14 23:43:54 fisyak 00224 // Add missing defines 00225 // 00226 // Revision 1.52 2000/01/04 21:51:11 fisyak 00227 // Move TGiant3 to root4star 00228 // 00229 // Revision 1.51 1999/12/07 15:44:25 fisyak 00230 // Add geane, new TGiant3 from Alice 00231 // 00232 // Revision 1.50 1999/11/13 17:30:05 fine 00233 // scope for i within for loop fixed 00234 // 00235 // Revision 1.49 1999/11/13 02:40:55 fisyak 00236 // Add gclose 00237 // 00238 // Revision 1.48 1999/11/11 05:16:30 fine 00239 // GetDataSet method has been introduced to build GEANT geometry on fly 00240 // 00241 // Revision 1.47 1999/11/06 23:05:01 fisyak 00242 // fix chars 00243 // 00244 // Revision 1.46 1999/10/20 19:18:17 nevski 00245 // g2t_event table filled 00246 // 00247 // Revision 1.45 1999/09/24 01:23:42 fisyak 00248 // Reduced Include Path 00249 // 00250 // Revision 1.44 1999/07/14 16:47:44 fisyak 00251 // Set protection against empty event 00252 // 00253 // Revision 1.43 1999/07/09 02:18:03 fisyak 00254 // Add Skip 00255 // 00256 // Revision 1.42 1999/07/09 01:15:48 fisyak 00257 // Remove non printing character from generator type 00258 // 00259 // Revision 1.41 1999/07/03 22:40:11 fine 00260 // St_geant_Maker::Work - workaround of LINUX compiler problem 00261 // 00262 // Revision 1.40 1999/04/30 15:17:03 perev 00263 // SetOutput added to announce Geometry exists 00264 // 00265 // Revision 1.39 1999/04/29 19:29:27 nevski 00266 // SetInputFile returns status 00267 // 00268 // Revision 1.38 1999/04/20 21:40:17 nevski 00269 // all shapes are going via Victors hash 00270 // 00271 // Revision 1.37 1999/04/19 06:29:30 nevski 00272 // update of user parameter extraction 00273 // 00274 // Revision 1.36 1999/04/19 06:25:35 nevski 00275 // update of user parameter extraction 00276 // 00277 // Revision 1.35 1999/04/15 20:36:40 fine 00278 // St_geant::Work() was void becomes TVolume * 00279 // 00280 // Revision 1.34 1999/04/12 23:17:11 fine 00281 // Unique postion ID has been introduced 00282 // 00283 // Revision 1.33 1999/04/09 23:52:48 nevski 00284 // checking 3 volume parameters now 00285 // 00286 // Revision 1.32 1999/04/08 00:39:08 fine 00287 // Work metod - workaround for ROOT bug PCON definition 00288 // 00289 // Revision 1.31 1999/04/07 12:59:45 fine 00290 // Fixed bug for PCON and PGON shapes 00291 // 00292 // Revision 1.30 1999/04/06 19:40:08 nevski 00293 // variable size volumes 00294 // 00295 // Revision 1.29 1999/03/22 14:45:23 nevski 00296 // geometry tree corrected 00297 // 00298 // Revision 1.28 1999/03/20 22:43:05 perev 00299 // Do(trig) 00300 // 00301 // Revision 1.27 1999/03/11 00:15:22 perev 00302 // St_geant_Maker in new maker schema 00303 // 00304 // Revision 1.26 1999/03/04 19:32:16 nevski 00305 // esm/eem corrected 00306 // 00307 // Revision 1.25 1999/02/24 17:12:27 fine 00308 // St_Table::New has been activated 00309 // 00310 // Revision 1.24 1999/02/23 18:59:50 nevski 00311 // SVT 4th layer added to svt hit table 00312 // 00313 // Revision 1.23 1999/02/22 23:55:57 fine 00314 // St_geant_Maker::rootmaptable is prepaed to use St_TableNew(), not activated yet 00315 // 00316 // Revision 1.22 1999/02/22 20:51:25 fisyak 00317 // Mismatch between ctb/tof 00318 // 00319 // Revision 1.21 1999/02/22 19:27:20 fisyak 00320 // add gtrigi and gtigc 00321 // 00322 // Revision 1.20 1999/02/20 20:23:45 fisyak 00323 // Fix Aeast 00324 // 00325 // Revision 1.18 1999/02/19 14:41:00 fisyak 00326 // Set kIsNotOwn Bit for geometry tables 00327 // 00328 // Revision 1.17 1999/02/18 15:44:47 fisyak 00329 // Cleanup warinings 00330 // 00331 // Revision 1.16 1999/02/17 22:42:07 fisyak 00332 // fix Linux parameters 00333 // 00334 // Revision 1.15 1999/02/17 15:55:38 fisyak 00335 // Add GSTAR to ROOT geometry tables transformation 00336 // 00337 // Revision 1.14 1999/02/16 18:15:45 fisyak 00338 // Check in the latest updates to fix them 00339 // 00340 // Revision 1.13 1999/02/12 17:57:01 nevski 00341 // particle table 00342 // 00343 // Revision 1.12 1999/02/12 14:18:27 nevski 00344 // merging 2 mods 00345 // 00346 // Revision 1.5 1999/01/10 20:37:31 fisyak 00347 // Give access to Zebra 00348 // 00349 // Revision 1.4 1999/01/05 01:37:02 fisyak 00350 // Intermeidate version with TVolume 00351 // 00352 // Revision 1.3 1999/01/03 20:56:35 fisyak 00353 // Remove St_geom_Maker 00354 // 00355 // Revision 1.7 1998/12/25 21:02:13 nevski 00356 // Add Set/Get method 00357 // 00358 // Revision 1.6 1998/12/17 14:38:00 fisyak 00359 // Change default to no Higz window 00360 // 00361 // Revision 1.5 1998/12/16 20:56:24 fisyak 00362 // Add gstar to ROOT 00363 // 00364 // Revision 1.4 1998/12/12 00:21:15 fisyak 00365 // Remove gstar for the moment 00366 // 00367 // Revision 1.3 1998/12/12 00:18:00 fisyak 00368 // Remove gstar for the moment 00369 // 00370 // Revision 1.2 1998/12/04 19:36:47 fisyak 00371 // Add Pavel/Ruben gstar interface 00372 // 00373 // Revision 1.1 1998/10/31 00:28:31 fisyak 00374 // Makers take care about branches 00375 // 00376 // Revision 1.6 1998/10/06 18:00:29 perev 00377 // cleanup 00378 // 00379 // Revision 1.5 1998/10/02 13:46:08 fine 00380 // DataSet->DataSetIter 00381 // 00382 // Revision 1.4 1998/08/14 15:25:58 fisyak 00383 // add options 00384 // 00385 // Revision 1.3 1998/08/10 02:32:07 fisyak 00386 // Clean up 00387 // 00388 // Revision 1.2 1998/07/20 15:08:15 fisyak 00389 // Add tcl and tpt 00390 // 00392 // // 00393 // St_geant_Maker class for Makers // 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 // #include "THYPE.h" 00428 #include "TGTRA.h" 00429 #include "TCTUB.h" 00430 // new Geometry 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 //#include "tables/St_g2t_run_Table.h" 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 // event header: 00459 #include "g2t/St_g2t_get_event_Module.h" 00460 // Pythia-specific header 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 // Subsystems: 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, /* addres of external routine */ 00529 int *narg, /* number of arguments */ 00530 ...); /* other narg arguments */ 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 * Input : ILK - Link number : 1 = primary, 2 = secondary (obsolete) * 00546 * IDE - ID of event in gate ( ZEBRA IDN) * 00547 * Output: NPART - Number of particles in event record * 00548 * IRUN - run number as recorded by generator * 00549 * IEVT - event number as recorded by generator * 00550 * CGNAM - generator name * 00551 * VERT(4)- x,y,z,t of event (metres,seconds or mm,mm/c) * 00552 * IWTFL - weight flag * 00553 * WEIGH - event weight * 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); //Declare this "geom" for output 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 // Remove hall from the list of ROOT nodes to make it free of ROOT control 00637 listOfVolume->Remove(fVolume); 00638 listOfVolume->Remove(fVolume); 00639 } 00640 // Add "hall" into ".const" area of this maker 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 // Check the local path first 00648 TFileSet *geoDir = new TFileSet(file.Data()); 00649 if (!geoDir->FindByName("geometry.g")) { 00650 // Try the global one 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 // Initialize GEANT 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 != "") {//check that first word contains .fz then add "gfile p" 00700 // -"- .nt then add "user/input user" 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(); // Create Histograms 00733 if (m_Mode%100 != 1 && IsActive() ) { // Mixer mode == 1 or reco - do not modify EvtHddr and MagF 00734 fEvtHddr = (StEvtHddr*)GetDataSet("EvtHddr"); 00735 if (!fEvtHddr) { // Standalone run 00736 fEvtHddr = new StEvtHddr(m_ConstSet); 00737 fEvtHddr->SetRunNumber(1); // to have run positive and < 1000000 (to avoid mess with RunLog) 00738 SetOutput(fEvtHddr); //Declare this "EvtHddr" for output 00739 } 00740 if (! ifz ) { 00741 // if Simulation is read from zebra file set Scale to value got from the file 00742 // if Simulation is done on fly use mFieldOpt field option set by StBFChain 00743 // if data use Scale for Db unless it has been reset by StBFChain field option (in IsActive) 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 {// set mag. field from already simulated data, only 5 option allowed 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 // Kinematics 00803 if (fInputFile == "" && IsActive()) {// default 00804 Do("subevent 0;"); 00805 // gkine #particles partid ptrange yrange phirange vertexrange 00806 Do("gkine 80 6 1. 1. -4. 4. 0 6.28 0. 0.;"); 00807 Do("mode g2tm prin 1;"); 00808 // Do("next;"); 00809 // Do("dcut cave z 1 10 10 0.03 0.03;"); 00810 if ((m_Mode/1000)%10 == 1) {// phys_off 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"); // no fluctuations 00823 // Do("LOSS 1"); // with delta electron above dcute 00824 Do("DRAY 0"); 00825 Do("MULS 0"); 00826 Do("STRA 0"); 00827 // CUTS CUTGAM CUTELE CUTHAD CUTNEU CUTMUO BCUTE BCUTM DCUTE DCUTM PPCUTM TOFMAX GCUTS[5] 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) {/*touch*/}; 00847 Do("trig"); 00848 00849 // check EoF 00850 if (cquest->iquest[0]) {return kStEOF;} 00851 Int_t Nwhead,Ihead[100]; 00852 Int_t Nwbuf; 00853 Float_t Ubuf[100]; 00854 00855 // prepare an empty g2t_event 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 // 20030508 --max-- found a bug: 9999999 00883 // "istat==10" on the following line, changing to >=11 00884 // This "if should now work with both "old" and "new" ntuple conventions 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 // Obsoleted: --max-- 00894 // fEvtHddr->SetGenerType((int)p->phep[2]); 00895 // Int_t west = (int)p->phep[4]; 00896 // Int_t east = (int)(1000.*p->phep[4]-1000.*((float)west)); 00897 // fEvtHddr->SetAWest(west); 00898 // fEvtHddr->SetAEast(east); 00899 00900 // Update the run number, if necessary 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) { // means there was Pythia information detected in the input, see g2t_get_event code 00938 St_g2t_pythia *g2t_pythia = new St_g2t_pythia("g2t_pythia",1); // prepare an empty g2t_pythia 00939 m_DataSet->Add(g2t_pythia); 00940 gMessMgr->Info() << "Pythia event header captured" << endm; 00941 iRes = g2t_get_pythia(g2t_pythia); 00942 } 00943 00944 // --max-- Filling the event header, addition due to the new coding 00945 if(fEvtHddr) { 00946 fEvtHddr->SetAEast((*g2t_event)[0].n_wounded_east); 00947 fEvtHddr->SetAWest((*g2t_event)[0].n_wounded_west); 00948 } 00949 //---------------------- inner part -------------------------// 00950 00951 // Note that we treat the SSD (or SISD as we call it in geo) on 00952 // the same basis as the SVT, which applies since we decoupled 00953 // the two detectors 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 // gMessMgr->QAInfo() << nhit1 << " " << nhit2 << " " << nhit3 << " " << nhit4 << endm; 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 //---------------------- calorimeters -------------------------// 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 //------------------------all bloody detectors done--------------------// 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 // Fill Histograms 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 // make geant3 volume 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 // case HYPE: t = new THYPE((Char_t *) name->Data(),"HYPE",(Char_t *) Astring.Data(), 01375 // p->par[0],p->par[1],p->par[2],p->par[3]); 01376 // break; 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 // default: t = new TBRIK((Char_t *) name->Data(),"BRIK",(Char_t *) Astring.Data(), 01388 // p->par[0],p->par[1],p->par[2]); 01389 // break; 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 // Move the becoming obsolete ROOT representations if any 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 // Int_t node = 0; 01434 // TVolume *volume=0; 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 // while(agvolume(node,volu,position,mother,who,copy,p,npar)) { 01449 // while(agvolume(&node,&volu,&position,&mother,&who,&copy,&p,&npar)) { 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 // Int_t medium = (Int_t) volu[3]; 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 { // printf(" creating object %s %f %f %f \n", name,p[0],p[1],p[2]); 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", // take care ! 01493 p[0],p[1],p[2],p[3],p[4],p[5],p[6]); break; 01494 // p[1],p[2],p[3],p[4],p[0],p[5],p[6]); break; 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 // this is because of a compiler bug on Linux (VF 030699) 01507 // (( TPGON*)t)->DefineSection(i,*pp++,*pp++,*pp++); 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 // this is because of a compiler bug on Linux (VF 030699) 01518 // ((TPCON *)t)->DefineSection(i,*pp++,*pp++,*pp++); 01519 } 01520 } break; 01521 case ELTU: t=new TELTU(nick,"ELTU","void", 01522 p[0],p[1],p[2]); break; 01523 // case HYPE: t=new THYPE(nick,"HYPE","void", 01524 // p[0],p[1],p[2],p[3]); break; 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 // to build a compressed tree, name should be checked for repetition 01537 newVolume = new TVolume(name,nick,t); 01538 // newVolume -> SetVisibility(ENodeSEEN(MapGEANT2StNodeVis(att[1]))); 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 // volume = newVolume; 01550 node = newVolume; 01551 }; 01552 01553 // fVolume=volume; 01554 // gGeometry->GetListOfNodes()->Add(volume); 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 // Find the source code defining the "volumeName" GEANT volume 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 // construct the source code pattern 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 // make the path up 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 // Use St_Table::New(...) when it is available as follows: 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 &copy,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 // Move the becoming obsolete ROOT representations if any 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 // Do("make geometry"); 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 // gMessMgr->QAInfo() << " St_geant_Maker::FillHist - Will now fill histograms! " << endm; 01820 01821 01822 // get geant event vertex 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; //,nm; 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], // A 01906 (Double_t) z_q[jma+7], // A 01907 (Double_t) z_q[jma+8]); // Density 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], // A 01920 z_q[jmixt+nm+im], // Z 01921 z_q[jmixt+2*nm+im]); // W 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(), // name 01936 itmed, // numed 01937 imat, // imat 01938 (Int_t) z_q[jtm+7], // ISVOL 01939 (Int_t) z_q[jtm+8], // IFIELD 01940 (Double_t) z_q[jtm+9], // FIELDM 01941 (Double_t) z_q[jtm+10], // TMAXFD 01942 (Double_t) z_q[jtm+11], // STEMAX 01943 (Double_t) z_q[jtm+12], // DEEMAX 01944 (Double_t) z_q[jtm+13], // EPSIL 01945 (Double_t) z_q[jtm+14]);// STMIN 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,&copy,&params,&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 // get materials 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) { //new nick: 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]); // SEEN 02076 newVolume->SetLineColor((int) att[4]); // COLO 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) { // taken from starsim/agzio/agfinfo.age 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 // TRegexp separator(";"); 02172 while ( ( begin < C.Length()) && (index != kNPOS) ) { 02173 // index = C.Index(separator,&end, begin); 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) {// 'TYPE' 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 // gMessMgr->QAInfo() << "i\t" << i << "\tj\t" << j << "\tk\t" << k << "\t" << charm[i] << endm; 02240 } 02241 // gMessMgr->QAInfo() << charm << endm; 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 // Int_t Nam = (int) z_q[j+ 1];// encoded hit name in Display code 02323 // memcpy (&rowH.hit[0], &chit[4*i], 4); 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];// encoded hit option (R-rounding,S-single step) 02328 rowH.Nb = (int) z_q[j+ 3];// number of bit requested 02329 rowH.Fmin = z_q[j+ 4];// hit low limit 02330 rowH.Fmax = z_q[j+ 5];// hit upper limit 02331 rowH.Origin = z_q[j+ 6];// Geant hit origin (-Fmin) 02332 rowH.Factor = z_q[j+ 7];// Geant packing factor 02333 rowH.Nbit = (int) z_q[j+ 8];// number of bit allocated 02334 rowH.Iext = (int) z_q[j+ 9];// address of the Geant user step routine 02335 rowH.Ifun = (int) z_q[j+10];// hit function code (1-18 at present) 02336 // Case IC of ( X Y Z R RR PHI THET ETA TDR CP _ 02337 // U V W ETOT ELOS BIRK STEP LGAM TOF USER _ 02338 // XX YY ZZ PX PY PZ SLEN PTOT LPTO rese ) 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 //<< "/" << alim[i] 02346 << "\t" << rowH.Fmax //<< "/" << blim[i] 02347 << "\t" << rowH.Origin 02348 << "\t" << rowH.Factor //<< "/" << bin[i] 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 // gMessMgr->QAInfo() << Uvol << " copy " << Ncopy << " bits " << Nb << endm; 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 // Int_t volid = G2t_volume_id(set.Data(), numbv); 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

Generated on Sun Mar 15 04:51:03 2009 for StRoot by doxygen 1.3.7