X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=MUON%2FAliMUONClusterFinderVS.cxx;h=27de1dddff9a6fda1fe5eb0067adc83525c79aa4;hb=e8d02863afdd1db4bc9b2816ac38300565f4d8f3;hp=b196c3d59db9e5455855e291148c6a15d37a98fa;hpb=7e4a628d3501cf8abeefc3d281b8883e53d2e217;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONClusterFinderVS.cxx b/MUON/AliMUONClusterFinderVS.cxx index b196c3d59db..27de1dddff9 100644 --- a/MUON/AliMUONClusterFinderVS.cxx +++ b/MUON/AliMUONClusterFinderVS.cxx @@ -15,18 +15,22 @@ /* $Id$ */ -#include -#include - #include "AliMUONClusterFinderVS.h" #include "AliMUONDigit.h" #include "AliMUONRawCluster.h" -#include "AliSegmentation.h" +#include "AliMUONGeometrySegmentation.h" #include "AliMUONMathieson.h" #include "AliMUONClusterInput.h" -#include "AliMUONHitMapA1.h" +#include "AliMUONDigitMapA1.h" + #include "AliLog.h" +#include +#include +#include +#include + + //_____________________________________________________________________ // This function is minimized in the double-Mathieson fit void fcnS2(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag); @@ -41,13 +45,13 @@ AliMUONClusterFinderVS::AliMUONClusterFinderVS() { // Default constructor fInput=AliMUONClusterInput::Instance(); - fHitMap[0] = 0; - fHitMap[1] = 0; + fDigitMap[0] = 0; + fDigitMap[1] = 0; fTrack[0]=fTrack[1]=-1; - fDebugLevel = 0; // make silent default fGhostChi2Cut = 1e6; // nothing done by default - fSeg[0] = 0; - fSeg[1] = 0; + fSeg2[0] = 0; + fSeg2[1] = 0; + for(Int_t i=0; i<100; i++) { for (Int_t j=0; j<2; j++) { fDig[i][j] = 0; @@ -89,7 +93,7 @@ void AliMUONClusterFinderVS::Decluster(AliMUONRawCluster *cluster) //____________________________________________________________________________ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) { -// Split complex cluster by local maxima + // Split complex cluster by local maxima Int_t cath, i; fInput->SetCluster(c); @@ -104,20 +108,21 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) Float_t qtot; for (cath=0; cath<2; cath++) { - qtot=0; - for (i=0; iDigit(cath, c->GetIndex(i, cath)); - // pad coordinates - fIx[i][cath]= fDig[i][cath]->PadX(); - fIy[i][cath]= fDig[i][cath]->PadY(); - // pad charge - fQ[i][cath] = fDig[i][cath]->Signal(); - // pad centre coordinates - fSeg[cath]-> - GetPadC(fIx[i][cath], fIy[i][cath], fX[i][cath], fY[i][cath], fZ[i][cath]); - } // loop over cluster digits + qtot=0; + + for (i=0; iDigit(cath, c->GetIndex(i, cath)); + // pad coordinates + fIx[i][cath]= fDig[i][cath]->PadX(); + fIy[i][cath]= fDig[i][cath]->PadY(); + // pad charge + fQ[i][cath] = fDig[i][cath]->Signal(); + // pad centre coordinates + fSeg2[cath]-> + GetPadC(fInput->DetElemId(), fIx[i][cath], fIy[i][cath], fX[i][cath], fY[i][cath], fZ[i][cath]); + } // loop over cluster digits + } // loop over cathodes @@ -164,16 +169,17 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) c->SetChi2(0,chi2); c->SetChi2(1,chi2); // Force on anod - c->SetX(0, fSeg[0]->GetAnod(c->GetX(0))); - c->SetX(1, fSeg[1]->GetAnod(c->GetX(1))); - -// If reasonable chi^2 add result to the list of rawclusters + + c->SetX(0, fSeg2[0]->GetAnod(fInput->DetElemId(), c->GetX(0))); + c->SetX(1, fSeg2[1]->GetAnod(fInput->DetElemId(), c->GetX(1))); + + // c->SetDetElemId(fInput->DetElemId()); + // If reasonable chi^2 add result to the list of rawclusters if (chi2 < 0.3) { AddRawCluster(*c); -// If not try combined double Mathieson Fit + // If not try combined double Mathieson Fit } else { - if (fDebugLevel) - fprintf(stderr," MAUVAIS CHI2 !!!\n"); + AliDebug(1," MAUVAIS CHI2 !!!\n"); if (fNLocal[0]==1 && fNLocal[1]==1) { fXInit[0]=fX[fIndLocal[0][1]][1]; fYInit[0]=fY[fIndLocal[0][0]][0]; @@ -194,8 +200,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) // Initial value for charge ratios fQrInit[0]=0.5; fQrInit[1]=0.5; - if (fDebugLevel) - fprintf(stderr,"\n cas (1) CombiDoubleMathiesonFit(c)\n"); + AliDebug(1,"\n cas (1) CombiDoubleMathiesonFit(c)\n"); chi2=CombiDoubleMathiesonFit(c); // Int_t ndf = fgNbins[0]+fgNbins[1]-6; // Float_t prob = TMath::Prob(chi2,ndf); @@ -211,7 +216,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) } else { AliDebug(1,"Do not Split"); // Don't split - AddRawCluster(*c); + AddRawCluster(*c); } } @@ -263,15 +268,17 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) for (ico=0; ico<4; ico++) { accepted[ico]=kFALSE; // cathode one: x-coordinate - isec=fSeg[0]->Sector(ixm[ico][0], iym[ico][0]); - dpx=fSeg[0]->Dpx(isec)/2.; + isec=fSeg2[0]->Sector(fInput->DetElemId(), ixm[ico][0], iym[ico][0]); + dpx=fSeg2[0]->Dpx(fInput->DetElemId(), isec)/2.; + dx=TMath::Abs(xm[ico][0]-xm[ico][1]); // cathode two: y-coordinate - isec=fSeg[1]->Sector(ixm[ico][1], iym[ico][1]); - dpy=fSeg[1]->Dpy(isec)/2.; + + isec=fSeg2[1]->Sector(fInput->DetElemId(), ixm[ico][1], iym[ico][1]); + dpy=fSeg2[1]->Dpy(fInput->DetElemId(), isec)/2.; + dy=TMath::Abs(ym[ico][0]-ym[ico][1]); - if (fDebugLevel>1) - printf("\n %i %f %f %f %f %f %f \n", ico, ym[ico][0], ym[ico][1], dy, dpy, dx, dpx ); + AliDebug(2,Form("\n %i %f %f %f %f %f %f \n", ico, ym[ico][0], ym[ico][1], dy, dpy, dx, dpx )); if ((dx <= dpx) && (dy <= dpy+eps)) { // consistent accepted[ico]=kTRUE; @@ -282,8 +289,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) accepted[ico]=kFALSE; } } - if (fDebugLevel) - printf("\n iacc= %d:\n", iacc); + AliDebug(1,Form("\n iacc= %d:\n", iacc)); if (iacc == 3) { if (accepted[0] && accepted[1]) { if (dr[0] >= dr[1]) { @@ -318,15 +324,13 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) } - if (fDebugLevel) { - printf("\n iacc= %d:\n", iacc); - if (iacc==2) { - fprintf(stderr,"\n iacc=2: No problem ! \n"); - } else if (iacc==4) { - fprintf(stderr,"\n iacc=4: Ok, but ghost problem !!! \n"); - } else if (iacc==0) { - fprintf(stderr,"\n iacc=0: I don't know what to do with this !!!!!!!!! \n"); - } + AliDebug(1,Form("\n iacc= %d:\n", iacc)); + if (iacc==2) { + AliDebug(1,"\n iacc=2: No problem ! \n"); + } else if (iacc==4) { + AliDebug(1,"\n iacc=4: Ok, but ghost problem !!! \n"); + } else if (iacc==0) { + AliDebug(1,"\n iacc=0: I don't know what to do with this !!!!!!!!! \n"); } // Initial value for charge ratios @@ -339,7 +343,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) // No combinations found between the 2 cathodes // We keep the center of gravity of the cluster if (iacc==0) { - AddRawCluster(*c); + AddRawCluster(*c); } // ******* iacc = 1 ******* @@ -420,8 +424,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) // Float_t prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi2); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi2); + AliDebug(1,Form(" chi2 %f\n",chi2)); // If reasonable chi^2 add result to the list of rawclusters if (chi2<10) { @@ -436,16 +439,13 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) cnew.SetX(cath, Float_t(xm[ico][1])); cnew.SetY(cath, Float_t(ym[ico][0])); cnew.SetZ(cath, fZPlane); - cnew.SetMultiplicity(cath,c->GetMultiplicity(cath)); for (i=0; iGetIndex(i,cath)); - fSeg[cath]->SetPad(fIx[i][cath], fIy[i][cath]); - } - if (fDebugLevel) { - fprintf(stderr,"\nRawCluster %d cath %d\n",ico,cath); - fprintf(stderr,"mult_av %d\n",c->GetMultiplicity(cath)); + cnew.SetIndex(i, cath, c->GetIndex(i,cath)); + fSeg2[cath]->SetPad(fInput->DetElemId(), fIx[i][cath], fIy[i][cath]); } + AliDebug(1,Form("\nRawCluster %d cath %d\n",ico,cath)); + AliDebug(1,Form("mult_av %d\n",c->GetMultiplicity(cath))); FillCluster(&cnew,cath); } cnew.SetClusterType(cnew.PhysicsContribution()); @@ -462,7 +462,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) if (iacc==2) { // Was the same maximum taken twice if ((accepted[0]&&accepted[1]) || (accepted[2]&&accepted[3])) { - if (fDebugLevel) fprintf(stderr,"\n Maximum taken twice !!!\n"); + AliDebug(1,"\n Maximum taken twice !!!\n"); // Have a try !! with that if (accepted[0]&&accepted[3]) { @@ -476,8 +476,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) fXInit[1]=xm[3][1]; fYInit[1]=ym[3][0]; } - if (fDebugLevel) - fprintf(stderr,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); + AliDebug(1,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); chi2=CombiDoubleMathiesonFit(c); // Int_t ndf = fgNbins[0]+fgNbins[1]-6; // Float_t prob = TMath::Prob(chi2,ndf); @@ -498,15 +497,13 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) fXInit[1]=xm[2][1]; fYInit[1]=ym[2][0]; } - if (fDebugLevel) - fprintf(stderr,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); + AliDebug(1,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); chi2=CombiDoubleMathiesonFit(c); // Int_t ndf = fgNbins[0]+fgNbins[1]-6; // Float_t prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi2); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi2); + AliDebug(1,Form(" chi2 %f\n",chi2)); Split(c); } @@ -521,15 +518,13 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) fYInit[0]=ym[0][0]; fXInit[1]=xm[3][1]; fYInit[1]=ym[3][0]; - if (fDebugLevel) - fprintf(stderr,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); + AliDebug(1,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); chi2=CombiDoubleMathiesonFit(c); // Int_t ndf = fgNbins[0]+fgNbins[1]-6; // Float_t prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi2); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi2); + AliDebug(1,Form(" chi2 %f\n",chi2)); // store results of fit and postpone decision Double_t sXFit[2],sYFit[2],sQrFit[2]; Float_t sChi2[2]; @@ -543,15 +538,13 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) fYInit[0]=ym[1][0]; fXInit[1]=xm[2][1]; fYInit[1]=ym[2][0]; - if (fDebugLevel) - fprintf(stderr,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); + AliDebug(1,"\n cas (2) CombiDoubleMathiesonFit(c)\n"); chi2=CombiDoubleMathiesonFit(c); // ndf = fgNbins[0]+fgNbins[1]-6; // prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi2); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi2); + AliDebug(1,Form(" chi2 %f\n",chi2)); // We have all informations to perform the decision // Compute the chi2 for the 2 possibilities Float_t chi2fi,chi2si,chi2f,chi2s; @@ -640,15 +633,15 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) Float_t eps = 1.e-5; for (ico=0; ico<2; ico++) { - accepted[ico]=kFALSE; - isec=fSeg[0]->Sector(ixm[ico][0], iym[ico][0]); - dpx=fSeg[0]->Dpx(isec)/2.; + isec=fSeg2[0]->Sector(fInput->DetElemId(), ixm[ico][0], iym[ico][0]); + dpx=fSeg2[0]->Dpx(fInput->DetElemId(), isec)/2.; + dx=TMath::Abs(xm[ico][0]-xm[ico][1]); - isec=fSeg[1]->Sector(ixm[ico][1], iym[ico][1]); - dpy=fSeg[1]->Dpy(isec)/2.; + isec=fSeg2[1]->Sector(fInput->DetElemId(), ixm[ico][1], iym[ico][1]); + dpy=fSeg2[1]->Dpy(fInput->DetElemId(), isec)/2.; + dy=TMath::Abs(ym[ico][0]-ym[ico][1]); - if (fDebugLevel>1) - printf("\n %i %f %f %f %f \n", ico, ym[ico][0], ym[ico][1], dy, dpy ); + AliDebug(2,Form("\n %i %f %f %f %f \n", ico, ym[ico][0], ym[ico][1], dy, dpy )); if ((dx <= dpx) && (dy <= dpy+eps)) { // consistent accepted[ico]=kTRUE; @@ -695,8 +688,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) // Float_t prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi21); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi21); + AliDebug(1,Form(" chi2 %f\n",chi21)); if (chi21<10) Split(c); } else if (accepted[1]) { fXInit[0]=xm[1][1]; @@ -708,8 +700,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) // Float_t prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi22); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi22); + AliDebug(1,Form(" chi2 %f\n",chi22)); if (chi22<10) Split(c); } @@ -726,12 +717,12 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) cnew.SetMultiplicity(cath, c->GetMultiplicity(cath)); for (i=0; iGetIndex(i, cath)); - fSeg[cath]->SetPad(fIx[i][cath], fIy[i][cath]); - } - if (fDebugLevel){ - fprintf(stderr,"\nRawCluster %d cath %d\n",ico,cath); - fprintf(stderr,"mult_av %d\n",c->GetMultiplicity(cath)); + fSeg2[cath]->SetPad(fInput->DetElemId(), fIx[i][cath], fIy[i][cath]); + } + AliDebug(1,Form("\nRawCluster %d cath %d\n",ico,cath)); + AliDebug(1,Form("mult_av %d\n",c->GetMultiplicity(cath))); + FillCluster(&cnew,cath); } cnew.SetClusterType(cnew.PhysicsContribution()); @@ -780,18 +771,19 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) for (ico=0; ico<2; ico++) { accepted[ico]=kFALSE; - isec=fSeg[0]->Sector(ixm[ico][0], iym[ico][0]); - dpx=fSeg[0]->Dpx(isec)/2.; + isec=fSeg2[0]->Sector(fInput->DetElemId(), ixm[ico][0], iym[ico][0]); + dpx=fSeg2[0]->Dpx(fInput->DetElemId(), isec)/2.; + dx=TMath::Abs(xm[ico][0]-xm[ico][1]); - isec=fSeg[1]->Sector(ixm[ico][1], iym[ico][1]); - dpy=fSeg[1]->Dpy(isec)/2.; + isec=fSeg2[1]->Sector(fInput->DetElemId(), ixm[ico][1], iym[ico][1]); + dpy=fSeg2[1]->Dpy(fInput->DetElemId(), isec)/2.; + dy=TMath::Abs(ym[ico][0]-ym[ico][1]); - if (fDebugLevel>0) - printf("\n %i %f %f %f %f \n", ico, ym[ico][0], ym[ico][1], dy, dpy ); + AliDebug(1,Form("\n %i %f %f %f %f \n", ico, ym[ico][0], ym[ico][1], dy, dpy )); if ((dx <= dpx) && (dy <= dpy+eps)) { // consistent accepted[ico]=kTRUE; - if (fDebugLevel) fprintf(stderr,"ico %d\n",ico); + AliDebug(1,Form("ico %d\n",ico)); iacc++; } else { // reject @@ -835,8 +827,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) // Float_t prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi21); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi21); + AliDebug(1,Form(" chi2 %f\n",chi21)); if (chi21<10) Split(c); } else if (accepted[1]) { fXInit[0]=xm[1][0]; @@ -848,8 +839,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) // Float_t prob = TMath::Prob(chi2,ndf); // prob2->Fill(prob); // chi2_2->Fill(chi22); - if (fDebugLevel) - fprintf(stderr," chi2 %f\n",chi22); + AliDebug(1,Form(" chi2 %f\n",chi22)); if (chi22<10) Split(c); } @@ -865,13 +855,11 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) cnew.SetZ(cath, fZPlane); cnew.SetMultiplicity(cath, c->GetMultiplicity(cath)); for (i=0; iGetIndex(i, cath)); - fSeg[cath]->SetPad(fIx[i][cath], fIy[i][cath]); - } - if (fDebugLevel) { - fprintf(stderr,"\nRawCluster %d cath %d\n",ico,cath); - fprintf(stderr,"mult_av %d\n",c->GetMultiplicity(cath)); + cnew.SetIndex(i, cath, c->GetIndex(i, cath)); + fSeg2[cath]->SetPad(fInput->DetElemId(), fIx[i][cath], fIy[i][cath]); } + AliDebug(1,Form("\nRawCluster %d cath %d\n",ico,cath)); + AliDebug(1,Form("mult_av %d\n",c->GetMultiplicity(cath))); FillCluster(&cnew,cath); } cnew.SetClusterType(cnew.PhysicsContribution()); @@ -917,24 +905,21 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) } Int_t nIco = ico; - if (fDebugLevel) - fprintf(stderr,"nIco %d\n",nIco); + AliDebug(1,Form("nIco %d\n",nIco)); for (ico=0; icoSector(ixm[ico][0], iym[ico][0]); - dpx=fSeg[0]->Dpx(isec)/2.; + AliDebug(1,Form("ico = %d\n",ico)); + isec=fSeg2[0]->Sector(fInput->DetElemId(), ixm[ico][0], iym[ico][0]); + dpx=fSeg2[0]->Dpx(fInput->DetElemId(), isec)/2.; + dx=TMath::Abs(xm[ico][0]-xm[ico][1]); - isec=fSeg[1]->Sector(ixm[ico][1], iym[ico][1]); - dpy=fSeg[1]->Dpy(isec)/2.; + isec=fSeg2[1]->Sector(fInput->DetElemId(), ixm[ico][1], iym[ico][1]); + dpy=fSeg2[1]->Dpy(fInput->DetElemId(), isec)/2.; + dy=TMath::Abs(ym[ico][0]-ym[ico][1]); - if (fDebugLevel) { - fprintf(stderr,"dx %f dpx %f dy %f dpy %f\n",dx,dpx,dy,dpy); - fprintf(stderr," X %f Y %f\n",xm[ico][1],ym[ico][0]); - } + AliDebug(1,Form("dx %f dpx %f dy %f dpy %f\n",dx,dpx,dy,dpy)); + AliDebug(1,Form(" X %f Y %f\n",xm[ico][1],ym[ico][0])); if ((dx <= dpx) && (dy <= dpy)) { - if (fDebugLevel) - fprintf(stderr,"ok\n"); + AliDebug(1,"ok\n"); Int_t cath; AliMUONRawCluster cnew; for (cath=0; cath<2; cath++) { @@ -944,11 +929,12 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) cnew.SetMultiplicity(cath, c->GetMultiplicity(cath)); for (i=0; iGetIndex(i, cath)); - fSeg[cath]->SetPad(fIx[i][cath], fIy[i][cath]); + fSeg2[cath]->SetPad(fInput->DetElemId(), fIx[i][cath], fIy[i][cath]); } FillCluster(&cnew,cath); } cnew.SetClusterType(cnew.PhysicsContribution()); + // cnew.SetDetElemId(fInput->DetElemId()); AddRawCluster(cnew); fNPeaks++; } @@ -963,8 +949,7 @@ void AliMUONClusterFinderVS::SplitByLocalMaxima(AliMUONRawCluster *c) void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) { // Find all local maxima of a cluster - if (fDebugLevel) - printf("\n Find Local maxima !"); + AliDebug(1,"\n Find Local maxima !"); AliMUONDigit* digt; @@ -984,52 +969,57 @@ void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) // number of next neighbours and arrays to store them Int_t nn; Int_t x[10], y[10]; -// loop over cathodes + // loop over cathodes for (cath=0; cath<2; cath++) { -// loop over cluster digits - for (i=0; iNeighbours(fIx[i][cath], fIy[i][cath], &nn, x, y); - isLocal[i][cath]=kTRUE; - Int_t isec= fSeg[cath]->Sector(fIx[i][cath], fIy[i][cath]); - Float_t a0 = fSeg[cath]->Dpx(isec)*fSeg[cath]->Dpy(isec); -// loop over next neighbours, if at least one neighbour has higher charger assumption -// digit is not local maximum - for (j=0; jTestHit(x[j], y[j])==kEmpty) continue; - digt=(AliMUONDigit*) fHitMap[cath]->GetHit(x[j], y[j]); - isec=fSeg[cath]->Sector(x[j], y[j]); - Float_t a1 = fSeg[cath]->Dpx(isec)*fSeg[cath]->Dpy(isec); - if (digt->Signal()/a1 > fQ[i][cath]/a0) { + // loop over cluster digits + for (i=0; iNeighbours(fInput->DetElemId(), fIx[i][cath], fIy[i][cath], &nn, x, y); + + isLocal[i][cath]=kTRUE; + isec = fSeg2[cath]->Sector(fInput->DetElemId(), fIx[i][cath], fIy[i][cath]); + a0 = fSeg2[cath]->Dpx(fInput->DetElemId(), isec)*fSeg2[cath]->Dpy(fInput->DetElemId(), isec); + + // loop over next neighbours, if at least one neighbour has higher charger assumption + // digit is not local maximum + for (j=0; jTestHit(x[j], y[j])==kEmpty) continue; + digt=(AliMUONDigit*) fDigitMap[cath]->GetHit(x[j], y[j]); + Float_t a1; + isec=fSeg2[cath]->Sector(fInput->DetElemId(), x[j], y[j]); + a1 = fSeg2[cath]->Dpx(fInput->DetElemId(),isec)*fSeg2[cath]->Dpy(fInput->DetElemId(), isec); + + if (digt->Signal()/a1 > fQ[i][cath]/a0) { + isLocal[i][cath]=kFALSE; + break; + // + // handle special case of neighbouring pads with equal signal + } else if (digt->Signal() == fQ[i][cath]) { + if (fNLocal[cath]>0) { + for (Int_t k=0; kSignal() == fQ[i][cath]) { - if (fNLocal[cath]>0) { - for (Int_t k=0; kSector(fIx[i][cath],fIy[i][cath]); - dpy=fSeg[cath]->Dpy(isec); - dpx=fSeg[cath]->Dpx(isec); + isec=fSeg2[cath]->Sector(fInput->DetElemId(), fIx[i][cath],fIy[i][cath]); + dpy=fSeg2[cath]->Dpy(fInput->DetElemId(), isec); + dpx=fSeg2[cath]->Dpx(fInput->DetElemId(), isec); + if (isLocal[i][cath]) continue; // Pad position should be consistent with position of local maxima on the opposite cathode if ((TMath::Abs(fX[i][cath]-fX[fIndLocal[0][cath1]][cath1]) > dpx/2.) && @@ -1060,24 +1051,23 @@ void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) // iNN counts the number of neighbours with signal, it should be 1 or 2 Int_t iNN=0; - for (fSeg[cath] - ->FirstPad(fX[i][cath], fY[i][cath], fZPlane, 0., dpy); - fSeg[cath] - ->MorePads(); - fSeg[cath] - ->NextPad()) - { - ix = fSeg[cath]->Ix(); - iy = fSeg[cath]->Iy(); - // skip the current pad - if (iy == fIy[i][cath]) continue; + + for (fSeg2[cath]->FirstPad(fInput->DetElemId(), fX[i][cath], fY[i][cath], fZPlane, 0., dpy); + fSeg2[cath]->MorePads(fInput->DetElemId()); + fSeg2[cath]->NextPad(fInput->DetElemId())) + { + ix = fSeg2[cath]->Ix(); + iy = fSeg2[cath]->Iy(); + // skip the current pad + if (iy == fIy[i][cath]) continue; - if (fHitMap[cath]->TestHit(ix, iy)!=kEmpty) { + if (fDigitMap[cath]->TestHit(ix, iy)!=kEmpty) { iNN++; - digt=(AliMUONDigit*) fHitMap[cath]->GetHit(ix,iy); + digt=(AliMUONDigit*) fDigitMap[cath]->GetHit(ix,iy); if (digt->Signal() > fQ[i][cath]) isLocal[i][cath]=kFALSE; - } - } // Loop over pad neighbours in y + } + } // Loop over pad neighbours in y + if (isLocal[i][cath] && iNN>0) { fIndLocal[fNLocal[cath]][cath]=i; fNLocal[cath]++; @@ -1085,14 +1075,10 @@ void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) } // loop over all digits // if one additional maximum has been found we are happy // if more maxima have been found restore the previous situation - if (fDebugLevel) { - fprintf(stderr, - "\n New search gives %d local maxima for cathode 1 \n", - fNLocal[0]); - fprintf(stderr, - " %d local maxima for cathode 2 \n", - fNLocal[1]); - } + AliDebug(1,Form("\n New search gives %d local maxima for cathode 1 \n", + fNLocal[0])); + AliDebug(1,Form(" %d local maxima for cathode 2 \n", + fNLocal[1])); if (fNLocal[cath]>2) { fNLocal[cath]=iback; } @@ -1111,9 +1097,11 @@ void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) // // Loop over cluster digits for (i=0; iSector(fIx[i][cath],fIy[i][cath]); - dpx=fSeg[cath]->Dpx(isec); - dpy=fSeg[cath]->Dpy(isec); + isec=fSeg2[cath]->Sector(fInput->DetElemId(), fIx[i][cath],fIy[i][cath]); + dpx=fSeg2[cath]->Dpx(fInput->DetElemId(), isec); + dpy=fSeg2[cath]->Dpy(fInput->DetElemId(), isec); + + if (isLocal[i][cath]) continue; // Pad position should be consistent with position of local maxima on the opposite cathode if ((TMath::Abs(fY[i][cath]-fY[fIndLocal[0][cath1]][cath1]) > dpy/2.+eps) && @@ -1127,26 +1115,24 @@ void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) // iNN counts the number of neighbours with signal, it should be 1 or 2 Int_t iNN=0; - for (fSeg[cath] - ->FirstPad(fX[i][cath], fY[i][cath], fZPlane, dpx, 0.); - fSeg[cath] - ->MorePads(); - fSeg[cath] - ->NextPad()) - { - - ix = fSeg[cath]->Ix(); - iy = fSeg[cath]->Iy(); - - // skip the current pad - if (ix == fIx[i][cath]) continue; + for (fSeg2[cath]->FirstPad(fInput->DetElemId(), fX[i][cath], fY[i][cath], fZPlane, dpx, 0.); + fSeg2[cath]->MorePads(fInput->DetElemId()); + fSeg2[cath]->NextPad(fInput->DetElemId())) + { + + ix = fSeg2[cath]->Ix(); + iy = fSeg2[cath]->Iy(); + + // skip the current pad + if (ix == fIx[i][cath]) continue; - if (fHitMap[cath]->TestHit(ix, iy)!=kEmpty) { + if (fDigitMap[cath]->TestHit(ix, iy)!=kEmpty) { iNN++; - digt=(AliMUONDigit*) fHitMap[cath]->GetHit(ix,iy); + digt=(AliMUONDigit*) fDigitMap[cath]->GetHit(ix,iy); if (digt->Signal() > fQ[i][cath]) isLocal[i][cath]=kFALSE; - } - } // Loop over pad neighbours in x + } + } // Loop over pad neighbours in x + if (isLocal[i][cath] && iNN>0) { fIndLocal[fNLocal[cath]][cath]=i; fNLocal[cath]++; @@ -1154,11 +1140,9 @@ void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) } // loop over all digits // if one additional maximum has been found we are happy // if more maxima have been found restore the previous situation - if (fDebugLevel) { - fprintf(stderr,"\n New search gives %d local maxima for cathode 1 \n",fNLocal[0]); - fprintf(stderr,"\n %d local maxima for cathode 2 \n",fNLocal[1]); - printf("\n New search gives %d %d \n",fNLocal[0],fNLocal[1]); - } + AliDebug(1,Form("\n New search gives %d local maxima for cathode 1 \n",fNLocal[0])); + AliDebug(1,Form("\n %d local maxima for cathode 2 \n",fNLocal[1])); + AliDebug(1,Form("\n New search gives %d %d \n",fNLocal[0],fNLocal[1])); if (fNLocal[cath]>2) { fNLocal[cath]=iback; } @@ -1168,138 +1152,141 @@ void AliMUONClusterFinderVS::FindLocalMaxima(AliMUONRawCluster* /*c*/) void AliMUONClusterFinderVS::FillCluster(AliMUONRawCluster* c, Int_t flag, Int_t cath) { -// -// Completes cluster information starting from list of digits -// - AliMUONDigit* dig; - Float_t x, y, z; - Int_t ix, iy; - - if (cath==1) { - c->SetPeakSignal(cath,c->GetPeakSignal(0)); - } else { - c->SetPeakSignal(cath,0); - } + // + // Completes cluster information starting from list of digits + // + AliMUONDigit* dig; + Float_t x, y, z; + Int_t ix, iy; + + if (cath==1) { + c->SetPeakSignal(cath,c->GetPeakSignal(0)); + } else { + c->SetPeakSignal(cath,0); + } + + + if (flag) { + c->SetX(cath,0.); + c->SetY(cath,0.); + c->SetCharge(cath,0); + } + + AliDebug(1,Form("\n fPeakSignal %d\n",c->GetPeakSignal(cath))); + for (Int_t i=0; iGetMultiplicity(cath); i++) + { + dig= fInput->Digit(cath,c->GetIndex(i,cath)); + ix=dig->PadX()+c->GetOffset(i,cath); + iy=dig->PadY(); + Int_t q=dig->Signal(); + if (!flag) q=Int_t(q*c->GetContrib(i,cath)); + // fprintf(stderr,"q %d c->fPeakSignal[ %d ] %d\n",q,cath,c->fPeakSignal[cath]); + if (dig->Physics() >= dig->Signal()) { + c->SetPhysics(i,2); + } else if (dig->Physics() == 0) { + c->SetPhysics(i,0); + } else c->SetPhysics(i,1); + // + // + AliDebug(2,Form("q %d c->fPeakSignal[cath] %d\n",q,c->GetPeakSignal(cath))); + // peak signal and track list + if (q>c->GetPeakSignal(cath)) { + c->SetPeakSignal(cath, q); + c->SetTrack(0,dig->Hit()); + c->SetTrack(1,dig->Track(0)); + c->SetTrack(2,dig->Track(1)); + // fprintf(stderr," c->fTracks[0] %d c->fTracks[1] %d\n",dig->fHit,dig->fTracks[0]); + } + // + if (flag) { + fSeg2[cath]->GetPadC(fInput->DetElemId(), ix, iy, x, y, z); + + c->AddX(cath, q*x); + c->AddY(cath, q*y); + c->AddCharge(cath, q); + } + } // loop over digits + AliDebug(1," fin du cluster c\n"); + + + if (flag) { + c->SetX(cath, c->GetX(cath)/c->GetCharge(cath)); + // Force on anod + c->SetX(cath, fSeg2[cath]->GetAnod(fInput->DetElemId(), c->GetX(cath))); + c->SetY(cath, c->GetY(cath)/c->GetCharge(cath)); + // + // apply correction to the coordinate along the anode wire + // + x=c->GetX(cath); + y=c->GetY(cath); + TF1* cogCorr; + Int_t isec; + fSeg2[cath]->GetPadI(fInput->DetElemId(), x, y, fZPlane, ix, iy); + fSeg2[cath]->GetPadC(fInput->DetElemId(), ix, iy, x, y, z); + isec=fSeg2[cath]->Sector(fInput->DetElemId(), ix,iy); + cogCorr = fSeg2[cath]->CorrFunc(fInput->DetElemId(), isec-1); - if (flag) { - c->SetX(cath,0.); - c->SetY(cath,0.); - c->SetCharge(cath,0); + if (cogCorr) { + Float_t yOnPad; + yOnPad=(c->GetY(cath)-y)/fSeg2[cath]->Dpy(fInput->DetElemId(), isec); + + c->SetY(cath, c->GetY(cath)-cogCorr->Eval(yOnPad, 0, 0)); + // slat ID from digit + } + } +} - if (fDebugLevel) - fprintf(stderr,"\n fPeakSignal %d\n",c->GetPeakSignal(cath)); - for (Int_t i=0; iGetMultiplicity(cath); i++) +void AliMUONClusterFinderVS::FillCluster(AliMUONRawCluster* c, Int_t cath) +{ + // + // Completes cluster information starting from list of digits + // + static Float_t dr0; + + AliMUONDigit* dig; + + if (cath==0) { + dr0 = 10000; + } + + Float_t xpad, ypad, zpad; + Float_t dx, dy, dr; + + for (Int_t i=0; iGetMultiplicity(cath); i++) { - dig= fInput->Digit(cath,c->GetIndex(i,cath)); - ix=dig->PadX()+c->GetOffset(i,cath); - iy=dig->PadY(); + dig = fInput->Digit(cath,c->GetIndex(i,cath)); + fSeg2[cath]-> + GetPadC(fInput->DetElemId(),dig->PadX(),dig->PadY(),xpad,ypad, zpad); + AliDebug(1,Form("x %f y %f cx %f cy %f\n",xpad,ypad,c->GetX(0),c->GetY(0))); + dx = xpad - c->GetX(0); + dy = ypad - c->GetY(0); + dr = TMath::Sqrt(dx*dx+dy*dy); + + if (dr < dr0) { + dr0 = dr; + AliDebug(1,Form(" dr %f\n",dr)); Int_t q=dig->Signal(); - if (!flag) q=Int_t(q*c->GetContrib(i,cath)); -// fprintf(stderr,"q %d c->fPeakSignal[ %d ] %d\n",q,cath,c->fPeakSignal[cath]); if (dig->Physics() >= dig->Signal()) { - c->SetPhysics(i,2); + c->SetPhysics(i,2); } else if (dig->Physics() == 0) { - c->SetPhysics(i,0); + c->SetPhysics(i,0); } else c->SetPhysics(i,1); -// -// - if (fDebugLevel>1) - fprintf(stderr,"q %d c->fPeakSignal[cath] %d\n",q,c->GetPeakSignal(cath)); -// peak signal and track list - if (q>c->GetPeakSignal(cath)) { - c->SetPeakSignal(cath, q); - c->SetTrack(0,dig->Hit()); - c->SetTrack(1,dig->Track(0)); - c->SetTrack(2,dig->Track(1)); -// fprintf(stderr," c->fTracks[0] %d c->fTracks[1] %d\n",dig->fHit,dig->fTracks[0]); - } -// - if (flag) { - fSeg[cath]->GetPadC(ix, iy, x, y, z); - c->AddX(cath, q*x); - c->AddY(cath, q*y); - c->AddCharge(cath, q); - } - } // loop over digits - if (fDebugLevel) - fprintf(stderr," fin du cluster c\n"); - - - if (flag) { - c->SetX(cath, c->GetX(cath)/c->GetCharge(cath)); -// Force on anod - c->SetX(cath, fSeg[cath]->GetAnod(c->GetX(cath))); - c->SetY(cath, c->GetY(cath)/c->GetCharge(cath)); -// -// apply correction to the coordinate along the anode wire -// - x=c->GetX(cath); - y=c->GetY(cath); - fSeg[cath]->GetPadI(x, y, fZPlane, ix, iy); - fSeg[cath]->GetPadC(ix, iy, x, y, z); - Int_t isec=fSeg[cath]->Sector(ix,iy); - TF1* cogCorr = fSeg[cath]->CorrFunc(isec-1); + c->SetPeakSignal(cath,q); + c->SetTrack(0,dig->Hit()); + c->SetTrack(1,dig->Track(0)); + c->SetTrack(2,dig->Track(1)); - if (cogCorr) { - Float_t yOnPad=(c->GetY(cath)-y)/fSeg[cath]->Dpy(isec); - c->SetY(cath, c->GetY(cath)-cogCorr->Eval(yOnPad, 0, 0)); - } - } -} - -void AliMUONClusterFinderVS::FillCluster(AliMUONRawCluster* c, Int_t cath) -{ -// -// Completes cluster information starting from list of digits -// - static Float_t dr0; - - AliMUONDigit* dig; - - if (cath==0) { - dr0 = 10000; - } - - Float_t xpad, ypad, zpad; - Float_t dx, dy, dr; - - for (Int_t i=0; iGetMultiplicity(cath); i++) - { - dig = fInput->Digit(cath,c->GetIndex(i,cath)); - fSeg[cath]-> - GetPadC(dig->PadX(),dig->PadY(),xpad,ypad, zpad); - if (fDebugLevel) - fprintf(stderr,"x %f y %f cx %f cy %f\n",xpad,ypad,c->GetX(0),c->GetY(0)); - dx = xpad - c->GetX(0); - dy = ypad - c->GetY(0); - dr = TMath::Sqrt(dx*dx+dy*dy); - - if (dr < dr0) { - dr0 = dr; - if (fDebugLevel) - fprintf(stderr," dr %f\n",dr); - Int_t q=dig->Signal(); - if (dig->Physics() >= dig->Signal()) { - c->SetPhysics(i,2); - } else if (dig->Physics() == 0) { - c->SetPhysics(i,0); - } else c->SetPhysics(i,1); - c->SetPeakSignal(cath,q); - c->SetTrack(0,dig->Hit()); - c->SetTrack(1,dig->Track(0)); - c->SetTrack(2,dig->Track(1)); - if (fDebugLevel) - fprintf(stderr," c->fTracks[0] %d c->fTracks[1] %d\n",dig->Hit(), - dig->Track(0)); - } -// + AliDebug(1,Form(" c->fTracks[0] %d c->fTracks[1] %d\n",dig->Hit(), + dig->Track(0))); + } + // } // loop over digits - -// apply correction to the coordinate along the anode wire -// Force on anod - c->SetX(cath,fSeg[cath]->GetAnod(c->GetX(cath))); + + // apply correction to the coordinate along the anode wire + // Force on anod + c->SetX(cath,fSeg2[cath]->GetAnod(fInput->DetElemId(), c->GetX(cath))); } void AliMUONClusterFinderVS::FindCluster(Int_t i, Int_t j, Int_t cath, AliMUONRawCluster &c){ @@ -1312,8 +1299,8 @@ void AliMUONClusterFinderVS::FindCluster(Int_t i, Int_t j, Int_t cath, AliMUONR // Add i,j as element of the cluster // - Int_t idx = fHitMap[cath]->GetHitIndex(i,j); - AliMUONDigit* dig = (AliMUONDigit*) fHitMap[cath]->GetHit(i,j); + Int_t idx = fDigitMap[cath]->GetHitIndex(i,j); + AliMUONDigit* dig = (AliMUONDigit*) fDigitMap[cath]->GetHit(i,j); Int_t q=dig->Signal(); Int_t theX=dig->PadX(); Int_t theY=dig->PadY(); @@ -1357,21 +1344,19 @@ void AliMUONClusterFinderVS::FindCluster(Int_t i, Int_t j, Int_t cath, AliMUONR c.SetMultiplicity(cath, c.GetMultiplicity(cath)+1); if (c.GetMultiplicity(cath) >= 50 ) { - if (fDebugLevel) - printf("FindCluster - multiplicity >50 %d \n",c.GetMultiplicity(0)); + AliDebug(1,Form("FindCluster - multiplicity >50 %d \n",c.GetMultiplicity(0))); c.SetMultiplicity(cath, 49); } // Prepare center of gravity calculation Float_t x, y, z; - fSeg[cath]->GetPadC(i, j, x, y, z); - + fSeg2[cath]->GetPadC(fInput->DetElemId(), i, j, x, y, z); c.AddX(cath,q*x); c.AddY(cath,q*y); c.AddCharge(cath,q); // // Flag hit as "taken" - fHitMap[cath]->FlagHit(i,j); + fDigitMap[cath]->FlagHit(i,j); // // Now look recursively for all neighbours and pad hit on opposite cathode // @@ -1380,14 +1365,13 @@ void AliMUONClusterFinderVS::FindCluster(Int_t i, Int_t j, Int_t cath, AliMUONR ix=iy=0; Int_t nn; Int_t xList[10], yList[10]; - fSeg[cath]->Neighbours(i,j,&nn,xList,yList); + fSeg2[cath]->Neighbours(fInput->DetElemId(), i,j,&nn,xList,yList); for (Int_t in=0; inTestHit(ix,iy)==kUnused) { - if (fDebugLevel>1) - printf("\n Neighbours %d %d %d", cath, ix, iy); + if (fDigitMap[cath]->TestHit(ix,iy)==kUnused) { + AliDebug(2,Form("\n Neighbours %d %d %d", cath, ix, iy)); FindCluster(ix, iy, cath, c); } @@ -1397,43 +1381,47 @@ void AliMUONClusterFinderVS::FindCluster(Int_t i, Int_t j, Int_t cath, AliMUONR // Neighbours on opposite cathode // Take into account that several pads can overlap with the present pad - Int_t isec=fSeg[cath]->Sector(i,j); + Int_t isec; + isec=fSeg2[cath]->Sector(fInput->DetElemId(), i,j); + Int_t iop; Float_t dx, dy; - + if (cath==0) { - iop = 1; - dx = (fSeg[cath]->Dpx(isec))/2.; - dy = 0.; + iop = 1; + dx = (fSeg2[cath]->Dpx(fInput->DetElemId(), isec))/2.; + dy = 0.; } else { - iop = 0; - dx = 0.; - dy = (fSeg[cath]->Dpy(isec))/2; + iop = 0; + dx = 0.; + dy = (fSeg2[cath]->Dpy(fInput->DetElemId(), isec))/2; } -// loop over pad neighbours on opposite cathode - for (fSeg[iop]->FirstPad(x, y, fZPlane, dx, dy); - fSeg[iop]->MorePads(); - fSeg[iop]->NextPad()) - { + + + + // loop over pad neighbours on opposite cathode + for (fSeg2[iop]->FirstPad(fInput->DetElemId(), x, y, fZPlane, dx, dy); + fSeg2[iop]->MorePads(fInput->DetElemId()); + fSeg2[iop]->NextPad(fInput->DetElemId())) + { - ix = fSeg[iop]->Ix(); iy = fSeg[iop]->Iy(); - if (fDebugLevel > 1) - printf("\n ix, iy: %f %f %f %d %d %d", x,y,z,ix, iy, fSector); - if (fHitMap[iop]->TestHit(ix,iy)==kUnused){ - iXopp[nOpp]=ix; - iYopp[nOpp++]=iy; - if (fDebugLevel > 1) - printf("\n Opposite %d %d %d", iop, ix, iy); + ix = fSeg2[iop]->Ix(); iy = fSeg2[iop]->Iy(); + AliDebug(2,Form("\n ix, iy: %f %f %f %d %d %d", x,y,z,ix, iy, fSector)); + if (fDigitMap[iop]->TestHit(ix,iy)==kUnused){ + iXopp[nOpp]=ix; + iYopp[nOpp++]=iy; + AliDebug(2,Form("\n Opposite %d %d %d", iop, ix, iy)); } - } // Loop over pad neighbours -// This had to go outside the loop since recursive calls inside the iterator are not possible -// + } // Loop over pad neighbours + // This had to go outside the loop since recursive calls inside the iterator are not possible + // Int_t jopp; for (jopp=0; joppTestHit(iXopp[jopp],iYopp[jopp]) == kUnused) - FindCluster(iXopp[jopp], iYopp[jopp], iop, c); + if (fDigitMap[iop]->TestHit(iXopp[jopp],iYopp[jopp]) == kUnused) + FindCluster(iXopp[jopp], iYopp[jopp], iop, c); } + } //_____________________________________________________________________________ @@ -1449,100 +1437,109 @@ void AliMUONClusterFinderVS::FindRawClusters() // Return if no input datad available if (!fInput->NDigits(0) && !fInput->NDigits(1)) return; - fSeg[0] = fInput->Segmentation(0); - fSeg[1] = fInput->Segmentation(1); - - fHitMap[0] = new AliMUONHitMapA1(fSeg[0], fInput->Digits(0)); - fHitMap[1] = new AliMUONHitMapA1(fSeg[1], fInput->Digits(1)); + fSeg2[0] = fInput->Segmentation2(0); + fSeg2[1] = fInput->Segmentation2(1); + + Int_t detElemId = fInput->DetElemId(); + + Int_t npx0 = fSeg2[0]->Npx(detElemId)+1; + Int_t npy0 = fSeg2[0]->Npy(detElemId)+1; + fDigitMap[0] = new AliMUONDigitMapA1(detElemId, npx0, npy0); - + Int_t npx1 = fSeg2[0]->Npx(detElemId)+1; + Int_t npy1 = fSeg2[0]->Npy(detElemId)+1; + fDigitMap[1] = new AliMUONDigitMapA1(detElemId, npx1, npy1); + AliMUONDigit *dig; Int_t ndig, cath; Int_t nskip=0; Int_t ncls=0; - fHitMap[0]->FillHits(); - fHitMap[1]->FillHits(); + + fDigitMap[0]->FillHits(fInput->Digits(0)); + fDigitMap[1]->FillHits(fInput->Digits(1)); // // Outer Loop over Cathodes - for (cath=0; cath<2; cath++) { + for (cath = 0; cath < 2; cath++) { + for (ndig=0; ndigNDigits(cath); ndig++) { - dig = fInput->Digit(cath, ndig); - Int_t i=dig->PadX(); - Int_t j=dig->PadY(); - if (fHitMap[cath]->TestHit(i,j)==kUsed ||fHitMap[0]->TestHit(i,j)==kEmpty) { - nskip++; - continue; - } - if (fDebugLevel) - fprintf(stderr,"\n CATHODE %d CLUSTER %d\n",cath,ncls); - AliMUONRawCluster c; - c.SetMultiplicity(0, 0); - c.SetMultiplicity(1, 0); - c.SetPeakSignal(cath,dig->Signal()); - c.SetTrack(0, dig->Hit()); - c.SetTrack(1, dig->Track(0)); - c.SetTrack(2, dig->Track(1)); - // tag the beginning of cluster list in a raw cluster - c.SetNcluster(0,-1); - Float_t xcu, ycu; - fSeg[cath]->GetPadC(i,j,xcu, ycu, fZPlane); - fSector= fSeg[cath]->Sector(i,j)/100; - if (fDebugLevel) - printf("\n New Seed %d %d ", i,j); - - - FindCluster(i,j,cath,c); -// ^^^^^^^^^^^^^^^^^^^^^^^^ - // center of gravity - if (c.GetX(0)!=0.) c.SetX(0, c.GetX(0)/c.GetCharge(0)); // c.fX[0] /= c.fQ[0]; -// Force on anod - c.SetX(0,fSeg[0]->GetAnod(c.GetX(0))); - if (c.GetY(0)!=0.) c.SetY(0, c.GetY(0)/c.GetCharge(0)); // c.fY[0] /= c.fQ[0]; - - if(c.GetCharge(1)!=0.) c.SetX(1, c.GetX(1)/c.GetCharge(1)); // c.fX[1] /= c.fQ[1]; - - // Force on anod - c.SetX(1, fSeg[0]->GetAnod(c.GetX(1))); - if(c.GetCharge(1)!=0.) c.SetY(1, c.GetY(1)/c.GetCharge(1));// c.fY[1] /= c.fQ[1]; - - c.SetZ(0, fZPlane); - c.SetZ(1, fZPlane); - - if (fDebugLevel) { - fprintf(stderr,"\n Cathode 1 multiplicite %d X(CG) %f Y(CG) %f\n", - c.GetMultiplicity(0),c.GetX(0),c.GetY(0)); - fprintf(stderr," Cathode 2 multiplicite %d X(CG) %f Y(CG) %f\n", - c.GetMultiplicity(1),c.GetX(1),c.GetY(1)); - } -// Analyse cluster and decluster if necessary -// - ncls++; - c.SetNcluster(1,fNRawClusters); - c.SetClusterType(c.PhysicsContribution()); - - fNPeaks=0; -// -// - Decluster(&c); -// -// reset Cluster object - { // begin local scope - for (int k=0;kDigit(cath, ndig); + Int_t padx = dig->PadX(); + Int_t pady = dig->PadY(); + if (fDigitMap[cath]->TestHit(padx,pady)==kUsed ||fDigitMap[0]->TestHit(padx,pady)==kEmpty) { + nskip++; + continue; + } + AliDebug(1,Form("\n CATHODE %d CLUSTER %d\n",cath,ncls)); + AliMUONRawCluster clus; + clus.SetMultiplicity(0, 0); + clus.SetMultiplicity(1, 0); + clus.SetPeakSignal(cath,dig->Signal()); + clus.SetTrack(0, dig->Hit()); + clus.SetTrack(1, dig->Track(0)); + clus.SetTrack(2, dig->Track(1)); + + AliDebug(1,Form("idDE %d Padx %d Pady %d", fInput->DetElemId(), padx, pady)); + + // tag the beginning of cluster list in a raw cluster + clus.SetNcluster(0,-1); + Float_t xcu, ycu; + fSeg2[cath]->GetPadC(fInput->DetElemId(), padx, pady, xcu, ycu, fZPlane); + fSector= fSeg2[cath]->Sector(fInput->DetElemId(), padx, pady)/100; + + + + + FindCluster(padx,pady,cath,clus); + //^^^^^^^^^^^^^^^^^^^^^^^^ + // center of gravity + if (clus.GetX(0)!=0.) clus.SetX(0, clus.GetX(0)/clus.GetCharge(0)); // clus.fX[0] /= clus.fQ[0]; + + // Force on anod + clus.SetX(0,fSeg2[0]->GetAnod(fInput->DetElemId(), clus.GetX(0))); + if (clus.GetY(0)!=0.) clus.SetY(0, clus.GetY(0)/clus.GetCharge(0)); // clus.fY[0] /= clus.fQ[0]; + + if(clus.GetCharge(1)!=0.) clus.SetX(1, clus.GetX(1)/clus.GetCharge(1)); // clus.fX[1] /= clus.fQ[1]; + + // Force on anod + clus.SetX(1, fSeg2[0]->GetAnod(fInput->DetElemId(),clus.GetX(1))); + if(clus.GetCharge(1)!=0.) clus.SetY(1, clus.GetY(1)/clus.GetCharge(1));// clus.fY[1] /= clus.fQ[1]; + + clus.SetZ(0, fZPlane); + clus.SetZ(1, fZPlane); + + AliDebug(1,Form("\n Cathode 1 multiplicite %d X(CG) %f Y(CG) %f\n", + clus.GetMultiplicity(0),clus.GetX(0),clus.GetY(0))); + AliDebug(1,Form(" Cathode 2 multiplicite %d X(CG) %f Y(CG) %f\n", + clus.GetMultiplicity(1),clus.GetX(1),clus.GetY(1))); + // Analyse cluster and decluster if necessary + // + ncls++; + clus.SetNcluster(1,fNRawClusters); + clus.SetClusterType(clus.PhysicsContribution()); + + fNPeaks=0; + // + // + Decluster(&clus); + // + // reset Cluster object + { // begin local scope + for (int k=0;kSetFCN(fcnS1); clusterInput.Fitter()->mninit(2,10,7); - clusterInput.Fitter()->SetPrintLevel(-1+fDebugLevel); + clusterInput.Fitter()->SetPrintLevel(-1 + AliLog::GetGlobalDebugLevel()); arglist[0]=-1; clusterInput.Fitter()->mnexcm("SET NOW", arglist, 0, ierflag); // Set starting values @@ -1566,15 +1563,17 @@ Float_t AliMUONClusterFinderVS::SingleMathiesonFit(AliMUONRawCluster *c, Int_t c // lower and upper limits static Double_t lower[2], upper[2]; - Int_t ix,iy; - fSeg[cath]->GetPadI(c->GetX(cath), c->GetY(cath), fZPlane, ix, iy); - Int_t isec=fSeg[cath]->Sector(ix, iy); - lower[0]=vstart[0]-fSeg[cath]->Dpx(isec)/2; - lower[1]=vstart[1]-fSeg[cath]->Dpy(isec)/2; + Int_t ix,iy, isec; + fSeg2[cath]->GetPadI(fInput->DetElemId(), c->GetX(cath), c->GetY(cath), fZPlane, ix, iy); + isec=fSeg2[cath]->Sector(fInput->DetElemId(), ix, iy); + + lower[0]=vstart[0]-fSeg2[cath]->Dpx(fInput->DetElemId(), isec)/2; + lower[1]=vstart[1]-fSeg2[cath]->Dpy(fInput->DetElemId(), isec)/2; - upper[0]=lower[0]+fSeg[cath]->Dpx(isec); - upper[1]=lower[1]+fSeg[cath]->Dpy(isec); + upper[0]=lower[0]+fSeg2[cath]->Dpx(fInput->DetElemId(), isec); + upper[1]=lower[1]+fSeg2[cath]->Dpy(fInput->DetElemId(), isec); + // step sizes static Double_t step[2]={0.0005, 0.0005}; @@ -1615,7 +1614,7 @@ Float_t AliMUONClusterFinderVS::CombiSingleMathiesonFit(AliMUONRawCluster * /*c* AliMUONClusterInput& clusterInput = *(AliMUONClusterInput::Instance()); clusterInput.Fitter()->SetFCN(fcnCombiS1); clusterInput.Fitter()->mninit(2,10,7); - clusterInput.Fitter()->SetPrintLevel(-1+fDebugLevel); + clusterInput.Fitter()->SetPrintLevel(-1 + AliLog::GetGlobalDebugLevel()); arglist[0]=-1; clusterInput.Fitter()->mnexcm("SET NOW", arglist, 0, ierflag); static Double_t vstart[2]; @@ -1626,45 +1625,46 @@ Float_t AliMUONClusterFinderVS::CombiSingleMathiesonFit(AliMUONRawCluster * /*c* // lower and upper limits static Float_t lower[2], upper[2]; Int_t ix,iy,isec; - fSeg[0]->GetPadI(fXInit[0], fYInit[0], fZPlane, ix, iy); - isec=fSeg[0]->Sector(ix, iy); - Float_t dpy=fSeg[0]->Dpy(isec); - fSeg[1]->GetPadI(fXInit[0], fYInit[0], fZPlane, ix, iy); - isec=fSeg[1]->Sector(ix, iy); - Float_t dpx=fSeg[1]->Dpx(isec); - + Float_t dpy, dpx; + + fSeg2[0]->GetPadI(fInput->DetElemId(), fXInit[0], fYInit[0], fZPlane, ix, iy); + isec=fSeg2[0]->Sector(fInput->DetElemId(), ix, iy); + dpy=fSeg2[0]->Dpy(fInput->DetElemId(), isec); + fSeg2[1]->GetPadI(fInput->DetElemId(), fXInit[0], fYInit[0], fZPlane, ix, iy); + isec=fSeg2[1]->Sector(fInput->DetElemId(), ix, iy); + dpx=fSeg2[1]->Dpx(fInput->DetElemId(), isec); + Int_t icount; Float_t xdum, ydum, zdum; // Find save upper and lower limits icount = 0; + for (fSeg2[1]->FirstPad(fInput->DetElemId(),fXInit[0], fYInit[0], fZPlane, dpx, 0.); + fSeg2[1]->MorePads(fInput->DetElemId()); + fSeg2[1]->NextPad(fInput->DetElemId())) + { + ix=fSeg2[1]->Ix(); iy=fSeg2[1]->Iy(); + fSeg2[1]->GetPadC(fInput->DetElemId(), ix,iy, upper[0], ydum, zdum); + if (icount ==0) lower[0]=upper[0]; + icount++; + } - for (fSeg[1]->FirstPad(fXInit[0], fYInit[0], fZPlane, dpx, 0.); - fSeg[1]->MorePads(); fSeg[1]->NextPad()) - { - ix=fSeg[1]->Ix(); iy=fSeg[1]->Iy(); - fSeg[1]->GetPadC(ix,iy, upper[0], ydum, zdum); - if (icount ==0) lower[0]=upper[0]; - icount++; - } - if (lower[0]>upper[0]) {xdum=lower[0]; lower[0]=upper[0]; upper[0]=xdum;} icount=0; - if (fDebugLevel) - printf("\n single y %f %f", fXInit[0], fYInit[0]); + AliDebug(1,Form("\n single y %f %f", fXInit[0], fYInit[0])); - for (fSeg[0]->FirstPad(fXInit[0], fYInit[0], fZPlane, 0., dpy); - fSeg[0]->MorePads(); fSeg[0]->NextPad()) - { - ix=fSeg[0]->Ix(); iy=fSeg[0]->Iy(); - fSeg[0]->GetPadC(ix,iy,xdum,upper[1],zdum); - if (icount ==0) lower[1]=upper[1]; - icount++; - if (fDebugLevel) - printf("\n upper lower %d %f %f", icount, upper[1], lower[1]); - } + for (fSeg2[0]->FirstPad(fInput->DetElemId(), fXInit[0], fYInit[0], fZPlane, 0., dpy); + fSeg2[0]->MorePads(fInput->DetElemId()); + fSeg2[0]->NextPad(fInput->DetElemId())) + { + ix=fSeg2[0]->Ix(); iy=fSeg2[0]->Iy(); + fSeg2[0]->GetPadC(fInput->DetElemId(), ix,iy,xdum,upper[1],zdum); + if (icount ==0) lower[1]=upper[1]; + icount++; + AliDebug(1,Form("\n upper lower %d %f %f", icount, upper[1], lower[1])); + } if (lower[1]>upper[1]) {xdum=lower[1]; lower[1]=upper[1]; upper[1]=xdum;} @@ -1711,7 +1711,7 @@ Bool_t AliMUONClusterFinderVS::DoubleMathiesonFit(AliMUONRawCluster * /*c*/, Int AliMUONClusterInput& clusterInput = *(AliMUONClusterInput::Instance()); clusterInput.Fitter()->SetFCN(fcnS2); clusterInput.Fitter()->mninit(5,10,7); - clusterInput.Fitter()->SetPrintLevel(-1+fDebugLevel); + clusterInput.Fitter()->SetPrintLevel(-1 + AliLog::GetGlobalDebugLevel()); arglist[0]=-1; clusterInput.Fitter()->mnexcm("SET NOW", arglist, 0, ierflag); // Set starting values @@ -1724,20 +1724,26 @@ Bool_t AliMUONClusterFinderVS::DoubleMathiesonFit(AliMUONRawCluster * /*c*/, Int Float_t(fQ[fIndLocal[0][cath]][cath]+fQ[fIndLocal[1][cath]][cath]); // lower and upper limits static Float_t lower[5], upper[5]; - Int_t isec=fSeg[cath]->Sector(fIx[fIndLocal[0][cath]][cath], fIy[fIndLocal[0][cath]][cath]); - lower[0]=vstart[0]-fSeg[cath]->Dpx(isec); - lower[1]=vstart[1]-fSeg[cath]->Dpy(isec); + Int_t isec; + + isec=fSeg2[cath]->Sector(fInput->DetElemId(),fIx[fIndLocal[0][cath]][cath], + fIy[fIndLocal[0][cath]][cath]); + lower[0]=vstart[0]-fSeg2[cath]->Dpx(fInput->DetElemId(),isec); + lower[1]=vstart[1]-fSeg2[cath]->Dpy(fInput->DetElemId(),isec); - upper[0]=lower[0]+2.*fSeg[cath]->Dpx(isec); - upper[1]=lower[1]+2.*fSeg[cath]->Dpy(isec); + upper[0]=lower[0]+2.*fSeg2[cath]->Dpx(fInput->DetElemId(),isec); + upper[1]=lower[1]+2.*fSeg2[cath]->Dpy(fInput->DetElemId(),isec); - isec=fSeg[cath]->Sector(fIx[fIndLocal[1][cath]][cath], fIy[fIndLocal[1][cath]][cath]); - lower[2]=vstart[2]-fSeg[cath]->Dpx(isec)/2; - lower[3]=vstart[3]-fSeg[cath]->Dpy(isec)/2; + isec=fSeg2[cath]->Sector(fInput->DetElemId(),fIx[fIndLocal[1][cath]][cath], + fIy[fIndLocal[1][cath]][cath]); + lower[2]=vstart[2]-fSeg2[cath]->Dpx(fInput->DetElemId(),isec)/2; + lower[3]=vstart[3]-fSeg2[cath]->Dpy(fInput->DetElemId(),isec)/2; - upper[2]=lower[2]+fSeg[cath]->Dpx(isec); - upper[3]=lower[3]+fSeg[cath]->Dpy(isec); + upper[2]=lower[2]+fSeg2[cath]->Dpx(fInput->DetElemId(),isec); + upper[1]=lower[1]+2.*fSeg2[cath]->Dpy(fInput->DetElemId(),isec); + + lower[4]=0.; upper[4]=1.; // step sizes @@ -1784,7 +1790,7 @@ Float_t AliMUONClusterFinderVS::CombiDoubleMathiesonFit(AliMUONRawCluster * /*c* AliMUONClusterInput& clusterInput = *(AliMUONClusterInput::Instance()); clusterInput.Fitter()->SetFCN(fcnCombiS2); clusterInput.Fitter()->mninit(6,10,7); - clusterInput.Fitter()->SetPrintLevel(-1+fDebugLevel); + clusterInput.Fitter()->SetPrintLevel(-1 + AliLog::GetGlobalDebugLevel()); arglist[0]=-1; clusterInput.Fitter()->mnexcm("SET NOW", arglist, 0, ierflag); // Set starting values @@ -1799,93 +1805,95 @@ Float_t AliMUONClusterFinderVS::CombiDoubleMathiesonFit(AliMUONRawCluster * /*c* static Float_t lower[6], upper[6]; Int_t ix,iy,isec; Float_t dpx, dpy; - - fSeg[1]->GetPadI(fXInit[0], fYInit[0], fZPlane, ix, iy); - isec=fSeg[1]->Sector(ix, iy); - dpx=fSeg[1]->Dpx(isec); - fSeg[0]->GetPadI(fXInit[0], fYInit[0], fZPlane, ix, iy); - isec=fSeg[0]->Sector(ix, iy); - dpy=fSeg[0]->Dpy(isec); + fSeg2[1]->GetPadI(fInput->DetElemId(),fXInit[0], fYInit[0], fZPlane, ix, iy); + isec=fSeg2[1]->Sector(fInput->DetElemId(),ix, iy); + dpx=fSeg2[1]->Dpx(fInput->DetElemId(), isec); + fSeg2[0]->GetPadI(fInput->DetElemId(), fXInit[0], fYInit[0], fZPlane, ix, iy); + isec=fSeg2[0]->Sector(fInput->DetElemId(), ix, iy); + dpy=fSeg2[0]->Dpy(fInput->DetElemId(), isec); + + Int_t icount; Float_t xdum, ydum, zdum; - if (fDebugLevel) - printf("\n Cluster Finder: %f %f %f %f ", fXInit[0], fXInit[1],fYInit[0], fYInit[1] ); - -// Find save upper and lower limits + AliDebug(1,Form("\n Cluster Finder: %f %f %f %f ", fXInit[0], fXInit[1],fYInit[0], fYInit[1] )); + + // Find save upper and lower limits icount = 0; - for (fSeg[1]->FirstPad(fXInit[0], fYInit[0], fZPlane, dpx, 0.); - fSeg[1]->MorePads(); fSeg[1]->NextPad()) - { - ix=fSeg[1]->Ix(); iy=fSeg[1]->Iy(); -// if (fHitMap[1]->TestHit(ix, iy) == kEmpty) continue; - fSeg[1]->GetPadC(ix,iy,upper[0],ydum,zdum); + for (fSeg2[1]->FirstPad(fInput->DetElemId(),fXInit[0], fYInit[0], fZPlane, dpx, 0.); + fSeg2[1]->MorePads(fInput->DetElemId()); + fSeg2[1]->NextPad(fInput->DetElemId())) + { + ix=fSeg2[1]->Ix(); iy=fSeg2[1]->Iy(); + // if (fDigitMap[1]->TestHit(ix, iy) == kEmpty) continue; + fSeg2[1]->GetPadC(fInput->DetElemId(),ix,iy,upper[0],ydum,zdum); if (icount ==0) lower[0]=upper[0]; icount++; - } + } if (lower[0]>upper[0]) {xdum=lower[0]; lower[0]=upper[0]; upper[0]=xdum;} -// vstart[0] = 0.5*(lower[0]+upper[0]); + // vstart[0] = 0.5*(lower[0]+upper[0]); icount=0; - for (fSeg[0]->FirstPad(fXInit[0], fYInit[0], fZPlane, 0., dpy); - fSeg[0]->MorePads(); fSeg[0]->NextPad()) - { - ix=fSeg[0]->Ix(); iy=fSeg[0]->Iy(); -// if (fHitMap[0]->TestHit(ix, iy) == kEmpty) continue; - fSeg[0]->GetPadC(ix,iy,xdum,upper[1],zdum); + for (fSeg2[0]->FirstPad(fInput->DetElemId(),fXInit[0], fYInit[0], fZPlane, 0., dpy); + fSeg2[0]->MorePads(fInput->DetElemId()); + fSeg2[0]->NextPad(fInput->DetElemId())) + { + ix=fSeg2[0]->Ix(); iy=fSeg2[0]->Iy(); + // if (fDigitMap[0]->TestHit(ix, iy) == kEmpty) continue; + fSeg2[0]->GetPadC(fInput->DetElemId(),ix,iy,xdum,upper[1],zdum); if (icount ==0) lower[1]=upper[1]; icount++; - } + } if (lower[1]>upper[1]) {xdum=lower[1]; lower[1]=upper[1]; upper[1]=xdum;} -// vstart[1] = 0.5*(lower[1]+upper[1]); + // vstart[1] = 0.5*(lower[1]+upper[1]); - fSeg[1]->GetPadI(fXInit[1], fYInit[1], fZPlane, ix, iy); - isec=fSeg[1]->Sector(ix, iy); - dpx=fSeg[1]->Dpx(isec); - fSeg[0]->GetPadI(fXInit[1], fYInit[1], fZPlane, ix, iy); - isec=fSeg[0]->Sector(ix, iy); - dpy=fSeg[0]->Dpy(isec); + fSeg2[1]->GetPadI(fInput->DetElemId(),fXInit[1], fYInit[1], fZPlane, ix, iy); + isec=fSeg2[1]->Sector(fInput->DetElemId(),ix, iy); + dpx=fSeg2[1]->Dpx(fInput->DetElemId(),isec); + fSeg2[0]->GetPadI(fInput->DetElemId(),fXInit[1], fYInit[1], fZPlane, ix, iy); + isec=fSeg2[0]->Sector(fInput->DetElemId(),ix, iy); + dpy=fSeg2[0]->Dpy(fInput->DetElemId(),isec); -// Find save upper and lower limits + // Find save upper and lower limits icount=0; - for (fSeg[1]->FirstPad(fXInit[1], fYInit[1], fZPlane, dpx, 0); - fSeg[1]->MorePads(); fSeg[1]->NextPad()) - { - ix=fSeg[1]->Ix(); iy=fSeg[1]->Iy(); -// if (fHitMap[1]->TestHit(ix, iy) == kEmpty) continue; - fSeg[1]->GetPadC(ix,iy,upper[2],ydum,zdum); + for (fSeg2[1]->FirstPad(fInput->DetElemId(),fXInit[1], fYInit[1], fZPlane, dpx, 0); + fSeg2[1]->MorePads(fInput->DetElemId()); + fSeg2[1]->NextPad(fInput->DetElemId())) + { + ix=fSeg2[1]->Ix(); iy=fSeg2[1]->Iy(); + // if (fDigitMap[1]->TestHit(ix, iy) == kEmpty) continue; + fSeg2[1]->GetPadC(fInput->DetElemId(),ix,iy,upper[2],ydum,zdum); if (icount ==0) lower[2]=upper[2]; icount++; - } + } if (lower[2]>upper[2]) {xdum=lower[2]; lower[2]=upper[2]; upper[2]=xdum;} // vstart[2] = 0.5*(lower[2]+upper[2]); icount=0; - for (fSeg[0]->FirstPad(fXInit[1], fYInit[1], fZPlane, 0, dpy); - fSeg[0]-> MorePads(); fSeg[0]->NextPad()) - { - ix=fSeg[0]->Ix(); iy=fSeg[0]->Iy(); -// if (fHitMap[0]->TestHit(ix, iy) != kEmpty) continue; + for (fSeg2[0]->FirstPad(fInput->DetElemId(),fXInit[1], fYInit[1], fZPlane, 0, dpy); + fSeg2[0]-> MorePads(fInput->DetElemId()); + fSeg2[0]->NextPad(fInput->DetElemId())) + { + ix=fSeg2[0]->Ix(); iy=fSeg2[0]->Iy(); + // if (fDigitMap[0]->TestHit(ix, iy) != kEmpty) continue; - fSeg[0]->GetPadC(ix,iy,xdum,upper[3],zdum); + fSeg2[0]->GetPadC(fInput->DetElemId(),ix,iy,xdum,upper[3],zdum); if (icount ==0) lower[3]=upper[3]; icount++; - } - if (lower[3]>upper[3]) {xdum=lower[3]; lower[3]=upper[3]; upper[3]=xdum;} - -// vstart[3] = 0.5*(lower[3]+upper[3]); + } + if (lower[3]>upper[3]) {xdum=lower[3]; lower[3]=upper[3]; upper[3]=xdum;} lower[4]=0.; upper[4]=1.; @@ -1959,23 +1967,54 @@ void AliMUONClusterFinderVS::Split(AliMUONRawCluster* c) } else { cnew.SetCharge(cath, Int_t(clusterInput.TotalCharge(cath)*(1-fQrFit[cath]))); } - fSeg[cath]->SetHit(fXFit[j],fYFit[j],fZPlane); + fSeg2[cath]->SetHit(fInput->DetElemId(), fXFit[j],fYFit[j],fZPlane); + for (i=0; iGetIndex(i,cath)); - fSeg[cath]->SetPad(fIx[i][cath], fIy[i][cath]); - Float_t q1 = fInput->Mathieson()->IntXY(fSeg[cath]); + + fSeg2[cath]->SetPad(fInput->DetElemId(),fIx[i][cath], fIy[i][cath]); + q1 = fInput->Mathieson()->IntXY(fInput->DetElemId(),fSeg2[cath]); + cnew.SetContrib(i, cath, q1*Float_t(cnew.GetCharge(cath))/Float_t(fQ[i][cath])); cnew.SetMultiplicity(cath, cnew.GetMultiplicity(cath)+1 ); } FillCluster(&cnew,0,cath); } // cathode loop - cnew.SetClusterType(cnew.PhysicsContribution()); if (cnew.GetCharge(0)>0 && cnew.GetCharge(1)>0) AddRawCluster(cnew); fNPeaks++; } } +void AliMUONClusterFinderVS::AddRawCluster(AliMUONRawCluster& c) +{ + // + // Add a raw cluster copy to the list + // + // AliMUON *pMUON=(AliMUON*)gAlice->GetModule("MUON"); + // pMUON->GetMUONData()->AddRawCluster(fInput->Chamber(),c); + // fNRawClusters++; + + // Setting detection element in raw cluster for alignment + // BB 19/05/05 + c.SetDetElemId(fInput->DetElemId()); + + TClonesArray &lrawcl = *fRawClusters; + new(lrawcl[fNRawClusters++]) AliMUONRawCluster(c); + AliDebug(1,Form("\nfNRawClusters %d\n",fNRawClusters)); +} +AliMUONClusterFinderVS& AliMUONClusterFinderVS +::operator = (const AliMUONClusterFinderVS& rhs) +{ +// Protected assignement operator + + if (this == &rhs) return *this; + + AliFatal("Not implemented."); + + return *this; +} // // Minimisation functions @@ -2065,52 +2104,3 @@ void fcnCombiS2(Int_t & /*npar*/, Double_t * /*gin*/, Double_t &f, Double_t *par } f=chisq; } - -void AliMUONClusterFinderVS::AddRawCluster(const AliMUONRawCluster& c) -{ - // - // Add a raw cluster copy to the list - // - -// AliMUON *pMUON=(AliMUON*)gAlice->GetModule("MUON"); -// pMUON->GetMUONData()->AddRawCluster(fInput->Chamber(),c); -// fNRawClusters++; - - - TClonesArray &lrawcl = *fRawClusters; - new(lrawcl[fNRawClusters++]) AliMUONRawCluster(c); - if (fDebugLevel) - fprintf(stderr,"\nfNRawClusters %d\n",fNRawClusters); -} - -Bool_t AliMUONClusterFinderVS::TestTrack(Int_t t) const { -// Test if track was user selected - if (fTrack[0]==-1 || fTrack[1]==-1) { - return kTRUE; - } else if (t==fTrack[0] || t==fTrack[1]) { - return kTRUE; - } else { - return kFALSE; - } -} - -AliMUONClusterFinderVS& AliMUONClusterFinderVS -::operator = (const AliMUONClusterFinderVS& rhs) -{ -// Protected assignement operator - - if (this == &rhs) return *this; - - AliFatal("Not implemented."); - - return *this; -} - - - - - - - - -