00001
00010 #include "Alignment/LaserAlignment/plugins/LaserAlignment.h"
00011 #include "FWCore/Framework/interface/Run.h"
00012
00013
00014
00015
00019 LaserAlignment::LaserAlignment( edm::ParameterSet const& theConf ) :
00020 theEvents(0),
00021 theDoPedestalSubtraction( theConf.getUntrackedParameter<bool>( "SubtractPedestals", true ) ),
00022 theUseMinuitAlgorithm( theConf.getUntrackedParameter<bool>( "RunMinuitAlignmentTubeAlgorithm", false ) ),
00023 theApplyBeamKinkCorrections( theConf.getUntrackedParameter<bool>( "ApplyBeamKinkCorrections", true ) ),
00024 peakFinderThreshold( theConf.getUntrackedParameter<double>( "PeakFinderThreshold", 10. ) ),
00025 enableJudgeZeroFilter( theConf.getUntrackedParameter<bool>( "EnableJudgeZeroFilter", true ) ),
00026 judgeOverdriveThreshold( theConf.getUntrackedParameter<unsigned int>( "JudgeOverdriveThreshold", 220 ) ),
00027 updateFromInputGeometry( theConf.getUntrackedParameter<bool>( "UpdateFromInputGeometry", false ) ),
00028 misalignedByRefGeometry( theConf.getUntrackedParameter<bool>( "MisalignedByRefGeometry", false ) ),
00029 theStoreToDB ( theConf.getUntrackedParameter<bool>( "SaveToDbase", false ) ),
00030 theDigiProducersList( theConf.getParameter<std::vector<edm::ParameterSet> >( "DigiProducersList" ) ),
00031 theSaveHistograms( theConf.getUntrackedParameter<bool>( "SaveHistograms", false ) ),
00032 theCompression( theConf.getUntrackedParameter<int>( "ROOTFileCompression", 1 ) ),
00033 theFileName( theConf.getUntrackedParameter<std::string>( "ROOTFileName", "test.root" ) ),
00034 theMaskTecModules( theConf.getUntrackedParameter<std::vector<unsigned int> >( "MaskTECModules" ) ),
00035 theMaskAtModules( theConf.getUntrackedParameter<std::vector<unsigned int> >( "MaskATModules" ) ),
00036 theSetNominalStrips( theConf.getUntrackedParameter<bool>( "ForceFitterToNominalStrips", false ) ),
00037 theLasConstants( theConf.getUntrackedParameter<std::vector<edm::ParameterSet> >( "LaserAlignmentConstants" ) ),
00038 theFile(),
00039 theAlignableTracker(),
00040 theAlignRecordName( "TrackerAlignmentRcd" ),
00041 theErrorRecordName( "TrackerAlignmentErrorRcd" ) {
00042
00043
00044 std::cout << std::endl;
00045 std::cout << "=============================================================="
00046 << "\n=== LaserAlignment module configuration ==="
00047 << "\n"
00048 << "\n Write histograms to file = " << (theSaveHistograms?"true":"false")
00049 << "\n Histogram file name = " << theFileName
00050 << "\n Histogram file compression = " << theCompression
00051 << "\n Subtract pedestals = " << (theDoPedestalSubtraction?"true":"false")
00052 << "\n Run Minuit AT algorithm = " << (theUseMinuitAlgorithm?"true":"false")
00053 << "\n Apply beam kink corrections = " << (theApplyBeamKinkCorrections?"true":"false")
00054 << "\n Peak Finder Threshold = " << peakFinderThreshold
00055 << "\n EnableJudgeZeroFilter = " << (enableJudgeZeroFilter?"true":"false")
00056 << "\n JudgeOverdriveThreshold = " << judgeOverdriveThreshold
00057 << "\n Update from input geometry = " << (updateFromInputGeometry?"true":"false")
00058 << "\n Misalignment from ref geometry = " << (misalignedByRefGeometry?"true":"false")
00059 << "\n Number of TEC modules masked = " << theMaskTecModules.size() << " (s. below list if > 0)"
00060 << "\n Number of AT modules masked = " << theMaskAtModules.size() << " (s. below list if > 0)"
00061 << "\n Store to database = " << (theStoreToDB?"true":"false")
00062 << "\n ----------------------------------------------- ----------"
00063 << (theSetNominalStrips?"\n Set strips to nominal = true":"\n")
00064 << "\n=============================================================" << std::endl;
00065
00066
00067
00068 if( theMaskTecModules.size() ) {
00069 std::cout << " ===============================================================================================\n" << std::flush;
00070 std::cout << " The following " << theMaskTecModules.size() << " TEC modules have been masked out and will not be considered by the TEC algorithm:\n " << std::flush;
00071 for( std::vector<unsigned int>::iterator moduleIt = theMaskTecModules.begin(); moduleIt != theMaskTecModules.end(); ++moduleIt ) {
00072 std::cout << *moduleIt << (moduleIt!=--theMaskTecModules.end()?", ":"") << std::flush;
00073 }
00074 std::cout << std::endl << std::flush;
00075 std::cout << " ===============================================================================================\n\n" << std::flush;
00076 }
00077 if( theMaskAtModules.size() ) {
00078 std::cout << " ===============================================================================================\n" << std::flush;
00079 std::cout << " The following " << theMaskAtModules.size() << " AT modules have been masked out and will not be considered by the AT algorithm:\n " << std::flush;
00080 for( std::vector<unsigned int>::iterator moduleIt = theMaskAtModules.begin(); moduleIt != theMaskAtModules.end(); ++moduleIt ) {
00081 std::cout << *moduleIt << (moduleIt!=--theMaskAtModules.end()?", ":"") << std::flush;
00082 }
00083 std::cout << std::endl << std::flush;
00084 std::cout << " ===============================================================================================\n\n" << std::flush;
00085 }
00086
00087
00088
00089
00090 std::string alias ( theConf.getParameter<std::string>("@module_label") );
00091
00092
00093 produces<TkLasBeamCollection, edm::InRun>( "tkLaserBeams" ).setBranchAlias( alias + "TkLasBeamCollection" );
00094
00095
00096 judge.EnableZeroFilter( enableJudgeZeroFilter );
00097
00098
00099 judge.SetOverdriveThreshold( judgeOverdriveThreshold );
00100
00101 }
00102
00103
00104
00105
00106
00110 LaserAlignment::~LaserAlignment() {
00111
00112 if ( theSaveHistograms ) theFile->Write();
00113 if ( theFile ) { delete theFile; }
00114 if ( theAlignableTracker ) { delete theAlignableTracker; }
00115
00116 }
00117
00118
00119
00120
00121
00125 void LaserAlignment::beginJob() {
00126
00127
00128
00129 if( theSaveHistograms ) {
00130
00131
00132 theFile = new TFile( theFileName.c_str(), "RECREATE", "CMS ROOT file" );
00133 theFile->SetCompressionLevel(theCompression);
00134
00135
00136 if ( theFile ) singleModulesDir = theFile->mkdir( "single modules" );
00137 else throw cms::Exception( " [LaserAlignment::beginJob]") << " ** ERROR: could not open file:" << theFileName.c_str() << " for writing." << std::endl;
00138
00139 }
00140
00141
00142 fillDetectorId();
00143
00144
00145
00146
00147
00148
00149 std::stringstream nameBuilder;
00150
00151
00152 int det, ring, beam, disk, pos;
00153
00154
00155 det = 0; ring = 0; beam = 0; disk = 0;
00156 do {
00157
00158 pedestalProfiles.GetTECEntry( det, ring, beam, disk ).SetAllValuesTo( 0. );
00159 currentDataProfiles.GetTECEntry( det, ring, beam, disk ).SetAllValuesTo( 0. );
00160 collectedDataProfiles.GetTECEntry( det, ring, beam, disk ).SetAllValuesTo( 0. );
00161
00162
00163 isAcceptedProfile.SetTECEntry( det, ring, beam, disk, 0 );
00164 numberOfAcceptedProfiles.SetTECEntry( det, ring, beam, disk, 0 );
00165
00166
00167 nameBuilder.clear();
00168 nameBuilder.str( "" );
00169 nameBuilder << "TEC";
00170 if( det == 0 ) nameBuilder << "+"; else nameBuilder << "-";
00171 nameBuilder << "_Ring";
00172 if( ring == 0 ) nameBuilder << "4"; else nameBuilder << "6";
00173 nameBuilder << "_Beam" << beam;
00174 nameBuilder << "_Disk" << disk;
00175 theProfileNames.SetTECEntry( det, ring, beam, disk, nameBuilder.str() );
00176
00177
00178 if( theSaveHistograms ) {
00179 nameBuilder << "_Histo";
00180 summedHistograms.SetTECEntry( det, ring, beam, disk, new TH1D( nameBuilder.str().c_str(), nameBuilder.str().c_str(), 512, 0, 512 ) );
00181 summedHistograms.GetTECEntry( det, ring, beam, disk )->SetDirectory( singleModulesDir );
00182 }
00183
00184 } while ( moduleLoop.TECLoop( det, ring, beam, disk ) );
00185
00186
00187
00188 det = 2; beam = 0; pos = 0;
00189 do {
00190
00191 pedestalProfiles.GetTIBTOBEntry( det, beam, pos ).SetAllValuesTo( 0. );
00192 currentDataProfiles.GetTIBTOBEntry( det, beam, pos ).SetAllValuesTo( 0. );
00193 collectedDataProfiles.GetTIBTOBEntry( det, beam, pos ).SetAllValuesTo( 0. );
00194
00195
00196 isAcceptedProfile.SetTIBTOBEntry( det, beam, pos, 0 );
00197 numberOfAcceptedProfiles.SetTIBTOBEntry( det, beam, pos, 0 );
00198
00199
00200 nameBuilder.clear();
00201 nameBuilder.str( "" );
00202 if( det == 2 ) nameBuilder << "TIB"; else nameBuilder << "TOB";
00203 nameBuilder << "_Beam" << beam;
00204 nameBuilder << "_Zpos" << pos;
00205
00206 theProfileNames.SetTIBTOBEntry( det, beam, pos, nameBuilder.str() );
00207
00208
00209 if( theSaveHistograms ) {
00210 nameBuilder << "_Histo";
00211 summedHistograms.SetTIBTOBEntry( det, beam, pos, new TH1D( nameBuilder.str().c_str(), nameBuilder.str().c_str(), 512, 0, 512 ) );
00212 summedHistograms.GetTIBTOBEntry( det, beam, pos )->SetDirectory( singleModulesDir );
00213 }
00214
00215 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
00216
00217
00218
00219 det = 0; beam = 0; disk = 0;
00220 do {
00221
00222 pedestalProfiles.GetTEC2TECEntry( det, beam, disk ).SetAllValuesTo( 0. );
00223 currentDataProfiles.GetTEC2TECEntry( det, beam, disk ).SetAllValuesTo( 0. );
00224 collectedDataProfiles.GetTEC2TECEntry( det, beam, disk ).SetAllValuesTo( 0. );
00225
00226
00227 isAcceptedProfile.SetTEC2TECEntry( det, beam, disk, 0 );
00228 numberOfAcceptedProfiles.SetTEC2TECEntry( det, beam, disk, 0 );
00229
00230
00231 nameBuilder.clear();
00232 nameBuilder.str( "" );
00233 nameBuilder << "TEC(AT)";
00234 if( det == 0 ) nameBuilder << "+"; else nameBuilder << "-";
00235 nameBuilder << "_Beam" << beam;
00236 nameBuilder << "_Disk" << disk;
00237 theProfileNames.SetTEC2TECEntry( det, beam, disk, nameBuilder.str() );
00238
00239
00240 if( theSaveHistograms ) {
00241 nameBuilder << "_Histo";
00242 summedHistograms.SetTEC2TECEntry( det, beam, disk, new TH1D( nameBuilder.str().c_str(), nameBuilder.str().c_str(), 512, 0, 512 ) );
00243 summedHistograms.GetTEC2TECEntry( det, beam, disk )->SetDirectory( singleModulesDir );
00244 }
00245
00246 } while( moduleLoop.TEC2TECLoop( det, beam, disk ) );
00247
00248 firstEvent_ = true;
00249 }
00250
00251
00252
00253
00254
00255
00259 void LaserAlignment::produce(edm::Event& theEvent, edm::EventSetup const& theSetup) {
00260
00261 if (firstEvent_) {
00262
00263
00264 theSetup.get<TrackerDigiGeometryRecord>().get( theTrackerGeometry );
00265 theSetup.get<IdealGeometryRecord>().get( gD );
00266
00267
00268 edm::ESHandle<SiStripPedestals> pedestalsHandle;
00269 if( theDoPedestalSubtraction ) {
00270 theSetup.get<SiStripPedestalsRcd>().get( pedestalsHandle );
00271 fillPedestalProfiles( pedestalsHandle );
00272 }
00273
00274
00275
00276 theSetup.get<TrackerDigiGeometryRecord>().getRecord<GlobalPositionRcd>().get( theGlobalPositionRcd );
00277
00278
00279 if( !updateFromInputGeometry ) {
00280
00281 edm::ESHandle<GeometricDet> theGeometricDet;
00282 theSetup.get<IdealGeometryRecord>().get(theGeometricDet);
00283 TrackerGeomBuilderFromGeometricDet trackerBuilder;
00284 TrackerGeometry* theRefTracker = trackerBuilder.build(&*theGeometricDet);
00285 theAlignableTracker = new AlignableTracker(&(*theRefTracker));
00286 }
00287 else {
00288
00289 theAlignableTracker = new AlignableTracker( &(*theTrackerGeometry) );
00290 }
00291
00292 firstEvent_ = false;
00293 }
00294
00295 LogDebug("LaserAlignment") << "==========================================================="
00296 << "\n Private analysis of event #"<< theEvent.id().event()
00297 << " in run #" << theEvent.id().run();
00298
00299
00300
00301 fillDataProfiles( theEvent, theSetup );
00302
00303
00304 int det, ring, beam, disk, pos;
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 ring = 1;
00315 for( det = 0; det < 2; ++det ) {
00316 for( beam = 0; beam < 8; ++ beam ) {
00317 for( disk = 0; disk < 9; ++disk ) {
00318 if( judge.IsSignalIn( currentDataProfiles.GetTECEntry( det, ring, beam, disk ) - pedestalProfiles.GetTECEntry( det, ring, beam, disk ), 0 ) ) {
00319 isAcceptedProfile.SetTECEntry( det, ring, beam, disk, 1 );
00320 }
00321 else {
00322 isAcceptedProfile.SetTECEntry( det, ring, beam, disk, 0 );
00323 }
00324 }
00325 }
00326 }
00327
00328
00329 det = 2; beam = 0; pos = 0;
00330 do {
00331
00332 if( judge.IsSignalIn( currentDataProfiles.GetTIBTOBEntry( det, beam, pos ) - pedestalProfiles.GetTIBTOBEntry( det, beam, pos ), getTIBTOBNominalBeamOffset( det, beam, pos ) ) ) {
00333 isAcceptedProfile.SetTIBTOBEntry( det, beam, pos, 1 );
00334 }
00335 else {
00336 isAcceptedProfile.SetTIBTOBEntry( det, beam, pos, 0 );
00337 }
00338
00339 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
00340
00341
00342
00343
00344
00345 bool isTECMode = isTECBeam();
00346
00347 std::cout << " [LaserAlignment::produce] -- LaserAlignment::isTECBeam declares this event " << ( isTECMode ? "" : "NOT " ) << "a TEC event." << std::endl;
00348
00349 bool isATMode = isATBeam();
00350
00351 std::cout << " [LaserAlignment::produce] -- LaserAlignment::isATBeam declares this event " << ( isATMode ? "" : "NOT " ) << "an AT event." << std::endl;
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364 det = 0; ring = 0; beam = 0; disk = 0;
00365 do {
00366
00367 LogDebug( "[LaserAlignment::produce]" ) << "Profile is: " << theProfileNames.GetTECEntry( det, ring, beam, disk ) << "." << std::endl;
00368
00369
00370
00371 if( ring == 0 && find( tecDoubleHitDetId.begin(), tecDoubleHitDetId.end(), detectorId.GetTECEntry( det, ring, beam, disk ) ) != tecDoubleHitDetId.end() ) {
00372
00373 if( isTECMode ) {
00374
00375 if( judge.JudgeProfile( currentDataProfiles.GetTECEntry( det, ring, beam, disk ) - pedestalProfiles.GetTECEntry( det, ring, beam, disk ), 0 ) ) {
00376 collectedDataProfiles.GetTECEntry( det, ring, beam, disk ) += currentDataProfiles.GetTECEntry( det, ring, beam, disk ) - pedestalProfiles.GetTECEntry( det, ring, beam, disk );
00377 numberOfAcceptedProfiles.GetTECEntry( det, ring, beam, disk )++;
00378 }
00379 }
00380 }
00381
00382 else {
00383
00384 if( judge.JudgeProfile( currentDataProfiles.GetTECEntry( det, ring, beam, disk ) - pedestalProfiles.GetTECEntry( det, ring, beam, disk ), 0 ) ) {
00385 collectedDataProfiles.GetTECEntry( det, ring, beam, disk ) += currentDataProfiles.GetTECEntry( det, ring, beam, disk ) - pedestalProfiles.GetTECEntry( det, ring, beam, disk );
00386 numberOfAcceptedProfiles.GetTECEntry( det, ring, beam, disk )++;
00387 }
00388 }
00389
00390 } while( moduleLoop.TECLoop( det, ring, beam, disk ) );
00391
00392
00393
00394
00395
00396
00397 det = 2; beam = 0; pos = 0;
00398 do {
00399
00400 LogDebug( "[LaserAlignment::produce]" ) << "Profile is: " << theProfileNames.GetTIBTOBEntry( det, beam, pos ) << "." << std::endl;
00401
00402
00403 if( judge.JudgeProfile( currentDataProfiles.GetTIBTOBEntry( det, beam, pos ) - pedestalProfiles.GetTIBTOBEntry( det, beam, pos ), getTIBTOBNominalBeamOffset( det, beam, pos ) ) ) {
00404 collectedDataProfiles.GetTIBTOBEntry( det, beam, pos ) += currentDataProfiles.GetTIBTOBEntry( det, beam, pos ) - pedestalProfiles.GetTIBTOBEntry( det, beam, pos );
00405 numberOfAcceptedProfiles.GetTIBTOBEntry( det, beam, pos )++;
00406 }
00407
00408 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
00409
00410
00411
00412
00413 det = 0; beam = 0; disk = 0;
00414 do {
00415
00416 LogDebug( "[LaserAlignment::produce]" ) << "Profile is: " << theProfileNames.GetTEC2TECEntry( det, beam, disk ) << "." << std::endl;
00417
00418
00419
00420 if( ring == 0 && find( tecDoubleHitDetId.begin(), tecDoubleHitDetId.end(), detectorId.GetTECEntry( det, ring, beam, disk ) ) != tecDoubleHitDetId.end() ) {
00421
00422 if( isATMode ) {
00423
00424 if( judge.JudgeProfile( currentDataProfiles.GetTEC2TECEntry( det, beam, disk ) - pedestalProfiles.GetTEC2TECEntry( det, beam, disk ), 0 ) ) {
00425 collectedDataProfiles.GetTEC2TECEntry( det, beam, disk ) += currentDataProfiles.GetTEC2TECEntry( det, beam, disk ) - pedestalProfiles.GetTEC2TECEntry( det, beam, disk );
00426 numberOfAcceptedProfiles.GetTEC2TECEntry( det, beam, disk )++;
00427 }
00428 }
00429
00430 }
00431
00432 else {
00433
00434 if( judge.JudgeProfile( currentDataProfiles.GetTEC2TECEntry( det, beam, disk ) - pedestalProfiles.GetTEC2TECEntry( det, beam, disk ), 0 ) ) {
00435 collectedDataProfiles.GetTEC2TECEntry( det, beam, disk ) += currentDataProfiles.GetTEC2TECEntry( det, beam, disk ) - pedestalProfiles.GetTEC2TECEntry( det, beam, disk );
00436 numberOfAcceptedProfiles.GetTEC2TECEntry( det, beam, disk )++;
00437 }
00438 }
00439
00440
00441 } while( moduleLoop.TEC2TECLoop( det, beam, disk ) );
00442
00443
00444
00445
00446 theEvents++;
00447
00448 }
00449
00450
00451
00452
00453
00457 void LaserAlignment::endRun( edm::Run& theRun, const edm::EventSetup& theSetup ) {
00458
00459
00460 std::cout << " [LaserAlignment::endRun] -- Total number of events processed: " << theEvents << std::endl;
00461
00462
00463 DumpHitmaps( numberOfAcceptedProfiles );
00464
00465
00466 int det, ring, beam, disk, pos;
00467
00468
00469 LASGlobalData<LASCoordinateSet> measuredCoordinates;
00470
00471
00472 LASGlobalData<std::pair<float,float> > measuredStripPositions;
00473
00474
00475 LASPeakFinder peakFinder;
00476 peakFinder.SetAmplitudeThreshold( peakFinderThreshold );
00477 std::pair<double,double> peakFinderResults;
00478 bool isGoodFit;
00479
00480
00481 const TrackerGeometry& theTracker( *theTrackerGeometry );
00482
00483
00484 CalculateNominalCoordinates();
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494 det = 0; ring = 0; beam = 0; disk = 0;
00495 do {
00496
00497
00498 isGoodFit = peakFinder.FindPeakIn( collectedDataProfiles.GetTECEntry( det, ring, beam, disk ), peakFinderResults,
00499 summedHistograms.GetTECEntry( det, ring, beam, disk ), 0 );
00500
00501
00502 if( !isGoodFit ) std::cout << " [LaserAlignment::endRun] ** WARNING: Fit failed for TEC det: "
00503 << det << ", ring: " << ring << ", beam: " << beam << ", disk: " << disk
00504 << " (id: " << detectorId.GetTECEntry( det, ring, beam, disk ) << ")." << std::endl;
00505
00506
00507
00508
00509
00510
00511 const DetId theDetId( detectorId.GetTECEntry( det, ring, beam, disk ) );
00512 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
00513
00514
00515 measuredCoordinates.SetTECEntry( det, ring, beam, disk, nominalCoordinates.GetTECEntry( det, ring, beam, disk ) );
00516
00517 if( isGoodFit ) {
00518
00519 measuredStripPositions.GetTECEntry( det, ring, beam, disk ) = peakFinderResults;
00520 const float positionInStrips = theSetNominalStrips ? 256. : peakFinderResults.first;
00521 const GlobalPoint& globalPoint = theStripDet->surface().toGlobal( theStripDet->specificTopology().localPosition( positionInStrips ) );
00522 measuredCoordinates.GetTECEntry( det, ring, beam, disk ).SetPhi( ConvertAngle( globalPoint.barePhi() ) );
00523
00524
00525
00526 measuredCoordinates.GetTECEntry( det, ring, beam, disk ).SetPhiError( 0.00046 );
00527
00528 }
00529 else {
00530 measuredStripPositions.GetTECEntry( det, ring, beam, disk ) = std::pair<float,float>( 256., 1000. );
00531 const GlobalPoint& globalPoint = theStripDet->surface().toGlobal( theStripDet->specificTopology().localPosition( 256. ) );
00532 measuredCoordinates.GetTECEntry( det, ring, beam, disk ).SetPhi( ConvertAngle( globalPoint.barePhi() ) );
00533 measuredCoordinates.GetTECEntry( det, ring, beam, disk ).SetPhiError( 1000. );
00534 }
00535
00536 } while( moduleLoop.TECLoop( det, ring, beam, disk ) );
00537
00538
00539
00540
00541
00542 det = 2; beam = 0; pos = 0;
00543 do {
00544
00545
00546 isGoodFit = peakFinder.FindPeakIn( collectedDataProfiles.GetTIBTOBEntry( det, beam, pos ), peakFinderResults,
00547 summedHistograms.GetTIBTOBEntry( det, beam, pos ), getTIBTOBNominalBeamOffset( det, beam, pos ) );
00548
00549
00550 if( !isGoodFit ) std::cout << " [LaserAlignment::endJob] ** WARNING: Fit failed for TIB/TOB det: "
00551 << det << ", beam: " << beam << ", pos: " << pos
00552 << " (id: " << detectorId.GetTIBTOBEntry( det, beam, pos ) << ")." << std::endl;
00553
00554
00555
00556
00557
00558 const DetId theDetId( detectorId.GetTIBTOBEntry( det, beam, pos ) );
00559 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
00560
00561
00562 measuredCoordinates.SetTIBTOBEntry( det, beam, pos, nominalCoordinates.GetTIBTOBEntry( det, beam, pos ) );
00563
00564 if( isGoodFit ) {
00565 measuredStripPositions.GetTIBTOBEntry( det, beam, pos ) = peakFinderResults;
00566 const float positionInStrips = theSetNominalStrips ? 256. + getTIBTOBNominalBeamOffset( det, beam, pos ) : peakFinderResults.first;
00567 const GlobalPoint& globalPoint = theStripDet->surface().toGlobal( theStripDet->specificTopology().localPosition( positionInStrips ) );
00568 measuredCoordinates.GetTIBTOBEntry( det, beam, pos ).SetPhi( ConvertAngle( globalPoint.barePhi() ) );
00569 measuredCoordinates.GetTIBTOBEntry( det, beam, pos ).SetPhiError( 0.00028 );
00570 }
00571 else {
00572 measuredStripPositions.GetTIBTOBEntry( det, beam, pos ) = std::pair<float,float>( 256. + getTIBTOBNominalBeamOffset( det, beam, pos ), 1000. );
00573 const GlobalPoint& globalPoint = theStripDet->surface().toGlobal( theStripDet->specificTopology().localPosition( 256. + getTIBTOBNominalBeamOffset( det, beam, pos ) ) );
00574 measuredCoordinates.GetTIBTOBEntry( det, beam, pos ).SetPhi( ConvertAngle( globalPoint.barePhi() ) );
00575 measuredCoordinates.GetTIBTOBEntry( det, beam, pos ).SetPhiError( 1000. );
00576 }
00577
00578 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
00579
00580
00581
00582
00583
00584 det = 0; beam = 0; disk = 0;
00585 do {
00586
00587
00588 isGoodFit = peakFinder.FindPeakIn( collectedDataProfiles.GetTEC2TECEntry( det, beam, disk ), peakFinderResults,
00589 summedHistograms.GetTEC2TECEntry( det, beam, disk ), getTEC2TECNominalBeamOffset( det, beam, disk ) );
00590
00591 if( !isGoodFit ) std::cout << " [LaserAlignment::endRun] ** WARNING: Fit failed for TEC2TEC det: "
00592 << det << ", beam: " << beam << ", disk: " << disk
00593 << " (id: " << detectorId.GetTEC2TECEntry( det, beam, disk ) << ")." << std::endl;
00594
00595
00596
00597
00598
00599 const DetId theDetId( detectorId.GetTEC2TECEntry( det, beam, disk ) );
00600 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
00601
00602
00603 measuredCoordinates.SetTEC2TECEntry( det, beam, disk, nominalCoordinates.GetTEC2TECEntry( det, beam, disk ) );
00604
00605 if( isGoodFit ) {
00606 measuredStripPositions.GetTEC2TECEntry( det, beam, disk ) = peakFinderResults;
00607 const float positionInStrips = theSetNominalStrips ? 256. + getTEC2TECNominalBeamOffset( det, beam, disk ) : peakFinderResults.first;
00608 const GlobalPoint& globalPoint = theStripDet->surface().toGlobal( theStripDet->specificTopology().localPosition( positionInStrips ) );
00609 measuredCoordinates.GetTEC2TECEntry( det, beam, disk ).SetPhi( ConvertAngle( globalPoint.barePhi() ) );
00610 measuredCoordinates.GetTEC2TECEntry( det, beam, disk ).SetPhiError( 0.00047 );
00611 }
00612 else {
00613 measuredStripPositions.GetTEC2TECEntry( det, beam, disk ) = std::pair<float,float>( 256. + getTEC2TECNominalBeamOffset( det, beam, disk ), 1000. );
00614 const GlobalPoint& globalPoint = theStripDet->surface().toGlobal( theStripDet->specificTopology().localPosition( 256. + getTEC2TECNominalBeamOffset( det, beam, disk ) ) );
00615 measuredCoordinates.GetTEC2TECEntry( det, beam, disk ).SetPhi( ConvertAngle( globalPoint.barePhi() ) );
00616 measuredCoordinates.GetTEC2TECEntry( det, beam, disk ).SetPhiError( 1000. );
00617 }
00618
00619
00620 } while( moduleLoop.TEC2TECLoop( det, beam, disk ) );
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639 LASGeometryUpdater geometryUpdater( nominalCoordinates, theLasConstants );
00640
00641
00642 if( theApplyBeamKinkCorrections ) geometryUpdater.ApplyBeamKinkCorrections( measuredCoordinates );
00643
00644
00645
00646 if( updateFromInputGeometry ) geometryUpdater.SetReverseDirection( true );
00647
00648
00649
00650 if( misalignedByRefGeometry ) geometryUpdater.SetMisalignmentFromRefGeometry( true );
00651
00652
00653 LASEndcapAlgorithm endcapAlgorithm;
00654 LASEndcapAlignmentParameterSet endcapParameters;
00655
00656
00657
00658
00659 if( theMaskTecModules.size() ) {
00660 ApplyEndcapMaskingCorrections( measuredCoordinates, nominalCoordinates, endcapParameters );
00661 }
00662
00663
00664 endcapParameters = endcapAlgorithm.CalculateParameters( measuredCoordinates, nominalCoordinates );
00665
00666
00667
00668
00669
00670
00671
00672 if( theMaskTecModules.size() ) {
00673
00674 const unsigned int nIterations = 30;
00675 for( unsigned int iteration = 0; iteration < nIterations; ++iteration ) {
00676
00677
00678
00679 ApplyEndcapMaskingCorrections( measuredCoordinates, nominalCoordinates, endcapParameters );
00680
00681
00682 endcapParameters = endcapAlgorithm.CalculateParameters( measuredCoordinates, nominalCoordinates );
00683
00684 }
00685
00686 }
00687
00688
00689 endcapParameters.Print();
00690
00691
00692
00693
00694
00695
00696 geometryUpdater.EndcapUpdate( endcapParameters, measuredCoordinates );
00697
00698
00699
00700 LASBarrelAlignmentParameterSet alignmentTubeParameters;
00701
00702 LASBarrelAlgorithm barrelAlgorithm;
00703
00704 LASAlignmentTubeAlgorithm alignmentTubeAlgorithm;
00705
00706
00707
00708
00709 if( theMaskAtModules.size() ) {
00710 ApplyATMaskingCorrections( measuredCoordinates, nominalCoordinates, alignmentTubeParameters );
00711 }
00712
00713 if( theUseMinuitAlgorithm ) {
00714
00715 alignmentTubeParameters = barrelAlgorithm.CalculateParameters( measuredCoordinates, nominalCoordinates );
00716 }
00717 else {
00718
00719 alignmentTubeParameters = alignmentTubeAlgorithm.CalculateParameters( measuredCoordinates, nominalCoordinates );
00720 }
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730 if( theMaskAtModules.size() ) {
00731
00732 const unsigned int nIterations = 30;
00733 for( unsigned int iteration = 0; iteration < nIterations; ++iteration ) {
00734
00735
00736
00737 ApplyATMaskingCorrections( measuredCoordinates, nominalCoordinates, alignmentTubeParameters );
00738
00739
00740 if( theUseMinuitAlgorithm ) {
00741 alignmentTubeParameters = barrelAlgorithm.CalculateParameters( measuredCoordinates, nominalCoordinates );
00742 }
00743 else {
00744 alignmentTubeParameters = alignmentTubeAlgorithm.CalculateParameters( measuredCoordinates, nominalCoordinates );
00745 }
00746
00747 }
00748
00749 }
00750
00751
00752
00753 alignmentTubeParameters.Print();
00754
00755
00756
00757 geometryUpdater.TrackerUpdate( endcapParameters, alignmentTubeParameters, *theAlignableTracker );
00758
00759
00760
00761
00762
00763
00764
00769
00770
00771
00772 std::auto_ptr<TkLasBeamCollection> laserBeams( new TkLasBeamCollection );
00773
00774
00775
00776 for( det = 0; det < 2; ++det ) {
00777 for( ring = 0; ring < 2; ++ring ) {
00778 for( beam = 0; beam < 8; ++beam ) {
00779
00780
00781 TkLasBeam currentBeam( 100 * det + 10 * beam + ring );
00782
00783
00784 const int firstDisk = det==0 ? 0 : 8;
00785 const int lastDisk = det==0 ? 8 : 0;
00786
00787
00788 for( disk = firstDisk; det==0 ? disk <= lastDisk : disk >= lastDisk; det==0 ? ++disk : --disk ) {
00789
00790
00791 const SiStripDetId theDetId( detectorId.GetTECEntry( det, ring, beam, disk ) );
00792
00793
00794 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
00795
00796
00797 const SiStripLaserRecHit2D currentHit(
00798 theStripDet->specificTopology().localPosition( measuredStripPositions.GetTECEntry( det, ring, beam, disk ).first ),
00799 theStripDet->specificTopology().localError( measuredStripPositions.GetTECEntry( det, ring, beam, disk ).first, measuredStripPositions.GetTECEntry( det, ring, beam, disk ).second ),
00800 theDetId
00801 );
00802
00803 currentBeam.push_back( currentHit );
00804
00805 }
00806
00807 laserBeams->push_back( currentBeam );
00808
00809 }
00810 }
00811 }
00812
00813
00814
00815
00816
00817
00818 for( beam = 0; beam < 8; ++beam ) {
00819
00820
00821 TkLasBeam currentBeam( 100 * 2 + 10 * beam + 0 );
00822
00823
00824
00825 det = 1;
00826 for( disk = 4; disk >= 0; --disk ) {
00827
00828
00829 const SiStripDetId theDetId( detectorId.GetTEC2TECEntry( det, beam, disk ) );
00830
00831
00832 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
00833
00834
00835 const SiStripLaserRecHit2D currentHit(
00836 theStripDet->specificTopology().localPosition( measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).first ),
00837 theStripDet->specificTopology().localError( measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).first, measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).second ),
00838 theDetId
00839 );
00840
00841 currentBeam.push_back( currentHit );
00842
00843 }
00844
00845
00846
00847 for( det = 2; det < 4; ++det ) {
00848 for( pos = 5; pos >= 0; --pos ) {
00849
00850
00851 const SiStripDetId theDetId( detectorId.GetTIBTOBEntry( det, beam, pos ) );
00852
00853
00854 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
00855
00856
00857 const SiStripLaserRecHit2D currentHit(
00858 theStripDet->specificTopology().localPosition( measuredStripPositions.GetTIBTOBEntry( det, beam, pos ).first ),
00859 theStripDet->specificTopology().localError( measuredStripPositions.GetTIBTOBEntry( det, beam, pos ).first, measuredStripPositions.GetTIBTOBEntry( det, beam, pos ).second ),
00860 theDetId
00861 );
00862
00863 currentBeam.push_back( currentHit );
00864
00865 }
00866 }
00867
00868
00869
00870 det = 0;
00871 for( disk = 0; disk < 5; ++disk ) {
00872
00873
00874 const SiStripDetId theDetId( detectorId.GetTEC2TECEntry( det, beam, disk ) );
00875
00876
00877 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
00878
00879
00880 const SiStripLaserRecHit2D currentHit(
00881 theStripDet->specificTopology().localPosition( measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).first ),
00882 theStripDet->specificTopology().localError( measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).first, measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).second ),
00883 theDetId
00884 );
00885
00886 currentBeam.push_back( currentHit );
00887
00888 }
00889
00890
00891
00892
00893 laserBeams->push_back( currentBeam );
00894
00895 }
00896
00897
00898
00899 theRun.put( laserBeams, "tkLaserBeams" );
00900
00901
00902
00903
00904
00905
00906
00907 Alignments* alignments = theAlignableTracker->alignments();
00908 AlignmentErrors* alignmentErrors = theAlignableTracker->alignmentErrors();
00909
00910 if ( theStoreToDB ) {
00911
00912 std::cout << " [LaserAlignment::endRun] -- Storing the calculated alignment parameters to the DataBase:" << std::endl;
00913
00914
00915 edm::Service<cond::service::PoolDBOutputService> poolDbService;
00916 if( !poolDbService.isAvailable() )
00917 throw cms::Exception( "NotAvailable" ) << "PoolDBOutputService not available";
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927 poolDbService->writeOne<Alignments>( alignments, poolDbService->beginOfTime(), theAlignRecordName );
00928
00929
00930
00931
00932
00933
00934
00935 poolDbService->writeOne<AlignmentErrors>( alignmentErrors, poolDbService->beginOfTime(), theErrorRecordName );
00936
00937 std::cout << " [LaserAlignment::endRun] -- Storing done." << std::endl;
00938
00939 }
00940
00941 }
00942
00943
00944
00945
00946
00950 void LaserAlignment::endJob() {
00951 }
00952
00953
00954
00955
00956
00961 void LaserAlignment::fillDataProfiles( edm::Event const& theEvent, edm::EventSetup const& theSetup ) {
00962
00963
00964 edm::Handle< edm::DetSetVector<SiStripRawDigi> > theStripRawDigis;
00965 edm::Handle< edm::DetSetVector<SiStripDigi> > theStripDigis;
00966
00967 bool isRawDigi = false;
00968
00969
00970 int det = 0, ring = 0, beam = 0, disk = 0, pos = 0;
00971
00972
00973 for ( std::vector<edm::ParameterSet>::iterator itDigiProducersList = theDigiProducersList.begin(); itDigiProducersList != theDigiProducersList.end(); ++itDigiProducersList ) {
00974
00975 std::string digiProducer = itDigiProducersList->getParameter<std::string>( "DigiProducer" );
00976 std::string digiLabel = itDigiProducersList->getParameter<std::string>( "DigiLabel" );
00977 std::string digiType = itDigiProducersList->getParameter<std::string>( "DigiType" );
00978
00979
00980
00981 if( digiType == "Raw" ) {
00982 theEvent.getByLabel( digiProducer, digiLabel, theStripRawDigis );
00983 isRawDigi = true;
00984 }
00985 else if( digiType == "Processed" ) {
00986 theEvent.getByLabel( digiProducer, digiLabel, theStripDigis );
00987 isRawDigi = false;
00988 }
00989 else {
00990 throw cms::Exception( " [LaserAlignment::fillDataProfiles]") << " ** ERROR: Invalid digi type: \"" << digiType << "\" specified in configuration." << std::endl;
00991 }
00992
00993
00994
00995
00996 det = 0; ring = 0; beam = 0; disk = 0;
00997 do {
00998
00999
01000 currentDataProfiles.GetTECEntry( det, ring, beam, disk ).SetAllValuesTo( 0. );
01001
01002
01003 const int detRawId = detectorId.GetTECEntry( det, ring, beam, disk );
01004
01005 if( isRawDigi ) {
01006
01007
01008 edm::DetSetVector<SiStripRawDigi>::const_iterator detSetIter = theStripRawDigis->find( detRawId );
01009 if( detSetIter == theStripRawDigis->end() ) {
01010 throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: No raw DetSet found for det: " << detRawId << "." << std::endl;
01011 }
01012
01013
01014 edm::DetSet<SiStripRawDigi>::const_iterator digiRangeIterator = detSetIter->data.begin();
01015 edm::DetSet<SiStripRawDigi>::const_iterator digiRangeStart = digiRangeIterator;
01016
01017
01018 for (; digiRangeIterator != detSetIter->data.end(); ++digiRangeIterator ) {
01019 const SiStripRawDigi& digi = *digiRangeIterator;
01020 const int channel = distance( digiRangeStart, digiRangeIterator );
01021 if ( channel >= 0 && channel < 512 ) currentDataProfiles.GetTECEntry( det, ring, beam, disk ).SetValue( channel, digi.adc() );
01022 else throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: raw digi channel: " << channel << " out of range for det: " << detRawId << "." << std::endl;
01023 }
01024
01025 }
01026
01027 else {
01028
01029
01030 edm::DetSetVector<SiStripDigi>::const_iterator detSetIter = theStripDigis->find( detRawId );
01031
01032
01033 if( detSetIter == theStripDigis->end() ) continue;
01034
01035
01036 edm::DetSet<SiStripDigi>::const_iterator digiRangeIterator = detSetIter->data.begin();
01037 edm::DetSet<SiStripDigi>::const_iterator digiRangeStart = digiRangeIterator;
01038
01039 for(; digiRangeIterator != detSetIter->data.end(); ++digiRangeIterator ) {
01040 const SiStripDigi& digi = *digiRangeIterator;
01041 if ( digi.strip() < 512 ) currentDataProfiles.GetTECEntry( det, ring, beam, disk ).SetValue( digi.strip(), digi.adc() );
01042 else throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: digi strip: " << digi.strip() << " out of range for det: " << detRawId << "." << std::endl;
01043 }
01044
01045 }
01046
01047
01048 } while( moduleLoop.TECLoop( det, ring, beam, disk ) );
01049
01050
01051
01052
01053
01054
01055 det = 2; beam = 0; pos = 0;
01056 do {
01057
01058
01059 currentDataProfiles.GetTIBTOBEntry( det, beam, pos ).SetAllValuesTo( 0. );
01060
01061
01062 const int detRawId = detectorId.GetTIBTOBEntry( det, beam, pos );
01063
01064 if( isRawDigi ) {
01065
01066
01067 edm::DetSetVector<SiStripRawDigi>::const_iterator detSetIter = theStripRawDigis->find( detRawId );
01068 if( detSetIter == theStripRawDigis->end() ) {
01069 throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: No raw DetSet found for det: " << detRawId << "." << std::endl;
01070 }
01071
01072
01073 edm::DetSet<SiStripRawDigi>::const_iterator digiRangeIterator = detSetIter->data.begin();
01074 edm::DetSet<SiStripRawDigi>::const_iterator digiRangeStart = digiRangeIterator;
01075
01076
01077 for (; digiRangeIterator != detSetIter->data.end(); ++digiRangeIterator ) {
01078 const SiStripRawDigi& digi = *digiRangeIterator;
01079 const int channel = distance( digiRangeStart, digiRangeIterator );
01080 if ( channel >= 0 && channel < 512 ) currentDataProfiles.GetTIBTOBEntry( det, beam, pos ).SetValue( channel, digi.adc() );
01081 else throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: raw digi channel: " << channel << " out of range for det: " << detRawId << "." << std::endl;
01082 }
01083
01084 }
01085
01086 else {
01087
01088
01089 edm::DetSetVector<SiStripDigi>::const_iterator detSetIter = theStripDigis->find( detRawId );
01090
01091
01092 if( detSetIter == theStripDigis->end() ) continue;
01093
01094
01095 edm::DetSet<SiStripDigi>::const_iterator digiRangeIterator = detSetIter->data.begin();
01096 edm::DetSet<SiStripDigi>::const_iterator digiRangeStart = digiRangeIterator;
01097
01098 for(; digiRangeIterator != detSetIter->data.end(); ++digiRangeIterator ) {
01099 const SiStripDigi& digi = *digiRangeIterator;
01100 if ( digi.strip() < 512 ) currentDataProfiles.GetTIBTOBEntry( det, beam, pos ).SetValue( digi.strip(), digi.adc() );
01101 else throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: digi strip: " << digi.strip() << " out of range for det: " << detRawId << "." << std::endl;
01102 }
01103
01104 }
01105
01106 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
01107
01108
01109
01110
01111 det = 0; beam = 0; disk = 0;
01112 do {
01113
01114
01115 currentDataProfiles.GetTEC2TECEntry( det, beam, disk ).SetAllValuesTo( 0. );
01116
01117
01118 const int detRawId = detectorId.GetTEC2TECEntry( det, beam, disk );
01119
01120 if( isRawDigi ) {
01121
01122
01123 edm::DetSetVector<SiStripRawDigi>::const_iterator detSetIter = theStripRawDigis->find( detRawId );
01124 if( detSetIter == theStripRawDigis->end() ) {
01125 throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: No raw DetSet found for det: " << detRawId << "." << std::endl;
01126 }
01127
01128
01129 edm::DetSet<SiStripRawDigi>::const_iterator digiRangeIterator = detSetIter->data.begin();
01130 edm::DetSet<SiStripRawDigi>::const_iterator digiRangeStart = digiRangeIterator;
01131
01132
01133 for (; digiRangeIterator != detSetIter->data.end(); ++digiRangeIterator ) {
01134 const SiStripRawDigi& digi = *digiRangeIterator;
01135 const int channel = distance( digiRangeStart, digiRangeIterator );
01136 if ( channel >= 0 && channel < 512 ) currentDataProfiles.GetTEC2TECEntry( det, beam, disk ).SetValue( channel, digi.adc() );
01137 else throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: raw digi channel: " << channel << " out of range for det: " << detRawId << "." << std::endl;
01138 }
01139
01140 }
01141
01142 else {
01143
01144
01145 edm::DetSetVector<SiStripDigi>::const_iterator detSetIter = theStripDigis->find( detRawId );
01146
01147
01148 if( detSetIter == theStripDigis->end() ) continue;
01149
01150
01151 edm::DetSet<SiStripDigi>::const_iterator digiRangeIterator = detSetIter->data.begin();
01152 edm::DetSet<SiStripDigi>::const_iterator digiRangeStart = digiRangeIterator;
01153
01154 for(; digiRangeIterator != detSetIter->data.end(); ++digiRangeIterator ) {
01155 const SiStripDigi& digi = *digiRangeIterator;
01156 if ( digi.strip() < 512 ) currentDataProfiles.GetTEC2TECEntry( det, beam, disk ).SetValue( digi.strip(), digi.adc() );
01157 else throw cms::Exception( "[Laser Alignment::fillDataProfiles]" ) << " ** ERROR: digi strip: " << digi.strip() << " out of range for det: " << detRawId << "." << std::endl;
01158 }
01159
01160 }
01161
01162 } while( moduleLoop.TEC2TECLoop( det, beam, disk ) );
01163
01164 }
01165
01166 }
01167
01168
01169
01170
01171
01180 void LaserAlignment::fillPedestalProfiles( edm::ESHandle<SiStripPedestals>& pedestalsHandle ) {
01181
01182 int det, ring, beam, disk, pos;
01183
01184
01185 det = 0; ring = 0; beam = 0; disk = 0;
01186 do {
01187 SiStripPedestals::Range pedRange = pedestalsHandle->getRange( detectorId.GetTECEntry( det, ring, beam, disk ) );
01188 for( int strip = 0; strip < 512; ++strip ) {
01189 int thePedestal = int( pedestalsHandle->getPed( strip, pedRange ) );
01190 if( thePedestal > 895 ) thePedestal -= 1024;
01191 pedestalProfiles.GetTECEntry( det, ring, beam, disk ).SetValue( strip, thePedestal );
01192 }
01193 } while ( moduleLoop.TECLoop( det, ring, beam, disk ) );
01194
01195
01196
01197 det = 2; beam = 0; pos = 0;
01198 do {
01199 SiStripPedestals::Range pedRange = pedestalsHandle->getRange( detectorId.GetTIBTOBEntry( det, beam, pos ) );
01200 for( int strip = 0; strip < 512; ++strip ) {
01201 int thePedestal = int( pedestalsHandle->getPed( strip, pedRange ) );
01202 if( thePedestal > 895 ) thePedestal -= 1024;
01203 pedestalProfiles.GetTIBTOBEntry( det, beam, pos ).SetValue( strip, thePedestal );
01204 }
01205 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
01206
01207
01208
01209 det = 0; beam = 0; disk = 0;
01210 do {
01211 SiStripPedestals::Range pedRange = pedestalsHandle->getRange( detectorId.GetTEC2TECEntry( det, beam, disk ) );
01212 for( int strip = 0; strip < 512; ++strip ) {
01213 int thePedestal = int( pedestalsHandle->getPed( strip, pedRange ) );
01214 if( thePedestal > 895 ) thePedestal -= 1024;
01215 pedestalProfiles.GetTEC2TECEntry( det, beam, disk ).SetValue( strip, thePedestal );
01216 }
01217 } while( moduleLoop.TEC2TECLoop( det, beam, disk ) );
01218
01219 }
01220
01221
01222
01223
01224
01230 bool LaserAlignment::isTECBeam( void ) {
01231
01232 int numberOfProfiles = 0;
01233
01234 int ring = 1;
01235 for( int det = 0; det < 2; ++det ) {
01236 for( int beam = 0; beam < 8; ++ beam ) {
01237 for( int disk = 0; disk < 9; ++disk ) {
01238 if( isAcceptedProfile.GetTECEntry( det, ring, beam, disk ) == 1 ) numberOfProfiles++;
01239 }
01240 }
01241 }
01242
01243 LogDebug( "[LaserAlignment::isTECBeam]" ) << " Found: " << numberOfProfiles << "hits." << std::endl;
01244 std::cout << " [LaserAlignment::isTECBeam] -- Found: " << numberOfProfiles << " hits." << std::endl;
01245
01246 if( numberOfProfiles > 10 ) return( true );
01247 return( false );
01248
01249 }
01250
01251
01252
01253
01254
01260
01261 bool LaserAlignment::isATBeam( void ) {
01262
01263 int numberOfProfiles = 0;
01264
01265 int det = 2; int beam = 0; int pos = 0;
01266 do {
01267 if( isAcceptedProfile.GetTIBTOBEntry( det, beam, pos ) == 1 ) numberOfProfiles++;
01268 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
01269
01270 LogDebug( "[LaserAlignment::isATBeam]" ) << " Found: " << numberOfProfiles << "hits." << std::endl;
01271 std::cout << " [LaserAlignment::isATBeam] -- Found: " << numberOfProfiles << " hits." << std::endl;
01272
01273 if( numberOfProfiles > 10 ) return( true );
01274 return( false );
01275
01276 }
01277
01278
01279
01280
01281
01290 double LaserAlignment::getTIBTOBNominalBeamOffset( unsigned int det, unsigned int beam, unsigned int pos ) {
01291
01292 if( det < 2 || det > 3 || beam > 7 || pos > 5 ) {
01293 throw cms::Exception( "[LaserAlignment::getTIBTOBNominalBeamOffset]" ) << " ERROR ** Called with nonexisting parameter set: det " << det << " beam " << beam << " pos " << pos << "." << std::endl;
01294 }
01295
01296 const double nominalOffsetsTIB[8] = { 0.00035, 2.10687, -2.10827, -0.00173446, 2.10072, -0.00135114, 2.10105, -2.10401 };
01297
01298
01299
01300
01301 const int orientationPattern[6] = { -1, 1, 1, -1, -1, 1 };
01302 const double nominalOffsetsTOB[8] = { 0.00217408, 1.58678, 117.733, 119.321, 120.906, 119.328, 117.743, 1.58947 };
01303
01304
01305 if( det == 2 ) return( -1. * nominalOffsetsTIB[beam] );
01306
01307 else {
01308 if( beam == 0 or beam > 4 ) return( nominalOffsetsTOB[beam] * orientationPattern[pos] );
01309 else return( -1. * nominalOffsetsTOB[beam] * orientationPattern[pos] );
01310 }
01311
01312 }
01313
01314
01315
01316
01325 double LaserAlignment::getTEC2TECNominalBeamOffset( unsigned int det, unsigned int beam, unsigned int disk ) {
01326
01327 if( det > 1 || beam > 7 || disk > 5 ) {
01328 throw cms::Exception( "[LaserAlignment::getTEC2TECNominalBeamOffset]" ) << " ERROR ** Called with nonexisting parameter set: det " << det << " beam " << beam << " disk " << disk << "." << std::endl;
01329 }
01330
01331 const double nominalOffsets[8] = { 0., 2.220, -2.221, 0., 2.214, 0., 2.214, -2.217 };
01332
01333 if( det == 0 ) return -1. * nominalOffsets[beam];
01334 else return nominalOffsets[beam];
01335
01336 }
01337
01338
01339
01340
01341
01345 void LaserAlignment::CalculateNominalCoordinates( void ) {
01346
01347
01348
01349
01350
01351
01352 const double tecPhiPositions[8] = { 0.392699, 1.178097, 1.963495, 2.748894, 3.534292, 4.319690, 5.105088, 5.890486 };
01353 const double atPhiPositions[8] = { 0.392699, 1.289799, 1.851794, 2.748894, 3.645995, 4.319690, 5.216791, 5.778784 };
01354
01355
01356 const double tobRPosition = 600.;
01357 const double tibRPosition = 514.;
01358 const double tecRPosition[2] = { 564., 840. };
01359
01360
01361 const double tobZPosition[6] = { 1040., 580., 220., -140., -500., -860. };
01362 const double tibZPosition[6] = { 620., 380., 180., -100., -340., -540. };
01363
01364
01365 const double tecZPosition[9] = { 1322.5, 1462.5, 1602.5, 1742.5, 1882.5, 2057.5, 2247.5, 2452.5, 2667.5 };
01366
01367
01368
01369
01370
01371
01372
01373
01374 LASGlobalLoop moduleLoop;
01375 int det, ring, beam, disk, pos;
01376
01377
01378
01379 det = 0; ring = 0, beam = 0; disk = 0;
01380 do {
01381
01382 if( det == 0 ) {
01383 nominalCoordinates.SetTECEntry( det, ring, beam, disk, LASCoordinateSet( tecPhiPositions[beam], 0., tecRPosition[ring], 0., tecZPosition[disk], 0. ) );
01384 }
01385 else {
01386 nominalCoordinates.SetTECEntry( det, ring, beam, disk, LASCoordinateSet( tecPhiPositions[beam], 0., tecRPosition[ring], 0., -1. * tecZPosition[disk], 0. ) );
01387 }
01388
01389 } while( moduleLoop.TECLoop( det, ring, beam, disk ) );
01390
01391
01392
01393
01394 det = 2; beam = 0; pos = 0;
01395 do {
01396 if( det == 2 ) {
01397 nominalCoordinates.SetTIBTOBEntry( det, beam, pos, LASCoordinateSet( atPhiPositions[beam], 0., tibRPosition, 0., tibZPosition[pos], 0. ) );
01398 }
01399 else {
01400 nominalCoordinates.SetTIBTOBEntry( det, beam, pos, LASCoordinateSet( atPhiPositions[beam], 0., tobRPosition, 0., tobZPosition[pos], 0. ) );
01401 }
01402
01403 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
01404
01405
01406
01407
01408
01409 det = 0; beam = 0; disk = 0;
01410 do {
01411
01412 if( det == 0 ) {
01413 nominalCoordinates.SetTEC2TECEntry( det, beam, disk, LASCoordinateSet( atPhiPositions[beam], 0., tecRPosition[0], 0., tecZPosition[disk], 0. ) );
01414 }
01415 else {
01416 nominalCoordinates.SetTEC2TECEntry( det, beam, disk, LASCoordinateSet( atPhiPositions[beam], 0., tecRPosition[0], 0., -1. * tecZPosition[disk], 0. ) );
01417 }
01418
01419 } while( moduleLoop.TEC2TECLoop( det, beam, disk ) );
01420
01421
01422 }
01423
01424
01425
01426
01427
01432 double LaserAlignment::ConvertAngle( double angle ) {
01433
01434 if( angle < -1. * M_PI || angle > M_PI ) {
01435 throw cms::Exception(" [LaserAlignment::ConvertAngle] ") << "** ERROR: Called with illegal input angle: " << angle << "." << std::endl;
01436 }
01437
01438 if( angle >= 0. ) return angle;
01439 else return( angle + 2. * M_PI );
01440
01441 }
01442
01443
01444
01445
01446
01450 void LaserAlignment::DumpPosFileSet( LASGlobalData<LASCoordinateSet>& coordinates ) {
01451
01452 LASGlobalLoop loop;
01453 int det, ring, beam, disk, pos;
01454
01455 std:: cout << std::endl << " [LaserAlignment::DumpPosFileSet] -- Dump: " << std::endl;
01456
01457
01458 det = 0; ring = 0; beam = 0; disk = 0;
01459 do {
01460 std::cout << "POS " << det << "\t" << beam << "\t" << disk << "\t" << ring << "\t" << coordinates.GetTECEntry( det, ring, beam, disk ).GetPhi() << "\t" << coordinates.GetTECEntry( det, ring, beam, disk ).GetPhiError() << std::endl;
01461 } while ( loop.TECLoop( det, ring, beam, disk ) );
01462
01463
01464 det = 2; beam = 0; pos = 0;
01465 do {
01466 std::cout << "POS " << det << "\t" << beam << "\t" << pos << "\t" << "-1" << "\t" << coordinates.GetTIBTOBEntry( det, beam, pos ).GetPhi() << "\t" << coordinates.GetTIBTOBEntry( det, beam, pos ).GetPhiError() << std::endl;
01467 } while( loop.TIBTOBLoop( det, beam, pos ) );
01468
01469
01470 det = 0; beam = 0; disk = 0;
01471 do {
01472 std::cout << "POS " << det << "\t" << beam << "\t" << disk << "\t" << "-1" << "\t" << coordinates.GetTEC2TECEntry( det, beam, disk ).GetPhi() << "\t" << coordinates.GetTEC2TECEntry( det, beam, disk ).GetPhiError() << std::endl;
01473 } while( loop.TEC2TECLoop( det, beam, disk ) );
01474
01475 std:: cout << std::endl << " [LaserAlignment::DumpPosFileSet] -- End dump: " << std::endl;
01476
01477 }
01478
01479
01480
01481
01482
01486 void LaserAlignment::DumpStripFileSet( LASGlobalData<std::pair<float,float> >& measuredStripPositions ) {
01487
01488 LASGlobalLoop loop;
01489 int det, ring, beam, disk, pos;
01490
01491 std:: cout << std::endl << " [LaserAlignment::DumpStripFileSet] -- Dump: " << std::endl;
01492
01493
01494 det = 0; ring = 0; beam = 0; disk = 0;
01495 do {
01496 std::cout << "STRIP " << det << "\t" << beam << "\t" << disk << "\t" << ring << "\t" << measuredStripPositions.GetTECEntry( det, ring, beam, disk ).first
01497 << "\t" << measuredStripPositions.GetTECEntry( det, ring, beam, disk ).second << std::endl;
01498 } while ( loop.TECLoop( det, ring, beam, disk ) );
01499
01500
01501 det = 2; beam = 0; pos = 0;
01502 do {
01503 std::cout << "STRIP " << det << "\t" << beam << "\t" << pos << "\t" << "-1" << "\t" << measuredStripPositions.GetTIBTOBEntry( det, beam, pos ).first
01504 << "\t" << measuredStripPositions.GetTIBTOBEntry( det, beam, pos ).second << std::endl;
01505 } while( loop.TIBTOBLoop( det, beam, pos ) );
01506
01507
01508 det = 0; beam = 0; disk = 0;
01509 do {
01510 std::cout << "STRIP " << det << "\t" << beam << "\t" << disk << "\t" << "-1" << "\t" << measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).first
01511 << "\t" << measuredStripPositions.GetTEC2TECEntry( det, beam, disk ).second << std::endl;
01512 } while( loop.TEC2TECLoop( det, beam, disk ) );
01513
01514 std:: cout << std::endl << " [LaserAlignment::DumpStripFileSet] -- End dump: " << std::endl;
01515
01516
01517 }
01518
01519
01520
01521
01522
01526 void LaserAlignment::DumpHitmaps( LASGlobalData<int> numberOfAcceptedProfiles ) {
01527
01528 std::cout << " [LaserAlignment::DumpHitmaps] -- Dumping hitmap for TEC+:" << std::endl;
01529 std::cout << " [LaserAlignment::DumpHitmaps] -- Ring4:" << std::endl;
01530 std::cout << " disk0 disk1 disk2 disk3 disk4 disk5 disk6 disk7 disk8" << std::endl;
01531
01532 for( int beam = 0; beam < 8; ++beam ) {
01533 std::cout << " beam" << beam << ":";
01534 for( int disk = 0; disk < 9; ++disk ) {
01535 std::cout << "\t" << numberOfAcceptedProfiles.GetTECEntry( 0, 0, beam, disk );
01536 }
01537 std::cout << std::endl;
01538 }
01539
01540 std::cout << " [LaserAlignment::DumpHitmaps] -- Ring6:" << std::endl;
01541 std::cout << " disk0 disk1 disk2 disk3 disk4 disk5 disk6 disk7 disk8" << std::endl;
01542
01543 for( int beam = 0; beam < 8; ++beam ) {
01544 std::cout << " beam" << beam << ":";
01545 for( int disk = 0; disk < 9; ++disk ) {
01546 std::cout << "\t" << numberOfAcceptedProfiles.GetTECEntry( 0, 1, beam, disk );
01547 }
01548 std::cout << std::endl;
01549 }
01550
01551 std::cout << " [LaserAlignment::DumpHitmaps] -- Dumping hitmap for TEC-:" << std::endl;
01552 std::cout << " [LaserAlignment::DumpHitmaps] -- Ring4:" << std::endl;
01553 std::cout << " disk0 disk1 disk2 disk3 disk4 disk5 disk6 disk7 disk8" << std::endl;
01554
01555 for( int beam = 0; beam < 8; ++beam ) {
01556 std::cout << " beam" << beam << ":";
01557 for( int disk = 0; disk < 9; ++disk ) {
01558 std::cout << "\t" << numberOfAcceptedProfiles.GetTECEntry( 1, 0, beam, disk );
01559 }
01560 std::cout << std::endl;
01561 }
01562
01563 std::cout << " [LaserAlignment::DumpHitmaps] -- Ring6:" << std::endl;
01564 std::cout << " disk0 disk1 disk2 disk3 disk4 disk5 disk6 disk7 disk8" << std::endl;
01565
01566 for( int beam = 0; beam < 8; ++beam ) {
01567 std::cout << " beam" << beam << ":";
01568 for( int disk = 0; disk < 9; ++disk ) {
01569 std::cout << "\t" << numberOfAcceptedProfiles.GetTECEntry( 1, 1, beam, disk );
01570 }
01571 std::cout << std::endl;
01572 }
01573
01574 std::cout << " [LaserAlignment::DumpHitmaps] -- End of dump." << std::endl << std::endl;
01575
01576 }
01577
01578
01579
01580
01581
01586 void LaserAlignment::ApplyEndcapMaskingCorrections( LASGlobalData<LASCoordinateSet>& measuredCoordinates, LASGlobalData<LASCoordinateSet>& nominalCoordinates, LASEndcapAlignmentParameterSet& endcapParameters ) {
01587
01588
01589 for( std::vector<unsigned int>::iterator moduleIt = theMaskTecModules.begin(); moduleIt != theMaskTecModules.end(); ++moduleIt ) {
01590
01591
01592 LASGlobalLoop moduleLoop;
01593 int det, ring, beam, disk;
01594
01595
01596 LASEndcapAlgorithm endcapAlgorithm;
01597
01598
01599 det = 0; ring = 0; beam = 0; disk = 0;
01600 do {
01601
01602
01603 if( detectorId.GetTECEntry( det, ring, beam, disk ) == *moduleIt ) {
01604
01605
01606 const double nominalPhi = nominalCoordinates.GetTECEntry( det, ring, beam, disk ).GetPhi();
01607
01608
01609 const double phiCorrection = endcapAlgorithm.GetAlignmentParameterCorrection( det, ring, beam, disk, nominalCoordinates, endcapParameters );
01610
01611
01612 measuredCoordinates.GetTECEntry( det, ring, beam, disk ).SetPhi( nominalPhi - phiCorrection );
01613
01614 }
01615
01616 } while ( moduleLoop.TECLoop( det, ring, beam, disk ) );
01617
01618 }
01619
01620 }
01621
01622
01623
01624
01625
01630 void LaserAlignment::ApplyATMaskingCorrections( LASGlobalData<LASCoordinateSet>& measuredCoordinates, LASGlobalData<LASCoordinateSet>& nominalCoordinates, LASBarrelAlignmentParameterSet& atParameters ) {
01631
01632
01633 for( std::vector<unsigned int>::iterator moduleIt = theMaskAtModules.begin(); moduleIt != theMaskAtModules.end(); ++moduleIt ) {
01634
01635
01636 LASGlobalLoop moduleLoop;
01637 int det, beam, disk, pos;
01638
01639
01640 LASAlignmentTubeAlgorithm atAlgorithm;
01641
01642
01643
01644
01645
01646 det = 2; beam = 0; pos = 0;
01647 do {
01648
01649
01650 if( detectorId.GetTIBTOBEntry( det, beam, pos ) == *moduleIt ) {
01651
01652
01653 const double nominalPhi = nominalCoordinates.GetTIBTOBEntry( det, beam, pos ).GetPhi();
01654
01655
01656 const double phiCorrection = atAlgorithm.GetTIBTOBAlignmentParameterCorrection( det, beam, pos, nominalCoordinates, atParameters );
01657
01658
01659 measuredCoordinates.GetTIBTOBEntry( det, beam, pos ).SetPhi( nominalPhi - phiCorrection );
01660
01661 }
01662
01663 } while ( moduleLoop.TIBTOBLoop( det, beam, pos ) );
01664
01665
01666
01667
01668 det = 0; beam = 0; disk = 0;
01669 do {
01670
01671
01672 if( detectorId.GetTEC2TECEntry( det, beam, disk ) == *moduleIt ) {
01673
01674
01675 const double nominalPhi = nominalCoordinates.GetTEC2TECEntry( det, beam, disk ).GetPhi();
01676
01677
01678 const double phiCorrection = atAlgorithm.GetTEC2TECAlignmentParameterCorrection( det, beam, disk, nominalCoordinates, atParameters );
01679
01680
01681 measuredCoordinates.GetTEC2TECEntry( det, beam, disk ).SetPhi( nominalPhi - phiCorrection );
01682
01683 }
01684
01685 } while ( moduleLoop.TEC2TECLoop( det, beam, disk ) );
01686
01687 }
01688
01689 }
01690
01691
01692
01693
01694
01699 void LaserAlignment::testRoutine( void ) {
01700
01701
01702
01703 const TrackerGeometry& theTracker( *theTrackerGeometry );
01704
01705 const double atPhiPositions[8] = { 0.392699, 1.289799, 1.851794, 2.748894, 3.645995, 4.319690, 5.216791, 5.778784 };
01706 const double tecPhiPositions[8] = { 0.392699, 1.178097, 1.963495, 2.748894, 3.534292, 4.319690, 5.105088, 5.890486 };
01707 const double zPositions[9] = { 125.0, 139.0, 153.0, 167.0, 181.0, 198.5, 217.5, 238.0, 259.5 };
01708 const double zPositionsTIB[6] = { 62.0, 38.0, 18.0, -10.0, -34.0, -54.0 };
01709 const double zPositionsTOB[6] = { 104.0, 58.0, 22.0, -14.0, -50.0, -86.0 };
01710
01711 int det, beam, disk, pos, ring;
01712
01713
01714 det = 0; ring = 0; beam = 0; disk = 0;
01715 do {
01716
01717 const double radius = ring?84.0:56.4;
01718
01719
01720 const DetId theDetId( detectorId.GetTECEntry( det, ring, beam, disk ) );
01721 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
01722
01723 const GlobalPoint gp( GlobalPoint::Cylindrical( radius, tecPhiPositions[beam], zPositions[disk] ) );
01724
01725 const LocalPoint lp( theStripDet->surface().toLocal( gp ) );
01726 std::cout << "__TEC: " << 256. - theStripDet->specificTopology().strip( lp ) << std::endl;
01727
01728 } while( moduleLoop.TECLoop( det, ring, beam, disk ) );
01729
01730
01731
01732 det = 2; beam = 0; pos = 0;
01733 do {
01734
01735 const double radius = (det==2?51.4:58.4);
01736 const double theZ = (det==2?zPositionsTIB[pos]:zPositionsTOB[pos]);
01737
01738
01739 const DetId theDetId( detectorId.GetTIBTOBEntry( det, beam, pos ) );
01740 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
01741
01742 const GlobalPoint gp( GlobalPoint::Cylindrical( radius, atPhiPositions[beam], theZ ) );
01743
01744 const LocalPoint lp( theStripDet->surface().toLocal( gp ) );
01745 std::cout << "__TIBTOB det " << det << " beam " << beam << " pos " << pos << " " << 256. - theStripDet->specificTopology().strip( lp );
01746 std::cout << " " << theStripDet->position().perp()<< std::endl;
01747
01748 } while( moduleLoop.TIBTOBLoop( det, beam, pos ) );
01749
01750
01751
01752 det = 0; beam = 0; disk = 0;
01753 do {
01754
01755 const double radius = 56.4;
01756
01757
01758 const DetId theDetId( detectorId.GetTEC2TECEntry( det, beam, disk ) );
01759 const StripGeomDetUnit* const theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTracker.idToDet( theDetId ) );
01760
01761 const GlobalPoint gp( GlobalPoint::Cylindrical( radius, atPhiPositions[beam], zPositions[disk] ) );
01762
01763 const LocalPoint lp( theStripDet->surface().toLocal( gp ) );
01764 std::cout << "__TEC2TEC det " << det << " beam " << beam << " disk " << disk << " " << 256. - theStripDet->specificTopology().strip( lp ) << std::endl;
01765
01766 } while( moduleLoop.TEC2TECLoop( det, beam, disk ) );
01767
01768
01769 }
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780 #include "FWCore/Framework/interface/MakerMacros.h"
01781
01782 DEFINE_FWK_MODULE(LaserAlignment);
01783
01784
01785
01786
01787
01788