00001
00002
00003 #include "StMessMgr.h"
00004 #include "StEventTypes.h"
00005 #include "StMuDSTMaker/COMMON/StMuTypes.hh"
00006
00007 #include "StFmsDbMaker/StFmsDbMaker.h"
00008 #include "StFmsCollection.h"
00009 #include "StFmsHit.h"
00010 #include "StFmsHitMaker.h"
00011 #include "StTriggerData2009.h"
00012
00013 #include <iostream>
00014 #include <fstream>
00015 using namespace std;
00016
00017 ClassImp(StFmsHitMaker);
00018
00020 StFmsHitMaker::StFmsHitMaker(const char* name) : StMaker(name){
00021 mFmsDbMaker=NULL;
00022 mFmsCollection = NULL;
00023 mMuFmsColl = NULL;
00024 LOG_DEBUG << "StFmsHitMaker::constructor." << endm;
00025 }
00026
00028 StFmsHitMaker::~StFmsHitMaker(){
00029 LOG_DEBUG << "StFmsHitMaker::destructor." << endm;
00030 }
00031
00033 void StFmsHitMaker::Clear(Option_t* option){
00034 LOG_DEBUG << "StFmsHitMaker::Clear." << endm;
00035 StMaker::Clear(option);
00036 }
00037
00039 int StFmsHitMaker::Init() {
00040 LOG_DEBUG<<"StFmsHitMaker Init Start"<<endm;
00041 return StMaker::Init();
00042 }
00043
00045 int StFmsHitMaker::InitRun(Int_t runNumber) {
00046 LOG_DEBUG << "StFmsHitMaker::InitRun - run = " << runNumber << endm;
00047 mFmsDbMaker = gStFmsDbMaker;
00048 return kStOK;
00049 }
00050
00052 int StFmsHitMaker::Make(){
00053 LOG_DEBUG<<"StFmsHitMaker::Make start"<<endm;
00054 int flag = 0;
00055 StTriggerData* triggerData = 0;
00056 StFmsTriggerDetector* triggerDetector =0;
00057
00059 TObjectSet *os = (TObjectSet*)GetDataSet("StTriggerData");
00060 if (os) {
00061 triggerData = (StTriggerData*)os->GetObject();
00062 if(triggerData){
00063 flag=1;
00064 mFmsCollection = new StFmsCollection();
00065 LOG_DEBUG<<"StFmsHitMaker::Make Found StTriggerData from StTriggerDataMaker"<<endm;
00066 }
00067 }
00068
00071 StEvent* stEvent = (StEvent*) GetInputDS("StEvent");
00072 if(flag==0){
00073 if(stEvent){
00074 triggerData = stEvent->triggerData();
00075 if(triggerData) {
00076 flag=2;
00077 mFmsCollection = new StFmsCollection();
00078 LOG_DEBUG<<"StFmsHitMaker::Make Found StTriggerData from StEvent"<<endm;
00079 }
00080 else{
00081 mFmsCollection = stEvent->fmsCollection();
00082 if(mFmsCollection){
00083 flag=3;
00084 LOG_DEBUG<<"StFmsHitMaker::Make Found StFmsCollection from StEvent"<<endm;
00085 }
00086 }
00087 }
00088 }
00089
00091 StMuDst* muDst = (StMuDst*)GetInputDS("MuDst");
00092 if(flag==0) {
00093 if(muDst){
00094 triggerDetector = &(StMuDst::event()->fmsTriggerDetector());
00095 if(triggerDetector){
00096 flag=0;
00097 mFmsCollection = new StFmsCollection();
00098 LOG_DEBUG<<"StFmsHitMaker::Make Found StFmsTriggerDetector in MuDst"<<endm;
00099 }
00100 }
00101 }
00102
00104 if(flag>0){
00105 for(unsigned short crt=1; crt<=5; crt++){
00106 unsigned short crt2=crt;
00107 if(crt==5) crt2=7;
00108 for(unsigned short slot=1; slot<=16; slot++){
00109 for(unsigned short ch=0; ch<32; ch++){
00110 unsigned short adc=0;
00111 unsigned short tdc=0;
00112 if(flag<3){
00113 adc=triggerData->fmsADC(crt,slot-1,ch);
00114 tdc=triggerData->fmsTDC(crt,slot-1,ch);
00115 }
00116 if(flag==4 && crt<5){
00117 adc=triggerDetector->adc(crt+10,slot-1+16,ch/8,ch%8);
00118 tdc=triggerDetector->tdc(crt+10,slot-1+16,ch/8,ch%8);
00119 }
00120 if(adc>0 || tdc>0){
00121 StFmsHit* hit = new StFmsHit();
00122 if(!hit){
00123 LOG_ERROR <<"Failed to create FMS hit, skip this hit."<<endm;
00124 continue;
00125 }
00126 hit->setDetectorId(0);
00127 hit->setChannel(0);
00128 hit->setQtCrate(crt2);
00129 hit->setQtSlot(slot);
00130 hit->setQtChannel(ch);
00131 hit->setAdc(adc);
00132 hit->setTdc(tdc);
00133 hit->setEnergy(0.0);
00134 mFmsCollection->addHit(hit);
00135 if(GetDebug()>0) hit->print();
00136 }
00137 }
00138 }
00139 }
00140 }
00141
00142
00144 if(flag>0){
00145 for(unsigned int i=0; i<mFmsCollection->numberOfHits(); i++){
00146 int d,c;
00147 StFmsHit* fmsHit = (mFmsCollection->hits())[i];
00148 int crt =fmsHit->qtCrate();
00149 int slot =fmsHit->qtSlot();
00150 int ch =fmsHit->qtChannel();
00151 float adc =fmsHit->adc();
00152 mFmsDbMaker->getReverseMap(crt,slot,ch,&d,&c);
00153 float e=0.0;
00154 if(d>0 || c>0){
00155 float g1=mFmsDbMaker->getGain(d,c);
00156 float g2=mFmsDbMaker->getGainCorrection(d,c);
00157 e =adc*g1*g2;
00158 }
00159 fmsHit->setDetectorId(d);
00160 fmsHit->setChannel(c);
00161 fmsHit->setEnergy(e);
00162 if(GetDebug()>0) fmsHit->print();
00163 }
00164 }
00165
00166 LOG_INFO<<"StFmsHitMaker::Make got "<<mFmsCollection->numberOfHits()<<" hits in StFmsCollection"<<endm;
00167
00169 if(flag==0) {
00170 if(muDst){
00171 mMuFmsColl = StMuDst::muFmsCollection();
00172 if(mMuFmsColl){
00173 int nhits = mMuFmsColl->numberOfHits();
00174 LOG_DEBUG<<"StFmsHitMaker::Make Found "<<nhits<<" hits in MuDst"<<endm;
00175 for(int i=0; i<nhits; i++){
00176 StMuFmsHit* mHit = mMuFmsColl->getHit(i);
00177 if(mHit && GetDebug()>0) mHit->print();
00178 }
00179 flag=5;
00180 }
00181 }
00182 }
00183
00184 if(flag>0 && flag<=2) {
00186 LOG_DEBUG<<"StFmsHitMaker::Make Adding StFmsCollection as FMSCOLLECTION"<<endm;
00187 stEvent->setFmsCollection(mFmsCollection);
00188 }
00189
00190 return kStOk;
00191 }
00192
00194 int StFmsHitMaker::Finish(){
00195 return kStOk;
00196 }