#warning "This code is not written in a way to be compatible with other hyp features"
#warning "and (most likely)"
#warning "will not work as the algorithm is not implemented correctly"
#warning "(and THIS is really serious)"
#warning "Advise: Use HypDeltaTofMeanAlg instead."
using namespace std;
#include "hhypDeltaTofAlg.h"
#include "TVector3.h"
#define deltaTOFdebug 0
ClassImp(HHypDeltaTofAlg)
HHypDeltaTofAlg::HHypDeltaTofAlg(Char_t *name_i, Option_t par[])
  :HHypBaseAlgorithm(name_i,par)
{
  dtof = -1;
  sigmaDeltaTof = -1;
  tof1_exp = -1;
  tof2_exp = -1;
  tof1_theo = -1;
  tof2_theo = -1;
  beta1_th = -1;
  beta2_th = -1;
  pathLength1 = -1;
  pathLength2 = -1;
  momIndex1 = -1;
  momIndex2 = -1;
  trackIndex1 = -1;
  trackIndex2 = -1;
}
HHypDeltaTofAlg::~HHypDeltaTofAlg()
{
}
Bool_t HHypDeltaTofAlg::execute()
{
  if (mylist->getNpart() < 2)
    return kFALSE;
  
  
  
  mylist->CombIteratorReset();
  if (deltaTOFdebug == 1)
    cerr << "-------------------------------------" << endl;
  Int_t j = 0;
  while (mylist->CombIterator()) {
    j++;
    
    if (deltaTOFdebug == 1)
      cerr<<"Combination # "<<j<< " prob " << mylist->getProbAlg() << endl;
    
    dtof = 0;
    sigmaDeltaTof = 0;
    Double_t chi2 = 0;
    Double_t chi = 0;
    Int_t i = 0;
    Double_t mean = 0;
    
    
    for (i = 0; i < (mylist->getNpart() - 1); i++) {
      
      
      hyppid1 = mylist->getPid(0);
      particle1 = (HPidTrackCand *) mylist->getPidTrackCand(0);
      
      hyppid2 = mylist->getPid(i + 1);
      particle2 = mylist->getPidTrackCand(i + 1);
      
      
      
      momIndex1 = particle1->getTrackData()->getBestMomAlg();
      momIndex2 = particle2->getTrackData()->getBestMomAlg();
      
      if (deltaTOFdebug == 1){
	cerr<<"<debug> HHypDeltaTofAlg::"<<__func__<<"(): L"<<__LINE__<<endl;
	cerr<<" i = "<<i<<endl;
				cerr<<" particle 1 is "<<"  hyppid1 :"<<hyppid1<<endl;
				cerr<<" particle 2 is "<<"  hyppid2 :"<<hyppid2<<endl;
	cerr<<" momIndex 1  = "<<momIndex1<<endl;
	cerr<<" momIndex 2  = "<<momIndex2<<endl;
      }
			TVector3 Vect3;
      getTrackInfo(momIndex1, momIndex2);
      
      
      mass1 = HPidPhysicsConstants::mass(hyppid1);
			Vect3.SetMagThetaPhi(
				particle1->getTrackData()->getMomenta(ALG_RUNGEKUTTA),
				particle1->getTrackData()->getRKTheta()*TMath::DegToRad(),
				particle1->getTrackData()->getRKPhi()*TMath::DegToRad()
			);
      partHyp1mom = Vect3;
      partHyp1.SetVectM(partHyp1mom, mass1);
      beta1_th = partHyp1.Beta();       
      tof1_theo = pathLength1 / (beta1_th * c);
      
      mass2 = HPidPhysicsConstants::mass(hyppid2);
			Vect3.SetMagThetaPhi(
				particle2->getTrackData()->getMomenta(ALG_RUNGEKUTTA),
				particle2->getTrackData()->getRKTheta()*TMath::DegToRad(),
				particle2->getTrackData()->getRKPhi()*TMath::DegToRad()
			);
      partHyp2mom = Vect3;
      partHyp2.SetVectM(partHyp2mom, mass2);
      beta2_th = partHyp2.Beta();       
      tof2_theo = pathLength2 / (beta2_th * c);
      
      
      Double_t momentum1 = partHyp1mom.Mag();
      Double_t momentum2 = partHyp2mom.Mag();
      
      Double_t relative_momentum_error1 = 0.05 + (momentum1 / 2000) * 0.15;
      Double_t relative_momentum_error2 = 0.05 + (momentum2 / 2000) * 0.15;
      Double_t sigma_tof1_theo = tof1_theo * (2 * relative_momentum_error1);
      Double_t sigma_tof2_theo = tof2_theo * (2 * relative_momentum_error2);
      
      
      deltaTofExp[i] = (tof2_exp - tof1_exp);
      deltaTofTheo[i] = (tof2_theo - tof1_theo);
      
      deltaTofExpError[i] =
        ((0.250 / tof1_exp) * (0.250 / tof1_exp) +
         (0.250 / tof2_exp) * (0.250 / tof2_exp));
      deltaTofTheoError[i] =
        ((sigma_tof1_theo / tof1_theo) * (sigma_tof1_theo / tof1_theo) +
         (sigma_tof2_theo / tof2_theo) * (sigma_tof2_theo / tof2_theo));
      
      if (deltaTOFdebug == 1) {
        cerr << "\t tof1_exp " << tof1_exp << "\t tof2_exp " << tof2_exp <<
          endl;
        cerr << "\t tof1_theo " << tof1_theo << "\t tof2_theo " << tof2_theo <<
          endl;
        cerr << "\t deltaTofExp[" << i << "] " << deltaTofExp[i] <<
          "\t deltaTofTheo[" << i << "] " << deltaTofTheo[i] << endl;;
        cerr << "\t deltaTofTheoError[" << i << "] " << deltaTofTheoError[i] <<
          endl;
      }                         
      
    }                           
    
    Int_t k;
    
    dtof = 0;mean = 0;
    for (k = 0; k < i; k++) {
#warning "Why fabs()??? This kills the direction of the offset!!!"
      deltaTOF[k] = fabs(fabs(deltaTofExp[k]) - fabs(deltaTofTheo[k]));
      dtof = dtof + deltaTOF[k];
      
      
      chi2 +=
        ((deltaTofExp[k] - deltaTofTheo[k]) * (deltaTofExp[k] -
                                               deltaTofTheo[k])) /
        sqrt(deltaTofExpError[k] + deltaTofTheoError[k]);
      
      
#warning "Why fabs()??? This kills the direction of the offset!!!"
      mean += (fabs(deltaTofExp[k]) - fabs(deltaTofTheo[k]));
      
    }
    dtof = (1. / i) * dtof;
    if (deltaTOFdebug == 1)
      cerr << "\t dtof " << dtof << endl;
    
    sigmaDeltaTof = 0;
    for (k = 0; k < i; k++) {
      sigmaDeltaTof = pow((dtof - deltaTOF[k]), 2);     
    }
    sigmaDeltaTof = sqrt((1. / (i - 1)) * sigmaDeltaTof);
    
	if(i!=1)
	{
      chi2 /= (i - 1);
      mean /= (i - 1);
	}
    chi = sqrt(chi2);
    mylist->resetProbAlg(exp(-chi2));
    
    mylist->setUserValue(DELTATOF_DTOF, dtof);
    mylist->setUserValue(DELTATOF_SIGMA, sigmaDeltaTof);
    mylist->setUserValue(DELTATOF_OFFSET,tof1_theo - tof1_exp - mean);
    mylist->setUserValue(DELTATOF_CHI2,chi2);
    
    
    if (histofile) {
      UInt_t ntracks = mylist->getNpart();
      for (UInt_t j = 0; j < ntracks; j++) {
        
        HPidTrackCand *track = mylist->getPidTrackCand(j);
        if (track) {
          Int_t pid = mylist->getPid(j);
          Double_t beta = track->getTrackData()->getBeta(ALG_RUNGEKUTTA) * track->getTrackData()->getPolarity(ALG_RUNGEKUTTA);
          Double_t mom = track->getTrackData()->getMomenta(ALG_RUNGEKUTTA);
          qa->Fill(pid, mom, beta, dtof, sigmaDeltaTof, mylist->getProbAlg());
        }
      }
    }
    
    if (deltaTOFdebug == 1) {
      cerr<<"\t dtof "<<dtof<<endl;
      cerr<<"\t chi  "<<chi <<endl;
    } 
    
    mylist->resetProbAlg(exp(-0.5*chi));
  } 
  if (exitIdx > -1)
    return kTRUE;
  return kFALSE;
}                               
Bool_t HHypDeltaTofAlg::init()
{
  
  TString input(channel->Get(initList));
  if (histofile)
    qa =
      new TNtuple(input + TString("_dtof_debug"), "Spectra ntuple",
                  "pid:mom:beta:dtof:sigma:probalg");
  return kTRUE;
}
Bool_t HHypDeltaTofAlg::reinit()
{
  return kTRUE;
}
Bool_t HHypDeltaTofAlg::finalize()
{
  if (histofile)
    qa->Write();
  return kTRUE;
}
Bool_t HHypDeltaTofAlg::getTrackInfo(Int_t momIndex1, Int_t momIndex2)
{
  if (deltaTOFdebug == 1){
    cerr<<"<debug> HHypDeltaTofAlg::"<<__func__<<"(): L"<<__LINE__<<endl;
  }
  HCategory *pidTrackCandCat =
    (HCategory *) gHades->getCurrentEvent()->getCategory(catPidTrackCand);
  HPidTrackCand *pidTrackCand1 =particle1;
    
  HPidTrackCand *pidTrackCand2 =particle2;
    
  pidTrackCandCat = pidTrackCand1->buildPidTrackCandCategory();
  
  tof1_exp = -1;              
  pathLength1 = -1;           
  tof2_exp = -1;              
  pathLength2 = -1;           
  if (momIndex1 == ALG_SPLINE) {
    if (deltaTOFdebug == 1){
      cerr<<"<debug> HHypDeltaTofAlg::"<<__func__<<"(): L"<<__LINE__<<" ::  Using SPLINE momentum"<<endl;
    }
    trackIndex1 = pidTrackCand1->itsTrackData.nSplineTrackInd;
    trackIndex2 = pidTrackCand2->itsTrackData.nSplineTrackInd;
    HCategory *splineCat =
      (HCategory *) gHades->getCurrentEvent()->getCategory(catSplineTrack);
    if (splineCat==NULL){
      cerr<<"<error> HHypDeltaTofAlg::"<<__func__<<"(): L"<<__LINE__<<" ::  No RungeKutta Tracking Category Found !"<<endl;
      return kFALSE;
    }
    HSplineTrack *track1 = (HSplineTrack *) splineCat->getObject(trackIndex1);
    HSplineTrack *track2 = (HSplineTrack *) splineCat->getObject(trackIndex2);
    
    tof1_exp = track1->getTof();        
    pathLength1 = track1->getTofDist(); 
    tof2_exp = track2->getTof();        
    pathLength2 = track2->getTofDist(); 
  }
  else if (momIndex1 == ALG_RUNGEKUTTA) {
    if (deltaTOFdebug == 1){
      cerr<<"<debug> HHypDeltaTofAlg::"<<__func__<<"(): L"<<__LINE__<<" :: Using RK momentum"<<endl;
    }
    trackIndex1 = pidTrackCand1->itsTrackData.nRKTrackInd;
    trackIndex2 = pidTrackCand2->itsTrackData.nRKTrackInd;
    HCategory *trackCat =
      (HCategory *) gHades->getCurrentEvent()->getCategory(catRKTrackB);
    if (trackCat==NULL){
      cerr<<"<error> HHypDeltaTofAlg::"<<__func__<<"(): L"<<__LINE__<<" :: No RungeKutta Tracking Category Found !"<<endl;
      return kFALSE;
    }
    HRKTrackB *track1 = (HRKTrackB *) trackCat->getObject(trackIndex1);
    HRKTrackB *track2 = (HRKTrackB *) trackCat->getObject(trackIndex2);
    
    tof1_exp = track1->getTof();        
    pathLength1 = track1->getTofDist(); 
    tof2_exp = track2->getTof();        
    pathLength2 = track2->getTofDist(); 
    
  }
  else {
    cerr<<"<error> HHypDeltaTofAlg::"<<__func__<<"(): L"<<__LINE__<<" :  MOMENTUM ALG not not found !!! \n" << endl;
  }
  return kTRUE;
}
Last change: Sat May 22 12:57:44 2010
Last generated: 2010-05-22 12:57
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.