Changeset 11376 for trunk/FACT++


Ignore:
Timestamp:
07/13/11 14:59:53 (13 years ago)
Author:
tbretz
Message:
Updated writing of FITS; pipe MessageImp to all writers; enabled initialization of fRunNumber; updated FITS writing to a simplified but working version.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/EventBuilderWrapper.h

    r11359 r11376  
    3333
    3434protected:
     35    MessageImp &fLog;
    3536    string fFileName;
    3637
    3738public:
    38     DataFileImp(uint32_t id) : fRunId(id) { }
     39    DataFileImp(uint32_t id, MessageImp &imp) : fRunId(id), fLog(imp) { }
    3940    virtual ~DataFileImp() { }
    4041
     
    9495{
    9596public:
    96     DataFileNone(uint32_t id) : DataFileImp(id) { }
     97    DataFileNone(uint32_t id, MessageImp &imp) : DataFileImp(id, imp) { }
    9798
    9899    bool OpenFile(RUN_HEAD* h)
     
    123124{
    124125public:
    125     DataFileDebug(uint32_t id) : DataFileNone(id) { }
     126    DataFileDebug(uint32_t id, MessageImp &imp) : DataFileNone(id, imp) { }
    126127
    127128    bool Write(EVENT *e)
     
    197198
    198199public:
    199     DataFileRaw(uint32_t id) : DataFileImp(id), fPosTail(0) { }
    200     ~DataFileRaw() { Close(); }
     200    DataFileRaw(uint32_t id, MessageImp &imp) : DataFileImp(id, imp), fPosTail(0) { }
     201    ~DataFileRaw() { if (fOut.is_open()) Close(); }
    201202
    202203    void WriteBlockHeader(uint32_t type, uint32_t ver, uint32_t cnt, uint32_t len)
     
    223224    };
    224225
    225     virtual bool OpenFile(RUN_HEAD *h)
     226    bool OpenFile(RUN_HEAD *h)
    226227    {
    227228        const string name = FormFileName(h->RunType, "bin");
     229        if (access(name.c_str(), F_OK)==0)
     230        {
     231            fLog.Error("File '"+name+"' already exists.");
     232            return false;
     233        }
    228234
    229235        fFileName = name;
     
    233239        if (!fOut)
    234240        {
    235             //ostringstream str;
    236             //str << "Open file " << name << ": " << strerror(errno) << " (errno=" << errno << ")";
    237             //Error(str);
     241            ostringstream str;
     242            str << "Open file " << name << ": " << strerror(errno) << " (errno=" << errno << ")";
     243            fLog.Error(str);
    238244
    239245            return false;
     
    268274        if (!fOut)
    269275        {
    270             //ostringstream str;
    271             //str << "Open file " << name << ": " << strerror(errno) << " (errno=" << errno << ")";
    272             //Error(str);
     276            ostringstream str;
     277            str << "Open file " << name << ": " << strerror(errno) << " (errno=" << errno << ")";
     278            fLog.Error(str);
    273279
    274280            return false;
     
    277283        return true;
    278284    }
    279     virtual bool Write(EVENT *evt)
     285    bool Write(EVENT *evt)
    280286    {
    281287        const int sh = sizeof(EVENT)-2 + NPIX*evt->Roi*2;
     
    285291        return true;
    286292    }
    287     virtual bool Close(RUN_TAIL *tail= 0)
     293    bool Close(RUN_TAIL *tail= 0)
    288294    {
    289295        WriteBlockHeader(kEndOfFile, 0, 0, 0);
     
    299305        if (!fOut)
    300306        {
    301             //ostringstream str;
    302             //str << "Open file " << name << ": " << strerror(errno) << " (errno=" << errno << ")";
    303             //Error(str);
     307            ostringstream str;
     308            str << " Writing footer: " << strerror(errno) << " (errno=" << errno << ")";
     309            fLog.Error(str);
    304310
    305311            return false;
     
    310316        if (!fOut)
    311317        {
    312             //ostringstream str;
    313             //str << "Open file " << name << ": " << strerror(errno) << " (errno=" << errno << ")";
    314             //Error(str);
     318            ostringstream str;
     319            str << "Closing file: " << strerror(errno) << " (errno=" << errno << ")";
     320            fLog.Error(str);
    315321
    316322            return false;
     
    321327};
    322328
    323 #ifdef HAS_FITS
     329#ifdef HAVE_FITS
    324330class DataFileFits : public DataFileImp
    325331{
     
    329335    uint64_t fNumRows;                ///the number of rows that have been written already to the FITS file.
    330336
     337    Converter *fConv;
     338
    331339public:
    332     DataFileFits(uint32_t runid) : DataFileImp(runid), fFile(0)
     340    DataFileFits(uint32_t runid, MessageImp &imp) :
     341        DataFileImp(runid, imp), fFile(0), fNumRows(0), fConv(0)
    333342    {
    334343    }
     
    340349    //! related to the RUN_TAIL will NOT be written to the file.
    341350    //
    342     ~DataFileFits() { Close(); }
     351    ~DataFileFits() { Close(); delete fConv; }
    343352
    344353    // --------------------------------------------------------------------------
     
    380389        {
    381390            ostringstream str;
    382             str << "Could not add header key ";
    383             //TODO pipe the error message somewhere
     391            str << "Could not add header key " << name;
     392            fLog.Error(str);
    384393        }
    385394    }
     
    404413        //Form filename, based on runid and run-type
    405414        const string fileName = FormFileName(h->RunType, "fits");
     415        if (access(fileName.c_str(), F_OK)==0)
     416        {
     417            fLog.Error("File '"+fileName+"' already exists.");
     418            return false;
     419        }
    406420
    407421        fFileName = fileName;
     422
     423        /*
     424         out <<
     425         "SIMPLE  =                    T / file does conform to FITS standard             "
     426         "BITPIX  =                    8 / number of bits per data pixel                  "
     427         "NAXIS   =                    0 / number of data axes                            "
     428         "EXTEND  =                    T / FITS dataset may contain extensions            "
     429         "COMMENT   FITS (Flexible Image Transport System) format is defined in 'Astronomy"
     430         "COMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H "
     431         "END                                                                             ";
     432         for (int i=0; i<29; i++)
     433         out << "                                                                                "
     434         */
    408435
    409436        //create the FITS object
     
    415442        {
    416443            ostringstream str;
    417             str << "Could not open FITS file " << fileName << " reason: " << e.message();
    418             //TODO display the message somewhere
    419 
     444            str << "Could not open FITS file " << fileName << ": " << e.message();
     445            fLog.Error(str);
    420446            return false;
    421447        }
    422 
    423         //create columns according to header
    424         ostringstream arrayTypes;
    425 
    426         // uint32_t EventNum ;       // EventNumber as from FTM
    427         // uint16_t TriggerType ;    // Trigger Type from FTM
    428         // uint32_t SoftTrig ;       // SoftTrigger Info (TBD)
    429         // uint32_t PCTime ;         // when did event start to arrive at PC
    430         // uint32_t BoardTime[NBOARDS];//
    431         // int16_t  StartPix[NPIX];  // First Channel per Pixel (Pixels sorted according Software ID)  ; -1 if not filled
    432         // int16_t  StartTM[NTMARK]; // First Channel for TimeMark (sorted Hardware ID) ; -1 if not filled
    433         // uint16_t Adc_Data[];      // final length defined by malloc ....
    434448
    435449        vector<string> colNames;
    436450        vector<string> dataTypes;
    437         AddColumnEntry(colNames, dataTypes, 1,              'V', "EventNum");
    438         AddColumnEntry(colNames, dataTypes, 1,              'U', "TriggerType");
    439         AddColumnEntry(colNames, dataTypes, 1,              'V', "SoftTrig");
    440         AddColumnEntry(colNames, dataTypes, 1,              'V', "PCTime");
    441         AddColumnEntry(colNames, dataTypes, NBOARDS,        'V', "BoardTime");
    442         AddColumnEntry(colNames, dataTypes, NPIX,           'I', "StartPix");
    443         AddColumnEntry(colNames, dataTypes, NTMARK,         'I', "StartTM");
    444         AddColumnEntry(colNames, dataTypes, NPIX*h->Nroi,   'U', "Data");
     451        AddColumnEntry(colNames, dataTypes, 1,            'J', "EventNum");
     452        AddColumnEntry(colNames, dataTypes, 1,            'I', "TriggerType");
     453        AddColumnEntry(colNames, dataTypes, 1,            'J', "SoftTrig");
     454        AddColumnEntry(colNames, dataTypes, 1,            'J', "PCTime");
     455        AddColumnEntry(colNames, dataTypes, NBOARDS,      'J', "BoardTime");
     456        AddColumnEntry(colNames, dataTypes, NPIX,         'I', "StartPix");
     457        AddColumnEntry(colNames, dataTypes, NTMARK,       'I', "StartTM");
     458        AddColumnEntry(colNames, dataTypes, NPIX*h->Nroi, 'I', "Data");
     459
     460        ostringstream fmt;
     461        fmt << "I:1;S:1;I:1;I:1";
     462        fmt << ";I:" << NBOARDS;
     463        fmt << ";S:" << NPIX;
     464        fmt << ";S:" << NTMARK;
     465        fmt << ";S:" << NPIX*h->Nroi;
     466
     467        fConv = new Converter(fmt.str());
    445468
    446469        //actually create the table
     
    448471        {
    449472            fTable = fFile->addTable("Events", 0, colNames, dataTypes);
    450             if (fTable->rows() != 0)
    451             {
    452                 ostringstream str;
    453                 str << "Error: table created on the fly looks non-empty.";
    454                 //TODO giev the error text to some error handler
    455                 //FIXME I guess that this error checking is useless. remove it for performances.
    456             }
    457473        }
    458474        catch (const CCfits::FitsException &e)
    459475        {
    460476            ostringstream str;
    461             str << "Could not create FITS table " << "Events" << " in file " << fileName << " reason: " << e.message();
    462             //TODO give the error text to some error handler
    463 
    464             Close();
     477            str << "Could not create FITS table 'Events' in file " << fileName << " reason: " << e.message();
     478            fLog.Error(str);
     479            return false;
     480        }
     481
     482        if (fTable->rows() != 0)
     483        {
     484            fLog.Error("FITS table created on the fly looks non-empty.");
    465485            return false;
    466486        }
     
    468488        //write header data
    469489        //first the "standard" keys
    470         string stringValue;
    471490        WriteKey("EXTREL",   1.0f,   "Release Number");
    472491        WriteKey("TELESCOP", "FACT", "Telescope that acquired this data");
     
    474493        WriteKey("CREATOR",  "FACT++ Event Builder", "Program that wrote this file");
    475494
     495        string stringValue;
    476496        stringValue = Time().GetAsStr();
    477497        stringValue[10]= 'T';
     
    488508        WriteKey("NTM",      h->NTm,      "Number of Time marks");
    489509        WriteKey("NROI",     h->Nroi,     "Number of slices per pixels");
    490 
     510/*
    491511        //now the boards related keywords
    492512        for (int i=0; i<h->NBoard; i++)
     
    505525            WriteKey("STATUS",  i, hh.PLLLCK,
    506526                     "");
    507 /*
    508             WriteKey("TRIGCRC", i, hh.trigger_crc,
    509                      "Trigger CRC");
    510 
    511             WriteKey("TRIGTYP", i, hh.trigger_type,
    512                      "Trigger type");
    513 
    514             WriteKey("TRIGID",  i, hh.trigger_id,
    515                      "Trigger ID");
    516 
    517             WriteKey("EVTCNTR", i, hh.fad_evt_counter,
    518                      "FAD Event Counter");
    519 
    520             WriteKey("REFCLK",  i, hh.REFCLK_frequency,
    521                      "Reference Clock Frequency");
    522 */
     527
     528//            WriteKey("TRIGCRC", i, hh.trigger_crc,
     529//                     "Trigger CRC");
     530
     531//            WriteKey("TRIGTYP", i, hh.trigger_type,
     532//                     "Trigger type");
     533
     534//            WriteKey("TRIGID",  i, hh.trigger_id,
     535//                     "Trigger ID");
     536
     537//            WriteKey("EVTCNTR", i, hh.fad_evt_counter,
     538//                     "FAD Event Counter");
     539
     540//            WriteKey("REFCLK",  i, hh.REFCLK_frequency,
     541//                     "Reference Clock Frequency");
     542
    523543            WriteKey("BOARDID", i, hh.board_id,
    524544                     "Board ID");
     
    536556            WriteKey("TIME",    i, hh.time,      "Time");
    537557            WriteKey("RUNNB",   i, hh.runnumber, "Run number");
    538 /*
    539             for (int j=0;j<NTemp;j++)
    540             {
    541                 str.str(""); str2.str("");
    542                 str << "DRS_T" << i << j;
    543                 str2 << "DRS temperature #" << i << " " << j;
    544                 WriteKey(str.str(), h->FADhead[i].drs_temperature[j], str2.str());
    545             }
    546 */
     558
     559//            for (int j=0;j<NTemp;j++)
     560//            {
     561//                str.str(""); str2.str("");
     562//                str << "DRS_T" << i << j;
     563//                str2 << "DRS temperature #" << i << " " << j;
     564//                WriteKey(str.str(), h->FADhead[i].drs_temperature[j], str2.str());
     565//            }
    547566            for (int j=0;j<NDAC;j++)
    548567                WriteKey("DAC", i*NDAC+j, hh.dac[j], "DAC");
    549 
    550             //Last but not least, add header keys that will be updated when closing the file
    551             WriteFooter(NULL);
    552         }
     568        }
     569*/
     570
     571        //Last but not least, add header keys that will be updated when closing the file
     572        //WriteFooter(NULL);
    553573
    554574        return true;
     
    556576
    557577
    558     int WriteColumns(size_t &start, size_t size, void *e)
     578    int WriteColumns(size_t &start, size_t size, const void *e)
    559579    {
    560580        int status = 0;
    561         fits_write_tblbytes(fFile->fitsPointer(), fNumRows, start, size, reinterpret_cast<unsigned char*>(e), &status);
     581        fits_write_tblbytes(fFile->fitsPointer(), fNumRows, start, size,
     582                            (unsigned char*)e, &status);
    562583        if (status)
    563584        {
    564585            char text[30];//max length of cfitsio error strings (from doc)
    565586            fits_get_errstatus(status, text);
    566             //ostringstream str;
    567             //str << "Writing FITS row " << i << " in " << groupName << ": " << text << " (file_write_tblbytes, rc=" << status << ")";
    568             //Error(str);
     587
     588            ostringstream str;
     589            str << "Writing FITS row " << fNumRows << ": " << text << " (file_write_tblbytes, rc=" << status << ")";
     590            fLog.Error(str);
    569591        }
    570592
     
    587609        if (fits_insert_rows(fTable->fitsPointer(), fNumRows, 1, &status))
    588610        {
    589             //ostringstream str;
    590             //str << "Inserting row into " << fFileName << " failed (fits_insert_rows, rc=" << status << ")";
    591             //fMess->Error(str);
    592             //TODO pipe this error message to the appropriate error stream
     611            char text[30];//max length of cfitsio error strings (from doc)
     612            fits_get_errstatus(status, text);
     613
     614            ostringstream str;
     615            str << "Inserting row " << fNumRows << " into " << fFileName << ": " << text << " (fits_insert_rows, rc=" << status << ")";
     616            fLog.Error(str);
     617
     618            return false;
    593619        }
    594620        fNumRows++;
    595621
    596         const int sh = sizeof(EVENT)+NPIX*e->Roi*2;
     622        const vector<char> data = fConv->ToFits(((char*)e)+2, sizeof(EVENT)+NPIX*e->Roi*2-2);
    597623
    598624        // column size pointer
    599625        size_t col = 1;
    600         if (!WriteColumns(col, sh, e))
     626        if (!WriteColumns(col, data.size(), data.data()))
    601627            return true;
    602628
     
    673699            return false;
    674700
    675         WriteFooter(rt);
     701        //WriteFooter(rt);
    676702
    677703        delete fFile;
     
    759785
    760786
    761     int fRunNumber;
    762 
     787    uint32_t fRunNumber;
    763788
    764789    void InitRunNumber()
     
    768793        fRunNumber = 1000;
    769794
    770         while (--fRunNumber>=0)
     795        while (--fRunNumber>0)
    771796        {
    772797            ostringstream name;
     
    813838            ConnectSlot(i, tcp::endpoint());
    814839
    815         // InitRunNumber();
     840        InitRunNumber();
    816841    }
    817842    virtual ~EventBuilderWrapper()
     
    827852            delete *it;
    828853    }
     854
     855    uint32_t IncreaseRunNumber()
     856    {
     857        return fRunNumber++;
     858    }
     859
    829860
    830861    bool IsThreadRunning()
     
    10761107        switch (fFileFormat)
    10771108        {
    1078         case kNone:  file = new DataFileNone(runid);  break;
    1079         case kDebug: file = new DataFileDebug(runid); break;
    1080         case kFits:  file = new DataFileFits(runid);  break;
    1081         case kRaw:   file = new DataFileRaw(runid);   break;
     1109        case kNone:  file = new DataFileNone(runid, fMsg);  break;
     1110        case kDebug: file = new DataFileDebug(runid, fMsg); break;
     1111        case kFits:  file = new DataFileFits(runid, fMsg);  break;
     1112        case kRaw:   file = new DataFileRaw(runid, fMsg);   break;
    10821113        }
    10831114
Note: See TracChangeset for help on using the changeset viewer.