16 void TMVA::QuickMVAProbEstimator::AddEvent(Double_t val, Double_t weight, Int_t type){
18 ev.eventValue=val; ev.eventWeight=weight; ev.eventType=type;
20 fEvtVector.push_back(ev);
21 if (fIsSorted) fIsSorted=
false;
26 Double_t TMVA::QuickMVAProbEstimator::GetMVAProbAt(Double_t value){
33 std::sort(fEvtVector.begin(),fEvtVector.end(),TMVA::QuickMVAProbEstimator::compare), fIsSorted=
true;
36 Double_t percentage = 0.1;
37 UInt_t nRange = TMath::Max(fNMin,(UInt_t) (fEvtVector.size() * percentage));
38 nRange = TMath::Min(fNMax,nRange);
40 if (nRange > fEvtVector.size()) {
41 nRange = fEvtVector.size()/3.;
42 Log() << kWARNING <<
" !! you have only " << fEvtVector.size() <<
" of events.. . I choose "
43 << nRange <<
" for the quick and dirty kNN MVAProb estimate" << Endl;
46 EventInfo tmp; tmp.eventValue=value;
47 std::vector<EventInfo>::iterator it = std::upper_bound(fEvtVector.begin(),fEvtVector.end(),tmp,TMVA::QuickMVAProbEstimator::compare);
49 UInt_t iLeft=0, iRight=0;
53 while ( (iLeft+iRight) < nRange){
54 if ( fEvtVector.end() > it+iRight+1){
56 if ( ((it+iRight))->eventType == 0) nSignal+=((it+iRight))->eventWeight;
57 else nBackgr+=((it+iRight))->eventWeight;
59 if ( fEvtVector.begin() <= it-iLeft-1){
61 if ( ((it-iLeft))->eventType == 0) nSignal+=((it-iLeft))->eventWeight;
62 else nBackgr+=((it-iLeft))->eventWeight;
66 Double_t mvaProb = (nSignal+nBackgr) ? nSignal/(nSignal+nBackgr) : -1 ;