X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONRecoCheck.cxx;h=87ce1e9682f35a762fe6133663c41a24be575d2f;hb=407d15b32d31ee3d8030c45aeb2a7505c3bbd52a;hp=b1b800d6a9355b5bf51bbe5c7f7e87a988f957e6;hpb=f29ba3e1555f9cc21a4e8926e589d23342306213;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONRecoCheck.cxx b/MUON/AliMUONRecoCheck.cxx index b1b800d6a93..87ce1e9682f 100644 --- a/MUON/AliMUONRecoCheck.cxx +++ b/MUON/AliMUONRecoCheck.cxx @@ -13,99 +13,125 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -////////////////////////////////////////////////////////////////////////////////////// -// -// Utility class to check the muon reconstruction. Reconstructed tracks are compared -// to reference tracks. The reference tracks are built from AliTrackReference for the -// hit in chamber (0..9) and from kinematics for the vertex parameters. -// -////////////////////////////////////////////////////////////////////////////////////// +/* $Id$ */ +/// \class AliMUONRecoCheck +/// Utility class to check reconstruction +/// Reconstructed tracks are compared to reference tracks. +/// The reference tracks are built from AliTrackReference for the +/// hit in chamber (0..9) and from kinematics for the vertex parameters. -#include - -#include "AliRun.h" // for gAlice -#include "AliLog.h" -#include "AliLoader.h" -#include "AliRunLoader.h" -#include "AliTrackReference.h" -#include "AliHeader.h" -#include "AliMC.h" -#include "AliStack.h" #include "AliMUON.h" #include "AliMUONRecoCheck.h" #include "AliMUONTrack.h" #include "AliMUONData.h" -#include "AliMUONChamber.h" #include "AliMUONConstants.h" +#include "AliLoader.h" +#include "AliRunLoader.h" +#include "AliHeader.h" +#include "AliStack.h" +#include "AliTrackReference.h" +#include "AliLog.h" + +#include +#include + +/// \cond CLASSIMP ClassImp(AliMUONRecoCheck) +/// \endcond //_____________________________________________________________________________ -AliMUONRecoCheck::AliMUONRecoCheck(Char_t *chLoader) + AliMUONRecoCheck::AliMUONRecoCheck(Char_t *chLoader) + : TObject(), + fRunLoader(0x0), + fMUONData(0x0), + fMuonTrackRef(0x0), + fTrackReco(0x0), + fReconstructibleTracks(0), + fRecoTracks(0), + fIsLoadConstructor(kTRUE) { -// Constructor +/// Constructor using "galice.root", +/// takes care of loading/unloading Kinematics, TrackRefs and Tracks + fMuonTrackRef = new TClonesArray("AliMUONTrack", 10); - // open the run loader + // run loader fRunLoader = AliRunLoader::Open(chLoader); if (!fRunLoader) { - AliError(Form("no run loader found in file %s","galice.root" )); + AliError(Form("no run loader found " )); return; } - // initialize loader's + + // initialize loader AliLoader *loader = fRunLoader->GetLoader("MUONLoader"); - // initialize container + // container fMUONData = new AliMUONData(loader,"MUON","MUON"); + if (!fMUONData) { + AliError(Form("no MUONData found " )); + return; + } - // Loading AliRun master - if (fRunLoader->GetAliRun() == 0x0) fRunLoader->LoadgAlice(); - - fRunLoader->LoadKinematics("READ"); - fRunLoader->LoadTrackRefs("READ"); + fRunLoader->LoadKinematics("READ"); + fRunLoader->LoadTrackRefs("READ"); loader->LoadTracks("READ"); - fReconstructibleTracks = 0; - fRecoTracks = 0; } -//____________________________________________________________________ -AliMUONRecoCheck::AliMUONRecoCheck(const AliMUONRecoCheck& rhs) - : TObject(rhs) +//_____________________________________________________________________________ + AliMUONRecoCheck::AliMUONRecoCheck(AliRunLoader *runloader, AliMUONData *muondata) + : TObject(), + fRunLoader(0x0), + fMUONData(0x0), + fMuonTrackRef(0x0), + fTrackReco(0x0), + fReconstructibleTracks(0), + fRecoTracks(0), + fIsLoadConstructor(kFALSE) { -// Protected copy constructor +/// Constructor from AliRunLoader and AliMUONData, +/// does not load/unload Kinematics, TrackRefs and Tracks internally +/// it should be done in the execution program (e.g. see MUONRecoCheck.C) + + fMuonTrackRef = new TClonesArray("AliMUONTrack", 10); + + // run loader + fRunLoader = runloader; + if (!fRunLoader) { + AliError(Form("no run loader found " )); + return; + } + + // container + fMUONData = muondata; + if (!fMUONData) { + AliError(Form("no MUONData found " )); + return; + } - AliFatal("Not implemented."); } + //_____________________________________________________________________________ AliMUONRecoCheck::~AliMUONRecoCheck() { - fRunLoader->UnloadKinematics(); - fRunLoader->UnloadTrackRefs(); - fRunLoader->UnloadTracks(); - fMuonTrackRef->Delete(); +/// Destructor delete fMuonTrackRef; - delete fMUONData; -} - -//________________________________________________________________________ -AliMUONRecoCheck& AliMUONRecoCheck::operator = (const AliMUONRecoCheck& rhs) -{ -// Protected assignement operator - - if (this == &rhs) return *this; - - AliFatal("Not implemented."); - - return *this; + if(fIsLoadConstructor){ + fRunLoader->UnloadKinematics(); + fRunLoader->UnloadTrackRefs(); + fRunLoader->UnloadTracks(); + delete fMUONData; + delete fRunLoader; + } } //_____________________________________________________________________________ void AliMUONRecoCheck::MakeTrackRef() { - // Make reconstructible tracks +/// Make reconstructible tracks AliTrackReference *trackReference; AliMUONTrack *muonTrack; @@ -132,13 +158,17 @@ void AliMUONRecoCheck::MakeTrackRef() track = trackSave = -999; Bool_t isNewTrack; - Int_t iHitMin, iChamber; + Int_t iHitMin, iChamber, detElemId; trackParam = new AliMUONTrackParam(); hitForRec = new AliMUONHitForRec(); - muonTrack = new AliMUONTrack(); + Int_t charge; + TParticlePDG *ppdg; + + Int_t max = fRunLoader->GetHeader()->Stack()->GetNtrack(); for (Int_t iTrackRef = 0; iTrackRef < nTrackRef; iTrackRef++) { + branch->GetEntry(iTrackRef); iHitMin = 0; @@ -147,6 +177,8 @@ void AliMUONRecoCheck::MakeTrackRef() if (!trackRefs->GetEntries()) continue; while (isNewTrack) { + + muonTrack = new AliMUONTrack(); for (Int_t iHit = iHitMin; iHit < trackRefs->GetEntries(); iHit++) { @@ -160,6 +192,13 @@ void AliMUONRecoCheck::MakeTrackRef() track = trackReference->GetTrack(); + if(track >= max){ + AliWarningStream() + << "Track ID " << track + << " larger than max number of particles " << max << endl; + isNewTrack = kFALSE; + break; + } if (track != trackSave && iHit != 0) { iHitMin = iHit; trackSave = track; @@ -170,7 +209,7 @@ void AliMUONRecoCheck::MakeTrackRef() trackParam->SetBendingCoor(y); trackParam->SetNonBendingCoor(x); trackParam->SetZ(z); - + if (TMath::Abs(pZ) > 0) { bendingSlope = pY/pZ; nonBendingSlope = pX/pZ; @@ -186,21 +225,25 @@ void AliMUONRecoCheck::MakeTrackRef() hitForRec->SetNonBendingCoor(x); hitForRec->SetZ(z); hitForRec->SetBendingReso2(0.0); - hitForRec->SetNonBendingReso2(0.0); - iChamber = AliMUONConstants::ChamberNumber(z); + hitForRec->SetNonBendingReso2(0.0); + detElemId = hitForRec->GetDetElemId(); + if (detElemId) iChamber = detElemId / 100 - 1; + else iChamber = AliMUONConstants::ChamberNumber(z); hitForRec->SetChamberNumber(iChamber); - muonTrack->AddTrackParamAtHit(trackParam); + muonTrack->AddTrackParamAtHit(trackParam,0); muonTrack->AddHitForRecAtHit(hitForRec); muonTrack->SetTrackID(track); - + trackSave = track; if (iHit == trackRefs->GetEntries()-1) isNewTrack = kFALSE; } - + // track parameters at vertex particle = fRunLoader->GetHeader()->Stack()->Particle(muonTrack->GetTrackID()); + if (particle) { + x = particle->Vx(); y = particle->Vy(); z = particle->Vz(); @@ -215,28 +258,32 @@ void AliMUONRecoCheck::MakeTrackRef() bendingSlope = pY/pZ; nonBendingSlope = pX/pZ; } + pYZ = TMath::Sqrt(pY*pY+pZ*pZ); if (pYZ >0) inverseBendingMomentum = 1/pYZ; + + ppdg = particle->GetPDG(1); + charge = (Int_t)(ppdg->Charge()/3.0); + inverseBendingMomentum *= charge; + trackParam->SetBendingSlope(bendingSlope); trackParam->SetNonBendingSlope(nonBendingSlope); trackParam->SetInverseBendingMomentum(inverseBendingMomentum); muonTrack->SetTrackParamAtVertex(trackParam); } - + AddMuonTrackReference(muonTrack); - muonTrack->ResetTrackParamAtHit(); - muonTrack->ResetHitForRecAtHit(); + delete muonTrack; + muonTrack = NULL; } // end while isNewTrack - } - + delete trackRefs; CleanMuonTrackRef(); ReconstructibleTracks(); - delete muonTrack; delete trackParam; delete hitForRec; @@ -245,19 +292,19 @@ void AliMUONRecoCheck::MakeTrackRef() //____________________________________________________________________________ TClonesArray* AliMUONRecoCheck::GetTrackReco() { - // Return TClonesArray of reconstructed tracks +/// Return TClonesArray of reconstructed tracks - GetMUONData()->ResetRecTracks(); - GetMUONData()->SetTreeAddress("RT"); - fTrackReco = GetMUONData()->RecTracks(); - GetMUONData()->GetRecTracks(); + fMUONData->ResetRecTracks(); + fMUONData->SetTreeAddress("RT"); + fTrackReco = fMUONData->RecTracks(); + fMUONData->GetRecTracks(); fRecoTracks = fTrackReco->GetEntriesFast(); return fTrackReco; } //_____________________________________________________________________________ void AliMUONRecoCheck::PrintEvent() const { - // debug facility +/// Debug facility AliMUONTrack *track; AliMUONHitForRec *hitForRec; @@ -287,14 +334,16 @@ void AliMUONRecoCheck::PrintEvent() const //_____________________________________________________________________________ void AliMUONRecoCheck::ResetTracks() const { - if (fMuonTrackRef) fMuonTrackRef->Clear(); +/// Reset tracks + + if (fMuonTrackRef) fMuonTrackRef->Delete(); } //_____________________________________________________________________________ void AliMUONRecoCheck::CleanMuonTrackRef() { - // Re-calculate hits parameters because two AliTrackReferences are recorded for - // each chamber (one when particle is entering + one when particle is leaving - // the sensitive volume) +/// Re-calculate hits parameters because two AliTrackReferences are recorded for +/// each chamber (one when particle is entering + one when particle is leaving +/// the sensitive volume) Float_t maxGasGap = 1.; // cm AliMUONTrack *track, *trackNew; @@ -310,22 +359,21 @@ void AliMUONRecoCheck::CleanMuonTrackRef() Float_t bendingSlope2,nonBendingSlope2,bendingMomentum2; TClonesArray *newMuonTrackRef = new TClonesArray("AliMUONTrack", 10); Int_t iHit1; - Int_t iChamber = 0; + Int_t iChamber = 0, detElemId = 0; Int_t nRec = 0; Int_t nTrackHits = 0; hitForRec = new AliMUONHitForRec(); trackParam = new AliMUONTrackParam(); - trackNew = new AliMUONTrack(); Int_t nTrackRef = fMuonTrackRef->GetEntriesFast(); - for (Int_t index = 0; index < nTrackRef; index++) { track = (AliMUONTrack*)fMuonTrackRef->At(index); hitForRecAtHit = track->GetHitForRecAtHit(); trackParamAtHit = track->GetTrackParamAtHit(); trackParamAtVertex = track->GetTrackParamAtVertex(); nTrackHits = hitForRecAtHit->GetEntriesFast(); + trackNew = new AliMUONTrack(); iHit1 = 0; while (iHit1 < nTrackHits) { hitForRec1 = (AliMUONHitForRec*) hitForRecAtHit->At(iHit1); @@ -358,6 +406,7 @@ void AliMUONRecoCheck::CleanMuonTrackRef() bendingMomentum2 = 1./trackParam2->GetInverseBendingMomentum(); if ( TMath::Abs(zRec2-zRec1) < maxGasGap ) { + nRec++; xRec += xRec2; yRec += yRec2; @@ -379,7 +428,9 @@ void AliMUONRecoCheck::CleanMuonTrackRef() hitForRec->SetNonBendingCoor(xRec); hitForRec->SetBendingCoor(yRec); hitForRec->SetZ(zRec); - iChamber = AliMUONConstants::ChamberNumber(zRec); + detElemId = hitForRec->GetDetElemId(); + if (detElemId) iChamber = detElemId / 100 - 1; + else iChamber = AliMUONConstants::ChamberNumber(zRec); hitForRec->SetChamberNumber(iChamber); hitForRec->SetBendingReso2(0.0); hitForRec->SetNonBendingReso2(0.0); @@ -392,28 +443,26 @@ void AliMUONRecoCheck::CleanMuonTrackRef() trackParam->SetInverseBendingMomentum(1./bendingMomentum); trackNew->AddHitForRecAtHit(hitForRec); - trackNew->AddTrackParamAtHit(trackParam); + trackNew->AddTrackParamAtHit(trackParam,0); iHit1++; } // end iHit1 trackNew->SetTrackID(track->GetTrackID()); trackNew->SetTrackParamAtVertex(trackParamAtVertex); - {new ((*newMuonTrackRef)[newMuonTrackRef->GetEntriesFast()]) AliMUONTrack(*trackNew);} - trackNew->ResetHitForRecAtHit(); - trackNew->ResetTrackParamAtHit(); + {new ((*newMuonTrackRef)[newMuonTrackRef->GetEntriesFast()]) AliMUONTrack(*trackNew);} + delete trackNew; + trackNew = NULL; } // end trackRef - fMuonTrackRef->Clear(); + fMuonTrackRef->Delete(); nTrackRef = newMuonTrackRef->GetEntriesFast(); for (Int_t index = 0; index < nTrackRef; index++) { track = (AliMUONTrack*)newMuonTrackRef->At(index); AddMuonTrackReference(track); } - - delete trackNew; delete hitForRec; delete trackParam; newMuonTrackRef->Delete(); @@ -424,7 +473,7 @@ void AliMUONRecoCheck::CleanMuonTrackRef() //_____________________________________________________________________________ void AliMUONRecoCheck::ReconstructibleTracks() { - // calculate the number of reconstructible tracks +/// Calculate the number of reconstructible tracks AliMUONTrack* track; TClonesArray* hitForRecAtHit = NULL; @@ -450,16 +499,22 @@ void AliMUONRecoCheck::ReconstructibleTracks() iChamber = hitForRec->GetChamberNumber(); if (iChamber < 0 || iChamber > 10) continue; isChamberInTrack[iChamber] = 1; - - } - // track is reconstructible if the particle is crossing every tracking chambers + } + // track is reconstructible if the particle is depositing a hit + // in the following chamber combinations: + isTrackOK = kTRUE; - for (Int_t ch = 0; ch < 10; ch++) { - if (!isChamberInTrack[ch]) isTrackOK = kFALSE; - } if (isTrackOK) fReconstructibleTracks++; + if (!isChamberInTrack[0] && !isChamberInTrack[1]) isTrackOK = kFALSE; + if (!isChamberInTrack[2] && !isChamberInTrack[3]) isTrackOK = kFALSE; + if (!isChamberInTrack[4] && !isChamberInTrack[5]) isTrackOK = kFALSE; + Int_t nHitsInLastStations=0; + for (Int_t ch = 6; ch < AliMUONConstants::NTrackingCh(); ch++) + if (isChamberInTrack[ch]) nHitsInLastStations++; + if(nHitsInLastStations < 3) isTrackOK = kFALSE; + + if (isTrackOK) fReconstructibleTracks++; if (!isTrackOK) fMuonTrackRef->Remove(track); // remove non reconstructible tracks } fMuonTrackRef->Compress(); } -