Changeset 18337


Ignore:
Timestamp:
09/30/15 09:12:44 (9 years ago)
Author:
tbretz
Message:
Implemented a moon mode which turns of the voltage of the inner pixels but still returning the correct overvoltage. The pixels are operated 5V below operation voltage.
File:
1 edited

Legend:

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

    r18191 r18337  
    7474
    7575    vector<double> fVoltOffset;
     76
     77    uint16_t fMoonMode;
    7678
    7779    uint16_t fCurrentRequestInterval;
     
    493495
    494496        // -------------------------------------------------------------------------------------
     497        // Inner patches to be blocked (operated below the operation voltage) in moon mode
     498
     499        static const array<int, 14> inner0 =
     500        {{
     501             62,  63, 130, 131, 132, 133, 134,
     502            135, 222, 223, 292, 293, 294, 295,
     503        }};
     504
     505        static const array<int, 23> inner1 =
     506        {{
     507             58,  59,  60,  61, 129, 138, 139, 140, 141, 142, 143, 218,
     508            219, 220, 221, 290, 291, 298, 299, 300, 301, 302, 303,
     509        }};
     510
     511        static const array<int, 43> inner2 =
     512        {{
     513             42,  43,  44,  45,  55,  56,  57,  70,  71,  78,  79,
     514             96,  97,  98,  99, 102, 103, 128, 136, 137, 159, 202,
     515            203, 204, 205, 214, 216, 217, 228, 230, 231, 256, 257,
     516            258, 259, 262, 263, 288, 289, 296, 297, 310, 318
     517        }};
     518
     519        // -------------------------------------------------------------------------------------
    495520
    496521        // Nominal overvoltage (w.r.t. the bias setup values)
     
    546571                continue;
    547572
     573            // Check if this is a blocked channel
     574            const bool blocked =
     575                (fMoonMode>0 && std::find(inner0.begin(), inner0.end(), i)!=inner0.end()) ||
     576                (fMoonMode>1 && std::find(inner1.begin(), inner1.end(), i)!=inner1.end()) ||
     577                (fMoonMode>2 && std::find(inner2.begin(), inner2.end(), i)!=inner2.end());
     578
    548579            // Number of G-APDs in this patch
    549580            const int N = hv.count();
     
    613644
    614645            // Nominal operation voltage with correction for temperature dependence
    615             const double Uop = fVoltGapd[i] + fVoltOffset[i] + fTempOffset[i];
     646            const double Uop = fVoltGapd[i] + fVoltOffset[i] + fTempOffset[i]
     647                + (blocked ? -5 : 0);
    616648
    617649            // Current overvoltage (at a G-APD with the correct 3900 Ohm resistor)
     
    685717            vec[i] = Uset;
    686718
    687             // Calculate statistics only for channels with a valid calibration
    688             //if (Uov>0)
     719            const double iapd = Iapd*1e6; // A --> uA
     720
     721            data.I[i]   = iapd;
     722            data.Uov[i] = Uov;
     723
     724            if (!blocked)
    689725            {
    690726                const int g = hv.group();
     
    699735                    max[g] = Uov;
    700736
    701                 const double iapd = Iapd*1e6; // A --> uA
    702 
    703                 data.I[i]  = iapd;
    704737                data.Iavg += iapd;
    705738                data.Irms += iapd*iapd;
    706 
    707                 data.Uov[i] = Uov;
    708739
    709740                med[2][num[2]++] = iapd;
     
    932963    }
    933964
     965    int SetMoonMode(const EventImp &evt)
     966    {
     967        if (!CheckEventSize(evt.GetSize(), "SetMoonMode", 2))
     968            return kSM_FatalError;
     969
     970        fMoonMode = evt.GetUShort();
     971        if (fMoonMode>3)
     972            fMoonMode=3;
     973
     974        Info("New moon mode: "+to_string(fMoonMode));
     975
     976        return GetCurrentState();
     977    }
     978
    934979    int Calibrate()
    935980    {
     
    9791024        out << "Starting feedback with an offset of " << fUserOffset << "V";
    9801025        Message(out);
     1026
     1027        if (fMoonMode>0)
     1028            Message("Moon mode "+to_string(fMoonMode)+" turned on.");
    9811029
    9821030        return Feedback::State::kWaitingForData;
     
    11541202                    "|U[V]:Offset per bias channels"),
    11551203        fVoltOffset(416),
     1204        fMoonMode(0),
    11561205        fCurrentRequestInterval(0),
    11571206        fNumCalibIgnore(30),
     
    12371286            (bind(&StateMachineFeedback::LoadCalibration, this))
    12381287            ("");
     1288
     1289        AddEvent("SET_MOON_MODE", "S:1", Feedback::State::kConnected, Feedback::State::kCalibrated)
     1290            (bind(&StateMachineFeedback::SetMoonMode, this, placeholders::_1))
     1291            ("Operate central pixels at 5V below nominal voltage. 0:off, 1:minimal, 2:medium, 3:maximum size.");
    12391292
    12401293
Note: See TracChangeset for help on using the changeset viewer.