From b7474abb6e3c8c4a0f3c5dfc6c8bc3a86802e4ab Mon Sep 17 00:00:00 2001 From: ivana Date: Sat, 3 Dec 2011 08:37:13 +0000 Subject: [PATCH] - Apply trigger algorithm to MC tracks when defining a triggerable track (for performance studies) (Diego) --- MUON/AliMUONRecoCheck.cxx | 162 +++++++++++++++++++++++++++++------ MUON/AliMUONRecoCheck.h | 7 ++ MUON/AliMUONTriggerTrack.cxx | 7 +- MUON/AliMUONTriggerTrack.h | 17 ++-- 4 files changed, 159 insertions(+), 34 deletions(-) diff --git a/MUON/AliMUONRecoCheck.cxx b/MUON/AliMUONRecoCheck.cxx index 68e51e18298..169c74cc529 100644 --- a/MUON/AliMUONRecoCheck.cxx +++ b/MUON/AliMUONRecoCheck.cxx @@ -43,6 +43,8 @@ #include "AliMUONTrackParam.h" #include "AliMUONTriggerTrack.h" #include "AliMUONVTriggerTrackStore.h" +#include "AliMUONTriggerStoreV1.h" +#include "AliMUONLocalTrigger.h" #include "AliMCEventHandler.h" #include "AliMCEvent.h" #include "AliStack.h" @@ -50,8 +52,14 @@ #include "AliLog.h" #include "AliESDEvent.h" #include "AliESDMuonTrack.h" +#include "AliMUONDigitStoreV2S.h" +#include "AliMUONDigit.h" +#include "AliMpVSegmentation.h" +#include "AliMpSegmentation.h" +#include "AliMpPad.h" #include "AliGeomManager.h" +#include "AliCDBManager.h" #include "AliMpCDB.h" #include "AliMpDDLStore.h" #include "AliMUONCDB.h" @@ -59,6 +67,9 @@ #include "AliMUONTriggerCircuit.h" #include "AliMUONVTrackReconstructor.h" #include "AliMUONVTriggerStore.h" +#include "AliMUONCalibrationData.h" +#include "AliMUONTriggerElectronics.h" + #include "TGeoManager.h" @@ -89,6 +100,8 @@ fRecoTrackStore(0x0), fRecoTriggerTrackStore(0x0), fGeometryTransformer(0x0), fTriggerCircuit(0x0), +fCalibrationData(0x0), +fTriggerElectronics(0x0), fESDEventOwner(kTRUE) { /// Normal ctor @@ -129,6 +142,8 @@ fRecoTrackStore(0x0), fRecoTriggerTrackStore(0x0), fGeometryTransformer(0x0), fTriggerCircuit(0x0), +fCalibrationData(0x0), +fTriggerElectronics(0x0), fESDEventOwner(kFALSE) { /// Normal ctor @@ -152,6 +167,8 @@ AliMUONRecoCheck::~AliMUONRecoCheck() ResetStores(); delete fGeometryTransformer; delete fTriggerCircuit; + delete fTriggerElectronics; + delete fCalibrationData; } //_____________________________________________________________________________ @@ -170,17 +187,8 @@ Bool_t AliMUONRecoCheck::InitCircuit() { if ( fTriggerCircuit ) return kTRUE; - - if ( !AliMUONCDB::CheckOCDB() ) return kFALSE; - - if ( !AliGeomManager::GetGeometry() ) - AliGeomManager::LoadGeometry(); - - if ( !AliMpDDLStore::Instance(false) ) - AliMpCDB::LoadDDLStore(); - - fGeometryTransformer = new AliMUONGeometryTransformer(); - fGeometryTransformer->LoadGeometryData(); + + if ( ! InitGeometryTransformer() ) return kFALSE; fTriggerCircuit = new AliMUONTriggerCircuit(fGeometryTransformer); @@ -390,10 +398,11 @@ void AliMUONRecoCheck::MakeTriggeredTracks() if (esdTrack->ContainTriggerData()) AliMUONESDInterface::Add(*esdTrack, *tmpTriggerStore); } - if ( ! InitCircuit() ) return; + if ( InitCircuit() ) { - AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker(); - tracker->EventReconstructTrigger(*fTriggerCircuit, *tmpTriggerStore, *fRecoTriggerTrackStore); + AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker(); + tracker->EventReconstructTrigger(*fTriggerCircuit, *tmpTriggerStore, *fRecoTriggerTrackStore); + } delete tmpTriggerStore; } @@ -540,7 +549,7 @@ void AliMUONRecoCheck::MakeTriggerableTracks() if (!(fRecoTriggerRefStore = AliMUONESDInterface::NewTriggerTrackStore())) return; - Double_t x, y, z, slopeX, slopeY, pZ; + Double_t x, y, z, slopeX, slopeY, pZ, xLoc, yLoc, zLoc; TParticle* particle; TClonesArray* trackRefs; Int_t nTrackRef = fMCEventHandler->MCEvent()->GetNumberOfTracks(); @@ -553,6 +562,7 @@ void AliMUONRecoCheck::MakeTriggerableTracks() if (nHits < 1) continue; AliMUONTriggerTrack track; + AliMUONDigitStoreV2S digitStore; Int_t hitsOnTrigger = 0; Int_t currCh = -1; @@ -567,13 +577,39 @@ void AliMUONRecoCheck::MakeTriggerableTracks() Int_t detElemId = trackReference->UserId(); Int_t chamberId = detElemId / 100 - 1; if (chamberId < AliMUONConstants::NTrackingCh() || chamberId >= AliMUONConstants::NCh() ) continue; - - + + // Get track parameters of current hit + x = trackReference->X(); + y = trackReference->Y(); + z = trackReference->Z(); + + if ( InitTriggerResponse() ) { + fGeometryTransformer->Global2Local(detElemId, x, y, z, xLoc, yLoc, zLoc); + + Int_t nboard = 0; + for ( Int_t cath = AliMp::kCath0; cath <= AliMp::kCath1; ++cath ) + { + const AliMpVSegmentation* seg + = AliMpSegmentation::Instance() + ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cath)); + + AliMpPad pad = seg->PadByPosition(xLoc,yLoc,kFALSE); + Int_t ix = pad.GetIx(); + Int_t iy = pad.GetIy(); + + if ( !pad.IsValid() ) continue; + + if ( cath == AliMp::kCath0 ) nboard = pad.GetLocalBoardId(0); + + AliMUONDigit* digit = new AliMUONDigit(detElemId,nboard, + pad.GetLocalBoardChannel(0),cath); + digit->SetPadXY(ix,iy); + digit->SetCharge(1.); + digitStore.Add(*digit,AliMUONVDigitStore::kDeny); + } + } + if ( hitsOnTrigger == 0 ) { - // Get track parameters of current hit - x = trackReference->X(); - y = trackReference->Y(); - z = trackReference->Z(); pZ = trackReference->Pz(); slopeX = ( pZ == 0. ) ? 99999. : trackReference->Px() / pZ; slopeY = ( pZ == 0. ) ? 99999. : trackReference->Py() / pZ; @@ -591,12 +627,32 @@ void AliMUONRecoCheck::MakeTriggerableTracks() } } // loop on hits - - if ( hitsOnTrigger >= 3 ){ - // store the track - track.SetUniqueID(iTrackRef); - fRecoTriggerRefStore->Add(track); + + if ( hitsOnTrigger < 3 ) continue; + + // Check if the track passes the trigger algorithm + if ( InitTriggerResponse() ) { + AliMUONTriggerStoreV1 triggerStore; + fTriggerElectronics->Digits2Trigger(digitStore,triggerStore); + + TIter next(triggerStore.CreateIterator()); + AliMUONLocalTrigger* locTrg(0x0); + + Int_t ptCutLevel = 0; + + while ( ( locTrg = static_cast(next()) ) ) + { + if ( locTrg->IsTrigX() && locTrg->IsTrigY() ) + { + ptCutLevel = TMath::Max(ptCutLevel, 1); + if ( locTrg->LoHpt() ) ptCutLevel = TMath::Max(ptCutLevel, 3); + else if ( locTrg->LoLpt() ) ptCutLevel = TMath::Max(ptCutLevel, 2); + } // board is fired + } // end of loop on Local Trigger + track.SetPtCutLevel(ptCutLevel); } + track.SetUniqueID(iTrackRef); + fRecoTriggerRefStore->Add(track); } } @@ -796,7 +852,6 @@ AliMUONTriggerTrack* AliMUONRecoCheck::FindCompatibleTrack(AliMUONTriggerTrack & TIter next(triggerTrackStore.CreateIterator()); AliMUONTriggerTrack* track2; while ( ( track2 = static_cast(next()) ) ) { - // check compatibility if (track.Match(*track2, sigmaCut)) { matchedTrack = track2; @@ -808,3 +863,56 @@ AliMUONTriggerTrack* AliMUONRecoCheck::FindCompatibleTrack(AliMUONTriggerTrack & } + +//____________________________________________________________________________ +Bool_t AliMUONRecoCheck::InitTriggerResponse() +{ + /// Initialize trigger electronics + /// for building of triggerable tracks from MC + + if ( fTriggerElectronics ) return kTRUE; + + if ( ! InitGeometryTransformer() ) return kFALSE; + + if ( ! InitCalibrationData() ) return kFALSE; + + fTriggerElectronics = new AliMUONTriggerElectronics(fCalibrationData); + + return kTRUE; +} + + +//____________________________________________________________________________ +Bool_t AliMUONRecoCheck::InitCalibrationData() +{ + /// Initialize calibration data + if ( ! fCalibrationData ) { + if ( !AliMUONCDB::CheckOCDB() ) return kFALSE; + fCalibrationData = new AliMUONCalibrationData(AliCDBManager::Instance()->GetRun()); + } + return kTRUE; +} + + +//____________________________________________________________________________ +Bool_t AliMUONRecoCheck::InitGeometryTransformer() +{ + /// Return calibration data + /// (create it if necessary) + if ( ! fGeometryTransformer ) { + + if ( !AliMUONCDB::CheckOCDB() ) return kFALSE; + + if ( !AliGeomManager::GetGeometry() ) + AliGeomManager::LoadGeometry(); + + if ( !AliMpDDLStore::Instance(false) ) + AliMpCDB::LoadDDLStore(); + + fGeometryTransformer = new AliMUONGeometryTransformer(); + fGeometryTransformer->LoadGeometryData(); + } + + return kTRUE; +} + diff --git a/MUON/AliMUONRecoCheck.h b/MUON/AliMUONRecoCheck.h index b47ed980738..4aad8772aea 100644 --- a/MUON/AliMUONRecoCheck.h +++ b/MUON/AliMUONRecoCheck.h @@ -24,6 +24,8 @@ class AliMUONTriggerTrack; class AliMUONGeometryTransformer; class AliMUONTriggerCircuit; class AliMUONLocalTrigger; +class AliMUONCalibrationData; +class AliMUONTriggerElectronics; class AliMUONRecoCheck : public TObject { @@ -92,6 +94,9 @@ private: void MakeTriggerableTracks(); Bool_t InitCircuit(); + Bool_t InitTriggerResponse(); + Bool_t InitCalibrationData(); + Bool_t InitGeometryTransformer(); private: AliMCEventHandler* fMCEventHandler; ///< to access MC truth information @@ -109,6 +114,8 @@ private: AliMUONGeometryTransformer* fGeometryTransformer; ///< geometry transformer AliMUONTriggerCircuit* fTriggerCircuit; ///< trigger circuit + AliMUONCalibrationData* fCalibrationData; //!< Used to load Local, Regional and Global masks + AliMUONTriggerElectronics* fTriggerElectronics; ///< object to re-compute the trigger info Bool_t fESDEventOwner; ///< using constructor from the analysis task diff --git a/MUON/AliMUONTriggerTrack.cxx b/MUON/AliMUONTriggerTrack.cxx index b690f3ddbdc..d711b028f0c 100644 --- a/MUON/AliMUONTriggerTrack.cxx +++ b/MUON/AliMUONTriggerTrack.cxx @@ -45,6 +45,7 @@ AliMUONTriggerTrack::AliMUONTriggerTrack() fSlopeY(0), floTrgNum(0), fGTPattern(0), + fPtCutLevel(0), fHitsPatternInTrigCh(0), fCovariances(0x0) { @@ -52,7 +53,7 @@ AliMUONTriggerTrack::AliMUONTriggerTrack() AliDebug(5,Form("this=%p",this)); } //__________________________________________________________________________ -AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t z11, Float_t z21, Float_t slopeX, Float_t slopeY, Int_t loTrgNum, Long_t theGTPattern, UShort_t hitsPatternInTrigCh) +AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t z11, Float_t z21, Float_t slopeX, Float_t slopeY, Int_t loTrgNum, Long_t theGTPattern, Int_t ptCutLevel) : TObject(), fx11(x11), fy11(y11), @@ -62,7 +63,8 @@ AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t z11, fSlopeY(slopeY), floTrgNum(loTrgNum), fGTPattern(theGTPattern), - fHitsPatternInTrigCh(hitsPatternInTrigCh), + fPtCutLevel(ptCutLevel), + fHitsPatternInTrigCh(0), fCovariances(0x0) { /// ctor from local trigger output @@ -93,6 +95,7 @@ AliMUONTriggerTrack::AliMUONTriggerTrack (const AliMUONTriggerTrack& theMUONTrig fSlopeY(theMUONTriggerTrack.fSlopeY), floTrgNum(theMUONTriggerTrack.floTrgNum), fGTPattern(theMUONTriggerTrack.fGTPattern), + fPtCutLevel(theMUONTriggerTrack.fPtCutLevel), fHitsPatternInTrigCh(theMUONTriggerTrack.fHitsPatternInTrigCh), fCovariances(0x0) { diff --git a/MUON/AliMUONTriggerTrack.h b/MUON/AliMUONTriggerTrack.h index fbd6de5bde7..ae5f2600c01 100644 --- a/MUON/AliMUONTriggerTrack.h +++ b/MUON/AliMUONTriggerTrack.h @@ -26,7 +26,7 @@ class AliMUONTriggerTrack : public TObject AliMUONTriggerTrack& operator=(const AliMUONTriggerTrack& AliMUONTriggerTrack); // assignment operator AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t z11, Float_t z21, Float_t slopeX, Float_t slopeY, - Int_t iloTrg, Long_t theGTPattern, UShort_t hitsPatternInTrigCh=0); + Int_t iloTrg, Long_t theGTPattern, Int_t ptCutLevel=1); // getters @@ -71,10 +71,16 @@ class AliMUONTriggerTrack : public TObject /// Return Global trigger pattern (do not work with static statement) UChar_t GetGTPattern() const {return fGTPattern;} - /// set word telling which trigger chambers where hit by track - UShort_t GetHitsPatternInTrigCh() const {return fHitsPatternInTrigCh;} - /// set word telling which trigger chambers where hit by track + /// Set word telling which trigger chambers where hit by track void SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) {fHitsPatternInTrigCh = hitsPatternInTrigCh;} + /// Get word telling which trigger chambers where hit by track + UShort_t GetHitsPatternInTrigCh() const {return fHitsPatternInTrigCh;} + + /// Set pt cut level + void SetPtCutLevel(Int_t ptCutLevel) { fPtCutLevel = ptCutLevel;} + /// Get pt cut level + Int_t GetPtCutLevel() const {return fPtCutLevel;} + virtual void Print(Option_t* opt="FULL") const; @@ -94,10 +100,11 @@ protected: Float_t fSlopeY; ///< track slope in Y Int_t floTrgNum; ///< local trigger number UChar_t fGTPattern; ///< Global trigger pattern (do not work with static statement) + Int_t fPtCutLevel; ///< Trigger pt cut level as in ESDs (1->Apt; 2->Lpt; 3->Hpt) UShort_t fHitsPatternInTrigCh; ///< Word containing info on the hits left in trigger chambers mutable TMatrixD *fCovariances; ///< Covariance matrix of track parameters - ClassDef(AliMUONTriggerTrack, 6) // Reconstructed trigger track in ALICE dimuon spectrometer + ClassDef(AliMUONTriggerTrack, 7) // Reconstructed trigger track in ALICE dimuon spectrometer }; #endif -- 2.43.0