// Pibero Djawotho // Indiana University // 24 June 2008 // // StUpsilonEmbedMaker runs over the Upsilon embedding and // calculates acceptance, L0 and L2 trigger efficiencies // for the Upsilon. // #include #include // Will not compile if moved under "local includes" ??? #include "StUpsilonTriggerMaker/StUpsilonTriggerMaker.h" #include "StUpsilonTriggerMaker/Quarkonium.hh" #include "StDaqLib/EMC/StEmcDecoder.h" // ROOT includes #include "TNtuple.h" #include "TH1.h" #include "TH2.h" // STAR includes #include "StEventTypes.h" #include "StMcEvent/StMcEventTypes.hh" #include "StAssociationMaker/StAssociationMaker.h" #include "StAssociationMaker/StTrackPairInfo.hh" #include "StEmcTriggerMaker/StEmcTriggerMaker.h" #include "tables/St_g2t_event_Table.h" #include "tables/St_g2t_pythia_Table.h" #include "StEventUtilities/StuRefMult.hh" #include "StEmcUtil/geometry/StEmcGeom.h" #include "StEmcUtil/projection/StEmcPosition.h" #include "StContainers.h" #include "StEmcUtil/database/StBemcTables.h" // Local includes //#include "StBbcTriggerMaker/StBbcTriggerMaker.h" #include "StUpsilonEmbedMaker.h" ClassImp(StUpsilonEmbedMaker); float scaleFactor(double Eta, int hitType=0) { // hitType = 0 - towers // hitType = 1 - pre shower // hitType = 2 - shower max Eta // hitType = 3 - shower max Phi //function calculates the proper scale factor given a hit type and an //eta so that energy can be calculated float P0[]={14.69,559.7,0.1185e6,0.1260e6}; float P1[]={-0.1022,-109.9,-0.3292e5,-0.1395e5}; float P2[]={0.7484,-97.81,0.3113e5,0.1971e5}; float x=fabs(Eta); return P0[hitType]+P1[hitType]*x+P2[hitType]*x*x; } void StUpsilonEmbedMaker::SetHighTowerVar(StMcTrack* mcTrack, bool isele){ //This function finds the soft tower id of the highest tower a particular //track has. It also sets class veriables eleEsum and posEsum, which are //the sum of the energies left in the BEMC by the electron and positron //daughters. I would like to change this to the highest 3 towers, but then //I need to think about how to do acceptance. It also records the maximum //ADC values and energy for the electron and positron StMcCalorimeterHit* MaxCalHit = 0; cout<<"Is Electron = "<Add(mTuple); return StMaker::Init(); } int StUpsilonEmbedMaker::InitRun(int runNumber) { mEmcDecoder->SetDateTime(GetDate(), GetTime()); mBemcTables->loadTables(this); return StMaker::InitRun(runNumber); } int StUpsilonEmbedMaker::Make() { const double emass = 0.511e-3; float l2eleE= -999; float l2posE= -999; // Get StMcEvent mMcEvent = (StMcEvent*)GetDataSet("StMcEvent"); if (!mMcEvent) { LOG_WARN << "No StMcEvent" << endm; return kStWarn; } // Print StMcEvent LOG_INFO << "eventGeneratorEventLabel = " << mMcEvent->eventGeneratorEventLabel() << endm; LOG_INFO << "eventNumber = " << mMcEvent->eventNumber() << endm; LOG_INFO << "runNumber = " << mMcEvent->runNumber() << endm; LOG_INFO << "type = " << mMcEvent->type() << endm; LOG_INFO << "zWest = " << mMcEvent->zWest() << endm; LOG_INFO << "nWest = " << mMcEvent->nWest() << endm; LOG_INFO << "zEast = " << mMcEvent->zEast() << endm; LOG_INFO << "nEast = " << mMcEvent->nEast() << endm; LOG_INFO << "eventGeneratorFinalStateTracks = " << mMcEvent->eventGeneratorFinalStateTracks() << endm; LOG_INFO << "numberOfPrimaryTracks = " << mMcEvent->numberOfPrimaryTracks() << endm; LOG_INFO << "subProcessId = " << mMcEvent->subProcessId() << endm; LOG_INFO << "impactParameter = " << mMcEvent->impactParameter() << endm; LOG_INFO << "phiReactionPlane = " << mMcEvent->phiReactionPlane() << endm; LOG_INFO << "triggerTimeOffset = " << mMcEvent->triggerTimeOffset() << endm; LOG_INFO << "nBinary = " << mMcEvent->nBinary() << endm; LOG_INFO << "nWoundedEast = " << mMcEvent->nWoundedEast() << endm; LOG_INFO << "nWoundedWest = " << mMcEvent->nWoundedWest() << endm; LOG_INFO << "nJets = " << mMcEvent->nJets() << endm; // Get Pythia record TDataSet* geant = GetDataSet("geant"); TDataSetIter geantIter(geant); St_g2t_pythia* pythia = (St_g2t_pythia*)geantIter("g2t_pythia"); if (pythia) { g2t_pythia_st* g2t_pythia = pythia->GetTable(); assert(g2t_pythia); LOG_INFO << "Pythia subprocess_id = " << g2t_pythia->subprocess_id << endm; } else { LOG_WARN << "No Pythia record" << endm; } // Get StEvent mEvent = (StEvent*)GetDataSet("StEvent"); if (!mEvent) { LOG_WARN << "No StEvent" << endm; return kStWarn; } /* // Get BBC trigger maker StBbcTriggerMaker* bbcTrig = (StBbcTriggerMaker*)GetMakerInheritsFrom("StBbcTriggerMaker"); assert(bbcTrig); LOG_INFO << "BBC = " << bbcTrig->isTrigger() << endm; */ // Get EMC trigger maker StEmcTriggerMaker* emcTrig = (StEmcTriggerMaker*)GetMakerInheritsFrom("StEmcTriggerMaker"); assert(emcTrig); LOG_INFO << "Upsilon(200601) = " << emcTrig->isTrigger(117602) << endm; LOG_INFO << "Upsilon(200602) = " << emcTrig->isTrigger(137602) << endm; //LOG_INFO << "Upsilon(137603) = " << emcTrig->isTrigger(137603) << endm; // Get Upsilon trigger mUpsTrig = (StUpsilonTriggerMaker*)GetMakerInheritsFrom("StUpsilonTriggerMaker"); assert(mUpsTrig); LOG_INFO << "Upsilon(L2) = " << mUpsTrig->isUpsilonTrigger() << endm; // Print particles in event LOG_INFO << "Subprocess Id = " << mMcEvent->subProcessId() << endm; LOG_INFO << "Ntracks = " << mMcEvent->numberOfPrimaryTracks() << endm; cout << "Particles: "; for (size_t i = 0; i < mMcEvent->primaryVertex()->numberOfDaughters(); ++i) { StMcTrack* mcTrack = mMcEvent->primaryVertex()->daughter(i); if (mcTrack->particleDefinition()) cout << mcTrack->particleDefinition()->name() << " "; else cout << mcTrack->geantId() << " "; } cout << endl; StEmcDetector* bemcDet = mEvent->emcCollection()->detector(kBarrelEmcTowerId); for (int i = 0;i<4801;i++){ bemcArray[i] = 0;bemcData[i]=0;} for (unsigned int m = 1; m<=bemcDet->numberOfModules(); ++m){ StSPtrVecEmcRawHit& hits = bemcDet->module(m)->hits(); for (StSPtrVecEmcRawHitIterator i = hits.begin(); i != hits.end(); ++i){ StEmcRawHit* hit = *i; //Int_t daqId; //Float_t pedestal, rms //mEmcDecoder->GetDaqIdFrom TowerId(softId,daqId); // mBemcTables->getPedestal(BTOW,softId,0,pedestal,rms); //bemcData[softId] = hit->adc() - pedestal; if (hit->energy()<=0) continue; int softId; int modN = hit->module(); int etaN = hit->eta(); int subN = hit->sub(); StEmcGeom *geomBemc = StEmcGeom::getEmcGeom(1); geomBemc->getId(modN, etaN, subN, softId); int status; float pedestal; float rms; //mEmcDecoder->GetDaqIdFrom TowerId(softId,daqId); mBemcTables->getStatus(1, softId, status); mBemcTables->getPedestal(1,softId,0,pedestal,rms); //cout<<"softid = "<energy()<primaryVertex()->numberOfDaughters(); ++i) { StMcTrack* upsMc = mMcEvent->primaryVertex()->daughter(i); // Get Upsilon if (upsMc->geantId() >= 160) { StMcVertex* UpsStartVertex = upsMc->startVertex(); cout<<"UPS VERTEX = "<position()<stopVertex()->numberOfDaughters(); ++j) { StMcTrack* mcTrack = upsMc->stopVertex()->daughter(j); switch (mcTrack->geantId()) { case 2: posMc = mcTrack; break; case 3: eleMc = mcTrack; break; default: LOG_WARN << "Not an electron nor a positron - geantId = " << mcTrack->geantId() << endm; return kStWarn; } } cout<<"USING THIS ONE!!!"<momentum().unit() * posMc->momentum().unit(); SetHighTowerVar(eleMc,true); SetHighTowerVar(posMc,false); int nL0Candidates = ups.L0candidates.size(); int nCandidates1 = ups.candidates.size(); cout<<"# candidates in embed = "< 0){ cout<<"first = "<id()<<", "< p = assoc->mcTrackMap()->equal_range(mcTrack); StTrack* maxTrack = 0; int maxCommonTpcHits = 0; for (mcTrackMapIter k = p.first; k != p.second; ++k) { int commonTpcHits = k->second->commonTpcHits(); StTrack* track = k->second->partnerTrack()->node()->track(primary); if (track && commonTpcHits > maxCommonTpcHits) { maxTrack = track; maxCommonTpcHits = commonTpcHits; } } return maxTrack; } void StUpsilonEmbedMaker::getClusterEtaPhiE(int& id, pair& etaphi, float& Ecluster) { cout<<"In getclusteretaphi "; if (id == 0){ cout<<"soft id is zero!!! exit etaphi"< E2){ E3 = E2; ID3 = ID2; E2 = Ecur; ID2 = idcur;} else if (Ecur > E3){ E3 = Ecur; ID3 = idcur;}} StEmcGeom *geomBemc = StEmcGeom::getEmcGeom(1); Ecluster = E1+E2+E3; float eta1;float eta2;float eta3; float phi1;float phi2;float phi3; geomBemc->getEta(id,eta1); geomBemc->getPhi(id,phi1); if (ID2 > 0){ geomBemc->getEta(ID2,eta2); geomBemc->getPhi(ID2,phi2);} if (ID3 > 0){ geomBemc->getEta(ID3,eta3); geomBemc->getPhi(ID3,phi3);} if ((E1+E2+E3)>0){ etaphi.first = (eta1*E1+eta2*E2+eta3*E3)/Ecluster; etaphi.second = (phi1*E1+phi2*E2+phi3*E3)/Ecluster;} else{ etaphi.first = -1000;etaphi.second = -1000;} //cout<<"Finished etaphi"<& etaphi) { //cout<<"in track etaphi StTrack "; StEmcPosition* projPos = new StEmcPosition; StThreeVectorD* PosVec = new StThreeVectorD; StThreeVectorD* MomVec = new StThreeVectorD; Double_t mMagneticField = mEvent->summary()->magneticField()*0.1;//kilogause/tesla //cout<<"Defined variables"<projTrack(PosVec,MomVec,mcTrack,mMagneticField); //cout<<"called projection"<pseudoRapidity(); etaphi.second = PosVec->phi(); delete projPos; delete PosVec; delete MomVec; return; } int StUpsilonEmbedMaker :: getTPADC(int id){ int TPid;int TPADC = 0; StEmcDecoder* EmcDecoder = new StEmcDecoder; EmcDecoder->GetTriggerPatchFromTowerId(id,TPid); for (int softId = 1;softId<=4800;++softId){ int TPidcur; EmcDecoder->GetTriggerPatchFromTowerId(softId,TPidcur); if (TPidcur == TPid) TPADC+=bemcData[softId];} return TPADC; }