示例#1
0
    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 ) ;

    }