Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-10 07:50:29

0001 
0002 #include <csignal>
0003 #include "OPTICKS_LOG.hh"
0004 
0005 #include "spath.h"
0006 #include "ssys.h"
0007 
0008 #include "U4GDML.h"
0009 #include "U4Tree.h"
0010 
0011 
0012 const char* FOLD = spath::Resolve("$TMP/U4TreeTest"); 
0013 
0014 
0015 void test_saveload_get_children(const stree* tree0, const stree* tree1, int nidx )
0016 {
0017     std::vector<int> children0 ; 
0018     std::vector<int> children1 ; 
0019     tree0->get_children(children0, nidx); 
0020     tree1->get_children(children1, nidx); 
0021 
0022     if( nidx % 10000 == 0 )
0023     std::cout << " nidx " << nidx << " children " << stree::Desc(children0) << std::endl ; 
0024 
0025     assert( stree::Compare(children0, children1) == 0 ); 
0026 }
0027 void test_saveload_get_children(const stree* tree0, const stree* tree1)
0028 {
0029     std::cout << "[ test_saveload_get_children " << std::endl ; 
0030     assert( tree0->nds.size() == tree1->nds.size() ); 
0031     for(int nidx=0 ; nidx < int(tree0->nds.size()) ; nidx++)
0032         test_saveload_get_children(tree0, tree1, nidx ) ; 
0033     std::cout << "] test_saveload_get_children " << std::endl ; 
0034 }
0035 
0036 void test_saveload_get_progeny(const stree* tree0, const stree* tree1)
0037 {
0038     std::cout << "test_saveload_get_progeny_r " << std::endl ; 
0039     int nidx = 0 ; 
0040     std::vector<int> progeny0 ; 
0041     std::vector<int> progeny1 ; 
0042     tree0->get_progeny(progeny0, nidx); 
0043     tree1->get_progeny(progeny1, nidx); 
0044     assert( stree::Compare(progeny0, progeny1) == 0 ); 
0045     std::cout << " nidx " << nidx << " progeny " << stree::Desc(progeny0) << std::endl ; 
0046 }
0047 
0048 void test_saveload(const stree* st0)
0049 {
0050     std::cout << "[ st0.save " << std::endl ; 
0051     st0->save(FOLD); 
0052     std::cout << "] st0.save  " << st0->desc() << std::endl ; 
0053 
0054     stree st1 ; 
0055     std::cout << "[ st1.load " << std::endl ; 
0056     st1.load(FOLD);  
0057     std::cout << "] st1.load " << st1.desc() << std::endl ; 
0058 
0059     test_saveload_get_children(st0, &st1); 
0060     test_saveload_get_progeny( st0, &st1); 
0061 }
0062 
0063 void test_load(const char* fold)
0064 {
0065     stree st ;
0066     st.load(fold); 
0067     std::cout << "st.desc_sub" << std::endl << st.desc_sub() << std::endl ; 
0068 
0069     // see sysrap/tests/stree_test.cc for stree exercises 
0070 }
0071 
0072 
0073 void test_get_pv_0(const U4Tree* tree)
0074 {
0075     std::cout << "[ test_get_pv_0 " << std::endl ; 
0076     const stree* st = tree->st ; 
0077 
0078     const char* q_spec0 = ssys::getenvvar("SPEC0", "HamamatsuR12860sMask_virtual:0:0" ); 
0079     const char* q_spec1 = ssys::getenvvar("SPEC1", "HamamatsuR12860sMask_virtual:0:-1" );
0080 
0081     int nidx0 = st->find_lvid_node(q_spec0 );   
0082     int nidx1 = st->find_lvid_node(q_spec1 );   
0083 
0084     const G4VPhysicalVolume* const pv0_ = tree->get_pv(nidx0) ;  
0085     const G4VPhysicalVolume* const pv1_ = tree->get_pv(nidx1) ;  
0086 
0087     const G4PVPlacement* pv0 = dynamic_cast<const G4PVPlacement*>(pv0_) ; 
0088     const G4PVPlacement* pv1 = dynamic_cast<const G4PVPlacement*>(pv1_) ; 
0089 
0090     int nidx0_ = tree->get_nidx(pv0) ; 
0091     int nidx1_ = tree->get_nidx(pv1) ; 
0092 
0093     bool nidx0_expect = nidx0_ == nidx0 ;
0094     bool nidx1_expect = nidx1_ == nidx1 ;
0095 
0096     assert( nidx0_expect ); 
0097     assert( nidx1_expect ); 
0098 
0099     if(!nidx0_expect) std::raise(SIGINT); 
0100     if(!nidx1_expect) std::raise(SIGINT); 
0101 
0102     int cp0_ = pv0 ? pv0->GetCopyNo() : -1 ; 
0103     int cp1_ = pv1 ? pv1->GetCopyNo() : -1 ; 
0104 
0105     int cp0 = tree->get_pv_copyno(nidx0); 
0106     int cp1 = tree->get_pv_copyno(nidx1); 
0107 
0108     bool cp0_expect = cp0_ == cp0 ;
0109     bool cp1_expect = cp1_ == cp1 ;
0110 
0111     assert( cp0_expect ); 
0112     assert( cp1_expect ); 
0113 
0114     if(!cp0_expect) std::raise(SIGINT);
0115     if(!cp1_expect) std::raise(SIGINT);
0116 
0117     std::cout << " q_spec0 " << q_spec0 <<  " nidx0 " << nidx0 << " cp0 " << cp0 << std::endl ;  
0118     std::cout << " q_spec1 " << q_spec1 <<  " nidx1 " << nidx1 << " cp1 " << cp1 << std::endl ;  
0119     std::cout << "] test_get_pv_0 " << std::endl ; 
0120 }
0121 
0122 /**
0123 test_get_pv_1
0124 ---------------
0125 
0126 Note the irregularity in copyno increments from how the different types of 
0127 PMTs are distributed::
0128 
0129     [ test_get_pv_1 
0130      q_soname HamamatsuR12860sMask_virtual nodes.size 5000
0131      i       0 nidx   70972 copyno      1 copyno - prev_copyno       2
0132      i       1 nidx   70993 copyno      4 copyno - prev_copyno       3
0133      i       2 nidx   71021 copyno      8 copyno - prev_copyno       4
0134      i       3 nidx   71042 copyno     11 copyno - prev_copyno       3
0135      i       4 nidx   71070 copyno     15 copyno - prev_copyno       4
0136      i       5 nidx   71091 copyno     18 copyno - prev_copyno       3
0137      i       6 nidx   71119 copyno     22 copyno - prev_copyno       4
0138      i       7 nidx   71140 copyno     25 copyno - prev_copyno       3
0139      i       8 nidx   71168 copyno     29 copyno - prev_copyno       4
0140      i       9 nidx   71189 copyno     32 copyno - prev_copyno       3
0141      ... 
0142      i    4991 nidx  194039 copyno  17582 copyno - prev_copyno       3
0143      i    4992 nidx  194067 copyno  17586 copyno - prev_copyno       4
0144      i    4993 nidx  194088 copyno  17589 copyno - prev_copyno       3
0145      i    4994 nidx  194116 copyno  17593 copyno - prev_copyno       4
0146      i    4995 nidx  194137 copyno  17596 copyno - prev_copyno       3
0147      i    4996 nidx  194165 copyno  17600 copyno - prev_copyno       4
0148      i    4997 nidx  194186 copyno  17603 copyno - prev_copyno       3
0149      i    4998 nidx  194214 copyno  17607 copyno - prev_copyno       4
0150      i    4999 nidx  194235 copyno  17610 copyno - prev_copyno       3
0151     ] test_get_pv_1 
0152     [ test_get_pv_1 
0153      q_soname NNVTMCPPMTsMask_virtual nodes.size 12612
0154      i       0 nidx   70965 copyno      0 copyno - prev_copyno       1
0155      i       1 nidx   70979 copyno      2 copyno - prev_copyno       2
0156      i       2 nidx   70986 copyno      3 copyno - prev_copyno       1
0157      i       3 nidx   71000 copyno      5 copyno - prev_copyno       2
0158      i       4 nidx   71007 copyno      6 copyno - prev_copyno       1
0159      i       5 nidx   71014 copyno      7 copyno - prev_copyno       1
0160      i       6 nidx   71028 copyno      9 copyno - prev_copyno       2
0161      i       7 nidx   71035 copyno     10 copyno - prev_copyno       1
0162      i       8 nidx   71049 copyno     12 copyno - prev_copyno       2
0163      i       9 nidx   71056 copyno     13 copyno - prev_copyno       1
0164      ... 
0165      i   12603 nidx  194158 copyno  17599 copyno - prev_copyno       1
0166      i   12604 nidx  194172 copyno  17601 copyno - prev_copyno       2
0167      i   12605 nidx  194179 copyno  17602 copyno - prev_copyno       1
0168      i   12606 nidx  194193 copyno  17604 copyno - prev_copyno       2
0169      i   12607 nidx  194200 copyno  17605 copyno - prev_copyno       1
0170      i   12608 nidx  194207 copyno  17606 copyno - prev_copyno       1
0171      i   12609 nidx  194221 copyno  17608 copyno - prev_copyno       2
0172      i   12610 nidx  194228 copyno  17609 copyno - prev_copyno       1
0173      i   12611 nidx  194242 copyno  17611 copyno - prev_copyno       2
0174     ] test_get_pv_1 
0175     [ test_get_pv_1 
0176      q_soname mask_PMT_20inch_vetosMask_virtual nodes.size 2400
0177      i       0 nidx  322253 copyno  30000 copyno - prev_copyno   30001
0178      i       1 nidx  322259 copyno  30001 copyno - prev_copyno       1
0179      i       2 nidx  322265 copyno  30002 copyno - prev_copyno       1
0180      i       3 nidx  322271 copyno  30003 copyno - prev_copyno       1
0181      i       4 nidx  322277 copyno  30004 copyno - prev_copyno       1
0182      i       5 nidx  322283 copyno  30005 copyno - prev_copyno       1
0183      i       6 nidx  322289 copyno  30006 copyno - prev_copyno       1
0184      i       7 nidx  322295 copyno  30007 copyno - prev_copyno       1
0185      i       8 nidx  322301 copyno  30008 copyno - prev_copyno       1
0186      i       9 nidx  322307 copyno  30009 copyno - prev_copyno       1
0187      ... 
0188      i    2391 nidx  336599 copyno  32391 copyno - prev_copyno       1
0189      i    2392 nidx  336605 copyno  32392 copyno - prev_copyno       1
0190      i    2393 nidx  336611 copyno  32393 copyno - prev_copyno       1
0191      i    2394 nidx  336617 copyno  32394 copyno - prev_copyno       1
0192      i    2395 nidx  336623 copyno  32395 copyno - prev_copyno       1
0193      i    2396 nidx  336629 copyno  32396 copyno - prev_copyno       1
0194      i    2397 nidx  336635 copyno  32397 copyno - prev_copyno       1
0195      i    2398 nidx  336641 copyno  32398 copyno - prev_copyno       1
0196      i    2399 nidx  336647 copyno  32399 copyno - prev_copyno       1
0197     ] test_get_pv_1 
0198     [ test_get_pv_1 
0199      q_soname PMT_3inch_pmt_solid nodes.size 25600
0200      i       0 nidx  194249 copyno 300000 copyno - prev_copyno  300001
0201      i       1 nidx  194254 copyno 300001 copyno - prev_copyno       1
0202      i       2 nidx  194259 copyno 300002 copyno - prev_copyno       1
0203      i       3 nidx  194264 copyno 300003 copyno - prev_copyno       1
0204      i       4 nidx  194269 copyno 300004 copyno - prev_copyno       1
0205      i       5 nidx  194274 copyno 300005 copyno - prev_copyno       1
0206      i       6 nidx  194279 copyno 300006 copyno - prev_copyno       1
0207      i       7 nidx  194284 copyno 300007 copyno - prev_copyno       1
0208      i       8 nidx  194289 copyno 300008 copyno - prev_copyno       1
0209      i       9 nidx  194294 copyno 300009 copyno - prev_copyno       1
0210      ... 
0211      i   25591 nidx  322204 copyno 325591 copyno - prev_copyno       1
0212      i   25592 nidx  322209 copyno 325592 copyno - prev_copyno       1
0213      i   25593 nidx  322214 copyno 325593 copyno - prev_copyno       1
0214      i   25594 nidx  322219 copyno 325594 copyno - prev_copyno       1
0215      i   25595 nidx  322224 copyno 325595 copyno - prev_copyno       1
0216      i   25596 nidx  322229 copyno 325596 copyno - prev_copyno       1
0217      i   25597 nidx  322234 copyno 325597 copyno - prev_copyno       1
0218      i   25598 nidx  322239 copyno 325598 copyno - prev_copyno       1
0219      i   25599 nidx  322244 copyno 325599 copyno - prev_copyno       1
0220     ] test_get_pv_1 
0221 
0222 **/
0223 
0224 void test_get_pv_1(const U4Tree* tree, const char* q_soname)
0225 {
0226     std::cout << "[ test_get_pv_1 " << std::endl ; 
0227 
0228     unsigned edge = ssys::getenvunsigned("EDGE", 10); 
0229 
0230     std::vector<int> nodes ; 
0231     bool starting = false ;  // require exact match  
0232     tree->st->find_lvid_nodes(nodes, q_soname, starting );  
0233     std::cout << " q_soname " << q_soname << " nodes.size " << nodes.size() << std::endl ; 
0234 
0235     int copyno = -1 ; 
0236     int prev_copyno = -1 ; 
0237     for(unsigned i=0 ; i < nodes.size() ; i++)
0238     {
0239         int nidx = nodes[i] ; 
0240         prev_copyno = copyno ;  
0241         copyno = tree->get_pv_copyno(nidx);  
0242 
0243         int copyno_0 = tree->st->get_copyno(nidx); 
0244         bool copyno_expect = copyno == copyno_0 ;
0245         assert( copyno_expect ); 
0246         if(!copyno_expect) std::raise(SIGINT); 
0247 
0248         if( i < edge || (i > (nodes.size() - edge))) 
0249             std::cout 
0250                 << " i " << std::setw(7) << i
0251                 << " nidx " << std::setw(7) << nidx 
0252                 << " copyno " << std::setw(6) << copyno 
0253                 << " copyno - prev_copyno  " << std::setw(6) << (copyno - prev_copyno)  
0254                 << std::endl 
0255                 ; 
0256         else if( i == edge ) 
0257             std::cout 
0258                 << " ... " << std::endl ; 
0259 
0260     }
0261     std::cout << "] test_get_pv_1 " << std::endl ; 
0262 }
0263 
0264 void test_get_pv_1(const U4Tree* tree)
0265 {
0266     std::vector<std::string> sub_sonames ; 
0267     tree->st->get_sub_sonames(sub_sonames); 
0268   
0269     for(unsigned i=0 ; i < sub_sonames.size() ; i++)
0270     {
0271         const char* soname = sub_sonames[i].c_str();  
0272         test_get_pv_1(tree, soname ); 
0273     }
0274 }
0275 
0276 int main(int argc, char** argv)
0277 {
0278     OPTICKS_LOG(argc, argv); 
0279 
0280     const char* _path = "$HOME/.opticks/GEOM/$GEOM/origin.gdml" ;
0281     const char* path = spath::Resolve(_path); 
0282     LOG(info) 
0283         << " _path [" << _path << "]" 
0284         << " path [" << path << "]" 
0285         ; 
0286     LOG_IF(fatal, path == nullptr) << " " ; 
0287     if( path == nullptr ) return 0 ; 
0288 
0289     const G4VPhysicalVolume* world = U4GDML::Read(path) ;  
0290 
0291     stree* st = new stree ; 
0292     U4Tree* tree = U4Tree::Create(st, world) ; 
0293     st->save(FOLD); 
0294 
0295     //test_get_pv_0(tree); 
0296     test_get_pv_1(tree); 
0297 
0298     return 0 ;  
0299 }