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
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00122
00123
00124
00126
00127 #include <Stiostream.h>
00128 #include <stdlib.h>
00129 #include "StFtpcSlowSimMaker.h"
00130 #include "StFtpcSlowSimulator.hh"
00131 #include "StFtpcRawWriter.hh"
00132
00133
00134 #include "StDAQMaker/StFTPCReader.h"
00135 #include "PhysicalConstants.h"
00136
00137 #include "StFtpcClusterMaker/StFtpcParamReader.hh"
00138 #include "StFtpcClusterMaker/StFtpcDbReader.hh"
00139 #include "StFtpcClusterMaker/StFtpcGeantReader.hh"
00140 #include "StFtpcClusterMaker/StFtpcGasUtilities.hh"
00141
00142
00143 #include "StFtpcTrackMaker/StFtpcTrackingParams.hh"
00144
00145 #include "StDetectorDbMaker/StDetectorDbFTPCGas.h"
00146 #include "St_db_Maker/St_db_Maker.h"
00147
00148 #include "StMessMgr.h"
00149 #include "St_DataSetIter.h"
00150 #include "TH1.h"
00151 #include "TH2.h"
00152
00153 #ifndef gufld
00154 #define gufld gufld_
00155 extern "C" void gufld(float *, float *);
00156 #endif
00157
00158 #include "tables/St_g2t_track_Table.h"
00159 #include "tables/St_g2t_ftp_hit_Table.h"
00160 #include "tables/St_fcl_ftpcndx_Table.h"
00161 #include "tables/St_fcl_ftpcsqndx_Table.h"
00162 #include "tables/St_fcl_ftpcadc_Table.h"
00163
00164 #include "StDetectorDbMaker/StDetectorDbClock.h"
00165
00166 ClassImp(StFtpcSlowSimMaker)
00167
00168
00169 StFtpcSlowSimMaker::StFtpcSlowSimMaker(const char *name):
00170 StMaker(name),
00171 m_clusterpars(0),
00172 m_slowsimgas(0),
00173 m_slowsimpars(0),
00174 m_dimensions(0),
00175 m_asicmap(0),
00176 m_efield(0),
00177 m_vdrift(0),
00178 m_deflection(0),
00179 m_dvdriftdp(0),
00180 m_ddeflectiondp(0),
00181 m_ampslope(0),
00182 m_ampoffset(0),
00183 m_timeoffset(0),
00184 m_driftfield(0),
00185 m_gas(0),
00186 m_electronics(0),
00187 m_cathode(0),
00188 m_temps(0)
00189 {
00190 }
00191
00192 StFtpcSlowSimMaker::~StFtpcSlowSimMaker(){
00193 }
00194
00195 Int_t StFtpcSlowSimMaker::InitRun(int runnumber){
00196 Float_t x[3] = {0,0,0};
00197 Float_t b[3];
00198 gufld(x,b);
00199 Double_t gFactor = b[2]/4.980;
00200
00201 mDbMaker = (St_db_Maker*)GetMaker("db");
00202 Int_t dbDate = mDbMaker->GetDateTime().GetDate();
00203 LOG_INFO<<"dbDate = "<<dbDate<<endm;
00204
00205 LOG_INFO << "StFtpcSlowSimMaker::InitRun("<<runnumber<<") - 'flavor' FTPC drift maps for gFactor = "<<gFactor<<endm;
00206
00207
00208
00209
00210 if ( gFactor > 0.8 ) {
00211 SetFlavor("ffp10kv","ftpcVDrift");
00212 SetFlavor("ffp10kv","ftpcdVDriftdP");
00213 SetFlavor("ffp10kv","ftpcDeflection");
00214 SetFlavor("ffp10kv","ftpcdDeflectiondP");
00215 LOG_INFO << "StFtpcSlowSimMaker::InitRun: flavor set to ffp10kv"<<endm;
00216 }
00217 else if ( gFactor > 0.2 ) {
00218 SetFlavor("hfp10kv","ftpcVDrift");
00219 SetFlavor("hfp10kv","ftpcdVDriftdP");
00220 SetFlavor("hfp10kv","ftpcDeflection");
00221 SetFlavor("hfp10kv","ftpcdDeflectiondP");
00222 LOG_INFO << "StFtpcSlowSimMaker::InitRun: flavor set to hfp10kv"<<endm;
00223 }
00224 else if ( gFactor > -0.2 ) {
00225 SetFlavor("zf10kv","ftpcVDrift");
00226 SetFlavor("zf10kv","ftpcdVDriftdP");
00227 SetFlavor("zf10kv","ftpcDeflection");
00228 SetFlavor("zf10kv","ftpcdDeflectiondP");
00229 LOG_INFO << "StFtpcSlowSimMaker::InitRun: flavor set to zf10kv"<<endm;
00230 }
00231 else if ( gFactor > -0.8 ) {
00232 SetFlavor("hfn10kv","ftpcVDrift");
00233 SetFlavor("hfn10kv","ftpcdVDriftdP");
00234 SetFlavor("hfn10kv","ftpcDeflection");
00235 SetFlavor("hfn10kv","ftpcdDeflectiondP");
00236 LOG_INFO << "StFtpcSlowSimMaker::InitRun: flavor set to hfn10kv"<<endm;
00237 }
00238 else {
00239 SetFlavor("ffn10kv","ftpcVDrift");
00240 SetFlavor("ffn10kv","ftpcdVDriftdP");
00241 SetFlavor("ffn10kv","ftpcDeflection");
00242 SetFlavor("ffn10kv","ftpcdDeflectiondP");
00243 LOG_INFO << "StFtpcSlowSimMaker::InitRun: flavor set to ffn10kv"<<endm;
00244 }
00245
00246
00247
00248
00249 StDetectorDbClock* dbclock = StDetectorDbClock::instance();
00250 double freq = dbclock->getCurrentFrequency()/1000000.0;
00251 if ( freq != 0)
00252 microsecondsPerTimebin = 1./(freq/2.);
00253 else
00254 microsecondsPerTimebin = 0.;
00255
00256 St_DataSet *ftpc_geometry_db = GetDataBase("Geometry/ftpc");
00257 if ( !ftpc_geometry_db ){
00258 LOG_WARN << "StFtpcSlowSimMaker::Error Getting FTPC database: Geometry"<<endm;
00259 return kStWarn;
00260 }
00261 St_DataSetIter dblocal_geometry(ftpc_geometry_db);
00262
00263 m_dimensions = (St_ftpcDimensions *)dblocal_geometry("ftpcDimensions");
00264 m_asicmap = (St_ftpcAsicMap *)dblocal_geometry("ftpcAsicMap");
00265
00266 m_cathode = (St_ftpcInnerCathode *)dblocal_geometry("ftpcInnerCathode");
00267
00268 St_DataSet *ftpc_calibrations_db = GetDataBase("Calibrations/ftpc");
00269 if ( !ftpc_calibrations_db ){
00270 LOG_WARN << "StFtpcSlowSimMaker::Error Getting FTPC database: Calibrations"<<endm;
00271 return kStWarn;
00272 }
00273 St_DataSetIter dblocal_calibrations(ftpc_calibrations_db);
00274
00275
00276 m_efield = (St_ftpcEField *)dblocal_calibrations("ftpcEField" );
00277 m_vdrift = (St_ftpcVDrift *)dblocal_calibrations("ftpcVDrift" );
00278 m_deflection = (St_ftpcDeflection *)dblocal_calibrations("ftpcDeflection" );
00279 m_dvdriftdp = (St_ftpcdVDriftdP *)dblocal_calibrations("ftpcdVDriftdP" );
00280 m_ddeflectiondp = (St_ftpcdDeflectiondP *)dblocal_calibrations("ftpcdDeflectiondP" );
00281 m_gas = (St_ftpcGas *)dblocal_calibrations("ftpcGas");
00282 m_driftfield = (St_ftpcDriftField *)dblocal_calibrations("ftpcDriftField");
00283 m_electronics = (St_ftpcElectronics *)dblocal_calibrations("ftpcElectronics");
00284 m_temps = (St_ftpcTemps *)dblocal_calibrations("ftpcTemps");
00285
00286
00287 m_ampslope = (St_ftpcAmpSlope *)dblocal_calibrations("ftpcAmpSlope" );
00288 m_ampoffset = (St_ftpcAmpOffset *)dblocal_calibrations("ftpcAmpOffset");
00289
00290 m_timeoffset = (St_ftpcTimeOffset *)dblocal_calibrations("ftpcTimeOffset");
00291
00292
00293
00294 TDataSet *ftpcParsDb = GetInputDB("ftpc");
00295 assert(ftpcParsDb);
00296 TDataSetIter ftpcPars(ftpcParsDb);
00297
00298
00299 StFtpcTrackingParams::Instance(Debug(),
00300 (St_ftpcTrackingPars *)ftpcPars("ftpcTrackingPars"),
00301 (St_ftpcdEdxPars *)ftpcPars("ftpcdEdxPars"),
00302 (St_ftpcDimensions *)dblocal_geometry("ftpcDimensions"),
00303 (St_ftpcPadrowZ *)dblocal_geometry("ftpcPadrowZ"));
00304
00305 StFtpcTrackingParams::Instance(kTRUE,
00306 (St_ftpcCoordTrans *)dblocal_calibrations("ftpcCoordTrans"),
00307 GetDataBase("RunLog"));
00308
00309 St_DataSet *ftpclocal = GetDataBase("ftpc");
00310 if ( !ftpclocal ){
00311 LOG_WARN << "StFtpcSlowSimMaker::Error Getting local FTPC database: Calibrations"<<endm;
00312 return kStWarn;
00313 }
00314
00315 St_DataSetIter local(ftpclocal);
00316
00317
00318
00319 m_clusterpars = (St_ftpcClusterPars *)local("ftpcClusterPars");
00320 m_slowsimgas = (St_ftpcSlowSimGas *)local("ftpcSlowSimGas");
00321 m_slowsimpars = (St_ftpcSlowSimPars *)local("ftpcSlowSimPars");
00322
00323 return 0;
00324 }
00325
00326 Int_t StFtpcSlowSimMaker::Init(){
00327
00328
00329
00330 m_nadc = new TH1F("fss_total_adc","Total number of adcs in both FTPCs",1000,0.,2000000.);
00331 m_nsqndx = new TH1F("fss_sqndx","FTPC raw data sequence index",100,0.,100000.);
00332 m_nadc_index1 = new TH2F("fss_nadc_index1","Total number of adcs vs. number of adcs in FTPC East",100,0.,2000000.,100,0.,1000000.);
00333
00334 return StMaker::Init();
00335 }
00336
00337 Int_t StFtpcSlowSimMaker::Make(){
00338 LOG_INFO << "Event number "<<(int) GetEventNumber()<<endm;
00339
00340 St_DataSetIter geant(GetInputDS("geant"));
00341 St_g2t_vertex *g2t_vertex = (St_g2t_vertex *) geant("g2t_vertex");
00342 St_g2t_track *g2t_track = (St_g2t_track *) geant("g2t_track");
00343 St_g2t_ftp_hit *g2t_ftp_hit = (St_g2t_ftp_hit *) geant("g2t_ftp_hit");
00344 if (g2t_vertex && g2t_track && g2t_ftp_hit){
00345
00346 St_DataSetIter local(m_DataSet); local.Cd("pixels");
00347 St_fcl_ftpcndx *fcl_ftpcndx = new St_fcl_ftpcndx("fcl_ftpcndx",2);
00348 local.Add(fcl_ftpcndx);
00349 St_fcl_ftpcsqndx *fcl_ftpcsqndx = new St_fcl_ftpcsqndx("fcl_ftpcsqndx",500000);
00350 local.Add(fcl_ftpcsqndx);
00351 St_fcl_ftpcadc *fcl_ftpcadc = new St_fcl_ftpcadc("fcl_ftpcadc",2000000);
00352 local.Add(fcl_ftpcadc);
00353
00354 if (Debug()) {LOG_DEBUG <<"create data reader" << endm;}
00355
00356
00357 StFtpcGeantReader *geantReader = new StFtpcGeantReader(g2t_vertex,
00358 g2t_track,
00359 g2t_ftp_hit);
00360 if (Debug()) {LOG_DEBUG <<"create FTPC database reader" << endm;}
00361
00362 StFtpcDbReader *dbReader = new StFtpcDbReader(m_dimensions,
00363 m_asicmap,
00364 m_efield,
00365 m_vdrift,
00366 m_deflection,
00367 m_dvdriftdp,
00368 m_ddeflectiondp,
00369 m_gas,
00370 m_driftfield,
00371 m_electronics,
00372 m_ampslope,
00373 m_ampoffset,
00374 m_timeoffset,
00375 m_cathode);
00376
00377 if ( dbReader->returnCode != 0 ) {
00378 LOG_WARN << "StFtpcSlowSimMaker::Error Constructing StFtpcDbReader "<<endm;
00379 return kStWarn;
00380 }
00381
00382 if (Debug()) { LOG_DEBUG << "create parameter reader" << endm;}
00383
00384 StFtpcParamReader *paramReader = new StFtpcParamReader(m_clusterpars,
00385 m_slowsimgas,
00386 m_slowsimpars);
00387
00388
00389
00390
00391 if ( paramReader->gasTemperatureWest() == 0 && paramReader->gasTemperatureEast() == 0) {
00392 LOG_INFO << "Using the following values from database:" << endm;
00393 if (microsecondsPerTimebin > 0.0 ) {
00394 dbReader->setMicrosecondsPerTimebin(microsecondsPerTimebin);
00395 LOG_INFO<<" microsecondsPerTimebin = "<<dbReader->microsecondsPerTimebin()<<" (calculated from RHIC Clock Frequency)"<<endm;
00396 } else {
00397 LOG_INFO<<" microsecondsPerTimebin = "<<dbReader->microsecondsPerTimebin()<<" (default value from database)"<<endm;
00398 }
00399 LOG_INFO <<" EastIsInverted = "<<dbReader->EastIsInverted()<<endm;
00400 LOG_INFO <<" Asic2EastNotInverted = "<<dbReader->Asic2EastNotInverted()<<endm;
00401 LOG_INFO <<" tzero = "<<dbReader->tZero()<<endm;
00402 LOG_INFO <<" temperatureDifference = "<<dbReader->temperatureDifference()<<endm;
00403 LOG_INFO <<" defaultTemperatureWest = "<<dbReader->defaultTemperatureWest()<<endm;
00404 LOG_INFO <<" defaultTemperatureEast = "<<dbReader->defaultTemperatureEast()<<endm;
00405 LOG_INFO <<" magboltzVDrift(0,0) = "<<dbReader->magboltzVDrift(0,0)<<endm;
00406 LOG_INFO <<" magboltzDeflection(0,0) = "<<dbReader->magboltzDeflection(0,0)<<endm;
00407
00408 LOG_INFO <<" offsetCathodeWest = " << dbReader->offsetCathodeWest() << endm;
00409 LOG_INFO <<" angleOffsetWest = " << dbReader->angleOffsetWest() << endm;
00410 LOG_INFO <<" offsetCathodeEast = " << dbReader->offsetCathodeEast() << endm;
00411 LOG_INFO <<" angleOffsetEast = " << dbReader->angleOffsetEast() << endm;
00412 }
00413 LOG_DEBUG<<" Using microsecondsPerTimebin = "<<dbReader->microsecondsPerTimebin()<<" for this event"<<endm;
00414
00415
00416
00417
00418 St_DataSet *daqDataset;
00419 StDAQReader *daqReader;
00420 StFTPCReader *ftpcReader=NULL;
00421 daqDataset=GetDataSet("StDAQReader");
00422 if(daqDataset)
00423 {
00424 LOG_INFO << "Using StDAQReader to get StFTPCReader in StFtpcSlowSimMaker for embedding" << endm;
00425 assert(daqDataset);
00426 daqReader=(StDAQReader *)(daqDataset->GetObject());
00427 assert(daqReader);
00428 ftpcReader=daqReader->getFTPCReader();
00429
00430 if (!ftpcReader || !ftpcReader->checkForData()) {
00431 LOG_WARN << "No FTPC data available!" << endm;
00432 delete paramReader;
00433 delete dbReader;
00434 return kStWarn;
00435 }
00436
00437
00438
00439 StDetectorDbFTPCGas * gas = StDetectorDbFTPCGas::instance();
00440 if ( !gas ){
00441 LOG_WARN << "StFtpcSlowSimMaker::Error Getting FTPC Online database: Conditions"<<endm;
00442 delete paramReader;
00443 delete dbReader;
00444 return kStWarn;
00445 }
00446
00447 Int_t returnCode;
00448
00449
00450
00451
00452
00453 StFtpcGasUtilities *gasUtils = new StFtpcGasUtilities(paramReader,
00454 dbReader,
00455 gas,
00456 m_temps);
00457
00458 returnCode = gasUtils->barometricPressure();
00459
00460
00461
00462 Int_t dbDate = mDbMaker->GetDateTime().GetDate();
00463
00464
00465
00466 returnCode = gasUtils->averageTemperatureWest(dbDate,GetRunNumber());
00467
00468
00469 if (paramReader->gasTemperatureWest() == 0) {
00470
00471
00472
00473
00474
00475 LOG_INFO << "daqReader->SVTPresent() = " << daqReader->SVTPresent()<<endm;
00476 returnCode = gasUtils->defaultTemperatureWest(dbDate,daqReader->SVTPresent());
00477 }
00478
00479
00480
00481 returnCode = gasUtils->averageTemperatureEast(dbDate,GetRunNumber());
00482
00483
00484 if (paramReader->gasTemperatureEast() == 0 ) {
00485
00486
00487
00488
00489
00490 LOG_INFO << "daqReader->SVTPresent() = " << daqReader->SVTPresent()<<endm;
00491 returnCode = gasUtils->defaultTemperatureEast(dbDate,daqReader->SVTPresent());
00492 }
00493
00494 LOG_INFO << " Using normalizedNowPressure = "<<paramReader->normalizedNowPressure()<<" gasTemperatureWest = "<<paramReader->gasTemperatureWest()<<" gasTemperatureEast = "<<paramReader->gasTemperatureEast()<<endm;
00495 paramReader->setAdjustedAirPressureWest(paramReader->normalizedNowPressure()*((dbReader->baseTemperature()+STP_Temperature)/(paramReader->gasTemperatureWest()+STP_Temperature)));
00496 LOG_INFO <<" paramReader->setAdjustedAirPressureWest = "<<paramReader->adjustedAirPressureWest()<<endm;
00497 paramReader->setAdjustedAirPressureEast(paramReader->normalizedNowPressure()*((dbReader->baseTemperature()+STP_Temperature)/(paramReader->gasTemperatureEast()+STP_Temperature)));
00498 LOG_INFO <<" paramReader->setAdjustedAirPressureEast = "<<paramReader->adjustedAirPressureEast()<<endm;
00499
00500 delete gasUtils;
00501 }
00502
00503
00504 if (Debug()) {LOG_DEBUG <<" create data writer"<<endm;}
00505
00506
00507 StFtpcRawWriter *dataWriter = new StFtpcRawWriter(fcl_ftpcndx,
00508 fcl_ftpcsqndx,
00509 fcl_ftpcadc,
00510 dbReader->Asic2EastNotInverted());
00511
00512
00513 if (Debug()) {LOG_DEBUG <<"Create SlowSimulator"<<endm;}
00514
00515 StFtpcSlowSimulator *slowsim = new StFtpcSlowSimulator(geantReader,
00516 paramReader,
00517 dbReader,
00518 dataWriter);
00519
00520
00521 LOG_INFO << "FTPC SlowSimulator starting... " <<endm;
00522 Int_t Res_fss = slowsim->simulate();
00523
00524 delete slowsim;
00525 delete paramReader;
00526 delete dbReader;
00527 delete dataWriter;
00528 delete geantReader;
00529
00530 if (Res_fss) {
00531 if(Debug()) {LOG_INFO << "finished fss" << endm;}
00532 }
00533 }
00534 MakeHistograms();
00535
00536 LOG_INFO << "FTPC SlowSimulator done... " <<endm;
00537 return kStOK;
00538 }
00539
00540 void StFtpcSlowSimMaker::MakeHistograms() {
00541
00542 if(Debug()) {LOG_INFO << "*** NOW MAKING HISTOGRAMS FOR FtpcSlowSim ***" << endm;}
00543
00544
00545 St_DataSetIter ftpc_raw(m_DataSet);
00546
00547
00548 St_fcl_ftpcadc *adc = 0;
00549 St_fcl_ftpcndx *ndx = 0;
00550 St_fcl_ftpcsqndx *sqndx = 0;
00551 adc = (St_fcl_ftpcadc *) ftpc_raw.Find("fcl_ftpcadc");
00552 ndx = (St_fcl_ftpcndx *) ftpc_raw.Find("fcl_ftpcndx");
00553 sqndx = (St_fcl_ftpcsqndx *) ftpc_raw.Find("fcl_ftpcsqndx");
00554
00555 if (adc) {
00556 Float_t nadc = adc->GetNRows();
00557 LOG_INFO << "total # adcs = " << adc->GetNRows() << ", nadc = " << nadc << endm;
00558 m_nadc->Fill(nadc);
00559 }
00560 if (ndx) {
00561 fcl_ftpcndx_st *r = ndx->GetTable();
00562 Float_t index1 = ++r->index;
00563
00564 if (adc) {
00565 m_nadc_index1->Fill((float)adc->GetNRows(),(float)index1);
00566 }
00567 }
00568 if (sqndx) {
00569 fcl_ftpcsqndx_st *r = sqndx->GetTable();
00570 for (Int_t i=0; i<sqndx->GetNRows();i++,r++) {
00571 m_nsqndx->Fill((float)r->index);
00572 }
00573 }
00574 }
00575
00576