+ static Bool_t preliminary = kTRUE;
+ static Int_t oldnumbevt = 0;
+ if(!(preliminary || killOutliers))return kTRUE; //ComputeMean is
+ // executed only once with argument kFALSE
+ Double_t wpos[3];
+ for(Int_t i=0;i<3;i++)wpos[i]=fWeighPos[i];
+
+ Int_t istart = oldnumbevt;
+ if(killOutliers)istart = 0;
+ if(killOutliers && preliminary){
+ preliminary = kFALSE;
+ Reset(kTRUE,kFALSE);
+ }
+ oldnumbevt = fVertArray.GetEntries();
+ for(Int_t i=istart;i<fVertArray.GetEntries();i++){
+ AliESDVertex* vert = NULL;
+
+ // second pass
+ if(killOutliers && fAccEvents.TestBitNumber(i)){
+ vert=(AliESDVertex*)fVertArray[i];
+ Double_t dist=(vert->GetXv()-wpos[0])*(vert->GetXv()-wpos[0]);
+ dist+=(vert->GetYv()-wpos[1])*(vert->GetYv()-wpos[1]);
+ dist=sqrt(dist)*10.; // distance in mm
+ fDistH->Fill(dist);
+ if(dist>fRCut)fAccEvents.SetBitNumber(i,kFALSE);
+ }
+
+ if(!fAccEvents.TestBitNumber(i))continue;
+ vert=(AliESDVertex*)fVertArray[i];
+ AddToMean(vert);
+ }
+ Bool_t bad = ((!killOutliers) && fNoEventsContr < 5) || (killOutliers && fNoEventsContr <2);
+ if(bad) {
+ if(killOutliers){
+// when the control reachs this point, the preliminary evaluation of the
+// diamond region has to be redone. So a general reset must be issued
+// if this occurs, it is likely that the cuts are badly defined
+ ResetArray();
+ Reset(kFALSE,kTRUE);
+ preliminary = kTRUE;
+ oldnumbevt = 0;
+ }
+ return kFALSE;
+ }
+ Double_t nevents = fNoEventsContr;
+ for(Int_t i=0;i<3;i++){
+ fWeighPos[i] = fWeighPosSum[i]/fWeighSigSum[i];
+ fWeighSig[i] = 1./TMath::Sqrt(fWeighSigSum[i]);
+ fAverPos[i] = fAverPosSum[i]/nevents;
+ }
+ for(Int_t i=0;i<3;i++){
+ for(Int_t j=i;j<3;j++){
+ fAverPosSq[i][j] = fAverPosSqSum[i][j]/(nevents -1.);
+ fAverPosSq[i][j] -= nevents/(nevents -1.)*fAverPos[i]*fAverPos[j];
+ }
+ }
+ if(killOutliers)ResetArray();
+ fAverContributors = fTotContributors/nevents;
+ return kTRUE;
+ }