#include <TGrid.h>
#include <TMessage.h>
#include <TUrl.h>
+#include <TRandom.h>
#include "AliAlignObj.h"
#include "AliCDBEntry.h"
fFirstEvent(0),
fLastEvent(-1),
fNumberOfEventsPerFile((UInt_t)-1),
+ fFractionFriends(0.04),
fOptions(),
fLoadAlignFromCDB(kTRUE),
fLoadAlignData("ALL"),
fEventInfo(),
fRunScalers(NULL),
fCTPTimeParams(NULL),
+ fCTPTimeAlign(NULL),
fRunLoader(NULL),
fRawReader(NULL),
ftVertexer(NULL),
fIsNewRunLoader(kFALSE),
fRunAliEVE(kFALSE),
- fChain(NULL)
+ fChain(NULL),
+ fNall(0),
+ fNspecie(0),
+ fSspecie(0),
+ fNhighPt(0),
+ fShighPt(0),
+ fUpgradeModule("")
{
// create reconstruction object with default parameters
gGeoManager = NULL;
for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
fReconstructor[iDet] = NULL;
+ fUpgradeMask[iDet]=kFALSE;
fLoader[iDet] = NULL;
fTracker[iDet] = NULL;
}
fFirstEvent(rec.fFirstEvent),
fLastEvent(rec.fLastEvent),
fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
+ fFractionFriends(rec.fFractionFriends),
fOptions(),
fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
fLoadAlignData(rec.fLoadAlignData),
fEventInfo(),
fRunScalers(NULL),
fCTPTimeParams(NULL),
+ fCTPTimeAlign(NULL),
fRunLoader(NULL),
fRawReader(NULL),
ftVertexer(NULL),
fIsNewRunLoader(rec.fIsNewRunLoader),
fRunAliEVE(kFALSE),
- fChain(NULL)
+ fChain(NULL),
+ fNall(0),
+ fNspecie(0),
+ fSspecie(0),
+ fNhighPt(0),
+ fShighPt(0),
+ fUpgradeModule("")
{
// copy constructor
}
for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
fReconstructor[iDet] = NULL;
+ fUpgradeMask[iDet] = kFALSE;
fLoader[iDet] = NULL;
fTracker[iDet] = NULL;
}
fFirstEvent = rec.fFirstEvent;
fLastEvent = rec.fLastEvent;
fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
+ fFractionFriends = rec.fFractionFriends;
for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
delete fCTPTimeParams; fCTPTimeParams = NULL;
if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
+ delete fCTPTimeAlign; fCTPTimeAlign = NULL;
+ if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
fRunLoader = NULL;
fRawReader = NULL;
fRecoParam = rec.fRecoParam;
for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+ fUpgradeMask[iDet] = kFALSE;
delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
delete fLoader[iDet]; fLoader[iDet] = NULL;
delete fTracker[iDet]; fTracker[iDet] = NULL;
fIsNewRunLoader = rec.fIsNewRunLoader;
fRunAliEVE = kFALSE;
fChain = NULL;
+ fNall = 0;
+ fNspecie = 0;
+ fSspecie = 0;
+ fNhighPt = 0;
+ fShighPt = 0;
+ fUpgradeModule="";
return *this;
}
delete fGRPData;
delete fRunScalers;
delete fCTPTimeParams;
+ delete fCTPTimeAlign;
fOptions.Delete();
if (fAlignObjArray) {
fAlignObjArray->Delete();
AliCDBManager::Instance()->SetLock(1);
}
+//_____________________________________________________________________________
+void AliReconstruction::MatchUpgradeDetector() {
+ // Translates detector name in a boolean.
+ // The boolean is used in GetReconstructor to load the
+ // upgrade reconstructor instead of the standard one.
+ for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+ if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
+ }
+}
//_____________________________________________________________________________
Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
{
AliCDBManager::Instance()->Get("GRP/CTP/Config");
+ AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
+
TString detStr = fLoadCDB;
for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
entry->SetOwner(0);
- if (fRunScalers->CorrectScalersOverflow() == 0) AliInfo("32bit Trigger counters corrected for overflow");
+ if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
}
return kTRUE;
// from OCDB.
AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
+ if (!entry) return kFALSE;
- if (entry) {
+ AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
+ fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
+ entry->SetOwner(0);
- AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
- fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
- entry->SetOwner(0);
- return kTRUE;
- }
-
- return kFALSE;
+ AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
+ if (!entry2) return kFALSE;
+
+ AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
+ fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
+ entry2->SetOwner(0);
+
+ return kTRUE;
}
//_____________________________________________________________________________
AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
for (int ib=2;ib--;) {
double intI,intNI;
- if (dipData->GetMeanIntensity(ib,intI,intNI)>=0) {
+ if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI)>=0)) {
fBeamInt[ib][0] = intI;
fBeamInt[ib][1] = intNI;
}
ProcInfo_t procInfo;
gSystem->GetProcInfo(&procInfo);
- AliInfo(Form("Current memory usage %d %d", procInfo.fMemResident, procInfo.fMemVirtual));
+ AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
//QA
//Initialize the QA and start of cycle
if (iEvent >= fRunLoader->GetNumberOfEvents()) {
fRunLoader->SetEventNumber(iEvent);
- fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
- iEvent, iEvent);
+ if (fRawReader)
+ fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
+ iEvent, iEvent);
fRunLoader->TreeE()->Fill();
+
if (fRawReader && fRawReader->UseAutoSaveESD())
fRunLoader->TreeE()->AutoSave("SaveSelf");
}
if (fStopOnError) {CleanUp(); return kFALSE;}
}
}
-
+
+ // AdC+FN
+ if (fReconstructor[3])
+ GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
+
// combined PID
pid.MakePID(fesd);
if (fRunV0Finder) {
// V0 finding
AliV0vertexer vtxer;
+ // get cuts for V0vertexer from AliGRPRecoParam
+ if (grpRecoParam) {
+ Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
+ Double_t *cutsV0vertexer = new Double_t[nCutsV0vertexer];
+ grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
+ vtxer.SetCuts(cutsV0vertexer);
+ delete [] cutsV0vertexer; cutsV0vertexer = NULL;
+ }
vtxer.Tracks2V0vertices(fesd);
if (fRunCascadeFinder) {
// Cascade finding
AliCascadeVertexer cvtxer;
+ // get cuts for CascadeVertexer from AliGRPRecoParam
+ if (grpRecoParam) {
+ Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
+ Double_t *cutsCascadeVertexer = new Double_t[nCutsCascadeVertexer];
+ grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
+ cvtxer.SetCuts(cutsCascadeVertexer);
+ delete [] cutsCascadeVertexer; cutsCascadeVertexer = NULL;
+ }
cvtxer.V0sTracks2CascadeVertices(fesd);
}
}
-
+
+ // write ESD
+ if (fCleanESD) CleanESD(fesd);
+ //
// RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
// tracks interpreted as primary, this step should be done in the very end, when full
// ESD info is available (particulalry, V0s)
}
}
- // write ESD
- if (fCleanESD) CleanESD(fesd);
-
if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
}
if (fRunGlobalQA) {
AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
+ if (qadm)
qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
if (qadm && IsInTasks(AliQAv1::kESDS))
qadm->Exec(AliQAv1::kESDS, fesd);
fesd->GetESDfriend(fesdf);
ftree->Fill();
- if (fWriteESDfriend) ftreeF->Fill();
+ if (fWriteESDfriend) {
+ WriteESDfriend();
+ }
// Auto-save the ESD tree in case of prompt reco @P2
if (fRawReader && fRawReader->UseAutoSaveESD()) {
ftree->AutoSave("SaveSelf");
if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
- TFile *friendfile = (TFile *)(gROOT->GetListOfFiles()->FindObject("AliESDfriends.root"));
- if (friendfile) friendfile->Save();
}
// write HLT ESD
aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
- AliInfo(Form("======================= End Event %d: Res %d(%3d <%3d>) Vir %d(%3d <%3d>) CPU %5.2f <%5.2f> ===================",
+ AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
oldMres=procInfo.fMemResident;
oldMvir=procInfo.fMemVirtual;
if (fIsNewRunLoader) { // galice.root didn't exist
fRunLoader->WriteHeader("OVERWRITE");
+ fRunLoader->WriteTrigger("OVERWRITE");
fRunLoader->CdGAFile();
fRunLoader->Write(0, TObject::kOverwrite);
}
TPair* pair = 0;
while((pair = dynamic_cast<TPair*> (iter.Next()))){
TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
- TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
- cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
+ TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
+ if (keyStr && valStr)
+ cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
}
TList *cdbListCopy = new TList();
AliCodeTimerAuto("",0)
TString detStr = detectors;
- for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
- if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
- AliReconstructor* reconstructor = GetReconstructor(iDet);
- if (!reconstructor) continue;
- AliLoader* loader = fLoader[iDet];
- // Matthias April 2008: temporary fix to run HLT reconstruction
- // although the HLT loader is missing
- if (strcmp(fgkDetectorName[iDet], "HLT")==0) {
+ // execute HLT reconstruction first since other detector reconstruction
+ // might depend on HLT data
+ // key 'HLT' is removed from detStr by IsSelected
+ if (!IsSelected("HLT", detStr)) {
+ AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
+ if (reconstructor) {
+ // there is no AliLoader for HLT, see
+ // https://savannah.cern.ch/bugs/?35473
+ AliInfo("running reconstruction for HLT");
if (fRawReader) {
reconstructor->Reconstruct(fRawReader, NULL);
} else {
TTree* dummy=NULL;
reconstructor->Reconstruct(dummy, NULL);
}
- continue;
}
+ }
+ for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+ if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
+ AliReconstructor* reconstructor = GetReconstructor(iDet);
+ if (!reconstructor) continue;
+ AliLoader* loader = fLoader[iDet];
if (!loader) {
AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
continue;
loader->UnloadRecPoints();
AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
}
- IsSelected("CTP", detStr);
+ if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
AliError(Form("the following detectors were not found: %s",
detStr.Data()));
}
}
- IsSelected("CTP", detStr);
+ if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
AliError(Form("the following detectors were not found: %s",
detStr.Data()));
if(TMath::Abs(Int_t(orbit-(input.GetIR(i))->GetOrbit()))<=1){
esdheader->AddTriggerIR(input.GetIR(i));
}
+ AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
+ rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
+ rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
+ rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
}
+ if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
}
return kTRUE;
}
}
fIsNewRunLoader = kTRUE;
fRunLoader->MakeTree("E");
+ fRunLoader->MakeTree("GG");
if (fNumberOfEventsPerFile > 0)
fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
}
+
+ // check if the upgrade reconstructor should be used instead of the standard one
+ if(fUpgradeMask[iDet]) {
+ if(reconstructor) delete reconstructor;
+ TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
+ reconstructor = (AliReconstructor*)(cl->New());
+ }
+
if (reconstructor) {
TObject* obj = fOptions.FindObject(detName.Data());
if (obj) reconstructor->SetOption(obj->GetTitle());
if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
- reconstructor->SetRecoParam(par);
- reconstructor->SetRunInfo(fRunInfo);
+ if (reconstructor) {
+ reconstructor->SetRecoParam(par);
+ reconstructor->SetRunInfo(fRunInfo);
+ }
}
return reconstructor;
}
AliVertexer* vertexer = NULL;
AliReconstructor* itsReconstructor = GetReconstructor(0);
- if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || fRunTracking.Contains("ITS"))) {
+ if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
+ fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
vertexer = itsReconstructor->CreateVertexer();
}
if (!vertexer) {
AliTrackleter* trackleter = NULL;
AliReconstructor* itsReconstructor = GetReconstructor(0);
- if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || fRunTracking.Contains("ITS"))) {
+ if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
+ fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
trackleter = itsReconstructor->CreateMultFinder();
}
- if (!trackleter) {
- AliWarning("couldn't create a trackleter for ITS");
+ else {
+ AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
+ fRunMultFinder = kFALSE;
}
return trackleter;
// The return flag shows whenever the
// AliEVE initialization was successful or not.
- TString macroStr;
- macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
+ TString macroStr(gSystem->Getenv("ALIEVE_ONLINE_MACRO"));
+
+ if (macroStr.IsNull())
+ macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
+
AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
+
if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
// successful initialization of AliEVE.
AliInfo("Running AliEVE...");
- gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)0x%lx,(AliRawReader*)0x%lx,(AliESDEvent*)0x%lx,(AliESDfriend*)0x%lx);",fRunLoader,fRawReader,fesd,fesdf));
+ gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
gSystem->Run();
}
}
aCTP->SetClassMask(mask);
aCTP->SetClusterMask(clmask);
+
+ AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
+ rlCTP->SetClassMask(mask);
+ rlCTP->SetClusterMask(clmask);
}
else {
fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
return kTRUE;
}
+
+//______________________________________________________________________________
+Bool_t AliReconstruction::IsHighPt() const {
+ // Selection of events containing "high" pT tracks
+ // If at least one track is found within 1.5 and 100 GeV (pT)
+ // that was reconstructed by both ITS and TPC, the event is accepted
+
+ // Track cuts
+ const Double_t pTmin = 1.5;
+ const Double_t pTmax = 100;
+ ULong_t mask = 0;
+ mask |= (AliESDtrack::kITSrefit);
+ mask |= (AliESDtrack::kTPCrefit);
+ const Double_t pTminCosmic = 5.;
+ const Double_t pTmaxCosmic = 100;
+ ULong_t maskCosmic = 0;
+ Int_t cosmicCount=0;
+ maskCosmic |= (AliESDtrack::kTPCrefit);
+
+ Bool_t isOK = kFALSE;
+
+ if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
+ // Check if this ia a physics event (code 7)
+ Int_t ntrk = fesd->GetNumberOfTracks();
+ for (Int_t itrk=0; itrk<ntrk; ++itrk) {
+
+ AliESDtrack * trk = fesd->GetTrack(itrk);
+ if (trk
+ && trk->Pt() > pTmin
+ && trk->Pt() < pTmax
+ && (trk->GetStatus() & mask) == mask ) {
+
+ isOK = kTRUE;
+ break;
+ }
+ if (trk
+ && trk->GetInnerParam()
+ && trk->GetInnerParam()->Pt() > pTminCosmic
+ && trk->GetInnerParam()->Pt() < pTmaxCosmic
+ && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
+
+ cosmicCount++;
+ break;
+ }
+ }
+ if (cosmicCount>1) isOK=kTRUE;
+ }
+ return isOK;
+}
+
+//______________________________________________________________________________
+Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
+ // Select cosmic or calibration events
+
+ Bool_t isOK = kFALSE;
+
+ if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
+ // Check if this ia a physics event (code 7)
+
+ UInt_t specie = fesd->GetEventSpecie();
+ if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
+ isOK = kTRUE;
+ }
+ }
+ return isOK;
+}
+
+//______________________________________________________________________________
+void AliReconstruction::WriteESDfriend() {
+ // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
+ // in fFractionFriends. We select events where we store the ESD friends according
+ // to the following algorithm:
+ // 1. Store all Cosmic or Calibration events within the required fraction
+ // 2. Sample "high Pt" events within the remaining fraction after step 1.
+ // 3. Sample randomly events if we still have remaining slot
+
+ fNall++;
+ Bool_t isSelected = kFALSE;
+ //
+ // Store all friends for B field OFF
+ if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
+
+ if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
+ fNspecie++;
+ Double_t curentSpecieFraction = ((Double_t)(fNspecie+1))/((Double_t)(fNall+1));
+ // "Bayesian" estimate supposing that without events all the events are of the required type
+
+ Double_t rnd = gRandom->Rndm()*curentSpecieFraction;
+ if (rnd<fFractionFriends) {
+ isSelected = kTRUE;
+ fSspecie++;
+ }
+ }
+
+ Double_t remainingFraction = fFractionFriends;
+ remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
+
+ if (IsHighPt()) { // Selection of "high Pt" events
+ fNhighPt++;
+ Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
+ // "Bayesian" estimate supposing that without events all the events are of the required type
+
+ if (!isSelected) {
+ Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
+ if (rnd<remainingFraction) {
+ isSelected = kTRUE;
+ fShighPt++;
+ }
+ }
+ }
+ remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
+
+ // Random selection to fill the remaining fraction (if any)
+ if (!isSelected) {
+ Double_t rnd = gRandom->Rndm();
+ if (rnd<remainingFraction) {
+ isSelected = kTRUE;
+ }
+ }
+
+ if (!isSelected) {
+ fesdf->~AliESDfriend();
+ new (fesdf) AliESDfriend(); // Reset...
+ fesdf->SetSkipBit(kTRUE);
+ }
+
+ ftreeF->Fill();
+}