00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018 #include <cassert>
00019
00020 #include "TClass.h"
00021 #include "TString.h"
00022
00023 #include "MinosObjectMap/MomNavigator.h"
00024 #include "MessageService/MsgService.h"
00025 #include "Record/RecMinos.h"
00026 #include "Record/RecMinosHdr.h"
00027 #include "Record/RecRecord.h"
00028
00029 CVSID("$Id: MomNavigator.cxx,v 1.17 2005/03/06 20:03:52 schubert Exp $");
00030
00031 std::ostream& operator << (std::ostream& os, const MomNavigator& mom)
00032 { return mom.Print(os); }
00033
00034 ClassImp(MomNavigator)
00035
00036
00037 MomNavigator::MomNavigator()
00038 : fFragmentArray(0)
00039 {
00040
00041 MSG("Mom",Msg::kDebug) << "MomNavigator ctor " << this << endl;
00042
00043 fFragmentArray = new TObjArray;
00044 }
00045
00046
00047 MomNavigator::~MomNavigator()
00048 {
00049
00050 MSG("Mom",Msg::kDebug) << "MomNavigator dtor " << this << "\n"
00051 << *this << endl;
00052 if (fFragmentArray) fFragmentArray->Delete();
00053 delete fFragmentArray;
00054 }
00055
00056
00057 void MomNavigator::AdoptFragment(TObject *Fragment)
00058 {
00059
00060
00061 fFragmentArray->Add(Fragment);
00062 }
00063
00064
00065 TObject* MomNavigator::At(Int_t idx) const
00066 {
00067
00068
00069 return fFragmentArray->At(idx);
00070 }
00071
00072
00073 TIter MomNavigator::FragmentIter() const
00074 {
00075
00076
00077 return TIter(fFragmentArray);
00078 }
00079
00080
00081 Int_t MomNavigator::IndexOf(TObject *Fragment)
00082 {
00083
00084
00085 return fFragmentArray->IndexOf(Fragment);
00086 }
00087
00088
00089 TObject* MomNavigator::GetFragment(const char *classname,
00090 const char *username,
00091 const char *streamname) const {
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 TString classtr("");
00107 if (classname)
00108 classtr.Append(TString(classname).Strip(TString::kBoth));
00109 TString userstr("");
00110 if (username)
00111 userstr.Append(TString(username).Strip(TString::kBoth));
00112 TString streamstr("");
00113 if (streamname)
00114 streamstr.Append(TString(streamname).Strip(TString::kBoth));
00115
00116 TIter fiter(fFragmentArray);
00117 TObject* fragment = 0;
00118 while ((fragment = fiter())) {
00119
00120
00121 if (classtr.IsNull() || fragment->IsA()->InheritsFrom(classtr)) {
00122
00123
00124 if (userstr.IsNull() || (userstr == fragment->GetName())) {
00125
00126
00127 if (streamstr.IsNull()) return fragment;
00128
00129
00130 Registry* iotags = 0;
00131 if ( RecMinos* record = dynamic_cast<RecMinos*>(fragment) ) {
00132 iotags = &(record->GetTempTags());
00133 }
00134 else if ( RecRecord* record = dynamic_cast<RecRecord*>(fragment) ) {
00135 iotags = &(record->GetTempTags());
00136 }
00137 if ( iotags ) {
00138 const char* tagstream = 0;
00139 if (iotags -> Get("stream",tagstream)
00140 && strcmp(streamname,tagstream) == 0 ) return fragment;
00141 }
00142 }
00143 }
00144 }
00145 return 0;
00146 }
00147
00148
00149 std::vector<TObject*> MomNavigator::GetFragmentList(const char* classname,
00150 const char *username,
00151 const char *streamname) const {
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 std::vector<TObject*> fragmentList;
00168
00169 TString classtr("");
00170 if (classname)
00171 classtr.Append(TString(classname).Strip(TString::kBoth));
00172 TString userstr("");
00173 if (username)
00174 userstr.Append(TString(username).Strip(TString::kBoth));
00175 TString streamstr("");
00176 if (streamname)
00177 streamstr.Append(TString(streamname).Strip(TString::kBoth));
00178
00179 TIter fiter(fFragmentArray);
00180 TObject* fragment = 0;
00181 while ((fragment = fiter())) {
00182
00183
00184 if (classtr.IsNull() || fragment->IsA()->InheritsFrom(classtr)) {
00185
00186 if (userstr.IsNull() || (userstr == fragment->GetName())) {
00187
00188 if ( streamstr.IsNull() ) {
00189
00190 fragmentList.push_back(fragment);
00191 }
00192 else {
00193
00194 Registry* iotags = 0;
00195 if ( RecMinos* record = dynamic_cast<RecMinos*>(fragment) ) {
00196 iotags = &(record->GetTempTags());
00197 }
00198 else if ( RecRecord* record = dynamic_cast<RecRecord*>(fragment) ) {
00199 iotags = &(record->GetTempTags());
00200 }
00201 if ( iotags ) {
00202 const char* tagstream = 0;
00203 if (iotags -> Get("stream",tagstream)
00204 && strcmp(streamname,tagstream) == 0 ) {
00205 fragmentList.push_back(fragment);
00206 }
00207 }
00208 }
00209 }
00210 }
00211 }
00212 return fragmentList;
00213 }
00214
00215
00216
00217 TObject* MomNavigator::GetFragmentByInputTag(const char *streamname,
00218 const char *treename, int treeindex, const char* filename) const {
00219
00220
00221
00222 TIter fiter(fFragmentArray);
00223 TObject* fragment;
00224 while ((fragment = fiter())) {
00225 Registry* iotags = 0;
00226 if ( RecMinos* record = dynamic_cast<RecMinos*>(fragment) ) {
00227 iotags = &(record->GetTempTags());
00228 }
00229 else if ( RecRecord* record = dynamic_cast<RecRecord*>(fragment) ) {
00230 iotags = &(record->GetTempTags());
00231 }
00232 if ( iotags ) {
00233 const char* tagstream = 0;
00234 if(iotags->Get("stream",tagstream) && strcmp(streamname,tagstream)==0) {
00235 const char* tagtree = 0;
00236 if (iotags -> Get("tree",tagtree) && strcmp(treename,tagtree)==0 ) {
00237 int tagindex = -1;
00238 if (iotags -> Get("index",tagindex) && tagindex == treeindex ) {
00239 const char* tagfile = 0;
00240 if (iotags -> Get("file",tagfile) && strcmp(filename,tagfile)==0){
00241 return fragment;
00242 }
00243 }
00244 }
00245 }
00246 }
00247 }
00248
00249 return 0;
00250 }
00251
00252
00253
00254 void MomNavigator::Clear(Option_t * )
00255 {
00256
00257
00258
00259
00260
00261
00262
00263 if ( !fFragmentArray ) return;
00264 MSG("Mom",Msg::kVerbose) << "MomNavigator::Clear. Mom contents at entry:\n"
00265 << *this << endl;
00266
00267
00268 for ( int idx = fFragmentArray->GetEntriesFast()-1; idx >= 0; idx-- ) {
00269 TObject* fragment = fFragmentArray->At(idx);
00270 if ( !fragment ) continue;
00271 bool isTransient = true;
00272 bool isPerOwned = false;
00273 if ( RecMinos* recminos = dynamic_cast<RecMinos*>(fragment) ) {
00274 isTransient = recminos->IsTransient();
00275 }
00276 else if ( RecRecord* recrecord = dynamic_cast<RecRecord*>(fragment) ) {
00277 isTransient = recrecord->IsTransient();
00278 isPerOwned = recrecord->IsPerOwned();
00279 }
00280 if ( isTransient ) {
00281 fFragmentArray->RemoveAt(idx);
00282
00283 if ( fragment && !isPerOwned ) delete fragment;
00284 fragment = 0;
00285 }
00286 }
00287 fFragmentArray->Compress();
00288
00289 MSG("Mom",Msg::kVerbose) << "MomNavigator::Clear. Mom contents at exit:\n"
00290 << *this << endl;
00291
00292 }
00293
00294 std::ostream& MomNavigator::Print(std::ostream& os) const {
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 assert(fFragmentArray);
00306
00307 Int_t nent = fFragmentArray->GetEntriesFast();
00308 if ( nent <= 0 ) {
00309 os << "Mom has no entries." << endl;
00310 return os;
00311 }
00312
00313 os << "Mom contents listed by array index:" << endl;
00314 for (int idx = 0; idx < nent; idx++) {
00315 TObject* fragment = fFragmentArray->At(idx);
00316 if ( !fragment ) {
00317 os << idx << ")No object.";
00318 }
00319 else {
00320 os << idx << ")" << fragment->ClassName();
00321 Registry* iotags = 0;
00322 bool isTransient = true;
00323 bool isPerOwned = false;
00324 if ( RecMinos* record = dynamic_cast<RecMinos*>(fragment) ) {
00325 iotags = &(record->GetTempTags());
00326 isTransient = record -> IsTransient();
00327 const VldContext& vldc = record -> GetHeader() -> GetVldContext();
00328 os << " " << vldc;
00329 }
00330 else if ( RecRecord* record = dynamic_cast<RecRecord*>(fragment) ) {
00331 iotags = &(record->GetTempTags());
00332 isTransient = record -> IsTransient();
00333 isPerOwned = record -> IsPerOwned();
00334 const VldContext& vldc = (record -> GetHeader()).GetVldContext();
00335 os << " " << vldc;
00336 }
00337
00338 if ( strcmp(fragment->GetName(),"") ) {
00339 os << ", TNamed " << fragment->GetName();
00340 }
00341 if ( iotags ) {
00342 const char* tagstream = 0;
00343 if(iotags->Get("stream",tagstream)) {
00344 os << ", InputStream " << tagstream;
00345 }
00346 }
00347 os << (( isTransient ) ? ", isTransient " : ", isNotTransient ");
00348 os << (( isPerOwned ) ? ", isPerOwned " : ", isNotPerOwned ");
00349 }
00350 os << endl;
00351 }
00352
00353 return os;
00354
00355 }
00356
00357 void MomNavigator::Print(Option_t* ) const {
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 Print(std::cout);
00369 return;
00370
00371 }
00372
00373