Changeset 12469


Ignore:
Timestamp:
11/09/11 16:39:53 (13 years ago)
Author:
tbretz
Message:
Added the time marker channels to the DRS calibration; added the roi for the secondary baseline calculation; added the roi to the dim service; adapted the fStats handling accordingly.
File:
1 edited

Legend:

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

    r12352 r12469  
    1111DrsCalibration DataCalib::fData;
    1212bool DataCalib::fProcessing = false;
    13 vector<float> DataCalib::fStats(1440*1024*6+3);
     13vector<float> DataCalib::fStats(1440*1024*6+160*1024*2+4);
    1414
    1515void DataCalib::Restart()
     
    2020    reinterpret_cast<uint32_t*>(fStats.data())[1] = 0;
    2121    reinterpret_cast<uint32_t*>(fStats.data())[2] = 0;
     22    reinterpret_cast<uint32_t*>(fStats.data())[3] = 0;
    2223
    2324    int i=0;
    24     while (i<1024*1440*2+3)  // Set mean and RMS to 0
     25    while (i<1024*1440*2+4)  // Set mean and RMS to 0
    2526        fStats[i++] = 0;
    26     while (i<1024*1440*3+3)
     27    while (i<1024*1440*3+4)
    2728        fStats[i++] = 2000./4096; // Set mean to 0.5
    28     while (i<1024*1440*6+3)
     29    while (i<1440*1024*6+160*1024*2+4)
    2930        fStats[i++] = 0;   // Set everything else to 0
    3031
     
    3435void DataCalib::Update(DimDescribedService &dim)
    3536{
    36     dim.Update(fStats);
     37    const uint16_t roi = fData.fRoi;
     38    const uint16_t ntm = fData.fNumTm;
     39
     40    vector<float> buf(1440*1024*6+160*1024*2+4);
     41
     42    memcpy(buf.data(), fStats.data(), (4*1024*1440+4)*sizeof(float));
     43
     44    for (int i=0; i<1440; i++)
     45    {
     46        memcpy(buf.data()+4+1440*1024*4 + i*1024, fStats.data()+4 + 4*1024*1440 + roi*i,            roi*sizeof(float));
     47        memcpy(buf.data()+4+1440*1024*5 + i*1024, fStats.data()+4 + 4*1024*1440 + roi*1440 + roi*i, roi*sizeof(float));
     48    }
     49
     50    /*
     51    for (int i=0; i<ntm; i++)
     52    {
     53        memcpy(buf.data()+4+1440*1024*6          + i*1024, fStats.data()+4 + 4*1024*1440 + 2*roi*1440,       roi*sizeof(float));
     54        memcpy(buf.data()+4+1440*1024*6+160*1024 + i*1024, fStats.data()+4 + 4*1024*1440 + 2*roi*1440+i*roi, roi*sizeof(float));
     55    }*/
     56
     57    dim.Update(buf);
    3758}
    3859
     
    4566    }
    4667
    47     if (h->Nroi != 1024)
    48     {
    49         fMsg.Error("Region of interest not 1024.");
    50         return false;
    51     }
    52 
    5368    if (fProcessing)
    5469    {
     
    5772    }
    5873
    59     if (fData.fStep==4)
     74    if (fData.fStep==3)
    6075    {
    6176        fMsg.Warn("DRS Calibration already finished... please restart!");
     
    6378    }
    6479
     80    if (fData.fStep!=2 && h->Nroi != 1024)
     81    {
     82        ostringstream msg;
     83        msg << "Region of interest not 1024, but " << h->Nroi << " in step " << fData.fStep <<  " ... as it ought to be.";
     84        fMsg.Error(msg);
     85        return false;
     86    }
     87
     88    vector<uint16_t> dac(8);
     89/*
     90    // We don't check consistency over several boards because this is done
     91    // by the eventCheck routine already
     92    for (int i=0; i<h->NBoard; i++)
     93    {
     94        const PEVNT_HEADER &hh = h->FADhead[i];
     95
     96        if (hh.start_package_flag==0)
     97            continue;
     98
     99        for (int j=0; j<8; j++)
     100            dac[j] = hh.dac[j];
     101
     102        break;
     103    }
     104
     105    for (int i=1; i<7; i++)
     106    {
     107        if (i==3 || dac[i]==dac[i+1])
     108            continue;
     109
     110        ostringstream msg;
     111        msg << "Values of DAC" << i << " (" << dac[i] << ") and DAC" << i+1 <<" (" << dac[i+1] << ") do not match... cannot take DRS calibration!";
     112        fMsg.Error(msg);
     113        return false;
     114    }
     115
     116    if (fData.fStep>0)
     117    {
     118        for (int j=0; j<8; j++)
     119        {
     120            if (fData.fDAC[j]==dac[j])
     121                continue;
     122
     123            ostringstream msg;
     124            msg << "DAC value from previous run (DAC" << j << "=" << fData.fDAC[j] << ") and current run ";
     125            msg << "(DAC" << j << "=" << dac[j] << ") inconsistent... cannot take DRS calibration!";
     126            fMsg.Error(msg);
     127            return false;
     128        }
     129    }
     130
     131    memcpy(fData.fDAC, dac.data(), 8*sizeof(uint16_t));
     132*/
    65133    fProcessing = true;
    66134
     135    const bool hastm = h->Nroi<=512 && h->NroiTM>=2*h->Nroi;
     136
    67137    Reset();
    68     InitSize(1440, 1024);
     138    InitSize(hastm ? 1600 : 1440, h->Nroi);
     139
     140    fData.fRoi   = fNumSamples;
     141    fData.fNumTm = hastm ? 160 : 0;
    69142
    70143    return DataWriteFits::Open(h);
     
    115188}
    116189
     190void ReverseCopy(const void *src, void *dest)
     191{
     192    reverse_copy(reinterpret_cast<const char*>(src),
     193                 reinterpret_cast<const char*>(src)+sizeof(float),
     194                 reinterpret_cast<char*>(dest));
     195}
     196
    117197void DataCalib::WriteFits()
    118198{
    119199#ifdef HAVE_FITS
    120200    FitsFile file(fMsg);
     201
     202    const uint16_t roi = fData.fRoi;
     203    const uint16_t ntm = fData.fNumTm;
    121204
    122205    file.AddColumn('I', "RunNumberBaseline");
    123206    file.AddColumn('I', "RunNumberGain");
    124207    file.AddColumn('I', "RunNumberTriggerOffset");
    125     file.AddColumn('F', "BaselineMean",      1024*1440, "mV");
    126     file.AddColumn('F', "BaselineRms",       1024*1440, "mV");
    127     file.AddColumn('F', "GainMean",          1024*1440, "mV");
    128     file.AddColumn('F', "GainRms",           1024*1440, "mV");
    129     file.AddColumn('F', "TriggerOffsetMean", 1024*1440, "mV");
    130     file.AddColumn('F', "TriggerOffsetRms",  1024*1440, "mV");
     208    file.AddColumn('F', "BaselineMean",        1024*1440, "mV");
     209    file.AddColumn('F', "BaselineRms",         1024*1440, "mV");
     210    file.AddColumn('F', "GainMean",            1024*1440, "mV");
     211    file.AddColumn('F', "GainRms",             1024*1440, "mV");
     212    file.AddColumn('F', "TriggerOffsetMean",    roi*1440, "mV");
     213    file.AddColumn('F', "TriggerOffsetRms",     roi*1440, "mV");
     214    file.AddColumn('F', "TriggerOffsetTMMean",  roi*ntm,  "mV");
     215    file.AddColumn('F', "TriggerOffsetTMRms",   roi*ntm,  "mV");
    131216
    132217    const string filename = FormFileName("drs.fits");
     
    146231        !file.WriteKeyNT("ADC",      12,               "Resolution of ADC in bits")      ||
    147232        !file.WriteKeyNT("DAC",      16,               "Resolution of DAC in bits")      ||
    148         !file.WriteKeyNT("DACLEVEL", 50000,            "Applied DAC level in counts")    ||
     233//        !file.WriteKeyNT("DAC_A",    fData.fDAC[0],    "Level of DAC 0 in DAC counts")   ||
     234//        !file.WriteKeyNT("DAC_B",    fData.fDAC[1],    "Leval of DAC 1-3 in DAC counts") ||
     235//        !file.WriteKeyNT("DAC_C",    fData.fDAC[4],    "Leval of DAC 4-7 in DAC counts") ||
    149236        !file.WriteKeyNT("NBOFFSET", fData.fNumOffset,       "Number of entries for offset calibration") ||
    150237        !file.WriteKeyNT("NBGAIN",   fData.fNumGain/1953125, "Number of entries for gain calibration")   ||
    151238        !file.WriteKeyNT("NBTRGOFF", fData.fNumTrgOff,       "Number of entries for trigger offset calibration") ||
    152239        !file.WriteKeyNT("NPIX",     1440,             "Number of channels in the camera") ||
    153         !file.WriteKeyNT("NROI",     1024,             "Region of interest")
     240        !file.WriteKeyNT("NTM",      ntm,              "Number of time marker channels") ||
     241        !file.WriteKeyNT("NROI",     roi,              "Region of interest")
    154242       )
    155243        return;
    156244
    157     vector<char> buf;
    158     buf.reserve(fStats.size()*sizeof(float));
     245    vector<char> buf(fStats.size()*sizeof(float));
    159246
    160247    char *src  = reinterpret_cast<char*>(fStats.data());
    161     char *end  = reinterpret_cast<char*>(fStats.data()+1024*1440*6+3);
     248    char *end  = reinterpret_cast<char*>(fStats.data()+fStats.size());
    162249    char *dest = buf.data();
    163250
     
    172259        return;
    173260
    174     if (!file.WriteData(buf.data(), 1024*1440*sizeof(float)*6+3))
     261    if (!file.WriteData(buf.data(), (1440*1024*4 + 1440*roi*2 + ntm*roi*2 + 3)*sizeof(float)))
    175262        return;
    176263
    177264    ostringstream str;
    178     str << "Wrote DRS calibration data (step=" << fData.fStep << ") to '" << filename << "'";
     265    str << "Wrote DRS calibration data (step=" << fData.fStep << ", roi=" << roi << ") to '" << filename << "'";
    179266    Info(str.str());
    180267#endif
     
    192279
    193280        // Scale ADC data from 12bit to 2000mV
    194         GetSampleStats(fStats.data()+3, 2000./4096);
     281        GetSampleStats(fStats.data()+4, 2000./4096);
    195282        reinterpret_cast<uint32_t*>(fStats.data())[0] = GetRunId();;
    196283    }
     
    200287        fData.fNumGain = fNumEntries;
    201288
    202         // DAC:  0..2.5V == 0..65535
    203         // V-mV: 1000
    204         //fNumGain *= 2500*50000;
     289        // DAC:  0..2.5V == 0..65535            2500*50000   625*50000  625*3125
     290        // V-mV: 1000                           ----------   ---------  --------
     291        //fNumGain *= 2500*50000;                  65536       16384      1024
    205292        //for (int i=0; i<1024*1440; i++)
    206293        //    fGain[i] *= 65536;
     
    210297
    211298        // Scale ADC data from 12bit to 2000mV
    212         GetSampleStats(fStats.data()+1024*1440*2+3, 2000./4096/fData.fNumOffset);//0.5);
     299        GetSampleStats(fStats.data()+1024*1440*2+4, 2000./4096/fData.fNumOffset);//0.5);
    213300        reinterpret_cast<uint32_t*>(fStats.data())[1] = GetRunId();;
    214301    }
     
    219306
    220307        // Scale ADC data from 12bit to 2000mV
    221         GetSampleStats(fStats.data()+1024*1440*4+3, 2000./4096/fData.fNumOffset);//0.5);
    222         reinterpret_cast<uint32_t*>(fStats.data())[2] = GetRunId();;
     308        GetSampleStats(fStats.data()+1024*1440*4+4, 2000./4096/fData.fNumOffset);//0.5);
     309        reinterpret_cast<uint32_t*>(fStats.data())[2] = GetRunId();
     310        reinterpret_cast<uint32_t*>(fStats.data())[3] = fNumSamples;
    223311    }
    224312
     
    226314        WriteFits();
    227315
    228     fDim.Update(fStats);
     316    Update(fDim);
    229317
    230318    fData.fStep++;
Note: See TracChangeset for help on using the changeset viewer.