X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliReconstruction.cxx;h=dd068e2e369e98a9cdc9df2ec2978d3ca63ded52;hb=7feceed5167fb7662cef49c520a29874f8ee0f99;hp=c484a658f5b475a42d8284d5085ea4db0da247e0;hpb=33314186efef24eb32b7a52722afd3c669697c42;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliReconstruction.cxx b/STEER/AliReconstruction.cxx index c484a658f5b..dd068e2e369 100644 --- a/STEER/AliReconstruction.cxx +++ b/STEER/AliReconstruction.cxx @@ -126,6 +126,10 @@ #include #include #include +#include +#include +#include +#include #include "AliAlignObj.h" #include "AliCDBEntry.h" @@ -181,11 +185,15 @@ #include "AliTracker.h" #include "AliTriggerClass.h" #include "AliTriggerCluster.h" +#include "AliTriggerIR.h" #include "AliTriggerConfiguration.h" #include "AliV0vertexer.h" #include "AliVertexer.h" #include "AliVertexerTracks.h" - +#include "AliTriggerRunScalers.h" +#include "AliCTPTimeParams.h" +#include "AliESDHLTDecision.h" +#include "AliTriggerInput.h" ClassImp(AliReconstruction) //_____________________________________________________________________________ @@ -194,14 +202,13 @@ const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = //_____________________________________________________________________________ AliReconstruction::AliReconstruction(const char* gAliceFilename) : TSelector(), - fUniformField(kFALSE), fRunVertexFinder(kTRUE), fRunVertexFinderTracks(kTRUE), fRunHLTTracking(kFALSE), fRunMuonTracking(kFALSE), fRunV0Finder(kTRUE), fRunCascadeFinder(kTRUE), - fStopOnError(kFALSE), + fStopOnError(kTRUE), fWriteAlignmentData(kFALSE), fWriteESDfriend(kFALSE), fFillTriggerESD(kTRUE), @@ -219,6 +226,11 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) : fUseTrackingErrorsForAlignment(""), fGAliceFileName(gAliceFilename), fRawInput(""), + fESDOutput(""), + fProofOutputFileName(""), + fProofOutputLocation(""), + fProofOutputDataset(kFALSE), + fProofOutputArchive(""), fEquipIdMap(""), fFirstEvent(0), fLastEvent(-1), @@ -229,6 +241,8 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) : fUseHLTData(), fRunInfo(NULL), fEventInfo(), + fRunScalers(NULL), + fCTPTimeParams(NULL), fRunLoader(NULL), fRawReader(NULL), @@ -241,6 +255,7 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) : fDiamondProfileSPD(NULL), fDiamondProfile(NULL), fDiamondProfileTPC(NULL), + fListOfCosmicTriggers(NULL), fGRPData(NULL), @@ -251,7 +266,6 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) : fInitCDBCalled(kFALSE), fSetRunNumberFromDataCalled(kFALSE), fQADetectors("ALL"), - fQAManager(NULL), fQATasks("ALL"), fRunQA(kTRUE), fRunGlobalQA(kTRUE), @@ -264,7 +278,9 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) : fhltesd(NULL), fesdf(NULL), ffile(NULL), + ffileF(NULL), ftree(NULL), + ftreeF(NULL), fhlttree(NULL), ftVertexer(NULL), fIsNewRunLoader(kFALSE), @@ -290,7 +306,6 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) : //_____________________________________________________________________________ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : TSelector(), - fUniformField(rec.fUniformField), fRunVertexFinder(rec.fRunVertexFinder), fRunVertexFinderTracks(rec.fRunVertexFinderTracks), fRunHLTTracking(rec.fRunHLTTracking), @@ -315,6 +330,11 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment), fGAliceFileName(rec.fGAliceFileName), fRawInput(rec.fRawInput), + fESDOutput(rec.fESDOutput), + fProofOutputFileName(rec.fProofOutputFileName), + fProofOutputLocation(rec.fProofOutputLocation), + fProofOutputDataset(rec.fProofOutputDataset), + fProofOutputArchive(rec.fProofOutputArchive), fEquipIdMap(rec.fEquipIdMap), fFirstEvent(rec.fFirstEvent), fLastEvent(rec.fLastEvent), @@ -325,6 +345,8 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fUseHLTData(rec.fUseHLTData), fRunInfo(NULL), fEventInfo(), + fRunScalers(NULL), + fCTPTimeParams(NULL), fRunLoader(NULL), fRawReader(NULL), @@ -337,6 +359,7 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fDiamondProfileSPD(rec.fDiamondProfileSPD), fDiamondProfile(rec.fDiamondProfile), fDiamondProfileTPC(rec.fDiamondProfileTPC), + fListOfCosmicTriggers(NULL), fGRPData(NULL), @@ -347,7 +370,6 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fInitCDBCalled(rec.fInitCDBCalled), fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled), fQADetectors(rec.fQADetectors), - fQAManager(NULL), fQATasks(rec.fQATasks), fRunQA(rec.fRunQA), fRunGlobalQA(rec.fRunGlobalQA), @@ -360,7 +382,9 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fhltesd(NULL), fesdf(NULL), ffile(NULL), + ffileF(NULL), ftree(NULL), + ftreeF(NULL), fhlttree(NULL), ftVertexer(NULL), fIsNewRunLoader(rec.fIsNewRunLoader), @@ -400,7 +424,6 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec) // TSelector members should not be touched if(&rec == this) return *this; - fUniformField = rec.fUniformField; fRunVertexFinder = rec.fRunVertexFinder; fRunVertexFinderTracks = rec.fRunVertexFinderTracks; fRunHLTTracking = rec.fRunHLTTracking; @@ -425,6 +448,11 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec) fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment; fGAliceFileName = rec.fGAliceFileName; fRawInput = rec.fRawInput; + fESDOutput = rec.fESDOutput; + fProofOutputFileName = rec.fProofOutputFileName; + fProofOutputLocation = rec.fProofOutputLocation; + fProofOutputDataset = rec.fProofOutputDataset; + fProofOutputArchive = rec.fProofOutputArchive; fEquipIdMap = rec.fEquipIdMap; fFirstEvent = rec.fFirstEvent; fLastEvent = rec.fLastEvent; @@ -443,6 +471,12 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec) fEventInfo = rec.fEventInfo; + delete fRunScalers; fRunScalers = NULL; + if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers); + + delete fCTPTimeParams; fCTPTimeParams = NULL; + if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams); + fRunLoader = NULL; fRawReader = NULL; fParentRawReader = NULL; @@ -469,6 +503,9 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec) delete fDiamondProfileTPC; fDiamondProfileTPC = NULL; if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC); + delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL; + if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone()); + delete fGRPData; fGRPData = NULL; // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone()); if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone()); @@ -481,7 +518,6 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec) fInitCDBCalled = rec.fInitCDBCalled; fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled; fQADetectors = rec.fQADetectors; - fQAManager = NULL; fQATasks = rec.fQATasks; fRunQA = rec.fRunQA; fRunGlobalQA = rec.fRunGlobalQA; @@ -494,7 +530,9 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec) fhltesd = NULL; fesdf = NULL; ffile = NULL; + ffileF = NULL; ftree = NULL; + ftreeF = NULL; fhlttree = NULL; ftVertexer = NULL; fIsNewRunLoader = rec.fIsNewRunLoader; @@ -510,14 +548,20 @@ AliReconstruction::~AliReconstruction() // clean up CleanUp(); + if (fListOfCosmicTriggers) { + fListOfCosmicTriggers->Delete(); + delete fListOfCosmicTriggers; + } delete fGRPData; + delete fRunScalers; + delete fCTPTimeParams; fOptions.Delete(); if (fAlignObjArray) { fAlignObjArray->Delete(); delete fAlignObjArray; } fSpecCDBUri.Delete(); - delete fQAManager; + AliCodeTimer::Instance()->Print(); } @@ -525,21 +569,21 @@ AliReconstruction::~AliReconstruction() void AliReconstruction::InitQA() { //Initialize the QA and start of cycle - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); if (fInitQACalled) return; fInitQACalled = kTRUE; - fQAManager = AliQAManager::QAManager("rec") ; + AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ; if (fWriteQAExpertData) - fQAManager->SetWriteExpert() ; + qam->SetWriteExpert() ; - if (fQAManager->IsDefaultStorageSet()) { + if (qam->IsDefaultStorageSet()) { AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); AliWarning("Default QA reference storage has been already set !"); AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data())); AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - fQARefUri = fQAManager->GetDefaultStorage()->GetURI(); + fQARefUri = qam->GetDefaultStorage()->GetURI(); } else { if (fQARefUri.Length() > 0) { AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); @@ -553,31 +597,31 @@ void AliReconstruction::InitQA() AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } - fQAManager->SetDefaultStorage(fQARefUri); + qam->SetDefaultStorage(fQARefUri); } if (fRunQA) { - fQAManager->SetActiveDetectors(fQADetectors) ; + qam->SetActiveDetectors(fQADetectors) ; for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) { - fQAManager->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ; - fQAManager->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ; + qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ; + qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ; } - if (!fRawReader && fQATasks.Contains(AliQAv1::kRAWS)) + if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS)) fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ; - fQAManager->SetTasks(fQATasks) ; - fQAManager->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ; + qam->SetTasks(fQATasks) ; + qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ; } if (fRunGlobalQA) { Bool_t sameCycle = kFALSE ; - AliQADataMaker *qadm = fQAManager->GetQADataMaker(AliQAv1::kGLOBAL); + AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL); AliInfo(Form("Initializing the global QA data maker")); - if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) { + if (IsInTasks(AliQAv1::kRECPOINTS)) { qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ; TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS); AliTracker::SetResidualsArray(arr); sameCycle = kTRUE ; } - if (fQATasks.Contains(Form("%d", AliQAv1::kESDS))) { + if (IsInTasks(AliQAv1::kESDS)) { qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ; qadm->Init(AliQAv1::kESDS); } @@ -586,15 +630,11 @@ void AliReconstruction::InitQA() } //_____________________________________________________________________________ -void AliReconstruction::MergeQA() +void AliReconstruction::MergeQA(const char *fileName) { //Initialize the QA and start of cycle - AliCodeTimerAuto("") ; - if ( ! fQAManager ) { - AliFatal("Hum... this should not happen") ; - } else { - fQAManager->Merge(AliCDBManager::Instance()->GetRun()) ; - } + AliCodeTimerAuto("",0) ; + AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ; AliSysInfo::AddStamp("MergeQA") ; } @@ -604,7 +644,7 @@ void AliReconstruction::InitCDB() // activate a default CDB storage // First check if we have any CDB storage set, because it is used // to retrieve the calibration and alignment constants - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); if (fInitCDBCalled) return; fInitCDBCalled = kTRUE; @@ -624,15 +664,21 @@ void AliReconstruction::InitCDB() AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data())); AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - } else { - fCDBUri="local://$ALICE_ROOT/OCDB"; + man->SetDefaultStorage(fCDBUri); + } + else if (!man->GetRaw()){ + fCDBUri="local://$ALICE_ROOT/OCDB"; AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); AliWarning("Default CDB storage not yet set !!!!"); AliWarning(Form("Setting it now to: %s", fCDBUri.Data())); AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - + man->SetDefaultStorage(fCDBUri); + } + else { + AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + AliWarning("Default storage will be set after setting the Run Number!!!"); + AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } - man->SetDefaultStorage(fCDBUri); } // Now activate the detector specific CDB storage locations @@ -852,6 +898,15 @@ void AliReconstruction::SetInput(const char* input) if (input) fRawInput = input; } +//_____________________________________________________________________________ +void AliReconstruction::SetOutput(const char* output) +{ + // Set the output ESD filename + // 'output' is a normalt ROOT url + // The method is used in case of raw-data reco with PROOF + if (output) fESDOutput = output; +} + //_____________________________________________________________________________ void AliReconstruction::SetOption(const char* detector, const char* option) { @@ -886,90 +941,6 @@ void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam } //_____________________________________________________________________________ -Bool_t AliReconstruction::SetFieldMap(Float_t l3Cur, Float_t diCur, Float_t l3Pol, - Float_t diPol, Float_t beamenergy, - const Char_t *beamtype, const Char_t *path) -{ - //------------------------------------------------ - // The magnetic field map, defined externally... - // L3 current 30000 A -> 0.5 T - // L3 current 12000 A -> 0.2 T - // dipole current 6000 A - // The polarities must be the same - //------------------------------------------------ - const Float_t l3NominalCurrent1=30000.; // (A) - const Float_t l3NominalCurrent2=12000.; // (A) - const Float_t diNominalCurrent =6000. ; // (A) - - const Float_t tolerance=0.03; // relative current tolerance - const Float_t zero=77.; // "zero" current (A) - // - TString s=(l3Pol < 0) ? "L3: -" : "L3: +"; - // - AliMagF::BMap_t map = AliMagF::k5kG; - // - double fcL3,fcDip; - // - l3Cur = TMath::Abs(l3Cur); - if (TMath::Abs(l3Cur-l3NominalCurrent1)/l3NominalCurrent1 < tolerance) { - fcL3 = l3Cur/l3NominalCurrent1; - map = AliMagF::k5kG; - s += "0.5 T; "; - } else if (TMath::Abs(l3Cur-l3NominalCurrent2)/l3NominalCurrent2 < tolerance) { - fcL3 = l3Cur/l3NominalCurrent2; - map = AliMagF::k2kG; - s += "0.2 T; "; - } else if (l3Cur <= zero) { - fcL3 = 0; - map = AliMagF::k5kGUniform; - s += "0.0 T; "; - fUniformField=kTRUE; // track with the uniform (zero) B field - } else { - AliError(Form("Wrong L3 current (%f A)!",l3Cur)); - return kFALSE; - } - // - diCur = TMath::Abs(diCur); - if (TMath::Abs(diCur-diNominalCurrent)/diNominalCurrent < tolerance) { - // 3% current tolerance... - fcDip = diCur/diNominalCurrent; - s += "Dipole ON"; - } else if (diCur <= zero) { // some small current.. - fcDip = 0.; - s += "Dipole OFF"; - } else { - AliError(Form("Wrong dipole current (%f A)!",diCur)); - return kFALSE; - } - // - if (l3Pol!=diPol && (map==AliMagF::k5kG || map==AliMagF::k2kG) && fcDip!=0) { - AliError("L3 and Dipole polarities must be the same"); - return kFALSE; - } - // - if (l3Pol<0) fcL3 = -fcL3; - if (diPol<0) fcDip = -fcDip; - // - AliMagF::BeamType_t btype = AliMagF::kNoBeamField; - TString btypestr = beamtype; - btypestr.ToLower(); - TPRegexp protonBeam("(proton|p)\\s*-?\\s*\\1"); - TPRegexp ionBeam("(lead|pb|ion|a)\\s*-?\\s*\\1"); - if (btypestr.Contains(ionBeam)) btype = AliMagF::kBeamTypeAA; - else if (btypestr.Contains(protonBeam)) btype = AliMagF::kBeamTypepp; - else { - AliInfo(Form("Cannot determine the beam type from %s, assume no LHC magnet field",beamtype)); - } - - AliMagF* fld = new AliMagF("MagneticFieldMap", s.Data(), 2, fcL3, fcDip, 10., map, path, - btype,beamenergy); - TGeoGlobalMagField::Instance()->SetField( fld ); - TGeoGlobalMagField::Instance()->Lock(); - // - return kTRUE; -} - - Bool_t AliReconstruction::InitGRP() { //------------------------------------ // Initialization of the GRP entry @@ -993,7 +964,11 @@ Bool_t AliReconstruction::InitGRP() { entry->SetOwner(0); } - AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data"); + // FIX ME: The unloading of GRP entry is temporarily disabled + // because ZDC and VZERO are using it in order to initialize + // their reconstructor objects. In the future one has to think + // of propagating AliRunInfo to the reconstructors. + // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data"); } if (!fGRPData) { @@ -1018,8 +993,6 @@ Bool_t AliReconstruction::InitGRP() { AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0"); beamEnergy = 0; } - // energy is provided in MeV*120 - beamEnergy /= 120E3; TString runType = fGRPData->GetRunType(); if (runType==AliGRPObject::GetInvalidString()) { @@ -1050,9 +1023,11 @@ Bool_t AliReconstruction::InitGRP() { fFillESD.Data(), fQADetectors.Data()); fLoadCDB = MatchDetectorList(fLoadCDB,detMask); - if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1)) { + if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) && + !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) && + !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) { // switch off the vertexer - AliInfo("SPD is not in the list of active detectors. Vertexer switched off."); + AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer switched off."); fRunVertexFinder = kFALSE; } if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) { @@ -1073,8 +1048,17 @@ Bool_t AliReconstruction::InitGRP() { AliInfo("==================================================================================="); //*** Dealing with the magnetic field map - if ( TGeoGlobalMagField::Instance()->IsLocked() ) {AliInfo("Running with the externally locked B field !");} - else { + if ( TGeoGlobalMagField::Instance()->IsLocked() ) { + if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) { + AliInfo("ExpertMode!!! GRP information will be ignored !"); + AliInfo("ExpertMode!!! Running with the externally locked B field !"); + } + else { + AliInfo("Destroying existing B field instance!"); + delete TGeoGlobalMagField::Instance(); + } + } + if ( !TGeoGlobalMagField::Instance()->IsLocked() ) { // Construct the field map out of the information retrieved from GRP. Bool_t ok = kTRUE; // L3 @@ -1103,42 +1087,22 @@ Bool_t AliReconstruction::InitGRP() { ok = kFALSE; } - /* - TObjString *l3Current= - dynamic_cast(fGRPData->GetValue("fL3Current")); - if (!l3Current) { - AliError("GRP/GRP/Data entry: missing value for the L3 current !"); - ok = kFALSE; - } - TObjString *l3Polarity= - dynamic_cast(fGRPData->GetValue("fL3Polarity")); - if (!l3Polarity) { - AliError("GRP/GRP/Data entry: missing value for the L3 polarity !"); - ok = kFALSE; - } - - // Dipole - TObjString *diCurrent= - dynamic_cast(fGRPData->GetValue("fDipoleCurrent")); - if (!diCurrent) { - AliError("GRP/GRP/Data entry: missing value for the dipole current !"); - ok = kFALSE; - } - TObjString *diPolarity= - dynamic_cast(fGRPData->GetValue("fDipolePolarity")); - if (!diPolarity) { - AliError("GRP/GRP/Data entry: missing value for the dipole polarity !"); - ok = kFALSE; - } - */ + // read special bits for the polarity convention and map type + Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008; + Bool_t uniformB = fGRPData->IsUniformBMap(); if (ok) { - if ( !SetFieldMap(l3Current, diCurrent, l3Polarity ? -1:1, diPolarity ? -1:1) ) - AliFatal("Failed to creat a B field map ! Exiting..."); - AliInfo("Running with the B field constructed out of GRP !"); + AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1), + TMath::Abs(diCurrent) * (diPolarity ? -1:1), + polConvention,uniformB,beamEnergy, beamType.Data()); + if (fld) { + TGeoGlobalMagField::Instance()->SetField( fld ); + TGeoGlobalMagField::Instance()->Lock(); + AliInfo("Running with the B field constructed out of GRP !"); + } + else AliFatal("Failed to create a B field map !"); } else AliFatal("B field is neither set nor constructed from GRP ! Exitig..."); - } //*** Get the diamond profiles from OCDB @@ -1163,13 +1127,28 @@ Bool_t AliReconstruction::InitGRP() { AliError("No TPC diamond profile found in OCDB!"); } + entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers"); + if (entry) { + fListOfCosmicTriggers = dynamic_cast(entry->GetObject()); + entry->SetOwner(0); + AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers"); + } + + if (!fListOfCosmicTriggers) { + AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!"); + } + return kTRUE; } //_____________________________________________________________________________ Bool_t AliReconstruction::LoadCDB() { - AliCodeTimerAuto(""); + // Load CDB entries for all active detectors. + // By default we load all the entries in /Calib + // folder. + + AliCodeTimerAuto("",0); AliCDBManager::Instance()->Get("GRP/CTP/Config"); @@ -1178,34 +1157,86 @@ Bool_t AliReconstruction::LoadCDB() if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet])); } + + // Temporary fix - one has to define the correct policy in order + // to load the trigger OCDB entries only for the detectors that + // in the trigger or that are needed in order to put correct + // information in ESD + AliCDBManager::Instance()->GetAll("TRIGGER/*/*"); + return kTRUE; } +//_____________________________________________________________________________ +Bool_t AliReconstruction::LoadTriggerScalersCDB() +{ + // Load CTP scalers from OCDB. + // The scalers are checked for consistency. + + AliCodeTimerAuto("",0); + AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers"); + + if (entry) { + + AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it"); + fRunScalers = dynamic_cast (entry->GetObject()); + entry->SetOwner(0); + if (fRunScalers->CorrectScalersOverflow() == 0) AliInfo("32bit Trigger counters corrected for overflow"); + + } + return kTRUE; +} +//_____________________________________________________________________________ +Bool_t AliReconstruction::LoadCTPTimeParamsCDB() +{ + // Load CTP timing information (alignment) + // from OCDB. + + AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming"); + + if (entry) { + + AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it"); + fCTPTimeParams = dynamic_cast (entry->GetObject()); + entry->SetOwner(0); + return kTRUE; + } + + return kFALSE; +} //_____________________________________________________________________________ Bool_t AliReconstruction::Run(const char* input) { // Run Run Run - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); InitRun(input); if (GetAbort() != TSelector::kContinue) return kFALSE; TChain *chain = NULL; if (fRawReader && (chain = fRawReader->GetChain())) { + Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1); // Proof mode if (gProof) { + // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised) + gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE); + + if (gGrid) + gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE); + + TMessage::EnableSchemaEvolutionForAll(kTRUE); + gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE); + gProof->AddInput(this); - TUrl outputFile; - outputFile.SetProtocol("root",kTRUE); - outputFile.SetHost(gSystem->HostName()); - outputFile.SetFile(Form("%s/AliESDs.root",gSystem->pwd())); - AliInfo(Form("Output file with ESDs is %s",outputFile.GetUrl())); - gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.GetUrl())); + + if (!ParseOutput()) return kFALSE; + + gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999); chain->SetProof(); - chain->Process("AliReconstruction"); + chain->Process("AliReconstruction","",nEntries,fFirstEvent); } else { - chain->Process(this); + chain->Process(this,"",nEntries,fFirstEvent); } } else { @@ -1236,14 +1267,21 @@ Bool_t AliReconstruction::Run(const char* input) //_____________________________________________________________________________ void AliReconstruction::InitRawReader(const char* input) { - AliCodeTimerAuto(""); - // Init raw-reader and // set the input in case of raw data + + AliCodeTimerAuto("",0); + if (input) fRawInput = input; fRawReader = AliRawReader::Create(fRawInput.Data()); - if (!fRawReader) - AliInfo("Reconstruction will run over digits"); + if (!fRawReader) { + if (fRawInput.IsNull()) { + AliInfo("Reconstruction will run over digits"); + } + else { + AliFatal("Can not create raw-data reader ! Exiting..."); + } + } if (!fEquipIdMap.IsNull() && fRawReader) fRawReader->LoadEquipmentIdsMap(fEquipIdMap); @@ -1267,7 +1305,7 @@ void AliReconstruction::InitRun(const char* input) { // Initialization of raw-reader, // run number, CDB etc. - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); AliSysInfo::AddStamp("Start"); // Initialize raw-reader if any @@ -1295,7 +1333,7 @@ void AliReconstruction::Begin(TTree *) // going into the event loop // Should follow the TSelector convention // i.e. initialize only the object on the client side - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); AliReconstruction *reco = NULL; if (fInput) { @@ -1342,6 +1380,18 @@ void AliReconstruction::Begin(TTree *) } AliSysInfo::AddStamp("LoadCDB"); + if (!LoadTriggerScalersCDB()) { + Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess); + return; + } + AliSysInfo::AddStamp("LoadTriggerScalersCDB"); + + if (!LoadCTPTimeParamsCDB()) { + Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess); + return; + } + AliSysInfo::AddStamp("LoadCTPTimeParamsCDB"); + // Read the reconstruction parameters from OCDB if (!InitRecoParams()) { AliWarning("Not all detectors have correct RecoParam objects initialized"); @@ -1351,6 +1401,7 @@ void AliReconstruction::Begin(TTree *) if (fInput && gProof) { if (reco) *reco = *this; + gGeoManager->SetName("Geometry"); gProof->AddInputData(gGeoManager,kTRUE); gGeoManager = NULL; gProof->AddInputData(const_cast(AliCDBManager::Instance()->GetEntryCache()),kTRUE); @@ -1368,10 +1419,12 @@ void AliReconstruction::SlaveBegin(TTree*) // Initialization related to run-loader, // vertexer, trackers, recontructors // In proof mode it is executed on the slave - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); TProofOutputFile *outProofFile = NULL; - if (fInput) { + if (fInput) { + if (AliDebugLevel() > 0) fInput->Print(); + if (AliDebugLevel() > 10) fInput->Dump(); if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) { *this = *reco; } @@ -1389,11 +1442,33 @@ void AliReconstruction::SlaveBegin(TTree*) } } if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) { - TGeoGlobalMagField::Instance()->SetField(map); - } - if (TNamed *outputFileName = (TNamed *) fInput->FindObject("PROOF_OUTPUTFILE")) { - outProofFile = new TProofOutputFile(gSystem->BaseName(TUrl(outputFileName->GetTitle()).GetFile())); - outProofFile->SetOutputFileName(outputFileName->GetTitle()); + AliMagF *newMap = new AliMagF(*map); + if (!newMap->LoadParameterization()) { + Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess); + return; + } + TGeoGlobalMagField::Instance()->SetField(newMap); + TGeoGlobalMagField::Instance()->Lock(); + } + if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE")) + fProofOutputFileName = outputFileName->GetTitle(); + if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION")) + fProofOutputLocation = outputLocation->GetTitle(); + if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET")) + fProofOutputDataset = kTRUE; + if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE")) + fProofOutputArchive = archiveList->GetTitle(); + if (!fProofOutputFileName.IsNull() && + !fProofOutputLocation.IsNull() && + fProofOutputArchive.IsNull()) { + if (!fProofOutputDataset) { + outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M"); + outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data())); + } + else { + outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data()); + } + if (AliDebugLevel() > 0) outProofFile->Dump(); fOutput->Add(outProofFile); } AliSysInfo::AddStamp("ReadInputInSlaveBegin"); @@ -1425,6 +1500,8 @@ void AliReconstruction::SlaveBegin(TTree*) } } else { + AliInfo(Form("Opening output PROOF file: %s/%s", + outProofFile->GetDir(), outProofFile->GetFileName())); if (!(ffile = outProofFile->OpenFile("RECREATE"))) { Abort(Form("Problems opening output PROOF file: %s/%s", outProofFile->GetDir(), outProofFile->GetFileName()), @@ -1436,29 +1513,24 @@ void AliReconstruction::SlaveBegin(TTree*) ftree = new TTree("esdTree", "Tree with ESD objects"); fesd = new AliESDEvent(); fesd->CreateStdContent(); + // add a so far non-std object to the ESD, this will + // become part of the std content + fesd->AddObject(new AliESDHLTDecision); fesd->WriteToTree(ftree); if (fWriteESDfriend) { - // careful: - // Since we add the branch manually we must - // book and add it after WriteToTree - // otherwise it is created twice, - // once via writetotree and once here. - // The case for AliESDfriend is now - // caught also in AlIESDEvent::WriteToTree but - // be careful when changing the name (AliESDfriend is not - // a TNamed so we had to hardwire it) - fesdf = new AliESDfriend(); - TBranch *br=ftree->Branch("ESDfriend.","AliESDfriend", &fesdf); - br->SetFile("AliESDfriends.root"); + ffileF = TFile::Open("AliESDfriends.root", "RECREATE"); + ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects"); + fesdf = new AliESDfriend(); + ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf); fesd->AddObject(fesdf); + ffile->cd(); } ftree->GetUserInfo()->Add(fesd); fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects"); fhltesd = new AliESDEvent(); fhltesd->CreateStdContent(); - // read the ESD template from CDB // HLT is allowed to put non-std content to its ESD, the non-std // objects need to be created before invocation of WriteToTree in @@ -1512,7 +1584,7 @@ Bool_t AliReconstruction::Process(Long64_t entry) { // run the reconstruction over a single entry // from the chain with raw data - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); TTree *currTree = fChain->GetTree(); AliRawVEvent *event = NULL; @@ -1530,6 +1602,8 @@ Bool_t AliReconstruction::Process(Long64_t entry) //_____________________________________________________________________________ void AliReconstruction::Init(TTree *tree) { + // Implementation of TSelector::Init() + // method if (tree == 0) { AliError("The input tree is not found!"); return; @@ -1543,7 +1617,17 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) // run the reconstruction over a single event // The event loop is steered in Run method - AliCodeTimerAuto(""); + + static Long_t oldMres=0; + static Long_t oldMvir=0; + static Float_t oldCPU=0; + static Long_t aveDMres=0; + static Long_t aveDMvir=0; + static Float_t aveDCPU=0; + + AliCodeTimerAuto("",0); + + AliESDpid pid; if (iEvent >= fRunLoader->GetNumberOfEvents()) { fRunLoader->SetEventNumber(iEvent); @@ -1558,14 +1642,21 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) return kTRUE; } - AliInfo(Form("processing event %d", iEvent)); fRunLoader->GetEvent(iEvent); // Fill Event-info object GetEventInfo(); - fRecoParam.SetEventSpecie(fRunInfo,fEventInfo); - AliInfo(Form("Current event specie: %s",fRecoParam.PrintEventSpecie())); + fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers); + + ProcInfo_t procInfo; + if(iEvent==fFirstEvent) { + gSystem->GetProcInfo(&procInfo); + oldMres=procInfo.fMemResident; + oldMvir=procInfo.fMemVirtual; + oldCPU=procInfo.fCpuUser+procInfo.fCpuSys; + } + AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie())); // Set the reco-params { @@ -1576,17 +1667,25 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) { const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet); reconstructor->SetRecoParam(par); + reconstructor->GetPidSettings(&pid); + reconstructor->SetEventInfo(&fEventInfo); if (fRunQA) { - fQAManager->SetRecoParam(iDet, par) ; + AliQAManager::QAManager()->SetRecoParam(iDet, par) ; + if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ; } } } + if (fRunQA) { + const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors); + AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ; + AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ; + } } // QA on single raw - if (fRunQA) { - fQAManager->SetEventSpecie(fRecoParam.GetEventSpecie()) ; - fQAManager->RunOneEvent(fRawReader) ; + if (fRunQA && IsInTasks(AliQAv1::kRAWS)) { + AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ; + AliQAManager::QAManager()->RunOneEvent(fRawReader) ; } // local single event reconstruction if (!fRunLocalReconstruction.IsNull()) { @@ -1600,19 +1699,56 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) detectors=fRunLocalReconstruction; detectors.ReplaceAll("HLT", ""); if (!RunLocalEventReconstruction(detectors)) { - if (fStopOnError) {CleanUp(); return kFALSE;} + if (fStopOnError) { + CleanUp(); + return kFALSE; + } } } + + // fill Event header information from the RawEventHeader + if (fRawReader){FillRawEventHeaderESD(fesd);} + if (fRawReader){FillRawEventHeaderESD(fhltesd);} + fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun()); fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun()); + + ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask()); + ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask()); + ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data())); + ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data())); + fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun()); fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun()); + + fesd->SetEventSpecie(fRecoParam.GetEventSpecie()); + fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie()); // Set magnetic field from the tracker fesd->SetMagneticField(AliTracker::GetBz()); fhltesd->SetMagneticField(AliTracker::GetBz()); - + // + ((AliESDRun*)fesd->GetESDRun())->SetBeamEnergyIsSqrtSHalfGeV(); + ((AliESDRun*)fhltesd->GetESDRun())->SetBeamEnergyIsSqrtSHalfGeV(); + // + 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(); + } + // // Set most probable pt, for B=0 tracking // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam const AliGRPRecoParam *grpRecoParam = dynamic_cast(fRecoParam.GetDetRecoParam(kNDetectors)); @@ -1646,7 +1782,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) // barrel tracking if (!fRunTracking.IsNull()) { - if (!RunTracking(fesd)) { + if (!RunTracking(fesd,pid)) { if (fStopOnError) {CleanUp(); return kFALSE;} } } @@ -1674,18 +1810,20 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) if (fStopOnError) {CleanUp(); return kFALSE;} } } - - // fill Event header information from the RawEventHeader - if (fRawReader){FillRawEventHeaderESD(fesd);} - + // combined PID - AliESDpid::MakePID(fesd); + pid.MakePID(fesd); if (fFillTriggerESD) { if (!FillTriggerESD(fesd)) { if (fStopOnError) {CleanUp(); return kFALSE;} } } + // Always fill scalers + if (!FillTriggerScalers(fesd)) { + if (fStopOnError) {CleanUp(); return kFALSE;} + } + ffile->cd(); @@ -1693,7 +1831,6 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) // Propagate track to the beam pipe (if not already done by ITS) // const Int_t ntracks = fesd->GetNumberOfTracks(); - const Double_t kBz = fesd->GetMagneticField(); const Double_t kRadius = 2.8; //something less than the beam pipe radius TObjArray trkArray; @@ -1711,7 +1848,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) ok = kFALSE; if (tpcTrack) ok = AliTracker:: - PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE); + PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE); if (ok) { Int_t n=trkArray.GetEntriesFast(); @@ -1723,8 +1860,10 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) if (track->IsOn(AliESDtrack::kITSrefit)) continue; AliTracker:: - PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kFALSE); - track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kVeryBig); + PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE); + Double_t x[3]; track->GetXYZ(x); + Double_t b[3]; AliTracker::GetBxByBz(x,b); + track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig); } @@ -1744,24 +1883,41 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) ftVertexer->SetITSMode(); ftVertexer->SetConstraintOff(); // get cuts for vertexer from AliGRPRecoParam + Bool_t constrSPD=kFALSE; if (grpRecoParam) { Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts(); Double_t *cutsVertexer = new Double_t[nCutsVertexer]; grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer); ftVertexer->SetCuts(cutsVertexer); delete [] cutsVertexer; cutsVertexer = NULL; - if(fDiamondProfile && grpRecoParam->GetVertexerTracksConstraintITS()) - ftVertexer->SetVtxStart(fDiamondProfile); + if(grpRecoParam->GetVertexerTracksConstraintITS()) { + if(fDiamondProfile && fDiamondProfile->GetXRes()SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius + }else{ + if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()SetVtxStart(fDiamondProfileSPD); + constrSPD=kTRUE; + } + } + } } AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd); if (pvtx) { + if(constrSPD){ + TString title=pvtx->GetTitle(); + title.Append("SPD"); + pvtx->SetTitle(title); + } if (pvtx->GetStatus()) { fesd->SetPrimaryVertexTracks(pvtx); for (Int_t i=0; iGetTrack(i); - t->RelateToVertex(pvtx, kBz, kVeryBig); + Double_t x[3]; t->GetXYZ(x); + Double_t b[3]; AliTracker::GetBxByBz(x,b); + t->RelateToVertexBxByBz(pvtx, b, kVeryBig); } } + delete pvtx; pvtx=NULL; } // TPC-only primary vertex @@ -1774,8 +1930,9 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer); ftVertexer->SetCuts(cutsVertexer); delete [] cutsVertexer; cutsVertexer = NULL; - if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) - ftVertexer->SetVtxStart(fDiamondProfileTPC); + if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) { + if(fDiamondProfileTPC->GetXRes()SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius + } } pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx); if (pvtx) { @@ -1783,16 +1940,19 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) fesd->SetPrimaryVertexTPC(pvtx); for (Int_t i=0; iGetTrack(i); - t->RelateToVertexTPC(pvtx, kBz, kVeryBig); + Double_t x[3]; t->GetXYZ(x); + Double_t b[3]; AliTracker::GetBxByBz(x,b); + t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig); } } + delete pvtx; pvtx=NULL; } } delete[] selectedIdx; - if(fDiamondProfile) fesd->SetDiamond(fDiamondProfile); - + if(fDiamondProfile && fDiamondProfile->GetXRes()SetDiamond(fDiamondProfile); + else fesd->SetDiamond(fDiamondProfileSPD); if (fRunV0Finder) { // V0 finding @@ -1809,27 +1969,36 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) // write ESD if (fCleanESD) CleanESD(fesd); - if (fRunQA) { - fQAManager->SetEventSpecie(fRecoParam.GetEventSpecie()) ; - fQAManager->RunOneEvent(fesd) ; + if (fRunQA && IsInTasks(AliQAv1::kESDS)) { + AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ; + AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ; } if (fRunGlobalQA) { - AliQADataMaker *qadm = fQAManager->GetQADataMaker(AliQAv1::kGLOBAL); + AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL); qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ; - if (qadm && fQATasks.Contains(Form("%d", AliQAv1::kESDS))) + if (qadm && IsInTasks(AliQAv1::kESDS)) qadm->Exec(AliQAv1::kESDS, fesd); } - if (fWriteESDfriend) { - // fesdf->~AliESDfriend(); - // new (fesdf) AliESDfriend(); // Reset... + // copy HLT decision from HLTesd to esd + // the most relevant information is stored in a reduced container in the esd, + // while the full information can be found in the HLTesd + TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name()); + TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name()); + if (pHLTSrc && pHLTTgt) { + pHLTSrc->Copy(*pHLTTgt); + } + + if (fWriteESDfriend) fesd->GetESDfriend(fesdf); - } + ftree->Fill(); + if (fWriteESDfriend) ftreeF->Fill(); // 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(); } @@ -1847,18 +2016,30 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent) new (fesdf) AliESDfriend(); // Reset... } - ProcInfo_t procInfo; gSystem->GetProcInfo(&procInfo); - AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, procInfo.fMemResident, procInfo.fMemVirtual)); + Long_t dMres=(procInfo.fMemResident-oldMres)/1024; + Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024; + Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU; + 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> ===================", + iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU)); + oldMres=procInfo.fMemResident; + oldMvir=procInfo.fMemVirtual; + oldCPU=procInfo.fCpuUser+procInfo.fCpuSys; fEventInfo.Reset(); for (Int_t iDet = 0; iDet < kNDetectors; iDet++) { - if (fReconstructor[iDet]) + if (fReconstructor[iDet]) { fReconstructor[iDet]->SetRecoParam(NULL); + fReconstructor[iDet]->SetEventInfo(NULL); + } + if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL); } if (fRunQA || fRunGlobalQA) - fQAManager->Increment() ; + AliQAManager::QAManager()->Increment() ; return kTRUE; } @@ -1869,7 +2050,7 @@ void AliReconstruction::SlaveTerminate() // Finalize the run on the slave side // Called after the exit // from the event loop - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); if (fIsNewRunLoader) { // galice.root didn't exist fRunLoader->WriteHeader("OVERWRITE"); @@ -1909,11 +2090,14 @@ void AliReconstruction::SlaveTerminate() ffile->cd(); - if (fWriteESDfriend) - ftree->SetBranchStatus("ESDfriend*",0); // we want to have only one tree version number ftree->Write(ftree->GetName(),TObject::kOverwrite); - fhlttree->Write(); + fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite); + + if (fWriteESDfriend) { + ffileF->cd(); + ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite); + } // Finish with Plane Efficiency evaluation: before of CleanUp !!! if (fRunPlaneEff && !FinishPlaneEff()) { @@ -1921,21 +2105,53 @@ void AliReconstruction::SlaveTerminate() } // End of cycle for the in-loop - if (fRunQA) - fQAManager->EndOfCycle() ; - - if (fRunGlobalQA) { - AliQADataMaker *qadm = fQAManager->GetQADataMaker(AliQAv1::kGLOBAL); - if (qadm) { - if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) - qadm->EndOfCycle(AliQAv1::kRECPOINTS); - if (fQATasks.Contains(Form("%d", AliQAv1::kESDS))) - qadm->EndOfCycle(AliQAv1::kESDS); - qadm->Finish(); + + if (fRunQA || fRunGlobalQA) { + AliQAManager::QAManager()->EndOfCycle() ; + if (fInput && + !fProofOutputLocation.IsNull() && + fProofOutputArchive.IsNull() && + !fProofOutputDataset) { + TString qaOutputFile(Form("%sMerged.%s.Data.root", + fProofOutputLocation.Data(), + AliQAv1::GetQADataFileName())); + TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root", + AliQAv1::GetQADataFileName())); + qaProofFile->SetOutputFileName(qaOutputFile.Data()); + if (AliDebugLevel() > 0) qaProofFile->Dump(); + fOutput->Add(qaProofFile); + MergeQA(qaProofFile->GetFileName()); + } + else { + MergeQA(); } } + gROOT->cd(); CleanUp(); + + if (fInput) { + if (!fProofOutputFileName.IsNull() && + !fProofOutputLocation.IsNull() && + fProofOutputDataset && + !fProofOutputArchive.IsNull()) { + TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(), + "DROV", + fProofOutputLocation.Data()); + if (AliDebugLevel() > 0) zipProofFile->Dump(); + fOutput->Add(zipProofFile); + TString fileList(fProofOutputArchive.Data()); + fileList.ReplaceAll(","," "); + TString command; +#if ROOT_SVN_REVISION >= 30174 + command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data()); +#else + command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data()); +#endif + AliInfo(Form("Executing: %s",command.Data())); + gSystem->Exec(command.Data()); + } + } } //_____________________________________________________________________________ @@ -1943,10 +2159,14 @@ void AliReconstruction::Terminate() { // Create tags for the events in the ESD tree (the ESD tree is always present) // In case of empty events the tags will contain dummy values - AliCodeTimerAuto(""); + AliCodeTimerAuto("",0); - AliESDTagCreator *esdtagCreator = new AliESDTagCreator(); - esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies); + // Do not call the ESD tag creator in case of PROOF-based reconstruction + if (!fInput) { + AliESDTagCreator *esdtagCreator = new AliESDTagCreator(); + esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies); + delete esdtagCreator; + } // Cleanup of CDB manager: cache and active storages! AliCDBManager::Instance()->ClearCache(); @@ -1958,7 +2178,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) // run the local reconstruction static Int_t eventNr=0; - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) TString detStr = detectors; for (Int_t iDet = 0; iDet < kNDetectors; iDet++) { @@ -1970,10 +2190,10 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) // although the HLT loader is missing if (strcmp(fgkDetectorName[iDet], "HLT")==0) { if (fRawReader) { - reconstructor->Reconstruct(fRawReader, NULL); + reconstructor->Reconstruct(fRawReader, NULL); } else { - TTree* dummy=NULL; - reconstructor->Reconstruct(dummy, NULL); + TTree* dummy=NULL; + reconstructor->Reconstruct(dummy, NULL); } continue; } @@ -1986,7 +2206,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) AliInfo(Form("converting raw data digits into root objects for %s", fgkDetectorName[iDet])); // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s", -// fgkDetectorName[iDet])); +// fgkDetectorName[iDet]),0); loader->LoadDigits("update"); loader->CleanDigits(); loader->MakeDigitsContainer(); @@ -1997,7 +2217,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) } // local reconstruction AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet])); - //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet])); + //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0); loader->LoadRecPoints("update"); loader->CleanRecPoints(); loader->MakeRecPointsContainer(); @@ -2008,27 +2228,32 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) loader->LoadDigits("read"); TTree* digitsTree = loader->TreeD(); if (!digitsTree) { - AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet])); - if (fStopOnError) return kFALSE; + AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet])); + if (fStopOnError) + return kFALSE; } else { - reconstructor->Reconstruct(digitsTree, clustersTree); + reconstructor->Reconstruct(digitsTree, clustersTree); + if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) { + AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ; + AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ; + } } loader->UnloadDigits(); } - - TString detQAStr(fQADetectors) ; - if (fRunQA) { - fQAManager->SetEventSpecie(fRecoParam.GetEventSpecie()) ; - fQAManager->RunOneEventInOneDetector(iDet, clustersTree) ; + if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) { + AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ; + AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ; } - loader->WriteRecPoints("OVERWRITE"); - loader->UnloadRecPoints(); - AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr); + loader->WriteRecPoints("OVERWRITE"); + loader->UnloadRecPoints(); + AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr); } + IsSelected("CTP", detStr); if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) { AliError(Form("the following detectors were not found: %s", detStr.Data())); - if (fStopOnError) return kFALSE; + if (fStopOnError) + return kFALSE; } eventNr++; return kTRUE; @@ -2038,7 +2263,7 @@ Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd) { // run the SPD trackleting (for SPD efficiency purpouses) - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) Double_t vtxPos[3] = {0, 0, 0}; Double_t vtxErr[3] = {0.0, 0.0, 0.0}; @@ -2071,7 +2296,7 @@ Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd) fSPDTrackleter->SetVertex(vtxPos, vtxErr); // run trackleting if (fSPDTrackleter->Clusters2Tracks(esd) != 0) { - AliError("AliITSTrackleterSPDEff Clusters2Tracks failed"); + AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed"); // fLoader[0]->UnloadRecPoints(); return kFALSE; } @@ -2088,12 +2313,12 @@ Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd) { // run the barrel tracking - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) AliVertexer *vertexer = CreateVertexer(); if (!vertexer) return kFALSE; - AliInfo("running the ITS vertex finder"); + AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName())); AliESDVertex* vertex = NULL; if (fLoader[0]) { fLoader[0]->LoadRecPoints(); @@ -2150,7 +2375,7 @@ Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd) { // run the HLT barrel tracking - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) if (!fRunLoader) { AliError("Missing runLoader!"); @@ -2206,7 +2431,7 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd) { // run the muon spectrometer tracking - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) if (!fRunLoader) { AliError("Missing runLoader!"); @@ -2236,31 +2461,41 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd) Int_t rv = tracker->Clusters2Tracks(esd); - if ( rv ) - { - AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet])); - return kFALSE; - } - fLoader[iDet]->UnloadRecPoints(); tracker->UnloadClusters(); delete tracker; + if ( rv ) + { + AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet])); + return kFALSE; + } + return kTRUE; } //_____________________________________________________________________________ -Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) +Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID) { // run the barrel tracking static Int_t eventNr=0; - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) AliInfo("running tracking"); + // Set the event info which is used + // by the trackers in order to obtain + // information about read-out detectors, + // trigger etc. + AliDebug(1, "Setting event info"); + for (Int_t iDet = 0; iDet < kNDetectors; iDet++) { + if (!fTracker[iDet]) continue; + fTracker[iDet]->SetEventInfo(&fEventInfo); + } + //Fill the ESD with the T0 info (will be used by the TOF) if (fReconstructor[11] && fLoader[11]) { fLoader[11]->LoadRecPoints("READ"); @@ -2293,7 +2528,7 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) // preliminary PID in TPC needed by the ITS tracker if (iDet == 1) { GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd); - AliESDpid::MakePID(esd); + PID.MakePID(esd,kTRUE); } AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr); } @@ -2311,8 +2546,8 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr); tree = fLoader[iDet]->TreeR(); if (!tree) { - AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet])); - return kFALSE; + AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet])); + return kFALSE; } fTracker[iDet]->LoadClusters(tree); AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr); @@ -2320,8 +2555,18 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) // run tracking if (iDet>1) // start filling residuals for the "outer" detectors - if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE); - + if (fRunGlobalQA) { + AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE); + TObjArray ** arr = AliTracker::GetResidualsArray() ; + if (arr) { + AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie(); + TObjArray * elem = arr[AliRecoParam::AConvert(es)]; + if ( elem && (! elem->At(0)) ) { + AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL); + if (qadm) qadm->InitRecPointsForTracker() ; + } + } + } if (fTracker[iDet]->PropagateBack(esd) != 0) { AliError(Form("%s backward propagation failed", fgkDetectorName[iDet])); // return kFALSE; @@ -2334,8 +2579,9 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) } // updated PID in TPC needed by the ITS tracker -MI if (iDet == 1) { - GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd); - AliESDpid::MakePID(esd); + //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd); + //AliESDpid::MakePID(esd); + PID.MakePID(esd,kTRUE); } AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr); } @@ -2350,8 +2596,19 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) // run tracking if (iDet<2) // start filling residuals for TPC and ITS - if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE); - + if (fRunGlobalQA) { + AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE); + TObjArray ** arr = AliTracker::GetResidualsArray() ; + if (arr) { + AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie(); + TObjArray * elem = arr[AliRecoParam::AConvert(es)]; + if ( elem && (! elem->At(0)) ) { + AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL); + if (qadm) qadm->InitRecPointsForTracker() ; + } + } + } + if (fTracker[iDet]->RefitInward(esd) != 0) { AliError(Form("%s inward refit failed", fgkDetectorName[iDet])); // return kFALSE; @@ -2411,10 +2668,11 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors) { // fill the event summary data - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) static Int_t eventNr=0; TString detStr = detectors; + AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr); for (Int_t iDet = 0; iDet < kNDetectors; iDet++) { if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; AliReconstructor* reconstructor = GetReconstructor(iDet); @@ -2450,13 +2708,14 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors) fLoader[iDet]->UnloadRecPoints(); } } - + + IsSelected("CTP", detStr); if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) { AliError(Form("the following detectors were not found: %s", detStr.Data())); if (fStopOnError) return kFALSE; } - AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr); + AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr); eventNr++; return kTRUE; } @@ -2468,7 +2727,7 @@ Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd) // stored in Trigger.root file and fills // the corresponding esd entries - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) AliInfo("Filling trigger information into the ESD"); @@ -2487,19 +2746,38 @@ Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd) if (esd->GetBunchCrossNumber() != input.GetBCID()) AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x", input.GetBCID(),esd->GetBunchCrossNumber())); + AliESDHeader* esdheader = esd->GetHeader(); + esdheader->SetL0TriggerInputs(input.GetL0Inputs()); + esdheader->SetL1TriggerInputs(input.GetL1Inputs()); + esdheader->SetL2TriggerInputs(input.GetL2Inputs()); + // IR + UInt_t orbit=input.GetOrbitID(); + for(Int_t i=0 ; iGetOrbit()))<=1){ + esdheader->AddTriggerIR(input.GetIR(i)); + } } - - // Here one has to add the filling of trigger inputs and - // interaction records - // ... } return kTRUE; } - - - - - +//_____________________________________________________________________________ +Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd) +{ + //Scalers + //fRunScalers->Print(); + if(fRunScalers && fRunScalers->CheckRunScalers()){ + AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber()); + //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238); + AliESDHeader* esdheader = fesd->GetHeader(); + for(Int_t i=0;i<50;i++){ + if((1ull<GetTriggerMask()){ + AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1); + if(scalesd)esdheader->SetTriggerScalersRecord(scalesd); + } + } + } + return kTRUE; +} //_____________________________________________________________________________ Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd) { @@ -2563,7 +2841,12 @@ Bool_t AliReconstruction::InitRunLoader() if (gAlice) delete gAlice; gAlice = NULL; - if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists + TFile *gafile = TFile::Open(fGAliceFileName.Data()); + // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists + if (gafile) { // galice.root exists + gafile->Close(); + delete gafile; + // load all base libraries to get the loader classes TString libs = gSystem->GetLibraries(); for (Int_t iDet = 0; iDet < kNDetectors; iDet++) { @@ -2621,6 +2904,7 @@ AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet) if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) { const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet); fReconstructor[iDet]->SetRecoParam(par); + fReconstructor[iDet]->SetRunInfo(fRunInfo); } return fReconstructor[iDet]; } @@ -2656,6 +2940,7 @@ AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet) if (reconstructor) { TObject* obj = fOptions.FindObject(detName.Data()); if (obj) reconstructor->SetOption(obj->GetTitle()); + reconstructor->SetRunInfo(fRunInfo); reconstructor->Init(); fReconstructor[iDet] = reconstructor; } @@ -2702,6 +2987,7 @@ AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet) if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) { const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet); reconstructor->SetRecoParam(par); + reconstructor->SetRunInfo(fRunInfo); } return reconstructor; } @@ -2715,7 +3001,7 @@ AliVertexer* AliReconstruction::CreateVertexer() AliVertexer* vertexer = NULL; AliReconstructor* itsReconstructor = GetReconstructor(0); - if (itsReconstructor) { + if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || fRunTracking.Contains("ITS"))) { vertexer = itsReconstructor->CreateVertexer(); } if (!vertexer) { @@ -2779,14 +3065,6 @@ void AliReconstruction::CleanUp() delete ftVertexer; ftVertexer = NULL; - if(!(AliCDBManager::Instance()->GetCacheFlag())) { - delete fDiamondProfileSPD; - fDiamondProfileSPD = NULL; - delete fDiamondProfile; - fDiamondProfile = NULL; - delete fDiamondProfileTPC; - fDiamondProfileTPC = NULL; - } delete fRunLoader; fRunLoader = NULL; delete fRawReader; @@ -2799,6 +3077,11 @@ void AliReconstruction::CleanUp() delete ffile; ffile = NULL; } + + if (AliQAManager::QAManager()) + AliQAManager::QAManager()->ShowQA() ; + AliQAManager::Destroy() ; + } void AliReconstruction::WriteAlignmentData(AliESDEvent* esd) @@ -2814,9 +3097,9 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd) Int_t idx[200]; for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters - nsp += track->GetNcls(iDet); + nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet); - if (iDet==0) { // ITS "extra" clusters + if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters track->GetClusters(iDet,idx); for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++; } @@ -2829,9 +3112,9 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd) for (Int_t iDet = 5; iDet >= 0; iDet--) { AliTracker *tracker = fTracker[iDet]; if (!tracker) continue; - Int_t nspdet = track->GetClusters(iDet,idx); + Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx); - if (iDet==0) // ITS "extra" clusters + if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++; if (nspdet <= 0) continue; @@ -2855,7 +3138,7 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd) } isp2++; if (!isvalid) continue; - if (iDet==0 && (isp-1)>=6) p.SetExtra(); + if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra(); sp->AddPoint(isptrack,&p); isptrack++; } } @@ -2886,8 +3169,8 @@ void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd) } //_____________________________________________________________________________ -void AliReconstruction::CheckQA() -{ +// void AliReconstruction::CheckQA() +// { // check the QA of SIM for this run and remove the detectors // with status Fatal @@ -2922,7 +3205,7 @@ void AliReconstruction::CheckQA() // fRunLocalReconstruction = newRunLocalReconstruction ; // fRunTracking = newRunTracking ; // fFillESD = newFillESD ; -} +// } //_____________________________________________________________________________ Int_t AliReconstruction::GetDetIndex(const char* detector) @@ -2949,9 +3232,10 @@ Bool_t AliReconstruction::FinishPlaneEff() { // Return: kTRUE if all operations have been done properly, kFALSE otherwise // Bool_t ret=kFALSE; + TString detStr = fLoadCDB; //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS - //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; + if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) { AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff(); TString name=planeeff->GetName(); @@ -2991,17 +3275,18 @@ Bool_t AliReconstruction::InitPlaneEff() { // Input: none // Return: kTRUE if all operations have been done properly, kFALSE otherwise // - AliWarning(Form("Implementation of this method not yet completed !! Method return kTRUE")); fSPDTrackleter = NULL; - AliReconstructor* itsReconstructor = GetReconstructor(0); - if (itsReconstructor) { - fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam - } - if (fSPDTrackleter) { - AliInfo("Trackleter for SPD has been created"); + TString detStr = fLoadCDB; + if (IsSelected(fgkDetectorName[0], detStr)) { + AliReconstructor* itsReconstructor = GetReconstructor(0); + if (itsReconstructor) { + fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam + } + if (fSPDTrackleter) { + AliInfo("Trackleter for SPD has been created"); + } } - return kTRUE; } @@ -3045,7 +3330,7 @@ void AliReconstruction::RunAliEVE() Bool_t AliReconstruction::SetRunQA(TString detAndAction) { // Allows to run QA for a selected set of detectors - // and a selected set of tasks among RAWS, RECPOINTS and ESDS + // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS // all selected detectors run the same selected tasks if (!detAndAction.Contains(":")) { @@ -3055,16 +3340,16 @@ Bool_t AliReconstruction::SetRunQA(TString detAndAction) } Int_t colon = detAndAction.Index(":") ; fQADetectors = detAndAction(0, colon) ; - if (fQADetectors.Contains("ALL") ) - fQADetectors = fFillESD ; - fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ; + fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ; if (fQATasks.Contains("ALL") ) { - fQATasks = Form("%d %d %d", AliQAv1::kRAWS, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ; + fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ; } else { fQATasks.ToUpper() ; TString tempo("") ; if ( fQATasks.Contains("RAW") ) tempo = Form("%d ", AliQAv1::kRAWS) ; + if ( fQATasks.Contains("DIGIT") ) + tempo += Form("%d ", AliQAv1::kDIGITSR) ; if ( fQATasks.Contains("RECPOINT") ) tempo += Form("%d ", AliQAv1::kRECPOINTS) ; if ( fQATasks.Contains("ESD") ) @@ -3078,6 +3363,7 @@ Bool_t AliReconstruction::SetRunQA(TString detAndAction) } TString tempo(fQATasks) ; tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ; + tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ; tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ; tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ; AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ; @@ -3093,6 +3379,40 @@ Bool_t AliReconstruction::InitRecoParams() Bool_t isOK = kTRUE; + if (fRecoParam.GetDetRecoParamArray(kNDetectors)) { + AliInfo("Using custom GRP reconstruction parameters"); + } + else { + AliInfo("Loading GRP reconstruction parameter objects"); + + AliCDBPath path("GRP","Calib","RecoParam"); + AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath()); + if(!entry){ + AliWarning("Couldn't find GRP RecoParam entry in OCDB"); + isOK = kFALSE; + } + else { + TObject *recoParamObj = entry->GetObject(); + if (dynamic_cast(recoParamObj)) { + // GRP has a normal TobjArray of AliDetectorRecoParam objects + // Registering them in AliRecoParam + fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast(recoParamObj)); + } + else if (dynamic_cast(recoParamObj)) { + // GRP has only onse set of reco parameters + // Registering it in AliRecoParam + AliInfo("Single set of GRP reconstruction parameters found"); + dynamic_cast(recoParamObj)->SetAsDefault(); + fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast(recoParamObj)); + } + else { + AliError("No valid GRP RecoParam object found in the OCDB"); + isOK = kFALSE; + } + entry->SetOwner(0); + } + } + TString detStr = fLoadCDB; for (Int_t iDet = 0; iDet < kNDetectors; iDet++) { @@ -3130,7 +3450,11 @@ Bool_t AliReconstruction::InitRecoParams() isOK = kFALSE; } entry->SetOwner(0); - AliCDBManager::Instance()->UnloadFromCache(path.GetPath()); + // FIX ME: We have to disable the unloading of reco-param CDB + // entries because QA framework is using them. Has to be fix in + // a way that the QA takes the objects already constructed in + // this method. + // AliCDBManager::Instance()->UnloadFromCache(path.GetPath()); } } @@ -3144,7 +3468,7 @@ Bool_t AliReconstruction::GetEventInfo() { // Fill the event info object // ... - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) AliCentralTrigger *aCTP = NULL; if (fRawReader) { @@ -3171,6 +3495,11 @@ Bool_t AliReconstruction::GetEventInfo() if (fRunLoader && (!fRunLoader->LoadTrigger())) { aCTP = fRunLoader->GetTrigger(); fEventInfo.SetTriggerMask(aCTP->GetClassMask()); + // get inputs from actp - just get + AliESDHeader* esdheader = fesd->GetHeader(); + esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs()); + esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs()); + esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs()); fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask())); } else { @@ -3193,11 +3522,11 @@ Bool_t AliReconstruction::GetEventInfo() Int_t nclasses = classesArray.GetEntriesFast(); for( Int_t iclass=0; iclass < nclasses; iclass++ ) { AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass); - if (trclass) { + if (trclass && trclass->GetMask()>0) { Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask())); fesd->SetTriggerClass(trclass->GetName(),trindex); if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex); - if (trmask & (1 << trindex)) { + if (trmask & (1ull << trindex)) { trclasses += " "; trclasses += trclass->GetName(); trclasses += " "; @@ -3207,6 +3536,21 @@ Bool_t AliReconstruction::GetEventInfo() } fEventInfo.SetTriggerClasses(trclasses); + // Write names of active trigger inputs in ESD Header + const TObjArray& inputsArray = config->GetInputs(); + Int_t ninputs = inputsArray.GetEntriesFast(); + for( Int_t iinput=0; iinput < ninputs; iinput++ ) { + AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput); + if (trginput && trginput->GetMask()>0) { + Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask())); + AliESDHeader* headeresd = fesd->GetHeader(); + Int_t trglevel = (Int_t)trginput->GetLevel(); + if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex); + if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24); + if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48); + } + } + // Set the information in ESD fesd->SetTriggerMask(trmask); fesd->SetTriggerCluster(clustmask); @@ -3311,3 +3655,82 @@ void AliReconstruction::Abort(const char *method, EAbort what) Info(mess, whyMess.Data()); } +//______________________________________________________________________________ +Bool_t AliReconstruction::ProcessEvent(void* event) +{ + // Method that is used in case the event loop + // is steered from outside, for example by AMORE + // 'event' is a pointer to the DATE event in the memory + + if (fRawReader) delete fRawReader; + fRawReader = new AliRawReaderDate(event); + fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents()); + delete fRawReader; + fRawReader = NULL; + + return fStatus; +} + +//______________________________________________________________________________ +Bool_t AliReconstruction::ParseOutput() +{ + // The method parses the output file + // location string in order to steer + // properly the selector + + TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)"); + TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)"); + + if (re1.Match(fESDOutput) == 4) { + // root archive with output files stored and regustered + // in proof dataset + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data())); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data())); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET","")); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data())); + AliInfo(Form("%s files will be stored within %s in dataset %s", + re1[2].Data(), + re1[1].Data(), + re1[3].Data())); + } + else if (re2.Match(fESDOutput) == 3) { + // output file stored and registered + // in proof dataset + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data())); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data())); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET","")); + AliInfo(Form("%s will be stored in dataset %s", + (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(), + re2[2].Data())); + } + else { + if (fESDOutput.IsNull()) { + // Output location not given. + // Assuming xrootd has been already started and + // the output file has to be sent back + // to the client machine + TString esdUrl(Form("root://%s/%s/", + TUrl(gSystem->HostName()).GetHostFQDN(), + gSystem->pwd())); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root")); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data())); + AliInfo(Form("AliESDs.root will be stored in %s", + esdUrl.Data())); + } + else { + // User specified an output location. + // Ones has just to parse it here + TUrl outputUrl(fESDOutput.Data()); + TString outputFile(gSystem->BaseName(outputUrl.GetFile())); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data())); + TString outputLocation(outputUrl.GetUrl()); + outputLocation.ReplaceAll(outputFile.Data(),""); + gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data())); + AliInfo(Form("%s will be stored in %s", + outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(), + outputLocation.Data())); + } + } + + return kTRUE; +}