28 #include "TObjArray.h"
30 #include "TVirtualFitter.h"
33 #include <Riostream.h>
57 FitFunction(Int_t& , Double_t* ,
58 Double_t&
f, Double_t* par,
63 TObjArray* userObjects =
static_cast<TObjArray*
>(TVirtualFitter::GetFitter()->GetObjectFit());
69 Float_t qTot = cluster->
Charge();
77 if ( pad->
Status() )
continue;
79 TVector2 upperRight(lowerLeft + pad->
Dimensions()*2.0);
80 Float_t estimatedCharge = mathieson->
IntXY(lowerLeft.X(),lowerLeft.Y(),
81 upperRight.X(),upperRight.Y());
83 Float_t actualCharge = pad->
Charge()/qTot;
85 Float_t delta = (estimatedCharge - actualCharge);
95 fClusterFinder(clusterFinder),
97 fLowestClusterCharge(0)
172 TVirtualFitter* fitter = TVirtualFitter::Fitter(0,2);
173 fitter->SetFCN(FitFunction);
181 Double_t xCOG = cluster.
Position().X();
182 Double_t yCOG = cluster.
Position().Y();
184 Float_t stepX = 0.01;
185 Float_t stepY = 0.01;
189 fitter->ExecuteCommand(
"SET PRINT",&arg,1);
191 fitter->SetParameter(0,
"cluster X position",xCOG,stepX,0,0);
192 fitter->SetParameter(1,
"cluster Y position",yCOG,stepY,0,0);
196 userObjects.Add(&cluster);
199 fitter->SetObjectFit(&userObjects);
201 Int_t val = fitter->ExecuteCommand(
"MIGRAD",0,0);
202 AliDebug(1,Form(
"ExecuteCommand returned value=%d",val));
206 AliWarning(
"Fit failed. Using COG results for cluster=");
207 StdoutToAliWarning(cluster.
Print());
208 cluster.
SetPosition(TVector2(xCOG,yCOG),TVector2(TMath::Abs(xCOG),TMath::Abs(yCOG)));
212 Double_t results[] = { fitter->GetParameter(0),
213 fitter->GetParameter(1) };
215 Double_t
errors[] = { fitter->GetParError(0),
216 fitter->GetParError(1) };
218 cluster.
SetPosition(TVector2(results[0],results[1]),
219 TVector2(errors[0],errors[1]));
221 Double_t amin, edm, errdef;
224 fitter->GetStats(amin, edm, errdef, nvpar, nparx);
226 Double_t
chi2 = amin;
228 AliDebug(1,Form(
"Cluster fitted to (x,y)=(%e,%e) (xerr,yerr)=(%e,%e) \n chi2=%e ndf=%d",
229 results[0],results[1],
230 errors[0],errors[1],chi2,fitter->GetNumberFreeParameters()));
static AliMq::Station12Type GetStation12Type(Int_t detElemId)
Interface of a cluster finder.
void SetSqrtKx3AndDeriveKx2Kx4(Float_t SqrtKx3)
Mathieson sqrt{Kx3} and derived Kx2 and Kx4.
static Float_t Pitch()
Return wire pitch.
Float_t IntXY(Float_t xi1, Float_t yi1, Float_t xi2, Float_t yi2) const
Charge integration on region (x1,y1,x2,y2).
A group of adjacent pads.
static Float_t SqrtKy3St1()
Return SqrtKy3 for Station 1 & 2.
AliMUONClusterFinderSimpleFit(AliMUONVClusterFinder *clusterFinder)
static Float_t SqrtKx3()
Return SqrtKx3 for Slat.
TFile f("CalibObjects.root")
Implementation of Mathieson response.
TVector2 Dimensions() const
Return half dimensions in x and y (cm)
virtual void Print(Option_t *opt="") const
AliMUONVClusterFinder * fClusterFinder
! the preclustering we use
A rectangle area positioned in plane..
void ComputePosition(AliMUONCluster &cluster)
Int_t Multiplicity() const
virtual Bool_t Prepare(Int_t detElemId, TObjArray *pads[2], const AliMpArea &area)
void SetPosition(const TVector2 &pos, const TVector2 &errorOnPos)
Set (x,y) of that cluster and errors.
static Float_t PitchSt1()
Return wire pitch for Station 1 & 2.
static Float_t SqrtKy3()
Return SqrtKy3 for Slat.
static Float_t SqrtKx3St1()
Return SqrtKx3 for Station 1 & 2.
virtual Bool_t Prepare(Int_t detElemId, TObjArray *pads[2], const AliMpArea &area)
void SetPitch(Float_t p1)
AliMUONMathieson * fMathieson
! Mathieson to compute the charge repartition
TVector2 Position() const
Return (x,y) of that cluster.
void SetChi2(Float_t chi2)
Set chi2 of the RawCharge fit.
TVector2 Position() const
Return positions in x and y (cm)
virtual AliMUONCluster * NextCluster()=0
Double_t fLowestClusterCharge
! minimum cluster charge we allow
virtual ~AliMUONClusterFinderSimpleFit()
Double_t Charge() const
Return pad charge.
virtual AliMUONCluster * NextCluster()
Int_t Status() const
Return status word.
AliMUONPad * Pad(Int_t index) const
void SetSqrtKy3AndDeriveKy2Ky4(Float_t SqrtKy3)
Mathieson sqrt{Ky3} and derived Ky2 and Ky4.
Combination of digit and mppad informations.