00001 #include "PhotonFullGreenTracker.h"
00002 #include "PhotonTransportMaker.h"
00003 #include "MessageService/MsgService.h"
00004 #include "Plex/PlexHandle.h"
00005 #include <cmath>
00006
00007 CVSID( "$Id: PhotonFullGreenTracker.cxx,v 1.13 2006/12/01 19:59:25 rhatcher Exp $" );
00008
00009 ClassImp(PhotonFullGreenTracker)
00010 PhotonTransportMakerProxy<PhotonFullGreenTracker>
00011 gPhotonFullGreenTrackerProxy("photonFullGreenTracker");
00012
00013
00015
00016 PhotonFullGreenTracker::PhotonFullGreenTracker() :
00017 fFibreAbsorbTable("PHOTONFIBREABSORB"),
00018 fPmtEffTable("PHOTONPMTQUANTUMEFFICIENCY")
00019 {
00020 Configure(PhotonConfiguration());
00021
00022 if (fFibreAbsorbTable.GetNumRows()<1) {
00023 MSG("Photon",Msg::kError) << "Can't find data for table PHOTONFIBREABSORB. Aborting!\n";
00024 assert(0);
00025 }
00026 if (fPmtEffTable.GetNumRows()<1) {
00027 MSG("Photon",Msg::kError) << "Can't find data for table PHOTONPMTQUANTUMEFFICIENCY. Aborting!\n";
00028 assert(0);
00029 }
00030
00031 SetGreenPrescaleFactor(
00032 fPmtEffTable.GetMaximum()/100.
00033 );
00034
00035 }
00036
00038
00039 void
00040 PhotonFullGreenTracker::Configure( const Registry& r )
00041 {
00042 MSG("Photon",Msg::kDebug) << "Configuring FullGreenTracker." << std::endl;
00043
00044 double tmpd;
00045 if (r.Get("ReflectorFibreReflec",tmpd)) fReflectorFibreReflec = tmpd;
00046 if (r.Get("FibreIndex",tmpd)) fFibreIndex = tmpd;
00047 if (r.Get("ClearFibreIndex",tmpd)) fClearFibreIndex = tmpd;
00048 }
00049
00050
00051 void
00052 PhotonFullGreenTracker::Reset( const VldContext& cx )
00053 {
00054 fFibreAbsorbTable.Reset(cx);
00055 fPmtEffTable.Reset(cx);
00056
00057 SetGreenPrescaleFactor(
00058 fPmtEffTable.GetMaximum()/100.
00059 );
00060
00061 }
00062
00063
00064
00066
00067
00068
00069
00070 Bool_t
00071 PhotonFullGreenTracker::GreenPhotonToPe( const UgliStripHandle& inStrip,
00072 DigiPhoton* inGreenPhoton,
00073 DigiPE* &outPe,
00074 StripEnd::StripEnd_t &outEnd)
00075 {
00076 outPe = NULL;
00077 if(!inGreenPhoton) return false;
00078
00079
00080 StripEnd::StripEnd_t dir =
00081 (inGreenPhoton->GetCosX()>0) ? StripEnd::kPositive : StripEnd::kNegative;
00082
00083 StripEnd::StripEnd_t readout = dir;
00084
00085
00086 if(inStrip.IsMirrored(dir)) {
00087
00088
00089 if(fRandom->Rndm() > fReflectorFibreReflec) {
00090 return false;
00091 }
00092
00093
00094 readout = (dir==StripEnd::kPositive) ? StripEnd::kNegative : StripEnd::kPositive;
00095 }
00096
00097
00098
00099
00100 double distToCenter = (inGreenPhoton->GetCosX()>0) ? (-inGreenPhoton->X())
00101 : (inGreenPhoton->X());
00102
00103 Double_t greenDist =
00104 distToCenter
00105 +inStrip.GetHalfLength()
00106 +inStrip.WlsPigtail(readout);
00107
00108 MSG("Photon",Msg::kVerbose) << "Distance to center of strip: " << distToCenter
00109 << " end= " << readout
00110 << " halflen=" << inStrip.GetHalfLength()
00111 << " x="<<inGreenPhoton->X()
00112 << " dx=" << inGreenPhoton->GetCosX() << endl;
00113
00114
00115
00116 double bypassExtra = 0;
00117 if(inStrip.WlsBypass() >0) {
00118 bypassExtra = ( inStrip.PartialLength(StripEnd::kNegative) +
00119 inStrip.PartialLength(StripEnd::kPositive) +
00120 inStrip.WlsBypass() -
00121 inStrip.GetHalfLength()*2.0 );
00122
00123
00124 float x_break =0.5* (inStrip.PartialLength(StripEnd::kNegative)
00125 - inStrip.PartialLength(StripEnd::kPositive) );
00126
00127 if(inGreenPhoton->X() < x_break) {
00128
00129 if(dir==StripEnd::kPositive) greenDist+= bypassExtra;
00130 } else {
00131
00132 if(dir==StripEnd::kNegative) greenDist+= bypassExtra;
00133 }
00134 }
00135
00136 if(readout!=dir) {
00137
00138 greenDist+= inStrip.GetHalfLength()*2.0;
00139 greenDist+= bypassExtra;
00140 greenDist+= inStrip.WlsPigtail(dir)*2.0;
00141
00142 }
00143
00144
00145 Double_t clearDist = inStrip.ClearFiber(readout);
00146
00147
00148
00149 greenDist /= fabs(inGreenPhoton->GetCosX());
00150 clearDist /= fabs(inGreenPhoton->GetCosX());
00151
00152 MSG("Photon",Msg::kVerbose) << "After pathlength correction: greenDist = " << greenDist
00153 << " clearDist = " << clearDist << endl;
00154
00155
00156 double wavelength_nm = inGreenPhoton->WaveLength()/Munits::nm;
00157 if(wavelength_nm==0) wavelength_nm = 520;
00158
00159 double greenLambda = fFibreAbsorbTable.Interpolate(wavelength_nm);
00160
00161
00162
00163
00164 double greenAtten = exp(-greenDist/greenLambda);
00165
00166 MSG("Photon",Msg::kVerbose) << "Green atten prob = " << greenAtten << endl;
00167 if(fRandom->Rndm() > greenAtten) return false;
00168
00169
00170
00171 const double lambda_c = 11.4;
00172
00173
00174 double clearAtten = exp(-clearDist/lambda_c);
00175
00176 MSG("Photon",Msg::kVerbose) << "Clear atten prob = " << clearAtten << endl;
00177 if(fRandom->Rndm() > clearAtten) return false;
00178
00179 double eff = fPmtEffTable.Interpolate(wavelength_nm)/100.;
00180
00181
00182 double prob = eff / GetGreenPrescaleFactor();
00183
00184 MSG("Photon",Msg::kVerbose) << "Photocathode convert prob ("
00185 << wavelength_nm << " nm) = " << prob << endl;
00186 if(fRandom->Uniform() > prob) return false;
00187
00188
00189
00190 double time = inGreenPhoton->T()
00191 + greenDist * fFibreIndex / Munits::c_light
00192 + clearDist * fClearFibreIndex / Munits::c_light;
00193
00194 PlexStripEndId seid = inStrip.GetSEId();
00195 seid.SetEnd(readout);
00196
00197 PlexHandle plex(fContext);
00198 PlexPixelSpotId psid = plex.GetPixelSpotId(seid);
00199
00200 outPe = new DigiPE( time, psid, inGreenPhoton->ParentHit() );
00201 outEnd = readout;
00202
00203 return true;
00204 }
00205
00206