Index: trunk/Mars/hawc/processing/currents.C
===================================================================
--- trunk/Mars/hawc/processing/currents.C	(revision 20027)
+++ trunk/Mars/hawc/processing/currents.C	(revision 20027)
@@ -0,0 +1,197 @@
+
+
+void currents(const char *fname, double beg=0, double end=100000)
+{
+    fits file(fname);
+
+    //file.PrintColumns();
+    //file.PrintKeys();
+
+    Double_t time;
+    Double_t jd;
+
+    float Imon[64];
+    float Tmon[64];
+    float Umon[64];
+    float Tpsu[2];
+    file.SetPtrAddress("Time",  &time);
+    file.SetPtrAddress("Imon",  Imon);
+    file.SetPtrAddress("Tmon",  Tmon);
+    file.SetPtrAddress("Vmon",  Umon);
+    file.SetPtrAddress("Tpsu",  Tpsu);
+
+    UInt_t offset = file.GetUInt("MJDREF");
+    if (beg < 30000)
+        beg+=offset;
+    if (end < 30000)
+        end+=offset;
+
+    double AvgUmed = 0;
+    double AvgTmed = 0;
+    double AvgImed = 0;
+    double AvgUavg = 0;
+    double AvgTavg = 0;
+    double AvgIavg = 0;
+    double AvgUrms = 0;
+    double AvgTrms = 0;
+    double AvgIrms = 0;
+    double AvgUdev = 0;
+    double AvgTdev = 0;
+    double AvgIdev = 0;
+    double AvgPsu  = 0;
+/*
+    double RmsUmed = 0;
+    double RmsTmed = 0;
+    double RmsImed = 0;
+    double RmsUavg = 0;
+    double RmsTavg = 0;
+    double RmsIavg = 0;
+    double RmsUrms = 0;
+    double RmsTrms = 0;
+    double RmsIrms = 0;
+    double RmsPsu  = 0;
+*/
+    int count = 0;
+
+    double Umed = 0;
+    double Tmed = 0;
+    double Imed = 0;
+    double Udev = 0;
+    double Tdev = 0;
+    double Idev = 0;
+    double Uavg = 0;
+    double Tavg = 0;
+    double Iavg = 0;
+    double Urms = 0;
+    double Trms = 0;
+    double Irms = 0;
+
+    double psu = 0;
+
+    double diff  = -1;
+
+    while (file.GetNextRow())
+    {
+        time += offset;
+        jd    = time + 2400000.5;
+
+        if (time>end)
+            break;
+
+        Udev = MMath::MedianDev(64, Umon, Umed);
+        Tdev = MMath::MedianDev(64, Tmon, Tmed);
+        Idev = MMath::MedianDev(64, Imon, Imed);
+        Uavg = TMath::Mean(64, Umon);
+        Tavg = TMath::Mean(64, Tmon);
+        Iavg = TMath::Mean(64, Imon);
+        Urms = TMath::RMS(64, Umon);
+        Trms = TMath::RMS(64, Tmon);
+        Irms = TMath::RMS(64, Imon);
+
+        psu  = (Tpsu[0]+Tpsu[1])/2;
+
+        if (time<beg)
+        {
+            diff = beg-time;
+            continue;
+        }
+
+        AvgUmed += Umed;
+        AvgTmed += Tmed;
+        AvgImed += Imed;
+        AvgUavg += Uavg;
+        AvgTavg += Tavg;
+        AvgIavg += Iavg;
+        AvgUrms += Urms;
+        AvgTrms += Trms;
+        AvgIrms += Irms;
+        AvgUdev += Udev;
+        AvgTdev += Tdev;
+        AvgIdev += Idev;
+        AvgPsu  += psu;
+
+        count ++;
+    }
+
+    if (count==0)
+    {
+        if (diff<5./24/3600)
+        {
+            cout << "result";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << " NULL";
+            cout << endl;
+            return;
+        }
+
+        cout << "result";
+        cout << " " << Umed;
+        cout << " " << Uavg;
+        cout << " " << Udev;
+        cout << " " << Urms;
+
+        cout << " " << Imed;
+        cout << " " << Iavg;
+        cout << " " << Idev;
+        cout << " " << Irms;
+
+        cout << " " << Tmed;
+        cout << " " << Tavg;
+        cout << " " << Tdev;
+        cout << " " << Trms;
+
+        cout << " " << psu;
+        cout << endl;
+        return;
+    }
+
+    AvgUmed /= count;
+    AvgImed /= count;
+    AvgTmed /= count;
+
+    AvgUavg /= count;
+    AvgIavg /= count;
+    AvgTavg /= count;
+
+    AvgUrms /= count;
+    AvgIrms /= count;
+    AvgTrms /= count;
+
+    AvgUdev /= count;
+    AvgIdev /= count;
+    AvgTdev /= count;
+
+    AvgPsu  /= count;
+
+
+    cout << "result";
+    cout << " " << AvgUmed;
+    cout << " " << AvgUavg;
+    cout << " " << AvgUdev;
+    cout << " " << AvgUrms;
+
+    cout << " " << AvgImed;
+    cout << " " << AvgIavg;
+    cout << " " << AvgIdev;
+    cout << " " << AvgIrms;
+
+    cout << " " << AvgTmed;
+    cout << " " << AvgTavg;
+    cout << " " << AvgTdev;
+    cout << " " << AvgTrms;
+
+    cout << " " << AvgPsu;
+
+    cout << endl;
+}
Index: trunk/Mars/hawc/processing/drstemp.C
===================================================================
--- trunk/Mars/hawc/processing/drstemp.C	(revision 20027)
+++ trunk/Mars/hawc/processing/drstemp.C	(revision 20027)
@@ -0,0 +1,173 @@
+void drstemp82(fits &file, double beg, double end)
+{
+    UInt_t offset = file.GetUInt("MJDREF");
+    if (beg < 30000)
+        beg+=offset;
+    if (end < 30000)
+        end+=offset;
+
+    double time;
+    file.SetPtrAddress("Time", &time);
+
+    float *temp = (float*)file.SetPtrAddress("temp");
+
+    double avgmin = 0;
+    double avgmax = 0;
+    double rmsmin = 0;
+    double rmsmax = 0;
+
+    int cnt = 0;
+
+    double lastavgmin = -1;
+    double lastavgmax = -1;
+    double lastrmsmin = -1;
+    double lastrmsmax = -1;
+
+    double diff  = -1;
+
+    while (file.GetNextRow())
+    {
+        time += offset;
+
+        if (time>end)
+            break;
+
+        double mn = 0;
+        double mx = 0;
+        double rn = 0;
+        double rx = 0;
+        for (int i=1; i<=2; i++)
+        {
+            mn += temp[i];
+            rn += temp[i]*temp[i];
+
+            mx += temp[i+41];
+            rx += temp[i+41]*temp[i+41];
+        }
+        mn /= 40;
+        mx /= 40;
+        rn /= 40;
+        rx /= 40;
+
+        if (time<beg)
+        {
+            lastavgmin  = mn;
+            lastavgmax  = mx;
+            lastrmsmin  = sqrt(rn-mn*mn);
+            lastrmsmax  = sqrt(rx-mx*mx);
+            diff  = beg-time;
+            continue;
+        }
+
+        avgmin += mn;
+        avgmax += mx;
+
+        rmsmin += sqrt(rn-mn*mn);
+        rmsmax += sqrt(rx-mx*mx);
+
+        cnt ++;
+    }
+
+    if (cnt==0)
+    {
+        if (diff<5./24/3600)
+            return;
+
+        cout << "result " << lastavgmin << " " << lastavgmax << " " << lastrmsmin << " " << lastrmsmax << endl;
+        return;
+    }
+
+    avgmin /= cnt;
+    avgmax /= cnt;
+    rmsmin /= cnt;
+    rmsmax /= cnt;
+
+    cout << "result " << avgmin << " " << avgmax << " " << rmsmin << " " << rmsmax << endl;
+}
+
+void drstemp160(fits &file, double beg, double end)
+{
+    UInt_t offset = file.GetUInt("MJDREF");
+    if (beg < 30000)
+        beg+=offset;
+    if (end < 30000)
+        end+=offset;
+
+    double time;
+    file.SetPtrAddress("Time", &time);
+
+    float *temp = (float*)file.SetPtrAddress("temp");
+
+    double avg = 0;
+    double rms = 0;
+
+    int cnt = 0;
+
+    double lastavg = -1;
+    double lastrms = -1;
+
+    double diff  = -1;
+
+    while (file.GetNextRow())
+    {
+        time += offset;
+
+        if (time>end)
+            break;
+
+        double mn = 0;
+        double rn = 0;
+        for (int i=0; i<=7; i++)
+        {
+            mn += temp[i];
+            rn += temp[i]*temp[i];
+        }
+        mn /= 8;
+        rn /= 8;
+
+        if (time<beg)
+        {
+            lastavg = mn;
+            lastrms = sqrt(rn-mn*mn);
+            diff    = beg-time;
+            continue;
+        }
+
+        avg += mn;
+        rms += sqrt(rn-mn*mn);
+
+        cnt ++;
+    }
+
+    if (cnt==0)
+    {
+        if (diff<5./24/3600)
+            return;
+
+        cout << "result " << lastavg << " " << lastavg << " " << lastrms << " " << lastrms << endl;
+        return;
+    }
+
+    avg /= cnt;
+    rms /= cnt;
+
+    cout << "result " << avg << " " << avg << " " << rms << " " << rms << " " << endl;
+}
+
+void drstemp(const char *fname, double beg=0, double end=100000)
+{
+    fits file(fname);
+
+    //file.PrintColumns();
+    //file.PrintKeys();
+
+    float temp[160];
+//    if (file.SetPtrAddress("temp", temp, 82))
+//    {
+//        drstemp82(file, beg, end);
+//        return;
+//    }
+
+    file.SetPtrAddress("temp", temp, 160);
+    drstemp160(file, beg, end);
+}
Index: trunk/Mars/hawc/processing/threshold.C
===================================================================
--- trunk/Mars/hawc/processing/threshold.C	(revision 20027)
+++ trunk/Mars/hawc/processing/threshold.C	(revision 20027)
@@ -0,0 +1,116 @@
+#include <algorithm>
+
+void threshold(const char *fname, double beg=0, double end=100000)
+{
+    fits file(fname);
+
+    //file.PrintColumns();
+    //file.PrintKeys();
+
+    Double_t time;
+    UShort_t adc;
+    UInt_t   dead, run;
+    float    temp;
+    UInt_t   qos;
+    UInt_t   counter_ch[8];
+    UInt_t   counter_sum[2];
+    UShort_t dac_ch[8];
+    UShort_t dac_sum[2];
+    float    dt_sec[2];
+    file.SetPtrAddress("QoS",         &qos);
+    file.SetPtrAddress("Time",        &time);
+    file.SetPtrAddress("counter_ch",   counter_ch);
+    file.SetPtrAddress("counter_sum",  counter_sum);
+    file.SetPtrAddress("dac_ch",       dac_ch);
+    file.SetPtrAddress("dac_sum",      dac_sum);
+    file.SetPtrAddress("dt_sec",       dt_sec);
+
+    UInt_t offset = file.GetUInt("MJDREF");
+    if (beg < 30000)
+        beg+=offset;
+    if (end < 30000)
+        end+=offset;
+
+    double min_dac_ch   = 65535;
+    double avg_dac_ch   = 0;
+    double max_dac_ch   = 0;
+
+    double dac_ch_min   = 65535;
+    double dac_ch_med   = 0;
+    double dac_ch_max   = 0;
+
+    double min_dac_sum  = 65535;
+    double max_dac_sum  = 0;
+
+    double dac_sum_min  = 65535;
+    double dac_sum_max  = 0;
+
+    double rate_ch[8] = {0,0,0,0,0,0,0,0};
+    double rate_sum[2] = {0,0};
+
+    int count = 0;
+
+    double diff = -1;
+
+    double sum_dt = 0;
+
+
+    while (file.GetNextRow())
+    {
+        time += offset;
+
+        if (time>end)
+            break;
+
+        dac_ch_min  = TMath::MinElement(8, dac_ch);
+        dac_ch_med  = TMath::Median(    8, dac_ch);
+        dac_ch_max  = TMath::MaxElement(8, dac_ch);
+        dac_sum_min = TMath::Min(dac_sum[0], dac_sum[1]);
+        dac_sum_max = TMath::Min(dac_sum[0], dac_sum[1]);
+
+        if (time<beg)
+        {
+            diff = beg-time;
+            continue;
+        }
+
+        avg_dac_ch += dac_ch_med;
+        count++;
+
+        min_dac_ch = TMath::Min(min_dac_ch, dac_ch_min);
+        max_dac_ch = TMath::Max(max_dac_ch, dac_ch_max);
+
+        min_dac_sum = TMath::Min(min_dac_sum, dac_sum_min);
+        max_dac_sum = TMath::Max(max_dac_sum, dac_sum_max);
+
+        for (int i=0;i<8; i++)
+            rate_ch[i] += counter_ch[i];
+        rate_sum[0] += counter_sum[0];
+        rate_sum[1] += counter_sum[1];
+
+        sum_dt += dt_sec[0];
+    }
+
+    if (count==0)
+    {
+        if (diff<5./24/3600)
+        {
+            cout << "result NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL" << endl;
+            return;
+        }
+
+        cout << "result " << dac_ch_min << " " << dac_ch_med << " " << dac_ch_max << " " << dac_sum_min << " " << dac_sum_max;
+        cout << " NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL" << endl;
+        return;
+    }
+
+    avg_dac_ch /= count;
+
+
+    cout << "result " << min_dac_ch <<" " << avg_dac_ch << " " << max_dac_ch << " " << min_dac_sum << " " << max_dac_sum;
+    for (int i=0;i<8; i++)
+        cout << " " << rate_ch[i] / sum_dt;
+    cout << " " << rate_sum[0] / sum_dt;
+    cout << " " << rate_sum[1] / sum_dt;
+    cout << endl;
+}
Index: trunk/Mars/hawc/processing/trigger.C
===================================================================
--- trunk/Mars/hawc/processing/trigger.C	(revision 20027)
+++ trunk/Mars/hawc/processing/trigger.C	(revision 20027)
@@ -0,0 +1,88 @@
+#include <algorithm>
+
+void trigger(const char *fname, double beg=0, double end=100000)
+{
+    fits file(fname);
+
+    //file.PrintColumns();
+    //file.PrintKeys();
+
+    Double_t time;
+    UShort_t adc;
+    UInt_t dead, run;
+    float temp;
+    UInt_t qos;
+    file.SetPtrAddress("QoS",  &qos);
+    file.SetPtrAddress("Time", &time);
+    //file.SetPtrAddress("adc",  &adc);
+    file.SetPtrAddress("dead_time",  &dead);
+    file.SetPtrAddress("run_time",   &run);
+    file.SetPtrAddress("temp",       &temp);
+
+    UInt_t offset = file.GetUInt("MJDREF");
+    if (beg < 30000)
+        beg+=offset;
+    if (end < 30000)
+        end+=offset;
+
+    double average  = 0;
+    double med_avg  = 0;
+    double med_rms  = 0;
+    UShort_t max_tot  = 0;
+    int    cnt  = 0;
+
+    double th_last = -1;
+    float temp_last = -1;
+    UShort_t max_last = -1;
+    double diff = -1;
+
+    double tot_dead = 0;
+    double tot_run  = 0;
+    double avg_temp = 0;
+    double avg_th   = 0;
+    int count = 0;
+
+
+    while (file.GetNextRow())
+    {
+        if (qos!=4)
+            continue;
+
+        time += offset;
+
+        if (time>end)
+            break;
+
+        if (time<beg)
+        {
+            //th_last   = adc;
+            temp_last = temp;
+            diff = beg-time;
+            continue;
+        }
+
+        //avg_th   += adc;
+        avg_temp += temp;
+        tot_dead += dead;
+        tot_run  += run,
+
+        count ++;
+    }
+
+    if (count==0)
+    {
+        if (diff<5./24/3600)
+        {
+            cout << "result NULL NULL NULL NULL" << endl;
+            return;
+        }
+
+        cout << "result NULL NULL NULL " << temp_last << endl;
+        return;
+    }
+
+    //avg_th   /= count;
+    avg_temp /= count;
+
+    cout << "result " << tot_run*10e-9 << " " << tot_dead*10e-9 << " " << 1.-tot_dead/tot_run << " " << avg_temp << endl;
+}
