tpmt broken by OpticksCSG enum move ====================================== * shape/operator enum unification to use sysrap/OpticksCSG.{h,py} is incomplete * tpmt broken due to mis-interpretation of part buffer Vague recollections --------------------- * GCSG not used for raytrace ? It exists just to allow Geant4 CSG re-creation of geometry ? 2017-10-20 tpmt-- broken (again) : QUALITATIVELY FIXED ----------------------------------------------------------- 1. Following some effort to clean up GGeoTest::makePmtInBox still finding failure symptom that the raytrace of the PMT is missing. 2. Also wierd container box distortion, possible bad bbox ? This turns out to be too tight a far causing clipping. 3. Found the default apmtidx of 0 loads analytic PMT with old enum codes, created a new one in slot 2. TODO: commit fixed analytic PMT into opticksdata slot 0 once this issue is resolved 4. Found that the GParts from the loaded PMT was not getting combined with the container. After fixing that get OptiX hard crash at launch, forcing reboot. To just do init and avoid crash do:: tpmt-;tpmt-- -PV ## --nopropagate --noviz Cause of crash was omitting GParts::setPartList for the combi GParts, so a PartList was being interpreted as a NodeTree. 5. Now get a raytrace, but with a z-slipped dynode : two relative positions wrong. Fixed : posXYZ applied at physvol level were not getting linked thru to the primitives. Slice testing to isolate z-offset part ----------------------------------------------- Formation 4-4-2-1-1-(1) slicing prim by prim :: tpmt-;tpmt-- --apmtslice 0:4 (4) tpmt-;tpmt-- --apmtslice 4:8 (4) # expected PMT shape # near scan cutting into cylinder : not dark on inside ? tpmt-;tpmt-- --apmtslice 3:4 # just the tubs : open shape (!) bright on inside ? # TODO: use CSG tubs with partlist ? tpmt-;tpmt-- --apmtslice 8:10 (2) # just cathode # GPmtTest --apmtidx 2 --apmtslice 8:10 tpmt-;tpmt-- --apmtslice 10:11 (1) # z-shifted # hemisphere missing transform # GPmtTest --apmtidx 2 --apmtslice 10:11 tpmt-;tpmt-- --apmtslice 11:12 (1) # z-shifted # tubs missing transform : its looks symetrical in z # GPmtTest --apmtidx 2 --apmtslice 11:12 :: GPmtTest --apmtidx 2 --apmtslice 10:11 2017-10-21 18:23:51.168 INFO [64542] [GParts::dump@1380] GParts::dump ni 1 lim 20 ulim 1 0.0000 0.0000 0.0000 98.0000 0.0000 0.0000 123 <-bnd 0 <-INDEX bn OpaqueVacuum///Vacuum -97.1514 -97.1514 -98.0000 5 (sphere) TYPECODE 97.1514 97.1514 -12.8687 3 (nodeIndex) :: GPmtTest --apmtidx 2 --apmtslice 11:12 ... 2017-10-21 18:18:34.213 INFO [63388] [GParts::dump@1380] GParts::dump ni 1 lim 20 ulim 1 0.0000 0.0000 0.0000 27.5000 166.0000 0.0000 30 <-bnd 0 <-INDEX bn Vacuum///OpaqueVacuum -27.5000 -27.5000 -83.0000 11 (tubs) TYPECODE 27.5000 27.5000 83.0000 4 (nodeIndex) FIXED : two physvol offsets not being honoured -------------------------------------------------- :: 105 106 108 109 110 111 113 114 GPU dumping : note parallelised shuffle -------------------------------------------- * suspect the part to prim assoc for primIdx 0 wrong... :: ## intersect_analytic.cu:bounds buffer sizes pts: 13 pln: 0 trs: 0 // primIdx: 0 p: 0 bnd: 27 typ: 5 pt.q2.f ( -101.1682 -101.1682 -23.8382 0.0000 ) pt.q3.f ( 101.1682 101.1682 56.0000 0.0000 ) // primIdx: 1 p: 0 bnd:124 typ: 5 pt.q2.f ( -98.1428 -98.1428 56.0000 0.0000 ) pt.q3.f ( 98.1428 98.1428 98.0465 0.0000 ) // primIdx: 2 p: 0 bnd:125 typ: 5 pt.q2.f ( -98.0932 -98.0932 55.9934 0.0000 ) pt.q3.f ( 98.0932 98.0932 98.0128 0.0000 ) // primIdx: 3 p: 0 bnd: 30 typ: 11 pt.q2.f ( -27.5000 -27.5000 -83.0000 0.0000 ) pt.q3.f ( 27.5000 27.5000 83.0000 0.0000 ) // primIdx: 4 p: 0 bnd:127 typ: 6 pt.q2.f ( -400.0100 -400.0100 -400.0100 0.0000 ) pt.q3.f ( 400.0100 400.0100 400.0100 0.0000 ) // primIdx: 0 p: 1 bnd: 27 typ: 5 pt.q2.f ( -101.1682 -101.1682 56.0000 0.0000 ) pt.q3.f ( 101.1682 101.1682 100.0698 0.0000 ) // primIdx: 1 p: 1 bnd:124 typ: 5 pt.q2.f ( -82.2854 -82.2854 98.0465 0.0000 ) pt.q3.f ( 82.2854 82.2854 128.0000 0.0000 ) // primIdx: 2 p: 1 bnd:126 typ: 5 pt.q2.f ( -97.1514 -97.1514 -98.0000 0.0000 ) pt.q3.f ( 97.1514 97.1514 -12.8687 0.0000 ) // primIdx: 0 p: 2 bnd: 27 typ: 5 pt.q2.f ( -84.5402 -84.5402 100.0698 0.0000 ) pt.q3.f ( 84.5402 84.5402 131.0000 0.0000 ) // primIdx: 1 p: 2 bnd: 28 typ: 11 pt.q2.f ( -39.2500 -39.2500 -164.5000 0.0000 ) pt.q3.f ( 39.2500 39.2500 -21.8869 0.0000 ) // primIdx: 0 p: 3 bnd: 27 typ: 11 pt.q2.f ( -42.2500 -42.2500 -169.0000 0.0000 ) pt.q3.f ( 42.2500 42.2500 -23.8382 0.0000 ) // primIdx: 1 p: 3 bnd:125 typ: 5 pt.q2.f ( -82.2478 -82.2478 98.0128 0.0000 ) pt.q3.f ( 82.2478 82.2478 127.9500 0.0000 ) // primIdx: 0 p: 4 bnd:123 typ: 5 pt.q2.f ( -98.1428 -98.1428 -21.8869 0.0000 ) pt.q3.f ( 98.1428 98.1428 56.0000 0.0000 ) // manually unshuffled ## intersect_analytic.cu:bounds buffer sizes pts: 13 pln: 0 trs: 0 // primIdx: 0 p: 0 bnd: 27 typ: 5 pt.q2.f ( -101.1682 -101.1682 -23.8382 0.0000 ) pt.q3.f ( 101.1682 101.1682 56.0000 0.0000 ) // primIdx: 0 p: 1 bnd: 27 typ: 5 pt.q2.f ( -101.1682 -101.1682 56.0000 0.0000 ) pt.q3.f ( 101.1682 101.1682 100.0698 0.0000 ) // primIdx: 0 p: 2 bnd: 27 typ: 5 pt.q2.f ( -84.5402 -84.5402 100.0698 0.0000 ) pt.q3.f ( 84.5402 84.5402 131.0000 0.0000 ) // primIdx: 0 p: 3 bnd: 27 typ: 11 pt.q2.f ( -42.2500 -42.2500 -169.0000 0.0000 ) pt.q3.f ( 42.2500 42.2500 -23.8382 0.0000 ) // primIdx: 0 p: 4 bnd:123 typ: 5 pt.q2.f ( -98.1428 -98.1428 -21.8869 0.0000 ) pt.q3.f ( 98.1428 98.1428 56.0000 0.0000 ) ^^^^^^^^^^ // primIdx: 1 p: 0 bnd:124 typ: 5 pt.q2.f ( -98.1428 -98.1428 56.0000 0.0000 ) pt.q3.f ( 98.1428 98.1428 98.0465 0.0000 ) // primIdx: 1 p: 1 bnd:124 typ: 5 pt.q2.f ( -82.2854 -82.2854 98.0465 0.0000 ) pt.q3.f ( 82.2854 82.2854 128.0000 0.0000 ) // primIdx: 1 p: 2 bnd: 28 typ: 11 pt.q2.f ( -39.2500 -39.2500 -164.5000 0.0000 ) pt.q3.f ( 39.2500 39.2500 -21.8869 0.0000 ) // primIdx: 1 p: 3 bnd:125 typ: 5 pt.q2.f ( -82.2478 -82.2478 98.0128 0.0000 ) pt.q3.f ( 82.2478 82.2478 127.9500 0.0000 ) // primIdx: 2 p: 0 bnd:125 typ: 5 pt.q2.f ( -98.0932 -98.0932 55.9934 0.0000 ) pt.q3.f ( 98.0932 98.0932 98.0128 0.0000 ) // primIdx: 2 p: 1 bnd:126 typ: 5 pt.q2.f ( -97.1514 -97.1514 -98.0000 0.0000 ) pt.q3.f ( 97.1514 97.1514 -12.8687 0.0000 ) // primIdx: 3 p: 0 bnd: 30 typ: 11 pt.q2.f ( -27.5000 -27.5000 -83.0000 0.0000 ) pt.q3.f ( 27.5000 27.5000 83.0000 0.0000 ) // primIdx: 4 p: 0 bnd:127 typ: 6 pt.q2.f ( -400.0100 -400.0100 -400.0100 0.0000 ) pt.q3.f ( 400.0100 400.0100 400.0100 0.0000 ) // intersect_analytic.cu:bounds primIdx 0 primFlag 100 partOffset 0 numParts 5 min -101.1682 -101.1682 -169.0000 max 101.1682 101.1682 131.0000 // intersect_analytic.cu:bounds primIdx 1 primFlag 100 partOffset 5 numParts 4 min -98.1428 -98.1428 -164.5000 max 98.1428 98.1428 128.0000 // intersect_analytic.cu:bounds primIdx 2 primFlag 100 partOffset 9 numParts 2 min -98.0932 -98.0932 -98.0000 max 98.0932 98.0932 98.0128 // intersect_analytic.cu:bounds primIdx 3 primFlag 100 partOffset 11 numParts 1 min -27.5000 -27.5000 -83.0000 max 27.5000 27.5000 83.0000 // intersect_analytic.cu:bounds primIdx 4 primFlag 100 partOffset 12 numParts 1 min -400.0100 -400.0100 -400.0100 max 400.0100 400.0100 400.0100 Expecting 4 not 5 parts for 1st:: 2017-10-21 16:39:52.022 INFO [34449] [GParts::dumpPrimInfo@1135] OGeo::makeAnalyticGeometry --dbganalytic (part_offset, parts_for_prim, tran_offset, plan_offset) numPrim: 5 ulim: 5 2017-10-21 16:39:52.022 INFO [34449] [GParts::dumpPrimInfo@1146] ( 0 -5 0 0) 2017-10-21 16:39:52.022 INFO [34449] [GParts::dumpPrimInfo@1146] ( 5 -4 0 0) 2017-10-21 16:39:52.022 INFO [34449] [GParts::dumpPrimInfo@1146] ( 9 -2 0 0) 2017-10-21 16:39:52.022 INFO [34449] [GParts::dumpPrimInfo@1146] ( 11 -1 0 0) 2017-10-21 16:39:52.022 INFO [34449] [GParts::dumpPrimInfo@1146] ( 12 -1 0 0) 2017-10-21 16:39:52.022 INFO [34449] [GParts::dump@1380] GParts::dump ni 13 lim 10 ulim 10 :: GPmtTest --apmtidx 2 // 4-4-2-1-1 ... so combination is incorrectly adding to 1st prim Yep fixed by setNodeIndex for the container GParts. old overview -------------- * DONE: old PMT serialization needs to be rebuilt with new unified enum * rebuilt analytic PMT and stored into opticksdata with non-default apmtidx slot 1 (not committed) 2017-10-20 issue : boundaries not getting into the GParts ? ------------------------------------------------------------ * seems the bndspec is OK, but this is not being treated as the input ? Instead the bnd in the .npy which are all zero is the input. * just need to GParts::close in order to registerBoundaries :: simon:opticks blyth$ cat /usr/local/opticks/opticksdata/export/DayaBay/GPmt/0/GPmt_boundaries.txt CONTAINING_MATERIAL///Pyrex CONTAINING_MATERIAL///Pyrex CONTAINING_MATERIAL///Pyrex CONTAINING_MATERIAL///Pyrex Pyrex///OpaqueVacuum Pyrex/SENSOR_SURFACE//Bialkali Pyrex/SENSOR_SURFACE//Bialkali Pyrex///Vacuum Bialkali///Vacuum Bialkali///Vacuum OpaqueVacuum///Vacuum Vacuum///OpaqueVacuum :: tpmt-;tpmt-- -PV # just init for debug 2017-10-20 18:22:21.843 INFO [627696] [GGeoTest::createPmtInBox@293] GGeoTest::createPmtInBox spec Rock/NONE/perfectAbsorbSurface/MineralOil container_inner_material MineralOil 2017-10-20 18:22:21.845 INFO [627696] [GPmt::dump@167] GGeoTest::loadPmt (GPmt)pmt --dbganalytic m_index 0 m_path /usr/local/opticks/opticksdata/export/DayaBay/GPmt/0 m_parts 0x7f98c5ccc180 m_csg 0x7f98c5ccb990 m_bndlib 0x7f98c3e049d0 2017-10-20 18:22:21.845 INFO [627696] [GParts::Summary@1120] GGeoTest::loadPmt (GParts)pts --dbganalytic num_parts 12 num_prim 0 part 0 : node 0 type 1 boundary [ 0] Vacuum///Vacuum part 1 : node 0 type 1 boundary [ 0] Vacuum///Vacuum part 2 : node 0 type 1 boundary [ 0] Vacuum///Vacuum part 3 : node 0 type 2 boundary [ 0] Vacuum///Vacuum part 4 : node 1 type 1 boundary [ 0] Vacuum///Vacuum part 5 : node 1 type 1 boundary [ 0] Vacuum///Vacuum part 6 : node 1 type 1 boundary [ 0] Vacuum///Vacuum part 7 : node 1 type 2 boundary [ 0] Vacuum///Vacuum part 8 : node 2 type 1 boundary [ 0] Vacuum///Vacuum part 9 : node 2 type 1 boundary [ 0] Vacuum///Vacuum part 10 : node 3 type 1 boundary [ 0] Vacuum///Vacuum part 11 : node 4 type 2 boundary [ 0] Vacuum///Vacuum 2017-10-20 18:22:21.845 INFO [627696] [*GMergedMesh::combine@138] GMergedMesh::combine making new mesh index 0 solids 1 verbosity 3 2017-10-20 18:22:21.845 INFO [627696] [GSolid::Dump@204] GMergedMesh::combine (source solids) numSolid 1 GPmtTest # shows same issue ... Review NCSG::Deserialize boundary handling --------------------------------------------- * In tboolean- the boundary strings are planted in the python, which get serialized into the csg.txt :: cat /tmp/blyth/opticks/tboolean-torus--/csg.txt Rock//perfectAbsorbSurface/Vacuum Vacuum///GlassSchottF2 * each NCSG tree has only a single boundary spec string which gets set in NCSG::Deserialize :: 1153 int NCSG::Deserialize(const char* basedir, std::vector& trees, int verbosity ) 1154 { .... 1157 std::string txtpath = BFile::FormPath(basedir, FILENAME) ; .... 1166 NTxt bnd(txtpath.c_str()); 1167 bnd.read(); 1169 1170 unsigned nbnd = bnd.getNumLines(); .... 1181 // order is reversed so that a tree with the "container" meta data tag at tree slot 0 1182 // is handled last, so container_bb will then have been adjusted to hold all the others... 1183 // allowing the auto-bbox setting of the container 1184 1185 for(unsigned j=0 ; j < nbnd ; j++) 1186 { 1187 unsigned i = nbnd - 1 - j ; 1188 std::string treedir = BFile::FormPath(basedir, BStr::itoa(i)); 1189 1190 NCSG* tree = new NCSG(treedir.c_str()); 1191 tree->setIndex(i); 1192 tree->setVerbosity( verbosity ); 1193 tree->setBoundary( bnd.getLine(i) ); :: 165 GParts* GParts::make( NCSG* tree, const char* spec, unsigned verbosity ) 166 { 167 assert(spec); 168 ... 238 // GParts originally intended to handle lists of parts each of which 239 // must have an associated boundary spec. When holding CSG trees there 240 // is really only a need for a single common boundary, but for 241 // now enable reuse of the old GParts by duplicating the spec 242 // for every node of the tree 243 244 const char* reldir = "" ; // empty reldir avoids defaulting to GItemList 245 246 GItemList* lspec = GItemList::Repeat("GParts", spec, ni, reldir) ; 247 248 GParts* pts = new GParts(nodebuf, tranbuf, planbuf, lspec) ; 249 250 //pts->setTypeCode(0u, root->type); //no need, slot 0 is the root node where the type came from 251 return pts ; 252 } * hmm does GParts::close translate the spec into boundary int and write into partBuffer ? YEP : void GParts::registerBoundaries() // convert boundary spec names into integer codes using bndlib :: 200 RT_PROGRAM void intersect(int primIdx) 201 { 202 const Prim& prim = primBuffer[primIdx]; 203 204 unsigned partOffset = prim.partOffset() ; 205 unsigned numParts = prim.numParts() ; 206 unsigned primFlag = prim.primFlag() ; 207 208 uint4 identity = identityBuffer[instance_index] ; 209 210 211 if(primFlag == CSG_FLAGNODETREE) 212 { 213 Part pt0 = partBuffer[partOffset + 0] ; 214 215 identity.z = pt0.boundary() ; // replace placeholder zero with test analytic geometry root node boundary 216 217 evaluative_csg( prim, identity ); 218 //intersect_csg( prim, identity ); 219 220 } 221 else if(primFlag == CSG_FLAGINVISIBLE) 222 { 223 // do nothing : report no intersections for primitives marked with primFlag CSG_FLAGINVISIBLE 224 } 225 #ifdef WITH_PARTLIST 226 else if(primFlag == CSG_FLAGPARTLIST) 227 { 228 for(unsigned int p=0 ; p < numParts ; p++) 229 { 230 Part pt = partBuffer[partOffset + p] ; 231 232 identity.z = pt.boundary() ; 233 revisit tpmt-- ---------------- The --apmtidx 1 option results in loading:: 2017-04-10 15:02:46.231 FATAL [50057] [GGeo::loadAnalyticPmt@733] GGeo::loadAnalyticPmt AnalyticPMTIndex 1 AnalyticPMTSlice ALL Path /usr/local/opticks/opticksdata/export/DayaBay/GPmt/1 :: 155 tpmt--(){ ... 176 177 local apmtidx=1 178 # non-default AnalyticPMTIndex currently required for updated enums ... 181 op.sh \ 182 --anakey $anakey \ 183 --save \ 184 --test --testconfig "$(tpmt-testconfig)" \ 185 --torch --torchconfig "$(tpmt-torchconfig)" \ 186 --cat $(tpmt-det) \ 187 --tag $tag \ 188 --timemax 10 \ 189 --animtimemax 10 \ 190 --eye 0.0,-0.5,0.0 \ 191 --geocenter \ 192 --apmtidx $apmtidx \ 193 $* 194 195 } root cause of difficulty -------------------------- * kludgy association of an old triangulated PMT with the analytic CSG one, actually it looks like there is one extra node in the triangulated ? * best solution would be to find a way to triangulate the CSG, so there would then be no solid/node matching problem * developing CSG to triangulation will take a while, so meanwhile just construct meshes using CSG bboxen ? See ggeo/test/GPmtTest.cc for start of this symptom3 : surface attachement failure ------------------------------------------ * see :doc:`geant4_opticks_integration/surlib_with_test_geometry` :: 2017-03-16 17:49:08.898 INFO [980504] [CTraverser::Traverse@128] CTraverser::Traverse DONE 2017-03-16 17:49:08.898 INFO [980504] [CTraverser::Summary@104] CDetector::traverse numMaterials 5 numMaterialsWithoutMPT 0 2017-03-16 17:49:08.898 INFO [980504] [CDetector::attachSurfaces@240] CDetector::attachSurfaces 2017-03-16 17:49:08.898 INFO [980504] [GSurLib::examineSolidBndSurfaces@115] GSurLib::examineSolidBndSurfaces numSolids 7 Assertion failed: (node == i), function examineSolidBndSurfaces, file /Users/blyth/opticks/ggeo/GSurLib.cc, line 124. Process 79145 stopped * thread #1: tid = 0xef618, 0x00007fff96f1a866 libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT frame #0: 0x00007fff96f1a866 libsystem_kernel.dylib`__pthread_kill + 10 libsystem_kernel.dylib`__pthread_kill + 10: -> 0x7fff96f1a866: jae 0x7fff96f1a870 ; __pthread_kill + 20 0x7fff96f1a868: movq %rax, %rdi 0x7fff96f1a86b: jmp 0x7fff96f17175 ; cerror_nocancel 0x7fff96f1a870: retq (lldb) bt * thread #1: tid = 0xef618, 0x00007fff96f1a866 libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT * frame #0: 0x00007fff96f1a866 libsystem_kernel.dylib`__pthread_kill + 10 frame #1: 0x00007fff8e5b735c libsystem_pthread.dylib`pthread_kill + 92 frame #2: 0x00007fff95307b1a libsystem_c.dylib`abort + 125 frame #3: 0x00007fff952d19bf libsystem_c.dylib`__assert_rtn + 321 frame #4: 0x0000000101ce0ac9 libGGeo.dylib`GSurLib::examineSolidBndSurfaces(this=0x000000010e21e4a0) + 521 at GSurLib.cc:124 frame #5: 0x0000000101ce08ad libGGeo.dylib`GSurLib::close(this=0x000000010e21e4a0) + 29 at GSurLib.cc:93 frame #6: 0x0000000103ee0497 libcfg4.dylib`CDetector::attachSurfaces(this=0x000000010e21e1c0) + 247 at CDetector.cc:244 frame #7: 0x0000000103e5ad26 libcfg4.dylib`CGeometry::init(this=0x000000010e21dc30) + 1446 at CGeometry.cc:73 frame #8: 0x0000000103e5a770 libcfg4.dylib`CGeometry::CGeometry(this=0x000000010e21dc30, hub=0x000000010980c7a0) + 112 at CGeometry.cc:39 frame #9: 0x0000000103e5ad8d libcfg4.dylib`CGeometry::CGeometry(this=0x000000010e21dc30, hub=0x000000010980c7a0) + 29 at CGeometry.cc:40 frame #10: 0x0000000103f01286 libcfg4.dylib`CG4::CG4(this=0x000000010cadeab0, hub=0x000000010980c7a0) + 214 at CG4.cc:122 frame #11: 0x0000000103f017bd libcfg4.dylib`CG4::CG4(this=0x000000010cadeab0, hub=0x000000010980c7a0) + 29 at CG4.cc:144 frame #12: 0x0000000103ff1da3 libokg4.dylib`OKG4Mgr::OKG4Mgr(this=0x00007fff5fbfe6b0, argc=23, argv=0x00007fff5fbfe790) + 547 at OKG4Mgr.cc:35 frame #13: 0x0000000103ff1ff3 libokg4.dylib`OKG4Mgr::OKG4Mgr(this=0x00007fff5fbfe6b0, argc=23, argv=0x00007fff5fbfe790) + 35 at OKG4Mgr.cc:41 frame #14: 0x00000001000139be OKG4Test`main(argc=23, argv=0x00007fff5fbfe790) + 1486 at OKG4Test.cc:56 frame #15: 0x00007fff9238d5fd libdyld.dylib`start + 1 (lldb) :: (lldb) f 7 frame #7: 0x0000000103e5ad26 libcfg4.dylib`CGeometry::init(this=0x000000010e21dc30) + 1446 at CGeometry.cc:73 70 detector = static_cast(new CGDMLDetector(m_hub, query)) ; 71 } 72 -> 73 detector->attachSurfaces(); 74 //m_csurlib->convert(detector); 75 76 m_detector = detector ; (lldb) symptom 2 : CPU/G4 cfg4/CTestDetector misunderstanding primordial CSG buffer ? ----------------------------------------------------------------------------------- * actually the PmtInBox code appears to be unaware of GCSG :: tpmt-- --okg4 2017-03-16 13:51:10.046 INFO [889146] [OpticksGen::targetGenstep@125] OpticksGen::targetGenstep setting frame 1 1.0000,0.0000,0.0000,0.0000 0.0000,1.0000,0.0000,0.0000 0.0000,0.0000,1.0000,0.0000 0.0000,0.0000,0.0000,1.0000 2017-03-16 13:51:10.047 FATAL [889146] [GenstepNPY::setPolarization@212] GenstepNPY::setPolarization pol 0.0000,0.0000,0.0000,0.0000 npol nan,nan,nan,nan m_polw nan,nan,nan,380.0000 2017-03-16 13:51:10.047 INFO [889146] [SLog::operator@15] OpticksHub::OpticksHub DONE ************************************************************* Geant4 version Name: geant4-10-02-patch-01 (26-February-2016) Copyright : Geant4 Collaboration Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* 2017-03-16 13:51:10.122 FATAL [889146] [CGeometry::init@59] CGeometry::init G4 simple test geometry 2017-03-16 13:51:10.122 INFO [889146] [GGeo::createSurLib@656] deferred creation of GSurLib 2017-03-16 13:51:10.122 INFO [889146] [GSurLib::collectSur@79] nsur 48 2017-03-16 13:51:10.122 INFO [889146] [CPropLib::init@68] CPropLib::init 2017-03-16 13:51:10.122 INFO [889146] [CPropLib::initCheckConstants@120] CPropLib::initCheckConstants mm 1 MeV 1 nanosecond 1 ns 1 nm 1e-06 GC::nanometer 1e-06 h_Planck 4.13567e-12 GC::h_Planck 4.13567e-12 c_light 299.792 GC::c_light 299.792 dscale 0.00123984 2017-03-16 13:51:10.122 INFO [889146] [*CTestDetector::makeDetector@118] CTestDetector::makeDetector PmtInBox 1 BoxInBox 0 numSolids (from mesh0) 7 numSolids (from config) 1 Assertion failed: (numSolids == numSolidsConfig), function makeDetector, file /Users/blyth/opticks/cfg4/CTestDetector.cc, line 127. /Users/blyth/opticks/bin/op.sh: line 580: 41465 Abort trap: 6 /usr/local/opticks/lib/OKG4Test --anakey tpmt --save --test --testconfig mode=PmtInBox_pmtpath=/usr/local/opticks/opticksdata/export/dpib/GMergedMesh/0_control=1,0,0,0_analytic=1_apmtidx=1_node=box_parameters=0,0,0,300_boundary=Rock/NONE/perfectAbsorbSurface/MineralOil --torch --torchconfig type=disc_photons=500000_wavelength=380_frame=1_source=0,0,300_target=0,0,0_radius=100_zenithazimuth=0,1,0,1_material=Vacuum_mode=_polarization= --cat PmtInBox --tag 10 --timemax 10 --animtimemax 10 --eye 0.0,-0.5,0.0 --geocenter --okg4 /Users/blyth/opticks/bin/op.sh RC 134 simon:opticks blyth$ 2017-03-16 14:17:21.209 INFO [901864] [CPropLib::initCheckConstants@120] CPropLib::initCheckConstants mm 1 MeV 1 nanosecond 1 ns 1 nm 1e-06 GC::nanometer 1e-06 h_Planck 4.13567e-12 GC::h_Planck 4.13567e-12 c_light 299.792 GC::c_light 299.792 dscale 0.00123984 2017-03-16 14:17:21.209 INFO [901864] [*CTestDetector::makeDetector@118] CTestDetector::makeDetector PmtInBox 1 BoxInBox 0 numSolidsMesh 7 numSolidsConfig 1 2017-03-16 14:17:21.209 INFO [901864] [GMergedMesh::dumpSolids@617] CTestDetector::makeDetector (solid count inconsistent) 0 ce gfloat4 0.000 0.000 0.000 300.000 bb bb min -300.000 -300.000 -300.000 max 300.000 300.000 300.000 ni( 0, 0, 0,4294967295) id( 0, 5, 0, 0) 1 ce gfloat4 0.000 0.000 -18.997 149.997 bb bb min -100.288 -100.288 -168.995 max 100.288 100.288 131.000 ni( 720, 362, 1, 0) id( 1, 4, 1, 0) 2 ce gfloat4 0.000 0.000 -18.247 146.247 bb bb min -97.288 -97.288 -164.495 max 97.288 97.288 128.000 ni( 720, 362, 2, 1) id( 2, 3, 2, 0) 3 ce gfloat4 0.005 0.004 91.998 98.143 bb bb min -98.138 -98.139 55.996 max 98.148 98.147 128.000 ni( 960, 482, 3, 2) id( 3, 0, 3, 0) 4 ce gfloat4 0.000 0.000 13.066 98.143 bb bb min -98.143 -98.143 -30.000 max 98.143 98.143 56.131 ni( 576, 288, 4, 2) id( 4, 1, 4, 0) 5 ce gfloat4 0.000 0.000 -81.500 83.000 bb bb min -27.500 -27.500 -164.500 max 27.500 27.500 1.500 ni( 96, 50, 5, 2) id( 5, 2, 4, 0) 6 ce gfloat4 0.000 0.000 0.000 300.000 bb bb min -300.000 -300.000 -300.000 max 300.000 300.000 300.000 ni( 12, 24, 0,4294967295) id( 0, 1000, 0, 0) Assertion failed: (numSolidsMesh == numSolidsConfig), function makeDetector, file /Users/blyth/opticks/cfg4/CTestDetector.cc, line 133. looks like okg4 not updated since primordial GCSG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Approach * make connection between the analytic GCSG volumes that CTestDetector::makePMT is going to use and the triangulated GMergedMesh solid count, then can update the assert * avoid duplicity regards the analytic PMT and honour the apmtidx version, by eliminating CPropLib::getPmtCSG :: simon:opticks blyth$ opticks-find getPmtCSG ./cfg4/CPropLib.cc:GCSG* CPropLib::getPmtCSG(NSlice* slice) ./cfg4/CPropLib.cc: LOG(error) << "CPropLib::getPmtCSG failed to load PMT" ; ./cfg4/CPropLib.cc: LOG(error) << "CPropLib::getPmtCSG failed to getCSG from GPmt" ; ./cfg4/CTestDetector.cc: GCSG* csg = m_mlib->getPmtCSG(slice); ./cfg4/CPropLib.hh: GCSG* getPmtCSG(NSlice* slice); 162 GCSG* CPropLib::getPmtCSG(NSlice* slice) 163 { 164 // hmm this is probably already loaded ??? 165 166 GPmt* pmt = GPmt::load( m_ok, m_bndlib, 0, slice ); // pmtIndex:0 167 168 if(pmt == NULL) 169 { 170 LOG(error) << "CPropLib::getPmtCSG failed to load PMT" ; 171 return NULL ; 172 } 173 174 GCSG* csg = pmt->getCSG(); 175 176 if(csg == NULL) 177 { 178 LOG(error) << "CPropLib::getPmtCSG failed to getCSG from GPmt" ; 179 return NULL ; 180 } 181 return csg ; 182 } FIXED : symptom 1, GPU side mis-interpreting parts buffer after enum change ----------------------------------------------------------------------------- :: tpmt-- 2017-03-15 20:48:44.712 INFO [829428] [OContext::close@219] OContext::close numEntryPoint 2 ##hemi-pmt.cu:bounds primIdx 0 is_partlist:0 min -101.1682 -101.1682 -23.8382 max 101.1682 101.1682 56.0000 ##hemi-pmt.cu:bounds primIdx 1 is_partlist:0 min -98.1428 -98.1428 56.0000 max 98.1428 98.1428 98.0465 ##hemi-pmt.cu:bounds primIdx 2 is_partlist:0 min -98.0932 -98.0932 55.9934 max 98.0932 98.0932 98.0128 ##hemi-pmt.cu:bounds primIdx 3 is_partlist:0 min -27.5000 -27.5000 -164.5000 max 27.5000 27.5000 1.5000 ##hemi-pmt.cu:bounds primIdx 4 is_partlist:0 min -300.0100 -300.0100 -300.0100 max 300.0100 300.0100 300.0100 2017-03-15 20:48:45.342 INFO [829428] [OPropagator::prelaunch@149] 1 : (0;500000,1) prelaunch_times vali,comp,prel,lnch 0.0000 0.2694 0.2364 0.0000 evaluative_csg primIdx_ 1 numParts 4 perfect tree fullHeight 4294967295 exceeds current limit evaluative_csg primIdx_ 1 numParts 4 perfect tree fullHeight 4294967295 exceeds current limit evaluative_csg primIdx_ 1 numParts 4 perfect tree fullHeight 4294967295 exceeds current limit evaluative_csg primIdx_ 1 numParts 4 perfect tree fullHeight 4294967295 exceeds current limit review of analytic PMT serialization -------------------------------------- * ana/pmt/analytic.py Recreate the analytic PMT from detdecs parse with :: pmt-analytic-tmp # writing to $TMP/GPmt/0/GPmt.npy pmt-analytic # writing to $IDPATH/GPmt/0/GPmt.npy Actual one in use is from opticksdata repo $OPTICKS_DATA/export/DayaBay/GPmt/0/ Comparing existing serializations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All three look effectively the same, with no influence from new enum so far:: simon:pmt blyth$ l /usr/local/opticks/opticksdata/export/DayaBay_VGDX_20140414-1300/g4_00.96ff965744a2f6b78c24e33c80d3a4cd.dae/GPmt/0/ total 48 -rw-r--r-- 1 blyth staff 848 Mar 15 16:27 GPmt.npy -rw-r--r-- 1 blyth staff 289 Mar 15 16:27 GPmt_boundaries.txt -rw-r--r-- 1 blyth staff 1168 Mar 15 16:27 GPmt_csg.npy -rw-r--r-- 1 blyth staff 74 Mar 15 16:27 GPmt_lvnames.txt -rw-r--r-- 1 blyth staff 47 Mar 15 16:27 GPmt_materials.txt -rw-r--r-- 1 blyth staff 74 Mar 15 16:27 GPmt_pvnames.txt simon:pmt blyth$ simon:pmt blyth$ simon:pmt blyth$ l $TMP/GPmt/0/ total 48 -rw-r--r-- 1 blyth wheel 848 Mar 15 17:31 GPmt.npy -rw-r--r-- 1 blyth wheel 289 Mar 15 17:31 GPmt_boundaries.txt -rw-r--r-- 1 blyth wheel 1168 Mar 15 17:31 GPmt_csg.npy -rw-r--r-- 1 blyth wheel 74 Mar 15 17:31 GPmt_lvnames.txt -rw-r--r-- 1 blyth wheel 47 Mar 15 17:31 GPmt_materials.txt -rw-r--r-- 1 blyth wheel 74 Mar 15 17:31 GPmt_pvnames.txt simon:pmt blyth$ diff -r --brief $IDPATH/GPmt/0 $TMP/GPmt/0 simon:pmt blyth$ simon:pmt blyth$ simon:pmt blyth$ l /usr/local/opticks/opticksdata/export/DayaBay/GPmt/0/ total 80 -rw-r--r-- 1 blyth staff 848 Jul 5 2016 GPmt.npy -rw-r--r-- 1 blyth staff 289 Jul 5 2016 GPmt.txt -rw-r--r-- 1 blyth staff 289 Jul 5 2016 GPmt_boundaries.txt -rw-r--r-- 1 blyth staff 848 Jul 5 2016 GPmt_check.npy -rw-r--r-- 1 blyth staff 289 Jul 5 2016 GPmt_check.txt -rw-r--r-- 1 blyth staff 1168 Jul 5 2016 GPmt_csg.npy -rw-r--r-- 1 blyth staff 47 Jul 5 2016 GPmt_csg.txt -rw-r--r-- 1 blyth staff 74 Jul 5 2016 GPmt_lvnames.txt -rw-r--r-- 1 blyth staff 47 Jul 5 2016 GPmt_materials.txt -rw-r--r-- 1 blyth staff 74 Jul 5 2016 GPmt_pvnames.txt simon:pmt blyth$ echo $OPTICKS_DATA /usr/local/opticks/opticksdata simon:pmt blyth$ simon:pmt blyth$ diff -r --brief $OPTICKS_DATA/export/DayaBay/GPmt/0/ $TMP/GPmt/0/ Only in /usr/local/opticks/opticksdata/export/DayaBay/GPmt/0/: GPmt.txt Only in /usr/local/opticks/opticksdata/export/DayaBay/GPmt/0/: GPmt_check.npy Only in /usr/local/opticks/opticksdata/export/DayaBay/GPmt/0/: GPmt_check.txt Only in /usr/local/opticks/opticksdata/export/DayaBay/GPmt/0/: GPmt_csg.txt