MaterialData MaterialManager::createAveragedMaterial( const MaterialVec& materials ) { std::stringstream sstr ; double sum_l = 0 ; double sum_rho_l = 0 ; double sum_rho_l_over_A = 0 ; double sum_rho_l_Z_over_A = 0 ; //double sum_rho_l_over_x = 0 ; double sum_l_over_x = 0 ; //double sum_rho_l_over_lambda = 0 ; double sum_l_over_lambda = 0 ; for(unsigned i=0,n=materials.size(); i<n ; ++i){ Material mat = materials[i].first ; double l = materials[i].second ; if( i != 0 ) sstr << "_" ; sstr << mat.name() << "_" << l ; double rho = mat.density() ; double A = mat.A() ; double Z = mat.Z() ; double x = mat.radLength() ; double lambda = mat.intLength() ; sum_l += l ; sum_rho_l += rho * l ; sum_rho_l_over_A += rho * l / A ; sum_rho_l_Z_over_A += rho * l * Z / A ; sum_l_over_x += l / x ; sum_l_over_lambda += l / lambda ; // sum_rho_l_over_x += rho * l / x ; // sum_rho_l_over_lambda += rho * l / lambda ; } double rho = sum_rho_l / sum_l ; double A = sum_rho_l / sum_rho_l_over_A ; double Z = sum_rho_l_Z_over_A / sum_rho_l_over_A ; // radiation and interaction lengths already given in cm - average by length // double x = sum_rho_l / sum_rho_l_over_x ; double x = sum_l / sum_l_over_x ; // double lambda = sum_rho_l / sum_rho_l_over_lambda ; double lambda = sum_l / sum_l_over_lambda ; return MaterialData( sstr.str() , Z, A, rho, x, lambda ) ; }