00001 /*************************************************************************** 00002 * 00003 * $Id: StHbtManager.cxx,v 1.20 2001/06/21 19:15:46 laue Exp $ 00004 * 00005 * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu 00006 *************************************************************************** 00007 * 00008 * Description: part of STAR HBT Framework: StHbtMaker package 00009 * The Manager is the top-level object that coordinates activities 00010 * and performs event, particle, and pair loops, and checks the 00011 * various Cuts of the Analyses in its AnalysisCollection 00012 * 00013 *************************************************************************** 00014 * 00015 * $Log: StHbtManager.cxx,v $ 00016 * Revision 1.20 2001/06/21 19:15:46 laue 00017 * Modified fiels: 00018 * CTH.hh : new constructor added 00019 * StHbtEvent, StHbtKink, StHbtTrack : constructors from the persistent 00020 * (TTree) classes added 00021 * StHbtLikeSignAnalysis : minor changes, for debugging 00022 * StHbtTypes: split into different files 00023 * Added files: for the new TTree muDst's 00024 * StExceptions.cxx StExceptions.hh StHbtEnumeration.hh 00025 * StHbtHelix.hh StHbtHisto.hh StHbtString.hh StHbtTFile.hh 00026 * StHbtTTreeEvent.cxx StHbtTTreeEvent.h StHbtTTreeKink.cxx 00027 * StHbtTTreeKink.h StHbtTTreeTrack.cxx StHbtTTreeTrack.h 00028 * StHbtTTreeV0.cxx StHbtTTreeV0.h StHbtVector.hh 00029 * 00030 * Revision 1.19 2000/05/08 15:45:50 laue 00031 * Memory leak fixed. Current hbt event was not deleted 00032 * 00033 * Revision 1.18 2000/03/17 17:23:05 laue 00034 * Roberts new three particle correlations implemented. 00035 * 00036 * Revision 1.16 2000/02/26 19:04:52 laue 00037 * Some unnecessary includes removed. 00038 * StThreeVectorD replace by StHbtThreeVector. 00039 * StHbtCoulomb modified to compile without Root (ClassDef embraced into 00040 * #ifdef __ROOT__ ..... #endif) 00041 * StHbtParticle now returns references (FourMomentum(),Helix(), 00042 * DecayVertexPosiion()) 00043 * 00044 * Revision 1.15 2000/02/18 21:32:24 laue 00045 * franksTrackCut changed. If mCharge is set to '0' there will be no cut 00046 * on charge. This is important for front-loaded cuts. 00047 * 00048 * copy constructor implemented for StHbtEvent, StHbtTrack and StHbtV0. 00049 * 00050 * franks1HistoD.cxx franks1HistoD.h franks2HistoD.cxx franks2HistoD.h 00051 * removed. We can now (CC5 on Solaris) use the versions (no D) 00052 * 00053 * Revision 1.14 2000/02/13 17:17:12 laue 00054 * Calls to the EventBegin() and EventEnd() functions implemented 00055 * The actual analysis is moved from StHbtManager to StHbtAnalysis 00056 * 00057 * Revision 1.13 2000/01/25 17:35:17 laue 00058 * I. In order to run the stand alone version of the StHbtMaker the following 00059 * changes have been done: 00060 * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements 00061 * b) unnecessary includes of StMaker.h have been removed 00062 * c) the subdirectory StHbtMaker/doc/Make has been created including everything 00063 * needed for the stand alone version 00064 * 00065 * II. To reduce the amount of compiler warning 00066 * a) some variables have been type casted 00067 * b) some destructors have been declared as virtual 00068 * 00069 * Revision 1.12 1999/10/15 01:57:29 lisa 00070 * Important enhancement of StHbtMaker - implement Franks CutMonitors 00071 * ---------------------------------------------------------- 00072 * This means 3 new files in Infrastructure area (CutMonitor), 00073 * several specific CutMonitor classes in the Cut area 00074 * and a new base class in the Base area (StHbtCutMonitor). 00075 * This means also changing all Cut Base class header files from .hh to .h 00076 * so we have access to CutMonitor methods from Cint command line. 00077 * This last means 00078 * 1) files which include these header files are slightly modified 00079 * 2) a side benefit: the TrackCuts and V0Cuts no longer need 00080 * a SetMass() implementation in each Cut class, which was stupid. 00081 * Also: 00082 * ----- 00083 * Include Franks StHbtAssociationReader 00084 * ** None of these changes should affect any user ** 00085 * 00086 * Revision 1.11 1999/10/04 15:38:57 lisa 00087 * include Franks new accessor methods StHbtAnalysis::CorrFctn and StHbtManager::Analysis as well as McEnt example macro 00088 * 00089 * Revision 1.10 1999/09/17 22:38:02 lisa 00090 * first full integration of V0s into StHbt framework 00091 * 00092 * Revision 1.9 1999/09/08 04:15:52 lisa 00093 * persistent microDST implementation tweaked to please fickle solaris details 00094 * 00095 * Revision 1.8 1999/09/05 02:58:11 lisa 00096 * add ASCII microDST reader/writer AND franksParticle cuts 00097 * 00098 * Revision 1.7 1999/09/04 04:41:01 lisa 00099 * StHbtEvent IO --and-- StHbtEventWriter (microDST) method added to framework 00100 * 00101 * Revision 1.6 1999/09/03 22:39:15 lisa 00102 * Readers now MUST have Report() methods and MAY have WriteHbtEvent() methods 00103 * 00104 * Revision 1.5 1999/07/27 10:47:04 lisa 00105 * now works in dev on linux and solaris - mistake in deleting picoEvents fixed 00106 * 00107 * Revision 1.4 1999/07/26 16:21:26 lisa 00108 * always convert string to char when output - needed on solaris 00109 * 00110 * Revision 1.3 1999/07/22 18:49:10 lisa 00111 * Implement idea of Fabrice to not create and delete StHbtPair all the time 00112 * 00113 * Revision 1.2 1999/07/06 22:33:22 lisa 00114 * Adjusted all to work in pro and new - dev itself is broken 00115 * 00116 * Revision 1.1.1.1 1999/06/29 16:02:57 lisa 00117 * Installation of StHbtMaker 00118 * 00119 **************************************************************************/ 00120 00121 #include "StHbtMaker/Infrastructure/StHbtManager.h" 00122 //#include "StHbtMaker/Infrastructure/StHbtParticleCollection.hh" 00123 //#include "StHbtMaker/Base/StHbtTrackCut.h" 00124 //#include "StHbtMaker/Base/StHbtV0Cut.h" 00125 #include <cstdio> 00126 00127 #ifdef __ROOT__ 00128 ClassImp(StHbtManager) 00129 #endif 00130 00131 00132 00133 //____________________________ 00134 StHbtManager::StHbtManager(){ 00135 mAnalysisCollection = new StHbtAnalysisCollection; 00136 mEventWriterCollection = new StHbtEventWriterCollection; 00137 mEventReader = 0; 00138 } 00139 //____________________________ 00140 StHbtManager::~StHbtManager(){ 00141 delete mEventReader; 00142 // now delete each Analysis in the Collection, and then the Collection itself 00143 StHbtAnalysisIterator AnalysisIter; 00144 for (AnalysisIter=mAnalysisCollection->begin();AnalysisIter!=mAnalysisCollection->end();AnalysisIter++){ 00145 delete *AnalysisIter; 00146 *AnalysisIter = 0; 00147 } 00148 delete mAnalysisCollection; 00149 // now delete each EventWriter in the Collection, and then the Collection itself 00150 StHbtEventWriterIterator EventWriterIter; 00151 for (EventWriterIter=mEventWriterCollection->begin();EventWriterIter!=mEventWriterCollection->end();EventWriterIter++){ 00152 delete *EventWriterIter; 00153 *EventWriterIter = 0; 00154 } 00155 delete mEventWriterCollection; 00156 } 00157 //____________________________ 00158 int StHbtManager::Init(){ 00159 StHbtString readerMessage; 00160 readerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n"; 00161 // EventReader 00162 if (mEventReader) { 00163 if (mEventReader->Init("r",readerMessage)){ 00164 cout << " StHbtManager::Init() - Reader initialization failed " << endl; 00165 return (1); 00166 } 00167 readerMessage += mEventReader->Report(); 00168 } 00169 // EventWriters 00170 StHbtEventWriterIterator EventWriterIter; 00171 for (EventWriterIter=mEventWriterCollection->begin();EventWriterIter!=mEventWriterCollection->end();EventWriterIter++){ 00172 //cout << "*EventWriterIter " << *EventWriterIter << endl; 00173 // The message (StHbtString) passed into Init will be at the file header. 00174 // for that reason take the readerReport, add my own report and pass as message 00175 StHbtString writerMessage = readerMessage; 00176 writerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n"; 00177 writerMessage += (*EventWriterIter)->Report(); 00178 if (*EventWriterIter) { 00179 if ( (*EventWriterIter)->Init("w",writerMessage)){ // yes, the message from the reader is passed into the writer 00180 cout << " StHbtManager::Init() - Writer initialization failed " << endl; 00181 return (1); 00182 } 00183 } 00184 } 00185 00186 00187 return (0); 00188 } 00189 //____________________________ 00190 void StHbtManager::Finish(){ 00191 // EventReader 00192 if (mEventReader) mEventReader->Finish(); 00193 // EventWriters 00194 StHbtEventWriterIterator EventWriterIter; 00195 StHbtEventWriter* currentEventWriter; 00196 for (EventWriterIter=mEventWriterCollection->begin();EventWriterIter!=mEventWriterCollection->end();EventWriterIter++){ 00197 currentEventWriter = *EventWriterIter; 00198 currentEventWriter->Finish(); 00199 } 00200 // Analyses 00201 StHbtAnalysisIterator AnalysisIter; 00202 StHbtBaseAnalysis* currentAnalysis; 00203 for (AnalysisIter=mAnalysisCollection->begin();AnalysisIter!=mAnalysisCollection->end();AnalysisIter++){ 00204 currentAnalysis = *AnalysisIter; 00205 currentAnalysis->Finish(); 00206 } 00207 } 00208 //____________________________ 00209 StHbtString StHbtManager::Report(){ 00210 string stemp; 00211 char ctemp[100]; 00212 // EventReader 00213 stemp = mEventReader->Report(); 00214 // EventWriters 00215 sprintf(ctemp,"\nStHbtManager Reporting %u EventWriters\n",mEventWriterCollection->size()); 00216 stemp += ctemp; 00217 StHbtEventWriterIterator EventWriterIter; 00218 StHbtEventWriter* currentEventWriter; 00219 for (EventWriterIter=mEventWriterCollection->begin();EventWriterIter!=mEventWriterCollection->end();EventWriterIter++){ 00220 cout << "StHbtManager - asking for EventWriter Report" << endl; 00221 currentEventWriter = *EventWriterIter; 00222 stemp+=currentEventWriter->Report(); 00223 } 00224 // Analyses 00225 sprintf(ctemp,"\nStHbtManager Reporting %u Analyses\n",mAnalysisCollection->size()); 00226 stemp += ctemp; 00227 StHbtAnalysisIterator AnalysisIter; 00228 StHbtBaseAnalysis* currentAnalysis; 00229 for (AnalysisIter=mAnalysisCollection->begin();AnalysisIter!=mAnalysisCollection->end();AnalysisIter++){ 00230 cout << "StHbtManager - asking for Analysis Report" << endl; 00231 currentAnalysis = *AnalysisIter; 00232 stemp+=currentAnalysis->Report(); 00233 } 00234 00235 StHbtString returnThis = stemp; 00236 return returnThis; 00237 } 00238 //____________________________ 00239 StHbtBaseAnalysis* StHbtManager::Analysis( int n ){ // return pointer to n-th analysis 00240 if ( n<0 || n > (int) mAnalysisCollection->size() ) 00241 return NULL; 00242 StHbtAnalysisIterator iter = mAnalysisCollection->begin(); 00243 for (int i=0; i<n ;i++){ 00244 iter++; 00245 } 00246 return *iter; 00247 } 00248 //____________________________ 00249 StHbtEventWriter* StHbtManager::EventWriter( int n ){ // return pointer to n-th analysis 00250 if ( n<0 || n > (int) mEventWriterCollection->size() ) 00251 return NULL; 00252 StHbtEventWriterIterator iter = mEventWriterCollection->begin(); 00253 for (int i=0; i<n ;i++){ 00254 iter++; 00255 } 00256 return *iter; 00257 } 00258 //____________________________ 00259 int StHbtManager::ProcessEvent(){ 00260 cout << "StHbtManager::ProcessEvent" << endl; 00261 // NOTE - this ReturnHbtEvent makes a *new* StHbtEvent - delete it when done! 00262 StHbtEvent* currentHbtEvent = mEventReader->ReturnHbtEvent(); 00263 cout << "Event reader has returned control to manager" << endl; 00264 00265 // if no HbtEvent is returned, then we abort processing. 00266 // the question is now: do we try again next time (i.e. there may be an HbtEvent next time) 00267 // or are we at EOF or something? If Reader says Status=0, then that means try again later. 00268 // so, we just return the Reader's Status. 00269 if (!currentHbtEvent){ 00270 cout << "StHbtManager::ProcessEvent() - Reader::ReturnHbtEvent() has returned null pointer\n"; 00271 return mEventReader->Status(); 00272 } 00273 00274 // loop over all the EventWriters 00275 StHbtEventWriterIterator EventWriterIter; 00276 for (EventWriterIter=mEventWriterCollection->begin();EventWriterIter!=mEventWriterCollection->end();EventWriterIter++){ 00277 #ifdef STHBRDEBUG 00278 cout << " *EventWriterIter " << *EventWriterIter << endl; 00279 #endif 00280 (*EventWriterIter)->WriteHbtEvent(currentHbtEvent); 00281 } 00282 00283 // loop over all the Analysis 00284 StHbtAnalysisIterator AnalysisIter; 00285 for (AnalysisIter=mAnalysisCollection->begin();AnalysisIter!=mAnalysisCollection->end();AnalysisIter++){ 00286 (*AnalysisIter)->ProcessEvent(currentHbtEvent); 00287 } 00288 00289 if (currentHbtEvent) delete currentHbtEvent; 00290 #ifdef STHBRDEBUG 00291 cout << "StHbtManager::ProcessEvent() - return to caller ... " << endl; 00292 #endif 00293 return 0; // 0 = "good return" 00294 } // ProcessEvent
1.5.9