source: Sophya/trunk/Poubelle/archTOI.old/toiboloproducer.cc@ 634

Last change on this file since 634 was 634, checked in by ansari, 26 years ago

linux-ppc, gcc 2.95.1

File size: 2.9 KB
RevLine 
[534]1// toiboloproducer.cc
2// Eric Aubourg CEA/DAPNIA/SPP septembre 1999
3
4#include "toiboloproducer.h"
5#include "archexc.h"
6#include "requesthandler.h"
[612]7#include "polfitclip.h"
[534]8
[612]9#define boloMuV "boloMuV"
[534]10
11
12TOIBoloProducer::TOIBoloProducer() {
[634]13 possibleTOIs.insert(TOI(boloMuV, TOI::all, "linfilt sqfilt total", "microVolts"));
[534]14}
15
[612]16// No option == linfilt
17
[534]18string TOIBoloProducer::getName() {
[612]19 return("TOIBoloProducer 1.1");
[534]20}
21
[612]22int TOIBoloProducer::filtHalfRange = 20;
[534]23
[612]24
[534]25void TOIBoloProducer::dataFeed(TOIProducer* source, TOI const& toi, long sampleNum, double value) {
[634]26 if (toi.name == "boloDACV") {
27 boloDacV[toi.index] = value;
28 }
29
30 if (toi.name == "boloRawMuV") {
[534]31 if (source->canGetValue(sampleNum-1, toi)) {
32 value = (value + source->getValue(sampleNum-1, toi))/2.;
[612]33
34 //TOI toi2 = toi;
35 //toi2.name = boloMuV;
36
37 TOI toi2(boloMuV, toi.index, "sqfilt", toi.unit);
[634]38 if (isProducing(toi2))
39 computedValue(toi2, sampleNum, value);
40
41 toi2.options.insert("total"); toi2.findref();
42 if (isProducing(toi2)) {
43 computedValue(toi2, sampleNum, boloDacV[toi.index] - value);
44 }
[534]45 }
[612]46
47 // $CHECK$ possible optimization : keep fit for several successive values
48
49 if (source->canGetValue(sampleNum-2*filtHalfRange, toi)) {
50 PolFitClip fit(2*filtHalfRange,1);
51 int s = sampleNum % 2 ? 1 : -1;
52 for (int i=0; i<2*filtHalfRange-1; i++) {
53 fit.addData(sampleNum - i,
54 s*(source->getValue(sampleNum - i, toi) - source->getValue(sampleNum - i -1, toi))/2);
55 s = -s;
56 }
57 fit.doFit();
58 double y = source->getValue(sampleNum - filtHalfRange, toi);
59 s = sampleNum % 2 ? 1 : -1;
60 y =y - s*fit.value(sampleNum - filtHalfRange);
61 TOI toi2(boloMuV, toi.index, "linfilt", toi.unit);
62 if (isProducing(toi2))
63 computedValue(toi2, sampleNum - filtHalfRange, y);
[634]64 toi2.options.insert("total"); toi2.findref();
65 if (isProducing(toi2)) {
66 computedValue(toi2, sampleNum - filtHalfRange, boloDacV[toi.index] - y);
67 }
[612]68 TOI toi3(boloMuV, toi.index, "", toi.unit);
69 if (isProducing(toi3))
70 computedValue(toi3, sampleNum - filtHalfRange, y);
[634]71 toi2.options.insert("total"); toi2.findref();
72 if (isProducing(toi3)) {
73 computedValue(toi3, sampleNum - filtHalfRange, boloDacV[toi.index] - y);
74 }
[612]75 }
[634]76 }
[534]77}
78
79set<TOI> TOIBoloProducer::reqTOIFor(TOI const& toi) {
80 set<TOI> t;
[612]81 if (toi.name == boloMuV) {
82 TOI toi2("boloRawMuV", toi.index);
[534]83 t.insert(toi2);
84 } else {
85 throw ArchExc("Cannot produce "+toi.name);
86 }
[634]87 if (toi.options.find("total") != toi.options.end()) {
88 TOI toi2("boloDACV", toi.index);
89 t.insert(toi2);
90 }
[534]91 return t;
92}
93
94
95void TOIBoloProducer::propagateLowBound(TOI const& toi, long sampleNum) {
96 CHKPROD
[555]97 map<TOI, TOIProducer*> & need = neededTOIs[toi];
[534]98 int hlen = 1;
99 for (map<TOI, TOIProducer*>::iterator i = need.begin(); i != need.end(); i++) {
100 (*i).second->wontNeedEarlier((*i).first, this, sampleNum-hlen);
101 }
102}
103
104
105
Note: See TracBrowser for help on using the repository browser.