00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00039 #include "StRareMaker.h"
00040 #include "StRareEvent.h"
00041 #include "StRareEventCut.h"
00042 #include "StRareTrackCut.h"
00043 #include "StL3RareTrackCut.h"
00044 #include "StAcceptAllEvents.h"
00045 #include "StAcceptAllTracks.h"
00046 #include "StAcceptAllL3Tracks.h"
00047 #include "StChain.h"
00048 #include "StEventTypes.h"
00049 #include "StMessMgr.h"
00050 #include "StarClassLibrary/StThreeVector.hh"
00051
00052 ClassImp(StRareEventCut)
00053 ClassImp(StRareTrackCut)
00054 ClassImp(StL3RareTrackCut)
00055
00056 static const char rcsid[] = "$Id: StRareMaker.cxx,v 1.8 2002/01/18 19:14:10 struck Exp $";
00057
00058 double dEdx_formula(double momentum, double mass);
00059
00060 ClassImp(StRareMaker)
00061
00062 StRareMaker::StRareMaker(const Char_t *name, Char_t* fileName) : StMaker(name) {
00063 mRareEvent = new StRareEvent();
00064 out = new TFile(fileName, "RECREATE");
00065 out->SetCompressionLevel(2);
00066 m_Tree = new TTree("RareTree", "RareTree");
00067
00068 m_Tree->AutoSave();
00069 m_Tree->SetAutoSave(10000000);
00070 m_Tree->Branch("StRareEvent", "StRareEvent", &mRareEvent, 64000, 1);
00071 mEventCut = new StAcceptAllEvents();
00072 mTrackCut = new StAcceptAllTracks();
00073 mL3TrackCut = new StAcceptAllL3Tracks();
00074 }
00075
00076 StRareMaker::StRareMaker(const Char_t *name, Char_t* fileName,
00077 StRareEventCut* cut, StRareTrackCut* track) : StMaker(name) {
00078 out = new TFile(fileName, "RECREATE");
00079 out->SetCompressionLevel(2);
00080 m_Tree = new TTree("RareTree", "RareTree", 1000000);
00081 m_Tree->AutoSave();
00082 m_Tree->SetAutoSave(10000000);
00083 mRareEvent = new StRareEvent();
00084 m_Tree->Branch("StRareEvent", "StRareEvent", &mRareEvent, 64000, 1);
00085 mEventCut = cut;
00086 mTrackCut = track;
00087 mL3TrackCut = 0;
00088 }
00089
00090 StRareMaker::StRareMaker(const Char_t *name, Char_t* fileName,
00091 StRareEventCut* cut,
00092 StRareTrackCut* trackCut,
00093 StL3RareTrackCut* l3trackCut) : StMaker(name) {
00094
00095 out = new TFile(fileName, "RECREATE");
00096 out->SetCompressionLevel(2);
00097 m_Tree = new TTree("RareTree", "RareTree", 1000000);
00098 m_Tree->AutoSave();
00099 m_Tree->SetAutoSave(10000000);
00100 mRareEvent = new StRareEvent();
00101 m_Tree->Branch("StRareEvent", "StRareEvent", &mRareEvent, 64000, 1);
00102 mEventCut = cut;
00103 mTrackCut = trackCut;
00104 mL3TrackCut = l3trackCut;
00105 }
00106
00107 Int_t StRareMaker::Make() {
00108
00109
00110
00111
00112
00113 StEvent* mEvent;
00114 mEvent = (StEvent *) GetInputDS("StEvent");
00115 if (!mEvent) return kStOK;
00116
00117
00118
00119 cout << " event ID = " << mEvent->id() << endl;
00120 int runNumber = mEvent->runId();
00121
00122 mRareEvent->clear();
00123
00124
00125 StL0Trigger* l0Trigger = mEvent->l0Trigger();
00126 if (!l0Trigger) {
00127 cout << "No l0 trigger found.\n";
00128 cout << "Skip this event!\n";
00129 return 0;
00130 }
00131 else if (l0Trigger->triggerWord()<0x1000 ||
00132 l0Trigger->triggerWord()>0x1fff) {
00133 return 0;
00134 }
00135
00136
00137 StL3Trigger* l3Event;
00138 l3Event = (StL3Trigger*) mEvent->l3Trigger();
00139 if (l3Event) {
00140 const StL3EventSummary* l3EventSummary = l3Event->l3EventSummary();
00141 if (!l3EventSummary) {
00142 cout << "No l3 event summary found." << endl;
00143 return 0;
00144 }
00145 bool take = l3EventSummary->unbiasedTrigger();
00146
00147 const StPtrVecL3AlgorithmInfo& algInfo = l3EventSummary->algorithmsAcceptingEvent();
00148 for (unsigned int i=0; i<algInfo.size(); i++) {
00149 if (algInfo[i]->id() == 6) take = kTRUE;
00150 }
00151 if (!take) return 0;
00152 }
00153
00154 if (mEventCut->Accept(mEvent)) {
00155 mRareEvent->fillRareEvent(mEvent);
00156 StPrimaryTrackIterator itr;
00157 StPrimaryTrack *trk;
00158 if (mEvent->primaryVertex()) {
00159 StSPtrVecPrimaryTrack& tracks = mEvent->primaryVertex()->daughters();
00160 for (itr=tracks.begin(); itr != tracks.end(); itr++){
00161 trk = *itr;
00162 if (mTrackCut->Accept(trk)) mRareEvent->addTrack(trk);
00163 }
00164 }
00165
00166
00167 float l3zVertex = -999;
00168 if (mL3TrackCut && l3Event) {
00169 mRareEvent->fillL3Info(l3Event);
00170 if (l3Event->primaryVertex())
00171 l3zVertex = l3Event->primaryVertex()->position().z();
00172
00173 StGlobalTrack *l3trk;
00174 StSPtrVecTrackNode& mtracknodes = (StSPtrVecTrackNode&) l3Event->trackNodes();
00175 for (unsigned int i=0; i<mtracknodes.size(); i++) {
00176 l3trk = (StGlobalTrack* )mtracknodes[i]->track(0);
00177
00178
00179 StHelixModel* oldHelix = (StHelixModel*) l3trk->geometry();
00180 int charge = oldHelix->charge();
00181 short int h = oldHelix->helicity();
00182
00183 if (runNumber==2291023) {
00184 charge *= -1;
00185 h *= -1;
00186 float kapa = oldHelix->curvature();
00187 float lambda = oldHelix->dipAngle();
00188 StHelixModel* newHelix = new StHelixModel(charge, (float) oldHelix->psi(),
00189 kapa, lambda, oldHelix->origin(),
00190 oldHelix->momentum(), h);
00191 l3trk->setGeometry(newHelix);
00192 }
00193
00194
00195
00196
00197
00198
00199
00200 if (l3zVertex!=-999) {
00201 StThreeVectorD vertex(0, 0, l3zVertex);
00202 float dca2d = oldHelix->helix().distance(vertex);
00203
00204
00205 l3trk->setImpactParameter(dca2d);
00206 }
00207
00208 if (mL3TrackCut->Accept(l3trk)) mRareEvent->addL3Track(l3trk);
00209
00210
00211
00212 }
00213 }
00214
00215 m_Tree->Fill();
00216
00217 mRareEvent->Clear();
00218 }
00219 return kStOK;
00220 }
00221
00222 Int_t StRareMaker::Init() {
00223 number_of_events_processed = 0;
00224 Report();
00225 return StMaker::Init();
00226 }
00227
00228 void StRareMaker::Report(){
00229 mEventCut->Report();
00230 mTrackCut->Report();
00231 }
00232
00233
00234 void StRareMaker::PrintInfo() {
00235 printf("**************************************************************\n");
00236 printf("* $Id: StRareMaker.cxx,v 1.8 2002/01/18 19:14:10 struck Exp $\n");
00237 printf("**************************************************************\n");
00238 }
00239
00240 void StRareMaker::Clear(Option_t *opt) {
00241 }
00242
00243
00244 Int_t StRareMaker::Finish() {
00245 out->Write();
00246 out->Close();
00247 return kStOK;
00248 }
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258