Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

infid_finder.cxx

Go to the documentation of this file.
00001 #include "DataUtil/infid_finder.h"
00002 
00003 #include <iostream>
00004 #include <iomanip>
00005 
00006 #include "TMath.h"
00007 
00008 #include "Plex/PlexPlaneId.h"
00009 #include "UgliGeometry/UgliGeomHandle.h"
00010 #include "UgliGeometry/UgliPlnHandle.h"
00011 
00012 // Older versions of Util don't have GetMsgLevel, but because of
00013 // ties of UtilIstHEP to newer versions of ROOT we can't use an new
00014 // version of the Util package (which has the functions) here and 
00015 // still use this under R1.24.3/v5-12-00f.  Thus the duplicate 
00016 // implementations of these MsgLevel() and GetMsgLevel()
00017 
00018 #include <MessageService/Msg.h>
00019 #include <MessageService/MsgService.h>
00020 
00021 namespace FidVol {
00023 bool MsgLevel(const char* stream, const char* level);
00025 const char* GetMsgLevel(const char* stream);
00026 }
00027 
00028 bool FidVol::MsgLevel(const char* stream, const char* level)
00029 {
00030     MsgStream *s = MsgService::Instance()->GetStream(stream);
00031     if (!s) return false;
00032     Msg::LogLevel_t lvl = Msg::GetLevelCode(level);
00033     if ( lvl < 0 ) return false;
00034     s->SetLogLevel(lvl);
00035     return true;
00036 }
00037 
00038 const char* FidVol::GetMsgLevel(const char* stream)
00039 {
00040     MsgStream *s = MsgService::Instance()->GetStream(stream);
00041     if (!s) return Msg::LevelAsString(Msg::kInfo); // default
00042     Msg::LogLevel_t lvl = s->GetLogLevel();
00043     if ( lvl < 0 ) return Msg::LevelAsString(Msg::kInfo); // default
00044     return Msg::LevelAsString(lvl);
00045 }
00046 
00047 
00048 // utility functions
00049 UgliPlnHandle fidvol_find_ugliplnhandle(PlexPlaneId plnid, 
00050                                         std::vector<UgliPlnHandle>& plnv)
00051 {
00052   for (unsigned int i = 0; i < plnv.size(); ++i) {
00053     const UgliPlnHandle& uph = plnv[i];
00054     if (uph.GetPlexPlaneId() == plnid) return uph;
00055   }
00056   // fell through
00057   return UgliPlnHandle();
00058 }
00059                                         
00060 void fidvol_toggle_msglvl()
00061 {
00062   static const char* msglvl_dbi  = "Fatal";
00063   static const char* msglvl_ugli = "Fatal";
00064   static const char* msglvl_geo  = "Fatal";
00065 
00066   const char* curr_dbi  = FidVol::GetMsgLevel("Dbi");
00067   const char* curr_ugli = FidVol::GetMsgLevel("Ugli");
00068   const char* curr_geo  = FidVol::GetMsgLevel("Geo");
00069   FidVol::MsgLevel("Dbi",msglvl_dbi);
00070   FidVol::MsgLevel("Ugli",msglvl_ugli);
00071   FidVol::MsgLevel("Geo",msglvl_geo);
00072   msglvl_dbi  = curr_dbi;
00073   msglvl_ugli = curr_ugli;
00074   msglvl_geo  = curr_geo;
00075 }
00076 
00077 const char* FidVol::AirRegionAsString(FidVol::EAirRegion region)
00078 {
00079   switch (region) {
00080   case kBetweenScintAndSteel:  return "BetweenScintAndSteel";
00081   case kDownstreamOfSteel:     return "DownstreamOfSteel";
00082   default:                     return "UnknownAirRegion";
00083   }
00084 }
00085 
00086 const char* FidVol::PositionAsString(FidVol::EPosition pos)
00087 {
00088   switch (pos) {
00089   case kUpstream:   return "upstream";
00090   case kMiddle:     return "middle";
00091   case kDownstream: return "downstream";
00092   default:          return "UnknownPosition";
00093   }
00094 }
00095 
00096 double FidVol::infid_z_finder(VldContext vldc, int planenum, 
00097                             EAirRegion region, EPosition pos, double eps)
00098 {
00099 
00100   fidvol_toggle_msglvl(); // quiet things down
00101   //std::cout << "FidVol::infid_z_finder for " << vldc.AsString() << std::endl;
00102 
00103   UgliGeomHandle ugh(vldc);
00104   PlexPlaneId plnid_steel(vldc.GetDetector(),planenum,true);
00105   // kBetweenScintAndSteel means scint/steel are same pair and scint is upstream
00106   // kDownstreamOfSteel means scint
00107   int dir = -1;
00108   if ( kDownstreamOfSteel == region ) dir = +1;
00109   PlexPlaneId plnid_adjoin = plnid_steel.GetAdjoin(dir);
00110   if ( ! plnid_steel.IsValid() || ! plnid_adjoin.IsValid() ) {
00111     std::cout << "HEY! invalid plane " << planenum
00112               << " steel " << plnid_steel << " adjoin " << plnid_adjoin
00113               << std::endl;
00114     fidvol_toggle_msglvl(); // restore message levels
00115     return -9999;
00116   }
00117   
00118   std::vector<UgliPlnHandle> uphv = ugh.GetPlnHandleVector();
00119   UgliPlnHandle uph_steel  = fidvol_find_ugliplnhandle(plnid_steel,uphv);
00120   UgliPlnHandle uph_adjoin = fidvol_find_ugliplnhandle(plnid_adjoin,uphv);
00121   if ( ! uph_steel.IsValid()  || ! uph_adjoin.IsValid() ) {
00122     std::cout << "HEY! invalid UgliPlnHandle: steel "
00123               << (uph_steel.IsValid()?"okay":"invalid")
00124               << " adjoin "
00125               << (uph_adjoin.IsValid()?"okay":"invalid")
00126               << std::endl;
00127     fidvol_toggle_msglvl(); // restore message levels
00128     return -9999;
00129   }
00130 
00131   double zup, zdn;
00132   if ( kDownstreamOfSteel == region ) {
00133     zup = uph_steel.GetZ0()  + uph_steel.GetHalfThickness();
00134     zdn = uph_adjoin.GetZ0() - uph_adjoin.GetHalfThickness();
00135   } else {
00136     zup = uph_adjoin.GetZ0() + uph_adjoin.GetHalfThickness();
00137     zdn = uph_steel.GetZ0()  - uph_steel.GetHalfThickness();
00138   }
00139 
00140   double z;
00141   switch ( pos ) {
00142   case kUpstream:    z = zup + eps;     break;
00143   case kMiddle:      z = 0.5*(zup+zdn); break;
00144   case kDownstream:  z = zup - eps;     break;
00145   default:
00146     std::cout << "HEY: pos arg isn't legal " << (int)pos << std::endl;
00147     z = -9999;
00148   }
00149 
00150   //std::cout << " planeum " << planenum << " blah, blah  chooose z = " << z << std::endl;
00151 
00152   fidvol_toggle_msglvl(); // restore message levels
00153   return z;
00154 
00155 }
00156 
00157 void FidVol::find_z_cuts(int pup_near, int pdn_near,
00158                          int pup1_far, int pdn1_far,
00159                          int pup2_far, int pdn2_far,
00160                          EAirRegion region, EPosition pos, double eps)
00161 {
00162   VldTimeStamp now;
00163   VldContext vldc_near_data(Detector::kNear,SimFlag::kData,now);
00164   VldContext vldc_near_mc(Detector::kNear,SimFlag::kMC,now);
00165   VldContext vldc_far_data(Detector::kFar,SimFlag::kData,now);
00166   VldContext vldc_far_mc(Detector::kFar,SimFlag::kMC,now);
00167   std::cout << "FidVol::find_z_cuts() called" << std::endl;
00168   double nearZData[2], nearZMC[2];
00169   double farZData[4],  farZMC[4];
00170 
00171   nearZData[0] = FidVol::infid_z_finder(vldc_near_data,pup_near,region,pos,eps);
00172   nearZData[1] = FidVol::infid_z_finder(vldc_near_data,pdn_near,region,pos,eps);
00173 
00174   nearZMC[0]   = FidVol::infid_z_finder(vldc_near_mc,pup_near,region,pos,eps);
00175   nearZMC[1]   = FidVol::infid_z_finder(vldc_near_mc,pdn_near,region,pos,eps);
00176 
00177   farZData[0]  = FidVol::infid_z_finder(vldc_far_data,pup1_far,region,pos,eps);
00178   farZData[1]  = FidVol::infid_z_finder(vldc_far_data,pdn1_far,region,pos,eps);
00179   farZData[2]  = FidVol::infid_z_finder(vldc_far_data,pup2_far,region,pos,eps);
00180   farZData[3]  = FidVol::infid_z_finder(vldc_far_data,pdn2_far,region,pos,eps);
00181 
00182   farZMC[0]    = FidVol::infid_z_finder(vldc_far_mc,pup1_far,region,pos,eps);
00183   farZMC[1]    = FidVol::infid_z_finder(vldc_far_mc,pdn1_far,region,pos,eps);
00184   farZMC[2]    = FidVol::infid_z_finder(vldc_far_mc,pup2_far,region,pos,eps);
00185   farZMC[3]    = FidVol::infid_z_finder(vldc_far_mc,pdn2_far,region,pos,eps);
00186 
00187   // now format it for cut-and-paste purposes
00188   std::cout << "   // Chosen z is " << FidVol::PositionAsString(pos)
00189             << " of air gap " << FidVol::AirRegionAsString(region);
00190   if ( pos != kMiddle && eps != 0)
00191     std::cout << " eps = " << eps;
00192   std::cout << std::endl;
00193   
00194   std::cout << "   // Near:  relative to steel planes "
00195             << " [" << pup_near << "," << pdn_near << "]" 
00196             << std::endl;
00197   std::cout << "   setNearZData(0," << Form("%8.5f",nearZData[0]) << ");"
00198             << "   setNearZData(1," << Form("%8.5f",nearZData[1]) << ");"
00199             << std::endl;
00200   std::cout << "   setNearZMC(  0," << Form("%8.5f",nearZMC[0]) << ");"
00201             << "   setNearZMC(  1," << Form("%8.5f",nearZMC[1]) << ");"
00202             << std::endl;
00203 
00204 
00205   std::cout << "   // Far:  relative to steel planes "
00206             << " [" << pup1_far << "," << pdn1_far << "]" 
00207             << " [" << pup2_far << "," << pdn2_far << "]" 
00208             << std::endl;
00209   std::cout << "   setFarZData(0," << Form("%8.5f",farZData[0]) << "); "
00210             << "   setFarZData(1," << Form("%8.5f",farZData[1]) << ");"
00211             << std::endl
00212             << "   setFarZData(2," << Form("%8.5f",farZData[2]) << "); "
00213             << "   setFarZData(3," << Form("%8.5f",farZData[3]) << ");"
00214             << std::endl;
00215   std::cout << "   setFarZMC(  0," << Form("%8.5f",farZMC[0]) << "); "
00216             << "   setFarZMC(  1," << Form("%8.5f",farZMC[1]) << ");"
00217             << std::endl
00218             << "   setFarZMC(  2," << Form("%8.5f",farZMC[2]) << "); "
00219             << "   setFarZMC(  3," << Form("%8.5f",farZMC[3]) << ");"
00220             << std::endl;
00221 }
00222 

Generated on Mon Feb 15 11:06:48 2010 for loon by  doxygen 1.3.9.1