- //__________________________________________________________________________
-void AliMUONTrackReconstructor::AddHitsForRecFromTrackRef(TTree *TTR, Int_t signal)
-{
- // To add to the list of hits for reconstruction
- // the signal hits from a track reference tree TreeTR.
- TClonesArray *listOfTrackRefs = NULL;
- AliTrackReference *trackRef;
-
- Int_t track = 0;
- AliDebug(2,Form("Enter AddHitsForRecFromTrackRef with TTR: %d", TTR));
- if (TTR == NULL) return;
-
- listOfTrackRefs = CleanTrackRefs(TTR);
-
- Int_t ntracks = listOfTrackRefs->GetEntriesFast();
-
- AliDebug(2,Form("ntracks: %d", ntracks));
-
- for (Int_t index = 0; index < ntracks; index++) {
- trackRef = (AliTrackReference*) listOfTrackRefs->At(index);
- track = trackRef->GetTrack();
-
- NewHitForRecFromTrackRef(trackRef,track,signal);
- } // end of track ref.
-
- listOfTrackRefs->Delete();
- delete listOfTrackRefs;
- return;
-}
-
-
- //__________________________________________________________________________
-AliMUONHitForRec* AliMUONTrackReconstructor::NewHitForRecFromTrackRef(AliTrackReference* Hit, Int_t TrackNumber, Int_t Signal)
-{
- // To make a new hit for reconstruction from a track ref. hit pointed to by "Hit",
- // with the track numbered "TrackNumber",
- // either from signal ("Signal" = 1) or background ("Signal" = 0) event.
- // Selects hits in tracking (not trigger) chambers.
- // Takes into account the efficiency (fEfficiency)
- // and the smearing from resolution (fBendingResolution and fNonBendingResolution).
- // Adds a condition on the radius between RMin and RMax
- // to better simulate the real chambers.
- // Returns the pointer to the new hit for reconstruction,
- // or NULL in case of inefficiency or non tracking chamber or bad radius.
- // No condition on at most 20 cm from a muon from a resonance
- // like in Fortran TRACKF_STAT.
- AliMUONHitForRec* hitForRec;
- Double_t bendCoor, nonBendCoor, radius;
- Int_t chamber = AliMUONConstants::ChamberNumber(Hit->Z()); // chamber(0...)
- if (chamber < 0) return NULL;
- // only in tracking chambers (fChamber starts at 1)
- if (chamber >= AliMUONConstants::NTrackingCh()) return NULL;
- // only if hit is efficient (keep track for checking ????)
- if (gRandom->Rndm() > fEfficiency) return NULL;
- // only if radius between RMin and RMax
- bendCoor = Hit->Y();
- nonBendCoor = Hit->X();
- radius = TMath::Sqrt((bendCoor * bendCoor) + (nonBendCoor * nonBendCoor));
- // This cut is not needed with a realistic chamber geometry !!!!
-// if ((radius < fRMin[chamber]) || (radius > fRMax[chamber])) return NULL;
- // new AliMUONHitForRec from track ref. hit and increment number of AliMUONHitForRec's
- hitForRec = new ((*fHitsForRecPtr)[fNHitsForRec]) AliMUONHitForRec(Hit);
- fNHitsForRec++;
- // add smearing from resolution
- hitForRec->SetBendingCoor(bendCoor + gRandom->Gaus(0., fBendingResolution));
- hitForRec->SetNonBendingCoor(nonBendCoor
- + gRandom->Gaus(0., fNonBendingResolution));
-// // !!!! without smearing
-// hitForRec->SetBendingCoor(bendCoor);
-// hitForRec->SetNonBendingCoor(nonBendCoor);
- // more information into HitForRec
- // resolution: angular effect to be added here ????
- hitForRec->SetBendingReso2(fBendingResolution * fBendingResolution);
- hitForRec->SetNonBendingReso2(fNonBendingResolution * fNonBendingResolution);
- // track ref. info
- hitForRec->SetTTRTrack(TrackNumber);
- hitForRec->SetTrackRefSignal(Signal);
- if (AliLog::GetGlobalDebugLevel()> 1) {
- AliDebug(2,Form("Track: %d", TrackNumber));
- Hit->Dump();
- cout << "AliMUONHitForRec number (1...): " << fNHitsForRec << endl;
- hitForRec->Dump();
- }
- return hitForRec;
-}
- //__________________________________________________________________________
-TClonesArray* AliMUONTrackReconstructor::CleanTrackRefs(TTree *treeTR)
-{
- // Make hits from track ref..
- // 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)
-
- AliTrackReference *trackReference;
- Float_t x1, y1, z1, pX1, pY1, pZ1;
- Float_t x2, y2, z2, pX2, pY2, pZ2;
- Int_t track1, track2;
- Int_t nRec = 0;
- Float_t maxGasGap = 1.; // cm
- Int_t iHit1 = 0;
- Int_t iHitMin = 0;
-
- AliTrackReference *trackReferenceNew = new AliTrackReference();
-
- TClonesArray* trackRefs = new TClonesArray("AliTrackReference", 10);
- TClonesArray* cleanTrackRefs = new TClonesArray("AliTrackReference", 10);
-
- if (treeTR == NULL) return NULL;
- TBranch* branch = treeTR->GetBranch("MUON");
- if (branch == NULL) return NULL;
- branch->SetAddress(&trackRefs);
-
- Int_t nTrack = (Int_t)treeTR->GetEntries();
- for (Int_t iTrack = 0; iTrack < nTrack; iTrack++) {
- treeTR->GetEntry(iTrack);
- iHitMin = 0;
- iHit1 = 0;
- while (iHit1 < trackRefs->GetEntries()) {
- trackReference = (AliTrackReference*)trackRefs->At(iHit1);
- x1 = trackReference->X();
- y1 = trackReference->Y();
- z1 = trackReference->Z();
- pX1 = trackReference->Px();
- pY1 = trackReference->Py();
- pZ1 = trackReference->Pz();
- track1 = trackReference->GetTrack();
- nRec = 1;
- iHitMin = iHit1+1;
- for (Int_t iHit2 = iHit1+1; iHit2 < trackRefs->GetEntries(); iHit2++) {
- trackReference = (AliTrackReference*)trackRefs->At(iHit2);
- x2 = trackReference->X();
- y2 = trackReference->Y();
- z2 = trackReference->Z();
- pX2 = trackReference->Px();
- pY2 = trackReference->Py();
- pZ2 = trackReference->Pz();
- track2 = trackReference->GetTrack();
- if (track2 == track1 && TMath::Abs(z2-z1) < maxGasGap ) {
- nRec++;
- x1 += x2;
- y1 += y2;
- z1 += z2;
- pX1 += pX2;
- pY1 += pY2;
- pZ1 += pZ2;
- iHitMin = iHit2+1;
- }
-
- } // for iHit2
- x1 /= (Float_t)nRec;
- y1 /= (Float_t)nRec;
- z1 /= (Float_t)nRec;
- pX1 /= (Float_t)nRec;
- pY1 /= (Float_t)nRec;
- pZ1 /= (Float_t)nRec;
- trackReferenceNew->SetPosition(x1,y1,z1);
- trackReferenceNew->SetMomentum(pX1,pY1,pZ1);
- trackReferenceNew->SetTrack(track1);
- {new ((*cleanTrackRefs)[cleanTrackRefs->GetEntriesFast()]) AliTrackReference(*trackReferenceNew);}
- iHit1 = iHitMin;
- } // while iHit1
- } // for track
-
- trackRefs->Delete();
- delete trackRefs;
- delete trackReferenceNew;
- return cleanTrackRefs;
-
-}