+ // --- loop over the refitted tracks ---
+ if (useESD) {
+
+ TIter nextTrack(esdInterface.CreateTrackIterator());
+ AliMUONTrack* track;
+ while ((track = static_cast<AliMUONTrack*>(nextTrack()))) {
+
+ UInt_t muonClusterMap = buildClusterMap(*track);
+
+ // loop over clusters
+ AliMUONTrackParam* trackParam = static_cast<AliMUONTrackParam*>(track->GetTrackParamAtCluster()->First());
+ while (trackParam) {
+ clusterInfo->Clear("C");
+
+ // fill cluster info
+ AliMUONVCluster* cluster = trackParam->GetClusterPtr();
+ clusterInfo->SetRunId(esd->GetRunNumber());
+ clusterInfo->SetEventId(iEvent);
+ clusterInfo->SetZ(cluster->GetZ());
+ clusterInfo->SetClusterId(cluster->GetUniqueID());
+ clusterInfo->SetClusterXY(cluster->GetX(), cluster->GetY());
+ clusterInfo->SetClusterXYErr(cluster->GetErrX(), cluster->GetErrY());
+ clusterInfo->SetClusterChi2(cluster->GetChi2());
+ clusterInfo->SetClusterCharge(cluster->GetCharge());
+
+ // fill track info
+ clusterInfo->SetTrackId(track->GetUniqueID());
+ clusterInfo->SetTrackXY(trackParam->GetNonBendingCoor(), trackParam->GetBendingCoor());
+ clusterInfo->SetTrackThetaXY(TMath::ATan(trackParam->GetNonBendingSlope()), TMath::ATan(trackParam->GetBendingSlope()));
+ clusterInfo->SetTrackP(trackParam->P());
+ const TMatrixD paramCov = trackParam->GetCovariances();
+ clusterInfo->SetTrackXYErr(TMath::Sqrt(paramCov(0,0)), TMath::Sqrt(paramCov(2,2)));
+ clusterInfo->SetTrackChi2(track->GetNormalizedChi2());
+ clusterInfo->SetTrackCharge((Short_t)trackParam->GetCharge());
+ clusterInfo->SetTrackNHits(track->GetNClusters());
+ clusterInfo->SetTrackChamberHitMap(muonClusterMap);
+
+ // fill pad info if available
+ for (Int_t i=0; i<cluster->GetNDigits(); i++) {
+ AliMUONVDigit* digit = digitStore->FindObject(cluster->GetDigitId(i));
+ if (!digit) continue;
+
+ // pad location
+ const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->
+ GetMpSegmentation(digit->DetElemId(),AliMp::GetCathodType(digit->Cathode()));
+ AliMpPad pad = seg->PadByIndices(digit->PadX(), digit->PadY());
+
+ // calibration parameters
+ AliMUONVCalibParam* ped = calibData->Pedestals(digit->DetElemId(), digit->ManuId());
+ AliMUONVCalibParam* gain = calibData->Gains(digit->DetElemId(), digit->ManuId());
+ Int_t manuChannel = digit->ManuChannel();
+ Int_t planeType = 0;
+ if ( digit->ManuId() & AliMpConstants::ManuMask(AliMp::kNonBendingPlane)) {
+ planeType = 1;
+ }
+
+ // fill pad info
+ padInfo.SetPadId(digit->GetUniqueID());
+ padInfo.SetPadPlaneType(planeType);
+ padInfo.SetPadXY(pad.GetPositionX(), pad.GetPositionY());
+ padInfo.SetPadDimXY(pad.GetDimensionX(), pad.GetDimensionY());
+ padInfo.SetPadCharge((Double_t)digit->Charge());
+ padInfo.SetPadADC(digit->ADC());
+ padInfo.SetSaturated(digit->IsSaturated());
+ padInfo.SetCalibrated(digit->IsCalibrated());
+ padInfo.SetPedestal(ped->ValueAsFloatFast(manuChannel,0), ped->ValueAsFloatFast(manuChannel,1));
+ padInfo.SetGain(gain->ValueAsFloatFast(manuChannel,0), gain->ValueAsFloatFast(manuChannel,1),
+ gain->ValueAsFloatFast(manuChannel,2), gain->ValueAsFloatFast(manuChannel,3));
+
+ clusterInfo->AddPad(padInfo);
+ }
+
+ // remove clusters attached to a track
+ if (useRecPoints) {
+ AliMUONVCluster* cl = clusterStore->FindObject(cluster->GetUniqueID());
+ if (cl) clusterStore->Remove(*cl);
+ }
+
+ // fill cluster info tree
+ clusterInfoTree->Fill();
+
+ trackParam = static_cast<AliMUONTrackParam*>(track->GetTrackParamAtCluster()->After(trackParam));
+ }
+
+ }