From 683cb6c5538805954750251a818e556da428b79f Mon Sep 17 00:00:00 2001 From: ivana Date: Tue, 11 Dec 2007 16:28:02 +0000 Subject: [PATCH] The changes to perform the trigger chamber efficiency determination from ESD (without any modification of AliESDMuonTrack): - Using the remaining 8 bits (only 7 bits needed for this purpose) of the trigger chamber hit pattern, which is already in the AliESDMuonTrack, defined as an UShort_t of 16 bits. - Also included lots of changes in AliMUONTrackHitPattern and AliMUONTriggerEfficiencyCells (in this last class, just removed the data members and method for the original trigger efficiency calculation, which were not depending on local boards. In this way the calibration object gets a considerable reduction in size. (Diego) --- MUON/AliMUONReconstructor.cxx | 22 +- MUON/AliMUONReconstructor.h | 6 +- MUON/AliMUONTrackHitPattern.cxx | 850 ++++++++++++++++-- MUON/AliMUONTrackHitPattern.h | 110 ++- MUON/AliMUONTracker.cxx | 12 +- MUON/AliMUONTracker.h | 5 +- MUON/AliMUONTriggerEfficiencyCells.cxx | 254 ++---- MUON/AliMUONTriggerEfficiencyCells.h | 36 +- MUON/AliMUONVTrackReconstructor.cxx | 160 +--- .../Run0_99999999_v0_s0.root | Bin 23517 -> 6068 bytes MUON/MUONrecLinkDef.h | 1 - MUON/libMUONrec.pkg | 1 - 12 files changed, 956 insertions(+), 501 deletions(-) diff --git a/MUON/AliMUONReconstructor.cxx b/MUON/AliMUONReconstructor.cxx index 0ddd4ebe331..f47a7558b7e 100644 --- a/MUON/AliMUONReconstructor.cxx +++ b/MUON/AliMUONReconstructor.cxx @@ -90,7 +90,6 @@ #include "AliMUONRecoParam.h" #include "AliMUONSimpleClusterServer.h" #include "AliMUONTracker.h" -#include "AliMUONTriggerChamberEff.h" #include "AliMUONTriggerCircuit.h" #include "AliMUONTriggerCrateStore.h" #include "AliMUONTriggerStoreV1.h" @@ -132,8 +131,7 @@ fCalibrationData(0x0), fDigitCalibrator(0x0), fClusterServer(0x0), fTriggerStore(0x0), -fTrackStore(0x0), -fTrigChamberEff(0x0) +fTrackStore(0x0) { /// normal ctor @@ -161,7 +159,6 @@ AliMUONReconstructor::~AliMUONReconstructor() delete fClusterServer; delete fTriggerStore; delete fTrackStore; - delete fTrigChamberEff; } //_____________________________________________________________________________ @@ -294,19 +291,6 @@ AliMUONReconstructor::CreateTriggerCircuit() const } -//_____________________________________________________________________________ -void -AliMUONReconstructor::CreateTriggerChamberEff() const -{ - /// Create (and create if necessary) the trigger chamber efficiency class - if (fTrigChamberEff) return; - - AliCodeTimerAuto("") - - fTrigChamberEff = new AliMUONTriggerChamberEff(fTransformer,fDigitMaker,kTRUE); - //fTrigChamberEff->SetDebugLevel(1); -} - //_____________________________________________________________________________ AliTracker* AliMUONReconstructor::CreateTracker() const @@ -315,7 +299,6 @@ AliMUONReconstructor::CreateTracker() const CreateTriggerCircuit(); CreateDigitMaker(); - CreateTriggerChamberEff(); CreateClusterServer(); if (!fClusterServer) @@ -329,8 +312,7 @@ AliMUONReconstructor::CreateTracker() const AliMUONTracker* tracker = new AliMUONTracker(*fClusterServer, fDigitMaker, fTransformer, - fTriggerCircuit, - fTrigChamberEff); + fTriggerCircuit); return tracker; } diff --git a/MUON/AliMUONReconstructor.h b/MUON/AliMUONReconstructor.h index d8d0fa997d6..62a7b3aa191 100644 --- a/MUON/AliMUONReconstructor.h +++ b/MUON/AliMUONReconstructor.h @@ -33,8 +33,6 @@ class AliMUONCalibrationData; class AliMUONTracker; class AliMUONVTrackStore; -class AliMUONTriggerChamberEff; - class AliMUONRecoParam; class AliMUONVClusterFinder; @@ -75,7 +73,6 @@ private: void CreateDigitMaker() const; void CreateTriggerCircuit() const; void CreateClusterServer() const; - void CreateTriggerChamberEff() const; void FillTreeR(AliMUONVTriggerStore* triggerStore, TTree& clustersTree) const; @@ -93,11 +90,10 @@ private: mutable AliMUONVClusterServer* fClusterServer; //!< Clusterizer mutable AliMUONVTriggerStore* fTriggerStore; //!< Trigger container mutable AliMUONVTrackStore* fTrackStore; //!< Track container - mutable AliMUONTriggerChamberEff* fTrigChamberEff; //!< pointer to trigger chamber efficiency class static AliMUONRecoParam* fgRecoParam; //!< parameters used to tune the MUON reconstruction - ClassDef(AliMUONReconstructor,4) // Implementation of AliReconstructor + ClassDef(AliMUONReconstructor,5) // Implementation of AliReconstructor }; #endif diff --git a/MUON/AliMUONTrackHitPattern.cxx b/MUON/AliMUONTrackHitPattern.cxx index 3a77b9041d5..3049b0c7252 100644 --- a/MUON/AliMUONTrackHitPattern.cxx +++ b/MUON/AliMUONTrackHitPattern.cxx @@ -20,7 +20,7 @@ /// \class AliMUONTrackHitPattern /// /// This class propagates tracks to trigger chambers -/// searching for fired strips. +/// searching for matching trigger tracks and fired strips. /// /// To each track, a hit pattern for trigger chambers is set. /// The hit pattern is a UShort_t with 8 bits used: @@ -32,7 +32,7 @@ /// cathode: bending | non-bending /// /// The main method is: -/// * GetHitPattern +/// * ExecuteValidation /// /// \author Diego Stocco //----------------------------------------------------------------------------- @@ -58,6 +58,10 @@ #include "AliMpDEManager.h" #include "AliMUONReconstructor.h" #include "AliMUONRecoParam.h" +#include "AliMUONTriggerTrack.h" +#include "AliMUONVTriggerTrackStore.h" + +#include "AliMpConstants.h" #include "AliMagF.h" #include "AliLog.h" @@ -68,6 +72,12 @@ #include #include #include +#include +#include +#include +#include + +#include /// \cond CLASSIMP ClassImp(AliMUONTrackHitPattern) // Class implementation in ROOT context @@ -79,9 +89,11 @@ AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONGeometryTransformer& const AliMUONDigitMaker& digitMaker) : TObject(), fTransformer(transformer), - fDigitMaker(digitMaker) + fDigitMaker(digitMaker), + fkMaxDistance(99999.) { /// Default constructor + InitMembers(); // Set magnetic field const AliMagF* kField = AliTracker::GetFieldMap(); @@ -94,53 +106,351 @@ AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONGeometryTransformer& AliMUONTrackHitPattern::~AliMUONTrackHitPattern(void) { /// Destructor + delete fTrigCovariance; + for(Int_t cath=0; cathZero(); + (*fTrigCovariance)(0,0) = kTrigNonBendReso * kTrigNonBendReso; + (*fTrigCovariance)(1,1) = kTrigBendReso * kTrigBendReso; + (*fTrigCovariance)(2,2) = kTrigSlopeBendReso * kTrigSlopeBendReso; + (*fTrigCovariance)(1,2) = (*fTrigCovariance)(2,1) = kTrigCovSlopeBend; + + const Int_t kMaxNpads[fgkNcathodes] = {GetMaxX(0)*GetMaxY(0), GetMaxX(1)*GetMaxY(1)}; + Char_t histoName[40]; + Char_t *cathCode[fgkNcathodes] = {"bendPlane", "nonBendPlane"}; + + const Int_t kNslats = 18; + + for(Int_t cath=0; cath(itTrack()) ) ) + { + AliMUONTrackParam trackParam(*((AliMUONTrackParam*) (track->GetTrackParamAtCluster()->Last()))); + + ApplyMCSCorrections(trackParam); + AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::DefaultChamberZ(kFirstTrigCh)); // extrap to 1st trigger chamber + + AliMUONTriggerTrack *matchedTriggerTrack = MatchTriggerTrack(track, trackParam, triggerTrackStore, triggerStore); + + UShort_t pattern = GetHitPattern(trackParam, matchedTriggerTrack, digitStore); + track->SetHitsPatternInTrigCh(pattern); + } +} + + +//______________________________________________________________________________ +AliMUONTriggerTrack * +AliMUONTrackHitPattern::MatchTriggerTrack(AliMUONTrack* track, + AliMUONTrackParam& trackParam, + const AliMUONVTriggerTrackStore& triggerTrackStore, + const AliMUONVTriggerStore& triggerStore) const +{ + // + /// Match track with trigger track + // + + Int_t matchTrigger = 0; + Int_t loTrgNum(-1); + Double_t distTriggerTrack[3], sigma2[3]; + Double_t chi2; + Double_t chi2MatchTrigger = 0., minChi2MatchTrigger = 999.; + Int_t doubleMatch = -1; // Check if track matches 2 trigger tracks + Double_t doubleChi2 = -1.; + AliMUONTriggerTrack* doubleTriggerTrack = 0x0; + AliMUONTriggerTrack* matchedTriggerTrack = 0x0; - TriggerDigits(triggerStore,digitStore); + const TMatrixD& kParamCov = trackParam.GetCovariances(); - AliMUONTrack* muonTrack; - TIter next(trackStore.CreateIterator()); + Double_t xTrack = trackParam.GetNonBendingCoor(); + Double_t yTrack = trackParam.GetBendingCoor(); + Double_t ySlopeTrack = trackParam.GetBendingSlope(); + + // Covariance matrix 3x3 (X,Y,slopeY) for tracker tracks + TMatrixD trackCov(3,3); + trackCov.Zero(); + trackCov(0,0) = kParamCov(0,0); + trackCov(1,1) = kParamCov(2,2); + trackCov(2,2) = kParamCov(3,3); + trackCov(1,2) = kParamCov(2,3); + trackCov(2,1) = kParamCov(3,2); + + TMatrixD sumCov(trackCov,TMatrixD::kPlus,*fTrigCovariance); + + Bool_t isCovOK = kTRUE; + + if (sumCov.Determinant() != 0) { + sumCov.Invert(); + } else { + AliWarning(" Determinant = 0"); + isCovOK = kFALSE; + sigma2[0] = kParamCov(0,0); + sigma2[1] = kParamCov(2,2); + sigma2[2] = kParamCov(3,3); + // sigma of distributions (trigger-track) X,Y,slopeY + const Double_t kDistSigma[3]={AliMUONConstants::TriggerNonBendingReso(), + AliMUONConstants::TriggerBendingReso(), + 1.414 * AliMUONConstants::TriggerBendingReso()/fDeltaZ}; + for (Int_t iVar = 0; iVar < 3; iVar++) sigma2[iVar] += kDistSigma[iVar] * kDistSigma[iVar]; + } - const Int_t kNTrackingCh = AliMUONConstants::NTrackingCh(); + AliMUONTriggerTrack *triggerTrack; + TIter itTriggerTrack(triggerTrackStore.CreateIterator()); + while ( ( triggerTrack = static_cast(itTriggerTrack() ) ) ) + { + distTriggerTrack[0] = triggerTrack->GetX11() - xTrack; + distTriggerTrack[1] = triggerTrack->GetY11() - yTrack; + distTriggerTrack[2] = TMath::Tan(triggerTrack->GetThetay()) - ySlopeTrack; + + if(isCovOK){ + TMatrixD paramDiff(3,1); + for(Int_t iVar = 0; iVar < 3; iVar++) + paramDiff(iVar,0) = distTriggerTrack[iVar]; + + TMatrixD tmp(sumCov,TMatrixD::kMult,paramDiff); + TMatrixD chi2M(paramDiff,TMatrixD::kTransposeMult,tmp); + chi2 = chi2M(0,0); + } + else { + chi2 = 0.; + for (Int_t iVar = 0; iVar < 3; iVar++) chi2 += distTriggerTrack[iVar]*distTriggerTrack[iVar]/sigma2[iVar]; + } - while ( ( muonTrack = static_cast(next()) ) ) + chi2 /= 3.; // Normalized Chi2: 3 degrees of freedom (X,Y,slopeY) + if (chi2 < AliMUONReconstructor::GetRecoParam()->GetMaxNormChi2MatchTrigger()) { - pattern = 0; - AliMUONTrackParam trackParam(*((AliMUONTrackParam*) (muonTrack->GetTrackParamAtCluster()->Last()))); - - ApplyMCSCorrections(trackParam); - - for(Int_t ch=0; ch<4; ++ch) + Bool_t isDoubleTrack = (TMath::Abs(chi2 - minChi2MatchTrigger)<1.); + if (chi2 < minChi2MatchTrigger && chi2 < AliMUONReconstructor::GetRecoParam()->GetMaxNormChi2MatchTrigger()) { - Int_t iChamber = kNTrackingCh+ch; - AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::DefaultChamberZ(iChamber)); - FindPadMatchingTrack(digitStore, trackParam, isMatch, iChamber); - for(Int_t cath=0; cath<2; ++cath) - { - if(isMatch[cath]) pattern |= kMask[cath][ch]; + if(isDoubleTrack) + { + doubleMatch = loTrgNum; + doubleChi2 = chi2MatchTrigger; + doubleTriggerTrack = matchedTriggerTrack; } + minChi2MatchTrigger = chi2; + chi2MatchTrigger = chi2; + loTrgNum = triggerTrack->GetLoTrgNum(); + matchedTriggerTrack = triggerTrack; + AliMUONLocalTrigger* locTrg = triggerStore.FindLocal(loTrgNum); + matchTrigger = 1; + if(locTrg->LoLpt()>0) matchTrigger = 2; + if(locTrg->LoHpt()>0) matchTrigger = 3; + } + else if(isDoubleTrack) + { + doubleMatch = triggerTrack->GetLoTrgNum(); + doubleChi2 = chi2; } - muonTrack->SetHitsPatternInTrigCh(pattern); } + } + if(doubleMatch>=0) + { // If two trigger tracks match, select the one passing more trigger cuts + AliDebug(1, Form("Two candidates found: %i and %i",loTrgNum,doubleMatch)); + AliMUONLocalTrigger* locTrg1 = triggerStore.FindLocal(doubleMatch); + if((locTrg1->LoLpt()>0 && matchTrigger<2) || (locTrg1->LoHpt() && matchTrigger<3)) + { + if(locTrg1->LoHpt()>0) matchTrigger=3; + else matchTrigger = 2; + loTrgNum = doubleMatch; + chi2MatchTrigger = doubleChi2; + matchedTriggerTrack = doubleTriggerTrack; + } + } + + track->SetMatchTrigger(matchTrigger); + track->SetLoTrgNum(loTrgNum); + track->SetChi2MatchTrigger(chi2MatchTrigger); + + AliMUONLocalTrigger* locTrg = static_cast(triggerStore.FindLocal(loTrgNum)); + + if (locTrg) + { + track->SetLocalTrigger(locTrg->LoCircuit(), + locTrg->LoStripX(), + locTrg->LoStripY(), + locTrg->LoDev(), + locTrg->LoLpt(), + locTrg->LoHpt()); + } + + return matchedTriggerTrack; +} + + +//______________________________________________________________________________ +UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTrackParam &trackParam, + AliMUONTriggerTrack* matchedTriggerTrack, + AliMUONVDigitStore& digitStore) const +{ + // + /// Get hit pattern on trigger chambers for the current track + // + UShort_t pattern = 0; + Bool_t isMatch[2]; + const Int_t kNTrackingCh = AliMUONConstants::NTrackingCh(); + + Bool_t patternFromTrigTrack = kFALSE; + + + // Calculate hit pattern from trigger track + if(matchedTriggerTrack){ + patternFromTrigTrack = PerformTrigTrackMatch(pattern, matchedTriggerTrack, digitStore); + } + + if(patternFromTrigTrack) return pattern; + + + // Calculate hit pattern from tracker track propagation + // if hit pattern from trigger track failed + + for(Int_t ch=0; ch<4; ++ch) + { + Int_t iChamber = kNTrackingCh+ch; + AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::DefaultChamberZ(iChamber)); + FindPadMatchingTrack(digitStore, trackParam, isMatch, iChamber); + for(Int_t cath=0; cath<2; ++cath) + { + if(isMatch[cath]) SetBit(pattern, cath, ch); + } + } + return pattern; +} + + +//______________________________________________________________________________ +void AliMUONTrackHitPattern::SetBit(UShort_t& pattern, Int_t cathode, Int_t chamber) const +{ + // + /// Set hits pattern + // + const Int_t kMask[2][4]= {{0x80, 0x40, 0x20, 0x10}, + {0x08, 0x04, 0x02, 0x01}}; + pattern |= kMask[cathode][chamber]; +} + + +//______________________________________________________________________________ +void AliMUONTrackHitPattern::AddEffInfo(UShort_t& pattern, Int_t slat, Int_t effType) const +{ + // + /// Set info on efficiency calculation + // + pattern += effType << 8; + pattern += slat << 10; +} + + +//______________________________________________________________________________ +void +AliMUONTrackHitPattern::ApplyMCSCorrections(AliMUONTrackParam& trackParam) const +{ + // + /// Returns uncertainties on extrapolated position. + /// Takes into account Branson plane corrections in the iron wall. + // + + const Float_t kZFilterOut = AliMUONConstants::MuonFilterZEnd(); + const Float_t kFilterThickness = TMath::Abs(kZFilterOut-AliMUONConstants::MuonFilterZBeg()); // cm + + AliMUONTrackExtrap::ExtrapToZCov(&trackParam, kZFilterOut); // Extrap to muon filter end + AliMUONTrackExtrap::AddMCSEffect(&trackParam, kFilterThickness, AliMUONConstants::MuonFilterX0()); // Add MCS effects + return; +} + + +//______________________________________________________________________________ +Bool_t +AliMUONTrackHitPattern::TriggerDigits(const AliMUONVTriggerStore& triggerStore, + AliMUONVDigitStore& digitStore) const +{ + // + /// make (S)Digit for trigger + // + + digitStore.Clear(); + + AliMUONLocalTrigger* locTrg; + TIter next(triggerStore.CreateLocalIterator()); + + while ( ( locTrg = static_cast(next()) ) ) + { + if (locTrg->IsNull()) continue; + + TArrayS xyPattern[2]; + locTrg->GetXPattern(xyPattern[0]); + locTrg->GetYPattern(xyPattern[1]); + + // do we need this ? (Ch.F.) +// for(Int_t cath=0; cath<2; ++cath) +// { +// for(Int_t ch=0; ch<4; ++ch) +// { +// if(xyPattern[cath][ch]==0) continue; +// } +// } + + Int_t nBoard = locTrg->LoCircuit(); + fDigitMaker.TriggerDigits(nBoard, xyPattern, digitStore); + } + return kTRUE; } @@ -151,7 +461,7 @@ AliMUONTrackHitPattern::FindPadMatchingTrack(AliMUONVDigitStore& digitStore, Bool_t isMatch[2], Int_t iChamber) const { // - /// Given track position, searches for matching digits. + /// Given the tracker track position, searches for matching digits. // Float_t minMatchDist[2]; @@ -159,7 +469,7 @@ AliMUONTrackHitPattern::FindPadMatchingTrack(AliMUONVDigitStore& digitStore, for(Int_t cath=0; cath<2; ++cath) { isMatch[cath]=kFALSE; - minMatchDist[cath]=9999.; + minMatchDist[cath]=fkMaxDistance/10.; } TIter next(digitStore.CreateIterator()); @@ -199,7 +509,7 @@ AliMUONTrackHitPattern::MinDistanceFromPad(Float_t xPad, Float_t yPad, Float_t z const AliMUONTrackParam& trackParam) const { // - /// Decides if the digit belongs to the track. + /// Decides if the digit belongs to the tracker track. // AliMUONTrackParam trackParamAtPadZ(trackParam); @@ -221,64 +531,450 @@ AliMUONTrackHitPattern::MinDistanceFromPad(Float_t xPad, Float_t yPad, Float_t z Float_t deltaX = TMath::Abs(xPad-xTrackAtPad)-dpx; Float_t deltaY = TMath::Abs(yPad-yTrackAtPad)-dpy; - Float_t matchDist = 99999.; + Float_t matchDist = fkMaxDistance; if(deltaX<=maxDistX && deltaY<=maxDistY) matchDist = TMath::Max(deltaX, deltaY); return matchDist; } -//______________________________________________________________________________ -void -AliMUONTrackHitPattern::ApplyMCSCorrections(AliMUONTrackParam& trackParam) const +//_____________________________________________________________________________ +Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(AliMUONVDigitStore& digitStore, Int_t &detElemId, + Float_t coor[2], Bool_t isMatch[2], + TArrayI nboard[2], TArrayF &zRealMatch, Float_t y11) const +{ + // + /// Check slat and board number of digit matching trigger track + // + + enum {kBending, kNonBending}; + + Float_t minMatchDist[fgkNcathodes]; + Int_t padsInCheckArea[fgkNcathodes]; + + for(Int_t cath=0; cath(next()) ) ) + { + idigit++; + Int_t currDetElemId = mDigit->DetElemId(); + Int_t currCh = AliMpDEManager::GetChamberId(currDetElemId); + if(currCh!=iChamber) continue; + Int_t currSlat = currDetElemId%100; + Int_t slatDiff = TMath::Abs(currSlat-iSlat); + if(slatDiff>1 && slatDiff<17) continue; // Check neighbour slats + Int_t cathode = mDigit->Cathode(); + Int_t ix = mDigit->PadX(); + Int_t iy = mDigit->PadY(); + Float_t xpad, ypad, zpad; + const AliMpVSegmentation* seg = AliMpSegmentation::Instance() + ->GetMpSegmentation(currDetElemId,AliMp::GetCathodType(cathode)); + + AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE); + Float_t xlocal1 = pad.Position().X(); + Float_t ylocal1 = pad.Position().Y(); + Float_t dpx = pad.Dimensions().X(); + Float_t dpy = pad.Dimensions().Y(); + fTransformer.Local2Global(currDetElemId, xlocal1, ylocal1, 0, xpad, ypad, zpad); + AliDebug(2, Form("DetElemId = %i\tCathode = %i\t(x,y) Pad = (%i,%i) = (%.2f,%.2f)\tDim = (%.2f,%.2f)\tTrack = (%.2f,%.2f)\n",currDetElemId,cathode,ix,iy,xpad,ypad,dpx,dpy,coor[0],coor[1])); + // searching track intersection with chambers (second approximation) + if(ch%2==1){ + //if(iChamber%2==1){ + Float_t deltaZ = zpad - zRealMatch[0]; + y = (coor[1]-y11)*deltaZ/oldDeltaZ + y11; + if(TMath::Abs(y-coor[1])>0.1) AliDebug(3, Form("oldDeltaZ = %7.2f newDeltaZ = %7.2f\toldY = %7.2f new y = %7.2f\n",oldDeltaZ,deltaZ,coor[1],y)); + } + Float_t matchDist = PadMatchTrack(xpad, ypad, dpx, dpy, coor[0], y); + if(matchDistminMatchDist[cathode])continue; + isMatch[cathode] = kTRUE; + minMatchDist[cathode] = matchDist; + foundDetElemId = currDetElemId; + foundZmatch=zpad; + yCoorAtPadZ=y; + if(cathode==kBending) trigDigitBendPlane = idigit; + for (Int_t loc=0; locFill(ch, currSlat, currPair); + } + + for(Int_t cath=0; cath2) { + AliDebug(1, Form("padsInCheckArea[%i] = %i\n",cath,padsInCheckArea[cath])); + return -500; + } + } + + if(isMatch[kBending] || isMatch[kNonBending]){ + detElemId = foundDetElemId; + zRealMatch[ch] = foundZmatch; + coor[1] = yCoorAtPadZ; + } + return trigDigitBendPlane; +} + +//_____________________________________________________________________________ +Float_t AliMUONTrackHitPattern::PadMatchTrack(Float_t xPad, Float_t yPad, + Float_t dpx, Float_t dpy, + Float_t xTrackAtPad, Float_t yTrackAtPad) const +{ + // + /// Decides if the digit belongs to the trigger track. + // + + Float_t maxDist = 2.;//3. // cm + Float_t maxDistCheckArea = 6.; // cm + + Float_t matchDist = fkMaxDistance; + + Float_t deltaX = TMath::Abs(xPad-xTrackAtPad)-dpx; + Float_t deltaY = TMath::Abs(yPad-yTrackAtPad)-dpy; + Float_t maxDistX = maxDist; + Float_t maxDistY = maxDist; + + if(deltaX<=maxDistX && deltaY<=maxDistY) matchDist = TMath::Max(deltaX, deltaY); + else if(deltaX<=maxDistCheckArea && deltaY<=maxDistCheckArea) matchDist = fkMaxDistance/5.; + return matchDist; +} + + +//_____________________________________________________________________________ +Int_t AliMUONTrackHitPattern::DetElemIdFromPos(Float_t x, Float_t y, + Int_t chamber, Int_t cathode) const +{ + // + /// Given the (x,y) position in the chamber, + /// it returns the corresponding slat + // + + Int_t resultingDetElemId = -1; + AliMpDEIterator it; + Float_t minDist = 999.; + for ( it.First(chamber-1); ! it.IsDone(); it.Next() ){ + Int_t detElemId = it.CurrentDEId(); + Int_t ich = detElemId/100-10; + Float_t tolerance=0.2*((Float_t)ich); + Float_t currDist=9999.; + + const AliMpVSegmentation* seg = + AliMpSegmentation::Instance() + ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode)); + if (!seg) continue; + + Float_t deltax = seg->Dimensions().X(); + Float_t deltay = seg->Dimensions().Y(); + Float_t xlocal1 = -deltax; + Float_t ylocal1 = -deltay; + Float_t xlocal2 = +deltax; + Float_t ylocal2 = +deltay; + Float_t xg01, yg01, zg1, xg02, yg02, zg2; + fTransformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg01, yg01, zg1); + fTransformer.Local2Global(detElemId, xlocal2, ylocal2, 0, xg02, yg02, zg2); + + Float_t xg1 = xg01, xg2 = xg02, yg1 = yg01, yg2 = yg02; + + if(xg01>xg02){ + xg1 = xg02; + xg2 = xg01; + } + if(yg01>yg02){ + yg1 = yg02; + yg2 = yg01; + } + + if(x>=xg1-tolerance && x<=xg2+tolerance && y>=yg1-tolerance && y<=yg2+tolerance){ // takes into account errors in extrapolation + if(yyg2) currDist = y-yg2; + if(currDistGetMpSegmentation(detElemId,AliMp::GetCathodType(cathode)); + if (seg){ + AliMpPad pad = seg->PadByPosition(pos,kFALSE); + for (Int_t loc=0; locGetX11();// x position (info from non-bending plane) + Float_t y11 = matchedTrigTrack->GetY11();// y position (info from bending plane) + Float_t thetaX = matchedTrigTrack->GetThetax(); + Float_t thetaY = matchedTrigTrack->GetThetay(); + + for(Int_t ch=0; ch=1) correctFactor[kNonBending] = zMeanChamber[0]/zRealMatch[0];// corrects x position + if(ch>=2) correctFactor[kBending] = (zMeanChamber[2] - zMeanChamber[0]) / (zRealMatch[2] - zRealMatch[0]);// corrects y position + + // searching track intersection with chambers (first approximation) + Float_t deltaZ = zMeanChamber[currCh] - zMeanChamber[0]; + trackIntersectCh[currCh][0] = zMeanChamber[currCh] * TMath::Tan(thetaX) * correctFactor[kNonBending];// x position (info from non-bending plane) + trackIntersectCh[currCh][1] = y11 + deltaZ * TMath::Tan(thetaY) * correctFactor[kBending];// y position (info from bending plane) + Int_t detElemIdFromTrack = DetElemIdFromPos(trackIntersectCh[currCh][0], trackIntersectCh[currCh][1], 11+currCh, 0); + if(detElemIdFromTrack<0) { + AliDebug(1, "Warning: trigger track outside trigger chamber\n"); + continue; + } + + triggeredDigits[currCh] = FindPadMatchingTrig(digitStore, detElemIdFromTrack, trackIntersectCh[currCh], isMatch, nboard, zRealMatch, y11); + + // if FindPadMatchingTrig = -500 => too many digits matching pad => + // => Event not clear => Reject track + if(triggeredDigits[currCh]<-100){ + isClearEvent = kFALSE; + AliDebug(1, Form("Warning: track = %p (%i) matches many pads. Rejected!\n",(void *)matchedTrigTrack, detElemIdFromTrack)); + break; + } + + for(Int_t cath=0; cath(next()) ) ) - { - if (locTrg->IsNull()) continue; - - TArrayS xyPattern[2]; - locTrg->GetXPattern(xyPattern[0]); - locTrg->GetYPattern(xyPattern[1]); - // do we need this ? (Ch.F.) -// for(Int_t cath=0; cath<2; ++cath) -// { -// for(Int_t ch=0; ch<4; ++ch) -// { -// if(xyPattern[cath][ch]==0) continue; -// } -// } + TDirectory *dir = gDirectory; + + TFile *logFile = 0x0; + TString logFileName; + Bool_t reopenFile = kFALSE; + TString baseFileName = "MUON.QA"; + TString dirName = "EfficiencyRelated"; + + TSeqCollection *list = gROOT->GetListOfFiles(); + Int_t n = list->GetEntries(); + for(Int_t i=0; iAt(i); + logFileName = logFile->GetName(); + if (logFileName.Contains(baseFileName.Data())) break; + logFile = 0x0; + } + + if(!logFile) { + void * dirp = gSystem->OpenDirectory(gSystem->pwd()); + const char * name = 0x0; + // Add all files matching *pattern* to the chain + while((name = gSystem->GetDirEntry(dirp))) { + logFileName = name; + if (logFileName.Contains(baseFileName.Data())) { + logFile = new TFile(logFileName.Data(), "update"); + AliWarning(Form("%s already stored on disk. Re-opening in update mode.",baseFileName.Data())); + break; + } + logFile = 0x0; + }//directory loop + reopenFile = kTRUE; + } - Int_t nBoard = locTrg->LoCircuit(); - fDigitMaker.TriggerDigits(nBoard, xyPattern, digitStore); + if(logFile){ + logFile->cd(); + TDirectory *muonDir = (TDirectory*)logFile->Get("MUON"); + muonDir->cd(); + TDirectory *effDir = (TDirectory*)muonDir->Get(dirName.Data()); + if(!effDir) { + effDir = muonDir->mkdir(dirName.Data()); + } + effDir->cd(); + TH3F *histo = 0x0; + for(Int_t cath=0; cathGet(fPadFired[cath]->GetName()); + if(!histo) histo = (TH3F*)fPadFired[cath]->Clone(); + else histo->Add(fPadFired[cath]); + histo->Write(histo->GetName(), TObject::kOverwrite); + } + if(reopenFile){ + logFile->Close(); + } } - return kTRUE; + else AliWarning(Form("Map of strips entering efficiency calculation could not be found in %s", baseFileName.Data())); + dir->cd(); } + diff --git a/MUON/AliMUONTrackHitPattern.h b/MUON/AliMUONTrackHitPattern.h index 2db13ebed70..280d7c88f0f 100644 --- a/MUON/AliMUONTrackHitPattern.h +++ b/MUON/AliMUONTrackHitPattern.h @@ -12,13 +12,20 @@ // Author: Diego Stocco #include +#include +#include +#include +#include class AliMUONVTrackStore; class AliMUONVTriggerStore; +class AliMUONVTriggerTrackStore; class AliMUONTrackParam; class AliMUONDigitMaker; class AliMUONGeometryTransformer; class AliMUONVDigitStore; +class AliMUONTriggerTrack; +class AliMUONTrack; class AliMUONTrackHitPattern : public TObject { @@ -27,33 +34,96 @@ public: AliMUONTrackHitPattern(const AliMUONGeometryTransformer& transformer, const AliMUONDigitMaker& digitMaker); virtual ~AliMUONTrackHitPattern(); // Destructor - - void GetHitPattern(AliMUONVTrackStore& trackStore, - const AliMUONVTriggerStore& triggerStore) const; - - void FindPadMatchingTrack(AliMUONVDigitStore& digitStore, - const AliMUONTrackParam& trackParam, - Bool_t isMatch[2], Int_t iChamber) const; - Float_t MinDistanceFromPad(Float_t xPad, Float_t yPad, Float_t zPad, - Float_t dpx, Float_t dpy, - const AliMUONTrackParam& trackParam) const; + void ExecuteValidation(AliMUONVTrackStore& trackStore, + const AliMUONVTriggerTrackStore& triggerTrackStore, + const AliMUONVTriggerStore& triggerStore) const; + + AliMUONTriggerTrack* MatchTriggerTrack(AliMUONTrack* track, + AliMUONTrackParam& trackParam, + const AliMUONVTriggerTrackStore& triggerTrackStore, + const AliMUONVTriggerStore& triggerStore) const; - void ApplyMCSCorrections(AliMUONTrackParam& trackParam) const; + UShort_t GetHitPattern(AliMUONTrackParam& trackParam, + AliMUONTriggerTrack* matchedTriggerTrack, + AliMUONVDigitStore& digitStore) const; + + void UpdateQA() const; + +protected: + void ApplyMCSCorrections(AliMUONTrackParam& trackParam) const; + + Bool_t TriggerDigits(const AliMUONVTriggerStore& triggerStore, + AliMUONVDigitStore& digitStore) const; + + void InitMembers(); + + void SetBit(UShort_t& pattern, Int_t cathode, Int_t chamber) const; + + void AddEffInfo(UShort_t& pattern, Int_t slat, Int_t effType) const; + + + // Methods for hit pattern from tracker track + void FindPadMatchingTrack(AliMUONVDigitStore& digitStore, + const AliMUONTrackParam& trackParam, + Bool_t isMatch[2], Int_t iChamber) const; + + Float_t MinDistanceFromPad(Float_t xPad, Float_t yPad, Float_t zPad, + Float_t dpx, Float_t dpy, + const AliMUONTrackParam& trackParam) const; - Bool_t TriggerDigits(const AliMUONVTriggerStore& triggerStore, - AliMUONVDigitStore& digitStore) const; + // Methods for hit pattern from matched trigger track + Bool_t PerformTrigTrackMatch(UShort_t &pattern, + AliMUONTriggerTrack *matchedTrigTrack, + AliMUONVDigitStore& digitStore) const; + + Int_t FindPadMatchingTrig(AliMUONVDigitStore& digitStore, Int_t &detElemId, Float_t coor[2], + Bool_t isMatch[2], TArrayI nboard[2], + TArrayF &zRealMatch, Float_t y11) const; + + Float_t PadMatchTrack(Float_t xPad, Float_t yPad, Float_t dpx, Float_t dpy, + Float_t xTrackAtPad, Float_t yTrackAtPad) const; + + Int_t DetElemIdFromPos(Float_t x, Float_t y, Int_t chamber, Int_t cathode) const; + + void LocalBoardFromPos(Float_t x, Float_t y, Int_t detElemId, + Int_t cathode, Int_t localBoard[4]) const; private: - /// Not implemented - AliMUONTrackHitPattern(const AliMUONTrackHitPattern& rhs); - /// Not implemented - AliMUONTrackHitPattern& operator = (const AliMUONTrackHitPattern& rhs); + /// Not implemented + AliMUONTrackHitPattern(const AliMUONTrackHitPattern& rhs); + /// Not implemented + AliMUONTrackHitPattern& operator = (const AliMUONTrackHitPattern& rhs); + + void CheckConstants() const; + /// Get max number of strips along x + Int_t GetMaxX(Int_t cath) const {return (cath==0) ? 7 : 112;} + /// Get max number of strips along x + Int_t GetMaxY(Int_t cath) const {return (cath==0) ? 64 : 1;} + + const AliMUONGeometryTransformer& fTransformer; //!< geometry transformer + const AliMUONDigitMaker& fDigitMaker; //!< pointer to digit maker + + Double_t fDeltaZ; //!< distance between stations + + TMatrixD* fTrigCovariance; //!< Covariance matrix 3x3 (X,Y,slopeY) for trigger tracks + + const Float_t fkMaxDistance; //!< Maximum distance for reference + static const Int_t fgkNcathodes=2; //!ValidateTracksWithTrigger(*trackStore,*triggerTrackStore,*fTriggerStore,*fTrackHitPatternMaker); } - // Compute trigger chamber efficiency - if( triggerTrackStore && fTrigChamberEff){ - AliCodeTimerStart("EventChamberEff"); - fTrigChamberEff->EventChamberEff(*fTriggerStore,*triggerTrackStore,*trackStore); - AliCodeTimerStop("EventChamberEff"); - } - // Fill ESD FillESD(*trackStore,esd); diff --git a/MUON/AliMUONTracker.h b/MUON/AliMUONTracker.h index 0306d7e8168..d320c9edc67 100644 --- a/MUON/AliMUONTracker.h +++ b/MUON/AliMUONTracker.h @@ -17,7 +17,6 @@ class AliESDEvent; class AliMUONDigitMaker; class AliMUONGeometryTransformer; class AliMUONTrackHitPattern; -class AliMUONTriggerChamberEff; class AliMUONTriggerCircuit; class AliMUONVClusterStore; class AliMUONVTrackReconstructor; @@ -32,8 +31,7 @@ class AliMUONTracker : public AliTracker AliMUONTracker(AliMUONVClusterServer& clusterServer, const AliMUONDigitMaker* digitMaker=0, const AliMUONGeometryTransformer* transformer=0, - const AliMUONTriggerCircuit* triggerCircuit=0, - AliMUONTriggerChamberEff* chamberEff=0); + const AliMUONTriggerCircuit* triggerCircuit=0); virtual ~AliMUONTracker(); virtual Int_t Clusters2Tracks(AliESDEvent* esd); @@ -65,7 +63,6 @@ private: const AliMUONDigitMaker* fDigitMaker; //!< digit maker (not owner) const AliMUONGeometryTransformer* fTransformer; //!< geometry transformer (not owner) const AliMUONTriggerCircuit* fTriggerCircuit; //!< trigger circuit (not owner) - AliMUONTriggerChamberEff* fTrigChamberEff; //!< trigger efficiency (not owner) AliMUONTrackHitPattern* fTrackHitPatternMaker; //!< trigger hit pattern maker AliMUONVTrackReconstructor* fTrackReco; //!< track reconstructor mutable AliMUONVClusterStore* fClusterStore; //!< cluster container diff --git a/MUON/AliMUONTriggerEfficiencyCells.cxx b/MUON/AliMUONTriggerEfficiencyCells.cxx index e3ff5d08e06..de74331f11e 100755 --- a/MUON/AliMUONTriggerEfficiencyCells.cxx +++ b/MUON/AliMUONTriggerEfficiencyCells.cxx @@ -19,6 +19,7 @@ // Classes for display #include "AliMUONGeometryTransformer.h" #include "AliMpCDB.h" +#include "AliCDBManager.h" #include "AliMpDDLStore.h" #include "AliMpDDL.h" #include "AliMpTriggerCrate.h" @@ -50,42 +51,21 @@ /// \class AliMUONTriggerEfficiencyCells /// A class to store and give access to the trigger chamber efficiency. /// -/// Efficiency is stored per cathode on local boards, or, alternatively, -/// on "cells" of a given size. +/// Efficiency is stored per cathode on local boards /// /// The main method of this class is IsTriggered(). /// -/// $ALICE_ROOT/MUON/data/TriggerChamberefficiencyCells.dat contains efficiency +/// $ALICE_ROOT/MUON/data/efficiencyCells.dat contains efficiency /// for each chamber (i.e. DetElement). /// /// In the case of local boards, efficiency is stored from left to right /// per increasing board number (from 1 to 234) /// -/// Otherwise, he efficiency cells goes from right to left and -/// from bottom to top of the chamber, namely, the efficiencies tabulated in the -/// file refers to the following reference frame: -/// -///
-/// x
-/// <----------------------------------|
-///                                    |
-///    ---------------------------     |
-///   | 0.97 | 0.97 | 0.97 | 0.97 |    |
-///    ---------------------------     |
-///   | 0.97 | 0.97 | 0.97 | 0.97 |    |
-///    ---------------------------     |
-///   | 0.97 | 0.97 | 0.97 | 0.97 |    |
-///    ---------------------------     |
-///                                    |
-///                                   \/ y
-/// 
-/// -/// In both cases, the file can be edited in order to change efficiency -/// in a chosen local board/region of the chamber. +/// The file can be edited in order to change efficiency +/// in a chosen local board/region of the chamber. /// /// /// But please note that this object is also available from the CDB -/// (generated using the MUONCDB.C macro) /// /// \author Diego Stocco; INFN Torino //----------------------------------------------------------------------------- @@ -164,11 +144,6 @@ fFiredDisplayHistoList(other.fFiredDisplayHistoList) /// Copy constructor for(Int_t chCath=0; chCath=0 && cell.At(1)>=0) - { - eff1 = fCellContent[chamber][slat][cell.At(0)][cell.At(1)]; - eff2 = fCellContent[fgkNchambers+chamber][slat][cell.At(0)][cell.At(1)]; - } -} - - //__________________________________________________________________________ void AliMUONTriggerEfficiencyCells::GetCellEfficiency(Int_t detElemId, Int_t localBoard, Float_t &eff1, Float_t &eff2) const { @@ -241,22 +193,6 @@ void AliMUONTriggerEfficiencyCells::GetCellEfficiency(Int_t detElemId, Int_t loc } -//__________________________________________________________________________ -void -AliMUONTriggerEfficiencyCells::IsTriggered(Int_t detElemId, Float_t x, Float_t y, Bool_t &trig1, Bool_t &trig2) const -{ -/// Whether or not a given location (x,y) has a chance to trig, on each cathode. - - Float_t eff1 = 0.0; - Float_t eff2 = 0.0; - GetCellEfficiency(detElemId, x, y, eff1, eff2); - trig1 = kTRUE; - trig2 = kTRUE; - if(gRandom->Rndm()>eff1)trig1 = kFALSE; - if(gRandom->Rndm()>eff2)trig2 = kFALSE; -} - - //__________________________________________________________________________ void AliMUONTriggerEfficiencyCells::IsTriggered(Int_t detElemId, Int_t localBoard, Bool_t &trig1, Bool_t &trig2) const @@ -272,23 +208,6 @@ AliMUONTriggerEfficiencyCells::IsTriggered(Int_t detElemId, Int_t localBoard, Bo if(gRandom->Rndm()>eff2)trig2 = kFALSE; } -//__________________________________________________________________________ -TArrayI AliMUONTriggerEfficiencyCells::CellByCoord(Int_t detElemId, Float_t x, Float_t y) const -{ -/// Get the efficiencies at a given location. - - Int_t chamber = FindChamberIndex(detElemId); - Int_t slat = FindSlatIndex(detElemId); - Int_t cell[fgkNcathodes]={-1,-1}; - Float_t maxX = fCellSize[chamber][slat]*((Float_t)fCellNumber[chamber][slat]); - Float_t maxY = fCellSize[fgkNchambers+chamber][slat]*((Float_t)fCellNumber[fgkNchambers+chamber][slat]); - if(x>=0 & x=0 & y> dat; if(!strcmp(dat,"localBoards"))ReadFileBoards(file); - else ReadFileXY(file); + else AliWarning("File .dat in wrong format"); file.close(); } else { AliWarning(Form("Can't read file %s",fileName.Data())); @@ -315,45 +234,6 @@ void AliMUONTriggerEfficiencyCells::ReadFile(const Char_t* filename) } -//__________________________________________________________________________ -void AliMUONTriggerEfficiencyCells::ReadFileXY(ifstream &file) -{ -/// Structure of file (.dat) containing geometrical efficency - Int_t datInt=0, detEl=0, chamber=0, rpc=0, chCath=0; - Float_t datFloat=0.0; - Char_t dat[50]; - - while (file >> dat) { - file >> detEl; - chamber = FindChamberIndex(detEl); - rpc = FindSlatIndex(detEl); - file >> dat; - for(Int_t i=0; i> datInt; - fCellNumber[chCath][rpc] = datInt; - file >> dat; - } - for(Int_t i=0; i> datFloat; - fCellSize[chCath][rpc] = datFloat; - if(i==0)file >> dat; - } - for(Int_t cath=0; cath> dat; - file >> datInt; - for(Int_t iy=0; iy> datFloat; - fCellContent[chCath][rpc][ix][iy] = datFloat; - } - } - } - } -} - //__________________________________________________________________________ void AliMUONTriggerEfficiencyCells::ReadFileBoards(ifstream &file) { @@ -365,7 +245,6 @@ void AliMUONTriggerEfficiencyCells::ReadFileBoards(ifstream &file) while (file >> dat) { file >> detEl; chamber = FindChamberIndex(detEl); - //rpc = FindSlatIndex(detEl); for(Int_t cath=0; cath> dat; @@ -389,20 +268,50 @@ void AliMUONTriggerEfficiencyCells::ReadHistoBoards(const Char_t *filename) AliWarning(Form("Can't read file %s",filename)); return; } - Char_t histoName[30]; + Char_t histoName[40]; Char_t *cathCode[fgkNcathodes] = {"bendPlane", "nonBendPlane"}; + enum {kAllChEff, kChNonEff, kNumOfHistoTypes}; + Char_t *histoTypeName[2] = {"CountInCh", "NonCountInCh"}; - for(Int_t ch=0; chGet(histoName)) { - AliWarning(Form("Can't find histo %s in file %s",histoName, filename)); - continue; - } - Int_t chCath = fgkNchambers*cath + ch; - fBoardEfficiency[chCath] = (TH1F *)file->Get(histoName); + if(!fCountHistoList) fCountHistoList = new TList(); + else fCountHistoList->Delete(); + if(!fNoCountHistoList) fNoCountHistoList = new TList(); + else fNoCountHistoList->Delete(); + + TList *currList[2] = {fCountHistoList, fNoCountHistoList}; + + TH1F *histo = 0x0; + + for(Int_t cath=0; cathGet(histoName); + currList[hType]->Add(histo); + } + } + + for(Int_t cath=0; cathGet(histoName); + currList[hType]->Add(histo); } + } } + + for(Int_t cath=0; cathGet(histoName); + currList[hType]->Add(histo); + } + } + } + + InitHistos(); + FillHistosFromList(); } @@ -429,51 +338,16 @@ Int_t AliMUONTriggerEfficiencyCells::FindChamberIndex(Int_t detElemId) const } -//__________________________________________________________________________ -Int_t AliMUONTriggerEfficiencyCells::FindSlatIndex(Int_t detElemId) const -{ -/// From detElemId to slat index. - Int_t slat = detElemId%100; - return slat; -} - - -//__________________________________________________________________________ -TVector2 AliMUONTriggerEfficiencyCells::ChangeReferenceFrame(Float_t x, Float_t y, Float_t x0, Float_t y0) -{ -/// (x0,y0) position of the local reference frame (center of the chamber) - - Float_t x1 = x0-x;//reflection of axis - Float_t y1 = y+y0; - return TVector2(x1,y1); -} - //__________________________________________________________________________ void AliMUONTriggerEfficiencyCells::Reset() { /// Sets our internal array contents to zero. - for(Int_t chCath=0; chCathSetDefaultStorage(cdbStorage); + AliCDBManager::Instance()->SetRun(runNumber); + AliMUONGeometryTransformer *transform = new AliMUONGeometryTransformer(); transform->LoadGeometryData(geoFilename); @@ -943,10 +827,14 @@ Bool_t AliMUONTriggerEfficiencyCells::GetListsForCheck(const Char_t* geoFilename Int_t histoBin = localId; efficiency = fBoardEfficiency[chCath]->GetBinContent(histoBin); efficiencyError = fBoardEfficiency[chCath]->GetBinError(histoBin); + if(efficiency==0.) efficiency = kDummyFired; // It allows to graphically distinguish + // efficiency = 0 from no hit on board histoBin = slat+1; efficiencySlat = fSlatEfficiency[chCath]->GetBinContent(histoBin); efficiencySlatError = fSlatEfficiency[chCath]->GetBinError(histoBin); + if(efficiencySlat==0.) efficiencySlat = kDummyFired; // It allows to graphically distinguish + // efficiency = 0 from no hit on slat for(Int_t binX=x1; binX<=x2; binX++){ for(Int_t binY=y1; binY<=y2; binY++){ diff --git a/MUON/AliMUONTriggerEfficiencyCells.h b/MUON/AliMUONTriggerEfficiencyCells.h index 03816e30b84..660cb6a9e8e 100755 --- a/MUON/AliMUONTriggerEfficiencyCells.h +++ b/MUON/AliMUONTriggerEfficiencyCells.h @@ -11,10 +11,7 @@ #define ALIMUONTRIGGEREFFICIENCYCELLS_H #include "TObject.h" -#include "TArrayF.h" #include "TArrayI.h" -#include "TVector2.h" -#include "TMatrix.h" #include "TH1F.h" #include "TList.h" @@ -30,25 +27,29 @@ public: virtual ~AliMUONTriggerEfficiencyCells(); - void GetCellEfficiency(Int_t detElemId, Float_t x, Float_t y, Float_t &eff1, Float_t &eff2) const; void GetCellEfficiency(Int_t detElemId, Int_t localBoard, Float_t &eff1, Float_t &eff2) const; - void IsTriggered(Int_t detElemId, Float_t x, Float_t y, Bool_t &trig1, Bool_t &trig2) const; void IsTriggered(Int_t detElemId, Int_t localBoard, Bool_t &trig1, Bool_t &trig2) const; - void DisplayEfficiency(Bool_t perSlat=kFALSE, const Char_t* geoFilename="geometry.root"); Bool_t SumRunEfficiency(const AliMUONTriggerEfficiencyCells &other); + + // Methods for display + void DisplayEfficiency(Bool_t perSlat=kFALSE, + const Char_t* geoFilename="geometry.root", + const Char_t* cdbStorage = "local://$ALICE_ROOT", + Int_t runNumber=0); + + // Methods for efficiency check /// Set the list of fired strips void SetFiredStrips(TList *firedStrips){fFiredStrips = firedStrips;} - void CheckFiredStrips(const Char_t *geoFilename="geometry.root"); + void CheckFiredStrips(const Char_t *geoFilename="geometry.root", + const Char_t* cdbStorage = "local://$ALICE_ROOT", + Int_t runNumber=0); // Check for strips with lower counts than others: // syntomatic of possible read-out problems in boards - void Reset(); - protected: - TArrayI CellByCoord(Int_t detElemId, Float_t x, Float_t y) const; - TVector2 ChangeReferenceFrame(Float_t x, Float_t y, Float_t x0, Float_t y0); + void Reset(); void ReadFile(const Char_t* filename="$ALICE_ROOT/MUON/data/efficiencyCells.dat"); void CalculateEfficiency(Int_t trigger44, Int_t trigger34, Float_t &efficiency, Float_t &error, @@ -58,25 +59,18 @@ protected: private: void CheckConstants() const; Int_t FindChamberIndex(Int_t detElemId) const; - Int_t FindSlatIndex(Int_t detElemId) const; - void ReadFileXY(ifstream &file); void ReadFileBoards(ifstream &file); void ReadHistoBoards(const Char_t* filename="MUON.TriggerEfficiencyMap.root"); void InitHistos(); void FillHistosFromList(); - Bool_t GetListsForCheck(const Char_t* geoFilename="geometry.root"); + Bool_t GetListsForCheck(const Char_t* geoFilename, + const Char_t* cdbStorage, Int_t runNumber); - static const Int_t fgkNcells=80; ///< Number of cells static const Int_t fgkNcathodes=2; ///(itTrack()) ) ) - { - matchTrigger = 0; - chi2MatchTrigger = 0.; - loTrgNum = -1; - Int_t doubleMatch=-1; // Check if track matches 2 trigger tracks - Double_t doubleChi2 = -1.; - - AliMUONTrackParam trackParam(*((AliMUONTrackParam*) (track->GetTrackParamAtCluster()->Last()))); - - AliMUONTrackExtrap::ExtrapToZCov(&trackParam, kZFilterOut); // Extrap to muon filter end - AliMUONTrackExtrap::AddMCSEffect(&trackParam, kFilterThickness, AliMUONConstants::MuonFilterX0()); // Add MCS effects - AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::DefaultChamberZ(kFirstTrigCh)); // extrap to 1st trigger chamber - - const TMatrixD& kParamCov = trackParam.GetCovariances(); - - xTrack = trackParam.GetNonBendingCoor(); - yTrack = trackParam.GetBendingCoor(); - ySlopeTrack = trackParam.GetBendingSlope(); - - // Covariance matrix 3x3 (X,Y,slopeY) for tracker tracks - TMatrixD trackCov(3,3); - trackCov.Zero(); - trackCov(0,0) = kParamCov(0,0); - trackCov(1,1) = kParamCov(2,2); - trackCov(2,2) = kParamCov(3,3); - trackCov(1,2) = kParamCov(2,3); - trackCov(2,1) = kParamCov(3,2); - - TMatrixD sumCov(trackCov,TMatrixD::kPlus,trigCov); - - Bool_t isCovOK = kTRUE; - - if (sumCov.Determinant() != 0) { - sumCov.Invert(); - } else { - AliWarning(" Determinant = 0"); - isCovOK = kFALSE; - sigma2[0] = kParamCov(0,0); - sigma2[1] = kParamCov(2,2); - sigma2[2] = kParamCov(3,3); - for (Int_t iVar = 0; iVar < 3; iVar++) sigma2[iVar] += kDistSigma[iVar] * kDistSigma[iVar]; - } - - minChi2MatchTrigger = 999.; - - AliMUONTriggerTrack *triggerTrack; - TIter itTriggerTrack(triggerTrackStore.CreateIterator()); - while ( ( triggerTrack = static_cast(itTriggerTrack() ) ) ) - { - distTriggerTrack[0] = triggerTrack->GetX11()-xTrack; - distTriggerTrack[1] = triggerTrack->GetY11()-yTrack; - distTriggerTrack[2] = TMath::Tan(triggerTrack->GetThetay())-ySlopeTrack; - - if(isCovOK){ - TMatrixD paramDiff(3,1); - for(Int_t iVar = 0; iVar < 3; iVar++) - paramDiff(iVar,0) = distTriggerTrack[iVar]; - - TMatrixD tmp(sumCov,TMatrixD::kMult,paramDiff); - TMatrixD chi2M(paramDiff,TMatrixD::kTransposeMult,tmp); - chi2 = chi2M(0,0); - } - else { - chi2 = 0.; - for (Int_t iVar = 0; iVar < 3; iVar++) chi2 += distTriggerTrack[iVar]*distTriggerTrack[iVar]/sigma2[iVar]; - } - - chi2 /= 3.; // Normalized Chi2: 3 degrees of freedom (X,Y,slopeY) - if (chi2 < AliMUONReconstructor::GetRecoParam()->GetMaxNormChi2MatchTrigger()) - { - Bool_t isDoubleTrack = (TMath::Abs(chi2 - minChi2MatchTrigger)<1.); - if (chi2 < minChi2MatchTrigger && chi2 < AliMUONReconstructor::GetRecoParam()->GetMaxNormChi2MatchTrigger()) - { - if(isDoubleTrack) - { - doubleMatch = loTrgNum; - doubleChi2 = chi2MatchTrigger; - } - minChi2MatchTrigger = chi2; - chi2MatchTrigger = chi2; - loTrgNum = triggerTrack->GetLoTrgNum(); - AliMUONLocalTrigger* locTrg = triggerStore.FindLocal(loTrgNum); - matchTrigger=1; - if(locTrg->LoLpt()>0)matchTrigger=2; - if(locTrg->LoHpt()>0)matchTrigger=3; - } - else if(isDoubleTrack) - { - doubleMatch = triggerTrack->GetLoTrgNum(); - doubleChi2 = chi2; - } - } - } - if(doubleMatch>=0) - { // If two trigger tracks match, select the one passing more trigger cuts - AliDebug(1, Form("Two candidates found: %i and %i",loTrgNum,doubleMatch)); - AliMUONLocalTrigger* locTrg1 = triggerStore.FindLocal(doubleMatch); - if((locTrg1->LoLpt()>0 && matchTrigger<2) || (locTrg1->LoHpt() && matchTrigger<3)) - { - if(locTrg1->LoHpt()>0)matchTrigger=3; - else matchTrigger=2; - loTrgNum = doubleMatch; - chi2MatchTrigger=doubleChi2; - } - } - - track->SetMatchTrigger(matchTrigger); - track->SetLoTrgNum(loTrgNum); - track->SetChi2MatchTrigger(chi2MatchTrigger); - - AliMUONLocalTrigger* locTrg = static_cast(triggerStore.FindLocal(loTrgNum)); - - if (locTrg) - { - track->SetLocalTrigger(locTrg->LoCircuit(), - locTrg->LoStripX(), - locTrg->LoStripY(), - locTrg->LoDev(), - locTrg->LoLpt(), - locTrg->LoHpt()); - } - } - - trackHitPattern.GetHitPattern(trackStore,triggerStore); + trackHitPattern.ExecuteValidation(trackStore, triggerTrackStore, triggerStore); + trackHitPattern.UpdateQA(); } //__________________________________________________________________________ diff --git a/MUON/Calib/TriggerEfficiency/Run0_99999999_v0_s0.root b/MUON/Calib/TriggerEfficiency/Run0_99999999_v0_s0.root index 3b2ff2bec562c0854b12eec4cab47c433eee4e39..7faf74483f2c259596a2dcf44c2a4b6481ce420b 100644 GIT binary patch literal 6068 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 literal 23517 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 diff --git a/MUON/MUONrecLinkDef.h b/MUON/MUONrecLinkDef.h index 3c136d248b7..b8c4856aa79 100644 --- a/MUON/MUONrecLinkDef.h +++ b/MUON/MUONrecLinkDef.h @@ -31,7 +31,6 @@ #pragma link C++ class AliMUONClusterFinderMLEM+; #pragma link C++ class AliMUONClusterSplitterMLEM+; #pragma link C++ class AliMUONTrackHitPattern+; -#pragma link C++ class AliMUONTriggerChamberEff+; #pragma link C++ class AliMUONVClusterStore+; #pragma link C++ class AliMUONClusterStoreV1+; diff --git a/MUON/libMUONrec.pkg b/MUON/libMUONrec.pkg index 7022bbdf60a..9a270193027 100644 --- a/MUON/libMUONrec.pkg +++ b/MUON/libMUONrec.pkg @@ -27,7 +27,6 @@ SRCS:= AliMUONReconstructor.cxx \ AliMUONPadStatusMaker.cxx \ AliMUONPadStatusMapMaker.cxx \ AliMUONTrackHitPattern.cxx \ - AliMUONTriggerChamberEff.cxx \ AliMUONVClusterStore.cxx \ AliMUONClusterStoreV1.cxx \ AliMUONClusterStoreV2.cxx \ -- 2.39.3