Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:49:20

0001 #include "SPMT.h"
0002 #include "SPMTAccessor.h"
0003 #include <map>
0004 #include <unordered_map>
0005 
0006 struct SPMTAccessor_test
0007 {
0008     SPMTAccessor_test( SPMTAccessor* accessor_ ) : accessor(accessor_) {} ;
0009 
0010     SPMTAccessor* accessor ;
0011 
0012     NP*  get_pmtcat_qescale() const ;
0013     NP*  get_pmtid_qe() const ;
0014     NP*  get_stackspec() const ;
0015 
0016     void get_stackspec_one() const ;
0017 
0018 
0019     static void CategoriesPopulate( std::unordered_map<int, int>& pmt_categories );
0020     static void CategoriesCount( std::map<int, int>& cat_count, std::unordered_map<int, int>& pmt_categories );
0021     static std::string CategoriesDesc( std::map<int, int>& cat_count );
0022     static int Categories();
0023 
0024 };
0025 
0026 
0027 NP* SPMTAccessor_test::get_pmtcat_qescale() const
0028 {
0029     int num_lpmt = accessor->get_num_lpmt();
0030     std::map<int, int> cats ;
0031 
0032     int ni = num_lpmt ;
0033     int nj = 2 ;
0034 
0035     NP* a = NP::Make<double>(ni, nj );
0036     double* aa = a->values<double>();
0037 
0038     for(int i=0 ; i < ni ; i++)
0039     {
0040         int pmtid = i ;
0041         int pmtcat = accessor->get_pmtcat(pmtid);
0042         double qs = accessor->get_qescale(pmtid);
0043 
0044         aa[i*nj+0] = pmtcat ;
0045         aa[i*nj+1] = qs ;
0046 
0047         if(i % 1000 == 0) std::cout
0048             << std::setw(6) << pmtid
0049             << " : "
0050             << std::setw(2) << pmtcat
0051             << " : "
0052             << qs
0053             << std::endl
0054             ;
0055 
0056         cats[pmtcat] += 1 ;
0057     }
0058 
0059     typedef std::map<int,int>  MII ;
0060 
0061     int total = 0 ;
0062     for(MII::const_iterator it=cats.begin() ; it != cats.end() ; it++)
0063     {
0064         std::cout << it->first << " : " << it->second << std::endl ;
0065         total += it->second ;
0066     }
0067     std::cout << " total " << total << std::endl ;
0068     return a ;
0069 }
0070 
0071 NP* SPMTAccessor_test::get_pmtid_qe() const
0072 {
0073     int num_lpmt = accessor->get_num_lpmt();
0074 
0075     int ni = num_lpmt ;
0076     int nj = 100 ;
0077     int nk = 2 ;
0078 
0079     NP* a = NP::Make<double>(ni, nj, nk );
0080     double* aa = a->values<double>();
0081 
0082     for(int i=0 ; i < ni ; i++)
0083     {
0084         int pmtid = i ;
0085         for(int j=0 ; j < nj ; j++)
0086         {
0087             double energy = SPMT::GetValueInRange(j, nj, 1.55, 15.5 );
0088             double qe = accessor->get_pmtid_qe(pmtid, energy );
0089 
0090             aa[i*nj*nk+j*nk+0] = energy ;
0091             aa[i*nj*nk+j*nk+1] = qe ;
0092 
0093             if(i % 1000 == 0 && j == nj/2 )  std::cout
0094                 << std::setw(6) << pmtid
0095                 << " : "
0096                 << qe
0097                 << std::endl
0098                 ;
0099         }
0100     }
0101     return a ;
0102 }
0103 
0104 
0105 NP* SPMTAccessor_test::get_stackspec() const
0106 {
0107     int num_lpmt = accessor->get_num_lpmt();
0108 
0109     int ni = num_lpmt ;
0110     int nj = 100 ;
0111     int nk = 16 ;
0112 
0113     NP* a = NP::Make<double>(ni, nj, nk );
0114     double* aa = a->values<double>();
0115 
0116     for(int i=0 ; i < ni ; i++)
0117     {
0118         int pmtid = i ;
0119         int pmtcat = accessor->get_pmtcat(pmtid);
0120         for(int j=0 ; j < nj ; j++)
0121         {
0122             double energy = SPMT::GetValueInRange(j, nj, 1.55, 15.5 );
0123             std::array<double, 16> ss ;
0124             accessor->get_stackspec( ss, pmtcat, energy );
0125             for(int k=0 ; k < nk ; k++) aa[i*nj*nk+j*nk+k] = ss[k] ;
0126         }
0127     }
0128     return a ;
0129 }
0130 
0131 
0132 
0133 void SPMTAccessor_test::get_stackspec_one() const
0134 {
0135     int pmtcat = 0 ;
0136     double energy = 4. ;
0137     std::array<double, 16> ss ;
0138     accessor->get_stackspec( ss, pmtcat, energy );
0139 
0140     std::cout << SPMTAccessor::Desc(ss) ;
0141 }
0142 
0143 
0144 
0145 void SPMTAccessor_test::CategoriesPopulate( std::unordered_map<int, int>& pmt_categories )
0146 {
0147     pmt_categories[0] = 0 ;
0148     pmt_categories[1] = 0 ;
0149     pmt_categories[2] = 0 ;
0150     pmt_categories[3] = 0 ;
0151 
0152     pmt_categories[10] = 1 ;
0153     pmt_categories[11] = 1 ;
0154     pmt_categories[12] = 1 ;
0155     pmt_categories[13] = 1 ;
0156     pmt_categories[14] = 1 ;
0157 
0158     pmt_categories[100] = 2 ;
0159     pmt_categories[110] = 2 ;
0160     pmt_categories[120] = 2 ;
0161     pmt_categories[130] = 2 ;
0162     pmt_categories[140] = 2 ;
0163     pmt_categories[150] = 2 ;
0164 }
0165 
0166 
0167 void SPMTAccessor_test::CategoriesCount( std::map<int, int>& cat_count, std::unordered_map<int, int>& pmt_categories )
0168 {
0169     for( auto it : pmt_categories ) cat_count[it.second]++ ;
0170 }
0171 
0172 
0173 std::string SPMTAccessor_test::CategoriesDesc( std::map<int, int>& cat_count )
0174 {
0175     std::stringstream ss ;
0176     for( auto it : cat_count ) ss
0177           << std::setw(3) << it.first
0178           << " : "
0179           << std::setw(6) << it.second
0180           << std::endl
0181           ;
0182 
0183     std::string str = ss.str() ;
0184     return str ;
0185 }
0186 
0187 int SPMTAccessor_test::Categories()
0188 {
0189     std::unordered_map<int,int> pmt_categories ;
0190     CategoriesPopulate( pmt_categories );
0191 
0192     std::map<int,int> catmap ;
0193     CategoriesCount( catmap, pmt_categories );
0194 
0195     std::cout << CategoriesDesc( catmap );
0196 
0197     return 0;
0198 }
0199 
0200 
0201 int main(int argc, char** argv)
0202 {
0203     SPMTAccessor_test::Categories();
0204 
0205     SPMT* pmt = SPMT::CreateFromJPMT();
0206     if(pmt == nullptr) return 1 ;
0207 
0208     SPMTAccessor* accessor = new SPMTAccessor(pmt);
0209     assert( accessor );
0210 
0211     SPMTAccessor_test test(accessor);
0212     test.get_stackspec_one() ;
0213 
0214     NPFold* f = new NPFold ;
0215     f->add( "get_pmtcat_qescale", test.get_pmtcat_qescale() );
0216     f->add( "get_pmtid_qe",       test.get_pmtid_qe() );
0217     f->add( "get_stackspec",      test.get_stackspec() );
0218     f->save("$FOLD");
0219 
0220     return 0 ;
0221 }