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 }