CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

LASProfileJudge Class Reference

#include <LASProfileJudge.h>

List of all members.

Public Member Functions

void EnableZeroFilter (bool)
bool IsSignalIn (const LASModuleProfile &, double)
bool JudgeProfile (const LASModuleProfile &, double)
 LASProfileJudge ()
void SetOverdriveThreshold (unsigned int)

Private Member Functions

double GetNegativity (int)
bool IsNegativePeaksInProfile (int)
bool IsOverdrive (int)
bool IsPeaksInProfile (int)

Private Attributes

bool isZeroFilter
unsigned int overdriveThreshold
LASModuleProfile profile
std::pair< unsigned int, double > thePeak

Detailed Description

check if a LASModuleProfile is usable for being stored and fitted

Definition at line 15 of file LASProfileJudge.h.


Constructor & Destructor Documentation

LASProfileJudge::LASProfileJudge ( )

Definition at line 16 of file LASProfileJudge.cc.

References isZeroFilter.

                                 :
  overdriveThreshold(0)
{

  // switch on the zero filter by default
  isZeroFilter = true;

}

Member Function Documentation

void LASProfileJudge::EnableZeroFilter ( bool  zeroFilter)

toggle the zero filter (passed from cfg file)

Definition at line 100 of file LASProfileJudge.cc.

References dtNoiseDBValidation_cfg::cerr, and isZeroFilter.

Referenced by LaserAlignment::LaserAlignment().

                                                        {

  if( !zeroFilter ) {
    std::cerr << " [LASProfileJudge::EnableZeroFilter] ** WARNING: Zero filter has been disabled." << std::endl;
  }

  isZeroFilter = zeroFilter;

}
double LASProfileJudge::GetNegativity ( int  offset) [private]

In case of too high laser intensities, the APV baselines tend to drop down. here, the strip amplitudes in the area around the signal region are summed to return a variable which can indicate this.

Definition at line 132 of file LASProfileJudge.cc.

References LASModuleProfile::GetValue(), i, neg, evf::evtn::offset(), and profile.

Referenced by IsSignalIn(), and JudgeProfile().

                                                  {

  // here we could later run the sum only on the affected (pair of) APV

  // expected beam position (in strips)
  const unsigned int meanPosition = 256 + offset;
  // backplane "alignment hole" (="signal region") approx. half size 
  const unsigned int halfWindowSize = 33;
  // half size of range over which is summed (must be > halfWindowSize)
  const unsigned int sumHalfRange = 128;

  double neg = 0;
  
  // need only x values, so cast here
  for( unsigned int i = meanPosition - sumHalfRange; i < meanPosition - halfWindowSize; ++i ) {
    neg += profile.GetValue( i );
  }

  for( unsigned int i = meanPosition + halfWindowSize; i < meanPosition + sumHalfRange; ++i ) {
    neg += profile.GetValue( i );
  }

  return( neg );

}
bool LASProfileJudge::IsNegativePeaksInProfile ( int  offset) [private]

sometimes when the laser intensity is too high the APVs get confused and a negative peak (dip) shows up. this is filtered here.

Definition at line 205 of file LASProfileJudge.cc.

References PDRates::average, LASModuleProfile::GetValue(), evf::evtn::offset(), profile, and thePeak.

Referenced by IsSignalIn(), and JudgeProfile().

                                                           {

  // expected beam position in middle of module (in strips)
  const unsigned int meanPosition = 256 + offset;
  // backplane "alignment hole" approx. half size (in strips)
  const unsigned int halfWindowSize = 33;

  bool returnValue = false;
  
  // calculate average out-of-signal
  double average = 0., counterD = 0.;
  for( unsigned int strip = 0; strip < 512; ++strip ) {
    if( strip < meanPosition - halfWindowSize || strip > meanPosition + halfWindowSize ) {
      average += profile.GetValue( strip );
      counterD += 1.;
    }
  }
  average /= counterD;
  
  // find strips with negative amplitude way above noise level
  const double noiseLevel = 2.;
  for( unsigned int strip = 0; strip < 512; ++strip ) {
    if( profile.GetValue( strip ) < ( average - 10. * noiseLevel ) ) { 
      returnValue = true;
      thePeak.first = strip; thePeak.second = profile.GetValue( strip );
      break;
    }
  }

  return( returnValue );

}
bool LASProfileJudge::IsOverdrive ( int  offset) [private]

check if peak in signal region is too high; this can cause baseline distortions and therefore position bias

Definition at line 246 of file LASProfileJudge.cc.

References LASModuleProfile::GetValue(), evf::evtn::offset(), overdriveThreshold, and profile.

Referenced by JudgeProfile().

                                              {

  
  // expected beam position in middle of module (in strips)
  const unsigned int meanPosition = 256 + offset;
  // backplane "alignment hole" approx. half size (in strips)
  const unsigned int halfWindowSize = 33;

  // find maximum strip amplitude in range
  for( unsigned int strip = meanPosition - halfWindowSize; strip < meanPosition + halfWindowSize; ++strip ) {
    if( profile.GetValue( strip ) > overdriveThreshold ) return true;
  }

  return false;

}
bool LASProfileJudge::IsPeaksInProfile ( int  offset) [private]

If the laser intensity is too small, there's no peak at all. Here we look if any strip is well above noise level.

Definition at line 165 of file LASProfileJudge.cc.

References PDRates::average, LASModuleProfile::GetValue(), evf::evtn::offset(), profile, and thePeak.

Referenced by IsSignalIn(), and JudgeProfile().

                                                   {

  // expected beam position (in strips)
  const unsigned int meanPosition = 256 + offset;
  // backplane "alignment hole" approx. half size (in strips)
  const unsigned int halfWindowSize = 33;

  bool returnValue = false;
  
  // calculate average out-of-signal
  double average = 0., counterD = 0.;
  for( unsigned int strip = 0; strip < 512; ++strip ) {
    if( strip < meanPosition - halfWindowSize || strip > meanPosition + halfWindowSize ) {
      average += profile.GetValue( strip );
      counterD += 1.;
    }
  }
  average /= counterD;

  // find peaks well above noise level
  const double noiseLevel = 2.; // to be softcoded..
  for( unsigned int strip = meanPosition - halfWindowSize; strip < meanPosition + halfWindowSize; ++strip ) {
    if( profile.GetValue( strip ) > ( average + 10. * noiseLevel ) ) { 
      returnValue = true;
      thePeak.first = strip; thePeak.second = profile.GetValue( strip );
      break;
    }
  }

  return( returnValue );

}
bool LASProfileJudge::IsSignalIn ( const LASModuleProfile aProfile,
double  offset 
)

Check if a LASModuleProfile indicates that the module has been hit, i.e. contains a visible signal or is even distorted by too high laser amplitude. This method doesn't care if the profile is usable for analysis.

Definition at line 34 of file LASProfileJudge.cc.

References GetNegativity(), IsNegativePeaksInProfile(), IsPeaksInProfile(), evf::evtn::offset(), profile, and query::result.

Referenced by LaserAlignment::produce().

                                                                                  {

  profile = aProfile;
  
  // need only approx values, so cast here to use integers throughout
  const int approxOffset = static_cast<int>( offset );

  const double negativity = GetNegativity( approxOffset );
  const bool isPeaks = IsPeaksInProfile( approxOffset );
  const bool isNegativePeaks = IsNegativePeaksInProfile( approxOffset );
  
  bool result = 
    ( negativity < -1000. ) ||  // if we see negativity, there was laser..
    ( isPeaks )             ||  // if we see a peak, " " "
    ( isNegativePeaks );    // same here
  
  return( result );


}
bool LASProfileJudge::JudgeProfile ( const LASModuleProfile aProfile,
double  offset = 0. 
)

Check if a LASModuleProfile is usable for being stored, i.e. contains a visible signal & no baseline distortions

Definition at line 63 of file LASProfileJudge.cc.

References GetNegativity(), IsNegativePeaksInProfile(), IsOverdrive(), IsPeaksInProfile(), isZeroFilter, evf::evtn::offset(), profile, and query::result.

Referenced by LaserAlignment::produce().

                                                                                         {

  profile = aProfile;

  // need only approx values, so cast here to use integers throughout
  const int approxOffset = static_cast<int>( offset );

  // run the tests
  const double negativity = GetNegativity( approxOffset );

  bool isPeaks;
  if( !isZeroFilter ) isPeaks = true; // disable this test if set in cfg
  else isPeaks = IsPeaksInProfile( approxOffset );

  const bool isNegativePeaks = IsNegativePeaksInProfile( approxOffset );

  bool isOverdrive; // disable this test if set in cfg
  if( !isZeroFilter ) isOverdrive = false;
  else isOverdrive = IsOverdrive( approxOffset );

  bool result = 
    ( negativity > -1000. ) &&  // < 1000. = distorted profile
    ( isPeaks )             &&  // want to see a peak (zero filter)
    !( isNegativePeaks )    &&  // no negative peaks
    !( isOverdrive );           // no overdrive

  return( result );

}
void LASProfileJudge::SetOverdriveThreshold ( unsigned int  aThreshold)

set the threshold for overdriven profiles (passed from cfg file)

Definition at line 117 of file LASProfileJudge.cc.

References overdriveThreshold.

Referenced by LaserAlignment::LaserAlignment().

                                                                     {

  overdriveThreshold = aThreshold;

}

Member Data Documentation

Definition at line 32 of file LASProfileJudge.h.

Referenced by EnableZeroFilter(), JudgeProfile(), and LASProfileJudge().

unsigned int LASProfileJudge::overdriveThreshold [private]

Definition at line 33 of file LASProfileJudge.h.

Referenced by IsOverdrive(), and SetOverdriveThreshold().

std::pair<unsigned int, double> LASProfileJudge::thePeak [private]

Definition at line 31 of file LASProfileJudge.h.

Referenced by IsNegativePeaksInProfile(), and IsPeaksInProfile().