-/// 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;
- AliMUONHitForRec *hitForRec, *hitForRec1, *hitForRec2;
- AliMUONTrackParam *trackParam, *trackParam1, *trackParam2, *trackParamAtVertex;
- TClonesArray * hitForRecAtHit = 0;
- TClonesArray * trackParamAtHit = 0;
- Float_t xRec,yRec,zRec;
- Float_t xRec1,yRec1,zRec1;
- Float_t xRec2,yRec2,zRec2;
- Float_t bendingSlope,nonBendingSlope,bendingMomentum;
- Float_t bendingSlope1,nonBendingSlope1,bendingMomentum1;
- Float_t bendingSlope2,nonBendingSlope2,bendingMomentum2;
- TClonesArray *newMuonTrackRef = new TClonesArray("AliMUONTrack", 10);
- Int_t iHit1;
- Int_t iChamber = 0, detElemId = 0;
- Int_t nRec = 0;
- Int_t nTrackHits = 0;
-
- hitForRec = new AliMUONHitForRec();
- trackParam = new AliMUONTrackParam();
- trackNew = new AliMUONTrack();
+ /// Make reconstructible tracks
+ AliMUONVTrackStore *tmpTrackRefStore = AliMUONESDInterface::NewTrackStore();
+ if (!tmpTrackRefStore) return;
+
+ Double_t x, y, z, pX, pY, pZ, bendingSlope, nonBendingSlope, inverseBendingMomentum;
+ TParticle* particle;
+ TClonesArray* trackRefs;
+ Int_t nTrackRef = fMCEventHandler->MCEvent()->GetNumberOfTracks();
+ AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();
+ if (!cStore) return;
+ AliMUONVCluster* hit = cStore->CreateCluster(0,0,0);
+
+ // loop over simulated tracks
+ for (Int_t iTrackRef = 0; iTrackRef < nTrackRef; ++iTrackRef) {
+ Int_t nHits = fMCEventHandler->GetParticleAndTR(iTrackRef, particle, trackRefs);
+
+ // skip empty trackRefs
+ if (nHits < 1) continue;
+
+ // get the particle charge for further calculation
+ TParticlePDG* ppdg = particle->GetPDG();
+ Int_t charge = ppdg != NULL ? (Int_t)(ppdg->Charge()/3.0) : 0;
+
+ AliMUONTrack track;
+
+ // loop over simulated track hits
+ for (Int_t iHit = 0; iHit < nHits; ++iHit) {
+ AliTrackReference* trackReference = static_cast<AliTrackReference*>(trackRefs->UncheckedAt(iHit));
+
+ // skip trackRefs not in MUON
+ if (trackReference->DetectorId() != AliTrackReference::kMUON) continue;
+
+ // Get track parameters of current hit
+ x = trackReference->X();
+ y = trackReference->Y();
+ z = trackReference->Z();
+ pX = trackReference->Px();
+ pY = trackReference->Py();
+ pZ = trackReference->Pz();
+
+ // check chamberId of current trackReference
+ Int_t detElemId = trackReference->UserId();
+ Int_t chamberId = detElemId / 100 - 1;
+ if (chamberId < 0 || chamberId >= AliMUONConstants::NTrackingCh()) continue;
+
+ // set hit parameters
+ hit->SetUniqueID(AliMUONVCluster::BuildUniqueID(chamberId, detElemId, iHit));
+ hit->SetXYZ(x,y,z);
+ hit->SetErrXY(0.,0.);
+
+ // compute track parameters at hit
+ bendingSlope = 0;
+ nonBendingSlope = 0;
+ inverseBendingMomentum = 0;
+ if (TMath::Abs(pZ) > 0) {
+ bendingSlope = pY/pZ;
+ nonBendingSlope = pX/pZ;
+ }
+ Double_t pYZ = TMath::Sqrt(pY*pY+pZ*pZ);
+ if (pYZ >0) inverseBendingMomentum = 1/pYZ;
+ inverseBendingMomentum *= charge;
+
+ // set track parameters at hit
+ AliMUONTrackParam trackParam;
+ trackParam.SetNonBendingCoor(x);
+ trackParam.SetBendingCoor(y);
+ trackParam.SetZ(z);
+ trackParam.SetBendingSlope(bendingSlope);
+ trackParam.SetNonBendingSlope(nonBendingSlope);
+ trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
+
+ // add track parameters at current hit to the track
+ track.AddTrackParamAtCluster(trackParam, *hit, kTRUE);
+ }
+
+ // if none of the track hits was in MUON, goto the next track
+ if (track.GetNClusters() < 1) continue;
+
+ // get track parameters at particle's vertex
+ x = particle->Vx();
+ y = particle->Vy();
+ z = particle->Vz();
+ pX = particle->Px();
+ pY = particle->Py();
+ pZ = particle->Pz();
+
+ // compute rest of track parameters at particle's vertex
+ bendingSlope = 0;
+ nonBendingSlope = 0;
+ inverseBendingMomentum = 0;
+ if (TMath::Abs(pZ) > 0) {
+ bendingSlope = pY/pZ;
+ nonBendingSlope = pX/pZ;
+ }
+ Double_t pYZ = TMath::Sqrt(pY*pY+pZ*pZ);
+ if (pYZ >0) inverseBendingMomentum = 1/pYZ;
+ inverseBendingMomentum *= charge;
+
+ // set track parameters at particle's vertex
+ AliMUONTrackParam trackParamAtVertex;
+ trackParamAtVertex.SetNonBendingCoor(x);
+ trackParamAtVertex.SetBendingCoor(y);
+ trackParamAtVertex.SetZ(z);
+ trackParamAtVertex.SetBendingSlope(bendingSlope);
+ trackParamAtVertex.SetNonBendingSlope(nonBendingSlope);
+ trackParamAtVertex.SetInverseBendingMomentum(inverseBendingMomentum);
+
+ // add track parameters at vertex
+ track.SetTrackParamAtVertex(&trackParamAtVertex);
+
+ // store the track
+ track.SetTrackID(iTrackRef);
+ tmpTrackRefStore->Add(track);
+ }
+
+ CleanMuonTrackRef(tmpTrackRefStore);
+
+ delete hit;
+ delete cStore;
+ delete tmpTrackRefStore;
+}