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.                  *
 **************************************************************************/

/*
  Author: R. GUERNANE LPSC Grenoble CNRS/IN2P3
*/


#include "AliCaloRawAnalyzerFakeALTRO.h"
#include "AliCaloBunchInfo.h"
#include "AliCaloFitResults.h"
#include "AliLog.h"
#include "TMath.h"
#include <stdexcept>
#include <iostream>
#include "TF1.h"
#include "TGraph.h"
#include "AliCaloConstants.h"

using namespace std;

ClassImp( AliCaloRawAnalyzerFakeALTRO )


AliCaloRawAnalyzerFakeALTRO::AliCaloRawAnalyzerFakeALTRO() : AliCaloRawAnalyzerFitter("Chi Square Fit", "FakeAltro")
{
  // constructor
  
  fAlgo= Algo::kFakeAltro;
}

AliCaloRawAnalyzerFakeALTRO::~AliCaloRawAnalyzerFakeALTRO()
{
  // destructor
  
  //delete fTf1;
}

AliCaloFitResults
AliCaloRawAnalyzerFakeALTRO::Evaluate( const vector<AliCaloBunchInfo>  &bunchvector,
                                      UInt_t altrocfg1, UInt_t altrocfg2 )
{
  // Extracting signal parameters using fitting
  
  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 maxrev = maxampindex  -  bunchvector.at(index).GetStartBin();
    // timebinOffset is timebin value at maximum (maxrev)
    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, Ret::kCrude, maxf, timebinOffset);
    }
    else if ( maxf >= fAmpCut )
    {
      int first = 0;
      int last = 0;
      SelectSubarray( fReversed,  bunchvector.at(index).GetLength(),  maxrev, &first, &last, fFitArrayCut );
      int nsamples =  last - first + 1;
      
      if( ( nsamples  )  >= fNsampleCut )
	    {
	      Float_t tmax = (maxrev - first); // local tmax estimate
	      TGraph *graph =  new TGraph(  nsamples, fXaxis,  &fReversed[first] );
	      fTf1->SetParameter(0, maxf*fkEulerSquared );
	      fTf1->SetParameter(1, tmax - fTau);
	      // set rather loose parameter limits
	      fTf1->SetParLimits(0, 0.5*maxf*fkEulerSquared, 2*maxf*fkEulerSquared );
	      fTf1->SetParLimits(1, tmax - fTau - 4, tmax - fTau + 4);
        
	      if (fFixTau) {
          fTf1->FixParameter(2, fTau);
	      }
	      else {
          fTf1->ReleaseParameter(2); // allow par. to vary
          fTf1->SetParameter(2, fTau);
	      }
        
	      Short_t tmpStatus = 0;
	      try {
          tmpStatus =  graph->Fit(fTf1, "Q0RW");
	      }
	      catch (const std::exception & e) {
          AliError( Form("TGraph Fit exception %s, fit status %d", e.what(),tmpStatus) );
          return AliCaloFitResults( maxamp, ped, Ret::kNoFit, maxf, timebinOffset,
                                   timebinOffset, Ret::kDummy, Ret::kDummy,  Ret::kDummy, AliCaloFitSubarray(index, maxrev, first, last) );
	      }
        
	      if( fVerbose == true )
        {
          AliCaloRawAnalyzer::PrintBunch( bunchvector.at(index) );
          PrintFitResult( fTf1 ) ;
        }
	      // global tmax
	      tmax = fTf1->GetParameter(1) + timebinOffset - (maxrev - first) // abs. t0
        + fTf1->GetParameter(2); // +tau, makes sum tmax
	      
        delete graph;
        return AliCaloFitResults( maxamp, ped , Ret::kFitPar,
                                 fTf1->GetParameter(0)/fkEulerSquared,
                                 tmax,
                                 timebinOffset,
                                 fTf1->GetChisquare(),
                                 fTf1->GetNDF(),
                                 Ret::kDummy, AliCaloFitSubarray(index, maxrev, first, last) );
				
        //     delete graph;
        
	    }
      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,
                                 timebinOffset, chi2, ndf, Ret::kDummy, AliCaloFitSubarray(index, maxrev, first, last) ); 
	    }
    } // ampcut
  }
  return AliCaloFitResults(  Ret::kInvalid,  Ret::kInvalid );
}

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