This is Zshape.m in view mode; [Download] [Up]
/* Zshape.m by Paul Kunz January 1993
* Subclass of PFunction to manage a Z shape function
*
* Copyright (C) 1993 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*/
#import "Zshape.h"
#import <objc/Storage.h>
#import <math.h>
const char Zshape_h_rcsid[] = ZSHAPE_H_ID;
const char Zshape_m_rcsid[] = "$Id: Zshape.m,v 1.2 1993/02/01 22:14:59 pfkeb Exp $";
/* The form of this function was taken from Jordan Nash's thesis,
* SLAC-Rep-356, p 22.
*/
@implementation Zshape : PFunction
static double phi(double cos_beta, double nu)
{
return M_PI*nu*sin((1-nu)*acos(cos_beta))/
(sin(M_PI*nu)*sin(acos(cos_beta)));
}
static double Z_shape(double x, double binW, double *par)
{
double y, gamma, a, cos_beta, t=0.108, cross_section;
double xsect = par[0];
double mass = par[1];
double width = par[2];
gamma = width/mass;
y = pow( (x/mass), 2. ) - 1.;
a = sqrt( (y*y + gamma*gamma*pow((1+y),2.))/(1+gamma*gamma) );
cos_beta = ( y + gamma*gamma*(1+y))/(a*(1+gamma*gamma));
cos_beta *= -1.;
cross_section = xsect*(1+0.75*t)*gamma*gamma/(1+gamma*gamma);
cross_section *= (1+y)*pow(a,t-2)*phi(cos_beta,t)
- pow(a,t-1)*t*phi(cos_beta,1+t)/(1-t);
// add in the correction for hard photon radiation :
// MOD 900723 WSL multiply correction by peak cross section before adding.
cross_section -= xsect*t*width*( atan(2/gamma)-atan(2*(mass-x)/gamma) )/x ;
return cross_section;
}
- init
{
[super init];
[[[self setTitle:"Z_shape"] setFunctionPtr:Z_shape] setNumberArgs:3];
[self registerFunc];
[self setArgName:"Peak_x-sect" at:0];
[self setArgName:"Z_mass" at:1];
[self setArgName:"Z_width" at:2];
return self;
}
- setInitialValues
{
fitParm *parm;
graphtype_t type;
[super setInitialValues];
if ( !disp ) return self;
type = h_getDispType(disp);
parm = [variedParms elementAt:0];
if ( type == HISTOGRAM ) {
parm->value = disp->bins.totals[1][0];
parm->lower_limit = 0.0;
parm->upper_limit = 2.0 * parm->value;
parm->step_size = 0.01 * parm->upper_limit;
} else {
parm->lower_limit = disp->yAxis.low;
parm->upper_limit = 4.0 * disp->yAxis.high;
parm->value = 0.5 * parm->upper_limit;
parm->step_size = 0.01 * (disp->yAxis.high - disp->yAxis.low);
}
parm = [variedParms elementAt:1];
parm->lower_limit = disp->xAxis.low;
parm->upper_limit = disp->xAxis.high;
parm->step_size = 0.01 * (disp->xAxis.high - disp->xAxis.low);
parm->value = parm->lower_limit
+ 0.50 * (disp->xAxis.high - disp->xAxis.low);
parm = [variedParms elementAt:2];
parm->upper_limit = 0.2 * (disp->xAxis.high - disp->xAxis.low);
parm->lower_limit = 0.02 * parm->upper_limit;
parm->step_size = 0.01 * (parm->upper_limit - parm->lower_limit);
parm->value = 0.5 * (parm->upper_limit - parm->lower_limit );
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.