00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00074
00075
00076
00078
00079 #include <Stiostream.h>
00080 #include <stdlib.h>
00081 #include "St_db_Maker/St_db_Maker.h"
00082 #include "StFtpcDriftMapMaker.h"
00083 #include "StFtpcMagboltz1.hh"
00084 #include "StFtpcClusterMaker/StFtpcDbReader.hh"
00085
00086 #include "StMessMgr.h"
00087 #include "St_DataSetIter.h"
00088 #include "TH1.h"
00089 #include "TH2.h"
00090
00091 ClassImp(StFtpcDriftMapMaker)
00092
00093
00094 StFtpcDriftMapMaker::~StFtpcDriftMapMaker(){
00095 }
00096
00097 StFtpcDriftMapMaker::StFtpcDriftMapMaker(const StarMagField::EBField map,const Float_t factor,const Float_t deltaAr):
00098 m_dimensions(0),
00099 m_padrow_z(0),
00100 m_efield(0),
00101 m_vdrift(0),
00102 m_deflection(0),
00103 m_dvdriftdp(0),
00104 m_ddeflectiondp(0),
00105 m_gas(0),
00106 m_driftfield(0)
00107 {
00108
00109 mDbMaker = (St_db_Maker*)GetMaker("db");
00110 mDbMaker->SetDateTime(20330101,0);
00111
00112
00113
00114 St_DataSet *ftpc_geometry_db = GetDataBase("Geometry/ftpc");
00115 if ( !ftpc_geometry_db ){
00116 *gMessMgr<<"Could not locate MySQLDb:Geometry/ftpc"<<endm;
00117 exit(0);
00118 }
00119 St_DataSetIter dblocal_geometry(ftpc_geometry_db);
00120
00121 m_dimensions = (St_ftpcDimensions *)dblocal_geometry("ftpcDimensions");
00122 m_padrow_z = (St_ftpcPadrowZ *)dblocal_geometry("ftpcPadrowZ" );
00123
00124 St_DataSet *ftpc_calibrations_db = GetDataBase("Calibrations/ftpc");
00125 if ( !ftpc_calibrations_db ){
00126 *gMessMgr<<"Could not locate MySQLDb:Calibrations/ftpc"<<endm;
00127 exit(0);
00128 }
00129 St_DataSetIter dblocal_calibrations(ftpc_calibrations_db);
00130
00131 m_gas = (St_ftpcGas *)dblocal_calibrations("ftpcGas");
00132
00133
00134
00135 m_driftfield = (St_ftpcDriftField *)dblocal_calibrations("ftpcDriftField");
00136 m_efield = (St_ftpcEField *)dblocal_calibrations("ftpcEField" );
00137 m_vdrift = (St_ftpcVDrift *)dblocal_calibrations("ftpcVDrift" );
00138 m_deflection = (St_ftpcDeflection *)dblocal_calibrations("ftpcDeflection" );
00139 m_dvdriftdp = (St_ftpcdVDriftdP *)dblocal_calibrations("ftpcdVDriftdP" );
00140 m_ddeflectiondp = (St_ftpcdDeflectiondP *)dblocal_calibrations("ftpcdDeflectiondP" );
00141
00142 if (!m_efield || !m_vdrift || !m_deflection || !m_dvdriftdp || !m_ddeflectiondp
00143 || !m_gas || !m_driftfield) {
00144 cout<<"MySQLDb:Calibrations/ftpc not complete"<<endl;
00145 exit(0);
00146 }
00147
00148
00149 StFtpcDbReader *dbReader = new StFtpcDbReader(m_dimensions,
00150 m_padrow_z,
00151 m_efield,
00152 m_vdrift,
00153 m_deflection,
00154 m_dvdriftdp,
00155 m_ddeflectiondp,
00156 m_gas,
00157 m_driftfield);
00158 if (dbReader->returnCode != 0) {
00159 cout<<"Error constructing StFtpcDbReader"<<endl;
00160 return;
00161 }
00162
00163 ftpcEField_st *ftpcEField = m_efield->GetTable();
00164 ftpcVDrift_st *ftpcVDrift = m_vdrift->GetTable();
00165 ftpcDeflection_st *ftpcDeflection = m_deflection->GetTable();
00166 ftpcdVDriftdP_st *ftpcdVDriftdP = m_dvdriftdp->GetTable();
00167 ftpcdDeflectiondP_st *ftpcdDeflectiondP = m_ddeflectiondp->GetTable();
00168 for ( Int_t iBin=0; iBin<dbReader->maximumNumberOfMagboltzBins(); iBin++)
00169 {
00170 ftpcEField->e[iBin] = 0.0;
00171 for(Int_t iPadrow=0; iPadrow<dbReader->numberOfPadrowsPerSide(); iPadrow++) {
00172 ftpcVDrift->v[iPadrow + dbReader->numberOfPadrowsPerSide()*iBin] = 0.0;
00173 ftpcDeflection->psi[iPadrow + dbReader->numberOfPadrowsPerSide()*iBin] = 0.0;
00174 ftpcdVDriftdP->dv_dp[iPadrow + dbReader->numberOfPadrowsPerSide()*iBin] = 0.0;
00175 ftpcdDeflectiondP->dpsi_dp[iPadrow + dbReader->numberOfPadrowsPerSide()*iBin] = 0.0;
00176 }
00177 }
00178
00179 for ( Int_t iBin=0; iBin<dbReader->numberOfMagboltzBins(); iBin++)
00180 {
00181 dbReader->setMagboltzEField(iBin,dbReader->minimumDriftField() + iBin*dbReader->stepSizeDriftField());
00182 }
00183
00184
00185
00186 StarMagField *magField = new StarMagField(map, factor, kTRUE);
00187
00188
00189
00190 StFtpcMagboltz1 *magboltz = new StFtpcMagboltz1();
00191
00192 int i, j;
00193 float thisField, thisRadius;
00194 float posVector[3], bVector[3];
00195 float bMag, bTheta, bRadial;
00196 float vDrift, psiAngle, pressure;
00197 float upPressure, upDrift, upAngle, pOff;
00198 float eFinal;
00199
00200 eFinal=0.1;
00201
00202 posVector[0]=0;
00203
00204 for(i=0; i < dbReader->numberOfMagboltzBins(); i++)
00205 {
00206
00207 thisField = dbReader->minimumDriftField()
00208 + i*dbReader->stepSizeDriftField();
00209 thisRadius = dbReader->radiusTimesField() / thisField;
00210
00211 posVector[1]=thisRadius;
00212 for(j=0; j < dbReader->numberOfPadrowsPerSide(); j++)
00213 {
00214 posVector[2]=dbReader->padrowZPosition(j);
00215
00216
00217 magField->BField(posVector, bVector);
00218 printf("pos %f %f %f field %f %f %f\n", posVector[0], posVector[1], posVector[2], bVector[0], bVector[1], bVector[2]);
00219 bMag=::sqrt(bVector[0]*bVector[0] + bVector[1]*bVector[1] +
00220 bVector[2]*bVector[2]);
00221 bRadial=::sqrt(bVector[0]*bVector[0] + bVector[1]*bVector[1]);
00222 bTheta=acos(bRadial/bMag)*90/acos(0.0);
00223
00224 bTheta = (factor/fabs(factor)) * bTheta;
00225 pressure=760.0;
00226 upPressure=760.0+dbReader->pressureOffset();
00227 pOff=dbReader->pressureOffset()*1.3332;
00228
00229 vDrift=0;
00230 psiAngle=0;
00231 upDrift=0;
00232 upAngle=0;
00233 printf("loop %d of %d\n", i, dbReader->numberOfMagboltzBins());
00234 printf("calling magboltz with field %f bMag %f bTheta %f pressure %f vDrift %f psiAngle %f\n", thisField, bMag, bTheta, pressure, vDrift, psiAngle);
00235 cout<<"dbReader->percentAr() = "<<dbReader->percentAr()<<" deltaAr = "<<deltaAr<<endl;
00236 float gas1=dbReader->percentAr() + deltaAr;
00237 float gas2=dbReader->percentCO2() - deltaAr;;
00238 float gas3=dbReader->percentNe();
00239 float gas4=dbReader->percentHe();
00240 float temperature=dbReader->baseTemperature();
00241 cout<<"calling magboltz with "<<gas1<<"% Ar and "<<gas2<<"% CO2"<<endl;
00242 magboltz->magboltz_(&thisField, &bMag, &bTheta, &pressure, &gas1, &gas2, &gas3, &gas4, &temperature, &vDrift, &psiAngle, &eFinal);
00243 printf("called magboltz got field %f bMag %f bTheta %f pressure %f vDrift %f psiAngle %f\n", thisField, bMag, bTheta, pressure, vDrift, psiAngle);
00244 magboltz->magboltz_(&thisField, &bMag, &bTheta, &upPressure, &gas1, &gas2, &gas3, &gas4, &temperature, &upDrift, &upAngle, &eFinal);
00245 printf("changing magboltz values from %f %f %f %f\n",dbReader->magboltzVDrift(i,j), dbReader->magboltzDeflection(i,j),dbReader->magboltzdVDriftdP(i,j),dbReader->magboltzdDeflectiondP(i,j));
00246 dbReader->setMagboltzEField(i,thisField);
00247 dbReader->setMagboltzVDrift(i,j,vDrift);
00248 dbReader->setMagboltzDeflection(i,j,psiAngle);
00249 dbReader->setMagboltzdVDriftdP(i,j,(upDrift-vDrift)/pOff);
00250 dbReader->setMagboltzdDeflectiondP(i,j,(upAngle-psiAngle)/pOff);
00251 printf(" to %f %f %f %f\n",dbReader->magboltzVDrift(i,j), dbReader->magboltzDeflection(i,j),dbReader->magboltzdVDriftdP(i,j),dbReader->magboltzdDeflectiondP(i,j));
00252
00253 }
00254 }
00255
00256
00257
00258
00259 void* cstruct = m_deflection -> GetTable();
00260 Int_t nrows = m_deflection -> GetNRows();
00261
00262 fTableName = new char[20];
00263 strcpy(fTableName,"ftpcDeflection");
00264
00265 TTable* table = TTable::New(fTableName,fTableName,cstruct,nrows);
00266
00267 fOutputFileName = new char[100];
00268 strcpy(fOutputFileName,"./ftpcDeflection.C");
00269 ofstream ofs_Deflection(fOutputFileName);
00270 table -> SavePrimitive(ofs_Deflection,0);
00271 ofs_Deflection.close();
00272
00273
00274
00275 cstruct = m_vdrift -> GetTable();
00276 nrows = m_vdrift -> GetNRows();
00277
00278 strcpy(fTableName,"ftpcVDrift");
00279
00280 table = TTable::New(fTableName,fTableName,cstruct,nrows);
00281
00282 strcpy(fOutputFileName,"./ftpcVDrift.C");
00283 ofstream ofs_VDrift(fOutputFileName);
00284 table -> SavePrimitive(ofs_VDrift,0);
00285 ofs_VDrift.close();
00286
00287
00288
00289 cstruct = m_ddeflectiondp -> GetTable();
00290 nrows = m_ddeflectiondp -> GetNRows();
00291
00292 strcpy(fTableName,"ftpcdDeflectiondP");
00293
00294 table = TTable::New(fTableName,fTableName,cstruct,nrows);
00295
00296 strcpy(fOutputFileName,"./ftpcdDeflectiondP.C");
00297 ofstream ofs_dDeflectiondP(fOutputFileName);
00298 table -> SavePrimitive(ofs_dDeflectiondP,0);
00299 ofs_dDeflectiondP.close();
00300
00301
00302
00303 cstruct = m_dvdriftdp -> GetTable();
00304 nrows = m_dvdriftdp -> GetNRows();
00305
00306 strcpy(fTableName,"ftpcdVDriftdP");
00307
00308 table = TTable::New(fTableName,fTableName,cstruct,nrows);
00309
00310 strcpy(fOutputFileName,"./ftpcdVDriftdP.C");
00311 ofstream ofs_dVDriftdP(fOutputFileName);
00312 table -> SavePrimitive(ofs_dVDriftdP,0);
00313 ofs_dVDriftdP.close();
00314
00315
00316
00317
00318
00319 cstruct = m_efield -> GetTable();
00320 nrows = m_efield -> GetNRows();
00321
00322 fTableName = new char[20];
00323 strcpy(fTableName,"ftpcEField");
00324
00325 table = TTable::New(fTableName,fTableName,cstruct,nrows);
00326
00327 fOutputFileName = new char[100];
00328 strcpy(fOutputFileName,"./ftpcEField.C");
00329 ofstream ofs_ftpcEField(fOutputFileName);
00330 table -> SavePrimitive(ofs_ftpcEField,0);
00331 ofs_ftpcEField.close();
00332
00333
00334
00335
00336 cstruct = m_driftfield -> GetTable();
00337 nrows = m_driftfield -> GetNRows();
00338
00339 fTableName = new char[20];
00340 strcpy(fTableName,"ftpcDriftField");
00341
00342 table = TTable::New(fTableName,fTableName,cstruct,nrows);
00343
00344 fOutputFileName = new char[100];
00345 strcpy(fOutputFileName,"./ftpcDriftField.C");
00346 ofstream ofs_ftpcDriftField(fOutputFileName);
00347 table -> SavePrimitive(ofs_ftpcDriftField,0);
00348 ofs_ftpcDriftField.close();
00349
00350
00351 delete dbReader;
00352 delete magboltz;
00353
00354 cout <<"finished StFtpcDriftMapMaker" << endl;
00355 }
00356
00357