Hall C ROOT/C++ Analyzer (hcana)
THcCoinTime.cxx
Go to the documentation of this file.
1 
9 #include "THaEvData.h"
10 #include "THaCutList.h"
11 #include "VarDef.h"
12 #include "VarType.h"
13 #include "TClonesArray.h"
14 
15 #include <cstring>
16 #include <cstdio>
17 #include <cstdlib>
18 #include <iostream>
19 
20 #include "THcCoinTime.h"
21 #include "THcTrigDet.h"
22 #include "THaApparatus.h"
23 #include "THcHodoHit.h"
24 #include "THcGlobals.h"
25 #include "THcParmList.h"
26 
27 using namespace std;
28 
29 //_____________________________________________________________________________
30 THcCoinTime::THcCoinTime (const char *name, const char* description, const char* hadArmName,
31  const char* elecArmName, const char* coinname) :
32 
33  THaPhysicsModule(name, description),
34  fCoinDetName(coinname),
35  fhadArmName(hadArmName), //initialize spectro names
36  felecArmName(elecArmName),
37  fhadSpectro(NULL), //initialize spectro objects
38  felecSpectro(NULL),
39  fCoinDet(NULL)
40 {
41 
42 }
43 
44 //_____________________________________________________________________________
46 {
47  //Destructor
48 
49  RemoveVariables();
50 
51 }
52 //_____________________________________________________________________________
54 {
55  // Clear all event-by-event variables.
56 
57  // THaPhysicsModule::Clear(opt);
76 }
77 
78 //_____________________________________________________________________________
80 // Clear event-by-event data
81 {
82  Clear(opt);
83 }
84 
85 
86 //_____________________________________________________________________________
87 THaAnalysisObject::EStatus THcCoinTime::Init( const TDatime& run_time )
88 {
89  // Initialize THcCoinTime physics module
90 
91  cout << "*************************************************" << endl;
92  cout << "Initializing THcCointTime Physics Modue" << endl;
93  cout << "Hadron Arm -------> " << fhadArmName << endl;
94  cout << "Electron Arm -------> " << felecArmName << endl;
95  cout << "TrigDet -------> " << fCoinDetName << endl;
96  cout << "**************************************************" << endl;
97 
98  fStatus = kOK;
99 
100  fhadSpectro = dynamic_cast<THcHallCSpectrometer*>
101  ( FindModule( fhadArmName.Data(), "THcHallCSpectrometer"));
102  if( !fhadSpectro ) {
103  cout << "THcCoinTime module Cannnot find Hadron Arm = " << fhadArmName.Data() << endl;
104  fStatus = kInitError;
105  return fStatus;
106  }
107 
108  felecSpectro = dynamic_cast<THcHallCSpectrometer*>
109  ( FindModule( felecArmName.Data(), "THcHallCSpectrometer"));
110  if( !felecSpectro ) {
111  cout << "THcCoinTime module Cannnot find Electron Arm = " << felecArmName.Data() << endl;
112  fStatus = kInitError;
113  return fStatus;
114  }
115 
116  fCoinDet = dynamic_cast<THcTrigDet*>
117  ( FindModule( fCoinDetName.Data(), "THcTrigDet"));
118  if( !fCoinDet ) {
119  cout << "THcCoinTime module Cannnot find TrigDet = " << fCoinDetName.Data() << endl;
120  fStatus = kInitError;
121  return fStatus;
122  }
123 
124 
125 
126  if( (fStatus=THaPhysicsModule::Init( run_time )) != kOK ) {
127  return fStatus;
128  }
129 
130  return fStatus;
131 }
132 
133 //_____________________________________________________________________________
135 {
136  // Read database. Gets variable needed for CoinTime calculation
137 
138 
139  DBRequest list[]={
140  {"eHadCoinTime_Offset", &eHad_CT_Offset, kDouble, 0, 1}, //coin time offset for ep coincidences
141 
142  {"HMS_CentralPathLen", &HMScentralPathLen, kDouble, 0, 1},
143  {"SHMS_CentralPathLen", &SHMScentralPathLen, kDouble, 0, 1},
144  {0}
145  };
146 
147  //Default values if not read from param file
148  eHad_CT_Offset = 0.0;
149 
150  HMScentralPathLen = 22.0*100.;
151  SHMScentralPathLen = 18.1*100.;
152 
153 
154  gHcParms->LoadParmValues((DBRequest*)&list, "");
155 
156  return kOK;
157 }
158 
159 //_____________________________________________________________________________
161 {
162 
163  if( mode == kDefine && fIsSetup ) return kOK;
164  fIsSetup = ( mode == kDefine );
165 
166  const RVarDef vars[] = {
167  {"epCoinTime_ROC1", "ROC1 Corrected ep Coincidence Time", "fROC1_epCoinTime"},
168  {"epCoinTime_ROC2", "ROC2 Corrected ep Coincidence Time", "fROC2_epCoinTime"},
169  {"epCoinTime_TRIG1", "TRIG1 Corrected ep Coincidence Time", "fTRIG1_epCoinTime"},
170  {"epCoinTime_TRIG4", "TRIG4 Corrected ep Coincidence Time", "fTRIG4_epCoinTime"},
171 
172  {"eKCoinTime_ROC1", "ROC1 Corrected eK Coincidence Time", "fROC1_eKCoinTime"},
173  {"eKCoinTime_ROC2", "ROC2 Corrected eK Coincidence Time", "fROC2_eKCoinTime"},
174  {"eKCoinTime_TRIG1", "TRIG1 Corrected eK Coincidence Time", "fTRIG1_eKCoinTime"},
175  {"eKCoinTime_TRIG4", "TRIG4 Corrected eK Coincidence Time", "fTRIG4_eKCoinTime"},
176 
177  {"ePiCoinTime_ROC1", "ROC1 Corrected ePi Coincidence Time", "fROC1_ePiCoinTime"},
178  {"ePiCoinTime_ROC2", "ROC2 Corrected ePi Coincidence Time", "fROC2_ePiCoinTime"},
179  {"ePiCoinTime_TRIG1", "TRIG1 Corrected ePi Coincidence Time", "fTRIG1_ePiCoinTime"},
180  {"ePiCoinTime_TRIG4", "TRIG4 Corrected ePi Coincidence Time", "fTRIG4_ePiCoinTime"},
181 
182  {"ePositronCoinTime_ROC1", "ROC1 Corrected e-Positorn Coincidence Time", "fROC1_ePosCoinTime"},
183  {"ePositronCoinTime_ROC2", "ROC2 Corrected e-Positron Coincidence Time", "fROC2_ePosCoinTime"},
184  {"ePositronCoinTime_TRIG1", "TRIG1 Corrected e-Positorn Coincidence Time", "fTRIG1_ePosCoinTime"},
185  {"ePositronCoinTime_TRIG4", "TRIG4 Corrected e-Positron Coincidence Time", "fTRIG4_ePosCoinTime"},
186 
187  {"CoinTime_RAW_ROC1", "ROC1 RAW Coincidence Time", "fROC1_RAW_CoinTime"},
188  {"CoinTime_RAW_ROC2", "ROC2 RAW Coincidence Time", "fROC2_RAW_CoinTime"},
189  {"CoinTime_RAW_TRIG1", "TRIG1 RAW Coincidence Time", "fTRIG1_RAW_CoinTime"},
190  {"CoinTime_RAW_TRIG4", "TRIG4 RAW Coincidence Time", "fTRIG4_RAW_CoinTime"},
191  {"DeltaSHMSPathLength","DeltaSHMSpathLength (cm)","DeltaSHMSpathLength"},
192  {"DeltaHMSPathLength", "DeltaHMSpathLength (cm)","DeltaHMSpathLength"},
193  {"had_coinCorr_Positron", "", "had_coinCorr_Positron"},
194  {"elec_coinCorr", "", "elec_coinCorr"},
195  { 0 }
196  };
197 
198  return DefineVarsFromList( vars, mode );
199 
200 }
201 
202 
203 
204 //_____________________________________________________________________________
206 {
207 
208  if( !IsOK() || !gHaRun ) return -1;
209 
210  //Declare track information objects for hadron/electron arm
211  THaTrackInfo* had_trkifo = fhadSpectro->GetTrackInfo();
212  THaTrackInfo* elec_trkifo = felecSpectro->GetTrackInfo();
213 
214  if( !had_trkifo) cout << " no hadron track " << endl;
215  if( !elec_trkifo) cout << " no electron track " << endl;
216  //Check if the hadron/electron arm had a track
217  if( !had_trkifo || !had_trkifo->IsOK() ) return 1;
218  if( !elec_trkifo || !elec_trkifo->IsOK() ) return 1;
219 
220  //Create THaTrack object for hadron/elec arms to get relevant golden track quantities
221  if (felecArmName=="H") {
222  theSHMSTrack =(fhadSpectro->GetGoldenTrack());
223  theHMSTrack = (felecSpectro->GetGoldenTrack());
224  } else{
225  theSHMSTrack =(felecSpectro->GetGoldenTrack());
226  theHMSTrack = (fhadSpectro->GetGoldenTrack());
227  }
228  //Gather relevant variables for Coincidence time calculation
229  lightSpeed = 29.9792; // in cm/ns
230 
233  //Particle Masses (HardCoded)
234  elecMass = 0.510998/1000.0; // electron mass in GeV/c^2
235  positronMass = 0.510998/1000.0;
236  protonMass = 938.27208/1000.0; // proton mass in GeV/c^2
237  kaonMass = 493.677/1000.0; //charged kaon mass in GeV/c^2
238  pionMass = 139.570/1000.0; //charged pion mass in GeV/c^2
239 
240 
241  //Check if there was a golden track in both arms
242  if (!theSHMSTrack || !theHMSTrack)
243  {
244  return 1;
245  }
246 
247  //Check if Database is reading the correct elec-arm particle mass
248  if (felecSpectro->GetParticleMass() > 0.00052) return 1;
249 
250  //SHMS arm
251  Double_t shms_xptar = theSHMSTrack->GetTTheta();
252  Double_t shms_dP = theSHMSTrack->GetDp();
253  Double_t SHMS_FPtime = theSHMSTrack->GetFPTime();
254 
255  //HMS arm
256  Double_t hms_xptar = theHMSTrack->GetTTheta();
257  Double_t hms_dP = theHMSTrack->GetDp();
258  Double_t hms_xfp = theHMSTrack->GetX();
259  Double_t hms_xpfp = theHMSTrack->GetTheta();
260  Double_t hms_ypfp = theHMSTrack->GetPhi();
261  Double_t HMS_FPtime = theHMSTrack->GetFPTime();
262 
263  if (SHMS_FPtime==-2000 || HMS_FPtime==-2000) return 1;
264  if (SHMS_FPtime==-1000 || HMS_FPtime==-1000) return 1;
265 
266  //Get raw TDC Times for HMS/SHMS (3/4 trigger)
271 
272  DeltaSHMSpathLength = .11*shms_xptar*1000 +0.057*shms_dP/100.;
273  DeltaHMSpathLength = -1.0*(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);
274  DeltaHMSpathLength = (.12*hms_xptar*1000 +0.17*hms_dP/100.);
275 
276  // default assume SHMS is electron arm
279  elec_P = theSHMSTrack->GetP(); //electron golden track arm momentum
280  had_P = theHMSTrack->GetP(); //hadron golden track arm momentum
281  Int_t sign=-1;
282  if (felecArmName=="H") {
283  ElecPathLength=HMScentralPathLen + DeltaHMSpathLength;
284  HadPathLength=SHMScentralPathLen + DeltaSHMSpathLength;
285  elec_P = theHMSTrack->GetP(); //electron golden track arm momentum
286  had_P = theSHMSTrack->GetP(); //hadron golden track arm momentum
287  sign=1;
288  }
289  //beta calculations beta = v/c = p/E
295 
296 
297  //Coincidence Corrections
298  elec_coinCorr = (ElecPathLength) / (lightSpeed * elecArm_BetaCalc );
299  had_coinCorr_proton = (HadPathLength) / (lightSpeed * hadArm_BetaCalc_proton );
300  had_coinCorr_Kaon = (HadPathLength)/ (lightSpeed * hadArm_BetaCalc_Kaon );
301  had_coinCorr_Pion = (HadPathLength)/ (lightSpeed * hadArm_BetaCalc_Pion );
303 
304  //Raw, Uncorrected Coincidence Time
305  fROC1_RAW_CoinTime = (pTRIG1_TdcTime_ROC1 + SHMS_FPtime) - (pTRIG4_TdcTime_ROC1 + HMS_FPtime);
306  fROC2_RAW_CoinTime = (pTRIG1_TdcTime_ROC2 + SHMS_FPtime) - (pTRIG4_TdcTime_ROC2 + HMS_FPtime);
307  fTRIG1_RAW_CoinTime = (pTRIG1_TdcTime_ROC1 + SHMS_FPtime) - (pTRIG1_TdcTime_ROC2 + HMS_FPtime);
308  fTRIG4_RAW_CoinTime = (pTRIG4_TdcTime_ROC1 + SHMS_FPtime) - (pTRIG4_TdcTime_ROC2 + HMS_FPtime);
309 
310  //Corrected Coincidence Time for ROC1/ROC2 (ROC1 Should be identical to ROC2)
311  //
312  //PROTON
317 
318  //KAON
323 
324  //PION
329 
330  //POSITRON
335 
336  return 0;
337 }
338 
339 //_____________________________________________________________________________
340 
Double_t had_coinCorr_proton
Definition: THcCoinTime.h:114
Double_t pionMass
Definition: THcCoinTime.h:74
Double_t fTRIG4_RAW_CoinTime
Definition: THcCoinTime.h:87
Double_t fTRIG4_ePiCoinTime
Definition: THcCoinTime.h:103
Double_t pTRIG1_TdcTime_ROC2
Definition: THcCoinTime.h:141
THaTrack * theSHMSTrack
Definition: THcCoinTime.h:61
const char Option_t
Double_t had_coinCorr_Kaon
Definition: THcCoinTime.h:117
Double_t hadArm_BetaCalc_Positron
Definition: THcCoinTime.h:124
Double_t fTRIG1_epCoinTime
Definition: THcCoinTime.h:92
int Int_t
virtual EStatus Init(const TDatime &run_time)
Definition: THcCoinTime.cxx:87
virtual Int_t DefineVariables(EMode mode=kDefine)
Double_t kaonMass
Definition: THcCoinTime.h:73
Double_t fTRIG4_epCoinTime
Definition: THcCoinTime.h:93
STL namespace.
void Reset(Option_t *opt="")
Definition: THcCoinTime.cxx:79
Double_t elecArm_BetaCalc
Definition: THcCoinTime.h:111
Double_t fROC2_RAW_CoinTime
Definition: THcCoinTime.h:85
Double_t had_xfp
Definition: THcCoinTime.h:133
THcHallCSpectrometer * fhadSpectro
Definition: THcCoinTime.h:57
const char * Data() const
Double_t fROC2_epCoinTime
Definition: THcCoinTime.h:91
Class for calculating and adding the Coincidence Time in the Tree.
Definition: THcCoinTime.h:29
Double_t elecMass
Definition: THcCoinTime.h:68
THcTrigDet * fCoinDet
Definition: THcCoinTime.h:59
virtual Int_t Process(const THaEvData &)
Double_t fROC1_epCoinTime
Definition: THcCoinTime.h:90
Double_t fROC1_eKCoinTime
Definition: THcCoinTime.h:95
Double_t elec_P
Definition: THcCoinTime.h:127
A mock detector to hold trigger related data.
Definition: THcTrigDet.h:16
VecExpr< UnaryOp< Sqrt< T >, SVector< T, D >, T >, T, D > sqrt(const SVector< T, D > &rhs)
THcHallCSpectrometer * felecSpectro
Definition: THcCoinTime.h:58
TString fCoinDetName
Definition: THcCoinTime.h:52
Double_t positronMass
Definition: THcCoinTime.h:69
Double_t fROC1_ePosCoinTime
Definition: THcCoinTime.h:105
THcCoinTime(const char *name, const char *description, const char *hadArmName="", const char *elecArmName="", const char *coinname="")
Definition: THcCoinTime.cxx:30
Double_t fROC2_eKCoinTime
Definition: THcCoinTime.h:96
Double_t hadArm_BetaCalc_proton
Definition: THcCoinTime.h:115
Double_t elec_coinCorr
Definition: THcCoinTime.h:110
Double_t fROC1_RAW_CoinTime
Definition: THcCoinTime.h:84
Double_t fROC2_ePiCoinTime
Definition: THcCoinTime.h:101
Double_t GetParticleMass() const
Double_t fTRIG1_RAW_CoinTime
Definition: THcCoinTime.h:86
Double_t pTRIG4_TdcTime_ROC1
Definition: THcCoinTime.h:140
TString felecArmName
Definition: THcCoinTime.h:54
Double_t hadArm_BetaCalc_Pion
Definition: THcCoinTime.h:121
Double_t pTRIG1_TdcTime_ROC1
Definition: THcCoinTime.h:139
Double_t lightSpeed
Definition: THcCoinTime.h:67
tuple list
Definition: SConscript.py:9
Double_t had_P
Definition: THcCoinTime.h:132
Double_t DeltaHMSpathLength
Definition: THcCoinTime.h:82
Int_t LoadParmValues(const DBRequest *list, const char *prefix="")
Retrieve parameter values from the parameter cache.
double Double_t
Double_t eHad_CT_Offset
Definition: THcCoinTime.h:76
Double_t HMScentralPathLen
Definition: THcCoinTime.h:79
Double_t fROC2_ePosCoinTime
Definition: THcCoinTime.h:106
Double_t fTRIG1_eKCoinTime
Definition: THcCoinTime.h:97
Double_t fTRIG4_ePosCoinTime
Definition: THcCoinTime.h:108
virtual ~THcCoinTime()
Definition: THcCoinTime.cxx:45
Double_t fTRIG4_eKCoinTime
Definition: THcCoinTime.h:98
Double_t SHMScentralPathLen
Definition: THcCoinTime.h:78
THaTrack * theHMSTrack
Definition: THcCoinTime.h:62
Double_t DeltaSHMSpathLength
Definition: THcCoinTime.h:81
ClassImp(THcDCLookupTTDConv) THcDCLookupTTDConv
Double_t had_coinCorr_Positron
Definition: THcCoinTime.h:123
Double_t fTRIG1_ePiCoinTime
Definition: THcCoinTime.h:102
void Clear(Option_t *opt="")
Definition: THcCoinTime.cxx:53
Double_t protonMass
Definition: THcCoinTime.h:72
Double_t Get_CT_Trigtime(Int_t ii)
Definition: THcTrigDet.h:36
Double_t fROC1_ePiCoinTime
Definition: THcCoinTime.h:100
Double_t hadArm_BetaCalc_Kaon
Definition: THcCoinTime.h:118
Double_t had_coinCorr_Pion
Definition: THcCoinTime.h:120
R__EXTERN class THcParmList * gHcParms
Definition: THcGlobals.h:11
virtual Int_t ReadDatabase(const TDatime &date)
static const Double_t kBig
Definition: THcFormula.cxx:31
TString fhadArmName
Definition: THcCoinTime.h:53
Double_t pTRIG4_TdcTime_ROC2
Definition: THcCoinTime.h:142
Double_t fTRIG1_ePosCoinTime
Definition: THcCoinTime.h:107
A standard Hall C spectrometer apparatus.