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
00013
00014
00015
00016
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);
00042 Msg::LogLevel_t lvl = s->GetLogLevel();
00043 if ( lvl < 0 ) return Msg::LevelAsString(Msg::kInfo);
00044 return Msg::LevelAsString(lvl);
00045 }
00046
00047
00048
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
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();
00101
00102
00103 UgliGeomHandle ugh(vldc);
00104 PlexPlaneId plnid_steel(vldc.GetDetector(),planenum,true);
00105
00106
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();
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();
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
00151
00152 fidvol_toggle_msglvl();
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
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