X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONESDInterface.cxx;h=3a674b00380713e7fa11a44b3a43a8b259c77ff9;hb=a79a24248c61aef79b22bdc31a612d2319fcfe28;hp=589bf70e0b5cf56df014f633b05d5576420adcaf;hpb=630711edefd71029942090b543cf767a964d0dbf;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONESDInterface.cxx b/MUON/AliMUONESDInterface.cxx index 589bf70e0b5..3a674b00380 100644 --- a/MUON/AliMUONESDInterface.cxx +++ b/MUON/AliMUONESDInterface.cxx @@ -22,15 +22,20 @@ #include "AliMUONVClusterStore.h" #include "AliMUONVDigit.h" #include "AliMUONVDigitStore.h" +#include "AliMUONLocalTrigger.h" +#include "AliMUONTriggerTrack.h" +#include "AliMUONVTriggerStore.h" #include "AliMUON2DMapIterator.h" #include "AliMUONTrackParam.h" #include "AliMUONTrackExtrap.h" #include "AliMUONConstants.h" +#include "AliMUONTracker.h" +#include "AliMUONRecoParam.h" +#include "AliMUONVTrackReconstructor.h" #include "AliMpExMapIterator.h" #include "AliMpVSegmentation.h" #include "AliMpSegmentation.h" -#include "AliMpIntPair.h" #include "AliMpPad.h" #include "AliESDEvent.h" @@ -53,9 +58,12 @@ /// /// 1) using the static methods converting the objects one by one /// -/// 2) loading a whole ESDEvent and using the getters and/or the iterators +/// 2) loading a whole ESDEvent and using the finders and/or the iterators /// to access the corresponding MUON objects /// +/// note: You can set the recoParam used to refit the MUON track with ResetTracker(...); +/// By default we use Kalman filter + Smoother +/// /// \author Philippe Pillot //----------------------------------------------------------------------------- @@ -63,17 +71,22 @@ ClassImp(AliMUONESDInterface) /// \endcond +AliMUONRecoParam* AliMUONESDInterface::fgRecoParam = 0x0; +AliMUONVTrackReconstructor* AliMUONESDInterface::fgTracker = 0x0; + TString AliMUONESDInterface::fgTrackStoreName = "AliMUONTrackStoreV1"; TString AliMUONESDInterface::fgClusterStoreName = "AliMUONClusterStoreV2"; TString AliMUONESDInterface::fgDigitStoreName = "AliMUONDigitStoreV2R"; +TString AliMUONESDInterface::fgTriggerStoreName = "AliMUONTriggerStoreV1"; //_____________________________________________________________________________ AliMUONESDInterface::AliMUONESDInterface() : TObject(), - fTracks(0x0), - fDigits(0x0), - fClusterMap(0x0), - fDigitMap(0x0) +fTracks(0x0), +fDigits(0x0), +fTriggers(0x0), +fClusterMap(0x0), +fDigitMap(0x0) { /// Default constructor } @@ -84,6 +97,7 @@ AliMUONESDInterface::~AliMUONESDInterface() /// Destructor delete fTracks; delete fDigits; + delete fTriggers; delete fClusterMap; delete fDigitMap; } @@ -98,6 +112,7 @@ void AliMUONESDInterface::Clear(Option_t*) /// clear memory delete fTracks; fTracks = 0x0; delete fDigits; fDigits = 0x0; + delete fTriggers; fTriggers = 0x0; delete fClusterMap; fClusterMap = 0x0; delete fDigitMap; fDigitMap = 0x0; } @@ -113,6 +128,9 @@ void AliMUONESDInterface::Reset() if (fDigits) fDigits->Clear("C"); else fDigits = NewDigitStore(); + if (fTriggers) fTriggers->Clear("C"); + else fTriggers = NewTriggerStore(); + if (fClusterMap) fClusterMap->Clear(); else fClusterMap = new AliMpExMap; fClusterMap->SetOwner(kTRUE); @@ -137,6 +155,12 @@ void AliMUONESDInterface::LoadEvent(AliESDEvent& esdEvent) // get ESD track AliESDMuonTrack* esdTrack = esdEvent.GetMuonTrack(iTrack); + // fill trigger store if related info are availables + if (esdTrack->ContainTriggerData()) Add(*esdTrack, *fTriggers); + + // fill tracker data if availables + if (!esdTrack->ContainTrackerData()) continue; + // add it to track store AliMUONTrack* track = Add(*esdTrack, *fTracks); @@ -170,7 +194,7 @@ void AliMUONESDInterface::LoadEvent(AliESDEvent& esdEvent) // loop over ESD pads Int_t nPads = esdCluster->GetNPads(); - for (Int_t iPad = 0; iPad < nPads; iPad++) { + for (Int_t iPad = 0; iPad < nPads; iPad++) { // get ESD pad AliESDMuonPad *esdPad = (AliESDMuonPad*) esdCluster->GetPads().UncheckedAt(iPad); @@ -250,6 +274,13 @@ Int_t AliMUONESDInterface::GetNDigitsInCluster(UInt_t clusterId) const return cluster ? cluster->GetNDigits() : 0; } +//___________________________________________________________________________ +Int_t AliMUONESDInterface::GetNTriggers() const +{ + /// return the number of triggers + return fTriggers ? fTriggers->GetSize() : 0; +} + //___________________________________________________________________________ AliMUONTrack* AliMUONESDInterface::FindTrack(UInt_t trackId) const { @@ -301,6 +332,13 @@ AliMUONVDigit* AliMUONESDInterface::FindDigit(UInt_t digitId) const return digit; } +//___________________________________________________________________________ +AliMUONLocalTrigger* AliMUONESDInterface::FindLocalTrigger(Int_t boardNumber) const +{ + /// return MUON local trigger "boardNumber" + return (fTriggers) ? fTriggers->FindLocal(boardNumber) : 0x0; +} + //___________________________________________________________________________ TIterator* AliMUONESDInterface::CreateTrackIterator() const { @@ -369,6 +407,13 @@ TIterator* AliMUONESDInterface::CreateDigitIteratorInCluster(UInt_t clusterId) c return 0x0; } +//___________________________________________________________________________ +TIterator* AliMUONESDInterface::CreateLocalTriggerIterator() const +{ + /// return iterator over all local trigger + return fTriggers ? fTriggers->CreateLocalIterator() : 0x0; +} + //___________________________________________________________________________ AliMUONVCluster* AliMUONESDInterface::FindClusterInTrack(const AliMUONTrack& track, UInt_t clusterId) const { @@ -389,6 +434,32 @@ AliMUONVCluster* AliMUONESDInterface::FindClusterInTrack(const AliMUONTrack& tra // static methods // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// +//_____________________________________________________________________________ +void AliMUONESDInterface::ResetTracker(const AliMUONRecoParam* recoParam) +{ + /// Reset the MUON tracker using "recoParam" if provided. + /// If not provided, will use Kalman filter + Smoother + + delete fgTracker; + delete fgRecoParam; + + if (recoParam) { + + fgRecoParam = new AliMUONRecoParam(*recoParam); + + } else { + + fgRecoParam = AliMUONRecoParam::GetLowFluxParam(); + fgRecoParam->SetTrackingMode("KALMAN"); + fgRecoParam->UseSmoother(kTRUE); + fgRecoParam->SetBendingVertexDispersion(10.); + + } + + fgTracker = AliMUONTracker::CreateTrackReconstructor(fgRecoParam,0x0); + +} + //_____________________________________________________________________________ AliMUONVTrackStore* AliMUONESDInterface::NewTrackStore() { @@ -425,6 +496,18 @@ AliMUONVDigitStore* AliMUONESDInterface::NewDigitStore() return reinterpret_cast(classPtr->New()); } +//_____________________________________________________________________________ +AliMUONVTriggerStore* AliMUONESDInterface::NewTriggerStore() +{ + /// Create an empty trigger store of type fgTriggerStoreName + TClass* classPtr = TClass::GetClass(fgTriggerStoreName); + if (!classPtr || !classPtr->InheritsFrom("AliMUONVTriggerStore")) { + cout<<"E-AliMUONESDInterface::NewTriggerStore: Unable to create store of type "<(classPtr->New()); +} + //_________________________________________________________________________ void AliMUONESDInterface::GetParamAtVertex(const AliESDMuonTrack& esdTrack, AliMUONTrackParam& trackParam) { @@ -557,7 +640,18 @@ void AliMUONESDInterface::SetParamCov(const AliMUONTrackParam& trackParam, AliES //_____________________________________________________________________________ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrack& track) { - /// Transfert data from ESDMuon track to MUON track + /// Transfert data from ESDMuon track to MUON track. + /// The track parameters at each cluster are obtained by refitting the track + /// or by extrapolating the parameters at the first one if the refit failed. + /// note: You can set the recoParam used to refit the MUON track with ResetTracker(...); + /// By default we use Kalman filter + Smoother + + // if the ESDMuon track is a ghost then return an empty MUON track + if (!esdTrack.ContainTrackerData()) { + track.Reset(); + track.SetUniqueID(esdTrack.GetUniqueID()); + return; + } track.Clear("C"); @@ -571,7 +665,6 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac track.SetMatchTrigger(esdTrack.GetMatchTrigger()); track.SetLoTrgNum(-1); track.SetChi2MatchTrigger(esdTrack.GetChi2MatchTrigger()); - track.SetTrackID(0); track.SetHitsPatternInTrigCh(esdTrack.GetHitsPatternInTrigCh()); track.SetLocalTrigger(esdTrack.LoCircuit(), esdTrack.LoStripX(), esdTrack.LoStripY(), esdTrack.LoDev(), esdTrack.LoLpt(), esdTrack.LoHpt()); @@ -617,15 +710,15 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac firstTrackParam->SetZ(esdTrack.GetZUncorrected()); // reset the z to the one stored in ESD AliMUONTrackExtrap::ExtrapToZCov(firstTrackParam,firstTrackParam->GetClusterPtr()->GetZ()); - // Compute track parameters and covariances at each cluster from those at the first one - track.UpdateCovTrackParamAtCluster(); + // refit the track to get better parameters and covariances at each cluster (temporary disable track improvement) + if (!fgTracker) ResetTracker(); + if (!fgTracker->RefitTrack(track, kFALSE)) track.UpdateCovTrackParamAtCluster(); } else { - // get number of the first hit chamber (according to the MUONClusterMap if not empty) + // get number of the first hit chamber according to the MUONClusterMap Int_t firstCh = 0; - if (esdTrack.GetMuonClusterMap() != 0) while (!esdTrack.IsInMuonClusterMap(firstCh)) firstCh++; - else firstCh = AliMUONConstants::ChamberNumber(param.GetZ()); + while (firstCh < 10 && !esdTrack.IsInMuonClusterMap(firstCh)) firstCh++; // produce fake cluster at this chamber cluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(firstCh, 0, 0)); @@ -637,11 +730,44 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac } + // set the MC label from ESD track + track.SetMCLabel(esdTrack.GetLabel()); + delete cluster; delete cStore; } +//_____________________________________________________________________________ +void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONLocalTrigger& locTrg) +{ + /// Transfert trigger data from ESDMuon track to the MUONLocalTtrigger object + + // if the ESDMuon track is a ghost then return an empty MUON track + if (!esdTrack.ContainTriggerData()) { + AliMUONLocalTrigger emptyLocTrg; + locTrg = emptyLocTrg; + return; + } + + locTrg.SetLoCircuit(esdTrack.LoCircuit()); + locTrg.SetLoStripX(esdTrack.LoStripX()); + locTrg.SetLoStripY(esdTrack.LoStripY()); + locTrg.SetDeviation(esdTrack.LoDev()); + locTrg.SetLoLpt(esdTrack.LoLpt()); + locTrg.SetLoHpt(esdTrack.LoHpt()); + locTrg.SetLoTrigY(1); + locTrg.SetX1Pattern(esdTrack.GetTriggerX1Pattern()); + locTrg.SetX2Pattern(esdTrack.GetTriggerX2Pattern()); + locTrg.SetX3Pattern(esdTrack.GetTriggerX3Pattern()); + locTrg.SetX4Pattern(esdTrack.GetTriggerX4Pattern()); + locTrg.SetY1Pattern(esdTrack.GetTriggerY1Pattern()); + locTrg.SetY2Pattern(esdTrack.GetTriggerY2Pattern()); + locTrg.SetY3Pattern(esdTrack.GetTriggerY3Pattern()); + locTrg.SetY4Pattern(esdTrack.GetTriggerY4Pattern()); + +} + //_____________________________________________________________________________ void AliMUONESDInterface::ESDToMUON(const AliESDMuonCluster& esdCluster, AliMUONVCluster& cluster) { @@ -654,6 +780,7 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonCluster& esdCluster, AliMUON cluster.SetErrXY(esdCluster.GetErrX(),esdCluster.GetErrY()); cluster.SetCharge(esdCluster.GetCharge()); cluster.SetChi2(esdCluster.GetChi2()); + cluster.SetMCLabel(esdCluster.GetLabel()); if (esdCluster.PadsStored()) { Int_t nPads = esdCluster.GetNPads(); @@ -669,26 +796,45 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonPad& esdPad, AliMUONVDigit& /// Transfert data from ESDMuon pad to MUON digit const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(esdPad.GetDetElemId(), esdPad.GetManuId()); - AliMpPad pad = seg->PadByLocation(AliMpIntPair(esdPad.GetManuId(), esdPad.GetManuChannel()), kFALSE); + AliMpPad pad = seg->PadByLocation(esdPad.GetManuId(), esdPad.GetManuChannel(), kFALSE); - digit.Saturated(kFALSE); + digit.Saturated(esdPad.IsSaturated()); digit.Used(kFALSE); - digit.Calibrated(kTRUE); + digit.Calibrated(esdPad.IsCalibrated()); digit.SetUniqueID(esdPad.GetUniqueID()); digit.SetCharge(esdPad.GetCharge()); digit.SetADC(esdPad.GetADC()); - digit.SetPadXY(pad.GetIndices().GetFirst(), pad.GetIndices().GetSecond()); + digit.SetPadXY(pad.GetIx(), pad.GetIy()); } //_____________________________________________________________________________ -void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& esdTrack, const Double_t vertex[3], const AliMUONVDigitStore* digits) +void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& esdTrack, const Double_t vertex[3], + const AliMUONVDigitStore* digits, const AliMUONLocalTrigger* locTrg) { /// Transfert data from MUON track to ESDMuon track /// Incorporate the ESDPads if the digits are provided + /// Add trigger info if the MUON track is matched with a trigger track + + // empty MUON track -> produce a ghost ESDMuon track if trigger info are available otherwise produce an empty track + if (track.GetNClusters() == 0) { + if (locTrg) MUONToESD(*locTrg, esdTrack, track.GetUniqueID()); + else { + cout<<"W-AliMUONESDInterface::MUONToESD: will produce an empty ESDMuon track"<((track.GetTrackParamAtCluster())->First()); SetParamAtFirstCluster(*trackParam, esdTrack); @@ -704,14 +850,6 @@ void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(&trackParamAtDCA, vertex[2]); SetParamAtDCA(trackParamAtDCA, esdTrack); - // set global info - esdTrack.SetUniqueID(track.GetUniqueID()); - esdTrack.SetChi2(track.GetGlobalChi2()); - esdTrack.SetNHit(track.GetNClusters()); - esdTrack.SetLocalTrigger(track.GetLocalTrigger()); - esdTrack.SetChi2MatchTrigger(track.GetChi2MatchTrigger()); - esdTrack.SetHitsPatternInTrigCh(track.GetHitsPatternInTrigCh()); - // set muon cluster info AliESDMuonCluster esdCluster; esdTrack.SetMuonClusterMap(0); @@ -722,6 +860,68 @@ void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& trackParam = static_cast(track.GetTrackParamAtCluster()->After(trackParam)); } + // set trigger info + esdTrack.SetLocalTrigger(track.GetLocalTrigger()); + esdTrack.SetChi2MatchTrigger(track.GetChi2MatchTrigger()); + esdTrack.SetHitsPatternInTrigCh(track.GetHitsPatternInTrigCh()); + if (locTrg) { + esdTrack.SetTriggerX1Pattern(locTrg->GetX1Pattern()); + esdTrack.SetTriggerY1Pattern(locTrg->GetY1Pattern()); + esdTrack.SetTriggerX2Pattern(locTrg->GetX2Pattern()); + esdTrack.SetTriggerY2Pattern(locTrg->GetY2Pattern()); + esdTrack.SetTriggerX3Pattern(locTrg->GetX3Pattern()); + esdTrack.SetTriggerY3Pattern(locTrg->GetY3Pattern()); + esdTrack.SetTriggerX4Pattern(locTrg->GetX4Pattern()); + esdTrack.SetTriggerY4Pattern(locTrg->GetY4Pattern()); + } else { + esdTrack.SetTriggerX1Pattern(0); + esdTrack.SetTriggerY1Pattern(0); + esdTrack.SetTriggerX2Pattern(0); + esdTrack.SetTriggerY2Pattern(0); + esdTrack.SetTriggerX3Pattern(0); + esdTrack.SetTriggerY3Pattern(0); + esdTrack.SetTriggerX4Pattern(0); + esdTrack.SetTriggerY4Pattern(0); + } + +} + +//_____________________________________________________________________________ +void AliMUONESDInterface::MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuonTrack& esdTrack, + UInt_t trackId, const AliMUONTriggerTrack* triggerTrack) +{ + /// Build ghost ESDMuon track containing only informations about trigger track + + esdTrack.Reset(); + esdTrack.SetUniqueID(trackId); + + // set trigger info + AliMUONTrack muonTrack; + muonTrack.SetLocalTrigger(locTrg.LoCircuit(), + locTrg.LoStripX(), + locTrg.LoStripY(), + locTrg.GetDeviation(), + locTrg.LoLpt(), + locTrg.LoHpt()); + esdTrack.SetLocalTrigger(muonTrack.GetLocalTrigger()); + esdTrack.SetChi2MatchTrigger(0.); + esdTrack.SetTriggerX1Pattern(locTrg.GetX1Pattern()); + esdTrack.SetTriggerY1Pattern(locTrg.GetY1Pattern()); + esdTrack.SetTriggerX2Pattern(locTrg.GetX2Pattern()); + esdTrack.SetTriggerY2Pattern(locTrg.GetY2Pattern()); + esdTrack.SetTriggerX3Pattern(locTrg.GetX3Pattern()); + esdTrack.SetTriggerY3Pattern(locTrg.GetY3Pattern()); + esdTrack.SetTriggerX4Pattern(locTrg.GetX4Pattern()); + esdTrack.SetTriggerY4Pattern(locTrg.GetY4Pattern()); + UShort_t hitPattern = 0; + if(triggerTrack){ + hitPattern = triggerTrack->GetHitsPatternInTrigCh(); + esdTrack.SetHitsPatternInTrigCh(hitPattern); + esdTrack.SetThetaXUncorrected(triggerTrack->GetThetax()); + esdTrack.SetThetaYUncorrected(triggerTrack->GetThetay()); + esdTrack.SetNonBendingCoorUncorrected(triggerTrack->GetX11()); + esdTrack.SetBendingCoorUncorrected(triggerTrack->GetY11()); + } } //_____________________________________________________________________________ @@ -737,6 +937,7 @@ void AliMUONESDInterface::MUONToESD(const AliMUONVCluster& cluster, AliESDMuonCl esdCluster.SetErrXY(cluster.GetErrX(), cluster.GetErrY()); esdCluster.SetCharge(cluster.GetCharge()); esdCluster.SetChi2(cluster.GetChi2()); + esdCluster.SetLabel(cluster.GetMCLabel()); if (digits) { // transfert all data if required @@ -762,18 +963,31 @@ void AliMUONESDInterface::MUONToESD(const AliMUONVDigit& digit, AliESDMuonPad& e esdPad.SetUniqueID(digit.GetUniqueID()); esdPad.SetADC(digit.ADC()); esdPad.SetCharge(digit.Charge()); + esdPad.SetCalibrated(digit.IsCalibrated()); + esdPad.SetSaturated(digit.IsSaturated()); } //___________________________________________________________________________ AliMUONTrack* AliMUONESDInterface::Add(const AliESDMuonTrack& esdTrack, AliMUONVTrackStore& trackStore) { /// Create MUON track from ESDMuon track and add it to the store - /// return a pointer to the track into the store + /// return a pointer to the track into the store (0x0 if the track already exist) + if(trackStore.FindObject(esdTrack.GetUniqueID())) return 0x0; AliMUONTrack* track = trackStore.Add(AliMUONTrack()); ESDToMUON(esdTrack, *track); return track; } +//___________________________________________________________________________ +void AliMUONESDInterface::Add(const AliESDMuonTrack& esdTrack, AliMUONVTriggerStore& triggerStore) +{ + /// Create MUON local trigger from ESDMuon track and add it to the store if not already there + if (triggerStore.FindLocal(esdTrack.LoCircuit())) return; + AliMUONLocalTrigger locTrg; + ESDToMUON(esdTrack, locTrg); + triggerStore.Add(locTrg); +} + //___________________________________________________________________________ AliMUONVCluster* AliMUONESDInterface::Add(const AliESDMuonCluster& esdCluster, AliMUONVClusterStore& clusterStore) {