00001
00002
00003
00004
00005
00006 #include "TFile.h"
00007 #include "TTree.h"
00008 #include "TChain.h"
00009
00010
00011 #include "StEmcClusterCollection.h"
00012 #include "StEmcPoint.h"
00013 #include "StEmcUtil/geometry/StEmcGeom.h"
00014 #include "StEmcUtil/others/emcDetectorName.h"
00015 #include "StEmcADCtoEMaker/StBemcData.h"
00016 #include "StEmcADCtoEMaker/StEmcADCtoEMaker.h"
00017 #include "StEmcTriggerMaker/StEmcTriggerMaker.h"
00018
00019
00020 #include "StDetectorDbMaker/StDetectorDbTriggerID.h"
00021
00022
00023 #include "StEvent.h"
00024
00025
00026 #include "St_db_Maker/St_db_Maker.h"
00027
00028
00029 #include "StMuDSTMaker/COMMON/StMuDst.h"
00030 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00031 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00032 #include "StMuDSTMaker/COMMON/StMuPrimaryVertex.h"
00033 #include "StMuDSTMaker/COMMON/StMuTrack.h"
00034
00035
00036 #include "StSpinPool/StSpinDbMaker/StSpinDbMaker.h"
00037
00038
00039 #include "StJetMaker/StJetSkimEventMaker.h"
00040
00041
00042 #include "StSpinPool/StJetSkimEvent/StJetSkimEvent.h"
00043
00044
00045 #include "StSpinPool/StMCAsymMaker/StPythiaEvent.h"
00046 #include "StSpinPool/StMCAsymMaker/StMCAsymMaker.h"
00047
00048
00049 #include "StTriggerUtilities/StTriggerSimuMaker.h"
00050 #include "StTriggerUtilities/StTriggerSimuResult.h"
00051 #include "StTriggerUtilities/Bemc/StBemcTriggerSimu.h"
00052 #include "StTriggerUtilities/Eemc/StEemcTriggerSimu.h"
00053 #include "StTriggerUtilities/Emc/StEmcTriggerSimu.h"
00054
00055 void copyVertex(StMuPrimaryVertex& v, StJetSkimVert& sv);
00056
00057 ClassImp(StJetSkimEventMaker)
00058
00059 StJetSkimEventMaker::StJetSkimEventMaker(const Char_t *name, StMuDstMaker* uDstMaker, const char *outputName)
00060 : StMaker(name), muDstMaker(uDstMaker), outName(outputName), mOutfile(0), mTree(0), mEvent(0), isRealData(true)
00061 {
00062
00063 }
00064
00065 StJetSkimEventMaker::~StJetSkimEventMaker()
00066 {
00067 }
00068
00069 Int_t StJetSkimEventMaker::Init()
00070 {
00071
00072 assert(outName!=0);
00073 printf("StJetSkimEventMaker::Init(): open file:\t%s\t for writing\n",outName);
00074 mOutfile = new TFile(outName,"RECREATE");
00075
00076
00077 mEvent = new StJetSkimEvent();
00078
00079
00080 StJetSkimTrig::Class()->IgnoreTObjectStreamer();
00081 StPythiaEvent::Class()->IgnoreTObjectStreamer();
00082
00083
00084 mTree = new TTree("jetSkimTree","StJetSkimEvent Tree",99);
00085
00086
00087 mTree->Branch ("skimEventBranch", "StJetSkimEvent", &mEvent, 64000, 99);
00088
00089
00090 mcAsymMaker = dynamic_cast<StMCAsymMaker*>(GetMaker("MCAsym"));
00091 if(mcAsymMaker != NULL) {
00092 mEvent->setMcEvent(mcAsymMaker->pythiaEvent());
00093 isRealData = false;
00094 }
00095
00096 return kStOk;
00097 }
00098
00099 Int_t StJetSkimEventMaker::InitRun(int runnumber) {
00100
00101
00102
00103
00104 TList *headerList = mTree->GetUserInfo();
00105 bool insertHeader = true;
00106
00107
00108 for(int i=0; i<headerList->GetEntries(); i++) {
00109 TClonesArray *tmp = (TClonesArray*)headerList->At(i);
00110 StJetSkimTrigHeader *h = (StJetSkimTrigHeader*)tmp->At(0);
00111 if(h->runId == runnumber){
00112 insertHeader = false;
00113 mCurrentHeaderRef = tmp;
00114 }
00115 }
00116
00117 if(insertHeader) {
00118 TClonesArray *trigHeaderArray = new TClonesArray("StJetSkimTrigHeader",50);
00119 StJetSkimTrigHeader *header = new StJetSkimTrigHeader();
00120
00121 if(isRealData) {
00122 StDetectorDbTriggerID *v = StDetectorDbTriggerID::instance();
00123 map<int,float> prescaleMap = v->getTotalPrescales();
00124 for(map<int,float>::const_iterator it=prescaleMap.begin(); it!=prescaleMap.end(); it++) {
00125 header->runId = runnumber;
00126 header->trigId = it->first;
00127 header->prescale = it->second;
00128 fillThresholds(*header);
00129 new( (*trigHeaderArray)[trigHeaderArray->GetLast()+1] ) StJetSkimTrigHeader(*header);
00130 }
00131 }
00132 else {
00133 for(unsigned i=0; i<mSimuTrigIds.size(); i++) {
00134 header->runId = runnumber;
00135 header->trigId = mSimuTrigIds[i];
00136 header->prescale = 1.0;
00137 fillThresholds(*header);
00138 new( (*trigHeaderArray)[trigHeaderArray->GetLast()+1] ) StJetSkimTrigHeader(*header);
00139 }
00140 }
00141
00142 headerList->Add(trigHeaderArray);
00143 mCurrentHeaderRef = headerList->Last();
00144 }
00145
00146 return StMaker::InitRun(runnumber);
00147 }
00148
00149 Int_t StJetSkimEventMaker::Make()
00150 {
00151
00152 mEvent->clear();
00153
00154
00155 assert(muDstMaker);
00156 StMuDst* muDst = muDstMaker->muDst();
00157 assert(muDst);
00158 StMuEvent* muEvent = muDst->event();
00159 assert(muEvent);
00160
00161 StBbcTriggerDetector* bbc = &(muEvent->bbcTriggerDetector());
00162 assert(bbc);
00163 StRunInfo* runInfo = &(muEvent->runInfo()); assert(runInfo);
00164 assert(runInfo);
00165 StDetectorDbTriggerID* v = StDetectorDbTriggerID::instance();
00166 assert(v);
00167
00168
00169 mEvent->setTrigHeaderArray(mCurrentHeaderRef);
00170 if(isRealData) {
00171 map<int,float> prescaleMap = v->getTotalPrescales();
00172 StJetSkimTrig skimTrig;
00173 for (map<int,float>::iterator it=prescaleMap.begin(); it!=prescaleMap.end(); ++it) {
00174 skimTrig.setTrigId((*it).first);
00175 if (muEvent->triggerIdCollection().nominal().isTrigger(skimTrig.trigId())) {
00176 skimTrig.setDidFire(true);
00177 }
00178 else {
00179 skimTrig.setDidFire(false);
00180 }
00181 fillTriggerSimulationInfo(skimTrig);
00182 if(skimTrig.didFire() || (skimTrig.shouldFire() > 0)) mEvent->setTrig(skimTrig);
00183 skimTrig.clear();
00184 }
00185
00186 St_db_Maker* mydb = (St_db_Maker*) StMaker::GetChain()->GetMaker("StarDb");
00187 assert(mydb);
00188 int theYear=mydb->GetDateTime().GetYear();
00189
00190 if(theYear >= 2006)
00191 {
00192 mEvent->setL2Result(muEvent->L2Result().GetArray());
00193 }
00194 }
00195 else {
00196 StJetSkimTrig skimTrig;
00197 for(unsigned i=0; i<mSimuTrigIds.size(); i++) {
00198 skimTrig.setTrigId(mSimuTrigIds[i]);
00199 skimTrig.setDidFire(false);
00200 fillTriggerSimulationInfo(skimTrig);
00201 if(skimTrig.shouldFire() > 0) mEvent->setTrig(skimTrig);
00202 skimTrig.clear();
00203 }
00204 }
00205
00206
00207 mEvent->setFill( runInfo->beamFillNumber(blue));
00208 mEvent->setRunId( muEvent->runId() );
00209 mEvent->setEventId( muEvent->eventId() );
00210 TChain* chain = muDstMaker->chain();
00211 assert(chain);
00212 TObjString inputfile(chain->GetFile()->GetName());
00213 mEvent->setMudstFileName(inputfile);
00214
00215
00216 mEvent->setBbcTimeBin( muEvent->bbcTriggerDetector().onlineTimeDifference() );
00217 int Npmt=bbc->numberOfPMTs();
00218 for (int pmt=0;pmt<Npmt;pmt++){
00219 if(bbc->adc(pmt) > 5) {
00220 if(pmt<16) mEvent->setEbbc(1);
00221 if(pmt>23 && pmt<40) mEvent->setWbbc(1);
00222 }
00223 }
00224
00225
00226 mEvent->setZdcWestRate(muEvent->runInfo().zdcWestRate());
00227 mEvent->setZdcEastRate(muEvent->runInfo().zdcEastRate());
00228 mEvent->setZdcCoincidenceRate(muEvent->runInfo().zdcCoincidenceRate());
00229 mEvent->setBbcWestRate(muEvent->runInfo().bbcWestRate());
00230 mEvent->setBbcEastRate(muEvent->runInfo().bbcEastRate());
00231 mEvent->setBbcCoincidenceRate(muEvent->runInfo().bbcCoincidenceRate());
00232
00233
00234 int bx7 = muEvent->l0Trigger().bunchCrossingId7bit(muEvent->runId());
00235 int bx48 = muEvent->l0Trigger().bunchCrossingId();
00236 mEvent->setBx7( bx7 );
00237 mEvent->setBx48( bx48 );
00238 mEvent->setSpinBits( muEvent->l0Trigger().spinBits( muEvent->runId() ) );
00239
00240
00241 if(isRealData) {
00242 StSpinDbMaker* spDbMaker = dynamic_cast<StSpinDbMaker*>(GetMakerInheritsFrom("StSpinDbMaker"));
00243 assert(spDbMaker);
00244 mEvent->setIsValid( spDbMaker->isValid() );
00245 mEvent->setIsPolLong( spDbMaker->isPolDirLong() );
00246 mEvent->setIsPolTrans( spDbMaker->isPolDirTrans() );
00247 int isMasked = (spDbMaker->isMaskedUsingBX48(bx48)) ? 1 : 0;
00248 mEvent->setIsMaskedUsingBx48( isMasked );
00249 mEvent->setOffsetBx48minusBX7( spDbMaker->offsetBX48minusBX7(bx48, bx7) );
00250 mEvent->setSpin4UsingBx48( spDbMaker->spin4usingBX48(bx48) );
00251 }
00252
00253
00254
00255 int nVertices = muDst->numberOfPrimaryVertices();
00256 for(int i=0; i<nVertices; ++i){
00257 assert(muDst->primaryVertex(i));
00258 StMuPrimaryVertex* muVert = muDst->primaryVertex(i);
00259 assert(muVert);
00260
00261 StJetSkimVert skimVert;
00262 copyVertex(*muVert, skimVert);
00263 mEvent->setVert(skimVert);
00264 }
00265
00266
00267 mEvent->setBestVert(0);
00268
00269
00270 if (StTriggerSimuMaker* trigSimu = dynamic_cast<StTriggerSimuMaker*>(GetMakerInheritsFrom("StTriggerSimuMaker"))) {
00271 if (trigSimu->bemc) {
00272 for (int i = 0; i < 3; ++i) mEvent->setBarrelJetPatchTh(i,trigSimu->bemc->barrelJetPatchTh(i));
00273 for (int i = 0; i < 4; ++i) mEvent->setBarrelHighTowerTh(i,trigSimu->bemc->barrelHighTowerTh(i));
00274 for (int jp = 0; jp < 18; ++jp) mEvent->setBarrelJetPatchAdc(jp,trigSimu->bemc->barrelJetPatchAdc(jp));
00275 }
00276
00277 if (trigSimu->eemc) {
00278 for (int i = 0; i < 3; ++i) mEvent->setEndcapJetPatchTh(i,trigSimu->eemc->endcapJetPatchTh(i));
00279 for (int i = 0; i < 2; ++i) mEvent->setEndcapHighTowerTh(i,trigSimu->eemc->endcapHighTowerTh(i));
00280 for (int jp = 0; jp < 6; ++jp) mEvent->setEndcapJetPatchAdc(jp,trigSimu->eemc->endcapJetPatchAdc(jp));
00281 }
00282
00283 if (trigSimu->emc) {
00284 for (int i = 0; i < 3; ++i) mEvent->setOverlapJetPatchTh(i,trigSimu->emc->overlapJetPatchTh(i));
00285 for (int i = 0; i < 2; ++i) {
00286 int jp, adc;
00287 trigSimu->emc->getOverlapJetPatchAdc(i,jp,adc);
00288 mEvent->setOverlapJetPatchAdc(jp,adc);
00289 }
00290 }
00291
00292 mEvent->setEmcLayer2(trigSimu->emc->EM201output());
00293 }
00294
00295
00296 mTree->Fill();
00297
00298 return kStOk;
00299 }
00300
00301 void copyVertex(StMuPrimaryVertex& v, StJetSkimVert& sv)
00302 {
00303 float pos[3];
00304 float err[3];
00305 StThreeVectorF pos3 = v.position();
00306 StThreeVectorF err3 = v.posError();
00307 pos[0] = pos3.x();
00308 pos[1] = pos3.y();
00309 pos[2] = pos3.z();
00310 err[0] = err3.x();
00311 err[1] = err3.y();
00312 err[2] = err3.z();
00313 sv.setPosition(pos);
00314 sv.setError(err);
00315
00316
00317 sv.setVertexFinderId( v.vertexFinderId());
00318 sv.setRanking( v.ranking() );
00319 sv.setNTracksUsed( v.nTracksUsed());
00320 sv.setNBTOFMatch( v.nBTOFMatch());
00321 sv.setNCTBMatch( v.nCTBMatch());
00322 sv.setNBEMCMatch( v.nBEMCMatch());
00323 sv.setNEEMCMatch( v.nEEMCMatch());
00324 sv.setNCrossingCentralMembrane( v.nCrossCentralMembrane() );
00325 sv.setSumTrackPt( v.sumTrackPt());
00326 sv.setMeanDip( v.meanDip() );
00327 sv.setChiSquared( v.chiSquared() );
00328 sv.setRefMultNeg( v.refMultNeg() );
00329 sv.setRefMultPos( v.refMultPos() );
00330 sv.setRefMultFtpcWest( v.refMultFtpcWest() );
00331 sv.setRefMultFtpcEast( v.refMultFtpcEast() );
00332
00333 }
00334
00335 void StJetSkimEventMaker::fillTriggerSimulationInfo(StJetSkimTrig &skimTrig)
00336 {
00337
00338 StTriggerSimuMaker* trigSimu = dynamic_cast<StTriggerSimuMaker*>(GetMaker("StarTrigSimu"));
00339 StEmcTriggerMaker *emcTrigMaker = dynamic_cast<StEmcTriggerMaker*>(GetMaker("bemctrigger"));
00340
00341 if (trigSimu) {
00342 const StTriggerSimuResult& trigResult = trigSimu->detailedResult(skimTrig.trigId());
00343 skimTrig.setShouldFire(trigSimu->isTrigger(skimTrig.trigId()));
00344 skimTrig.setShouldFireBBC(trigResult.bbcDecision());
00345 skimTrig.setShouldFireBemc(trigResult.bemcDecision());
00346 skimTrig.setShouldFireEemc(trigResult.eemcDecision());
00347 skimTrig.setShouldFireL2(trigResult.l2Decision());
00348
00349 if (trigResult.bemcDecision()==1){
00350 vector<short> towerId = trigResult.highTowerIds();
00351 for (unsigned i=0; i<towerId.size(); i++) {
00352 skimTrig.addTowerAboveThreshold(0,towerId[i],trigResult.highTowerAdc(towerId[i]));
00353 }
00354
00355 vector<short> tpId = trigResult.triggerPatchIds();
00356 for (unsigned i=0; i<tpId.size(); i++) {
00357 skimTrig.addTriggerPatchAboveThreshold(0,tpId[i],trigResult.triggerPatchAdc(tpId[i]));
00358 }
00359
00360 vector<short> jpId = trigResult.jetPatchIds();
00361 for (unsigned i=0; i<jpId.size(); i++) {
00362 skimTrig.addJetPatchAboveThreshold(0,jpId[i],trigResult.jetPatchAdc(jpId[i]));
00363 }
00364 }
00365
00366 if (trigResult.l2Decision()==1) {
00367
00368 int year = GetDBTime().GetYear();
00369 const int* L2ResultEmulated = (int*)trigResult.l2Result(kJet,year);
00370 if (L2ResultEmulated) {
00371 skimTrig.setL2ResultEmulated(L2ResultEmulated);
00372 }
00373 else {
00374 LOG_WARN << "No emulated L2 result for trigger ID = " << skimTrig.trigId() << " of year = " << year << endm;
00375 }
00376 }
00377 } else if (emcTrigMaker) {
00378 skimTrig.setShouldFire(emcTrigMaker->isTrigger(skimTrig.trigId()));
00379
00380 map<int,int> towerMap = emcTrigMaker->barrelTowersAboveThreshold(skimTrig.trigId());
00381 for(map<int,int>::const_iterator it=towerMap.begin(); it!=towerMap.end(); it++) {
00382 skimTrig.addTowerAboveThreshold(0,it->first, it->second);
00383 }
00384
00385 towerMap = emcTrigMaker->endcapTowersAboveThreshold(skimTrig.trigId());
00386 for(map<int,int>::const_iterator it=towerMap.begin(); it!=towerMap.end(); it++) {
00387 skimTrig.addTowerAboveThreshold(1,it->first, it->second);
00388 }
00389
00390 map<int,int> triggerPatchMap = emcTrigMaker->barrelTriggerPatchesAboveThreshold(skimTrig.trigId());
00391 for(map<int,int>::const_iterator it=triggerPatchMap.begin(); it!=triggerPatchMap.end(); it++) {
00392 skimTrig.addTriggerPatchAboveThreshold(0,it->first, it->second);
00393 }
00394
00395 triggerPatchMap = emcTrigMaker->endcapTriggerPatchesAboveThreshold(skimTrig.trigId());
00396 for(map<int,int>::const_iterator it=triggerPatchMap.begin(); it!=triggerPatchMap.end(); it++) {
00397 skimTrig.addTriggerPatchAboveThreshold(1,it->first, it->second);
00398 }
00399
00400 map<int,int> jetPatchMap = emcTrigMaker->barrelJetPatchesAboveThreshold(skimTrig.trigId());
00401 for(map<int,int>::const_iterator it=jetPatchMap.begin(); it!=jetPatchMap.end(); it++) {
00402 skimTrig.addJetPatchAboveThreshold(0,it->first, it->second);
00403 }
00404
00405 jetPatchMap = emcTrigMaker->endcapJetPatchesAboveThreshold(skimTrig.trigId());
00406 for(map<int,int>::const_iterator it=jetPatchMap.begin(); it!=jetPatchMap.end(); it++) {
00407 skimTrig.addJetPatchAboveThreshold(1,it->first, it->second);
00408 }
00409
00410 skimTrig.setTotalEnergy(emcTrigMaker->totalEnergy());
00411
00412 } else {
00413 LOG_WARN << "StJetSkimEventMaker::fillTriggerSimulationInfo --- no StTriggerSimuMaker or StEmcTriggerMaker" << endm;
00414 }
00415
00416 }
00417
00418 void StJetSkimEventMaker::fillThresholds(StJetSkimTrigHeader &header) {
00419
00420 StTriggerSimuMaker* trigSimu = dynamic_cast<StTriggerSimuMaker*>(GetMaker("StarTrigSimu"));
00421 StEmcTriggerMaker *emcTrigMaker = dynamic_cast<StEmcTriggerMaker*>(GetMaker("bemctrigger"));
00422
00423 if (trigSimu && trigSimu->bemc) {
00424 header.eastBarrelTowerThreshold = (trigSimu->bemc)->getTowerThreshold(header.trigId,15);
00425 header.eastBarrelTriggerPatchThreshold = (trigSimu->bemc)->getTriggerPatchThreshold(header.trigId,15);
00426 header.eastBarrelJetPatchThreshold = (trigSimu->bemc)->getJetPatchThreshold(header.trigId,15);
00427 header.westBarrelTowerThreshold = (trigSimu->bemc)->getTowerThreshold(header.trigId,0);
00428 header.westBarrelTriggerPatchThreshold = (trigSimu->bemc)->getTriggerPatchThreshold(header.trigId,0);
00429 header.westBarrelJetPatchThreshold = (trigSimu->bemc)->getJetPatchThreshold(header.trigId,0);
00430 } else if (emcTrigMaker) {
00431 header.eastBarrelTowerThreshold = emcTrigMaker->barrelTowerThreshold(header.trigId,2401);
00432 header.eastBarrelTriggerPatchThreshold = emcTrigMaker->barrelTriggerPatchThreshold(header.trigId,150);
00433 header.eastBarrelJetPatchThreshold = emcTrigMaker->barrelJetPatchThreshold(header.trigId,6);
00434 header.westBarrelTowerThreshold = emcTrigMaker->barrelTowerThreshold(header.trigId);
00435 header.westBarrelTriggerPatchThreshold = emcTrigMaker->barrelTriggerPatchThreshold(header.trigId);
00436 header.westBarrelJetPatchThreshold = emcTrigMaker->barrelJetPatchThreshold(header.trigId);
00437 header.endcapTowerThreshold = emcTrigMaker->endcapTowerThreshold(header.trigId);
00438 header.endcapTriggerPatchThreshold = emcTrigMaker->endcapTriggerPatchThreshold(header.trigId);
00439 header.endcapJetPatchThreshold = emcTrigMaker->endcapJetPatchThreshold(header.trigId);
00440 header.totalEnergyThreshold = emcTrigMaker->totalEnergyThreshold(header.trigId);
00441 } else {
00442 LOG_WARN << "StTriggerSimuMaker/StEmcTriggMaker not in Chain..." << endm;
00443 }
00444
00445 }
00446
00447 Int_t StJetSkimEventMaker::Finish()
00448 {
00449 assert(mOutfile);
00450 mOutfile->Write();
00451 mOutfile->Close();
00452
00453 return kStOK;
00454 }
00455
00456 void StJetSkimEventMaker::Clear(const Option_t* c)
00457 {
00458 }