00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00035
00036
00037
00039 #include "TTree.h"
00040 #include "StEvent/StEvent.h"
00041 #include "StMcEventMaker/StMcEventMaker.h"
00042 #include "StAssociationMaker/StAssociationMaker.h"
00043 #include "StAssociationMaker/StTrackPairInfo.hh"
00044 #include "StTrack.h"
00045 #include "StGlobalTrack.h"
00046 #include "StKinkVertex.h"
00047 #include "StKinkMuDst.hh"
00048 #include "StKinkMc.hh"
00049 #include "StMcEventTypes.hh"
00050 #include "StParticleDefinition.hh"
00051 #include "StTrackDetectorInfo.h"
00052
00053 #include "StStrangeControllerInclude.h"
00054
00055
00056 StKinkController::StKinkController() : StStrangeControllerBase(kinkT) {
00057 increment = 100;
00058 max = 500;
00059 bsize = 128000;
00060 }
00061
00062 StKinkController::~StKinkController() {
00063 }
00064
00065 Int_t StKinkController::MakeReadDst() {
00066
00067 entries = GetN();
00068 PrintNumCand("read",entries);
00069 nEntries += entries;
00070
00071 return kStOK;
00072 }
00073
00074 Int_t StKinkController::MakeCreateDst(StEvent& event) {
00075
00076
00077 StSPtrVecKinkVertex& kinkVertices = event.kinkVertices();
00078 entries = kinkVertices.size();
00079 Int_t asize = dataArray->GetSize();
00080 if (entries > asize) dataArray->Expand(entries+increment);
00081 Int_t j=0;
00082 for (Int_t i=0; i<entries; i++) {
00083 StKinkVertex* kinkVertex = kinkVertices[i];
00084 if (kinkVertex)
00085 new((*dataArray)[j++]) StKinkMuDst(kinkVertex);
00086 }
00087 entries = j;
00088 PrintNumCand("found",entries);
00089 nEntries += entries;
00090
00091 return kStOK;
00092 }
00093
00094 Int_t StKinkController::MakeCreateMcDst(StMcVertex* mcVert) {
00095
00096 mcKinkMapType* theMcKinkMap = 0;
00097 mcTrackMapType* theMcTrackMap = 0;
00098 if (assocMaker) {
00099 theMcKinkMap = assocMaker->mcKinkMap();
00100 theMcTrackMap = assocMaker->mcTrackMap();
00101 }
00102 if (!((assocMaker)&&(theMcKinkMap)&&(theMcTrackMap))) return kStOk;
00103 const StKinkVertex* rcKinkPartner = 0;
00104 StMcTrack* Daughter = 0;
00105 Int_t indexRecoArray = -1;
00106 Int_t count = theMcKinkMap->count(mcVert);
00107 StSPtrVecMcTrack& Daughters = mcVert->daughters();
00108
00109 for (StMcTrackIterator DTrackIt = Daughters.begin();
00110 DTrackIt != Daughters.end(); DTrackIt++) {
00111 if ((Int_t)(*DTrackIt)->particleDefinition()->charge()) {
00112 Daughter = (*DTrackIt);
00113 break;
00114 }
00115 }
00116
00117 if (Daughter) {
00118 StKinkMc* kinkMc = new((*mcArray)[mcEntries++]) StKinkMc(mcVert,Daughter);
00119 if (count>0) {
00120 pair<mcKinkMapIter,mcKinkMapIter> mcKinkBounds =
00121 theMcKinkMap->equal_range(mcVert);
00122 indexRecoArray = -1;
00123
00124 rcKinkPartner = (*mcKinkBounds.first).second;
00125 float x, y, z, delta, xd, yd, zd;
00126 x = mcVert->position().x();
00127 y = mcVert->position().y();
00128 z = mcVert->position().z();
00129 xd = x - rcKinkPartner->position().x();
00130 yd = y - rcKinkPartner->position().y();
00131 zd = z - rcKinkPartner->position().z();
00132 delta = xd*xd + yd*yd + zd*zd;
00133
00134
00135 for(mcKinkMapIter mcKinkMapIt = mcKinkBounds.first;
00136 mcKinkMapIt != mcKinkBounds.second; ++mcKinkMapIt) {
00137 const StKinkVertex *temp = (*mcKinkMapIt).second;
00138 if (temp != rcKinkPartner) {
00139 xd = x - temp->position().x();
00140 yd = y - temp->position().y();
00141 zd = z - temp->position().z();
00142 float delta2 = xd*xd + yd*yd + zd*zd;
00143 if (delta2 < delta) { rcKinkPartner = temp; delta = delta2; }
00144 }
00145 }
00146 x = rcKinkPartner->position().x();
00147 y = rcKinkPartner->position().y();
00148 z = rcKinkPartner->position().z();
00149
00150 for(Int_t i = 0; i < GetN(); i++) {
00151 StKinkMuDst* tmpKink = (StKinkMuDst*) dataArray->At(i);
00152 if( fabs(x - tmpKink->positionX()) < 0.00001 &&
00153 fabs(y - tmpKink->positionY()) < 0.00001 &&
00154 fabs(z - tmpKink->positionZ()) < 0.00001 )
00155 { indexRecoArray = i; break; }
00156 }
00157 new((*assocArray)[assocEntries++])
00158 StStrangeAssoc(indexRecoArray,mcEntries-1);
00159 if(indexRecoArray!=-1) {
00160 pair<mcTrackMapIter,mcTrackMapIter> mcTrackBounds =
00161 theMcTrackMap->equal_range(Daughter);
00162 StTrackPairInfo* bestPairInfo = (*mcTrackBounds.first).second;
00163 for(mcTrackMapIter mcMapIt = mcTrackBounds.first;
00164 mcMapIt != mcTrackBounds.second; ++mcMapIt) {
00165 if ((*mcMapIt).second->commonTpcHits() > bestPairInfo->commonTpcHits())
00166 bestPairInfo = (*mcMapIt).second;
00167 }
00168 if (mcTrackBounds.first != mcTrackBounds.second) {
00169 kinkMc->SetHitInfo(bestPairInfo->commonTpcHits());
00170 }
00171 }
00172 }
00173 }
00174
00175 return kStOK;
00176 }
00177
00178 ClassImp(StKinkController)