ROOT logo
// -*- mode: c++ -*-
/**************************************************************************
 * This file is property of and copyright by the Experimental Nuclear     *
 * Physics Group, Dep. of Physics                                         *
 * University of Oslo, Norway, 2007                                       *
 *                                                                        *
 * Author: Per Thomas Hille <perthi@fys.uio.no> for the ALICE HLT Project.*
 * Contributors are mentioned in the code where appropriate.              *
 * Please report bugs to perthi@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 using special algorithm
// from Alexei Pavlinov
// ----------------
// ----------------

#include "AliCaloRawAnalyzerFastFit.h"
#include "AliCaloFastAltroFitv0.h"
#include "AliCaloFitResults.h"
#include "AliCaloBunchInfo.h"
#include "TMath.h"
#include <iostream>

using namespace std;
#include "AliCaloConstants.h"

ClassImp( AliCaloRawAnalyzerFastFit )


AliCaloRawAnalyzerFastFit::AliCaloRawAnalyzerFastFit() : AliCaloRawAnalyzerFitter("Fast Fit (Alexei)", "FF")
{
  // Constructor
  fAlgo= Algo::kFastFit;
}

AliCaloFitResults 
AliCaloRawAnalyzerFastFit::Evaluate( const vector<AliCaloBunchInfo> &bunchvector, 
                                     UInt_t altrocfg1, UInt_t altrocfg2 )
{
  // Execute algorithm
  
  short maxampindex; //index of maximum amplitude
  short maxamp; //Maximum amplitude
  int index = SelectBunch( bunchvector,  &maxampindex,  &maxamp );
  
  if( index >= 0)
  {
    Float_t ped = ReverseAndSubtractPed( &(bunchvector.at(index))  ,  altrocfg1, altrocfg2, fReversed  );
    Float_t maxf = TMath::MaxElement( bunchvector.at(index).GetLength(),  fReversed );
    short timebinOffset = maxampindex - (bunchvector.at(index).GetLength()-1);
    
    if(  maxf < fAmpCut  ||  ( maxamp - ped) > fOverflowCut  ) // (maxamp - ped) > fOverflowCut = Close to saturation (use low gain then)
    {
      return  AliCaloFitResults( maxamp, ped, Algo::kCrude, maxf, timebinOffset*TIMEBINWITH); //Time scale 19/08/2014 (Antônio)
    }
    else if ( maxf >= fAmpCut ) // no if statement needed really; keep for readability
    {
      int first = 0;
      int last = 0;
      int maxrev =  maxampindex -  bunchvector.at(index).GetStartBin();
      
      SelectSubarray( fReversed,  bunchvector.at(index).GetLength(), maxrev , &first, &last, fFitArrayCut);
      
      int nsamples =  last - first + 1;
      
      if( ( nsamples  )  >= fNsampleCut )
	    {
	      Double_t ordered[1008];
        
	      for(int i=0; i < nsamples ; i++ )
        {
          ordered[i] = fReversed[first + i];
        }
        
	      Double_t eSignal = 1; // nominal 1 ADC error
	      Double_t dAmp = maxf;
	      Double_t eAmp = 0;
	      Double_t dTime0 = 0;
	      Double_t eTime = 0;
	      Double_t chi2 = 0;
	      Double_t dTau = 2.35; // time-bin units
	      
	      AliCaloFastAltroFitv0::FastFit(fXaxis, ordered , nsamples,
                                       eSignal, dTau, dAmp, eAmp, dTime0, eTime, chi2);
	      Double_t dTimeMax = dTime0 + timebinOffset - (maxrev - first) // abs. t0
        + dTau; // +tau, makes sum tmax
        
	      return AliCaloFitResults(maxamp,ped,Ret::kFitPar,dAmp,dTimeMax*TIMEBINWITH,timebinOffset,chi2,Ret::kDummy,Ret::kDummy,AliCaloFitSubarray(index,maxrev,first,last)); //Time scale 19/08/2014 (Antônio)
	    } // samplecut
      else
	    {
        
	      Float_t chi2 = CalculateChi2(maxf, maxrev, first, last);
	      Int_t ndf = last - first - 1; // nsamples - 2
	      return AliCaloFitResults( maxamp, ped, Ret::kCrude, maxf, timebinOffset*TIMEBINWITH, timebinOffset, chi2, ndf, Ret::kDummy, AliCaloFitSubarray(index, maxrev, first, last) ); //Time scale 19/08/2014 (Antônio)
	    }
    } // ampcut
  } // bunch index
  
  return AliCaloFitResults( Ret::kInvalid , Ret::kInvalid );
}
 AliCaloRawAnalyzerFastFit.cxx:1
 AliCaloRawAnalyzerFastFit.cxx:2
 AliCaloRawAnalyzerFastFit.cxx:3
 AliCaloRawAnalyzerFastFit.cxx:4
 AliCaloRawAnalyzerFastFit.cxx:5
 AliCaloRawAnalyzerFastFit.cxx:6
 AliCaloRawAnalyzerFastFit.cxx:7
 AliCaloRawAnalyzerFastFit.cxx:8
 AliCaloRawAnalyzerFastFit.cxx:9
 AliCaloRawAnalyzerFastFit.cxx:10
 AliCaloRawAnalyzerFastFit.cxx:11
 AliCaloRawAnalyzerFastFit.cxx:12
 AliCaloRawAnalyzerFastFit.cxx:13
 AliCaloRawAnalyzerFastFit.cxx:14
 AliCaloRawAnalyzerFastFit.cxx:15
 AliCaloRawAnalyzerFastFit.cxx:16
 AliCaloRawAnalyzerFastFit.cxx:17
 AliCaloRawAnalyzerFastFit.cxx:18
 AliCaloRawAnalyzerFastFit.cxx:19
 AliCaloRawAnalyzerFastFit.cxx:20
 AliCaloRawAnalyzerFastFit.cxx:21
 AliCaloRawAnalyzerFastFit.cxx:22
 AliCaloRawAnalyzerFastFit.cxx:23
 AliCaloRawAnalyzerFastFit.cxx:24
 AliCaloRawAnalyzerFastFit.cxx:25
 AliCaloRawAnalyzerFastFit.cxx:26
 AliCaloRawAnalyzerFastFit.cxx:27
 AliCaloRawAnalyzerFastFit.cxx:28
 AliCaloRawAnalyzerFastFit.cxx:29
 AliCaloRawAnalyzerFastFit.cxx:30
 AliCaloRawAnalyzerFastFit.cxx:31
 AliCaloRawAnalyzerFastFit.cxx:32
 AliCaloRawAnalyzerFastFit.cxx:33
 AliCaloRawAnalyzerFastFit.cxx:34
 AliCaloRawAnalyzerFastFit.cxx:35
 AliCaloRawAnalyzerFastFit.cxx:36
 AliCaloRawAnalyzerFastFit.cxx:37
 AliCaloRawAnalyzerFastFit.cxx:38
 AliCaloRawAnalyzerFastFit.cxx:39
 AliCaloRawAnalyzerFastFit.cxx:40
 AliCaloRawAnalyzerFastFit.cxx:41
 AliCaloRawAnalyzerFastFit.cxx:42
 AliCaloRawAnalyzerFastFit.cxx:43
 AliCaloRawAnalyzerFastFit.cxx:44
 AliCaloRawAnalyzerFastFit.cxx:45
 AliCaloRawAnalyzerFastFit.cxx:46
 AliCaloRawAnalyzerFastFit.cxx:47
 AliCaloRawAnalyzerFastFit.cxx:48
 AliCaloRawAnalyzerFastFit.cxx:49
 AliCaloRawAnalyzerFastFit.cxx:50
 AliCaloRawAnalyzerFastFit.cxx:51
 AliCaloRawAnalyzerFastFit.cxx:52
 AliCaloRawAnalyzerFastFit.cxx:53
 AliCaloRawAnalyzerFastFit.cxx:54
 AliCaloRawAnalyzerFastFit.cxx:55
 AliCaloRawAnalyzerFastFit.cxx:56
 AliCaloRawAnalyzerFastFit.cxx:57
 AliCaloRawAnalyzerFastFit.cxx:58
 AliCaloRawAnalyzerFastFit.cxx:59
 AliCaloRawAnalyzerFastFit.cxx:60
 AliCaloRawAnalyzerFastFit.cxx:61
 AliCaloRawAnalyzerFastFit.cxx:62
 AliCaloRawAnalyzerFastFit.cxx:63
 AliCaloRawAnalyzerFastFit.cxx:64
 AliCaloRawAnalyzerFastFit.cxx:65
 AliCaloRawAnalyzerFastFit.cxx:66
 AliCaloRawAnalyzerFastFit.cxx:67
 AliCaloRawAnalyzerFastFit.cxx:68
 AliCaloRawAnalyzerFastFit.cxx:69
 AliCaloRawAnalyzerFastFit.cxx:70
 AliCaloRawAnalyzerFastFit.cxx:71
 AliCaloRawAnalyzerFastFit.cxx:72
 AliCaloRawAnalyzerFastFit.cxx:73
 AliCaloRawAnalyzerFastFit.cxx:74
 AliCaloRawAnalyzerFastFit.cxx:75
 AliCaloRawAnalyzerFastFit.cxx:76
 AliCaloRawAnalyzerFastFit.cxx:77
 AliCaloRawAnalyzerFastFit.cxx:78
 AliCaloRawAnalyzerFastFit.cxx:79
 AliCaloRawAnalyzerFastFit.cxx:80
 AliCaloRawAnalyzerFastFit.cxx:81
 AliCaloRawAnalyzerFastFit.cxx:82
 AliCaloRawAnalyzerFastFit.cxx:83
 AliCaloRawAnalyzerFastFit.cxx:84
 AliCaloRawAnalyzerFastFit.cxx:85
 AliCaloRawAnalyzerFastFit.cxx:86
 AliCaloRawAnalyzerFastFit.cxx:87
 AliCaloRawAnalyzerFastFit.cxx:88
 AliCaloRawAnalyzerFastFit.cxx:89
 AliCaloRawAnalyzerFastFit.cxx:90
 AliCaloRawAnalyzerFastFit.cxx:91
 AliCaloRawAnalyzerFastFit.cxx:92
 AliCaloRawAnalyzerFastFit.cxx:93
 AliCaloRawAnalyzerFastFit.cxx:94
 AliCaloRawAnalyzerFastFit.cxx:95
 AliCaloRawAnalyzerFastFit.cxx:96
 AliCaloRawAnalyzerFastFit.cxx:97
 AliCaloRawAnalyzerFastFit.cxx:98
 AliCaloRawAnalyzerFastFit.cxx:99
 AliCaloRawAnalyzerFastFit.cxx:100
 AliCaloRawAnalyzerFastFit.cxx:101
 AliCaloRawAnalyzerFastFit.cxx:102
 AliCaloRawAnalyzerFastFit.cxx:103
 AliCaloRawAnalyzerFastFit.cxx:104
 AliCaloRawAnalyzerFastFit.cxx:105
 AliCaloRawAnalyzerFastFit.cxx:106
 AliCaloRawAnalyzerFastFit.cxx:107
 AliCaloRawAnalyzerFastFit.cxx:108
 AliCaloRawAnalyzerFastFit.cxx:109
 AliCaloRawAnalyzerFastFit.cxx:110
 AliCaloRawAnalyzerFastFit.cxx:111