00001 #include "StEmcMicroDstMaker.h"
00002 #include "StEvent.h"
00003 #include "StEventTypes.h"
00004 #include "StEmcMicroEvent.h"
00005 #include "StIOMaker/StIOMaker.h"
00006 #include "StEmcUtil/filters/StEmcFilter.h"
00007 #include "StEmcMicroUtil.h"
00008 #include "StChain/StEvtHddr.h"
00009 #include "StTreeMaker/StTreeMaker.h"
00010 #include "StTree.h"
00011
00012 ClassImp(StEmcMicroDstMaker);
00015 StEmcMicroDstMaker::StEmcMicroDstMaker(const Char_t *name) : StMaker(name)
00016 {
00017
00018 mGFilter = new StEmcFilter();
00019 mPFilter = new StEmcFilter();
00020
00021 mPFilter->setEmcPresent(kTRUE);
00022 mPFilter->setPrintLog(kTRUE);
00023 mPFilter->setHaveVertex(kTRUE);
00024 mPFilter->setHavePrimaries(kTRUE);
00025 mPFilter->setZVertexCut(100);
00026 mPFilter->setMinMult(0);
00027 mPFilter->setMaxMult(500000);
00028
00029 mGFilter->setPtCut(0.0);
00030 mGFilter->setFitPointsCut(0);
00031 mGFilter->setMustProjectEmc(kFALSE);
00032
00033 mPFilter->setPtCut(0.0);
00034 mPFilter->setFitPointsCut(0);
00035 mPFilter->setDCACut(3);
00036 mPFilter->setEtaMin(-4.0);
00037 mPFilter->setEtaMax( 4.0);
00038 mPFilter->setMustProjectEmc(kFALSE);
00039
00040
00041 mEventDir="./";
00042 mEventFileOld="";
00043 mEventFile="";
00044 mMicroEventChain=NULL;
00045 mDoRead=kFALSE;
00046 mDoCreateStEvent=kTRUE;
00047
00048 mDoSavePrimaries = kTRUE;
00049 mDoSaveGlobals = kTRUE;
00050 mDoSaveEmc = kTRUE;
00051 mDoSaveFpd = kTRUE;
00052 mDoSaveV0 = kTRUE;
00053
00054 mOldMaker = NULL;
00055
00056 mStart = 0;
00057
00058 }
00059 StEmcMicroDstMaker::~StEmcMicroDstMaker()
00060 {
00061 if(mMicroUtil) delete mMicroUtil;
00062 if(mGFilter) delete mGFilter;
00063 if(mPFilter) delete mPFilter;
00064 }
00065
00068 Int_t StEmcMicroDstMaker::Init()
00069 {
00070 mAcc=new TH1F("macc","Events accepted and rejected",2,-0.5,1.5);
00071 mMicroUtil = new StEmcMicroUtil();
00072 mMicroUtil->setPrimaryFilter(mPFilter);
00073 mMicroUtil->setGlobalFilter(mGFilter);
00074
00075 mMicroUtil->setSavePrimaries(mDoSavePrimaries);
00076 mMicroUtil->setSaveGlobals(mDoSaveGlobals);
00077 mMicroUtil->setSaveEmc(mDoSaveEmc);
00078 mMicroUtil->setSaveFpd(mDoSaveFpd);
00079 mMicroUtil->setSaveV0(mDoSaveV0);
00080
00081 mCurMicroEvent=0;
00082 mFileCounter = 0;
00083 mAccEv = 0;
00084 return StMaker::Init();
00085 }
00086
00089 Int_t StEmcMicroDstMaker::Make()
00090 {
00091 cout <<"***** StEmcMicroDstMaker::Make() *******************************\n";
00092 if(mMicroEvent) delete mMicroEvent;
00093 mMicroEvent = 0;
00094 mStEvent = 0;
00095
00096 if(!mDoRead)
00097 {
00098 mStEvent=NULL;
00099 mStEvent = (StEvent*) GetInputDS("StEvent");
00100 if(!mStEvent) return kStWarn;
00101
00102 Float_t BF=0.5;
00103 StEventSummary* summary = mStEvent->summary();
00104 if(summary) BF = summary->magneticField()/10.;
00105
00106 mPFilter->setBField(BF);
00107 mGFilter->setBField(BF);
00108
00109
00110 if (!mPFilter->accept(mStEvent))
00111 {
00112 cout << "StEmcMicroDstMaker::Make(): event not accepted." << endl;
00113 mAcc->Fill(0);
00114 return kStOK;
00115 }
00116 mAcc->Fill(1);
00117 mAccEv++;
00118
00119
00120 StIOMaker* IO=(StIOMaker*)GetMaker("IOMaker");
00121 if(IO)
00122 {
00123 const char* chp = strrchr(IO->GetFile(),'/');
00124 if(chp) mEventFile = strrchr(IO->GetFile(),'/')+1;
00125 else mEventFile = IO->GetFile();
00126 }
00127
00128
00129
00130
00131 else
00132 {
00133
00134 StTreeMaker *tree=(StTreeMaker*)GetMaker("outputStream");
00135 if(tree)
00136 {
00137 StTree *t = tree->GetTree();;
00138 mEventFile=t->GetBaseName();
00139 }
00140 else
00141 {
00142 if(mAccEv%100==0) mFileCounter++;
00143 char f[100];
00144 sprintf(f,"EmcEvent.file%04d",mFileCounter);
00145 mEventFile = f;
00146 }
00147 }
00148
00149 if(mOldMaker) mEventFile = mOldMaker->getCurrentFile();
00150
00151
00152 if(mEventFile!=mEventFileOld)
00153 {
00154 if(mMicroDstFile) if(mMicroDstFile->IsOpen())
00155 {
00156 mMicroDstFile->Write(0,TObject::kOverwrite);
00157 mMicroDstFile->Close();
00158 }
00159 if (mMicroEvent) delete mMicroEvent;
00160 if (mMicroDstFile) delete mMicroDstFile;
00161 mMicroEvent=NULL;
00162 mMicroDstFile=NULL;
00163 initMicroEventFile();
00164 mEventFileOld=mEventFile;
00165 }
00166 else cout <<"Filename being written: "<<mEventFile.Data()<<endl;
00167 mMicroEvent= mMicroUtil->getMicroEvent(mStEvent);
00168 if(mOldMaker)
00169 {
00170
00171 StEmcMicroEvent* old=mOldMaker->getMicroEvent();
00172 mMicroEvent->setCTB(old->getCTB());
00173 mMicroEvent->setZDCe(old->getZDCe());
00174 mMicroEvent->setZDCw(old->getZDCw());
00175 mMicroEvent->setZVertexZDC(old->getZVertexZDC());
00176 mMicroEvent->setBBCe(old->getBBCe());
00177 mMicroEvent->setBBCw(old->getBBCw());
00178 mMicroEvent->setBBCNHits(old->getBBCNHits());
00179 mMicroEvent->setZVertexBBC(old->getZVertexBBC());
00180 mMicroEvent->setBunchCrossing7bit(old->getBunchCrossing7bit());
00181 mMicroEvent->setBunchCrossing(old->getBunchCrossing());
00182 mMicroEvent->setSpinBits(old->getSpinBits());
00183 StFpdMicroCollection *fpd = new StFpdMicroCollection();
00184 StFpdMicroCollection *oldfpd = old->getFpd();
00185 if(oldfpd)
00186 {
00187 fpd->setToken(oldfpd->getToken());
00188 fpd->setSumAdcNorth(oldfpd->getSumAdcNorth());
00189 fpd->setSumAdcSouth(oldfpd->getSumAdcSouth());
00190 fpd->setSumAdcTop(oldfpd->getSumAdcTop());
00191 fpd->setSumAdcBottom(oldfpd->getSumAdcBottom());
00192 fpd->setSumAdcPreShower1(oldfpd->getSumAdcPreShower1());
00193 fpd->setSumAdcPreShower2(oldfpd->getSumAdcPreShower2());
00194 fpd->setSumAdcSmdX(oldfpd->getSumAdcSmdX());
00195 fpd->setSumAdcSmdY( oldfpd->getSumAdcSmdY());
00196 mMicroEvent->setFpd(fpd);
00197 }
00198 }
00199 cout << "before Fill()" << endl;
00200 mEmcTree->Fill();
00201 cout << "after Fill()" << endl;
00202 }
00203 else
00204 {
00205 if(mMicroEventChain)
00206 {
00207 if(mNMicroEvents>0)
00208 {
00209 if(mCurMicroEvent<mNMicroEvents)
00210 {
00211 mMicroEvent = new StEmcMicroEvent();
00212 mStEvent = 0;
00213 mMicroEventChain->SetBranchAddress("MicroEvent",&mMicroEvent);
00214 mMicroEventChain->GetEntry(mStart+mCurMicroEvent++);
00215
00216 UInt_t GMTTime = (UInt_t)mMicroEvent->getEventTime();
00217 StEvtHddr *hd = (StEvtHddr*)GetDataSet("EvtHddr");
00218 if(!hd) { hd = new StEvtHddr(); AddData(hd); }
00219 hd->SetGMTime(GMTTime);
00220 mEventFile = strrchr(mMicroEventChain->GetFile()->GetName(),'/')+1;
00221 if(mEventFile.EndsWith(".emcEvent.root"))
00222 {
00223 Int_t size=mEventFile.Sizeof();
00224 mEventFile.Remove(size-15,14);
00225 }
00226 if(mDoCreateStEvent)
00227 {
00228 mStEvent = mMicroUtil->getStEvent(mMicroEvent);
00229 AddData(mStEvent);
00230 }
00231 }
00232 else return kStWarn;
00233 }
00234 else return kStWarn;
00235 }
00236 else return kStWarn;
00237 }
00238
00239 return kStOK;
00240 }
00241
00244 Int_t StEmcMicroDstMaker::Finish()
00245 {
00246 if(!mDoRead)
00247 {
00248 if (mMicroDstFile)
00249 if(mMicroDstFile->IsOpen())
00250 {
00251 mMicroDstFile->Write(0,TObject::kOverwrite);
00252 mMicroDstFile->Close();
00253 }
00254 }
00255 return StMaker::Finish();
00256 }
00257
00261 Int_t StEmcMicroDstMaker::initMicroEventFile()
00262 {
00263 Int_t split = 99;
00264 Int_t comp = 1;
00265 Int_t bufsize = 256000;
00266 if (split) bufsize /= 16;
00267
00268 mMicroEvent = new StEmcMicroEvent();
00269
00270 cout <<"Input file = "<<mEventFile.Data()<<endl;
00271 TString* filestring = new TString(mEventDir);
00272 filestring->Append(mEventFile);
00273
00274 if(filestring->EndsWith(".event.root"))
00275 {
00276 Int_t size=filestring->Sizeof();
00277 filestring->Remove(size-12,11);
00278 }
00279
00280 filestring->Append(".emcEvent.root");
00281 cout <<"Output file = "<<filestring->Data()<<endl;
00282
00283 mMicroDstFile = new TFile(filestring->Data(),"RECREATE","EMC Micro DST file");
00284 if (!mMicroDstFile)
00285 {
00286 cout << "##### EmcMicroEventMaker: Warning: no MicroEvents file = " << filestring->Data() << endl;
00287 return kStFatal;
00288 }
00289 mMicroDstFile->SetCompressionLevel(comp);
00290 mEmcTree = new TTree("EmcTree", "EMC Micro Tree");
00291 if (!mEmcTree)
00292 {
00293 cout << "##### EmcMicroEventMaker: Warning: No EmcMicroTree" << endl;
00294 return kStFatal;
00295 }
00296 mEmcTree->SetAutoSave(1000000);
00297 mEmcTree->Branch("MicroEvent", "StEmcMicroEvent", &mMicroEvent,bufsize,split);
00298
00299 delete filestring;
00300 return kStOK;
00301 }
00302
00305 void StEmcMicroDstMaker::addMicroEventFile(char * file)
00306 {
00307 if(!mMicroEventChain)
00308 {
00309 mMicroEventChain = new TChain("EmcTree","EMC Micro chain");
00310
00311
00312
00313 }
00314 mMicroEventChain->Add(file);
00315 mNMicroEvents=(Int_t)mMicroEventChain->GetEntries();
00316 cout <<"Total number of events in the chain = "<<mNMicroEvents<<endl;
00317 mDoRead=kTRUE;
00318 }
00319
00320
00321
00322
00323
00324
00325
00326