diff --git a/src/THcRaster.cxx b/src/THcRaster.cxx index 1347e499a7c4e6e5252b6c449a8b5d9e29296e49..ddd74320396bb159f311004294279cbe61171aa2 100644 --- a/src/THcRaster.cxx +++ b/src/THcRaster.cxx @@ -59,6 +59,8 @@ THcRaster::THcRaster( const char* name, const char* description, fXbeam_prev[nt] = 0; fYbeam_prev[nt] = 0; } + fXpbeam_prev = 0; + fYpbeam_prev = 0; BPMXA_raw = 0; BPMYA_raw = 0; BPMXB_raw = 0; @@ -201,14 +203,15 @@ Int_t THcRaster::ReadDatabase( const TDatime& date ) }; fgpbeam = 0.001; // - fgbpma_zpos = 370.82; - fgbpmb_zpos = 224.96 ;// cm - fgbpmc_zpos = 129.30 ;// cm + //positions of BPMs relative to target (from Fall 2018 survey) + fgbpma_zpos = 320.17; + fgbpmb_zpos = 224.81 ;// cm + fgbpmc_zpos = 129.38 ;// cm // Default offsets to zero and slopes to +/- 1 - fgbeam_xoff = 0.0; - fgbeam_xpoff = 0.0; - fgbeam_yoff = 0.0; - fgbeam_ypoff = 0.0; + fgbeam_xoff = -999.; + fgbeam_xpoff =-999.; + fgbeam_yoff = -999.; + fgbeam_ypoff =-999.; // fgbpmxa_off = 0.0; fgbpmxa_slope = -1.0; @@ -232,6 +235,22 @@ Int_t THcRaster::ReadDatabase( const TDatime& date ) THcAnalyzer *analyzer = dynamic_cast<THcAnalyzer*>(THcAnalyzer::GetInstance()); fEpicsHandler = analyzer->GetEpicsEvtHandler(); + + // + fFlag_use_EPICS_bpm = kFALSE; + if (fgbeam_xoff ==-999. && fgbeam_yoff ==-999.) { + fFlag_use_EPICS_bpm = kTRUE; + cout << " THcRaster is using EPICS bpm for beam position" << endl; + } else { + if (fgbeam_xoff ==-999.) fgbeam_xoff = 0.; + if (fgbeam_yoff ==-999.) fgbeam_yoff = 0.; + if (fgbeam_xpoff ==-999.) fgbeam_xpoff = 0.; + if (fgbeam_ypoff ==-999.) fgbeam_ypoff = 0.; + cout << " THcRaster is using parameters for beam position" << " x = " << fgbeam_xoff<< " y = " << fgbeam_yoff<< endl; + cout << " THcRaster is using parameters for beam angle position" << " xp = " << fgbeam_xpoff<< " yp = " << fgbeam_ypoff<< endl; + + } + return kOK; @@ -518,13 +537,19 @@ Int_t THcRaster::Process(){ // Use the A and C BPM information, as these are located downstream of the raster // magnets. If there is no BPM information available, assume zero offsets. // + Double_t xbeam; + Double_t ybeam; + Double_t xpbeam; + Double_t ypbeam; if (!checkBPM){ - fgbeam_xoff = BPMXA_pos - (BPMXA_pos - BPMXC_pos)/(fgbpma_zpos - fgbpmc_zpos)*fgbpma_zpos; - fgbeam_yoff = BPMYA_pos - (BPMYA_pos - BPMYC_pos)/(fgbpma_zpos - fgbpmc_zpos)*fgbpma_zpos; - fgbeam_xpoff = (fgbeam_xoff-BPMXA_pos)/fgbpma_zpos; - fgbeam_ypoff = (fgbeam_yoff-BPMYA_pos)/fgbpma_zpos; - fXbeam_prev[0]=fgbeam_xoff; - fYbeam_prev[0]=fgbeam_yoff; + xbeam = BPMXA_pos - (BPMXA_pos - BPMXC_pos)/(fgbpma_zpos - fgbpmc_zpos)*fgbpma_zpos; + ybeam = BPMYA_pos - (BPMYA_pos - BPMYC_pos)/(fgbpma_zpos - fgbpmc_zpos)*fgbpma_zpos; + xpbeam = (xbeam-BPMXA_pos)/fgbpma_zpos; + ypbeam = (ybeam-BPMYA_pos)/fgbpma_zpos; + fXbeam_prev[0]=xbeam; + fYbeam_prev[0]=ybeam; + fXpbeam_prev=xpbeam; + fYpbeam_prev=ypbeam; fXbeam_prev[1]=BPMXA_pos; fYbeam_prev[1]=BPMYA_pos; fXbeam_prev[2]=BPMXB_pos; @@ -534,21 +559,34 @@ Int_t THcRaster::Process(){ fEbeamEpics = fEbeamEpics_read; fEbeamEpics_prev=fEbeamEpics_read; }else{ - fgbeam_xoff = fXbeam_prev[0]; - fgbeam_yoff = fYbeam_prev[0]; + xbeam = fXbeam_prev[0]; + ybeam = fYbeam_prev[0]; + xpbeam = fXpbeam_prev; + ypbeam = fYpbeam_prev; BPMXA_pos=fXbeam_prev[1]; BPMYA_pos=fYbeam_prev[1]; BPMXB_pos=fXbeam_prev[2]; BPMYB_pos=fYbeam_prev[2]; BPMXC_pos=fXbeam_prev[3]; BPMYC_pos=fYbeam_prev[3]; - fgbeam_xpoff = 0; - fgbeam_ypoff = 0; fEbeamEpics = fEbeamEpics_prev; } - fXbpm_tar= -fgbeam_xoff; - fYbpm_tar= fgbeam_yoff; + + if (fFlag_use_EPICS_bpm) { + fXbpm_tar= -xbeam; // assumes the BPM calibration gives BPM with +X beam left (HARP coordinate system) + fYbpm_tar= ybeam; + fXpbpm_tar= -xpbeam; // assumes the BPM calibration gives BPM with +X beam left (HARP coordinate system) + fYpbpm_tar= ypbeam; + + } else { + fXbpm_tar= fgbeam_xoff; // +X beam right (EPICS coordinate system) + fYbpm_tar= fgbeam_yoff; + fXpbpm_tar= fgbeam_xpoff; // +X beam right (EPICS coordinate system) + fYpbpm_tar= fgbeam_ypoff; + } + + fXbpm_A= -fXbeam_prev[1]; fYbpm_A= fYbeam_prev[1]; fXbpm_B= -fXbeam_prev[2]; @@ -568,21 +606,21 @@ Int_t THcRaster::Process(){ //std::cout << "Raster X distance = " << fgfrx_dist << std::endl; //std::cout << "Raster Y distance = " << fgfry_dist << std::endl; - Double_t tt = fgbeam_xpoff; - Double_t tp = fgbeam_ypoff; + Double_t tt = fXpbpm_tar; + Double_t tp = fYpbpm_tar; if(fgusefr != 0) { - fPosition[0].SetXYZ(fgbeam_xoff, fgbeam_yoff, 0.0); - fPosition[1].SetXYZ((-1.)*(fXA_pos)+fgbeam_xoff, fYA_pos+fgbeam_yoff, 0.0); - fPosition[2].SetXYZ((-1.)*(fXB_pos)+fgbeam_xoff, fYB_pos+fgbeam_yoff, 0.0); - tt = (-1.)*fXA_pos/fgfrx_dist+fgbeam_xpoff; - tp = fYA_pos/fgfry_dist+fgbeam_ypoff; + fPosition[0].SetXYZ(-fXbpm_tar, fYbpm_tar, 0.0); + fPosition[1].SetXYZ((-1.)*(fXA_pos)-fXbpm_tar, fYA_pos+fYbpm_tar, 0.0); + fPosition[2].SetXYZ((-1.)*(fXB_pos)-fXbpm_tar, fYB_pos+fYbpm_tar, 0.0); + tt = (-1.)*fXA_pos/fgfrx_dist-fXpbpm_tar; + tp = fYA_pos/fgfry_dist+fYpbpm_tar; fDirection.SetXYZ(tt, tp ,1.0); // Set arbitrarily to avoid run time warnings fDirection *= 1.0/TMath::Sqrt(1.0+tt*tt+tp*tp); } else { // Just use fixed beam position and angle - fPosition[0].SetXYZ(fgbeam_xoff, fgbeam_yoff, 0.0); - fPosition[1].SetXYZ(fgbeam_xoff, fgbeam_yoff, 0.0); - fPosition[2].SetXYZ(fgbeam_xoff, fgbeam_yoff, 0.0); + fPosition[0].SetXYZ(-fXbpm_tar, fYbpm_tar, 0.0); + fPosition[1].SetXYZ(-fXbpm_tar, fYbpm_tar, 0.0); + fPosition[2].SetXYZ(-fXbpm_tar, fYbpm_tar, 0.0); fDirection.SetXYZ(tt, tp ,1.0); // Set arbitrarily to avoid run time warnings fDirection *= 1.0/TMath::Sqrt(1.0+tt*tt+tp*tp); } diff --git a/src/THcRaster.h b/src/THcRaster.h index 13b19f248a13d3806a58496319048226d8066a8d..a30aa742e95de64053103e676b93d87b0738eec5 100644 --- a/src/THcRaster.h +++ b/src/THcRaster.h @@ -109,6 +109,8 @@ class THcRaster : public THaBeamDet, public THcHitList { Double_t fYB_pos; // YB position Double_t fXbpm_tar; // X BPM at target (+X is beam right) Double_t fYbpm_tar; // Y BPM at target (+Y is up) + Double_t fXpbpm_tar; // Xp BPM at target (+X is beam right) + Double_t fYpbpm_tar; // Yp BPM at target (+Y is up) Double_t fXbpm_A; // X BPM at BPMA (+X is beam right) Double_t fYbpm_A; // Y BPM at BPMA (+Y is up) Double_t fXbpm_B; // X BPM at BPMB (+X is beam right) @@ -117,6 +119,9 @@ class THcRaster : public THaBeamDet, public THcHitList { Double_t fYbpm_C; // Y BPM at BPMC (+Y is up) Double_t fXbeam_prev[4]; // Double_t fYbeam_prev[4]; // + Double_t fXpbeam_prev; // + Double_t fYpbeam_prev; // + Bool_t fFlag_use_EPICS_bpm; // Double_t fEbeamEpics; Double_t fEbeamEpics_read;