-
Whitney Armstrong authoredWhitney Armstrong authored
THcCoinTime.cxx 11.44 KiB
/** \class THcCoinTime
\ingroup PhysMods
\brief Class for calculating and adding the Coincidence Time in the Tree.
//Author: Carlos Yero
//Date: April 27, 2018
*/
#include "THaEvData.h"
#include "THaCutList.h"
#include "VarDef.h"
#include "VarType.h"
#include "TClonesArray.h"
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "THcCoinTime.h"
#include "THcTrigDet.h"
#include "THaApparatus.h"
#include "THcHodoHit.h"
#include "THcGlobals.h"
#include "THcParmList.h"
using namespace std;
//_____________________________________________________________________________
THcCoinTime::THcCoinTime (const char *name, const char* description, const char* hadArmName,
const char* elecArmName, const char* coinname) :
hcana::ConfigLogging<THaPhysicsModule>(name, description),
fCoinDetName(coinname),
fhadArmName(hadArmName), //initialize spectro names
felecArmName(elecArmName),
fhadSpectro(NULL), //initialize spectro objects
felecSpectro(NULL),
fCoinDet(NULL)
{
}
//_____________________________________________________________________________
THcCoinTime::~THcCoinTime()
{
//Destructor
RemoveVariables();
}
//_____________________________________________________________________________
void THcCoinTime::Clear( Option_t* opt )
{
// Clear all event-by-event variables.
// THaPhysicsModule::Clear(opt);
fROC1_epCoinTime=kBig;
fROC2_epCoinTime=kBig;
fROC1_eKCoinTime=kBig;
fROC2_eKCoinTime=kBig;
fROC1_ePiCoinTime=kBig;
fROC2_ePiCoinTime=kBig;
fROC1_ePosCoinTime=kBig;
fROC2_ePosCoinTime=kBig;
fROC1_RAW_CoinTime=kBig;
fROC2_RAW_CoinTime=kBig;
}
//_____________________________________________________________________________
void THcCoinTime::Reset( Option_t* opt)
// Clear event-by-event data
{
Clear(opt);
}
//_____________________________________________________________________________
THaAnalysisObject::EStatus THcCoinTime::Init( const TDatime& run_time )
{
// Initialize THcCoinTime physics module
//cout << "*************************************************" << endl;
//cout << "Initializing THcCointTime Physics Modue" << endl;
//cout << "Hadron Arm -------> " << fhadArmName << endl;
//cout << "Electron Arm -------> " << felecArmName << endl;
//cout << "TrigDet -------> " << fCoinDetName << endl;
//cout << "**************************************************" << endl;
_logger->info("*************************************************");
_logger->info("Initializing THcCointTime Physics Modue" );
_logger->info("Hadron Arm -------> {}" , fhadArmName.Data() );
_logger->info("Electron Arm -------> {}" , felecArmName.Data() );
_logger->info("TrigDet -------> {}" , fCoinDetName.Data() );
_logger->info("**************************************************" );
fStatus = kOK;
fhadSpectro = dynamic_cast<THcHallCSpectrometer*>
( FindModule( fhadArmName.Data(), "THcHallCSpectrometer"));
if( !fhadSpectro ) {
//cout << "THcCoinTime module Cannnot find Hadron Arm = " << fhadArmName.Data() << endl;
_logger->error("THcCoinTime module Cannnot find Hadron Arm = {}" , fhadArmName.Data());
fStatus = kInitError;
return fStatus;
}
felecSpectro = dynamic_cast<THcHallCSpectrometer*>
( FindModule( felecArmName.Data(), "THcHallCSpectrometer"));
if( !felecSpectro ) {
//cout << "THcCoinTime module Cannnot find Electron Arm = " << felecArmName.Data() << endl;
_logger->error("THcCoinTime module Cannnot find Electron Arm = {}" , felecArmName.Data());
fStatus = kInitError;
return fStatus;
}
fCoinDet = dynamic_cast<THcTrigDet*>
( FindModule( fCoinDetName.Data(), "THcTrigDet"));
if( !fCoinDet ) {
//cout << "THcCoinTime module Cannnot find TrigDet = " << fCoinDetName.Data() << endl;
_logger->error("THcCoinTime module Cannnot find TrigDet = {}", fCoinDetName.Data());
fStatus = kInitError;
return fStatus;
}
if( (fStatus=THaPhysicsModule::Init( run_time )) != kOK ) {
return fStatus;
}
return fStatus;
}
//_____________________________________________________________________________
Int_t THcCoinTime::ReadDatabase( const TDatime& date )
{
// Read database. Gets variable needed for CoinTime calculation
DBRequest list[]={
{"eHadCoinTime_Offset", &eHad_CT_Offset, kDouble, 0, 1}, //coin time offset for ep coincidences
{"HMS_CentralPathLen", &HMScentralPathLen, kDouble, 0, 1},
{"SHMS_CentralPathLen", &SHMScentralPathLen, kDouble, 0, 1},
{0}
};
//Default values if not read from param file
eHad_CT_Offset = 0.0;
HMScentralPathLen = 22.0*100.;
SHMScentralPathLen = 18.1*100.;
gHcParms->LoadParmValues((DBRequest*)&list, "");
return kOK;
}
//_____________________________________________________________________________
Int_t THcCoinTime::DefineVariables( EMode mode )
{
if( mode == kDefine && fIsSetup ) return kOK;
fIsSetup = ( mode == kDefine );
const RVarDef vars[] = {
{"epCoinTime_ROC1", "ROC1 Corrected ep Coincidence Time", "fROC1_epCoinTime"},
{"epCoinTime_ROC2", "ROC2 Corrected ep Coincidence Time", "fROC2_epCoinTime"},
{"eKCoinTime_ROC1", "ROC1 Corrected eK Coincidence Time", "fROC1_eKCoinTime"},
{"eKCoinTime_ROC2", "ROC2 Corrected eK Coincidence Time", "fROC2_eKCoinTime"},
{"ePiCoinTime_ROC1", "ROC1 Corrected ePi Coincidence Time", "fROC1_ePiCoinTime"},
{"ePiCoinTime_ROC2", "ROC2 Corrected ePi Coincidence Time", "fROC2_ePiCoinTime"},
{"ePositronCoinTime_ROC1", "ROC1 Corrected e-Positorn Coincidence Time", "fROC1_ePosCoinTime"},
{"ePositronCoinTime_ROC2", "ROC2 Corrected e-Positron Coincidence Time", "fROC2_ePosCoinTime"},
{"CoinTime_RAW_ROC1", "ROC1 RAW Coincidence Time", "fROC1_RAW_CoinTime"},
{"CoinTime_RAW_ROC2", "ROC2 RAW Coincidence Time", "fROC2_RAW_CoinTime"},
{ 0 }
};
return DefineVarsFromList( vars, mode );
}
//_____________________________________________________________________________
Int_t THcCoinTime::Process( const THaEvData& evdata )
{
if( !IsOK() || !gHaRun ) return -1;
//Declare track information objects for hadron/electron arm
THaTrackInfo* had_trkifo = fhadSpectro->GetTrackInfo();
THaTrackInfo* elec_trkifo = felecSpectro->GetTrackInfo();
if( !had_trkifo) cout << " no hadron track " << endl;
if( !elec_trkifo) cout << " no electron track " << endl;
//Check if the hadron/electron arm had a track
if( !had_trkifo || !had_trkifo->IsOK() ) return 1;
if( !elec_trkifo || !elec_trkifo->IsOK() ) return 1;
//Create THaTrack object for hadron/elec arms to get relevant golden track quantities
if (felecArmName=="H") {
theSHMSTrack =(fhadSpectro->GetGoldenTrack());
theHMSTrack = (felecSpectro->GetGoldenTrack());
} else{
theSHMSTrack =(felecSpectro->GetGoldenTrack());
theHMSTrack = (fhadSpectro->GetGoldenTrack());
}
//Gather relevant variables for Coincidence time calculation
lightSpeed = 29.9792; // in cm/ns
//Particle Masses (HardCoded)
elecMass = 0.510998/1000.0; // electron mass in GeV/c^2
positronMass = 0.510998/1000.0;
protonMass = 938.27208/1000.0; // proton mass in GeV/c^2
kaonMass = 493.677/1000.0; //charged kaon mass in GeV/c^2
pionMass = 139.570/1000.0; //charged pion mass in GeV/c^2
//Check if there was a golden track in both arms
if (!theSHMSTrack || !theHMSTrack)
{
return 1;
}
//Check if Database is reading the correct elec-arm particle mass
if (felecSpectro->GetParticleMass() > 0.00052) return 1;
//SHMS arm
Double_t shms_xptar = theSHMSTrack->GetTTheta();
Double_t shms_dP = theSHMSTrack->GetDp();
Double_t SHMS_FPtime = theSHMSTrack->GetFPTime();
//HMS arm
Double_t hms_xfp = theHMSTrack->GetX();
Double_t hms_xpfp = theHMSTrack->GetTheta();
Double_t hms_ypfp = theHMSTrack->GetPhi();
Double_t HMS_FPtime = theHMSTrack->GetFPTime();
//Get raw TDC Times for HMS/SHMS (3/4 trigger)
pTRIG1_TdcTime_ROC1 = fCoinDet->Get_CT_Trigtime(0); //SHMS
pTRIG4_TdcTime_ROC1 = fCoinDet->Get_CT_Trigtime(1); //HMS
pTRIG1_TdcTime_ROC2 = fCoinDet->Get_CT_Trigtime(2);//SHMS
pTRIG4_TdcTime_ROC2 = fCoinDet->Get_CT_Trigtime(3);//HMS
DeltaSHMSpathLength = -0.11*atan2(shms_xptar,1)*1000 - 0.057*shms_dP;
DeltaHMSpathLength = 12.462*hms_xpfp + 0.1138*hms_xpfp*hms_xfp - 0.0154*hms_xfp - 72.292*hms_xpfp*hms_xpfp - 0.0000544*hms_xfp*had_xfp - 116.52*hms_ypfp*hms_ypfp;
// default assume SHMS is electron arm
Double_t ElecPathLength=SHMScentralPathLen + DeltaSHMSpathLength;
Double_t HadPathLength=HMScentralPathLen + DeltaHMSpathLength;
elec_P = theSHMSTrack->GetP(); //electron golden track arm momentum
had_P = theHMSTrack->GetP(); //hadron golden track arm momentum
Int_t sign=-1;
if (felecArmName=="H") {
ElecPathLength=HMScentralPathLen + DeltaHMSpathLength;
HadPathLength=SHMScentralPathLen + DeltaSHMSpathLength;
elec_P = theHMSTrack->GetP(); //electron golden track arm momentum
had_P = theSHMSTrack->GetP(); //hadron golden track arm momentum
sign=1;
}
//beta calculations beta = v/c = p/E
elecArm_BetaCalc = elec_P / sqrt(elec_P*elec_P + elecMass*elecMass);
hadArm_BetaCalc_proton = had_P / sqrt(had_P*had_P + protonMass*protonMass);
hadArm_BetaCalc_Kaon = had_P / sqrt(had_P*had_P + kaonMass*kaonMass);
hadArm_BetaCalc_Pion = had_P / sqrt(had_P*had_P + pionMass*pionMass);
hadArm_BetaCalc_Positron = had_P / sqrt(had_P*had_P + positronMass*positronMass);
//Coincidence Corrections
elec_coinCorr = (ElecPathLength) / (lightSpeed * elecArm_BetaCalc );
had_coinCorr_proton = (HadPathLength) / (lightSpeed * hadArm_BetaCalc_proton );
had_coinCorr_Kaon = (HadPathLength)/ (lightSpeed * hadArm_BetaCalc_Kaon );
had_coinCorr_Pion = (HadPathLength)/ (lightSpeed * hadArm_BetaCalc_Pion );
had_coinCorr_Positron = (HadPathLength) / (lightSpeed * hadArm_BetaCalc_Positron );
//Raw, Uncorrected Coincidence Time
fROC1_RAW_CoinTime = (pTRIG1_TdcTime_ROC1 + SHMS_FPtime) - (pTRIG4_TdcTime_ROC1 + HMS_FPtime);
fROC2_RAW_CoinTime = (pTRIG1_TdcTime_ROC2 + SHMS_FPtime) - (pTRIG4_TdcTime_ROC2 + HMS_FPtime);
//Corrected Coincidence Time for ROC1/ROC2 (ROC1 Should be identical to ROC2)
//
//PROTON
fROC1_epCoinTime = fROC1_RAW_CoinTime + sign*( elec_coinCorr-had_coinCorr_proton) - eHad_CT_Offset;
fROC2_epCoinTime = fROC2_RAW_CoinTime + sign*( elec_coinCorr-had_coinCorr_proton) - eHad_CT_Offset;
//KAON
fROC1_eKCoinTime = fROC1_RAW_CoinTime + sign*( elec_coinCorr-had_coinCorr_Kaon) - eHad_CT_Offset;
fROC2_eKCoinTime = fROC2_RAW_CoinTime + sign*( elec_coinCorr-had_coinCorr_Kaon) - eHad_CT_Offset;
//PION
fROC1_ePiCoinTime = fROC1_RAW_CoinTime + sign*( elec_coinCorr - had_coinCorr_Pion) - eHad_CT_Offset;
fROC2_ePiCoinTime = fROC2_RAW_CoinTime + sign*( elec_coinCorr - had_coinCorr_Pion) - eHad_CT_Offset;
//POSITRON
fROC1_ePosCoinTime = fROC1_RAW_CoinTime + sign*( elec_coinCorr + had_coinCorr_Positron) - eHad_CT_Offset ;
fROC2_ePosCoinTime = fROC2_RAW_CoinTime + sign*( elec_coinCorr + had_coinCorr_Positron) - eHad_CT_Offset;
return 0;
}
//_____________________________________________________________________________
ClassImp(THcCoinTime)
////////////////////////////////////////////////////////////////////////////////