12 #include <JANA/JGeometryXML.h>
20 #define M_TWO_PI 6.28318530717958647692
31 this->runnumber = runnumber;
32 this->materialmaps_read =
false;
33 this->materials_read =
false;
35 pthread_mutex_init(&bfield_mutex, NULL);
36 pthread_mutex_init(&materialmap_mutex, NULL);
37 pthread_mutex_init(&materials_mutex, NULL);
47 pthread_mutex_lock(&materials_mutex);
48 for(
unsigned int i=0; i<materials.size(); i++)
delete materials[i];
50 pthread_mutex_unlock(&materials_mutex);
52 pthread_mutex_lock(&materialmap_mutex);
53 for(
unsigned int i=0; i<materialmaps.size(); i++)
delete materialmaps[i];
55 pthread_mutex_unlock(&materialmap_mutex);
63 pthread_mutex_lock(&bfield_mutex);
65 pthread_mutex_unlock(&bfield_mutex);
104 pthread_mutex_lock(&materialmap_mutex);
105 if(materialmaps_read){
107 pthread_mutex_unlock(&materialmap_mutex);
111 JCalibration * jcalib =
dapp->GetJCalibration(runnumber);
113 _DBG_<<
"ERROR: Unable to get JCalibration object!"<<endl;
114 pthread_mutex_unlock(&materialmap_mutex);
123 vector<string> namepaths;
124 jcalib->GetListOfNamepaths(namepaths);
125 vector<string> material_namepaths;
126 for(
unsigned int i=0; i<namepaths.size(); i++){
127 if(namepaths[i].find(
"Material/material_map")==0)material_namepaths.push_back(namepaths[i]);
131 sort(material_namepaths.begin(), material_namepaths.end());
134 if(material_namepaths.size()==0){
135 jerr<<
"No material maps found in calibration DB!!"<<endl;
136 pthread_mutex_unlock(&materialmap_mutex);
139 jout<<
"Found "<<material_namepaths.size()<<
" material maps in calib. DB"<<endl;
142 jout<<
"Will read in the following:"<<endl;
143 for(
unsigned int i=0; i<material_namepaths.size(); i++){
144 jout<<
" "<<material_namepaths[i]<<endl;
149 uint32_t Npoints_total=0;
151 for(
unsigned int i=0; i<material_namepaths.size(); i++){
162 materialmaps.push_back(mat);
163 Npoints_total += (
unsigned int)(mat->
GetNr()*mat->
GetNz());
166 jout<<
"Read in "<<materialmaps.size()<<
" material maps for run "<<runnumber<<
" containing "<<Npoints_total<<
" grid points total"<<endl;
169 materialmaps_read =
true;
170 pthread_mutex_unlock(&materialmap_mutex);
199 matched_xpaths.clear();
202 JGeometryXML *jgeomxml =
dynamic_cast<JGeometryXML*
>(jgeom);
206 string unused_string;
207 unsigned int unused_int;
208 jgeomxml->ParseXPath(xpath, target, unused_string, unused_int);
211 vector<string> allxpaths;
212 jgeom->GetXPaths(allxpaths, JGeometry::attr_level_all);
215 for(
unsigned int i=0; i<allxpaths.size(); i++);
222 double &rhoZ_overA,
double &LnI,
223 double &
X0,
double *s_to_boundary)
const
227 for(
unsigned int i=0; i<materialmaps.size(); i++){
228 jerror_t err = materialmaps[i]->FindMatALT1(pos,KrhoZ_overA, rhoZ_overA,LnI,X0);
236 if(s_to_boundary==NULL)
return NOERROR;
237 *s_to_boundary = 1.0E6;
238 for(
unsigned int j=0; j<=i; j++){
239 double s = materialmaps[j]->EstimatedDistanceToBoundary(pos, mom);
240 if(s<*s_to_boundary)*s_to_boundary = s;
245 return RESOURCE_UNAVAILABLE;
257 double &LnI,
double &Z,
258 double &chi2c_factor,
double &chi2a_factor,
260 unsigned int &last_index,
261 double *s_to_boundary)
const
266 for(
unsigned int i=last_index; i<materialmaps.size(); i++){
267 jerror_t err = materialmaps[i]->FindMatKalman(pos,KrhoZ_overA,
268 rhoZ_overA,LnI,chi2c_factor,
269 chi2a_factor,chi2a_corr,Z);
271 if(i==materialmaps.size()-1) last_index=0;
273 if(s_to_boundary==NULL)
return NOERROR;
275 *s_to_boundary = 1.0E6;
279 for(
unsigned int j=0; j<materialmaps.size();j++){
280 double s = materialmaps[j]->EstimatedDistanceToBoundary(pos, mom);
281 if(s<*s_to_boundary){
288 double s = materialmaps[last_index]->EstimatedDistanceToBoundary(pos, mom);
289 if(s<*s_to_boundary)*s_to_boundary = s;
295 return RESOURCE_UNAVAILABLE;
302 double &LnI,
double &Z,
double &chi2c_factor,
303 double &chi2a_factor,
double &chi2a_corr,
304 unsigned int &last_index)
const
309 for(
unsigned int i=last_index; i<materialmaps.size(); i++){
310 jerror_t err = materialmaps[i]->FindMatKalman(pos,KrhoZ_overA,
312 chi2c_factor,chi2a_factor,
315 if(i==materialmaps.size()-1) last_index=0;
321 return RESOURCE_UNAVAILABLE;
331 for(
unsigned int i=0; i<materialmaps.size(); i++){
332 jerror_t err = materialmaps[i]->FindMat(pos, rhoZ_overA, rhoZ_overA_logI, RadLen);
333 if(err==NOERROR)
return NOERROR;
335 return RESOURCE_UNAVAILABLE;
345 for(
unsigned int i=0; i<materialmaps.size(); i++){
346 jerror_t err = materialmaps[i]->FindMat(pos, density, A, Z, RadLen);
347 if(err==NOERROR)
return NOERROR;
349 return RESOURCE_UNAVAILABLE;
367 for(
unsigned int i=0; i<materialmaps.size(); i++){
369 if(map->
IsInMap(pos))
return map;
404 pthread_mutex_lock(&materials_mutex);
405 if(!materials_read) GetMaterials();
406 pthread_mutex_unlock(&materials_mutex);
408 for(
unsigned int i=0; i<materials.size(); i++){
409 if(materials[i]->GetName() == name)
return materials[i];
426 string filter =
"//materials/element/real[@name=\"radlen\"]";
429 vector<string> xpaths;
430 jgeom->GetXPaths(xpaths, JGeometry::attr_level_all, filter);
433 for(
unsigned int i=0; i<xpaths.size(); i++){
435 string::size_type pos = xpaths[i].find(
"/element[");
436 if(pos == string::npos)
continue;
439 string::size_type start_pos = xpaths[i].find(
"@name=", pos);
440 start_pos = xpaths[i].find(
"'", start_pos);
441 string::size_type end_pos = xpaths[i].find(
"'", start_pos+1);
442 if(end_pos==string::npos)
continue;
443 string name = xpaths[i].substr(start_pos+1, end_pos-(start_pos+1));
449 sprintf(xpath,
"//materials/element[@name='%s']/[@a]", name.c_str());
450 if(!Get(xpath, A))
continue;
453 sprintf(xpath,
"//materials/element[@name='%s']/[@z]", name.c_str());
454 if(!Get(xpath, Z))
continue;
457 sprintf(xpath,
"//materials/element[@name='%s']/real[@name='density']/[@value]", name.c_str());
458 if(!Get(xpath, density))
continue;
461 sprintf(xpath,
"//materials/element[@name='%s']/real[@name='radlen']/[@value]", name.c_str());
462 if(!Get(xpath, radlen))
continue;
465 materials.push_back(mat);
471 filter =
"//materials/composite[@name]";
474 jgeom->GetXPaths(xpaths, JGeometry::attr_level_all, filter);
477 for(
unsigned int i=0; i<xpaths.size(); i++){
479 string::size_type pos = xpaths[i].find(
"/composite[");
480 if(pos == string::npos)
continue;
483 string::size_type start_pos = xpaths[i].find(
"@name=", pos);
484 start_pos = xpaths[i].find(
"'", start_pos);
485 string::size_type end_pos = xpaths[i].find(
"'", start_pos+1);
486 if(end_pos==string::npos)
continue;
487 string name = xpaths[i].substr(start_pos+1, end_pos-(start_pos+1));
489 if(GetDMaterial(name))
continue;
500 sprintf(xpath,
"//materials/composite[@name='%s']/real[@name='density']/[@value]", name.c_str());
501 found_all &= Get(xpath, density);
504 sprintf(xpath,
"//materials/composite[@name='%s']/real[@name='radlen']/[@value]", name.c_str());
505 found_all &= Get(xpath, radlen);
509 if(!found_all)found_all = GetCompositeMaterial(name, density, radlen);
513 if(!found_all)
continue;
516 materials.push_back(mat);
521 materials_read =
true;
531 sprintf(filter,
"//materials/composite[@name='%s']/addmaterial/fractionmass[@fraction]", name.c_str());
532 vector<string> xpaths;
533 jgeom->GetXPaths(xpaths, JGeometry::attr_level_all, filter);
536 _DBG_<<
"Components for compsite "<<name<<endl;
537 for(
unsigned int i=0; i<xpaths.size(); i++){
539 string::size_type start_pos = xpaths[i].find(
"@material=", 0);
540 start_pos = xpaths[i].find(
"'", start_pos);
541 string::size_type end_pos = xpaths[i].find(
"'", start_pos+1);
542 if(end_pos==string::npos)
continue;
543 string mat_name = xpaths[i].substr(start_pos+1, end_pos-(start_pos+1));
546 start_pos = xpaths[i].find(
"fractionmass[", 0);
547 start_pos = xpaths[i].find(
"@fraction=", start_pos);
548 start_pos = xpaths[i].find(
"'", start_pos);
549 end_pos = xpaths[i].find(
"'", start_pos+1);
550 if(end_pos==string::npos)
continue;
551 string mat_frac_str = xpaths[i].substr(start_pos+1, end_pos-(start_pos+1));
552 double fractionmass = atof(mat_frac_str.c_str());
554 _DBG_<<
" "<<xpaths[i]<<
" fractionmass="<<fractionmass<<endl;
584 double zcenter,
double dz,
585 vector<vector<cdc_offset_t> >&cdc_offsets,
586 vector<DCDCWire*> &stereowires,
587 vector<double>&rot_angles,
double dx,
589 stringstream r_z_s,phi0_s,rot_s;
592 r_z_s <<
"//mposPhi[@volume='CDCstrawLong']/@R_Z/ring[@value='" << ring <<
"']";
593 phi0_s <<
"//mposPhi[@volume='CDCstrawLong']/@Phi0/ring[@value='" << ring <<
"']";
594 rot_s <<
"//mposPhi[@volume='CDCstrawLong']/@rot/ring[@value='" << ring <<
"']";
601 if(!Get(r_z_s.str(), r_z))
return false;
602 if(!Get(phi0_s.str(), phi0))
return false;
603 if(!Get(rot_s.str(), rot))
return false;
606 const double deg2rad=M_PI/180.;
607 double dphi=2*M_PI/double(ncopy);
611 double stereo=0.,stereo_sign=1.;
612 stereo=deg2rad*rot[0];
613 if (stereo<0.) stereo_sign=-1.;
616 for (
unsigned int i=0;i<ncopy;i++){
618 double phi=phi0+double(i)*dphi;
624 origin.SetX(r_z[0]*cos(phi)+dx);
625 origin.SetY(r_z[0]*
sin(phi)+dy);
626 origin.SetZ(zcenter);
634 udir.SetXYZ(0.0, 0.0,1.0);
635 udir.RotateX(stereo);
639 double half_dz=0.5*dz;
640 double x0=origin.x(),y0=origin.y();
641 double ux=udir.x()/udir.z();
642 double uy=udir.y()/udir.z();
643 unsigned int ringid=ring-1;
644 DVector3 downstream(x0+half_dz*ux+cdc_offsets[ringid][i].dx_d,
645 y0+half_dz*uy+cdc_offsets[ringid][i].dy_d,
647 DVector3 upstream(x0-half_dz*ux+cdc_offsets[ringid][i].dx_u,
648 y0-half_dz*uy+cdc_offsets[ringid][i].dy_u,
650 w->
origin=0.5*(upstream+downstream);
651 w->
origin.RotateX(rot_angles[0]);
652 w->
origin.RotateY(rot_angles[1]);
653 w->
origin.RotateZ(rot_angles[2]);
658 w->
udir=downstream-upstream;
659 w->
udir.RotateX(rot_angles[0]);
660 w->
udir.RotateY(rot_angles[1]);
661 w->
udir.RotateZ(rot_angles[2]);
674 w->
x0=dx; w->
y0=dy; w->
z0=zcenter;
675 w->
phiX=rot_angles[0]; w->
phiY=rot_angles[1]; w->
phiZ=rot_angles[2];
678 stereowires.push_back(w);
689 double zcenter,
double dz,
690 vector<vector<cdc_offset_t> >&cdc_offsets,
691 vector<DCDCWire*> &axialwires,
692 vector<double>&rot_angles,
double dx,
694 stringstream phi0_s,r_z_s;
697 phi0_s <<
"//mposPhi[@volume='CDCstrawShort']/@Phi0/ring[@value='" << ring <<
"']";
698 r_z_s <<
"//mposPhi[@volume='CDCstrawShort']/@R_Z/ring[@value='" << ring <<
"']";
704 if(!Get(phi0_s.str(), phi0))
return false;
705 if(!Get(r_z_s.str(), r_z))
return false;
708 double dphi=2*M_PI/double(ncopy);
712 for (
unsigned int i=0;i<ncopy;i++){
714 double phi=phi0+double(i)*dphi;
719 double x0=r_z[0]*cos(phi)+dx;
720 double y0=r_z[0]*
sin(phi)+dy;
723 double half_dz=0.5*dz;
724 unsigned int ringid=ring-1;
725 DVector3 downstream(x0+cdc_offsets[ringid][i].dx_d,
726 y0+cdc_offsets[ringid][i].dy_d,
728 DVector3 upstream(x0+cdc_offsets[ringid][i].dx_u,
729 y0+cdc_offsets[ringid][i].dy_u,
731 w->
origin=0.5*(upstream+downstream);
732 w->
origin.RotateX(rot_angles[0]);
733 w->
origin.RotateY(rot_angles[1]);
734 w->
origin.RotateZ(rot_angles[2]);
743 w->
udir=downstream-upstream;
744 w->
udir.RotateX(rot_angles[0]);
745 w->
udir.RotateY(rot_angles[1]);
746 w->
udir.RotateZ(rot_angles[2]);
760 w->
x0=dx; w->
y0=dy; w->
z0=zcenter;
761 w->
phiX=rot_angles[0]; w->
phiY=rot_angles[1]; w->
phiZ=rot_angles[2];
764 axialwires.push_back(w);
775 vector<double>cdc_origin;
776 vector<double>cdc_length;
777 Get(
"//posXYZ[@volume='CentralDC']/@X_Y_Z",cdc_origin);
778 Get(
"//tubs[@name='STRW']/@Rio_Z",cdc_length);
781 vector<double>rot_angles;
782 Get(
"//posXYZ[@volume='CentralDC']/@rot", rot_angles);
783 rot_angles[0]*=M_PI/180.;
784 rot_angles[1]*=M_PI/180.;
785 rot_angles[2]*=M_PI/180.;
787 double dX=0.0, dY=0.0, dZ=0.0;
788 double dPhiX=0.0,dPhiY=0.0,dPhiZ=0.0;
790 JCalibration * jcalib =
dapp->GetJCalibration(runnumber);
791 vector<map<string,double> >vals;
792 if (jcalib->Get(
"CDC/global_alignment",vals)==
false){
793 map<string,double> &row = vals[0];
809 rot_angles[0]+=dPhiX;
810 rot_angles[1]+=dPhiY;
811 rot_angles[2]+=dPhiZ;
813 double zmin=cdc_origin[2];
814 double zmax=zmin+cdc_length[2];
815 double zcenter=0.5*(zmin+
zmax);
819 unsigned int numstraws[28];
820 stringstream ncopy_s;
823 for (
unsigned int ring=1;ring<=28;ring++){
825 ncopy_s <<
"//section[@name='CentralDC']/composition/mposPhi/@ncopy/ring[@value='" << ring <<
"']";
826 Get(ncopy_s.str(),numstraws[ring-1]);
832 vector<cdc_offset_t>tempvec;
833 vector<vector<cdc_offset_t> >cdc_offsets;
835 if (jcalib->Get(
"CDC/wire_alignment",vals)==
false){
836 unsigned int straw_count=0,ring_count=0;
837 for(
unsigned int i=0; i<vals.size(); i++){
838 map<string,double> &row = vals[i];
841 if (straw_count==numstraws[ring_count]){
845 cdc_offsets.push_back(tempvec);
852 temp.
dx_u=row[
"dxu"];
855 temp.
dy_u=row[
"dyu"];
858 temp.
dx_d=row[
"dxd"];
861 temp.
dy_d=row[
"dyd"];
864 tempvec.push_back(temp);
868 cdc_offsets.push_back(tempvec);
871 jerr<<
"CDC wire alignment table not available... bailing... " <<endl;
876 for (
unsigned int ring=1;ring<5;ring++){
877 vector<DCDCWire*>straws;
878 if (!GetCDCAxialWires(ring,numstraws[ring-1],zcenter,L,cdc_offsets,straws,
879 rot_angles,cdc_origin[0],cdc_origin[1]))
return false;
880 cdcwires.push_back(straws);
884 for (
unsigned int i=0;i<8;i++){
885 vector<DCDCWire*>straws;
886 if (!GetCDCStereoWires(i+5,numstraws[i+4],zcenter,L,cdc_offsets,straws,
887 rot_angles,cdc_origin[0],cdc_origin[1]))
return false;
888 cdcwires.push_back(straws);
892 for (
unsigned int ring=13;ring<17;ring++){
893 vector<DCDCWire*>straws;
894 if (!GetCDCAxialWires(ring,numstraws[ring-1],zcenter,L,cdc_offsets,straws,
895 rot_angles,cdc_origin[0],cdc_origin[1]))
return false;
896 cdcwires.push_back(straws);
900 for (
unsigned int i=8;i<16;i++){
901 vector<DCDCWire*>straws;
902 if (!GetCDCStereoWires(i+9,numstraws[i+8],zcenter,L,cdc_offsets,straws,
903 rot_angles,cdc_origin[0],cdc_origin[1]))
return false;
904 cdcwires.push_back(straws);
908 for (
unsigned int ring=25;ring<29;ring++){
909 vector<DCDCWire*>straws;
910 if (!GetCDCAxialWires(ring,numstraws[ring-1],zcenter,L,cdc_offsets,straws,
911 rot_angles,cdc_origin[0],cdc_origin[1]))
return false;
912 cdcwires.push_back(straws);
916 for (
unsigned int i=0;i<cdcwires.size();i++){
917 for (
unsigned int j=0;j<cdcwires[i].size();j++){
980 JCalibration * jcalib =
dapp->GetJCalibration(runnumber);
981 vector<map<string,double> >vals;
982 vector<fdc_cathode_offset_t>fdc_cathode_offsets;
983 if (jcalib->Get(
"FDC/cathode_alignment",vals)==
false){
984 for(
unsigned int i=0; i<vals.size(); i++){
985 map<string,double> &row = vals[i];
992 temp.
dphi=row[
"dPhiU"];
995 fdc_cathode_offsets.push_back(temp);
1000 temp.
dphi=row[
"dPhiV"];
1003 fdc_cathode_offsets.push_back(temp);
1006 vector< vector<double> >fdc_cathode_pitches;
1007 if (jcalib->Get(
"FDC/strip_pitches_v2",vals)==
false){
1008 for(
unsigned int i=0; i<vals.size(); i++){
1009 map<string,double> &row = vals[i];
1011 vector<double> uvals;
1013 uvals.push_back(row[
"U_SP_1"]);
1014 uvals.push_back(row[
"U_G_1"]);
1015 uvals.push_back(row[
"U_SP_2"]);
1016 uvals.push_back(row[
"U_G_2"]);
1017 uvals.push_back(row[
"U_SP_3"]);
1019 fdc_cathode_pitches.push_back(uvals);
1021 vector<double> vvals;
1023 vvals.push_back(row[
"V_SP_1"]);
1024 vvals.push_back(row[
"V_G_1"]);
1025 vvals.push_back(row[
"V_SP_2"]);
1026 vvals.push_back(row[
"V_G_2"]);
1027 vvals.push_back(row[
"V_SP_3"]);
1029 fdc_cathode_pitches.push_back(vvals);
1033 jerr <<
"Strip pitch calibration unavailable -- setting default..." <<endl;
1038 for (
int j = 0; j < 5; j++){
1042 fdc_cathode_pitches.push_back(val);
1050 angle+=fdc_cathode_offsets[i].dphi;
1051 double SP1 = fdc_cathode_pitches[i][0];
1052 double SG1 = fdc_cathode_pitches[i][1];
1053 double SP2 = fdc_cathode_pitches[i][2];
1054 double SG2 = fdc_cathode_pitches[i][3];
1055 double SP3 = fdc_cathode_pitches[i][4];
1057 vector<DFDCCathode *>
temp;
1063 if (j<48) c->
u=(-47.5*SP2 - SG1 + (j-47)*SP1) + fdc_cathode_offsets[i].du;
1064 else if (j<144) c->
u=(double(j)-95.5)*SP2 + fdc_cathode_offsets[i].du;
1065 else c->
u=(47.5*SP2 + SG2 + (j-144)*SP3) + fdc_cathode_offsets[i].du;
1069 fdccathodes.push_back(temp);
1080 vector<double>z_wires;
1081 vector<double>stereo_angles;
1083 if(!GetFDCZ(z_wires))
return false;
1084 if(!GetFDCStereo(stereo_angles))
return false;
1087 double ThetaX[4],ThetaY[4],ThetaZ[4];
1088 vector<double>rot_angles;
1089 Get(
"//posXYZ[@volume='forwardDC_package_1']/@rot", rot_angles);
1090 ThetaX[0]=rot_angles[0]*M_PI/180.;
1091 ThetaY[0]=rot_angles[1]*M_PI/180.;
1092 ThetaZ[0]=rot_angles[2]*M_PI/180.;
1093 Get(
"//posXYZ[@volume='forwardDC_package_2']/@rot", rot_angles);
1094 ThetaX[1]=rot_angles[0]*M_PI/180.;
1095 ThetaY[1]=rot_angles[1]*M_PI/180.;
1096 ThetaZ[1]=rot_angles[2]*M_PI/180.;
1097 Get(
"//posXYZ[@volume='forwardDC_package_3']/@rot", rot_angles);
1098 ThetaX[2]=rot_angles[0]*M_PI/180.;
1099 ThetaY[2]=rot_angles[1]*M_PI/180.;
1100 ThetaZ[2]=rot_angles[2]*M_PI/180.;
1101 Get(
"//posXYZ[@volume='forwardDC_package_4']/@rot", rot_angles);
1102 ThetaX[3]=rot_angles[0]*M_PI/180.;
1103 ThetaY[3]=rot_angles[1]*M_PI/180.;
1104 ThetaZ[3]=rot_angles[2]*M_PI/180.;
1108 Get(
"//posXYZ[@volume='forwardDC_package_1']/@X_Y_Z",offsets);
1111 Get(
"//posXYZ[@volume='forwardDC_package_2']/@X_Y_Z",offsets);
1114 Get(
"//posXYZ[@volume='forwardDC_package_3']/@X_Y_Z",offsets);
1117 Get(
"//posXYZ[@volume='forwardDC_package_4']/@X_Y_Z",offsets);
1122 JCalibration * jcalib =
dapp->GetJCalibration(runnumber);
1123 vector<map<string,double> >vals;
1124 vector<fdc_wire_offset_t>fdc_wire_offsets;
1125 if (jcalib->Get(
"FDC/wire_alignment",vals)==
false){
1126 for(
unsigned int i=0; i<vals.size(); i++){
1127 map<string,double> &row = vals[i];
1134 temp.
dphi=row[
"dPhi"];
1140 fdc_wire_offsets.push_back(temp);
1144 vector<fdc_wire_rotation_t>fdc_wire_rotations;
1145 if (jcalib->Get(
"FDC/cell_rotations",vals)==
false){
1146 for(
unsigned int i=0; i<vals.size(); i++){
1147 map<string,double> &row = vals[i];
1151 temp.
dPhiX=row[
"dPhiX"];
1152 temp.
dPhiY=row[
"dPhiY"];
1153 temp.
dPhiZ=row[
"dPhiZ"];
1155 fdc_wire_rotations.push_back(temp);
1161 double angle=-stereo_angles[i]*M_PI/180.+fdc_wire_offsets[i].dphi;
1163 vector<DFDCWire *>
temp;
1165 unsigned int pack_id=i/6;
1174 w->
u=u+fdc_wire_offsets[i].du;
1180 float x = u*
sin(angle + M_PI/2.0);
1181 float y = u*cos(angle + M_PI/2.0);
1182 w->
origin.SetXYZ(x,y,0.);
1183 w->
origin.RotateX(ThetaX[pack_id]+fdc_wire_rotations[i].dPhiX);
1184 w->
origin.RotateY(ThetaY[pack_id]+fdc_wire_rotations[i].dPhiY);
1185 w->
origin.RotateZ(ThetaZ[pack_id]+fdc_wire_rotations[i].dPhiZ);
1186 DVector3 globalOffsets(dX[pack_id],dY[pack_id],z_wires[i]+fdc_wire_offsets[i].dz);
1187 w->
origin+=globalOffsets;
1194 w->
udir.SetXYZ(
sin(angle),cos(angle),0.0);
1195 w->
udir.RotateX(ThetaX[pack_id]+fdc_wire_rotations[i].dPhiX);
1196 w->
udir.RotateY(ThetaY[pack_id]+fdc_wire_rotations[i].dPhiY);
1197 w->
udir.RotateZ(ThetaZ[pack_id]+fdc_wire_rotations[i].dPhiZ);
1198 w->
angles.SetXYZ(ThetaX[pack_id]+fdc_wire_rotations[i].dPhiX,
1199 ThetaY[pack_id]+fdc_wire_rotations[i].dPhiY,
1200 ThetaZ[pack_id]+fdc_wire_rotations[i].dPhiZ);
1201 w->
u+=dX[pack_id]*w->
udir.y()-dY[pack_id]*w->
udir.x();
1206 w->
sdir.SetMag(1.0);
1209 w->
tdir.SetMag(1.0);
1232 vector<double> ForwardDC;
1233 vector<double> forwardDC;
1234 vector<double> forwardDC_package[4];
1235 vector<double> forwardDC_module[4];
1236 vector<double> forwardDC_chamber[4][6];
1238 if(!Get(
"//section/composition/posXYZ[@volume='ForwardDC']/@X_Y_Z", ForwardDC))
return false;
1239 if(!Get(
"//composition[@name='ForwardDC']/posXYZ[@volume='forwardDC']/@X_Y_Z", forwardDC))
return false;
1240 if(!Get(
"//posXYZ[@volume='forwardDC_package_1']/@X_Y_Z", forwardDC_package[0]))
return false;
1241 if(!Get(
"//posXYZ[@volume='forwardDC_package_2']/@X_Y_Z", forwardDC_package[1]))
return false;
1242 if(!Get(
"//posXYZ[@volume='forwardDC_package_3']/@X_Y_Z", forwardDC_package[2]))
return false;
1243 if(!Get(
"//posXYZ[@volume='forwardDC_package_4']/@X_Y_Z", forwardDC_package[3]))
return false;
1244 if(!Get(
"//posXYZ[@volume='forwardDC_module_1']/@X_Y_Z", forwardDC_module[0]))
return false;
1245 if(!Get(
"//posXYZ[@volume='forwardDC_module_2']/@X_Y_Z", forwardDC_module[1]))
return false;
1246 if(!Get(
"//posXYZ[@volume='forwardDC_module_3']/@X_Y_Z", forwardDC_module[2]))
return false;
1247 if(!Get(
"//posXYZ[@volume='forwardDC_module_4']/@X_Y_Z", forwardDC_module[3]))
return false;
1248 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@X_Y_Z/layer[@value='1']", forwardDC_chamber[0][0]))
return false;
1249 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@X_Y_Z/layer[@value='2']", forwardDC_chamber[0][1]))
return false;
1250 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@X_Y_Z/layer[@value='3']", forwardDC_chamber[0][2]))
return false;
1251 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@X_Y_Z/layer[@value='4']", forwardDC_chamber[0][3]))
return false;
1252 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@X_Y_Z/layer[@value='5']", forwardDC_chamber[0][4]))
return false;
1253 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@X_Y_Z/layer[@value='6']", forwardDC_chamber[0][5]))
return false;
1254 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@X_Y_Z/layer[@value='1']", forwardDC_chamber[1][0]))
return false;
1255 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@X_Y_Z/layer[@value='2']", forwardDC_chamber[1][1]))
return false;
1256 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@X_Y_Z/layer[@value='3']", forwardDC_chamber[1][2]))
return false;
1257 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@X_Y_Z/layer[@value='4']", forwardDC_chamber[1][3]))
return false;
1258 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@X_Y_Z/layer[@value='5']", forwardDC_chamber[1][4]))
return false;
1259 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@X_Y_Z/layer[@value='6']", forwardDC_chamber[1][5]))
return false;
1260 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@X_Y_Z/layer[@value='1']", forwardDC_chamber[2][0]))
return false;
1261 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@X_Y_Z/layer[@value='2']", forwardDC_chamber[2][1]))
return false;
1262 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@X_Y_Z/layer[@value='3']", forwardDC_chamber[2][2]))
return false;
1263 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@X_Y_Z/layer[@value='4']", forwardDC_chamber[2][3]))
return false;
1264 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@X_Y_Z/layer[@value='5']", forwardDC_chamber[2][4]))
return false;
1265 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@X_Y_Z/layer[@value='6']", forwardDC_chamber[2][5]))
return false;
1266 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@X_Y_Z/layer[@value='1']", forwardDC_chamber[3][0]))
return false;
1267 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@X_Y_Z/layer[@value='2']", forwardDC_chamber[3][1]))
return false;
1268 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@X_Y_Z/layer[@value='3']", forwardDC_chamber[3][2]))
return false;
1269 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@X_Y_Z/layer[@value='4']", forwardDC_chamber[3][3]))
return false;
1270 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@X_Y_Z/layer[@value='5']", forwardDC_chamber[3][4]))
return false;
1271 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@X_Y_Z/layer[@value='6']", forwardDC_chamber[3][5]))
return false;
1274 double zfdc = ForwardDC[2] + forwardDC[2];
1277 for(
int package=1; package<=4; package++){
1278 double z_package = forwardDC_package[package-1][2];
1282 double z_module = forwardDC_module[package-1][2];
1285 for(
int chamber=1; chamber<=6; chamber++){
1286 double z_chamber = forwardDC_chamber[package-1][chamber-1][2];
1288 double z = zfdc + z_package + z_module + z_chamber;
1289 z_wires.push_back(z);
1313 vector<double> forwardDC_module[4];
1314 vector<double> forwardDC_chamber[4][6];
1316 if(!Get(
"//posXYZ[@volume='forwardDC_module_1']/@X_Y_Z", forwardDC_module[0]))
return false;
1317 if(!Get(
"//posXYZ[@volume='forwardDC_module_2']/@X_Y_Z", forwardDC_module[1]))
return false;
1318 if(!Get(
"//posXYZ[@volume='forwardDC_module_3']/@X_Y_Z", forwardDC_module[2]))
return false;
1319 if(!Get(
"//posXYZ[@volume='forwardDC_module_4']/@X_Y_Z", forwardDC_module[3]))
return false;
1320 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@rot/layer[@value='1']", forwardDC_chamber[0][0]))
return false;
1321 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@rot/layer[@value='2']", forwardDC_chamber[0][1]))
return false;
1322 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@rot/layer[@value='3']", forwardDC_chamber[0][2]))
return false;
1323 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@rot/layer[@value='4']", forwardDC_chamber[0][3]))
return false;
1324 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@rot/layer[@value='5']", forwardDC_chamber[0][4]))
return false;
1325 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_1']/@rot/layer[@value='6']", forwardDC_chamber[0][5]))
return false;
1326 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@rot/layer[@value='1']", forwardDC_chamber[1][0]))
return false;
1327 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@rot/layer[@value='2']", forwardDC_chamber[1][1]))
return false;
1328 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@rot/layer[@value='3']", forwardDC_chamber[1][2]))
return false;
1329 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@rot/layer[@value='4']", forwardDC_chamber[1][3]))
return false;
1330 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@rot/layer[@value='5']", forwardDC_chamber[1][4]))
return false;
1331 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_2']/@rot/layer[@value='6']", forwardDC_chamber[1][5]))
return false;
1332 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@rot/layer[@value='1']", forwardDC_chamber[2][0]))
return false;
1333 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@rot/layer[@value='2']", forwardDC_chamber[2][1]))
return false;
1334 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@rot/layer[@value='3']", forwardDC_chamber[2][2]))
return false;
1335 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@rot/layer[@value='4']", forwardDC_chamber[2][3]))
return false;
1336 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@rot/layer[@value='5']", forwardDC_chamber[2][4]))
return false;
1337 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_3']/@rot/layer[@value='6']", forwardDC_chamber[2][5]))
return false;
1338 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@rot/layer[@value='1']", forwardDC_chamber[3][0]))
return false;
1339 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@rot/layer[@value='2']", forwardDC_chamber[3][1]))
return false;
1340 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@rot/layer[@value='3']", forwardDC_chamber[3][2]))
return false;
1341 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@rot/layer[@value='4']", forwardDC_chamber[3][3]))
return false;
1342 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@rot/layer[@value='5']", forwardDC_chamber[3][4]))
return false;
1343 if(!Get(
"//posXYZ[@volume='forwardDC_chamber_4']/@rot/layer[@value='6']", forwardDC_chamber[3][5]))
return false;
1346 for(
int package=1; package<=4; package++){
1349 for(
int chamber=1; chamber<=6; chamber++){
1351 stereo_angles.push_back(forwardDC_chamber[package-1][chamber-1][2]);
1363 vector<double> FDA[4];
1365 if(!Get(
"//section[@name='ForwardDC']/tubs[@name='FDA1']/@Rio_Z", FDA[0]))
return false;
1366 if(!Get(
"//section[@name='ForwardDC']/tubs[@name='FDA2']/@Rio_Z", FDA[1]))
return false;
1367 if(!Get(
"//section[@name='ForwardDC']/tubs[@name='FDA3']/@Rio_Z", FDA[2]))
return false;
1368 if(!Get(
"//section[@name='ForwardDC']/tubs[@name='FDA4']/@Rio_Z", FDA[3]))
return false;
1370 rmin_packages.push_back(FDA[0][0]);
1371 rmin_packages.push_back(FDA[1][0]);
1372 rmin_packages.push_back(FDA[2][0]);
1373 rmin_packages.push_back(FDA[3][0]);
1385 vector<double> FDA1;
1387 bool good = Get(
"//section[@name='ForwardDC']/tubs[@name='FDA1']/@Rio_Z", FDA1);
1390 _DBG_<<
"Unable to retrieve FDC Rmax values."<<endl;
1394 rmax_active_fdc = FDA1[1];
1404 bool good = Get(
"//section[@name='CentralDC_s']/composition/posXYZ/@volume", cdc_option);
1407 _DBG_<<
"Unable to retrieve CDC option string."<<endl;
1427 vector<double> Rio_Z;
1428 bool good = Get(
"//section[@name='CentralDC']/tubs[@name='STRW']/@Rio_Z", Rio_Z);
1429 cdc_axial_length = Rio_Z[2];
1432 _DBG_<<
"Unable to retrieve CDC axial wire length"<<endl;
1461 cdc_nwires.push_back(42);
1462 cdc_nwires.push_back(42);
1463 cdc_nwires.push_back(54);
1464 cdc_nwires.push_back(54);
1465 cdc_nwires.push_back(66);
1466 cdc_nwires.push_back(66);
1467 cdc_nwires.push_back(80);
1468 cdc_nwires.push_back(80);
1469 cdc_nwires.push_back(93);
1470 cdc_nwires.push_back(93);
1471 cdc_nwires.push_back(106);
1472 cdc_nwires.push_back(106);
1473 cdc_nwires.push_back(123);
1474 cdc_nwires.push_back(123);
1475 cdc_nwires.push_back(135);
1476 cdc_nwires.push_back(135);
1477 cdc_nwires.push_back(146);
1478 cdc_nwires.push_back(146);
1479 cdc_nwires.push_back(158);
1480 cdc_nwires.push_back(158);
1481 cdc_nwires.push_back(170);
1482 cdc_nwires.push_back(170);
1483 cdc_nwires.push_back(182);
1484 cdc_nwires.push_back(182);
1485 cdc_nwires.push_back(197);
1486 cdc_nwires.push_back(197);
1487 cdc_nwires.push_back(209);
1488 cdc_nwires.push_back(209);
1500 vector<double>cdc_origin;
1501 vector<double>cdc_center;
1502 vector<double>cdc_layers_offset;
1503 vector<double>cdc_endplate_pos;
1504 vector<double>cdc_endplate_dim;
1506 if(!Get(
"//posXYZ[@volume='CentralDC'/@X_Y_Z",cdc_origin))
return false;
1507 if(!Get(
"//posXYZ[@volume='centralDC']/@X_Y_Z",cdc_center))
return false;
1508 if(!Get(
"//posXYZ[@volume='CDPD']/@X_Y_Z",cdc_endplate_pos))
return false;
1509 if(!Get(
"//tubs[@name='CDPD']/@Rio_Z",cdc_endplate_dim))
return false;
1510 if(!Get(
"//posXYZ[@volume='CDClayers']/@X_Y_Z",cdc_layers_offset))
return false;
1512 if(cdc_origin.size()<3){
1513 _DBG_<<
"cdc_origin.size()<3 !"<<endl;
1516 if(cdc_center.size()<3){
1517 _DBG_<<
"cdc_center.size()<3 !"<<endl;
1520 if(cdc_endplate_pos.size()<3){
1521 _DBG_<<
"cdc_endplate_pos.size()<3 !"<<endl;
1524 if(cdc_endplate_dim.size()<3){
1525 _DBG_<<
"cdc_endplate_dim.size()<3 !"<<endl;
1528 if (cdc_layers_offset.size()<3){
1529 _DBG_<<
"cdc_layers_offset.size()<3 !"<<endl;
1533 z=cdc_origin[2]+cdc_center[2]+cdc_endplate_pos[2]+cdc_layers_offset[2];
1534 dz=cdc_endplate_dim[2];
1535 rmin=cdc_endplate_dim[0];
1536 rmax=cdc_endplate_dim[1];
1546 vector<float> bcal_mother_Rio_Z;
1547 bool good = Get(
"//section[@name='BarrelEMcal']/tubs[@name='BCAL']/@Rio_Z", bcal_mother_Rio_Z);
1549 _DBG_<<
"Unable to retrieve BCAL mother RioZ info."<<endl;
1553 if(bcal_mother_Rio_Z.size() == 3){
1554 bcal_rmin = bcal_mother_Rio_Z[0];
1558 _DBG_<<
"Wrong vector size for BCAL mother RioZ!!!"<<endl;
1569 vector<float> BM[5];
1571 if(!Get(
"//section[@name='BarrelEMcal']/tubs[@name='BM01']/@Rio_Z", BM[0]))
return false;
1572 if(!Get(
"//section[@name='BarrelEMcal']/tubs[@name='BM02']/@Rio_Z", BM[1]))
return false;
1573 if(!Get(
"//section[@name='BarrelEMcal']/tubs[@name='BM04']/@Rio_Z", BM[2]))
return false;
1574 if(!Get(
"//section[@name='BarrelEMcal']/tubs[@name='BMF7']/@Rio_Z", BM[3]))
return false;
1575 if(!Get(
"//section[@name='BarrelEMcal']/tubs[@name='BMFA']/@Rio_Z", BM[4]))
return false;
1577 fADC_radii.push_back(BM[0][0]);
1578 fADC_radii.push_back(BM[1][0]);
1579 fADC_radii.push_back(BM[2][0]);
1580 fADC_radii.push_back(BM[3][0]);
1581 fADC_radii.push_back(BM[4][1]);
1591 vector<unsigned int> ncopy;
1592 bool good = Get(
"//section[@name='BarrelEMcal']/composition/mposPhi/@ncopy", ncopy);
1594 _DBG_<<
"Unable to retrieve BCAL barrelModule ncopy info."<<endl;
1598 if(ncopy.size() == 1){
1599 bcal_nmodules = ncopy[0];
1602 _DBG_<<
"Wrong vector size for BCAL barrelModule ncopy!!!"<<endl;
1614 bool good = Get(
"//section[@name='BarrelEMcal']/parameters/real[@name='z0']/@value", z0);
1616 _DBG_<<
"Unable to retrieve BCAL parameters z0 info."<<endl;
1617 bcal_center_z = 0.0;
1621 bcal_center_z = z0[0];
1624 _DBG_<<
"Wrong vector size for BCAL parameters z0!!!"<<endl;
1625 bcal_center_z = 0.0;
1637 vector<float> module_length;
1638 bool good = Get(
"//section[@name='BarrelEMcal']/tubs[@name='BM01']/@Rio_Z", module_length);
1640 _DBG_<<
"Unable to retrieve BCAL submodule RioZ info."<<endl;
1644 if(module_length.size() == 3){
1645 bcal_length = module_length[2];
1649 _DBG_<<
"Wrong vector size for BCAL submodule RioZ!!!"<<endl;
1661 vector<float> bcal_moth_Rio_Z;
1662 bool good = Get(
"//section[@name='BarrelEMcal']/tubs[@name='BCAL']/@Rio_Z", bcal_moth_Rio_Z);
1664 _DBG_<<
"Unable to retrieve BCAL mother RioZ info."<<endl;
1668 if(bcal_moth_Rio_Z.size() == 3){
1669 bcal_depth = bcal_moth_Rio_Z[1] - bcal_moth_Rio_Z[0];
1673 _DBG_<<
"Wrong vector size for BCAL mother RioZ!!!"<<endl;
1686 bool good = Get(
"//section[@name='BarrelEMcal']/composition/mposPhi/@Phi0", Phi0);
1687 if(!good)
return false;
1688 if(Phi0.size() == 1){
1689 bcal_phi_shift = Phi0[0];
1692 bcal_phi_shift = 0.0;
1702 vector<double> ComptonEMcalpos;
1703 bool good = Get(
"//section/composition/posXYZ[@volume='ComptonEMcal']/@X_Y_Z", ComptonEMcalpos);
1706 _DBG_<<
"Unable to retrieve ComptonEMcal position."<<endl;
1710 z_ccal = ComptonEMcalpos[2];
1720 vector<double> ForwardEMcalpos;
1721 bool good = Get(
"//section/composition/posXYZ[@volume='ForwardEMcal']/@X_Y_Z", ForwardEMcalpos);
1724 _DBG_<<
"Unable to retrieve ForwardEMcal position."<<endl;
1728 z_fcal = ForwardEMcalpos[2];
1737 vector<double> dirc_face;
1738 bool good = Get(
"//section/composition/posXYZ[@volume='DIRC']/@X_Y_Z",dirc_face);
1741 _DBG_<<
"Unable to retrieve DIRC position."<<endl;
1746 vector<double>dirc_plane;
1747 vector<double>dirc_shift;
1748 vector<double>bar_plane;
1749 Get(
"//composition[@name='DRCC']/posXYZ[@volume='DCML10']/@X_Y_Z/plane[@value='1']", dirc_plane);
1750 Get(
"//composition[@name='DIRC']/posXYZ[@volume='DRCC']/@X_Y_Z", dirc_shift);
1751 z_dirc=dirc_face[2]+dirc_plane[2]+dirc_shift[2] + 0.8625;
1753 jout <<
"DIRC z position = " << z_dirc <<
" cm." << endl;
1763 vector<double> ForwardTOF;
1764 vector<double> forwardTOF[2];
1765 vector<double> FTOC;
1767 if(!Get(
"//section/composition/posXYZ[@volume='ForwardTOF']/@X_Y_Z", ForwardTOF))
return false;
1768 if(!Get(
"//composition[@name='ForwardTOF']/posXYZ[@volume='forwardTOF']/@X_Y_Z/plane[@value='0']", forwardTOF[0]))
return false;
1769 if(!Get(
"//composition[@name='ForwardTOF']/posXYZ[@volume='forwardTOF']/@X_Y_Z/plane[@value='1']", forwardTOF[1]))
return false;
1770 if(!Get(
"//box[@name='FTOC' and sensitive='true']/@X_Y_Z", FTOC))
return false;
1772 z_tof.push_back(ForwardTOF[2] + forwardTOF[0][2] - FTOC[2]/2.0);
1773 z_tof.push_back(ForwardTOF[2] + forwardTOF[1][2] - FTOC[2]/2.0);
1785 vector<double> xyz_bar;
1789 if(!Get(
"//composition[@name='forwardTOF_bottom1']/mposY[@volume='FTOC']/@ncopy",num_bars1))
return false;
1790 int num_narrow_bars1 = 0;
1791 if(!Get(
"//composition[@name='forwardTOF_bottom2']/mposY[@volume='FTOX']/@ncopy",num_narrow_bars1))
return false;
1792 int num_single_end_bars1 = 0;
1793 if(!Get(
"//composition[@name='forwardTOF_north']/mposY[@volume='FTOH']/@ncopy",num_single_end_bars1))
return false;
1794 int num_narrow_bars2 = 0;
1795 if(!Get(
"//composition[@name='forwardTOF_top2']/mposY[@volume='FTOX']/@ncopy",num_narrow_bars2))
return false;
1797 if(!Get(
"//composition[@name='forwardTOF_top1']/mposY[@volume='FTOC']/@ncopy",num_bars2))
return false;
1798 int num_single_end_bars2 = 0;
1799 if(!Get(
"//composition[@name='forwardTOF_south']/mposY[@volume='FTOH']/@ncopy",num_single_end_bars2))
return false;
1801 int NLONGBARS = num_bars1 + num_bars2 + num_narrow_bars1 + num_narrow_bars2;
1802 int NSHORTBARS = num_single_end_bars1 + num_single_end_bars2;
1803 int FIRSTSHORTBAR = num_bars1 + num_narrow_bars1 + 1;
1804 int LASTSHORTBAR = FIRSTSHORTBAR + NSHORTBARS/4;
1808 if(!Get(
"//box[@name='FTOC' and sensitive='true']/@X_Y_Z", xyz_bar))
return false;
1809 double LONGBARLENGTH = xyz_bar[0];
1810 double BARWIDTH = xyz_bar[1];
1812 if(!Get(
"//box[@name='FTOH' and sensitive='true']/@X_Y_Z", xyz_bar))
return false;
1813 double SHORTBARLENGTH = xyz_bar[0];
1817 paddle_params[
"NLONGBARS"] = NLONGBARS;
1818 paddle_params[
"NSHORTBARS"] = NSHORTBARS;
1819 paddle_params[
"BARWIDTH"] = BARWIDTH;
1821 paddle_params[
"LONGBARLENGTH"] = LONGBARLENGTH;
1822 paddle_params[
"HALFLONGBARLENGTH"] = LONGBARLENGTH/2.;
1823 paddle_params[
"SHORTBARLENGTH"] = SHORTBARLENGTH;
1824 paddle_params[
"HALFSHORTBARLENGTH"] = SHORTBARLENGTH/2.;
1826 paddle_params[
"FIRSTSHORTBAR"] = FIRSTSHORTBAR;
1827 paddle_params[
"LASTSHORTBAR"] = LASTSHORTBAR;
1854 Get(
"//composition[@name='forwardTOF_bottom1']/mposY[@volume='FTOC']/@ncopy",num_bars1);
1855 int num_narrow_bars1 = 0;
1856 Get(
"//composition[@name='forwardTOF_bottom2']/mposY[@volume='FTOX']/@ncopy",num_narrow_bars1);
1857 int num_single_end_bars1 = 0;
1858 Get(
"//composition[@name='forwardTOF_north']/mposY[@volume='FTOH']/@ncopy",num_single_end_bars1);
1859 int num_narrow_bars2 = 0;
1860 Get(
"//composition[@name='forwardTOF_top2']/mposY[@volume='FTOX']/@ncopy",num_narrow_bars2);
1862 Get(
"//composition[@name='forwardTOF_top1']/mposY[@volume='FTOC']/@ncopy",num_bars2);
1863 int num_single_end_bars2 = 0;
1864 Get(
"//composition[@name='forwardTOF_south']/mposY[@volume='FTOH']/@ncopy",num_single_end_bars2);
1867 Get(
"//composition[@name='forwardTOF_bottom1']/mposY/@Y0",y0);
1868 Get(
"//composition[@name='forwardTOF_bottom1']/mposY/@dY",dy);
1869 vector<double>tof_bottom1;
1870 Get(
"//composition[@name='forwardTOF']/posXYZ[@volume='forwardTOF_bottom1']/@X_Y_Z",tof_bottom1);
1871 for (
int k=num_bars;k<num_bars+num_bars1;k++){
1872 y_tof.push_back(y0+tof_bottom1[1]+dy*
double(k-1));
1874 num_bars+=num_bars1;
1877 Get(
"//composition[@name='forwardTOF_bottom2']/mposY/@Y0",y0);
1878 Get(
"//composition[@name='forwardTOF_bottom2']/mposY/@dY",dy);
1879 vector<double>tof_bottom2;
1880 Get(
"//composition[@name='forwardTOF']/posXYZ[@volume='forwardTOF_bottom2']/@X_Y_Z",tof_bottom2);
1881 for (
int k=num_bars;k<num_bars+num_narrow_bars1;k++){
1882 y_tof.push_back(y0+tof_bottom2[1]+dy*
double(k-20));
1884 num_bars+=num_narrow_bars1;
1887 Get(
"//composition[@name='forwardTOF_north']/mposY/@Y0",y0);
1888 Get(
"//composition[@name='forwardTOF_north']/mposY/@dY",dy);
1889 vector<double>tof_north;
1890 Get(
"//composition[@name='forwardTOF']/posXYZ[@volume='forwardTOF_north']/@X_Y_Z",tof_north);
1891 for (
int k=num_bars;k<num_bars+num_single_end_bars1;k++){
1892 y_tof.push_back(y0+tof_north[1]+dy*
double(k-22));
1894 num_bars+=num_single_end_bars1;
1897 Get(
"//composition[@name='forwardTOF_top2']/mposY/@Y0",y0);
1898 Get(
"//composition[@name='forwardTOF_top2']/mposY/@dY",dy);
1899 vector<double>tof_top2;
1900 Get(
"//composition[@name='forwardTOF']/posXYZ[@volume='forwardTOF_top2']/@X_Y_Z",tof_top2);
1901 for (
int k=num_bars;k<num_bars+num_narrow_bars2;k++){
1902 y_tof.push_back(y0+tof_top2[1]+dy*
double(k-24));
1904 num_bars+=num_narrow_bars2;
1907 Get(
"//composition[@name='forwardTOF_top1']/mposY/@Y0",y0);
1908 Get(
"//composition[@name='forwardTOF_top1']/mposY/@dY",dy);
1909 vector<double>tof_top1;
1910 Get(
"//composition[@name='forwardTOF']/posXYZ[@volume='forwardTOF_top1']/@X_Y_Z",tof_top1);
1911 for (
int k=num_bars;k<num_bars+num_bars2;k++){
1912 y_tof.push_back(y0+tof_top1[1]+dy*
double(k-26));
1914 num_bars+=num_bars2;
1939 bool gluex_target_exists =
true;
1940 vector<double> xyz_vessel;
1941 vector<double> xyz_target;
1942 vector<double> xyz_detector;
1943 if(gluex_target_exists) gluex_target_exists = Get(
"//composition[@name='targetVessel']/posXYZ[@volume='targetTube']/@X_Y_Z", xyz_vessel);
1944 if(gluex_target_exists) gluex_target_exists = Get(
"//composition[@name='Target']/posXYZ[@volume='targetVessel']/@X_Y_Z", xyz_target);
1945 if(gluex_target_exists) gluex_target_exists = Get(
"//posXYZ[@volume='Target']/@X_Y_Z", xyz_detector);
1946 if(gluex_target_exists) {
1947 z_target = xyz_vessel[2] + xyz_target[2] + xyz_detector[2];
1952 bool cpp_target_exists =
true;
1953 vector<double> xyz_TGT0;
1954 vector<double> xyz_TARG;
1955 vector<double> xyz_TargetCPP;
1956 if(cpp_target_exists) cpp_target_exists = Get(
"//composition/posXYZ[@volume='TGT0']/@X_Y_Z", xyz_TGT0);
1957 if(cpp_target_exists) cpp_target_exists = Get(
"//composition/posXYZ[@volume='TARG']/@X_Y_Z", xyz_TARG);
1958 if(cpp_target_exists) cpp_target_exists = Get(
"//composition/posXYZ[@volume='TargetCPP']/@X_Y_Z", xyz_TargetCPP);
1959 if(cpp_target_exists) {
1960 z_target = xyz_TGT0[2] + xyz_TARG[2] + xyz_TargetCPP[2];
1964 jout <<
" WARNING: Unable to get target location from XML for any of GlueX, or CPP targets. Using default of " << z_target <<
" cm" << endl;
1974 vector<double> zLength;
1975 bool good = Get(
"//section[@name='Target']/pcon[@name='LIH2']/real[@name='length']/[@value]", zLength);
1977 target_length = good ? zLength[0]:0.0;
1984 vector<vector<DVector3> >&norm
1987 JCalibration *jcalib =
dapp->GetJCalibration(runnumber);
1990 vector<double> sc_origin;
1991 bool got_sc = Get(
"//posXYZ[@volume='StartCntr']/@X_Y_Z", sc_origin);
1994 vector<double>sc_origin_delta;
1995 Get(
"//posXYZ[@volume='startCntr']/@X_Y_Z", sc_origin_delta);
1996 double dx=sc_origin_delta[0];
1997 double dy=sc_origin_delta[1];
2000 double z0=sc_origin[2];
2003 vector<double>sc_rot_angles;
2004 Get(
"//posXYZ[@volume='startCntr']/@rot", sc_rot_angles);
2005 double ThetaX=sc_rot_angles[0]*M_PI/180.;
2006 double ThetaY=sc_rot_angles[1]*M_PI/180.;
2007 Get(
"//posXYZ[@volume='StartCntr']/@rot", sc_rot_angles);
2010 double ThetaZ=sc_rot_angles[2]*M_PI/180.;
2013 map<string,double> sc_global_offsets;
2014 if (jcalib->Get(
"START_COUNTER/global_alignment_parms",sc_global_offsets)==
false) {
2016 dx += sc_global_offsets[
"SC_ALIGN_X"];
2017 dy += sc_global_offsets[
"SC_ALIGN_Y"];
2018 z0 += sc_global_offsets[
"SC_ALIGN_Z"];
2021 ThetaX += sc_global_offsets[
"SC_ALIGN_ROTX"]*M_PI/180.;
2022 ThetaY += sc_global_offsets[
"SC_ALIGN_ROTY"]*M_PI/180.;
2023 ThetaZ += sc_global_offsets[
"SC_ALIGN_ROTZ"]*M_PI/180.;
2027 Get(
"//mposPhi[@volume='STRC']/@ncopy",num_paddles);
2028 double dSCdphi =
M_TWO_PI/num_paddles;
2030 vector<vector<double> > sc_rioz;
2031 GetMultiple(
"//pgon[@name='STRC']/polyplane/@Rio_Z", sc_rioz);
2034 vector< map<string,double> > sc_paddle_offsets;
2035 bool loaded_paddle_offsets =
false;
2036 if (jcalib->Get(
"START_COUNTER/paddle_alignment_parms",sc_paddle_offsets)==
false)
2037 loaded_paddle_offsets =
true;
2040 for (
unsigned int i=0;i<30;i++){
2041 double phi=ThetaZ+dSCdphi*(double(i)+0.5);
2042 double sinphi=
sin(phi);
2043 double cosphi=cos(phi);
2044 double r=0.5*(sc_rioz[0][0]+sc_rioz[0][1]);
2050 ray.RotateX(ThetaX);
2051 ray.RotateY(ThetaY);
2054 vector<DVector3>posvec;
2055 vector<DVector3>dirvec;
2057 for(
unsigned int k = 1; k < sc_rioz.size(); ++k){
2059 r=0.5*(sc_rioz[k][0]+sc_rioz[k][1]);
2063 ray.SetXYZ(x,y,sc_rioz[k][2]);
2064 ray.RotateX(ThetaX);
2065 ray.RotateY(ThetaY);
2067 if(loaded_paddle_offsets) {
2069 double max_z = sc_paddle_offsets[i][
"SC_MAX_Z"];
2070 if(ray.Z() > max_z) {
2075 double delta_theta = sc_paddle_offsets[i][
"SC_CURVE_THETA"];
2076 ray.SetX(ray.X()+delta_theta*1.65);
2077 ray.SetY(ray.Y()-delta_theta*0.55);
2080 DVector3 ray2(r,10.,sc_rioz[k][2]);
2081 ray2.RotateZ(phi+0.5*dSCdphi*(1.+1./15.*((i>14)?29-i:i)));
2082 ray2.RotateX(ThetaX);
2083 ray2.RotateY(ThetaY);
2087 dirvec.push_back(dir);
2088 posvec.push_back(
DVector3(oldray.X()+dx,oldray.Y()+dy,oldray.Z()+z0));
2090 posvec.push_back(
DVector3(ray.X(),ray.Y(),ray.Z()+z0));
2091 pos.push_back(posvec);
2092 norm.push_back(dirvec);
bool GetFDCZ(vector< double > &z_wires) const
z-locations for each of the FDC wire planes in cm
bool GetCCALZ(double &z_ccal) const
void FindNodes(string xpath, vector< xpathparsed_t > &matched_xpaths) const
bool GetBCALRmin(float &bcal_rmin) const
minimum distance of BCAL module from beam line
vector< DMaterialMap * > GetMaterialMapVector(void) const
bool GetCompositeMaterial(const string &name, double &density, double &radlen) const
sprintf(text,"Post KinFit Cut")
static vector< vector< DFDCWire * > > fdcwires
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
bool GetFDCRmin(vector< double > &rmin_packages) const
beam hole size for each FDC package in cm
jerror_t FindMat(DVector3 &pos, double &rhoZ_overA, double &rhoZ_overA_logI, double &RadLen) const
bool GetCDCOption(string &cdc_option) const
get the centralDC_option-X string
DLorentzDeflections * GetLorentzDeflections(unsigned int run_number=1)
bool GetFCALZ(double &z_fcal) const
z-location of front face of CCAL in cm
bool GetFDCRmax(double &rmax_active_fdc) const
outer radius of FDC active area in cm
bool GetBCALDepth(float &bcal_depth) const
depth (or height) of BCAL module in cm
bool GetCDCWires(vector< vector< DCDCWire * > > &cdcwires) const
bool GetCDCAxialLength(double &cdc_axial_length) const
length of CDC axial wires in cm
DMagneticFieldMap * GetBfield(void) const
void GetMaterials(void) const
bool GetTOFPaddlePerpPositions(vector< double > &y_tof) const
bool GetBCALLength(float &bcal_length) const
length of BCAL module in cm
bool GetBCALCenterZ(float &bcal_center_z) const
z-location of center of BCAL module in cm
jerror_t FindMatALT1(DVector3 &pos, DVector3 &mom, double &KrhoZ_overA, double &rhoZ_overA, double &LnI, double &X0, double *s_to_boundary=NULL) const
bool GetBCALNmodules(unsigned int &bcal_nmodules) const
Number of BCAL modules.
bool GetCDCStereo(vector< double > &cdc_stereo) const
stereo angle for each CDC layer in degrees
#define FDC_ACTIVE_RADIUS
void ReadMaterialMaps(void) const
bool GetTOFZ(vector< double > &z_tof) const
z-location of front face of each of TOF in cm
bool GetBCALPhiShift(float &bcal_phi_shift) const
phi angle in degrees that first BCAL module is shifted from being centered at ph=0.0
bool GetTOFPaddleParameters(map< string, double > &paddle_params) const
vector< node_t > xpathparsed_t
bool GetCDCAxialWires(unsigned int ring, unsigned int ncopy, double zcenter, double dz, vector< vector< cdc_offset_t > > &cdc_offsets, vector< DCDCWire * > &axialwires, vector< double > &rot_angles, double dx, double dy) const
Extract the axial wire data from the XML.
The DMaterial class holds information on a single material type. The main purpose is to hold informat...
bool IsInMap(const DVector3 &pos) const
bool GetFDCCathodes(vector< vector< DFDCCathode * > > &fdccathodes) const
bool GetCDCNwires(vector< int > &cdc_nwires) const
Number of wires for each CDC layer.
bool GetCDCStereoWires(unsigned int ring, unsigned int ncopy, double zcenter, double dz, vector< vector< cdc_offset_t > > &cdc_offsets, vector< DCDCWire * > &stereowires, vector< double > &rot_angles, double dx, double dy) const
Find the materials traversed by a particle swimming from a specific position with a specific momentum...
bool GetFDCWires(vector< vector< DFDCWire * > > &fdcwires) const
DLorentzDeflections * GetLorentzDeflections(void)
bool GetCDCRmid(vector< double > &cdc_rmid) const
Distance of the center of CDC wire from beamline for each layer in cm.
jerror_t FindMatKalman(const DVector3 &pos, const DVector3 &mom, double &KrhoZ_overA, double &rhoZ_overA, double &LnI, double &Z, double &chi2c_factor, double &chi2a_factor, double &chi2a_factor2, unsigned int &last_index, double *s_to_boundary=NULL) const
bool GetFDCStereo(vector< double > &stereo_angles) const
stereo angles of each of the FDC wire layers
bool GetCDCEndplate(double &z, double &dz, double &rmin, double &rmax) const
bool GetDIRCZ(double &z_dirc) const
z-location of DIRC in cm
bool GetBCALfADCRadii(vector< float > &fADC_radii) const
fADC radii including the outer radius of the last layer
#define CATHODE_ROT_ANGLE
bool GetTargetLength(double &target_length) const
z-location of center of target
bool GetTargetZ(double &z_target) const
z-location of center of target
bool GetCDCCenterZ(double &cdc_center_z) const
z-location of center of CDC wires in cm
bool GetStartCounterGeom(vector< vector< DVector3 > > &pos, vector< vector< DVector3 > > &norm) const
const DMaterialMap * FindDMaterialMap(DVector3 &pos) const
const DMaterial * GetDMaterial(string name) const