X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONClusterSplitterMLEM.cxx;h=a758b3474a91c37a4c1e8baa1840d16aef29970c;hb=2afdea6931eac40fee865628e30669825f13a13e;hp=589b91db195c67a090378b7fe2dda041474cf755;hpb=4e51cfd20f100b19ae6698bc3fb52e3c96ac06d1;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONClusterSplitterMLEM.cxx b/MUON/AliMUONClusterSplitterMLEM.cxx index 589b91db195..a758b3474a9 100644 --- a/MUON/AliMUONClusterSplitterMLEM.cxx +++ b/MUON/AliMUONClusterSplitterMLEM.cxx @@ -36,6 +36,8 @@ #include "AliMpDEManager.h" #include "AliMUONMathieson.h" +#include "AliMpEncodePair.h" + #include "AliLog.h" #include @@ -55,7 +57,10 @@ const Double_t AliMUONClusterSplitterMLEM::fgkCouplMin = 1.e-2; // threshold on //_____________________________________________________________________________ AliMUONClusterSplitterMLEM::AliMUONClusterSplitterMLEM(Int_t detElemId, - TObjArray* pixArray) + TObjArray* pixArray, + Double_t lowestPixelCharge, + Double_t lowestPadCharge, + Double_t lowestClusterCharge) : TObject(), fPixArray(pixArray), fMathieson(0x0), @@ -63,7 +68,10 @@ fDetElemId(detElemId), fNpar(0), fQtot(0), fnCoupled(0), -fDebug(0) +fDebug(0), +fLowestPixelCharge(lowestPixelCharge), +fLowestPadCharge(lowestPadCharge), +fLowestClusterCharge(lowestClusterCharge) { /// Constructor @@ -117,7 +125,7 @@ AliMUONClusterSplitterMLEM::AddBin(TH2 *mlem, cont1 = mlem->GetCellContent(j,i); if (mode && cont1 > cont) continue; used[(i-1)*nx+j-1] = kTRUE; - if (cont1 < 0.5) continue; + if (cont1 < fLowestPixelCharge) continue; if (pix) pix->Add(BinToPix(mlem,j,i)); else { pixPtr = new AliMUONPad (mlem->GetXaxis()->GetBinCenter(j), @@ -162,7 +170,7 @@ AliMUONClusterSplitterMLEM::BinToPix(TH2 *mlem, // Compare pixel and bin positions for (Int_t i = 0; i < nPix; ++i) { pixPtr = (AliMUONPad*) fPixArray->UncheckedAt(i); - if (pixPtr->Charge() < 0.5) continue; + if (pixPtr->Charge() < fLowestPixelCharge) continue; if (TMath::Abs(pixPtr->Coord(0)-xc)<1.e-4 && TMath::Abs(pixPtr->Coord(1)-yc)<1.e-4) { //return (TObject*) pixPtr; @@ -205,7 +213,8 @@ AliMUONClusterSplitterMLEM::Fcn1(const AliMUONCluster& cluster, { AliMUONPad* pad = cluster.Pad(j); //if ( pad->Status() !=1 || pad->IsSaturated() ) continue; - if ( pad->Status() != AliMUONClusterFinderMLEM::GetUseForFitFlag()) continue; + if ( pad->Status() != AliMUONClusterFinderMLEM::GetUseForFitFlag() || + pad->Charge() == 0 ) continue; if (iflag == 0) { if ( pad->IsReal() ) npads++; // exclude virtual pads qTot += pad->Charge(); @@ -229,7 +238,7 @@ AliMUONClusterSplitterMLEM::Fcn1(const AliMUONCluster& cluster, } //_____________________________________________________________________________ -Double_t AliMUONClusterSplitterMLEM::Param2Coef(Int_t icand, Double_t coef, Double_t *par) +Double_t AliMUONClusterSplitterMLEM::Param2Coef(Int_t icand, Double_t coef, Double_t *par) const { /// Extract hit contribution scale factor from fit parameters @@ -244,7 +253,7 @@ Double_t AliMUONClusterSplitterMLEM::Param2Coef(Int_t icand, Double_t coef, Doub Int_t AliMUONClusterSplitterMLEM::Fit(const AliMUONCluster& cluster, Int_t iSimple, Int_t nfit, - Int_t *clustFit, TObjArray **clusters, + const Int_t *clustFit, TObjArray **clusters, Double_t *parOk, TObjArray& clusterList, TH2 *mlem) { @@ -333,9 +342,9 @@ AliMUONClusterSplitterMLEM::Fit(const AliMUONCluster& cluster, //const Int_t kStatusToTest(1); const Int_t kStatusToTest(AliMUONClusterFinderMLEM::GetUseForFitFlag()); - AliMpIntPair nofPads = cluster.NofPads(kStatusToTest); - Int_t nInX = nofPads.GetFirst(); - Int_t nInY = nofPads.GetSecond(); + Long_t nofPads = cluster.NofPads(kStatusToTest); + Int_t nInX = AliMp::PairFirst(nofPads); + Int_t nInY = AliMp::PairSecond(nofPads); if (fDebug) { Int_t npadOK = 0; @@ -360,6 +369,9 @@ AliMUONClusterSplitterMLEM::Fit(const AliMUONCluster& cluster, AliMUONPad *pixPtr; Int_t npxclu; Double_t cont, cmax = 0, xseed = 0, yseed = 0, errOk[8], qq = 0; + + for ( int i = 0; i < 8; ++i ) errOk[i]=0.0; + Double_t xyseed[3][2], qseed[3], xyCand[3][2] = {{0},{0}}, sigCand[3][2] = {{0},{0}}; for (Int_t ifit = 1; ifit <= nfit0; ++ifit) @@ -399,14 +411,18 @@ AliMUONClusterSplitterMLEM::Fit(const AliMUONCluster& cluster, if (fDebug) cout << xyCand[0][0] << " " << xyCand[0][1] << " " << sigCand[0][0] << " " << sigCand[0][1] << endl; Int_t nDof, maxSeed[3];//, nMax = 0; - + + if ( nfit0 < 0 || nfit0 > 3 ) { + AliErrorStream() << "Wrong nfit0 value: " << nfit0 << endl; + return nfit; + } TMath::Sort(nfit0, qseed, maxSeed, kTRUE); // in decreasing order Double_t step[3]={0.01,0.002,0.02}, fmin, chi2o = 9999, chi2n; - Double_t *gin = 0, func0, func1, param[8], step0[8]; + Double_t *gin = 0, func0, func1, param[8]={0}, step0[8]={0}; Double_t param0[2][8]={{0},{0}}, deriv[2][8]={{0},{0}}; - Double_t shift[8], stepMax, derMax, parmin[8], parmax[8], func2[2], shift0; - Double_t delta[8], scMax, dder[8], estim, shiftSave = 0; + Double_t shift[8]={0}, stepMax, derMax, parmin[8]={0}, parmax[8]={0}, func2[2]={0}, shift0; + Double_t delta[8]={0}, scMax, dder[8], estim, shiftSave = 0; Int_t min, max, nCall = 0, nLoop, idMax = 0, iestMax = 0, nFail; Double_t rad, dist[3] = {0}; @@ -736,14 +752,20 @@ AliMUONClusterSplitterMLEM::Fit(const AliMUONCluster& cluster, // Double_t /*sigy*/, // Double_t /*dist*/) - if ( coef*fQtot >= 14 ) + if ( coef*fQtot >= fLowestClusterCharge ) { //AZ AliMUONCluster* cluster1 = new AliMUONCluster(); AliMUONCluster* cluster1 = new AliMUONCluster(cluster); cluster1->SetCharge(coef*fQtot,coef*fQtot); cluster1->SetPosition(TVector2(parOk[indx],parOk[indx+1]),TVector2(sigCand[0][0],sigCand[0][1])); - cluster1->SetChi2(dist[TMath::LocMin(nfit,dist)]); + //cluster1->SetChi2(dist[TMath::LocMin(nfit,dist)]); + Int_t idx = TMath::LocMin(nfit,dist); + if ( idx < 0 || idx > 2 ) { + AliErrorStream() << "Wrong index value: " << idx << endl; + return nfit; + } + cluster1->SetChi2(dist[idx]); // FIXME: we miss some information in this cluster, as compared to // the original AddRawCluster code. @@ -800,7 +822,7 @@ AliMUONClusterSplitterMLEM::Split(const AliMUONCluster& cluster, indx = (i-1)*nx + j - 1; if (used[indx]) continue; cont = mlem->GetCellContent(j,i); - if (cont < 0.5) continue; + if (cont < fLowestPixelCharge) continue; pix = new TObjArray(20); used[indx] = 1; pix->Add(BinToPix(mlem,j,i)); @@ -1048,7 +1070,7 @@ AliMUONClusterSplitterMLEM::Split(const AliMUONCluster& cluster, void AliMUONClusterSplitterMLEM::Merge(const AliMUONCluster& cluster, Int_t nForFit, Int_t nCoupled, - Int_t *clustNumb, Int_t *clustFit, + const Int_t *clustNumb, const Int_t *clustFit, TObjArray **clusters, TMatrixD& aijcluclu, TMatrixD& aijclupad) { @@ -1110,8 +1132,8 @@ AliMUONClusterSplitterMLEM::Merge(const AliMUONCluster& cluster, //_____________________________________________________________________________ Double_t -AliMUONClusterSplitterMLEM::MinGroupCoupl(Int_t nCoupled, Int_t *clustNumb, - TMatrixD& aijcluclu, Int_t *minGroup) +AliMUONClusterSplitterMLEM::MinGroupCoupl(Int_t nCoupled, const Int_t *clustNumb, + const TMatrixD& aijcluclu, Int_t *minGroup) { /// Find group of clusters with minimum coupling to all the others @@ -1196,8 +1218,8 @@ AliMUONClusterSplitterMLEM::MinGroupCoupl(Int_t nCoupled, Int_t *clustNumb, Int_t AliMUONClusterSplitterMLEM::SelectPad(const AliMUONCluster& cluster, Int_t nCoupled, Int_t nForFit, - Int_t *clustNumb, Int_t *clustFit, - TMatrixD& aijclupad) + const Int_t *clustNumb, const Int_t *clustFit, + const TMatrixD& aijclupad) { /// Select pads for fit. If too many coupled clusters, find pads giving /// the strongest coupling with the rest of clusters and exclude them from the fit. @@ -1291,7 +1313,7 @@ AliMUONClusterSplitterMLEM::UpdatePads(const AliMUONCluster& cluster, } // if (fNpar != 0) //if (pad->Charge() > 6 /*fgkZeroSuppression*/) pad->SetStatus(0); - if (pad->Charge() > 6 /*fgkZeroSuppression*/) pad->SetStatus(AliMUONClusterFinderMLEM::GetZeroFlag()); + if (pad->Charge() > fLowestPadCharge) pad->SetStatus(AliMUONClusterFinderMLEM::GetZeroFlag()); // return pad for further using // FIXME: remove usage of zerosuppression here else pad->SetStatus(AliMUONClusterFinderMLEM::GetOverFlag()); // do not use anymore