X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=MUON%2FMUONRefit.C;h=7b94be63193683a5a212e96fd75d24f992ffe722;hp=706675927589c353ea5b04bd2ecc7758c78712e9;hb=36d042d445f76ec3fe68f389d496dcdd5347e7c8;hpb=630711edefd71029942090b543cf767a964d0dbf diff --git a/MUON/MUONRefit.C b/MUON/MUONRefit.C index 70667592758..7b94be63193 100644 --- a/MUON/MUONRefit.C +++ b/MUON/MUONRefit.C @@ -32,60 +32,86 @@ #include // STEER includes -#include "AliMagFMaps.h" -#include "AliTracker.h" #include "AliESDEvent.h" #include "AliESDMuonTrack.h" -#include "AliRecoParam.h" #include "AliCDBManager.h" #include "AliGeomManager.h" // MUON includes -#include "AliMpCDB.h" +#include "AliMUONCDB.h" #include "AliMUONRecoParam.h" #include "AliMUONESDInterface.h" #include "AliMUONRefitter.h" #include "AliMUONVDigit.h" -#include "AliMUONVCluster.h" -#include "AliMUONVClusterStore.h" #include "AliMUONTrack.h" #include "AliMUONVTrackStore.h" #include "AliMUONTrackParam.h" -#include "AliMUONTrackExtrap.h" #endif const Int_t printLevel = 1; -void Prepare(); TTree* GetESDTree(TFile *esdFile); //----------------------------------------------------------------------- -void MUONRefit(Int_t nevents = -1, const char* esdFileNameIn = "AliESDs.root", const char* esdFileNameOut = "AliESDs_New.root") +void MUONRefit(Int_t nevents = -1, const char* esdFileNameIn = "AliESDs.root", const char* esdFileNameOut = "AliESDs_New.root", + const char* geoFilename = "geometry.root", const char* ocdbPath = "local://$ALICE_ROOT/OCDB") { + /// Example of muon refitting: /// refit ESD tracks from ESD pads (i.e. re-clusterized the attached ESD clusters); /// reset the charge of the digit using their raw charge before refitting; /// compare results with original ESD tracks; /// write results in a new ESD file - // prepare the refitting - gRandom->SetSeed(1); - Prepare(); - AliMUONESDInterface esdInterface; - AliMUONRefitter refitter; - refitter.Connect(&esdInterface); - // open the ESD file and tree TFile* esdFile = TFile::Open(esdFileNameIn); TTree* esdTree = GetESDTree(esdFile); - // create the ESD output tree - gROOT->cd(); - TTree* newESDTree = esdTree->CloneTree(0); - // connect ESD event to the ESD tree AliESDEvent* esd = new AliESDEvent(); esd->ReadFromTree(esdTree); - + + // create the ESD output file and tree + TFile* newESDFile = TFile::Open(esdFileNameOut, "RECREATE"); + newESDFile->SetCompressionLevel(2); + + // connect ESD event to the ESD tree (recreate track branch for backward compatibility) + esdTree->SetBranchStatus("*MuonTracks*",0); + TTree* newESDTree = esdTree->CloneTree(0); + esdTree->SetBranchStatus("*MuonTracks*",1); + esd->WriteToTree(newESDTree); + + // get run number + if (esdTree->GetEvent(0) <= 0) { + Error("MUONRefit", "no ESD object found for event 0"); + return; + } + Int_t runNumber = esd->GetRunNumber(); + + // Import TGeo geometry + if (!gGeoManager) { + AliGeomManager::LoadGeometry(geoFilename); + if (!gGeoManager) { + Error("MUONRefit", "getting geometry from file %s failed", "generated/galice.root"); + exit(-1); + } + } + + // load necessary data from OCDB + AliCDBManager::Instance()->SetDefaultStorage(ocdbPath); + AliCDBManager::Instance()->SetRun(runNumber); + if (!AliMUONCDB::LoadField()) return; + if (!AliMUONCDB::LoadMapping(kTRUE)) return; + + // reconstruction parameters for the refitting + AliMUONRecoParam* recoParam = AliMUONRecoParam::GetLowFluxParam(); + Info("MUONRefit", "\n Reconstruction parameters for refitting:"); + recoParam->Print("FULL"); + + AliMUONESDInterface esdInterface; + AliMUONRefitter refitter(recoParam); + refitter.Connect(&esdInterface); + gRandom->SetSeed(1); + // timer start... TStopwatch timer; @@ -101,21 +127,29 @@ void MUONRefit(Int_t nevents = -1, const char* esdFileNameIn = "AliESDs.root", c // get the ESD of current event esdTree->GetEvent(iEvent); if (!esd) { - Error("CheckESD", "no ESD object found for event %d", iEvent); + Error("MUONRefit", "no ESD object found for event %d", iEvent); return; } Int_t nTracks = (Int_t)esd->GetNumberOfMuonTracks(); if (nTracks < 1) continue; // load the current event - esdInterface.LoadEvent(*esd); + esdInterface.LoadEvent(*esd, kFALSE); - // loop over digit to modify their charge + // remove digits and clusters from ESD + esd->FindListObject("MuonClusters")->Clear("C"); + esd->FindListObject("MuonPads")->Clear("C"); + + // loop over digits to modify their charge AliMUONVDigit *digit; TIter next(esdInterface.CreateDigitIterator()); - while ((digit = static_cast(next()))) digit->SetCharge(digit->ADC()); + while ((digit = static_cast(next()))) { + digit->SetCharge(digit->ADC()); + digit->Calibrated(kFALSE); + } // refit the tracks from digits + refitter.SetFirstClusterIndex(0); AliMUONVTrackStore* newTrackStore = refitter.ReconstructFromDigits(); //----------------------------------------------// @@ -127,18 +161,30 @@ void MUONRefit(Int_t nevents = -1, const char* esdFileNameIn = "AliESDs.root", c // get the ESD track AliESDMuonTrack* esdTrack = (AliESDMuonTrack*) esdTracks->UncheckedAt(iTrack); + + // skip ghost tracks (leave them unchanged in the new ESD file) + if (!esdTrack->ContainTrackerData()) continue; + // get the corresponding MUON track AliMUONTrack* track = esdInterface.FindTrack(esdTrack->GetUniqueID()); + // Find the corresponding re-fitted MUON track AliMUONTrack* newTrack = (AliMUONTrack*) newTrackStore->FindObject(esdTrack->GetUniqueID()); // replace the content of the current ESD track or remove it if the refitting has failed - if (newTrack) { + if (newTrack && (!recoParam->ImproveTracks() || newTrack->IsImproved())) { + + // fill the track info Double_t vertex[3] = {esdTrack->GetNonBendingCoor(), esdTrack->GetBendingCoor(), esdTrack->GetZ()}; - AliMUONESDInterface::MUONToESD(*newTrack, *esdTrack, vertex, esdInterface.GetDigits()); - } else { - esdTracks->Remove(esdTrack); - } + AliMUONESDInterface::MUONToESD(*newTrack, *esdTrack, vertex); + + // add the clusters (and the digits if previously there) + for (Int_t i = 0; i < newTrack->GetNClusters(); i++) { + AliMUONTrackParam *param = static_cast(newTrack->GetTrackParamAtCluster()->UncheckedAt(i)); + AliMUONESDInterface::MUONToESD(*(param->GetClusterPtr()), *esd, esdInterface.GetDigits()); + } + + } else esdTracks->Remove(esdTrack); // print initial and re-fitted track parameters at first cluster if any if (printLevel>0) { @@ -171,56 +217,19 @@ void MUONRefit(Int_t nevents = -1, const char* esdFileNameIn = "AliESDs.root", c timer.Stop(); // write output ESD tree - TFile* newESDFile = TFile::Open(esdFileNameOut, "RECREATE"); - newESDFile->SetCompressionLevel(2); + newESDFile->cd(); newESDTree->Write(); + delete newESDTree; newESDFile->Close(); // free memory esdFile->Close(); - delete newESDTree; delete esd; + delete recoParam; cout<SetDefaultStorage("local://$ALICE_ROOT"); - man->SetRun(0); - if ( ! AliMpCDB::LoadDDLStore() ) { - Error("MUONRefit","Could not access mapping from OCDB !"); - exit(-1); - } - - // set reconstruction parameters - AliMUONRecoParam *muonRecoParam = AliMUONRecoParam::GetLowFluxParam(); - muonRecoParam->CombineClusterTrackReco(kFALSE); - muonRecoParam->Print("FULL"); - AliRecoParam::Instance()->RegisterRecoParam(muonRecoParam); - -} - //----------------------------------------------------------------------- TTree* GetESDTree(TFile *esdFile) {