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 #include <assert.h>
00088 #include "StSvtDbMaker.h"
00089
00090 #include "St_DataSetIter.h"
00091 #include "St_ObjectSet.h"
00092 #include "StMessMgr.h"
00093
00094 #include "StSvtClassLibrary/StSvtEnumerations.hh"
00095
00096 #include "StDbUtilities/StCoordinates.hh"
00097 #include "StDbUtilities/StSvtCoordinateTransform.hh"
00098 #include "StSvtClassLibrary/StSvtGeometry.hh"
00099 #include "StSvtClassLibrary/StSvtT0.hh"
00100
00101 #include "TMath.h"
00102 #include "TVector3.h"
00103 #include "StSvtClassLibrary/StSvtConfig.hh"
00104 #include "StSvtClassLibrary/StSvtHybridPed.hh"
00105 #include "StSvtClassLibrary/StSvtHybridDriftVelocity.hh"
00106 #include "StSvtClassLibrary/StSvtHybridDriftCurve.hh"
00107 #include "StSvtClassLibrary/StSvtHybridAnodeDriftCorr.hh"
00108 #include "StSvtClassLibrary/StSvtHybridCollection.hh"
00109 #include "StSvtClassLibrary/StSvtHybridBadAnodes.hh"
00110 #include "StSvtClassLibrary/StSvtGeometry.hh"
00111 #include "StSvtClassLibrary/StSvtWaferGeometry.hh"
00112 #include "StSvtClassLibrary/StSvtT0.hh"
00113 #include "StSvtClassLibrary/StSvtDaq.hh"
00114
00115 #include "tables/St_svtConfiguration_Table.h"
00116 #include "tables/St_svtDriftVelAvg_Table.h"
00117 #include "tables/St_svtDriftCurve_Table.h"
00118 #include "tables/St_svtBadAnodes_Table.h"
00119 #include "tables/St_svtAnodeDriftCorr_Table.h"
00120 #include "tables/St_svtPedestals_Table.h"
00121 #include "tables/St_svtRms_Table.h"
00122 #if 0
00123 #include "tables/St_svtWafersPosition_Table.h"
00124 #else
00125 #include "tables/St_Survey_Table.h"
00126 #endif
00127 #include "tables/St_svtDimensions_Table.h"
00128 #include "tables/St_svtElectronics_Table.h"
00129 #include "tables/St_svtDaq_Table.h"
00130 #include "tables/St_svtHybridDriftVelocity_Table.h"
00131 #include "StDbUtilities/St_svtRDOstrippedC.h"
00132 #include "StDbUtilities/St_svtHybridDriftVelocityC.h"
00133 #include "StTpcDb/StTpcDb.h"
00134
00135 svtElectronics_st *electronic = NULL;
00136 THashList *StSvtDbMaker::fRotList = 0;
00137 StSvtDbMaker* gStSvtDbMaker = 0;
00138
00139
00140
00141 int type_of_call SvtGtoL_(float *x,float *xp, int* index){
00142
00143 StThreeVector<double> a(x[0], x[1], x[2]);
00144 StSvtCoordinateTransform transform;
00145 St_DataSet* dataSet;
00146 dataSet = gStSvtDbMaker->GetDataSet("StSvtGeometry");
00147 StSvtGeometry *GeomDataBase = (StSvtGeometry*)dataSet->GetObject();
00148 if(GeomDataBase) transform.setParamPointers(GeomDataBase, NULL, NULL, NULL, NULL);
00149 StSvtLocalCoordinate b;
00150
00151 transform.GlobaltoLocal(a, b,*index, -1);
00152
00153 xp[0] = b.position().x();
00154 xp[1] = b.position().y();
00155 xp[2] = b.position().z();
00156
00157 return 0;
00158
00159 }
00160
00161 int type_of_call SvtLtoG_(float *xp, float *x, int* index){
00162 StSvtLocalCoordinate a;
00163 int layer,ladder,wafer;
00164
00165 a.setPosition(StThreeVector<double>(xp[0],xp[1],xp[2]));
00166 StSvtCoordinateTransform transform;
00167 St_DataSet* dataSet;
00168 dataSet = gStSvtDbMaker->GetDataSet("StSvtGeometry");
00169 StSvtGeometry *GeomDataBase = (StSvtGeometry*)dataSet->GetObject();
00170 if(GeomDataBase) transform.setParamPointers(GeomDataBase, NULL, NULL, NULL, NULL);
00171
00172 StThreeVector<double> b(0,0,0);
00173 StGlobalCoordinate c;
00174
00175 layer = *index/1000;
00176 wafer = (*index -1000*layer)/100;
00177 ladder = *index -1000*layer -100*wafer;
00178 a.setLayer(layer);
00179 a.setLadder(ladder);
00180 a.setWafer(wafer);
00181 a.setHybrid(1);
00182
00183 transform.LocaltoGlobal(a, b, -1);
00184
00185 x[0] = b.x();
00186 x[1] = b.y();
00187 x[2] = b.z();
00188
00189 return 0;
00190 }
00191
00192 ClassImp(StSvtDbMaker)
00193
00194 StSvtDbMaker::StSvtDbMaker(const char *name):StMaker(name) { gStSvtDbMaker = this;}
00195
00196 StSvtDbMaker::~StSvtDbMaker() { gStSvtDbMaker = NULL;}
00197
00198 Int_t StSvtDbMaker::Init()
00199 {
00200 if (Debug()) gMessMgr->Debug() << "StSvtDbMaker::Init" << endm;
00201 #if 0
00202 if( m_Mode == 1) {
00203 const Char_t *tabNames[3] = {"svtWafersPosition","svtDriftCorrection","svtRDOstripped"};
00204 for (Int_t i = 0; i < 3; i++) {
00205 gMessMgr->Message() <<
00206 "StSvtDbMaker::Init setting " << tabNames[i] << " to simu" << endm;
00207 SetFlavor("simu",tabNames[i]);
00208 }
00209 }
00210 #endif
00211 return StMaker::Init();
00212 }
00213
00214
00215 Int_t StSvtDbMaker::InitRun(int runumber)
00216 {
00217 gMessMgr->Info() << "StSvtDbMaker::InitRun" << endm;
00218
00219 St_svtRDOstrippedC *svtRDOstrippedC = St_svtRDOstrippedC::instance();
00220 if (! svtRDOstrippedC) {
00221 St_svtRDOstripped *svtRDOstripped = (St_svtRDOstripped *) GetDataBase("Calibrations/svt/svtRDOstripped");
00222 if (svtRDOstripped) svtRDOstrippedC = new St_svtRDOstrippedC(svtRDOstripped);
00223 }
00224 assert(St_svtRDOstrippedC::instance());
00225
00226 St_svtHybridDriftVelocityC *svtHybridDriftVelocityC = St_svtHybridDriftVelocityC::instance();
00227 if (! svtHybridDriftVelocityC) {
00228 St_svtHybridDriftVelocity *svtHybridDriftVelocity =
00229 (St_svtHybridDriftVelocity *) GetDataBase("Calibrations/svt/svtHybridDriftVelocity");
00230 if (svtHybridDriftVelocity) svtHybridDriftVelocityC = new St_svtHybridDriftVelocityC(svtHybridDriftVelocity);
00231 }
00232 assert(St_svtHybridDriftVelocityC::instance());
00233 return kStOk;
00234 }
00235
00236
00237 Int_t StSvtDbMaker::Make()
00238 {
00239 if (Debug()) gMessMgr->Debug() << "StSvtDbMaker::Make" << endm;
00240 St_svtRDOstrippedC *svtRDOstrippedC = St_svtRDOstrippedC::instance();
00241 if (svtRDOstrippedC) {
00242 UInt_t ut = GetDateTime().Convert();
00243 svtRDOstrippedC->SetDate(ut);
00244 if (Debug() > 2) svtRDOstrippedC->PrintRDOmap();
00245 }
00246 return kStOK;
00247 }
00248
00249
00250 void StSvtDbMaker::Clear(const char*)
00251 {
00252 if (Debug()) gMessMgr->Debug() << "StSvtDaqMaker::Clear" << endm;
00253
00254 StMaker::Clear();
00255 }
00256
00257
00258 Int_t StSvtDbMaker::Finish()
00259 {
00260 if (Debug()) gMessMgr->Debug() << "StSvtDbMaker::Finish" << endm;
00261 return kStOK;
00262 }
00263
00264
00265 StSvtConfig* StSvtDbMaker::getConfiguration()
00266 {
00267 gMessMgr->Info() << "StSvtDbMaker::getConfiguration" << endm;
00268
00269 St_svtConfiguration *configuration = (St_svtConfiguration*) GetDataBase("Geometry/svt/svtConfiguration");
00270 if (!(configuration && configuration->HasData()) ){
00271 gMessMgr->Message("Error Finding SVT Configuration","E");
00272 return 0;
00273 }
00274
00275 svtConfiguration_st* config = configuration->GetTable();
00276
00277 gMessMgr->Info() << "numberOfBarrels = " << config->numberOfBarrels << endm;
00278 gMessMgr->Info() << "numberOfLadders = " << config->numberOfLadders << endm;
00279 gMessMgr->Info() << "numberOfWafers = " << config->numberOfWafers << endm;
00280 gMessMgr->Info() << "numberOfHybrids = " << config->numberOfHybrids << endm;
00281
00282 gMessMgr->Info() << "numberOfLaddersPerBarrel[0] = " << config->numberOfLaddersPerBarrel[0] << endm;
00283 gMessMgr->Info() << "numberOfLaddersPerBarrel[1] = " << config->numberOfLaddersPerBarrel[1] << endm;
00284 gMessMgr->Info() << "numberOfLaddersPerBarrel[2] = " << config->numberOfLaddersPerBarrel[2] << endm;
00285 gMessMgr->Info() << "numberOfWafersPerLadder[0] = " << config->numberOfWafersPerLadder[0] << endm;
00286 gMessMgr->Info() << "numberOfWafersPerLadder[1] = " << config->numberOfWafersPerLadder[1] << endm;
00287 gMessMgr->Info() << "numberOfWafersPerLadder[2] = " << config->numberOfWafersPerLadder[2] << endm;
00288 gMessMgr->Info() << "numberOfHybridsPerWafer = " << config->numberOfHybridsPerWafer << endm;
00289
00290 StSvtConfig *mSvtConfig = new StSvtConfig();
00291 mSvtConfig->setNumberOfBarrels(config->numberOfBarrels);
00292
00293 for (int i=0; i<config->numberOfBarrels; i++) {
00294 mSvtConfig->setNumberOfLadders(i+1,config->numberOfLaddersPerBarrel[i]);
00295 mSvtConfig->setNumberOfWafers(i+1, config->numberOfWafersPerLadder[i]);
00296 }
00297 mSvtConfig->setNumberOfHybrids(config->numberOfHybridsPerWafer);
00298 mSvtConfig->setTotalNumberOfHybrids(config->numberOfHybrids);
00299
00300
00301 mSvtConfig->setNumberOfAnodes(240);
00302 mSvtConfig->setNumberOfTimeBins(128);
00303
00304 mSvtConfig->setConfiguration();
00305
00306 return mSvtConfig;
00307 }
00308
00309
00310
00311 StSvtHybridCollection* StSvtDbMaker::getDriftCurve()
00312 {
00313 gMessMgr->Info() << "StSvtDbMaker::getDriftVelocityCurve" << endm;
00314 StSvtConfig *mSvtConfig = (StSvtConfig *) (((TObjectSet *) GetDataSet("StSvtConfig"))->GetObject());
00315 StSvtHybridCollection *mSvtDriftCurve = (StSvtHybridCollection *) new StSvtHybridCollection(mSvtConfig);
00316
00317 St_svtDriftCurve *driftVelocityCurve=0;
00318
00319 svtDriftCurve_st *driftCurve=0;
00320 StSvtHybridDriftCurve* hybridDriftCurve=0;
00321
00322 char path[100];
00323 int index;
00324
00325 for (int barrel = 1;barrel <= mSvtConfig->getNumberOfBarrels();barrel++) {
00326 for (int ladder = 1;ladder <= mSvtConfig->getNumberOfLadders(barrel);ladder++) {
00327 for (int wafer = 1;wafer <= mSvtConfig->getNumberOfWafers(barrel);wafer++) {
00328 for (int hybrid = 1;hybrid <= mSvtConfig->getNumberOfHybrids();hybrid++) {
00329
00330 index = mSvtConfig->getHybridIndex(barrel,ladder,wafer,hybrid);
00331
00332 if (index < 0) continue;
00333
00334 switch (barrel) {
00335 case 1:
00336 sprintf(path,"InnerBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtDriftCurve",ladder,wafer,hybrid);
00337 break;
00338 case 2:
00339 if (ladder < 10)
00340 sprintf(path,"MiddleBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtDriftCurve",ladder,wafer,hybrid);
00341 else
00342 sprintf(path,"MiddleBarrel/Ladder_%d/Wafer_0%d/Hybrid_0%d/svtDriftCurve",ladder,wafer,hybrid);
00343 break;
00344 case 3:
00345 if (ladder < 10)
00346 sprintf(path,"OuterBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtDriftCurve",ladder,wafer,hybrid);
00347 else
00348 sprintf(path,"OuterBarrel/Ladder_%d/Wafer_0%d/Hybrid_0%d/svtDriftCurve",ladder,wafer,hybrid);
00349 break;
00350 }
00351
00352
00353 TString Path("Calibrations/svt/");
00354 Path += path;
00355 driftVelocityCurve = (St_svtDriftCurve*) GetDataBase(Path);
00356 if (!(driftVelocityCurve && driftVelocityCurve->HasData()) ){
00357 gMessMgr->Message("Error Finding SVT drift velocity curve","E");
00358 return NULL;
00359 }
00360
00361 driftCurve = driftVelocityCurve->GetTable();
00362
00363 hybridDriftCurve = (StSvtHybridDriftCurve*)mSvtDriftCurve->at(index);
00364 if (!hybridDriftCurve)
00365 hybridDriftCurve = new StSvtHybridDriftCurve(barrel,ladder,wafer,hybrid);
00366
00367
00368 for (int i=1; i<=3; i++)
00369 for (int j=1; j<=10; j++) {
00370 hybridDriftCurve->setParameter(i,j,driftCurve->driftCurve[i-1][j-1]);
00371
00372 }
00373
00374 mSvtDriftCurve->put_at(hybridDriftCurve,index);
00375
00376 }
00377 }
00378 }
00379 }
00380
00381 return mSvtDriftCurve;
00382 }
00383
00384
00385 StSvtHybridCollection* StSvtDbMaker::getAnodeDriftCorr()
00386 {
00387 gMessMgr->Info() << "StSvtDbMaker::getAnodeDriftCorr" << endm;
00388
00389
00390 St_svtAnodeDriftCorr *anodeDriftCorr;
00391 svtAnodeDriftCorr_st *driftCorr;
00392
00393
00394 StSvtConfig *mSvtConfig = (StSvtConfig *) (((TObjectSet *) GetDataSet("StSvtConfig"))->GetObject());
00395 StSvtHybridCollection *mSvtAnodeDriftCorr = new StSvtHybridCollection(mSvtConfig);
00396 StSvtHybridAnodeDriftCorr* hybridAnodeDriftCorr;
00397
00398 char path[100];
00399 int index;
00400
00401 for (int barrel = 1;barrel <= mSvtConfig->getNumberOfBarrels();barrel++) {
00402 for (int ladder = 1;ladder <= mSvtConfig->getNumberOfLadders(barrel);ladder++) {
00403 for (int wafer = 1;wafer <= mSvtConfig->getNumberOfWafers(barrel);wafer++) {
00404 for (int hybrid = 1;hybrid <= mSvtConfig->getNumberOfHybrids();hybrid++) {
00405
00406 index = mSvtConfig->getHybridIndex(barrel,ladder,wafer,hybrid);
00407
00408 if (index < 0) continue;
00409
00410 switch (barrel) {
00411 case 1:
00412 sprintf(path,"InnerBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtAnodeDriftCorr",ladder,wafer,hybrid);
00413 break;
00414 case 2:
00415 if (ladder < 10)
00416 sprintf(path,"MiddleBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtAnodeDriftCorr",ladder,wafer,hybrid);
00417 else
00418 sprintf(path,"MiddleBarrel/Ladder_%d/Wafer_0%d/Hybrid_0%d/svtAnodeDriftCorr",ladder,wafer,hybrid);
00419 break;
00420 case 3:
00421 if (ladder < 10)
00422 sprintf(path,"OuterBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtAnodeDriftCorr",ladder,wafer,hybrid);
00423 else
00424 sprintf(path,"OuterBarrel/Ladder_%d/Wafer_0%d/Hybrid_0%d/svtAnodeDriftCorr",ladder,wafer,hybrid);
00425 break;
00426 }
00427
00428
00429 TString Path("Calibrations/svt/");
00430 Path += path;
00431 anodeDriftCorr = (St_svtAnodeDriftCorr*) GetDataBase(Path);
00432 if (!(anodeDriftCorr && anodeDriftCorr->HasData()) ){
00433 gMessMgr->Message("Error Finding SVT bad anodes","E");
00434 return 0;
00435 }
00436 driftCorr = anodeDriftCorr->GetTable();
00437
00438 hybridAnodeDriftCorr = (StSvtHybridAnodeDriftCorr*)mSvtAnodeDriftCorr->at(index);
00439 if (!hybridAnodeDriftCorr)
00440 hybridAnodeDriftCorr = new StSvtHybridAnodeDriftCorr(barrel,ladder,wafer,hybrid);
00441
00442
00443 for (int anode=1;anode<=mSvtConfig->getNumberOfAnodes();anode++) {
00444 hybridAnodeDriftCorr->setValue(anode,driftCorr->driftVelocCorr[anode-1]);
00445
00446
00447 }
00448
00449 mSvtAnodeDriftCorr->put_at(hybridAnodeDriftCorr,index);
00450
00451 }
00452 }
00453 }
00454 }
00455
00456 return mSvtAnodeDriftCorr;
00457 }
00458
00459
00460 StSvtHybridCollection* StSvtDbMaker::getPedestals()
00461 {
00462 gMessMgr->Info() << "StSvtDbMaker::getPedestals" << endm;
00463
00464 St_svtPedestals *pedestals = (St_svtPedestals*)GetDataBase("Calibrations/svt/svtPedestals");
00465 if (!(pedestals && pedestals->HasData()) ){
00466 gMessMgr->Message("Error Finding SVT Pedestals","E");
00467 return 0;
00468 }
00469
00470 svtPedestals_st *pedestal = pedestals->GetTable();
00471
00472
00473 StSvtConfig *mSvtConfig = (StSvtConfig *) (((TObjectSet *) GetDataSet("StSvtConfig"))->GetObject());
00474 StSvtHybridCollection *mSvtPed = new StSvtHybridCollection(mSvtConfig);
00475 StSvtHybridPed* hybridPed;
00476 int index;
00477
00478 for (int barrel = 1;barrel <= mSvtConfig->getNumberOfBarrels();barrel++) {
00479 for (int ladder = 1;ladder <= mSvtConfig->getNumberOfLadders(barrel);ladder++) {
00480 for (int wafer = 1;wafer <= mSvtConfig->getNumberOfWafers(barrel);wafer++) {
00481 for (int hybrid = 1;hybrid <= mSvtConfig->getNumberOfHybrids();hybrid++) {
00482
00483 index = mSvtConfig->getHybridIndex(barrel,ladder,wafer,hybrid);
00484
00485 if (index < 0) continue;
00486
00487 hybridPed = (StSvtHybridPed*)mSvtPed->at(index);
00488 if (!hybridPed)
00489 hybridPed = new StSvtHybridPed(barrel,ladder,wafer,hybrid);
00490 hybridPed->reset();
00491
00492
00493 for (int anode = 1; anode <= mSvtConfig->getNumberOfAnodes(); anode++)
00494 for (int time = 0; time < mSvtConfig->getNumberOfTimeBins(); time++) {
00495 hybridPed->addToPixel(anode,time,pedestal[index].pedestal[anode-1][time]);
00496
00497 }
00498
00499 mSvtPed->put_at(hybridPed,index);
00500
00501 }
00502 }
00503 }
00504 }
00505
00506 return mSvtPed;
00507 }
00508
00509
00510
00511 StSvtHybridCollection* StSvtDbMaker::getRms()
00512 {
00513 gMessMgr->Info() << "StSvtDbMaker::getRms" << endm;
00514
00515 St_svtRms *st_rms = (St_svtRms*)GetDataBase("Calibrations/svt/svtRms");
00516 if (!(st_rms && st_rms->HasData()) ){
00517 gMessMgr->Message("Error Finding SVT RMS","E");
00518 return 0;
00519 }
00520
00521 svtRms_st *rms = st_rms->GetTable();
00522
00523
00524 StSvtConfig *mSvtConfig = (StSvtConfig *) (((TObjectSet *) GetDataSet("StSvtConfig"))->GetObject());
00525 StSvtHybridCollection *mSvtRms = new StSvtHybridCollection(mSvtConfig);
00526 StSvtHybridPixels* hybridRms;
00527 int index;
00528
00529 for (int barrel = 1;barrel <= mSvtConfig->getNumberOfBarrels();barrel++) {
00530 for (int ladder = 1;ladder <= mSvtConfig->getNumberOfLadders(barrel);ladder++) {
00531 for (int wafer = 1;wafer <= mSvtConfig->getNumberOfWafers(barrel);wafer++) {
00532 for (int hybrid = 1;hybrid <= mSvtConfig->getNumberOfHybrids();hybrid++) {
00533
00534 index = mSvtConfig->getHybridIndex(barrel,ladder,wafer,hybrid);
00535
00536 if (index < 0) continue;
00537
00538 hybridRms = (StSvtHybridPixels*)mSvtRms->at(index);
00539 if (!hybridRms)
00540 hybridRms = new StSvtHybridPixels(barrel,ladder,wafer,hybrid);
00541 hybridRms->reset();
00542
00543
00544 for (int anode = 1; anode <= mSvtConfig->getNumberOfAnodes(); anode++)
00545 for (int time = 0; time < mSvtConfig->getNumberOfTimeBins(); time++) {
00546 hybridRms->addToPixel(anode,time,rms[index].rms[anode-1][time]);
00547
00548 }
00549
00550 mSvtRms->put_at(hybridRms,index);
00551
00552 }
00553 }
00554 }
00555 }
00556
00557 return mSvtRms;
00558 }
00559
00560
00561 StSvtGeometry* StSvtDbMaker::getGeometry()
00562 {
00563 gMessMgr->Info() << "StSvtDbMaker::getGeometry" << endm;
00564
00565
00566 St_svtDimensions *dimensions = (St_svtDimensions*)GetDataBase("Geometry/svt/svtDimensions");
00567 if (!(dimensions && dimensions->HasData()) ){
00568 gMessMgr->Message("Error Finding SVT Dimensions","E");
00569 return 0;
00570 }
00571
00572 svtDimensions_st *dimension = dimensions->GetTable();
00573
00574
00575 StSvtConfig *mSvtConfig = (StSvtConfig *) (((TObjectSet *) GetDataSet("StSvtConfig"))->GetObject());
00576 StSvtGeometry *mSvtGeom = new StSvtGeometry(mSvtConfig);
00577 mSvtGeom->setBarrelRadius(dimension->barrelRadius);
00578 mSvtGeom->setWaferLength(dimension->waferLength);
00579 mSvtGeom->setWaferThickness(dimension->waferThickness);
00580 mSvtGeom->setWaferWidth(dimension->waferWidth);
00581
00582 mSvtGeom->setAnodePitch(0.025);
00583 mSvtGeom->setFocusRegionLength(dimension->focusRegionLength);
00584 mSvtGeom->setDistanceInjector(dimension->distanceInjector);
00585 mSvtGeom->setLaserPosition(dimension->laserPosition);
00586 fRotList = new THashList(100,0);
00587 fRotList->SetOwner(kFALSE);
00588 St_Survey *SvtOnGlobal = (St_Survey *) GetDataBase("Geometry/svt/SvtOnGlobal");
00589 if (! SvtOnGlobal) {cout << "SvtOnGlobal has not been found" << endl; return 0;}
00590
00591 TGeoHMatrix GL, LS,SG,LA,WG;
00592 Survey_st *OnGlobal = SvtOnGlobal->GetTable();
00593 GL.SetRotation(&OnGlobal->r00);
00594 GL.SetTranslation(&OnGlobal->t0);
00595 const TGeoHMatrix &Tpc2Global = gStTpcDb->Tpc2GlobalMatrix();
00596
00597
00598 St_Survey *WaferOnLadder = (St_Survey *) GetDataBase("Geometry/svt/WaferOnLadder");
00599 St_Survey *LadderOnSurvey = (St_Survey *) GetDataBase("Geometry/svt/LadderOnSurvey");
00600 St_Survey *LadderOnShell = (St_Survey *) GetDataBase("Geometry/svt/LadderOnShell");
00601 St_Survey *ShellOnGlobal = (St_Survey *) GetDataBase("Geometry/svt/ShellOnGlobal");
00602 Int_t NW = WaferOnLadder->GetNRows();
00603 Int_t NL = LadderOnSurvey->GetNRows();
00604 Survey_st *waferOnLadder = WaferOnLadder->GetTable();
00605 Survey_st *shellOnGlobal0 = ShellOnGlobal->GetTable(0);
00606 Survey_st *shellOnGlobal1 = ShellOnGlobal->GetTable(1);
00607 TGeoHMatrix LSU, LSH, SHG[2];
00608 SHG[0].SetRotation(&shellOnGlobal0->r00);
00609 SHG[0].SetTranslation(&shellOnGlobal0->t0);
00610 SHG[1].SetRotation(&shellOnGlobal1->r00);
00611 SHG[1].SetTranslation(&shellOnGlobal1->t0);
00612 TGeoHMatrix *comb;
00613 #if 0
00614 Double_t swap[9] = { 1, 0, 0, 0, 0, 1, 0, 1, 0};
00615 TGeoHMatrix SWAP("SWAP");
00616 SWAP.SetRotation(swap);
00617 #endif
00618 for (Int_t i = 0; i < NW; i++, waferOnLadder++) {
00619 Int_t id = waferOnLadder->Id;
00620 Int_t wbarrel = id/1000;
00621 Int_t wwafer = (id - 1000*wbarrel)/100;
00622 Int_t wladder = id%100;
00623 Int_t wlayer = 2*wbarrel + wladder%2 - 1;
00624
00625 Int_t Id = 1000*wlayer + 100*wwafer + wladder;
00626 Int_t index = mSvtGeom->getWaferIndex(wbarrel,wladder,wwafer);
00627 if (index < 0) continue;
00628 StSvtWaferGeometry *waferGeom = (StSvtWaferGeometry *) fRotList->FindObject(Form("R%04i",Id));
00629 if (waferGeom) continue;
00630 waferGeom = new StSvtWaferGeometry(wbarrel,wladder,wwafer);
00631 mSvtGeom->put_at(waferGeom,index);
00632 Int_t Found = 0;
00633 Survey_st *ladderOnSurvey = LadderOnSurvey->GetTable();
00634 for ( Int_t j = 0; j < NL; j++, ladderOnSurvey++) {
00635 Int_t Idl = ladderOnSurvey->Id;
00636 Int_t lbarrel = Idl/1000;
00637 Int_t lladder = Idl%100;
00638 if( wladder != lladder || wbarrel != lbarrel) continue;
00639 Survey_st *ladderOnShell = LadderOnShell->GetTable();
00640 Int_t found = 0;
00641 for ( Int_t l = 0; l < NL; l++, ladderOnShell++) if (ladderOnShell->Id == ladderOnSurvey->Id) {found++; break;}
00642 if (! found) continue;
00643 LSH.SetRotation(&ladderOnShell->r00);
00644 LSH.SetTranslation(&ladderOnShell->t0);
00645 Int_t Shell = 1;
00646 if( (wbarrel == 1 && wladder <= 4) || (wbarrel == 2 && wladder <= 6) || (wbarrel == 3 && wladder <= 8) ) Shell = 0;
00647
00648
00649 TGeoHMatrix wL;
00650 wL.SetRotation(&waferOnLadder->r00);
00651 wL.SetTranslation(&waferOnLadder->t0);
00652 LSU.SetRotation(&ladderOnSurvey->r00);
00653 LSU.SetTranslation(&ladderOnSurvey->t0);
00654
00655
00656 TGeoHMatrix WLL = LSU * wL;
00657
00658 TGeoHMatrix *WL = (TGeoHMatrix *) fRotList->FindObject(Form("WL%04i",Id));
00659 if (! WL) {
00660 WL = new TGeoHMatrix(Form("WL%04i",Id));
00661 Double_t *r = WLL.GetRotationMatrix();
00662 Double_t rot[9] = {r[0], r[2], r[1],
00663 r[3], r[5], r[4],
00664 r[6], r[8], r[7]};
00665
00666 WL->SetRotation(rot);
00667 WL->SetTranslation(WLL.GetTranslation());
00668 fRotList->Add(WL);
00669 }
00670
00671
00672
00673
00674
00675 if (Debug()) {
00676 cout << "Tpc2Global "; Tpc2Global.Print();
00677 cout << "GL "; GL.Print();
00678 TGeoHMatrix test = Tpc2Global * GL; cout << "test "; test.Print();
00679 }
00680 WG = Tpc2Global * GL * SHG[Shell] * LSH * WLL;
00681 Double_t *r = WG.GetRotationMatrix();
00682 Int_t fail = 0;
00683 for (int l = 0; l < 9; l++) {
00684 if (TMath::Abs(r[l]) >= 1.000001) fail++;
00685 }
00686 if (fail && Debug()) {
00687 cout << "===============" << waferOnLadder->Id << " "<< id << " " << Id <<endl;
00688 cout << "WG\t"; WG.Print();
00689 }
00690 Double_t norm;
00691 TVector3 d(r[0],r[3],r[6]); norm = 1/d.Mag(); d *= norm;
00692 TVector3 t(r[2],r[5],r[8]); norm = 1/t.Mag(); t *= norm;
00693 TVector3 n(r[1],r[4],r[7]); norm = 1/n.Mag(); n *= norm;
00694 TVector3 c = d.Cross(t);
00695 if (c.Dot(n) < 0) c *= -1;
00696
00697 Double_t *wgtr = WG.GetTranslation();
00698 Double_t rot[9] = {
00699 d[0], t[0], n[0],
00700 d[1], t[1], n[1],
00701 d[2], t[2], n[2]};
00702 waferGeom->SetRotation(rot);
00703 waferGeom->SetTranslation(wgtr);
00704 if (Debug()) waferGeom->print();
00705 fRotList->Add(waferGeom);
00706 Found++;
00707 break;
00708 }
00709 assert(Found);
00710 }
00711 TIter next(fRotList);
00712 Int_t fail = 0;
00713
00714 while ((comb = (TGeoHMatrix *) next())) {
00715 TString Name(comb->GetName());
00716 if (Name.BeginsWith("R")) {
00717 TGeoHMatrix *WL = (TGeoHMatrix *) fRotList->FindObject(Form("WL%s",Name.Data()+1));
00718 if (! WL) {
00719 cout << Form("WL%s",Name.Data()+1) << " has not been found" << endl;
00720 fail++;
00721 }
00722 }
00723 }
00724 assert(! fail);
00725 return mSvtGeom;
00726 }
00727
00728
00729 StSvtHybridCollection* StSvtDbMaker::getBadAnodes()
00730 {
00731 gMessMgr->Info() << "StSvtDbMaker::getBadAnodes" << endm;
00732
00733
00734 St_svtBadAnodes *badAnodes;
00735 svtBadAnodes_st *badAnode;
00736 StSvtConfig *mSvtConfig = (StSvtConfig *) (((TObjectSet *) GetDataSet("StSvtConfig"))->GetObject());
00737
00738 StSvtHybridCollection *mSvtBadAnodes = new StSvtHybridCollection(mSvtConfig);
00739 StSvtHybridBadAnodes* hybridBadAnodes;
00740
00741 char path[100];
00742 int index;
00743
00744 for (int barrel = 1;barrel <= mSvtConfig->getNumberOfBarrels();barrel++) {
00745 for (int ladder = 1;ladder <= mSvtConfig->getNumberOfLadders(barrel);ladder++) {
00746 for (int wafer = 1;wafer <= mSvtConfig->getNumberOfWafers(barrel);wafer++) {
00747 for (int hybrid = 1;hybrid <= mSvtConfig->getNumberOfHybrids();hybrid++) {
00748
00749 index = mSvtConfig->getHybridIndex(barrel,ladder,wafer,hybrid);
00750
00751 if (index < 0) continue;
00752
00753 switch (barrel) {
00754 case 1:
00755 sprintf(path,"InnerBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtBadAnodes",ladder,wafer,hybrid);
00756 break;
00757 case 2:
00758 if (ladder < 10)
00759 sprintf(path,"MiddleBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtBadAnodes",ladder,wafer,hybrid);
00760 else
00761 sprintf(path,"MiddleBarrel/Ladder_%d/Wafer_0%d/Hybrid_0%d/svtBadAnodes",ladder,wafer,hybrid);
00762 break;
00763 case 3:
00764 if (ladder < 10)
00765 sprintf(path,"OuterBarrel/Ladder_0%d/Wafer_0%d/Hybrid_0%d/svtBadAnodes",ladder,wafer,hybrid);
00766 else
00767 sprintf(path,"OuterBarrel/Ladder_%d/Wafer_0%d/Hybrid_0%d/svtBadAnodes",ladder,wafer,hybrid);
00768 break;
00769 }
00770
00771
00772 TString Path("Calibrations/svt/");
00773 Path += path;
00774 badAnodes = (St_svtBadAnodes*) GetDataBase(Path);
00775 if (!(badAnodes && badAnodes->HasData()) ){
00776 gMessMgr->Message("Error Finding SVT bad anodes","E");
00777 return 0;
00778 }
00779
00780 badAnode = badAnodes->GetTable();
00781
00782 hybridBadAnodes = (StSvtHybridBadAnodes*)mSvtBadAnodes->at(index);
00783 if (!hybridBadAnodes)
00784 hybridBadAnodes = new StSvtHybridBadAnodes(barrel,ladder,wafer,hybrid);
00785
00786
00787 for (int anode=1;anode<=mSvtConfig->getNumberOfAnodes();anode++) {
00788 if (badAnode->isBadAnode[anode-1]) {
00789 hybridBadAnodes->setBadAnode(anode);
00790
00791 }
00792 }
00793
00794 mSvtBadAnodes->put_at(hybridBadAnodes,index);
00795
00796 }
00797 }
00798 }
00799 }
00800
00801 return mSvtBadAnodes;
00802 }
00803
00804
00805 int StSvtDbMaker::getElectronics()
00806 {
00807
00808 St_svtElectronics *electronics = (St_svtElectronics*)GetDataBase("Calibrations/svt/svtElectronics");
00809 if (!(electronics && electronics->HasData()) ){
00810 gMessMgr->Message("Error Finding SVT Electronics","E");
00811 return kFALSE;
00812 }
00813
00814 electronic = electronics->GetTable();
00815 return kTRUE;
00816 }
00817
00818
00819 StSvtT0* StSvtDbMaker::getT0()
00820 {
00821 StSvtT0 *mSvtT0 = new StSvtT0();
00822
00823 if (getElectronics()) {
00824 for (int i=0;i<24;i++)
00825 mSvtT0->setT0(electronic->tZero[i],i+1);
00826 mSvtT0->setFsca(electronic->samplingFrequency);
00827
00828 gMessMgr->Info() << "t0 = " << mSvtT0->getT0(1) << ", fsca = " << mSvtT0->getFsca() << endm;
00829
00830 }
00831
00832 return mSvtT0;
00833 }
00834
00835
00836
00837 StSvtDaq* StSvtDbMaker::getDaqParameters()
00838 {
00839 gMessMgr->Info() << "StSvtDbMaker::getDaqParameters" << endm;
00840
00841 St_svtDaq *daq = (St_svtDaq*)GetDataBase("Calibrations/svt/svtDaq");
00842 if (!(daq && daq->HasData()) ){
00843 gMessMgr->Message("Error Finding SVT Daq","E");
00844 return 0;
00845 }
00846
00847 svtDaq_st* daqParam = daq->GetTable();
00848
00849 gMessMgr->Info() << "clearedTimeBins = " << daqParam->clearedTimeBins<< endm;
00850 gMessMgr->Info() << "pixelsBefore = " << daqParam->pixelsBefore << endm;
00851 gMessMgr->Info() << "pixelsAfter = " << daqParam->pixelsAfter << endm;
00852 gMessMgr->Info() << "pedOffset = " << daqParam->pedOffset << endm;
00853 gMessMgr->Info() << "seqLo = " << daqParam->seqLo << endm;
00854 gMessMgr->Info() << "seqHi = " << daqParam->seqHi << endm;
00855 gMessMgr->Info() << "threshLo = " << daqParam->threshLo << endm;
00856 gMessMgr->Info() << "threshHi = " << daqParam->threshHi << endm;
00857
00858 StSvtDaq *mSvtDaq = new StSvtDaq();
00859
00860 mSvtDaq->setClearedTimeBins(daqParam->clearedTimeBins);
00861 mSvtDaq->setSavedBlackAnodes(daqParam->savedBlackAnodes[0],0);
00862 mSvtDaq->setSavedBlackAnodes(daqParam->savedBlackAnodes[1],1);
00863 mSvtDaq->setSavedBlackAnodes(daqParam->savedBlackAnodes[2],2);
00864 mSvtDaq->setSavedBlackAnodes(daqParam->savedBlackAnodes[2],3);
00865 mSvtDaq->setPixelsBefore(daqParam->pixelsBefore);
00866 mSvtDaq->setPixelsAfter(daqParam->pixelsAfter);
00867 mSvtDaq->setPedOffset(daqParam->pedOffset);
00868 mSvtDaq->setSeqLo(daqParam->seqLo);
00869 mSvtDaq->setSeqHi(daqParam->seqHi);
00870 mSvtDaq->setThreshLo(daqParam->threshLo);
00871 mSvtDaq->setThreshHi(daqParam->threshHi);
00872
00873 return mSvtDaq;
00874 }
00875
00876
00877 TDataSet *StSvtDbMaker::FindDataSet (const char* logInput,const StMaker *uppMk,
00878 const StMaker *dowMk) const
00879 {
00880 TDataSet *ds = StMaker::FindDataSet(logInput,uppMk,dowMk);
00881 if (ds) return ds;
00882 static const Char_t *SetNames[] = {"StSvtConfig", "StSvtDriftVelocity", "StSvtDriftCurve",
00883 "StSvtAnodeDriftCorr", "StSvtPedestal","StSvtRMSPedestal",
00884 "StSvtGeometry", "StSvtBadAnodes", "StSvtT0", "StSvtDaq",
00885 "StSvtGeometry", 0};
00886 TString Input(logInput);
00887 if (! Input.Contains("StSvt")) return ds;
00888 St_ObjectSet *objs = 0;
00889 StSvtDbMaker *This = (StSvtDbMaker *) this;
00890 for (Int_t i = 0; SetNames[i]; i++) {
00891 if (Input.CompareTo(SetNames[i])) continue;
00892 objs = new St_ObjectSet(SetNames[i]);
00893 This->AddConst(objs);
00894 TObject *o = 0;
00895 if (! Input.CompareTo("StSvtConfig")) o = This->getConfiguration();
00896 else if (! Input.CompareTo("StSvtDriftVelocity")) o = 0;
00897 else if (! Input.CompareTo("StSvtDriftCurve")) o = This->getDriftCurve();
00898 else if (! Input.CompareTo("StSvtAnodeDriftCorr"))o = This->getAnodeDriftCorr();
00899 else if (! Input.CompareTo("StSvtPedestal")) o = This->getPedestals();
00900 else if (! Input.CompareTo("StSvtRMSPedestal")) o = This->getRms();
00901 else if (! Input.CompareTo("StSvtGeometry")) o = This->getGeometry();
00902 else if (! Input.CompareTo("StSvtBadAnodes")) o = This->getBadAnodes();
00903 else if (! Input.CompareTo("StSvtT0")) o = This->getT0();
00904 else if (! Input.CompareTo("StSvtDaq")) o = This->getDaqParameters();
00905 else if (! Input.CompareTo("StSvtGeometry")) o = This->getGeometry();
00906 if (o) objs->SetObject(o);
00907 break;
00908 }
00909 return (TDataSet *) objs;
00910 }
00911
00912 THashList *StSvtDbMaker::GetRotations() {
00913 FindDataSet("StSvtGeometry");
00914 return fRotList;
00915 }