Skip to content
Snippets Groups Projects
Select Git revision
  • 9ee20990731ddccba7a2a02d9e0ac645b2d75303
  • master default protected
  • MAM-90-executor-with-cwltool
  • MAM-88-change-status-names
  • MAM-50-specification-GUI
  • MAM-44-build-specification-functionality
  • MAM-42-ATDBspec-add-endpoints
  • MAM-41-ATDBspec-database-changes
  • bugfix-ingested-sizes
  • SDC-1663-inputs-validation
  • SDC-1649-compression-pipeline-quality-indicators
  • SDC-1635-monitoring-page
  • split-pipeline-for-gitlab
  • SDC-1590-database-changes
  • SDC-1580-adapt-configuration-to-multi-service
  • multi-edit
  • SDC-1552-datamodel-add-service-host
  • logentry_graph
  • SDC-1549-aggregation-task-ux
  • imaging-compression-pipeline-commissioning
  • unit-tests
21 results

calculated_qualities.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    WH_BGL_Processing.cc 86.54 KiB
    //#  WH_BGL_Processing.cc: Blue Gene processing for 1 second of sampled data
    //#
    //#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
    //#
    //#  This program is free software; you can redistribute it and/or modify
    //#  it under the terms of the GNU General Public License as published by
    //#  the Free Software Foundation; either version 2 of the License, or
    //#  (at your option) any later version.
    //#
    //#  This program is distributed in the hope that it will be useful,
    //#  but WITHOUT ANY WARRANTY; without even the implied warranty of
    //#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    //#  GNU General Public License for more details.
    //#
    //#  You should have received a copy of the GNU General Public License
    //#  along with this program; if not, write to the Free Software
    //#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    //#
    //#  $Id$
    
    //# Always #include <lofar_config.h> first!
    #include <lofar_config.h>
    
    //# Includes
    #include <CS1_BGLProc/WH_BGL_Processing.h>
    #include <CS1_BGLProc/Correlator.h>
    #include <CS1_BGLProc/FFT.h>
    #include <CS1_BGLProc/FIR.h>
    
    #include <Common/Timer.h>
    #include <Transport/TH_MPI.h>
    
    #include <complex>
    #include <cmath>
    
    #if defined HAVE_MASS
    #include <mass.h>
    #endif
    
    #if defined HAVE_BGL
    #include <rts.h>
    #endif
    
    namespace LOFAR {
    namespace CS1 {
    
    #if !defined HAVE_MASS
    
    inline static dcomplex cosisin(double x)
    {
      return makedcomplex(cos(x), sin(x));
    }
    
    #endif
    
    vector<double> WH_BGL_Processing::itsCenterFrequencies;
    FIR WH_BGL_Processing::itsFIRs[NR_STATIONS][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS] CACHE_ALIGNED;
    fcomplex WH_BGL_Processing::samples[NR_SUBBAND_CHANNELS][NR_STATIONS][NR_SAMPLES_PER_INTEGRATION | 2][NR_POLARIZATIONS] CACHE_ALIGNED;
    #if defined SPARSE_FLAGS
    SparseSet WH_BGL_Processing::flags[NR_STATIONS];
    #else
    bitset<NR_SAMPLES_PER_INTEGRATION> WH_BGL_Processing::flags[NR_STATIONS] CACHE_ALIGNED;
    #endif
    unsigned WH_BGL_Processing::itsNrValidSamples[NR_BASELINES] CACHE_ALIGNED;
    float WH_BGL_Processing::correlationWeights[NR_SAMPLES_PER_INTEGRATION + 1] CACHE_ALIGNED;
    
    #if defined HAVE_BGL && !defined C_IMPLEMENTATION
    static BGL_Mutex *mutex;
    #endif
    
    static NSTimer computeFlagsTimer("computeFlags", true);
    static NSTimer FIRtimer("FIRtimer", true);
    static NSTimer FFTtimer("FFT", true);
    static NSTimer doPPFtimer("doPPF()", true);
    static NSTimer doCorrelateTimer("doCorrelate()", true);
    static NSTimer weightTimer("weight", true);
    static NSTimer computeTimer("computing", true);
    
    
    // The first subband is from -98 KHz to 98 KHz, rather than from 0 to 195 KHz.
    // To avoid that the FFT outputs the channels in the wrong order (from 128 to
    // 255 followed by channels 0 to 127), we multiply each second FFT input by -1.
    // This is efficiently achieved by negating the FIR filter constants of all
    // uneven FIR filters.
    
    const float FIR::weights[NR_SUBBAND_CHANNELS][NR_TAPS] CACHE_ALIGNED = {
    #if NR_SUBBAND_CHANNELS == 256 && NR_TAPS == 16
      {  0.011659500, -0.011535200,  0.005131880,  0.001219900,
        -0.006891530,  0.011598600, -0.015420900,  1.000000000,
        -0.011661800,  0.009847130, -0.005852040,  0.000558600,
         0.005549120, -0.011758700,  0.011716500,  0.000414833 },
      { -0.011602000,  0.011311400, -0.004715490, -0.001878750,
         0.007926170, -0.013340200,  0.019147200, -0.999948000,
         0.007870030, -0.008086100,  0.004807840,  0.000105072,
        -0.005967150,  0.011982000, -0.011773000, -0.000414623 },
      {  0.011544100, -0.011087500,  0.004299990,  0.002535060,
        -0.008955820,  0.015071700, -0.022840300,  0.999843000,
        -0.004045800,  0.006315690, -0.003759060, -0.000771025,
         0.006385910, -0.012205000,  0.011829000,  0.000414214 },
      { -0.011485700,  0.010863400, -0.003885440, -0.003188740,
         0.009980360, -0.016793100,  0.026500200, -0.999686000,
         0.000189332, -0.004536100,  0.002705860,  0.001439170,
        -0.006805360,  0.012427700, -0.011884500, -0.000413633 },
      {  0.011426900, -0.010639200,  0.003471880,  0.003839710,
        -0.010999700,  0.018503900, -0.030126600,  0.999477000,
         0.003699140,  0.002747570, -0.001648360, -0.002109420,
         0.007225430, -0.012650100,  0.011939500,  0.000412915 },
      { -0.011367600,  0.010414900, -0.003059380, -0.004487890,
         0.012013600, -0.020204200,  0.033719300, -0.999215000,
        -0.007619390, -0.000950314,  0.000586709,  0.002781680,
        -0.007646080,  0.012872200, -0.011993900, -0.000412106 },
      {  0.011307900, -0.010190500,  0.002647990,  0.005133180,
        -0.013021900,  0.021893500, -0.037278100,  0.998901000,
         0.011571200, -0.000855436,  0.000478948, -0.003455870,
         0.008067240, -0.013093800,  0.012047800,  0.000411265 },
      { -0.011247800,  0.009966110, -0.002237740, -0.005775510,
         0.014024700, -0.023571800,  0.040802900, -0.998535000,
        -0.015554300,  0.002669450, -0.001548470,  0.004131890,
        -0.008488880,  0.013315100, -0.012101100, -0.000410456 },
      {  0.011187300, -0.009741670,  0.001828700,  0.006414810,
        -0.015021700,  0.025238900, -0.044293400,  0.998117000,
         0.019568500, -0.004491510,  0.002621710, -0.004809650,
         0.008910910, -0.013535900,  0.012153900,  0.000409752 },
      { -0.011126400,  0.009517230, -0.001420910, -0.007050970,
         0.016012700, -0.026894500,  0.047749500, -0.997646000,
        -0.023613500,  0.006321360, -0.003698520,  0.005489070,
        -0.009333300,  0.013756200, -0.012206100, -0.000409230 },
      {  0.011065200, -0.009292840,  0.001014430,  0.007683930,
        -0.016997800,  0.028538400, -0.051171100,  0.997124000,
         0.027689100, -0.008158790,  0.004778750, -0.006170040,
         0.009755990, -0.013976000,  0.012257600,  0.000408972 },
      { -0.011003500,  0.009068510, -0.000609294, -0.008313610,
         0.017976700, -0.030170600,  0.054557800, -0.996549000,
        -0.031795100,  0.010003500, -0.005862260,  0.006852470,
        -0.010178900,  0.014195300, -0.012308600, -0.000409063 },
      {  0.010941500, -0.008844280,  0.000205562,  0.008939920,
        -0.018949300,  0.031790600, -0.057909700,  0.995922000,
         0.035931100, -0.011855400,  0.006948890, -0.007536270,
         0.010602000, -0.014414000,  0.012358900,  0.000409585 },
      { -0.010879200,  0.008620160,  0.000196720, -0.009562800,
         0.019915600, -0.033398500,  0.061226400, -0.995244000,
        -0.040096900,  0.013714100, -0.008038500,  0.008221360,
        -0.011025300,  0.014632100, -0.012408600, -0.000410621 },
      {  0.010816400, -0.008396190, -0.000597505,  0.010182200,
        -0.020875300,  0.034994000, -0.064507900,  0.994513000,
         0.044292300, -0.015579400,  0.009130930, -0.008907620,
         0.011448600, -0.014849700,  0.012457700,  0.000412251 },
      { -0.010753400,  0.008172400,  0.000996745, -0.010797900,
         0.021828400, -0.036576900,  0.067754100, -0.993731000,
        -0.048517000,  0.017451100, -0.010226000,  0.009594970,
        -0.011871900,  0.015066500, -0.012506100, -0.000414547 },
      {  0.010690100, -0.007948800, -0.001394390,  0.011410000,
        -0.022774800,  0.038147100, -0.070964600,  0.992897000,
         0.052770700, -0.019328800,  0.011323700, -0.010283300,
         0.012295200, -0.015282700,  0.012553800,  0.000417579 },
      { -0.010626400,  0.007725430,  0.001790400, -0.012018300,
         0.023714300, -0.039704400,  0.074139500, -0.992011000,
        -0.057053200,  0.021212500, -0.012423600,  0.010972500,
        -0.012718300,  0.015498200, -0.012600900, -0.000421406 },
      {  0.010562400, -0.007502300, -0.002184730,  0.012622900,
        -0.024646800,  0.041248500, -0.077278600,  0.991074000,
         0.061364100, -0.023101700,  0.013525800, -0.011662600,
         0.013141300, -0.015712900,  0.012647200,  0.000426080 },
      { -0.010498200,  0.007279450,  0.002577320, -0.013223500,
         0.025572200, -0.042779400,  0.080381600, -0.990085000,
        -0.065703200,  0.024996400, -0.014630100,  0.012353300,
        -0.013564100,  0.015926800, -0.012692900, -0.000431643 },
      {  0.010433600, -0.007056910, -0.002968140,  0.013820200,
        -0.026490500,  0.044296800, -0.083448600,  0.989045000,
         0.070070300, -0.026896100,  0.015736200, -0.013044600,
         0.013986600, -0.016140000,  0.012737800,  0.000438126 },
      { -0.010368800,  0.006834680,  0.003357130, -0.014412800,
         0.027401400, -0.045800700,  0.086479400, -0.987953000,
        -0.074464900,  0.028800600, -0.016844000,  0.013736500,
        -0.014408800,  0.016352300, -0.012782000, -0.000445550 },
      {  0.010303700, -0.006612810, -0.003744260,  0.015001400,
        -0.028304900,  0.047290800, -0.089473800,  0.986810000,
         0.078886800, -0.030709800,  0.017953500, -0.014428700,
         0.014830600, -0.016563700,  0.012825500,  0.000453924 },
      { -0.010238400,  0.006391310,  0.004129480, -0.015585700,
         0.029200900, -0.048766900,  0.092431700, -0.985617000,
        -0.083335800,  0.032623200, -0.019064300,  0.015121200,
        -0.015251900,  0.016774300, -0.012868200, -0.000463250 },
      {  0.010172900, -0.006170210, -0.004512750,  0.016165800,
        -0.030089200,  0.050229000, -0.095353100,  0.984372000,
         0.087811500, -0.034540800,  0.020176400, -0.015814000,
         0.015672700, -0.016983900,  0.012910200,  0.000473514 },
      { -0.010107100,  0.005949540,  0.004894020, -0.016741600,
         0.030969900, -0.051676900,  0.098237800, -0.983076000,
        -0.092313600,  0.036462100, -0.021289600,  0.016506800,
        -0.016092900,  0.017192600, -0.012951400, -0.000484696 },
      {  0.010041100, -0.005729310, -0.005273240,  0.017313100,
        -0.031842600,  0.053110400, -0.101086000,  0.981730000,
         0.096841900, -0.038386900,  0.022403700, -0.017199700,
         0.016512500, -0.017400200,  0.012991800,  0.000496767 },
      { -0.009974950,  0.005509550,  0.005650390, -0.017880100,
         0.032707500, -0.054529300,  0.103897000, -0.980333000,
        -0.101396000,  0.040315000, -0.023518600,  0.017892400,
        -0.016931400,  0.017606900, -0.013031400, -0.000509689 },
      {  0.009908570, -0.005290280, -0.006025420,  0.018442500,
        -0.033564300,  0.055933600, -0.106671000,  0.978886000,
         0.105975000, -0.042246100,  0.024634100, -0.018585000,
         0.017349500, -0.017812500,  0.013070200,  0.000523415 },
      { -0.009842020,  0.005071530,  0.006398270, -0.019000400,
         0.034413000, -0.057323100,  0.109408000, -0.977388000,
        -0.110580000,  0.044180000, -0.025750100,  0.019277200,
        -0.017766900,  0.018017000, -0.013108200, -0.000537896 },
      {  0.009775290, -0.004853320, -0.006768930,  0.019553700,
        -0.035253500,  0.058697600, -0.112107000,  0.975840000,
         0.115210000, -0.046116200,  0.026866300, -0.019969100,
         0.018183300, -0.018220400,  0.013145400,  0.000553077 },
      { -0.009708410,  0.004635680,  0.007137330, -0.020102300,
         0.036085600, -0.060057000,  0.114770000, -0.974242000,
        -0.119864000,  0.048054700, -0.027982600,  0.020660400,
        -0.018598800,  0.018422700, -0.013181700, -0.000568899 },
      {  0.009641370, -0.004418620, -0.007503460,  0.020646100,
        -0.036909400,  0.061401200, -0.117395000,  0.972595000,
         0.124542000, -0.049995000,  0.029098800, -0.021351200,
         0.019013400, -0.018623700,  0.013217200,  0.000585302 },
      { -0.009574200,  0.004202160,  0.007867250, -0.021185100,
         0.037724600, -0.062730000,  0.119983000, -0.970897000,
        -0.129244000,  0.051936900, -0.030214800,  0.022041200,
        -0.019426800,  0.018823600, -0.013251800, -0.000602227 },
      {  0.009506900, -0.003986340, -0.008228680,  0.021719200,
        -0.038531200,  0.064043400, -0.122533000,  0.969150000,
         0.133970000, -0.053880200,  0.031330400, -0.022730400,
         0.019839200, -0.019022200,  0.013285600,  0.000619615 },
      { -0.009439470,  0.003771170,  0.008587720, -0.022248400,
         0.039329200, -0.065341100,  0.125045000, -0.967354000,
        -0.138719000,  0.055824500, -0.032445500,  0.023418700,
        -0.020250300,  0.019219600, -0.013318400, -0.000637409 },
      {  0.009371930, -0.003556670, -0.008944310,  0.022772500,
        -0.040118300,  0.066623100, -0.127520000,  0.965508000,
         0.143491000, -0.057769600,  0.033559800, -0.024106000,
         0.020660300, -0.019415600,  0.013350400,  0.000655555 },
      { -0.009304290,  0.003342870,  0.009298430, -0.023291700,
         0.040898700, -0.067889200,  0.129958000, -0.963614000,
        -0.148285000,  0.059715200, -0.034673200,  0.024792100,
        -0.021068900,  0.019610300, -0.013381400, -0.000674005 },
      {  0.009236550, -0.003129790, -0.009650030,  0.023805700,
        -0.041670100,  0.069139400, -0.132357000,  0.961670000,
         0.153101000, -0.061661000,  0.035785500, -0.025477100,
         0.021476100, -0.019803700,  0.013411500,  0.000692716 },
      { -0.009168730,  0.002917450,  0.009999080, -0.024314500,
         0.042432500, -0.070373400,  0.134719000, -0.959678000,
        -0.157939000,  0.063606700, -0.036896600,  0.026160600,
        -0.021882000,  0.019995700, -0.013440700, -0.000711649 },
      {  0.009100820, -0.002705870, -0.010345600,  0.024818200,
        -0.043185700,  0.071591300, -0.137043000,  0.957637000,
         0.162799000, -0.065552000,  0.038006300, -0.026842800,
         0.022286300, -0.020186200,  0.013469000,  0.000730774 },
      { -0.009032840,  0.002495060,  0.010689400, -0.025316500,
         0.043929900, -0.072792800,  0.139329000, -0.955548000,
        -0.167680000,  0.067496700, -0.039114400,  0.027523400,
        -0.022689100,  0.020375300, -0.013496200, -0.000750066 },
      {  0.008964800, -0.002285070, -0.011030600,  0.025809600,
        -0.044664700,  0.073977900, -0.141578000,  0.953411000,
         0.172581000, -0.069440400,  0.040220700, -0.028202300,
         0.023090300, -0.020562800,  0.013522500,  0.000769507 },
      { -0.008896700,  0.002075890,  0.011369100, -0.026297300,
         0.045390300, -0.075146500,  0.143788000, -0.951226000,
        -0.177503000,  0.071382800, -0.041325100,  0.028879500,
        -0.023489900,  0.020748900, -0.013547900, -0.000789086 },
      {  0.008828540, -0.001867560, -0.011704900,  0.026779500,
        -0.046106400,  0.076298500, -0.145960000,  0.948994000,
         0.182445000, -0.073323800,  0.042427300, -0.029554900,
         0.023887600, -0.020933400,  0.013572200,  0.000808800 },
      { -0.008760350,  0.001660090,  0.012037900, -0.027256300,
         0.046813100, -0.077433700,  0.148095000, -0.946714000,
        -0.187407000,  0.075262900, -0.043527300,  0.030228300,
        -0.024283600,  0.021116400, -0.013595500, -0.000828649 },
      {  0.008692120, -0.001453500, -0.012368200,  0.027727600,
        -0.047510200,  0.078552200, -0.150191000,  0.944386000,
         0.192388000, -0.077199800,  0.044624900, -0.030899600,
         0.024677800, -0.021297700,  0.013617800,  0.000848641 },
      { -0.008623860,  0.001247820,  0.012695600, -0.028193200,
         0.048197700, -0.079653700,  0.152249000, -0.942012000,
        -0.197388000,  0.079134300, -0.045719800,  0.031568700,
        -0.025070000,  0.021477300, -0.013639100, -0.000868789 },
      {  0.008555590, -0.001043050, -0.013020200,  0.028653300,
        -0.048875600,  0.080738200, -0.154269000,  0.939591000,
         0.202406000, -0.081066100,  0.046811900, -0.032235500,
         0.025460200, -0.021655300,  0.013659300,  0.000889109 },
      { -0.008487300,  0.000839230,  0.013341900, -0.029107700,
         0.049543700, -0.081805600,  0.156252000, -0.937123000,
        -0.207442000,  0.082994900, -0.047901000,  0.032900000,
        -0.025848400,  0.021831600, -0.013678500, -0.000909621 },
      {  0.008419010, -0.000636364, -0.013660700,  0.029556500,
        -0.050202100,  0.082855900, -0.158196000,  0.934609000,
         0.212496000, -0.084920300,  0.048986900, -0.033562000,
         0.026234500, -0.022006200,  0.013696600,  0.000930348 },
      { -0.008350720,  0.000434476,  0.013976600, -0.029999400,
         0.050850500, -0.083888900,  0.160102000, -0.932049000,
        -0.217568000,  0.086842200, -0.050069600,  0.034221300,
        -0.026618500,  0.022179000, -0.013713600, -0.000951314 },
      {  0.008282450, -0.000233582, -0.014289400,  0.030436600,
        -0.051489100,  0.084904600, -0.161970000,  0.929443000,
         0.222657000, -0.088760100,  0.051148700, -0.034878000,
         0.027000200, -0.022350000,  0.013729500,  0.000972545 },
      { -0.008214200,  0.000033699,  0.014599300, -0.030868000,
         0.052117600, -0.085902800,  0.163800000, -0.926792000,
        -0.227762000,  0.090673700, -0.052224200,  0.035531800,
        -0.027379600,  0.022519100, -0.013744400, -0.000994065 },
      {  0.008145980,  0.000165153, -0.014906200,  0.031293500,
        -0.052736100,  0.086883600, -0.165592000,  0.924095000,
         0.232883000, -0.092582800,  0.053295800, -0.036182700,
         0.027756600, -0.022686400,  0.013758100,  0.001015900 },
      { -0.008077800, -0.000362959,  0.015210000, -0.031713100,
         0.053344600, -0.087846900,  0.167346000, -0.921353000,
        -0.238020000,  0.094487100, -0.054363300,  0.036830600,
        -0.028131300,  0.022851800, -0.013770700, -0.001038070 },
      {  0.008009680,  0.000559702, -0.015510700,  0.032126700,
        -0.053942900,  0.088792500, -0.169062000,  0.918566000,
         0.243173000, -0.096386300,  0.055426700, -0.037475400,
         0.028503500, -0.023015300,  0.013782200,  0.001060610 },
      { -0.007941610, -0.000755366,  0.015808300, -0.032534400,
         0.054531000, -0.089720400,  0.170740000, -0.915735000,
        -0.248340000,  0.098280000, -0.056485700,  0.038117000,
        -0.028873100,  0.023176800, -0.013792600, -0.001083520 },
      {  0.007873600,  0.000949933, -0.016102800,  0.032936000,
        -0.055108900,  0.090630600, -0.172380000,  0.912859000,
         0.253523000, -0.100168000,  0.057540100, -0.038755100,
         0.029240200, -0.023336400,  0.013801800,  0.001106820 },
      { -0.007805680, -0.001143390,  0.016394100, -0.033331600,
         0.055676400, -0.091523000,  0.173982000, -0.909939000,
        -0.258719000,  0.102050000, -0.058589800,  0.039389900,
        -0.029604600,  0.023493900, -0.013809800, -0.001130530 },
      {  0.007737840,  0.001335720, -0.016682300,  0.033721100,
        -0.056233700,  0.092397600, -0.175546000,  0.906976000,
         0.263929000, -0.103925000,  0.059634500, -0.040021100,
         0.029966300, -0.023649400,  0.013816700,  0.001154660 },
      { -0.007670090, -0.001526900,  0.016967200, -0.034104500,
         0.056780500, -0.093254300,  0.177073000, -0.903969000,
        -0.269153000,  0.105794000, -0.060674200,  0.040648600,
        -0.030325200,  0.023802800, -0.013822400, -0.001179210 },
      {  0.007602450,  0.001716930, -0.017248900,  0.034481800,
        -0.057317000,  0.094092900, -0.178561000,  0.900919000,
         0.274389000, -0.107656000,  0.061708600, -0.041272400,
         0.030681200, -0.023954100,  0.013826900,  0.001204190 },
      { -0.007534920, -0.001905780,  0.017527400, -0.034852800,
         0.057842900, -0.094913600,  0.180012000, -0.897826000,
        -0.279638000,  0.109510000, -0.062737600,  0.041892300,
        -0.031034400,  0.024103300, -0.013830200, -0.001229590 },
      {  0.007467500,  0.002093450, -0.017802500,  0.035217700,
        -0.058358400,  0.095716300, -0.181426000,  0.894690000,
         0.284899000, -0.111357000,  0.063761000, -0.042508200,
         0.031384600, -0.024250300,  0.013832300,  0.001255410 },
      { -0.007400210, -0.002279910,  0.018074400, -0.035576300,
         0.058863300, -0.096500800,  0.182801000, -0.891512000,
        -0.290172000,  0.113196000, -0.064778500,  0.043120000,
        -0.031731800,  0.024395100, -0.013833100, -0.001281660 },
      {  0.007333050,  0.002465150, -0.018342900,  0.035928600,
        -0.059357700,  0.097267200, -0.184139000,  0.888292000,
         0.295456000, -0.115027000,  0.065790100, -0.043727700,
         0.032075900, -0.024537700,  0.013832800,  0.001308310 },
      { -0.007266020, -0.002649160,  0.018608200, -0.036274700,
         0.059841400, -0.098015500,  0.185440000, -0.885030000,
        -0.300751000,  0.116849000, -0.066795600,  0.044331000,
        -0.032416900,  0.024678000, -0.013831200, -0.001335360 },
      {  0.007199140,  0.002831930, -0.018870000,  0.036614400,
        -0.060314500,  0.098745500, -0.186703000,  0.881727000,
         0.306057000, -0.118663000,  0.067794800, -0.044930000,
         0.032754700, -0.024816100,  0.013828300,  0.001362810 },
      { -0.007132410, -0.003013430,  0.019128500, -0.036947800,
         0.060777000, -0.099457400,  0.187929000, -0.878383000,
        -0.311372000,  0.120467000, -0.068787400,  0.045524500,
        -0.033089200,  0.024951900, -0.013824200, -0.001390630 },
      {  0.007065840,  0.003193670, -0.019383500,  0.037274800,
        -0.061228700,  0.100151000, -0.189118000,  0.874998000,
         0.316697000, -0.122261000,  0.069773400, -0.046114300,
         0.033420400, -0.025085300,  0.013818800,  0.001418820 },
      { -0.006999420, -0.003372610,  0.019635200, -0.037595400,
         0.061669700, -0.100826000,  0.190269000, -0.871573000,
        -0.322032000,  0.124046000, -0.070752600,  0.046699500,
        -0.033748200,  0.025216300, -0.013812100, -0.001447370 },
      {  0.006933170,  0.003550250, -0.019883400,  0.037909600,
        -0.062100000,  0.101483000, -0.191383000,  0.868108000,
         0.327374000, -0.125821000,  0.071724700, -0.047279900,
         0.034072600, -0.025345000,  0.013804200,  0.001476260 },
      { -0.006867080, -0.003726580,  0.020128100, -0.038217400,
         0.062519400, -0.102122000,  0.192461000, -0.864602000,
        -0.332726000,  0.127585000, -0.072689700,  0.047855300,
        -0.034393500,  0.025471200, -0.013794900, -0.001505490 },
      {  0.006801170,  0.003901590, -0.020369400,  0.038518700,
        -0.062928100,  0.102742000, -0.193501000,  0.861058000,
         0.338085000, -0.129339000,  0.073647200, -0.048425700,
         0.034710800, -0.025595000,  0.013784300,  0.001535060 },
      { -0.006735430, -0.004075260,  0.020607200, -0.038813500,
         0.063325900, -0.103344000,  0.194505000, -0.857474000,
        -0.343451000,  0.131082000, -0.074597300,  0.048991000,
        -0.035024600,  0.025716300, -0.013772400, -0.001564950 },
      {  0.006669880,  0.004247570, -0.020841500,  0.039101900,
        -0.063712900,  0.103928000, -0.195471000,  0.853851000,
         0.348824000, -0.132813000,  0.075539700, -0.049551100,
         0.035334600, -0.025835000,  0.013759200,  0.001595150 },
      { -0.006604510, -0.004418520,  0.021072300, -0.039383700,
         0.064089100, -0.104493000,  0.196402000, -0.850190000,
        -0.354204000,  0.134532000, -0.076474100,  0.050105900,
        -0.035641000,  0.025951300, -0.013744600, -0.001625680 },
      {  0.006539330,  0.004588100, -0.021299500,  0.039659100,
        -0.064454400,  0.105040000, -0.197295000,  0.846491000,
         0.359590000, -0.136240000,  0.077400500, -0.050655300,
         0.035943500, -0.026065000,  0.013728700,  0.001656520 },
      { -0.006474340, -0.004756290,  0.021523200, -0.039927800,
         0.064808800, -0.105568000,  0.198153000, -0.842754000,
        -0.364982000,  0.137935000, -0.078318700,  0.051199100,
        -0.036242200,  0.026176100, -0.013711400, -0.001687680 },
      {  0.006409560,  0.004923090, -0.021743400,  0.040190100,
        -0.065152300,  0.106078000, -0.198974000,  0.838980000,
         0.370379000, -0.139618000,  0.079228600, -0.051737300,
         0.036537000, -0.026284600,  0.013692700,  0.001719160 },
      { -0.006344970, -0.005088480,  0.021959900, -0.040445700,
         0.065484900, -0.106570000,  0.199758000, -0.835168000,
        -0.375780000,  0.141287000, -0.080129800,  0.052269800,
        -0.036827900,  0.026390400, -0.013672700, -0.001750970 },
      {  0.006280600,  0.005252450, -0.022172900,  0.040694800,
        -0.065806500,  0.107043000, -0.200507000,  0.831320000,
         0.381186000, -0.142944000,  0.081022300, -0.052796500,
         0.037114800, -0.026493600,  0.013651200,  0.001783110 },
      { -0.006216440, -0.005415000,  0.022382300, -0.040937300,
         0.066117300, -0.107498000,  0.201220000, -0.827436000,
        -0.386596000,  0.144586000, -0.081905900,  0.053317300,
        -0.037397500,  0.026594100, -0.013628400, -0.001815590 },
      {  0.006152510,  0.005576110, -0.022588000,  0.041173200,
        -0.066417100,  0.107935000, -0.201897000,  0.823515000,
         0.392009000, -0.146215000,  0.082780500, -0.053832000,
         0.037676200, -0.026691800,  0.013604200,  0.001848420 },
      { -0.006088800, -0.005735770,  0.022790200, -0.041402500,
         0.066706000, -0.108353000,  0.202539000, -0.819559000,
        -0.397425000,  0.147830000, -0.083645800,  0.054340600,
        -0.037950700,  0.026786800, -0.013578500, -0.001881610 },
      {  0.006025320,  0.005893980, -0.022988700,  0.041625200,
        -0.066983900,  0.108753000, -0.203145000,  0.815568000,
         0.402843000, -0.149431000,  0.084501700, -0.054843000,
         0.038221000, -0.026879000,  0.013551500,  0.001915170 },
      { -0.005962090, -0.006050720,  0.023183600, -0.041841300,
         0.067250900, -0.109135000,  0.203715000, -0.811542000,
        -0.408264000,  0.151016000, -0.085348100,  0.055339100,
        -0.038486900,  0.026968500, -0.013523000, -0.001949110 },
      {  0.005899110,  0.006205990, -0.023374800,  0.042050800,
        -0.067507000,  0.109498000, -0.204250000,  0.807481000,
         0.413686000, -0.152586000,  0.086184700, -0.055828800,
         0.038748600, -0.027055100,  0.013493100,  0.001983430 },
      { -0.005836370, -0.006359780,  0.023562400, -0.042253600,
         0.067752100, -0.109843000,  0.204751000, -0.803387000,
        -0.419109000,  0.154141000, -0.087011400,  0.056312000,
        -0.039005800,  0.027138800, -0.013461700, -0.002018150 },
      {  0.005773900,  0.006512080, -0.023746300,  0.042449800,
        -0.067986300,  0.110170000, -0.205216000,  0.799258000,
         0.424533000, -0.155681000,  0.087828100, -0.056788600,
         0.039258600, -0.027219700,  0.013428900,  0.002053260 },
      { -0.005711700, -0.006662890,  0.023926500, -0.042639300,
         0.068209600, -0.110479000,  0.205646000, -0.795096000,
        -0.429957000,  0.157204000, -0.088634500,  0.057258500,
        -0.039506900,  0.027297700, -0.013394600, -0.002088790 },
      {  0.005649770,  0.006812190, -0.024103100,  0.042822200,
        -0.068422000,  0.110769000, -0.206042000,  0.790902000,
         0.435380000, -0.158711000,  0.089430600, -0.057721700,
         0.039750700, -0.027372700,  0.013358900,  0.002124730 },
      { -0.005588130, -0.006959980,  0.024275900, -0.042998500,
         0.068623400, -0.111041000,  0.206403000, -0.786674000,
        -0.440803000,  0.160201000, -0.090216100,  0.058177900,
        -0.039989900,  0.027444800, -0.013321700, -0.002161090 },
      {  0.005526770,  0.007106250, -0.024445100,  0.043168100,
        -0.068814000,  0.111295000, -0.206731000,  0.782415000,
         0.446225000, -0.161674000,  0.090990900, -0.058627200,
         0.040224400, -0.027514000,  0.013283000,  0.002197860 },
      { -0.005465700, -0.007251000,  0.024610600, -0.043331100,
         0.068993700, -0.111531000,  0.207023000, -0.778123000,
        -0.451645000,  0.163130000, -0.091754800,  0.059069400,
        -0.040454200,  0.027580100, -0.013242800, -0.002235060 },
      {  0.005404930,  0.007394220, -0.024772300,  0.043487500,
        -0.069162500,  0.111750000, -0.207282000,  0.773801000,
         0.457063000, -0.164568000,  0.092507700, -0.059504500,
         0.040679200, -0.027643200,  0.013201200,  0.002272680 },
      { -0.005344460, -0.007535900,  0.024930400, -0.043637200,
         0.069320400, -0.111950000,  0.207508000, -0.769447000,
        -0.462478000,  0.165988000, -0.093249500,  0.059932300,
        -0.040899500,  0.027703300, -0.013158100, -0.002310720 },
      {  0.005284290,  0.007676030, -0.025084700,  0.043780300,
        -0.069467500,  0.112132000, -0.207699000,  0.765063000,
         0.467891000, -0.167391000,  0.093979900, -0.060352800,
         0.041114900, -0.027760300,  0.013113400,  0.002349170 },
      { -0.005224440, -0.007814610,  0.025235300, -0.043916800,
         0.069603800, -0.112296000,  0.207857000, -0.760649000,
        -0.473299000,  0.168774000, -0.094698800,  0.060765800,
        -0.041325400,  0.027814200, -0.013067200, -0.002388040 },
      {  0.005164890,  0.007951640, -0.025382200,  0.044046600,
        -0.069729300,  0.112442000, -0.207982000,  0.756204000,
         0.478704000, -0.170139000,  0.095406000, -0.061171400,
         0.041530900, -0.027865000,  0.013019600,  0.002427310 },
      { -0.005105670, -0.008087110,  0.025525400, -0.044169900,
         0.069844000, -0.112571000,  0.208074000, -0.751731000,
        -0.484104000,  0.171485000, -0.096101500,  0.061569300,
        -0.041731400,  0.027912700, -0.012970400, -0.002466990 },
      {  0.005046750,  0.008221000, -0.025664900,  0.044286500,
        -0.069947900,  0.112682000, -0.208133000,  0.747228000,
         0.489500000, -0.172811000,  0.096785000, -0.061959600,
         0.041926900, -0.027957300,  0.012919600,  0.002507070 },
      { -0.004988160, -0.008353330,  0.025800600, -0.044396600,
         0.070041100, -0.112775000,  0.208159000, -0.742698000,
        -0.494890000,  0.174118000, -0.097456400,  0.062342100,
        -0.042117300,  0.027998600, -0.012867400, -0.002547540 },
      {  0.004929880,  0.008484080, -0.025932700,  0.044500000,
        -0.070123600,  0.112850000, -0.208153000,  0.738138000,
         0.500274000, -0.175405000,  0.098115500, -0.062716700,
         0.042302600, -0.028036800,  0.012813600,  0.002588390 },
      { -0.004871920, -0.008613240,  0.026060900, -0.044596900,
         0.070195500, -0.112908000,  0.208114000, -0.733552000,
        -0.505652000,  0.176671000, -0.098762300,  0.063083500,
        -0.042482700,  0.028071700, -0.012758200, -0.002629630 },
      {  0.004814280,  0.008740820, -0.026185500,  0.044687200,
        -0.070256600,  0.112949000, -0.208043000,  0.728938000,
         0.511023000, -0.177917000,  0.099396500, -0.063442100,
         0.042657500, -0.028103500,  0.012701300,  0.002671240 },
      { -0.004756970, -0.008866800,  0.026306400, -0.044771000,
         0.070307200, -0.112972000,  0.207941000, -0.724297000,
        -0.516386000,  0.179142000, -0.100018000,  0.063792700,
        -0.042827100,  0.028131900, -0.012642800, -0.002713230 },
      {  0.004699970,  0.008991190, -0.026423500,  0.044848200,
        -0.070347100,  0.112977000, -0.207806000,  0.719630000,
         0.521742000, -0.180346000,  0.100627000, -0.064135100,
         0.042991400, -0.028157100,  0.012582800,  0.002755580 },
      { -0.004643290, -0.009113970,  0.026536900, -0.044918900,
         0.070376500, -0.112966000,  0.207641000, -0.714936000,
        -0.527090000,  0.181528000, -0.101222000,  0.064469200,
        -0.043150300,  0.028179000, -0.012521200, -0.002798310 },
      {  0.004586940,  0.009235160, -0.026646600,  0.044983100,
        -0.070395400,  0.112937000, -0.207444000,  0.710218000,
         0.532429000, -0.182688000,  0.101805000, -0.064795000,
         0.043303700, -0.028197600,  0.012458000,  0.002841390 },
      { -0.004530910, -0.009354740,  0.026752600, -0.045040800,
         0.070403800, -0.112891000,  0.207216000, -0.705474000,
        -0.537759000,  0.183827000, -0.102374000,  0.065112400,
        -0.043451800,  0.028212900, -0.012393300, -0.002884840 },
      {  0.004475210,  0.009472700, -0.026854800,  0.045092000,
        -0.070401800,  0.112828000, -0.206957000,  0.700705000,
         0.543079000, -0.184943000,  0.102930000, -0.065421200,
         0.043594300, -0.028224800,  0.012327000,  0.002928660 },
      { -0.004419840, -0.009589060,  0.026953400, -0.045136800,
         0.070389300, -0.112748000,  0.206667000, -0.695912000,
        -0.548389000,  0.186036000, -0.103473000,  0.065721500,
        -0.043731300,  0.028233400, -0.012259000, -0.002972840 },
      {  0.004364790,  0.009703800, -0.027048300,  0.045175100,
        -0.070366500,  0.112651000, -0.206347000,  0.691096000,
         0.553689000, -0.187106000,  0.104001000, -0.066013100,
         0.043862800, -0.028238600,  0.012189500,  0.003017380 },
      { -0.004310080, -0.009816920,  0.027139400, -0.045207000,
         0.070333300, -0.112537000,  0.205997000, -0.686256000,
        -0.558978000,  0.188154000, -0.104516000,  0.066296000,
        -0.043988600,  0.028240400, -0.012118400, -0.003062300 },
      {  0.004255710,  0.009928420, -0.027226900,  0.045232400,
        -0.070289900,  0.112406000, -0.205617000,  0.681393000,
         0.564255000, -0.189177000,  0.105017000, -0.066570100,
         0.044108700, -0.028238700,  0.012045700,  0.003107590 },
      { -0.004201670, -0.010038300,  0.027310700, -0.045251500,
         0.070236200, -0.112259000,  0.205208000, -0.676508000,
        -0.569520000,  0.190177000, -0.105504000,  0.066835300,
        -0.044223200,  0.028233700, -0.011971400, -0.003153250 },
      {  0.004147990,  0.010146600, -0.027390800,  0.045264300,
        -0.070172300,  0.112096000, -0.204769000,  0.671600000,
         0.574773000, -0.191153000,  0.105976000, -0.067091500,
         0.044332000, -0.028225200,  0.011895500,  0.003199290 },
      { -0.004094650, -0.010253200,  0.027467200, -0.045270600,
         0.070098300, -0.111916000,  0.204300000, -0.666671000,
        -0.580013000,  0.192105000, -0.106435000,  0.067338800,
        -0.044435000,  0.028213200, -0.011818000, -0.003245720 },
      {  0.004041660,  0.010358200, -0.027540000,  0.045270700,
        -0.070014200,  0.111719000, -0.203803000,  0.661721000,
         0.585239000, -0.193032000,  0.106879000, -0.067576900,
         0.044532100, -0.028197800,  0.011738900,  0.003292530 },
      { -0.003989040, -0.010461600,  0.027609100, -0.045264500,
         0.069920000, -0.111506000,  0.203277000, -0.656750000,
        -0.590452000,  0.193934000, -0.107308000,  0.067805900,
        -0.044623500,  0.028178800, -0.011658200, -0.003339730 },
      {  0.003936790,  0.010563400, -0.027674600,  0.045252000,
        -0.069815800,  0.111277000, -0.202722000,  0.651759000,
         0.595651000, -0.194811000,  0.107722000, -0.068025700,
         0.044708900, -0.028156400,  0.011575800,  0.003387320 },
      { -0.003884900, -0.010663500,  0.027736400, -0.045233300,
         0.069701700, -0.111032000,  0.202139000, -0.646748000,
        -0.600834000,  0.195663000, -0.108122000,  0.068236100,
        -0.044788500,  0.028130400, -0.011491900, -0.003435300 },
      {  0.003833390,  0.010762100, -0.027794600,  0.045208300,
        -0.069577700,  0.110771000, -0.201528000,  0.641718000,
         0.606003000, -0.196489000,  0.108507000, -0.068437200,
         0.044862100, -0.028101000,  0.011406300,  0.003483680 },
      { -0.003782260, -0.010859000,  0.027849100, -0.045177200,
         0.069443800, -0.110495000,  0.200890000, -0.636669000,
        -0.611156000,  0.197289000, -0.108877000,  0.068628900,
        -0.044929800,  0.028067900, -0.011319200, -0.003532460 },
      {  0.003731520,  0.010954200, -0.027900100,  0.045139900,
        -0.069300200,  0.110202000, -0.200223000,  0.631601000,
         0.616292000, -0.198062000,  0.109231000, -0.068811100,
         0.044991400, -0.028031300,  0.011230400,  0.003581630 },
      { -0.003681160, -0.011047900,  0.027947400, -0.045096500,
         0.069146800, -0.109894000,  0.199530000, -0.626516000,
        -0.621413000,  0.198809000, -0.109570000,  0.068983800,
        -0.045047000,  0.027991200, -0.011139900, -0.003631200 },
      {  0.003631200,  0.011139900, -0.027991200,  0.045047000,
        -0.068983800,  0.109570000, -0.198809000,  0.621413000,
         0.626516000, -0.199530000,  0.109894000, -0.069146800,
         0.045096500, -0.027947400,  0.011047900,  0.003681160 },
      { -0.003581630, -0.011230400,  0.028031300, -0.044991400,
         0.068811100, -0.109231000,  0.198062000, -0.616292000,
        -0.631601000,  0.200223000, -0.110202000,  0.069300200,
        -0.045139900,  0.027900100, -0.010954200, -0.003731520 },
      {  0.003532460,  0.011319200, -0.028067900,  0.044929800,
        -0.068628900,  0.108877000, -0.197289000,  0.611156000,
         0.636669000, -0.200890000,  0.110495000, -0.069443800,
         0.045177200, -0.027849100,  0.010859000,  0.003782260 },
      { -0.003483680, -0.011406300,  0.028101000, -0.044862100,
         0.068437200, -0.108507000,  0.196489000, -0.606003000,
        -0.641718000,  0.201528000, -0.110771000,  0.069577700,
        -0.045208300,  0.027794600, -0.010762100, -0.003833390 },
      {  0.003435300,  0.011491900, -0.028130400,  0.044788500,
        -0.068236100,  0.108122000, -0.195663000,  0.600834000,
         0.646748000, -0.202139000,  0.111032000, -0.069701700,
         0.045233300, -0.027736400,  0.010663500,  0.003884900 },
      { -0.003387320, -0.011575800,  0.028156400, -0.044708900,
         0.068025700, -0.107722000,  0.194811000, -0.595651000,
        -0.651759000,  0.202722000, -0.111277000,  0.069815800,
        -0.045252000,  0.027674600, -0.010563400, -0.003936790 },
      {  0.003339730,  0.011658200, -0.028178800,  0.044623500,
        -0.067805900,  0.107308000, -0.193934000,  0.590452000,
         0.656750000, -0.203277000,  0.111506000, -0.069920000,
         0.045264500, -0.027609100,  0.010461600,  0.003989040 },
      { -0.003292530, -0.011738900,  0.028197800, -0.044532100,
         0.067576900, -0.106879000,  0.193032000, -0.585239000,
        -0.661721000,  0.203803000, -0.111719000,  0.070014200,
        -0.045270700,  0.027540000, -0.010358200, -0.004041660 },
      {  0.003245720,  0.011818000, -0.028213200,  0.044435000,
        -0.067338800,  0.106435000, -0.192105000,  0.580013000,
         0.666671000, -0.204300000,  0.111916000, -0.070098300,
         0.045270600, -0.027467200,  0.010253200,  0.004094650 },
      { -0.003199290, -0.011895500,  0.028225200, -0.044332000,
         0.067091500, -0.105976000,  0.191153000, -0.574773000,
        -0.671600000,  0.204769000, -0.112096000,  0.070172300,
        -0.045264300,  0.027390800, -0.010146600, -0.004147990 },
      {  0.003153250,  0.011971400, -0.028233700,  0.044223200,
        -0.066835300,  0.105504000, -0.190177000,  0.569520000,
         0.676508000, -0.205208000,  0.112259000, -0.070236200,
         0.045251500, -0.027310700,  0.010038300,  0.004201670 },
      { -0.003107590, -0.012045700,  0.028238700, -0.044108700,
         0.066570100, -0.105017000,  0.189177000, -0.564255000,
        -0.681393000,  0.205617000, -0.112406000,  0.070289900,
        -0.045232400,  0.027226900, -0.009928420, -0.004255710 },
      {  0.003062300,  0.012118400, -0.028240400,  0.043988600,
        -0.066296000,  0.104516000, -0.188154000,  0.558978000,
         0.686256000, -0.205997000,  0.112537000, -0.070333300,
         0.045207000, -0.027139400,  0.009816920,  0.004310080 },
      { -0.003017380, -0.012189500,  0.028238600, -0.043862800,
         0.066013100, -0.104001000,  0.187106000, -0.553689000,
        -0.691096000,  0.206347000, -0.112651000,  0.070366500,
        -0.045175100,  0.027048300, -0.009703800, -0.004364790 },
      {  0.002972840,  0.012259000, -0.028233400,  0.043731300,
        -0.065721500,  0.103473000, -0.186036000,  0.548389000,
         0.695912000, -0.206667000,  0.112748000, -0.070389300,
         0.045136800, -0.026953400,  0.009589060,  0.004419840 },
      { -0.002928660, -0.012327000,  0.028224800, -0.043594300,
         0.065421200, -0.102930000,  0.184943000, -0.543079000,
        -0.700705000,  0.206957000, -0.112828000,  0.070401800,
        -0.045092000,  0.026854800, -0.009472700, -0.004475210 },
      {  0.002884840,  0.012393300, -0.028212900,  0.043451800,
        -0.065112400,  0.102374000, -0.183827000,  0.537759000,
         0.705474000, -0.207216000,  0.112891000, -0.070403800,
         0.045040800, -0.026752600,  0.009354740,  0.004530910 },
      { -0.002841390, -0.012458000,  0.028197600, -0.043303700,
         0.064795000, -0.101805000,  0.182688000, -0.532429000,
        -0.710218000,  0.207444000, -0.112937000,  0.070395400,
        -0.044983100,  0.026646600, -0.009235160, -0.004586940 },
      {  0.002798310,  0.012521200, -0.028179000,  0.043150300,
        -0.064469200,  0.101222000, -0.181528000,  0.527090000,
         0.714936000, -0.207641000,  0.112966000, -0.070376500,
         0.044918900, -0.026536900,  0.009113970,  0.004643290 },
      { -0.002755580, -0.012582800,  0.028157100, -0.042991400,
         0.064135100, -0.100627000,  0.180346000, -0.521742000,
        -0.719630000,  0.207806000, -0.112977000,  0.070347100,
        -0.044848200,  0.026423500, -0.008991190, -0.004699970 },
      {  0.002713230,  0.012642800, -0.028131900,  0.042827100,
        -0.063792700,  0.100018000, -0.179142000,  0.516386000,
         0.724297000, -0.207941000,  0.112972000, -0.070307200,
         0.044771000, -0.026306400,  0.008866800,  0.004756970 },
      { -0.002671240, -0.012701300,  0.028103500, -0.042657500,
         0.063442100, -0.099396500,  0.177917000, -0.511023000,
        -0.728938000,  0.208043000, -0.112949000,  0.070256600,
        -0.044687200,  0.026185500, -0.008740820, -0.004814280 },
      {  0.002629630,  0.012758200, -0.028071700,  0.042482700,
        -0.063083500,  0.098762300, -0.176671000,  0.505652000,
         0.733552000, -0.208114000,  0.112908000, -0.070195500,
         0.044596900, -0.026060900,  0.008613240,  0.004871920 },
      { -0.002588390, -0.012813600,  0.028036800, -0.042302600,
         0.062716700, -0.098115500,  0.175405000, -0.500274000,
        -0.738138000,  0.208153000, -0.112850000,  0.070123600,
        -0.044500000,  0.025932700, -0.008484080, -0.004929880 },
      {  0.002547540,  0.012867400, -0.027998600,  0.042117300,
        -0.062342100,  0.097456400, -0.174118000,  0.494890000,
         0.742698000, -0.208159000,  0.112775000, -0.070041100,
         0.044396600, -0.025800600,  0.008353330,  0.004988160 },
      { -0.002507070, -0.012919600,  0.027957300, -0.041926900,
         0.061959600, -0.096785000,  0.172811000, -0.489500000,
        -0.747228000,  0.208133000, -0.112682000,  0.069947900,
        -0.044286500,  0.025664900, -0.008221000, -0.005046750 },
      {  0.002466990,  0.012970400, -0.027912700,  0.041731400,
        -0.061569300,  0.096101500, -0.171485000,  0.484104000,
         0.751731000, -0.208074000,  0.112571000, -0.069844000,
         0.044169900, -0.025525400,  0.008087110,  0.005105670 },
      { -0.002427310, -0.013019600,  0.027865000, -0.041530900,
         0.061171400, -0.095406000,  0.170139000, -0.478704000,
        -0.756204000,  0.207982000, -0.112442000,  0.069729300,
        -0.044046600,  0.025382200, -0.007951640, -0.005164890 },
      {  0.002388040,  0.013067200, -0.027814200,  0.041325400,
        -0.060765800,  0.094698800, -0.168774000,  0.473299000,
         0.760649000, -0.207857000,  0.112296000, -0.069603800,
         0.043916800, -0.025235300,  0.007814610,  0.005224440 },
      { -0.002349170, -0.013113400,  0.027760300, -0.041114900,
         0.060352800, -0.093979900,  0.167391000, -0.467891000,
        -0.765063000,  0.207699000, -0.112132000,  0.069467500,
        -0.043780300,  0.025084700, -0.007676030, -0.005284290 },
      {  0.002310720,  0.013158100, -0.027703300,  0.040899500,
        -0.059932300,  0.093249500, -0.165988000,  0.462478000,
         0.769447000, -0.207508000,  0.111950000, -0.069320400,
         0.043637200, -0.024930400,  0.007535900,  0.005344460 },
      { -0.002272680, -0.013201200,  0.027643200, -0.040679200,
         0.059504500, -0.092507700,  0.164568000, -0.457063000,
        -0.773801000,  0.207282000, -0.111750000,  0.069162500,
        -0.043487500,  0.024772300, -0.007394220, -0.005404930 },
      {  0.002235060,  0.013242800, -0.027580100,  0.040454200,
        -0.059069400,  0.091754800, -0.163130000,  0.451645000,
         0.778123000, -0.207023000,  0.111531000, -0.068993700,
         0.043331100, -0.024610600,  0.007251000,  0.005465700 },
      { -0.002197860, -0.013283000,  0.027514000, -0.040224400,
         0.058627200, -0.090990900,  0.161674000, -0.446225000,
        -0.782415000,  0.206731000, -0.111295000,  0.068814000,
        -0.043168100,  0.024445100, -0.007106250, -0.005526770 },
      {  0.002161090,  0.013321700, -0.027444800,  0.039989900,
        -0.058177900,  0.090216100, -0.160201000,  0.440803000,
         0.786674000, -0.206403000,  0.111041000, -0.068623400,
         0.042998500, -0.024275900,  0.006959980,  0.005588130 },
      { -0.002124730, -0.013358900,  0.027372700, -0.039750700,
         0.057721700, -0.089430600,  0.158711000, -0.435380000,
        -0.790902000,  0.206042000, -0.110769000,  0.068422000,
        -0.042822200,  0.024103100, -0.006812190, -0.005649770 },
      {  0.002088790,  0.013394600, -0.027297700,  0.039506900,
        -0.057258500,  0.088634500, -0.157204000,  0.429957000,
         0.795096000, -0.205646000,  0.110479000, -0.068209600,
         0.042639300, -0.023926500,  0.006662890,  0.005711700 },
      { -0.002053260, -0.013428900,  0.027219700, -0.039258600,
         0.056788600, -0.087828100,  0.155681000, -0.424533000,
        -0.799258000,  0.205216000, -0.110170000,  0.067986300,
        -0.042449800,  0.023746300, -0.006512080, -0.005773900 },
      {  0.002018150,  0.013461700, -0.027138800,  0.039005800,
        -0.056312000,  0.087011400, -0.154141000,  0.419109000,
         0.803387000, -0.204751000,  0.109843000, -0.067752100,
         0.042253600, -0.023562400,  0.006359780,  0.005836370 },
      { -0.001983430, -0.013493100,  0.027055100, -0.038748600,
         0.055828800, -0.086184700,  0.152586000, -0.413686000,
        -0.807481000,  0.204250000, -0.109498000,  0.067507000,
        -0.042050800,  0.023374800, -0.006205990, -0.005899110 },
      {  0.001949110,  0.013523000, -0.026968500,  0.038486900,
        -0.055339100,  0.085348100, -0.151016000,  0.408264000,
         0.811542000, -0.203715000,  0.109135000, -0.067250900,
         0.041841300, -0.023183600,  0.006050720,  0.005962090 },
      { -0.001915170, -0.013551500,  0.026879000, -0.038221000,
         0.054843000, -0.084501700,  0.149431000, -0.402843000,
        -0.815568000,  0.203145000, -0.108753000,  0.066983900,
        -0.041625200,  0.022988700, -0.005893980, -0.006025320 },
      {  0.001881610,  0.013578500, -0.026786800,  0.037950700,
        -0.054340600,  0.083645800, -0.147830000,  0.397425000,
         0.819559000, -0.202539000,  0.108353000, -0.066706000,
         0.041402500, -0.022790200,  0.005735770,  0.006088800 },
      { -0.001848420, -0.013604200,  0.026691800, -0.037676200,
         0.053832000, -0.082780500,  0.146215000, -0.392009000,
        -0.823515000,  0.201897000, -0.107935000,  0.066417100,
        -0.041173200,  0.022588000, -0.005576110, -0.006152510 },
      {  0.001815590,  0.013628400, -0.026594100,  0.037397500,
        -0.053317300,  0.081905900, -0.144586000,  0.386596000,
         0.827436000, -0.201220000,  0.107498000, -0.066117300,
         0.040937300, -0.022382300,  0.005415000,  0.006216440 },
      { -0.001783110, -0.013651200,  0.026493600, -0.037114800,
         0.052796500, -0.081022300,  0.142944000, -0.381186000,
        -0.831320000,  0.200507000, -0.107043000,  0.065806500,
        -0.040694800,  0.022172900, -0.005252450, -0.006280600 },
      {  0.001750970,  0.013672700, -0.026390400,  0.036827900,
        -0.052269800,  0.080129800, -0.141287000,  0.375780000,
         0.835168000, -0.199758000,  0.106570000, -0.065484900,
         0.040445700, -0.021959900,  0.005088480,  0.006344970 },
      { -0.001719160, -0.013692700,  0.026284600, -0.036537000,
         0.051737300, -0.079228600,  0.139618000, -0.370379000,
        -0.838980000,  0.198974000, -0.106078000,  0.065152300,
        -0.040190100,  0.021743400, -0.004923090, -0.006409560 },
      {  0.001687680,  0.013711400, -0.026176100,  0.036242200,
        -0.051199100,  0.078318700, -0.137935000,  0.364982000,
         0.842754000, -0.198153000,  0.105568000, -0.064808800,
         0.039927800, -0.021523200,  0.004756290,  0.006474340 },
      { -0.001656520, -0.013728700,  0.026065000, -0.035943500,
         0.050655300, -0.077400500,  0.136240000, -0.359590000,
        -0.846491000,  0.197295000, -0.105040000,  0.064454400,
        -0.039659100,  0.021299500, -0.004588100, -0.006539330 },
      {  0.001625680,  0.013744600, -0.025951300,  0.035641000,
        -0.050105900,  0.076474100, -0.134532000,  0.354204000,
         0.850190000, -0.196402000,  0.104493000, -0.064089100,
         0.039383700, -0.021072300,  0.004418520,  0.006604510 },
      { -0.001595150, -0.013759200,  0.025835000, -0.035334600,
         0.049551100, -0.075539700,  0.132813000, -0.348824000,
        -0.853851000,  0.195471000, -0.103928000,  0.063712900,
        -0.039101900,  0.020841500, -0.004247570, -0.006669880 },
      {  0.001564950,  0.013772400, -0.025716300,  0.035024600,
        -0.048991000,  0.074597300, -0.131082000,  0.343451000,
         0.857474000, -0.194505000,  0.103344000, -0.063325900,
         0.038813500, -0.020607200,  0.004075260,  0.006735430 },
      { -0.001535060, -0.013784300,  0.025595000, -0.034710800,
         0.048425700, -0.073647200,  0.129339000, -0.338085000,
        -0.861058000,  0.193501000, -0.102742000,  0.062928100,
        -0.038518700,  0.020369400, -0.003901590, -0.006801170 },
      {  0.001505490,  0.013794900, -0.025471200,  0.034393500,
        -0.047855300,  0.072689700, -0.127585000,  0.332726000,
         0.864602000, -0.192461000,  0.102122000, -0.062519400,
         0.038217400, -0.020128100,  0.003726580,  0.006867080 },
      { -0.001476260, -0.013804200,  0.025345000, -0.034072600,
         0.047279900, -0.071724700,  0.125821000, -0.327374000,
        -0.868108000,  0.191383000, -0.101483000,  0.062100000,
        -0.037909600,  0.019883400, -0.003550250, -0.006933170 },
      {  0.001447370,  0.013812100, -0.025216300,  0.033748200,
        -0.046699500,  0.070752600, -0.124046000,  0.322032000,
         0.871573000, -0.190269000,  0.100826000, -0.061669700,
         0.037595400, -0.019635200,  0.003372610,  0.006999420 },
      { -0.001418820, -0.013818800,  0.025085300, -0.033420400,
         0.046114300, -0.069773400,  0.122261000, -0.316697000,
        -0.874998000,  0.189118000, -0.100151000,  0.061228700,
        -0.037274800,  0.019383500, -0.003193670, -0.007065840 },
      {  0.001390630,  0.013824200, -0.024951900,  0.033089200,
        -0.045524500,  0.068787400, -0.120467000,  0.311372000,
         0.878383000, -0.187929000,  0.099457400, -0.060777000,
         0.036947800, -0.019128500,  0.003013430,  0.007132410 },
      { -0.001362810, -0.013828300,  0.024816100, -0.032754700,
         0.044930000, -0.067794800,  0.118663000, -0.306057000,
        -0.881727000,  0.186703000, -0.098745500,  0.060314500,
        -0.036614400,  0.018870000, -0.002831930, -0.007199140 },
      {  0.001335360,  0.013831200, -0.024678000,  0.032416900,
        -0.044331000,  0.066795600, -0.116849000,  0.300751000,
         0.885030000, -0.185440000,  0.098015500, -0.059841400,
         0.036274700, -0.018608200,  0.002649160,  0.007266020 },
      { -0.001308310, -0.013832800,  0.024537700, -0.032075900,
         0.043727700, -0.065790100,  0.115027000, -0.295456000,
        -0.888292000,  0.184139000, -0.097267200,  0.059357700,
        -0.035928600,  0.018342900, -0.002465150, -0.007333050 },
      {  0.001281660,  0.013833100, -0.024395100,  0.031731800,
        -0.043120000,  0.064778500, -0.113196000,  0.290172000,
         0.891512000, -0.182801000,  0.096500800, -0.058863300,
         0.035576300, -0.018074400,  0.002279910,  0.007400210 },
      { -0.001255410, -0.013832300,  0.024250300, -0.031384600,
         0.042508200, -0.063761000,  0.111357000, -0.284899000,
        -0.894690000,  0.181426000, -0.095716300,  0.058358400,
        -0.035217700,  0.017802500, -0.002093450, -0.007467500 },
      {  0.001229590,  0.013830200, -0.024103300,  0.031034400,
        -0.041892300,  0.062737600, -0.109510000,  0.279638000,
         0.897826000, -0.180012000,  0.094913600, -0.057842900,
         0.034852800, -0.017527400,  0.001905780,  0.007534920 },
      { -0.001204190, -0.013826900,  0.023954100, -0.030681200,
         0.041272400, -0.061708600,  0.107656000, -0.274389000,
        -0.900919000,  0.178561000, -0.094092900,  0.057317000,
        -0.034481800,  0.017248900, -0.001716930, -0.007602450 },
      {  0.001179210,  0.013822400, -0.023802800,  0.030325200,
        -0.040648600,  0.060674200, -0.105794000,  0.269153000,
         0.903969000, -0.177073000,  0.093254300, -0.056780500,
         0.034104500, -0.016967200,  0.001526900,  0.007670090 },
      { -0.001154660, -0.013816700,  0.023649400, -0.029966300,
         0.040021100, -0.059634500,  0.103925000, -0.263929000,
        -0.906976000,  0.175546000, -0.092397600,  0.056233700,
        -0.033721100,  0.016682300, -0.001335720, -0.007737840 },
      {  0.001130530,  0.013809800, -0.023493900,  0.029604600,
        -0.039389900,  0.058589800, -0.102050000,  0.258719000,
         0.909939000, -0.173982000,  0.091523000, -0.055676400,
         0.033331600, -0.016394100,  0.001143390,  0.007805680 },
      { -0.001106820, -0.013801800,  0.023336400, -0.029240200,
         0.038755100, -0.057540100,  0.100168000, -0.253523000,
        -0.912859000,  0.172380000, -0.090630600,  0.055108900,
        -0.032936000,  0.016102800, -0.000949933, -0.007873600 },
      {  0.001083520,  0.013792600, -0.023176800,  0.028873100,
        -0.038117000,  0.056485700, -0.098280000,  0.248340000,
         0.915735000, -0.170740000,  0.089720400, -0.054531000,
         0.032534400, -0.015808300,  0.000755366,  0.007941610 },
      { -0.001060610, -0.013782200,  0.023015300, -0.028503500,
         0.037475400, -0.055426700,  0.096386300, -0.243173000,
        -0.918566000,  0.169062000, -0.088792500,  0.053942900,
        -0.032126700,  0.015510700, -0.000559702, -0.008009680 },
      {  0.001038070,  0.013770700, -0.022851800,  0.028131300,
        -0.036830600,  0.054363300, -0.094487100,  0.238020000,
         0.921353000, -0.167346000,  0.087846900, -0.053344600,
         0.031713100, -0.015210000,  0.000362959,  0.008077800 },
      { -0.001015900, -0.013758100,  0.022686400, -0.027756600,
         0.036182700, -0.053295800,  0.092582800, -0.232883000,
        -0.924095000,  0.165592000, -0.086883600,  0.052736100,
        -0.031293500,  0.014906200, -0.000165153, -0.008145980 },
      {  0.000994065,  0.013744400, -0.022519100,  0.027379600,
        -0.035531800,  0.052224200, -0.090673700,  0.227762000,
         0.926792000, -0.163800000,  0.085902800, -0.052117600,
         0.030868000, -0.014599300, -0.000033699,  0.008214200 },
      { -0.000972545, -0.013729500,  0.022350000, -0.027000200,
         0.034878000, -0.051148700,  0.088760100, -0.222657000,
        -0.929443000,  0.161970000, -0.084904600,  0.051489100,
        -0.030436600,  0.014289400,  0.000233582, -0.008282450 },
      {  0.000951314,  0.013713600, -0.022179000,  0.026618500,
        -0.034221300,  0.050069600, -0.086842200,  0.217568000,
         0.932049000, -0.160102000,  0.083888900, -0.050850500,
         0.029999400, -0.013976600, -0.000434476,  0.008350720 },
      { -0.000930348, -0.013696600,  0.022006200, -0.026234500,
         0.033562000, -0.048986900,  0.084920300, -0.212496000,
        -0.934609000,  0.158196000, -0.082855900,  0.050202100,
        -0.029556500,  0.013660700,  0.000636364, -0.008419010 },
      {  0.000909621,  0.013678500, -0.021831600,  0.025848400,
        -0.032900000,  0.047901000, -0.082994900,  0.207442000,
         0.937123000, -0.156252000,  0.081805600, -0.049543700,
         0.029107700, -0.013341900, -0.000839230,  0.008487300 },
      { -0.000889109, -0.013659300,  0.021655300, -0.025460200,
         0.032235500, -0.046811900,  0.081066100, -0.202406000,
        -0.939591000,  0.154269000, -0.080738200,  0.048875600,
        -0.028653300,  0.013020200,  0.001043050, -0.008555590 },
      {  0.000868789,  0.013639100, -0.021477300,  0.025070000,
        -0.031568700,  0.045719800, -0.079134300,  0.197388000,
         0.942012000, -0.152249000,  0.079653700, -0.048197700,
         0.028193200, -0.012695600, -0.001247820,  0.008623860 },
      { -0.000848641, -0.013617800,  0.021297700, -0.024677800,
         0.030899600, -0.044624900,  0.077199800, -0.192388000,
        -0.944386000,  0.150191000, -0.078552200,  0.047510200,
        -0.027727600,  0.012368200,  0.001453500, -0.008692120 },
      {  0.000828649,  0.013595500, -0.021116400,  0.024283600,
        -0.030228300,  0.043527300, -0.075262900,  0.187407000,
         0.946714000, -0.148095000,  0.077433700, -0.046813100,
         0.027256300, -0.012037900, -0.001660090,  0.008760350 },
      { -0.000808800, -0.013572200,  0.020933400, -0.023887600,
         0.029554900, -0.042427300,  0.073323800, -0.182445000,
        -0.948994000,  0.145960000, -0.076298500,  0.046106400,
        -0.026779500,  0.011704900,  0.001867560, -0.008828540 },
      {  0.000789086,  0.013547900, -0.020748900,  0.023489900,
        -0.028879500,  0.041325100, -0.071382800,  0.177503000,
         0.951226000, -0.143788000,  0.075146500, -0.045390300,
         0.026297300, -0.011369100, -0.002075890,  0.008896700 },
      { -0.000769507, -0.013522500,  0.020562800, -0.023090300,
         0.028202300, -0.040220700,  0.069440400, -0.172581000,
        -0.953411000,  0.141578000, -0.073977900,  0.044664700,
        -0.025809600,  0.011030600,  0.002285070, -0.008964800 },
      {  0.000750066,  0.013496200, -0.020375300,  0.022689100,
        -0.027523400,  0.039114400, -0.067496700,  0.167680000,
         0.955548000, -0.139329000,  0.072792800, -0.043929900,
         0.025316500, -0.010689400, -0.002495060,  0.009032840 },
      { -0.000730774, -0.013469000,  0.020186200, -0.022286300,
         0.026842800, -0.038006300,  0.065552000, -0.162799000,
        -0.957637000,  0.137043000, -0.071591300,  0.043185700,
        -0.024818200,  0.010345600,  0.002705870, -0.009100820 },
      {  0.000711649,  0.013440700, -0.019995700,  0.021882000,
        -0.026160600,  0.036896600, -0.063606700,  0.157939000,
         0.959678000, -0.134719000,  0.070373400, -0.042432500,
         0.024314500, -0.009999080, -0.002917450,  0.009168730 },
      { -0.000692716, -0.013411500,  0.019803700, -0.021476100,
         0.025477100, -0.035785500,  0.061661000, -0.153101000,
        -0.961670000,  0.132357000, -0.069139400,  0.041670100,
        -0.023805700,  0.009650030,  0.003129790, -0.009236550 },
      {  0.000674005,  0.013381400, -0.019610300,  0.021068900,
        -0.024792100,  0.034673200, -0.059715200,  0.148285000,
         0.963614000, -0.129958000,  0.067889200, -0.040898700,
         0.023291700, -0.009298430, -0.003342870,  0.009304290 },
      { -0.000655555, -0.013350400,  0.019415600, -0.020660300,
         0.024106000, -0.033559800,  0.057769600, -0.143491000,
        -0.965508000,  0.127520000, -0.066623100,  0.040118300,
        -0.022772500,  0.008944310,  0.003556670, -0.009371930 },
      {  0.000637409,  0.013318400, -0.019219600,  0.020250300,
        -0.023418700,  0.032445500, -0.055824500,  0.138719000,
         0.967354000, -0.125045000,  0.065341100, -0.039329200,
         0.022248400, -0.008587720, -0.003771170,  0.009439470 },
      { -0.000619615, -0.013285600,  0.019022200, -0.019839200,
         0.022730400, -0.031330400,  0.053880200, -0.133970000,
        -0.969150000,  0.122533000, -0.064043400,  0.038531200,
        -0.021719200,  0.008228680,  0.003986340, -0.009506900 },
      {  0.000602227,  0.013251800, -0.018823600,  0.019426800,
        -0.022041200,  0.030214800, -0.051936900,  0.129244000,
         0.970897000, -0.119983000,  0.062730000, -0.037724600,
         0.021185100, -0.007867250, -0.004202160,  0.009574200 },
      { -0.000585302, -0.013217200,  0.018623700, -0.019013400,
         0.021351200, -0.029098800,  0.049995000, -0.124542000,
        -0.972595000,  0.117395000, -0.061401200,  0.036909400,
        -0.020646100,  0.007503460,  0.004418620, -0.009641370 },
      {  0.000568899,  0.013181700, -0.018422700,  0.018598800,
        -0.020660400,  0.027982600, -0.048054700,  0.119864000,
         0.974242000, -0.114770000,  0.060057000, -0.036085600,
         0.020102300, -0.007137330, -0.004635680,  0.009708410 },
      { -0.000553077, -0.013145400,  0.018220400, -0.018183300,
         0.019969100, -0.026866300,  0.046116200, -0.115210000,
        -0.975840000,  0.112107000, -0.058697600,  0.035253500,
        -0.019553700,  0.006768930,  0.004853320, -0.009775290 },
      {  0.000537896,  0.013108200, -0.018017000,  0.017766900,
        -0.019277200,  0.025750100, -0.044180000,  0.110580000,
         0.977388000, -0.109408000,  0.057323100, -0.034413000,
         0.019000400, -0.006398270, -0.005071530,  0.009842020 },
      { -0.000523415, -0.013070200,  0.017812500, -0.017349500,
         0.018585000, -0.024634100,  0.042246100, -0.105975000,
        -0.978886000,  0.106671000, -0.055933600,  0.033564300,
        -0.018442500,  0.006025420,  0.005290280, -0.009908570 },
      {  0.000509689,  0.013031400, -0.017606900,  0.016931400,
        -0.017892400,  0.023518600, -0.040315000,  0.101396000,
         0.980333000, -0.103897000,  0.054529300, -0.032707500,
         0.017880100, -0.005650390, -0.005509550,  0.009974950 },
      { -0.000496767, -0.012991800,  0.017400200, -0.016512500,
         0.017199700, -0.022403700,  0.038386900, -0.096841900,
        -0.981730000,  0.101086000, -0.053110400,  0.031842600,
        -0.017313100,  0.005273240,  0.005729310, -0.010041100 },
      {  0.000484696,  0.012951400, -0.017192600,  0.016092900,
        -0.016506800,  0.021289600, -0.036462100,  0.092313600,
         0.983076000, -0.098237800,  0.051676900, -0.030969900,
         0.016741600, -0.004894020, -0.005949540,  0.010107100 },
      { -0.000473514, -0.012910200,  0.016983900, -0.015672700,
         0.015814000, -0.020176400,  0.034540800, -0.087811500,
        -0.984372000,  0.095353100, -0.050229000,  0.030089200,
        -0.016165800,  0.004512750,  0.006170210, -0.010172900 },
      {  0.000463250,  0.012868200, -0.016774300,  0.015251900,
        -0.015121200,  0.019064300, -0.032623200,  0.083335800,
         0.985617000, -0.092431700,  0.048766900, -0.029200900,
         0.015585700, -0.004129480, -0.006391310,  0.010238400 },
      { -0.000453924, -0.012825500,  0.016563700, -0.014830600,
         0.014428700, -0.017953500,  0.030709800, -0.078886800,
        -0.986810000,  0.089473800, -0.047290800,  0.028304900,
        -0.015001400,  0.003744260,  0.006612810, -0.010303700 },
      {  0.000445550,  0.012782000, -0.016352300,  0.014408800,
        -0.013736500,  0.016844000, -0.028800600,  0.074464900,
         0.987953000, -0.086479400,  0.045800700, -0.027401400,
         0.014412800, -0.003357130, -0.006834680,  0.010368800 },
      { -0.000438126, -0.012737800,  0.016140000, -0.013986600,
         0.013044600, -0.015736200,  0.026896100, -0.070070300,
        -0.989045000,  0.083448600, -0.044296800,  0.026490500,
        -0.013820200,  0.002968140,  0.007056910, -0.010433600 },
      {  0.000431643,  0.012692900, -0.015926800,  0.013564100,
        -0.012353300,  0.014630100, -0.024996400,  0.065703200,
         0.990085000, -0.080381600,  0.042779400, -0.025572200,
         0.013223500, -0.002577320, -0.007279450,  0.010498200 },
      { -0.000426080, -0.012647200,  0.015712900, -0.013141300,
         0.011662600, -0.013525800,  0.023101700, -0.061364100,
        -0.991074000,  0.077278600, -0.041248500,  0.024646800,
        -0.012622900,  0.002184730,  0.007502300, -0.010562400 },
      {  0.000421406,  0.012600900, -0.015498200,  0.012718300,
        -0.010972500,  0.012423600, -0.021212500,  0.057053200,
         0.992011000, -0.074139500,  0.039704400, -0.023714300,
         0.012018300, -0.001790400, -0.007725430,  0.010626400 },
      { -0.000417579, -0.012553800,  0.015282700, -0.012295200,
         0.010283300, -0.011323700,  0.019328800, -0.052770700,
        -0.992897000,  0.070964600, -0.038147100,  0.022774800,
        -0.011410000,  0.001394390,  0.007948800, -0.010690100 },
      {  0.000414547,  0.012506100, -0.015066500,  0.011871900,
        -0.009594970,  0.010226000, -0.017451100,  0.048517000,
         0.993731000, -0.067754100,  0.036576900, -0.021828400,
         0.010797900, -0.000996745, -0.008172400,  0.010753400 },
      { -0.000412251, -0.012457700,  0.014849700, -0.011448600,
         0.008907620, -0.009130930,  0.015579400, -0.044292300,
        -0.994513000,  0.064507900, -0.034994000,  0.020875300,
        -0.010182200,  0.000597505,  0.008396190, -0.010816400 },
      {  0.000410621,  0.012408600, -0.014632100,  0.011025300,
        -0.008221360,  0.008038500, -0.013714100,  0.040096900,
         0.995244000, -0.061226400,  0.033398500, -0.019915600,
         0.009562800, -0.000196720, -0.008620160,  0.010879200 },
      { -0.000409585, -0.012358900,  0.014414000, -0.010602000,
         0.007536270, -0.006948890,  0.011855400, -0.035931100,
        -0.995922000,  0.057909700, -0.031790600,  0.018949300,
        -0.008939920, -0.000205562,  0.008844280, -0.010941500 },
      {  0.000409063,  0.012308600, -0.014195300,  0.010178900,
        -0.006852470,  0.005862260, -0.010003500,  0.031795100,
         0.996549000, -0.054557800,  0.030170600, -0.017976700,
         0.008313610,  0.000609294, -0.009068510,  0.011003500 },
      { -0.000408972, -0.012257600,  0.013976000, -0.009755990,
         0.006170040, -0.004778750,  0.008158790, -0.027689100,
        -0.997124000,  0.051171100, -0.028538400,  0.016997800,
        -0.007683930, -0.001014430,  0.009292840, -0.011065200 },
      {  0.000409230,  0.012206100, -0.013756200,  0.009333300,
        -0.005489070,  0.003698520, -0.006321360,  0.023613500,
         0.997646000, -0.047749500,  0.026894500, -0.016012700,
         0.007050970,  0.001420910, -0.009517230,  0.011126400 },
      { -0.000409752, -0.012153900,  0.013535900, -0.008910910,
         0.004809650, -0.002621710,  0.004491510, -0.019568500,
        -0.998117000,  0.044293400, -0.025238900,  0.015021700,
        -0.006414810, -0.001828700,  0.009741670, -0.011187300 },
      {  0.000410456,  0.012101100, -0.013315100,  0.008488880,
        -0.004131890,  0.001548470, -0.002669450,  0.015554300,
         0.998535000, -0.040802900,  0.023571800, -0.014024700,
         0.005775510,  0.002237740, -0.009966110,  0.011247800 },
      { -0.000411265, -0.012047800,  0.013093800, -0.008067240,
         0.003455870, -0.000478948,  0.000855436, -0.011571200,
        -0.998901000,  0.037278100, -0.021893500,  0.013021900,
        -0.005133180, -0.002647990,  0.010190500, -0.011307900 },
      {  0.000412106,  0.011993900, -0.012872200,  0.007646080,
        -0.002781680, -0.000586709,  0.000950314,  0.007619390,
         0.999215000, -0.033719300,  0.020204200, -0.012013600,
         0.004487890,  0.003059380, -0.010414900,  0.011367600 },
      { -0.000412915, -0.011939500,  0.012650100, -0.007225430,
         0.002109420,  0.001648360, -0.002747570, -0.003699140,
        -0.999477000,  0.030126600, -0.018503900,  0.010999700,
        -0.003839710, -0.003471880,  0.010639200, -0.011426900 },
      {  0.000413633,  0.011884500, -0.012427700,  0.006805360,
        -0.001439170, -0.002705860,  0.004536100, -0.000189332,
         0.999686000, -0.026500200,  0.016793100, -0.009980360,
         0.003188740,  0.003885440, -0.010863400,  0.011485700 },
      { -0.000414214, -0.011829000,  0.012205000, -0.006385910,
         0.000771025,  0.003759060, -0.006315690,  0.004045800,
        -0.999843000,  0.022840300, -0.015071700,  0.008955820,
        -0.002535060, -0.004299990,  0.011087500, -0.011544100 },
      {  0.000414623,  0.011773000, -0.011982000,  0.005967150,
        -0.000105072, -0.004807840,  0.008086100, -0.007870030,
         0.999948000, -0.019147200,  0.013340200, -0.007926170,
         0.001878750,  0.004715490, -0.011311400,  0.011602000 },
      { -0.000414833, -0.011716500,  0.011758700, -0.005549120,
        -0.000558600,  0.005852040, -0.009847130,  0.011661800,
        -1.000000000,  0.015420900, -0.011598600,  0.006891530,
        -0.001219900, -0.005131880,  0.011535200, -0.011659500 },
    #else
      0
    #endif
    };
    
    
    #if defined C_IMPLEMENTATION
    
    FIR::FIR()
    {
      memset(itsDelayLine, 0, sizeof itsDelayLine);
    }
    
    
    fcomplex FIR::processNextSample(fcomplex sample, const float weights[NR_TAPS])
    {
      fcomplex sum = sample * weights[0];
      itsDelayLine[0] = sample;
    
      for (int tap = NR_TAPS; -- tap > 0;) {
        sum += weights[tap] * itsDelayLine[tap];
        itsDelayLine[tap] = itsDelayLine[tap - 1];
      }
    
      return sum;
    }
    
    #endif
    
    
    WH_BGL_Processing::WH_BGL_Processing(const string& name, unsigned coreNumber, const ACC::APS::ParameterSet &ps)
      :
      WorkHolder(NR_IN_CHANNELS, NR_OUT_CHANNELS, name, "WH_Correlator"),
      itsPS(ps),
      itsCoreNumber(coreNumber)
    {
      ASSERT(ps.getInt32("BGLProc.NPPFTaps")	    == NR_TAPS);
      ASSERT(ps.getInt32("Observation.NStations")	    == NR_STATIONS);
      ASSERT(ps.getInt32("Observation.NPolarisations")  == NR_POLARIZATIONS);
      ASSERT(ps.getInt32("Observation.NSubbandSamples") == NR_SUBBAND_SAMPLES);
      ASSERT(ps.getInt32("Observation.NChannels")	    == NR_SUBBAND_CHANNELS);
    
    #if !defined C_IMPLEMENTATION
      ASSERT(NR_SAMPLES_PER_INTEGRATION % 16 == 0);
    
      ASSERT(_FIR_constants_used.input_type			== INPUT_TYPE);
      ASSERT(_FIR_constants_used.nr_stations		== NR_STATIONS);
      ASSERT(_FIR_constants_used.nr_samples_per_integration	== NR_SAMPLES_PER_INTEGRATION);
      ASSERT(_FIR_constants_used.nr_subband_channels	== NR_SUBBAND_CHANNELS);
      ASSERT(_FIR_constants_used.nr_taps			== NR_TAPS);
      ASSERT(_FIR_constants_used.nr_polarizations		== NR_POLARIZATIONS);
    
      ASSERT(_correlator_constants_used.nr_stations			== NR_STATIONS);
      ASSERT(_correlator_constants_used.nr_samples_per_integration	== NR_SAMPLES_PER_INTEGRATION);
      ASSERT(_correlator_constants_used.nr_subband_channels		== NR_SUBBAND_CHANNELS);
      ASSERT(_correlator_constants_used.nr_polarizations		== NR_POLARIZATIONS);
    #endif
    
      if (itsCenterFrequencies.size() == 0)
        itsCenterFrequencies = ps.getDoubleVector("Observation.RefFreqs");
    
      itsChannelBandwidth = ps.getDouble("Observation.SampleRate") / NR_SUBBAND_CHANNELS;
    
      unsigned nrSubbandsPerPset = ps.getUint32("General.SubbandsPerPset");
      unsigned nrNodesPerPset    = ps.getUint32("BGLProc.NodesPerPset");
    
      itsFirstSubband     = (coreNumber / nrNodesPerPset) * nrSubbandsPerPset;
      itsLastSubband      = itsFirstSubband + nrSubbandsPerPset;
      itsCurrentSubband   = itsFirstSubband + coreNumber % nrNodesPerPset % nrSubbandsPerPset;
      itsSubbandIncrement = nrNodesPerPset % nrSubbandsPerPset;
    
      itsInputConnected   = ps.getBool("Connections.InputToBGLProc");
    
      getDataManager().addInDataHolder(SUBBAND_CHANNEL, new DH_Subband("input", ps));
    //getDataManager().addInDataHolder(RFI_MITIGATION_CHANNEL, new DH_RFI_Mitigation("RFI"));
      getDataManager().addOutDataHolder(VISIBILITIES_CHANNEL, new DH_Visibilities("output", ps));
      getDataManager().setAutoTriggerIn(SUBBAND_CHANNEL, false);
      getDataManager().setAutoTriggerOut(VISIBILITIES_CHANNEL, false);
    }
    
    
    WH_BGL_Processing::~WH_BGL_Processing()
    {
    }
    
    
    WorkHolder* WH_BGL_Processing::construct(const string &name, unsigned coreNumber, const ACC::APS::ParameterSet &ps)
    {
      return new WH_BGL_Processing(name, coreNumber, ps);
    }
    
    
    WH_BGL_Processing* WH_BGL_Processing::make(const string &name)
    {
      return new WH_BGL_Processing(name, itsCoreNumber, itsPS);
    }
    
    
    #if defined HAVE_BGL
    
    void FFTtest()
    {
      fftw_plan plan = fftw_create_plan(256, FFTW_FORWARD, FFTW_ESTIMATE);
    
      fcomplex in[256], fout[256], sout[256];
    
      for (int i = 0; i < 256; i ++)
        in[i] = makefcomplex(2 * i, 2 * i + 1);
    
      fftw_one(plan, (fftw_complex *) in, (fftw_complex *) fout);
    
      _fft256(in, sout);
    
      for (int i = 0; i < 256; i ++) {
        fcomplex diff = fout[i] / sout[i];
        std::cout << i << " (" << real(fout[i]) << ',' << imag(fout[i]) << ") / (" << real(sout[i]) << ',' << imag(sout[i]) << ") = (" << real(diff) << ',' << imag(diff) << ")\n";
      }
    
      //std::exit(0);
    }
    
    #endif
    
    
    void WH_BGL_Processing::preprocess()
    {
    #if defined HAVE_MPI
      std::clog << "node " << TH_MPI::getCurrentRank() << " filters subbands " << itsFirstSubband << " to " << itsLastSubband << " starting at " << itsCurrentSubband << " with " << itsSubbandIncrement << " as increment\n";
    #endif
    
    #if defined HAVE_FFTW3
      fftwf_complex cbuf1[NR_SUBBAND_CHANNELS], cbuf2[NR_SUBBAND_CHANNELS];
      itsFFTWPlan = fftwf_plan_dft_1d(NR_SUBBAND_CHANNELS, cbuf1, cbuf2, FFTW_FORWARD, FFTW_ESTIMATE);
    #elif defined HAVE_FFTW2
    #if defined HAVE_BGL && NR_SUBBAND_CHANNELS == 256
      fftw_import_wisdom_from_string("(FFTW-2.1.5 (256 529 -1 0 1 1 1 352 0) (128 529 -1 0 1 1 0 2817 0) (64 529 -1 0 1 1 0 1409 0) (32 529 -1 0 1 1 0 705 0) (16 529 -1 0 1 1 0 353 0) (8 529 -1 0 1 1 0 177 0) (4 529 -1 0 1 1 0 89 0) (2 529 -1 0 1 1 0 45 0))");
      itsFFTWPlan = fftw_create_plan(NR_SUBBAND_CHANNELS, FFTW_FORWARD, FFTW_USE_WISDOM);
    #else
      itsFFTWPlan = fftw_create_plan(NR_SUBBAND_CHANNELS, FFTW_FORWARD, FFTW_ESTIMATE);
    #endif
    #endif
    
      //FFTtest();
    
      for (int i = 1; i <= NR_SAMPLES_PER_INTEGRATION; i ++) {
    #if INPUT_TYPE == I4COMPLEX_TYPE
        correlationWeights[i] = 1.0 / i;
    #else
        correlationWeights[i] = 1.0e-6 / i;
    #endif
      }
    
    #if defined HAVE_BGL && !defined C_IMPLEMENTATION
      mutex = rts_allocate_mutex();
    #endif
    }
    
    
    void WH_BGL_Processing::computeFlags()
    {
      computeFlagsTimer.start();
    
    #if NR_SUBBAND_CHANNELS == 1
    #if defined SPARSE_FLAGS
    #error Not implementated
    #else
      DH_Subband::AllFlagsType *input = get_DH_Subband()->getFlags();
    
      bitset<NR_INPUT_SAMPLES> (&flags)[NR_STATIONS] = *input;
    #endif
    #else
    #if defined SPARSE_FLAGS
      for (int stat = 0; stat < NR_STATIONS; stat ++) {
        flags[stat].reset();
        const std::vector<SparseSet::range> &ranges = get_DH_Subband()->getFlags(stat).getRanges();
    
        for (std::vector<SparseSet::range>::const_iterator it = ranges.begin(); it != ranges.end(); it ++) {
          int begin = std::max(0, (int) it->begin / NR_SUBBAND_CHANNELS - NR_TAPS + 1);
          int end   = std::min(NR_SAMPLES_PER_INTEGRATION, (int) (it->end - 1) / NR_SUBBAND_CHANNELS + 1);
    
          flags[stat].include(begin, end);
        }
      }
    #else
      typedef bitset<NR_SUBBAND_CHANNELS> inputType[NR_STATIONS][NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION];
    
      inputType *input = (inputType *) get_DH_Subband()->getFlags();
    
      memset(flags, 0, sizeof flags);
    
      for (int stat = 0; stat < NR_STATIONS; stat ++) {
        int invalid_count = 0;
    
        for (int time = 0; time < NR_TAPS - 1; time ++, invalid_count --) {
          if ((*input)[stat][time].any()) {
    	invalid_count = NR_TAPS;
          }
        }
    
        for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++, invalid_count --) {
          if ((*input)[stat][NR_TAPS - 1 + time].any()) {
    	invalid_count = NR_TAPS;
          }
    
          if (invalid_count > 0) {
    	flags[stat][time] = true;
          }
        }
      }
    #endif
    #endif
    
      for (int stat2 = 0; stat2 < NR_STATIONS; stat2 ++) {
        for (int stat1 = 0; stat1 <= stat2; stat1 ++) {
          itsNrValidSamples[DH_Visibilities::baseline(stat1, stat2)] = NR_SAMPLES_PER_INTEGRATION - (flags[stat1] | flags[stat2]).count();
        }
      }
    
      computeFlagsTimer.stop();
    }
    
    
    #if defined DELAY_COMPENSATION
    #if defined C_IMPLEMENTATION
    
    fcomplex WH_BGL_Processing::phaseShift(int time, int chan, double baseFrequency, const DH_Subband::DelayIntervalType &delay) const
    {
      double timeInterpolatedDelay = delay.delayAtBegin + ((double) time / NR_SAMPLES_PER_INTEGRATION) * (delay.delayAfterEnd - delay.delayAtBegin);
      double frequency	       = baseFrequency + chan * itsChannelBandwidth;
      double phaseShift	       = timeInterpolatedDelay * frequency;
      double phi		       = 2.0 * M_PI * phaseShift;
    
      return makefcomplex(std::cos(phi), std::sin(phi));
    }
    
    #else
    
    void WH_BGL_Processing::computePhaseShifts(struct phase_shift phaseShifts[NR_SAMPLES_PER_INTEGRATION], const DH_Subband::DelayIntervalType &delay, double baseFrequency) const
    {
      double   phiBegin = 2 * M_PI * delay.delayAtBegin;
      double   phiEnd   = 2 * M_PI * delay.delayAfterEnd;
      double   deltaPhi = (phiEnd - phiBegin) / NR_SAMPLES_PER_INTEGRATION;
      dcomplex v	    = cosisin(phiBegin * baseFrequency);
      dcomplex dv       = cosisin(phiBegin * itsChannelBandwidth);
      dcomplex vf       = cosisin(deltaPhi * baseFrequency);
      dcomplex dvf      = cosisin(deltaPhi * itsChannelBandwidth);
    
      for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
        phaseShifts[time].v0 =  v;  v *=  vf;
        phaseShifts[time].dv = dv; dv *= dvf;
      }
    }
    
    #endif
    #endif
    
    
    void WH_BGL_Processing::doPPF(double baseFrequency)
    {
      doPPFtimer.start();
    
    #if defined HAVE_BGL && !defined C_IMPLEMENTATION
      _bgl_mutex_lock(mutex);
    #endif
    
    #if defined C_IMPLEMENTATION && defined WORDS_BIGENDIAN
      get_DH_Subband()->swapBytes();
    #endif
    
      typedef DH_Subband::SampleType inputType[NR_STATIONS][NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION][NR_SUBBAND_CHANNELS][NR_POLARIZATIONS];
    
      inputType *input = (inputType *) get_DH_Subband()->getSamples();   
    
    #if defined DELAY_COMPENSATION
      DH_Subband::AllDelaysType *delays = get_DH_Subband()->getDelays();
    #endif
    
      for (int stat = 0; stat < NR_STATIONS; stat ++) {
    #if 0 && defined DELAY_COMPENSATION
        std::clog << "stat " << stat << ", basefreq " << baseFrequency << ": delay from " << (*delays)[stat].delayAtBegin << " to " << (*delays)[stat].delayAfterEnd << " sec" << std::endl;
    #endif
    
    #if defined C_IMPLEMENTATION
        fcomplex fftOutData[NR_SUBBAND_CHANNELS];
        static fcomplex fftInData[NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS];
    
        FIRtimer.start();
        for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
          for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan ++) {
    	for (int time = 0; time < NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION; time ++) {
    	  fcomplex sample = makefcomplex((*input)[stat][time][chan][pol]);
    	  fftInData[time][pol][chan] = itsFIRs[stat][pol][chan].processNextSample(sample, FIR::weights[chan]);
    	}
          }
        }
        FIRtimer.stop();
    
        FFTtimer.start();
        for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
          for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
    #if defined SPARSE_FLAGS
    	if (flags[stat].test(time)) {
    #else
    	if (flags[stat][time]) {
    #endif
    	  for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan ++) {
    	    samples[chan][stat][time][pol] = makefcomplex(0, 0);
    	  }
    	} else {
    #if defined HAVE_FFTW3
    	  fftwf_execute_dft(itsFFTWPlan,
    			    (fftwf_complex *) fftInData[NR_TAPS - 1 + time][pol],
    			    (fftwf_complex *) fftOutData);
    #else
    	  fftw_one(itsFFTWPlan,
    		   (fftw_complex *) fftInData[NR_TAPS - 1 + time][pol],
    		   (fftw_complex *) fftOutData);
    #endif
    
    	  for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan ++) {
    #if defined DELAY_COMPENSATION
    	    fftOutData[chan] *= phaseShift(time, chan, baseFrequency, (*delays)[stat]);
    #endif
    	    samples[chan][stat][time][pol] = fftOutData[chan];
    	  }
    	}
          }
        }
        FFTtimer.stop();
    #else // assembly implementation
        static fcomplex tmp1[4][NR_SAMPLES_PER_INTEGRATION] CACHE_ALIGNED;
        static fcomplex fftInData[NR_SAMPLES_PER_INTEGRATION][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS + 4] CACHE_ALIGNED;
        static fcomplex fftOutData[2][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS] CACHE_ALIGNED;
    
        for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan += 4) {
          for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
    #if defined __GNUC__	// work around bug ???
    	for (register int ch asm ("r28") = 0; ch < 4; ch ++) {
    #else
    	for (int ch = 0; ch < 4; ch ++) {
    #endif
    	  FIRtimer.start();
    	  _filter(0, // itsFIRs[stat][pol][chan + ch].itsDelayLine,
    		  FIR::weights[chan + ch],
    		  &(*input)[stat][0][chan + ch][pol],
    		  tmp1[ch],
    		  NR_SAMPLES_PER_INTEGRATION / NR_TAPS);
    	  FIRtimer.stop();
    	}
    
    	_transpose_4x8(&fftInData[0][pol][chan],
    		       &tmp1[0][0],
    		       NR_SAMPLES_PER_INTEGRATION,
    		       sizeof(fcomplex) * NR_SAMPLES_PER_INTEGRATION,
    		       sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SUBBAND_CHANNELS + 4));
          }
        }
    
    #if defined DELAY_COMPENSATION
        struct phase_shift phaseShifts[NR_SAMPLES_PER_INTEGRATION];
    
        computePhaseShifts(phaseShifts, (*delays)[stat], baseFrequency);
    #endif
    
    #if defined SPARSE_FLAGS
        const std::vector<SparseSet::range> &ranges = flags[stat].getRanges();
        std::vector<SparseSet::range>::const_iterator it = ranges.begin();
    
        for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; it ++) {
          int firstBad, firstGood;
    
          if (it != ranges.end()) {
    	firstBad  = it->begin;
    	firstGood = it->end;
          } else {
    	firstBad  = firstGood = NR_SAMPLES_PER_INTEGRATION;
          }
    
          for (; time < firstBad; time ++) {
    	FFTtimer.start();
    #if 0
    	_prefetch(fftInData[time],
    		  sizeof(fcomplex[NR_POLARIZATIONS][NR_SUBBAND_CHANNELS]) / CACHE_LINE_SIZE,
    		  CACHE_LINE_SIZE);
    #endif
    
    	for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
    #if 0
    	  fftw_one(itsFFTWPlan,
    		   (fftw_complex *) fftInData[time][pol],
    		   (fftw_complex *) fftOutData[time & 1][pol]);
    #else
    	  _fft256(fftInData[time][pol], fftOutData[time & 1][pol]);
    #endif
    	}
    	FFTtimer.stop();
    
    	if (time & 1) {
    #if defined DELAY_COMPENSATION
    	  _phase_shift_and_transpose(&samples[0][stat][time - 1][0],
    				     &fftOutData[0][0][0],
    				     &phaseShifts[time - 1]);
    #else
    	  _transpose_4x8(&samples[0][stat][time - 1][0],
    			 &fftOutData[0][0][0],
    			 NR_SUBBAND_CHANNELS,
    			 sizeof(fcomplex) * NR_SUBBAND_CHANNELS,
    			 sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SAMPLES_PER_INTEGRATION | 2) * NR_STATIONS);
    #endif
    	}
          }
    
          for (; time < firstGood; time ++) {
    	_memzero(fftOutData[time & 1], sizeof(fftOutData[time & 1]));
    
    	if (time & 1) {
    #if defined DELAY_COMPENSATION
    	  _phase_shift_and_transpose(&samples[0][stat][time - 1][0],
    				     &fftOutData[0][0][0],
    				     &phaseShifts[time - 1]);
    #else
    	  _transpose_4x8(&samples[0][stat][time - 1][0],
    			 &fftOutData[0][0][0],
    			 NR_SUBBAND_CHANNELS,
    			 sizeof(fcomplex) * NR_SUBBAND_CHANNELS,
    			 sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SAMPLES_PER_INTEGRATION | 2) * NR_STATIONS);
    #endif
    	}
          }
        }
    #else // !SPARSE_FLAGS
        for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time += 2) {
          FFTtimer.start();
          for (int t = 0; t < 2; t ++) {
    	if (flags[stat][time + t]) {
    	  _memzero(fftOutData[t], sizeof(fftOutData[t]));
    	} else {
    	  _prefetch(fftInData[time + t],
    		    sizeof(fcomplex[NR_POLARIZATIONS][NR_SUBBAND_CHANNELS]) / CACHE_LINE_SIZE,
    		    CACHE_LINE_SIZE);
    
    	  for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
    #if 0
    	    fftw_one(itsFFTWPlan,
    		     (fftw_complex *) fftInData[time + t][pol],
    		     (fftw_complex *) fftOutData[t][pol]);
    #else
    	    _fft256(fftInData[time + t][pol], fftOutData[t][pol]);
    #endif
    	  }
    	}
          }
          FFTtimer.stop();
    
    #if defined DELAY_COMPENSATION
          _phase_shift_and_transpose(&samples[0][stat][time][0],
    				 &fftOutData[0][0][0],
    				 &phaseShifts[time]);
    #else
          _transpose_4x8(&samples[0][stat][time][0],
    		     &fftOutData[0][0][0],
    		     NR_SUBBAND_CHANNELS,
    		     sizeof(fcomplex) * NR_SUBBAND_CHANNELS,
    		     sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SAMPLES_PER_INTEGRATION | 2) * NR_STATIONS);
    #endif
        }
    #endif // SPARSE_FLAGS
    #endif // C_IMPLEMENTATION
      }
    
    #if defined HAVE_BGL && !defined C_IMPLEMENTATION
      _bgl_mutex_unlock(mutex);
    #endif
    
      doPPFtimer.stop();
    }
    
    
    void WH_BGL_Processing::bypassPPF()
    {
      DH_Subband::AllSamplesType *input = get_DH_Subband()->getSamples();
    
      for (int stat = 0; stat < NR_STATIONS; stat ++) {
        for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
          for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
    	samples[0][stat][time][pol] = makefcomplex((*input)[stat][time][pol]);
          }
        }
      }
    }
    
    
    void WH_BGL_Processing::doCorrelate()
    {
      doCorrelateTimer.start();
    
      // Use zeroed space for RFI_Flags since they are currently not in a dataholder
      static bitset<NR_SUBBAND_CHANNELS> Scratch_RFI_Flags[NR_STATIONS];
      bitset<NR_SUBBAND_CHANNELS> (*RFI_Flags)[NR_STATIONS] = &Scratch_RFI_Flags;
    
    //DH_RFI_Mitigation::ChannelFlagsType	 *RFI_Flags	 = get_DH_RFI_Mitigation()->getChannelFlags();
      DH_Visibilities::AllVisibilitiesType	 *visibilities	 = get_DH_Visibilities()->getVisibilities();
      DH_Visibilities::AllNrValidSamplesType *nrValidSamples = get_DH_Visibilities()->getNrValidSamples();
    
    #if defined C_IMPLEMENTATION
      for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
        for (int stat2 = 0; stat2 < NR_STATIONS; stat2 ++) {
          for (int stat1 = 0; stat1 <= stat2; stat1 ++) { 
    	int bl = DH_Visibilities::baseline(stat1, stat2), nrValid = 0;
    
    	if (!(*RFI_Flags)[stat1][ch] && !(*RFI_Flags)[stat2][ch]) {
    	  for (int pol1 = 0; pol1 < NR_POLARIZATIONS; pol1 ++) {
    	    for (int pol2 = 0; pol2 < NR_POLARIZATIONS; pol2 ++) {
    	      dcomplex sum = makedcomplex(0, 0);
    	      for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
    		sum += samples[ch][stat1][time][pol1] * conj(samples[ch][stat2][time][pol2]);
    	      }
    	      sum *= correlationWeights[itsNrValidSamples[bl]];
    	      (*visibilities)[bl][ch][pol1][pol2] = sum;
    	    }
    	  }
    	  nrValid = itsNrValidSamples[bl];
    	}
        
    	if (nrValid == 0) {
    	  for (int pol1 = 0; pol1 < NR_POLARIZATIONS; pol1 ++) {
    	    for (int pol2 = 0; pol2 < NR_POLARIZATIONS; pol2 ++) {
    	      (*visibilities)[bl][ch][pol1][pol2] = makefcomplex(0, 0);
    	    }
    	  }
    	}
    	(*nrValidSamples)[bl][ch] = nrValid;
          }
        }
      }
    #else
      // Blue Gene/L assembler version. 
    
      for (int bl = 0; bl < NR_BASELINES; bl ++) {
        for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
          (*nrValidSamples)[bl][ch] = itsNrValidSamples[bl];
        }
      }
    
      for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
        // build a map of valid stations
        int nrValidStations = 0, map[NR_STATIONS];
    
        for (int stat2 = 0; stat2 < NR_STATIONS; stat2 ++) {
          if (!(*RFI_Flags)[stat2][ch]) {
    	map[nrValidStations ++] = stat2;
          } else { // clear correlations that involve invalided stations
    	for (int stat1 = 0; stat1 < NR_STATIONS; stat1 ++) {
    	  int bl = stat1 < stat2 ? DH_Visibilities::baseline(stat1, stat2) :
    	    DH_Visibilities::baseline(stat2, stat1);
    	  //_clear_correlation(&(*visibilities)[bl][ch]);
    	  (*nrValidSamples)[bl][ch] = 0;
    	}
          }
        }
    
        if (nrValidStations == 0) {
          break;
        }
    
        // Divide the correlation matrix into blocks of 3x2, 2x2, 3+2, 2+1, and 1x1.
    
        // do the first (auto)correlation(s) (these are the "left"most 1 or 3
        // squares in the corner of the triangle)
        if (nrValidStations % 2 == 0) {
          int stat10 = map[0], stat11 = map[1];
    
          _auto_correlate_2(&samples[ch][stat10],
    			&samples[ch][stat11],
    			&(*visibilities)[DH_Visibilities::baseline(stat10, stat10)][ch],
    			&(*visibilities)[DH_Visibilities::baseline(stat10, stat11)][ch],
    			&(*visibilities)[DH_Visibilities::baseline(stat11, stat11)][ch]);
        } else {
          int stat10 = map[0];
    
          _auto_correlate_1(&samples[ch][stat10],
    			&(*visibilities)[DH_Visibilities::baseline(stat10, stat10)][ch]);
        }
    
        for (int stat2 = nrValidStations % 2 ? 1 : 2; stat2 < nrValidStations; stat2 += 2) {
          int stat1 = 0;
    
          // do as many 3x2 blocks as possible
          for (; stat1 + 3 <= stat2; stat1 += 3) { 
    	int stat10 = map[stat1], stat11 = map[stat1+1], stat12 = map[stat1+2];
    	int stat20 = map[stat2], stat21 = map[stat2+1];
    
    	_correlate_3x2(&samples[ch][stat10],
    		       &samples[ch][stat11],
    		       &samples[ch][stat12],
    		       &samples[ch][stat20],
    		       &samples[ch][stat21],
    		       &(*visibilities)[DH_Visibilities::baseline(stat10, stat20)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat10, stat21)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat11, stat20)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat11, stat21)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat12, stat20)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat12, stat21)][ch]);
          }
    
          // see if a 2x2 block is necessary
          if (stat1 + 2 <= stat2) {
    	int stat10 = map[stat1], stat11 = map[stat1+1];
    	int stat20 = map[stat2], stat21 = map[stat2+1];
    
    	_correlate_2x2(&samples[ch][stat10],
    		       &samples[ch][stat11],
    		       &samples[ch][stat20],
    		       &samples[ch][stat21],
    		       &(*visibilities)[DH_Visibilities::baseline(stat10, stat20)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat10, stat21)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat11, stat20)][ch],
    		       &(*visibilities)[DH_Visibilities::baseline(stat11, stat21)][ch]);
    	stat1 += 2;
          }
    
          // do the remaining (auto)correlations near the diagonal
          if (stat1 == stat2) {
    	int stat10 = map[stat1], stat11 = map[stat1+1];
    
    	_auto_correlate_2(&samples[ch][stat10],
    			  &samples[ch][stat11],
    			  &(*visibilities)[DH_Visibilities::baseline(stat10,stat10)][ch],
    			  &(*visibilities)[DH_Visibilities::baseline(stat10,stat11)][ch],
    			  &(*visibilities)[DH_Visibilities::baseline(stat11,stat11)][ch]);
          } else {
    	int stat10 = map[stat1], stat11 = map[stat1+1], stat12 = map[stat1+2];
    
    	_auto_correlate_3(&samples[ch][stat10],
    			  &samples[ch][stat11],
    			  &samples[ch][stat12],
    			  &(*visibilities)[DH_Visibilities::baseline(stat10,stat11)][ch],
    			  &(*visibilities)[DH_Visibilities::baseline(stat10,stat12)][ch],
    			  &(*visibilities)[DH_Visibilities::baseline(stat11,stat11)][ch],
    			  &(*visibilities)[DH_Visibilities::baseline(stat11,stat12)][ch],
    			  &(*visibilities)[DH_Visibilities::baseline(stat12,stat12)][ch]);
          }
        }
      }
    
      weightTimer.start();
    #if 0
      for (int bl = 0; bl < NR_BASELINES; bl ++) {
        for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
          for (int pol1 = 0; pol1 < NR_POLARIZATIONS; pol1 ++) {
    	for (int pol2 = 0; pol2 < NR_POLARIZATIONS; pol2 ++) {
    	  (*visibilities)[bl][ch][pol1][pol2] *= correlationWeights[(*nrValidSamples)[bl][ch]];
    	}
          }
        }
      }
    #else
      _weigh_visibilities(visibilities, nrValidSamples, correlationWeights);
    #endif
      weightTimer.stop();
    #endif  
    
      doCorrelateTimer.stop();
    }
    
    
    void WH_BGL_Processing::process()
    {
      NSTimer totalTimer("total", true);
      totalTimer.start();
    
    #if defined HAVE_MPI
      std::clog.precision(15);
      std::clog << "core " << TH_MPI::getCurrentRank() << ": start reading at " << MPI_Wtime() << '\n';
    #endif
    
      static NSTimer readTimer("receive timer", true);
      readTimer.start();
      getDataManager().readyWithInHolder(SUBBAND_CHANNEL);
    #if defined SPARSE_FLAGS
      if (itsInputConnected)
        get_DH_Subband()->getExtraData();
    #endif
      readTimer.stop();
    
    #if defined HAVE_MPI
      std::clog << "core " << TH_MPI::getCurrentRank() << ": start processing at " << MPI_Wtime() << '\n';
    #endif
    
      computeTimer.start();
    
      computeFlags();
    
    #if NR_SUBBAND_CHANNELS > 1
      doPPF(itsCenterFrequencies[itsCurrentSubband] - (NR_SUBBAND_CHANNELS / 2) * itsChannelBandwidth);
    #else
      bypassPPF();
    #endif
    
      doCorrelate();
    
      if ((itsCurrentSubband += itsSubbandIncrement) >= itsLastSubband)
        itsCurrentSubband -= itsLastSubband - itsFirstSubband;
    
      computeTimer.stop();
    
    #if defined HAVE_MPI
      std::clog << "core " << TH_MPI::getCurrentRank() << ": start writing at " << MPI_Wtime() << '\n';
    #endif
    
      static NSTimer writeTimer("send timer", true);
      writeTimer.start();
      getDataManager().readyWithOutHolder(VISIBILITIES_CHANNEL);
      writeTimer.stop();
    
    #if defined HAVE_MPI
      std::clog << "core " << TH_MPI::getCurrentRank() << ": start idling at " << MPI_Wtime() << '\n';
    #endif
    
    #if 0
      static int count = 0;
    
      if (TH_MPI::getCurrentRank() == 5 && ++ count == 9)
        for (double time = MPI_Wtime() + 4.0; MPI_Wtime() < time;)
          ;
    #endif
    
      totalTimer.stop();
    }
    
    
    void WH_BGL_Processing::postprocess()
    {
    #if defined HAVE_FFTW3
      fftwf_destroy_plan(itsFFTWPlan);
    #elif defined HAVE_FFTW2
      fftw_destroy_plan(itsFFTWPlan);
    #endif
    }
    
    
    void WH_BGL_Processing::dump() const
    {
    }
    
    } // namespace CS1
    } // namespace LOFAR