| Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://xmm.vilspa.esa.es/sas/8.0.0/doc/rgsrmfgen/node8.html Дата изменения: Wed Jul 2 06:55:48 2008 Дата индексирования: Fri Sep 5 20:42:18 2008 Кодировка: Поисковые слова: asteroid | 
 
 
 
 
 
 
 
IF *newrmf
  IF *withspectrum
    template = *spectrumset
  ELSE
    template = *evlist OR *srclist
ELSE
  template = *rmfset
IF *srclist == ""
  IF template.root.length >= 10
    *srclist = template with "SRCLI_0000" substituted
  ELSE
    *srclist = "srcli." + template.suffix
IF *evlist == ""
  IF template.root.length >= 10
    *evlist = template with "EVENLI0000" substituted
  ELSE
    *evlist = "evenli." + template.suffix
IF *newrmf AND *rmfset == ""
  IF template.root.length >= 10
    *rmfset = template with ("RSPMAT",*order,*source) substituted
  ELSE
    *rmfset = "rspmat." + template.suffix
IF GratingDataServer::beta(source,order,energy) within matrix channel space
  // prepare various distributions in wrap-around order for convolution
    // small angle scattering distribution
      D = GratingDataServer::scatteringDistribution(source,order,energy)
      (a,b) = GratingDataServer::scatteringDistributionContribs
      D[peak] += (1-a)*(1-b)
    // mirror point spread distribution
      IF *withmirrorpsf
        PsfDataServer::dispersionFigureDistribution(source,order,energy)
    // custom angular distribution
      IF *withangdist
        customFigureDistribution(order,energy)
    // grating bow induced misalignment distribution
      GratingDataServer::bowingFigureDistribution(source,order,energy)
    // geometric defocus approximation distribution
      GeometryDataServer::lsfDefocusDistribution(source,order,energy)
    // finite energy band broadening distribution
      GratingDataServer::broadeningDistribution(source,order,energy)
  // prepare the primary distribution on the matrix channel grid
    GratingDataServer::misalignmentFigureDistribution(source,order,energy)
  LSF = convolution(primary,various...)
ELSE
  // distributions peak outside the matrix channel space, so skip
  // convolutions, and instead just use the tail of the small angle
  // scattering distribution where it overlaps the channel space
    LSF = GratingDataServer::scatteringDistribution(source,order,energy)
// scale the LSF by the effective area
  IF dyneffarecorr
    scale = EffectiveAreaDataServer::realisticEffectiveAreaCurve(source,order)::area(energy)
  ELSE
    scale = EffectiveAreaDataServer::intrinsicEffectiveAreaCurve(source,order)::area(energy)
  NarrowLSF = scale * LSF
// place the large angle scattering distribution on the matrix channel // grid and scale it by the effective area LSF = GratingDataServer::scatteringDistribution(source,order,energy) scale = EffectiveAreaDataServer::intrinsicEffectiveAreaCurve(source,order)::area(energy) BroadLSF = scale * LSF
dpsi = source.DELTA_XDSP * pi/10800 k = (energy * 10800) / (0.678 * pi) FOREACH span = interval [min,max] of cross-dispersion channels s += (atan(k*(xdsp(max+0.5)+dpsi)) - atan(k*(xdsp(min-0.5)+dpsi))) / pi n += span.length empiricalCrossLA = s/n
// analyze the exposure maps within the spatial selection regions
FOREACH node
  FOREACH b = dispersion channel of node
    src.exposure[node,b] = EXPMAP<node>[b] summed over src.spans[node,b]
    bkg.exposure[node,b] = EXPMAP<node>[b] summed over bkg.spans[node,b]
    D = EXPMAP<node>[b] * CanonicalCrossPsf::probability(beta(b),source)
    src.crossPSF[node,b] = D summed over src.spans[node,b]
    bkg.crossPSF[node,b] = D summed over bkg.spans[node,b]
// compute the response matrix
FOREACH incident energy bin
  // compute the loss factors specific to the narrow-featured LSF
  loss = 0
  FOREACH node
    FOREACH b = dispersion channel of node
      y = src.crossPSF[node,b]
      IF *bkgcorrect AND bkg.exposure[node,b]
        y -= bkg.crossPSF[node,b] * src.exposure[node,b] / bkg.exposure[node,b]
      loss[b] += y * ccdQuantumDataServer(node)::efficiency(energy)
  // combine with the narrow-featured LSF for each reflection order
  LSF = 0
  FOREACH order in [0,5]
    LSF += NarrowLSF(source,order,energy)
  response = LSF * loss
  // compute the loss factors specific to the broad-featured LSF
  loss = 0
  FOREACH node
    FOREACH b = dispersion channel of node
      y = empiricalCrossLA(src.spans[node,b],source,energy)
      IF *bkgcorrect
        y -= empiricalCrossLA(bkg.spans[node,b],source,energy)
      loss[b] += y * src.exposure[node,b] * ccdQuantumDataServer(node)::efficiency(energy)
  // combine with the broad-featured LSF for each reflection order
  LSF = 0
  FOREACH order in [0,5]
    LSF += BroadLSF(source,order,energy)
  response += LSF * loss
  // apply loss factors that are not specific to the type of LSF;
  // the redistribution function varies slowly with incident energy
  // and so it is recomputed no more often than every .02 keV
  IF redistLoss is stale
    FOREACH b = response channel
      redistLoss[b] = CanonicalRedist::spectrum(energy) summed over banana[b]
  response *= redistLoss * GratingDataServer::selfVignettingEfficiency
  // copy all response channels above LO_THRES to the output matrix