ROOT logo
/**************************************************************************
 * This file is property of and copyright by                              *
 * the Relativistic Heavy Ion Group (RHIG), Yale University, US, 2009     *
 *                                                                        *
 * Primary Author: Per Thomas Hille <p.t.hille@fys.uio.no>                *
 *                                                                        *
 * Contributors are mentioned in the code where appropriate.              *
 * Please report bugs to p.t.hille@fys.uio.no                             *
 *                                                                        *
 * 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.                  *
 **************************************************************************/

//
// Extraction of amplitude and peak position
// FRom CALO raw data using
// least square fit for the
// Moment assuming identical and 
// independent errors (equivalent with chi square)
// 

#include "AliCaloRawAnalyzerKStandard.h"
#include "AliCaloBunchInfo.h"
#include "AliCaloFitResults.h"
#include "AliLog.h"
#include "TMath.h"
#include <stdexcept>
#include <iostream>
#include "TF1.h"
#include "TGraph.h"
#include "TRandom.h"

#include "AliEMCALRawResponse.h"


using namespace std;

ClassImp( AliCaloRawAnalyzerKStandard )


AliCaloRawAnalyzerKStandard::AliCaloRawAnalyzerKStandard() : AliCaloRawAnalyzerFitter("Chi Square ( kStandard )", "KStandard")
{
  
  fAlgo = Algo::kStandard;
}


AliCaloRawAnalyzerKStandard::~AliCaloRawAnalyzerKStandard()
{
  //  delete fTf1;
}


AliCaloFitResults
AliCaloRawAnalyzerKStandard::Evaluate( const vector<AliCaloBunchInfo>  &bunchlist, UInt_t altrocfg1, UInt_t altrocfg2 )
{
  //Evaluation Amplitude and TOF
  Float_t pedEstimate  = 0;
  short maxADC = 0;
  Int_t first = 0;
  Int_t last = 0;
  Int_t bunchIndex = 0;
  Float_t ampEstimate = 0;
  short timeEstimate  = 0;
  Float_t time = 0;
  Float_t amp=0;
  Float_t chi2 = 0;
  Int_t ndf = 0;
  Bool_t fitDone = kFALSE;
  int nsamples = PreFitEvaluateSamples( bunchlist, altrocfg1, altrocfg2, bunchIndex, ampEstimate, 
					maxADC, timeEstimate, pedEstimate, first, last,   (int)fAmpCut ); 
  
  
  if (ampEstimate >= fAmpCut  ) 
    { 
      time = timeEstimate; 
      Int_t timebinOffset = bunchlist.at(bunchIndex).GetStartBin() - (bunchlist.at(bunchIndex).GetLength()-1); 
      amp = ampEstimate; 
      
      if ( nsamples > 1 && maxADC< OVERFLOWCUT ) 
	{ 
	  FitRaw(first, last, amp, time, chi2, fitDone);
	  time += timebinOffset;
	  timeEstimate += timebinOffset;
	  ndf = nsamples - 2;
	}
    } 
  if ( fitDone ) 
    { 
      Float_t ampAsymm = (amp - ampEstimate)/(amp + ampEstimate);
      Float_t timeDiff = time - timeEstimate;
      
      if ( (TMath::Abs(ampAsymm) > 0.1) || (TMath::Abs(timeDiff) > 2) ) 
	{
	  amp     = ampEstimate;
	  time    = timeEstimate; 
	  fitDone = kFALSE;
	} 
    }  
  if (amp >= fAmpCut ) 
    { 
      if ( ! fitDone) 
	{ 
	  amp += (0.5 - gRandom->Rndm()); 
	}
      time = time * TIMEBINWITH; 
      time -= fL1Phase;

      return AliCaloFitResults( -99, -99, fAlgo , amp, time,
				(int)time, chi2, ndf, Ret::kDummy );
     }
  return AliCaloFitResults( Ret::kInvalid, Ret::kInvalid );
}

	
void
 AliCaloRawAnalyzerKStandard::FitRaw( Int_t firstTimeBin, Int_t lastTimeBin,
                                      Float_t & amp, Float_t & time, Float_t & chi2, Bool_t & fitDone) const
{ 
  // Fits the raw signal time distribution
  int nsamples = lastTimeBin - firstTimeBin + 1;
  fitDone = kFALSE;
  if (nsamples < 3) { return; } 
  
  TGraph *gSig =  new TGraph( nsamples); 
 
  for (int i=0; i<nsamples; i++) 
    {
      Int_t timebin = firstTimeBin + i;    
      gSig->SetPoint(i, timebin, GetReversed(timebin)); 
    }
  
  TF1 * signalF = new TF1("signal", AliEMCALRawResponse::RawResponseFunction, 0, TIMEBINS , 5);
  
  signalF->SetParameters(10.,5., TAU  ,ORDER,0.); //set all defaults once, just to be safe
  signalF->SetParNames("amp","t0","tau","N","ped");
  signalF->FixParameter(2,TAU); 
  signalF->FixParameter(3,ORDER); 
  signalF->FixParameter(4, 0); 
  signalF->SetParameter(1, time);
  signalF->SetParameter(0, amp);
  signalF->SetParLimits(0, 0.5*amp, 2*amp );
  signalF->SetParLimits(1, time - 4, time + 4); 
      
  try {			
    gSig->Fit(signalF, "QROW"); // Note option 'W': equal errors on all points
    amp  = signalF->GetParameter(0); 
    time = signalF->GetParameter(1);
    chi2 = signalF->GetChisquare();
    fitDone = kTRUE;
  }
  catch (const std::exception & e) 
    {
      AliError( Form("TGraph Fit exception %s", e.what()) ); 
      // stay with default amp and time in case of exception, i.e. no special action required
      fitDone = kFALSE;
  }

  delete signalF;
  delete gSig; // delete TGraph
  return;
}


 AliCaloRawAnalyzerKStandard.cxx:1
 AliCaloRawAnalyzerKStandard.cxx:2
 AliCaloRawAnalyzerKStandard.cxx:3
 AliCaloRawAnalyzerKStandard.cxx:4
 AliCaloRawAnalyzerKStandard.cxx:5
 AliCaloRawAnalyzerKStandard.cxx:6
 AliCaloRawAnalyzerKStandard.cxx:7
 AliCaloRawAnalyzerKStandard.cxx:8
 AliCaloRawAnalyzerKStandard.cxx:9
 AliCaloRawAnalyzerKStandard.cxx:10
 AliCaloRawAnalyzerKStandard.cxx:11
 AliCaloRawAnalyzerKStandard.cxx:12
 AliCaloRawAnalyzerKStandard.cxx:13
 AliCaloRawAnalyzerKStandard.cxx:14
 AliCaloRawAnalyzerKStandard.cxx:15
 AliCaloRawAnalyzerKStandard.cxx:16
 AliCaloRawAnalyzerKStandard.cxx:17
 AliCaloRawAnalyzerKStandard.cxx:18
 AliCaloRawAnalyzerKStandard.cxx:19
 AliCaloRawAnalyzerKStandard.cxx:20
 AliCaloRawAnalyzerKStandard.cxx:21
 AliCaloRawAnalyzerKStandard.cxx:22
 AliCaloRawAnalyzerKStandard.cxx:23
 AliCaloRawAnalyzerKStandard.cxx:24
 AliCaloRawAnalyzerKStandard.cxx:25
 AliCaloRawAnalyzerKStandard.cxx:26
 AliCaloRawAnalyzerKStandard.cxx:27
 AliCaloRawAnalyzerKStandard.cxx:28
 AliCaloRawAnalyzerKStandard.cxx:29
 AliCaloRawAnalyzerKStandard.cxx:30
 AliCaloRawAnalyzerKStandard.cxx:31
 AliCaloRawAnalyzerKStandard.cxx:32
 AliCaloRawAnalyzerKStandard.cxx:33
 AliCaloRawAnalyzerKStandard.cxx:34
 AliCaloRawAnalyzerKStandard.cxx:35
 AliCaloRawAnalyzerKStandard.cxx:36
 AliCaloRawAnalyzerKStandard.cxx:37
 AliCaloRawAnalyzerKStandard.cxx:38
 AliCaloRawAnalyzerKStandard.cxx:39
 AliCaloRawAnalyzerKStandard.cxx:40
 AliCaloRawAnalyzerKStandard.cxx:41
 AliCaloRawAnalyzerKStandard.cxx:42
 AliCaloRawAnalyzerKStandard.cxx:43
 AliCaloRawAnalyzerKStandard.cxx:44
 AliCaloRawAnalyzerKStandard.cxx:45
 AliCaloRawAnalyzerKStandard.cxx:46
 AliCaloRawAnalyzerKStandard.cxx:47
 AliCaloRawAnalyzerKStandard.cxx:48
 AliCaloRawAnalyzerKStandard.cxx:49
 AliCaloRawAnalyzerKStandard.cxx:50
 AliCaloRawAnalyzerKStandard.cxx:51
 AliCaloRawAnalyzerKStandard.cxx:52
 AliCaloRawAnalyzerKStandard.cxx:53
 AliCaloRawAnalyzerKStandard.cxx:54
 AliCaloRawAnalyzerKStandard.cxx:55
 AliCaloRawAnalyzerKStandard.cxx:56
 AliCaloRawAnalyzerKStandard.cxx:57
 AliCaloRawAnalyzerKStandard.cxx:58
 AliCaloRawAnalyzerKStandard.cxx:59
 AliCaloRawAnalyzerKStandard.cxx:60
 AliCaloRawAnalyzerKStandard.cxx:61
 AliCaloRawAnalyzerKStandard.cxx:62
 AliCaloRawAnalyzerKStandard.cxx:63
 AliCaloRawAnalyzerKStandard.cxx:64
 AliCaloRawAnalyzerKStandard.cxx:65
 AliCaloRawAnalyzerKStandard.cxx:66
 AliCaloRawAnalyzerKStandard.cxx:67
 AliCaloRawAnalyzerKStandard.cxx:68
 AliCaloRawAnalyzerKStandard.cxx:69
 AliCaloRawAnalyzerKStandard.cxx:70
 AliCaloRawAnalyzerKStandard.cxx:71
 AliCaloRawAnalyzerKStandard.cxx:72
 AliCaloRawAnalyzerKStandard.cxx:73
 AliCaloRawAnalyzerKStandard.cxx:74
 AliCaloRawAnalyzerKStandard.cxx:75
 AliCaloRawAnalyzerKStandard.cxx:76
 AliCaloRawAnalyzerKStandard.cxx:77
 AliCaloRawAnalyzerKStandard.cxx:78
 AliCaloRawAnalyzerKStandard.cxx:79
 AliCaloRawAnalyzerKStandard.cxx:80
 AliCaloRawAnalyzerKStandard.cxx:81
 AliCaloRawAnalyzerKStandard.cxx:82
 AliCaloRawAnalyzerKStandard.cxx:83
 AliCaloRawAnalyzerKStandard.cxx:84
 AliCaloRawAnalyzerKStandard.cxx:85
 AliCaloRawAnalyzerKStandard.cxx:86
 AliCaloRawAnalyzerKStandard.cxx:87
 AliCaloRawAnalyzerKStandard.cxx:88
 AliCaloRawAnalyzerKStandard.cxx:89
 AliCaloRawAnalyzerKStandard.cxx:90
 AliCaloRawAnalyzerKStandard.cxx:91
 AliCaloRawAnalyzerKStandard.cxx:92
 AliCaloRawAnalyzerKStandard.cxx:93
 AliCaloRawAnalyzerKStandard.cxx:94
 AliCaloRawAnalyzerKStandard.cxx:95
 AliCaloRawAnalyzerKStandard.cxx:96
 AliCaloRawAnalyzerKStandard.cxx:97
 AliCaloRawAnalyzerKStandard.cxx:98
 AliCaloRawAnalyzerKStandard.cxx:99
 AliCaloRawAnalyzerKStandard.cxx:100
 AliCaloRawAnalyzerKStandard.cxx:101
 AliCaloRawAnalyzerKStandard.cxx:102
 AliCaloRawAnalyzerKStandard.cxx:103
 AliCaloRawAnalyzerKStandard.cxx:104
 AliCaloRawAnalyzerKStandard.cxx:105
 AliCaloRawAnalyzerKStandard.cxx:106
 AliCaloRawAnalyzerKStandard.cxx:107
 AliCaloRawAnalyzerKStandard.cxx:108
 AliCaloRawAnalyzerKStandard.cxx:109
 AliCaloRawAnalyzerKStandard.cxx:110
 AliCaloRawAnalyzerKStandard.cxx:111
 AliCaloRawAnalyzerKStandard.cxx:112
 AliCaloRawAnalyzerKStandard.cxx:113
 AliCaloRawAnalyzerKStandard.cxx:114
 AliCaloRawAnalyzerKStandard.cxx:115
 AliCaloRawAnalyzerKStandard.cxx:116
 AliCaloRawAnalyzerKStandard.cxx:117
 AliCaloRawAnalyzerKStandard.cxx:118
 AliCaloRawAnalyzerKStandard.cxx:119
 AliCaloRawAnalyzerKStandard.cxx:120
 AliCaloRawAnalyzerKStandard.cxx:121
 AliCaloRawAnalyzerKStandard.cxx:122
 AliCaloRawAnalyzerKStandard.cxx:123
 AliCaloRawAnalyzerKStandard.cxx:124
 AliCaloRawAnalyzerKStandard.cxx:125
 AliCaloRawAnalyzerKStandard.cxx:126
 AliCaloRawAnalyzerKStandard.cxx:127
 AliCaloRawAnalyzerKStandard.cxx:128
 AliCaloRawAnalyzerKStandard.cxx:129
 AliCaloRawAnalyzerKStandard.cxx:130
 AliCaloRawAnalyzerKStandard.cxx:131
 AliCaloRawAnalyzerKStandard.cxx:132
 AliCaloRawAnalyzerKStandard.cxx:133
 AliCaloRawAnalyzerKStandard.cxx:134
 AliCaloRawAnalyzerKStandard.cxx:135
 AliCaloRawAnalyzerKStandard.cxx:136
 AliCaloRawAnalyzerKStandard.cxx:137
 AliCaloRawAnalyzerKStandard.cxx:138
 AliCaloRawAnalyzerKStandard.cxx:139
 AliCaloRawAnalyzerKStandard.cxx:140
 AliCaloRawAnalyzerKStandard.cxx:141
 AliCaloRawAnalyzerKStandard.cxx:142
 AliCaloRawAnalyzerKStandard.cxx:143
 AliCaloRawAnalyzerKStandard.cxx:144
 AliCaloRawAnalyzerKStandard.cxx:145
 AliCaloRawAnalyzerKStandard.cxx:146
 AliCaloRawAnalyzerKStandard.cxx:147
 AliCaloRawAnalyzerKStandard.cxx:148
 AliCaloRawAnalyzerKStandard.cxx:149
 AliCaloRawAnalyzerKStandard.cxx:150
 AliCaloRawAnalyzerKStandard.cxx:151
 AliCaloRawAnalyzerKStandard.cxx:152
 AliCaloRawAnalyzerKStandard.cxx:153
 AliCaloRawAnalyzerKStandard.cxx:154
 AliCaloRawAnalyzerKStandard.cxx:155
 AliCaloRawAnalyzerKStandard.cxx:156
 AliCaloRawAnalyzerKStandard.cxx:157
 AliCaloRawAnalyzerKStandard.cxx:158
 AliCaloRawAnalyzerKStandard.cxx:159
 AliCaloRawAnalyzerKStandard.cxx:160
 AliCaloRawAnalyzerKStandard.cxx:161
 AliCaloRawAnalyzerKStandard.cxx:162
 AliCaloRawAnalyzerKStandard.cxx:163
 AliCaloRawAnalyzerKStandard.cxx:164
 AliCaloRawAnalyzerKStandard.cxx:165
 AliCaloRawAnalyzerKStandard.cxx:166
 AliCaloRawAnalyzerKStandard.cxx:167
 AliCaloRawAnalyzerKStandard.cxx:168
 AliCaloRawAnalyzerKStandard.cxx:169