00001
00002
00003 #include <iostream>
00004 #include "emcFEMtuple.h"
00005 #include "emcCalFEMFactory.h"
00006 #include <cassert>
00007 #include "emcCalFEM.h"
00008
00009 using namespace std;
00010
00011
00012 emcFEMtuple::emcFEMtuple() : fOwner(true)
00013 {
00014 Reset();
00015 }
00016
00017
00018 emcFEMtuple::~emcFEMtuple()
00019 {
00020 Reset();
00021 }
00022
00023
00024 bool emcFEMtuple::Add(emcFEMtuple& fem)
00025 {
00026 bool rv = false;
00027 assert(fem.GetSize() == 1);
00028 assert(fem.IsOwner() == true);
00029 if ( fem.GetSize() == 1 && fem.IsOwner() == true)
00030 {
00031 rv = true;
00032 fFEMs.push_back(fem.GetFEM(0));
00033 fem.SetOwnership(false);
00034 if ( fem.Get1() > fLastStartTime )
00035 {
00036 fLastStartTime = fem.Get1();
00037 }
00038 if ( fem.Get2() < fFirstEndTime )
00039 {
00040 fFirstEndTime = fem.Get2();
00041 }
00042 }
00043 return rv;
00044 }
00045
00046
00047 emcCalFEM* emcFEMtuple::AppendFEM(int absPosition,
00048 const PHTimeStamp& t1,
00049 const PHTimeStamp& t2)
00050 {
00051 emcCalFEM* calfem = emcCalFEMFactory::Create(GetCategory(),
00052 absPosition,
00053 t1, t2);
00054 if (calfem)
00055 {
00056 fFEMs.push_back(calfem);
00057 if ( t1 > fLastStartTime )
00058 {
00059 fLastStartTime = t1;
00060 }
00061 if ( t2 < fFirstEndTime )
00062 {
00063 fFirstEndTime = t2;
00064 }
00065 return fFEMs.back();
00066 }
00067 else
00068 {
00069 return 0;
00070 }
00071 }
00072
00073
00074 emcCalFEM* emcFEMtuple::GetFEM(int ifem)
00075 {
00076 if (CheckIndex(ifem))
00077 {
00078 return fFEMs[ifem];
00079 }
00080 else
00081 {
00082 return 0;
00083 }
00084 }
00085
00086
00087 int emcFEMtuple::GetXmin(int ifem) const
00088 {
00089 int rv = -1;
00090 if ( CheckIndex(ifem) )
00091 {
00092 rv = fFEMs[ifem]->GetXmin();
00093 }
00094 else
00095 {
00096 cerr << "<E> emcFEMtuple::GetXmin(int ifem) : ifem out of bounds." << endl;
00097 }
00098 return rv;
00099 }
00100
00101
00102 int emcFEMtuple::GetXmax(int ifem) const
00103 {
00104 int rv = -1;
00105 if ( CheckIndex(ifem) )
00106 {
00107 rv = fFEMs[ifem]->GetXmax();
00108 }
00109 else
00110 {
00111 cerr << "<E> emcFEMtuple::GetXmax(int ifem) : ifem out of bounds." << endl;
00112 }
00113 return rv;
00114 }
00115
00116
00117
00118 int emcFEMtuple::GetNumberOfChannels(void) const
00119 {
00120 int n = 0;
00121 size_t i;
00122 for (i = 0;i < fFEMs.size();i++)
00123 {
00124 n += fFEMs[i]->GetNumberOfChannels();
00125 }
00126 return n;
00127 }
00128
00129
00130 bool
00131 emcFEMtuple::IsDraft(void) const
00132 {
00133 size_t i;
00134 bool draft = false;
00135 size_t n = 0;
00136
00137 for (i = 0;i < fFEMs.size();i++)
00138 {
00139 if ( fFEMs[i]->IsDraft() )
00140 {
00141 n++;
00142 }
00143 }
00144
00145 if (n)
00146 {
00147 assert(n == fFEMs.size());
00148 draft = true;
00149 }
00150 return draft;
00151 }
00152
00153
00154 bool emcFEMtuple::IsValid(const PHTimeStamp& cwhen) const
00155 {
00156 bool valid;
00157
00158 if (fFEMs.empty())
00159 {
00160 valid = false;
00161 }
00162 else if (GetSource() == emcManageable::kFile_ASCII)
00163 {
00164
00165
00166 valid = true;
00167 }
00168 else
00169 {
00170 valid = true;
00171
00172
00173
00174 PHTimeStamp& when = const_cast<PHTimeStamp&>(cwhen);
00175 if ( !when.isInRange(fLastStartTime, fFirstEndTime) )
00176 {
00177 valid = false;
00178 }
00179 }
00180
00181 return valid;
00182 }
00183
00184
00185 bool emcFEMtuple::IsValid(const PHTimeStamp& cwhen, int ifem) const
00186 {
00187 bool rv = false;
00188 if ( CheckIndex(ifem) )
00189 {
00190 rv = fFEMs[ifem]->IsValid(cwhen);
00191 }
00192 return rv;
00193 }
00194
00195
00196 void emcFEMtuple::Print(int level)
00197 {
00198 Print(cout, level);
00199 }
00200
00201
00202 ostream&
00203 emcFEMtuple::Print(ostream& out, int level)
00204 {
00205 size_t i;
00206 for (i = 0;i < fFEMs.size();i++)
00207 {
00208 fFEMs[i]->Print(out, level);
00209 }
00210 return out;
00211 }
00212
00213
00214 bool emcFEMtuple::ReplaceFEM(int ifem, emcFEMtuple& fem)
00215 {
00216 bool rv = false;
00217 assert(fOwner == true);
00218 assert (CheckIndex(ifem) != 0);
00219 assert(fem.GetNumberOfFEMs() == 1);
00220 assert(fem.IsOwner() == true);
00221 if ( fOwner && CheckIndex(ifem) &&
00222 fem.GetNumberOfFEMs() == 1 && fem.IsOwner() )
00223 {
00224 delete fFEMs[ifem];
00225 emcCalFEM* calfem = fem.GetFEM(0);
00226 fFEMs[ifem] = calfem;
00227 fem.SetOwnership(false);
00228 if ( calfem->GetStartValTime() > fLastStartTime )
00229 {
00230 fLastStartTime = calfem->GetStartValTime();
00231 }
00232 if ( calfem->GetEndValTime() < fFirstEndTime )
00233 {
00234 fFirstEndTime = calfem->GetEndValTime();
00235 }
00236 rv = true;
00237 }
00238 return rv;
00239 }
00240
00241
00242 void emcFEMtuple::Reset(void)
00243 {
00244 if (fOwner)
00245 {
00246 size_t i;
00247 for ( i = 0; i < fFEMs.size(); i++ )
00248 {
00249 delete fFEMs[i];
00250 }
00251 }
00252
00253 fFEMs.clear();
00254
00255 fOwner = true;
00256
00257 fLastStartTime.setTics(0);
00258 fFirstEndTime.setToFarFuture();
00259 }
00260
00261
00262 void
00263 emcFEMtuple::SetDraft(bool draft)
00264 {
00265 size_t i;
00266
00267 for (i = 0;i < fFEMs.size();i++)
00268 {
00269 fFEMs[i]->SetDraft(draft);
00270 }
00271 }
00272
00273
00274 bool emcFEMtuple::SetXmin(int xmin, int ifem)
00275 {
00276 bool rv = false;
00277 if ( CheckIndex(ifem) )
00278 {
00279 fFEMs[ifem]->SetXmin(xmin);
00280 rv = true;
00281 }
00282 else
00283 {
00284 cerr << "<E> emcFEMtuple::SetXmin(int, int ifem) : ifem out of bounds" << endl;
00285 }
00286 return rv;
00287 }
00288
00289
00290 bool emcFEMtuple::SetXmax(int xmax, int ifem)
00291 {
00292 bool rv = false;
00293 if ( CheckIndex(ifem) )
00294 {
00295 fFEMs[ifem]->SetXmax(xmax);
00296 rv = true;
00297 }
00298 else
00299 {
00300 cerr << "<E> emcFEMtuple::SetXmax(int, int ifem) : ifem out of bounds" << endl;
00301 }
00302 return rv;
00303 }