| [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] | 21 | int 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 |  | 
|---|
|  | 30 | TOILLSSTProducer::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 |  | 
|---|
|  | 38 | string TOILLSSTProducer::getName() { | 
|---|
|  | 39 | return("TOILLSSTProducer 1.0"); | 
|---|
|  | 40 | } | 
|---|
|  | 41 |  | 
|---|
|  | 42 |  | 
|---|
|  | 43 | void TOILLSSTProducer::registerProcessor(SSTDataProcessor* p) { | 
|---|
|  | 44 | processors.push_back(p); | 
|---|
|  | 45 | } | 
|---|
|  | 46 |  | 
|---|
|  | 47 | void 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 |  | 
|---|
|  | 70 | double 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 |  | 
|---|
|  | 88 | void 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 |  | 
|---|