X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliReconstruction.cxx;h=a83272bf7c91551579f24d1010542a7c3fa1a6c2;hb=c4aa7a4c8cc8c2e4c2ddecc5313f3d40ce8837f4;hp=8d5b59e898d5897e8d27faec59328874038630ac;hpb=a7265806a4733e9863f0ffb00acdef0a67592d47;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliReconstruction.cxx b/STEER/AliReconstruction.cxx index 8d5b59e898d..a83272bf7c9 100644 --- a/STEER/AliReconstruction.cxx +++ b/STEER/AliReconstruction.cxx @@ -116,11 +116,14 @@ #include #include +#include #include #include #include #include #include +#include +#include #include "AliReconstruction.h" #include "AliCodeTimer.h" @@ -140,6 +143,7 @@ #include "AliESDkink.h" #include "AliESDtrack.h" #include "AliESDCaloCluster.h" +#include "AliESDCaloCells.h" #include "AliMultiplicity.h" #include "AliTracker.h" #include "AliVertexer.h" @@ -151,12 +155,15 @@ #include "AliPID.h" #include "AliESDpid.h" #include "AliESDtrack.h" +#include "AliESDPmdTrack.h" #include "AliESDTagCreator.h" +#include "AliAODTagCreator.h" #include "AliGeomManager.h" #include "AliTrackPointArray.h" #include "AliCDBManager.h" +#include "AliCDBStorage.h" #include "AliCDBEntry.h" #include "AliAlignObj.h" @@ -167,7 +174,20 @@ #include "AliAODHeader.h" #include "AliAODTrack.h" #include "AliAODVertex.h" -#include "AliAODCluster.h" +#include "AliAODv0.h" +#include "AliAODJet.h" +#include "AliAODCaloCells.h" +#include "AliAODCaloCluster.h" +#include "AliAODPmdCluster.h" +#include "AliAODFmdCluster.h" +#include "AliAODTracklets.h" + +#include "AliQADataMakerRec.h" +#include "AliGlobalQADataMaker.h" +#include "AliQA.h" +#include "AliQADataMakerSteer.h" + +#include "AliSysInfo.h" // memory snapshots ClassImp(AliReconstruction) @@ -177,7 +197,7 @@ ClassImp(AliReconstruction) const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"}; //_____________________________________________________________________________ -AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdbUri, +AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* name, const char* title) : TNamed(name, title), @@ -185,16 +205,24 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdb fRunVertexFinder(kTRUE), fRunHLTTracking(kFALSE), fRunMuonTracking(kFALSE), + fRunV0Finder(kTRUE), + fRunCascadeFinder(kTRUE), fStopOnError(kFALSE), fWriteAlignmentData(kFALSE), - fCleanESD(kTRUE), fWriteESDfriend(kFALSE), fWriteAOD(kFALSE), fFillTriggerESD(kTRUE), + fCleanESD(kTRUE), + fV0DCAmax(3.), + fV0CsPmin(0.), + fDmax(50.), + fZmax(50.), + fRunLocalReconstruction("ALL"), fRunTracking("ALL"), fFillESD("ALL"), + fUseTrackingErrorsForAlignment(""), fGAliceFileName(gAliceFilename), fInput(""), fEquipIdMap(""), @@ -212,10 +240,18 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdb fVertexer(NULL), fDiamondProfile(NULL), + fMeanVertexConstraint(kTRUE), + + fGRPList(NULL), fAlignObjArray(NULL), - fCDBUri(cdbUri), - fSpecCDBUri() + fCDBUri(), + fSpecCDBUri(), + fInitCDBCalled(kFALSE), + fSetRunNumberFromDataCalled(kFALSE), + fRunQA(kTRUE), + fRunGlobalQA(kFALSE), + fInLoopQA(kFALSE) { // create reconstruction object with default parameters @@ -223,7 +259,10 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdb fReconstructor[iDet] = NULL; fLoader[iDet] = NULL; fTracker[iDet] = NULL; + fQADataMaker[iDet] = NULL; + fQACycles[iDet] = 999999; } + fQADataMaker[fgkNDetectors]=NULL; //Global QA AliPID pid; } @@ -235,16 +274,24 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fRunVertexFinder(rec.fRunVertexFinder), fRunHLTTracking(rec.fRunHLTTracking), fRunMuonTracking(rec.fRunMuonTracking), + fRunV0Finder(rec.fRunV0Finder), + fRunCascadeFinder(rec.fRunCascadeFinder), fStopOnError(rec.fStopOnError), fWriteAlignmentData(rec.fWriteAlignmentData), - fCleanESD(rec.fCleanESD), fWriteESDfriend(rec.fWriteESDfriend), fWriteAOD(rec.fWriteAOD), fFillTriggerESD(rec.fFillTriggerESD), + fCleanESD(rec.fCleanESD), + fV0DCAmax(rec.fV0DCAmax), + fV0CsPmin(rec.fV0CsPmin), + fDmax(rec.fDmax), + fZmax(rec.fZmax), + fRunLocalReconstruction(rec.fRunLocalReconstruction), fRunTracking(rec.fRunTracking), fFillESD(rec.fFillESD), + fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment), fGAliceFileName(rec.fGAliceFileName), fInput(rec.fInput), fEquipIdMap(rec.fEquipIdMap), @@ -262,10 +309,18 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fVertexer(NULL), fDiamondProfile(NULL), + fMeanVertexConstraint(rec.fMeanVertexConstraint), + + fGRPList(NULL), fAlignObjArray(rec.fAlignObjArray), fCDBUri(rec.fCDBUri), - fSpecCDBUri() + fSpecCDBUri(), + fInitCDBCalled(rec.fInitCDBCalled), + fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled), + fRunQA(rec.fRunQA), + fRunGlobalQA(rec.fRunGlobalQA), + fInLoopQA(rec.fInLoopQA) { // copy constructor @@ -276,7 +331,10 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) : fReconstructor[iDet] = NULL; fLoader[iDet] = NULL; fTracker[iDet] = NULL; + fQADataMaker[iDet] = NULL; + fQACycles[iDet] = rec.fQACycles[iDet]; } + fQADataMaker[fgkNDetectors]=NULL; //Global QA for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) { if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone()); } @@ -305,12 +363,15 @@ AliReconstruction::~AliReconstruction() } //_____________________________________________________________________________ -void AliReconstruction::InitCDBStorage() +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 + if (fInitCDBCalled) return; + fInitCDBCalled = kTRUE; + AliCDBManager* man = AliCDBManager::Instance(); if (man->IsDefaultStorageSet()) { @@ -318,12 +379,22 @@ void AliReconstruction::InitCDBStorage() AliWarning("Default CDB storage has been already set !"); AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data())); AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - fCDBUri = ""; + fCDBUri = man->GetDefaultStorage()->GetURI(); } else { - AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data())); - AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + if (fCDBUri.Length() > 0) + { + AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data())); + AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + } else { + fCDBUri="local://$ALICE_ROOT"; + AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + AliWarning("Default CDB storage not yet set !!!!"); + AliWarning(Form("Setting it now to: %s", fCDBUri.Data())); + AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + + } man->SetDefaultStorage(fCDBUri); } @@ -336,7 +407,7 @@ void AliReconstruction::InitCDBStorage() AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); man->SetSpecificStorage(obj->GetName(), obj->GetTitle()); } - man->Print(); + } //_____________________________________________________________________________ @@ -369,20 +440,20 @@ void AliReconstruction::SetSpecificStorage(const char* calibType, const char* ur } } - // check that calibType refers to a "valid" detector name - Bool_t isDetector = kFALSE; - for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { - TString detName = fgkDetectorName[iDet]; - if(aPath.GetLevel0() == detName) { - isDetector = kTRUE; - break; - } - } - - if(!isDetector) { - AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data())); - return; - } +// // check that calibType refers to a "valid" detector name +// Bool_t isDetector = kFALSE; +// for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { +// TString detName = fgkDetectorName[iDet]; +// if(aPath.GetLevel0() == detName) { +// isDetector = kTRUE; +// break; +// } +// } +// +// if(!isDetector) { +// AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data())); +// return; +// } TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data()); if (obj) fSpecCDBUri.Remove(obj); @@ -390,25 +461,30 @@ void AliReconstruction::SetSpecificStorage(const char* calibType, const char* ur } - - - //_____________________________________________________________________________ -Bool_t AliReconstruction::SetRunNumber() +Bool_t AliReconstruction::SetRunNumberFromData() { // The method is called in Run() in order // to set a correct run number. // In case of raw data reconstruction the // run number is taken from the raw data header - if(AliCDBManager::Instance()->GetRun() < 0) { - if (!fRunLoader) { + if (fSetRunNumberFromDataCalled) return kTRUE; + fSetRunNumberFromDataCalled = kTRUE; + + AliCDBManager* man = AliCDBManager::Instance(); + + if(man->GetRun() > 0) { + AliWarning("Run number is taken from event header! Ignoring settings in AliCDBManager!"); + } + + if (!fRunLoader) { AliError("No run loader is found !"); return kFALSE; } // read run number from gAlice if(fRunLoader->GetAliRun()) - AliCDBManager::Instance()->SetRun(fRunLoader->GetAliRun()->GetRunNumber()); + AliCDBManager::Instance()->SetRun(fRunLoader->GetHeader()->GetRun()); else { if(fRawReader) { if(fRawReader->NextEvent()) { @@ -424,12 +500,21 @@ Bool_t AliReconstruction::SetRunNumber() AliError("Neither gAlice nor RawReader objects are found !"); return kFALSE; } - } - AliInfo(Form("CDB Run number: %d",AliCDBManager::Instance()->GetRun())); } + + man->Print(); + return kTRUE; } +//_____________________________________________________________________________ +void AliReconstruction::SetCDBLock() { + // Set CDB lock: from now on it is forbidden to reset the run number + // or the default storage or to activate any further storage! + + AliCDBManager::Instance()->SetLock(1); +} + //_____________________________________________________________________________ Bool_t AliReconstruction::MisalignGeometry(const TString& detectors) { @@ -452,6 +537,7 @@ Bool_t AliReconstruction::MisalignGeometry(const TString& detectors) loadAlObjsListOfDets += fgkDetectorName[iDet]; loadAlObjsListOfDets += " "; } // end loop over detectors + loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data()); }else{ // Check if the array with alignment objects was @@ -517,16 +603,23 @@ Bool_t AliReconstruction::Run(const char* input) if (!fEquipIdMap.IsNull() && fRawReader) fRawReader->LoadEquipmentIdsMap(fEquipIdMap); - + AliSysInfo::AddStamp("Start"); // get the run loader if (!InitRunLoader()) return kFALSE; + AliSysInfo::AddStamp("LoadLoader"); // Initialize the CDB storage - InitCDBStorage(); + InitCDB(); + + AliSysInfo::AddStamp("LoadCDB"); // Set run number in CDBManager (if it is not already set by the user) - if (!SetRunNumber()) if (fStopOnError) return kFALSE; - + if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE; + + // 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(); + // Import ideal TGeo geometry and apply misalignment if (!gGeoManager) { TString geom(gSystem->DirName(fGAliceFileName)); @@ -535,17 +628,23 @@ Bool_t AliReconstruction::Run(const char* input) if (!gGeoManager) if (fStopOnError) return kFALSE; } - AliCDBManager* man = AliCDBManager::Instance(); if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE; + AliSysInfo::AddStamp("LoadGeom"); + //QA + AliQADataMakerSteer qas ; + if (fRunQA && fRawReader) qas.Run(fRunLocalReconstruction, fRawReader) ; + // checking the QA of previous steps + //CheckQA() ; + + /* // local reconstruction if (!fRunLocalReconstruction.IsNull()) { if (!RunLocalReconstruction(fRunLocalReconstruction)) { if (fStopOnError) {CleanUp(); return kFALSE;} } } -// if (!fRunVertexFinder && fRunTracking.IsNull() && -// fFillESD.IsNull()) return kTRUE; + */ // get vertexer if (fRunVertexFinder && !CreateVertexer()) { @@ -554,6 +653,7 @@ Bool_t AliReconstruction::Run(const char* input) return kFALSE; } } + AliSysInfo::AddStamp("Vertexer"); // get trackers if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) { @@ -562,6 +662,7 @@ Bool_t AliReconstruction::Run(const char* input) return kFALSE; } } + AliSysInfo::AddStamp("LoadTrackers"); // get the possibly already existing ESD file and tree AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent(); @@ -613,6 +714,15 @@ Bool_t AliReconstruction::Run(const char* input) } + // Get the GRP CDB entry + AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data"); + + if(entryGRP) { + fGRPList = dynamic_cast (entryGRP->GetObject()); + } else { + AliError("No GRP entry found in OCDB!"); + } + // Get the diamond profile from OCDB AliCDBEntry* entry = AliCDBManager::Instance() ->Get("GRP/Calib/MeanVertex"); @@ -624,11 +734,45 @@ Bool_t AliReconstruction::Run(const char* input) } AliVertexerTracks tVertexer(AliTracker::GetBz()); - if(fDiamondProfile) tVertexer.SetVtxStart(fDiamondProfile); + if(fDiamondProfile && fMeanVertexConstraint) tVertexer.SetVtxStart(fDiamondProfile); - // loop over events if (fRawReader) fRawReader->RewindEvents(); + + ProcInfo_t ProcInfo; + gSystem->GetProcInfo(&ProcInfo); + AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual)); + + //Initialize the QA and start of cycle for out-of-cycle QA + if (fRunQA) { + TString detStr(fFillESD); + for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { + if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; + AliQADataMakerRec *qadm = GetQADataMaker(iDet); + if (!qadm) continue; + AliInfo(Form("Initializing the QA data maker for %s", + fgkDetectorName[iDet])); + qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun()); + qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun()); + if (!fInLoopQA) { + qadm->StartOfCycle(AliQA::kRECPOINTS); + qadm->StartOfCycle(AliQA::kESDS,"same"); + } + } + if (fRunGlobalQA) { + AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors); + AliInfo(Form("Initializing the global QA data maker")); + TObjArray *arr= + qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun()); + AliTracker::SetResidualsArray(arr); + if (!fInLoopQA) { + qadm->StartOfCycle(AliQA::kRECPOINTS); + } + } + } + + + //******* The loop over events for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) { if (fRawReader) fRawReader->NextEvent(); if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) { @@ -647,6 +791,23 @@ Bool_t AliReconstruction::Run(const char* input) } AliInfo(Form("processing event %d", iEvent)); + + //Start of cycle for the in-loop QA + if (fRunQA && fInLoopQA) { + TString detStr(fFillESD); + for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { + if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; + AliQADataMakerRec *qadm = GetQADataMaker(iDet); + if (!qadm) continue; + qadm->StartOfCycle(AliQA::kRECPOINTS); + qadm->StartOfCycle(AliQA::kESDS, "same") ; + } + if (fRunGlobalQA) { + AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors); + qadm->StartOfCycle(AliQA::kRECPOINTS); + } + } + fRunLoader->GetEvent(iEvent); char aFileName[256]; @@ -655,14 +816,13 @@ Bool_t AliReconstruction::Run(const char* input) fRunLoader->GetHeader()->GetEventNrInRun()); if (!gSystem->AccessPathName(aFileName)) continue; - // local reconstruction + // local signle event reconstruction if (!fRunLocalReconstruction.IsNull()) { if (!RunLocalEventReconstruction(fRunLocalReconstruction)) { if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;} } } - esd->SetRunNumber(fRunLoader->GetHeader()->GetRun()); hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun()); esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun()); @@ -722,6 +882,7 @@ Bool_t AliReconstruction::Run(const char* input) if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;} } } + // fill Event header information from the RawEventHeader if (fRawReader){FillRawEventHeaderESD(esd);} @@ -738,6 +899,8 @@ Bool_t AliReconstruction::Run(const char* input) } } + file->cd(); + //Try to improve the reconstructed primary vertex position using the tracks AliESDVertex *pvtx=0; Bool_t dovertex=kTRUE; @@ -764,19 +927,22 @@ Bool_t AliReconstruction::Run(const char* input) } } - { - // V0 finding - AliV0vertexer vtxer; - vtxer.Tracks2V0vertices(esd); + if (fRunV0Finder) { + // V0 finding + AliV0vertexer vtxer; + vtxer.Tracks2V0vertices(esd); - // Cascade finding - AliCascadeVertexer cvtxer; - cvtxer.V0sTracks2CascadeVertices(esd); + if (fRunCascadeFinder) { + // Cascade finding + AliCascadeVertexer cvtxer; + cvtxer.V0sTracks2CascadeVertices(esd); + } } // write ESD if (fCleanESD) CleanESD(esd); if (fWriteESDfriend) { + esdf->~AliESDfriend(); new (esdf) AliESDfriend(); // Reset... esd->GetESDfriend(esdf); } @@ -789,18 +955,70 @@ Bool_t AliReconstruction::Run(const char* input) esd->Reset(); hltesd->Reset(); if (fWriteESDfriend) { + esdf->~AliESDfriend(); new (esdf) AliESDfriend(); // Reset... } - // esdf->Reset(); - // delete esdf; esdf = 0; - } + + gSystem->GetProcInfo(&ProcInfo); + AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual)); + + // End of cycle for the in-loop QA + if (fRunQA && fInLoopQA) { + RunQA(fFillESD.Data(), esd); + TString detStr(fFillESD); + for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { + if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; + AliQADataMakerRec * qadm = GetQADataMaker(iDet); + if (!qadm) continue; + qadm->EndOfCycle(AliQA::kRECPOINTS); + qadm->EndOfCycle(AliQA::kESDS); + qadm->Finish(); + } + if (fRunGlobalQA) { + AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors); + if (qadm) { + qadm->EndOfCycle(AliQA::kRECPOINTS); + qadm->Finish(); + } + } + } + } + //******** End of the loop over events tree->GetUserInfo()->Add(esd); hlttree->GetUserInfo()->Add(hltesd); - + + const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap(); + const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds(); + + TMap *cdbMapCopy = new TMap(cdbMap->GetEntries()); + cdbMapCopy->SetOwner(1); + cdbMapCopy->SetName("cdbMap"); + TIter iter(cdbMap->GetTable()); + + TPair* pair = 0; + while((pair = dynamic_cast (iter.Next()))){ + TObjString* keyStr = dynamic_cast (pair->Key()); + TObjString* valStr = dynamic_cast (pair->Value()); + cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName())); + } + + TList *cdbListCopy = new TList(); + cdbListCopy->SetOwner(1); + cdbListCopy->SetName("cdbList"); + + TIter iter2(cdbList); + + AliCDBId* id=0; + while((id = dynamic_cast (iter2.Next()))){ + cdbListCopy->Add(new TObjString(id->ToString().Data())); + } + + tree->GetUserInfo()->Add(cdbMapCopy); + tree->GetUserInfo()->Add(cdbListCopy); if(fESDPar.Contains("ESD.par")){ @@ -811,9 +1029,11 @@ Bool_t AliReconstruction::Run(const char* input) file->cd(); + if (fWriteESDfriend) tree->SetBranchStatus("ESDfriend*",0); - tree->Write(); + // we want to have only one tree version number + tree->Write(tree->GetName(),TObject::kOverwrite); hlttree->Write(); if (fWriteAOD) { @@ -824,68 +1044,92 @@ Bool_t AliReconstruction::Run(const char* input) gROOT->cd(); CleanUp(file, fileOld); - + // 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 AliESDTagCreator *esdtagCreator = new AliESDTagCreator(); - esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent); - //if (fWriteAOD) tagCreator->CreateAODTags(fFirstEvent,fLastEvent); - + esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPList); + if (fWriteAOD) { + AliAODTagCreator *aodtagCreator = new AliAODTagCreator(); + aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent,fGRPList); + } + + //Finish QA and end of cycle for out-of-loop QA + if (fRunQA && !fInLoopQA) { + qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS); + //qas.Reset() ; + qas.Run(fRunTracking.Data(), AliQA::kESDS); + + if (fRunGlobalQA) { + AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors); + if (qadm) { + qadm->EndOfCycle(AliQA::kRECPOINTS); + qadm->Finish(); + } + } + } + + // Cleanup of CDB manager: cache and active storages! + AliCDBManager::Instance()->ClearCache(); + + return kTRUE; } //_____________________________________________________________________________ -Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors) +Bool_t AliReconstruction::RunLocalReconstruction(const TString& /*detectors*/) { // run the local reconstruction - + static Int_t eventNr=0; AliCodeTimerAuto("") - AliCDBManager* man = AliCDBManager::Instance(); - Bool_t origCache = man->GetCacheFlag(); + // AliCDBManager* man = AliCDBManager::Instance(); +// Bool_t origCache = man->GetCacheFlag(); - TString detStr = detectors; - for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { - if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; - AliReconstructor* reconstructor = GetReconstructor(iDet); - if (!reconstructor) continue; - if (reconstructor->HasLocalReconstruction()) continue; +// TString detStr = detectors; +// for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { +// if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; +// AliReconstructor* reconstructor = GetReconstructor(iDet); +// if (!reconstructor) continue; +// if (reconstructor->HasLocalReconstruction()) continue; - AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet])); - AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet])); +// AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet])); +// AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet])); - AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet])); - AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet])); +// AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet])); +// AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet])); - man->SetCacheFlag(kTRUE); - TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]); - man->GetAll(calibPath); // entries are cached! +// man->SetCacheFlag(kTRUE); +// TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]); +// man->GetAll(calibPath); // entries are cached! - AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet])); +// AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet])); - if (fRawReader) { - fRawReader->RewindEvents(); - reconstructor->Reconstruct(fRunLoader, fRawReader); - } else { - reconstructor->Reconstruct(fRunLoader); - } +// if (fRawReader) { +// fRawReader->RewindEvents(); +// reconstructor->Reconstruct(fRunLoader, fRawReader); +// } else { +// reconstructor->Reconstruct(fRunLoader); +// } - AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet])); +// AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet])); + // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr)); - // unload calibration data - man->UnloadFromCache(calibPath); - //man->ClearCache(); - } +// // unload calibration data +// man->UnloadFromCache(calibPath); +// //man->ClearCache(); +// } - man->SetCacheFlag(origCache); +// man->SetCacheFlag(origCache); - if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) { - AliError(Form("the following detectors were not found: %s", - detStr.Data())); - if (fStopOnError) return kFALSE; - } +// if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) { +// AliError(Form("the following detectors were not found: %s", +// detStr.Data())); +// if (fStopOnError) return kFALSE; +// } + eventNr++; return kTRUE; } @@ -894,6 +1138,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) { // run the local reconstruction + static Int_t eventNr=0; AliCodeTimerAuto("") TString detStr = detectors; @@ -902,7 +1147,10 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) AliReconstructor* reconstructor = GetReconstructor(iDet); if (!reconstructor) continue; AliLoader* loader = fLoader[iDet]; - + if (!loader) { + AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet])); + continue; + } // conversion of digits if (fRawReader && reconstructor->HasDigitConversion()) { AliInfo(Form("converting raw data digits into root objects for %s", @@ -917,9 +1165,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) loader->WriteDigits("OVERWRITE"); loader->UnloadDigits(); } - // local reconstruction - if (!reconstructor->HasLocalReconstruction()) continue; AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet])); AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet])); loader->LoadRecPoints("update"); @@ -939,8 +1185,26 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) } loader->UnloadDigits(); } + + // In-loop QA for local reconstrucion + if (fRunQA && fInLoopQA) { + AliQADataMakerRec * qadm = GetQADataMaker(iDet); + if (qadm) { + //AliCodeTimerStart + //(Form("Running QA data maker for %s", fgkDetectorName[iDet])); + //AliInfo + //(Form("Running QA data maker for %s", fgkDetectorName[iDet])); + + qadm->Exec(AliQA::kRECPOINTS, clustersTree) ; + + //AliCodeTimerStop + //(Form("Running QA data maker for %s", fgkDetectorName[iDet])); + } + } + loader->WriteRecPoints("OVERWRITE"); loader->UnloadRecPoints(); + AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr); } if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) { @@ -948,7 +1212,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors) detStr.Data())); if (fStopOnError) return kFALSE; } - + eventNr++; return kTRUE; } @@ -1031,7 +1295,7 @@ Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd) TString detName = fgkDetectorName[iDet]; AliDebug(1, Form("%s HLT tracking", detName.Data())); reconstructor->SetOption(detName.Data()); - AliTracker *tracker = reconstructor->CreateTracker(fRunLoader); + AliTracker *tracker = reconstructor->CreateTracker(); if (!tracker) { AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data())); if (fStopOnError) return kFALSE; @@ -1086,38 +1350,29 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd) TString detName = fgkDetectorName[iDet]; AliDebug(1, Form("%s tracking", detName.Data())); - AliTracker *tracker = reconstructor->CreateTracker(fRunLoader); + AliTracker *tracker = reconstructor->CreateTracker(); if (!tracker) { AliWarning(Form("couldn't create a tracker for %s", detName.Data())); return kFALSE; } - // create Tracks - fLoader[iDet]->LoadTracks("update"); - fLoader[iDet]->CleanTracks(); - fLoader[iDet]->MakeTracksContainer(); - // read RecPoints fLoader[iDet]->LoadRecPoints("read"); + tracker->LoadClusters(fLoader[iDet]->TreeR()); Int_t rv = tracker->Clusters2Tracks(esd); - fLoader[iDet]->UnloadRecPoints(); - if ( rv ) { AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet])); return kFALSE; } - tracker->UnloadClusters(); - fLoader[iDet]->UnloadRecPoints(); - fLoader[iDet]->WriteTracks("OVERWRITE"); - fLoader[iDet]->UnloadTracks(); - + tracker->UnloadClusters(); + delete tracker; return kTRUE; @@ -1128,14 +1383,17 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd) Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) { // run the barrel tracking - + static Int_t eventNr=0; AliCodeTimerAuto("") AliInfo("running tracking"); //Fill the ESD with the T0 info (will be used by the TOF) - if (fReconstructor[11]) - GetReconstructor(11)->FillESD(fRunLoader, esd); + if (fReconstructor[11] && fLoader[11]) { + fLoader[11]->LoadRecPoints("READ"); + TTree *treeR = fLoader[11]->TreeR(); + GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd); + } // pass 1: TPC + ITS inwards for (Int_t iDet = 1; iDet >= 0; iDet--) { @@ -1144,13 +1402,14 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) // load clusters fLoader[iDet]->LoadRecPoints("read"); + AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr); TTree* tree = fLoader[iDet]->TreeR(); if (!tree) { AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet])); return kFALSE; } fTracker[iDet]->LoadClusters(tree); - + AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr); // run tracking if (fTracker[iDet]->Clusters2Tracks(esd) != 0) { AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet])); @@ -1161,13 +1420,16 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) } // preliminary PID in TPC needed by the ITS tracker if (iDet == 1) { - GetReconstructor(1)->FillESD(fRunLoader, esd); GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd); AliESDpid::MakePID(esd); - } + } + AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr); } // pass 2: ALL backwards + + if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE); + for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { if (!fTracker[iDet]) continue; AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet])); @@ -1176,12 +1438,14 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) if (iDet > 1) { // all except ITS, TPC TTree* tree = NULL; fLoader[iDet]->LoadRecPoints("read"); + 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; } - fTracker[iDet]->LoadClusters(tree); + fTracker[iDet]->LoadClusters(tree); + AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr); } // run tracking @@ -1200,18 +1464,22 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) } // updated PID in TPC needed by the ITS tracker -MI if (iDet == 1) { - GetReconstructor(1)->FillESD(fRunLoader, esd); GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd); AliESDpid::MakePID(esd); } + AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr); } + if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE); + // write space-points to the ESD in case alignment data output // is switched on if (fWriteAlignmentData) WriteAlignmentData(esd); // pass 3: TRD + TPC + ITS refit inwards + + for (Int_t iDet = 2; iDet >= 0; iDet--) { if (!fTracker[iDet]) continue; AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet])); @@ -1221,14 +1489,22 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) AliError(Form("%s inward refit failed", fgkDetectorName[iDet])); // return kFALSE; } + // run postprocessing + if (fTracker[iDet]->PostProcess(esd) != 0) { + AliError(Form("%s postprocessing failed", fgkDetectorName[iDet])); + // return kFALSE; + } if (fCheckPointLevel > 1) { WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet])); } - + AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr); // unload clusters fTracker[iDet]->UnloadClusters(); + AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr); fLoader[iDet]->UnloadRecPoints(); + AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr); } + // // Propagate track to the vertex - if not done by ITS // @@ -1244,7 +1520,7 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd) AliTracker::PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE); track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD); } - + eventNr++; return kTRUE; } @@ -1254,24 +1530,20 @@ Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){ // Remove the data which are not needed for the physics analysis. // - AliInfo("Cleaning the ESD..."); - - const AliESDVertex *vertex=esd->GetVertex(); - Double_t vz=vertex->GetZv(); - Int_t nTracks=esd->GetNumberOfTracks(); - for (Int_t i=0; iGetTrack(i); + Int_t nV0s=esd->GetNumberOfV0s(); + AliInfo + (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s)); - Float_t xy,z; track->GetImpactParameters(xy,z); - if (TMath::Abs(xy) < 50.) continue; - if (vertex->GetStatus()) - if (TMath::Abs(vz-z) < 5.) continue; + Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax}; + Bool_t rc=esd->Clean(cleanPars); - esd->RemoveTrack(i); - } + nTracks=esd->GetNumberOfTracks(); + nV0s=esd->GetNumberOfV0s(); + AliInfo + (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s)); - return kTRUE; + return rc; } //_____________________________________________________________________________ @@ -1280,17 +1552,17 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors) // fill the event summary data AliCodeTimerAuto("") - + static Int_t eventNr=0; TString detStr = detectors; + for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { - if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; + if (!IsSelected(fgkDetectorName[iDet], detStr)) continue; AliReconstructor* reconstructor = GetReconstructor(iDet); if (!reconstructor) continue; - if (!ReadESD(esd, fgkDetectorName[iDet])) { AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet])); TTree* clustersTree = NULL; - if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) { + if (fLoader[iDet]) { fLoader[iDet]->LoadRecPoints("read"); clustersTree = fLoader[iDet]->TreeR(); if (!clustersTree) { @@ -1315,15 +1587,10 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors) reconstructor->FillESD(digitsTree, clustersTree, esd); if (fLoader[iDet]) fLoader[iDet]->UnloadDigits(); } - if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) { + if (fLoader[iDet]) { fLoader[iDet]->UnloadRecPoints(); } - if (fRawReader) { - reconstructor->FillESD(fRunLoader, fRawReader, esd); - } else { - reconstructor->FillESD(fRunLoader, esd); - } if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]); } } @@ -1333,7 +1600,8 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors) detStr.Data())); if (fStopOnError) return kFALSE; } - + AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr); + eventNr++; return kTRUE; } @@ -1482,6 +1750,11 @@ Bool_t AliReconstruction::InitRunLoader() return kFALSE; } + //PH This is a temporary fix to give access to the kinematics + //PH that is needed for the labels of ITS clusters + fRunLoader->LoadHeader(); + fRunLoader->LoadKinematics(); + } else { // galice.root does not exist if (!fRawReader) { AliError(Form("the file %s does not exist", fGAliceFileName.Data())); @@ -1534,15 +1807,6 @@ AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet) TString recName = "Ali" + detName + "Reconstructor"; if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL; - if (detName == "HLT") { - if (!gROOT->GetClass("AliLevel3")) { - gSystem->Load("libAliHLTSrc.so"); - gSystem->Load("libAliHLTMisc.so"); - gSystem->Load("libAliHLTHough.so"); - gSystem->Load("libAliHLTComp.so"); - } - } - AliReconstructor* reconstructor = NULL; // first check if a plugin is defined for the reconstructor TPluginHandler* pluginHandler = @@ -1567,7 +1831,7 @@ AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet) if (reconstructor) { TObject* obj = fOptions.FindObject(detName.Data()); if (obj) reconstructor->SetOption(obj->GetTitle()); - reconstructor->Init(fRunLoader); + reconstructor->Init(); fReconstructor[iDet] = reconstructor; } @@ -1621,7 +1885,7 @@ Bool_t AliReconstruction::CreateVertexer() fVertexer = NULL; AliReconstructor* itsReconstructor = GetReconstructor(0); if (itsReconstructor) { - fVertexer = itsReconstructor->CreateVertexer(fRunLoader); + fVertexer = itsReconstructor->CreateVertexer(); } if (!fVertexer) { AliWarning("couldn't create a vertexer for ITS"); @@ -1652,11 +1916,12 @@ Bool_t AliReconstruction::CreateTrackers(const TString& detectors) } - fTracker[iDet] = reconstructor->CreateTracker(fRunLoader); + fTracker[iDet] = reconstructor->CreateTracker(); if (!fTracker[iDet] && (iDet < 7)) { AliWarning(Form("couldn't create a tracker for %s", detName.Data())); if (fStopOnError) return kFALSE; } + AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0); } return kTRUE; @@ -1673,11 +1938,19 @@ void AliReconstruction::CleanUp(TFile* file, TFile* fileOld) fLoader[iDet] = NULL; delete fTracker[iDet]; fTracker[iDet] = NULL; +// delete fQADataMaker[iDet]; +// fQADataMaker[iDet] = NULL; } delete fVertexer; fVertexer = NULL; - delete fDiamondProfile; - fDiamondProfile = NULL; + + if(!(AliCDBManager::Instance()->GetCacheFlag())) { + delete fDiamondProfile; + fDiamondProfile = NULL; + } + + delete fGRPList; + fGRPList = NULL; delete fRunLoader; fRunLoader = NULL; @@ -1696,7 +1969,6 @@ void AliReconstruction::CleanUp(TFile* file, TFile* fileOld) } } - //_____________________________________________________________________________ Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const @@ -1758,7 +2030,7 @@ void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) { // write all files from the given esd file to an aod file - + // create an AliAOD object AliAODEvent *aod = new AliAODEvent(); aod->CreateStdContent(); @@ -1767,7 +2039,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) aodFile->cd(); // create the tree - TTree *aodTree = new TTree("AOD", "AliAOD tree"); + TTree *aodTree = new TTree("aodTree", "AliAOD tree"); aodTree->Branch(aod->GetList()); // connect to ESD @@ -1781,23 +2053,27 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) Float_t posF[3]; Double_t pos[3]; Double_t p[3]; + Double_t p_pos[3]; + Double_t p_neg[3]; Double_t covVtx[6]; Double_t covTr[21]; Double_t pid[10]; // loop over events and fill them for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) { + //cout << "event: " << iEvent << endl; t->GetEntry(iEvent); // Multiplicity information needed by the header (to be revised!) Int_t nTracks = esd->GetNumberOfTracks(); Int_t nPosTracks = 0; for (Int_t iTrack=0; iTrackGetTrack(iTrack)->GetSign()> 0) nPosTracks++; + if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++; - // Update the header - AliAODHeader* header = aod->GetHeader(); - + // Access the header + AliAODHeader *header = aod->GetHeader(); + + // fill the header header->SetRunNumber (esd->GetRunNumber() ); header->SetBunchCrossNumber(esd->GetBunchCrossNumber()); header->SetOrbitNumber (esd->GetOrbitNumber() ); @@ -1810,24 +2086,24 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) header->SetZDCP1Energy (esd->GetZDCP1Energy() ); header->SetZDCN2Energy (esd->GetZDCN2Energy() ); header->SetZDCP2Energy (esd->GetZDCP2Energy() ); - header->SetZDCEMEnergy (esd->GetZDCEMEnergy() ); + header->SetZDCEMEnergy (esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1)); header->SetRefMultiplicity (nTracks); header->SetRefMultiplicityPos(nPosTracks); header->SetRefMultiplicityNeg(nTracks - nPosTracks); header->SetMuonMagFieldScale(-999.); // FIXME header->SetCentrality(-999.); // FIXME -// -// Int_t nV0s = esd->GetNumberOfV0s(); Int_t nCascades = esd->GetNumberOfCascades(); Int_t nKinks = esd->GetNumberOfKinks(); - Int_t nVertices = nV0s + nCascades + nKinks; - - aod->ResetStd(nTracks, nVertices); - AliAODTrack *aodTrack; + Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/; + Int_t nJets = 0; + Int_t nCaloClus = esd->GetNumberOfCaloClusters(); + Int_t nFmdClus = 0; + Int_t nPmdClus = esd->GetNumberOfPmdTracks(); + + aod->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus); - // Array to take into account the tracks already added to the AOD Bool_t * usedTrack = NULL; if (nTracks>0) { @@ -1846,7 +2122,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) usedKink = new Bool_t[nKinks]; for (Int_t iKink=0; iKinkGetVertices()); Int_t jVertices=0; @@ -1854,7 +2130,11 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) // Access to the AOD container of tracks TClonesArray &tracks = *(aod->GetTracks()); Int_t jTracks=0; - + + // Access to the AOD container of V0s + TClonesArray &V0s = *(aod->GetV0s()); + Int_t jV0s=0; + // Add primary vertex. The primary tracks will be defined // after the loops on the composite objects (V0, cascades, kinks) const AliESDVertex *vtx = esd->GetPrimaryVertex(); @@ -1863,10 +2143,13 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) vtx->GetCovMatrix(covVtx); //covariance matrix AliAODVertex * primary = new(vertices[jVertices++]) - AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary); + AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary); + + AliAODTrack *aodTrack = 0x0; + // Create vertices starting from the most complex objects - + // Cascades for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) { AliESDcascade *cascade = esd->GetCascade(nCascade); @@ -1879,12 +2162,13 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) covVtx, cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3 primary, + nCascade, AliAODVertex::kCascade); - primary->AddDaughter(vcascade); + primary->AddDaughter(vcascade); // the cascade 'particle' (represented by a vertex) is added as a daughter to the primary vertex // Add the V0 from the cascade. The ESD class have to be optimized... - // Now we have to search for the corresponding Vo in the list of V0s + // Now we have to search for the corresponding V0 in the list of V0s // using the indeces of the positive and negative tracks Int_t posFromV0 = cascade->GetPindex(); @@ -1908,7 +2192,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) AliAODVertex * vV0FromCascade = 0x0; - if (indV0>-1 && !usedV0[indV0] ) { + if (indV0>-1 && !usedV0[indV0]) { // the V0 exists in the array of V0s and is not used @@ -1921,6 +2205,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) covVtx, v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3 vcascade, + indV0, AliAODVertex::kV0); } else { @@ -1936,8 +2221,10 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) covVtx, v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3 vcascade, + indV0, AliAODVertex::kV0); vcascade->AddDaughter(vV0FromCascade); + } // Add the positive tracks from the V0 @@ -1947,7 +2234,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) usedTrack[posFromV0] = kTRUE; AliESDtrack *esdTrack = esd->GetTrack(posFromV0); - esdTrack->GetPxPyPz(p); + esdTrack->GetPxPyPz(p_pos); esdTrack->GetXYZ(pos); esdTrack->GetCovarianceXYZPxPyPz(covTr); esdTrack->GetESDpid(pid); @@ -1955,12 +2242,12 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) vV0FromCascade->AddDaughter(aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(), esdTrack->GetLabel(), - p, + p_pos, kTRUE, pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, vV0FromCascade, @@ -1982,7 +2269,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) usedTrack[negFromV0] = kTRUE; AliESDtrack *esdTrack = esd->GetTrack(negFromV0); - esdTrack->GetPxPyPz(p); + esdTrack->GetPxPyPz(p_neg); esdTrack->GetXYZ(pos); esdTrack->GetCovarianceXYZPxPyPz(covTr); esdTrack->GetESDpid(pid); @@ -1990,12 +2277,12 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) vV0FromCascade->AddDaughter(aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(), esdTrack->GetLabel(), - p, + p_neg, kTRUE, pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, vV0FromCascade, @@ -2010,6 +2297,11 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) << " track " << negFromV0 << " has already been used!" << endl; } + // add it to the V0 array as well + Double_t d0[2] = { -999., -99.}; + // counting is probably wrong + new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined + // Add the bachelor track from the cascade Int_t bachelor = cascade->GetBindex(); @@ -2032,7 +2324,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, vcascade, @@ -2046,19 +2338,19 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) cerr << "Error: event " << iEvent << " cascade " << nCascade << " track " << bachelor << " has already been used!" << endl; } - + // Add the primary track of the cascade (if any) - + } // end of the loop on cascades - + // V0s for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) { if (usedV0[nV0]) continue; // skip if aready added to the AOD - AliESDv0 *v0 = esd->GetV0(nV0); - + AliESDv0 *v0 = esd->GetV0(nV0); + v0->GetXYZ(pos[0], pos[1], pos[2]); v0->GetPosCov(covVtx); @@ -2067,6 +2359,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) covVtx, v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3 primary, + nV0, AliAODVertex::kV0); primary->AddDaughter(vV0); @@ -2080,7 +2373,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) usedTrack[posFromV0] = kTRUE; AliESDtrack *esdTrack = esd->GetTrack(posFromV0); - esdTrack->GetPxPyPz(p); + esdTrack->GetPxPyPz(p_pos); esdTrack->GetXYZ(pos); esdTrack->GetCovarianceXYZPxPyPz(covTr); esdTrack->GetESDpid(pid); @@ -2088,12 +2381,12 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) vV0->AddDaughter(aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(), esdTrack->GetLabel(), - p, + p_pos, kTRUE, pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, vV0, @@ -2115,7 +2408,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) usedTrack[negFromV0] = kTRUE; AliESDtrack *esdTrack = esd->GetTrack(negFromV0); - esdTrack->GetPxPyPz(p); + esdTrack->GetPxPyPz(p_neg); esdTrack->GetXYZ(pos); esdTrack->GetCovarianceXYZPxPyPz(covTr); esdTrack->GetESDpid(pid); @@ -2123,12 +2416,12 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) vV0->AddDaughter(aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(), esdTrack->GetLabel(), - p, + p_neg, kTRUE, pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, vV0, @@ -2143,7 +2436,12 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) << " track " << negFromV0 << " has already been used!" << endl; } - } // end of the loop on V0s + // add it to the V0 array as well + Double_t d0[2] = { 999., 99.}; + new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined + } + V0s.Expand(jV0s); + // end of the loop on V0s // Kinks: it is a big mess the access to the information in the kinks // The loop is on the tracks in order to find the mother and daugther of each kink @@ -2151,7 +2449,6 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) for (Int_t iTrack=0; iTrackGetTrack(iTrack); Int_t ikink = esdTrack->GetKinkIndex(0); @@ -2214,7 +2511,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, primary, @@ -2237,6 +2534,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) NULL, 0., mother, + esdTrack->GetID(), // This is the track ID of the mother's track! AliAODVertex::kKink); // Add the daughter track @@ -2260,7 +2558,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, vkink, @@ -2274,20 +2572,14 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1 << " track " << idaughter << " has already been used!" << endl; } - - } } - - } - + } } + vertices.Expand(jVertices); - // Tracks (primary and orphan) - for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) { - if (usedTrack[nTrack]) continue; @@ -2301,7 +2593,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) esdTrack->GetImpactParameters(impactXY,impactZ); - if (impactXY<3) { + if (impactXY<3.) { // track inside the beam pipe primary->AddDaughter(aodTrack = @@ -2312,7 +2604,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) pos, kFALSE, covTr, - (Short_t)esdTrack->GetSign(), + (Short_t)esdTrack->Charge(), esdTrack->GetITSClusterMap(), pid, primary, @@ -2324,25 +2616,11 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) } else { // outside the beam pipe: orphan track - aodTrack = - new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(), - esdTrack->GetLabel(), - p, - kTRUE, - pos, - kFALSE, - covTr, - (Short_t)esdTrack->GetSign(), - esdTrack->GetITSClusterMap(), - pid, - NULL, - kFALSE, // check if this is right - kFALSE, // check if this is right - AliAODTrack::kOrphan); - aodTrack->ConvertAliPIDtoAODPID(); + // Don't write them anymore! + continue; } } // end of loop on tracks - + // muon tracks Int_t nMuTracks = esd->GetNumberOfMuonTracks(); for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) { @@ -2358,7 +2636,7 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) // has to be changed once the muon pid is provided by the ESD for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.; - primary->AddDaughter( + primary->AddDaughter(aodTrack = new(tracks[jTracks++]) AliAODTrack(0, // no ID provided 0, // no label provided p, @@ -2366,75 +2644,136 @@ void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile) pos, kFALSE, NULL, // no covariance matrix provided - (Short_t)-99, // no charge provided - 0, // no ITSClusterMap + esdMuTrack->Charge(), + 0, // ITSClusterMap is set below pid, primary, - kFALSE, // muon tracks are not used to fit the primary vtx - kFALSE, // not used for vertex fit + kFALSE, // muon tracks are not used to fit the primary vtx + kFALSE, // not used for vertex fit AliAODTrack::kPrimary) ); + + aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh()); + Int_t track2Trigger = esdMuTrack->GetMatchTrigger(); + aodTrack->SetMatchTrigger(track2Trigger); + if (track2Trigger) + aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger()); + else + aodTrack->SetChi2MatchTrigger(0.); } - + tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks + + // Access to the AOD container of PMD clusters + TClonesArray &pmdClusters = *(aod->GetPmdClusters()); + Int_t jPmdClusters=0; + + for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) { + // file pmd clusters, to be revised! + AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd); + Int_t nLabel = 0; + Int_t *label = 0x0; + Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() }; + Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised! + // type not set! + // assoc cluster not set + new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid); + } + // Access to the AOD container of clusters - TClonesArray &clusters = *(aod->GetClusters()); + TClonesArray &caloClusters = *(aod->GetCaloClusters()); Int_t jClusters=0; - - // Calo Clusters - Int_t nClusters = esd->GetNumberOfCaloClusters(); - - for (Int_t iClust=0; iClustGetCaloCluster(iClust); Int_t id = cluster->GetID(); - Int_t label = -1; + Int_t nLabel = 0; + Int_t *label = 0x0; Float_t energy = cluster->E(); cluster->GetPosition(posF); - AliAODVertex *prodVertex = primary; - AliAODTrack *primTrack = NULL; Char_t ttype=AliAODCluster::kUndef; - - if (cluster->IsPHOS()) ttype=AliAODCluster::kPHOSNeutral; - else if (cluster->IsEMCAL()) { - - if (cluster->GetClusterType() == AliESDCaloCluster::kPseudoCluster) - ttype = AliAODCluster::kEMCALPseudoCluster; - else - ttype = AliAODCluster::kEMCALClusterv1; - + + if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) { + ttype=AliAODCluster::kPHOSNeutral; + } + else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) { + ttype = AliAODCluster::kEMCALClusterv1; } + - new(clusters[jClusters++]) AliAODCluster(id, - label, - energy, - pos, - NULL, // no covariance matrix provided - NULL, // no pid for clusters provided - prodVertex, - primTrack, - ttype); + AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id, + nLabel, + label, + energy, + pos, + NULL, + ttype); - } // end of loop on calo clusters - + caloCluster->SetCaloCluster(); // to be refined! + + } + caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters + // end of loop on calo clusters + + // fill EMCAL cell info + if (esd->GetEMCALCells()) { // protection against missing ESD information + AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells()); + Int_t nEMcell = esdEMcells.GetNumberOfCells() ; + + AliAODCaloCells &aodEMcells = *(aod->GetEMCALCells()); + aodEMcells.CreateContainer(nEMcell); + aodEMcells.SetType(AliAODCaloCells::kEMCAL); + for (Int_t iCell = 0; iCell < nEMcell; iCell++) { + aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell)); + } + aodEMcells.Sort(); + } + + // fill PHOS cell info + if (esd->GetPHOSCells()) { // protection against missing ESD information + AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells()); + Int_t nPHcell = esdPHcells.GetNumberOfCells() ; + + AliAODCaloCells &aodPHcells = *(aod->GetPHOSCells()); + aodPHcells.CreateContainer(nPHcell); + aodPHcells.SetType(AliAODCaloCells::kPHOS); + for (Int_t iCell = 0; iCell < nPHcell; iCell++) { + aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell)); + } + aodPHcells.Sort(); + } + + // tracklets + AliAODTracklets &SPDTracklets = *(aod->GetTracklets()); + const AliMultiplicity *mult = esd->GetMultiplicity(); + if (mult) { + if (mult->GetNumberOfTracklets()>0) { + SPDTracklets.CreateContainer(mult->GetNumberOfTracklets()); + + for (Int_t n=0; nGetNumberOfTracklets(); n++) { + SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n)); + } + } + } else { + Printf("ERROR: AliMultiplicity could not be retrieved from ESD"); + } + delete [] usedTrack; delete [] usedV0; delete [] usedKink; - + // fill the tree for this event aodTree->Fill(); } // end of event loop - + aodTree->GetUserInfo()->Add(aod); - - // close ESD file - esdFile->Close(); - + // write the tree to the specified file aodFile = aodTree->GetCurrentFile(); aodFile->cd(); aodTree->Write(); - + return; } @@ -2474,8 +2813,18 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd) AliTrackPoint p; Int_t isp = 0; Int_t isp2 = 0; - while (isp < nspdet) { - Bool_t isvalid = tracker->GetTrackPoint(idx[isp2],p); isp2++; + while (isp2 < nspdet) { + Bool_t isvalid; + TString dets = fgkDetectorName[iDet]; + if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) || + fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") || + fUseTrackingErrorsForAlignment.EndsWith(" "+dets) || + fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) { + isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track); + } else { + isvalid = tracker->GetTrackPoint(idx[isp2],p); + } + isp2++; const Int_t kNTPCmax = 159; if (iDet==1 && isp2>kNTPCmax) break; // to be fixed if (!isvalid) continue; @@ -2557,4 +2906,132 @@ void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){ out.close(); } + +//_____________________________________________________________________________ +AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet) +{ + // get the quality assurance data maker object and the loader for a detector + + if (fQADataMaker[iDet]) + return fQADataMaker[iDet]; + AliQADataMakerRec * qadm = NULL; + if (iDet == fgkNDetectors) { //Global QA + qadm = new AliGlobalQADataMaker(); + fQADataMaker[iDet] = qadm; + return qadm; + } + + // load the QA data maker object + TPluginManager* pluginManager = gROOT->GetPluginManager(); + TString detName = fgkDetectorName[iDet]; + TString qadmName = "Ali" + detName + "QADataMakerRec"; + if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) + return NULL; + + // first check if a plugin is defined for the quality assurance data maker + TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName); + // if not, add a plugin for it + if (!pluginHandler) { + AliDebug(1, Form("defining plugin for %s", qadmName.Data())); + TString libs = gSystem->GetLibraries(); + if (libs.Contains("lib" + detName + "base.so") || + (gSystem->Load("lib" + detName + "base.so") >= 0)) { + pluginManager->AddHandler("AliQADataMakerRec", detName, + qadmName, detName + "qadm", qadmName + "()"); + } else { + pluginManager->AddHandler("AliQADataMakerRec", detName, + qadmName, detName, qadmName + "()"); + } + pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName); + } + if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) { + qadm = (AliQADataMakerRec *) pluginHandler->ExecPlugin(0); + } + + fQADataMaker[iDet] = qadm; + + return qadm; +} + +//_____________________________________________________________________________ +Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd) +{ + // run the Quality Assurance data producer + + AliCodeTimerAuto("") + TString detStr = detectors; + for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) { + if (!IsSelected(fgkDetectorName[iDet], detStr)) + continue; + AliQADataMakerRec * qadm = GetQADataMaker(iDet); + if (!qadm) + continue; + AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet])); + AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet])); + + qadm->Exec(AliQA::kESDS, esd) ; + qadm->Increment() ; + + AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet])); + } + if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) { + AliError(Form("the following detectors were not found: %s", + detStr.Data())); + if (fStopOnError) + return kFALSE; + } + + return kTRUE; + +} + +//_____________________________________________________________________________ +void AliReconstruction::CheckQA() +{ +// check the QA of SIM for this run and remove the detectors +// with status Fatal + + TString newRunLocalReconstruction ; + TString newRunTracking ; + TString newFillESD ; + + for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) { + TString detName(AliQA::GetDetName(iDet)) ; + AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX(iDet)) ; + if ( qa->IsSet(AliQA::DETECTORINDEX(iDet), AliQA::kSIM, AliQA::kFATAL)) { + AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ; + } else { + if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) || + fRunLocalReconstruction.Contains("ALL") ) { + newRunLocalReconstruction += detName ; + newRunLocalReconstruction += " " ; + } + if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) || + fRunTracking.Contains("ALL") ) { + newRunTracking += detName ; + newRunTracking += " " ; + } + if ( fFillESD.Contains(AliQA::GetDetName(iDet)) || + fFillESD.Contains("ALL") ) { + newFillESD += detName ; + newFillESD += " " ; + } + } + } + fRunLocalReconstruction = newRunLocalReconstruction ; + fRunTracking = newRunTracking ; + fFillESD = newFillESD ; +} + +//_____________________________________________________________________________ +Int_t AliReconstruction::GetDetIndex(const char* detector) +{ + // return the detector index corresponding to detector + Int_t index = -1 ; + for (index = 0; index < fgkNDetectors ; index++) { + if ( strcmp(detector, fgkDetectorName[index]) == 0 ) + break ; + } + return index ; +}