#include "AliLHCData.h"
#include "ARVersion.h"
#include <RVersion.h>
+#include <unistd.h>
+#include <sys/resource.h>
ClassImp(AliReconstruction)
//_____________________________________________________________________________
+const char* AliReconstruction::fgkStopEvFName = "_stopEvent_";
const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE"
// #ifdef MFT_UPGRADE
// , "MFT"
fRunLocalReconstruction("ALL"),
fRunTracking("ALL"),
fFillESD("ALL"),
+ fDeleteRecPoints(""),
+ fDeleteDigits(""),
fLoadCDB(""),
fUseTrackingErrorsForAlignment(""),
fGAliceFileName(gAliceFilename),
fUpgradeModule(""),
fAnalysisMacro(),
fAnalysis(0),
- fRecoHandler(0)
+ fRecoHandler(0),
+ fDeclTriggerClasses(""),
+ fStopped(kFALSE),
+ fMaxRSS(0),
+ fMaxVMEM(0)
{
// create reconstruction object with default parameters
gGeoManager = NULL;
fRunLocalReconstruction(rec.fRunLocalReconstruction),
fRunTracking(rec.fRunTracking),
fFillESD(rec.fFillESD),
+ fDeleteRecPoints(""),
+ fDeleteDigits(""),
fLoadCDB(rec.fLoadCDB),
fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
fGAliceFileName(rec.fGAliceFileName),
fUpgradeModule(""),
fAnalysisMacro(rec.fAnalysisMacro),
fAnalysis(0),
- fRecoHandler(0)
+ fRecoHandler(0),
+ fDeclTriggerClasses(rec.fDeclTriggerClasses),
+ fStopped(kFALSE),
+ fMaxRSS(0),
+ fMaxVMEM(0)
{
// copy constructor
fRunLocalReconstruction = rec.fRunLocalReconstruction;
fRunTracking = rec.fRunTracking;
fFillESD = rec.fFillESD;
+ fDeleteRecPoints = rec.fDeleteRecPoints;
+ fDeleteDigits = rec.fDeleteDigits;
fLoadCDB = rec.fLoadCDB;
fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
fGAliceFileName = rec.fGAliceFileName;
fAnalysisMacro = rec.fAnalysisMacro;
fAnalysis = 0;
fRecoHandler = 0;
+ fDeclTriggerClasses = rec.fDeclTriggerClasses;
return *this;
}
AliSysInfo::AddStamp("InitCDB");
}
+//_____________________________________________________________________________
+void AliReconstruction::SetCDBSnapshotMode(const char* snapshotFileName) {
+ AliCDBManager::Instance()->SetSnapshotMode(snapshotFileName);
+}
+
//_____________________________________________________________________________
void AliReconstruction::SetDefaultStorage(const char* uri) {
// Store the desired default CDB storage location
if(AliGeomManager::GetNalignable("GRP") != 0)
loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
- AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
}else{
// Check if the array with alignment objects was
// provided by the user. If yes, apply the objects
fRunTracking = MatchDetectorList(fRunTracking,detMask);
fFillESD = MatchDetectorList(fFillESD,detMask);
fQADetectors = MatchDetectorList(fQADetectors,detMask);
+ fDeleteRecPoints = MatchDetectorList(fDeleteRecPoints,detMask);
+ fDeleteDigits = MatchDetectorList(fDeleteDigits,detMask);
fLoadCDB.Form("%s %s %s %s",
fRunLocalReconstruction.Data(),
fRunTracking.Data(),
if (entry) {
fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
entry->SetOwner(0);
- AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
}
if (!fListOfCosmicTriggers) {
for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
+ AliCDBManager::Instance()->GetAll(Form("%s/Trigger/*",fgkDetectorName[iDet]));
}
// Temporary fix - one has to define the correct policy in order
Int_t iEvent = 0;
while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
(fRawReader && fRawReader->NextEvent())) {
+ //
+ // check if process has enough resources
+ if (!HasEnoughResources(iEvent)) break;
if (!ProcessEvent(iEvent)) {
Abort("ProcessEvent",TSelector::kAbortFile);
return kFALSE;
return;
}
+ if(fFromCDBSnapshot){
+ AliDebug(2,"Initializing from a CDB snapshot");
+ if(!AliCDBManager::Instance()->InitFromSnapshot(fSnapshotFileName.Data()))
+ AliFatal("Was not able to initialize from the snapshot!");
+ }
// Set CDB lock: from now on it is forbidden to reset the run number
// or the default storage or to activate any further storage!
SetCDBLock();
AliSysInfo::AddStamp("CheckGeom");
}
- if(fFromCDBSnapshot){
- AliDebug(2,"Initializing from a CDB snapshot");
- if(!AliCDBManager::Instance()->InitFromSnapshot(fSnapshotFileName.Data())){
- Abort("InitFromSnapshot", TSelector::kAbortProcess);
- return;
- }
+ Bool_t toCDBSnapshot=kFALSE;
+ TString snapshotFileOut(""); // we could use fSnapshotFileName if we are not interested
+ // in reading from and writing to a snapshot file at the same time
+ if(TString(gSystem->Getenv("OCDB_SNAPSHOT_CREATE")) == TString("kTRUE")){
+ toCDBSnapshot=kTRUE;
+ //fFromCDBSnapshot=kFALSE;
+ TString snapshotFile(gSystem->Getenv("OCDB_SNAPSHOT_FILENAME"));
+ if(!(snapshotFile.IsNull() || snapshotFile.IsWhitespace()))
+ snapshotFileOut = snapshotFile;
+ else
+ snapshotFileOut="OCDB.root";
}
if (!MisalignGeometry(fLoadAlignData)) {
return;
}
AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
+ if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
AliSysInfo::AddStamp("MisalignGeom");
if (!InitGRP()) {
return;
}
AliSysInfo::AddStamp("InitGRP");
+ if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
if(!fFromCDBSnapshot){
if (!LoadCDB()) {
}
AliSysInfo::AddStamp("InitRecoParams");
+ if(toCDBSnapshot)
+ AliCDBManager::Instance()->DumpToSnapshotFile(snapshotFileOut.Data(),kFALSE);
+ AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
+ AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
+
if (fInput && gProof) {
if (reco) *reco = *this;
currTree->SetBranchAddress("rawevent",&event);
currTree->GetEntry(entry);
fRawReader = new AliRawReaderRoot(event);
+ // check if process has enough resources
+ if (!HasEnoughResources(entry)) return kFALSE;
fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
delete fRawReader;
fRawReader = NULL;
AliESDpid pid;
+ AliSysInfo::AddStamp(Form("StartEv_%d",iEvent), 0,0,iEvent);
+
if (iEvent >= fRunLoader->GetNumberOfEvents()) {
fRunLoader->SetEventNumber(iEvent);
if (fRawReader)
}
AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
+ AliSysInfo::AddStamp(Form("StartReco_%d",iEvent), 0,0,iEvent);
+
// Set the reco-params
{
TString detStr = fLoadCDB;
if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
+ AliSysInfo::AddStamp(Form("RawQA_%d",iEvent), 0,0,iEvent);
}
// local single event reconstruction
if (!fRunLocalReconstruction.IsNull()) {
esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
}
//
+ fesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
+ fesd->SetBeamType(fGRPData->GetBeamType().Data());
+ fesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
+ fesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
+ fhltesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
+ fhltesd->SetBeamType(fGRPData->GetBeamType().Data());
+ fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
+ fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
+ //
AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
if (fld) { // set info needed for field initialization
fesd->SetCurrentL3(fld->GetCurrentSol());
fesd->SetCurrentDip(fld->GetCurrentDip());
- fesd->SetBeamEnergy(fld->GetBeamEnergy());
- fesd->SetBeamType(fld->GetBeamTypeText());
fesd->SetUniformBMap(fld->IsUniform());
fesd->SetBInfoStored();
//
fhltesd->SetCurrentL3(fld->GetCurrentSol());
fhltesd->SetCurrentDip(fld->GetCurrentDip());
- fhltesd->SetBeamEnergy(fld->GetBeamEnergy());
- fhltesd->SetBeamType(fld->GetBeamTypeText());
fhltesd->SetUniformBMap(fld->IsUniform());
fhltesd->SetBInfoStored();
}
// Fill raw-data error log into the ESD
if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
+ AliSysInfo::AddStamp(Form("FillHeadErrs_%d",iEvent), 0,0,iEvent);
+
// vertex finder
if (fRunVertexFinder) {
if (!RunVertexFinder(fesd)) {
if (fStopOnError) {CleanUp(); return kFALSE;}
}
+ AliSysInfo::AddStamp(Form("VtxFinder_%d",iEvent), 0,0,iEvent);
}
// For Plane Efficiency: run the SPD trackleter
if (!RunSPDTrackleting(fesd)) {
if (fStopOnError) {CleanUp(); return kFALSE;}
}
+ AliSysInfo::AddStamp(Form("TrackletEff_%d",iEvent), 0,0,iEvent);
}
// Muon tracking
if (fStopOnError) {CleanUp(); return kFALSE;}
}
}
+ AliSysInfo::AddStamp(Form("TrackingMUON_%d",iEvent), 0,0,iEvent);
}
// barrel tracking
const Double_t kRadius = 2.8; //something less than the beam pipe radius
TObjArray trkArray;
- UShort_t *selectedIdx=new UShort_t[ntracks];
+ UShort_t selectedIdx[ntracks];
for (Int_t itrack=0; itrack<ntracks; itrack++){
const Double_t kMaxStep = 1; //max step over the material
track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
}
-
+ AliSysInfo::AddStamp(Form("RelToSPDVtx_%d",iEvent), 0,0,iEvent);
//
// Improve the reconstructed primary vertex position using the tracks
//
}
delete pvtx; pvtx=NULL;
}
+ AliSysInfo::AddStamp(Form("VtxTrk_%d",iEvent), 0,0,iEvent);
// TPC-only primary vertex
ftVertexer->SetTPCMode();
}
delete pvtx; pvtx=NULL;
}
+ AliSysInfo::AddStamp(Form("VtxTPC_%d",iEvent), 0,0,iEvent);
}
- delete[] selectedIdx;
-
+
if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
else fesd->SetDiamond(fDiamondProfileSPD);
// get cuts for V0vertexer from AliGRPRecoParam
if (grpRecoParam) {
Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
- Double_t *cutsV0vertexer = new Double_t[nCutsV0vertexer];
+ Double_t cutsV0vertexer[nCutsV0vertexer];
grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
vtxer.SetCuts(cutsV0vertexer);
- delete [] cutsV0vertexer; cutsV0vertexer = NULL;
}
vtxer.Tracks2V0vertices(fesd);
+ AliSysInfo::AddStamp(Form("V0Finder_%d",iEvent), 0,0,iEvent);
if (fRunCascadeFinder) {
// Cascade finding
// get cuts for CascadeVertexer from AliGRPRecoParam
if (grpRecoParam) {
Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
- Double_t *cutsCascadeVertexer = new Double_t[nCutsCascadeVertexer];
+ Double_t cutsCascadeVertexer[nCutsCascadeVertexer];
grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
cvtxer.SetCuts(cutsCascadeVertexer);
- delete [] cutsCascadeVertexer; cutsCascadeVertexer = NULL;
}
cvtxer.V0sTracks2CascadeVertices(fesd);
+ AliSysInfo::AddStamp(Form("CascadeFinder_%d",iEvent), 0,0,iEvent);
}
}
if (fStopOnError) {CleanUp(); return kFALSE;}
}
+ AliSysInfo::AddStamp(Form("FillVaria_%d",iEvent), 0,0,iEvent);
+
// write ESD
- if (fCleanESD) CleanESD(fesd);
+ if (fCleanESD) {
+ CleanESD(fesd);
+ AliSysInfo::AddStamp(Form("CleanESD_%d",iEvent), 0,0,iEvent);
+ }
//
// 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
if (!RunMultFinder(fesd)) {
if (fStopOnError) {CleanUp(); return kFALSE;}
}
+ AliSysInfo::AddStamp(Form("MultFinder_%d",iEvent), 0,0,iEvent);
}
if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
+ AliSysInfo::AddStamp(Form("RunQA_%d",iEvent), 0,0,iEvent);
}
if (fRunGlobalQA) {
AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
if (qadm && IsInTasks(AliQAv1::kESDS))
qadm->Exec(AliQAv1::kESDS, fesd);
+ AliSysInfo::AddStamp(Form("RunGlobQA_%d",iEvent), 0,0,iEvent);
}
// copy HLT decision from HLTesd to esd
if (pHLTSrc && pHLTTgt) {
pHLTSrc->Copy(*pHLTTgt);
}
-
- if (fWriteESDfriend)
- fesd->GetESDfriend(fesdf);
-
- ftree->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");
- }
-
+ //
+ // Perform analysis of this event if requested
+ // RS: Should be done before WriteESDfriend, since the latter may clean the esdfriend
+ if (fAnalysis) {
+ fRecoHandler->BeginEvent(iEvent);
+ fAnalysis->ExecAnalysis();
+ fRecoHandler->FinishEvent();
+ AliSysInfo::AddStamp(Form("Analysis_%d",iEvent), 0,0,iEvent);
+ }
+ //
+ if (fWriteESDfriend) {
+ fesd->GetESDfriend(fesdf);
+ AliSysInfo::AddStamp(Form("CreateFriend_%d",iEvent), 0,0,iEvent);
+
+ }
+ //
+ ftree->Fill();
+ AliSysInfo::AddStamp(Form("ESDFill_%d",iEvent), 0,0,iEvent);
+ //
+ if (fWriteESDfriend) {
+ WriteESDfriend();
+ AliSysInfo::AddStamp(Form("WriteFriend_%d",iEvent), 0,0,iEvent);
+ }
+ //
+ //
+ // Auto-save the ESD tree in case of prompt reco @P2
+ if (fRawReader && fRawReader->UseAutoSaveESD()) {
+ ftree->AutoSave("SaveSelf");
+ if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
+ }
// write HLT ESD
fhlttree->Fill();
// call AliEVE
if (fRunAliEVE) RunAliEVE();
-
+ //
fesd->Reset();
fhltesd->Reset();
if (fWriteESDfriend) {
if (fRunQA || fRunGlobalQA)
AliQAManager::QAManager()->Increment() ;
-
- // Perform analysis of this event if requested
- if (fAnalysis) {
- fRecoHandler->BeginEvent(iEvent);
- fAnalysis->ExecAnalysis();
- fRecoHandler->FinishEvent();
- }
- return kTRUE;
+
+ DeleteRecPoints(fDeleteRecPoints);
+ DeleteDigits(fDeleteDigits);
+ //
+ return kTRUE;
}
//_____________________________________________________________________________
reconstructor->Reconstruct(dummy, NULL);
}
}
+ AliSysInfo::AddStamp(Form("LRecHLT_%d",eventNr), -1,1,eventNr);
}
AliInfo(Form("kNDetectors = %d",kNDetectors));
AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
return kFALSE;
}
+ AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
// preliminary PID in TPC needed by the ITS tracker
if (iDet == 1) {
GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
PID.MakePID(esd,kTRUE);
+ AliSysInfo::AddStamp(Form("MakePID0%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
}
- AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
}
// pass 2: ALL backwards
if (qadm) qadm->InitRecPointsForTracker() ;
}
}
+ // AliSysInfo::AddStamp(Form("QAInitResid%s_%d",fgkDetectorName[iDet],eventNr), iDet,0, eventNr);
}
if (fTracker[iDet]->PropagateBack(esd) != 0) {
AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
// return kFALSE;
}
+ AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
// unload clusters
if (iDet > 3) { // all except ITS, TPC, TRD and TOF
//GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
//AliESDpid::MakePID(esd);
PID.MakePID(esd,kTRUE);
+ AliSysInfo::AddStamp(Form("MakePID1%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
}
- AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
+
}
//stop filling residuals for the "outer" detectors
if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
// write space-points to the ESD in case alignment data output
// is switched on
- if (fWriteAlignmentData)
+ if (fWriteAlignmentData) {
WriteAlignmentData(esd);
-
+ AliSysInfo::AddStamp(Form("WrtAlignData_%d",eventNr), 0,0, eventNr);
+ }
+
for (Int_t iDet = 3; iDet >= 0; iDet--) {
if (!fTracker[iDet]) continue;
// unload clusters
esdheader->SetL1TriggerInputs(input.GetL1Inputs());
esdheader->SetL2TriggerInputs(input.GetL2Inputs());
// IR
- UInt_t orbit=input.GetOrbitID();
- for(Int_t i=0 ; i<input.GetNIRs() ; i++ )
- if(TMath::Abs(Int_t(orbit-(input.GetIR(i))->GetOrbit()))<=1){
- esdheader->AddTriggerIR(input.GetIR(i));
- }
+ // UInt_t orbit=input.GetOrbitID();
+ for(Int_t i=0 ; i<input.GetNIRs() ; i++ ) {
+ esdheader->AddTriggerIR(input.GetIR(i));
+ }
AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
- rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
- rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
- rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
+ if (rlCTP) {
+ rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
+ rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
+ rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
+ }
}
if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
}
AliQAManager::QAManager()->ShowQA() ;
// AliQAManager::Destroy() ;
delete fAnalysis;
-
+ fAnalysis = NULL;
}
void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
aCTP->SetClusterMask(clmask);
AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
- rlCTP->SetClassMask(mask);
- rlCTP->SetClusterMask(clmask);
+ if (rlCTP) {
+ rlCTP->SetClassMask(mask);
+ rlCTP->SetClusterMask(clmask);
+ }
}
else {
fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
}
}
fEventInfo.SetTriggerClasses(trclasses);
+ // Now put the declared trigger classes (not present in the run)
+ // to 0/false in the event selection
+ if (!fDeclTriggerClasses.IsNull()) {
+ TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
+ Int_t ntokens = tokens->GetEntriesFast();
+ for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
+ if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
+ }
+ delete tokens;
+ }
// Write names of active trigger inputs in ESD Header
const TObjArray& inputsArray = config->GetInputs();
else if (fAbort == kAbortFile)
mess = "AbortFile";
- Info(mess, whyMess.Data());
+ Info(mess.Data(), "%s", whyMess.Data());
}
//______________________________________________________________________________
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++;
- }
+
+ isSelected = kTRUE;
+ fSspecie++;
}
Double_t remainingFraction = fFractionFriends;
new (fesdf) AliESDfriend(); // Reset...
fesdf->SetSkipBit(kTRUE);
}
-
+ //
ftreeF->Fill();
}
+
+//_________________________________________________________________
+void AliReconstruction::DeleteDigits(const TString& detectors)
+{
+ // delete requested digit files produced at current event
+ static int iEvent = 0;
+ if (detectors.IsNull()) return;
+ TString detStr = detectors;
+ AliInfo(Form("Deleting Digits: %s",detectors.Data()));
+
+ for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+ gSystem->Exec(Form("if [ -e %s.Digits.root ]; then\nrm %s.Digits.root\nfi",
+ fgkDetectorName[iDet],fgkDetectorName[iDet]));
+ }
+ AliSysInfo::AddStamp(Form("DelDigits_%d",iEvent), 0,0,iEvent);
+ iEvent++;
+}
+
+//_________________________________________________________________
+void AliReconstruction::DeleteRecPoints(const TString& detectors)
+{
+ // delete requested recpoint files produced at current event
+ static int iEvent = 0;
+ if (detectors.IsNull()) return;
+ TString detStr = detectors;
+ AliInfo(Form("Deleting Recpoints: %s",detectors.Data()));
+ //
+ for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+ gSystem->Exec(Form("if [ -e %s.RecPoints.root ]; then\nrm %s.RecPoints.root\nfi",
+ fgkDetectorName[iDet],fgkDetectorName[iDet]));
+ }
+ AliSysInfo::AddStamp(Form("DelRecPoints_%d",iEvent), 0,0,iEvent);
+ iEvent++;
+}
+
+//_________________________________________________________________
+void AliReconstruction::SetStopOnResourcesExcess(Int_t vRSS,Int_t vVMEM)
+{
+ // require checking the resources left and stopping on excess
+ // if 0 : no check is done
+ // if >0 : stop reconstruction if exceeds this value
+ // if <0 : use as margin to system limits
+ //
+ const int kKB2MB = 1024;
+ const int kInfMem = 9999999;
+ //
+ struct rlimit r;
+ int pgSize = getpagesize();
+ //
+ if (vRSS>0) {
+ fMaxRSS = vRSS;
+ AliInfo(Form("Setting max. RSS usage to user value %d MB",fMaxRSS));
+ }
+ else if (vRSS<0) {
+ getrlimit(RLIMIT_RSS,&r);
+ fMaxRSS = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vRSS;
+ AliInfo(Form("Setting max. RSS usage to system hard limit %d%s MB (%d margin)",fMaxRSS,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vRSS));
+ }
+ else {AliInfo("No check on RSS memory usage will be applied");}
+ //
+ if (vVMEM>0) {
+ fMaxVMEM = vVMEM;
+ AliInfo(Form("Setting max. VMEM usage to user value %d MB",fMaxVMEM));
+ }
+ else if (vVMEM<0) {
+ getrlimit(RLIMIT_AS,&r);
+ fMaxVMEM = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vVMEM;
+ AliInfo(Form("Setting max. VMEM usage to system hard limit %d%s MB (%d margin)",fMaxVMEM,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vVMEM));
+ }
+ else {AliInfo("No check on RSS memory usage will be applied");}
+ //
+}
+
+//_________________________________________________________________
+Bool_t AliReconstruction::HasEnoughResources(int ev)
+{
+ // check if process consumed more than allowed resources
+ const int kKB2MB = 1024;
+ Bool_t res = kTRUE;
+ if (!fMaxRSS && !fMaxVMEM) return res;
+ //
+ ProcInfo_t procInfo;
+ gSystem->GetProcInfo(&procInfo);
+ if (procInfo.fMemResident/kKB2MB > fMaxRSS) res = kFALSE;
+ if (procInfo.fMemVirtual/kKB2MB > fMaxVMEM) res = kFALSE;
+ //
+ if (!res) {
+ AliInfo(Form("Job exceeded allowed limits: RSS:%d (%d) VMEM:%d (%d), will stop",
+ int(procInfo.fMemResident/kKB2MB),fMaxRSS,
+ int(procInfo.fMemVirtual/kKB2MB) ,fMaxVMEM));
+ //
+ gSystem->Exec(Form("if [ -e %s ]; then\nrm %s\nfi\necho %d > %s",fgkStopEvFName,fgkStopEvFName,ev,fgkStopEvFName));
+ fStopped = kTRUE;
+ }
+ return res;
+}