Changeset 12429 for trunk/FACT++
- Timestamp:
- 11/06/11 18:10:22 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/FACT++/src/ratecontrol.cc
r12401 r12429 39 39 kStateConnecting, 40 40 kStateConnected, 41 42 kStateWaitingForReference, 43 kStateSettingGlobalThreshold, 44 kStateGlobalThresholdSet, 45 41 46 kStateInProgress, 42 47 }; … … 55 60 // DimDescribedService fDimProc; 56 61 62 float fTargetRate; 63 float fTriggerRate; 64 65 uint16_t fThresholdMin; 66 57 67 bool fTriggerOn; 68 bool fVerbose; 69 bool fEnabled; 58 70 59 71 pair<Time, int> GetNewState(DimStampedInfo &info) const … … 93 105 return; 94 106 107 Out() << "Min. DAC=" << fThresholdMin << endl; 108 95 109 int t=0; 96 110 for (t=0; t<160; t++) … … 106 120 { 107 121 for (int i=0; i<4; i++) 108 if (fThresholds[i+k*4+j*16]!= 300)122 if (fThresholds[i+k*4+j*16]!=fThresholdMin) 109 123 Out() << setw(3) << fThresholds[i+k*4+j*16] << " "; 110 124 else … … 120 134 { 121 135 uint16_t diff = fThresholds[idx]+int16_t(truncf(step)); 122 if (diff< 300)123 diff= 300;136 if (diff<fThresholdMin) 137 diff=fThresholdMin; 124 138 125 139 if (diff==fThresholds[idx]) 126 140 return; 127 141 128 if ( 1/*fVerbose*/)142 if (fVerbose) 129 143 { 130 144 Out() << idx/40 << "|" << (idx/4)%10 << "|" << idx%4; … … 137 151 } 138 152 153 void ProcessPatches(const FTM::DimTriggerRates &sdata) 154 { 155 156 // Caluclate Median and deviation 157 vector<float> medb(sdata.fBoardRate, sdata.fBoardRate+40); 158 vector<float> medp(sdata.fPatchRate, sdata.fPatchRate+160); 159 160 sort(medb.begin(), medb.end()); 161 sort(medp.begin(), medp.end()); 162 163 vector<float> devb(40); 164 for (int i=0; i<40; i++) 165 devb[i] = fabs(sdata.fBoardRate[i]-medb[i]); 166 167 vector<float> devp(160); 168 for (int i=0; i<160; i++) 169 devp[i] = fabs(sdata.fPatchRate[i]-medp[i]); 170 171 sort(devb.begin(), devb.end()); 172 sort(devp.begin(), devp.end()); 173 174 double mb = (medb[19]+medb[20])/2; 175 double mp = (medp[79]+medp[80])/2; 176 177 double db = devb[27]; 178 double dp = devp[109]; 179 180 // If any is zero there is something wrong 181 if (mb==0 || mp==0 || db==0 || dp==0) 182 return; 183 184 if (fVerbose) 185 { 186 Out() << "Patch: Median=" << mp << " Dev=" << dp << endl; 187 Out() << "Board: Median=" << mb << " Dev=" << db << endl; 188 } 189 190 for (int i=0; i<40; i++) 191 { 192 int maxi = -1; 193 194 const float dif = fabs(sdata.fBoardRate[i]-mb)/db; 195 if (dif>5) 196 { 197 if (fVerbose) 198 Out() << "B" << i << ": " << dif << endl; 199 200 float max = sdata.fPatchRate[i*4]; 201 maxi = 0; 202 203 for (int j=1; j<4; j++) 204 if (sdata.fPatchRate[i*4+j]>max) 205 { 206 max = sdata.fPatchRate[i*4+j]; 207 maxi = j; 208 } 209 } 210 211 for (int j=0; j<4; j++) 212 { 213 // For the noise pixel correct down to median+3*deviation 214 if (maxi==j) 215 { 216 const float step = (log10(sdata.fPatchRate[i*4+j])-log10(mp+5*dp))/0.039; 217 // * (dif-5)/dif 218 Step(i*4+j, step); 219 continue; 220 } 221 222 // For pixels below the meadian correct also back to median+3*deviation 223 if (sdata.fPatchRate[i*4+j]<mp) 224 { 225 const float step = (log10(sdata.fPatchRate[i*4+j])-log10(mp+3*dp))/0.039; 226 Step(i*4+j, step); 227 continue; 228 } 229 230 const float step = -1.5*(log10(mp+dp)-log10(mp))/0.039; 231 Step(i*4+j, step); 232 } 233 } 234 } 235 236 void ProcessCamera(const FTM::DimTriggerRates &sdata) 237 { 238 // Caluclate Median and deviation 239 vector<float> medb(sdata.fBoardRate, sdata.fBoardRate+40); 240 241 sort(medb.begin(), medb.end()); 242 243 vector<float> devb(40); 244 for (int i=0; i<40; i++) 245 devb[i] = fabs(sdata.fBoardRate[i]-medb[i]); 246 247 sort(devb.begin(), devb.end()); 248 249 double mb = (medb[19]+medb[20])/2; 250 double db = devb[27]; 251 252 // If any is zero there is something wrong 253 if (mb==0 || db==0) 254 return; 255 256 double avg = 0; 257 int num = 0; 258 259 for (int i=0; i<40; i++) 260 { 261 if ( fabs(sdata.fBoardRate[i]-mb)<5*db) 262 { 263 avg += sdata.fBoardRate[i]; 264 num++; 265 } 266 } 267 268 fTriggerRate = avg / num * 40; 269 270 if (fVerbose) 271 { 272 Out() << "Board: Median=" << mb << " Dev=" << db << endl; 273 Out() << "Camera: " << fTriggerRate << " (" << sdata.fTriggerRate << ", n=" << num << ")" << endl; 274 } 275 276 // ---------------------- 277 278 279 if (fTriggerRate<fTargetRate) 280 return; 281 282 // Is this a step to 70Hz? 283 const float step = (log10(fTriggerRate)-log10(fTargetRate))/0.039; 284 285 const uint16_t diff = fThresholds[0]+int16_t(truncf(step)); 286 287 if (diff==fThresholds[0]) 288 return; 289 290 if (fVerbose) 291 { 292 //Out() << idx/40 << "|" << (idx/4)%10 << "|" << idx%4; 293 Out() << fThresholds[0]; 294 Out() << (step>0 ? " += " : " -= "); 295 Out() << step << " (" << diff << ")" << endl; 296 } 297 298 const uint32_t val[2] = { -1, diff }; 299 DimClient::sendCommandNB("FTM_CONTROL/SET_THRESHOLD", (void*)val, 8); 300 } 301 139 302 void infoHandler() 140 303 { … … 187 350 const FTM::DimTriggerRates &sdata = *static_cast<FTM::DimTriggerRates*>(curr->getData()); 188 351 189 // Caluclate Median and deviation 190 vector<float> medb(sdata.fBoardRate, sdata.fBoardRate+40); 191 vector<float> medp(sdata.fPatchRate, sdata.fPatchRate+160); 192 193 sort(medb.begin(), medb.end()); 194 sort(medp.begin(), medp.end()); 195 196 vector<float> devb(40); 197 for (int i=0; i<40; i++) 198 devb[i] = fabs(sdata.fBoardRate[i]-medb[i]); 199 200 vector<float> devp(160); 201 for (int i=0; i<160; i++) 202 devp[i] = fabs(sdata.fPatchRate[i]-medp[i]); 203 204 sort(devb.begin(), devb.end()); 205 sort(devp.begin(), devp.end()); 206 207 double mb = (medb[19]+medb[20])/2; 208 double mp = (medp[79]+medp[80])/2; 209 210 double db = devb[27]; 211 double dp = devp[109]; 212 213 // If any is zero there is something wrong 214 if (mb==0 || mp==0 || db==0 || dp==0) 215 return; 216 217 if (1/*fVerbose*/) 218 { 219 Out() << "Patch: Median=" << mp << " Dev=" << dp << endl; 220 Out() << "Board: Median=" << mb << " Dev=" << db << endl; 221 } 222 223 for (int i=0; i<40; i++) 224 { 225 int maxi = -1; 226 227 const float dif = fabs(sdata.fBoardRate[i]-mb)/db; 228 if (dif>5) 229 { 230 if (1/*fVerbose*/) 231 Out() << "B" << i << ": " << dif << endl; 232 233 float max = sdata.fPatchRate[i*4]; 234 maxi = 0; 235 236 for (int j=1; j<4; j++) 237 if (sdata.fPatchRate[i*4+j]>max) 238 { 239 max = sdata.fPatchRate[i*4+j]; 240 maxi = j; 241 } 242 } 243 244 for (int j=0; j<4; j++) 245 { 246 // For the noise pixel correct down to median+3*deviation 247 if (maxi==j) 248 { 249 const float step = (log10(sdata.fPatchRate[i*4+j])-log10(mp+5*dp))/0.039; 250 // * (dif-5)/dif 251 Step(i*4+j, step); 252 continue; 253 } 254 255 // For pixels below the meadian correct also back to median+3*deviation 256 if (sdata.fPatchRate[i*4+j]<mp) 257 { 258 const float step = (log10(sdata.fPatchRate[i*4+j])-log10(mp+3*dp))/0.039; 259 Step(i*4+j, step); 260 continue; 261 } 262 263 const float step = -1.5*(log10(mp+dp)-log10(mp))/0.039; 264 Step(i*4+j, step); 265 } 266 } 267 } 352 if (GetCurrentState()==kStateSettingGlobalThreshold) 353 ProcessCamera(sdata); 354 355 if (GetCurrentState()==kStateInProgress) 356 ProcessPatches(sdata); 357 } 358 } 359 360 int StartDataTaking() 361 { 362 if (!fEnabled) 363 return kStateGlobalThresholdSet; 364 365 fThresholds.resize(0); 366 367 const int32_t val[2] = { -1, fThresholdMin }; 368 Dim::SendCommand("FTM_CONTROL/SET_THRESHOLD", val); 369 370 return kStateWaitingForReference; 371 } 372 373 int SetEnabled(const EventImp &evt) 374 { 375 if (!CheckEventSize(evt.GetSize(), "SetEnabled", 1)) 376 return kSM_FatalError; 377 378 fEnabled = evt.GetBool(); 379 380 return GetCurrentState(); 381 } 382 383 int SetMinThreshold(const EventImp &evt) 384 { 385 if (!CheckEventSize(evt.GetSize(), "SetMinThreshold", 4)) 386 return kSM_FatalError; 387 388 // FIXME: Check missing 389 390 fThresholdMin = evt.GetUShort(); 391 392 return GetCurrentState(); 393 } 394 395 int SetTargetRate(const EventImp &evt) 396 { 397 if (!CheckEventSize(evt.GetSize(), "SetTargetRate", 4)) 398 return kSM_FatalError; 399 400 fTargetRate = evt.GetFloat(); 401 402 return GetCurrentState(); 268 403 } 269 404 … … 292 427 } 293 428 429 int SetVerbosity(const EventImp &evt) 430 { 431 if (!CheckEventSize(evt.GetSize(), "SetVerbosity", 1)) 432 return kSM_FatalError; 433 434 fVerbose = evt.GetBool(); 435 436 return GetCurrentState(); 437 } 438 294 439 int Execute() 295 440 { … … 307 452 if (fStatusFTM.second<FTM::kConnected) 308 453 return kStateDisconnected; 454 455 if (GetCurrentState()==kStateWaitingForReference) 456 { 457 if (fThresholds.size()==0) 458 return kStateWaitingForReference; 459 460 return kStateSettingGlobalThreshold; 461 } 462 463 if (GetCurrentState()==kStateSettingGlobalThreshold) 464 { 465 if (fTriggerRate>fTargetRate) 466 return kStateSettingGlobalThreshold; 467 468 return kStateGlobalThresholdSet; 469 } 470 471 if (GetCurrentState()==kStateGlobalThresholdSet) 472 { 473 // FIXME: What if it changes? 474 return kStateGlobalThresholdSet; 475 } 309 476 310 477 // At least one subsystem is not connected … … 353 520 // ("Stop a ratescan in progress"); 354 521 522 AddEvent("START_DATA_TAKING") 523 (bind(&StateMachineRateControl::StartDataTaking, this)) 524 (""); 525 526 AddEvent("ENABLE_RATE_CONTROL", "B:1") 527 (bind(&StateMachineRateControl::SetEnabled, this, placeholders::_1)) 528 (""); 529 530 AddEvent("SET_MIN_THRESHOLD", "I:1") 531 (bind(&StateMachineRateControl::SetMinThreshold, this, placeholders::_1)) 532 (""); 533 534 AddEvent("SET_TARGET_RATE", "F:1") 535 (bind(&StateMachineRateControl::SetTargetRate, this, placeholders::_1)) 536 (""); 537 355 538 AddEvent("PRINT") 356 539 (bind(&StateMachineRateControl::Print, this)) 357 540 (""); 541 542 AddEvent("SET_VERBOSE", "B") 543 (bind(&StateMachineRateControl::SetVerbosity, this, placeholders::_1)) 544 ("set verbosity state" 545 "|verbosity[bool]:disable or enable verbosity for received data (yes/no), except dynamic data"); 546 358 547 } 359 548 360 549 int EvalOptions(Configuration &conf) 361 550 { 362 /* 363 fSecondsMax = conf.Get<uint16_t>("max-wait"); 364 fResolution = conf.Get<double>("resolution"); 365 */ 551 fVerbose = !conf.Get<bool>("quiet"); 366 552 return -1; 367 553 } … … 380 566 void SetupConfiguration(Configuration &conf) 381 567 { 382 /*383 568 po::options_description control("Rate scan options"); 384 569 control.add_options() 385 ("max-wait", var<uint16_t>(150), "The maximum number of seconds to wait to get the anticipated resolution for a point.") 386 ("resolution", var<double>(0.05) , "The minimum resolution required for a single data point.") 570 ("quiet,q", po_bool(), "Disable printing more informations during rate control.") 571 //("max-wait", var<uint16_t>(150), "The maximum number of seconds to wait to get the anticipated resolution for a point.") 572 // ("resolution", var<double>(0.05) , "The minimum resolution required for a single data point.") 387 573 ; 388 574 389 conf.AddOptions(control); */575 conf.AddOptions(control); 390 576 } 391 577
Note:
See TracChangeset
for help on using the changeset viewer.