ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

#include "AliMUONClusterFinderSimpleFit.h"

#include "AliLog.h"
#include "AliMpDEManager.h"
#include "AliMUONCluster.h"
#include "AliMUONConstants.h"
#include "AliMUONVDigit.h"
#include "AliMUONMathieson.h"
#include "AliMUONPad.h"
#include "AliMpArea.h"
#include "TObjArray.h"
#include "TVector2.h"
#include "TVirtualFitter.h"
#include "TF1.h"
#include "AliMUONVDigitStore.h"
#include <Riostream.h>

//-----------------------------------------------------------------------------
/// \class AliMUONClusterFinderSimpleFit
///
/// Basic cluster finder 
/// 
/// We simply use AliMUONPreClusterFinder to get basic cluster,
/// and then we try to fit the charge repartition using a Mathieson
/// distribution, varying the position.
///
/// FIXME: this one is still at the developping stage...
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

/// \cond CLASSIMP
ClassImp(AliMUONClusterFinderSimpleFit)
/// \endcond

namespace
{
  //___________________________________________________________________________
  void 
  FitFunction(Int_t& /*notused*/, Double_t* /*notused*/, 
              Double_t& f, Double_t* par, 
              Int_t /*notused*/)
  {
    /// Chi2 Function to minimize: Mathieson charge distribution in 2 dimensions
    
    TObjArray* userObjects = static_cast<TObjArray*>(TVirtualFitter::GetFitter()->GetObjectFit());
    
    AliMUONCluster* cluster = static_cast<AliMUONCluster*>(userObjects->At(0));
    AliMUONMathieson* mathieson = static_cast<AliMUONMathieson*>(userObjects->At(1));
    
    f = 0.0;
    Float_t qTot = cluster->Charge();
//    Float_t chargeCorrel[] = { cluster->Charge(0)/qTot, cluster->Charge(1)/qTot };
//    Float_t qRatio[] = { 1.0/par[2], par[2] };
    
    for ( Int_t i = 0 ; i < cluster->Multiplicity(); ++i )
    {
      AliMUONPad* pad = cluster->Pad(i);
      // skip pads w/ saturation or other problem(s)
      if ( pad->Status() ) continue; 
      TVector2 lowerLeft = TVector2(par[0],par[1]) - pad->Position() - pad->Dimensions();
      TVector2 upperRight(lowerLeft + pad->Dimensions()*2.0);
      Float_t estimatedCharge = mathieson->IntXY(lowerLeft.X(),lowerLeft.Y(),
                                                 upperRight.X(),upperRight.Y());
//      estimatedCharge *= 2/(1+qRatio[pad->Cathode()]);
      Float_t actualCharge = pad->Charge()/qTot;
      
      Float_t delta = (estimatedCharge - actualCharge);
      
      f += delta*delta;    
    }  
  }
}

//_____________________________________________________________________________
AliMUONClusterFinderSimpleFit::AliMUONClusterFinderSimpleFit(AliMUONVClusterFinder* clusterFinder)
: AliMUONVClusterFinder(),
fClusterFinder(clusterFinder),
fMathieson(0x0),
fLowestClusterCharge(0)
{
  /// ctor
}

//_____________________________________________________________________________
AliMUONClusterFinderSimpleFit::~AliMUONClusterFinderSimpleFit()
{
  /// dtor
  delete fClusterFinder;
  delete fMathieson;
}

//_____________________________________________________________________________
Bool_t 
AliMUONClusterFinderSimpleFit::Prepare(Int_t detElemId,
                                       TObjArray* pads[2],
                                       const AliMpArea& area)
{
  /// Prepare for clustering

  // FIXME: should we get the Mathieson from elsewhere ?
  
  // Find out the DetElemId
  AliMq::Station12Type stationType = AliMpDEManager::GetStation12Type(detElemId);
  
  Float_t kx3 = AliMUONConstants::SqrtKx3();
  Float_t ky3 = AliMUONConstants::SqrtKy3();
  Float_t pitch = AliMUONConstants::Pitch();
  
  if ( stationType == AliMq::kStation1 )
  {
    kx3 = AliMUONConstants::SqrtKx3St1();
    ky3 = AliMUONConstants::SqrtKy3St1();
    pitch = AliMUONConstants::PitchSt1();
  }
  
  delete fMathieson;
  fMathieson = new AliMUONMathieson;
  
  fMathieson->SetPitch(pitch);
  fMathieson->SetSqrtKx3AndDeriveKx2Kx4(kx3);
  fMathieson->SetSqrtKy3AndDeriveKy2Ky4(ky3);

  return fClusterFinder->Prepare(detElemId,pads,area);
}

//_____________________________________________________________________________
AliMUONCluster* 
AliMUONClusterFinderSimpleFit::NextCluster()
{
  /// Returns next cluster
  
  if ( !fClusterFinder ) return 0x0;
  AliMUONCluster* cluster = fClusterFinder->NextCluster();
  if ( cluster )
  {
    ComputePosition(*cluster);

    if ( cluster->Charge() < fLowestClusterCharge )
    {
      // skip that one
      return NextCluster();
    }    
  }
  return cluster;
}

//_____________________________________________________________________________
void 
AliMUONClusterFinderSimpleFit::ComputePosition(AliMUONCluster& cluster)
{
  /// Compute the position of the given cluster, by fitting a Mathieson
  /// charge distribution to it
  
  TVirtualFitter* fitter = TVirtualFitter::Fitter(0,2);
  fitter->SetFCN(FitFunction);

  if ( cluster.Multiplicity() < 3 ) return;
  
  // We try a Mathieson fit, starting
  // with the center-of-gravity estimate as a first guess
  // for the cluster center.
  
  Double_t xCOG = cluster.Position().X();
  Double_t yCOG = cluster.Position().Y();
  
  Float_t stepX = 0.01; // cm
  Float_t stepY = 0.01; // cm
  
  Double_t arg(-1); // disable printout
  
  fitter->ExecuteCommand("SET PRINT",&arg,1);
  
  fitter->SetParameter(0,"cluster X position",xCOG,stepX,0,0);
  fitter->SetParameter(1,"cluster Y position",yCOG,stepY,0,0);
  
  TObjArray userObjects;
  
  userObjects.Add(&cluster);
  userObjects.Add(fMathieson);
  
  fitter->SetObjectFit(&userObjects);
  
  Int_t val = fitter->ExecuteCommand("MIGRAD",0,0);
  AliDebug(1,Form("ExecuteCommand returned value=%d",val));
  if ( val ) 
  {
    // fit failed. Using COG results, with big errors
    AliWarning("Fit failed. Using COG results for cluster=");
    StdoutToAliWarning(cluster.Print());
    cluster.SetPosition(TVector2(xCOG,yCOG),TVector2(TMath::Abs(xCOG),TMath::Abs(yCOG)));
    cluster.SetChi2(1E3);
  }
  
  Double_t results[] = { fitter->GetParameter(0),
    fitter->GetParameter(1) };
  
  Double_t errors[] = { fitter->GetParError(0),
    fitter->GetParError(1) };
  
  cluster.SetPosition(TVector2(results[0],results[1]),
                      TVector2(errors[0],errors[1]));
  
  Double_t amin, edm, errdef;
  Int_t nvpar, nparx;
  
  fitter->GetStats(amin, edm, errdef, nvpar, nparx);

  Double_t chi2 = amin;
  
  AliDebug(1,Form("Cluster fitted to (x,y)=(%e,%e) (xerr,yerr)=(%e,%e) \n chi2=%e ndf=%d",
                  results[0],results[1],
                  errors[0],errors[1],chi2,fitter->GetNumberFreeParameters()));
  cluster.SetChi2(chi2);
}



 AliMUONClusterFinderSimpleFit.cxx:1
 AliMUONClusterFinderSimpleFit.cxx:2
 AliMUONClusterFinderSimpleFit.cxx:3
 AliMUONClusterFinderSimpleFit.cxx:4
 AliMUONClusterFinderSimpleFit.cxx:5
 AliMUONClusterFinderSimpleFit.cxx:6
 AliMUONClusterFinderSimpleFit.cxx:7
 AliMUONClusterFinderSimpleFit.cxx:8
 AliMUONClusterFinderSimpleFit.cxx:9
 AliMUONClusterFinderSimpleFit.cxx:10
 AliMUONClusterFinderSimpleFit.cxx:11
 AliMUONClusterFinderSimpleFit.cxx:12
 AliMUONClusterFinderSimpleFit.cxx:13
 AliMUONClusterFinderSimpleFit.cxx:14
 AliMUONClusterFinderSimpleFit.cxx:15
 AliMUONClusterFinderSimpleFit.cxx:16
 AliMUONClusterFinderSimpleFit.cxx:17
 AliMUONClusterFinderSimpleFit.cxx:18
 AliMUONClusterFinderSimpleFit.cxx:19
 AliMUONClusterFinderSimpleFit.cxx:20
 AliMUONClusterFinderSimpleFit.cxx:21
 AliMUONClusterFinderSimpleFit.cxx:22
 AliMUONClusterFinderSimpleFit.cxx:23
 AliMUONClusterFinderSimpleFit.cxx:24
 AliMUONClusterFinderSimpleFit.cxx:25
 AliMUONClusterFinderSimpleFit.cxx:26
 AliMUONClusterFinderSimpleFit.cxx:27
 AliMUONClusterFinderSimpleFit.cxx:28
 AliMUONClusterFinderSimpleFit.cxx:29
 AliMUONClusterFinderSimpleFit.cxx:30
 AliMUONClusterFinderSimpleFit.cxx:31
 AliMUONClusterFinderSimpleFit.cxx:32
 AliMUONClusterFinderSimpleFit.cxx:33
 AliMUONClusterFinderSimpleFit.cxx:34
 AliMUONClusterFinderSimpleFit.cxx:35
 AliMUONClusterFinderSimpleFit.cxx:36
 AliMUONClusterFinderSimpleFit.cxx:37
 AliMUONClusterFinderSimpleFit.cxx:38
 AliMUONClusterFinderSimpleFit.cxx:39
 AliMUONClusterFinderSimpleFit.cxx:40
 AliMUONClusterFinderSimpleFit.cxx:41
 AliMUONClusterFinderSimpleFit.cxx:42
 AliMUONClusterFinderSimpleFit.cxx:43
 AliMUONClusterFinderSimpleFit.cxx:44
 AliMUONClusterFinderSimpleFit.cxx:45
 AliMUONClusterFinderSimpleFit.cxx:46
 AliMUONClusterFinderSimpleFit.cxx:47
 AliMUONClusterFinderSimpleFit.cxx:48
 AliMUONClusterFinderSimpleFit.cxx:49
 AliMUONClusterFinderSimpleFit.cxx:50
 AliMUONClusterFinderSimpleFit.cxx:51
 AliMUONClusterFinderSimpleFit.cxx:52
 AliMUONClusterFinderSimpleFit.cxx:53
 AliMUONClusterFinderSimpleFit.cxx:54
 AliMUONClusterFinderSimpleFit.cxx:55
 AliMUONClusterFinderSimpleFit.cxx:56
 AliMUONClusterFinderSimpleFit.cxx:57
 AliMUONClusterFinderSimpleFit.cxx:58
 AliMUONClusterFinderSimpleFit.cxx:59
 AliMUONClusterFinderSimpleFit.cxx:60
 AliMUONClusterFinderSimpleFit.cxx:61
 AliMUONClusterFinderSimpleFit.cxx:62
 AliMUONClusterFinderSimpleFit.cxx:63
 AliMUONClusterFinderSimpleFit.cxx:64
 AliMUONClusterFinderSimpleFit.cxx:65
 AliMUONClusterFinderSimpleFit.cxx:66
 AliMUONClusterFinderSimpleFit.cxx:67
 AliMUONClusterFinderSimpleFit.cxx:68
 AliMUONClusterFinderSimpleFit.cxx:69
 AliMUONClusterFinderSimpleFit.cxx:70
 AliMUONClusterFinderSimpleFit.cxx:71
 AliMUONClusterFinderSimpleFit.cxx:72
 AliMUONClusterFinderSimpleFit.cxx:73
 AliMUONClusterFinderSimpleFit.cxx:74
 AliMUONClusterFinderSimpleFit.cxx:75
 AliMUONClusterFinderSimpleFit.cxx:76
 AliMUONClusterFinderSimpleFit.cxx:77
 AliMUONClusterFinderSimpleFit.cxx:78
 AliMUONClusterFinderSimpleFit.cxx:79
 AliMUONClusterFinderSimpleFit.cxx:80
 AliMUONClusterFinderSimpleFit.cxx:81
 AliMUONClusterFinderSimpleFit.cxx:82
 AliMUONClusterFinderSimpleFit.cxx:83
 AliMUONClusterFinderSimpleFit.cxx:84
 AliMUONClusterFinderSimpleFit.cxx:85
 AliMUONClusterFinderSimpleFit.cxx:86
 AliMUONClusterFinderSimpleFit.cxx:87
 AliMUONClusterFinderSimpleFit.cxx:88
 AliMUONClusterFinderSimpleFit.cxx:89
 AliMUONClusterFinderSimpleFit.cxx:90
 AliMUONClusterFinderSimpleFit.cxx:91
 AliMUONClusterFinderSimpleFit.cxx:92
 AliMUONClusterFinderSimpleFit.cxx:93
 AliMUONClusterFinderSimpleFit.cxx:94
 AliMUONClusterFinderSimpleFit.cxx:95
 AliMUONClusterFinderSimpleFit.cxx:96
 AliMUONClusterFinderSimpleFit.cxx:97
 AliMUONClusterFinderSimpleFit.cxx:98
 AliMUONClusterFinderSimpleFit.cxx:99
 AliMUONClusterFinderSimpleFit.cxx:100
 AliMUONClusterFinderSimpleFit.cxx:101
 AliMUONClusterFinderSimpleFit.cxx:102
 AliMUONClusterFinderSimpleFit.cxx:103
 AliMUONClusterFinderSimpleFit.cxx:104
 AliMUONClusterFinderSimpleFit.cxx:105
 AliMUONClusterFinderSimpleFit.cxx:106
 AliMUONClusterFinderSimpleFit.cxx:107
 AliMUONClusterFinderSimpleFit.cxx:108
 AliMUONClusterFinderSimpleFit.cxx:109
 AliMUONClusterFinderSimpleFit.cxx:110
 AliMUONClusterFinderSimpleFit.cxx:111
 AliMUONClusterFinderSimpleFit.cxx:112
 AliMUONClusterFinderSimpleFit.cxx:113
 AliMUONClusterFinderSimpleFit.cxx:114
 AliMUONClusterFinderSimpleFit.cxx:115
 AliMUONClusterFinderSimpleFit.cxx:116
 AliMUONClusterFinderSimpleFit.cxx:117
 AliMUONClusterFinderSimpleFit.cxx:118
 AliMUONClusterFinderSimpleFit.cxx:119
 AliMUONClusterFinderSimpleFit.cxx:120
 AliMUONClusterFinderSimpleFit.cxx:121
 AliMUONClusterFinderSimpleFit.cxx:122
 AliMUONClusterFinderSimpleFit.cxx:123
 AliMUONClusterFinderSimpleFit.cxx:124
 AliMUONClusterFinderSimpleFit.cxx:125
 AliMUONClusterFinderSimpleFit.cxx:126
 AliMUONClusterFinderSimpleFit.cxx:127
 AliMUONClusterFinderSimpleFit.cxx:128
 AliMUONClusterFinderSimpleFit.cxx:129
 AliMUONClusterFinderSimpleFit.cxx:130
 AliMUONClusterFinderSimpleFit.cxx:131
 AliMUONClusterFinderSimpleFit.cxx:132
 AliMUONClusterFinderSimpleFit.cxx:133
 AliMUONClusterFinderSimpleFit.cxx:134
 AliMUONClusterFinderSimpleFit.cxx:135
 AliMUONClusterFinderSimpleFit.cxx:136
 AliMUONClusterFinderSimpleFit.cxx:137
 AliMUONClusterFinderSimpleFit.cxx:138
 AliMUONClusterFinderSimpleFit.cxx:139
 AliMUONClusterFinderSimpleFit.cxx:140
 AliMUONClusterFinderSimpleFit.cxx:141
 AliMUONClusterFinderSimpleFit.cxx:142
 AliMUONClusterFinderSimpleFit.cxx:143
 AliMUONClusterFinderSimpleFit.cxx:144
 AliMUONClusterFinderSimpleFit.cxx:145
 AliMUONClusterFinderSimpleFit.cxx:146
 AliMUONClusterFinderSimpleFit.cxx:147
 AliMUONClusterFinderSimpleFit.cxx:148
 AliMUONClusterFinderSimpleFit.cxx:149
 AliMUONClusterFinderSimpleFit.cxx:150
 AliMUONClusterFinderSimpleFit.cxx:151
 AliMUONClusterFinderSimpleFit.cxx:152
 AliMUONClusterFinderSimpleFit.cxx:153
 AliMUONClusterFinderSimpleFit.cxx:154
 AliMUONClusterFinderSimpleFit.cxx:155
 AliMUONClusterFinderSimpleFit.cxx:156
 AliMUONClusterFinderSimpleFit.cxx:157
 AliMUONClusterFinderSimpleFit.cxx:158
 AliMUONClusterFinderSimpleFit.cxx:159
 AliMUONClusterFinderSimpleFit.cxx:160
 AliMUONClusterFinderSimpleFit.cxx:161
 AliMUONClusterFinderSimpleFit.cxx:162
 AliMUONClusterFinderSimpleFit.cxx:163
 AliMUONClusterFinderSimpleFit.cxx:164
 AliMUONClusterFinderSimpleFit.cxx:165
 AliMUONClusterFinderSimpleFit.cxx:166
 AliMUONClusterFinderSimpleFit.cxx:167
 AliMUONClusterFinderSimpleFit.cxx:168
 AliMUONClusterFinderSimpleFit.cxx:169
 AliMUONClusterFinderSimpleFit.cxx:170
 AliMUONClusterFinderSimpleFit.cxx:171
 AliMUONClusterFinderSimpleFit.cxx:172
 AliMUONClusterFinderSimpleFit.cxx:173
 AliMUONClusterFinderSimpleFit.cxx:174
 AliMUONClusterFinderSimpleFit.cxx:175
 AliMUONClusterFinderSimpleFit.cxx:176
 AliMUONClusterFinderSimpleFit.cxx:177
 AliMUONClusterFinderSimpleFit.cxx:178
 AliMUONClusterFinderSimpleFit.cxx:179
 AliMUONClusterFinderSimpleFit.cxx:180
 AliMUONClusterFinderSimpleFit.cxx:181
 AliMUONClusterFinderSimpleFit.cxx:182
 AliMUONClusterFinderSimpleFit.cxx:183
 AliMUONClusterFinderSimpleFit.cxx:184
 AliMUONClusterFinderSimpleFit.cxx:185
 AliMUONClusterFinderSimpleFit.cxx:186
 AliMUONClusterFinderSimpleFit.cxx:187
 AliMUONClusterFinderSimpleFit.cxx:188
 AliMUONClusterFinderSimpleFit.cxx:189
 AliMUONClusterFinderSimpleFit.cxx:190
 AliMUONClusterFinderSimpleFit.cxx:191
 AliMUONClusterFinderSimpleFit.cxx:192
 AliMUONClusterFinderSimpleFit.cxx:193
 AliMUONClusterFinderSimpleFit.cxx:194
 AliMUONClusterFinderSimpleFit.cxx:195
 AliMUONClusterFinderSimpleFit.cxx:196
 AliMUONClusterFinderSimpleFit.cxx:197
 AliMUONClusterFinderSimpleFit.cxx:198
 AliMUONClusterFinderSimpleFit.cxx:199
 AliMUONClusterFinderSimpleFit.cxx:200
 AliMUONClusterFinderSimpleFit.cxx:201
 AliMUONClusterFinderSimpleFit.cxx:202
 AliMUONClusterFinderSimpleFit.cxx:203
 AliMUONClusterFinderSimpleFit.cxx:204
 AliMUONClusterFinderSimpleFit.cxx:205
 AliMUONClusterFinderSimpleFit.cxx:206
 AliMUONClusterFinderSimpleFit.cxx:207
 AliMUONClusterFinderSimpleFit.cxx:208
 AliMUONClusterFinderSimpleFit.cxx:209
 AliMUONClusterFinderSimpleFit.cxx:210
 AliMUONClusterFinderSimpleFit.cxx:211
 AliMUONClusterFinderSimpleFit.cxx:212
 AliMUONClusterFinderSimpleFit.cxx:213
 AliMUONClusterFinderSimpleFit.cxx:214
 AliMUONClusterFinderSimpleFit.cxx:215
 AliMUONClusterFinderSimpleFit.cxx:216
 AliMUONClusterFinderSimpleFit.cxx:217
 AliMUONClusterFinderSimpleFit.cxx:218
 AliMUONClusterFinderSimpleFit.cxx:219
 AliMUONClusterFinderSimpleFit.cxx:220
 AliMUONClusterFinderSimpleFit.cxx:221
 AliMUONClusterFinderSimpleFit.cxx:222
 AliMUONClusterFinderSimpleFit.cxx:223
 AliMUONClusterFinderSimpleFit.cxx:224
 AliMUONClusterFinderSimpleFit.cxx:225
 AliMUONClusterFinderSimpleFit.cxx:226
 AliMUONClusterFinderSimpleFit.cxx:227
 AliMUONClusterFinderSimpleFit.cxx:228
 AliMUONClusterFinderSimpleFit.cxx:229
 AliMUONClusterFinderSimpleFit.cxx:230
 AliMUONClusterFinderSimpleFit.cxx:231
 AliMUONClusterFinderSimpleFit.cxx:232
 AliMUONClusterFinderSimpleFit.cxx:233
 AliMUONClusterFinderSimpleFit.cxx:234
 AliMUONClusterFinderSimpleFit.cxx:235