00001 #include "StTpcHitMoverMaker.h"
00002 #include "StTpcDb/StTpcDb.h"
00003 #include "StMessMgr.h"
00004 #include "StDbUtilities/StMagUtilities.h"
00005 #include "StDbUtilities/StTpcCoordinateTransform.hh"
00006 #include "StEventTypes.h"
00007 #include "StDetectorDbMaker/St_tss_tssparC.h"
00008 #include "StDetectorDbMaker/St_tpcSlewingC.h"
00009 #include "TMath.h"
00010 ClassImp(StTpcHitMover)
00011 #define __DEBUG__
00012 #ifdef __DEBUG__
00013 #define PrPP(A,B) if (Debug()%10 > 1) {LOG_INFO << "StTpcHitMover::" << (#A) << "\t" << (#B) << " = \t" << (B) << endm;}
00014 #else
00015 #define PrPP(A,B)
00016 #endif
00017
00018 StTpcHitMover::StTpcHitMover(const Char_t *name) : StMaker(name),
00019 mTpcTransForm(0), mExB(NULL) {
00020 gMessMgr->Info("StTpcHitMover::StTpcHitMover: constructor called");
00021 }
00022
00023 StTpcHitMover::~StTpcHitMover() {
00024 FlushDB();
00025 }
00026
00027 Int_t StTpcHitMover::Init() {
00028 return StMaker::Init();
00029 }
00030
00031 Int_t StTpcHitMover::InitRun(Int_t runnumber) {
00032 FlushDB();
00033 return kStOk;
00034 }
00035
00036 void StTpcHitMover::FlushDB() {
00037 SafeDelete(mTpcTransForm);
00038 }
00039
00040 Int_t StTpcHitMover::Make() {
00041 static StGlobalCoordinate coorG;
00042 Bool_t EmbeddingShortCut = IAttr("EmbeddingShortCut");
00043 StEvent* pEvent = dynamic_cast<StEvent*> (GetInputDS("StEvent"));
00044 if (! pEvent) {
00045 LOG_WARN << "StTpcHitMover::Make there is no StEvent " << endm;
00046 return kStWarn;
00047 }
00048 gMessMgr->Info() << "StTpcHitMover::Make use StEvent " << endm;
00049 if (! gStTpcDb) {
00050 gMessMgr->Error() << "StTpcHitMover::Make TpcDb has not been instantiated " << endm;
00051 return kStErr;
00052 }
00053 if (! mTpcTransForm) mTpcTransForm = new StTpcCoordinateTransform(gStTpcDb);
00054 StTpcCoordinateTransform &transform = *mTpcTransForm;
00055 StTpcHitCollection* TpcHitCollection = pEvent->tpcHitCollection();
00056 St_tss_tssparC *tsspar = St_tss_tssparC::instance();
00057 Double_t gains[2] = {
00058 tsspar->gain_in() / tsspar->wire_coupling_in() *tsspar->ave_ion_pot() *tsspar->scale(),
00059 tsspar->gain_out()/ tsspar->wire_coupling_out()*tsspar->ave_ion_pot() *tsspar->scale()
00060 };
00061 if (TpcHitCollection) {
00062 UInt_t numberOfSectors = TpcHitCollection->numberOfSectors();
00063 for (UInt_t i = 0; i< numberOfSectors; i++) {
00064 StTpcSectorHitCollection* sectorCollection = TpcHitCollection->sector(i);
00065 if (sectorCollection) {
00066 Int_t sector = i + 1;
00067 Int_t numberOfPadrows = sectorCollection->numberOfPadrows();
00068 for (int j = 0; j< numberOfPadrows; j++) {
00069 Int_t row = j + 1;
00070 Int_t io = 0;
00071 if (row > 13) io = 1;
00072 StTpcPadrowHitCollection *rowCollection = sectorCollection->padrow(j);
00073 if (rowCollection) {
00074 StSPtrVecTpcHit &hits = rowCollection->hits();
00075 UInt_t NoHits = hits.size();
00076 if (NoHits) {
00077 for (UInt_t k = 0; k < NoHits; k++) {
00078 StTpcHit *tpcHit = static_cast<StTpcHit *> (hits[k]);
00079 Double_t q = tpcHit->charge();
00080 PrPP(Make,*tpcHit);
00081 if (tpcHit->adc()) {
00082 q = gains[io] * ((Double_t) tpcHit->adc());
00083 }
00084 if (! tpcHit->pad() && ! tpcHit->timeBucket()) {
00085 if (EmbeddingShortCut && tpcHit->idTruth() && tpcHit->idTruth() < 10000 &&
00086 tpcHit->qaTruth() > 95) continue;
00087 StTpcLocalCoordinate coorL(tpcHit->position().x(),tpcHit->position().y(),tpcHit->position().z(),i+1,j+1);
00088 moveTpcHit(coorL,coorG);
00089 } else {
00090 Float_t pad = tpcHit->pad();
00091 Float_t time = tpcHit->timeBucket();
00092 StTpcPadCoordinate padcoord(sector, row, pad, time);
00093 StTpcLocalCoordinate coorL;
00094 transform(padcoord,coorL,kFALSE);
00095 moveTpcHit(coorL,coorG);
00096 }
00097 if (mExB && mExB->GetSpaceChargeMode() &&
00098 StDetectorDbSpaceChargeR2::instance()->IsMarked()) {
00099 gMessMgr->Error() << "StTpcHitMover::Make questionable hit corrections" << endm;
00100 return kStSkip;
00101 }
00102 StThreeVectorF xyzF(coorG.position().x(),coorG.position().y(),coorG.position().z());
00103 tpcHit->setPosition(xyzF);
00104 }
00105 }
00106 }
00107 }
00108 }
00109 }
00110 }
00111 return kStOK;
00112 }
00113
00114 void StTpcHitMover::moveTpcHit(StTpcLocalCoordinate &coorL,StGlobalCoordinate &coorG) {
00115 mExB = StMagUtilities::Instance();
00116 if (! mTpcTransForm) mTpcTransForm = new StTpcCoordinateTransform(gStTpcDb);
00117 StTpcCoordinateTransform &transform = *mTpcTransForm;
00118 static StTpcLocalSectorCoordinate coorLS;
00119 transform(coorL,coorLS); PrPP(moveTpcHit,coorL); PrPP(moveTpcHit,coorLS);
00120 #if 0
00121 static StTpcPadCoordinate Pad;
00122 transform(coorLS,Pad,kFALSE,kFALSE); PrPP(moveTpcHit,Pad);
00123 #endif
00124 static StTpcLocalSectorAlignedCoordinate coorLSA;
00125 transform(coorLS,coorLSA); PrPP(moveTpcHit,coorLSA);
00126 static StTpcLocalCoordinate coorLT;
00127 transform(coorLSA,coorLT); PrPP(moveTpcHit,coorLT);
00128 static StTpcLocalCoordinate coorLTD;
00129 coorLTD = coorLT;
00130
00131 Float_t pos[3] = {coorLTD.position().x(),coorLTD.position().y(),coorLTD.position().z()};
00132 if ( mExB ) {
00133 Float_t posMoved[3];
00134 mExB->UndoDistortion(pos,posMoved,coorL.fromSector());
00135 StThreeVector<double> newPos(posMoved[0],posMoved[1],posMoved[2]);
00136 coorLTD.setPosition(newPos);
00137 }
00138 transform(coorLTD,coorG); PrPP(moveTpcHit,coorLTD); PrPP(moveTpcHit,coorG);
00139 }