emcFEMtuple.C

Go to the documentation of this file.
00001 // $Id: emcFEMtuple.C,v 1.13 2003/02/27 18:54:27 aphecetc Exp $
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       // When reading calibration data from files, once read,
00165       // data are valid forever.
00166       valid = true;
00167     }
00168   else
00169     {
00170       valid = true;
00171       // if we are inside our global range, fine, we do
00172       // not need to test each FEM separately, otherwise,
00173       // well, we need to...
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 }