source: Sophya/trunk/Poubelle/archTOI.old/toillsstproducer.cc@ 626

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

sst

File size: 3.7 KB
RevLine 
[534]1// toillsstproducer.cc
2// Eric Aubourg CEA/DAPNIA/SPP octobre 1999
3
4#include "toillsstproducer.h"
5#include "archfileset.h"
6#include "toimanager.h"
7#include "requesthandler.h"
8
9#define sstChannel "sstChannel"
10#define sstChannelCN "sstChannelCN"
11#define sstDiode "sstDiode"
12#define sstDiodeCN "sstDiodeCN"
13
14// diodpermut[i] = channel de la diode i
[581]15// int TOILLSSTProducer::diodpermut[46]=
16// { 8,24,40, 9,25,41,10,26,42,11,
17// 27,43,16,32, 1,17,33, 2,18,34,
18// 3,19,35,12,28,44,13,29,45,14,
19// 30,46,15,31,47,20,36, 5,21,37,
20// 6,22,38, 7,23,39};
[534]21int TOILLSSTProducer::diodpermut[46]=
22 { 8,24,40, 9,25,41,10,26,42,11,
23 27,43,16,32, 1,17,33, 2,18,34,
24 3,19,35,12,28,44,13,29,45,14,
25 30,46,15,31,47,20,36, 5,21,37,
[581]26 6,38,22, 7,23,39};
[534]27 // voies 0 et 4 non connectees, voie 1 en panne.
28
29
30TOILLSSTProducer::TOILLSSTProducer()
31{
32 possibleTOIs.insert(TOI(sstChannel, TOI::all, "", "ADU"));
33 possibleTOIs.insert(TOI(sstChannelCN, TOI::all, "", "ADU"));
34 possibleTOIs.insert(TOI(sstDiode, TOI::all, "", "ADU"));
35 possibleTOIs.insert(TOI(sstDiodeCN, TOI::all, "", "ADU"));
36}
37
38string TOILLSSTProducer::getName() {
39 return("TOILLSSTProducer 1.0");
40}
41
42
43void TOILLSSTProducer::registerProcessor(SSTDataProcessor* p) {
44 processors.push_back(p);
45}
46
47void TOILLSSTProducer::DecodeTMBlock(block_type_sst* blk, int i, int* diod)
48{
49 int j; // 0-5 : numero du bloc de 8 diodes
50 int k; // 0-2 : indice du bloc de 4 bits (une diode = 12 bits = 3 blocs de 4 bits)
51 int l; // 0-7 : indice de la diode dans son bloc (8 diodes * 4 bits = 1 mot de 32 bits)
52
53 // numero de la diode (0-47) = j*8+l;
54 // indice dans le bloc sst du mot de 32 bits (0-17) = j*3+k;
55 // indice dans mot de 32 bits du premier bit utile = 4*l;
56
57 for (j=0; j<48; j++) diod[j] = 0;
58
59 for (j=0; j<6; j++)
60 for (k=0; k<3; k++)
61 for (l=0; l<8; l++) {
62 int4 word = blk->sst[i][j*3+k];
63 word = (word >> (4*l)) & 0xF;
64 diod[j*8+l] = (diod[j*8+l] << 4) + word;
65 }
66
67 for (j=0; j<48; j++) diod[j] -= 2048;
68}
69
70double TOILLSSTProducer::getSSTRawSignalCN(ArchFileSet* fs, int ichannel, int imesure) {
71 // Si pas bloc comprime -> 0.5
72 if (fs->lastSSTComp() == NULL) return .5;
73 if (numero_block(fs->lastSSTComp()) != numero_block(fs->lastSST())) return 0.5;
74
75 // Attention, on ne transmet pas les canaux 0 et 4....
76 if (ichannel == 0 || ichannel == 4) return 0;
77 int i = ichannel - 1;
78 if (i >= 4) i--;
79 unsigned int4* data = fs->lastSSTComp()->sst[i];
80 // Les deux premieres valeurs sont codees directement...
81 if (imesure<2) return 0.5;
82 int iExp = (imesure-2)/7 + 1;
83 int expo = data[iExp] & 0xf;
84 int noise = 1 << expo;
85 return noise/2.;
86}
87
88void TOILLSSTProducer::handleBlock(ArchFileSet* fs)
89{
90 block_type_sst* blk = fs->lastSST();
91 long sample0 = numero_block(blk)*72;
92 int channels[48];
93 int diodes[46];
94 for (int j=0; j<nb_per_block*2; j++) {
95 DecodeTMBlock(blk, j, channels);
96 for (int i=0; i<46; i++)
97 diodes[i] = channels[diodpermut[i]];
98 for (vector<SSTDataProcessor*>::iterator i = processors.begin();
99 i != processors.end(); i++) {
100 (*i)->dataFeed(sample0 + j, diodes);
101 }
102 for (set<TOI>::iterator i = producedTOIs.begin(); i != producedTOIs.end(); i++) {
103 int ich = (*i).index;
104 if ((*i).name == sstChannel) {
105 computedValue((*i), sample0+j, channels[ich]);
106 } else if ((*i).name == sstDiode) {
107 computedValue((*i), sample0+j, diodes[ich]);
108 } else if ((*i).name == sstChannelCN) {
109 computedValue((*i), sample0+j, getSSTRawSignalCN(fs, ich, j));
110 } else if ((*i).name == sstDiodeCN) {
111 computedValue((*i), sample0+j, getSSTRawSignalCN(fs, diodpermut[ich], j));
112 }
113 }
114 }
115}
116
Note: See TracBrowser for help on using the repository browser.