00001
00020 #include "Altro.h"
00021
00031 Altro::Altro(int timebins, short* Channel){
00032 ftimebins = timebins;
00033
00034 channelShort = Channel;
00035
00036 fOnBSL1 = 0;
00037 fOnTCF = 0;
00038 fOnBSL2 = 0;
00039 fOnClip = 0;
00040 fOnZSU = 0;
00041
00042 fConfiguredAltro = 0;
00043 fConfiguredBSL1 = 0;
00044 fConfiguredTCF = 0;
00045 fConfiguredBSL2 = 0;
00046 fConfiguredZSU = 0;
00047 ADCkeep = 0;
00048 }
00049
00054 Altro::~Altro(){
00055 if(fConfiguredZSU == 1)
00056
00057 free(ADCkeep);
00058 }
00059
00072 void Altro::ConfigAltro(int ONBaselineCorrection1, int ONTailcancellation, int ONBaselineCorrection2, int ONClipping, int ONZerosuppression){
00073 fOnBSL1 = inRange(ONBaselineCorrection1,0,1,"Altro::ConfigAltro","ONBaselineCorrection1");
00074 fOnTCF = inRange(ONTailcancellation,0,1,"Altro::ConfigAltro","ONTailcancellation");
00075 fOnBSL2 = inRange(ONBaselineCorrection2,0,1,"Altro::ConfigAltro","ONBaselineCorrection2");
00076 fOnClip = inRange(ONClipping,0,1,"Altro::ConfigAltro","ONClipping");
00077 fOnZSU = inRange(ONZerosuppression,0,1,"Altro::ConfigAltro","ONZerosuppression");
00078 fConfiguredAltro = 1;
00079 }
00080
00094 void Altro::ConfigBaselineCorrection_1(int mode, int ValuePeDestal, int *PedestalMem, int polarity){
00095 fBSL1mode = inRange(mode,0,10,"Altro::ConfigBaselineCorrection_1","mode");
00096 fBSL1ValuePeDestal = inRange(ValuePeDestal,0,1023,"Altro::BaselineCorrection_1","ValuePeDestal");
00097 fBSL1PedestalMem = PedestalMem;
00098 fBSL1polarity = inRange(polarity,0,1,"Altro::BaselineCorrection_1","polarity");
00099 fConfiguredBSL1 = 1;
00100 }
00101
00118 void Altro::ConfigTailCancellationFilter(int K1, int K2, int K3, int L1, int L2, int L3){
00119
00120
00121
00122
00123 fTCFK1Int = inRange(K1,0,65535,"Altro::ConfigTailCancellationFilter","K1");
00124 fTCFK2Int = inRange(K2,0,65535,"Altro::ConfigTailCancellationFilter","K2");
00125 fTCFK3Int = inRange(K3,0,65535,"Altro::ConfigTailCancellationFilter","K3");
00126
00127 fTCFL1Int = inRange(L1,0,65535,"Altro::ConfigTailCancellationFilter","L1");
00128 fTCFL2Int = inRange(L2,0,65535,"Altro::ConfigTailCancellationFilter","L2");
00129 fTCFL3Int = inRange(L3,0,65535,"Altro::ConfigTailCancellationFilter","L3");
00130 fConfiguredTCF = 1;
00131 }
00132
00145 void Altro::ConfigBaselineCorrection_2(int HighThreshold, int LowThreshold, int Offset, int Presamples, int Postsamples){
00146 fBSL2HighThreshold = inRange(HighThreshold,0,1023,"Altro::ConfigBaselineCorrection_2","HighThreshold");
00147 fBSL2LowThreshold = inRange(LowThreshold,0,1023,"Altro::ConfigBaselineCorrection_2","LowThreshold");
00148 fBSL2Offset = inRange(Offset,0,1023,"Altro::ConfigBaselineCorrection_2","Offset");
00149 fBSL2Presamples = inRange(Presamples,0,3,"Altro::ConfigBaselineCorrection_2","Presamples");
00150 fBSL2Postsamples = inRange(Postsamples,0,15,"Altro::ConfigBaselineCorrection_2","Postsamples");
00151 fConfiguredBSL2 = 1;
00152 }
00153
00165 void Altro::ConfigZerosuppression(int Threshold, int MinSamplesaboveThreshold, int Presamples, int Postsamples){
00166 fZSUThreshold = inRange(Threshold,0,1023,"Altro::BaselineCorrection_1","Threshold");
00167 fZSUMinSamplesaboveThreshold = inRange(MinSamplesaboveThreshold,1,3,"Altro::BaselineCorrection_1","MinSamplesaboveThreshold");
00168 fZSUPresamples = inRange(Presamples,0,3,"Altro::BaselineCorrection_1","Presamples");
00169 fZSUPostsamples = inRange(Postsamples,0,7,"Altro::BaselineCorrection_1","Postsamples");
00170 ADCkeep = (short *)calloc(sizeof(short),ftimebins);
00171
00172
00173
00174
00175 fConfiguredZSU = 1;
00176 }
00177
00182 void Altro::PrintParameters(){
00183 cout << "+-------------------------------------------+" << endl;
00184 cout << "| Configured Parameters of the Altro Module |" << endl;
00185 cout << "+-------------------------------------------+" << endl << endl;
00186
00187 cout << "Parameters set in the Altro Modules:" << endl << endl;
00188 cout << "ONBaselineCorrection1: " << fOnBSL1 << endl;
00189 cout << "ONTailcancellation : " << fOnTCF << endl;
00190 cout << "ONBaselineCorrection2: " << fOnBSL2 << endl;
00191 cout << "ONClipping : " << fOnClip << endl;
00192 cout << "ONZerosuppression : " << fOnZSU << endl << endl << endl;
00193 if(fConfiguredBSL1 == 1){
00194 cout << "Parameters set in the BSL1 (Baseline Correction 1) Module:" << endl << endl;
00195 cout << "mode : " << fBSL1mode << endl;
00196 cout << "ValuePeDestal : " << fBSL1ValuePeDestal << endl;
00197 cout << "polarity : " << fBSL1ValuePeDestal << endl << endl << endl;
00198 }else{
00199 cout << "BSL1 (Baseline Correction 1) Module not configured!" << endl << endl << endl;
00200 }
00201 if(fConfiguredTCF == 1){
00202 cout << "Parameters set in the TCF (TailCancellation Filter) Module:" << endl << endl;
00203 cout << "K1 (int|float) : " << fTCFK1Int << " | " << fTCFK1Int/(float)((1<<16)-1) << endl;
00204 cout << "K2 (int|float) : " << fTCFK2Int << " | " << fTCFK2Int/(float)((1<<16)-1) << endl;
00205 cout << "K3 (int|float) : " << fTCFK3Int << " | " << fTCFK3Int/(float)((1<<16)-1) << endl;
00206 cout << "L1 (int|float) : " << fTCFL1Int << " | " << fTCFL1Int/(float)((1<<16)-1) << endl;
00207 cout << "L2 (int|float) : " << fTCFL2Int << " | " << fTCFL2Int/(float)((1<<16)-1) << endl;
00208 cout << "L3 (int|float) : " << fTCFL3Int << " | " << fTCFL3Int/(float)((1<<16)-1) << endl << endl << endl;
00209 }else{
00210 cout << "TCF (TailCancellation Filter) Module not configured!" << endl << endl << endl;
00211 }
00212 if(fConfiguredBSL2 == 1){
00213 cout << "Parameters set in the BSL2 (Baseline Correction 2) Module:" << endl << endl;
00214 cout << "HighThreshold : " << fBSL2HighThreshold << endl;
00215 cout << "LowThreshold : " << fBSL2LowThreshold << endl;
00216 cout << "Offset : " << fBSL2Offset << endl;
00217 cout << "Presamples : " << fBSL2Presamples << endl;
00218 cout << "Postsamples : " << fBSL2Postsamples << endl << endl << endl;
00219 }else{
00220 cout << "BSL2 (Baseline Correction 2) Module not configured!" << endl << endl << endl;
00221 }
00222 if(fConfiguredZSU == 1){
00223 cout << "Parameters set in the ZSU (Zero Suppression Unit) Module:" << endl << endl;
00224 cout << "Threshold : " << fZSUThreshold << endl;
00225 cout << "MinSampaboveThreshold: " << fZSUMinSamplesaboveThreshold << endl;
00226 cout << "Presamples : " << fZSUPresamples << endl;
00227 cout << "Postsamples : " << fZSUPostsamples << endl << endl << endl;
00228 }else{
00229 cout << "ZSU (Zero Suppression Unit) Module not configured!" << endl << endl << endl;
00230 }
00231 }
00232
00238 void Altro::RunEmulation(){
00239
00240 if(fConfiguredAltro == 0){
00241 cout << "ERROR cant run Altro Emulation because not configured" << endl;
00242 return;
00243 }
00244 for(int i = 0; i < ftimebins; i++){
00245 ADCkeep[i] = 0;
00246 }
00247
00248
00249 if(fOnBSL1 == 1){
00250 if(fConfiguredBSL1 == 1){
00251 BaselineCorrection_1(fBSL1mode, fBSL1ValuePeDestal, fBSL1PedestalMem, fBSL1polarity);
00252 }else{
00253 cout << "ERROR cant run Baseline Correction 1 because not configured" << endl;
00254 return;
00255 }
00256 }
00257
00258
00259 if(fOnTCF == 1){
00260 if(fConfiguredTCF == 1){
00261 TailCancellationFilter_FixedPoint(fTCFK1Int, fTCFK2Int, fTCFK3Int, fTCFL1Int, fTCFL2Int, fTCFL3Int);
00262 }else{
00263 cout << "ERROR cant run Tail Cancellation Filter because not configured" << endl;
00264 return;
00265 }
00266 }
00267
00268
00269 if(fOnBSL2 == 1){
00270 if(fConfiguredBSL2 == 1){
00271 BaselineCorrection_2_RTL(fBSL2HighThreshold, fBSL2LowThreshold, fBSL2Offset, fBSL2Presamples, fBSL2Postsamples);
00272 }else{
00273 cout << "ERROR cant run Baseline Correction 2 because not configured" << endl;
00274 return;
00275 }
00276 }
00277
00278 if(fOnClip == 1){
00279 Clipping();
00280 }
00281
00282 if(fOnZSU == 1){
00283 if(fConfiguredZSU == 1){
00284 Zerosuppression(fZSUThreshold,fZSUMinSamplesaboveThreshold,fZSUPresamples,fZSUPostsamples);
00285 }else{
00286 cout << "ERROR cant run Zero Suppression Unit because not configured" << endl;
00287 return;
00288 }
00289 }
00290 for(int i = 0; i < ftimebins; i++){
00291 if (! ADCkeep[i]) channelShort[i] = 0;
00292 }
00293 }
00294
00295 void Altro::BaselineCorrection_1(int mode, int ValuePeDestal, int *PedestalMem, int polarity){
00296
00297 int FixedPeDestal = 0;
00298
00299 if(polarity ==1){
00300 for(int i = 0; i < ftimebins; i++){
00301 channelShort[i] = 1023 - channelShort[i];
00302 }
00303 }
00304
00305 switch(mode) {
00306 case DIN_FPD:
00307 for(int i = 0; i < ftimebins; i++)
00308 channelShort[i] = channelShort[i] - FixedPeDestal;
00309 break;
00310 case DIN_FT:
00311 for(int i = 0; i < ftimebins; i++)
00312 channelShort[i] = channelShort[i] - PedestalMem[i];
00313 break;
00314 case DIN_FDIN:
00315 for(int i = 0; i < ftimebins; i++)
00316 channelShort[i] = channelShort[i] - PedestalMem[ channelShort[i] ];
00317 break;
00318 case DIN_FDIN_VPD:
00319 for(int i = 0; i < ftimebins; i++)
00320 channelShort[i] = channelShort[i] - PedestalMem[ channelShort[i] - ValuePeDestal];
00321 break;
00322 case DIN_VPD_FPD:
00323 for(int i = 0; i < ftimebins; i++)
00324 channelShort[i] = channelShort[i] - ValuePeDestal - FixedPeDestal;
00325 break;
00326 case DIN_VPD_FT:
00327 for(int i = 0; i < ftimebins; i++)
00328 channelShort[i] = channelShort[i] - ValuePeDestal - PedestalMem[i];
00329 break;
00330 case DIN_VPD_FDIN:
00331 for(int i = 0; i < ftimebins; i++)
00332 channelShort[i] = channelShort[i] - ValuePeDestal - PedestalMem[ channelShort[i] ];
00333 break;
00334 case DIN_VPD_FDIN_VPD:
00335 for(int i = 0; i < ftimebins; i++)
00336 channelShort[i] = channelShort[i] - ValuePeDestal - PedestalMem[ channelShort[i] - ValuePeDestal ];
00337 break;
00338 case FDIN_FPD:
00339 for(int i = 0; i < ftimebins; i++)
00340 channelShort[i] = PedestalMem[ channelShort[i] ] - FixedPeDestal;
00341 break;
00342 case FDIN_VPD_FPD:
00343 for(int i = 0; i < ftimebins; i++)
00344 channelShort[i] = PedestalMem[ channelShort[i] - ValuePeDestal ] - FixedPeDestal;
00345 break;
00346 case FT_FPD:
00347 for(int i = 0; i < ftimebins; i++)
00348 channelShort[i] = PedestalMem[i] - FixedPeDestal;
00349 break;
00350 }
00351 }
00352
00353 int Altro::multiply36(int P, int N){
00354
00355 long long retval =0;
00356 long long temp = 0;
00357 long long AX = 0;
00358 temp = (long long)P*(long long)N;
00359 AX = (( mask(temp,35,18) + ((long long)(-P)<<18) ) + mask(temp,17,0));
00360 if ( maskandshift(N,17,17) == 1){
00361 retval = ((maskandshift(AX,35,35)<<17) + maskandshift(AX,32,16));
00362 }else{
00363 retval = maskandshift(temp,32,16);
00364 }
00365 return retval;
00366 }
00367 long long Altro::mask(long long in, int left, int right){
00368 long long retval;
00369 long long pattern;
00370 long long length = abs(left - right)+1;
00371 pattern = ((1<<length)-1)<<right;
00372 retval = in&pattern;
00373 return retval;
00374 }
00375
00376 long long Altro::maskandshift(long long in, int left, int right){
00377 long long retval;
00378 long long pattern;
00379 long long length = abs(left - right)+1;
00380 pattern = ((1<<length)-1);
00381 retval = (in>>right)&pattern;
00382 return retval;
00383 }
00384
00385 void Altro::TailCancellationFilter_FixedPoint(int K1, int K2, int K3, int L1, int L2, int L3){
00386 int c1n = 0, c2n = 0, c3n = 0;
00387 int c1o = 0, c2o = 0, c3o = 0;
00388 int d1 = 0, d2 = 0;
00389 int dout = 0;
00390 int din = 0;
00391 int bit = 0;
00392 for(int i = 0; i < ftimebins; i++){
00393 din = channelShort[i];
00394
00395 din = (din<<2);
00396 c1n = mask( (mask(din,17,0) + multiply36(K1,mask(c1o,17,0)) ) ,17,0);
00397 d1 = mask( (mask(c1n,17,0) - multiply36(L1,mask(c1o,17,0)) ) ,17,0);
00398
00399
00400 c2n = mask( (mask(d1 ,17,0) + multiply36(K2,mask(c2o,17,0)) ) ,17,0);
00401 d2 = mask( (mask(c2n,17,0) - multiply36(L2,mask(c2o,17,0)) ) ,17,0);
00402
00403
00404 c3n = mask( (mask(d2 ,17,0) + multiply36(K3,mask(c3o,17,0)) ) ,17,0);
00405 dout = mask( (mask(c3n,17,0) - multiply36(L3,mask(c3o,17,0)) ) ,17,0);
00406
00407
00408 if( (maskandshift(dout,2,2) == 1) || (maskandshift(dout,1,1) == 1)){
00409 bit = 1;
00410 }else{
00411 bit = 0;
00412 }
00413
00414 dout = ((dout>>3)<<1) + bit;
00415 if(maskandshift(dout,15,15) == 1){
00416
00417 dout = -mask((-mask(dout,9,0)),9,0);
00418 }else{
00419 dout = mask(dout,9,0);
00420 }
00421
00422 channelShort[i] = (short) dout;
00423 c1o = c1n;
00424 c2o = c2n;
00425 c3o = c3n;
00426 }
00427 }
00428
00429 void Altro::BaselineCorrection_2_RTL(int HighThreshold, int LowThreshold, int Offset, int Presamples, int Postsamples){
00430
00431
00432
00433 int din;
00434 int dout;
00435 int edges[6];
00436 int offset = Offset;
00437 int thrlo = LowThreshold;
00438 int thrhi = HighThreshold;
00439
00440
00441 int fOld[4];
00442 int fNew[4];
00443 int dOld[4];
00444 int dNew[4];
00445 int dxOld;
00446 int dxNew;
00447 int pstscnt;
00448 int zOld[9];
00449 int zNew[9];
00450 int zxOld;
00451 int zxNew;
00452 int valcntOld;
00453 int valcntNew = 0;
00454
00455 int valid;
00456 int fx;
00457
00458 int s8;
00459 int flag;
00460
00461
00462 int bsl;
00463
00464
00465
00466
00467
00468 for(int i = 0; i < 9 ; i++)
00469 zOld[i] = 0;
00470 for(int i = 0; i < 4 ; i++){
00471 fOld[i] = 0;
00472 dOld[i] = 0;
00473 }
00474 dxOld= 0;
00475 pstscnt = 0;
00476 zxOld = 0;
00477 valcntOld = 0;
00478 valid = 0;
00479 for(int i = 0; i < 2 ; i++){
00480 edges[i] = (Presamples&(1<<i))>>i;
00481 }
00482 for(int i = 0; i < 4 ; i++){
00483 edges[(3-i)+2] = (Postsamples&(1<<i))>>i;
00484 }
00485
00486
00487
00488
00489
00490
00491
00492 for(int timebin = -12; timebin < ftimebins+10; timebin++){
00493
00494 din = getElement(channelShort,timebin);
00495
00496 s8 = zxOld + (zOld[8] - zOld[0]);
00497
00498 if(valid == 1)
00499 bsl = s8>>3;
00500 else
00501 bsl = 0;
00502
00503
00504 if( (din <= (bsl + thrhi)) && (din >= (bsl - thrlo)) )
00505 flag = 0;
00506 else
00507 flag = 1;
00508
00509 if(pstscnt == 0)
00510 fx = 0;
00511 else
00512 fx = 1;
00513
00514 if(valcntOld >= 12)
00515 valid = 1;
00516 else
00517 valid = 0;
00518
00519 fNew[3] = flag;
00520
00521 if( (fOld[3] == 1) || ( (flag == 1) && ( (edges[0] == 1) || (edges[1] == 1) ) ) )
00522 fNew[2] = 1;
00523 else
00524 fNew[2] = 0;
00525
00526 if( (fOld[2] == 1) || ( (edges[1] == 1) && (flag == 1) ) )
00527 fNew[1] = 1;
00528 else
00529 fNew[1] = 0;
00530
00531 if( ( (fOld[1] == 1) || ( (flag == 1) && (edges[0] == 1) && (edges[1] == 1) ) || (fx==1) ) && (valid==1) )
00532 fNew[0] = 1;
00533 else
00534 fNew[0] = 0;
00535
00536 dxNew = dOld[0];
00537 for(int i = 0; i < 3; i++)
00538 dNew[i] = dOld[i+1];
00539 dNew[3] = din;
00540
00541 if( (fOld[1]==1) && (fOld[2]==0) )
00542 pstscnt = Postsamples;
00543 else if(fx == 1)
00544 pstscnt--;
00545
00546 if(fOld[0] == 0){
00547 if(valid == 0)
00548 valcntNew = ++valcntOld;
00549
00550 zxNew = s8;
00551 for(int i = 0; i < 8; i++)
00552 zNew[i] = zOld[i+1];
00553 zNew[8] = dOld[0];
00554 }else{
00555 zxNew = zxOld;
00556 for(int i = 0; i < 9; i++)
00557 zNew[i] = zOld[i];
00558 }
00559 dout = dxOld - (bsl - offset);
00560
00561
00562
00563 setElement(channelShort,timebin-5,(short)dout);
00564
00565 for(int i = 0; i < 9 ; i++)
00566 zOld[i] = zNew[i];
00567 zxOld = zxNew;
00568 for(int i = 0; i < 4 ; i++){
00569 fOld[i] = fNew[i];
00570 dOld[i] = dNew[i];
00571 }
00572 dxOld = dxNew;
00573 valcntOld = valcntNew;
00574 }
00575 }
00576
00577 void Altro::Clipping(){
00578 for(int i = 0; i < ftimebins; i++){
00579 if(channelShort[i] < 0)
00580 channelShort[i] = 0;
00581 }
00582 }
00583
00584 void Altro::Zerosuppression(int Threshold, int MinSamplesaboveThreshold, int Presamples, int Postsamples){
00585
00586
00587
00588 for(int i = 0; i < ftimebins; i++){
00589 if(channelShort[i] >= Threshold){
00590 ADCkeep[i] = 1;
00591 }
00592 }
00593
00594 int startofclustersequence = -1;
00595 int endofClustersInSequence = -1;
00596
00597 for(int i = 0; i < ftimebins; i++){
00598 if( (ADCkeep[i] == 1) && (getElement(ADCkeep,i-1) == 0) ){
00599 startofclustersequence = i;
00600 }
00601 if( (ADCkeep[i] == 1) && (getElement(ADCkeep,i+1) == 0) ){
00602 endofClustersInSequence = i;
00603 }
00604
00605 if( (startofclustersequence != -1) && (endofClustersInSequence != -1) ){
00606
00607 if ( (endofClustersInSequence - startofclustersequence + 1) < MinSamplesaboveThreshold ){
00608 for(int j = startofclustersequence; j <= endofClustersInSequence ; j++){
00609 ADCkeep[j] = 0;
00610 }
00611 }
00612 startofclustersequence = -1;
00613 endofClustersInSequence = -1;
00614 }
00615
00616 }
00617
00618
00619
00620
00621
00622
00623
00624 for(int i = 0; i < ftimebins; i++){
00625 if( (ADCkeep[i] == 1) && (getElement(ADCkeep,i-1) == 0) ){
00626 for(int j = i-Presamples ; j <= i; j++){
00627 setElement(ADCkeep,j,1);
00628 }
00629 }
00630 }
00631 for(int i = ftimebins-1; i >= 0; i--){
00632 if( (ADCkeep[i] == 1) && (getElement(ADCkeep,i+1) == 0) ){
00633 for(int j = i ; j <= i+Postsamples; j++){
00634 setElement(ADCkeep,j,1);
00635 }
00636 }
00637 }
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648 for(int i = 0; i < ftimebins; i++){
00649 if( (ADCkeep[i] == 1) && (getElement(ADCkeep,i+1) == 0) && ( (getElement(ADCkeep,i+3) == 1) || (getElement(ADCkeep,i+2) == 1) ) ){
00650 setElement(ADCkeep,i+1,1);
00651 setElement(ADCkeep,i+2,1);
00652 }
00653 }
00654 }
00655
00662 float Altro::calculatecompression(){
00663
00664 int sample = 0;
00665 int cluster = 0;
00666 int data = 0;
00667 float retval = 0.0;
00668
00669 for(int i = 0; i < ftimebins; i++){
00670 if(ADCkeep[i] == 1){
00671 sample++;
00672 }
00673 if( (ADCkeep[i] == 1) && (getElement(ADCkeep,i+1) == 0) ){
00674 cluster++;
00675 }
00676 }
00677 data = sample + cluster*2;
00678 data = data + data%4 + 4;
00679 if(data >0){
00680 retval = ftimebins / (float)data;
00681 }else{
00682 retval = 1.0;
00683 }
00684 return retval;
00685 }
00686
00687 short Altro::getElement(short* Array,int index){
00688 if (index < 0)
00689 return 0;
00690 else if(index >= ftimebins)
00691 return 0;
00692 else
00693 return Array[index];
00694 }
00695
00696 void Altro::setElement(short* Array,int index,short value){
00697 if (index < 0)
00698 return;
00699 else if(index >= ftimebins)
00700 return;
00701 else
00702 Array[index] = value;
00703 }
00704
00705 int Altro::inBand(int ADC,int bsl, int LowThreshold, int HighThreshold){
00706 int fLow = bsl - LowThreshold;
00707 int fHigh = bsl + HighThreshold;
00708 if( (ADC <= fHigh) && (ADC >= fLow) )
00709 return 1;
00710 else
00711 return 0;
00712 }
00713
00714 int Altro::inRange(int parameter,int Low,int High,const char *Module,const char *ParameterName){
00715 char out[255];
00716 int retval;
00717 if(parameter > High){
00718 sprintf(out,"Error | %s | Parameter %s is to big, has to be %d <= %s <= %d, is %d, now set to %d",Module,ParameterName,Low,ParameterName,High,parameter,High);
00719 cout << out << endl;
00720 retval = High;
00721 }else if(parameter < Low){
00722 sprintf(out,"Error | %s | Parameter %s is to small, has to be %d <= %s <= %d, is %d, now set to %d",Module,ParameterName,Low,ParameterName,High,parameter,Low);
00723 cout << out << endl;
00724 retval = Low;
00725 }else{
00726 retval = parameter;
00727 }
00728 return retval;
00729 }
00730
00731 short Altro::GetShortChannel(int i){
00732 return getElement(channelShort,i);
00733 }
00734
00735 short Altro::GetKeepChannel(int i){
00736 return getElement(ADCkeep,i);
00737 }