/*
 * TofDedxVsRigHistoAction.cpp
 *
 *  Created on: 22-jul-2011
 *      Author: Nicola Mori
 */

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

#include "TofDedxVsRigHistoAction.h"

TofDedxVsRigHistoAction::TofDedxVsRigHistoAction(const char *actionName, unsigned int layers, 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) {

  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 TofDedxVsRigHistoAction::OnGood(PamLevel2 *event) {

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

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

  dEdx = 0.;
  badLayers = 0;
  if ((_layers & S11) == S11) {
    dEdxLayer = event->GetToFLevel2()->GetdEdx(idx, 0, 100);
    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 != _nLayers) {
    dEdx /= _nLayers - badLayers;
    Fill(event->GetTrack(0)->GetTrkTrack()->GetRigidity(), dEdx);
  }
  else
    _badEvents++;
}

