Changeset 16897


Ignore:
Timestamp:
06/24/13 15:57:53 (11 years ago)
Author:
lyard
Message:
Removed bytes swapping for RAWSUM
Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/fitsCompressor.cc

    r16882 r16897  
    433433        bool writeBinaryRow(const char* bufferToWrite);
    434434
     435        uint32_t getRowWidth();
     436
    435437        ///@brief assign a given (already loaded) drs calibration
    436438        void setDrsCalib(int16_t* data);
     
    627629    if (_buffer != NULL)
    628630    {
     631        _buffer = _buffer-4;
    629632        delete[] _buffer;
    630633        _buffer = NULL;
     
    649652    if (_buffer)
    650653    {
     654        _buffer = _buffer - 4;
    651655        delete[] _buffer;
    652656        for (uint32_t i=0;i<_compressedBuffer.size();i++)
     
    657661        }
    658662    }
    659     _buffer = new char[_rowWidth*_numRowsPerTile];
     663    _buffer = new char[_rowWidth*_numRowsPerTile + 12];
    660664    if (_buffer == NULL) return false;
     665    memset(_buffer, 0, 4);
     666    _buffer = _buffer + 4;
    661667    if (_compressedBuffer.size() != _numThreads)
    662668    {
     
    667673    {
    668674        _transposedBuffer[i] = new char[_rowWidth*_numRowsPerTile];
    669         _compressedBuffer[i] = new char[_rowWidth*_numRowsPerTile + _columns.size() + sizeof(TileHeader)]; //use a bit more memory for compression flags
     675        _compressedBuffer[i] = new char[_rowWidth*_numRowsPerTile + _columns.size() + sizeof(TileHeader) + 12]; //use a bit more memory for compression flags and checksumming
    670676        if (_transposedBuffer[i] == NULL || _compressedBuffer[i] == NULL)
    671677            return false;
     
    11331139        setHeaderKey(HeaderEntry("PCOUNT", 0, "size of special data area"));
    11341140    }
     1141    ostringstream str;
     1142
    11351143    writeHeader(true);
    11361144
    1137     ostringstream str;
     1145    str.str("");
    11381146    str << _checksum.val();
    11391147
     
    11601168{
    11611169    uint32_t thisRoundNumRows = (_totalNumRows%_numRowsPerTile) ? _totalNumRows%_numRowsPerTile : _numRowsPerTile;
     1170
    11621171    //copy the tile and transpose it
    11631172    uint32_t offset = 0;
     
    12151224    }
    12161225    return _file.good();
     1226}
     1227
     1228uint32_t CompressedFitsWriter::getRowWidth()
     1229{
     1230    return _rowWidth;
    12171231}
    12181232
     
    16421656    //allocate the buffer for temporary storage of each read/written row
    16431657    uint32_t rowWidth = inFile.GetUInt("NAXIS1");
    1644     char* buffer = new char[rowWidth];
     1658    char* buffer = new char[rowWidth + 12];
     1659    memset(buffer, 0, 4);
     1660    buffer = buffer+4;
    16451661
    16461662    //get the source columns
     
    16511667
    16521668    //Add columns.
     1669    uint32_t totalRowWidth = 0;
    16531670    for (uint32_t i=0;i<sortedColumns.size(); i++)
    16541671    {
     
    16741691        smoothmanProcessings[1] = FACT_HUFFMAN16;
    16751692//        smoothmanProcessings[2] = FACT_RAW;
     1693
     1694        totalRowWidth += sortedColumns[i].bytes;
    16761695
    16771696        //first lets see if we do have an explicit request
     
    17351754//        cout << i->first << endl;
    17361755    }
     1756
     1757    outFile.setHeaderKey(CompressedFitsFile::HeaderEntry("RAWSUM", "         0", "Checksum of raw littlen endian data"));
    17371758
    17381759    //deal with the DRS calib
     
    18261847    }
    18271848
     1849    Checksum rawsum;
    18281850    //Convert each row one after the other
    18291851    for (uint32_t i=0;i<inFile.GetNumRows();i++)
     
    18381860            count++;
    18391861        }
     1862
     1863        char* checkSumPointer = buffer;
     1864        const int chkOffset = (i*totalRowWidth)%4;
     1865        checkSumPointer -= chkOffset;
     1866        uint32_t sizeToChecksum = totalRowWidth + chkOffset;
     1867        if (sizeToChecksum%4 != 0)
     1868        {
     1869            int32_t extraBytes = 4 - (sizeToChecksum%4);
     1870            memset(checkSumPointer+sizeToChecksum, 0, extraBytes);
     1871            sizeToChecksum += extraBytes;
     1872        }
     1873        rawsum.add(checkSumPointer, sizeToChecksum, false);
    18401874
    18411875        if (startCellOffset != -1)
     
    18511885        outFile.writeBinaryRow(buffer);
    18521886    };
     1887    ostringstream strSum;
     1888    strSum << rawsum.val();
     1889    outFile.setHeaderKey(CompressedFitsFile::HeaderEntry("RAWSUM", strSum.str(), "Checksum of raw littlen endian data"));
    18531890
    18541891    //Get table name for later use in case the compressed file is to be verified
     
    19271964            continue;
    19281965        }
     1966        if (k == "RAWSUM")
     1967        {
     1968            continue;
     1969        }
    19291970
    19301971        if (k == "ZDTASUM")
     
    20282069//    verifyFile.close();
    20292070    if (!verifyFile.IsFileOk())
    2030         cout << "ERROR: file checksum seems wrong" << endl;
     2071        cout << "ERROR: file checksums seems wrong" << endl;
    20312072
    20322073    reconstructedFile.close();
     
    20512092    }
    20522093
     2094    buffer = buffer-4;
    20532095    delete[] buffer;
    20542096    return 0;
    2055 
    2056 }
    2057 
     2097}
     2098
  • trunk/Mars/mcore/checksum.h

    r16670 r16897  
    4747
    4848
    49     bool add(const char *buf, size_t len)
     49    bool add(const char *buf, size_t len, bool big_endian = true)
    5050    {
    5151        // Avoid overflows in carry bits
     
    7373        uint32_t *hilo  = reinterpret_cast<uint32_t*>(&buffer);
    7474
     75
     76        const uint16_t *end = sbuf + len/2;
     77
     78        if (big_endian)
     79            addLoopSwapping(sbuf, end, hilo);
     80        else
     81            addLoop(sbuf, end, hilo);
     82        /*const uint16_t *end = sbuf + len/2;
     83        while (1)
     84        {
     85            if (sbuf==end)
     86                break;
     87
     88            hilo[0] += ntohs(*sbuf++);
     89
     90            if (sbuf==end)
     91                break;
     92
     93            hilo[1] += ntohs(*sbuf++);
     94        }*/
     95
     96        HandleCarryBits();
     97
     98        return true;
     99    }
     100
     101    void addLoopSwapping(const uint16_t *sbuf, const uint16_t *end, uint32_t* hilo)
     102    {
    75103        /*
    76104        for (size_t i = 0; i < len/2; i++)
     
    83111        // This is about as twice as fast as the loop above
    84112        // ntohs is CPU optimized, i%2 doesn't need to be computed
    85         const uint16_t *end = sbuf + len/2;
    86113        while (1)
    87114        {
     
    96123            hilo[1] += ntohs(*sbuf++);
    97124        }
    98 
    99         HandleCarryBits();
    100 
    101         return true;
    102     }
    103 
    104     bool add(const vector<char> &v)
    105     {
    106         return add(v.data(), v.size());
     125    }
     126
     127    void addLoop(const uint16_t *sbuf, const uint16_t *end, uint32_t* hilo)
     128    {
     129        while (1)
     130        {
     131            if (sbuf==end)
     132                break;
     133
     134            hilo[0] += ntohs(*sbuf++);
     135
     136            if (sbuf==end)
     137                break;
     138
     139            hilo[1] += ntohs(*sbuf++);
     140        }
     141    }
     142
     143    bool add(const vector<char> &v, bool big_endian = true)
     144    {
     145        return add(v.data(), v.size(), big_endian);
    107146    }
    108147
  • trunk/Mars/mcore/zfits.h

    r16890 r16897  
    7070    }
    7171
     72    virtual bool IsFileOk() const
     73    {
     74        bool rawsum = true;
     75
     76        if (HasKey("RAWSUM"))
     77        {
     78                ostringstream str;
     79                str << fRawsum.val();
     80                rawsum = (GetStr("RAWSUM") == str.str());
     81        }
     82
     83        return fits::IsFileOk() && rawsum;
     84    };
     85
    7286protected:
    7387
     
    130144
    131145        if (fTable.is_compressed)
    132         {
    133             for (auto it=fTable.sorted_cols.begin(); it!= fTable.sorted_cols.end(); it++)
     146        for (auto it=fTable.sorted_cols.begin(); it!= fTable.sorted_cols.end(); it++)
     147            if (it->comp != kCompFACT)
    134148            {
    135149                if (it->comp == kCompFACT)
     
    190204    vector<size_t>                         fTileSize; ///< size in bytes of each compressed tile
    191205    vector<vector<size_t>>                 fTileOffsets; ///< offset from start of tile of a given compressed column
     206
     207    Checksum fRawsum;   ///< Checksum of the uncompressed, raw data
    192208
    193209    // Get buffer space
     
    270286    //overrides fits.h method with empty one
    271287    //work is done in ReadBinaryRow because it requires volatile data from ReadBinaryRow
    272     virtual void WriteRowToCopyFile(size_t )
    273     {
    274 
     288    virtual void WriteRowToCopyFile(size_t row)
     289    {
     290        if (row == fRow+1)
     291            fRawsum.add(fBufferRow, false);
    275292    }
    276293
Note: See TracChangeset for help on using the changeset viewer.