/*
 * TrkChi2DeflTimeCut.cpp
 *
 *  Created on: 6-oct-2009
 *      Author: S. Ricciarini
 */

#include "TrkChi2DeflTimeCut.h"

double TrkChi2DeflTimeCut::_GetChi2(PamLevel2 *event) {
  return event->GetTrack(0)->GetTrkTrack()->chi2;
}

int TrkChi2DeflTimeCut::Check(PamLevel2 *event) {

  double chi2 = _GetChi2(event);
  if (chi2 < 0.)
    return 0;
  Double_t etaMod = fabs(event->GetTrack(0)->GetTrkTrack()->GetDeflection());
  Int_t nHitX = event->GetTrack(0)->GetTrkTrack()->GetNX();
  
//  cout << " nHitX " << nHitX << endl;
  
  if (nHitX == 3) {
    for (UInt_t i = 0; i < _iDayFirst_nHitX3.size(); i++) {
      _iDayFirst.push_back(_iDayFirst_nHitX3[i]);
      _iDayLast.push_back(_iDayLast_nHitX3[i]);
      for (int iPar=0; iPar<_nPar; iPar++) {
        _p[iPar].push_back(_p_nHitX3[iPar][i]);
      }
    }	
  }
  else if (nHitX >= 4) {
    for (UInt_t i = 0; i < _iDayFirst_nHitX4.size(); i++) {
      _iDayFirst.push_back(_iDayFirst_nHitX4[i]);
      _iDayLast.push_back(_iDayLast_nHitX4[i]);
      for (int iPar=0; iPar<_nPar; iPar++) {
        _p[iPar].push_back(_p_nHitX4[iPar][i]);
      }
    }	
  }
  else {
    return 0;
  }

  _time.Set(event->GetOrbitalInfo()->absTime, kFALSE, 0, kFALSE);
  // TTimestamp::GetDate() returns date in format YYYYMMDD so to compare it
  // with 6-digits dates (YYMMDD) we must subtract 20000000

  Int_t iDaySel = (_time.GetDate(kFALSE) - 20000000); // note: GetDate returns an unsigned integer
//  cout << "day " << iDaySel << endl;

  bool found = false;
  for (UInt_t i = 0; i < _iDayFirst.size(); i++) {
    if (_iDayFirst[i] <= iDaySel && iDaySel <= _iDayLast[i]) {
      for (int iPar=0; iPar<_nPar; iPar++) {
        _pSel[iPar] = _p[iPar][i];
      }
      
//      cout << "FOUND: day " << iDaySel << endl;
//      cout << _iDayFirst[i] << " " << _iDayLast[i] << endl;
//      cout << _pSel[0] << " " << _pSel[1] << " " << _pSel[2] << " " << _pSel[3] << endl;

      found = true;
      break;
    }
  }

  if (!found) {
    cout << "not found" << endl;
    cout << endl;
    return 0;
  }

//  for (int iPar=0; iPar<_nPar; iPar++) {
//    cout << " p" << iPar << ": " << _pSel[iPar] << endl;
//  }
//  cout << endl;

  double chi2max;
  
  if (_nPar==4) {
  
    chi2max=_pSel[0] + _pSel[1] * pow(etaMod, _pSel[2]) * (1. + pow(_pSel[3] * etaMod, 2));

//    cout << "chi2max " << chi2max << endl;

  }
  else if (_nPar==5) {
    chi2max=_pSel[0] + _pSel[1] * pow(etaMod, _pSel[2]) * (1. + pow(_pSel[3] * etaMod, _pSel[4]));
  }
  else {
    chi2max=-1;
  }

//  cout << "chi2 " << chi2 << endl;
  
  if (chi2 > chi2max) {
  
//    cout << "KO" << endl;
    
    return 0;

  }

//  cout << "OK" << endl;

  return CUTOK;

}
