/*
 * TofDedxVsBetaHistoAction.cpp
 *
 *  Created on: 25-giu-2009
 *      Author: Nicola Mori
 */

/*! @file TofDedxVsBetaHistoAction.cpp The TofDedxVsBetaHistoAction class implementation file. */

#include "TofDedxVsBetaHistoAction.h"

TofDedxVsBetaHistoAction::TofDedxVsBetaHistoAction(const char *actionName, unsigned int layers, bool standAlone,
    TString outFileBase, TString mode, bool outRoot, bool outText, TString title) :
    Histo2DAction<Int_t>(actionName, title, outFileBase, mode, outRoot, outText), _layers(layers), _nLayers(0), _badEvents(
        0), _standAlone(standAlone) {

  bool buildTitle = false;
  if (title == "") {
    buildTitle = true;
    title = "TOF dE/dx (";
  }
  if ((_layers & S11) == S11) {
    if (buildTitle)
      title += "S11";
    _nLayers++;
  }
  if ((_layers & S12) == S12) {
    if (buildTitle) {
      if (_nLayers > 0)
        title += ",";
      title += "S12";
    }
    _nLayers++;
  }
  if ((_layers & S21) == S21) {
    if (buildTitle) {
      if (_nLayers > 0)
        title += ",";
      title += "S21";
    }
    _nLayers++;
  }
  if ((_layers & S22) == S22) {
    if (buildTitle) {
      if (_nLayers > 0)
        title += ",";
      title += "S22";
    }
    _nLayers++;
  }
  if ((_layers & S31) == S31) {
    if (buildTitle) {
      if (_nLayers > 0)
        title += ",";
      title += "S31";
    }
    _nLayers++;
  }
  if ((_layers & S32) == S32) {
    if (buildTitle) {
      if (_nLayers > 0)
        title += ",";
      title += "S32";
    }
    _nLayers++;
  }
  if (buildTitle)
    title += ") Vs Beta";

  SetTitle(title);

}

void TofDedxVsBetaHistoAction::OnGood(PamLevel2 *event) {

  static float dEdx;
  static float dEdxLayer;
  static unsigned int badLayers;

  static int trkSeqNo;
  static int idx;
  if (_standAlone)
    trkSeqNo = -1;
  else
    trkSeqNo = event->GetTrack(0)->GetTrkTrack()->GetSeqNo();

  for (int i = 0; i < event->GetToFLevel2()->ntrk(); i++) {
    if (event->GetToFLevel2()->GetToFTrkVar(i)->trkseqno == trkSeqNo)
      idx = i;
  }

  dEdx = 0.;
  badLayers = 0;
  if ((_layers & S11) == S11) {
    dEdxLayer = event->GetToFLevel2()->GetdEdx(idx, 0, 100);
    // Patch to exclude S115b
    ToFTrkVar *tofTrk = event->GetToFLevel2()->GetToFTrkVar(idx);
    bool has8 = false, has9 = false;
    float dedx9 = 0.;
    for (Int_t ib = 0; ib < tofTrk->npmtadc; ib++) {
      if (tofTrk->pmtadc[ib] == 8) {
        has8 = true;
      }
      if (tofTrk->pmtadc[ib] == 9) {
        has9 = true;
        dedx9 = tofTrk->dedx[ib];
      }
    }

    if (has9) {
      dEdxLayer -= (dedx9 / ((int) has8 + 1));
      dEdxLayer *= 2.;
    }
    //End of patch
    if (dEdxLayer > 0. && dEdxLayer < 4090)
      dEdx += dEdxLayer;
    else
      badLayers++;
  }
  if ((_layers & S12) == S12) {
    dEdxLayer = event->GetToFLevel2()->GetdEdx(idx, 1, 100);
    if (dEdxLayer > 0. && dEdxLayer < 4090)
      dEdx += dEdxLayer;
    else
      badLayers++;
  }
  if ((_layers & S21) == S21) {
    dEdxLayer = event->GetToFLevel2()->GetdEdx(idx, 2, 100);
    if (dEdxLayer > 0. && dEdxLayer < 4090)
      dEdx += dEdxLayer;
    else
      badLayers++;
  }
  if ((_layers & S22) == S22) {
    dEdxLayer = event->GetToFLevel2()->GetdEdx(idx, 3, 100);
    if (dEdxLayer > 0. && dEdxLayer < 4090)
      dEdx += dEdxLayer;
    else
      badLayers++;
  }
  if ((_layers & S31) == S31) {
    dEdxLayer = event->GetToFLevel2()->GetdEdx(idx, 4, 100);
    if (dEdxLayer > 0. && dEdxLayer < 4090)
      dEdx += dEdxLayer;
    else
      badLayers++;
  }
  if ((_layers & S32) == S32) {
    dEdxLayer = event->GetToFLevel2()->GetdEdx(idx, 5, 100);
    if (dEdxLayer > 0. && dEdxLayer < 4090)
      dEdx += dEdxLayer;
    else
      badLayers++;
  }
  if (badLayers == 0) {
    dEdx /= _nLayers;
    Fill(event->GetToFLevel2()->GetToFTrkVar(idx)->beta[12], dEdx);
  }
  else
    _badEvents++;
}

