00001 #include "StEmcMicroUtil.h"
00002 #include "StEvent.h"
00003 #include "StEventTypes.h"
00004 #include "StEmcMicroEvent.h"
00005 #include "SystemOfUnits.h"
00006 #include "StEmcUtil/geometry/StEmcGeom.h"
00007 #include "StEmcUtil/others/emcDetectorName.h"
00008 #include "StEmcUtil/filters/StEmcFilter.h"
00009
00010 ClassImp(StEmcMicroUtil)
00011
00012 StEmcMicroUtil::StEmcMicroUtil()
00013 {
00014 for(Int_t i =0;i<4;i++) mGeo[i]=StEmcGeom::getEmcGeom(detname[i].Data());
00015 }
00016 StEmcMicroUtil::~StEmcMicroUtil()
00017 {
00018
00019 }
00020 void StEmcMicroUtil::clearGarbage()
00021 {
00022 for(Int_t i=0;i<mNV0Tracks;i++)
00023 {
00024 if(mV0Tracks[i]) { delete mV0Tracks[i]; mV0Tracks[i]=NULL; }
00025 }
00026 mNV0Tracks=0;
00027 }
00028 StEmcMicroEvent* StEmcMicroUtil::getMicroEvent(StEvent *event)
00029 {
00030 if(!event) return NULL;
00031
00032 mStEvent = event;
00033 processStEvent();
00034
00035 return mMicroEvent;
00036 }
00037 StEvent* StEmcMicroUtil::getStEvent(StEmcMicroEvent* event)
00038 {
00039 if(!event) return NULL;
00040
00041 mMicroEvent = event;
00042 processMicroEvent();
00043
00044 return mStEvent;
00045 }
00046 void StEmcMicroUtil::processStEvent()
00047 {
00048 mMicroEvent = new StEmcMicroEvent();
00049 processStEventInfo();
00050 processStEventTracks();
00051 if(mDoSaveV0) processStEventV0();
00052 if(mDoSaveEmc) processStEventEMC();
00053 if(mDoSaveFpd) processStEventFPD();
00054 }
00055 void StEmcMicroUtil::processStEventInfo()
00056 {
00057 cout <<"filling general info\n";
00058
00059
00060 Float_t BF=0.5;
00061 StEventSummary* summary = mStEvent->summary();
00062 if(summary) BF = summary->magneticField()/10.;
00063 mMicroEvent->setBField(BF);
00064
00065 StL0Trigger* pTrigger = mStEvent->l0Trigger();
00066 if(pTrigger)
00067 {
00068 mMicroEvent->setL0TriggerWord(pTrigger->triggerWord());
00069 mMicroEvent->setToken(pTrigger->triggerToken());
00070 mMicroEvent->setBunchCrossing(pTrigger->bunchCrossingId());
00071 mMicroEvent->setBunchCrossing7bit(pTrigger->bunchCrossingId7bit(mStEvent->runId()));
00072
00073 mMicroEvent->setSpinBits(pTrigger->spinBits());
00074 }
00075
00076
00077 mMicroEvent->setEventID((Int_t)(mStEvent->id()));
00078 mMicroEvent->setRunID((Int_t)(mStEvent->runId()));
00079 mMicroEvent->setEventTime((Int_t)mStEvent->time());
00080
00081
00082 StPrimaryVertex* primaryVertex = mStEvent->primaryVertex(0);
00083 if(primaryVertex)
00084 {
00085 const StThreeVectorF& vertex = primaryVertex->position();
00086 mMicroEvent->setVertexPos(vertex.x(),vertex.y(),vertex.z());
00087
00088 UInt_t origMult = primaryVertex->numberOfDaughters();
00089 mMicroEvent->setOrigMult(origMult);
00090 }
00091
00092
00093 Int_t ctb = 0;
00094 Int_t zdce = 0;
00095 Int_t zdcw = 0;
00096 Float_t zdcvz = 0;
00097
00098 Int_t bbcw = 0;
00099 Int_t bbce = 0;
00100 Int_t bbcnh = 0;
00101 Float_t bbcvz = 0;
00102
00103 StTriggerDetectorCollection *triggers = mStEvent->triggerDetectorCollection();
00104 if (triggers)
00105 {
00106 StCtbTriggerDetector &CTB = triggers->ctb();
00107 StZdcTriggerDetector &ZDC = triggers->zdc();
00108 StBbcTriggerDetector &BBC = triggers->bbc();
00109 StEmcTriggerDetector &EMC = triggers->emc();
00110
00111 for (UInt_t slat=0; slat<CTB.numberOfSlats(); slat++)
00112 for (UInt_t tray=0; tray<CTB.numberOfTrays();tray++)
00113 ctb += (Int_t)CTB.mips(tray,slat,0);
00114
00115
00116 zdce = (Int_t)ZDC.adcSum(east);
00117 zdcw = (Int_t)ZDC.adcSum(west);
00118 zdcvz = (Float_t)ZDC.vertexZ();
00119
00120 bbcw = (Int_t)BBC.adcSumWest();
00121 bbce = (Int_t)BBC.adcSumEast();
00122 bbcnh = (Int_t)BBC.nHitAll();
00123 bbcvz = (Float_t)BBC.zVertex();
00124
00125 for(Int_t i=0;i<300;i++)
00126 {
00127 Int_t HT = EMC.highTower(i);
00128 Int_t PA = EMC.patch(i);
00129 mMicroEvent->setHighTower(i,HT);
00130 mMicroEvent->setPatch(i,PA);
00131 }
00132 }
00133 mMicroEvent->setCTB(ctb);
00134 mMicroEvent->setZDCe(zdce);
00135 mMicroEvent->setZDCw(zdcw);
00136 mMicroEvent->setZVertexZDC(zdcvz);
00137 mMicroEvent->setBBCw(bbcw);
00138 mMicroEvent->setBBCw(bbce);
00139 mMicroEvent->setBBCNHits(bbcnh);
00140 mMicroEvent->setZVertexBBC(bbcvz);
00141 }
00142 void StEmcMicroUtil::processStEventTracks()
00143 {
00144 cout <<"filling tracks\n";
00145 int totalp=0,goodp=0,totalg=0,goodg=0;
00146
00147 StSPtrVecTrackNode& trackNode = mStEvent->trackNodes();
00148 for (unsigned int j=0; j < trackNode.size(); j++)
00149 {
00150 StTrack* gTrack = (trackNode[j]->track(global));
00151 StTrack* pTrack = (trackNode[j]->track(primary));
00152
00153
00154 if (pTrack && mDoSavePrimaries)
00155 {
00156 totalp++;
00157 if(mPFilter->accept(pTrack))
00158 {
00159
00160 StEmcMicroTrack* MicroPTrack = new StEmcMicroTrack();
00161 createTrack(pTrack,MicroPTrack);
00162 if(MicroPTrack)
00163 {
00164 MicroPTrack->setTrackNodeNumber(j);
00165 mMicroEvent->addPrimaryTrack(MicroPTrack);
00166 goodp++;
00167 }
00168 }
00169 }
00170
00171 if (gTrack && mDoSaveGlobals)
00172 {
00173 totalg++;
00174 if (mGFilter->accept(gTrack))
00175 {
00176 StEmcMicroTrack* MicroGTrack=new StEmcMicroTrack();
00177 createTrack(gTrack,MicroGTrack);
00178 if(MicroGTrack)
00179 {
00180 MicroGTrack->setTrackNodeNumber(j);
00181 mMicroEvent->addGlobalTrack(MicroGTrack);
00182 goodg++;
00183 }
00184 }
00185 }
00186 }
00187 cout <<"Total primary tracks = "<<totalp<<" good = "<<goodp<<endl;
00188 cout <<"Total global tracks = "<<totalg<<" good = "<<goodg<<endl;
00189 cout <<"finished filing tracks\n";
00190 }
00191 void StEmcMicroUtil::createTrack(StTrack* track,StEmcMicroTrack* MicroTrack)
00192 {
00193 StThreeVectorF p = track->geometry()->momentum();
00194 if(p.mag()==0) return;
00195
00196 StThreeVectorF o = track->geometry()->origin();
00197
00198 MicroTrack->setP(p.mag());
00199 MicroTrack->setEta(p.pseudoRapidity());
00200 MicroTrack->setPhi(p.phi());
00201 MicroTrack->setCurvature(track->geometry()->curvature());
00202
00203 MicroTrack->setFlag(track->flag());
00204
00205 MicroTrack->setOrigin(o.x(),o.y(),o.z());
00206
00207 MicroTrack->setCharge(track->geometry()->charge());
00208
00209 MicroTrack->setDca(track->impactParameter());
00210
00211 Float_t dcaSigned = calcDcaSigned(track);
00212 MicroTrack->setDcaSigned(dcaSigned);
00213
00214 MicroTrack->setChi2((Float_t)(track->fitTraits().chi2()));
00215 MicroTrack->setFitPts(track->fitTraits().numberOfFitPoints());
00216 MicroTrack->setMaxPts(track->numberOfPossiblePoints());
00217
00218 if(track->detectorInfo())
00219 MicroTrack->setNhits(track->detectorInfo()->numberOfPoints(kTpcId));
00220
00221
00222 StPtrVecTrackPidTraits traits = track->pidTraits(kTpcId);
00223 unsigned int size = traits.size();
00224
00225 if (size)
00226 {
00227 StDedxPidTraits* pid;
00228 for (unsigned int i = 0; i < traits.size(); i++)
00229 {
00230 pid = dynamic_cast<StDedxPidTraits*>(traits[i]);
00231 if (pid && pid->method() == kTruncatedMeanId) break;
00232 }
00233 assert(pid);
00234
00235 double dEdX = (double)pid->mean();
00236 double npt = (double)pid->numberOfPoints();
00237 double dEdXErr = (double)pid->errorOnMean();
00238 MicroTrack->setDedxErr(dEdXErr);
00239 MicroTrack->setDedx((Float_t) dEdX);
00240 MicroTrack->setNdedxPts((Int_t)npt);
00241 }
00242
00243 MicroTrack->setTrackLength(track->length());
00244
00245 return;
00246 }
00247 Float_t StEmcMicroUtil::calcDcaSigned(StTrack* track)
00248 {
00249
00250
00251
00252
00253 StThreeVectorF pos = mStEvent->primaryVertex(0)->position();
00254
00255 double xCenter = track->geometry()->helix().xcenter();
00256 double yCenter = track->geometry()->helix().ycenter();
00257 double radius = 1.0/track->geometry()->helix().curvature();
00258
00259 double dPosCenter = ::sqrt( (pos.x() - xCenter) * (pos.x() - xCenter) +
00260 (pos.y() - yCenter) * (pos.y() - yCenter));
00261
00262 return (Float_t) (radius - dPosCenter);
00263 }
00264 void StEmcMicroUtil::processStEventV0()
00265 {
00266 cout <<"Filling V0īs\n";
00267 Int_t nV=0;
00268 StSPtrVecV0Vertex& v0=mStEvent->v0Vertices();
00269 if(v0.size()==0) return;
00270
00271 for(Int_t i = 0;i<(Int_t)v0.size();i++)
00272 {
00273 StV0Vertex *v = v0[i];
00274 if(v) if(mGFilter->accept(v))
00275 {
00276 nV++;
00277 StEmcMicroV0* mv = new StEmcMicroV0();
00278
00279 for(Int_t j=0;j<2;j++)
00280 {
00281 StTrack* tr = v->daughter(j);
00282 if(tr)
00283 {
00284 StEmcMicroTrack *mtr = new StEmcMicroTrack();
00285 createTrack(tr,mtr);
00286 if(mtr) mv->setDaughter(j,mtr);
00287 }
00288 }
00289 StThreeVectorF pos=v->position();
00290 mv->setVertex(pos.x(),pos.y(),pos.z());
00291 mMicroEvent->addV0(mv);
00292 }
00293 }
00294 cout <<"Total V0īs accepted = "<<nV<<endl;
00295 }
00296 void StEmcMicroUtil::processStEventEMC()
00297 {
00298 StEmcCollection* emccol=mStEvent->emcCollection();
00299 if(!emccol) return;
00300 StEmcMicroCollection* Microemc=new StEmcMicroCollection();
00301
00302 Int_t HitsId[18000];
00303
00304
00305
00306 for(Int_t d=0; d<4; d++)
00307 {
00308 Int_t EmcDet=d+1;
00309 for(Int_t i=0;i<18000;i++) HitsId[i]=-1;
00310
00311 StDetectorId id = static_cast<StDetectorId>(d+kBarrelEmcTowerId);
00312 StEmcDetector* detector=emccol->detector(id);
00313 if(!detector) cout <<detname[d].Data()<<" not loaded\n";
00314 if(detector)
00315 {
00316
00317 cout <<"Filling hits for detector "<<detname[d].Data()<<endl;
00318
00319 Int_t HitIndex=0;
00320 for(UInt_t j=1;j<121;j++)
00321 {
00322 StEmcModule* module = detector->module(j);
00323 if(module)
00324 {
00325 StSPtrVecEmcRawHit& rawHit=module->hits();
00326 Int_t nhits=(Int_t)rawHit.size();
00327 if(nhits>0)
00328 for(Int_t k=0;k<nhits;k++)
00329 {
00330 Int_t m = rawHit[k]->module();
00331 Int_t e = rawHit[k]->eta();
00332 Int_t s = abs(rawHit[k]->sub());
00333 Int_t adc = rawHit[k]->adc();
00334 Float_t energy = rawHit[k]->energy();
00335
00336 StEmcMicroHit* Microhit = new StEmcMicroHit();
00337
00338 Microhit->setModule(m);
00339 Microhit->setEta(e);
00340 Microhit->setSub(s);
00341 Microhit->setAdc(adc);
00342 Microhit->setEnergy(energy);
00343
00344 Microemc->addHit(EmcDet,Microhit);
00345 Int_t rid;
00346 mGeo[d]->getId(m,e,s,rid);
00347 HitsId[rid-1] = HitIndex;
00348 HitIndex++;
00349
00350 }
00351 }
00352 }
00353
00354
00355 if(detector->cluster())
00356 {
00357 StSPtrVecEmcCluster& cluster=detector->cluster()->clusters();
00358 Int_t totalcluster=(Int_t)cluster.size();
00359 cout <<"Filling clusters for detector "<<detname[d].Data()<<endl;
00360 cout <<"Number of clusters = "<<totalcluster<<endl;
00361 if(totalcluster>0)
00362 for(Int_t j=0;j<totalcluster;j++)
00363 {
00364 StEmcMicroCluster *Microcl=new StEmcMicroCluster();
00365
00366 Microcl->setEta(cluster[j]->eta());
00367 Microcl->setPhi(cluster[j]->phi());
00368 Microcl->setSigmaEta(cluster[j]->sigmaEta());
00369 Microcl->setSigmaPhi(cluster[j]->sigmaPhi());
00370 Microcl->setEnergy(cluster[j]->energy());
00371
00372 StPtrVecEmcRawHit& rawHit=cluster[j]->hit();
00373 Int_t nhit=(Int_t)rawHit.size();
00374
00375 for(Int_t k=0;k<nhit;k++)
00376 {
00377 Int_t m = rawHit[k]->module();
00378 Int_t e = rawHit[k]->eta();
00379 Int_t s = abs(rawHit[k]->sub());
00380 Int_t rid;
00381 mGeo[d]->getId(m,e,s,rid);
00382 Int_t index = HitsId[rid-1];
00383 if(index!=-1) Microcl->addHit(Microemc->getHit(EmcDet,index));
00384 }
00385 Microemc->addCluster(EmcDet,Microcl);
00386
00387 }
00388 }
00389 }
00390 }
00391
00392
00393 cout <<"Filling points "<<endl;
00394
00395 StSPtrVecEmcPoint& points=emccol->barrelPoints();
00396 Int_t npoints=points.size();
00397 if(npoints>0)
00398 {
00399 for(Int_t p=0;p<npoints;p++)
00400 {
00401 StEmcPoint* point=points[p];
00402 StThreeVectorF position=point->position();
00403 StEmcMicroPoint *Micropt=new StEmcMicroPoint();
00404 Micropt->setEta(position.pseudoRapidity());
00405 Micropt->setPhi(position.phi());
00406 Micropt->setDeltaEta(point->deltaEta());
00407 Micropt->setDeltaPhi(point->deltaPhi());
00408 Micropt->setEnergy(point->energy());
00409 Micropt->setChiSquare(point->chiSquare());
00410
00411 for(Int_t d=0;d<4;d++)
00412 {
00413 Int_t det =d+1;
00414 StDetectorId detid=static_cast<StDetectorId>(d+kBarrelEmcTowerId);
00415 StPtrVecEmcCluster& cluster=point->cluster(detid);
00416 Int_t ptnc=0;
00417 ptnc=cluster.size();
00418 for(Int_t i=0;i<ptnc;i++) if(cluster[i])
00419 {
00420 Float_t eta = cluster[i]->eta();
00421 Float_t phi = cluster[i]->phi();
00422 for(Int_t j=0;j<Microemc->getNClusters(det);j++)
00423 {
00424 StEmcMicroCluster *cl=Microemc->getCluster(det,j);
00425 if(eta == cl->getEta() && phi==cl->getPhi())
00426 {
00427 Micropt->addCluster(det,cl);
00428 goto cont;
00429 }
00430 }
00431 cont: continue;
00432 }
00433 }
00434 Microemc->addPoint(Micropt);
00435
00436 }
00437
00438 }
00439
00440 mMicroEvent->setEmc(Microemc);
00441 cout <<"Finished filling EMC\n";
00442 return;
00443
00444 }
00445 void StEmcMicroUtil::processStEventFPD()
00446 {
00447 cout <<"Filling FPD ...\n";
00448 StFpdCollection * fpd = mStEvent->fpdCollection();
00449 if(!fpd) return;
00450
00451 StFpdMicroCollection *Microfpd = new StFpdMicroCollection();
00452
00453 Microfpd->setToken(fpd->token());
00454 Microfpd->setSumAdcNorth(fpd->sumAdcNorth());
00455 Microfpd->setSumAdcSouth(fpd->sumAdcSouth());
00456 Microfpd->setSumAdcTop(fpd->sumAdcTop());
00457 Microfpd->setSumAdcBottom(fpd->sumAdcBottom());
00458 Microfpd->setSumAdcPreShower1(fpd->sumAdcPreShower1());
00459 Microfpd->setSumAdcPreShower2(fpd->sumAdcPreShower2());
00460 Microfpd->setSumAdcSmdX(fpd->sumAdcSmdX());
00461 Microfpd->setSumAdcSmdY(fpd->sumAdcSmdY());
00462
00463 mMicroEvent->setFpd(Microfpd);
00464 cout <<"Finished filling FPD\n";
00465
00466 }
00467 void StEmcMicroUtil::processMicroEvent()
00468 {
00469 clearGarbage();
00470 mStEvent = new StEvent;
00471 processMicroEventInfo();
00472 processMicroEventTracks();
00473 processMicroEventV0();
00474 processMicroEventEMC();
00475 return;
00476 }
00477 void StEmcMicroUtil::processMicroEventInfo()
00478 {
00479 StEventSummary *summary=new StEventSummary();
00480 summary->setMagneticField(mMicroEvent->getBField()*10.);
00481
00482 mStEvent->setSummary(summary);
00483
00484 mStEvent->setRunId(mMicroEvent->getRunID());
00485 mStEvent->setId(mMicroEvent->getEventID());
00486 mStEvent->setTime(mMicroEvent->getEventTime());
00487
00488 StL0Trigger *L0=new StL0Trigger();
00489 L0->setTriggerWord(mMicroEvent->getL0TriggerWord());
00490 mStEvent->setL0Trigger(L0);
00491
00492 StTriggerDetectorCollection *triggers = new StTriggerDetectorCollection();
00493
00494
00495 StZdcTriggerDetector &ZDC = triggers->zdc();
00496
00497 StEmcTriggerDetector &EMC = triggers->emc();
00498
00499 ZDC.setAdcSum(east,mMicroEvent->getZDCe());
00500 ZDC.setAdcSum(west,mMicroEvent->getZDCw());
00501 ZDC.setAdcSum((Float_t)(mMicroEvent->getZDCe()+mMicroEvent->getZDCw()));
00502 ZDC.setVertexZ(mMicroEvent->getZVertexZDC());
00503
00504 for(Int_t i=0;i<300;i++)
00505 {
00506 EMC.setHighTower(i,mMicroEvent->getHighTower(i));
00507 EMC.setPatch(i,mMicroEvent->getPatch(i));
00508 }
00509
00510 mStEvent->setTriggerDetectorCollection(triggers);
00511
00512 StPrimaryVertex *vertex=new StPrimaryVertex();
00513 StThreeVectorF p(mMicroEvent->getVertexX(),mMicroEvent->getVertexY(),mMicroEvent->getVertexZ());
00514 vertex->setPosition(p);
00515 mStEvent->addPrimaryVertex(vertex);
00516 return;
00517 }
00518 void StEmcMicroUtil::processMicroEventTracks()
00519 {
00520
00521
00522 StSPtrVecTrackNode& node=mStEvent->trackNodes();
00523 StPrimaryVertex* vertex = mStEvent->primaryVertex(0);
00524
00525 Int_t maxNode=0,gnode,pnode;
00526
00527 Int_t ng=mMicroEvent->getNGlobalTrack();
00528 Int_t np=mMicroEvent->getNPrimaryTrack();
00529
00530 Int_t max=ng;
00531 if (np>ng) max=np;
00532
00533 for(Int_t i=0;i<max;i++)
00534 {
00535 if(i<ng) gnode=mMicroEvent->getGlobalTrack(i)->getTrackNode(); else gnode=0;
00536 if(i<np) pnode=mMicroEvent->getPrimaryTrack(i)->getTrackNode(); else pnode=0;
00537 if(gnode>maxNode) maxNode=gnode;
00538 if(pnode>maxNode) maxNode=pnode;
00539 }
00540
00541 StTrackNode *trackNode[10000];
00542 for(Int_t i=0;i<10000;i++) trackNode[i] = NULL;
00543
00544 for(Int_t i=0;i<max;i++)
00545 {
00546 if(i<ng)
00547 {
00548 StEmcMicroTrack *gMicroTrack=mMicroEvent->getGlobalTrack(i);
00549 gnode = gMicroTrack->getTrackNode();
00550 if(!trackNode[gnode]) trackNode[gnode]=new StTrackNode();
00551
00552 StGlobalTrack *gTrack = new StGlobalTrack();
00553 createTrack(gMicroTrack,gTrack);
00554 trackNode[gnode]->addTrack(gTrack);
00555 }
00556 if(i<np)
00557 {
00558 StEmcMicroTrack *pMicroTrack=mMicroEvent->getPrimaryTrack(i);
00559 pnode = pMicroTrack->getTrackNode();
00560 if(!trackNode[pnode]) trackNode[pnode]=new StTrackNode();
00561
00562 StPrimaryTrack *pTrack = new StPrimaryTrack();
00563 createTrack(pMicroTrack,pTrack);
00564 pTrack->setVertex(vertex);
00565 vertex->addDaughter(pTrack);
00566 trackNode[pnode]->addTrack(pTrack);
00567 }
00568 }
00569 for(Int_t i=0;i<10000;i++)
00570 if(trackNode[i])
00571 {
00572 Int_t entries=trackNode[i]->entries();
00573 if(entries!=0) node.push_back(trackNode[i]);
00574 else delete trackNode[i];
00575 }
00576
00577 }
00578 void StEmcMicroUtil::createTrack(StEmcMicroTrack* MicroTrack,StTrack* Track)
00579 {
00580 Float_t psi = MicroTrack->getPhi();
00581 Float_t theta=2*atan(exp(-MicroTrack->getEta()));
00582 Short_t charge = (Short_t)MicroTrack->getCharge();
00583 Float_t curvature= MicroTrack->getCurvature();
00584
00585 Track->setLength(MicroTrack->getTrackLength());
00586 Track->setImpactParameter(MicroTrack->getDca());
00587 StThreeVectorF o(MicroTrack->getOrigin(0),MicroTrack->getOrigin(1),MicroTrack->getOrigin(2));
00588 StThreeVectorF p(MicroTrack->getPt()*cos(psi),MicroTrack->getPt()*sin(psi),MicroTrack->getP()*cos(theta));
00589
00590 Track->setGeometry(new StHelixModel(charge,psi,curvature,theta,o,p,0));
00591 Track->addPidTraits(new StDedxPidTraits(kTpcId,kTruncatedMeanId,MicroTrack->getNdedxPts(),MicroTrack->getDedx(),MicroTrack->getDedxErr()));
00592
00593 StTrackDetectorInfo *info=new StTrackDetectorInfo();
00594 info->setNumberOfPoints(MicroTrack->getNhits());
00595 StSPtrVecTrackDetectorInfo& infoNode = mStEvent->trackDetectorInfo();
00596 infoNode.push_back(info);
00597 Track->setDetectorInfo(info);
00598
00599 Float_t a[2],b[15];
00600 a[0]=MicroTrack->getChi2();
00601 StTrackFitTraits *traits=new StTrackFitTraits(0,MicroTrack->getFitPts(),a,b);
00602 Track->setFitTraits(*traits);
00603 delete traits;
00604
00605 Track->setFlag((Short_t)MicroTrack->getFlag());
00606
00607 return;
00608 }
00609 void StEmcMicroUtil::processMicroEventV0()
00610 {
00611 mNV0Tracks=0;
00612 Int_t nv0 = mMicroEvent->getNV0();
00613 if (nv0==0) return;
00614 StSPtrVecV0Vertex& v0=mStEvent->v0Vertices();
00615 for(Int_t i=0;i<nv0;i++)
00616 {
00617 StEmcMicroV0 *mv0 = mMicroEvent->getV0(i);
00618 if(mv0)
00619 {
00620 StV0Vertex *v=new StV0Vertex();
00621 for(Int_t j=0;j<2;j++)
00622 {
00623 StEmcMicroTrack *mt=mv0->getDaughter(j);
00624 if(mt)
00625 {
00626 StGlobalTrack *t=new StGlobalTrack();
00627 createTrack(mt,t);
00628 if(t)
00629 {
00630 StThreeVectorF p = t->geometry()->momentum();
00631 v->setMomentumOfDaughter((StChargeSign)j,p);
00632 v->addDaughter(t);
00633 if(mNV0Tracks<MAXV0TRACKS)
00634 {
00635 mV0Tracks[mNV0Tracks] = t;
00636 mNV0Tracks++;
00637 }
00638 }
00639 }
00640 }
00641 StThreeVectorF pos(mv0->getVertexX(),mv0->getVertexY(),mv0->getVertexZ());
00642 v->setPosition(pos);
00643 v0.push_back(v);
00644 }
00645 }
00646
00647 }
00648 void StEmcMicroUtil::processMicroEventEMC()
00649 {
00650
00651 StEmcMicroCollection* MicroEmc=mMicroEvent->getEmc();
00652 if(!MicroEmc) return;
00653
00654 StEmcCollection *emc=new StEmcCollection();
00655 for(Int_t i=0;i<4;i++)
00656 {
00657 Int_t det=i+1;
00658
00659 StDetectorId id = static_cast<StDetectorId>(i+kBarrelEmcTowerId);
00660 StEmcDetector* detector = new StEmcDetector(id, 120);
00661 emc->setDetector(detector);
00662
00663 for(Int_t j=0;j<MicroEmc->getNHits(det);j++)
00664 {
00665 StEmcMicroHit* hit=MicroEmc->getHit(det,j);
00666 Int_t m=hit->getModule();
00667 Int_t e=hit->getEta();
00668 Int_t s=hit->getSub();
00669 Int_t a=hit->getAdc();
00670 Float_t energy=hit->getEnergy();
00671 StEmcRawHit* rawHit=new StEmcRawHit(id,(UInt_t)m,(UInt_t)e,(UInt_t)s,(UInt_t)a,energy);
00672
00673 detector->addHit(rawHit);
00674 }
00675
00676 Int_t nc=MicroEmc->getNClusters(det);
00677 if(nc>0)
00678 {
00679 StEmcClusterCollection* clusters=new StEmcClusterCollection();
00680 for(Int_t j=0;j<nc;j++)
00681 {
00682 StEmcMicroCluster* cl=MicroEmc->getCluster(det,j);
00683 StEmcCluster* cluster=new StEmcCluster();
00684 Float_t eta=cl->getEta();
00685 Float_t seta=cl->getSigmaEta();
00686 Float_t phi=cl->getPhi();
00687 Float_t sphi=cl->getSigmaPhi();
00688 Float_t e=cl->getEnergy();
00689 cluster->setEta(eta);
00690 cluster->setPhi(phi);
00691 cluster->setSigmaEta(seta);
00692 cluster->setSigmaPhi(sphi);
00693 cluster->setEnergy(e);
00694
00695 for(Int_t k=0;k<cl->getNHits();k++)
00696 {
00697 StEmcMicroHit *hit=cl->getHit(k);
00698 Int_t m=hit->getModule();
00699 Int_t e=hit->getEta();
00700 Int_t s=hit->getSub();
00701 StEmcModule *module = detector->module(m);
00702 StSPtrVecEmcRawHit& rawhits=module->hits();
00703 for(Int_t l=0;l<(Int_t)rawhits.size();l++)
00704 if(m==(Int_t)rawhits[l]->module() && e==(Int_t)rawhits[l]->eta() && s==(Int_t)abs(rawhits[l]->sub()))
00705 cluster->addHit(rawhits[l]);
00706 }
00707
00708 clusters->addCluster(cluster);
00709 }
00710 detector->setCluster(clusters);
00711 }
00712 }
00713
00714 Float_t mag = mGeo[0]->Radius();
00715 for(Int_t i=0; i<MicroEmc->getNPoints();i++)
00716 {
00717 StEmcMicroPoint *point=MicroEmc->getPoint(i);
00718 Float_t eta=point->getEta();
00719 Float_t deta=point->getDeltaEta();
00720 Float_t phi=point->getPhi();
00721 Float_t dphi=point->getDeltaPhi();
00722 Float_t en=point->getEnergy();
00723 Float_t chi=point->getChiSquare();
00724 Float_t theta=2*atan(exp(-eta));
00725 Float_t x,y,z;
00726 x = mag*sin(theta)*cos(phi);
00727 y = mag*sin(theta)*sin(phi);
00728 z = mag*cos(theta);
00729 StThreeVectorF p(x,y,z);
00730 StEmcPoint *pt=new StEmcPoint();
00731 pt->setEnergy(en);
00732 pt->setChiSquare(chi);
00733 pt->setDeltaEta(deta);
00734 pt->setDeltaPhi(dphi);
00735 pt->setPosition(p);
00736 for(Int_t j=0;j<4;j++)
00737 {
00738 Int_t det = j+1;
00739 if(point->getNClusters(det)>0) for(Int_t l=0;l<point->getNClusters(det);l++)
00740 {
00741 StEmcMicroCluster *cl=point->getCluster(det,l);
00742 Float_t eta=cl->getEta();
00743 Float_t phi=cl->getPhi();
00744 Float_t e=cl->getEnergy();
00745 StDetectorId id = static_cast<StDetectorId>(j+kBarrelEmcTowerId);
00746 StEmcDetector *detector=emc->detector(id);
00747 StSPtrVecEmcCluster& clusters=detector->cluster()->clusters();
00748 for(Int_t k=0;k<(Int_t)clusters.size();k++)
00749 if(eta==clusters[k]->eta() && phi==clusters[k]->phi() && e==clusters[k]->energy())
00750 pt->addCluster(id,clusters[k]);
00751 }
00752 }
00753 emc->addBarrelPoint(pt);
00754 }
00755
00756 mStEvent->setEmcCollection(emc);
00757 }