00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00012
00013 #include <string>
00014
00015 #include "TClass.h"
00016
00017 #include "Persistency/PerOutputStream.h"
00018 #include "Persistency/PerOutputStreamManager.h"
00019 #include "MessageService/MsgService.h"
00020 #include "MinosObjectMap/MomNavigator.h"
00021 #include "Record/RecMinos.h"
00022 #include "Record/RecRecord.h"
00023
00024 std::ostream& operator<<(std::ostream& ms,
00025 const PerOutputStreamManager& posm) {
00026 return posm.Print(ms);
00027 }
00028
00029 ClassImp(PerOutputStreamManager)
00030
00031
00032
00033
00034 CVSID("$Id: PerOutputStreamManager.cxx,v 1.27 2005/05/01 21:53:35 minoscvs Exp $");
00035
00036
00037
00038
00039 UInt_t PerOutputStreamManager::GetRecordTimeSec(TObject* object) {
00040
00041
00042
00043 UInt_t recordTime = 0;
00044
00045 if ( !object ) return recordTime;
00046
00047 if ( RecMinos* record = dynamic_cast<RecMinos*>(object) ) {
00048 recordTime = (record -> GetVldContext() -> GetTimeStamp()).GetSec();
00049 }
00050 else if ( RecRecord* record = dynamic_cast<RecRecord*>(object) ) {
00051 recordTime = (record->GetHeader()).GetVldContext().GetTimeStamp().GetSec();
00052 }
00053
00054 return recordTime;
00055
00056 }
00057
00058 PerOutputStream* PerOutputStreamManager::OpenStream(string streamname,
00059 string treename,
00060 string classname,
00061 string username,
00062 string inputstreamname,
00063 Int_t splitlevel,
00064 Int_t basketsize,
00065 Int_t compress) {
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 bool openok = false;
00098
00099 PerOutputStream* stream = (PerOutputStream*)fStreamMap[streamname];
00100 if (!stream) {
00101
00102 stream = new PerOutputStream(treename,classname,username,inputstreamname,
00103 splitlevel,basketsize,compress);
00104 stream -> SetStreamName(streamname);
00105 fStreamMap[streamname] = stream;
00106 openok = true;
00107 }
00108 else {
00109 MSG("Per",Msg::kWarning)<<"Stream manager failed to open requested stream "
00110 << streamname << " because name conflicts with previously opened stream."
00111 << endl;
00112 }
00113
00114 return (openok) ? stream : (PerOutputStream*)0;
00115
00116 }
00117
00118
00119 std::ostream& PerOutputStreamManager::Print(std::ostream& ms,
00120 const char* option) const {
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 TString opt = option;
00132 opt.ToLower();
00133 if ( opt == "brief" || opt.IsNull() && fPrintOpt == "brief") {
00134 ms << "PerOutputStreamManager managing enabled streams: " << endl;
00135 Int_t nenabled = 0;
00136 for(StreamMapConstItr citr = fStreamMap.begin();
00137 citr!= fStreamMap.end(); ++citr) {
00138 PerOutputStream* outstream =dynamic_cast<PerOutputStream*>(citr->second);
00139 if ( outstream -> IsEnabled() ) {
00140 ms << nenabled << ")" << citr->first
00141 << " persisting records of class "
00142 << outstream->GetClassName();
00143 string username = outstream->GetUserName();
00144 if ( !username.empty() ) ms << ", username " << username;
00145 string inputstreamname = outstream->GetInputStreamName();
00146 if ( !inputstreamname.empty() )
00147 ms << ", originating from input stream " << inputstreamname;
00148 ms << " with splitlevel " << outstream->GetSplitLevel()
00149 << " and AutoSave(Int,Time,Bytes) (" << outstream->GetAutoSaveInt()
00150 << "," << outstream->GetAutoSaveTime() << ","
00151 << outstream->GetAutoSaveBytes() << ")" << endl;
00152 nenabled++;
00153 }
00154 }
00155 }
00156 else {
00157 ms << "PerOutput";
00158 PerStreamManager::Print(ms);
00159 }
00160
00161 return ms;
00162
00163 }
00164
00165
00166 Int_t PerOutputStreamManager::Put(const MomNavigator* mom) {
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 PerOutputStream* outstream;
00178
00179 Int_t nobject = 0;
00180
00181
00182 UInt_t maxcurrentTime = 0;
00183 for ( StreamMapConstItr citr = fStreamMap.begin();
00184 citr != fStreamMap.end(); ++citr ) {
00185 outstream = (PerOutputStream*)citr -> second;
00186 if (outstream -> IsOpen() && outstream -> IsEnabled()) {
00187
00188 string streamusername = outstream -> GetUserName();
00189 string streaminputstream = outstream -> GetInputStreamName();
00190
00191
00192 TIter fiter = const_cast<MomNavigator*>(mom) -> FragmentIter();
00193 TObject* object = 0;
00194 while ( (object = fiter.Next()) ) {
00195
00196
00197 if ( outstream -> SetObject(object) ) {
00198 outstream -> Store();
00199 outstream -> Reset();
00200 MsgStream& msgPer = MSGSTREAM("Per",Msg::kVerbose);
00201 msgPer << "Persisted object: class " << object->IsA()->GetName();
00202 if ( !streamusername.empty() )
00203 msgPer << ", username " << object->GetName();
00204 if ( !streaminputstream.empty() )
00205 msgPer << ", origin " << streaminputstream;
00206 msgPer << " on output stream " << citr->first << "." << endl;
00207 UInt_t currentTime = GetRecordTimeSec(object);
00208 if ( currentTime > maxcurrentTime ) maxcurrentTime = currentTime;
00209 nobject++;
00210 }
00211 }
00212 }
00213 }
00214
00215 if ( maxcurrentTime > 0 ) {
00216 for ( StreamMapConstItr citr = fStreamMap.begin();
00217 citr != fStreamMap.end(); ++citr ) {
00218 outstream = (PerOutputStream*)citr -> second;
00219 outstream -> AutoSaveByTime(maxcurrentTime);
00220 }
00221 }
00222
00223 MSG("Per",Msg::kVerbose) << "Put persisted "
00224 << nobject << " total object(s). " << endl;
00225 return nobject;
00226
00227 }
00228
00229 Int_t PerOutputStreamManager::SetAutoSave(std::string streamname,
00230 UInt_t autosaveint, UInt_t autosavetime, UInt_t autosavebytes,
00231 bool basketsavelinked) {
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 Int_t nstream = 0;
00257
00258 if (streamname == "*") {
00259 for (StreamMapConstItr citr = fStreamMap.begin();
00260 citr != fStreamMap.end(); ++citr) {
00261 ((PerOutputStream*)(citr -> second))
00262 -> SetAutoSave(autosaveint,autosavetime,autosavebytes,basketsavelinked);
00263 nstream++;
00264 }
00265 }
00266 else {
00267 PerOutputStream* stream = (PerOutputStream*)GetOpenedStream(streamname);
00268 if (stream) {
00269 stream->SetAutoSave(autosaveint,autosavetime,autosavebytes,
00270 basketsavelinked);
00271 nstream++;
00272 }
00273 }
00274
00275 return nstream;
00276
00277 }
00278
00279 Int_t PerOutputStreamManager::Write(string streamname, bool force) {
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 Int_t ntree = 0;
00297
00298 if (streamname == "*") {
00299
00300 for (StreamMapConstItr citr = fStreamMap.begin();
00301 citr != fStreamMap.end(); ++citr) {
00302 if ( force || citr -> second -> GetNumEntries() != 0 ) {
00303 Int_t nbytes = ((PerOutputStream*)(citr -> second)) -> Write();
00304 if ( nbytes > 0 ) ntree++;
00305 }
00306 }
00307 }
00308 else {
00309
00310 PerOutputStream* stream = (PerOutputStream*)GetOpenedStream(streamname);
00311 if (stream) {
00312 if ( force || stream -> GetNumEntries() != 0 ) {
00313 Int_t nbytes = stream -> Write();
00314 if ( nbytes > 0 ) ntree++;
00315 }
00316 }
00317 }
00318
00319 return ntree;
00320
00321 }
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406