Changeset 5667 for trunk/MagicSoft/Mars/mfbase
- Timestamp:
- 12/22/04 11:24:46 (20 years ago)
- Location:
- trunk/MagicSoft/Mars/mfbase
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MagicSoft/Mars/mfbase/MFEventSelector2.cc
r5448 r5667 19 19 ! Author(s): Wolfgang Wittek 11/2003 <mailto:wittek@mppmu.mpg.de> 20 20 ! 21 ! Copyright: MAGIC Software Development, 2000-200 321 ! Copyright: MAGIC Software Development, 2000-2005 22 22 ! 23 23 ! … … 29 29 // 30 30 // This is a filter to make a selection of events from a file, according to 31 // a certain predetermined distribution in a given parameter (or combination31 // a certain requested distribution in a given parameter (or combination 32 32 // of parameters). The distribution is passed to the class through a histogram 33 33 // of the relevant parameter(s) contained in an object of type MH3. The filter … … 38 38 // values of the parameters, and is dictated by the input histogram). 39 39 // 40 // This procedure requires the determination of the original distribution 41 // of the given parameters for the total sample of events on the input file. 42 // If the event loop contains a filter with name "FilterSelector2", this 43 // filter will be applied when determining the original distribution. 44 // 40 45 // See Constructor for more instructions and also the example below: 41 46 // … … 111 116 #include "MH3.h" // MH3 112 117 #include "MRead.h" // MRead 118 //#include "MProgressBar.h" // 113 119 #include "MEvtLoop.h" // MEvtLoop 114 120 #include "MTaskList.h" // MTaskList 115 121 #include "MBinning.h" // MBinning 122 #include "MContinue.h" // 116 123 #include "MFillH.h" // MFillH 117 124 #include "MParList.h" // MParList … … 148 155 // note that also in this case a dummy nominal distribution has to be 149 156 // provided in the first argument (the dummy distribution defines the 150 // variable(s) of interest and the binnings) 157 // variable(s) of interest, their binnings and their requested ranges; 158 // events outside these ranges won't be accepted). 151 159 // 152 160 MFEventSelector2::MFEventSelector2(MH3 &hist, const char *name, const char *title) 153 161 : fHistOrig(NULL), fHistNom(&hist), fHistRes(NULL), 154 162 fDataX(hist.GetRule('x')), fDataY(hist.GetRule('y')), 155 fDataZ(hist.GetRule('z')), fNumMax(-1), fHistIsProbability(kFALSE) 163 fDataZ(hist.GetRule('z')), fNumMax(-1), fHistIsProbability(kFALSE), 164 fUseOrigDist(kTRUE) 156 165 { 157 166 fName = name ? (TString)name : gsDefName; 158 167 fTitle = title ? (TString)title : gsDefTitle; 168 169 // name of filter to be applied when determining the original distribution 170 // for all data on the input file 171 fFilterName = "FilterSelector2"; 159 172 } 160 173 … … 195 208 // Reading task of the present loop is used in a new eventloop. 196 209 // 197 Bool_t MFEventSelector2::ReadDistribution(MRead &read )210 Bool_t MFEventSelector2::ReadDistribution(MRead &read, MFilter *filter) 198 211 { 199 212 if (read.GetEntries() > kMaxUInt) // FIXME: LONG_MAX ??? … … 205 218 *fLog << inf << underline << endl; 206 219 *fLog << "MFEventSelector2::ReadDistribution:" << endl; 207 *fLog << " - Start of eventloop to generate the original distribution..." << endl; 208 209 MEvtLoop run(GetName()); 220 *fLog << "**********************" << endl; 221 *fLog << " - Start of eventloop to generate the original distribution..." 222 << endl; 223 224 if (filter != NULL) 225 { 226 *fLog << " filter used : " << filter->GetName() 227 << endl; 228 } 229 230 231 MEvtLoop run("ReadDistribution"); 232 //MProgressBar bar; 233 //run.SetProgressBar(&bar); 234 210 235 MParList plist; 211 236 MTaskList tlist; … … 224 249 225 250 MFillH fill(fHistOrig); 251 fill.SetName("FillHistOrig"); 226 252 fill.SetBit(MFillH::kDoNotDisplay); 227 253 tlist.AddToList(&read); 254 255 MContinue contfilter(filter); 256 if (filter != NULL) 257 { 258 contfilter.SetName("ContFilter"); 259 tlist.AddToList(&contfilter); 260 } 261 228 262 tlist.AddToList(&fill); 229 263 run.SetDisplay(fDisplay); 230 264 if (!run.Eventloop()) 231 265 { 232 *fLog << err << dbginf << "Evtloop in MFEventSelector2::ReadDistribution failed." << endl; 266 *fLog << err << dbginf 267 << "Evtloop in MFEventSelector2::ReadDistribution failed." 268 << endl; 233 269 return kFALSE; 234 270 } 235 271 236 tlist.PrintStatistics( );272 tlist.PrintStatistics(0, kTRUE); 237 273 238 274 *fLog << inf; 239 275 *fLog << "MFEventSelector2::ReadDistribution:" << endl; 240 *fLog << " - Original distribution has " << fHistOrig->GetHist().GetEntries() << " entries." << endl; 241 *fLog << " - End of eventloop to generate the original distribution." << endl; 276 *fLog << " - Original distribution has " 277 << fHistOrig->GetHist().GetEntries() << " entries." << endl; 278 *fLog << " - End of eventloop to generate the original distribution." 279 << endl; 280 *fLog << "**********************" << endl; 242 281 243 282 return read.Rewind(); … … 258 297 // set the nominal distribution equal to the original distribution 259 298 260 const Bool_t useorigdist = fHistNom->GetHist().GetEntries()==0; 261 TH1 *hnp = useorigdist ? (TH1*)(fHistOrig->GetHist()).Clone() : &fHistNom->GetHist(); 299 const Bool_t fUseOrigDist = fHistNom->GetHist().GetEntries()==0; 300 TH1 *hnp = fUseOrigDist ? (TH1*)(fHistOrig->GetHist()).Clone() : 301 &fHistNom->GetHist(); 262 302 263 303 TH1 &hn = *hnp; … … 327 367 } 328 368 329 if ( useorigdist)369 if (fUseOrigDist) 330 370 delete hnp; 331 371 } … … 370 410 // 3) Initialize the histogram for the resulting distribution 371 411 // 4) Prepare the random selection 372 // 5) Repreprocess the reading task.412 // 5) Repreprocess the reading and filter task. 373 413 // 374 414 Int_t MFEventSelector2::PreProcess(MParList *parlist) … … 386 426 return kFALSE; 387 427 388 fHistNom->SetTitle(fHistIsProbability ? "ProbabilityDistribution" : "Users Nominal Distribution"); 428 fHistNom->SetTitle(fHistIsProbability ? "ProbabilityDistribution" : 429 "Users Nominal Distribution"); 389 430 390 431 if (fHistIsProbability) … … 410 451 } 411 452 412 if (!ReadDistribution(*read)) 453 MFilter *filter = (MFilter*)tasklist->FindObject(fFilterName); 454 if (!filter) 455 { 456 *fLog << inf 457 << "No filter will be used when making the original distribution" 458 << endl; 459 filter = NULL; 460 } 461 462 463 if (!ReadDistribution(*read, filter)) 413 464 return kFALSE; 465 414 466 415 467 // Prepare histograms and arrays for selection 416 468 PrepareHistograms(); 417 469 418 return read->CallPreProcess(parlist); 470 *fLog << "MFEventSelector2::PreProcess; call PreProcess() for read and filter object again" 471 << endl; 472 Int_t rcr = read->CallPreProcess(parlist); 473 Int_t rcf = filter->CallPreProcess(parlist); 474 475 *fLog << "rcr, rcf = " << rcr << ", " << rcf << endl; 476 477 return rcf*rcr; 419 478 } 420 479 … … 426 485 Bool_t MFEventSelector2::Select(Int_t bin) 427 486 { 428 // under- and overflow bins are not counted487 // under- and overflow bins are not accepted 429 488 if (bin<0) 430 489 return kFALSE; … … 450 509 } 451 510 511 // -------------------------------------------------------------------------- 512 // 452 513 Bool_t MFEventSelector2::SelectProb(Int_t ibin) const 453 514 { … … 455 516 // If value is outside histogram range, accept event 456 517 // 457 return ibin<0 ? kTRUE : fHistNom->GetHist().GetBinContent(ibin) > gRandom->Uniform(); 518 return ibin<0 ? kTRUE : 519 fHistNom->GetHist().GetBinContent(ibin) > gRandom->Uniform(); 458 520 } 459 521 … … 473 535 const Double_t valz=fDataZ.GetValue(); 474 536 537 // don't except the event if it is outside the axis range 538 // of the requested distribution 475 539 const Int_t ibin = fHistNom->FindFixBin(valx, valy, valz)-1; 476 477 // Get corresponding bin number and check 478 // whether a selection should be made 540 if (!fHistIsProbability) 541 { 542 if (ibin < 0) 543 { 544 fResult = kFALSE; 545 fCounter[1] += 1; 546 return kTRUE; 547 } 548 } 549 550 // check whether a selection should be made 479 551 fResult = fHistIsProbability ? SelectProb(ibin) : Select(ibin); 480 481 fCounter[fResult ? 1 : 0]++; 552 if (!fResult) 553 { 554 fCounter[2] += 1; 555 return kTRUE; 556 } 557 558 fCounter[0] += 1; 482 559 483 560 return kTRUE; … … 497 574 *fLog << GetDescriptor() << " execution statistics:" << endl; 498 575 *fLog << dec << setfill(' '); 576 499 577 *fLog << " " << setw(7) << fCounter[1] << " (" << setw(3) 500 << (int)(fCounter[0]*100/GetNumExecutions()) 501 << "%) Events not selected" << endl; 578 << (int)((Float_t)(fCounter[1]*100)/(Float_t)(GetNumExecutions())+0.5) 579 << "%) Events not selected due to under/over flow" << endl; 580 581 *fLog << " " << setw(7) << fCounter[2] << " (" << setw(3) 582 << (int)((Float_t)(fCounter[2]*100)/(Float_t)(GetNumExecutions())+0.5) 583 << "%) Events not selected due to requested distribution" 584 << endl; 502 585 503 586 *fLog << " " << fCounter[0] << " (" 504 << (int)( fCounter[1]*100/GetNumExecutions())587 << (int)((Float_t)(fCounter[0]*100)/(Float_t)(GetNumExecutions())+0.5) 505 588 << "%) Events selected" << endl; 506 589 *fLog << endl; … … 519 602 return kTRUE; 520 603 } 604 605 606 607 608 609 -
trunk/MagicSoft/Mars/mfbase/MFEventSelector2.h
r5448 r5667 41 41 TCanvas *fCanvas; //! canvas for online display 42 42 43 TString fFilterName; // name of the MFilter object to be used 44 // when determining the original distribution 45 43 46 Bool_t fResult; 44 47 Bool_t fHistIsProbability; 45 Int_t fCounter[2]; 48 Bool_t fUseOrigDist; // flag indicating that in the selection the 49 // original distribution is not changed 50 51 Int_t fCounter[3]; 46 52 47 53 TH1 &InitHistogram(MH3* &hist); 48 Bool_t ReadDistribution(MRead &read );54 Bool_t ReadDistribution(MRead &read, MFilter *filter); 49 55 void PrepareHistograms(); 50 56 Bool_t PreProcessData(MParList *parlist);
Note:
See TracChangeset
for help on using the changeset viewer.