ROOT logo
// $Id: THealAlm.cxx,v 1.10 2008/07/14 05:58:36 oxon Exp $
// Author: Akira Okumura 2008/06/26

/*****************************************************************************
   Copyright (C) 2008-, Akira Okumura
   All rights reserved.

   This is a port of HEALPix C++ package to ROOT system.
   Original code is available at <http://healpix.jpl.nasa.gov> under GPL.
******************************************************************************/

#include "TMath.h"

#include "THealAlm.h"
#include "THealPix.h"

namespace {
  /*
  void get_chunk_info (int nrings, int &nchunks, int &chunksize)
  {
    nchunks = nrings/TMath::Max(100,nrings/10) + 1;
    chunksize = (nrings+nchunks-1)/nchunks;
  }
  */
//______________________________________________________________________________
void recalc_alm2map (int nph, int mmax, THealFFT::rfft &plan,
  std::vector<std::complex<double> > &shiftarr)
  {
  if (plan.size() == nph) return;
  plan.Set (nph);
  double f1 = TMath::Pi()/nph;
  for (int m=0; m<=mmax; ++m)
    {
    if (m<nph)
      shiftarr[m] = std::complex<double>(cos(m*f1),sin(m*f1));
    else
      shiftarr[m]=-shiftarr[m-nph];
    }
  }
  /*
//______________________________________________________________________________
void fill_work (const std::complex<double> *datain, int nph, int mmax,
  bool shifted, const std::vector<std::complex<double> > &shiftarr,
  std::vector<std::complex<double> > &work)
  {
  for (int m=1; m<nph; ++m) work[m]=0;
  work[0]=datain[0];

  int cnt1=0, cnt2=nph;
  for (int m=1; m<=mmax; ++m)
    {
    if (++cnt1==nph) cnt1=0;
    if (--cnt2==-1) cnt2=nph-1;
    std::complex<double> tmp = shifted ? (datain[m]*shiftarr[m]) : datain[m];
    work[cnt1] += tmp;
    work[cnt2] += conj(tmp);
    }
  }

//______________________________________________________________________________
template<typename T> void fft_alm2map (int nph, int mmax, bool shifted,
  THealFFT::rfft &plan, T *mapN, T *mapS, std::complex<double> *b_north,
  const std::complex<double> *b_south, const std::vector<std::complex<double> > &shiftarr,
  std::vector<std::complex<double> > &work)
  {
  fill_work (b_north, nph, mmax, shifted, shiftarr, work);
  plan.backward_c(work);
  for (int m=0; m<nph; ++m) mapN[m] = work[m].real();
  if (mapN==mapS) return;
  fill_work (b_south, nph, mmax, shifted, shiftarr, work);
  plan.backward_c(work);
  for (int m=0; m<nph; ++m) mapS[m] = work[m].real();
  }
  */
}

templateClassImp(THealAlm)

template<typename T>
std::complex<T> THealAlm<T>::fgAlmDummy = std::complex<T>(0, 0);
template<typename T>
const std::complex<T> THealAlm<T>::fgAlmDummyConst = std::complex<T>(0, 0);

//_____________________________________________________________________________
template<typename T>
THealAlm<T>::~THealAlm()
{
}

//_____________________________________________________________________________
template<typename T>
THealAlm<T>::THealAlm(Int_t lmax, Int_t mmax)
  : TObject()
{
  ResetLM(lmax, mmax);
}

//_____________________________________________________________________________
template<typename T>
THealAlm<T>::THealAlm(const THealAlm<T>& ha) : TObject()
{
  ((THealAlm<T>&)ha).Copy(*this);
}

//______________________________________________________________________________
template<typename T>
void THealAlm<T>::Add(const THealAlm<T>* ha1, Double_t c1)
{
  if(!ha1){
    Error("Add", "Attempt to add a non-existing Alm");
    return;
  } // if

  if(fLmax != ha1->GetLmax() || fMmax != ha1->GetMmax()){
    Error("Add", "Attempt to add Alms with different number of lmax or mmax");
    return;
  } // if

  for(Int_t l = 0; l <= fLmax; l++){
    for(Int_t m = 0; m <= TMath::Min(l, fMmax); m++){
      std::complex<T> comp = ((*ha1)(l, m));
      comp *= c1;
      (*this)(l, m) += comp;
    } // m
  } // l
}

//______________________________________________________________________________
template<typename T>
void THealAlm<T>::Add(const THealAlm<T>* ha1, const THealAlm<T>* ha2, Double_t c1, Double_t c2)
{
  if(!ha1 || !ha2){
    Error("Add", "Attempt to add a non-existing Alm");
    return;
  } // if

  if(fLmax != ha1->GetLmax() || fMmax != ha1->GetMmax()
  || fLmax != ha2->GetLmax() || fMmax != ha2->GetMmax()){
    Error("Add", "Attempt to add Alms with different number of lmax or mmax");
    return;
  } // if

  for(Int_t l = 0; l <= fLmax; l++){
    for(Int_t m = 0; m <= TMath::Min(l, fMmax); m++){
      std::complex<T> comp1 = ((*ha1)(l, m));
      std::complex<T> comp2 = ((*ha2)(l, m));
      comp1 *= c1;
      comp2 *= c2;
      (*this)(l, m) = comp1 + comp2;
    } // m
  } // l
}

//_____________________________________________________________________________
template<typename T>
void THealAlm<T>::Alm2Map(THealPix& map) const
{
  int nside = map.GetNside();
  
  int nchunks, chunksize;
  get_chunk_info(2*nside,nchunks,chunksize);
  
  std::complex<double> *b_north[chunksize], *b_south[chunksize];
  for(Int_t i = 0; i < chunksize; i++){
    b_north[i] = new std::complex<double>[fMmax+1];
    b_south[i] = new std::complex<double>[fMmax+1];
  } // i
  std::vector<double> cth(chunksize),sth(chunksize);
  
  for(int chunk=0; chunk<nchunks; ++chunk){
    int llim=chunk*chunksize, ulim=TMath::Min(llim+chunksize,2*nside);
    for(int ith=llim; ith<ulim; ++ith){
      int nph, istart_north;
      bool shifted;
      map.GetRingInfo (ith+1,istart_north,nph, cth[ith-llim],sth[ith-llim],
		       shifted);
    }
    
    THealFFT::Ylmgen generator(fLmax,fMmax,1e-30);
    std::vector<double> Ylm;
    std::vector<std::complex<double> > alm_tmp(fLmax+1);
    for(int m=0; m<=fMmax; ++m){
      for(int l=m; l<=fLmax; ++l){
        alm_tmp[l]=(*this)(l,m);
      } // l
      
      for(int ith=0; ith<ulim-llim; ++ith){
        int l;
        generator.get_Ylm(cth[ith],sth[ith],m,Ylm,l);
        if(l<=fLmax){
	  std::complex<double> p1(0, 0), p2(0, 0);
	  
          if ((l-m)&1) goto middle;
	start:
          p1 += alm_tmp[l]*Ylm[l];
          if (++l>fLmax) goto end;
	middle:
          p2 += alm_tmp[l]*Ylm[l];
          if (++l<=fLmax) goto start;
	end:      b_north[ith][m] = p1+p2; b_south[ith][m] = p1-p2;
	}
        else
          {
	    b_north[ith][m] = b_south[ith][m] = 0;
          }
      }
    }

    std::vector<std::complex<double> > shiftarr(fMmax+1), work(4*nside);
    THealFFT::rfft plan;
    for(int ith=llim; ith<ulim; ++ith){
      int istart_north, istart_south, nph;
      double dum1, dum2;
      bool shifted;
      map.GetRingInfo (ith+1,istart_north,nph,dum1,dum2,shifted);
      istart_south = map.GetNpix()-istart_north-nph;
      recalc_alm2map (nph, fMmax, plan, shiftarr);
      if(map.GetTypeString() == "D"){
	fft_alm2map (nph, fMmax, shifted, plan,
		     &(dynamic_cast<THealPixD&>(map))[istart_north],
		     &(dynamic_cast<THealPixD&>(map))[istart_south],
		     b_north[ith-llim], b_south[ith-llim], shiftarr, work);
      } else if(map.GetTypeString() == "E"){
	fft_alm2map (nph, fMmax, shifted, plan,
		     &(dynamic_cast<THealPixF&>(map))[istart_north],
		     &(dynamic_cast<THealPixF&>(map))[istart_south],
		     b_north[ith-llim], b_south[ith-llim], shiftarr, work);
      } // if
    }
  }
  
  Double_t entries = 0;
  for(Int_t i = 0; i < map.GetNpix(); i++){
    if(map.GetBinContent(i) != 0){
      entries++;
    } // if
  } // i
  map.SetEntries(entries);

  for(Int_t i = 0; i < chunksize; i++){
    delete b_north[i];
    delete b_south[i];
  } // i
}

//_____________________________________________________________________________
template<typename T>
void THealAlm<T>::Copy(TObject& obj) const
{
  TObject::Copy(obj);
  ((THealAlm&)obj).fAlm  = fAlm;
  ((THealAlm&)obj).fLmax = fLmax;
  ((THealAlm&)obj).fMmax = fMmax;
  ((THealAlm&)obj).fTval = fTval;
}

//______________________________________________________________________________
template<typename T>
void THealAlm<T>::Divide(const THealAlm<T>* ha1)
{
  if(!ha1){
    Error("Divide", "Attempt to divide by a non-existing Alm");
    return;
  } // if

  if(fLmax != ha1->GetLmax() || fMmax != ha1->GetMmax()){
    Error("Divide", "Attempt to devide Alms with different number of lmax or mmax");
    return;
  } // if

  for(Int_t l = 0; l <= fLmax; l++){
    for(Int_t m = 0; m <= TMath::Min(l, fMmax); m++){
      if(std::norm((*ha1)(l, m)) != 0){
	(*this)(l, m) /= (*ha1)(l, m);
      } else {
	(*this)(l, m) = 0;
      } // if
    } // m
  } // l
}

//_____________________________________________________________________________
template<typename T>
void THealAlm<T>::Multiply(const THealAlm<T>* ha1)
{
  if(!ha1){
    Error("Multiply", "Attempt to multiply a non-existing Alm");
    return;
  } // if

  if(fLmax != ha1->GetLmax() || fMmax != ha1->GetMmax()){
    Error("Divide", "Attempt to multiply Alms with different number of lmax or mmax");
    return;
  } // if

  for(Int_t l = 0; l <= fLmax; l++){
    for(Int_t m = 0; m <= TMath::Min(l, fMmax); m++){
      (*this)(l, m) *= (*ha1)(l, m);
    } // m
  } // l
}

//_____________________________________________________________________________
template<typename T>
void THealAlm<T>::ResetLM(Int_t lmax, Int_t mmax)
{
  fLmax = (lmax > 0) ? lmax : 0;
  mmax  = (mmax > 0) ? mmax : 0;
  fMmax = (mmax <= fLmax) ? mmax : fLmax;
  fTval = 2*fLmax + 1;
  Int_t n = (fMmax + 1)*(fMmax + 2)/2 + (fMmax + 1)*(fLmax - fMmax);

  fAlm.resize(n, fgAlmDummyConst);
}

//_____________________________________________________________________________
template<typename T>
void THealAlm<T>::Scale(Double_t c1)
{
  Add(this, this, c1, 0);
}

//_____________________________________________________________________________
template<typename T>
void THealAlm<T>::SetToZero()
{
  for(UInt_t i = 0; i < fAlm.size(); i++){
    fAlm[i] = fgAlmDummyConst;
  } // i
}

//______________________________________________________________________________
template<typename T>
void THealAlm<T>::Streamer(TBuffer& b)
{
  if(b.IsReading()){
    UInt_t R__s, R__c;
    Version_t R__v = b.ReadVersion(&R__s, &R__c);
    b.ReadClassBuffer(THealPix::Class(), this, R__v, R__s, R__c);
    fTval = 2*fLmax + 1;
  } else {
    b.WriteClassBuffer(THealPix::Class(), this);
  }
}

//______________________________________________________________________________
template<typename T>
std::complex<T>& THealAlm<T>::operator()(Int_t l, Int_t m)
{
  if(0 <= l && l <= fLmax && 0 <= m && m <= TMath::Min(fMmax, l)){
    return fAlm[((m*(fTval - m))>>1) + l];
  } // if

  fgAlmDummy = fgAlmDummyConst;
  return fgAlmDummy;
}

//______________________________________________________________________________
template<typename T>
const std::complex<T>& THealAlm<T>::operator()(Int_t l, Int_t m) const
{
  if(0 <= l && l <= fLmax && 0 <= m && m <= TMath::Min(fMmax, l)){
    return fAlm[((m*(fTval - m))>>1) + l];
  } // if

  return fgAlmDummyConst;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T>& THealAlm<T>::operator=(const THealAlm<T>& ha1)
{
   // Operator =

  if(this != &ha1){
    ((THealAlm<T>&)ha1).Copy(*this);
  } // if
  return *this;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> THealAlm<T>::__add__(const THealAlm<T>& ha1) const
{
  // Python operator +
  return *this + ha1;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> THealAlm<T>::__div__(const THealAlm<T>& ha1) const
{
  // Python operator /
  return *this / ha1;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> THealAlm<T>::__mul__(const THealAlm<T>& ha1) const
{
  // Python operator *
  return *this * ha1;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> THealAlm<T>::__mul__(Double_t c1) const
{
  // Python operator *
  return *this*c1;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> THealAlm<T>::__rmul__(Double_t c1) const
{
  // Python operator *
  return *this*c1;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> THealAlm<T>::__sub__(const THealAlm<T>& ha1) const
{
  // Python operator -
  return *this - ha1;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> operator*(Double_t c1, const THealAlm<T>& ha1)
{
   // Operator *
   THealAlm<T> hanew = ha1;
   hanew.Scale(c1);
   return hanew;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> operator+(const THealAlm<T>& ha1, const THealAlm<T>& ha2)
{
   // Operator +
   THealAlm<T> hanew = ha1;
   hanew.Add(&ha2, 1);
   return hanew;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> operator-(const THealAlm<T>& ha1, const THealAlm<T>& ha2)
{
   // Operator -
   THealAlm<T> hanew = ha1;
   hanew.Add(&ha2, -1);
   return hanew;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> operator*(const THealAlm<T>& ha1, const THealAlm<T>& ha2)
{
   // Operator *
   THealAlm<T> hanew = ha1;
   hanew.Multiply(&ha2);
   return hanew;
}

//______________________________________________________________________________
template<typename T>
THealAlm<T> operator/(const THealAlm<T>& ha1, const THealAlm<T>& ha2)
{
   // Operator /
   THealAlm<T> hanew = ha1;
   hanew.Divide(&ha2);
   return hanew;
}

template class THealAlm<Float_t>;
template class THealAlm<Double_t>;
template THealAlm<Float_t> operator*<Float_t>(Double_t c1, const THealAlm<Float_t>& ha1);
template THealAlm<Double_t> operator*<Double_t>(Double_t c1, const THealAlm<Double_t>& ha1);
template THealAlm<Float_t> operator*<Float_t>(const THealAlm<Float_t>& ha1, Double_t c1);
template THealAlm<Double_t> operator*<Double_t>(const THealAlm<Double_t>& ha1, Double_t c1);
template THealAlm<Float_t> operator+<Float_t>(const THealAlm<Float_t>& ha1, const THealAlm<Float_t>& ha2);
template THealAlm<Double_t> operator+<Double_t>(const THealAlm<Double_t>& ha1, const THealAlm<Double_t>& ha2);
template THealAlm<Float_t> operator-<Float_t>(const THealAlm<Float_t>& ha1, const THealAlm<Float_t>& ha2);
template THealAlm<Double_t> operator-<Double_t>(const THealAlm<Double_t>& ha1, const THealAlm<Double_t>& ha2);
template THealAlm<Float_t> operator*<Float_t>(const THealAlm<Float_t>& ha1, const THealAlm<Float_t>& ha2);
template THealAlm<Double_t> operator*<Double_t>(const THealAlm<Double_t>& ha1, const THealAlm<Double_t>& ha2);
template THealAlm<Float_t> operator/<Float_t>(const THealAlm<Float_t>& ha1, const THealAlm<Float_t>& ha2);
template THealAlm<Double_t> operator/<Double_t>(const THealAlm<Double_t>& ha1, const THealAlm<Double_t>& ha2);
 THealAlm.cxx:1
 THealAlm.cxx:2
 THealAlm.cxx:3
 THealAlm.cxx:4
 THealAlm.cxx:5
 THealAlm.cxx:6
 THealAlm.cxx:7
 THealAlm.cxx:8
 THealAlm.cxx:9
 THealAlm.cxx:10
 THealAlm.cxx:11
 THealAlm.cxx:12
 THealAlm.cxx:13
 THealAlm.cxx:14
 THealAlm.cxx:15
 THealAlm.cxx:16
 THealAlm.cxx:17
 THealAlm.cxx:18
 THealAlm.cxx:19
 THealAlm.cxx:20
 THealAlm.cxx:21
 THealAlm.cxx:22
 THealAlm.cxx:23
 THealAlm.cxx:24
 THealAlm.cxx:25
 THealAlm.cxx:26
 THealAlm.cxx:27
 THealAlm.cxx:28
 THealAlm.cxx:29
 THealAlm.cxx:30
 THealAlm.cxx:31
 THealAlm.cxx:32
 THealAlm.cxx:33
 THealAlm.cxx:34
 THealAlm.cxx:35
 THealAlm.cxx:36
 THealAlm.cxx:37
 THealAlm.cxx:38
 THealAlm.cxx:39
 THealAlm.cxx:40
 THealAlm.cxx:41
 THealAlm.cxx:42
 THealAlm.cxx:43
 THealAlm.cxx:44
 THealAlm.cxx:45
 THealAlm.cxx:46
 THealAlm.cxx:47
 THealAlm.cxx:48
 THealAlm.cxx:49
 THealAlm.cxx:50
 THealAlm.cxx:51
 THealAlm.cxx:52
 THealAlm.cxx:53
 THealAlm.cxx:54
 THealAlm.cxx:55
 THealAlm.cxx:56
 THealAlm.cxx:57
 THealAlm.cxx:58
 THealAlm.cxx:59
 THealAlm.cxx:60
 THealAlm.cxx:61
 THealAlm.cxx:62
 THealAlm.cxx:63
 THealAlm.cxx:64
 THealAlm.cxx:65
 THealAlm.cxx:66
 THealAlm.cxx:67
 THealAlm.cxx:68
 THealAlm.cxx:69
 THealAlm.cxx:70
 THealAlm.cxx:71
 THealAlm.cxx:72
 THealAlm.cxx:73
 THealAlm.cxx:74
 THealAlm.cxx:75
 THealAlm.cxx:76
 THealAlm.cxx:77
 THealAlm.cxx:78
 THealAlm.cxx:79
 THealAlm.cxx:80
 THealAlm.cxx:81
 THealAlm.cxx:82
 THealAlm.cxx:83
 THealAlm.cxx:84
 THealAlm.cxx:85
 THealAlm.cxx:86
 THealAlm.cxx:87
 THealAlm.cxx:88
 THealAlm.cxx:89
 THealAlm.cxx:90
 THealAlm.cxx:91
 THealAlm.cxx:92
 THealAlm.cxx:93
 THealAlm.cxx:94
 THealAlm.cxx:95
 THealAlm.cxx:96
 THealAlm.cxx:97
 THealAlm.cxx:98
 THealAlm.cxx:99
 THealAlm.cxx:100
 THealAlm.cxx:101
 THealAlm.cxx:102
 THealAlm.cxx:103
 THealAlm.cxx:104
 THealAlm.cxx:105
 THealAlm.cxx:106
 THealAlm.cxx:107
 THealAlm.cxx:108
 THealAlm.cxx:109
 THealAlm.cxx:110
 THealAlm.cxx:111
 THealAlm.cxx:112
 THealAlm.cxx:113
 THealAlm.cxx:114
 THealAlm.cxx:115
 THealAlm.cxx:116
 THealAlm.cxx:117
 THealAlm.cxx:118
 THealAlm.cxx:119
 THealAlm.cxx:120
 THealAlm.cxx:121
 THealAlm.cxx:122
 THealAlm.cxx:123
 THealAlm.cxx:124
 THealAlm.cxx:125
 THealAlm.cxx:126
 THealAlm.cxx:127
 THealAlm.cxx:128
 THealAlm.cxx:129
 THealAlm.cxx:130
 THealAlm.cxx:131
 THealAlm.cxx:132
 THealAlm.cxx:133
 THealAlm.cxx:134
 THealAlm.cxx:135
 THealAlm.cxx:136
 THealAlm.cxx:137
 THealAlm.cxx:138
 THealAlm.cxx:139
 THealAlm.cxx:140
 THealAlm.cxx:141
 THealAlm.cxx:142
 THealAlm.cxx:143
 THealAlm.cxx:144
 THealAlm.cxx:145
 THealAlm.cxx:146
 THealAlm.cxx:147
 THealAlm.cxx:148
 THealAlm.cxx:149
 THealAlm.cxx:150
 THealAlm.cxx:151
 THealAlm.cxx:152
 THealAlm.cxx:153
 THealAlm.cxx:154
 THealAlm.cxx:155
 THealAlm.cxx:156
 THealAlm.cxx:157
 THealAlm.cxx:158
 THealAlm.cxx:159
 THealAlm.cxx:160
 THealAlm.cxx:161
 THealAlm.cxx:162
 THealAlm.cxx:163
 THealAlm.cxx:164
 THealAlm.cxx:165
 THealAlm.cxx:166
 THealAlm.cxx:167
 THealAlm.cxx:168
 THealAlm.cxx:169
 THealAlm.cxx:170
 THealAlm.cxx:171
 THealAlm.cxx:172
 THealAlm.cxx:173
 THealAlm.cxx:174
 THealAlm.cxx:175
 THealAlm.cxx:176
 THealAlm.cxx:177
 THealAlm.cxx:178
 THealAlm.cxx:179
 THealAlm.cxx:180
 THealAlm.cxx:181
 THealAlm.cxx:182
 THealAlm.cxx:183
 THealAlm.cxx:184
 THealAlm.cxx:185
 THealAlm.cxx:186
 THealAlm.cxx:187
 THealAlm.cxx:188
 THealAlm.cxx:189
 THealAlm.cxx:190
 THealAlm.cxx:191
 THealAlm.cxx:192
 THealAlm.cxx:193
 THealAlm.cxx:194
 THealAlm.cxx:195
 THealAlm.cxx:196
 THealAlm.cxx:197
 THealAlm.cxx:198
 THealAlm.cxx:199
 THealAlm.cxx:200
 THealAlm.cxx:201
 THealAlm.cxx:202
 THealAlm.cxx:203
 THealAlm.cxx:204
 THealAlm.cxx:205
 THealAlm.cxx:206
 THealAlm.cxx:207
 THealAlm.cxx:208
 THealAlm.cxx:209
 THealAlm.cxx:210
 THealAlm.cxx:211
 THealAlm.cxx:212
 THealAlm.cxx:213
 THealAlm.cxx:214
 THealAlm.cxx:215
 THealAlm.cxx:216
 THealAlm.cxx:217
 THealAlm.cxx:218
 THealAlm.cxx:219
 THealAlm.cxx:220
 THealAlm.cxx:221
 THealAlm.cxx:222
 THealAlm.cxx:223
 THealAlm.cxx:224
 THealAlm.cxx:225
 THealAlm.cxx:226
 THealAlm.cxx:227
 THealAlm.cxx:228
 THealAlm.cxx:229
 THealAlm.cxx:230
 THealAlm.cxx:231
 THealAlm.cxx:232
 THealAlm.cxx:233
 THealAlm.cxx:234
 THealAlm.cxx:235
 THealAlm.cxx:236
 THealAlm.cxx:237
 THealAlm.cxx:238
 THealAlm.cxx:239
 THealAlm.cxx:240
 THealAlm.cxx:241
 THealAlm.cxx:242
 THealAlm.cxx:243
 THealAlm.cxx:244
 THealAlm.cxx:245
 THealAlm.cxx:246
 THealAlm.cxx:247
 THealAlm.cxx:248
 THealAlm.cxx:249
 THealAlm.cxx:250
 THealAlm.cxx:251
 THealAlm.cxx:252
 THealAlm.cxx:253
 THealAlm.cxx:254
 THealAlm.cxx:255
 THealAlm.cxx:256
 THealAlm.cxx:257
 THealAlm.cxx:258
 THealAlm.cxx:259
 THealAlm.cxx:260
 THealAlm.cxx:261
 THealAlm.cxx:262
 THealAlm.cxx:263
 THealAlm.cxx:264
 THealAlm.cxx:265
 THealAlm.cxx:266
 THealAlm.cxx:267
 THealAlm.cxx:268
 THealAlm.cxx:269
 THealAlm.cxx:270
 THealAlm.cxx:271
 THealAlm.cxx:272
 THealAlm.cxx:273
 THealAlm.cxx:274
 THealAlm.cxx:275
 THealAlm.cxx:276
 THealAlm.cxx:277
 THealAlm.cxx:278
 THealAlm.cxx:279
 THealAlm.cxx:280
 THealAlm.cxx:281
 THealAlm.cxx:282
 THealAlm.cxx:283
 THealAlm.cxx:284
 THealAlm.cxx:285
 THealAlm.cxx:286
 THealAlm.cxx:287
 THealAlm.cxx:288
 THealAlm.cxx:289
 THealAlm.cxx:290
 THealAlm.cxx:291
 THealAlm.cxx:292
 THealAlm.cxx:293
 THealAlm.cxx:294
 THealAlm.cxx:295
 THealAlm.cxx:296
 THealAlm.cxx:297
 THealAlm.cxx:298
 THealAlm.cxx:299
 THealAlm.cxx:300
 THealAlm.cxx:301
 THealAlm.cxx:302
 THealAlm.cxx:303
 THealAlm.cxx:304
 THealAlm.cxx:305
 THealAlm.cxx:306
 THealAlm.cxx:307
 THealAlm.cxx:308
 THealAlm.cxx:309
 THealAlm.cxx:310
 THealAlm.cxx:311
 THealAlm.cxx:312
 THealAlm.cxx:313
 THealAlm.cxx:314
 THealAlm.cxx:315
 THealAlm.cxx:316
 THealAlm.cxx:317
 THealAlm.cxx:318
 THealAlm.cxx:319
 THealAlm.cxx:320
 THealAlm.cxx:321
 THealAlm.cxx:322
 THealAlm.cxx:323
 THealAlm.cxx:324
 THealAlm.cxx:325
 THealAlm.cxx:326
 THealAlm.cxx:327
 THealAlm.cxx:328
 THealAlm.cxx:329
 THealAlm.cxx:330
 THealAlm.cxx:331
 THealAlm.cxx:332
 THealAlm.cxx:333
 THealAlm.cxx:334
 THealAlm.cxx:335
 THealAlm.cxx:336
 THealAlm.cxx:337
 THealAlm.cxx:338
 THealAlm.cxx:339
 THealAlm.cxx:340
 THealAlm.cxx:341
 THealAlm.cxx:342
 THealAlm.cxx:343
 THealAlm.cxx:344
 THealAlm.cxx:345
 THealAlm.cxx:346
 THealAlm.cxx:347
 THealAlm.cxx:348
 THealAlm.cxx:349
 THealAlm.cxx:350
 THealAlm.cxx:351
 THealAlm.cxx:352
 THealAlm.cxx:353
 THealAlm.cxx:354
 THealAlm.cxx:355
 THealAlm.cxx:356
 THealAlm.cxx:357
 THealAlm.cxx:358
 THealAlm.cxx:359
 THealAlm.cxx:360
 THealAlm.cxx:361
 THealAlm.cxx:362
 THealAlm.cxx:363
 THealAlm.cxx:364
 THealAlm.cxx:365
 THealAlm.cxx:366
 THealAlm.cxx:367
 THealAlm.cxx:368
 THealAlm.cxx:369
 THealAlm.cxx:370
 THealAlm.cxx:371
 THealAlm.cxx:372
 THealAlm.cxx:373
 THealAlm.cxx:374
 THealAlm.cxx:375
 THealAlm.cxx:376
 THealAlm.cxx:377
 THealAlm.cxx:378
 THealAlm.cxx:379
 THealAlm.cxx:380
 THealAlm.cxx:381
 THealAlm.cxx:382
 THealAlm.cxx:383
 THealAlm.cxx:384
 THealAlm.cxx:385
 THealAlm.cxx:386
 THealAlm.cxx:387
 THealAlm.cxx:388
 THealAlm.cxx:389
 THealAlm.cxx:390
 THealAlm.cxx:391
 THealAlm.cxx:392
 THealAlm.cxx:393
 THealAlm.cxx:394
 THealAlm.cxx:395
 THealAlm.cxx:396
 THealAlm.cxx:397
 THealAlm.cxx:398
 THealAlm.cxx:399
 THealAlm.cxx:400
 THealAlm.cxx:401
 THealAlm.cxx:402
 THealAlm.cxx:403
 THealAlm.cxx:404
 THealAlm.cxx:405
 THealAlm.cxx:406
 THealAlm.cxx:407
 THealAlm.cxx:408
 THealAlm.cxx:409
 THealAlm.cxx:410
 THealAlm.cxx:411
 THealAlm.cxx:412
 THealAlm.cxx:413
 THealAlm.cxx:414
 THealAlm.cxx:415
 THealAlm.cxx:416
 THealAlm.cxx:417
 THealAlm.cxx:418
 THealAlm.cxx:419
 THealAlm.cxx:420
 THealAlm.cxx:421
 THealAlm.cxx:422
 THealAlm.cxx:423
 THealAlm.cxx:424
 THealAlm.cxx:425
 THealAlm.cxx:426
 THealAlm.cxx:427
 THealAlm.cxx:428
 THealAlm.cxx:429
 THealAlm.cxx:430
 THealAlm.cxx:431
 THealAlm.cxx:432
 THealAlm.cxx:433
 THealAlm.cxx:434
 THealAlm.cxx:435
 THealAlm.cxx:436
 THealAlm.cxx:437
 THealAlm.cxx:438
 THealAlm.cxx:439
 THealAlm.cxx:440
 THealAlm.cxx:441
 THealAlm.cxx:442
 THealAlm.cxx:443
 THealAlm.cxx:444
 THealAlm.cxx:445
 THealAlm.cxx:446
 THealAlm.cxx:447
 THealAlm.cxx:448
 THealAlm.cxx:449
 THealAlm.cxx:450
 THealAlm.cxx:451
 THealAlm.cxx:452
 THealAlm.cxx:453
 THealAlm.cxx:454
 THealAlm.cxx:455
 THealAlm.cxx:456
 THealAlm.cxx:457
 THealAlm.cxx:458
 THealAlm.cxx:459
 THealAlm.cxx:460
 THealAlm.cxx:461
 THealAlm.cxx:462
 THealAlm.cxx:463
 THealAlm.cxx:464
 THealAlm.cxx:465
 THealAlm.cxx:466
 THealAlm.cxx:467
 THealAlm.cxx:468
 THealAlm.cxx:469
 THealAlm.cxx:470
 THealAlm.cxx:471
 THealAlm.cxx:472
 THealAlm.cxx:473
 THealAlm.cxx:474
 THealAlm.cxx:475
 THealAlm.cxx:476
 THealAlm.cxx:477
 THealAlm.cxx:478
 THealAlm.cxx:479
 THealAlm.cxx:480
 THealAlm.cxx:481
 THealAlm.cxx:482
 THealAlm.cxx:483
 THealAlm.cxx:484
 THealAlm.cxx:485
 THealAlm.cxx:486
 THealAlm.cxx:487
 THealAlm.cxx:488
 THealAlm.cxx:489
 THealAlm.cxx:490
 THealAlm.cxx:491
 THealAlm.cxx:492